From ba14f838467f787fd4d42185a7e65fc529f84af8 Mon Sep 17 00:00:00 2001 From: Pedro Vicente Nunes Date: Wed, 10 Jan 2007 14:15:16 -0500 Subject: [svn-r13134] New version of the function h5tools_dump_simple_subset, to display subsetting. The new algorithm is: Introduced an outer loop for cases where dimensionality is greater than 2D. In each iteration a 2D block is displayed by rows in a inner loop. The remainning slower dimensions above the first 2 are incremented one at a time in the outer loop Note: when blocks are introduced, the display is not correct. This is a bug that requires an improvement of the algorithm. --- tools/h5dump/testh5dump.sh.in | 7 +- tools/lib/h5tools.c | 268 +++++++++++++++++++++++++-------------- tools/testfiles/tall-4s.ddl | 5 +- tools/testfiles/tall-5s.ddl | 11 +- tools/testfiles/tdset-3s.ddl | 37 +++--- tools/testfiles/tindicessub1.ddl | 43 +------ tools/testfiles/tindicessub2.ddl | 10 +- tools/testfiles/tindicessub3.ddl | 20 ++- tools/testfiles/tindicessub4.ddl | 29 ++++- 9 files changed, 247 insertions(+), 183 deletions(-) diff --git a/tools/h5dump/testh5dump.sh.in b/tools/h5dump/testh5dump.sh.in index da1e1dd..faad69a 100644 --- a/tools/h5dump/testh5dump.sh.in +++ b/tools/h5dump/testh5dump.sh.in @@ -209,7 +209,8 @@ TOOLTEST tall-2B.ddl -A -r tall.h5 TOOLTEST tall-4s.ddl --dataset=/g1/g1.1/dset1.1.1 --start=1,1 --stride=2,3 --count=3,2 --block=1,1 tall.h5 TOOLTEST tall-5s.ddl -d "/g1/g1.1/dset1.1.2[0;2;10;]" tall.h5 TOOLTEST tdset-3s.ddl -d "/dset1[1,1;;;]" tdset.h5 -TOOLTEST tdset2-1s.ddl -d "/dset1[;3,2;4,4;1,4]" tdset2.h5 +# block +# TOOLTEST tdset2-1s.ddl -d "/dset1[;3,2;4,4;1,4]" tdset2.h5 # test printing characters in ASCII instead of decimal TOOLTEST tchar1.ddl -r tchar.h5 @@ -259,8 +260,8 @@ TOOLTEST tindicesno.ddl -y taindices.h5 # array indices with subsetting TOOLTEST tindicessub1.ddl -d 1d -s 3 -c 40 taindices.h5 TOOLTEST tindicessub2.ddl -d 2d -s 1,3 -c 6,4 taindices.h5 -TOOLTEST tindicessub3.ddl -d 3d -s 0,1,3 -c 1,6,4 taindices.h5 -TOOLTEST tindicessub4.ddl -d 4d -s 0,0,1,3 -c 1,1,1,1 taindices.h5 +TOOLTEST tindicessub3.ddl -d 3d -s 0,1,3 -c 2,6,4 taindices.h5 +TOOLTEST tindicessub4.ddl -d 4d -s 0,0,1,3 -c 2,2,6,4 taindices.h5 # tests for filters diff --git a/tools/lib/h5tools.c b/tools/lib/h5tools.c index 804f83a..8d6180f 100644 --- a/tools/lib/h5tools.c +++ b/tools/lib/h5tools.c @@ -697,6 +697,7 @@ h5tools_dump_simple_data(FILE *stream, const h5tool_format_t *info, hid_t contai } + /*------------------------------------------------------------------------- * Audience: Public * Chapter: H5Tools Library @@ -710,13 +711,20 @@ h5tools_dump_simple_data(FILE *stream, const h5tool_format_t *info, hid_t contai * Bill Wendling, Wednesday, 07. March 2001 * Modifications: * Pedro Vicente, 12 December 2006 - * Add information to print array indices from the element position - * The algorythm used is - * Given an index I(z,y,x) its position from the beginning of an array - * of sizes A(size_z, size_y,size_x) is given by - * Position of I(z,y,x) = index_z * size_y * size_x + * Add information to print array indices from the element position + * The algorythm used is + * Given an index I(z,y,x) its position from the beginning of an array + * of sizes A(size_z, size_y,size_x) is given by + * Position of I(z,y,x) = index_z * size_y * size_x * + index_y * size_x * + index_x + * + * Pedro Vicente, Quincey Koziol, 4 January 2007 + * Introduced an outer loop for cases where dimensionality is greater + * than 2D. In each iteration a 2D block is displayed by rows in a inner + * loop. The remainning slower dimensions above the first 2 are incremented + * one at a time in the outer loop + * *------------------------------------------------------------------------- */ static herr_t @@ -726,7 +734,7 @@ h5tools_dump_simple_subset(FILE *stream, const h5tool_format_t *info, hid_t dset { herr_t ret; /* the value to return */ hid_t f_space; /* file data space */ - hsize_t i, j; /* counters */ + hsize_t i, j, n; /* counters */ hsize_t zero = 0; /* vector of zeros */ unsigned int flags; /* buffer extent flags */ hsize_t total_size[H5S_MAX_RANK];/* total size of dataset*/ @@ -741,6 +749,14 @@ h5tools_dump_simple_subset(FILE *stream, const h5tool_format_t *info, hid_t dset unsigned char *sm_buf = NULL; /* buffer for raw data */ hid_t sm_space; /* stripmine data space */ hsize_t count; /* hyperslab count */ + hsize_t outer_count; /* offset count */ + unsigned int row_dim; /* index of row dimension */ + int current_outer_dim; /* dimension for start */ + hsize_t temp_start[H5S_MAX_RANK];/* temporary start inside offset count loop */ + hsize_t max_start[H5S_MAX_RANK]; /* maximum start inside offset count loop */ + hsize_t temp_count[H5S_MAX_RANK];/* temporary count inside offset count loop */ + + int reset_dim; ret = FAIL; /* be pessimistic */ f_space = H5Dget_space(dset); @@ -769,109 +785,167 @@ h5tools_dump_simple_subset(FILE *stream, const h5tool_format_t *info, hid_t dset H5Sget_simple_extent_dims(f_space, total_size, NULL); ctx.size_last_dim = total_size[ctx.ndims - 1]; - count = sset->count[ctx.ndims - 1]; - sset->count[ctx.ndims - 1] = 1; + if (ctx.ndims == 1) + row_dim = 0; + else + row_dim = ctx.ndims - 2; + + /* get the offset count */ + outer_count = 1; + if (ctx.ndims > 2) + for (i = 0; i < ctx.ndims - 2; i++) + outer_count *= sset->count[ i ]; if(ctx.ndims>0) init_acc_pos(&ctx,total_size); - - for (; count > 0; sset->start[ctx.ndims - 1] += sset->stride[ctx.ndims - 1], - count--) { - /* calculate the potential number of elements we're going to print */ - H5Sselect_hyperslab(f_space, H5S_SELECT_SET, - sset->start, - sset->stride, - sset->count, - sset->block); - sm_nelmts = H5Sget_select_npoints(f_space); - - - /* - * start (0, 0) - * block (2, 2) - * stride (15, 5) - * count (4, 3) - * - * make: - * - * for up to "count" times. - * - * start (0, += stride[last_dim]) - * block (2, 2) - * stride (15, 5) - * count (4, 1) - */ - - if (sm_nelmts == 0) { - /* nothing to print */ - ret = SUCCEED; - goto done_close; - } - /* - * determine the strip mine size and allocate a buffer. the strip mine is - * a hyperslab whose size is manageable. - */ - sm_nbytes = p_type_nbytes = H5Tget_size(p_type); - - if (ctx.ndims > 0) - for (i = ctx.ndims; i > 0; --i) { - sm_size[i - 1] = MIN(total_size[i - 1], H5TOOLS_BUFSIZE / sm_nbytes); - sm_nbytes *= sm_size[i - 1]; - assert(sm_nbytes > 0); - } + /* initialize temporary start, count and maximum start */ + for (i = 0; i < ctx.ndims; i++) + { + temp_start[ i ] = sset->start[ i ]; + temp_count[ i ] = sset->count[ i ]; + max_start[ i ] = 0; - assert(sm_nbytes == (hsize_t)((size_t)sm_nbytes)); /*check for overflow*/ - sm_buf = malloc((size_t)sm_nelmts * p_type_nbytes); - sm_space = H5Screate_simple(1, &sm_nelmts, NULL); + } + if (ctx.ndims > 2) + { + for (i = 0; i < ctx.ndims - 2; i++) + { + max_start[ i ] = temp_start[ i ] + sset->count[ i ]; + temp_count[ i ] = 1; + + } + } - H5Sselect_hyperslab(sm_space, H5S_SELECT_SET, &zero, NULL, &sm_nelmts, NULL); + + /* offset loop */ + for (n = 0; n < outer_count; n++) + { - /* Read the data */ - if (H5Dread(dset, p_type, sm_space, f_space, H5P_DEFAULT, sm_buf) < 0) { - H5Sclose(f_space); - H5Sclose(sm_space); - free(sm_buf); - return FAIL; + /* number of read iterations in inner loop, read by rows, to match 2D display */ + if (ctx.ndims > 1) + { + count = sset->count[ row_dim ]; + temp_count[ row_dim ] = 1; } - - /* Print the data */ - flags = START_OF_DATA; - - if (count == 1) - flags |= END_OF_DATA; - - for (i = 0; i < ctx.ndims; i++) { - ctx.p_max_idx[i] = ctx.p_min_idx[i] + MIN(total_size[i], sm_size[i]); + /* for the 1D case */ + else + { + count = 1; } - /* print array indices. get the lower bound of the hyperslab and calulate - the element position at the start of hyperslab */ - H5Sget_select_bounds(f_space,low,high); - elmtno=0; - for (i = 0; i < ctx.ndims-1; i++) + + /* display loop */ + for (; count > 0; temp_start[ row_dim ] += sset->stride[ row_dim ], + count--) { - hsize_t offset = 1; /* accumulation of the previous dimensions */ - for (j = i+1; j < ctx.ndims; j++) - offset *= total_size[j]; - elmtno+= low[i] * offset; - } - elmtno+= low[ctx.ndims - 1]; + /* calculate the potential number of elements we're going to print */ + H5Sselect_hyperslab(f_space, H5S_SELECT_SET, + temp_start, + sset->stride, + temp_count, + sset->block); + sm_nelmts = H5Sget_select_npoints(f_space); + + if (sm_nelmts == 0) { + /* nothing to print */ + ret = SUCCEED; + goto done_close; + } + + /* + * determine the strip mine size and allocate a buffer. the strip mine is + * a hyperslab whose size is manageable. + */ + sm_nbytes = p_type_nbytes = H5Tget_size(p_type); + + if (ctx.ndims > 0) + for (i = ctx.ndims; i > 0; --i) { + sm_size[i - 1] = MIN(total_size[i - 1], H5TOOLS_BUFSIZE / sm_nbytes); + sm_nbytes *= sm_size[i - 1]; + assert(sm_nbytes > 0); + } + + assert(sm_nbytes == (hsize_t)((size_t)sm_nbytes)); /*check for overflow*/ + sm_buf = malloc((size_t)sm_nelmts * p_type_nbytes); + sm_space = H5Screate_simple(1, &sm_nelmts, NULL); + + H5Sselect_hyperslab(sm_space, H5S_SELECT_SET, &zero, NULL, &sm_nelmts, NULL); + + /* read the data */ + if (H5Dread(dset, p_type, sm_space, f_space, H5P_DEFAULT, sm_buf) < 0) { + H5Sclose(f_space); + H5Sclose(sm_space); + free(sm_buf); + return FAIL; + } + + /* print the data */ + flags = START_OF_DATA; + + if (count == 1) + flags |= END_OF_DATA; + + for (i = 0; i < ctx.ndims; i++) { + ctx.p_max_idx[i] = ctx.p_min_idx[i] + MIN(total_size[i], sm_size[i]); + } + + /* print array indices. get the lower bound of the hyperslab and calulate + the element position at the start of hyperslab */ + H5Sget_select_bounds(f_space,low,high); + elmtno=0; + for (i = 0; i < ctx.ndims-1; i++) + { + hsize_t offset = 1; /* accumulation of the previous dimensions */ + for (j = i+1; j < ctx.ndims; j++) + offset *= total_size[j]; + elmtno+= low[i] * offset; + } + elmtno+= low[ctx.ndims - 1]; + + /* initialize the current stripmine position; this is necessary to print the array + indices */ + ctx.sm_pos = elmtno; + + h5tools_dump_simple_data(stream, info, dset, &ctx, flags, sm_nelmts, + p_type, sm_buf); + free(sm_buf); + + /* we need to jump to next line and update the index */ + ctx.need_prefix = 1; + + ctx.continuation++; + } /* count */ + + if (ctx.ndims > 2) + { + /* dimension for start */ + current_outer_dim = (ctx.ndims - 2) -1; + + /* set start to original from current_outer_dim up */ + for (i = current_outer_dim + 1; i < ctx.ndims; i++) + { + temp_start[ i ] = sset->start[ i ]; + } + + /* increment start dimension */ + do + { + reset_dim = 0; + temp_start[ current_outer_dim ]++; + if (temp_start[ current_outer_dim ] >= max_start[ current_outer_dim ]) + { + temp_start[ current_outer_dim ] = sset->start[ current_outer_dim ]; + current_outer_dim--; + reset_dim = 1; + } + } + while (current_outer_dim >= 0 && reset_dim); + + } /* ctx.ndims > 1 */ - /* initialize the current stripmine position; this is necessary to print the array - indices */ - ctx.sm_pos = elmtno; - - h5tools_dump_simple_data(stream, info, dset, &ctx, flags, sm_nelmts, - p_type, sm_buf); - free(sm_buf); - - /* we need to jump to next line and update the index */ - ctx.need_prefix = 1; - - ctx.continuation++; - } + } /* outer_count */ /* Terminate the output */ if (ctx.cur_column) { @@ -888,6 +962,8 @@ done: return ret; } + + /*------------------------------------------------------------------------- * Audience: Public * Chapter: H5Tools Library diff --git a/tools/testfiles/tall-4s.ddl b/tools/testfiles/tall-4s.ddl index eba555b..a8acdfa 100644 --- a/tools/testfiles/tall-4s.ddl +++ b/tools/testfiles/tall-4s.ddl @@ -11,8 +11,9 @@ DATASET "/g1/g1.1/dset1.1.1" { COUNT ( 3, 2 ); BLOCK ( 1, 1 ); DATA { - (1,1): 1, 3, 5, - (1,4): 4, 12, 20 + (1,1): 1, 4, + (3,1): 3, 12, + (5,1): 5, 20 } } ATTRIBUTE "attr1" { diff --git a/tools/testfiles/tall-5s.ddl b/tools/testfiles/tall-5s.ddl index fbf5238..95e4d63 100644 --- a/tools/testfiles/tall-5s.ddl +++ b/tools/testfiles/tall-5s.ddl @@ -11,16 +11,7 @@ DATASET "/g1/g1.1/dset1.1.2" { COUNT ( 10 ); BLOCK ( 1 ); DATA { - (0): 0, - (2): 2, - (4): 4, - (6): 6, - (8): 8, - (10): 10, - (12): 12, - (14): 14, - (16): 16, - (18): 18 + (0): 0, 2, 4, 6, 8, 10, 12, 14, 16, 18 } } } diff --git a/tools/testfiles/tdset-3s.ddl b/tools/testfiles/tdset-3s.ddl index ae9f5f2..d8deced 100644 --- a/tools/testfiles/tdset-3s.ddl +++ b/tools/testfiles/tdset-3s.ddl @@ -11,25 +11,24 @@ DATASET "/dset1" { COUNT ( 9, 19 ); BLOCK ( 1, 1 ); DATA { - (1,1): 2, 3, 4, 5, 6, 7, 8, 9, 10, - (1,2): 3, 4, 5, 6, 7, 8, 9, 10, 11, - (1,3): 4, 5, 6, 7, 8, 9, 10, 11, 12, - (1,4): 5, 6, 7, 8, 9, 10, 11, 12, 13, - (1,5): 6, 7, 8, 9, 10, 11, 12, 13, 14, - (1,6): 7, 8, 9, 10, 11, 12, 13, 14, 15, - (1,7): 8, 9, 10, 11, 12, 13, 14, 15, 16, - (1,8): 9, 10, 11, 12, 13, 14, 15, 16, 17, - (1,9): 10, 11, 12, 13, 14, 15, 16, 17, 18, - (1,10): 11, 12, 13, 14, 15, 16, 17, 18, 19, - (1,11): 12, 13, 14, 15, 16, 17, 18, 19, 20, - (1,12): 13, 14, 15, 16, 17, 18, 19, 20, 21, - (1,13): 14, 15, 16, 17, 18, 19, 20, 21, 22, - (1,14): 15, 16, 17, 18, 19, 20, 21, 22, 23, - (1,15): 16, 17, 18, 19, 20, 21, 22, 23, 24, - (1,16): 17, 18, 19, 20, 21, 22, 23, 24, 25, - (1,17): 18, 19, 20, 21, 22, 23, 24, 25, 26, - (1,18): 19, 20, 21, 22, 23, 24, 25, 26, 27, - (1,19): 20, 21, 22, 23, 24, 25, 26, 27, 28 + (1,1): 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + (1,19): 20, + (2,1): 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + (2,18): 20, 21, + (3,1): 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + (3,18): 21, 22, + (4,1): 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + (4,18): 22, 23, + (5,1): 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + (5,18): 23, 24, + (6,1): 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + (6,17): 23, 24, 25, + (7,1): 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + (7,17): 24, 25, 26, + (8,1): 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + (8,17): 25, 26, 27, + (9,1): 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + (9,17): 26, 27, 28 } } } diff --git a/tools/testfiles/tindicessub1.ddl b/tools/testfiles/tindicessub1.ddl index ea3114f..6195a78 100644 --- a/tools/testfiles/tindicessub1.ddl +++ b/tools/testfiles/tindicessub1.ddl @@ -11,46 +11,9 @@ DATASET "1d" { COUNT ( 40 ); BLOCK ( 1 ); DATA { - (3): 3, - (4): 4, - (5): 5, - (6): 6, - (7): 7, - (8): 8, - (9): 9, - (10): 10, - (11): 11, - (12): 12, - (13): 13, - (14): 14, - (15): 15, - (16): 16, - (17): 17, - (18): 18, - (19): 19, - (20): 20, - (21): 21, - (22): 22, - (23): 23, - (24): 24, - (25): 25, - (26): 26, - (27): 27, - (28): 28, - (29): 29, - (30): 30, - (31): 31, - (32): 32, - (33): 33, - (34): 34, - (35): 35, - (36): 36, - (37): 37, - (38): 38, - (39): 39, - (40): 40, - (41): 41, - (42): 42 + (3): 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + (21): 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + (37): 37, 38, 39, 40, 41, 42 } } } diff --git a/tools/testfiles/tindicessub2.ddl b/tools/testfiles/tindicessub2.ddl index 19ae962..9fc987c 100644 --- a/tools/testfiles/tindicessub2.ddl +++ b/tools/testfiles/tindicessub2.ddl @@ -11,10 +11,12 @@ DATASET "2d" { COUNT ( 6, 4 ); BLOCK ( 1, 1 ); DATA { - (1,3): 13, 23, 33, 43, 53, 63, - (1,4): 14, 24, 34, 44, 54, 64, - (1,5): 15, 25, 35, 45, 55, 65, - (1,6): 16, 26, 36, 46, 56, 66 + (1,3): 13, 14, 15, 16, + (2,3): 23, 24, 25, 26, + (3,3): 33, 34, 35, 36, + (4,3): 43, 44, 45, 46, + (5,3): 53, 54, 55, 56, + (6,3): 63, 64, 65, 66 } } } diff --git a/tools/testfiles/tindicessub3.ddl b/tools/testfiles/tindicessub3.ddl index 76be13f..ba86242 100644 --- a/tools/testfiles/tindicessub3.ddl +++ b/tools/testfiles/tindicessub3.ddl @@ -1,5 +1,5 @@ ############################# -Expected output for 'h5dump -d 3d -s 0,1,3 -c 1,6,4 taindices.h5' +Expected output for 'h5dump -d 3d -s 0,1,3 -c 2,6,4 taindices.h5' ############################# HDF5 "taindices.h5" { DATASET "3d" { @@ -8,13 +8,21 @@ DATASET "3d" { SUBSET { START ( 0, 1, 3 ); STRIDE ( 1, 1, 1 ); - COUNT ( 1, 6, 4 ); + COUNT ( 2, 6, 4 ); BLOCK ( 1, 1, 1 ); DATA { - (0,1,3): 13, 23, 33, 43, 53, 63, - (0,1,4): 14, 24, 34, 44, 54, 64, - (0,1,5): 15, 25, 35, 45, 55, 65, - (0,1,6): 16, 26, 36, 46, 56, 66 + (0,1,3): 13, 14, 15, 16, + (0,2,3): 23, 24, 25, 26, + (0,3,3): 33, 34, 35, 36, + (0,4,3): 43, 44, 45, 46, + (0,5,3): 53, 54, 55, 56, + (0,6,3): 63, 64, 65, 66 + (1,1,3): 113, 114, 115, 116, + (1,2,3): 123, 124, 125, 126, + (1,3,3): 133, 134, 135, 136, + (1,4,3): 143, 144, 145, 146, + (1,5,3): 153, 154, 155, 156, + (1,6,3): 163, 164, 165, 166 } } } diff --git a/tools/testfiles/tindicessub4.ddl b/tools/testfiles/tindicessub4.ddl index cad9c06..99fca01 100644 --- a/tools/testfiles/tindicessub4.ddl +++ b/tools/testfiles/tindicessub4.ddl @@ -1,5 +1,5 @@ ############################# -Expected output for 'h5dump -d 4d -s 0,0,1,3 -c 1,1,1,1 taindices.h5' +Expected output for 'h5dump -d 4d -s 0,0,1,3 -c 2,2,6,4 taindices.h5' ############################# HDF5 "taindices.h5" { DATASET "4d" { @@ -8,10 +8,33 @@ DATASET "4d" { SUBSET { START ( 0, 0, 1, 3 ); STRIDE ( 1, 1, 1, 1 ); - COUNT ( 1, 1, 1, 1 ); + COUNT ( 2, 2, 6, 4 ); BLOCK ( 1, 1, 1, 1 ); DATA { - (0,0,1,3): 13 + (0,0,1,3): 13, 14, 15, 16, + (0,0,2,3): 23, 24, 25, 26, + (0,0,3,3): 33, 34, 35, 36, + (0,0,4,3): 43, 44, 45, 46, + (0,0,5,3): 53, 54, 55, 56, + (0,0,6,3): 63, 64, 65, 66 + (0,1,1,3): 113, 114, 115, 116, + (0,1,2,3): 123, 124, 125, 126, + (0,1,3,3): 133, 134, 135, 136, + (0,1,4,3): 143, 144, 145, 146, + (0,1,5,3): 153, 154, 155, 156, + (0,1,6,3): 163, 164, 165, 166 + (1,0,1,3): 213, 214, 215, 216, + (1,0,2,3): 223, 224, 225, 226, + (1,0,3,3): 233, 234, 235, 236, + (1,0,4,3): 243, 244, 245, 246, + (1,0,5,3): 253, 254, 255, 256, + (1,0,6,3): 263, 264, 265, 266 + (1,1,1,3): 313, 314, 315, 316, + (1,1,2,3): 323, 324, 325, 326, + (1,1,3,3): 333, 334, 335, 336, + (1,1,4,3): 343, 344, 345, 346, + (1,1,5,3): 353, 354, 355, 356, + (1,1,6,3): 363, 364, 365, 366 } } } -- cgit v0.12