diff options
Diffstat (limited to 'project')
116 files changed, 23506 insertions, 3002 deletions
diff --git a/project/Makefile b/project/Makefile index 5317c75..10ef3b2 100644 --- a/project/Makefile +++ b/project/Makefile @@ -57,8 +57,8 @@ WPATT_LONG = Wiimms PAT Tool WSTRT_SHORT = wstrt WSTRT_LONG = Wiimms StaticR Tool -VERSION_NUM = 2.27b -BETA_VERSION = 0 +VERSION_NUM = 2.28a +BETA_VERSION = -1 # 0:off -1:"beta" >0:"beta#" URI_HOME = https://szs.wiimm.de/ @@ -239,7 +239,7 @@ XOBJ_COMMON = lib-common.o lib-geohit.o lib-itemslot.o lib-minigame.o lib-objflo XOBJ_LIB = analyze.o lib-szs-create.o lib-xbmg.o \ lib-mdl.o lib-pat.o lib-transform.o \ - lib-ctcode.o lib-lex.o lib-lecode.o \ + lib-ctcode.o lib-lex.o lib-lecode.o lib-ledis.o \ lib-staticr.o db-dol.o db-ctcode.o getopt.o \ $(XOBJ_KMP) $(XOBJ_COMMON) $(XOBJ_KCL) lib-kcl-image.o lib-rkg.o \ $(XOBJ_OBJECT) $(XOBJ_PARSER) $(XOBJ_IMAGE) @@ -247,15 +247,17 @@ XOBJ_LIB = analyze.o lib-szs-create.o lib-xbmg.o \ TOBJ_gen-ui = $(XOBJ_OBJECT) TOBJ_wszst = $(XOBJ_LIB) $(WRAPPER_OBJ) TOBJ_wbmgt = lib-xbmg.o $(XOBJ_OBJECT) -TOBJ_wctct = lib-ctcode.o lib-lex.o lib-lecode.o lib-xbmg.o db-ctcode.o \ +TOBJ_wctct1 = lib-ctcode.o lib-lex.o lib-lecode.o lib-ledis.o lib-xbmg.o db-ctcode.o \ $(XOBJ_PARSER) $(XOBJ_IMAGE) $(XOBJ_OBJECT) +TOBJ_wctct = $(XOBJ_LIB) TOBJ_wimgt = $(XOBJ_IMAGE) $(XOBJ_OBJECT) TOBJ_wkclt = lib-transform.o $(XOBJ_KCL) $(XOBJ_PARSER) $(XOBJ_OBJECT) TOBJ_wkmpt = $(XOBJ_KMP) lib-transform.o \ $(XOBJ_KCL) lib-kcl-image.o \ $(XOBJ_IMAGE) $(XOBJ_PARSER) $(XOBJ_OBJECT) -TOBJ_wlect = lib-lex.o lib-lecode.o lib-ctcode.o lib-xbmg.o db-ctcode.o \ +TOBJ_wlect1 = lib-lex.o lib-lecode.o lib-ledis.o lib-ctcode.o lib-xbmg.o db-ctcode.o \ $(XOBJ_PARSER) $(XOBJ_IMAGE) $(XOBJ_OBJECT) +TOBJ_wlect = $(XOBJ_LIB) TOBJ_wmdlt = lib-mdl.o lib-transform.o $(XOBJ_PARSER) $(XOBJ_OBJECT) TOBJ_wpatt = lib-pat.o $(XOBJ_PARSER) $(XOBJ_OBJECT) TOBJ_wstrt = lib-staticr.o db-dol.o db-ctcode.o $(XOBJ_OBJECT) @@ -389,7 +391,7 @@ BIN_FILES = $(MAIN_TOOLS) $(EXTRA_TOOLS) SHARE_FILES = CYGWIN_DIR = /usr/bin -CYGWIN_TOOLS = bash chmod cp env grep mkdir realpath regtool stat tr +CYGWIN_TOOLS = bash chmod cp env grep mkdir realpath regtool stat tr less CYGWIN_SCRIPTS = windows-install.sh windows-uninstall.sh windows-uninstall.bat \ sendto-install.sh sendto-uninstall.sh CYGWIN_INSTALL = $(SETUP_DIR)/windows-install.exe \ @@ -575,6 +577,7 @@ clean: @printf "$(LOGFORMAT)" rm "output files + distrib" "" -@rm -fr _start-pos.tmp @find . -type d -name test.tmp -exec rm -rf {} + + @rm -rf pool/tracks.tmp @rm -f $(RM_FILES) @rm -fr $(DISTRIB_RM)* $(LIBEXPORT) @cd dclib && rm -f $(DCLIB_PRIVATE) diff --git a/project/dclib/Makefile.inc b/project/dclib/Makefile.inc index 45fc2a5..b505f2e 100644 --- a/project/dclib/Makefile.inc +++ b/project/dclib/Makefile.inc @@ -18,7 +18,7 @@ # standard object files DCLIB_O := dclib-basics.o dclib-cli.o dclib-color.o dclib-numeric.o \ - dclib-file.o dclib-option.o dclib-regex.o \ + dclib-parser.o dclib-file.o dclib-option.o dclib-regex.o \ dclib-utf8.o dclib-shift-jis.o \ dclib-vector.o dclib-tables.o dclib-ui.o \ dclib-xdump.o dclib-debug.o diff --git a/project/dclib/dclib-basics.c b/project/dclib/dclib-basics.c index 964b5d2..03e3215 100644 --- a/project/dclib/dclib-basics.c +++ b/project/dclib/dclib-basics.c @@ -418,11 +418,13 @@ char * StringCopyE ( char * buf, ccp buf_end, ccp src ) DASSERT(buf); DASSERT(buf<buf_end); - buf_end--; if (src) + { + buf_end--; while( buf < buf_end && *src ) *buf++ = *src++; + } *buf = 0; return buf; @@ -432,12 +434,22 @@ char * StringCopyE ( char * buf, ccp buf_end, ccp src ) char * StringCopyS ( char * buf, size_t buf_size, ccp src ) { - return StringCopyE(buf,buf+buf_size,src); + DASSERT(buf); + if ( buf_size <= 0 ) + return buf; + + DASSERT(buf_size>=0); + + if (src) + while( --buf_size > 0 && *src ) + *buf++ = *src++; + *buf = 0; + return buf; } /////////////////////////////////////////////////////////////////////////////// -char * StringCopyEM ( char * buf, ccp buf_end, ccp src, size_t max_copy ) +char * StringCopyEM ( char * buf, ccp buf_end, ccp src, ssize_t max_copy ) { // RESULT: end of copied string pointing to NULL // 'src' may be a NULL pointer. @@ -458,7 +470,7 @@ char * StringCopyEM ( char * buf, ccp buf_end, ccp src, size_t max_copy ) //----------------------------------------------------------------------------- -char * StringCopySM ( char * buf, size_t buf_size, ccp src, size_t max_copy ) +char * StringCopySM ( char * buf, size_t buf_size, ccp src, ssize_t max_copy ) { return StringCopyEM(buf,buf+buf_size,src,max_copy); } @@ -495,6 +507,47 @@ char * StringCat2S ( char * buf, size_t buf_size, ccp src1, ccp src2 ) /////////////////////////////////////////////////////////////////////////////// +char * StringCatSep2E ( char * buf, ccp buf_end, ccp sep, ccp src1, ccp src2 ) +{ + // RESULT: end of copied string pointing to NULL + // 'src*' may be a NULL pointer. + + DASSERT(buf); + DASSERT(buf<buf_end); + + if ( !sep || !*sep ) + return StringCat2E(buf,buf_end,src1,src2); + + char *buf0 = buf; + buf_end--; + + if (src1) + while( buf < buf_end && *src1 ) + *buf++ = *src1++; + + if (src2) + { + if ( buf > buf0 ) + while ( buf < buf_end && *sep ) + *buf++ = *sep++; + + while( buf < buf_end && *src2 ) + *buf++ = *src2++; + } + + *buf = 0; + return buf; +} + +//----------------------------------------------------------------------------- + +char * StringCatSep2S ( char * buf, size_t buf_size, ccp sep, ccp src1, ccp src2 ) +{ + return StringCatSep2E(buf,buf+buf_size,sep,src1,src2); +} + +/////////////////////////////////////////////////////////////////////////////// + char * StringCat3E ( char * buf, ccp buf_end, ccp src1, ccp src2, ccp src3 ) { // RESULT: end of copied string pointing to NULL @@ -529,6 +582,62 @@ char * StringCat3S ( char * buf, size_t buf_size, ccp src1, ccp src2, ccp src3 ) /////////////////////////////////////////////////////////////////////////////// +char * StringCatSep3E + ( char * buf, ccp buf_end, ccp sep, ccp src1, ccp src2, ccp src3 ) +{ + // RESULT: end of copied string pointing to NULL + // 'src*' may be a NULL pointer. + + DASSERT(buf); + DASSERT(buf<buf_end); + + if ( !sep || !*sep ) + return StringCat3E(buf,buf_end,src1,src2,src3); + + buf_end--; + char *buf0 = buf; + + if (src1) + while( buf < buf_end && *src1 ) + *buf++ = *src1++; + + if (src2) + { + if ( buf > buf0 ) + { + ccp ptr = sep; + while ( buf < buf_end && *ptr ) + *buf++ = *ptr++; + } + + while( buf < buf_end && *src2 ) + *buf++ = *src2++; + } + + if (src3) + { + if ( buf > buf0 ) + while ( buf < buf_end && *sep ) + *buf++ = *sep++; + + while( buf < buf_end && *src3 ) + *buf++ = *src3++; + } + + *buf = 0; + return buf; +} + +//----------------------------------------------------------------------------- + +char * StringCatSep3S + ( char * buf, size_t buf_size, ccp sep, ccp src1, ccp src2, ccp src3 ) +{ + return StringCatSep3E(buf,buf+buf_size,sep,src1,src2,src3); +} + +/////////////////////////////////////////////////////////////////////////////// + char * StringCat2A ( ccp src1, ccp src2 ) { mem_t mem = MemCat2A( MemByString0(src1), MemByString0(src2) ); @@ -545,6 +654,27 @@ char * StringCat3A ( ccp src1, ccp src2, ccp src3 ) /////////////////////////////////////////////////////////////////////////////// +char * StringCatSep2A ( ccp sep, ccp src1, ccp src2 ) +{ + mem_t mem = MemCatSep2A( MemByString0(sep), + MemByString0(src1), + MemByString0(src2) ); + return (char*)mem.ptr; +} + +//----------------------------------------------------------------------------- + +char * StringCatSep3A ( ccp sep, ccp src1, ccp src2, ccp src3 ) +{ + mem_t mem = MemCatSep3A( MemByString0(sep), + MemByString0(src1), + MemByString0(src2), + MemByString0(src3) ); + return (char*)mem.ptr; +} + +/////////////////////////////////////////////////////////////////////////////// + ccp StringCenterE ( char * buf, // result buffer; if NULL, circ-buf is used @@ -583,7 +713,7 @@ ccp StringCenterE while ( *src && dest < buf_end ) *dest++ = *src++; - + while ( n2-- > 0 && dest < buf_end ) *dest++ = ' '; @@ -1853,6 +1983,7 @@ char * PrintID /////////////////////////////////////////////////////////////////////////////// /////////////// circ buf /////////////// /////////////////////////////////////////////////////////////////////////////// +// [[CircBuf]] static __thread char circ_buf[CIRC_BUF_SIZE]; static __thread char *circ_ptr = 0; @@ -2924,7 +3055,7 @@ static char ** insert_arg_manager if ( am->force_case == LOUP_LOWER || am->force_case == LOUP_UPPER ) { - ccp end = arg + strlen(arg) + 1; + char * end = arg + strlen(arg) + 1; if (am->force_case == LOUP_LOWER) StringLowerE(arg,end,arg); else @@ -2940,6 +3071,7 @@ static char ** insert_arg_manager uint InsertArgManager ( ArgManager_t *am, int pos, ccp arg1, ccp arg2, bool move_arg ) { + DASSERT(am); PRINT("InsertArgManager(,%d,%s,%s,%d)\n",pos,arg1,arg2,move_arg); pos = CheckIndex1(am->argc,pos); @@ -2961,6 +3093,34 @@ uint InsertArgManager return pos+n; } +//----------------------------------------------------------------------------- + +uint InsertListArgManager + ( ArgManager_t *am, int pos, int argc, char ** argv, bool move_arg ) +{ + DASSERT(am); + + pos = CheckIndex1(am->argc,pos); + if ( argc > 0 ) + { + PrepareEditArgManager(am,argc); + DASSERT( pos>=0 && pos <= am->argc ); + char **dest = am->argv + pos; + if ( pos < am->argc ) + memmove( dest+argc, dest, (u8*)(am->argv+am->argc) - (u8*)dest ); + pos += argc; + am->argc += argc; + am->argv[am->argc] = 0; + + if ( move_arg && am->force_case == LOUP_AUTO ) + memcpy( dest, argv, argc*sizeof(*dest) ); + else + while ( argc-- > 0 ) + dest = insert_arg_manager(am,dest,*argv++,move_arg); + } + return pos; +} + /////////////////////////////////////////////////////////////////////////////// uint ReplaceArgManager @@ -3063,7 +3223,7 @@ uint ScanQuotedArgManager ( ArgManager_t *am, ccp src, bool is_utf8 ) for(;;) { - while ( *src == ' ' || *src == '\t' ) + while (isspace(*src)) src++; if (!*src) break; @@ -3079,15 +3239,14 @@ uint ScanQuotedArgManager ( ArgManager_t *am, ccp src, bool is_utf8 ) } else { - while ( dest < bufend && *src && *src != ' ' && *src != '\t' - && *src != '\'' && *src != '\"' ) + while ( dest < bufend && !isspace(*src) && *src != '\'' && *src != '\"' ) { if ( *src == '\\' && src[1] ) src++; *dest++ = *src++; } } - if ( !*src || *src == ' ' || *src == '\t' ) + if (isspace(*src)) break; } ccp arg = MEMDUP(buf,dest-buf); @@ -3099,6 +3258,155 @@ uint ScanQuotedArgManager ( ArgManager_t *am, ccp src, bool is_utf8 ) /////////////////////////////////////////////////////////////////////////////// +enumError ScanFileArgManager +( + ArgManager_t *am, // valid arg-manager + int pos, // insert position, relative to end if <0 + ccp fname, // filename to open + int silent, // 0: print all error messages + // 1: suppress file size warning + // 2: suppress all error messages + int *n_added +) +{ + if (n_added) + *n_added = 0; + pos = CheckIndex1(am->argc,pos); + + u8 *data; + size_t size; + enumError err = LoadFileAlloc(fname,0,0,&data,&size,0,silent,0,0); + + if (!err) + { + if (memchr(data,0,size)) + { + if ( silent < 2 ) + ERROR0(ERR_WARNING,"Binary file ignored: %s\n",fname); + err = ERR_WARNING; + } + else + { + ArgManager_t temp = { .force_case = am->force_case }; + ScanQuotedArgManager(&temp,(ccp)data,true); + uint newpos = InsertListArgManager(am,pos,temp.argc,temp.argv,true); + if (n_added) + *n_added = newpos - pos; + FREE(temp.argv); + } + } + + FREE(data); + return err; +} + +/////////////////////////////////////////////////////////////////////////////// + +enumError ExpandAtArgManager +( + ArgManager_t *am, // valid arg-manager + arg_expand_mode_t expand_mode, // objects to be replaced + int recursion, // maximum recursion depth + int silent // 0: print all error messages + // 1: suppress file size warning + // 2: suppress all error messages +) +{ + if (!am) + return ERR_MISSING_PARAM; + + expand_mode &= AMXM_ALL; + if (!expand_mode) + return ERR_OK; + + enumError max_err = ERR_OK; + + for ( int try = 0;; try++ ) + { + bool dirty = false; + + int pos = 0; + while ( pos < am->argc ) + { + ccp arg = am->argv[pos]; + if (arg) + { + int n_rm = 0; + ccp fname = 0; + int len = strlen(arg); + + if ( len >= 1 && *arg == '@' ) + { + if ( len > 1 && expand_mode & AMXM_P1 ) + { + n_rm = 1; + fname = arg+1; + } + else if ( len == 1 && expand_mode & AMXM_P2 && pos+1 < am->argc ) + { + n_rm = 2; + fname = am->argv[pos+1]; + } + } + else if ( len >= 2 && !memcmp(arg,"-@",2) ) + { + if ( len > 2 && expand_mode & AMXM_S1 ) + { + n_rm = 1; + fname = arg+2; + } + else if ( len == 2 && expand_mode & AMXM_S2 && pos+1 < am->argc ) + { + n_rm = 2; + fname = am->argv[pos+1]; + } + } + else if ( len >= 3 && !memcmp(arg,"--@",3) ) + { + if ( len > 3 && arg[3] == '=' && expand_mode & AMXM_L1 ) + { + n_rm = 1; + fname = arg+4; + } + else if ( len == 3 && expand_mode & AMXM_L2 && pos+1 < am->argc ) + { + n_rm = 2; + fname = am->argv[pos+1]; + } + } + + if (n_rm) + { + PRINT1("rm @%u %d, file=%s\n",pos,n_rm,fname); + int n_added; + enumError err = ScanFileArgManager(am,pos,fname,silent,&n_added); + if ( max_err < err ) + max_err = err; + if (n_added) + { + pos += n_added; + dirty = true; + } + + // remove after insert to keep fname valid! + PRINT1("rm @%u %d\n",pos,n_rm); + RemoveArgManager(am,pos,n_rm); + } + else + pos++; + + } // if (arg) + } // while + + if ( !dirty || try >= recursion ) + break; + } + + return max_err; +} + +/////////////////////////////////////////////////////////////////////////////// + bool CheckFilterArgManager ( const ArgManager_t *filter, ccp name ) { if ( !name || !*name ) @@ -3325,6 +3633,100 @@ mem_t MemCat3A ( const mem_t m1, const mem_t m2, const mem_t m3 ) } /////////////////////////////////////////////////////////////////////////////// + +mem_t MemCatSep2A ( const mem_t sep, const mem_t m1, const mem_t m2 ) +{ + const uint slen = sep.len >= 0 ? sep.len : strlen(sep.ptr); + if (!slen) + return MemCat2A(m1,m2); + + const uint len1 = m1.len >= 0 ? m1.len : strlen(m1.ptr); + const uint len2 = m2.len >= 0 ? m2.len : strlen(m2.ptr); + + char *dest; + mem_t res; + res.len = len1 + len2; + if ( len1 && len2 ) + res.len += slen; + + res.ptr = dest = MALLOC(res.len+1); + dest[res.len] = 0; + + if (len1) + { + memcpy(dest,m1.ptr,len1); + dest += len1; + } + + if (len2) + { + if (len1) + { + memcpy(dest,sep.ptr,slen); + dest += slen; + } + + memcpy(dest,m2.ptr,len2); + } + + return res; +} + +//----------------------------------------------------------------------------- + +mem_t MemCatSep3A ( const mem_t sep, const mem_t m1, const mem_t m2, const mem_t m3 ) +{ + const uint slen = sep.len >= 0 ? sep.len : strlen(sep.ptr); + if (!slen) + return MemCat3A(m1,m2,m3); + + const uint len1 = m1.len >= 0 ? m1.len : strlen(m1.ptr); + const uint len2 = m2.len >= 0 ? m2.len : strlen(m2.ptr); + const uint len3 = m3.len >= 0 ? m3.len : strlen(m3.ptr); + + char *dest; + mem_t res; + res.len = len1 + len2 + len3 + + ( (len1>0) + (len2>0) + (len3>0) - 1 ) * slen; + + res.ptr = dest = MALLOC(res.len+1); + + if (len1) + { + memcpy(dest,m1.ptr,len1); + dest += len1; + } + + if (len2) + { + if ( dest > res.ptr ) + { + memcpy(dest,sep.ptr,slen); + dest += slen; + } + + memcpy(dest,m2.ptr,len2); + dest += len2; + } + + if (len3) + { + if ( dest > res.ptr ) + { + memcpy(dest,sep.ptr,slen); + dest += slen; + } + + memcpy(dest,m3.ptr,len3); + dest += len3; + } + + *dest = 0; + ASSERT( dest == res.ptr + res.len ); + return res; +} + +/////////////////////////////////////////////////////////////////////////////// // UTF8 support mem_t MidMem8 ( const mem_t src, int begin, int count ) @@ -3607,6 +4009,155 @@ ccp PrintExMem ( const exmem_t * em ) // print to circ-buf // /////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +uint GetMemSrcN ( const mem_src_t *src ) +{ + if (!src) + return 0; + + if ( src->n_src >= 0 ) + return src->n_src; + + const mem_t *ptr = src->src; + while ( ptr->ptr ) + ptr++; + const uint n_src = ptr - src->src; + + if ( src->allow_write ) + *(uint*)&src->n_src = n_src; + return n_src; +} + +/////////////////////////////////////////////////////////////////////////////// + +uint GetMemSrcLen ( mem_t sep, const mem_src_t *src ) +{ + if ( !src || src->n_src <= 0 ) + return 0; + + int n_valid_src = 0, sum_len = 0; + int n_src = GetMemSrcN(src); + for ( const mem_t *ptr = src->src; n_src > 0; ptr++, n_src-- ) + { + int slen = ptr->len; + if ( slen < 0 ) + { + slen = ptr->ptr ? strlen(ptr->ptr) : 0; + if (src->allow_write) + *(int*)&ptr->len = slen; + } + if ( slen > 0 ) + { + n_valid_src++; + sum_len += slen; + } + } + + if ( n_valid_src > 1 ) + sum_len += (n_valid_src-1)*sep.len; + return sum_len; +} + +/////////////////////////////////////////////////////////////////////////////// + +exmem_t GetExmemDestBuf ( const exmem_dest_t * dest, uint len ) +{ + exmem_t res = { .data.len = len }; + len++; // for additional 0-term + + if (!dest) + goto malloc; + else if ( dest->buf && len <= dest->buf_size ) + { + res.data.ptr = dest->buf; + } + else if ( dest->try_circ && len <= CIRC_BUF_MAX_ALLOC ) + { + res.is_circ_buf = true; + res.data.ptr = GetCircBuf(len); + } + else + { + malloc:; + res.is_alloced = true; + res.data.ptr = MALLOC(len); + } + + return res; +} + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +exmem_t ExMemCat +( + exmem_dest_t *dest, // kind of destination, if NULL then MALLOC() + mem_t sep, // insert separators between sources with len>0 + const mem_src_t *src // sources. NULL allowed +) +{ + const uint total_size = GetMemSrcLen(sep,src); + exmem_t res = GetExmemDestBuf(dest,total_size); + char *bufdest = (char*)res.data.ptr; + + int n_src = GetMemSrcN(src); + for ( const mem_t *ptr = src->src; n_src > 0; ptr++, n_src-- ) + { + int slen = ptr->len; + if ( slen < 0 ) + slen = ptr->ptr ? strlen(ptr->ptr) : 0; + if ( slen > 0 ) + { + if ( sep.len && bufdest > res.data.ptr ) + { + memcpy(bufdest,sep.ptr,sep.len); + bufdest += sep.len; + } + + memcpy(bufdest,ptr->ptr,slen); + bufdest += slen; + ASSERT( bufdest <= res.data.ptr + res.data.len ); + } + } + ASSERT( bufdest == res.data.ptr + res.data.len ); + *bufdest = 0; + return res; +} + +/////////////////////////////////////////////////////////////////////////////// + +exmem_t ExMemCat2 +( + exmem_dest_t *dest, // kind of destination, if NULL then MALLOC() + mem_t sep, // insert separators between sources with len>0 + mem_t src1, // first source + mem_t src2 // second source +) +{ + mem_t list[] = { src1, src2 }; + mem_src_t src = { .src = list, .n_src = 2, true }; + return ExMemCat(dest,sep,&src); +} + +/////////////////////////////////////////////////////////////////////////////// + +exmem_t ExMemCat3 +( + exmem_dest_t *dest, // kind of destination, if NULL then MALLOC() + mem_t sep, // insert separators between sources with len>0 + mem_t src1, // first source + mem_t src2, // second source + mem_t src3 // third source +) +{ + mem_t list[] = { src1, src2, src3 }; + mem_src_t src = { .src = list, .n_src = 3, true }; + return ExMemCat(dest,sep,&src); +} + +// +/////////////////////////////////////////////////////////////////////////////// /////////////// struct mem_list_t /////////////// /////////////////////////////////////////////////////////////////////////////// @@ -4160,7 +4711,6 @@ void * MemDupMemPool ( MemPool_t *mp, cvp source, uint size ) /////////////////////////////////////////////////////////////////////////////// /////////////// CircBuf_t /////////////// /////////////////////////////////////////////////////////////////////////////// -// [[CircBuf_t]] void InitializeCircBuf ( CircBuf_t *cb, uint size ) { @@ -4337,6 +4887,8 @@ void * CopyData ) { DASSERT( data || !size ); + DASSERT( mode == CPM_COPY || mode == CPM_MOVE || mode == CPM_LINK ); + if ( !data || !size ) { if (res_alloced) @@ -4347,21 +4899,33 @@ void * CopyData if (res_alloced) *res_alloced = mode != CPM_LINK; - return mode == CPM_MOVE || mode == CPM_LINK - ? (void*)data - : MEMDUP(data,size); + return mode == CPM_COPY ? MEMDUP(data,size) : (void*)data; } /////////////////////////////////////////////////////////////////////////////// -void FreeData +char * CopyString ( - const void *data, // data to free - CopyMode_t mode // copy mode + ccp string, // string to copy/move/link + CopyMode_t mode, // copy mode + bool *res_alloced // not NULL: + // store true, if data must be freed + // otherwise store false ) { - if ( mode != CPM_LINK && data != EmptyString ) - FREE((void*)data); + DASSERT( mode == CPM_COPY || mode == CPM_MOVE || mode == CPM_LINK ); + + if ( !string || !*string ) + { + if (res_alloced) + *res_alloced = false; + return string ? (char*)EmptyString : 0; + } + + if (res_alloced) + *res_alloced = mode != CPM_LINK; + + return mode == CPM_COPY ? STRDUP(string) : (char*)string; } // @@ -5024,6 +5588,35 @@ uint SplitByTextMemList /////////////// MatchPattern() /////////////// /////////////////////////////////////////////////////////////////////////////// +bool HaveWildcards ( mem_t str ) +{ + if (!str.ptr) + return false; + if ( str.len < 0 ) + str.len = strlen(str.ptr); + + for ( ccp w = PATTERN_WILDCARDS; *w; w++ ) + if (memchr(str.ptr,*w,str.len)) + return true; + return false; +} + +/////////////////////////////////////////////////////////////////////////////// + +char * FindFirstWildcard ( mem_t str ) +{ + if (!str.len) + return 0; + + ccp end = str.ptr + str.len; + for ( ccp ptr = str.ptr; ptr < end; ptr++ ) + if (strchr(PATTERN_WILDCARDS,*ptr)) + return (char*)ptr; + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// + static ccp AnalyseBrackets ( ccp pattern, @@ -5154,7 +5747,7 @@ static bool MatchPatternHelper return true; return false; - case ' ': + case '\t': if ( *text < 1 || * text > ' ' ) return false; text++; @@ -5388,8 +5981,8 @@ char * MatchRuleLine // returns a pointer to the first non scanned char int *status, // not NULL: return match status here - // -2: no prefix found (no ruile found) - // -1: empty line (no ruile found) + // -2: no prefix found (no rule found) + // -1: empty line (no rule found) // 0: rule found, but don't match // 1: rule found and match ccp src, // source line, scanned until CONTROL @@ -5816,6 +6409,73 @@ uint CollectAmbiguousKeywords /////////////////////////////////////////////////////////////////////////////// +ccp GetKeywordError +( + const KeywordTab_t * key_tab, // NULL or pointer to command table + ccp key_arg, // analyzed command + int key_stat, // status of ScanKeyword() + ccp object // NULL or object for error messages + // default= 'command' +) +{ + DASSERT(key_arg); + + if ( !object || !*object ) + object = "command"; + + if ( key_stat <= 0 ) + return PrintCircBuf("Unknown %s: %s",object,key_arg); + + char buf[1000], *dest = buf; + if (key_tab) + { + int n = 0; + char *buf_end = buf + sizeof(buf) - 2; + const int arg_len = strlen(key_arg); + const KeywordTab_t *ct; + int last_id = -1; + + for ( ct = key_tab; ct->name1 && dest < buf_end; ct++ ) + { + if ( ct->id != last_id ) + { + ccp ok = 0; + if (!strncasecmp(key_arg,ct->name1,arg_len)) + ok = ct->name1; + else if ( ct->name2 && !strncasecmp(key_arg,ct->name2,arg_len)) + ok = ct->name2; + if (ok) + { + if (!n++) + { + *dest++ = ' '; + *dest++ = '['; + } + else if ( n > 5 ) + { + dest = StringCopyE(dest,buf_end,",..."); + break; + } + else + *dest++ = ','; + dest = StringCopyE(dest,buf_end,ok); + last_id = ct->id; + } + } + } + if ( dest > buf+1 ) + *dest++ = ']'; + else + dest = buf; + } + *dest = 0; + + return PrintCircBuf("%c%s abbreviation is ambiguous: %s%s", + toupper((int)*object), object+1, key_arg, buf ); +} + +/////////////////////////////////////////////////////////////////////////////// + enumError PrintKeywordError ( const KeywordTab_t * key_tab, // NULL or pointer to command table @@ -5839,7 +6499,7 @@ enumError PrintKeywordError if (key_tab) { int n = 0; - ccp buf_end = buf + sizeof(buf) - 2; + char *buf_end = buf + sizeof(buf) - 2; const int arg_len = strlen(key_arg); const KeywordTab_t *ct; int last_id = -1; @@ -6680,7 +7340,7 @@ void AppendUniqueStringField ( StringField_t * sf, ccp key, bool move_key ) return; ccp * src = sf->field; - ccp * end = sf->field + sf->used; + ccp * end = src + sf->used; while ( src < end ) if (!strcmp(*src++,key)) { @@ -7237,6 +7897,51 @@ uint FindParamFieldHelper ( const ParamField_t * pf, bool * p_found, ccp key ) return beg; } +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +ccp GetParamFieldStr ( ParamField_t *pf, uint mark, ccp key, ccp def ) +{ + DASSERT(pf); + DASSERT(key); + + ParamFieldItem_t *it = FindParamField(pf,key); + if ( it && it->data ) + { + it->num |= mark; + return (ccp)it->data; + } + return def; +} + +/////////////////////////////////////////////////////////////////////////////// + +int GetParamFieldInt ( ParamField_t *pf, uint mark, ccp key, int def ) +{ + DASSERT(pf); + DASSERT(key); + + ParamFieldItem_t *it = FindParamField(pf,key); + if ( it && it->data ) + { + it->num |= mark; + char *end; + const int num = str2l((ccp)it->data,&end,10); + if (!*end) + return num; + } + return def; +} + +/////////////////////////////////////////////////////////////////////////////// + +int GetParamFieldIntMM + ( ParamField_t *pf, uint mark, ccp key, int def, int min, int max ) +{ + const int num = GetParamFieldInt(pf,mark,key,def); + return num >= min && num <= max ? num : def; +} + // /////////////////////////////////////////////////////////////////////////////// /////////////// exmem_list_t /////////////// diff --git a/project/dclib/dclib-basics.h b/project/dclib/dclib-basics.h index 47827c7..01e53a7 100644 --- a/project/dclib/dclib-basics.h +++ b/project/dclib/dclib-basics.h @@ -74,6 +74,9 @@ #define GET_INT_SIGN(type) ({ typeof(type) a=-1; a>0 ? 1 : -1; }) #define GET_INT_TYPE(type) ((int)sizeof(type)*GET_INT_SIGN(type)) +// free a string if str is !NULL | !EmptyString | !MinusString | !IsCircBuf() +void FreeString ( ccp str ); + // /////////////////////////////////////////////////////////////////////////////// /////////////// HAVE_* /////////////// @@ -671,11 +674,26 @@ void * CopyData /////////////////////////////////////////////////////////////////////////////// -void FreeData +char * CopyString +( + ccp string, // string to copy/move/link + CopyMode_t mode, // copy mode + bool *res_alloced // not NULL: + // store true, if data must be freed + // otherwise store false +); + +/////////////////////////////////////////////////////////////////////////////// + +static inline void FreeData ( const void *data, // data to free CopyMode_t mode // copy mode -); +) +{ + if ( mode != CPM_LINK ) + FreeString(data); +} // /////////////////////////////////////////////////////////////////////////////// @@ -694,6 +712,20 @@ extern mem_t EmptyMem; // mem_t(EmptyString,0) extern mem_t NullMem; // mem_t(0,0) //----------------------------------------------------------------------------- +// [[mem_src_t]] + +typedef struct mem_src_t +{ + const mem_t *src; // list of sources + int n_src; // number of sources; if <0: first NULL ptr terminates list + bool allow_write; // TRUE: allow to write n_src & src->len if <0 +} +mem_src_t; + +uint GetMemSrcN ( const mem_src_t *src ); // NULL allowed +uint GetMemSrcLen ( mem_t sep, const mem_src_t *src ); // NULL allowed + +//----------------------------------------------------------------------------- static inline mem_t MemByChar ( char ch ) { @@ -822,15 +854,15 @@ static mem_t RightMem8 ( const mem_t src, int count ) mem_t MemCat2A ( const mem_t m1, const mem_t m2 ); mem_t MemCat3A ( const mem_t m1, const mem_t m2, const mem_t m3 ); +mem_t MemCatSep2A ( const mem_t sep, const mem_t m1, const mem_t m2 ); +mem_t MemCatSep3A ( const mem_t sep, const mem_t m1, const mem_t m2, const mem_t m3 ); + //----------------------------------------------------------------------------- int CmpMem ( const mem_t s1, const mem_t s2 ); int StrCmpMem ( const mem_t mem, ccp str ); bool LeftStrCmpMemEQ ( const mem_t mem, ccp str ); -// free a string if str is !NULL | !EmptyString | !MinusString | !IsCircBuf() -void FreeString ( ccp str ); - static inline void FreeMem ( mem_t *mem ) { DASSERT(mem); @@ -879,6 +911,21 @@ extern exmem_t EmptyExMem; // mem_t(EmptyString,0),false,false extern exmem_t NullExMem; // mem_t(0,0),false,false //----------------------------------------------------------------------------- +// [[exmem_dest_t]] + +typedef struct exmem_dest_t +{ + char *buf; // Dest buffer. If NULL then alloc buffer. + uint buf_size; // Size of 'buf'. If too small then alloc buffer. + bool try_circ; // TRUE: Use circ-buffer, if result is small enough. +} +exmem_dest_t; + +// Get a buffer by settings. The returned buffer is always large enough +// to store len+1 bytes. If dest==NULL: Force MALLOC() +exmem_t GetExmemDestBuf ( const exmem_dest_t * dest, uint len ); + +//----------------------------------------------------------------------------- // constructors static inline exmem_t ExMemByChar ( char ch ) @@ -941,6 +988,32 @@ static inline exmem_t ExMemDup ( cvp src, int size ) } //----------------------------------------------------------------------------- + +exmem_t ExMemCat +( + exmem_dest_t *dest, // kind of destination, if NULL then MALLOC() + mem_t sep, // insert separators between sources with len>0 + const mem_src_t *src // sources. NULL allowed +); + +exmem_t ExMemCat2 +( + exmem_dest_t *dest, // kind of destination, if NULL then MALLOC() + mem_t sep, // insert separators between sources with len>0 + mem_t src1, // first source + mem_t src2 // second source +); + +exmem_t ExMemCat3 +( + exmem_dest_t *dest, // kind of destination, if NULL then MALLOC() + mem_t sep, // insert separators between sources with len>0 + mem_t src1, // first source + mem_t src2, // second source + mem_t src3 // third source +); + +//----------------------------------------------------------------------------- // interface // 'em' can be modified ignoring 'const' @@ -1340,7 +1413,7 @@ static inline uint GetGoodAllocSizeA ( uint need, uint align ) // /////////////////////////////////////////////////////////////////////////////// -/////////////// some basic string functions /////////////// +/////////////// basic string functions /////////////// /////////////////////////////////////////////////////////////////////////////// extern const char EmptyQuote[]; // »""« Ignored by FreeString() @@ -1399,24 +1472,33 @@ int GetProgramPath //----- -// StringCopy(), StringCopyE(), StringCat*() +// StringCopyS(), StringCopyE(), StringCat*() // RESULT: end of copied string pointing to a NULL character. // 'src*' may be a NULL pointer. +// if max_copy<0: ignore it! -char * StringCopyS ( char * buf, size_t bufsize, ccp src ); -char * StringCopySM ( char * buf, size_t bufsize, ccp src, size_t max_copy ); -char * StringCat2S ( char * buf, size_t bufsize, ccp src1, ccp src2 ); -char * StringCat3S ( char * buf, size_t bufsize, ccp src1, ccp src2, ccp src3 ); +char * StringCopyS ( char *buf, size_t bufsize, ccp src ); +char * StringCopySM ( char *buf, size_t bufsize, ccp src, ssize_t max_copy ); +char * StringCat2S ( char *buf, size_t bufsize, ccp src1, ccp src2 ); +char * StringCat3S ( char *buf, size_t bufsize, ccp src1, ccp src2, ccp src3 ); -char * StringCopyE ( char * buf, ccp buf_end, ccp src ); -char * StringCopyEM ( char * buf, ccp buf_end, ccp src, size_t max_copy ); -char * StringCat2E ( char * buf, ccp buf_end, ccp src1, ccp src2 ); -char * StringCat3E ( char * buf, ccp buf_end, ccp src1, ccp src2, ccp src3 ); +char * StringCopyE ( char *buf, ccp buf_end, ccp src ); +char * StringCopyEM ( char *buf, ccp buf_end, ccp src, ssize_t max_copy ); +char * StringCat2E ( char *buf, ccp buf_end, ccp src1, ccp src2 ); +char * StringCat3E ( char *buf, ccp buf_end, ccp src1, ccp src2, ccp src3 ); // alloc space and return char * StringCat2A ( ccp src1, ccp src2 ); char * StringCat3A ( ccp src1, ccp src2, ccp src3 ); +// like above, but cat with separators +char * StringCatSep2S ( char *buf, size_t bufsize, ccp sep, ccp src1, ccp src2 ); +char * StringCatSep3S ( char *buf, size_t bufsize, ccp sep, ccp src1, ccp src2, ccp src3 ); +char * StringCatSep2E ( char *buf, ccp buf_end, ccp sep, ccp src1, ccp src2 ); +char * StringCatSep3E ( char *buf, ccp buf_end, ccp sep, ccp src1, ccp src2, ccp src3 ); +char * StringCatSep2A ( ccp sep, ccp src1, ccp src2 ); +char * StringCatSep3A ( ccp sep, ccp src1, ccp src2, ccp src3 ); + // center string ccp StringCenterE ( char * buf, ccp buf_end, ccp src, int width ); static inline ccp StringCenterS ( char *buf, size_t bufsize, ccp src, int width ) @@ -1485,7 +1567,7 @@ char * PathCombineFast ( char *dest_buf, uint buf_size, ccp path, ccp base_path // If ext==NULL or emtpy: remove only // 'ext' may start with '.'. If not, a additional '.' is included // If 'path' is NULL or path==buf: Inplace job using 'buf' as source. -char * NewFileExtE ( char * buf, ccp buf_end, ccp path, ccp ext ); +char * NewFileExtE ( char * buf, ccp buf_end, ccp path, ccp ext ); char * NewFileExtS ( char * buf, size_t bufsize, ccp path, ccp ext ); // eliminate leading './' before comparing @@ -1586,6 +1668,7 @@ char * PrintID /////////////////////////////////////////////////////////////////////////////// /////////////// circ buf /////////////// /////////////////////////////////////////////////////////////////////////////// +// [[CircBuf]] #define CIRC_BUF_MAX_ALLOC 0x0400 // request limit #define CIRC_BUF_SIZE 0x4000 // internal buffer size @@ -1957,7 +2040,10 @@ mem_t MoveFromFastBufMem ( FastBuf_t *fb ); /////////////// MatchPattern() /////////////// /////////////////////////////////////////////////////////////////////////////// -#define PATTERN_WILDCARDS "*# ?[{" +#define PATTERN_WILDCARDS "*#\t?[{" + +bool HaveWildcards ( mem_t str ); +char * FindFirstWildcard ( mem_t str ); bool MatchPatternFull ( @@ -1977,8 +2063,8 @@ char * MatchRuleLine // returns a pointer to the first non scanned char int *status, // not NULL: return match status here - // -2: no prefix found (no ruile found) - // -1: empty line (no ruile found) + // -2: no prefix found (no rule found) + // -1: empty line (no rule found) // 0: rule found, but don't match // 1: rule found and match ccp src, // source line, scanned untilCONTROL @@ -2088,14 +2174,15 @@ void CloneArgManager ( ArgManager_t *am, int argc, char ** argv ); void AddSpaceArgManager ( ArgManager_t *am, int needed_space ); void CopyArgManager ( ArgManager_t *dest, const ArgManager_t *src ); -void MoveArgManager ( ArgManager_t *dest, ArgManager_t *src ); +void MoveArgManager ( ArgManager_t *dest, ArgManager_t *src ); void PrepareEditArgManager ( ArgManager_t *am, int needed_space ); // return the pos behind last insert arguments -uint AppendArgManager ( ArgManager_t *am, ccp arg1, ccp arg2, bool move_arg ); -uint InsertArgManager ( ArgManager_t *am, int pos, ccp arg1, ccp arg2, bool move_arg ); -uint ReplaceArgManager( ArgManager_t *am, int pos, ccp arg1, ccp arg2, bool move_arg ); +uint AppendArgManager ( ArgManager_t *am, ccp arg1, ccp arg2, bool move_arg ); +uint ReplaceArgManager ( ArgManager_t *am, int pos, ccp arg1, ccp arg2, bool move_arg ); +uint InsertArgManager ( ArgManager_t *am, int pos, ccp arg1, ccp arg2, bool move_arg ); +uint InsertListArgManager( ArgManager_t *am, int pos, int argc, char ** argv, bool move_arg ); // return the pos at removed argument uint RemoveArgManager ( ArgManager_t *am, int pos, int count ); @@ -2108,6 +2195,50 @@ bool CheckFilterArgManager ( const ArgManager_t *filter, ccp name ); void DumpArgManager ( FILE *f, int indent, const ArgManager_t *am, ccp title ); +enumError ScanFileArgManager +( + ArgManager_t *am, // valid arg-manager + int pos, // insert position, relative to end if <0 + ccp fname, // filename to open + int silent, // 0: print all error messages + // 1: suppress file size warning + // 2: suppress all error messages + int *n_added +); + +//----------------------------------------------------------------------------- + +typedef enum arg_expand_mode_t +{ + // AMXM = ArgManager eXpand Mode + // P = parameters, S = short options, L = long options + // 1 = single arg, 2 = double arg + + AMXM_P1 = 0x01, // expand "@file" + AMXM_P2 = 0x02, // expand "@ file" + AMXM_S1 = 0x04, // expand "-@file" + AMXM_S2 = 0x08, // expand "-@ file" + AMXM_L1 = 0x10, // expand "--@=file" watch out '=' + AMXM_L2 = 0x20, // expand "--@ file" + + AMXM_PARAM = AMXM_P1 | AMXM_P2, + AMXM_SHORT = AMXM_S1 | AMXM_S2, + AMXM_LONG = AMXM_L1 | AMXM_L2, + + AMXM_ALL = AMXM_PARAM | AMXM_SHORT | AMXM_LONG, +} +arg_expand_mode_t; + +enumError ExpandAtArgManager +( + ArgManager_t *am, // valid arg-manager + arg_expand_mode_t expand_mode, // objects to be replaced + int recursion, // maximum recursion depth + int silent // 0: print all error messages + // 1: suppress file size warning + // 2: suppress all error messages +); + // /////////////////////////////////////////////////////////////////////////////// /////////////// sizeof_info_t /////////////// @@ -2617,9 +2748,12 @@ typedef enum CharMode_t // select encodig/decoding method { CHMD_UTF8 = 0x01, // UTF8 support enabled (compatible with legacy bool) CHMD_ESC = 0x02, // escape ESC by \e + CHMD_PIPE = 0x04, // escape pipes '|' to '\!' + CHMD_IF_REQUIRED = 0x08, // check for special chars and encode only if required + CHMD__ALL = 0x0f, CHMD__MODERN = CHMD_UTF8 | CHMD_ESC, - CHMD__ALL = CHMD_UTF8 | CHMD_ESC, + CHMD__PIPE8 = CHMD__MODERN | CHMD_PIPE | CHMD_IF_REQUIRED, } __attribute__ ((packed)) CharMode_t; @@ -2631,11 +2765,14 @@ typedef enum EncodeMode_t // select encodig/decoding method ENCODE_OFF, // no encoding (always 0) ENCODE_STRING, // ScanEscapedString(ANSI), byte mode ENCODE_UTF8, // ScanEscapedString(UTF8), force UTF8 on decoding + ENCODE_PIPE, // analyse and use ENCODE_OFF|ENCODE_STRING, escape '|' too + ENCODE_PIPE8, // analyse and use ENCODE_OFF|ENCODE_UTF8, escape '|' too ENCODE_BASE64, // Base64 ENCODE_BASE64URL, // Base64.URL (=) / decoder detects Standard + URL + STAR ENCODE_BASE64STAR, // Base64.URL (*) / decoder detects Standard + URL + STAR ENCODE_BASE64XML, // Base64 with XML name tokens / decoder detects Standard + XML (name+id) ENCODE_JSON, // JSON string encoding + ENCODE_HEX, // Use hex-string without quotes ENCODE__N // number of encoding modes } @@ -2681,9 +2818,11 @@ extern ccp TableDecode64default, TableEncode64default; /////////////////////////////////////////////////////////////////////////////// -uint GetEscapedSize +uint GetEscapeLen ( - // returns the needed buffer size for PrintEscapedString() + // returns the extra size needed for escapes. + // Add 'src_len' to get the escaped string size. + // Add 'additionally 4 to get a good buffer size. ccp source, // NULL or string to print int src_len, // length of string. if -1, str is null terminated @@ -2717,10 +2856,27 @@ uint ScanEscapedString ccp source, // string to scan int len, // length of string. if -1, str is null terminated bool utf8, // true: source and output is UTF-8 - int quote, // 0:none, -1:auto, >0: quotation char + int quote, // -1:auto, 0:none, >0: quotation char uint *scanned_len // not NULL: Store number of scanned 'source' bytes here ); +//----------------------------------------------------------------------------- +// escan string from tabels with pipe separator (UTF8 only) + +static inline uint ScanEscapedStringPipe +( + // returns the number of valid bytes in 'buf' (NULL term added but not counted) + + char *buf, // valid destination buffer, maybe source + uint buf_size, // size of 'buf' + ccp source, // string to scan + uint *scanned_len // not NULL: Store number of scanned 'source' bytes here +) +{ + return ScanEscapedString(buf,buf_size,source,-1,true, + source && *source == '"' ? '"' : '|', scanned_len ); +} + /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// @@ -2845,7 +3001,7 @@ static inline uint DecodeJSON uint buf_size, // size of 'buf', >= 3 ccp source, // NULL or string to decode int source_len, // length of 'source'. If -1, str is NULL terminated - int quote, // 0:none, -1:auto, >0: quotation char + int quote, // -1:auto, 0:none, >0: quotation char uint *scanned_len // not NULL: Store number of scanned 'str' bytes here ) { @@ -2862,7 +3018,7 @@ mem_t DecodeJSONCirc ccp source, // NULL or string to decode int source_len, // length of 'source'. If -1, str is NULL terminated - int quote // 0:none, -1:auto, >0: quotation char + int quote // -1:auto, 0:none, >0: quotation char ); /////////////////////////////////////////////////////////////////////////////// @@ -2908,6 +3064,60 @@ mem_t QuoteJSONCirc /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// +uint DecodeHex +( + // returns the number of valid bytes in 'buf' + + char *buf, // valid destination buffer + uint buf_size, // size of 'buf', >= 3 + ccp source, // NULL or string to decode + int source_len, // length of 'source'. If -1, str is NULL terminated + int quote, // -1:auto, 0:none, >0: quotation char + uint *scanned_len // not NULL: Store number of scanned 'str' bytes here +); + +//----------------------------------------------------------------------------- + +mem_t DecodeHexCirc +( + // Returns a buffer alloced by GetCircBuf() + // with valid pointer and null terminated. + // If result is too large (>CIRC_BUF_MAX_ALLOC) then (0,0) is returned. + + ccp source, // NULL or string to decode + int source_len, // length of 'source'. If -1, str is NULL terminated + int quote // -1:auto, 0:none, >0: quotation char +); + +/////////////////////////////////////////////////////////////////////////////// + +uint EncodeHex +( + // returns the number of valid bytes in 'buf'. Result is NULL-terminated. + + char *buf, // valid destination buffer + uint buf_size, // size of 'buf', >2 and 2 bytes longer than needed + const void *source, // NULL or data to encode + int source_len, // length of 'source'; if <0: use strlen(source) + ccp digits // digits to use, eg. LoDigits[] (=fallback) or HiDigits[] +); + +//----------------------------------------------------------------------------- + +mem_t EncodeHexCirc +( + // Returns a buffer alloced by GetCircBuf() + // with valid pointer and null terminated. + // If result is too large (>CIRC_BUF_MAX_ALLOC) then (0,0) is returned. + + const void *source, // NULL or data to encode + int source_len, // length of 'source'; if <0: use strlen(source) + ccp digits // digits to use, eg. LoDigits[] (=fallback) or HiDigits[] +); + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + uint DecodeByMode ( // returns the number of valid bytes in 'buf'. Result is NULL-terminated. @@ -3003,6 +3213,22 @@ ccp GetShiftJISStatistics(void); /////////////// escape/quote strings, alloc space /////////////// /////////////////////////////////////////////////////////////////////////////// +exmem_t EscapeStringEx +( + // Returns an exmem_t struct. If not quoted (CHMD_IF_REQUIRED) it returns 'src' + // Use FreeExMem(&result) to free possible alloced result. + + cvp src, // NULL or source + int src_len, // size of 'src'. If -1: Use strlen(src) + cvp return_if_null, // return this, if 'src==NULL' + cvp return_if_empty, // return this, if src is empty (have no chars) + CharMode_t char_mode, // how to escape (CHMD_*) + char quote, // quoting character: " or ' or $ (for $'...') + bool try_circ // use circ-buffer, if result is small enough +); + +//----------------------------------------------------------------------------- + char * EscapeString ( // Returns a pointer. @@ -3063,6 +3289,23 @@ static inline char * QuoteBashCircM ( mem_t src, cvp if_null, CharMode_t cm ) static char * QuoteBashCircS ( ccp src, cvp if_null, CharMode_t cm ) { return EscapeString(src,-1,if_null,EmptyQuote,cm,'$',true,0); } + +//----------------------------------------------------------------------------- +// Escape strings for tables with pipe separator (UTF8 only). +// Use FreeExMem(result) to free possible alloced result. + +static inline exmem_t EscapeStringPipeM ( mem_t src ) + { return EscapeStringEx(src.ptr,src.len,EmptyString,EmptyString,CHMD__PIPE8,'"',false); } + +static exmem_t EscapeStringPipeS ( ccp src ) + { return EscapeStringEx(src,-1,EmptyString,EmptyString,CHMD__PIPE8,'"',false); } + +static inline exmem_t EscapeStringPipeCircM ( mem_t src ) + { return EscapeStringEx(src.ptr,src.len,EmptyString,EmptyString,CHMD__PIPE8,'"',true); } + +static exmem_t EscapeStringPipeCircS ( ccp src ) + { return EscapeStringEx(src,-1,EmptyString,EmptyString,CHMD__PIPE8,'"',false); } + // /////////////////////////////////////////////////////////////////////////////// /////////////// struct Escape_t /////////////// @@ -3230,6 +3473,17 @@ s64 ScanKeywordListMask //----------------------------------------------------------------------------- +ccp GetKeywordError +( + // return circ-buf + + const KeywordTab_t * key_tab, // NULL or pointer to command table + ccp key_arg, // analyzed command + int key_stat, // status of ScanKeyword() + ccp object // NULL or object for error messages + // default= 'command' +); + enumError PrintKeywordError ( const KeywordTab_t * key_tab, // NULL or pointer to command table @@ -5928,6 +6182,13 @@ uint FindParamFieldHelper ( const ParamField_t * pf, bool * found, ccp key ); // find first pattern that matches ParamFieldItem_t * MatchParamField ( const ParamField_t * pf, ccp key ); +//----------------------------------------------------------------------------- +// get values and set marker by 'num |= mark' + +ccp GetParamFieldStr ( ParamField_t *pf, uint mark, ccp key, ccp def ); +int GetParamFieldInt ( ParamField_t *pf, uint mark, ccp key, int def ); +int GetParamFieldIntMM ( ParamField_t *pf, uint mark, ccp key, int def, int min, int max ); + // /////////////////////////////////////////////////////////////////////////////// /////////////// struct exmem_list_t /////////////// diff --git a/project/dclib/dclib-debug.c b/project/dclib/dclib-debug.c index 6e23f6e..ed3a2d1 100644 --- a/project/dclib/dclib-debug.c +++ b/project/dclib/dclib-debug.c @@ -378,7 +378,11 @@ void ListErrorCodes /////////////// error handling /////////////// /////////////////////////////////////////////////////////////////////////////// -ProgInfo_t ProgInfo = {0}; +#ifdef EXTENDED_ERRORS + ProgInfo_t ProgInfo = { .error_level = ERRLEV_EXTENDED }; +#else + ProgInfo_t ProgInfo = { .error_level = ERRLEV_MINIMAL }; +#endif /////////////////////////////////////////////////////////////////////////////// @@ -409,6 +413,15 @@ enumError PrintErrorFile ( ccp func, ccp file, uint line, struct File_t *F, enumError PrintErrorArg ( ccp func, ccp file, unsigned int line, int syserr, enumError err_code, ccp format, va_list arg ) { + if ( err_code > ERR_OK ) + { + ProgInfo.error_count++; + + ProgInfo.last_error = err_code; + if ( ProgInfo.max_error < err_code ) + ProgInfo.max_error = err_code; + } + fflush(stdout); if (!stdwrn) { @@ -457,23 +470,22 @@ enumError PrintErrorArg ( ccp func, ccp file, unsigned int line, fflush(TRACE_FILE); #endif - #if defined(EXTENDED_ERRORS) - if ( err_code > ERR_WARNING ) - #else - if ( err_code >= ERR_NOT_IMPLEMENTED ) - #endif + ccp coln, col1, col0; + if (IsFileColorized(stdwrn)) + { + coln = GetTextMode(1,TTM_COL_INFO); + col1 = GetTextMode(1, err_code > ERR_WARNING ? TTM_COL_WARN : TTM_COL_HINT ); + col0 = TermTextModeReset; + } + else + coln = col1 = col0 = EmptyString; + + + if ( err_code >= ERR_NOT_IMPLEMENTED + || ProgInfo.error_level >= ERRLEV_HEADING && err_code > ERR_WARNING ) { - ccp coln = EmptyString; - ccp col1 = EmptyString; - ccp col0 = EmptyString; - if (IsFileColorized(stdwrn)) - { - coln = GetTextMode(1,TTM_COL_INFO); - col1 = GetTextMode(1, err_code > ERR_WARNING ? TTM_COL_WARN : TTM_COL_HINT ); - col0 = TermTextModeReset; - } - if ( stdwrn == stderr ) + if ( err_code >= ERR_NOT_IMPLEMENTED || ProgInfo.error_level >= ERRLEV_EXTENDED ) { if ( err_code > ERR_WARNING ) fprintf(stdwrn,"%s%s%s:%s ERROR #%d [%s] in %s() @ %s#%d%s\n", @@ -494,22 +506,23 @@ enumError PrintErrorArg ( ccp func, ccp file, unsigned int line, prefix, coln, ProgInfo.progname, col1, col0 ); } - #if defined(EXTENDED_ERRORS) && EXTENDED_ERRORS > 1 - #ifdef SVN_NEXT - fprintf(stdwrn,"%s -> %s/%s?annotate=%d#l%d\n", - prefix, URI_VIEWVC, file, SVN_NEXT, line ); - #elif defined(REVISION_NEXT) - fprintf(stdwrn,"%s -> %s/%s?annotate=%d#l%d\n", - prefix, URI_VIEWVC, file, REVISION_NEXT, line ); - #endif - #endif + if ( ProgInfo.error_level >= ERRLEV_ANNOTATE ) + { + #ifdef SVN_NEXT + fprintf(stdwrn,"%s -> %s/%s?annotate=%d#l%d\n", + prefix, URI_VIEWVC, file, SVN_NEXT, line ); + #elif defined(REVISION_NEXT) + fprintf(stdwrn,"%s -> %s/%s?annotate=%d#l%d\n", + prefix, URI_VIEWVC, file, REVISION_NEXT, line ); + #endif + } fputs(prefix,stdwrn); PutLines(stdwrn,plen,fw,0,prefix,msg,0); } else { - fprintf(stdwrn,"%s%s:",prefix,ProgInfo.progname); + fprintf(stdwrn,"%s%s%s:%s",prefix,coln,ProgInfo.progname,col0); PutLines(stdwrn,plen,fw,strlen(ProgInfo.progname)+1,prefix,msg,0); } @@ -521,18 +534,8 @@ enumError PrintErrorArg ( ccp func, ccp file, unsigned int line, } fflush(stdwrn); - if ( err_code > ERR_OK ) - { - ProgInfo.error_count++; - - ProgInfo.last_error = err_code; - if ( ProgInfo.max_error < err_code ) - ProgInfo.max_error = err_code; - - if ( err_code > ERR_NOT_IMPLEMENTED ) - exit(err_code); - } - + if ( err_code > ERR_NOT_IMPLEMENTED ) + exit(err_code); return err_code; } @@ -625,8 +628,152 @@ uint HexDump ( FILE * f, int indent, u64 addr, int addr_fw, int row_len, return stat < 0 ? 0 : stat; } +/////////////////////////////////////////////////////////////////////////////// + +uint HexDump16BE2 ( FILE * f, int indent, u64 addr, + const void * data, size_t count ) +{ + // return the number of printed lines + return HexDumpBE2(f,indent,addr,4,16,data,count); +} + +//----------------------------------------------------------------------------- + +uint HexDump20BE2 ( FILE * f, int indent, u64 addr, + const void * data, size_t count ) +{ + // return the number of printed lines + return HexDumpBE2(f,indent,addr,4,20,data,count); +} + +//----------------------------------------------------------------------------- + +uint HexDumpBE2 ( FILE * f, int indent, u64 addr, int addr_fw, int row_len, + const void * p_data, size_t count ) +{ + // return the number of printed lines + if ( !f || !p_data || !count ) + return 0; + + XDump_t xd; + InitializeXDumpEx(&xd,f,indent,addr,addr_fw,row_len); + xd.format = XDUMPF_INT_2; + xd.endian = DC_BIG_ENDIAN; + + const int stat = XDump(&xd,p_data,count,true); + return stat < 0 ? 0 : stat; +} + +/////////////////////////////////////////////////////////////////////////////// + +uint HexDump16LE2 ( FILE * f, int indent, u64 addr, + const void * data, size_t count ) +{ + // return the number of printed lines + return HexDumpLE2(f,indent,addr,4,16,data,count); +} + +//----------------------------------------------------------------------------- + +uint HexDump20LE2 ( FILE * f, int indent, u64 addr, + const void * data, size_t count ) +{ + // return the number of printed lines + return HexDumpLE2(f,indent,addr,4,20,data,count); +} + +//----------------------------------------------------------------------------- + +uint HexDumpLE2 ( FILE * f, int indent, u64 addr, int addr_fw, int row_len, + const void * p_data, size_t count ) +{ + // return the number of printed lines + if ( !f || !p_data || !count ) + return 0; + + XDump_t xd; + InitializeXDumpEx(&xd,f,indent,addr,addr_fw,row_len); + xd.format = XDUMPF_INT_2; + xd.endian = DC_LITTLE_ENDIAN; + + const int stat = XDump(&xd,p_data,count,true); + return stat < 0 ? 0 : stat; +} + +/////////////////////////////////////////////////////////////////////////////// + +uint HexDump16BE4 ( FILE * f, int indent, u64 addr, + const void * data, size_t count ) +{ + // return the number of printed lines + return HexDumpBE4(f,indent,addr,4,16,data,count); +} + +//----------------------------------------------------------------------------- + +uint HexDump20BE4 ( FILE * f, int indent, u64 addr, + const void * data, size_t count ) +{ + // return the number of printed lines + return HexDumpBE4(f,indent,addr,4,20,data,count); +} + //----------------------------------------------------------------------------- +uint HexDumpBE4 ( FILE * f, int indent, u64 addr, int addr_fw, int row_len, + const void * p_data, size_t count ) +{ + // return the number of printed lines + if ( !f || !p_data || !count ) + return 0; + + XDump_t xd; + InitializeXDumpEx(&xd,f,indent,addr,addr_fw,row_len); + xd.format = XDUMPF_INT_4; + xd.endian = DC_BIG_ENDIAN; + + const int stat = XDump(&xd,p_data,count,true); + return stat < 0 ? 0 : stat; +} + +/////////////////////////////////////////////////////////////////////////////// + +uint HexDump16LE4 ( FILE * f, int indent, u64 addr, + const void * data, size_t count ) +{ + // return the number of printed lines + return HexDumpLE4(f,indent,addr,4,16,data,count); +} + +//----------------------------------------------------------------------------- + +uint HexDump20LE4 ( FILE * f, int indent, u64 addr, + const void * data, size_t count ) +{ + // return the number of printed lines + return HexDumpLE4(f,indent,addr,4,20,data,count); +} + +//----------------------------------------------------------------------------- + +uint HexDumpLE4 ( FILE * f, int indent, u64 addr, int addr_fw, int row_len, + const void * p_data, size_t count ) +{ + // return the number of printed lines + if ( !f || !p_data || !count ) + return 0; + + XDump_t xd; + InitializeXDumpEx(&xd,f,indent,addr,addr_fw,row_len); + xd.format = XDUMPF_INT_4; + xd.endian = DC_LITTLE_ENDIAN; + + const int stat = XDump(&xd,p_data,count,true); + return stat < 0 ? 0 : stat; +} + +/////////////////////////////////////////////////////////////////////////////// + uint HexDump016 ( FILE * f, int indent, u64 addr, const void * data, size_t count ) { @@ -650,7 +797,7 @@ uint HexDump0 ( FILE * f, int indent, u64 addr, int addr_fw, int row_len, return stat < 0 ? 0 : stat; } -//----------------------------------------------------------------------------- +/////////////////////////////////////////////////////////////////////////////// void HexDiff16 ( FILE * f, int indent, u64 addr, const void * data1, size_t count1, diff --git a/project/dclib/dclib-debug.h b/project/dclib/dclib-debug.h index b8aefc8..1147646 100644 --- a/project/dclib/dclib-debug.h +++ b/project/dclib/dclib-debug.h @@ -41,6 +41,21 @@ // /////////////////////////////////////////////////////////////////////////////// +/////////////// error_level_t /////////////// +/////////////////////////////////////////////////////////////////////////////// +// [[error_level_t]] + +typedef enum error_level_t +{ + ERRLEV_MINIMAL, // simple error line only + ERRLEV_HEADING, // headline with: tool: ERROR # [ERR_NAME] + ERRLEV_EXTENDED, // extended headline with function and source + ERRLEV_ANNOTATE, // like ERRLEV_EXTENDED; but append 'URL?annotate=' +} +error_level_t; + +// +/////////////////////////////////////////////////////////////////////////////// /////////////// program info /////////////// /////////////////////////////////////////////////////////////////////////////// // [[ProgInfo_t]] @@ -58,7 +73,8 @@ typedef struct ProgInfo_t ccp toolversion; // version of the tool, set by SetupProgname() ccp tooltitle; // title of the tool, set by SetupProgname() - bool multi_processing; // TRUE: program uses multiple thread + error_level_t error_level; // one of ERRLEV_* + bool multi_processing; // TRUE: program uses multiple threads enumError last_error; // last error, set by PrintErrorArg() enumError max_error; // max error, set by PrintErrorArg() @@ -149,25 +165,50 @@ extern bool hexdump_align; // HexDump*() return the number of printed lines uint HexDump ( FILE * f, int indent, u64 addr, int addr_fw, int row_len, - const void * data, size_t count ); - + const void * data, size_t count ); uint HexDump16 ( FILE * f, int indent, u64 addr, - const void * data, size_t count ); + const void * data, size_t count ); uint HexDump20 ( FILE * f, int indent, u64 addr, - const void * data, size_t count ); + const void * data, size_t count ); + +uint HexDumpBE2 ( FILE * f, int indent, u64 addr, int addr_fw, int row_len, + const void * data, size_t count ); +uint HexDump16BE2 ( FILE * f, int indent, u64 addr, + const void * data, size_t count ); +uint HexDump20BE2 ( FILE * f, int indent, u64 addr, + const void * data, size_t count ); + +uint HexDumpLE2 ( FILE * f, int indent, u64 addr, int addr_fw, int row_len, + const void * data, size_t count ); +uint HexDump16LE2 ( FILE * f, int indent, u64 addr, + const void * data, size_t count ); +uint HexDump20LE2 ( FILE * f, int indent, u64 addr, + const void * data, size_t count ); + +uint HexDumpBE4 ( FILE * f, int indent, u64 addr, int addr_fw, int row_len, + const void * data, size_t count ); +uint HexDump16BE4 ( FILE * f, int indent, u64 addr, + const void * data, size_t count ); +uint HexDump20BE4 ( FILE * f, int indent, u64 addr, + const void * data, size_t count ); + +uint HexDumpLE4 ( FILE * f, int indent, u64 addr, int addr_fw, int row_len, + const void * data, size_t count ); +uint HexDump16LE4 ( FILE * f, int indent, u64 addr, + const void * data, size_t count ); +uint HexDump20LE4 ( FILE * f, int indent, u64 addr, + const void * data, size_t count ); // HexDump0*() will supress null-only lines. uint HexDump0 ( FILE * f, int indent, u64 addr, int addr_fw, int row_len, const void * data, size_t count ); - uint HexDump016 ( FILE * f, int indent, u64 addr, const void * data, size_t count ); void HexDiff ( FILE * f, int indent, u64 addr, int addr_fw, int row_len, const void * p_data1, size_t count1, const void * p_data2, size_t count2 ); - void HexDiff16 ( FILE * f, int indent, u64 addr, const void * data1, size_t count1, const void * data2, size_t count2 ); @@ -414,41 +455,42 @@ void WAIT_ARG_FUNC ( ccp format, va_list arg ); /////////////////////////////////////////////////////////////////////////////// +#undef HAVE_PRINT #undef PRINT #undef PRINT_IF #undef PRINT_SIZEOF #undef BINGO +#undef HAVE_PRINT0 #undef PRINT0 #undef PRINT_IF0 #undef PRINT_SIZEOF0 #undef BINGO0 +#undef HAVE_PRINT1 #undef PRINT1 #undef PRINT_IF1 #undef PRINT_SIZEOF1 #undef BINGO1 +#undef HAVE_PRINTD #undef PRINTD #undef PRINT_IFD #undef PRINT_SIZEOFD #undef BINGOD -#undef HAVE_PRINTD #undef xBINGO -#undef HAVE_PRINT #undef PRINT_TIME -#undef HAVE_PRINT0 // always false -#define HAVE_PRINT0 0 - // always disabled +#define HAVE_PRINT0 0 #define PRINT0 TRACE #define PRINT_IF0 TRACE_IF #define PRINT_SIZEOF0 TRACE_SIZEOF #define BINGO0 TRACELINE // always enabled +#define HAVE_PRINT1 1 #define PRINT1(...) PRINT_FUNC(__VA_ARGS__) #define PRINT_IF1(cond,...) if (cond) PRINT_FUNC(__VA_ARGS__) #define PRINT_SIZEOF1(t) PRINT_FUNC("%7zd ==%6zx/hex == sizeof(%s)\n",sizeof(t),sizeof(t),#t) @@ -456,7 +498,7 @@ void WAIT_ARG_FUNC ( ccp format, va_list arg ); #if defined(DEBUG) && defined(TEST) - #define HAVE_PRINT 1 + #define HAVE_PRINT 1 #define PRINT PRINT1 #define PRINT_IF PRINT_IF1 #define PRINT_SIZEOF PRINT_SIZEOF1 diff --git a/project/dclib/dclib-file.c b/project/dclib/dclib-file.c index aae70a3..d1f93da 100644 --- a/project/dclib/dclib-file.c +++ b/project/dclib/dclib-file.c @@ -260,12 +260,31 @@ exmem_t SearchToolByPATH ( ccp tool ) char fname[PATH_MAX]; if (strchr(tool,'/')) { +//PRINT1("SEARCH ABS: %s\n",tool); struct stat st; if ( !stat(tool,&st) && st.st_mode & (S_IXUSR|S_IXGRP|S_IXOTH) ) + { +//PRINT1("FOUND ABS: %s\n",tool); AssignExMemS(&dest,tool,-1,CPM_COPY); + } } else { + #ifdef __CYGWINxxx__ + if ( ProgInfo.progpath && *ProgInfo.progpath ) + { + PathCatPP(fname,sizeof(fname),ProgInfo.progpath,tool); +//PRINT1("SEARCH+: %s\n",fname); + struct stat st; + if ( !stat(fname,&st) && st.st_mode & (S_IXUSR|S_IXGRP|S_IXOTH) ) + { +//PRINT1("FOUND+: %s\n",fname); + AssignExMemS(&dest,fname,-1,CPM_COPY); + return dest; + } + } + #endif + ccp path = getenv("PATH"); for(;;) { @@ -279,9 +298,11 @@ exmem_t SearchToolByPATH ( ccp tool ) break; const int flen = snprintf(fname,sizeof(fname),"%.*s/%s",len,start,tool); +//PRINT1("SEARCH: %s\n",fname); struct stat st; if ( !stat(fname,&st) && st.st_mode & (S_IXUSR|S_IXGRP|S_IXOTH) ) { +//PRINT1("FOUND: %s\n",fname); AssignExMemS(&dest,fname,flen,CPM_COPY); break; } @@ -311,6 +332,7 @@ exmem_t SearchToolByList ( ccp * list, int max ) ccp arg = *list++; if (arg) { +//PRINT1("SEARCH: %s\n",arg); if ( *arg == '>' ) { ccp env = getenv(arg+1); @@ -324,7 +346,10 @@ exmem_t SearchToolByList ( ccp * list, int max ) { dest = SearchToolByPATH(arg); if (dest.data.len) + { + //AssignExMemS(&dest,arg,-1,CPM_LINK); break; + } } } } @@ -344,17 +369,33 @@ static FILE *pager_file = 0; FILE * OpenPipeToPager() { static bool done = false; - if (!done) { done = true; + // first: set less option -R to enable colors + ccp less = getenv("LESS"); + if ( less && *less ) + { + char buf[200]; + snprintf(buf,sizeof(buf),"%s -R",less); + setenv("LESS",buf,1); + } + else + setenv("LESS","-R",1); + static ccp search_tab[] = { ">DC_PAGER", ">DC_PAGER1", ">DC_PAGER2", ">PAGER", + #ifdef __CYGWINxxx__ + "/usr/bin/less", + "/cygdrive/c/Program Files/Wiimm/SZS/less", + "/usr/bin/more", + "/cygdrive/c/Program Files/Wiimm/SZS/more", + #endif "less", "more", 0 @@ -362,7 +403,18 @@ FILE * OpenPipeToPager() exmem_t pager = SearchToolByList(search_tab,-1); if (pager.data.ptr) + { + #ifdef __CYGWINxxx__ +PRINT1("popen(%s)\n",pager.data.ptr); + char buf[500]; + StringCat3S(buf,sizeof(buf),"'",pager.data.ptr,"'"); +PRINT1("popen(%s)\n",buf); + pager_file = popen(buf,"we"); +PRINT_IF1(!pager_file,"popen(%s) FAILED\n",buf); + #else pager_file = popen(pager.data.ptr,"we"); + #endif + } FreeExMem(&pager); } @@ -375,6 +427,10 @@ void ClosePagerFile() { if (pager_file) { + if ( stdout == pager_file ) stdout = 0; + if ( stderr == pager_file ) stderr = 0; + if ( stdwrn == pager_file ) stdwrn = 0; + if ( stdlog == pager_file ) stdlog = 0; pclose(pager_file); pager_file = 0; } @@ -389,6 +445,16 @@ bool StdoutToPager() { fflush(stdout); stdout = f; + + if ( stderr && isatty(fileno(stderr)) ) + stderr = f; + + if ( stdwrn && isatty(fileno(stdwrn)) ) + stdwrn = f; + + if ( stdlog && isatty(fileno(stdlog)) ) + stdlog = f; + return true; } return false; @@ -399,10 +465,7 @@ bool StdoutToPager() void CloseStdoutToPager() { if ( pager_file && pager_file == stdout ) - { ClosePagerFile(); - stdout = 0; - } } // @@ -1808,7 +1871,7 @@ enumError LoadFile bool fatt_max // true: store *max* values to 'fatt' ) { - ASSERT(data); + DASSERT(data); if (!size) return ERR_OK; @@ -2222,58 +2285,101 @@ enumError CopyFileTemp enumError TransferFile ( - ccp src, // source path + LogFile_t *log, // not NULL: log activities ccp dest, // destination path + ccp src, // source path TransferMode_t tfer_mode, // transfer mode mode_t open_mode // mode for CopyFile*() -> open() ) { - if ( !dest || !src || !*dest || !*src ) + if ( !dest || !*dest || !src || !*src ) return ERR_MISSING_PARAM; if (IsSameFile(src,dest)) return ERR_NOTHING_TO_DO; + const bool testmode = ( tfer_mode & TFMD_F_TEST ) != 0; + if ( tfer_mode & TFMD_J_MOVE1 ) { LOGPRINT("TransferFile(MOVE1) %s -> %s\n",src,dest); struct stat st; - if ( !stat(src,&st) && st.st_nlink == 1 && !rename(src,dest) ) + if ( !stat(src,&st) && st.st_nlink == 1 + && ( testmode || !rename(src,dest) )) + { + if (log) + PrintLogFile(log, "%s:\n\t< %s\n\t> %s\n", + testmode ? "Would MOVE" : "MOVED", src, dest ); return ERR_OK; + } } else if ( tfer_mode & TFMD_J_MOVE ) { LOGPRINT("TransferFile(MOVE) %s -> %s\n",src,dest); - if (!rename(src,dest)) + if ( testmode || !rename(src,dest) ) + { + if (log) + PrintLogFile(log, "%s:\n\t< %s\n\t> %s\n", + testmode ? "Would MOVE" : "MOVED", src, dest ); return ERR_OK; + } } if ( tfer_mode & TFMD_J_LINK ) { LOGPRINT("TransferFile(RM_DEST) %s\n",dest); - if ( tfer_mode & TFMD_J_RM_DEST ) + if ( tfer_mode & TFMD_J_RM_DEST && !testmode ) unlink(dest); LOGPRINT("TransferFile(LINK) %s -> %s\n",src,dest); - if (!link(src,dest)) + if ( testmode || !link(src,dest) ) + { + if (log) + PrintLogFile(log, "%s:\n\t< %s\n\t> %s\n", + testmode ? "Would LINK" : "LINKED", src, dest ); return ERR_OK; + } } if ( tfer_mode & TFMD_J_COPY ) { LOGPRINT("TransferFile(COPY) %s -> %s\n",src,dest); - enumError err = tfer_mode & TFMD_J_RM_DEST - ? CopyFileTemp(src,dest,open_mode) - : CopyFile(src,dest,open_mode); - if ( err == ERR_OK ) + if (testmode) { - if ( tfer_mode & TFMD_J_RM_SRC ) + if (log) { - PRINT("TransferFile(RM_SRC) %s",src); - unlink(src); + if ( tfer_mode & TFMD_J_RM_DEST ) + PrintLogFile(log, "Would REMOVE DEST: %s\n",dest); + PrintLogFile(log, "Would COPY:\n\t< %s\n\t> %s\n",src,dest); + if ( tfer_mode & TFMD_J_RM_SRC ) + PrintLogFile(log, "Would REMOVE SRC: %s\n",src); } return ERR_OK; } + else + { + enumError err = tfer_mode & TFMD_J_RM_DEST + ? CopyFileTemp(src,dest,open_mode) + : CopyFile(src,dest,open_mode); + if ( err == ERR_OK ) + { + if (log) + { + if ( tfer_mode & TFMD_J_RM_DEST ) + PrintLogFile(log, "REMOVE DEST: %s\n",dest); + PrintLogFile(log, "COPY:\n\t< %s\n\t> %s\n",src,dest); + } + + if ( tfer_mode & TFMD_J_RM_SRC ) + { + PRINT("TransferFile(RM_SRC) %s",src); + unlink(src); + if (log) + PrintLogFile(log, "REMOVE SRC: %s\n",src); + } + return ERR_OK; + } + } } return ERR_ERROR; @@ -3099,6 +3205,24 @@ bool IsSameFilename ( ccp fn1, ccp fn2 ) } /////////////////////////////////////////////////////////////////////////////// + +// convert type get by readdir() to of struct stat.st_mode +uint ConvertDType2STMode ( uint d_type ) +{ + switch (d_type) + { + case DT_BLK: return S_IFBLK; + case DT_CHR: return S_IFCHR; + case DT_DIR: return S_IFDIR; + case DT_FIFO: return S_IFIFO; + case DT_LNK: return S_IFLNK; + case DT_REG: return S_IFREG; + case DT_SOCK: return S_IFSOCK; + } + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// bool enable_config_search_log = false; @@ -3622,6 +3746,317 @@ ccp GetBlockDeviceHolder ( ccp name, ccp sep, int *ret_level ) // /////////////////////////////////////////////////////////////////////////////// +/////////////// SearchPaths() /////////////// +/////////////////////////////////////////////////////////////////////////////// +// [[search_paths_t]] + +typedef struct search_paths_t +{ + mem_t source; // path to analyse, any string outside + bool allow_hidden; // true: allow hidden dirs and files + + char *path_buf; // pointer to complete path, work buffer + char *path_star; // begin of '**' for search_paths_dir() + char *path_ptr; // current end of path + char *path_end; // end of 'path_buf' -1 + + SearchPathsFunc func; // function to call, never NULL + void *param; // last param for func() + + search_paths_stat_t status; // search status +} +search_paths_t; + +/////////////////////////////////////////////////////////////////////////////// + +static void search_paths_hit ( search_paths_t *sp, mem_t path, uint d_type ) +{ + DASSERT(sp); + enumError err = sp->func(path,d_type,sp->param); + if ( err < 0 ) + { + err = -err; + sp->status.abort = true; + } + + if ( err != ERR_JOB_IGNORED ) + { + sp->status.hit_count++; + if ( sp->status.max_err < err ) + sp->status.max_err = err; + } + + sp->status.func_count++; +} + +/////////////////////////////////////////////////////////////////////////////// + +static void search_paths_dir ( search_paths_t *sp, ParamField_t *collect, int min, int max ) +{ + DASSERT(sp); + DASSERT(collect); + PRINT0("%s%s** %d - %d%s\n",colerr->debug,sp->path_buf,min,max,colerr->reset); + + search_paths_t local = *sp; + char *path_ptr = local.path_ptr; + + DIR *fdir = opendir( *local.path_buf ? local.path_buf: "." ); + local.status.dir_count++; + if (fdir) + { + for(;;) + { + struct dirent *dent = readdir(fdir); + if (!dent) + break; + + if ( dent->d_name[0] == '.' + && ( !local.allow_hidden + || !dent->d_name[1] + || dent->d_name[1] == '.' && !dent->d_name[2] )) + { + continue; + } + + local.path_ptr = StringCopyE(path_ptr,sp->path_end,dent->d_name); + + uint st_mode = ConvertDType2STMode(dent->d_type); + if (!st_mode) + { + struct stat st; + if (stat(local.path_buf,&st)) + continue; + st_mode = st.st_mode; + } + if (!S_ISDIR(st_mode)) + continue; + + DASSERT(local.path_star); + DASSERT( local.path_star >= local.path_buf ); + DASSERT( local.path_star <= local.path_ptr ); + + PRINT0("FOUND: [t=%d,m:%x,add=%d,r=%d] %s\n", + dent->d_type, st_mode, min<=0, max>0, local.path_star ); + if ( min <= 0 ) + InsertParamField(collect,local.path_star,false,st_mode,0); + if ( max > 0 ) + { + *local.path_ptr++ = '/'; + *local.path_ptr = 0; + search_paths_dir(&local,collect,min-1,max-1); + } + } + closedir(fdir); + } + + sp->status = local.status; +} + +/////////////////////////////////////////////////////////////////////////////// + +static void search_paths_helper ( search_paths_t *sp ) +{ + ccp wc = FindFirstWildcard(sp->source); + if (!wc) + { + char *end = StringCopyEM(sp->path_ptr,sp->path_end,sp->source.ptr,sp->source.len); + struct stat st; + if (!stat(sp->path_buf,&st)) + { + mem_t path = { .ptr = sp->path_buf, .len = end - sp->path_buf }; + search_paths_hit(sp,path,st.st_mode); + } + return; + } + + search_paths_t local = *sp; + + ccp pat = memrchr(local.source.ptr,'/',wc-local.source.ptr); + pat = pat ? pat+1 : local.source.ptr; + + ccp source_end = local.source.ptr + local.source.len; + ccp next = memchr(wc,'/',source_end-wc); + if (!next) + next = source_end; + + mem_t pattern; + pattern.len = next - pat; + pattern.ptr = MEMDUP(pat,pattern.len); + const bool allow_hidden = local.allow_hidden || pattern.ptr[0] == '.'; + + char *path_ptr = StringCopyEM(local.path_ptr,local.path_end,local.source.ptr,pat-local.source.ptr); + local.path_ptr = path_ptr; + + local.source.ptr = next; + local.source.len = source_end - next; + const bool want_dir = local.source.len && local.source.ptr[0] == '/'; + + PRINT0("SPLIT: %s %s%s%s %.*s [want_dir=%d]\n", + local.path_buf, + colerr->highlight, pattern.ptr, colerr->reset, + local.source.len, local.source.ptr, want_dir ); + + ParamField_t collect; + InitializeParamField(&collect); + collect.func_cmp = strcasecmp; + + + //--- check for **... + + if ( pattern.ptr[0] == '*' && pattern.ptr[1] == '*' ) + { + u32 n1 = 0, n2 = 100; + char *ptr = (char*)pattern.ptr+2; + if (*ptr) + { + if (isdigit(*ptr)) + n1 = str2ul(ptr,&ptr,10); + if (*ptr) + { + if ( *ptr != '-' ) + goto terminate; + if ( *++ptr ) + { + n2 = str2ul(ptr,&ptr,10); + if (*ptr) + goto terminate; + } + } + else + n2 = n1; + if ( n2 > 100 ) + n2 = 100; + if ( n1 > n2 ) + goto terminate; + } + + local.path_star = path_ptr; + search_paths_dir(&local,&collect,n1,n2); + PRINT0("%sDIR: %d records for **%s\n",colerr->highlight,collect.used,colerr->reset); + + ParamFieldItem_t *end = collect.field + collect.used; + for ( ParamFieldItem_t *ptr = collect.field; !local.status.abort && ptr < end; ptr++ ) + { + local.path_ptr = StringCopyE(path_ptr,sp->path_end,ptr->key); + PRINT0("%sDIR: %s%s\n",colerr->highlight,local.path_buf,colerr->reset); + search_paths_helper(&local); + if (local.status.abort) + break; + } + goto terminate; + } + + + //--- scan directory + + DIR *fdir = opendir( *local.path_buf ? local.path_buf: "." ); + local.status.dir_count++; + if (fdir) + { + for(;;) + { + struct dirent *dent = readdir(fdir); + if (!dent) + break; + + if ( dent->d_name[0] == '.' + && ( !allow_hidden + || !dent->d_name[1] + || dent->d_name[1] == '.' && !dent->d_name[2] )) + { + continue; + } + + uint st_mode = ConvertDType2STMode(dent->d_type); + if ( st_mode && want_dir && !S_ISDIR(st_mode) && !S_ISLNK(st_mode) ) + continue; + + if ( MatchPatternFull(pattern.ptr,dent->d_name) ) + { + if (!st_mode) + { + local.path_ptr = StringCopyE(path_ptr,sp->path_end,dent->d_name); + struct stat st; + if (stat(local.path_buf,&st)) + continue; + if ( want_dir && !S_ISDIR(st.st_mode) && !S_ISLNK(st.st_mode) ) + continue; + st_mode = st.st_mode; + } + PRINT0("BINGO: [%d,%x] %s\n",dent->d_type,st_mode,dent->d_name); + InsertParamField(&collect,dent->d_name,false,st_mode,0); + } + } + closedir(fdir); + } + + if (!local.status.abort) + { + ParamFieldItem_t *end = collect.field + collect.used; + for ( ParamFieldItem_t *ptr = collect.field; !local.status.abort && ptr < end; ptr++ ) + { + local.path_ptr = StringCopyE(path_ptr,sp->path_end,ptr->key); + if (local.source.len) + { + search_paths_helper(&local); + if (local.status.abort) + break; + } + else + { + mem_t path = { .ptr = local.path_buf, .len = local.path_ptr - local.path_buf }; + search_paths_hit(&local,path,ptr->num); + } + } + } + + terminate:; + ResetParamField(&collect); + FreeString(pattern.ptr); + sp->status = local.status; +} + +/////////////////////////////////////////////////////////////////////////////// + +search_paths_stat_t SearchPaths +( + ccp path1, // not NULL: part #1 of base path + ccp path2, // not NULL: part #2 of base path + bool allow_hidden, // allow hiddent directories and files + SearchPathsFunc func, // callback function, never NULL + void *param // last param for func() +) +{ + if (!func) + { + search_paths_stat_t stat = { .max_err = ERR_MISSING_PARAM }; + return stat; + } + + char srcbuf[PATH_MAX+2]; + ccp source = PathCatPP(srcbuf,sizeof(srcbuf),path1,path2); + + char pathbuf[PATH_MAX]; + search_paths_t sp = + { + .source.ptr = source, + .source.len = strlen(source), + .allow_hidden = allow_hidden, + .path_buf = pathbuf, + .path_ptr = pathbuf, + .path_end = pathbuf + sizeof(pathbuf) - 2, + .func = func, + .param = param, + }; + + search_paths_helper(&sp); + PRINT0("abort=%d, max_err = %d, %u dirs scanned, %u func calls, %u hits\n", + sp.abort, sp.max_err, sp.dir_count, sp.func_count, sp.hit_count ); + return sp.status; +} + +// +/////////////////////////////////////////////////////////////////////////////// /////////////// normalize filenames /////////////// /////////////////////////////////////////////////////////////////////////////// @@ -3833,7 +4268,7 @@ uint NormalizeFilenameCygwin *dest++ = *src++; *dest = 0; - ASSERT( dest < buf + buf_size ); + DASSERT( dest < buf + buf_size ); return dest - buf; } diff --git a/project/dclib/dclib-file.h b/project/dclib/dclib-file.h index f9dd2fc..92a3283 100644 --- a/project/dclib/dclib-file.h +++ b/project/dclib/dclib-file.h @@ -632,13 +632,22 @@ typedef enum TransferMode_t { //--- jobs - TFMD_J_MOVE = 0x01, // move file - TFMD_J_MOVE1 = 0x02, // move file, but only if not linked (ignore TFMD_J_MOVE) - TFMD_J_RM_DEST = 0x04, // remove dest before TFMD_J_LINK and TFMD_J_COPY - TFMD_J_LINK = 0x08, // link file - TFMD_J_COPY = 0x10, // copy file - TFMD_J_RM_SRC = 0x20, // remove source after TFMD_J_COPY -// TFMD_J_TOUCH = 0x40, // touch destination => not supported yet + TFMD_J_MOVE = 0x001, // move file + TFMD_J_MOVE1 = 0x002, // move file, but only if not linked (ignore TFMD_J_MOVE) + TFMD_J_RM_DEST = 0x004, // remove dest before TFMD_J_LINK and TFMD_J_COPY + TFMD_J_LINK = 0x008, // link file + TFMD_J_COPY = 0x010, // copy file + TFMD_J_RM_SRC = 0x020, // remove source after TFMD_J_COPY +// TFMD_J_TOUCH = 0x040, // touch destination => not supported yet + + //--- flags + + TFMD_F_TEST = 0x100, // testmode, don't touch files + + //--- masks + + TFMD_M_JOBS = 0x03f, // mask for jobs + TFMD_M_FLAGS = 0x100, // mask for flags //--- modes @@ -648,7 +657,7 @@ typedef enum TransferMode_t TFMD_COPY = TFMD_J_RM_DEST | TFMD_J_COPY, TFMD_CAT = TFMD_J_COPY, } -__attribute__ ((packed)) TransferMode_t; +TransferMode_t; //----------------------------------------------------------------------------- @@ -662,8 +671,9 @@ __attribute__ ((packed)) TransferMode_t; enumError TransferFile ( - ccp src, // source path + LogFile_t *log, // not NULL: log activities ccp dest, // destination path + ccp src, // source path TransferMode_t tfer_mode, // transfer mode mode_t open_mode // mode for CopyFile*() -> open() ); @@ -947,6 +957,9 @@ int ExistDirectory bool IsSameFilename ( ccp fn1, ccp fn2 ); +// convert type get by readdir() to of struct stat.st_mode +uint ConvertDType2STMode ( uint d_type ); + /////////////////////////////////////////////////////////////////////////////// // [[FindConfigFile_t]] @@ -1008,6 +1021,43 @@ int SearchFiles ); /////////////////////////////////////////////////////////////////////////////// +// [[search_paths_stat_t]] + +typedef struct search_paths_stat_t +{ + bool abort; // true: abort search + enumError max_err; // max found error + + uint dir_count; // number of scanned directories + uint func_count; // number of func() calls + uint hit_count; // number of hits (!ERR_JOB_IGNORED) +} +search_paths_stat_t; + +//----------------------------------------------------------------------------- + +// error codes < 0 mean: abort. +// return ERR_JOB_IGNORED if path finally not match + +typedef enumError (*SearchPathsFunc) +( + mem_t path, // full path of existing file, never NULL + uint st_mode, // copy of struct stat.st_mode, see "man 2 stat" + void *param // user defined parameter +); + +//----------------------------------------------------------------------------- + +search_paths_stat_t SearchPaths +( + ccp path1, // not NULL: part #1 of base path + ccp path2, // not NULL: part #2 of base path + bool allow_hidden, // allow hiddent directories and files + SearchPathsFunc func, // callback function, never NULL + void *param // last param for func() +); + +/////////////////////////////////////////////////////////////////////////////// enumError CreatePath ( diff --git a/project/dclib/dclib-network.c b/project/dclib/dclib-network.c index 76390e3..9c350b9 100644 --- a/project/dclib/dclib-network.c +++ b/project/dclib/dclib-network.c @@ -3520,7 +3520,11 @@ int PrintBinary1TCPStream return -1; char buf[10000], *end_buf = buf + sizeof(buf) - 4; + #if 0 // dcc12: throws error: buf may be used uninitialized char *dest = StringCopyE(buf,end_buf,cmd); + #else + char *dest = StringCopyS(buf,sizeof(buf)-4,cmd); + #endif if ( dest + 6 + bin_size >= end_buf ) return -1; @@ -3579,7 +3583,11 @@ int PrintBinary2TCPStream return -1; char buf[10000], *end_buf = buf + sizeof(buf) - 4; + #if 0 // dcc12: throws error: buf may be used uninitialized char *dest = StringCopyE(buf,end_buf,cmd); + #else + char *dest = StringCopyS(buf,sizeof(buf)-4,cmd); + #endif if ( dest + 9 + bin1_size + bin2_size >= end_buf ) return -1; diff --git a/project/dclib/dclib-numeric.c b/project/dclib/dclib-numeric.c index 0b21975..c339a29 100644 --- a/project/dclib/dclib-numeric.c +++ b/project/dclib/dclib-numeric.c @@ -1197,9 +1197,11 @@ ccp GetEncodingName ( EncodeMode_t em ) /////////////////////////////////////////////////////////////////////////////// -uint GetEscapedSize +uint GetEscapeLen ( - // returns the needed buffer size for PrintEscapedString() + // returns the extra size needed for escapes. + // Add 'src_len' to get the escaped string size. + // Add 'additionally 4 to get a good buffer size. ccp source, // NULL or string to print int src_len, // length of string. if -1, str is null terminated @@ -1208,14 +1210,15 @@ uint GetEscapedSize ) { const CharMode_t utf8 = char_mode & CHMD_UTF8; - const CharMode_t allow_e = char_mode & CHMD_ESC; + const int esc_size = char_mode & CHMD_ESC ? 1 : 3; + const int pipe_size = char_mode & CHMD_PIPE ? 1 : 0; if ( !source || !*source ) - return 1; + return 0; ccp str = source; ccp end = src_len < 0 ? 0 : str + src_len; - uint size = 4; // +4 for escapes at end; +1 for NULL terminator + uint size = 0; while ( !end || str < end ) { const u8 ch = (u8)*str++; @@ -1224,7 +1227,7 @@ uint GetEscapedSize case 0: if (!end) return size; - size += 4; + size += 3; break; case '\\': @@ -1235,20 +1238,22 @@ uint GetEscapedSize case '\r': case '\t': case '\v': - size += 2; + size++; break; case '\033': - size += allow_e ? 2 : 4; + size += esc_size; + break; + + case '|': + size += pipe_size; break; default: if ( ch == quote ) - size += 2; - else if ( ch < ' ' || !utf8 && (ch&0x7f) < ' ' || (ch&0x7f) == 0x7f ) - size += 4; - else size++; + else if ( ch < ' ' || !utf8 && (ch&0x7f) < ' ' || (ch&0x7f) == 0x7f ) + size += 3; } } return size; @@ -1269,15 +1274,16 @@ char * PrintEscapedString uint *dest_len // not NULL: Store length of result here ) { - ///////////////////////////////////////////////////////// - ///// Update GetEscapedSize() on modifications!! ///// - ///////////////////////////////////////////////////////// + /////////////////////////////////////////////////////// + ///// Update GetEscapeLen() on modifications!! ///// + /////////////////////////////////////////////////////// DASSERT(buf); DASSERT(buf_size>=10); const CharMode_t utf8 = char_mode & CHMD_UTF8; const CharMode_t allow_e = char_mode & CHMD_ESC; + const CharMode_t esc_pipe = char_mode & CHMD_PIPE; char *dest = buf; char *dest_end = dest + buf_size - 4; @@ -1325,6 +1331,16 @@ char * PrintEscapedString } break; + case '|': + if (esc_pipe) + { + *dest++ = '\\'; + *dest++ = '!'; + } + else + *dest++ = '|'; + break; + default: if ( ch == quote ) { @@ -1360,7 +1376,7 @@ uint ScanEscapedString ccp source, // string to scan int len, // length of string. if -1, str is null terminated bool utf8, // true: source and output is UTF-8 - int quote, // 0:none, -1:auto, >0: quotation char + int quote, // -1:auto, 0:none, >0: quotation char uint *scanned_len // not NULL: Store number of scanned 'source' bytes here ) { @@ -1380,6 +1396,8 @@ uint ScanEscapedString quote = *src++; have_quote = true; } + else if ( have_quote && *src == quote ) + src++; while ( dest < dest_end && src < src_end ) { @@ -1947,7 +1965,7 @@ mem_t DecodeJSONCirc ccp source, // NULL or string to decode int source_len, // length of 'source'. If -1, str is NULL terminated - int quote // 0:none, -1:auto, >0: quotation char + int quote // -1:auto, 0:none, >0: quotation char ) { char buf[CIRC_BUF_MAX_ALLOC+10]; @@ -1965,6 +1983,160 @@ mem_t DecodeJSONCirc /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// +// [[hex]] + +uint EncodeHex +( + // returns the number of valid bytes in 'buf'. Result is NULL-terminated. + + char *buf, // valid destination buffer + uint buf_size, // size of 'buf', >2 and 2 bytes longer than needed + const void *source, // NULL or data to encode + int source_len, // length of 'source'; if <0: use strlen(source) + ccp digits // digits to use, eg. LoDigits[] (=fallback) or HiDigits[] +) +{ + DASSERT(buf); + DASSERT(buf_size>2); + + if (!digits) + digits = LoDigits; + + char *dest = buf; + char *dest_end = dest + buf_size - 1; + + if (!source) + source = ""; + ccp str = source; + ccp end = str + ( source_len < 0 ? strlen(str) : source_len ); + + while ( dest < dest_end && str < end ) + { + const u8 ch = (u8)*str++; + *dest++ = digits[ch>>4]; + *dest++ = digits[ch&15]; + } + *dest = 0; + return dest - buf; +} + +//----------------------------------------------------------------------------- +// [[hex]] + +mem_t EncodeHexCirc +( + // Returns a buffer alloced by GetCircBuf() + // with valid pointer and null terminated. + // If result is too large (>CIRC_BUF_MAX_ALLOC) then (0,0) is returned. + + const void *source, // NULL or data to encode + int source_len, // length of 'source'; if <0: use strlen(source) + ccp digits // digits to use, eg. LoDigits[] (=fallback) or HiDigits[] +) +{ + char buf[CIRC_BUF_MAX_ALLOC+10]; + mem_t mem; + mem.len = EncodeHex(buf,sizeof(buf),source,source_len,digits); + if ( mem.len < CIRC_BUF_MAX_ALLOC ) + mem.ptr = CopyCircBuf(buf,mem.len+1); + else + { + mem.ptr = 0; + mem.len = 0; + } + return mem; +} + +/////////////////////////////////////////////////////////////////////////////// +// [[hex]] + +uint DecodeHex +( + // returns the number of valid bytes in 'buf' + + char *buf, // valid destination buffer + uint buf_size, // size of 'buf', >= 3 + ccp source, // NULL or string to decode + int source_len, // length of 'source'. If -1, str is NULL terminated + int quote, // -1:auto, 0:none, >0: quotation char + uint *scanned_len // not NULL: Store number of scanned 'str' bytes here +) +{ + DASSERT(buf); + DASSERT(buf_size>3); + DASSERT(source); + + char *dest = buf; + char *dest_end = dest + buf_size - 1; + + ccp src = source; + ccp src_end = src + ( source_len < 0 ? strlen(src) : source_len ); + + bool have_quote = quote > 0; + if ( quote == -1 && src < src_end && ( *src == '"' || *src == '\'' )) + { + quote = *src++; + have_quote = true; + } + + while ( dest < dest_end && src < src_end ) + { + u8 hi = TableNumbers[(u8)*src]; + if ( hi >= 16 ) + break; + hi <<= 4; + + u8 lo = ++src < src_end ? TableNumbers[(u8)*src] : 0; + if ( lo >= 16 ) + { + *dest++ = hi; + break; + } + *dest++ = hi | lo; + src++; + } + + if (scanned_len) + { + if ( have_quote && src < src_end && *src == quote ) + src++; + *scanned_len = src - source; + } + + *dest = 0; + return dest - buf; +} + +//----------------------------------------------------------------------------- +// [[hex]] + +mem_t DecodeHexCirc +( + // Returns a buffer alloced by GetCircBuf() + // with valid pointer and null terminated. + // If result is too large (>CIRC_BUF_MAX_ALLOC) then (0,0) is returned. + + ccp source, // NULL or string to decode + int source_len, // length of 'source'. If -1, str is NULL terminated + int quote // -1:auto, 0:none, >0: quotation char +) +{ + char buf[CIRC_BUF_MAX_ALLOC+10]; + mem_t mem; + mem.len = DecodeHex(buf,sizeof(buf),source,source_len,quote,0); + if ( mem.len < CIRC_BUF_MAX_ALLOC ) + mem.ptr = CopyCircBuf(buf,mem.len+1); + else + { + mem.ptr = 0; + mem.len = 0; + } + return mem; +} + + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// uint DecodeByMode ( @@ -1996,10 +2168,12 @@ uint DecodeByMode switch (emode) { case ENCODE_STRING: + case ENCODE_PIPE: len = ScanEscapedString(buf,buf_size,source,slen,false,-1,scanned_len); break; case ENCODE_UTF8: + case ENCODE_PIPE8: len = ScanEscapedString(buf,buf_size,source,slen,true,-1,scanned_len); break; @@ -2020,6 +2194,10 @@ uint DecodeByMode len = DecodeJSON(buf,buf_size,source,slen,-1,scanned_len); break; + case ENCODE_HEX: + len = DecodeHex(buf,buf_size,source,slen,-1,scanned_len); + break; + default: if ( slen < 0 ) len = StringCopyS(buf,buf_size,source) - buf; @@ -2066,6 +2244,8 @@ mem_t DecodeByModeMem { case ENCODE_STRING: case ENCODE_UTF8: + case ENCODE_PIPE: + case ENCODE_PIPE8: need = slen + 5; break; @@ -2076,6 +2256,10 @@ mem_t DecodeByModeMem need = ( 3*slen ) / 4 + 12; break; + case ENCODE_HEX: + need = (slen+3)/2; + break; + //case ENCODE_JSON: // [[json]] default: need = slen + 3; // at least 3 bytes @@ -2215,7 +2399,15 @@ uint EncodeByMode break; case ENCODE_UTF8: - PrintEscapedString(buf,buf_size,source,slen,CHMD__ALL,0,&len); + PrintEscapedString(buf,buf_size,source,slen,CHMD__MODERN,0,&len); + break; + + case ENCODE_PIPE: + PrintEscapedString(buf,buf_size,source,slen,CHMD_IF_REQUIRED|CHMD_PIPE,0,&len); + break; + + case ENCODE_PIPE8: + PrintEscapedString(buf,buf_size,source,slen,CHMD__MODERN|CHMD_IF_REQUIRED|CHMD_PIPE,0,&len); break; case ENCODE_BASE64: @@ -2242,6 +2434,10 @@ uint EncodeByMode len = EncodeJSON(buf,buf_size,source,slen); break; + case ENCODE_HEX: + len = EncodeHex(buf,buf_size,source,slen,0); + break; + default: if ( slen < 0 ) len = StringCopyS(buf,buf_size,source) - buf; @@ -2284,6 +2480,8 @@ mem_t EncodeByModeMem { case ENCODE_STRING: case ENCODE_UTF8: + case ENCODE_PIPE: + case ENCODE_PIPE8: need = slen * 4 + 5; break; @@ -2294,6 +2492,10 @@ mem_t EncodeByModeMem need = ( 4*slen ) / 3 + 10; break; + case ENCODE_HEX: + need = 2*slen + 1; + break; + case ENCODE_JSON: // [[json]] { need = slen + 1; @@ -2330,6 +2532,79 @@ mem_t EncodeByModeMem /////////////// escape/quote strings, alloc space /////////////// /////////////////////////////////////////////////////////////////////////////// +exmem_t EscapeStringEx +( + // Returns an exmem_t struct. If not quoted (CHMD_IF_REQUIRED) it returns 'src' + // Use FreeExMem(&result) to free possible alloced result. + + cvp src, // NULL or source + int src_len, // size of 'src'. If -1: Use strlen(src) + cvp return_if_null, // return this, if 'src==NULL' + cvp return_if_empty, // return this, if src is empty (have no chars) + CharMode_t char_mode, // how to escape (CHMD_*) + char quote, // quoting character: " or ' or $ (for $'...') + bool try_circ // use circ-buffer, if result is small enough +) +{ + if (!src) + return ExMemByString((char*)return_if_null); + + if ( src_len < 0 ) + src_len = strlen(src); + if (!src_len) + return ExMemByString((char*)return_if_empty); + + char quote_char; + uint quote_mode; + if ( quote == '$' ) + { + quote_mode = 3; + quote_char = '\''; + } + else if (quote) + { + quote_mode = 2; + quote_char = quote; + } + else + { + quote_mode = 0; + quote_char = '"'; + } + + uint size = GetEscapeLen(src,src_len,char_mode,quote_char); + if ( !size && char_mode & CHMD_IF_REQUIRED ) + return ExMemByS(src,src_len); + + size += quote_mode + src_len + 4; + const bool use_circ = try_circ && size <= CIRC_BUF_MAX_ALLOC; + char *buf = use_circ ? GetCircBuf(size) : MALLOC(size); + + uint len; + if ( quote_mode == 3 ) + { + PrintEscapedString(buf+2,size-3,src,src_len,char_mode,quote_char,&len); + buf[0] = '$'; + buf[1] = buf[len+2] = quote_char; + buf[len+3] = 0; + + } + else if ( quote_mode == 2 ) + { + PrintEscapedString(buf+1,size-2,src,src_len,char_mode,quote_char,&len); + buf[0] = buf[len+1] = quote_char; + buf[len+2] = 0; + } + else + PrintEscapedString(buf,size,src,src_len,char_mode,quote_char,&len); + + exmem_t res = { .data={ buf, len+quote_mode }, + .is_circ_buf = use_circ, .is_alloced = !use_circ }; + return res; +}; + +/////////////////////////////////////////////////////////////////////////////// + char * EscapeString ( // Returns a pointer. @@ -2353,6 +2628,14 @@ char * EscapeString if (!src_len) return (char*)return_if_empty; + #if 1 + exmem_t res = EscapeStringEx(src,src_len,return_if_null,return_if_empty,char_mode,quote,try_circ); + if (dest_len) + *dest_len = res.data.len; + return res.is_circ_buf || res.is_alloced + ? (char*)res.data.ptr + : MEMDUP(res.data.ptr,res.data.len); + #else // [[2do]] [[obsolete]] char quote_char; uint quote_mode; if ( quote == '$' ) @@ -2371,7 +2654,18 @@ char * EscapeString quote_char = '"'; } - uint size = GetEscapedSize(src,src_len,char_mode,quote_char) + quote_mode; + uint size = GetEscapeLen(src,src_len,char_mode,quote_char); + if ( !size && char_mode & CHMD_IF_REQUIRED ) + { + char *buf = try_circ && size <= CIRC_BUF_MAX_ALLOC ? GetCircBuf(src_len+1) : MALLOC(src_len+1); + memcpy(buf,src,src_len); + buf[src_len] = 0; + if (dest_len) + *dest_len = src_len; + return buf; + } + + size += quote_mode + src_len + 4; char *buf = try_circ && size <= CIRC_BUF_MAX_ALLOC ? GetCircBuf(size) : MALLOC(size); uint len; @@ -2395,6 +2689,7 @@ char * EscapeString if (dest_len) *dest_len = len + quote_mode; return buf; + #endif }; // @@ -6630,6 +6925,7 @@ char * ScanEscape case 'r': code = '\r'; break; case 't': code = '\t'; break; case 'v': code = '\v'; break; + case '!': code = '|'; break; case 'x': src = ScanNumber(&code,src,src_end,16,2); @@ -8223,7 +8519,8 @@ char * ScanSizeRange { have_d1 = *source == ':' && opt & RAOPT_COLON || *source == '#' && opt & RAOPT_HASH - || *source == ',' && opt & RAOPT_COMMA; + || *source == ',' && opt & RAOPT_COMMA + || *source == '-' && (opt & (RAOPT_COMMA|RAOPT_NEG)) == RAOPT_COMMA; } char *end = have_d1 ? (char*)source @@ -8242,7 +8539,7 @@ char * ScanSizeRange || *end == '-' && opt & RAOPT_MINUS; const bool have_size = *end == '#' && opt & RAOPT_HASH || *end == ',' && opt & RAOPT_COMMA; - + PRINT0("have_d1=%d, have_range=%d, have_size=%d, %.0g:%.0g |%s|\n",have_d1,have_range,have_size,d1,d2,end); if ( have_range || have_size ) { if ( d1 < 0 && max_value > 0 && opt & RAOPT_NEG ) @@ -9489,6 +9786,40 @@ float double2float ( double d ) /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// +u64 MulDivU64 ( u64 factor1, u64 factor2, u64 divisor ) +{ + #if HAVE_INT128 + + return (u128)factor1 * (u128)factor2 / divisor; + + #else + + if ( !factor1 || !factor2 ) + return 0; + + const double product = (double)factor1 * (double)factor2; + return product < 0xfffffffffffffff0 + ? factor1 * factor2 / divisor + : (u64) trunc( product / divisor ); + + #endif +} + +//----------------------------------------------------------------------------- + +s64 MulDivS64 ( s64 factor1, s64 factor2, s64 divisor ) +{ + bool neg = false; + if ( factor1 < 0 ) { factor1 = -factor1; neg = !neg; } + if ( factor2 < 0 ) { factor2 = -factor2; neg = !neg; } + if ( divisor < 0 ) { divisor = -divisor; neg = !neg; } + s64 r = MulDivU64(factor1,factor2,divisor); + return neg ? -r : r; +} + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + ccp PrintNiceID4 ( uint id ) { if (!id) diff --git a/project/dclib/dclib-numeric.h b/project/dclib/dclib-numeric.h index 5ab36ef..8cca5a9 100644 --- a/project/dclib/dclib-numeric.h +++ b/project/dclib/dclib-numeric.h @@ -819,6 +819,11 @@ static inline s64 double2int64 ( double d ) { return (s64) trunc (d+0.5); } /////////////////////////////////////////////////////////////////////////////// +u64 MulDivU64 ( u64 factor1, u64 factor2, u64 divisor ); +s64 MulDivS64 ( s64 factor1, s64 factor2, s64 divisor ); + +/////////////////////////////////////////////////////////////////////////////// + // all values are multiple of 26*26*100 = 67600 = 0x00010810 #define GOOD_MAX_NICE4_5 67600 // 1 * 67600 #define GOOD_MAX_NICE4_6 946400 // 14 * 67600 diff --git a/project/dclib/dclib-parser.c b/project/dclib/dclib-parser.c new file mode 100644 index 0000000..2391cbc --- /dev/null +++ b/project/dclib/dclib-parser.c @@ -0,0 +1,150 @@ + +/*************************************************************************** + * * + * _____ ____ * + * | __ \ / __ \ _ _ _____ * + * | | \ \ / / \_\ | | | | _ \ * + * | | \ \| | | | | | |_| | * + * | | | || | | | | | ___/ * + * | | / /| | __ | | | | _ \ * + * | |__/ / \ \__/ / | |___| | |_| | * + * |_____/ \____/ |_____|_|_____/ * + * * + * Wiimms source code library * + * * + *************************************************************************** + * * + * Copyright (c) 2012-2022 by Dirk Clemens <wiimm@wiimm.de> * + * * + *************************************************************************** + * * + * This library is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * See file gpl-2.0.txt or http://www.gnu.org/licenses/gpl-2.0.txt * + * * + ***************************************************************************/ + +#define _GNU_SOURCE 1 + +#include "dclib-basics.h" +#include "dclib-parser.h" + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// ScanText_t /////////////// +/////////////////////////////////////////////////////////////////////////////// + +void SetupScanText ( ScanText_t *st, cvp data, uint data_size ) +{ + DASSERT(st); + memset(st,0,sizeof(*st)); + st->data = data; + st->data_size = data_size; + st->ignore_comments = true; + + RewindScanText(st); +} + +/////////////////////////////////////////////////////////////////////////////// + +void ResetScanText ( ScanText_t *st ) +{ + if (st) + { + if (st->fname_alloced) + FreeString(st->fname); + memset(st,0,sizeof(*st)); + } +} + +/////////////////////////////////////////////////////////////////////////////// + +void SetFilenameScanText( ScanText_t *st, ccp fname, CopyMode_t cm ) +{ + DASSERT(st); + if (st->fname_alloced) + FreeString(st->fname); + st->fname = CopyString(fname,cm,&st->fname_alloced); +} + +/////////////////////////////////////////////////////////////////////////////// + +void RewindScanText ( ScanText_t *st ) +{ + DASSERT(st); + + st->ptr = st->data; + st->eot = st->data + st->data_size; + st->line = st->data; + st->eol = st->data; + + st->is_eot = !st->ptr || st->ptr >= st->eot; + st->is_section = false; + st->is_term = st->is_eot; +} + +/////////////////////////////////////////////////////////////////////////////// + +bool NextLineScanText ( ScanText_t *st ) +{ + DASSERT(st); + st->is_section = false; + + ccp ptr = st->ptr; + ccp eot = st->eot; + if ( !ptr || ptr >= eot ) + { + st->line = st->eol = ptr; + st->is_eot = st->is_term = true; + return false; + } + + while ( ptr < eot ) + { + // skip leading spaced and controls + while ( ptr < eot && (uchar)*ptr <= ' ' ) + ptr++; + + ccp line = ptr; + while ( ptr < eot && *ptr && *ptr != '\r' && *ptr != '\n' ) + ptr++; + ccp eol = ptr; + while ( eol > line && eol[-1] == ' ' || eol[-1] == '\t' ) + eol--; + + if ( line == eol || *line == '#' && st->ignore_comments ) + continue; + if ( st->detect_sections > 0 + && *line == '[' + && eol[-1] == ']' + && !memchr(line+1,'[',eol-line-2) + && !memchr(line+1,']',eol-line-2) + ) + { + st->is_section = true; + } + + st->line = line; + st->eol = eol; + break; + } + + st->ptr = ptr; + st->is_eot = ptr >= eot; + st->is_term = st->is_eot || st->is_section; + return !st->is_term; +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// END /////////////// +/////////////////////////////////////////////////////////////////////////////// + diff --git a/project/dclib/dclib-parser.h b/project/dclib/dclib-parser.h new file mode 100644 index 0000000..b7fa301 --- /dev/null +++ b/project/dclib/dclib-parser.h @@ -0,0 +1,89 @@ + +/*************************************************************************** + * * + * _____ ____ * + * | __ \ / __ \ _ _ _____ * + * | | \ \ / / \_\ | | | | _ \ * + * | | \ \| | | | | | |_| | * + * | | | || | | | | | ___/ * + * | | / /| | __ | | | | _ \ * + * | |__/ / \ \__/ / | |___| | |_| | * + * |_____/ \____/ |_____|_|_____/ * + * * + * Wiimms source code library * + * * + *************************************************************************** + * * + * Copyright (c) 2012-2022 by Dirk Clemens <wiimm@wiimm.de> * + * * + *************************************************************************** + * * + * This library is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * See file gpl-2.0.txt or http://www.gnu.org/licenses/gpl-2.0.txt * + * * + ***************************************************************************/ + +#ifndef DCLIB_PARSER_H +#define DCLIB_PARSER_H 1 + +#include "dclib-types.h" + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// ScanText_t /////////////// +/////////////////////////////////////////////////////////////////////////////// +// [[ScanText_t]] + +typedef struct ScanText_t +{ + //-- base data + + ccp data; // begin of text + uint data_size; // total size of text + + ccp fname; // NULL or filename for messages + bool fname_alloced; // true: call FreeString(fname) + + //-- options + + bool ignore_comments; // true: ignore lines with leading '#' + int detect_sections; // >0: detect lines of format '[...]' + + //-- current statee + + ccp ptr; // current text position + ccp eot; // end of text + ccp line; // current line + ccp eol; // end of current line + + bool is_eot; // end of text reached + bool is_section; // new section reached + bool is_term; // := is_eot || is_section +} +ScanText_t; + +/////////////////////////////////////////////////////////////////////////////// + +void SetupScanText ( ScanText_t *st, cvp data, uint data_size ); +void ResetScanText ( ScanText_t *st ); +void SetFilenameScanText( ScanText_t *st, ccp fname, CopyMode_t cm ); + +void RewindScanText ( ScanText_t *st ); +bool NextLineScanText ( ScanText_t *st ); + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// E N D /////////////// +/////////////////////////////////////////////////////////////////////////////// + +#endif // DCLIB_PARSER_H + diff --git a/project/dclib/dclib-regex.c b/project/dclib/dclib-regex.c index f879566..3ee51bf 100644 --- a/project/dclib/dclib-regex.c +++ b/project/dclib/dclib-regex.c @@ -340,6 +340,7 @@ int ReplaceRegex return -ERR_INVALID_DATA; ClearFastBuf(res); + res->buf[0] = 0; if ( !re || !re->valid ) return -ERR_INVALID_DATA; diff --git a/project/dclib/dclib-tables.c b/project/dclib/dclib-tables.c index 629e805..310e9a2 100644 --- a/project/dclib/dclib-tables.c +++ b/project/dclib/dclib-tables.c @@ -442,6 +442,9 @@ const sizeof_info_t sizeof_info_linux[] = SIZEOF_INFO_ENTRY(int) SIZEOF_INFO_ENTRY(long) SIZEOF_INFO_ENTRY(long long) + #ifdef __SIZEOF_INT128__ + SIZEOF_INFO_ENTRY(__int128_t) + #endif SIZEOF_INFO_ENTRY(float) SIZEOF_INFO_ENTRY(double) SIZEOF_INFO_ENTRY(long double) @@ -471,6 +474,10 @@ const sizeof_info_t sizeof_info_dclib[] = SIZEOF_INFO_ENTRY(u16) SIZEOF_INFO_ENTRY(u32) SIZEOF_INFO_ENTRY(u64) + #if HAVE_INT128 + SIZEOF_INFO_ENTRY(u128) + #endif + SIZEOF_INFO_ENTRY(intx_t) SIZEOF_INFO_ENTRY(mem_t) SIZEOF_INFO_ENTRY(exmem_t) @@ -497,6 +504,7 @@ const sizeof_info_t sizeof_info_dclib[] = SIZEOF_INFO_ENTRY(Escape_t) SIZEOF_INFO_TITLE("dcLib buffers") + SIZEOF_INFO_ENTRY(exmem_dest_t) SIZEOF_INFO_ENTRY(sha1_hash_t) SIZEOF_INFO_ENTRY(sha1_hex_t) SIZEOF_INFO_ENTRY(sha1_id_t) @@ -509,6 +517,7 @@ const sizeof_info_t sizeof_info_dclib[] = SIZEOF_INFO_ENTRY(GrowBuffer_t) SIZEOF_INFO_TITLE("dcLib lists") + SIZEOF_INFO_ENTRY(mem_src_t) SIZEOF_INFO_ENTRY(mem_list_t) SIZEOF_INFO_ENTRY(exmem_key_t) SIZEOF_INFO_ENTRY(exmem_list_t) @@ -546,6 +555,7 @@ const sizeof_info_t sizeof_info_dclib[] = #endif SIZEOF_INFO_ENTRY(search_file_t) SIZEOF_INFO_ENTRY(search_file_list_t) + SIZEOF_INFO_ENTRY(search_paths_stat_t) SIZEOF_INFO_ENTRY(CatchOutput_t) SIZEOF_INFO_ENTRY(SectionInfo_t) SIZEOF_INFO_ENTRY(stat_file_count_t) diff --git a/project/dclib/dclib-types.h b/project/dclib/dclib-types.h index 7818bc0..1cea28e 100644 --- a/project/dclib/dclib-types.h +++ b/project/dclib/dclib-types.h @@ -362,6 +362,47 @@ typedef float float32; // float as 32 bit binary data, endian is file dependent #define S64_MAX INT64_MAX /////////////////////////////////////////////////////////////////////////////// +// int128 support + +#undef HAVE_INT128 +#ifdef __SIZEOF_INT128__ + + #define HAVE_INT128 1 + + typedef __int128_t s128; + typedef __uint128_t u128; + +#else + + #define HAVE_INT128 0 + +#endif + +/////////////////////////////////////////////////////////////////////////////// +// [[intx_t]] + +typedef union intx_t +{ + s8 s8[16]; + u8 u8[16]; + + s16 s16[8]; + u16 u16[8]; + + s32 s32[4]; + u32 u32[4]; + + s64 s64[2]; + u64 u64[2]; + + #if HAVE_INT128 + s128 s128[1]; + u128 u128[1]; + #endif +} +intx_t; + +/////////////////////////////////////////////////////////////////////////////// #ifndef DCLIB_BASIC_TYPES #define DCLIB_BASIC_TYPES 1 diff --git a/project/dclib/dclib-utf8.h b/project/dclib/dclib-utf8.h index c4d9380..5236a4e 100644 --- a/project/dclib/dclib-utf8.h +++ b/project/dclib/dclib-utf8.h @@ -41,6 +41,7 @@ /////////////////////////////////////////////////////////////////////////////// ///// this software is taken from dcLib2 and now publiced under GPL2. ///// /////////////////////////////////////////////////////////////////////////////// +// [[dcUnicodeConsts]] typedef enum dcUnicodeConsts { @@ -54,6 +55,7 @@ typedef enum dcUnicodeConsts } dcUnicodeConsts; /////////////////////////////////////////////////////////////////////////////// +// [[dcUTF8Mode]] typedef enum dcUTF8Mode { diff --git a/project/dclib/dclib-vector.c b/project/dclib/dclib-vector.c index af18888..378fa82 100644 --- a/project/dclib/dclib-vector.c +++ b/project/dclib/dclib-vector.c @@ -1059,9 +1059,9 @@ u64 N_MatrixD_inverse = 0; // total number of inverse transformations void InitializeMatrixD ( MatrixD_t * mat ) { DASSERT(mat); - const uint seqnum = mat->valid ? mat->sequence_number : 0; +// const uint seqnum = mat->valid ? mat->sequence_number : 0; memset(mat,0,sizeof(*mat)); - mat->sequence_number = seqnum; +// mat->sequence_number = seqnum; mat->scale.x = mat->scale.y = mat->scale.z = 1.0; mat->scale_origin.x = mat->scale_origin.y = mat->scale_origin.z = 0.0; diff --git a/project/dclib/lib-bmg.c b/project/dclib/lib-bmg.c index 0540243..9b7f5fd 100644 --- a/project/dclib/lib-bmg.c +++ b/project/dclib/lib-bmg.c @@ -3664,10 +3664,38 @@ enumError SaveRawBMG SetFileAttrib(&F.fatt,&bmg->fatt,0); if ( fwrite(bmg->raw_data,1,bmg->raw_data_size,F.f) != bmg->raw_data_size ) - FILEERROR1(&F,ERR_WRITE_FAILED,"Write failed: %s\n",fname); + err = FILEERROR1(&F,ERR_WRITE_FAILED,"Write failed: %s\n",fname); return ResetFile(&F,set_time); } +/////////////////////////////////////////////////////////////////////////////// + +enumError SaveRawFileBMG +( + bmg_t * bmg, // pointer to valid bmg + FILE * f, // valid output file + ccp fname // NULL or filename for error messages +) +{ + DASSERT(bmg); + + + //--- create raw data + + enumError err = CreateRawBMG(bmg); + if (err) + return err; + DASSERT(bmg->raw_data); + DASSERT(bmg->raw_data_size); + + + //--- write to file + + if ( fwrite(bmg->raw_data,1,bmg->raw_data_size,f) != bmg->raw_data_size ) + err = ERROR1(ERR_WRITE_FAILED,"Write failed: %s\n",fname?fname:"?"); + return err; +} + // /////////////////////////////////////////////////////////////////////////////// /////////////// SaveTextBMG() /////////////// @@ -3741,15 +3769,16 @@ char * PrintAttribBMG /////////////////////////////////////////////////////////////////////////////// static void print_message - ( File_t *F, bmg_t *bmg, const bmg_item_t *bi, ccp mid_name ) + ( FILE *f, bmg_t *bmg, const bmg_item_t *bi, ccp mid_name ) { + DASSERT(f); DASSERT(bmg); DASSERT(bi); if ( bmg->active_cond != bi->cond ) { bmg->active_cond = bi->cond; - fprintf(F->f,"@? %x\n",bmg->active_cond); + fprintf(f,"@? %x\n",bmg->active_cond); } ccp slot; @@ -3779,14 +3808,14 @@ static void print_message if ( bmg->attrib_used == 4 ) { // classic, compatible with all versions - fprintf(F->f,"%s\t~%s 0x%08x\r\n",mid_name,slot,be32(bi->attrib)); + fprintf(f,"%s\t~%s 0x%08x\r\n",mid_name,slot,be32(bi->attrib)); } else { // use new attrib vector PrintAttribBMG( attrib, sizeof(attrib), bi->attrib, bi->attrib_used, bmg->attrib, true ); - fprintf(F->f,"%s\t~%s %s\r\n",mid_name,slot,attrib); + fprintf(f,"%s\t~%s %s\r\n",mid_name,slot,attrib); } } @@ -3806,10 +3835,10 @@ static void print_message snprintf(attrib,sizeof(attrib),"%s\t",mid_name); if ( bi->text == bmg_null_entry ) - fprintf(F->f,"%s/\r\n",attrib); + fprintf(f,"%s/\r\n",attrib); else if ( bi->text ) { - fputs(attrib,F->f); + fputs(attrib,f); const int use_colors = opt_bmg_colors != 1 ? opt_bmg_colors : bmg->use_color_names > 0; @@ -3870,7 +3899,7 @@ static void print_message if ( good_break && good_break < end - 8 ) ptr = good_break; - fprintf(F->f,"%s %.*s\r\n", sep, (int)(ptr-start), start ); + fprintf(f,"%s %.*s\r\n", sep, (int)(ptr-start), start ); sep = "\t+"; } while ( ptr < end ); @@ -3885,17 +3914,47 @@ enumError SaveTextBMG ccp fname, // filename of destination FileMode_t fmode, // create-file mode bool set_time, // true: set time stamps - bool force_numeric, // true: force numric MIDs + bool force_numeric, // true: force numeric MIDs uint brief_count // >0: suppress syntax info // >1: suppress all comments // >2: suppress '#BMG' magic ) { - // use DOS/Windows line format -> unix can handle it ;) - DASSERT(bmg); DASSERT(fname); PRINT("SaveTextBMG(%s,%d)\n",fname,set_time); + + //--- open file + + File_t F; + enumError err = CreateFile(&F,true,fname,fmode); + if ( err > ERR_WARNING || !F.f ) + return err; + SetFileAttrib(&F.fatt,&bmg->fatt,0); + + err = SaveTextFileBMG(bmg,F.f,fname,force_numeric,brief_count); + + ResetFile(&F,set_time); + return err; +} + +// +/////////////////////////////////////////////////////////////////////////////// + +enumError SaveTextFileBMG +( + bmg_t * bmg, // pointer to valid bmg + FILE * f, // valid output file + ccp fname, // NULL or filename for error messages + bool force_numeric, // true: force numeric MIDs + uint brief_count // >0: suppress syntax info + // >1: suppress all comments + // >2: suppress '#BMG' magic +) +{ + // use DOS/Windows line format -> unix can handle it ;) + + DASSERT(bmg); bmg->active_cond = 0; enum { BRIEF_ALL, BRIEF_NO_SYNTAX, BRIEF_NO_COMMENT, BRIEF_NO_MAGIC }; @@ -3970,19 +4029,11 @@ enumError SaveTextBMG }; - //--- open file - - File_t F; - enumError err = CreateFile(&F,true,fname,fmode); - if ( err > ERR_WARNING || !F.f ) - return err; - SetFileAttrib(&F.fatt,&bmg->fatt,0); - const bool print_full = brief_count == BRIEF_ALL && !opt_bmg_export; if (print_full) - fwrite(text_head,1,sizeof(text_head)-1,F.f); + fwrite(text_head,1,sizeof(text_head)-1,f); else if ( brief_count < BRIEF_NO_MAGIC ) - fprintf(F.f,"%s\r\n\r\n",BMG_TEXT_MAGIC); + fprintf(f,"%s\r\n\r\n",BMG_TEXT_MAGIC); HavePredifinedSlots(bmg); bmg->legacy = bmg->legacy != 0; @@ -4006,7 +4057,7 @@ enumError SaveTextBMG PrintAttribBMG(abuf,sizeof(abuf),bmg->attrib,bmg->attrib_used,0,true); if (print_full) { - fprintf(F.f,text_param, + fprintf(f,text_param, param_announce, endian->is_le, bmg->legacy, encoding, bmg->have_mid, bmg->inf_size, abuf, @@ -4014,7 +4065,7 @@ enumError SaveTextBMG param_announce = ""; } else if ( brief_count < BRIEF_NO_MAGIC ) - fprintf(F.f,"@ENDIAN = %u\r\n" + fprintf(f,"@ENDIAN = %u\r\n" "@LEGACY = %u\r\n" "@ENCODING = %u\r\n" "@BMG-MID = %u\r\n" @@ -4035,12 +4086,12 @@ enumError SaveTextBMG ) { if (print_full) - fprintf(F.f,unknown_param, + fprintf(f,unknown_param, param_announce, bmg->unknown_inf_0c, bmg->unknown_mid_0a, bmg->unknown_mid_0c ); else if ( brief_count < BRIEF_NO_MAGIC ) - fprintf(F.f,"@UNKNOWN-INF32-0C = %#x\r\n" + fprintf(f,"@UNKNOWN-INF32-0C = %#x\r\n" "@UNKNOWN-MID16-0A = %#x\r\n" "@UNKNOWN-MID32-0C = %#x\r\n" "\r\n", @@ -4087,14 +4138,14 @@ enumError SaveTextBMG if (!last_cup) { intro = intro_other; - fprintf(F.f,"\r\n#--- standard track names\r\n\r\n"); + fprintf(f,"\r\n#--- standard track names\r\n\r\n"); } else - fputs("\r\n",F.f); + fputs("\r\n",f); last_cup = cup; } snprintf(mid_name,sizeof(mid_name), " T%c%c", cup, idx % 4 + '1' ); - print_message(&F,bmg,bi1,mid_name); + print_message(f,bmg,bi1,mid_name); already_printed[ bi1->mid - MID__VIP_BEG ] = true; already_printed[ bi2->mid - MID__VIP_BEG ] = true; @@ -4137,14 +4188,14 @@ enumError SaveTextBMG if (!last_cup) { intro = intro_other; - fprintf(F.f,"\r\n#--- battle track names\r\n\r\n"); + fprintf(f,"\r\n#--- battle track names\r\n\r\n"); } else - fputs("\r\n",F.f); + fputs("\r\n",f); last_cup = cup; } snprintf(mid_name,sizeof(mid_name), " U%c%c", cup, idx % 5 + '1' ); - print_message(&F,bmg,bi1,mid_name); + print_message(f,bmg,bi1,mid_name); already_printed[ bi1->mid - MID__VIP_BEG ] = true; already_printed[ bi2->mid - MID__VIP_BEG ] = true; @@ -4175,14 +4226,14 @@ enumError SaveTextBMG if ( brief_count < BRIEF_NO_COMMENT ) { intro = intro_other; - fprintf(F.f,"\r\n#--- online chat\r\n\r\n"); + fprintf(f,"\r\n#--- online chat\r\n\r\n"); } for ( ; bi1 < bi1end; bi1++ ) { DASSERT( bi1->mid >= MID_CHAT_BEG && bi1->mid <= MID_CHAT_END ); snprintf(mid_name,sizeof(mid_name)," M%02u",bi1->mid-MID_CHAT_BEG+1); - print_message(&F,bmg,bi1,mid_name); + print_message(f,bmg,bi1,mid_name); already_printed[bi1->mid-MID__VIP_BEG] = true; } } @@ -4282,22 +4333,22 @@ enumError SaveTextBMG while ( sep->mid && mid >= sep->mid ) sep++; if ( sep > sep_tab+1 && sep[-2].mid == mid && sep[-2].info ) - fprintf(F.f,"\r\n#--- [%x] %s\r\n", mid, sep[-2].info ); + fprintf(f,"\r\n#--- [%x] %s\r\n", mid, sep[-2].info ); else if ( sep[-1].info ) - fprintf(F.f,"\r\n#--- [%x:%x] %s\r\n", + fprintf(f,"\r\n#--- [%x:%x] %s\r\n", sep[-1].mid, sep->mid-1, sep[-1].info ); else - fputs("\r\n",F.f); + fputs("\r\n",f); intro = 0; } if ( brief_count < BRIEF_NO_COMMENT && intro ) { - fputs(intro,F.f); + fputs(intro,f); intro = 0; } snprintf(mid_name,sizeof(mid_name),"%6x",bi->mid); - print_message(&F,bmg,bi,mid_name); + print_message(f,bmg,bi,mid_name); } } @@ -4309,7 +4360,7 @@ enumError SaveTextBMG XDump_t xd; InitializeXDump(&xd); SetupXDump(&xd,XDUMPC_DUMP); - xd.f = F.f; + xd.f = f; xd.indent = 1; xd.prefix = "@X"; xd.eol = "\r\n"; @@ -4326,7 +4377,7 @@ enumError SaveTextBMG raw->total_size, raw->total_size ); char name[20]; - fprintf(F.f,"\r\n#\f\r\n#--------------------------------------" + fprintf(f,"\r\n#\f\r\n#--------------------------------------" "----------------------------------------\r\n\r\n" "@SECTION \"%s\"\r\n\r\n", PrintEscapedString( name, sizeof(name), @@ -4343,8 +4394,7 @@ enumError SaveTextBMG //--- terminate if ( brief_count < 2 ) - fputs("\r\n",F.f); - ResetFile(&F,set_time); + fputs("\r\n",f); return ERR_OK; } diff --git a/project/dclib/lib-bmg.h b/project/dclib/lib-bmg.h index 98d3d9e..636f681 100644 --- a/project/dclib/lib-bmg.h +++ b/project/dclib/lib-bmg.h @@ -88,6 +88,9 @@ enum MID_BCUP_BEG = 0x2489, MID_BCUP_END = MID_BCUP_BEG + BMG_N_BCUP, + BMG_RCUP_TRACKS = 4, + BMG_BCUP_TRACKS = 5, + MID_ENGINE_BEG = 0x0589, MID_ENGINE_END = MID_ENGINE_BEG + 4, @@ -898,13 +901,31 @@ enumError SaveRawBMG bool set_time // true: set time stamps ); +enumError SaveRawFileBMG +( + bmg_t * bmg, // pointer to valid bmg + FILE * f, // valid output file + ccp fname // NULL or filename for error messages +); + enumError SaveTextBMG ( bmg_t * bmg, // pointer to valid bmg ccp fname, // filename of destination FileMode_t fmode, // create-file mode bool set_time, // true: set time stamps - bool force_numeric, // true: force numric MIDs + bool force_numeric, // true: force numeric MIDs + uint brief_count // >0: suppress syntax info + // >1: suppress all comments + // >2: suppress '#BMG' magic +); + +enumError SaveTextFileBMG +( + bmg_t * bmg, // pointer to valid bmg + FILE * f, // valid output file + ccp fname, // NULL or filename for error messages + bool force_numeric, // true: force numeric MIDs uint brief_count // >0: suppress syntax info // >1: suppress all comments // >2: suppress '#BMG' magic diff --git a/project/dclib/lib-mkw-def.c b/project/dclib/lib-mkw-def.c index dbd0e5d..911262e 100644 --- a/project/dclib/lib-mkw-def.c +++ b/project/dclib/lib-mkw-def.c @@ -9,7 +9,7 @@ * | |__/ / \ \__/ / | |___| | |_| | * * |_____/ \____/ |_____|_|_____/ * * * - * A php library by Dirk Clemens * + * A library by Dirk Clemens * * * * Copyright (c) 2014-2022 by Dirk Clemens <develop@cle-mens.de> * * * diff --git a/project/dclib/lib-mkw-def.h b/project/dclib/lib-mkw-def.h index 82c73c4..1f44c4e 100644 --- a/project/dclib/lib-mkw-def.h +++ b/project/dclib/lib-mkw-def.h @@ -9,7 +9,7 @@ * | |__/ / \ \__/ / | |___| | |_| | * * |_____/ \____/ |_____|_|_____/ * * * - * A php library by Dirk Clemens * + * A library by Dirk Clemens * * * * Copyright (c) 2014-2022 by Dirk Clemens <develop@cle-mens.de> * * * @@ -65,6 +65,13 @@ MkwTrackCategory_t * GetMkwTrackCategory ( int id ); // /////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////// misc ////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +#define MKW_MAX_TRACK_SLOT 4095 + +// +/////////////////////////////////////////////////////////////////////////////// ////////////////////////////////// sizeof ///////////////////////////////// /////////////////////////////////////////////////////////////////////////////// diff --git a/project/dclib/lib-mkw.h b/project/dclib/lib-mkw.h index f0df9b5..8a19dbb 100644 --- a/project/dclib/lib-mkw.h +++ b/project/dclib/lib-mkw.h @@ -89,6 +89,17 @@ enum mkw_consts_t // some constants MKW_ORIGINAL_BEG = MKW_TRACK_BEG, MKW_ORIGINAL_END = MKW_ARENA_END, + //--- LE-CODE random tracks + + MKW_N_LE_RANDOM = 0x04, + MKW_LE_RANDOM_BEG = 0x3e, + MKW_LE_RANDOM_END = MKW_LE_RANDOM_BEG + MKW_N_LE_RANDOM, + + //--- LE-CODE extended slots + + MKW_LE_SLOT_BEG = 0x44, + MKW_LE_SLOT_END = 0x1000, + MKW_N_LE_SLOT = MKW_LE_SLOT_END - MKW_LE_SLOT_BEG, //--- music ids @@ -111,6 +122,14 @@ static inline bool IsMkwOriginal ( uint tid ) static inline bool IsMkwCustom ( uint tid ) { return tid >= MKW_ARENA_END; } +static inline bool IsLecodeRandom ( uint tid ) + { return tid >= MKW_LE_RANDOM_BEG && tid < MKW_LE_RANDOM_END; } + +static inline bool IsValidLecodeSlot ( uint tid ) + { return tid < MKW_ARENA_END + || tid >= MKW_LE_SLOT_BEG && tid < MKW_LE_SLOT_END + || tid >= MKW_LE_RANDOM_BEG && tid < MKW_LE_RANDOM_END; } + // /////////////////////////////////////////////////////////////////////////////// /////////////// 24p support /////////////// diff --git a/project/makefiles-local/Makefile.local.mac b/project/makefiles-local/Makefile.local.mac index fb313a2..fab8dc0 100644 --- a/project/makefiles-local/Makefile.local.mac +++ b/project/makefiles-local/Makefile.local.mac @@ -6,10 +6,10 @@ CFLAGS += -Wno-gnu-variable-sized-type-not-at-end -Wno-address-of-packed-member #----------------------------------------------------------------------------- .PHONY : mac-distrib -mac-distrib: mac1 doc $(INSTALL_SCRIPTS) gen-mac-distrib +mac-distrib: mac1x doc $(INSTALL_SCRIPTS) gen-mac-distrib -.PHONY : mac1 -mac1: mac-x86_64 +.PHONY : mac1x +mac1x: mac-x86_64 @echo @echo "----- building universal binaries -----" @@ -21,30 +21,30 @@ mac1: mac-x86_64 @rm -rf bin/x86_64 @echo "done" -.PHONY : mac2 -mac2: mac-i386 mac-x86_64 +.PHONY : mac1 +mac1: mac-arm @echo @echo "----- building universal binaries -----" @for i in $(MAIN_TOOLS); do \ - lipo -create bin/i386/$${i} bin/x86_64/$${i} -output $${i}; \ + lipo -create bin/arm/$${i} -output $${i}; \ cp -p $${i} bin/$${i}; \ done - @rm -rf bin/i386 bin/x86_64 + @rm -rf bin/arm @echo "done" -.PHONY : mac3 -mac3: mac-i386 mac-x86_64 mac-ppc +.PHONY : mac2 +mac2: mac-x86_64 mac-arm @echo @echo "----- building universal binaries -----" @for i in $(MAIN_TOOLS); do \ - lipo -create bin/ppc/$${i} bin/i386/$${i} bin/x86_64/$${i} -output $${i}; \ + lipo -create bin/x86_64/$${i} bin/arm/$${i} -output $${i}; \ cp -p $${i} bin/$${i}; \ - done; - @rm -rf bin/ppc bin/i386 bin/x86_64 + done + @rm -rf bin/x86_64 bin/arm @echo "done" #----------------------------------------------------------------------------- @@ -74,12 +74,24 @@ mac-i386: mac-x86_64: @echo @echo "----- building X86-64 [SDK $(SDKVERSION)] -----" - @XFLAGS="-arch x86_64 -mfpmath=sse" make clean all +# @XFLAGS="-arch x86_64 -mfpmath=sse" make clean all + @XFLAGS="-target x86_64-apple-macos10.12" make clean all @mkdir -p bin/x86_64 @mv $(MAIN_TOOLS) bin/x86_64 #----------------------------------------------------------------------------- +.PHONY : mac-arm +mac-arm: + @echo + @echo "----- building arm [SDK $(SDKVERSION)] -----" +# @XFLAGS="-arch arm -mfpmath=sse" make clean all + @XFLAGS="-target arm64-apple-macos11" make clean all + @mkdir -p bin/arm + @mv $(MAIN_TOOLS) bin/arm + +#----------------------------------------------------------------------------- + .PHONY : gen-mac-distrib gen-mac-distrib: diff --git a/project/revision.sh b/project/revision.sh index 3a1457a..59a8b6f 100644 --- a/project/revision.sh +++ b/project/revision.sh @@ -1 +1 @@ -revision=8534 +revision=8612 diff --git a/project/src/db-mkw.c b/project/src/db-mkw.c index 6fd6b9c..c4b2a6b 100644 --- a/project/src/db-mkw.c +++ b/project/src/db-mkw.c @@ -58,7 +58,11 @@ const TrackInfo_t track_info[32] = "Marios Piste", "castle_course", "n_Circuit32_n", - "n_Circuit32_f" + "n_Circuit32_f", + {{0x77,0x52,0xbb,0x51,0xed,0xbc,0x4a,0x95,0x37,0x7c,0x0a,0x05,0xb0,0xe0,0xda,0x15,0x03,0x78,0x66,0x25,0x00,0x3d,0x29,0xa0}, + {0xdb,0x34,0xc4,0xde,0xdd,0x6a,0xa7,0x5c,0xba,0x1d,0x15,0x8e,0xdc,0x1e,0xf4,0x62,0x4e,0xba,0x57,0x55,0x00,0x3d,0x29,0xa0}, + {0x40,0x38,0x84,0xfe,0x53,0xac,0xe0,0xb8,0x7f,0x87,0xb6,0xd2,0x93,0xb5,0x7c,0x25,0xbb,0x7b,0x91,0x18,0x00,0x2f,0xa0,0x20}, + {0x9e,0xb3,0x7e,0xcb,0x09,0x22,0x99,0xa3,0xbb,0xe7,0xfa,0x93,0x3f,0xa5,0x44,0x9b,0x3e,0xaa,0x97,0x0b,0x00,0x2f,0xa0,0x20}} }, { 0x2491, 1, 1, 12, 0x77, // bmg, track, index, slot, music_id @@ -67,7 +71,11 @@ const TrackInfo_t track_info[32] = "Kuhmuh-Weide", "farm_course", "n_Farm_n", - "n_Farm_F" + "n_Farm_F", + {{0x90,0x72,0x0a,0x7d,0x57,0xa7,0xc7,0x6e,0x23,0x47,0x78,0x2f,0x6b,0xde,0x5d,0x22,0x34,0x2f,0xb7,0xdd,0x00,0x46,0xd7,0x80}, + {0x4a,0x5f,0x65,0xe5,0x9c,0xb3,0xd0,0xcf,0xe8,0x9b,0x3f,0x85,0x97,0x9a,0xc1,0x7c,0xf4,0x09,0xca,0x35,0x00,0x46,0xd7,0x80}, + {0xd7,0x8a,0xa1,0x48,0x7d,0x88,0xf4,0xcd,0x03,0xb7,0xf9,0x60,0xef,0xd2,0xfc,0xcb,0xd9,0x90,0xf9,0xb3,0x00,0x41,0x30,0x00}, + {0x83,0x68,0x8b,0x0d,0xe7,0x3a,0xcd,0xf1,0x1f,0xbb,0x56,0x6b,0x29,0x14,0x8b,0x3b,0x6c,0xa9,0xc4,0x0e,0x00,0x41,0x30,0x00}} }, { 0x2492, 2, 2, 13, 0x79, // bmg, track, index, slot, music_id @@ -76,7 +84,11 @@ const TrackInfo_t track_info[32] = "Pilz-Schlucht", "kinoko_course", "n_Kinoko_n", - "n_Kinoko_F" + "n_Kinoko_F", + {{0x0e,0x38,0x03,0x57,0xaf,0xfc,0xfd,0x87,0x22,0x32,0x99,0x94,0x88,0x56,0x99,0xd9,0x92,0x7f,0x82,0x76,0x00,0x4a,0x92,0xa0}, + {0xc5,0xd4,0xf5,0x06,0x77,0xe7,0x9b,0x5e,0x9c,0xe3,0x89,0x99,0xdb,0xfa,0x2b,0x7e,0xf9,0x85,0xf8,0x10,0x00,0x4a,0x92,0xa0}, + {0x73,0x5e,0x25,0xbc,0x7b,0xaf,0xd2,0x7f,0x50,0x78,0x30,0x4e,0xb4,0xc8,0x70,0xad,0x14,0x5e,0x05,0xee,0x00,0x44,0x6a,0xa0}, + {0x90,0x92,0x5f,0xa2,0x7a,0xe9,0x21,0x31,0x3f,0xbd,0x51,0xa8,0x07,0x0c,0xa4,0xd8,0x70,0xce,0xec,0x82,0x00,0x44,0x6a,0xa0}} }, { 0x2493, 3, 11, 34, 0x8b, // bmg, track, index, slot, music_id @@ -85,7 +97,11 @@ const TrackInfo_t track_info[32] = "Vulkangrollen", "volcano_course", "n_Volcano32_n", - "n_Volcano32_f" + "n_Volcano32_f", + {{0xac,0xc0,0x88,0x3a,0xe0,0xce,0x78,0x79,0xc6,0xef,0xba,0x20,0xcf,0xe5,0xb5,0x90,0x9b,0xf7,0x84,0x1b,0x00,0x52,0xa5,0x00}, + {0x68,0x74,0x28,0xc3,0x02,0x80,0xcd,0x27,0x69,0x08,0xeb,0x4b,0x5c,0xb0,0xfa,0x86,0x3e,0xc2,0x28,0xc9,0x00,0x52,0xa5,0x00}, + {0xb1,0x85,0x76,0x00,0x0f,0x1d,0x80,0xf8,0xf4,0x8f,0x97,0xfe,0xe6,0xce,0x64,0xa6,0x16,0x9d,0x0e,0x34,0x00,0x52,0x8a,0x80}, + {0xcf,0x60,0x84,0xd1,0x69,0xdb,0x3f,0x71,0xc2,0xa3,0x56,0x4d,0x6d,0xfc,0x70,0x56,0xa1,0xc1,0x42,0xd0,0x00,0x52,0x8a,0x80}} }, { 0x2494, 4, 3, 14, 0x7b, // bmg, track, index, slot, music_id @@ -94,7 +110,11 @@ const TrackInfo_t track_info[32] = "Toads Fabrik", "factory_course", "STRM_N_FACTORY_N", - "STRM_N_FACTORY_F" + "STRM_N_FACTORY_F", + {{0x18,0x96,0xae,0xa4,0x96,0x17,0xa5,0x71,0xc6,0x6f,0xf7,0x78,0xd8,0xf2,0xab,0xbe,0x9e,0x5d,0x74,0x79,0x00,0x44,0x03,0x60}, + {0xe1,0x15,0x74,0x8e,0x24,0xe6,0xa9,0x32,0x4e,0x24,0xef,0x93,0x93,0xc6,0x0f,0xcc,0x7e,0xce,0x05,0x84,0x00,0x44,0x03,0x60}, + {0x57,0xdc,0x65,0xa7,0x07,0x72,0x94,0x6d,0xd9,0x48,0xe5,0x31,0x9d,0xe2,0xad,0xc2,0x76,0x28,0x34,0x1b,0x00,0x3e,0x24,0xe0}, + {0x63,0x40,0x99,0x08,0xd6,0xb2,0x75,0x61,0xbe,0x35,0x65,0xc7,0xe5,0xf3,0xd1,0x6b,0xd5,0x72,0x94,0xb8,0x00,0x3e,0x24,0xe0}} }, { 0x2495, 5, 5, 22, 0x7f, // bmg, track, index, slot, music_id @@ -103,7 +123,11 @@ const TrackInfo_t track_info[32] = "Kokos-Promenade", "shopping_course", "n_Shopping32_n", - "n_Shopping32_f" + "n_Shopping32_f", + {{0xe4,0xbf,0x36,0x4c,0xb0,0xc5,0x89,0x99,0x07,0x58,0x5d,0x73,0x16,0x21,0xca,0x93,0x0a,0x4e,0xf8,0x5c,0x00,0x4a,0x5c,0x40}, + {0x0c,0xaa,0x76,0x8f,0xfa,0x35,0x78,0x3b,0xbc,0xb6,0xf7,0xf0,0xdd,0xfa,0xc1,0x36,0xc1,0x5c,0xc0,0x08,0x00,0x4a,0x5c,0x40}, + {0x98,0x5c,0x6f,0x61,0x6b,0x52,0xac,0x72,0x5e,0x19,0x7f,0x2e,0x7b,0xab,0x6a,0x32,0x21,0x2e,0x40,0x43,0x00,0x3c,0x62,0x40}, + {0xde,0x5d,0x3f,0x40,0x94,0x49,0x7a,0x34,0x91,0x98,0xc3,0xde,0xa8,0x2a,0x99,0x27,0x24,0x43,0x3a,0x55,0x00,0x3c,0x62,0x40}} }, { 0x2496, 6, 6, 23, 0x81, // bmg, track, index, slot, music_id @@ -112,7 +136,11 @@ const TrackInfo_t track_info[32] = "DK Skikane", "boardcross_course", "n_Snowboard32_n", - "n_Snowboard32_F" + "n_Snowboard32_F", + {{0xb0,0x2e,0xd7,0x2e,0x00,0xb4,0x00,0x64,0x7b,0xda,0x68,0x45,0xbe,0x38,0x7c,0x47,0xd2,0x51,0xf9,0xd1,0x00,0x36,0x67,0xc0}, + {0x98,0xdd,0x84,0xb1,0x5b,0xc5,0x8c,0xd1,0x39,0xb2,0xd1,0x91,0xe2,0xaa,0xda,0x25,0x65,0x65,0x8e,0x75,0x00,0x36,0x67,0xc0}, + {0}, + {0}} }, { 0x2497, 7, 7, 24, 0x83, // bmg, track, index, slot, music_id @@ -121,7 +149,11 @@ const TrackInfo_t track_info[32] = "Warios Goldmine", "truck_course", "STRM_N_TRUCK_N", - "STRM_N_TRUCK_F" + "STRM_N_TRUCK_F", + {{0xd1,0xa4,0x53,0xb4,0x3d,0x69,0x20,0xa7,0x85,0x65,0xe6,0x5a,0x45,0x97,0xe3,0x53,0xb1,0x77,0xab,0xd0,0x00,0x3b,0x1a,0x60}, + {0xba,0xcb,0xdb,0xa9,0x9d,0x9d,0x64,0xb9,0x9c,0xaf,0x59,0xef,0x8f,0x87,0x39,0x7b,0x75,0xe3,0x30,0x91,0x00,0x3b,0x1a,0x60}, + {0xc6,0xc1,0xef,0x73,0x0a,0x59,0x9b,0xb9,0x2f,0x73,0x08,0xb5,0x3b,0xa3,0x0a,0x9b,0x34,0x30,0x75,0x03,0x00,0x37,0x2f,0xe0}, + {0xa2,0xb6,0x7e,0xe4,0x6d,0x04,0xd9,0xab,0x89,0x7c,0xfa,0x90,0x0d,0x22,0xbb,0x3c,0xf3,0xd8,0xd3,0xbe,0x00,0x37,0x2f,0xe0}} }, { 0x2498, 8, 0, 11, 0x7d, // bmg, track, index, slot, music_id @@ -130,7 +162,11 @@ const TrackInfo_t track_info[32] = "Luigis Piste", "beginner_course", "n_Circuit32_n", - "n_Circuit32_f" + "n_Circuit32_f", + {{0x1a,0xe1,0xa7,0xd8,0x94,0x96,0x0b,0x38,0xe0,0x9e,0x74,0x94,0x37,0x33,0x78,0xd8,0x73,0x05,0xa1,0x63,0x00,0x35,0x92,0xa0}, + {0x9f,0x80,0x70,0xb1,0x7f,0x51,0x4c,0x9f,0x0c,0x08,0x32,0x7b,0xdd,0x4b,0x21,0xb0,0x65,0xbc,0x62,0xbb,0x00,0x35,0x92,0xa0}, + {0x51,0x07,0x6d,0x0b,0x43,0xb7,0x47,0xce,0xb2,0x17,0xcd,0xc8,0x9f,0x91,0x86,0xa5,0xa4,0xc9,0xa0,0xce,0x00,0x30,0x25,0xa0}, + {0x02,0x6e,0x04,0x8e,0x39,0xbd,0x41,0x84,0x2e,0xab,0xcb,0x99,0x7c,0x50,0x2c,0x55,0xd9,0x54,0x4e,0x1b,0x00,0x30,0x25,0xa0}} }, { 0x2499, 9, 8, 31, 0x87, // bmg, track, index, slot, music_id @@ -139,7 +175,11 @@ const TrackInfo_t track_info[32] = "Daisys Piste", "senior_course", "n_Daisy32_n", - "n_Daisy32_f" + "n_Daisy32_f", + {{0x72,0xd0,0x24,0x1c,0x75,0xbe,0x4a,0x5e,0xbd,0x24,0x2b,0x9d,0x8d,0x89,0xb1,0xd6,0xfd,0x56,0xbe,0x8f,0x00,0x4d,0xa5,0xa0}, + {0x8b,0x49,0xdb,0x78,0x58,0x6d,0x00,0x4b,0xa3,0x26,0xeb,0x90,0x7c,0x76,0x11,0x28,0x61,0xc1,0xb4,0x3f,0x00,0x4d,0xa5,0xa0}, + {0x71,0x47,0xc8,0x74,0x88,0x06,0xaa,0xd8,0x8c,0xaa,0x31,0x62,0x9f,0xb6,0x2b,0x6a,0x54,0x34,0xce,0xad,0x00,0x4d,0x62,0xa0}, + {0xda,0x9d,0x63,0xa6,0x29,0xb5,0x8d,0x35,0x04,0x32,0x75,0xbc,0x41,0xb3,0xb9,0x7c,0xb6,0xb2,0xfd,0x12,0x00,0x4d,0x62,0xa0}} }, { 0x249a, 10, 13, 42, 0x8d, // bmg, track, index, slot, music_id @@ -148,7 +188,11 @@ const TrackInfo_t track_info[32] = "Mondblickstraße", "ridgehighway_course", "STRM_N_RIDGEHIGHWAY_N", - "STRM_N_RIDGEHIGHWAY_F" + "STRM_N_RIDGEHIGHWAY_F", + {{0xb1,0x3c,0x51,0x54,0x75,0xd7,0xda,0x20,0x7d,0xfd,0x5b,0xad,0xd8,0x86,0x98,0x61,0x47,0xb9,0x06,0xff,0x00,0x52,0x9d,0xc0}, + {0xa4,0xa7,0x62,0x32,0x33,0x95,0x9c,0x03,0x64,0x59,0x52,0xad,0xc8,0xf2,0xb4,0x6b,0xb1,0x63,0xb8,0xd3,0x00,0x52,0x9d,0xc0}, + {0xbc,0xad,0xf9,0x55,0x4d,0x35,0xe2,0xc9,0xdb,0xd3,0xc6,0x7d,0x66,0xac,0xa9,0x53,0xcb,0x80,0x98,0x6c,0x00,0x53,0x78,0x40}, + {0x4f,0x06,0x59,0x55,0x63,0x04,0xde,0xe7,0x8c,0x30,0x0e,0xa7,0xae,0x73,0xd9,0xa8,0x82,0x30,0xab,0xfb,0x00,0x53,0x78,0x40}} }, { 0x249b, 11, 10, 33, 0x8f, // bmg, track, index, slot, music_id @@ -157,7 +201,11 @@ const TrackInfo_t track_info[32] = "Blätterwald", "treehouse_course", "n_maple_n", - "n_maple_F" + "n_maple_F", + {{0x48,0xeb,0xd9,0xd6,0x44,0x13,0xc2,0xb9,0x8d,0x2b,0x92,0xe5,0xef,0xc9,0xb1,0x5e,0xcd,0x76,0xfe,0xe6,0x00,0x47,0x0a,0x60}, + {0x64,0xb6,0x9e,0x0f,0x2c,0x7d,0xef,0xed,0x9f,0xb2,0xda,0x44,0x2c,0xa5,0xe5,0x6d,0xc9,0x5f,0x9b,0xbd,0x00,0x47,0x0a,0x60}, + {0}, + {0}} }, { 0x249c, 12, 14, 43, 0x91, // bmg, track, index, slot, music_id @@ -166,7 +214,11 @@ const TrackInfo_t track_info[32] = "Bowsers Festung", "koopa_course", "STRM_N_KOOPA_N", - "STRM_N_KOOPA_F" + "STRM_N_KOOPA_F", + {{0xb9,0x82,0x1b,0x14,0xa8,0x93,0x81,0xf9,0xc0,0x15,0x66,0x93,0x53,0xcb,0x24,0xd7,0xdb,0x1b,0xb2,0x5d,0x00,0x4c,0xcb,0x60}, + {0xfe,0x97,0x46,0x95,0x14,0x1f,0x58,0xcf,0x97,0xc4,0x13,0x42,0xe9,0x77,0xcc,0x29,0x41,0x18,0x23,0x38,0x00,0x4c,0xcb,0x60}, + {0x6c,0xe3,0xaa,0x4c,0x8f,0x08,0x30,0x22,0x0f,0x34,0x60,0x22,0x2c,0xfd,0x14,0x3b,0xfe,0xfb,0xb0,0xe3,0x00,0x49,0xf9,0x00}, + {0x6c,0x93,0x2f,0x9c,0x5a,0x3f,0xf3,0xe0,0xf7,0x11,0x0b,0x4c,0x7d,0x30,0x55,0x77,0x77,0xda,0xb8,0xa8,0x00,0x49,0xf9,0x00}} }, { 0x249d, 13, 15, 44, 0x93, // bmg, track, index, slot, music_id @@ -175,7 +227,11 @@ const TrackInfo_t track_info[32] = "Regenbogen-Boulevard", "rainbow_course", "n_Rainbow32_n", - "n_Rainbow32_f" + "n_Rainbow32_f", + {{0xff,0xe5,0x18,0x91,0x5e,0x5f,0xaa,0xa8,0x89,0x05,0x7c,0x8a,0x3d,0x3e,0x43,0x98,0x68,0x57,0x45,0x08,0x00,0x3a,0x6d,0xe0}, + {0x13,0x7a,0xc8,0x75,0x97,0xd1,0x0d,0x61,0xb5,0x75,0xae,0x80,0x78,0x2e,0x5f,0x9e,0xae,0x80,0xcd,0x55,0x00,0x3a,0x6d,0xe0}, + {0xfa,0x15,0x45,0x33,0x61,0xcb,0x49,0x3e,0x89,0xf5,0x11,0x24,0xfa,0xd3,0x6e,0xce,0xae,0x7f,0x44,0xb6,0x00,0x2e,0x11,0xe0}, + {0x04,0xf4,0xcd,0x1b,0xc4,0xf8,0xa5,0x8d,0x97,0x32,0x81,0x29,0x16,0xbf,0x96,0x53,0x03,0x91,0x72,0xea,0x00,0x2e,0x11,0xe0}} }, { 0x249e, 14, 12, 41, 0x89, // bmg, track, index, slot, music_id @@ -184,7 +240,11 @@ const TrackInfo_t track_info[32] = "Staubtrockene Ruinen", "desert_course", "STRM_N_DESERT_N", - "STRM_N_DESERT_F" + "STRM_N_DESERT_F", + {{0x38,0x48,0x6c,0x4f,0x70,0x63,0x95,0x77,0x2b,0xd9,0x88,0xc1,0xac,0x5f,0xa3,0x0d,0x27,0xca,0xe0,0x98,0x00,0x34,0xb6,0xe0}, + {0x7d,0xc1,0xfe,0x1d,0x59,0x58,0x46,0x5a,0x06,0x47,0xe9,0x4b,0x3e,0x34,0x91,0x60,0x86,0x3f,0x3b,0x1f,0x00,0x34,0xb6,0xe0}, + {0x0c,0x03,0x7e,0xf1,0x3c,0xf1,0x07,0x78,0xc3,0x68,0x8b,0x33,0xd2,0xc3,0x83,0x71,0x87,0x01,0x29,0x04,0x00,0x2f,0x55,0x60}, + {0xfc,0x59,0xb2,0x49,0xc8,0xf3,0x07,0x1a,0xcb,0x91,0x7f,0x40,0x4b,0x31,0x70,0xa0,0xf0,0xfc,0x5a,0xfb,0x00,0x2f,0x55,0x60}} }, { 0x249f, 15, 9, 32, 0x85, // bmg, track, index, slot, music_id @@ -193,7 +253,11 @@ const TrackInfo_t track_info[32] = "Koopa-Kap", "water_course", "STRM_N_WATER_N", - "STRM_N_WATER_F" + "STRM_N_WATER_F", + {{0x52,0xf0,0x1a,0xe3,0xae,0xd1,0xe0,0xfa,0x4c,0x74,0x59,0xa6,0x48,0x49,0x48,0x63,0xe8,0x3a,0x54,0x8c,0x00,0x50,0x73,0x20}, + {0xe5,0xe9,0xab,0x6b,0x9f,0x5e,0x56,0x34,0x6b,0x9d,0x26,0xd3,0xf1,0xa7,0x3f,0x06,0x7e,0xe9,0x94,0x48,0x00,0x50,0x73,0x20}, + {0xc7,0x43,0x11,0xe7,0xd2,0x75,0x7e,0x80,0x62,0x11,0x12,0x3d,0xb5,0xec,0x59,0x5e,0x4f,0xca,0x63,0x70,0x00,0x4c,0x6e,0xa0}, + {0xdf,0x3d,0xfd,0x88,0xb9,0x8b,0xca,0x8e,0x92,0xb5,0x28,0xbb,0x95,0xa2,0x74,0x4c,0xa4,0x56,0x62,0xba,0x00,0x4c,0x6e,0xa0}} }, { 0x24a0, 16, 16, 51, 0xa5, // bmg, track, index, slot, music_id @@ -202,7 +266,11 @@ const TrackInfo_t track_info[32] = "GCN Peach Beach", "old_peach_gc", "r_GC_Beach32_n", - "r_GC_Beach32_f" + "r_GC_Beach32_f", + {{0x80,0x14,0x48,0x8a,0x60,0xf4,0x42,0x8e,0xef,0x52,0xd0,0x1f,0x8c,0x58,0x61,0xca,0x95,0x65,0xe1,0xca,0x00,0x2b,0x24,0x60}, + {0xed,0xc9,0x29,0xfa,0xbc,0x05,0x08,0x3d,0xfa,0xc0,0x01,0xb4,0x2a,0x6e,0x42,0xc5,0x89,0xcf,0x5e,0xc2,0x00,0x2b,0x24,0x60}, + {0}, + {0}} }, { 0x24a1, 17, 27, 74, 0xa7, // bmg, track, index, slot, music_id @@ -211,7 +279,11 @@ const TrackInfo_t track_info[32] = "GCN Marios Piste", "old_mario_gc", "r_GC_Circuit32_n", - "r_GC_Circuit32_f" + "r_GC_Circuit32_f", + {{0x19,0x41,0xa2,0x9a,0xd2,0xe7,0xb7,0xbb,0xa8,0xa2,0x9e,0x64,0x40,0xc9,0x5e,0xf5,0xcf,0x76,0xb0,0x1d,0x00,0x34,0x81,0x80}, + {0x81,0x3d,0x42,0x51,0xd3,0xfb,0x1d,0xb7,0xbc,0xb3,0xd7,0x70,0xbd,0x48,0x66,0xd7,0xb0,0xcd,0xe8,0xab,0x00,0x34,0x81,0x80}, + {0}, + {0}} }, { 0x24a2, 18, 23, 64, 0xa9, // bmg, track, index, slot, music_id @@ -220,7 +292,11 @@ const TrackInfo_t track_info[32] = "GCN Waluigi-Arena", "old_waluigi_gc", "r_GC_Stadium32_n", - "r_GC_Stadium32_f" + "r_GC_Stadium32_f", + {{0x41,0x80,0x99,0x82,0x4a,0xf6,0xbf,0x1c,0xd7,0xf8,0xbb,0x44,0xf6,0x1e,0x3a,0x9c,0xc3,0x00,0x7d,0xae,0x00,0x24,0xd9,0x84}, + {0xed,0x75,0x58,0x4f,0x51,0xb8,0xd5,0xbf,0xf3,0x56,0xd9,0x49,0x76,0x00,0x95,0xea,0xc2,0xf0,0xc1,0x95,0x00,0x24,0xd9,0xa0}, + {0}, + {0}} }, { 0x24a3, 19, 30, 83, 0xab, // bmg, track, index, slot, music_id @@ -229,7 +305,11 @@ const TrackInfo_t track_info[32] = "GCN DK Bergland", "old_donkey_gc", "r_GC_Mountain32_n", - "r_GC_Mountain32_f" + "r_GC_Mountain32_f", + {{0xb0,0x36,0x86,0x4c,0xf0,0x01,0x6b,0xe0,0x58,0x14,0x49,0xef,0x29,0xfb,0x52,0xb2,0xe5,0x8d,0x78,0xa4,0x00,0x2c,0x3a,0xe0}, + {0x45,0x9b,0xc6,0x3b,0x4f,0x63,0xfb,0xa9,0x3f,0x5a,0x7c,0x43,0xaa,0xd2,0x1b,0x41,0xa6,0xbf,0x1d,0xb9,0x00,0x2c,0x3a,0xe0}, + {0}, + {0}} }, { 0x24a4, 20, 17, 52, 0xad, // bmg, track, index, slot, music_id @@ -238,7 +318,11 @@ const TrackInfo_t track_info[32] = "DS Yoshi-Kaskaden", "old_falls_ds", "r_DS_Jungle32_n", - "r_DS_Jungle32_f" + "r_DS_Jungle32_f", + {{0x8c,0x85,0x4b,0x08,0x74,0x17,0xa9,0x24,0x25,0x11,0x0c,0xc7,0x1e,0x23,0xc9,0x44,0xd6,0x99,0x78,0x06,0x00,0x1f,0x3c,0x40}, + {0x95,0xb5,0x90,0xc1,0x87,0x9d,0x02,0x5c,0x9d,0xce,0x21,0xec,0x5f,0xf7,0x5d,0x37,0xc6,0x7f,0x46,0xe2,0x00,0x1f,0x3c,0x40}, + {0}, + {0}} }, { 0x24a5, 21, 24, 71, 0xb1, // bmg, track, index, slot, music_id @@ -247,7 +331,11 @@ const TrackInfo_t track_info[32] = "DS Glühheiße Wüste", "old_desert_ds", "r_DS_Desert32_n", - "r_DS_Desert32_f" + "r_DS_Desert32_f", + {{0x4e,0xc5,0x38,0x06,0x5f,0xdc,0x8a,0xcf,0x49,0x67,0x43,0x00,0xcb,0xde,0xc5,0xb8,0x0c,0xc0,0x5a,0x0d,0x00,0x24,0x79,0x40}, + {0x97,0x50,0x3d,0x9b,0xcc,0xed,0x8f,0xc7,0xf0,0x38,0xad,0x54,0x4e,0xb3,0x31,0x8d,0x37,0xd8,0xef,0xed,0x00,0x24,0x79,0x40}, + {0}, + {0}} }, { 0x24a6, 22, 29, 82, 0xb3, // bmg, track, index, slot, music_id @@ -256,7 +344,11 @@ const TrackInfo_t track_info[32] = "DS Peachs Schlossgarten", "old_garden_ds", "r_DS_Garden32_n", - "r_DS_Garden32_f" + "r_DS_Garden32_f", + {{0xf9,0xa6,0x2b,0xef,0x04,0xcc,0x8f,0x49,0x96,0x33,0xe4,0x02,0x3a,0xcc,0x76,0x75,0xa9,0x27,0x71,0xf0,0x00,0x20,0xe6,0xe0}, + {0x98,0xdf,0xd0,0x82,0xb8,0x7b,0x32,0x2a,0x27,0x18,0x65,0x83,0xfa,0x0b,0xac,0x37,0x07,0xfd,0x3f,0x2b,0x00,0x20,0xe6,0xe0}, + {0}, + {0}} }, { 0x24a7, 23, 22, 63, 0xaf, // bmg, track, index, slot, music_id @@ -265,7 +357,11 @@ const TrackInfo_t track_info[32] = "DS Piazzale Delfino", "old_town_ds", "r_DS_Town32_n", - "r_DS_Town32_f" + "r_DS_Town32_f", + {{0xbc,0x03,0x8e,0x16,0x3d,0x21,0xd9,0xa1,0x18,0x1b,0x60,0xcf,0x90,0xb4,0xd0,0x3e,0xfa,0xd9,0xe0,0xc5,0x00,0x3a,0x01,0x20}, + {0x5b,0x1f,0xa7,0x15,0xda,0xf7,0x86,0x04,0xd4,0xe4,0x80,0xb3,0x75,0x1d,0xda,0x23,0x08,0x85,0x10,0xc9,0x00,0x3a,0x01,0x20}, + {0}, + {0}} }, { 0x24a8, 24, 28, 81, 0x99, // bmg, track, index, slot, music_id @@ -274,7 +370,11 @@ const TrackInfo_t track_info[32] = "SNES Marios Piste 3", "old_mario_sfc", "r_SFC_Circuit32_n", - "r_SFC_Circuit32_f" + "r_SFC_Circuit32_f", + {{0x07,0x71,0x11,0xb9,0x96,0xe5,0xc4,0xf4,0x7d,0x20,0xec,0x29,0xc2,0x93,0x85,0x04,0xb5,0x3a,0x8e,0x76,0x00,0x1b,0xd2,0x60}, + {0x92,0xed,0xd1,0x50,0xdf,0x28,0x83,0x6a,0x59,0x6d,0x05,0x68,0x2d,0xaf,0x3c,0x49,0x60,0xeb,0x93,0x0f,0x00,0x1b,0xd2,0x60}, + {0}, + {0}} }, { 0x24a9, 25, 18, 53, 0x97, // bmg, track, index, slot, music_id @@ -283,7 +383,11 @@ const TrackInfo_t track_info[32] = "SNES Geistertal 2", "old_obake_sfc", "r_SFC_Obake32_n", - "r_SFC_Obake32_f" + "r_SFC_Obake32_f", + {{0x07,0x1d,0x69,0x7c,0x4d,0xdb,0x66,0xd3,0xb2,0x10,0xf3,0x6c,0x7b,0xf8,0x78,0x50,0x2e,0x79,0x84,0x5b,0x00,0x16,0x7b,0x60}, + {0xa0,0x8c,0x47,0x6b,0xc8,0x3a,0x74,0xf9,0x74,0xea,0x3c,0xc1,0x9a,0xad,0x61,0xb3,0xf0,0xc9,0x9f,0xb7,0x00,0x16,0x7b,0x60}, + {0}, + {0}} }, { 0x24aa, 26, 19, 54, 0x9f, // bmg, track, index, slot, music_id @@ -292,7 +396,11 @@ const TrackInfo_t track_info[32] = "N64 Marios Rennpiste", "old_mario_64", "r_64_Circuit32_n", - "r_64_Circuit32_f" + "r_64_Circuit32_f", + {{0x49,0x51,0x4e,0x8f,0x74,0xfe,0xa5,0x0e,0x77,0x27,0x3c,0x02,0x97,0x08,0x6d,0x67,0xe5,0x81,0x23,0xe8,0x00,0x23,0x9d,0xa0}, + {0xb7,0xc1,0xf6,0xfd,0xbb,0xd0,0x20,0xc2,0x6c,0x25,0x30,0xb5,0x5b,0xe4,0xf1,0x0e,0x93,0x01,0x1a,0x84,0x00,0x23,0x9d,0xa0}, + {0}, + {0}} }, { 0x24ab, 27, 20, 61, 0x9d, // bmg, track, index, slot, music_id @@ -301,7 +409,11 @@ const TrackInfo_t track_info[32] = "N64 Sorbet-Land", "old_sherbet_64", "r_64_Sherbet32_n", - "r_64_Sherbet32_f" + "r_64_Sherbet32_f", + {{0xba,0x9b,0xcf,0xb3,0x73,0x1a,0x6c,0xb1,0x7d,0xba,0x21,0x9a,0x8d,0x37,0xea,0x4d,0x52,0x33,0x22,0x56,0x00,0x27,0xa0,0x80}, + {0xcb,0xac,0xe1,0xcc,0x59,0xc9,0x8b,0x2b,0x6f,0x26,0xb8,0xec,0xf5,0x5e,0xbd,0x48,0x99,0x4a,0x90,0x7e,0x00,0x27,0xa0,0x80}, + {0}, + {0}} }, { 0x24ac, 28, 31, 84, 0xa3, // bmg, track, index, slot, music_id @@ -310,7 +422,11 @@ const TrackInfo_t track_info[32] = "N64 Bowsers Festung", "old_koopa_64", "r_64_Kuppa32_n", - "r_64_Kuppa32_f" + "r_64_Kuppa32_f", + {{0x15,0xb3,0x03,0xb2,0x88,0xf4,0x70,0x7e,0x5d,0x0a,0xf2,0x83,0x67,0xc8,0xce,0x51,0xcd,0xea,0xb4,0x90,0x00,0x27,0x48,0x20}, + {0x71,0x42,0x36,0x1a,0xb9,0x3d,0x39,0x29,0xf6,0x2a,0xa7,0x15,0x50,0x9f,0xc8,0xd1,0x37,0x9a,0xfb,0xd6,0x00,0x27,0x48,0x20}, + {0}, + {0}} }, { 0x24ad, 29, 26, 73, 0xa1, // bmg, track, index, slot, music_id @@ -319,7 +435,11 @@ const TrackInfo_t track_info[32] = "N64 DKs Dschungelpark", "old_donkey_64", "r_64_Jungle32_n", - "r_64_Jungle32_f" + "r_64_Jungle32_f", + {{0x69,0x2d,0x56,0x6b,0x05,0x43,0x4d,0x8c,0x66,0xa5,0x5b,0xdf,0xf4,0x86,0x69,0x8e,0x0f,0xc9,0x60,0x95,0x00,0x2d,0x6e,0x80}, + {0x44,0x3c,0x13,0xb8,0x51,0x6d,0xf1,0x63,0x08,0x26,0x09,0xc7,0xc2,0x12,0xfb,0x00,0xf4,0x45,0xbf,0x34,0x00,0x2d,0x6e,0x80}, + {0}, + {0}} }, { 0x24ae, 30, 25, 72, 0x9b, // bmg, track, index, slot, music_id @@ -328,7 +448,11 @@ const TrackInfo_t track_info[32] = "GBA Bowsers Festung 3", "old_koopa_gba", "r_AGB_Kuppa32_n", - "r_AGB_Kuppa32_f" + "r_AGB_Kuppa32_f", + {{0xa4,0xbe,0xa4,0x1b,0xe8,0x3d,0x81,0x6f,0x79,0x3f,0x3f,0xad,0x97,0xd2,0x68,0xf7,0x1a,0xd9,0x9b,0xf9,0x00,0x1e,0x66,0xc0}, + {0xb3,0xbd,0x45,0x88,0xb0,0x41,0xf0,0x92,0xd0,0x03,0x0c,0xff,0x23,0x4c,0x56,0x36,0x9f,0x2c,0xb8,0xfd,0x00,0x1e,0x66,0xc0}, + {0}, + {0}} }, { 0x24af, 31, 21, 62, 0x95, // bmg, track, index, slot, music_id @@ -337,7 +461,11 @@ const TrackInfo_t track_info[32] = "GBA Shy Guy-Strand", "old_heyho_gba", "r_AGB_Beach32_n", - "r_AGB_Beach32_f" + "r_AGB_Beach32_f", + {{0xe8,0xed,0x31,0x60,0x5c,0xc7,0xd6,0x66,0x06,0x91,0x99,0x8f,0x02,0x4e,0xed,0x6b,0xa8,0xb4,0xa3,0x3f,0x00,0x23,0x2a,0x20}, + {0x32,0x10,0x01,0x53,0x9d,0x47,0x2d,0x25,0xff,0x0f,0x81,0x3a,0x52,0xad,0xb3,0xe4,0x41,0x54,0xed,0x3e,0x00,0x23,0x2a,0x20}, + {0}, + {0}} }, }; @@ -681,7 +809,11 @@ const TrackInfo_t arena_info[10] = "Delfino-Pier", "venice_battle", "n_venice_n", - "n_venice_F" + "n_venice_F", + {{0x45,0x6d,0x88,0x00,0xee,0x7b,0x1b,0x1e,0x2d,0x2d,0xfe,0x4d,0x46,0x54,0xa9,0xc3,0xbb,0x9b,0xd3,0x0f,0x00,0x30,0xf3,0x40}, + {0x1a,0x26,0x94,0x74,0x30,0xfd,0x98,0xbf,0x3b,0x50,0x2b,0x2c,0x07,0x8b,0x53,0x7f,0x33,0x36,0x13,0xa5,0x00,0x30,0xf3,0x40}, + {0x90,0x37,0x58,0x78,0x32,0x89,0x86,0xf8,0x26,0xe3,0x6c,0x8a,0x79,0xf4,0x65,0x7a,0x68,0x01,0xad,0x54,0x00,0x31,0xfa,0xc0}, + {0x42,0x3a,0xce,0x92,0x78,0xa4,0x43,0xb8,0xd6,0x1b,0x08,0x10,0x2a,0x74,0x11,0xbc,0xae,0x45,0xf4,0x98,0x00,0x31,0xfa,0xc0}} }, { 0x24b9, 33, 0, 11, 0xb7, // bmg, track, index, slot, music_id @@ -690,7 +822,11 @@ const TrackInfo_t arena_info[10] = "Block-Plaza", "block_battle", "n_block_n", - "n_block_F" + "n_block_F", + {{0x90,0x47,0xf6,0xe9,0xb7,0x7c,0x6a,0x44,0xac,0xcb,0x46,0xc2,0x23,0x76,0x09,0xb8,0x0e,0x45,0x9f,0xdc,0x00,0x35,0x2c,0xe0}, + {0xd9,0x7d,0xe5,0x43,0x39,0xd4,0x44,0x46,0xee,0xe3,0xba,0x2c,0xf5,0xe6,0x8e,0xb1,0xca,0x36,0xf8,0x77,0x00,0x35,0x2c,0xe0}, + {0}, + {0}} }, { 0x24ba, 34, 3, 14, 0xbb, // bmg, track, index, slot, music_id @@ -699,7 +835,11 @@ const TrackInfo_t arena_info[10] = "Kettenhund-Roulette", "casino_battle", "n_casino_n", - "n_casino_F" + "n_casino_F", + {{0xe0,0x4e,0xec,0x80,0xbb,0xe0,0xaa,0xf8,0x17,0x7e,0x0c,0x70,0x7c,0x05,0xed,0x54,0x1f,0xb5,0x0a,0x23,0x00,0x42,0xf1,0x00}, + {0x5a,0xe5,0x2d,0x71,0xd8,0x68,0x4b,0xba,0x21,0x1e,0x69,0xc4,0x14,0xfb,0xf0,0x18,0xae,0x99,0xb4,0xa8,0x00,0x42,0xf1,0x00}, + {0x46,0xe9,0x1f,0xf4,0xd2,0x06,0x77,0x20,0x31,0x81,0x1b,0xe9,0x93,0x51,0x44,0x2f,0x45,0x63,0xaa,0x31,0x00,0x3f,0x7f,0x80}, + {0x86,0x36,0x00,0x41,0x5e,0xab,0xa9,0xb5,0x39,0xbe,0x90,0xb2,0x48,0x3c,0x4a,0x50,0x59,0xb1,0x82,0x1a,0x00,0x3f,0x7f,0x80}} }, { 0x24bb, 35, 2, 13, 0xb9, // bmg, track, index, slot, music_id @@ -708,7 +848,11 @@ const TrackInfo_t arena_info[10] = "Funky-Stadion", "skate_battle", "n_skate_n", - "n_skate_F" + "n_skate_F", + {{0x70,0x1d,0xa1,0x6b,0x75,0x95,0x05,0x0a,0xc1,0x52,0x55,0x79,0xaa,0xba,0x40,0x78,0x3e,0x49,0xcf,0x8b,0x00,0x37,0x67,0x20}, + {0xa7,0xb5,0xfd,0x0a,0x0e,0x88,0x3d,0x3b,0x17,0xd1,0x41,0x97,0x0f,0x62,0x6f,0x66,0x15,0x34,0x1c,0x90,0x00,0x37,0x67,0x20}, + {0}, + {0}} }, { 0x24bc, 36, 4, 15, 0xbd, // bmg, track, index, slot, music_id @@ -717,7 +861,11 @@ const TrackInfo_t arena_info[10] = "Steinwüste", "sand_battle", "n_ryuusa_n", - "n_ryuusa_F" + "n_ryuusa_F", + {{0xc4,0x9d,0x22,0x62,0xb0,0xcc,0x65,0xb6,0x49,0xfe,0x8a,0xdd,0x2d,0xaf,0x91,0xa3,0xcf,0x73,0xcc,0x45,0x00,0x2b,0x80,0x40}, + {0x4a,0x68,0x1c,0x07,0x07,0x81,0x6f,0xb6,0xe1,0x03,0x5e,0x41,0x79,0xd8,0xa1,0x1c,0x4c,0x1e,0xab,0x0f,0x00,0x2b,0x80,0x40}, + {0x37,0x21,0xd5,0x20,0x9e,0xc2,0xce,0x5f,0x02,0x2a,0xc3,0x94,0x4f,0xd4,0x55,0xaf,0xd1,0xa2,0xab,0x16,0x00,0x29,0xd9,0xc0}, + {0x98,0x04,0x2a,0x57,0x0c,0x9a,0x36,0x87,0xa8,0x96,0x42,0x8d,0xe5,0x1c,0xb9,0x9f,0x46,0x54,0x67,0xf0,0x00,0x29,0xd9,0xc0}} }, { 0x24bd, 37, 8, 24, 0xbf, // bmg, track, index, slot, music_id @@ -726,7 +874,11 @@ const TrackInfo_t arena_info[10] = "GCN Keks-Land", "old_CookieLand_gc", "r_GC_Battle32_n", - "r_GC_Battle32_F" + "r_GC_Battle32_F", + {{0x26,0x77,0x6d,0x2b,0xd9,0x7b,0xae,0x6d,0x6a,0x8e,0x5f,0xa9,0xc1,0xfd,0x59,0xae,0x7c,0xa5,0xde,0xe5,0x00,0x0d,0x5d,0x00}, + {0x95,0x2d,0xb0,0xfe,0x10,0x10,0xfb,0xcb,0xce,0x5a,0xda,0x22,0xd3,0x85,0xc5,0xf5,0x72,0x4a,0xac,0x9a,0x00,0x0d,0x5d,0x00}, + {0}, + {0}} }, { 0x24be, 38, 9, 25, 0xc1, // bmg, track, index, slot, music_id @@ -735,7 +887,11 @@ const TrackInfo_t arena_info[10] = "DS Finstervilla", "old_House_ds", "r_ds_battle_n", - "r_ds_battle_F" + "r_ds_battle_F", + {{0xb8,0x31,0x2b,0xac,0xb2,0x5e,0xc0,0xf0,0x85,0x60,0xfd,0x95,0xe9,0xed,0xd0,0x8e,0x82,0x1c,0xe6,0xcd,0x00,0x1d,0x59,0x00}, + {0x66,0x19,0x10,0x53,0x13,0x4c,0xf8,0x77,0x57,0x90,0x28,0x95,0x49,0x97,0x58,0x4a,0xb6,0xc2,0x0a,0x73,0x00,0x1d,0x59,0x00}, + {0}, + {0}} }, { 0x24bf, 39, 5, 21, 0xc3, // bmg, track, index, slot, music_id @@ -744,7 +900,11 @@ const TrackInfo_t arena_info[10] = "SNES Kampfkurs 4", "old_battle4_sfc", "r_sfc_battle_n", - "r_sfc_battle_F" + "r_sfc_battle_F", + {{0x79,0x13,0x71,0x0a,0xfc,0xda,0x69,0xb3,0x59,0xb5,0xf3,0xd6,0x14,0xdd,0xae,0x86,0x14,0x40,0x3e,0xf2,0x00,0x15,0xc1,0x80}, + {0x3f,0x82,0xaa,0x67,0x67,0xf3,0xc0,0xd6,0x98,0xa3,0x7c,0xde,0x42,0xf9,0xf4,0x93,0xca,0x8b,0xa2,0xfc,0x00,0x15,0xc1,0x80}, + {0}, + {0}} }, { 0x24c0, 40, 6, 22, 0xc5, // bmg, track, index, slot, music_id @@ -753,7 +913,11 @@ const TrackInfo_t arena_info[10] = "GBA Kampfkurs 3", "old_battle3_gba", "r_agb_battle_n", - "r_agb_battle_F" + "r_agb_battle_F", + {{0xac,0xb6,0x9b,0x36,0x23,0x58,0xcd,0xfe,0x8a,0x73,0x94,0x19,0x66,0x96,0xc4,0x29,0x6a,0xcb,0xc3,0xa0,0x00,0x13,0x5b,0xe0}, + {0xdf,0xb2,0xcd,0x15,0xfa,0xe8,0xd0,0x77,0xfc,0xd8,0x9d,0x13,0xab,0x6a,0x15,0xfc,0xff,0xbe,0xd4,0x21,0x00,0x13,0x5b,0xe0}, + {0}, + {0}} }, { 0x24c1, 41, 7, 23, 0xc7, // bmg, track, index, slot, music_id @@ -762,7 +926,11 @@ const TrackInfo_t arena_info[10] = "N64 Wolkenkratzer", "old_matenro_64", "r_64_battle_n", - "r_64_battle_F" + "r_64_battle_F", + {{0x17,0x77,0x10,0xcd,0x82,0xc3,0x01,0x99,0x03,0x39,0x2a,0x77,0xaf,0xfa,0x46,0x15,0x14,0x54,0x02,0xa3,0x00,0x19,0x47,0xe0}, + {0x80,0xe8,0x57,0xf6,0x0e,0xb5,0xce,0x54,0x1a,0x6f,0xad,0x4e,0xbf,0x13,0x43,0x04,0x87,0x6c,0x93,0x43,0x00,0x19,0x47,0xe0}, + {0}, + {0}} }, }; diff --git a/project/src/db-mkw.h b/project/src/db-mkw.h index 41153c2..d0f7215 100644 --- a/project/src/db-mkw.h +++ b/project/src/db-mkw.h @@ -17,6 +17,9 @@ // [[TrackInfo_t]] (generic code) +#define TI_SHA1_IS_D 1 +#define TI_SHA1_NORM 2 + typedef struct TrackInfo_t { u16 bmg_mid; // standard message id for BMG files @@ -32,6 +35,9 @@ typedef struct TrackInfo_t ccp sound_n_fname; // file name of normal sound ccp sound_f_fname; // file name of fast sound + u8 sha1[4][24]; // SHA1+size, compatible to sha1_size_t + // ... ORIG, ORIG_D, NORM, NORM_D + } TrackInfo_t; diff --git a/project/src/file-type.c b/project/src/file-type.c index fa2c668..6b0ba52 100644 --- a/project/src/file-type.c +++ b/project/src/file-type.c @@ -294,16 +294,16 @@ const file_type_t FileTypeTab[FF_N+1] = "Texture file with CTGP-CODE" }, - // FF_CT_TEXT = 23 + // FF_CTDEF = 23 { - FF_CT_TEXT, 0, 0, "CTTEXT", + FF_CTDEF, 0, 0, "CT-DEF", ".txt", ".szs", ".txt", FFT_VALID | FFT_TEXT | FFT_DECODE | FFT_ENCODE | FFT_PARSER, 8, {0x23,0x43,0x54,0x2d,0x43,0x4f,0x44,0x45}, // "#CT-CODE" 0, MinusString, MinusString, - "CTGP-CODE text file" + "CT-CODE definition file" }, // FF_CT0_CODE = 24 @@ -440,7 +440,7 @@ const file_type_t FileTypeTab[FF_N+1] = // FF_LEX_TXT = 35 { - FF_LEX_TXT, FF_LEX, FF_LEX_TXT, "LEXTXT", + FF_LEX_TXT, FF_LEX, FF_LEX_TXT, "LEX-TXT", ".txt", ".szs", ".txt", FFT_VALID | FFT_TEXT | FFT_DECODE | FFT_ENCODE | FFT_PARSER, 4, {0x23,0x4c,0x45,0x58}, // "#LEX" @@ -462,7 +462,79 @@ const file_type_t FileTypeTab[FF_N+1] = "Text file with LE-CODE parameters" }, - // FF_MDL_TXT = 37 + // FF_LEDEF = 37 + { + FF_LEDEF, 0, 0, "LE-DEF", + ".txt", ".szs", ".txt", + FFT_VALID | FFT_TEXT | FFT_DECODE | FFT_ENCODE | FFT_PARSER, + 8, {0x23,0x4c,0x45,0x2d,0x44,0x45,0x46,0x31}, // "#LE-DEF1" + 0, + MinusString, + MinusString, + "LE-CODE definition file" + }, + + // FF_LEDIS = 38 + { + FF_LEDIS, 0, 0, "LE-DIS", + ".txt", ".szs", ".txt", + FFT_VALID | FFT_TEXT | FFT_DECODE | FFT_ENCODE, + 8, {0x23,0x4c,0x45,0x2d,0x44,0x49,0x53,0x54}, // "#LE-DIST" + 0, + MinusString, + MinusString, + "Text file with CT+LE-CODE distribution settings" + }, + + // FF_LEREF = 39 + { + FF_LEREF, 0, 0, "LE-REF", + ".txt", ".szs", ".txt", + FFT_VALID | FFT_TEXT | FFT_DECODE | FFT_ENCODE, + 8, {0x23,0x4c,0x45,0x2d,0x52,0x45,0x46,0x31}, // "#LE-REF1" + 0, + MinusString, + MinusString, + "Text file as track reference" + }, + + // FF_LESTR = 40 + { + FF_LESTR, 0, 0, "LE-STR", + ".txt", ".szs", ".txt", + FFT_VALID | FFT_TEXT | FFT_DECODE | FFT_ENCODE, + 8, {0x23,0x4c,0x45,0x2d,0x53,0x54,0x52,0x31}, // "#LE-STR1" + 0, + MinusString, + MinusString, + "Text file strings for tracks" + }, + + // FF_SHA1REF = 41 + { + FF_SHA1REF, 0, 0, "SHA1REF", + ".txt", ".szs", ".txt", + FFT_VALID | FFT_TEXT | FFT_ENCODE, + 8, {0x23,0x53,0x48,0x41,0x31,0x52,0x45,0x46}, // "#SHA1REF" + 0, + MinusString, + MinusString, + "Text file with SHA1 of tracks" + }, + + // FF_PREFIX = 42 + { + FF_PREFIX, 0, 0, "PREFIX", + ".txt", ".szs", ".txt", + FFT_VALID | FFT_TEXT | FFT_DECODE | FFT_ENCODE, + 8, {0x23,0x50,0x52,0x45,0x46,0x49,0x58,0x31}, // "#PREFIX1" + 0, + MinusString, + MinusString, + "Text file with console/game prefixes and info" + }, + + // FF_MDL_TXT = 43 { FF_MDL_TXT, FF_MDL, FF_MDL_TXT, "MDLTXT", ".txt", ".szs", ".txt", @@ -474,7 +546,7 @@ const file_type_t FileTypeTab[FF_N+1] = "Text version of MDL" }, - // FF_PAT_TXT = 38 + // FF_PAT_TXT = 44 { FF_PAT_TXT, FF_PAT, FF_PAT_TXT, "PATTXT", ".txt", ".szs", ".txt", @@ -486,7 +558,7 @@ const file_type_t FileTypeTab[FF_N+1] = "Text version of PAT" }, - // FF_TPL = 39 + // FF_TPL = 45 { FF_TPL, 0, 0, "TPL", ".tpl", ".szs", ".tpl", @@ -498,7 +570,7 @@ const file_type_t FileTypeTab[FF_N+1] = "Image container" }, - // FF_BTI = 40 + // FF_BTI = 46 { FF_BTI, 0, 0, "BTI", ".bti", ".szs", ".bti", @@ -510,7 +582,7 @@ const file_type_t FileTypeTab[FF_N+1] = "Image container" }, - // FF_BREFT_IMG = 41 + // FF_BREFT_IMG = 47 { FF_BREFT_IMG, 0, 0, "BT-IMG", ".bt-img", ".szs", ".bt-img", @@ -522,7 +594,7 @@ const file_type_t FileTypeTab[FF_N+1] = "Raw image of BREFT file" }, - // FF_BMG = 42 + // FF_BMG = 48 { FF_BMG, FF_BMG, FF_BMG_TXT, "BMG", ".bmg", ".szs", ".bmg", @@ -534,7 +606,7 @@ const file_type_t FileTypeTab[FF_N+1] = "Message file" }, - // FF_BMG_TXT = 43 + // FF_BMG_TXT = 49 { FF_BMG_TXT, FF_BMG, FF_BMG_TXT, "BMGTXT", ".txt", ".szs", ".txt", @@ -546,7 +618,7 @@ const file_type_t FileTypeTab[FF_N+1] = "Text version of BMG" }, - // FF_KCL = 44 + // FF_KCL = 50 { FF_KCL, FF_KCL, FF_KCL_TXT, "KCL", ".kcl", ".szs", ".kcl", @@ -558,7 +630,7 @@ const file_type_t FileTypeTab[FF_N+1] = "Collision file" }, - // FF_KCL_TXT = 45 + // FF_KCL_TXT = 51 { FF_KCL_TXT, FF_KCL, FF_KCL_TXT, "KCLTXT", ".obj", ".szs", ".obj", @@ -570,7 +642,7 @@ const file_type_t FileTypeTab[FF_N+1] = "Wavefront OBJ by WSZST" }, - // FF_WAV_OBJ = 46 + // FF_WAV_OBJ = 52 { FF_WAV_OBJ, FF_KCL, FF_WAV_OBJ, "WAVOBJ", ".obj", ".szs", ".obj", @@ -582,7 +654,7 @@ const file_type_t FileTypeTab[FF_N+1] = "Wavefront OBJ" }, - // FF_SKP_OBJ = 47 + // FF_SKP_OBJ = 53 { FF_SKP_OBJ, FF_KCL, FF_SKP_OBJ, "SKPOBJ", ".obj", ".szs", ".obj", @@ -594,7 +666,7 @@ const file_type_t FileTypeTab[FF_N+1] = "Wavefront OBJ by Sketchup" }, - // FF_KMP = 48 + // FF_KMP = 54 { FF_KMP, FF_KMP, FF_KMP_TXT, "KMP", ".kmp", ".szs", ".kmp", @@ -606,7 +678,7 @@ const file_type_t FileTypeTab[FF_N+1] = "Track information file" }, - // FF_KMP_TXT = 49 + // FF_KMP_TXT = 55 { FF_KMP_TXT, FF_KMP, FF_KMP_TXT, "KMPTXT", ".txt", ".szs", ".txt", @@ -618,7 +690,7 @@ const file_type_t FileTypeTab[FF_N+1] = "Text version of KMP" }, - // FF_ITEMSLT = 50 + // FF_ITEMSLT = 56 { FF_ITEMSLT, FF_ITEMSLT, FF_ITEMSLT_TXT, "ITEMSLT", ".bin", ".szs", ".slt", @@ -630,7 +702,7 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_ITEMSLT_TXT = 51 + // FF_ITEMSLT_TXT = 57 { FF_ITEMSLT_TXT, FF_ITEMSLT, FF_ITEMSLT_TXT, "ITEMSLTTXT", ".txt", ".szs", ".txt", @@ -642,7 +714,7 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_KMG = 52 + // FF_KMG = 58 { FF_KMG, FF_KMG, FF_KMG_TXT, "KMG", ".kmg", ".szs", ".kmg", @@ -654,7 +726,7 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_KMG_TXT = 53 + // FF_KMG_TXT = 59 { FF_KMG_TXT, FF_KMG, FF_KMG_TXT, "KMGTXT", ".txt", ".szs", ".txt", @@ -666,7 +738,7 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_KRM = 54 + // FF_KRM = 60 { FF_KRM, FF_KRM, FF_KRM_TXT, "KRM", ".krm", ".szs", ".krm", @@ -678,7 +750,7 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_KRM_TXT = 55 + // FF_KRM_TXT = 61 { FF_KRM_TXT, FF_KRM, FF_KRM_TXT, "KRMTXT", ".txt", ".szs", ".txt", @@ -690,7 +762,7 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_KRT = 56 + // FF_KRT = 62 { FF_KRT, FF_KRT, FF_KRT_TXT, "KRT", ".krt", ".szs", ".krt", @@ -702,7 +774,7 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_KRT_TXT = 57 + // FF_KRT_TXT = 63 { FF_KRT_TXT, FF_KRT, FF_KRT_TXT, "KRTTXT", ".txt", ".szs", ".txt", @@ -714,7 +786,7 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_OBJFLOW = 58 + // FF_OBJFLOW = 64 { FF_OBJFLOW, FF_OBJFLOW, FF_OBJFLOW_TXT, "OBFLOW", ".bin", ".szs", ".bin", @@ -726,7 +798,7 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_OBJFLOW_TXT = 59 + // FF_OBJFLOW_TXT = 65 { FF_OBJFLOW_TXT, FF_OBJFLOW, FF_OBJFLOW_TXT, "OF-TXT", ".txt", ".szs", ".txt", @@ -738,7 +810,7 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_GH_ITEM = 60 + // FF_GH_ITEM = 66 { FF_GH_ITEM, FF_GH_ITEM, FF_GH_ITEM_TXT, "GHITEM", ".bin", ".szs", ".bin", @@ -750,7 +822,7 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_GH_ITEM_TXT = 61 + // FF_GH_ITEM_TXT = 67 { FF_GH_ITEM_TXT, FF_GH_ITEM, FF_GH_ITEM_TXT, "GI-TXT", ".txt", ".szs", ".txt", @@ -762,7 +834,7 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_GH_IOBJ = 62 + // FF_GH_IOBJ = 68 { FF_GH_IOBJ, FF_GH_IOBJ, FF_GH_IOBJ_TXT, "GHIOBJ", ".bin", ".szs", ".bin", @@ -774,7 +846,7 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_GH_IOBJ_TXT = 63 + // FF_GH_IOBJ_TXT = 69 { FF_GH_IOBJ_TXT, FF_GH_IOBJ, FF_GH_IOBJ_TXT, "GIOTXT", ".txt", ".szs", ".txt", @@ -786,7 +858,7 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_GH_KART = 64 + // FF_GH_KART = 70 { FF_GH_KART, FF_GH_KART, FF_GH_KART_TXT, "GHKART", ".bin", ".szs", ".bin", @@ -798,7 +870,7 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_GH_KART_TXT = 65 + // FF_GH_KART_TXT = 71 { FF_GH_KART_TXT, FF_GH_KART, FF_GH_KART_TXT, "GK-TXT", ".txt", ".szs", ".txt", @@ -810,7 +882,7 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_GH_KOBJ = 66 + // FF_GH_KOBJ = 72 { FF_GH_KOBJ, FF_GH_KOBJ, FF_GH_KOBJ_TXT, "GHKOBJ", ".bin", ".szs", ".bin", @@ -822,7 +894,7 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_GH_KOBJ_TXT = 67 + // FF_GH_KOBJ_TXT = 73 { FF_GH_KOBJ_TXT, FF_GH_KOBJ, FF_GH_KOBJ_TXT, "GKOTXT", ".txt", ".szs", ".txt", @@ -834,7 +906,7 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_DRIVER = 68 + // FF_DRIVER = 74 { FF_DRIVER, 0, 0, "DRV", ".bin", ".szs", ".bin", @@ -846,7 +918,7 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_VEHICLE = 69 + // FF_VEHICLE = 75 { FF_VEHICLE, 0, 0, "VEH", ".bin", ".szs", ".bin", @@ -858,7 +930,7 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_BRASD = 70 + // FF_BRASD = 76 { FF_BRASD, 0, 0, "BRASD", ".brasd", ".szs", ".brasd", @@ -870,7 +942,7 @@ const file_type_t FileTypeTab[FF_N+1] = filetype_info_unknown }, - // FF_RKG = 71 + // FF_RKG = 77 { FF_RKG, 0, 0, "RKG", ".rkg", ".szs", ".rkg", @@ -882,7 +954,7 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_RKCO = 72 + // FF_RKCO = 78 { FF_RKCO, 0, 0, "RKCO", ".rkco", ".szs", ".rkco", @@ -894,9 +966,9 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_STATICR = 73 + // FF_STATICR = 79 { - FF_STATICR, 0, 0, "STATR", + FF_STATICR, 0, 0, "STATICR", ".rel", ".szs", ".rel", FFT_VALID | FFT_PATCH, 0, {0}, // no magic @@ -906,7 +978,7 @@ const file_type_t FileTypeTab[FF_N+1] = "A 'StaticR.rel' file" }, - // FF_DOL = 74 + // FF_DOL = 80 { FF_DOL, 0, 0, "DOL", ".dol", ".szs", ".dol", @@ -918,7 +990,7 @@ const file_type_t FileTypeTab[FF_N+1] = "An executable DOL file" }, - // FF_GCT = 75 + // FF_GCT = 81 { FF_GCT, 0, 0, "GCT", ".gct", ".szs", ".gct", @@ -930,7 +1002,7 @@ const file_type_t FileTypeTab[FF_N+1] = "Gecko Cheat Code" }, - // FF_GCH = 76 + // FF_GCH = 82 { FF_GCH, 0, 0, "GCH", ".gch", ".szs", ".gch", @@ -942,7 +1014,7 @@ const file_type_t FileTypeTab[FF_N+1] = "Gecko Cheat Handler + coded" }, - // FF_WCH = 77 + // FF_WCH = 83 { FF_WCH, 0, 0, "WCH", ".wch", ".szs", ".wch", @@ -954,7 +1026,7 @@ const file_type_t FileTypeTab[FF_N+1] = "Wiimms Cheat Handler + codes" }, - // FF_WPF = 78 + // FF_WPF = 84 { FF_WPF, 0, 0, "WPF", ".wpf", ".szs", ".wpf", @@ -966,7 +1038,7 @@ const file_type_t FileTypeTab[FF_N+1] = "Wiimms Patch File" }, - // FF_XPF = 79 + // FF_XPF = 85 { FF_XPF, 0, 0, "XPF", ".xpf", ".szs", ".xpf", @@ -978,9 +1050,9 @@ const file_type_t FileTypeTab[FF_N+1] = "Extended Patch File" }, - // FF_DISTRIB = 80 + // FF_DISTRIB = 86 { - FF_DISTRIB, 0, 0, "DISTRB", + FF_DISTRIB, 0, 0, "DISTRIB", ".txt", ".szs", ".txt", FFT_VALID | FFT_TEXT, 8, {0x23,0x44,0x49,0x53,0x54,0x52,0x49,0x42}, // "#DISTRIB" @@ -990,7 +1062,7 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_PNG = 81 + // FF_PNG = 87 { FF_PNG, 0, 0, "PNG", ".png", ".png", ".png", @@ -1002,7 +1074,7 @@ const file_type_t FileTypeTab[FF_N+1] = "A public image format" }, - // FF_PORTDB = 82 + // FF_PORTDB = 88 { FF_PORTDB, 0, 0, "PORTDB", ".bin", ".szs", ".bin", @@ -1014,7 +1086,7 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_TXT = 83 + // FF_TXT = 89 { FF_TXT, 0, 0, "TXT", ".txt", ".szs", ".txt", @@ -1026,7 +1098,7 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_SCRIPT = 84 + // FF_SCRIPT = 90 { FF_SCRIPT, 0, 0, "SCRIPT", ".script", ".szs", ".script", @@ -1038,7 +1110,7 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_JSON = 85 + // FF_JSON = 91 { FF_JSON, 0, 0, "JSON", ".json", ".szs", ".json", @@ -1050,7 +1122,7 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_SH = 86 + // FF_SH = 92 { FF_SH, 0, 0, "SH", ".sh", ".szs", ".sh", @@ -1062,7 +1134,7 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_BASH = 87 + // FF_BASH = 93 { FF_BASH, 0, 0, "BASH", ".sh", ".szs", ".sh", @@ -1074,7 +1146,7 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_PHP = 88 + // FF_PHP = 94 { FF_PHP, 0, 0, "PHP", ".php", ".szs", ".php", @@ -1086,9 +1158,9 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_MAKEDOC = 89 + // FF_MAKEDOC = 95 { - FF_MAKEDOC, 0, 0, "MKDOC", + FF_MAKEDOC, 0, 0, "MAKEDOC", ".md", ".szs", ".md", FFT_VALID | FFT_TEXT | FFT_EXTERNAL, 0, {0}, // no magic @@ -1098,7 +1170,7 @@ const file_type_t FileTypeTab[FF_N+1] = EmptyString }, - // FF_DIRECTORY = 90 + // FF_DIRECTORY = 96 { FF_DIRECTORY, 0, 0, "DIR", ".d", ".d", ".d", @@ -1148,7 +1220,7 @@ const KeywordTab_t cmdtab_FileType[] = { FF_TEX_CT, "TEX", "TEX+CT", 0x5c29 }, { FF_TEX_CT, "TEX-CT", "TEX0", 0x5c29 }, { FF_TEX_CT, "TEXCT", 0, 0x5c29 }, - { FF_CT_TEXT, "CT-TEXT", "CTTEXT", 0x3811 }, + { FF_CTDEF, "CT-DEF", "CTDEF", 0x3811 }, { FF_CT0_CODE, "C0CODE", "CT0-CODE", 0x1 }, { FF_CT0_CODE, "CT0CODE", 0, 0x1 }, { FF_CT0_DATA, "C0DATA", "CT0-DATA", 0x1 }, @@ -1166,6 +1238,12 @@ const KeywordTab_t cmdtab_FileType[] = { FF_LEX, "LEX", 0, 0x1c01 }, { FF_LEX_TXT, "LEX-TXT", "LEXTXT", 0x3811 }, { FF_LPAR, "LPAR", 0, 0x3811 }, + { FF_LEDEF, "LE-DEF", "LEDEF", 0x3811 }, + { FF_LEDIS, "LE-DIS", "LEDIS", 0x1811 }, + { FF_LEREF, "LE-REF", "LEREF", 0x1811 }, + { FF_LESTR, "LE-STR", "LESTR", 0x1811 }, + { FF_SHA1REF, "SHA1REF", 0, 0x1011 }, + { FF_PREFIX, "PREFIX", 0, 0x1811 }, { FF_MDL_TXT, "MDL-TXT", "MDLTXT", 0x11 }, { FF_PAT_TXT, "PAT-TXT", "PATTXT", 0x3811 }, { FF_TPL, "TPL", 0, 0x1c09 }, diff --git a/project/src/file-type.h b/project/src/file-type.h index c54c6ff..7a24e83 100644 --- a/project/src/file-type.h +++ b/project/src/file-type.h @@ -85,7 +85,7 @@ typedef enum file_format_t FF_TEX, // 21 FF_TEX_CT, // 22 - FF_CT_TEXT, // 23 + FF_CTDEF, // 23 FF_CT0_CODE, // 24 FF_CT0_DATA, // 25 @@ -103,82 +103,88 @@ typedef enum file_format_t FF_LEX_TXT, // 35 FF_LPAR, // 36 + FF_LEDEF, // 37 + FF_LEDIS, // 38 + FF_LEREF, // 39 + FF_LESTR, // 40 + FF_SHA1REF, // 41 + FF_PREFIX, // 42 - FF_MDL_TXT, // 37 + FF_MDL_TXT, // 43 - FF_PAT_TXT, // 38 + FF_PAT_TXT, // 44 - FF_TPL, // 39 - FF_BTI, // 40 - FF_BREFT_IMG, // 41 + FF_TPL, // 45 + FF_BTI, // 46 + FF_BREFT_IMG, // 47 - FF_BMG, // 42 - FF_BMG_TXT, // 43 + FF_BMG, // 48 + FF_BMG_TXT, // 49 - FF_KCL, // 44 - FF_KCL_TXT, // 45 - FF_WAV_OBJ, // 46 - FF_SKP_OBJ, // 47 + FF_KCL, // 50 + FF_KCL_TXT, // 51 + FF_WAV_OBJ, // 52 + FF_SKP_OBJ, // 53 - FF_KMP, // 48 - FF_KMP_TXT, // 49 + FF_KMP, // 54 + FF_KMP_TXT, // 55 - FF_ITEMSLT, // 50 - FF_ITEMSLT_TXT, // 51 + FF_ITEMSLT, // 56 + FF_ITEMSLT_TXT, // 57 - FF_KMG, // 52 - FF_KMG_TXT, // 53 + FF_KMG, // 58 + FF_KMG_TXT, // 59 - FF_KRM, // 54 - FF_KRM_TXT, // 55 + FF_KRM, // 60 + FF_KRM_TXT, // 61 - FF_KRT, // 56 - FF_KRT_TXT, // 57 + FF_KRT, // 62 + FF_KRT_TXT, // 63 - FF_OBJFLOW, // 58 - FF_OBJFLOW_TXT, // 59 + FF_OBJFLOW, // 64 + FF_OBJFLOW_TXT, // 65 - FF_GH_ITEM, // 60 - FF_GH_ITEM_TXT, // 61 + FF_GH_ITEM, // 66 + FF_GH_ITEM_TXT, // 67 - FF_GH_IOBJ, // 62 - FF_GH_IOBJ_TXT, // 63 + FF_GH_IOBJ, // 68 + FF_GH_IOBJ_TXT, // 69 - FF_GH_KART, // 64 - FF_GH_KART_TXT, // 65 + FF_GH_KART, // 70 + FF_GH_KART_TXT, // 71 - FF_GH_KOBJ, // 66 - FF_GH_KOBJ_TXT, // 67 + FF_GH_KOBJ, // 72 + FF_GH_KOBJ_TXT, // 73 - FF_DRIVER, // 68 - FF_VEHICLE, // 69 + FF_DRIVER, // 74 + FF_VEHICLE, // 75 - FF_BRASD, // 70 - FF_RKG, // 71 - FF_RKCO, // 72 + FF_BRASD, // 76 + FF_RKG, // 77 + FF_RKCO, // 78 - FF_STATICR, // 73 - FF_DOL, // 74 + FF_STATICR, // 79 + FF_DOL, // 80 - FF_GCT, // 75 - FF_GCH, // 76 - FF_WCH, // 77 - FF_WPF, // 78 - FF_XPF, // 79 - FF_DISTRIB, // 80 + FF_GCT, // 81 + FF_GCH, // 82 + FF_WCH, // 83 + FF_WPF, // 84 + FF_XPF, // 85 + FF_DISTRIB, // 86 - FF_PNG, // 81 - FF_PORTDB, // 82 + FF_PNG, // 87 + FF_PORTDB, // 88 - FF_TXT, // 83 - FF_SCRIPT, // 84 - FF_JSON, // 85 - FF_SH, // 86 - FF_BASH, // 87 - FF_PHP, // 88 - FF_MAKEDOC, // 89 + FF_TXT, // 89 + FF_SCRIPT, // 90 + FF_JSON, // 91 + FF_SH, // 92 + FF_BASH, // 93 + FF_PHP, // 94 + FF_MAKEDOC, // 95 - FF_DIRECTORY, // 90 + FF_DIRECTORY, // 96 //--- number of elements diff --git a/project/src/getopt.c b/project/src/getopt.c index f0b8ce0..f96bc71 100644 --- a/project/src/getopt.c +++ b/project/src/getopt.c @@ -390,7 +390,7 @@ static void __attribute__((__noreturn__)) usage(void) exit(EXIT_SUCCESS); } -int main(int argc, char *argv[]) +int main ( int argc, char *argv[] ) { struct getopt_control ctl = { .shell = BASH, diff --git a/project/src/lecode.inc b/project/src/lecode.inc new file mode 100644 index 0000000..171d4ba --- /dev/null +++ b/project/src/lecode.inc @@ -0,0 +1,6000 @@ + +static const u8 lecode_pal_bin_bz2[] = // pool/ref/lecode/r32/lecode-PAL.bin +{ + // decompressed size: 0x117a0 = 71584 bytes + 0x00,0x01,0x17,0xa0, + + // bzipped data + 0x42,0x5a,0x68,0x39, 0x31,0x41,0x59,0x26, 0x53,0x59,0x08,0xe9, 0x08,0x24,0x00,0x29, + 0xb0,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xe0, 0x4e,0xd7,0xd2,0x7d, 0x6e,0xf3,0xd7,0xdf, 0x7d,0xce,0xee,0xe2, + 0x52,0x9f,0x61,0xae, 0x7b,0xdc,0xf7,0x1b, 0x5b,0x7d,0xf3,0xbd, 0xd7,0xbb,0x37,0x95, + 0x76,0xf3,0xb9,0xeb, 0x19,0xe0,0x76,0xc6, 0x13,0xb3,0x51,0x12, 0x8b,0x5d,0xde,0xec, + 0x0d,0xf7,0xbd,0xe2, 0x41,0xf4,0x6b,0xc9, 0x33,0xed,0xf3,0xc3, 0x7b,0x12,0xd4,0xb4, + 0x3d,0xb7,0x1e,0xfb, 0xba,0xda,0x76,0xef, 0xbd,0xba,0xf7,0xdb, 0xdc,0xbe,0x36,0x97, + 0x33,0x7b,0x65,0x05, 0xf7,0x77,0x3b,0x51, 0xeb,0xb8,0x1a,0xb4, 0xde,0xdf,0x5e,0x7d, + 0xf7,0xcd,0x3b,0xec, 0xfb,0xec,0x3a,0xc7, 0xd0,0x75,0x76,0x3b, 0xbc,0x01,0xef,0x6b, + 0x7b,0x77,0xde,0x5c, 0xbd,0xbd,0x2e,0x6f, 0x2f,0xbc,0xdf,0x55, 0x79,0xb0,0xf4,0x77, + 0xd4,0xbd,0xca,0xfb, 0x2d,0xb6,0xf7,0x31, 0xef,0x7b,0xde,0xf8, 0xbb,0xe9,0x6d,0xe6, + 0x76,0x39,0xf0,0xb7, 0xb3,0xde,0xde,0x37, 0xdf,0x72,0x39,0xb0, 0x7d,0x75,0x80,0xbb, + 0xee,0x78,0x7b,0xeb, 0x6f,0x1b,0xbc,0x57, 0xdb,0xed,0xdd,0xe5, 0x65,0xdf,0x2d,0x95, + 0xee,0x3e,0xbd,0x73, 0x95,0x3e,0x83,0x76, 0xfb,0xb1,0xf7,0xa8, 0x5d,0xb1,0xb2,0x5d, + 0x3e,0xb4,0x0d,0x15, 0x75,0xcb,0x37,0x1e, 0xec,0x03,0x8e,0xb6, 0xb7,0x55,0xbd,0xbb, + 0x5a,0xda,0x20,0x75, 0xe1,0xa2,0x20,0x9a, 0x00,0x00,0x8d,0x01, 0x18,0x02,0x64,0xc1, + 0x0c,0x4d,0x32,0x31, 0x01,0xa6,0x86,0x99, 0x32,0x61,0x4d,0xa6, 0x9a,0x00,0x68,0x1a, + 0x6a,0x60,0x4d,0x30, 0xc8,0x8c,0x01,0x30, 0x98,0x02,0x18,0x8c, 0x53,0x64,0x65,0x3d, + 0x4c,0x13,0xd3,0x09, 0x89,0xb5,0x19,0x4d, 0x3d,0x4f,0x44,0xda, 0x09,0x85,0x3c,0x00, + 0x24,0xf4,0x9e,0x14, 0xf4,0x9a,0x0d,0x4d, 0x10,0x04,0x68,0x00, 0x98,0x23,0x00,0x4d, + 0x19,0x30,0x83,0x40, 0x04,0xc9,0xa6,0x02, 0x64,0xd1,0x30,0x26, 0x13,0x01,0x30,0x4c, + 0x2a,0x7e,0x9a,0x68, 0x35,0x4f,0x4f,0x53, 0x19,0x4d,0x88,0xd0, 0xa6,0xca,0x78,0x99, + 0xa3,0x54,0xcd,0x30, 0x29,0x93,0xca,0x6c, 0xd2,0x9e,0xa7,0xb4, 0xa3,0x32,0x6a,0x69, + 0xa7,0x94,0xf4,0xd4, 0xf1,0x0d,0x26,0xd2, 0x6d,0x23,0x43,0x47, 0xa9,0xe9,0xa9,0xa7, + 0xa2,0x7a,0x9e,0x90, 0x6a,0x68,0x40,0x68, 0x00,0x46,0x80,0x26, 0x81,0xa2,0x61,0x18, + 0x9a,0x69,0x36,0x26, 0x86,0x40,0x34,0x0d, 0x09,0x9a,0x1a,0x53, 0xf4,0x8d,0x4d,0xa3, + 0x43,0x46,0x84,0xf5, 0x4d,0x93,0x0d,0x53, 0xf2,0x34,0x93,0xd4, 0x33,0xd4,0x46,0xd4, + 0xf2,0x86,0x4f,0x35, 0x4f,0x26,0x93,0xd4, 0xfd,0x29,0xa7,0x91, 0xa9,0xea,0x6d,0x34, + 0x6a,0x03,0xd4,0x0f, 0x48,0xf5,0x3d,0x41, 0xb5,0x01,0xb5,0x1e, 0xa0,0xc8,0x66,0x9a, + 0x8f,0x48,0x64,0x03, 0x4d,0x08,0x22,0x00, 0x99,0x13,0x00,0x98, 0x46,0x8d,0x31,0x0c, + 0x84,0x60,0xa7,0xa9, 0xe1,0xa0,0x43,0x44, 0x69,0xb4,0xc8,0x99, 0x4f,0x64,0x93,0xd4, + 0xf0,0x69,0xa8,0x7a, 0x51,0xed,0x23,0x14, 0xde,0x85,0x36,0x49, 0xa6,0x9f,0xa4,0x9e, + 0x84,0xc3,0x53,0xd3, 0x50,0xde,0xa8,0x69, 0xa7,0xa3,0x49,0xa6, 0xd0,0x9e,0x93,0x27, + 0xa9,0xa1,0x93,0x4f, 0x4d,0x47,0xa9,0x90, 0xd3,0xd4,0xd1,0xe9, 0xa4,0x32,0x63,0x51, + 0xe5,0x19,0x0d,0x32, 0x01,0xa7,0xa5,0x09, 0x02,0x19,0x35,0x53, 0xf4,0xc2,0x6a,0x60, + 0x9e,0x21,0x4f,0xd5, 0x3f,0x43,0x2a,0x66, 0x93,0xf5,0x27,0xa9, 0xb4,0x27,0xa3,0x29, + 0x9e,0xa7,0xa8,0x4c, 0xd1,0x03,0xd4,0xf4, 0x46,0x9b,0x53,0x4d, 0xb5,0x4c,0x4f,0x53, + 0xd4,0xc8,0xf5,0x1a, 0x32,0x34,0x34,0x62, 0x68,0x3d,0x35,0x0c, 0x86,0x83,0x47,0xa2, + 0x34,0x0d,0x06,0x8d, 0x34,0x68,0xd3,0x46, 0x86,0x80,0xd0,0x68, 0x06,0x8d,0x00,0x34, + 0x00,0x01,0xa0,0x24, 0x48,0x84,0x09,0xa3, 0x40,0x00,0x4d,0x1a, 0x06,0x83,0x41,0x18, + 0x46,0x98,0x4c,0x23, 0x12,0x63,0x46,0x80, 0x09,0xe9,0xa8,0x4f, 0x01,0xa4,0xc4,0xcd, + 0x02,0x61,0x34,0x4f, 0x41,0xb4,0x83,0x13, 0x4c,0x4c,0xa3,0x6d, 0x35,0x09,0x8d,0x14, + 0xf6,0x46,0xa6,0xd4, 0x27,0x94,0xd9,0x36, 0x8a,0x69,0x9b,0x53, 0x12,0x78,0x53,0xd4, + 0xfd,0x34,0x51,0xea, 0x7a,0x8f,0x28,0xda, 0x9e,0xca,0x9b,0x4d, 0x32,0x3d,0x50,0x2b, + 0x45,0xf0,0x78,0x5c, 0x2d,0xb0,0xdb,0xf1, 0x51,0xc3,0x9c,0xc2, 0x2c,0x0e,0xc9,0x87, + 0xef,0x3b,0x6e,0x43, 0x82,0xd6,0x24,0x9a, 0x42,0x64,0x73,0xa4, 0x29,0xb6,0x10,0x50, + 0x26,0xdc,0xde,0x58, 0x05,0x9a,0xf9,0xb1, 0x10,0x98,0xab,0x51, 0x0a,0x18,0x08,0xdc, + 0xb0,0x02,0xed,0xa4, 0x96,0xa2,0x8c,0xea, 0xaa,0x12,0x0a,0xce, 0x10,0x42,0x83,0x98, + 0x45,0x12,0x0e,0x60, 0x0e,0xce,0xbe,0xc1, 0x20,0x6b,0x22,0x8e, 0x4b,0xa5,0x80,0x8b, + 0x32,0x9d,0x3c,0xe6, 0x9a,0x53,0xac,0xe7, 0xbc,0xc9,0xd3,0x61, 0x3c,0x61,0x6a,0xd5, + 0x2a,0x44,0x9e,0xd2, 0xd5,0x6d,0xea,0x4e, 0x4e,0x34,0xb3,0xcc, 0xab,0x22,0xb5,0xbc, + 0x5b,0x89,0xd6,0xc0, 0x43,0xba,0xb5,0xa9, 0x75,0x7c,0xa6,0xfb, 0x67,0x73,0x7d,0x7d, + 0x7f,0x81,0x67,0x33, 0x20,0x0f,0x5e,0x16, 0x17,0x88,0xd0,0x3a, 0x00,0xc2,0x2e,0xb2, + 0x70,0xc6,0x55,0x2a, 0xfd,0x9d,0x8b,0xb3, 0x87,0xd7,0x56,0xaf, 0x5e,0x0a,0xf0,0x10, + 0x84,0x25,0x9b,0xba, 0xd0,0xc9,0x21,0x1a, 0x1d,0x04,0x01,0x4b, 0x7b,0xe7,0x01,0x90, + 0xcb,0x03,0x2a,0x7b, 0xea,0x14,0x2d,0xab, 0x11,0x90,0xcc,0x96, 0x57,0xa0,0x88,0x70, + 0x35,0x59,0x92,0x64, 0x9a,0xc6,0xf2,0x10, 0xc4,0x24,0x85,0x26, 0xd1,0x1d,0x99,0xb3, + 0xe6,0x7b,0x2c,0xdf, 0xe5,0xb0,0xee,0x30, 0xab,0x80,0x39,0x00, 0x39,0x00,0x76,0x1b, + 0xac,0xae,0x37,0x8b, 0xff,0x3f,0xe5,0xb6, 0xe1,0x79,0xd7,0xfd, 0x83,0x2e,0x90,0xc6, + 0x36,0x99,0xeb,0xa8, 0xf9,0xec,0xcf,0x34, 0x7c,0x36,0x1a,0xb6, 0x8c,0xfd,0x44,0x07, + 0xf9,0xfe,0xef,0xdf, 0x89,0xfb,0xbf,0x7b, 0xb5,0x56,0x04,0x0d, 0xdc,0x82,0x07,0x04, + 0x38,0x1d,0x97,0xd4, 0xf3,0x82,0x66,0xb2, 0xf1,0x4b,0x42,0xbd, 0x6f,0xd6,0xf6,0xd7, + 0x17,0x77,0x68,0x8a, 0xd8,0x6e,0x9a,0x77, 0x7a,0x63,0xd7,0x4b, 0xc3,0xd2,0xf7,0x92, + 0x58,0x19,0x51,0x7e, 0xa6,0xe7,0x04,0xfe, 0x46,0x44,0x08,0x08, 0x41,0x60,0x8a,0x8f, + 0xb7,0xc8,0x9d,0xaa, 0xf6,0xec,0xd6,0x27, 0xac,0x3f,0x26,0x8a, 0xb3,0x86,0xad,0x99, + 0xd1,0x30,0xe9,0xba, 0x3c,0xe4,0xc9,0x3a, 0x7f,0x24,0xe1,0xf9, 0xce,0x67,0x88,0x03, + 0x1e,0x97,0x15,0x41, 0x67,0x0e,0x38,0xa5, 0x74,0x48,0x62,0x01, 0x59,0x66,0xd4,0x58, + 0xcb,0x6c,0x8c,0x88, 0x78,0x8b,0xa0,0x76, 0x87,0x14,0x9d,0x59, 0xee,0x1e,0xdc,0x0a, + 0xc4,0x66,0x52,0xb5, 0x4d,0x18,0xfc,0x82, 0x37,0x92,0x47,0x07, 0x39,0x84,0xbe,0x88, + 0x3a,0x60,0xec,0x0b, 0x3a,0x83,0x44,0xd5, 0x76,0x7d,0x14,0xaa, 0x6b,0x99,0xe1,0xa2, + 0x30,0xae,0xe0,0xf3, 0x74,0x06,0xda,0x4c, 0x85,0x82,0x70,0x7f, 0x06,0xf1,0x5b,0x8d, + 0x93,0x69,0x61,0x39, 0x6f,0xfd,0xc5,0x26, 0xb4,0x6e,0xa6,0xc3, 0xb0,0x93,0x04,0xcb, + 0x2b,0xa0,0xa5,0x2f, 0xa0,0x85,0xc5,0x1c, 0xa8,0x03,0xe1,0x8b, 0xa6,0x1b,0x04,0xc8, + 0x0e,0xf5,0x76,0x54, 0x01,0x10,0xf9,0x85, 0xc7,0x21,0x50,0xaa, 0xdd,0xf9,0xee,0xbf, + 0x68,0x0b,0x00,0x10, 0x12,0xdc,0xe8,0x8c, 0x28,0x88,0x04,0x84, 0x7c,0x5c,0x68,0xbe, + 0x35,0xd9,0x42,0x18, 0x2f,0x98,0xd0,0xd6, 0x7c,0xb5,0x1b,0x09, 0xfb,0x0b,0x1d,0xb9, + 0x86,0x05,0x5b,0xb7, 0x1f,0x1f,0x1c,0x93, 0x95,0x4c,0x3c,0x96, 0xb0,0x93,0xd3,0x34, + 0x68,0x9d,0x18,0xde, 0xc6,0x2c,0xb8,0xc8, 0xec,0xe8,0xb7,0x50, 0x55,0x88,0x62,0xf9, + 0x16,0x20,0x49,0x7c, 0x4e,0x9e,0x41,0x82, 0x33,0x34,0x97,0x08, 0xde,0x16,0xdc,0xba, + 0x07,0x16,0xd6,0x22, 0x42,0x7f,0xf8,0x65, 0xa5,0x45,0xed,0x9d, 0x79,0xec,0x99,0xf1, + 0x1a,0x2f,0x6f,0x3b, 0x1b,0xd1,0x9f,0x4d, 0xbb,0xa7,0x73,0x8b, 0x9e,0x77,0xa5,0x5b, + 0xd6,0x6b,0x08,0x0e, 0x8b,0x5d,0xac,0x38, 0x57,0xd9,0xaf,0x46, 0x5d,0x22,0xa1,0xb4, + 0x4e,0xe2,0x9d,0x51, 0x89,0xda,0xc5,0xa2, 0xb5,0x2d,0x11,0x86, 0xe1,0xc2,0x3d,0x9a, + 0x79,0xab,0x31,0x58, 0x51,0x8a,0xb6,0xc6, 0x10,0x1a,0xf4,0x85, 0xd7,0x52,0x67,0x2f, + 0x6d,0x45,0x92,0xbf, 0xc2,0x3c,0x50,0xe3, 0xb5,0xac,0x9c,0x5c, 0x09,0x93,0x32,0x3d, + 0x4f,0x41,0x34,0x9c, 0x58,0x41,0x31,0xce, 0x61,0xae,0x78,0x46, 0xe2,0xce,0x14,0x59, + 0x00,0xbe,0x1b,0xfa, 0xad,0x7a,0x3d,0x28, 0x24,0x69,0x9d,0x2d, 0xae,0x7f,0x3a,0x89, + 0x59,0x4d,0xee,0xa1, 0x29,0xb7,0x6b,0x0e, 0x35,0x2b,0x56,0x13, 0xfb,0x95,0x39,0xbb, + 0xdc,0x0d,0x9d,0xda, 0xf1,0xf5,0x84,0x59, 0xc8,0x9d,0xfe,0xe1, 0x73,0x85,0xe8,0x8e, + 0xe6,0xae,0x05,0x35, 0x20,0x12,0xf6,0x3d, 0x17,0x79,0xce,0xcd, 0x5d,0xb1,0x08,0xb4, + 0x74,0x24,0x31,0xf1, 0x07,0x24,0x33,0x4d, 0x2c,0xb2,0xc1,0x20, 0x6a,0x91,0xa9,0x3e, + 0xed,0x35,0xd9,0x63, 0x67,0xed,0x43,0x6f, 0xff,0x6b,0x0f,0xc1, 0x95,0x2d,0x18,0x49, + 0xdd,0x5a,0x8b,0x62, 0x00,0xaf,0x2d,0x9f, 0x66,0x5d,0x20,0xb5, 0xb5,0x2d,0x96,0xce, + 0x9b,0xf5,0xf4,0xd6, 0xc8,0x3b,0x66,0x08, 0xb2,0x7a,0xb6,0x91, 0xdc,0x51,0x76,0xf3, + 0x54,0xcb,0x41,0x5d, 0x6a,0xe7,0x40,0xd7, 0x5c,0xa5,0xdf,0xb6, 0xc4,0x2f,0x8f,0x29, + 0x71,0xe4,0x22,0xe5, 0x49,0xd9,0x3a,0xd6, 0x6a,0x70,0xa5,0xa7, 0x56,0xd5,0x7a,0x57, + 0x04,0xed,0x98,0x1b, 0x94,0xc0,0x26,0x12, 0xbd,0xbd,0x72,0xcd, 0x37,0xa1,0xcc,0xcb, + 0x70,0xc0,0x5d,0xd4, 0x61,0xc1,0x80,0x5b, 0x3e,0x3d,0x8a,0xce, 0x8c,0xe5,0xc0,0x7e, + 0x09,0xd4,0x2f,0x69, 0xfc,0x4f,0x95,0x73, 0x0c,0x61,0xa2,0xab, 0xd4,0xd6,0xbb,0x79, + 0x85,0xb3,0xa8,0x9a, 0xb0,0x9a,0x50,0x2f, 0x5f,0x25,0xd2,0x54, 0x75,0x18,0x81,0x2c, + 0xd0,0x3d,0xd1,0x4e, 0xd0,0x9a,0x68,0x6f, 0xc0,0xba,0xe6,0x95, 0xd8,0x29,0xe7,0x24, + 0x90,0x84,0x21,0x42, 0xb4,0xdd,0x8e,0x1d, 0xcb,0x43,0x3a,0x9c, 0x51,0x62,0x81,0xbd, + 0x9d,0x01,0xf5,0xd3, 0xf8,0xa0,0xaf,0x5b, 0xc8,0x4a,0xe9,0xed, 0xd2,0x81,0x87,0x36, + 0x43,0xd8,0x18,0x5b, 0x5e,0x57,0x34,0xeb, 0x43,0x0c,0x2c,0x17, 0x96,0x40,0xe0,0x44, + 0xad,0x89,0x6b,0x6f, 0x53,0x06,0x85,0x8c, 0x78,0xaa,0x99,0x38, 0x4a,0x40,0x09,0x05, + 0xad,0x44,0x8a,0xa6, 0x38,0xa5,0xb3,0xb7, 0x1b,0x4b,0xd6,0x06, 0xd6,0x2b,0x0a,0x3e, + 0x16,0x13,0xb1,0xd3, 0x3a,0x97,0xc1,0x41, 0x95,0xa5,0xd0,0xd6, 0xe8,0xbb,0x13,0x06, + 0x06,0x2d,0x42,0x44, 0xb5,0xaf,0x50,0x3c, 0x9d,0x88,0xb4,0x9b, 0x81,0x0e,0x65,0x19, + 0xa8,0x16,0x52,0xc4, 0x53,0x89,0x45,0x39, 0x49,0x02,0x24,0x08, 0x8f,0x84,0x10,0x38, + 0x75,0x6b,0x15,0xb9, 0xc1,0x1c,0xe9,0x09, 0x24,0xf3,0xdc,0x15, 0x6c,0xf6,0xda,0x5d, + 0x6f,0xb9,0xc1,0x5e, 0x1d,0xe5,0x3b,0x37, 0xd6,0x1d,0x4c,0x63, 0x09,0x10,0x66,0xab, + 0x15,0xf8,0x38,0x6e, 0x97,0xa5,0x1b,0x8f, 0x00,0xd3,0xb1,0xdd, 0x89,0xd5,0x42,0xa7, + 0x0e,0x42,0x8c,0xad, 0x7f,0xdb,0x5d,0x23, 0x85,0x8f,0x86,0xd6, 0xb5,0x52,0x0e,0x72, + 0xf8,0x34,0x29,0xd6, 0xde,0x5b,0x56,0x33, 0x38,0x37,0xae,0x38, 0xe2,0x7d,0xbf,0xcd, + 0xc8,0x36,0xa4,0xa7, 0x7e,0x6d,0xea,0x2b, 0x24,0x28,0xc5,0x30, 0x45,0x47,0x0b,0xba, + 0xc9,0x7a,0x9d,0xaf, 0xe2,0xc3,0x9d,0x24, 0x6f,0x81,0x9a,0x6f, 0xb5,0xb4,0x4e,0x6c, + 0x4b,0xeb,0x40,0xfa, 0xde,0x31,0xc6,0x1d, 0xac,0x3c,0x97,0xb6, 0xd0,0xa6,0xea,0xad, + 0x74,0xbb,0x74,0xbb, 0xcc,0x74,0xdf,0xc9, 0xb0,0xd6,0xd9,0x79, 0x8d,0x7f,0x9b,0xe3, + 0x65,0x37,0xc0,0xb3, 0xcb,0x4c,0xf4,0x28, 0x52,0xbe,0x67,0x4a, 0x9a,0x68,0xfc,0x2f, + 0xce,0xb8,0x5f,0xc2, 0xb4,0xaf,0xd7,0xb1, 0x2b,0x3a,0x80,0xcb, 0x65,0x8a,0x0a,0x9d, + 0x31,0x41,0xbb,0x9e, 0xcb,0x4e,0xb8,0x50, 0x7a,0xa4,0x49,0xe2, 0x85,0x31,0x45,0x05, + 0xde,0x30,0x43,0xbf, 0xaa,0xb3,0x33,0x32, 0xa8,0x76,0x8d,0x20, 0x1d,0x49,0x97,0x96, + 0xb9,0x87,0xf4,0x93, 0x90,0xfb,0xfc,0xaa, 0x3b,0xeb,0x56,0xf7, 0x2a,0x12,0x37,0x8e, + 0x24,0x4a,0x19,0xdf, 0x7b,0xe2,0x9b,0x2c, 0x1b,0xac,0x0e,0xa6, 0x3f,0x59,0xd7,0xbc, + 0x0d,0x3c,0xdd,0x4f, 0x6b,0x27,0x35,0x89, 0x27,0x83,0xa4,0xbe, 0x4f,0x2a,0x25,0x99, + 0xe0,0x4a,0xca,0xc0, 0x72,0x62,0xa9,0x36, 0x43,0x0e,0x29,0x84, 0x3a,0xf2,0x78,0xb6, + 0xfd,0xdb,0x30,0x81, 0x60,0x96,0xeb,0x20, 0x40,0x67,0xa0,0x8c, 0x52,0xfa,0xc4,0x43, + 0x6e,0x37,0x6b,0xcb, 0xab,0xd5,0x21,0xb9, 0x79,0x0d,0xde,0xd2, 0x98,0x45,0x76,0x19, + 0x89,0x9a,0x42,0xd9, 0xdc,0x31,0x8c,0x66, 0xaa,0xde,0x9c,0x00, 0x9f,0xa8,0xf1,0x9b, + 0x23,0x54,0x5b,0xee, 0x8e,0xc1,0x48,0x08, 0x65,0x1e,0x23,0x98, 0x5d,0xfc,0x18,0xb1, + 0x53,0xff,0x60,0xf7, 0x02,0xa9,0x93,0x14, 0x0f,0x40,0x69,0x65, 0x08,0x45,0x2a,0xd6, + 0x56,0x47,0x00,0x75, 0xf1,0x2e,0xb5,0xcd, 0x21,0xe3,0x06,0xf7, 0xd7,0xe9,0x12,0x00, + 0xc8,0xc1,0xcc,0xd6, 0x75,0xd5,0xa1,0xb0, 0x69,0x88,0x67,0xd2, 0xea,0xb5,0x19,0x2e, + 0x46,0x27,0xd2,0xa5, 0x4c,0x2d,0x2c,0x0a, 0x27,0xdc,0xf2,0x78, 0x35,0x71,0xdb,0x02, + 0x8e,0x63,0xd9,0xdd, 0xc5,0xf9,0x96,0x21, 0x73,0xfb,0x24,0xae, 0xd0,0x17,0x90,0xcf, + 0xdd,0xb0,0xa0,0xa3, 0x74,0x57,0x16,0xc3, 0x76,0x0c,0x63,0x19, 0x70,0x0c,0xbd,0xd3, + 0x19,0x16,0x82,0x08, 0xfa,0xec,0x33,0xce, 0x6a,0x08,0xe0,0x08, 0x42,0xad,0x71,0x90, + 0x80,0xdb,0xa2,0x0b, 0xdd,0x28,0x4e,0x37, 0x79,0x14,0xea,0x0a, 0xe8,0x0a,0xec,0xd8, + 0x76,0x15,0xcc,0x17, 0x3e,0xab,0x8f,0xbb, 0x98,0x82,0x7c,0x7b, 0x80,0xc6,0x65,0x52, + 0xfc,0xdb,0x0b,0xf9, 0x66,0xe3,0x5c,0x92, 0x05,0x72,0xfe,0x50, 0x22,0x50,0x9f,0x7f, + 0x22,0x11,0xb5,0x83, 0x95,0xd7,0x67,0xcc, 0xdc,0x3c,0xcd,0xa6, 0x4f,0x49,0xab,0x23, + 0x6c,0xf1,0xad,0x5e, 0xe6,0x3b,0xdc,0x78, 0xa6,0xf4,0xbf,0x88, 0x90,0xdb,0x45,0x85, + 0x88,0xe0,0x9e,0x63, 0xc9,0x30,0xa8,0x91, 0xbf,0xda,0x53,0xd2, 0xe7,0xe2,0x2f,0x9a, + 0x5f,0x13,0x58,0x93, 0x4e,0xdb,0x53,0xa9, 0x6d,0x46,0xce,0x84, 0xa0,0xcd,0x25,0x2d, + 0xa2,0xce,0xde,0xb9, 0x91,0x5b,0x18,0x00, 0xb2,0x2b,0x53,0xc4, 0xff,0xcb,0x9f,0xf9, + 0xa1,0x5f,0x4b,0xe1, 0xdc,0xff,0xb9,0x5c, 0x0e,0x0e,0x3b,0x3f, 0x7a,0xac,0x06,0x2d, + 0x25,0xa3,0x1f,0xd3, 0x3e,0x96,0x97,0x87, 0x84,0x58,0x01,0x24, 0x01,0x2b,0x04,0x03, + 0xee,0x5c,0x35,0x98, 0x7a,0x0b,0x5c,0x6a, 0x60,0x99,0xd4,0x40, 0xbe,0xa9,0x4e,0xbc, + 0xe9,0xb5,0xea,0x0b, 0x9a,0x6e,0xc3,0x6c, 0xa9,0x9a,0x11,0xbc, 0xe6,0x23,0xee,0x41, + 0x44,0xfb,0x95,0x03, 0x00,0x69,0x89,0x11, 0xa6,0x84,0x56,0x8e, 0x68,0x17,0x0c,0x8d, + 0x0d,0x6e,0x4e,0x86, 0x49,0x8d,0x1e,0xef, 0x26,0xdf,0x58,0xa7, 0x5d,0x61,0xc4,0x80, + 0x69,0xc1,0x3d,0x9a, 0xe5,0x19,0x5b,0x51, 0xe0,0x59,0x75,0x75, 0x70,0xfe,0x47,0x09, + 0xc2,0x25,0xee,0xaf, 0xcf,0x16,0x4e,0x45, 0xd9,0xa0,0x1c,0xd4, 0x42,0x7c,0xac,0x4a, + 0xf7,0xb6,0x43,0xaa, 0xef,0x33,0x17,0x46, 0x83,0x1f,0x0e,0xf1, 0x9f,0x5e,0x82,0xca, + 0x08,0xb9,0x17,0xfa, 0x7d,0xfa,0x94,0x44, 0xd4,0x02,0x63,0x9c, 0x90,0x19,0x6e,0xbd, + 0x4c,0x75,0x14,0x3c, 0x12,0x5a,0xa0,0xa6, 0xb0,0x20,0x63,0xe2, 0x4a,0xbc,0x74,0x30, + 0x6c,0x56,0xd1,0xa6, 0x25,0x97,0x62,0x0e, 0x13,0xa8,0x00,0x90, 0x2b,0x41,0x40,0x32, + 0x36,0x2c,0x55,0x03, 0x26,0x28,0x04,0xc9, 0x73,0x1b,0x57,0x90, 0x67,0xcf,0x6b,0xd6, + 0xd7,0xe6,0x51,0x9b, 0x58,0x48,0x17,0x7a, 0xce,0x2e,0xdf,0x2a, 0x02,0x5e,0x30,0x60, + 0x04,0x88,0x44,0x1d, 0x24,0xb6,0xb5,0xe3, 0x09,0x4c,0xaa,0x20, 0xde,0x62,0xeb,0x6c, + 0x27,0x03,0x02,0x82, 0xc5,0x68,0xaa,0x61, 0x77,0xf6,0x6e,0xd6, 0xaa,0x73,0x88,0x4d, + 0x5b,0x3e,0xb9,0x9e, 0x8e,0x0a,0x07,0x09, 0x05,0x2b,0x53,0x54, 0x6d,0x25,0x86,0xd5, + 0xd8,0x23,0x36,0x4c, 0x37,0x7c,0xa2,0x55, 0x65,0xbf,0x99,0xbc, 0xdb,0xb0,0x15,0x00, + 0x83,0xa3,0x0a,0x84, 0x0c,0x1f,0x24,0xe6, 0xe0,0xea,0x3e,0x3a, 0x91,0x54,0x9c,0x04, + 0xf4,0xe7,0xb9,0x7c, 0x20,0x14,0xe6,0x2e, 0x9f,0xdc,0xcf,0xa5, 0x78,0x99,0x05,0x43, + 0x85,0xd7,0x7a,0xd1, 0x65,0xfb,0x8c,0xe1, 0x5c,0x07,0xca,0xda, 0x9b,0xa2,0x93,0x06, + 0xe2,0x38,0xec,0xa6, 0xb7,0x97,0xe3,0xa6, 0xaa,0x6f,0x9b,0xeb, 0xfe,0x93,0x49,0x6c, + 0x81,0xb7,0x9f,0x8f, 0x99,0x8c,0x32,0x31, 0x9e,0xf0,0x35,0xe2, 0x93,0x1b,0x2e,0xac, + 0xa5,0x30,0x88,0xd6, 0xcb,0x22,0x78,0xb3, 0x5c,0x13,0xaf,0x9e, 0x49,0x08,0xd4,0xad, + 0x6a,0x59,0x45,0x13, 0x31,0xab,0x68,0xee, 0xf7,0x31,0x9f,0x8e, 0xe2,0x9b,0xd9,0x5b, + 0x9c,0x95,0x2c,0xac, 0x6c,0xa4,0xc4,0x93, 0x25,0x5f,0xdd,0xb3, 0x59,0x64,0xeb,0x54, + 0x9a,0x89,0xae,0x83, 0x06,0xef,0xcb,0xb0, 0x20,0x11,0x94,0x51, 0x19,0x02,0x4b,0x26, + 0x01,0x6b,0xdd,0x08, 0xd5,0x89,0x6a,0x45, 0x93,0x04,0x44,0x0d, 0xa6,0x43,0x3b,0x61, + 0x2a,0x63,0x8e,0x32, 0x05,0xb5,0x62,0x29, 0x1d,0x8a,0x60,0x21, 0x85,0x97,0x8c,0xd1, + 0x43,0x48,0x1b,0x24, 0x38,0x69,0x22,0x18, 0x1c,0xb3,0xa3,0x53, 0x44,0xb7,0x57,0x92, + 0x90,0x69,0xfc,0x0d, 0x4d,0x72,0x66,0xc6, 0x8b,0x52,0x69,0x96, 0x9a,0x2d,0x03,0x4d, + 0x82,0xae,0xd4,0x98, 0x91,0x88,0xc6,0x21, 0x33,0xca,0x22,0x44, 0xc6,0xc5,0xb8,0xb8, + 0x15,0x73,0xb3,0xf4, 0x26,0xb0,0x02,0x25, 0x01,0xd3,0x15,0x6b, 0xb6,0x26,0xd3,0x30, + 0xb2,0x51,0x10,0x5f, 0x90,0x30,0x78,0xc4, 0xa2,0x6c,0xb5,0x5d, 0x2b,0x94,0x03,0x66, + 0x58,0x8b,0x3c,0xba, 0x24,0x60,0x1b,0x5f, 0xf9,0xd1,0x24,0xfb, 0x14,0x49,0xca,0x92, + 0x66,0x82,0x51,0x65, 0xa5,0x46,0xc5,0x36, 0x27,0x52,0x9a,0x27, 0x9b,0x4e,0x65,0xf2, + 0x5e,0x4a,0xfb,0x2c, 0xd5,0x47,0xd1,0xe7, 0x5a,0x03,0x1d,0xf8, 0xcd,0x15,0x5a,0xca, + 0x6b,0x25,0x4b,0x2c, 0x04,0xb4,0x13,0x54, 0x4b,0x50,0x60,0x94, 0xd1,0x07,0x31,0x05, + 0xb0,0xf9,0x43,0xed, 0x76,0x41,0x33,0xe0, 0x16,0xa6,0xc1,0xe8, 0x1b,0x86,0xa3,0xd6, + 0x61,0x6f,0x36,0xf8, 0xf3,0x25,0x59,0x8c, 0x80,0x8f,0x4a,0xaa, 0xb1,0x5c,0xc5,0x56, + 0x8a,0x19,0xc7,0xab, 0x2b,0xae,0x3b,0x13, 0x9c,0x19,0x44,0x94, 0x26,0x97,0xd8,0x67, + 0x21,0x9b,0xbc,0x8e, 0x68,0x03,0xc1,0x4b, 0x89,0x96,0xe5,0xb7, 0x87,0xab,0x15,0xff, + 0x7e,0xf1,0x71,0xcb, 0x35,0xe1,0x5b,0x11, 0xcf,0xa2,0xc1,0x83, 0xa7,0xe1,0xc5,0xbe, + 0xd9,0x3a,0xe4,0xab, 0x6c,0xf8,0xb7,0x37, 0xf2,0xcc,0x48,0xc5, 0xb4,0x2f,0x37,0xb0, + 0xc8,0xd4,0x4f,0xb7, 0x34,0x42,0x26,0x35, 0xaa,0xf8,0x49,0xdb, 0xb5,0x01,0xcc,0xff, + 0xaa,0x93,0x76,0xf8, 0x42,0xf5,0x00,0x18, 0x9a,0x31,0x85,0xc0, 0xe1,0xc3,0x24,0x3b, + 0xf8,0xfb,0xe5,0x9a, 0x9e,0x16,0x73,0xee, 0x86,0xee,0x93,0x14, 0x1e,0x6f,0x2c,0x3a, + 0xdb,0x51,0x5f,0x29, 0x1d,0x72,0xb0,0xe3, 0x39,0xd4,0x48,0x41, 0xe7,0x6c,0x9b,0x33, + 0x9b,0x8e,0xcf,0x05, 0x35,0x3b,0x8d,0x93, 0x1e,0xd1,0xc6,0xec, 0xb9,0xc3,0xe0,0x98, + 0x35,0x5c,0xb6,0x03, 0x75,0x14,0x34,0xa5, 0x83,0xac,0xd7,0xe6, 0x75,0xa7,0xe3,0xa0, + 0x48,0x8a,0x24,0x5a, 0xb0,0x24,0xb5,0xa7, 0x3a,0x4b,0x1d,0x08, 0x49,0x07,0x75,0x3d, + 0xc5,0x8d,0x46,0x4e, 0x6d,0x2a,0x54,0x44, 0xd7,0x2a,0x6c,0x66, 0x0b,0xef,0xdf,0xb8, + 0x5f,0xc3,0x20,0xff, 0x8c,0x75,0xee,0x99, 0x77,0x10,0x56,0xb5, 0xfb,0x67,0x32,0xae, + 0xdb,0x14,0xf6,0x38, 0xd9,0xd7,0x96,0x62, 0x89,0x38,0x95,0x50, 0xeb,0x09,0x20,0xa1, + 0xa0,0xb4,0x07,0x95, 0x1d,0xeb,0x17,0xa5, 0x33,0x3b,0xb5,0xd7, 0xd0,0xa7,0xb7,0x5f, + 0x0b,0x0b,0xb8,0xc8, 0xa4,0xc5,0x68,0x5c, 0x6e,0x8a,0x3f,0x43, 0xf9,0xcf,0x25,0x99, + 0xd9,0xf7,0xb9,0xc2, 0x33,0xa2,0x36,0x93, 0xdf,0xde,0x60,0x63, 0xca,0x5e,0xa8,0xdf, + 0x6f,0x4d,0xc5,0xda, 0x0b,0x04,0xe5,0xe2, 0xbc,0xb5,0x23,0x06, 0xd7,0xbc,0x56,0x49, + 0x6b,0x9b,0xc7,0x6e, 0x45,0xdd,0xce,0xa5, 0x48,0x48,0x3d,0x13, 0xa0,0x90,0xd1,0x8d, + 0x76,0x40,0xd6,0x3d, 0xef,0x17,0x77,0x07, 0xda,0xf2,0xe9,0x86, 0x96,0x9c,0x68,0xe1, + 0xf9,0x50,0xb3,0xb7, 0x9b,0xe8,0xc8,0x9d, 0xb7,0x3e,0xd5,0x1c, 0x68,0xc5,0x24,0x95, + 0x3a,0x4d,0xf0,0xba, 0xba,0xc8,0x4c,0x8d, 0x37,0xc8,0x38,0x20, 0x5e,0x79,0x01,0x4a, + 0x94,0x5a,0x30,0xdb, 0x0a,0x48,0x0a,0xf0, 0x27,0x52,0x79,0x28, 0x64,0x29,0x00,0x97, + 0x3e,0x0e,0x33,0x29, 0x8c,0x1e,0x21,0xc6, 0x39,0x75,0x78,0xd8, 0xcd,0x90,0x50,0x90, + 0xe5,0x8f,0x3d,0x3a, 0x8c,0x34,0xab,0x7e, 0x45,0x68,0xc7,0xaf, 0x59,0x45,0x5d,0xb7, + 0x9e,0x9f,0xde,0x62, 0x33,0xb9,0x02,0xc1, 0xfd,0x22,0x36,0x7c, 0x15,0x00,0x9b,0x74, + 0xc2,0xbe,0xd2,0xd3, 0x39,0x99,0x4c,0xbf, 0x27,0x08,0xee,0xdd, 0x1c,0x2a,0xf2,0x68, + 0xf9,0x70,0x19,0x5b, 0x88,0xbc,0x6a,0xff, 0x7b,0x0a,0xf5,0x85, 0xd8,0x94,0x6a,0xc5, + 0x6c,0x8a,0xc2,0xa5, 0x97,0x22,0xf4,0x08, 0x62,0x54,0x12,0xec, 0x0b,0xa2,0x82,0xfa, + 0x1a,0xbd,0x32,0xb6, 0x73,0x52,0x5d,0xd0, 0x9c,0x5c,0xc3,0x72, 0x10,0x8e,0x45,0xe5, + 0xcb,0x10,0x4a,0x44, 0x00,0x91,0x0b,0x05, 0xa5,0x68,0x4b,0x81, 0xbd,0xb7,0x25,0x51, + 0x58,0x30,0xb0,0x23, 0x3b,0x21,0x3e,0xcc, 0x81,0xc2,0xa6,0x2d, 0x2a,0x21,0xe4,0x24, + 0x69,0x36,0xd8,0x38, 0x96,0xba,0x35,0x52, 0xb0,0xa7,0x8a,0xa3, 0x00,0x30,0xbc,0xd3, + 0xe1,0xaf,0x55,0x96, 0x52,0x39,0x3b,0xae, 0x6d,0x8e,0x25,0x44, 0xab,0x45,0x33,0x2e, + 0xbb,0x0c,0xe8,0x69, 0xd4,0x7a,0xc2,0xcd, 0xc9,0x4b,0xf4,0x9a, 0x22,0x07,0x38,0x45, + 0x12,0xb2,0x02,0x88, 0x40,0x4c,0x30,0x14, 0x28,0x52,0x17,0x78, 0x73,0xf4,0x94,0x6d, + 0x09,0x05,0x11,0x28, 0x37,0xd4,0xde,0xef, 0xaf,0x2f,0x23,0xea, 0xf6,0x31,0xfa,0xdd, + 0xf4,0x29,0x38,0x5a, 0x79,0x35,0x59,0xd3, 0x61,0x84,0x21,0x0b, 0x1a,0x4b,0xb3,0x8e, + 0x36,0xb9,0x28,0x09, 0x88,0xe0,0x41,0xb7, 0xbc,0x75,0x32,0x91, 0x81,0x85,0xf5,0x33, + 0x63,0xb6,0x23,0x36, 0x7d,0xc4,0x59,0xa7, 0xc0,0xb2,0x8e,0xa0, 0xb5,0x61,0xef,0xf0, + 0x1d,0xdc,0x35,0xde, 0xcf,0xc1,0x5c,0x9d, 0x6d,0xd0,0x3c,0xef, 0x7d,0x92,0xd8,0xfd, + 0xda,0xe3,0x11,0x50, 0x8c,0x8b,0x17,0xb9, 0x03,0x39,0x9d,0xdd, 0xcf,0xd1,0xf9,0x72, + 0x89,0xd9,0xef,0x28, 0x20,0xdc,0x94,0x1c, 0xd6,0xfe,0xd7,0xe1, 0x7c,0xf8,0x8b,0xb6, + 0xdc,0x6d,0x1c,0x74, 0x0f,0xf9,0x12,0x8a, 0x88,0x9f,0x47,0x44, 0x47,0xc5,0xb1,0x7b, + 0x12,0x4a,0x62,0x50, 0x42,0x11,0x5a,0x02, 0x85,0x5a,0x55,0x68, 0xda,0x1a,0x9a,0xa9, + 0x89,0x72,0xa5,0x85, 0x50,0x84,0x04,0xb4, 0x78,0xcd,0xb9,0x0f, 0x3b,0x35,0xf9,0x39, + 0x01,0xf3,0xe5,0x01, 0xce,0x75,0xab,0x11, 0x80,0x10,0x08,0x01, 0xb5,0x23,0x0b,0xd1, + 0x72,0x31,0x7c,0xb8, 0x14,0x94,0x1e,0x07, 0x87,0xb1,0x1c,0xce, 0x08,0x01,0xbd,0x86, + 0xca,0x28,0x23,0xd7, 0x95,0x62,0x69,0xb3, 0x2f,0x97,0x4b,0x09, 0x89,0x24,0x83,0xd7, + 0xa2,0x15,0x33,0xc7, 0x18,0xc2,0xaf,0xdf, 0xe8,0xd4,0x33,0xf1, 0xdd,0x02,0x1c,0x97, + 0xd4,0x0d,0x68,0x0b, 0x44,0x4b,0x20,0x18, 0x60,0xd0,0xc5,0x0d, 0xad,0x29,0xc8,0xa5, + 0xc1,0x92,0x85,0x14, 0x91,0x02,0x22,0xfa, 0xee,0x1b,0x6d,0xb1, 0x04,0xd6,0x84,0x90, + 0xea,0x48,0xcd,0x14, 0xcd,0x6f,0x8a,0xfc, 0x8d,0x60,0xdd,0xd9, 0x90,0x04,0xa6,0xf6, + 0x84,0x6d,0xbd,0x28, 0x99,0xef,0xbd,0xff, 0x3f,0xf6,0x9c,0xf5, 0xdf,0x6d,0xb4,0x03, + 0xa4,0x3a,0x6d,0x15, 0x56,0xb4,0x9c,0xc6, 0x1e,0x0e,0x19,0x6a, 0xcd,0x68,0x2c,0xdf, + 0x5b,0x45,0x56,0x73, 0x6e,0xe6,0x97,0xfa, 0xbb,0x2d,0x58,0x8b, 0x03,0x78,0xf3,0x33, + 0x1a,0xe0,0x30,0xda, 0x6f,0xe1,0x6d,0x9a, 0xdf,0xb1,0x74,0xad, 0x1c,0xfd,0xc1,0xb6, + 0xdc,0x1d,0x78,0xd4, 0x9a,0xe8,0x86,0x31, 0xae,0x07,0x59,0x04, 0xf4,0x0a,0xe6,0x0e, + 0xf3,0x4f,0x42,0xc8, 0x3c,0x03,0xc2,0xd8, 0x56,0xa2,0xc2,0x8e, 0xd7,0x73,0x23,0xa1, + 0xb3,0xe3,0x32,0x19, 0x28,0x87,0xe6,0xc2, 0x50,0xc8,0xa2,0x27, 0x26,0x83,0x1c,0x66, + 0x27,0xbb,0x8b,0xb6, 0x52,0xd2,0x36,0x39, 0xdd,0xae,0x5e,0x03, 0x28,0xcb,0x22,0x16, + 0x7c,0x75,0x0c,0x3b, 0x96,0xa9,0xbf,0xd1, 0x7b,0x3e,0xa3,0x90, 0x29,0x3e,0x5b,0x0e, + 0x1b,0x3d,0x7a,0xf6, 0xb5,0x58,0x39,0x9c, 0x8d,0x45,0xbd,0xac, 0xa4,0x85,0xc9,0x34, + 0xa6,0x6d,0x61,0x6f, 0x98,0x15,0x32,0x76, 0x19,0x67,0x58,0x4e, 0x79,0xd8,0xf4,0x9b, + 0x33,0xff,0x94,0xfc, 0x0a,0xf1,0xda,0x73, 0xe5,0x24,0x95,0xe0, 0xc5,0xa8,0xed,0x9f, + 0x10,0x90,0x49,0xaa, 0xd6,0xce,0x4b,0xcd, 0xb9,0xb3,0xbc,0x33, 0xaa,0xb2,0x15,0xc3, + 0x41,0x54,0x25,0x38, 0x9c,0x79,0x38,0x9e, 0x4c,0x4d,0xda,0x67, 0x18,0x1d,0x81,0x49, + 0x3e,0x1e,0xfa,0xa7, 0x5d,0x38,0xe5,0x5b, 0x14,0x0f,0xa9,0x4e, 0x2b,0x20,0x79,0x51, + 0xe4,0x2a,0x51,0x91, 0x06,0xe6,0x07,0x5b, 0xe3,0xae,0xb2,0xe7, 0xca,0x46,0x04,0x89, + 0xf8,0xb2,0x57,0x1a, 0x67,0x3d,0x35,0xa2, 0x65,0xdc,0x6c,0x87, 0xab,0xad,0x8f,0xe4, + 0x32,0x6a,0xaa,0x86, 0xbf,0x8e,0xb0,0x75, 0x83,0x2a,0xc6,0x52, 0xc0,0xc0,0xde,0x57, + 0xed,0xf7,0x30,0x4c, 0xba,0xe0,0xcb,0xdd, 0x4c,0x10,0x94,0x13, 0x8e,0x8d,0xb6,0xb9, + 0x7d,0xb6,0x4f,0x4b, 0x56,0x3c,0xfa,0x5d, 0x85,0x7d,0x3b,0xb1, 0xdc,0x01,0x84,0x31, + 0x1c,0x18,0xfa,0xad, 0x64,0xe1,0x3a,0xf5, 0x77,0x37,0x5d,0xe6, 0xd6,0x7f,0x79,0x80, + 0x8c,0x2d,0x63,0x25, 0x24,0xa6,0xd7,0xcb, 0xff,0xde,0xaf,0x06, 0xed,0x93,0xf7,0x24, + 0x00,0x10,0x09,0x53, 0xda,0x78,0x1c,0x3c, 0x9a,0x69,0x2b,0x30, 0x86,0x90,0x34,0x0d, + 0xe9,0x19,0x03,0x06, 0xd2,0x49,0x82,0x7e, 0x54,0x10,0x45,0x14, 0x92,0xca,0xe6,0xc2, + 0x86,0x24,0x22,0x14, 0x4d,0x8f,0xd9,0x56, 0x06,0x52,0xde,0xea, 0xa3,0x6a,0x71,0x8c, + 0xa6,0x4e,0x65,0x5a, 0xb1,0x8f,0x69,0x95, 0x39,0xde,0x46,0x3f, 0x7a,0x10,0xce,0x84, + 0x19,0xea,0xd7,0x66, 0x28,0x45,0x42,0xab, 0x18,0xb0,0x70,0x41, 0x24,0x62,0x89,0x5e, + 0xaa,0x33,0xe1,0x01, 0x96,0x6e,0x29,0x8b, 0x88,0x47,0xa8,0x4c, 0x69,0xa0,0x94,0xc0, + 0x7b,0xe3,0xa7,0x10, 0x40,0xf0,0x04,0x59, 0x15,0x77,0x74,0x8e, 0x8a,0x75,0xea,0x38, + 0x0b,0x66,0xc0,0xea, 0x6f,0xf0,0x61,0x03, 0xa2,0x24,0xa6,0x87, 0x9c,0x48,0x3b,0x45, + 0x88,0x3e,0x99,0x50, 0x48,0x54,0x34,0x8d, 0xee,0xfa,0x41,0x85, 0x1b,0x49,0x84,0x1b, + 0x98,0x6e,0xa8,0xef, 0x37,0x1a,0xda,0x8f, 0x06,0xb4,0x01,0x3b, 0x0e,0x11,0x11,0x08, + 0x52,0x60,0x4a,0xb9, 0x1c,0xdf,0xaf,0x1c, 0xc4,0xff,0x6c,0x91, 0xfc,0x6c,0x24,0x34, + 0x4d,0xa4,0x86,0xc4, 0x61,0x44,0x20,0xde, 0xd7,0x95,0xec,0xcc, 0x42,0xaa,0x3b,0x18, + 0xa6,0x5b,0x92,0x94, 0x8b,0x8c,0x0f,0xa0, 0xe7,0x9c,0x55,0x8b, 0x9f,0x3e,0x9a,0x9b, + 0x31,0xaf,0x0d,0xd0, 0xc9,0x03,0x0e,0x43, 0x2c,0x2c,0xc9,0xbd, 0x01,0xec,0x8f,0x35, + 0x6c,0x49,0xc6,0xd4, 0x68,0x6a,0x81,0x26, 0x1b,0x36,0xb4,0x34, 0xc3,0xdc,0x6a,0x41, + 0xc1,0x14,0x48,0x02, 0x63,0x52,0x28,0x30, 0x86,0xcf,0x5a,0xc9, 0x11,0x9b,0xa7,0x68, + 0x89,0xf7,0x13,0x93, 0x12,0x08,0x44,0xd7, 0x83,0x8e,0x50,0x7b, 0x93,0xf3,0x28,0x8b, + 0x04,0x34,0x2d,0x52, 0x19,0xed,0x30,0x66, 0x2f,0x61,0x1d,0x11, 0x38,0x72,0x50,0x82, + 0x02,0x24,0x14,0x2c, 0xdd,0x5b,0xb8,0xc0, 0xa1,0x47,0xf3,0x83, 0x11,0x05,0x05,0xfb, + 0x69,0x4a,0x5c,0x47, 0x5e,0x63,0x89,0xbd, 0x7d,0xef,0x21,0x48, 0x69,0x5a,0x0d,0xdb, + 0x3e,0x05,0x1d,0x6d, 0x7b,0x81,0x56,0x32, 0xda,0x27,0x0f,0x56, 0x6d,0x61,0x12,0xaf, + 0x2b,0xe7,0x0f,0x66, 0xc8,0xae,0x81,0xd2, 0x4a,0x64,0xa9,0xfe, 0x65,0x04,0x59,0xd8, + 0x09,0xe3,0x28,0x08, 0xe9,0x8c,0xac,0xca, 0x01,0xdb,0xc4,0x09, 0x25,0x92,0xd2,0x0b, + 0x6d,0x6c,0x7a,0xcf, 0x22,0x5c,0xcb,0x41, 0x53,0x10,0xee,0xac, 0x5d,0x4c,0xc4,0xa2, + 0x89,0x51,0xd5,0xc0, 0xa9,0xd6,0xd3,0x49, 0x3c,0x8a,0xa2,0x4c, 0xb6,0xc6,0xd2,0x24, + 0xd5,0x10,0x55,0x20, 0xe8,0x47,0x13,0xeb, 0x4a,0xa6,0x29,0x33, 0x94,0x0f,0xd4,0xce, + 0xc5,0xa4,0x8b,0x0d, 0x0a,0x16,0x99,0x6c, 0xd4,0x74,0x53,0x49, 0x0b,0xa3,0xaf,0x5e, + 0xc5,0xb4,0xe2,0xeb, 0x3b,0x30,0x22,0x92, 0x96,0xc7,0x9e,0xa4, 0xf4,0x5f,0xbc,0x49, + 0x77,0x8d,0x1d,0x21, 0xb1,0xd3,0x74,0xfd, 0x3a,0x5b,0xcd,0xda, 0xc8,0x0a,0x4c,0x7b, + 0xdf,0x73,0x65,0xd8, 0x82,0xbe,0xab,0xaa, 0x96,0x70,0xcd,0xc0, 0xc9,0x67,0x70,0xee, + 0xc9,0x9f,0xab,0x2e, 0xf8,0x50,0xab,0x46, 0xdd,0x86,0x04,0x36, 0x2a,0x2c,0x0b,0x83, + 0xc0,0x85,0xae,0x44, 0x44,0xe8,0xc4,0xc8, 0xd1,0x64,0x69,0xc0, 0x46,0x6a,0x2f,0x95, + 0x83,0x2f,0x6c,0x15, 0x99,0x22,0xc0,0x01, 0xb9,0x3a,0x92,0x06, 0x54,0x68,0xf0,0xa2, + 0x2a,0x76,0x52,0x84, 0x6f,0xcf,0xaf,0xab, 0x9d,0xe8,0xbe,0xc7, 0x16,0x99,0x8e,0x75, + 0x15,0x12,0xc9,0x45, 0x06,0xe1,0xb5,0x56, 0xbb,0x62,0x6a,0x66, 0xa2,0x01,0xf3,0xfc, + 0x12,0x20,0x94,0xab, 0xc9,0xb8,0x73,0x8c, 0x79,0x4c,0x6e,0x84, 0x92,0xd5,0xb5,0x19, + 0xc0,0x44,0xd8,0x56, 0x58,0xe8,0x84,0x97, 0x8c,0xc4,0x2e,0x35, 0x11,0xad,0x4c,0xc4, + 0xd1,0x33,0x32,0x28, 0xbe,0x43,0x2e,0x3b, 0xdc,0x5e,0xc1,0xec, 0xeb,0xc3,0xe9,0x79, + 0x4d,0xe9,0xa6,0xb1, 0xaf,0x33,0xd0,0x06, 0xc5,0xc2,0x4f,0x45, 0x35,0x69,0x04,0xd5, + 0xc0,0x05,0x08,0x4c, 0x34,0x1b,0x77,0xdc, 0x12,0xa9,0xeb,0xb4, 0xd5,0xb4,0x68,0x18, + 0xab,0xa2,0xa5,0xf3, 0x43,0x5d,0x6a,0x22, 0x88,0xde,0xd1,0xe5, 0xeb,0x29,0xa5,0x53, + 0x17,0x98,0x3b,0x92, 0xcd,0xd4,0xea,0x2d, 0x40,0x2c,0x4d,0x8d, 0x02,0x52,0xc8,0x71, + 0x47,0x49,0x57,0x23, 0x38,0x60,0x8d,0x5b, 0x44,0x3e,0xd9,0x81, 0xb7,0xa2,0x72,0x41, + 0x67,0x4e,0x26,0xb7, 0x98,0xac,0x9f,0x79, 0x2e,0xde,0x58,0xd4, 0xc2,0xf9,0xd5,0xe0, + 0xcd,0x6a,0xdb,0x47, 0x1c,0x30,0x30,0x5c, 0x34,0x8d,0x3b,0xf9, 0x3e,0x14,0x09,0x60, + 0xea,0x74,0xfe,0xde, 0x7a,0x53,0x16,0x0c, 0xf7,0x85,0x59,0x4d, 0x93,0xc8,0x6a,0xe4, + 0xa1,0x07,0xac,0xd2, 0x96,0x9a,0x20,0x42, 0x0e,0x60,0x36,0x46, 0xe9,0x44,0xca,0x69, + 0x15,0x4e,0x89,0x40, 0xc7,0x28,0x2a,0x1e, 0x34,0x32,0x9a,0xa6, 0xa8,0x7d,0xbc,0x81, + 0xb2,0xb7,0x3d,0xa3, 0x13,0x34,0xd5,0xa6, 0x9f,0xbf,0x87,0x06, 0x89,0xb0,0x48,0x1a, + 0x99,0x18,0xc2,0x43, 0x10,0xeb,0x19,0xb2, 0x25,0xcb,0xa6,0x4b, 0x38,0x4f,0x0e,0x91, + 0x40,0x70,0x93,0x14, 0x1b,0xe7,0xac,0x99, 0xb5,0xfb,0x8c,0x5f, 0x97,0x9a,0x98,0xd6, + 0x98,0x1b,0x9b,0xce, 0x16,0x6b,0xe1,0x83, 0x71,0x56,0x25,0x2e, 0xeb,0x3d,0xa6,0x38, + 0x97,0xef,0xe7,0x49, 0x88,0xcc,0xfe,0x4b, 0xa1,0xaa,0x85,0x55, 0x81,0xb4,0xba,0x08, + 0x08,0x08,0x35,0xb5, 0x9e,0x1d,0x4e,0x1e, 0x75,0xdf,0x7b,0x79, 0xb2,0x56,0xd1,0xc9, + 0x1c,0xb4,0x0a,0x11, 0xbb,0x49,0x90,0x02, 0xd9,0x5e,0x17,0xb8, 0xbf,0x69,0x71,0xc5, + 0xe3,0x34,0x0d,0x01, 0x17,0x5a,0xa4,0x1c, 0xa8,0x38,0x94,0x26, 0xcb,0xad,0x9c,0x53, + 0x10,0x4e,0x34,0xe6, 0x3f,0x7d,0x46,0x75, 0x34,0xdf,0xcf,0x39, 0xe3,0x1a,0xcd,0x8f, + 0x48,0xc9,0x05,0xe1, 0x07,0x57,0xcd,0xde, 0x2a,0xb5,0xdb,0x6c, 0xfc,0x0b,0x97,0xa7, + 0x0e,0xd5,0xb1,0x62, 0x14,0x58,0x6d,0x30, 0x85,0x9d,0x0d,0xc1, 0x85,0x88,0xe1,0x5f, + 0x09,0x36,0xec,0x81, 0x4d,0x39,0xa7,0x78, 0x31,0x66,0x5a,0x27, 0x2e,0x7a,0x80,0xbc, + 0xd0,0x8b,0xfc,0x5e, 0xa7,0x1a,0x97,0x4d, 0xb9,0xeb,0x19,0x6c, 0x7c,0xf1,0x70,0x54, + 0x4e,0xf0,0xe2,0x7a, 0xf1,0xa7,0x6c,0xe5, 0xfa,0x4c,0xd8,0xef, 0x77,0x70,0xec,0xe5, + 0xe1,0x19,0x98,0xf7, 0xe8,0xe4,0xd1,0xaa, 0x46,0x8d,0x00,0x29, 0x4a,0x52,0x49,0x09, + 0x6a,0xfd,0x99,0x59, 0xe1,0x72,0x4e,0x3a, 0x29,0xec,0x2f,0xd5, 0xb6,0x8b,0x2d,0x29, + 0xfb,0x08,0x36,0x47, 0x8d,0xeb,0x49,0x23, 0x02,0xa8,0x34,0x5f, 0x8a,0xfe,0x73,0x05, + 0x5d,0xe7,0x3d,0xd3, 0x42,0xcf,0xf9,0xbc, 0x74,0xae,0x7a,0xd9, 0xd4,0xa0,0xef,0x77, + 0x50,0x6a,0xd8,0x55, 0xb8,0xc5,0xef,0x64, 0x1d,0xee,0x9e,0x1b, 0x2f,0x58,0xbc,0xea, + 0x60,0x0b,0xe6,0xb3, 0xec,0x86,0x91,0x9f, 0x2c,0xc0,0xb2,0xdf, 0xf8,0x58,0x8d,0x73, + 0x0a,0xd8,0xd0,0xbc, 0x46,0x16,0x5f,0x50, 0xd5,0xac,0x2e,0x5e, 0x49,0x1a,0x7d,0x54, + 0x7c,0x2a,0xd0,0x08, 0x55,0x34,0x96,0x4d, 0x98,0x12,0xbf,0x61, 0x65,0xa5,0x4b,0x5c, + 0x36,0x4d,0x85,0x4d, 0x69,0xfa,0xd8,0xa5, 0xa2,0x67,0x95,0x08, 0xa1,0x8b,0x86,0xc0, + 0xd0,0xb5,0xb3,0xbc, 0xb4,0xca,0xfc,0x08, 0x46,0xb9,0xba,0x75, 0x61,0x22,0x25,0xb0, + 0xe6,0x1a,0x38,0xf3, 0x64,0xb7,0xfe,0x4e, 0xca,0x8e,0xb7,0xdf, 0xad,0xd2,0x0a,0x72, + 0x35,0xbc,0x87,0x8b, 0x12,0xb2,0x44,0xe0, 0x88,0x16,0x4b,0x6f, 0x61,0x0d,0x4b,0x5b, + 0xc3,0x4a,0x43,0xe2, 0x53,0x95,0x77,0x87, 0x26,0x83,0x25,0xb0, 0x40,0x01,0xb1,0x9f, + 0x1d,0x86,0x97,0x7f, 0xf8,0x69,0x1a,0xe2, 0x4d,0x62,0x37,0x21, 0x07,0xf6,0x20,0x94, + 0x89,0x27,0xc9,0x0b, 0x18,0xf7,0xfa,0xdf, 0x5f,0xbf,0xc8,0xb9, 0x93,0x5e,0x28,0x60, + 0x32,0xb1,0x11,0x64, 0xf4,0x38,0x04,0x12, 0x24,0x59,0x77,0xb5, 0x12,0x72,0x5d,0xac, + 0x9f,0xb8,0xf0,0xbe, 0x5c,0xe3,0xde,0x45, 0xf3,0x2c,0xe2,0xeb, 0xc0,0x71,0xdf,0x61, + 0xdf,0x14,0x35,0xeb, 0x56,0x44,0x54,0x6c, 0x86,0x67,0x78,0xd4, 0x0b,0x90,0x42,0x9a, + 0xf4,0x50,0x64,0x90, 0xd5,0x1c,0xba,0x8a, 0x8e,0x45,0xc2,0x98, 0x47,0x29,0xa0,0xf8, + 0x61,0x45,0x3c,0x89, 0x01,0x78,0x3a,0xaa, 0xb9,0x84,0xa1,0x35, 0x20,0x2e,0xd7,0x8e, + 0xf8,0xf0,0xc7,0x12, 0x1c,0x1d,0x94,0xe9, 0x6e,0xb7,0xf4,0x3e, 0x80,0xf6,0xff,0x7e, + 0xeb,0x9d,0x35,0xf9, 0x15,0x24,0xd8,0xc6, 0x08,0x5f,0x83,0x6d, 0xf9,0x24,0x1f,0x29, + 0x85,0xeb,0xf7,0x0d, 0x23,0xa0,0x67,0x9c, 0xd5,0x76,0x20,0xa1, 0xa4,0x8c,0xf3,0x17, + 0xdd,0x68,0xcd,0x7e, 0x2b,0xef,0x1a,0x31, 0x58,0xa9,0x6b,0x4c, 0xc5,0x9c,0x7d,0x4b, + 0xa9,0x09,0x25,0x6a, 0xab,0x72,0x47,0x3a, 0x5b,0x80,0xe5,0x80, 0x18,0x1c,0xed,0x50, + 0x81,0xb4,0x2c,0xa7, 0x88,0xd5,0x40,0xf9, 0x12,0xea,0x78,0xa3, 0x4a,0x0f,0xe7,0xe8, + 0x47,0x50,0xdf,0x82, 0xd4,0x89,0x1e,0x81, 0x5f,0xbf,0xec,0xff, 0xba,0x7f,0xa1,0x1e, + 0x29,0xa9,0xb7,0x87, 0xd4,0xd7,0xc0,0x20, 0xa8,0x73,0xc0,0xce, 0x20,0x22,0xb1,0x89, + 0x1a,0x62,0xa7,0xee, 0x6b,0xdb,0x35,0x3d, 0x0f,0x51,0x19,0x08, 0x05,0x43,0x74,0xaa, + 0x50,0x50,0xff,0xbb, 0x62,0x51,0x73,0x23, 0x44,0x53,0x8d,0x4f, 0xa3,0x6a,0x1b,0x0b, + 0xed,0xd4,0x46,0xd3, 0xc4,0x31,0x63,0x61, 0xe7,0x53,0x62,0x5d, 0xa1,0x99,0x7a,0xb3, + 0xb3,0x47,0x62,0x51, 0x29,0x5d,0x39,0xb5, 0xc8,0x60,0xc0,0x78, 0xed,0xb0,0xd3,0x31, + 0x15,0x9a,0x0d,0xc3, 0x0d,0xbb,0x48,0x93, 0xd5,0x34,0x8e,0xc5, 0x88,0xec,0xdc,0x9f, + 0x55,0xc6,0x80,0x3a, 0x3a,0x88,0xac,0xd5, 0xfe,0x91,0x77,0x78, 0x81,0xd7,0xf5,0x7e, + 0xd3,0x89,0xb4,0x54, 0x62,0xe8,0x6d,0xdc, 0xec,0xa8,0xc8,0xb5, 0x77,0x5d,0x8b,0xab, + 0x7f,0x15,0x97,0xcf, 0x42,0xf4,0x99,0x70, 0x50,0x30,0xa3,0xc2, 0x94,0x90,0x71,0x98, + 0xad,0x33,0xd6,0xe5, 0xf1,0xe4,0x72,0xfb, 0x2d,0xac,0x80,0xae, 0x9a,0x42,0x39,0xf6, + 0xbe,0x0b,0xf4,0xda, 0x5c,0x4f,0x08,0xd0, 0xc8,0xd6,0xf6,0xd0, 0xaa,0x1b,0xb5,0xc8, + 0x48,0x46,0xec,0x15, 0x6b,0x5c,0xaf,0x1a, 0x82,0x43,0x0a,0x58, 0x83,0x3c,0xc9,0x34, + 0x36,0x2f,0x11,0xc3, 0x03,0x40,0x5d,0x1b, 0x3c,0xcf,0xc3,0x41, 0xac,0x7b,0x9d,0x7c, + 0x0b,0xff,0xdf,0x95, 0xaf,0xdc,0xf6,0xd1, 0x40,0xd2,0x0f,0x1c, 0x1c,0xe3,0xbe,0xf8, + 0xe5,0x7b,0xad,0xd3, 0xdb,0xdf,0x77,0xe6, 0x4b,0x23,0x98,0xa0, 0x64,0x86,0xd0,0x80, + 0x39,0x11,0x19,0xa2, 0xce,0xfc,0xfd,0x06, 0x59,0xcb,0x50,0x3d, 0xf7,0x47,0x5e,0xfe, + 0x65,0xdc,0x41,0x81, 0x2a,0xe4,0x62,0xb9, 0xe7,0x9a,0xf4,0xc6, 0x49,0x80,0x78,0x0f, + 0xcc,0xf7,0x70,0x73, 0xc3,0x9c,0x38,0x5f, 0xc1,0xcb,0xec,0xa4, 0x29,0xb3,0xbe,0x7b, + 0x6d,0x3c,0x59,0x6b, 0xcc,0xea,0x21,0x23, 0xd5,0x66,0x9b,0x5a, 0xa1,0x4b,0x6e,0x41, + 0xbd,0xfd,0xf0,0x2f, 0x93,0x81,0x3a,0x26, 0x56,0xb9,0xa5,0x90, 0x5c,0x62,0x5d,0x43, + 0x08,0x06,0x53,0x7d, 0x29,0x57,0xc3,0xff, 0xed,0xf1,0x32,0x83, 0x1a,0xea,0x52,0x8e, + 0x7a,0xd7,0xaf,0x95, 0x48,0xa7,0xe9,0x40, 0x2b,0xf7,0x61,0x8a, 0x8d,0x3f,0xc4,0xf4, + 0x90,0xd4,0xad,0x9b, 0x7b,0xbb,0x8f,0x5e, 0x2b,0xf4,0xab,0xd2, 0xd7,0x94,0xd2,0xc9, + 0xc1,0x75,0x4a,0xaa, 0xa8,0x83,0x9d,0x66, 0x1e,0x63,0xa2,0x0d, 0x39,0x44,0x96,0xb9, + 0x9c,0x26,0x16,0xae, 0xec,0x9e,0xbd,0xba, 0x28,0xbd,0x88,0x43, 0x69,0xa4,0x59,0x70, + 0x5a,0xcf,0x9c,0xc9, 0x32,0x7a,0x48,0xfc, 0x74,0x43,0xaf,0x08, 0xe9,0xa0,0x22,0x28, + 0x0a,0x44,0x24,0xfe, 0x38,0xaf,0x2f,0xa5, 0xff,0xd9,0xae,0x5a, 0xfd,0xf6,0x13,0xfd, + 0x91,0x7e,0x68,0xb0, 0xf0,0xc1,0xdf,0x95, 0x39,0x42,0xa1,0x49, 0x60,0x7b,0xf5,0x23, + 0x89,0xef,0x2a,0x14, 0x31,0x42,0x7c,0xb6, 0x96,0xec,0xa3,0x97, 0xb7,0xc4,0x38,0x76, + 0xce,0xf3,0x67,0xb1, 0x46,0x1f,0x96,0x8e, 0x31,0x6d,0xc6,0x8e, 0x7d,0xa3,0x37,0x75, + 0x76,0xe4,0x26,0xd4, 0x01,0xde,0xba,0xdc, 0x24,0x08,0xbe,0xb5, 0x10,0x7c,0x7e,0x9d, + 0xd9,0x4f,0xbc,0xe2, 0xb9,0x49,0x0b,0xd4, 0xe1,0xc0,0x5c,0x66, 0xf1,0xa5,0x86,0xcc, + 0x1c,0xbc,0x39,0x25, 0xfb,0xaf,0xbe,0x7c, 0x80,0x5f,0xbb,0xea, 0xe0,0xdf,0x64,0x76, + 0xfe,0xdb,0x6f,0xa4, 0xa5,0xf7,0x26,0x55, 0x6c,0x8b,0x41,0x92, 0xc8,0x60,0xb7,0xc3, + 0xce,0x6a,0xf6,0x50, 0x43,0x3c,0x96,0x2a, 0x59,0x7a,0xc5,0xca, 0x3c,0x4d,0x5d,0xc9, + 0x28,0xf3,0x05,0x12, 0x46,0xec,0xc4,0xb9, 0x94,0xaf,0x55,0xe5, 0xcd,0x41,0x47,0x07, + 0x1e,0x14,0xc3,0x95, 0x66,0xe0,0xb5,0x03, 0x4c,0x7c,0x6b,0x9b, 0xcc,0xc6,0xab,0xe2, + 0xf4,0xac,0x70,0x8f, 0xa2,0xe3,0x38,0xce, 0xb6,0x6e,0x95,0xee, 0xd0,0xbb,0x86,0x40, + 0xcb,0x33,0xe1,0xc7, 0xf6,0xf7,0x91,0x99, 0x43,0xd7,0xdf,0x4a, 0x6b,0x2c,0xa6,0x96, + 0xba,0x38,0x87,0x4c, 0x5f,0x15,0x12,0xf5, 0xd6,0xdf,0x63,0xd7, 0xe6,0x42,0x7c,0xc0, + 0xc5,0x20,0x20,0x7e, 0xb9,0xbf,0xe8,0x7d, 0xe0,0xfc,0x6b,0xfc, 0xaa,0xfd,0xb6,0xe7, + 0x63,0xfb,0x9e,0x45, 0xb8,0xee,0x31,0xbe, 0xd2,0xb7,0xd4,0x9e, 0x54,0x1f,0xdd,0x45, + 0x53,0xe8,0x47,0xce, 0x2e,0x72,0x60,0x9e, 0x54,0xde,0x98,0xc2, 0xa3,0x81,0x67,0xcf, + 0xbf,0x8b,0xc7,0xee, 0xd4,0x54,0x76,0x58, 0x54,0xdb,0x35,0x6c, 0x11,0x9f,0x8b,0x72, + 0xab,0xb6,0x1a,0x27, 0xc7,0xe0,0xe2,0x20, 0x29,0xd1,0x01,0xbc, 0xfb,0x33,0x19,0xc4, + 0x76,0xf4,0x0f,0x74, 0xae,0x6e,0x3f,0x4d, 0x4b,0x89,0x36,0x82, 0x5d,0x41,0x95,0x6d, + 0xae,0x84,0x4b,0x1b, 0x09,0xf1,0x86,0xf8, 0x5e,0xb3,0x5e,0xe3, 0xdd,0x09,0x74,0x95, + 0x35,0x65,0x11,0xc2, 0x09,0x11,0xff,0x74, 0x72,0x0c,0x10,0x11, 0xf7,0xc6,0xc9,0x91, + 0xf9,0xd1,0xfc,0x2f, 0x50,0xc0,0x4f,0xc5, 0x9d,0xe4,0x1a,0x75, 0x9e,0xeb,0xc8,0x8d, + 0x64,0xcf,0x9b,0xe5, 0xa8,0x5c,0xde,0x64, 0x16,0x83,0x87,0xcc, 0xaa,0x49,0x40,0x57, + 0xb7,0x44,0xb3,0x66, 0x9a,0xc5,0x10,0x3e, 0x1e,0xb8,0x7a,0x70, 0xea,0x6c,0xc3,0xe7, + 0x76,0x3a,0x22,0x2e, 0x65,0xcb,0x29,0x93, 0xbd,0xbb,0x7a,0x5e, 0x9b,0x6f,0x82,0x08, + 0x31,0xa3,0x8c,0x4d, 0xdd,0x9e,0x61,0xad, 0xf3,0x45,0x62,0xf3, 0xcd,0x48,0x8b,0x79, + 0x83,0x45,0x3e,0x31, 0xcc,0x84,0x1a,0x5e, 0xae,0xf6,0x10,0x23, 0x23,0x7b,0x34,0x8e, + 0x28,0xcc,0xb2,0x31, 0x76,0xa9,0xb2,0x8f, 0x84,0x19,0x2e,0x75, 0x9a,0x14,0x5b,0x0c, + 0x69,0x0b,0xaf,0x6b, 0xdf,0xb0,0x17,0xe1, 0x18,0x31,0x89,0xa0, 0x6d,0x26,0xc4,0x50, + 0xd4,0x32,0x22,0x4e, 0x0c,0xb0,0x99,0x25, 0xec,0xaf,0x57,0x02, 0xd4,0xaa,0xd9,0x36, + 0x37,0x6e,0xa8,0x94, 0x07,0x26,0x48,0x3a, 0x75,0x60,0x26,0x6b, 0x59,0xf0,0xd8,0x96, + 0x73,0x55,0xa6,0x6d, 0xbb,0xde,0x8f,0x6d, 0xcd,0x77,0x12,0xf3, 0xe2,0xb6,0x82,0x9f, + 0x69,0x24,0x17,0x18, 0x05,0x4c,0x41,0xa1, 0x64,0x55,0x93,0x5b, 0xec,0x84,0xcb,0x1d, + 0xe6,0x15,0x6d,0x03, 0x12,0x35,0xcf,0x61, 0xe6,0x43,0x62,0x3f, 0xe0,0xd0,0x5d,0xb3, + 0x6e,0xc4,0x23,0x19, 0x89,0x07,0x4a,0xcc, 0xa1,0xa5,0x90,0x72, 0x2f,0x0e,0x87,0xb4, + 0x2b,0x7a,0x86,0x04, 0x1f,0x59,0xfa,0x63, 0xcd,0x43,0x21,0x25, 0x69,0xf2,0xa4,0x15, + 0xf3,0xa7,0xee,0xf6, 0xe8,0x02,0x0c,0x9d, 0xb0,0xb8,0x33,0x05, 0x7b,0x2b,0x6b,0xd3, + 0x82,0x55,0x50,0x2e, 0x0e,0x53,0xcf,0xaf, 0xc9,0x24,0x75,0x1d, 0xdc,0x46,0x5c,0xf7, + 0x78,0x4f,0x2b,0xdb, 0x2b,0x83,0xf2,0xe1, 0x60,0x4c,0x84,0xef, 0x25,0x2f,0x2f,0xb0, + 0x61,0x52,0x6b,0x0a, 0xa5,0x62,0x94,0xad, 0xed,0x9e,0xb2,0xd1, 0x90,0xd2,0x05,0x92, + 0xcb,0xd6,0x71,0x9a, 0x30,0x44,0x77,0x09, 0x90,0x3c,0xc6,0x88, 0x6d,0xa1,0x2e,0x1b, + 0x14,0x98,0xd8,0x26, 0xc1,0x24,0x48,0x4f, 0x7a,0x43,0x6d,0xfc, 0xc6,0x01,0x26,0x03, + 0x69,0x08,0xac,0xc2, 0x0f,0x7b,0xc1,0xfb, 0x27,0x25,0xf0,0x4e, 0x49,0x7b,0x2d,0xcd, + 0xaf,0x21,0x87,0x36, 0xb9,0xa7,0xce,0x00, 0x0f,0xec,0x32,0x7f, 0x6e,0x23,0xee,0x3a, + 0x24,0xc4,0x0a,0x11, 0x1f,0x5e,0x4c,0x92, 0x33,0x30,0x21,0xd1, 0x10,0xa8,0x2a,0x0d, + 0x69,0xac,0xcc,0xa5, 0x18,0x34,0x1d,0xd9, 0x64,0xc5,0x99,0x95, 0x61,0x07,0x09,0xb2, + 0x84,0x19,0x18,0xc4, 0xc8,0x28,0x50,0x99, 0xc3,0x95,0xbe,0xe3, 0xf9,0x9f,0x4c,0xdf, + 0xa7,0x9f,0xf1,0x77, 0x3a,0x5f,0xcb,0xf4, 0x7e,0x46,0x9e,0x7d, 0x7c,0x91,0x47,0xc9, + 0xf1,0x59,0x13,0xa1, 0x73,0xd3,0x94,0xb8, 0x16,0xd2,0x40,0xa7, 0x95,0xbb,0xc6,0xf5, + 0x37,0xca,0xf7,0x55, 0xf5,0xeb,0x70,0x0f, 0xd5,0x47,0xe6,0x9e, 0x8e,0xd7,0x23,0x03, + 0xcd,0x34,0x04,0xba, 0x82,0x96,0xba,0x34, 0xa5,0x67,0x03,0x52, 0x19,0x73,0x69,0x50, + 0x08,0x09,0xfb,0x6a, 0x98,0x15,0x53,0x78, 0xba,0xa1,0xfb,0xa8, 0x11,0x1b,0xae,0x28, + 0x2d,0x61,0x17,0x1e, 0x5e,0x00,0x0a,0x03, 0x02,0x12,0x0e,0x6e, 0xe8,0x05,0x22,0x93, + 0x0f,0x17,0x2e,0x8d, 0x97,0x27,0xd9,0xcb, 0xcb,0x3c,0x98,0xfe, 0xad,0x54,0x29,0xb5, + 0xa1,0xf5,0x7d,0xc4, 0xe6,0xba,0x95,0x89, 0x06,0x93,0xb0,0x83, 0xdc,0x3a,0x58,0xad, + 0xb4,0x18,0x3a,0xd8, 0xeb,0x2f,0x27,0x77, 0x18,0x15,0x09,0x28, 0x46,0x8e,0x71,0xdf, + 0x14,0xca,0x24,0x11, 0x0f,0x67,0xed,0xd0, 0x01,0x9a,0xd1,0x70, 0xa4,0xba,0x78,0x06, + 0x2f,0x3f,0xe6,0x1c, 0x98,0xc7,0x90,0x34, 0x45,0x06,0xb9,0x25, 0x42,0x09,0x96,0x59, + 0x3a,0xbf,0xa7,0xda, 0xde,0x3d,0x88,0x73, 0x49,0x7b,0x04,0xd2, 0x19,0xc4,0x44,0xfc, + 0x38,0x75,0x08,0x80, 0xb2,0xc9,0x95,0x49, 0x84,0x91,0x73,0xcd, 0x94,0xeb,0x14,0x8d, + 0x0d,0xb7,0xe6,0xbe, 0x1a,0x84,0x67,0x09, 0x22,0xa0,0xee,0xba, 0x19,0x5a,0xf4,0xe8, + 0xb3,0xb3,0x2e,0x8f, 0x30,0xff,0xae,0xb8, 0xe9,0x31,0x4b,0xdf, 0xdb,0x33,0x45,0xa3, + 0x5e,0x7f,0x1f,0x71, 0x52,0xf9,0x40,0xbe, 0x8e,0xbd,0xe1,0xb0, 0xe7,0xca,0x2f,0x3d, + 0xb1,0x6f,0x32,0x0f, 0x3c,0x88,0x0f,0x4e, 0x40,0xb5,0xf5,0xf0, 0xa4,0xe3,0x6d,0x8c, + 0x14,0x0a,0x3b,0x3b, 0xbc,0x97,0xdb,0xd9, 0x5b,0xef,0xc9,0x98, 0xfb,0x01,0x9e,0xd9, + 0x06,0x2d,0x45,0xf8, 0x89,0xa2,0x96,0xc6, 0x36,0x9e,0x1b,0xff, 0x4f,0x46,0x02,0x9a, + 0x00,0xa5,0x92,0xc0, 0x85,0x91,0xea,0x6e, 0xbe,0xf9,0xeb,0x79, 0x9b,0x3a,0x87,0xab, + 0xee,0xb9,0xac,0x8f, 0x2b,0x52,0x91,0x8c, 0x6b,0x5a,0x23,0x82, 0xc3,0x52,0xd4,0xea, + 0x36,0xbe,0xa4,0xd1, 0xe2,0x4d,0xd6,0x4b, 0xc1,0x27,0x36,0xb4, 0x39,0xe8,0x52,0x29, + 0xec,0x94,0x05,0x01, 0x50,0x6f,0xed,0x48, 0x59,0xa9,0x56,0xa0, 0x85,0x21,0xaa,0x4a, + 0x1c,0x2e,0x5a,0xc9, 0x41,0x36,0xbd,0xf4, 0x1c,0xfd,0x3b,0x8e, 0xea,0x65,0x89,0xf2, + 0xd8,0x75,0xe8,0x7e, 0x87,0xa3,0xfd,0xff, 0x62,0x61,0x92,0x35, 0xbc,0x65,0x9b,0xe2, + 0xb8,0xa2,0x39,0x3e, 0x73,0xbb,0xf8,0xfa, 0xda,0x41,0xba,0x6a, 0x75,0xb0,0xc8,0x1a, + 0x09,0x44,0x5d,0x21, 0x0a,0x73,0x83,0x3d, 0x82,0x4a,0x94,0x69, 0x8d,0x94,0x52,0x0c, + 0x7a,0xd2,0x92,0x86, 0x6f,0x61,0xa5,0x91, 0xc6,0x12,0x9d,0x8d, 0xf4,0xcf,0x63,0x86, + 0xe0,0x9d,0x44,0x4d, 0xd4,0x01,0x92,0xb0, 0x42,0x13,0x3b,0xb4, 0xf9,0x4e,0x3e,0xfd, + 0xc8,0x86,0xaf,0x50, 0x0d,0xa5,0x3b,0xc2, 0x9b,0x29,0x15,0x63, 0xd7,0xda,0x30,0xe3, + 0xf9,0x62,0xb0,0x60, 0x3a,0xdd,0x34,0xa6, 0x95,0xb7,0x11,0x06, 0x0a,0x75,0x8a,0x4c, + 0x3d,0xae,0xc4,0xeb, 0xbe,0xdf,0xeb,0xc0, 0xbc,0x3b,0x0f,0xc1, 0xdc,0xb6,0x38,0x26, + 0x70,0xd3,0xae,0xf7, 0x21,0x82,0xc5,0xfb, 0xe8,0x19,0x7f,0xd1, 0x41,0x8a,0xb4,0xe4, + 0xb1,0xf8,0xfb,0xcf, 0xa3,0x1a,0x2f,0x91, 0x45,0x9d,0x6f,0xb8, 0xcf,0xb1,0xea,0xee, + 0x66,0x75,0x32,0x8d, 0xc7,0x96,0x8f,0xbe, 0x81,0xff,0x33,0xa3, 0x17,0x51,0xb2,0x7c, + 0xaa,0xed,0x34,0x06, 0x5c,0xc6,0xdd,0xa8, 0x86,0xf9,0x3e,0x74, 0xb2,0x36,0x4c,0x13, + 0xe7,0xd1,0xcf,0xef, 0x20,0x64,0xe3,0x3f, 0x1f,0x81,0x6a,0xc7, 0xd0,0xb4,0x32,0x92, + 0x41,0x4e,0x85,0xb5, 0x64,0x7e,0x02,0xa5, 0xa8,0x20,0xfc,0x51, 0xcb,0xfe,0xd6,0xb9, + 0xf8,0x6e,0x19,0xc4, 0x33,0x01,0x90,0xfb, 0xf8,0xcd,0x1d,0xa9, 0x87,0x30,0xfb,0x85, + 0x57,0x83,0xee,0xfa, 0xff,0x6a,0x73,0x8c, 0xbf,0x85,0xee,0x71, 0x3c,0x8c,0xeb,0x97, + 0xd8,0xc6,0xde,0x04, 0xfc,0x47,0x0e,0xc7, 0xe5,0xa1,0x9e,0xe3, 0xb1,0xbf,0x43,0x98, + 0x51,0x57,0xb3,0x0a, 0xe8,0x90,0xad,0xb0, 0xc4,0x8b,0x4a,0xdb, 0x4d,0x20,0x0f,0x8b, + 0xe9,0xf8,0x97,0x13, 0xbf,0x85,0x6b,0x2d, 0x75,0x31,0xee,0x6c, 0xa2,0xdf,0x84,0xe5, + 0x3e,0xeb,0x9f,0x3d, 0x51,0x18,0x92,0x2b, 0xf2,0x4d,0x08,0xcc, 0x8f,0x89,0x64,0xec, + 0x2c,0xc8,0x87,0x8c, 0xac,0x0b,0x68,0x36, 0xf3,0xf6,0x1d,0x9d, 0x7f,0x42,0x59,0xb8, + 0xe4,0xe3,0xcc,0xfb, 0x3b,0x34,0x27,0xed, 0x28,0x34,0x50,0x72, 0x6d,0x57,0xfa,0x3e, + 0x1c,0xbf,0x4b,0xa9, 0x85,0x2c,0xaa,0x23, 0xe7,0x6c,0x20,0x5f, 0x8d,0xae,0xde,0x88, + 0x47,0xfd,0x23,0x98, 0xe0,0xee,0xb8,0xb4, 0xe8,0xfc,0xde,0xf8, 0x3f,0x60,0x6c,0x75, + 0x5d,0x6e,0xef,0x32, 0x7d,0x9e,0xa8,0x80, 0xc6,0x63,0x5f,0xf8, 0xf6,0x7b,0xff,0x60, + 0xf4,0x8c,0x01,0xd2, 0xf4,0x70,0xb8,0x78, 0x88,0x2b,0x48,0xaf, 0x3f,0xfa,0x79,0x2e, + 0x8e,0x23,0xf9,0xc4, 0xb0,0x2b,0x4b,0xd7, 0xa0,0x88,0x52,0x82, 0x4d,0x65,0x0b,0x97, + 0x97,0xad,0x7c,0x24, 0x88,0x11,0xcd,0x6b, 0xa5,0xaf,0xfe,0x93, 0x6e,0xaf,0xb3,0x68, + 0x6c,0x65,0x76,0x28, 0x63,0xf0,0x57,0x02, 0xe5,0xc2,0xb7,0xad, 0x7d,0x60,0xa4,0x68, + 0x1d,0xe2,0x4f,0x50, 0x31,0x55,0x8c,0xd0, 0x6c,0x34,0x85,0xc1, 0xaa,0x79,0x3b,0xa6, + 0xb4,0x13,0xa6,0x02, 0x9b,0xe5,0x8f,0xa4, 0xaf,0xdf,0x64,0x70, 0xda,0xdb,0xc8,0x8e, + 0x43,0x43,0xa2,0x6f, 0x4c,0xdc,0xf2,0x22, 0x9a,0x4b,0x70,0xb1, 0x0c,0x09,0x21,0x00, + 0xa5,0x22,0x10,0x15, 0x53,0xfd,0xaa,0x49, 0x04,0xa0,0x47,0x67, 0xe4,0xe1,0x0b,0xbd, + 0xee,0x76,0x9a,0xee, 0xdf,0x95,0x2f,0x1c, 0xdb,0x8b,0x81,0xec, 0x3d,0xb7,0xd3,0x24, + 0x38,0x56,0x67,0x17, 0x24,0x18,0xdc,0xf6, 0xb4,0xe3,0xa9,0x2a, 0x7f,0x89,0xbb,0x63, + 0xe2,0xc5,0xb6,0x6f, 0x2a,0xd7,0x2f,0x59, 0xa1,0x5b,0x23,0x97, 0xd8,0x1c,0x37,0xb8, + 0x8b,0xc7,0x75,0xea, 0xe8,0xb8,0xdd,0xed, 0x37,0x27,0x40,0x93, 0x78,0xb1,0xd0,0x63, + 0xc4,0x78,0x8f,0x0b, 0x49,0xbf,0xc2,0x64, 0x48,0xd3,0xb0,0xff, 0xd9,0x52,0x4a,0x6e, + 0x9d,0x24,0xbb,0x75, 0x2d,0x47,0x57,0x64, 0x32,0x72,0x23,0xfd, 0x1c,0xb7,0xe2,0x4e, + 0x32,0xd4,0x35,0xf2, 0x09,0x8d,0xae,0x05, 0xca,0xba,0x34,0xee, 0xd4,0xc5,0xc4,0xc8, + 0xe6,0x2d,0xdf,0x43, 0xaa,0x41,0xa5,0x35, 0x6c,0xf8,0x73,0xba, 0xf5,0xd5,0xb5,0xf0, + 0x2c,0xdc,0x52,0x87, 0xfd,0xf9,0x14,0xf7, 0x69,0xe7,0xd8,0xf3, 0x16,0xb3,0x95,0x00, + 0x6f,0xc1,0xc7,0xac, 0x6c,0x7a,0xb1,0x0b, 0xcf,0xf9,0x97,0xbb, 0x41,0x07,0x6b,0x75, + 0x17,0xab,0x52,0xc1, 0x9e,0x3e,0x26,0x4e, 0x9a,0x76,0x3e,0xc1, 0x4f,0x0d,0x94,0xbd, + 0xe4,0x50,0x89,0x51, 0xd3,0xad,0x44,0xc7, 0xeb,0x35,0x91,0x5b, 0x35,0xc8,0xbe,0x84, + 0x39,0x94,0x24,0x7c, 0x06,0x55,0xd1,0x78, 0x75,0x4c,0xc7,0xef, 0xfe,0x51,0x28,0xe0, + 0xd1,0xe2,0xff,0x8c, 0xbd,0x5f,0x69,0x29, 0x03,0x3c,0xd0,0x7d, 0x90,0x30,0xf5,0x2c, + 0x6e,0xff,0x24,0x2e, 0x77,0x7d,0x13,0x3b, 0x51,0x2e,0x93,0xa0, 0x79,0xa2,0xf4,0x42, + 0x53,0xd6,0xe8,0xa5, 0x1c,0x10,0xb4,0x41, 0xa4,0xc5,0xd7,0xcf, 0x78,0x72,0x55,0x3b, + 0x57,0x8e,0xca,0x14, 0x7d,0x8b,0x6c,0x8e, 0x0f,0x31,0x00,0x68, 0x10,0xe7,0x67,0x38, + 0x47,0xd6,0xee,0xe4, 0xf0,0x48,0x26,0x0b, 0x59,0x7e,0x22,0xd5, 0x5d,0x50,0x1e,0xc8, + 0x01,0x02,0xd4,0xa5, 0x80,0x5b,0x8f,0xcb, 0xac,0xfb,0xfc,0x44, 0xdc,0xba,0x67,0x0b, + 0x3b,0xbd,0xe3,0x65, 0xff,0x4f,0xe0,0xf9, 0x20,0x96,0xc3,0xa6, 0xfd,0xbf,0x31,0x4a, + 0xed,0xdd,0xe0,0x06, 0x95,0x4d,0x62,0xa5, 0x70,0x32,0x6c,0xa2, 0x64,0xae,0x47,0xcb, + 0x69,0x1e,0x83,0x28, 0x57,0x02,0xfe,0xc5, 0x99,0x35,0x8d,0x03, 0xe0,0x6a,0xa9,0x8f, + 0x3b,0xde,0x40,0xf0, 0x55,0x79,0xee,0x38, 0x0e,0x04,0xe1,0x87, 0xb6,0xde,0x3f,0xfe, + 0x72,0x7f,0xbe,0xfe, 0xf9,0x71,0x46,0xcc, 0x98,0xc1,0xd8,0xe9, 0x70,0x0e,0x16,0xe6, + 0xa8,0x68,0x84,0xbe, 0xf6,0x7b,0x81,0xee, 0xfc,0xda,0x75,0xdb, 0xbb,0x32,0xae,0x9a, + 0xc8,0x65,0xd7,0x55, 0x17,0x9d,0x64,0x5d, 0xee,0xa9,0x92,0x2b, 0xb5,0x71,0xa2,0xa7, + 0x4c,0x55,0x42,0x87, 0x0a,0xbe,0xfe,0xfc, 0xeb,0x3e,0x05,0xd9, 0xef,0xc7,0x81,0x8d, + 0xe2,0xb8,0xe7,0x86, 0xd4,0x6f,0x8f,0xbf, 0xe7,0x7e,0xe3,0xb4, 0xeb,0x0f,0x94,0x8e, + 0x60,0xde,0xc4,0xb6, 0xa0,0x09,0x17,0x5c, 0x4a,0xfe,0x73,0x43, 0x0e,0x3a,0xd0,0x77, + 0xfd,0xcc,0xd9,0xe8, 0xe4,0xf2,0xba,0xa1, 0x6c,0x94,0x23,0x34, 0x59,0xc5,0x45,0x40, + 0x0f,0xed,0xab,0x11, 0xa5,0xd8,0xf1,0xfe, 0x05,0xe7,0x7c,0xe8, 0x88,0x8d,0x16,0x98, + 0x6a,0x24,0x40,0xfb, 0x37,0x02,0x6c,0x6c, 0x4d,0xa6,0xda,0x64, 0x47,0xb6,0x90,0x69, + 0x52,0x54,0xff,0x0f, 0x53,0xd5,0x70,0xb0, 0x28,0xfd,0x00,0xc6, 0xf0,0x36,0x6d,0x0c, + 0x42,0x54,0x11,0xbb, 0xcb,0x9d,0xaf,0x91, 0xec,0xe0,0xfc,0xeb, 0x9a,0xd2,0x69,0xfb, + 0xd9,0xb0,0x6b,0xec, 0x7d,0x61,0xb7,0xdc, 0x85,0x3a,0x3e,0x3b, 0x0a,0xb4,0x1d,0x7d, + 0xb5,0xd7,0x10,0xfb, 0x97,0x4c,0xd0,0xb9, 0x20,0xcf,0x94,0x06, 0x07,0xb1,0x89,0x42, + 0x5b,0x70,0x28,0xba, 0xe2,0xad,0x8b,0x9a, 0xbb,0xd9,0xdb,0x3f, 0x79,0x3d,0x55,0xbc, + 0xf1,0x19,0xd1,0xdb, 0x5c,0x90,0xb6,0x3d, 0x16,0x4c,0xb2,0x3b, 0x24,0x30,0x1c,0x0f, + 0xe1,0x23,0xa5,0x8a, 0x5c,0xda,0x1f,0xb1, 0x59,0xc5,0x18,0x8b, 0xa4,0x51,0xd8,0x1f, + 0x77,0xce,0xf7,0xd6, 0xb9,0xde,0xcf,0x02, 0x44,0x84,0xe7,0xe3, 0x27,0xc3,0xf4,0x13, + 0x93,0xd3,0x93,0x64, 0x0c,0xb9,0x18,0x41, 0xf1,0x90,0x38,0x1a, 0xdc,0x41,0xe0,0xb5, + 0x8e,0xa2,0xdd,0x57, 0xe4,0x4a,0x85,0xeb, 0x2e,0x3f,0xc6,0xbb, 0x12,0x80,0x73,0xab, + 0x2d,0xd4,0xa4,0x9b, 0x65,0x54,0x17,0xd4, 0x5e,0x38,0xe7,0x8c, 0x3d,0x3a,0x11,0x1a, + 0xee,0x8f,0x91,0xed, 0x36,0xf6,0x15,0xf2, 0x9c,0x63,0x1b,0x93, 0xa5,0xfb,0xee,0xbe, + 0x83,0xea,0x37,0x4f, 0x10,0xb2,0x25,0xc2, 0x8c,0x88,0xef,0x6c, 0x3f,0x48,0x4c,0xbe, + 0xc2,0x71,0x71,0x51, 0xac,0x5d,0xf3,0xd2, 0x8a,0x2b,0x21,0x68, 0x73,0x8e,0x96,0x07, + 0xac,0xca,0x4e,0xb8, 0xbd,0x06,0x55,0xf4, 0xad,0x09,0x64,0x15, 0x0a,0x95,0xd3,0x59, + 0xe6,0xd2,0xbb,0x91, 0xcf,0x4a,0xfc,0x92, 0x17,0x87,0x7c,0x41, 0x25,0x78,0x35,0xd5, + 0x90,0xf6,0x4e,0xa1, 0x6a,0x79,0x47,0x42, 0x19,0xc7,0xca,0x1a, 0x16,0xb1,0x20,0x0f, + 0x09,0xea,0xa1,0x1e, 0xb9,0xc2,0xee,0x9e, 0x2b,0x49,0x34,0x8d, 0xaa,0x24,0xfc,0x8b, + 0x74,0x55,0x97,0x85, 0xba,0x41,0xc7,0xc1, 0xfe,0x15,0xf0,0xc6, 0x52,0xd6,0x98,0xf0, + 0xbe,0x9d,0xc4,0xb3, 0x49,0x99,0xff,0xae, 0xdd,0x63,0x64,0xe7, 0xc4,0x13,0x20,0xe0, + 0xde,0xaf,0x4b,0xea, 0x7d,0x46,0x74,0x15, 0xef,0x96,0xd9,0xcb, 0xbf,0xdc,0xac,0xda, + 0xc3,0xbd,0xd4,0xe6, 0xe2,0x3a,0x68,0x42, 0x37,0x50,0x47,0x93, 0xd0,0x4f,0x3f,0xd3, + 0x5d,0x5f,0x07,0x03, 0x2e,0x55,0x2b,0xbe, 0x57,0xab,0x66,0x1d, 0x1b,0x10,0x5d,0xe2, + 0x68,0x43,0xcb,0xff, 0x38,0xcd,0x78,0xca, 0xfa,0x08,0xe1,0x50, 0x66,0x1b,0xb9,0xea, + 0x69,0x3c,0xbb,0x94, 0x62,0xfd,0x1b,0x48, 0x84,0x41,0x9c,0xbc, 0xf0,0xe4,0xe0,0x39, + 0x81,0xa0,0xf1,0xe1, 0x72,0x02,0x7b,0x2a, 0xe1,0xdc,0x10,0xaa, 0x2c,0x72,0xc8,0x47, + 0x78,0x7d,0xb8,0xc1, 0xc1,0x6a,0x3a,0x97, 0x78,0x3b,0x56,0xb5, 0x53,0x4e,0xf4,0x2d, + 0x76,0xb2,0x42,0x85, 0xed,0xd7,0xd4,0xe2, 0x70,0xb5,0xd5,0xbc, 0xc8,0x36,0x17,0x3b, + 0xf0,0xa5,0x19,0x51, 0xf3,0x13,0xc3,0xc0, 0x33,0xb0,0x4e,0x17, 0x10,0xd4,0xbc,0xda, + 0xd7,0x89,0x49,0x43, 0x70,0x0b,0x38,0x80, 0xe8,0x9e,0x3a,0x01, 0x83,0x4d,0xf3,0x2e, + 0x25,0x26,0x1d,0x3b, 0x9f,0x32,0x82,0x58, 0xed,0x61,0xd7,0x8c, 0xb6,0x7f,0x2b,0x5c, + 0x9b,0x33,0x5f,0xe7, 0xac,0xa1,0x0a,0xd0, 0xc3,0x29,0xa3,0x81, 0xbc,0x20,0xbf,0x61, + 0x43,0x42,0xc7,0x65, 0xb6,0x1b,0x66,0x29, 0x31,0x2c,0x66,0x08, 0xcf,0x3d,0x3b,0x42, + 0xc0,0x62,0x05,0xc7, 0xfd,0xfc,0xf5,0xd5, 0x13,0x51,0x0d,0xac, 0x1d,0xa0,0xab,0xe4, + 0xf1,0x37,0x38,0x21, 0xa0,0xd5,0x00,0x01, 0x1a,0x9b,0x39,0x77, 0x8f,0x2c,0x6d,0xf3, + 0x31,0xd2,0xbd,0xd8, 0x5a,0xa4,0x26,0x2a, 0xa4,0x67,0x8b,0xd8, 0xaa,0x65,0x8d,0x31, + 0xc8,0x44,0x63,0xaf, 0x8d,0xb8,0xe3,0x2f, 0x13,0x9d,0x74,0x51, 0xa4,0xc1,0xba,0x1d, + 0x59,0x91,0x16,0x34, 0xa7,0xfb,0x10,0xfc, 0xf6,0xe8,0x86,0x47, 0xb5,0xbb,0x5e,0x6e, + 0x43,0x0b,0xab,0x3b, 0x6a,0xdf,0xe6,0x5d, 0xfd,0xa0,0x8b,0x06, 0xf9,0xd8,0x33,0xdb, + 0xb7,0x36,0x6b,0xea, 0x0c,0x64,0x55,0xaf, 0xa0,0xbb,0x5b,0x0e, 0x4d,0xff,0xd2,0xc5, + 0x4c,0xde,0x3e,0xa5, 0x3f,0x21,0xad,0x95, 0x26,0xb8,0x11,0xed, 0x2d,0xf3,0x1d,0x98, + 0xd6,0x64,0x35,0x3a, 0x83,0x98,0x27,0x14, 0x8d,0xe9,0xae,0x72, 0x4e,0x5b,0x68,0x39, + 0x25,0x1e,0x76,0x72, 0x58,0x0e,0xa3,0x6f, 0x80,0xc0,0x60,0x14, 0x09,0xa1,0xb3,0x0a, + 0x00,0xb5,0xac,0xb2, 0xdd,0x36,0x1e,0x3d, 0xda,0x6e,0x8a,0xf2, 0xab,0x0e,0x55,0x6e, + 0x9b,0x5a,0xd8,0x15, 0x0d,0xdf,0x02,0xbe, 0x5a,0xda,0x33,0xd5, 0x82,0xed,0x50,0xd0, + 0xdb,0x58,0xcf,0x41, 0xee,0x4b,0x59,0x77, 0x4c,0x34,0xe7,0x05, 0x64,0x80,0xbd,0xcb, + 0xef,0x12,0x34,0x59, 0xda,0xb4,0x1b,0x81, 0x28,0x5d,0xe2,0x6a, 0xd9,0xb7,0x02,0x65, + 0x91,0x42,0xc2,0x02, 0xd6,0x68,0x7c,0x2d, 0x08,0x5a,0xe9,0x5d, 0x0e,0xfa,0x1d,0x42, + 0x81,0x76,0x69,0x0e, 0x5a,0x91,0xe8,0x2d, 0x5a,0x62,0x73,0x1e, 0xb5,0x57,0xc0,0x98, + 0x8b,0x22,0x84,0x35, 0x1f,0xa5,0x8a,0x7b, 0xc8,0x1f,0x72,0x0d, 0x16,0x30,0x53,0xd6, + 0xf1,0x26,0xc3,0x7f, 0x65,0x6b,0x8f,0x6b, 0x7d,0x6c,0x93,0xf3, 0x4e,0x7c,0x2f,0x0d, + 0x13,0xf1,0xea,0x13, 0xfb,0xa6,0x29,0x6a, 0x38,0x66,0x62,0x50, 0x4e,0xbb,0xb4,0x37, + 0x8c,0x34,0xb9,0xe1, 0x50,0x8f,0x42,0xf4, 0x83,0xd5,0x6e,0x77, 0xa8,0x4f,0x03,0x23, + 0x73,0x0f,0xd3,0xe0, 0x9b,0x4c,0x3b,0x78, 0x1c,0x9b,0x0f,0x63, 0xa4,0xdb,0x82,0x59, + 0xd0,0x92,0x92,0xd1, 0x0a,0xf3,0x82,0xc4, 0x5c,0xf4,0xec,0x02, 0x9b,0x84,0x58,0xe5, + 0x06,0x2f,0xf2,0xa8, 0x7f,0x1c,0xf6,0x67, 0x5a,0x79,0x23,0xa4, 0xc6,0x44,0xef,0x96, + 0x76,0xb5,0xd8,0x96, 0xaa,0x5d,0x8f,0xbf, 0x5e,0x65,0xa7,0xf0, 0x59,0x3f,0x1e,0xb4, + 0x24,0x16,0x7f,0x7e, 0x83,0x40,0x21,0x16, 0x41,0xf5,0x3b,0xec, 0x86,0xb8,0xf8,0xea, + 0x65,0xe6,0x40,0x9b, 0x23,0x37,0x22,0x2c, 0x6e,0x05,0x57,0x89, 0x3b,0x77,0xc1,0xc0, + 0x0c,0xb7,0x8b,0x54, 0x5d,0x3c,0xba,0xa8, 0x12,0x57,0xb0,0xe9, 0x29,0xac,0xc9,0x18, + 0xd0,0x58,0x4c,0xf5, 0x18,0x32,0xac,0xbe, 0x71,0x8f,0x71,0x41, 0x8b,0xfb,0xd7,0x80, + 0x86,0x08,0x39,0xaf, 0xc3,0xfd,0x68,0x55, 0xe3,0x73,0xa6,0x0a, 0x1d,0x84,0x77,0x06, + 0x72,0x5e,0x7b,0x2e, 0x9f,0xb1,0xf6,0x3a, 0x87,0xdf,0xe1,0xf9, 0xbb,0x2b,0xdf,0x7f, + 0xae,0x92,0xde,0x2b, 0x63,0x14,0xcb,0x79, 0x09,0x22,0x85,0xe4, 0x49,0xd4,0xea,0x54, + 0x9b,0x64,0xc4,0x22, 0xa9,0x70,0x76,0xe1, 0x9b,0xb6,0xa5,0xc7, 0xdd,0x8f,0x4e,0xe9, + 0x86,0x2d,0x09,0xbb, 0xac,0x6b,0xea,0x0a, 0x62,0x3c,0x6f,0xa7, 0x9d,0x48,0xef,0x8a, + 0xa5,0x8f,0x22,0x42, 0xef,0x2f,0x8e,0xc4, 0x27,0x0c,0x96,0xbd, 0x38,0xab,0xa4,0x7d, + 0xac,0x25,0x91,0xa7, 0xa6,0xcb,0x8e,0xf0, 0xad,0xa9,0x95,0xdd, 0x28,0x9c,0x7b,0xc0, + 0xdc,0x1c,0xde,0x3a, 0xd9,0x2c,0x1a,0xfe, 0x53,0xf7,0x74,0xe1, 0x2a,0x7c,0x3b,0x46, + 0x3a,0x69,0x4f,0x91, 0xc6,0x33,0xf7,0x10, 0xfd,0x6f,0x07,0x38, 0x59,0x74,0x7b,0xda, + 0x8b,0x17,0x3b,0x59, 0x37,0x91,0xb3,0x11, 0x2d,0x09,0x6d,0x14, 0x4e,0x4e,0xcf,0x86, + 0x90,0xcf,0x55,0x97, 0xb4,0xcd,0x35,0xc9, 0xeb,0xc0,0xb2,0x03, 0xae,0x60,0xcc,0x63, + 0x38,0x00,0x69,0x80, 0x51,0xf8,0x41,0x5c, 0xee,0xb7,0x90,0x6a, 0x90,0x05,0x40,0xe8, + 0xb8,0xd0,0xf7,0x6e, 0x89,0xea,0x80,0x42, 0x3a,0x59,0xaf,0x03, 0xa6,0x5e,0x43,0xe3, + 0x79,0x55,0x9a,0xb5, 0x7c,0xcc,0x40,0xe3, 0xef,0x6b,0x23,0x72, 0x17,0x4f,0xe0,0xd2, + 0x0d,0xf3,0x55,0x9f, 0x4b,0x0a,0xa5,0x84, 0xf1,0xc3,0x77,0x04, 0xa5,0x55,0x7f,0x56, + 0xa2,0xfb,0x1f,0xf4, 0xab,0xca,0xa6,0xb3, 0x18,0x7c,0x84,0x5b, 0xf9,0x5a,0xcf,0xe4, + 0x89,0xe9,0xd7,0x71, 0x85,0x63,0xb4,0x6c, 0xea,0xac,0x16,0x6d, 0x75,0xec,0xaf,0xfe, + 0xbf,0x3e,0x3e,0x8c, 0xad,0x2a,0xfa,0x7e, 0x0e,0x8f,0x78,0xe3, 0x48,0xed,0x26,0x4f, + 0x3b,0xdb,0x52,0x39, 0x07,0x77,0x96,0xc4, 0x6f,0x7b,0x7d,0x2a, 0x39,0x82,0xed,0x8d, + 0x2b,0x4c,0xa2,0x84, 0x87,0x5e,0x02,0xab, 0xdc,0xaf,0xdf,0xc3, 0xfe,0x9c,0x9a,0x9c, + 0xfb,0xfc,0xe7,0x42, 0x5d,0x9a,0x8b,0xdd, 0x3c,0x05,0xba,0x48, 0x23,0xc5,0xc3,0xc6, + 0x6b,0xe3,0x17,0x87, 0x0b,0x03,0x13,0xc1, 0xac,0x88,0x08,0x60, 0x6c,0x79,0x5a,0x54, + 0x73,0xf6,0x83,0xd9, 0x66,0x22,0x76,0x5e, 0x2a,0xb1,0xcb,0x3c, 0x44,0x43,0x81,0x6a, + 0x96,0xbb,0x0e,0x4f, 0xb3,0x15,0xdc,0xe9, 0xf7,0xf0,0xfd,0x05, 0x64,0x6e,0x7d,0xe7, + 0x1c,0xb6,0xde,0xfe, 0xd3,0x3c,0xc8,0x57, 0xb9,0xfd,0xe7,0xbc, 0x8b,0xe2,0xcd,0x6f, + 0x82,0x3c,0xb4,0xb8, 0xba,0xe6,0xff,0xb3, 0xde,0x06,0x14,0xaa, 0xcc,0x30,0x4f,0x42, + 0x8f,0x72,0x21,0x72, 0x1d,0x01,0x50,0x7e, 0xc9,0xa8,0xd8,0x93, 0xe8,0x16,0x55,0xfe, + 0xb2,0x67,0x2e,0x69, 0x05,0x0b,0x72,0x46, 0x0c,0x4d,0x04,0x11, 0x05,0x64,0xd7,0x42, + 0x2e,0x3b,0x93,0x8b, 0x32,0x37,0x06,0xc8, 0xcb,0xce,0xaa,0x58, 0x44,0x57,0x4f,0x4c, + 0x0f,0xef,0x9b,0xfd, 0x7b,0x9b,0xd9,0x3f, 0xd1,0x65,0xdb,0x62, 0x32,0xeb,0x0e,0x0f, + 0x5b,0x82,0xb6,0x67, 0xa5,0xd8,0x7a,0x5b, 0x16,0xbe,0x7e,0x7f, 0x6e,0xe0,0x3e,0x18, + 0x97,0xa5,0xc9,0xbf, 0xd3,0xa7,0x2b,0xf3, 0xf3,0x11,0xa4,0x25, 0xd6,0xb7,0xd3,0x58, + 0x41,0xe4,0xb5,0x83, 0x61,0x3d,0xc4,0x2e, 0xbd,0x2b,0x49,0x3d, 0x42,0x92,0x25,0xb3, + 0xe5,0x47,0xd8,0x4e, 0xf3,0xf6,0xef,0xa4, 0x5f,0xb5,0x29,0x57, 0xb7,0x1f,0x8d,0xfa, + 0xbe,0xde,0xff,0x7b, 0x29,0xd4,0x69,0x02, 0xd2,0xd6,0x37,0xe6, 0xd3,0x4a,0xf8,0x75, + 0xb6,0x8f,0x18,0x79, 0x0c,0xeb,0xfc,0x1e, 0x8f,0x85,0xed,0x7b, 0x78,0x57,0x0f,0x9d, + 0x36,0x8f,0xcf,0xb3, 0xb6,0x78,0xe6,0x3c, 0xbe,0xd6,0xb3,0x84, 0xec,0x99,0xf7,0x1b, + 0x22,0xcd,0xc2,0x96, 0x9a,0x39,0xf8,0x4a, 0xc9,0x94,0xce,0x4d, 0x38,0x51,0xe6,0xde, + 0xb9,0x73,0x0a,0x36, 0x03,0x91,0xbd,0xdc, 0x0f,0x13,0x16,0x9d, 0xb7,0x8d,0x09,0x6e, + 0x1f,0x51,0x1f,0x1b, 0x2a,0x89,0x1f,0x23, 0x85,0x1b,0xfe,0x0e, 0xfb,0x78,0xce,0x0e, + 0xde,0xd6,0x83,0xa3, 0xe2,0xd3,0x3b,0x07, 0x3d,0xf0,0x6a,0xda, 0x94,0x8b,0x95,0x6c, + 0x1b,0xe8,0x18,0x10, 0xcd,0x59,0xc1,0xcc, 0x24,0xc3,0xca,0xf0, 0x37,0xca,0xd1,0xf7, + 0x54,0x85,0xdd,0xe8, 0x5b,0x3c,0xf1,0xfa, 0xa3,0xdb,0xf7,0x47, 0x84,0x5c,0x63,0xe6, + 0xea,0xd4,0xac,0x93, 0x97,0x11,0x77,0x5d, 0x0d,0xe4,0xc1,0x88, 0xd0,0xab,0x6b,0xd8, + 0x27,0x4b,0x7f,0x61, 0x0c,0x38,0xfe,0x4d, 0xc2,0xe4,0x63,0x74, 0xf5,0x94,0x10,0x04, + 0x02,0x67,0x7a,0x13, 0x8f,0x4d,0xb7,0xd9, 0x22,0x1f,0xc5,0x5f, 0xea,0x65,0x47,0x07, + 0x9b,0xea,0xb3,0xc4, 0x96,0xda,0x3e,0x6e, 0x76,0x6f,0x15,0x96, 0x66,0xd7,0x78,0xda, + 0x7f,0xc0,0x52,0xb2, 0x7a,0x8b,0xe9,0x95, 0xcd,0x63,0x5d,0xc0, 0x69,0x19,0xb8,0xf0, + 0x3a,0xb9,0x0b,0x4a, 0x81,0xbf,0x5c,0x2e, 0xcf,0xcb,0xd7,0x6b, 0x79,0xc7,0xcc,0xb8, + 0x87,0x2d,0xc4,0xb3, 0xf1,0x1a,0x49,0x51, 0xed,0x31,0xca,0x01, 0xd1,0xbd,0x5b,0x57, + 0xb2,0xa5,0x5f,0x43, 0x77,0x4e,0x11,0x6e, 0x93,0x5c,0x71,0x55, 0x50,0x5f,0x3c,0x49, + 0xa2,0x19,0x1b,0x81, 0x2f,0x7e,0x06,0xb4, 0x78,0xea,0xb6,0x98, 0xf6,0xf4,0xc9,0xe7, + 0x8d,0x5a,0xe1,0x00, 0xda,0x49,0xe1,0x07, 0xec,0xb3,0xb8,0x3b, 0x66,0xfc,0xc3,0x94, + 0x58,0x82,0xfd,0x64, 0x3b,0x88,0xce,0x0e, 0x3d,0x96,0x2e,0x1b, 0x43,0x0e,0x2f,0xe5, + 0x80,0x57,0x6b,0x63, 0x8d,0xf3,0x30,0xdb, 0xb5,0xee,0x34,0xb8, 0x9c,0x1c,0x5d,0x65, + 0x35,0xde,0x7f,0x47, 0x9f,0xcb,0xeb,0x18, 0xae,0xa9,0xc4,0xea, 0x2c,0xb7,0x1b,0x9d, + 0x36,0xad,0xd2,0x9b, 0x27,0x78,0x2c,0x6e, 0x2f,0x52,0xbb,0xeb, 0x0d,0x87,0x8a,0xbc, + 0x24,0x64,0xd5,0xa4, 0xc9,0xe1,0x2c,0xb7, 0x6d,0x95,0xee,0xeb, 0x55,0xb4,0xb4,0x8b, + 0x6a,0xd2,0xdb,0x3a, 0xee,0xa2,0x49,0xf3, 0xd9,0x09,0x9d,0x7d, 0xc6,0x4f,0x5d,0xa2, + 0xd7,0x5a,0xb5,0xc9, 0x7e,0xf9,0xb1,0xe6, 0x51,0xde,0xb3,0x45, 0xa0,0xaf,0xa1,0xd5, + 0x86,0x7b,0xcc,0xf9, 0x5b,0x25,0x36,0xca, 0x2c,0xd8,0xc0,0xb3, 0xe5,0x64,0x76,0x47, + 0x8d,0x12,0xb6,0xb6, 0xb0,0xab,0x9e,0x5f, 0xfc,0xad,0x77,0x8b, 0x99,0x7d,0x10,0x35, + 0xaf,0x39,0xfa,0x38, 0x36,0x14,0x50,0xe9, 0x3a,0xd8,0xfc,0x76, 0x37,0x85,0xd6,0xd3, + 0x71,0x74,0x4e,0x70, 0x06,0x1f,0xd8,0xa2, 0x06,0xe8,0xe7,0x2c, 0x90,0x45,0xc1,0x1f, + 0x4c,0xe1,0xc7,0x1b, 0x0f,0xab,0x61,0xc9, 0x01,0xb8,0xb1,0xe5, 0x27,0x1e,0xa2,0x95, + 0x3f,0x80,0x3f,0x13, 0xae,0x93,0x28,0xbc, 0xbb,0x9f,0x06,0x5a, 0xd3,0x76,0x9b,0x0e, + 0x72,0x42,0xea,0x6f, 0x73,0xcc,0xe6,0xdf, 0xd9,0x5f,0x44,0xec, 0x77,0xaf,0xdc,0x65, + 0xf3,0x6e,0x14,0x9b, 0xde,0xd3,0x04,0x89, 0x1d,0x5c,0xa6,0x6b, 0x07,0x51,0x29,0x2b, + 0x7f,0x60,0x52,0x1e, 0xe0,0xc0,0x60,0x4a, 0x06,0xaf,0xfc,0x8b, 0xd6,0xce,0x16,0xd2, + 0x61,0x8a,0xbd,0xce, 0xda,0x85,0xb8,0xd8, 0x70,0x8e,0xb1,0xb1, 0x71,0x20,0x41,0x0d, + 0xb9,0x9a,0x73,0xeb, 0xdd,0x3f,0xa3,0xab, 0x51,0x46,0xc2,0xe7, 0xc4,0xd5,0x73,0x9d, + 0x0b,0xee,0xe1,0xf2, 0x32,0xd7,0x60,0x16, 0x15,0x14,0xe8,0xf4, 0xe3,0x2b,0xc6,0xa4, + 0x27,0xcd,0x83,0x71, 0xab,0x55,0x6f,0x2c, 0xea,0x57,0xc7,0xa4, 0xe2,0xc4,0x64,0x44, + 0xcb,0x86,0xd0,0x2d, 0xea,0xa5,0x7c,0x2c, 0xb3,0x7b,0xd4,0xbb, 0xc1,0xb3,0x18,0xca, + 0x34,0x4b,0x6f,0xf2, 0xd0,0x11,0x89,0x5f, 0xc6,0x80,0xa6,0x32, 0xe7,0x83,0x80,0xee, + 0x9b,0xec,0x3a,0x3d, 0xea,0x77,0xf9,0x27, 0x93,0x64,0x71,0x38, 0xbb,0x42,0x69,0xc9, + 0xe3,0x69,0xb4,0x76, 0x44,0x6f,0x8c,0xfd, 0x3f,0x1b,0xd4,0x4e, 0xe2,0x37,0xbd,0xfe, + 0xba,0x7f,0x1e,0x55, 0xa6,0x05,0x49,0x79, 0xcf,0x4a,0xe7,0x46, 0x43,0x95,0xf2,0xb8, + 0x54,0x82,0xe0,0x69, 0xaa,0x9e,0x2d,0x8e, 0x8d,0x69,0x22,0xfa, 0x14,0x91,0x6c,0x74, + 0x54,0x38,0xd2,0x61, 0x54,0xbb,0x6a,0x80, 0x4e,0x87,0x46,0xe9, 0xd6,0xb9,0x9d,0xa7, + 0x28,0x7c,0x83,0x89, 0xde,0x89,0xca,0x64, 0xc0,0x7b,0xd3,0xd5, 0xc0,0xa7,0xc8,0x37, + 0xfd,0x9c,0x35,0x66, 0xd0,0xfa,0x3e,0x2a, 0x39,0x06,0x20,0x46, 0xe4,0xde,0x2d,0xc9, + 0x43,0x85,0xe5,0x79, 0x46,0x40,0x71,0xc3, 0x83,0x08,0x4f,0x8e, 0x83,0xb5,0x0a,0xa8, + 0xcd,0x2c,0x9b,0x82, 0x51,0x29,0x29,0x33, 0xab,0x22,0xf1,0x76, 0x0f,0xc1,0x9e,0xae, + 0xa4,0x31,0x3f,0xec, 0x27,0x63,0xcf,0xf7, 0xff,0x07,0x4d,0x62, 0xcd,0x74,0xd7,0x5f, + 0xe6,0x29,0x8b,0xb8, 0x74,0xae,0x7d,0xf1, 0x3b,0x3a,0xf5,0xad, 0xee,0x1a,0x0b,0x45, + 0x8a,0xce,0x72,0x53, 0x2f,0x2c,0x77,0xd7, 0x8b,0xe0,0xbf,0xca, 0x77,0xb9,0xe7,0xcd, + 0x13,0xa7,0xf5,0x92, 0x37,0xbb,0x6f,0xa0, 0x38,0x42,0x99,0xf6, 0xe5,0x99,0x69,0x2c, + 0x20,0x44,0x09,0x08, 0xd0,0x69,0x84,0x5a, 0xac,0xc3,0x62,0x2b, 0x1a,0x4c,0x4c,0xec, + 0x5d,0x2f,0x6f,0xfd, 0x2f,0x38,0x32,0x35, 0xd8,0xba,0x7d,0x45, 0xe5,0x57,0xf6,0x5c, + 0xbb,0x85,0x56,0x57, 0x22,0xe9,0xdd,0x89, 0x88,0xc0,0x1b,0xca, 0xee,0x32,0x45,0xe6, + 0xb8,0x42,0x0f,0x5c, 0xac,0x67,0x94,0xce, 0xf6,0xd1,0x1d,0x7e, 0x5d,0x0b,0xad,0x2d, + 0x15,0xcc,0x29,0x55, 0x6c,0xef,0x46,0x9d, 0x2d,0x3e,0xf9,0xea, 0x03,0x75,0x46,0xad, + 0x47,0xf5,0x7b,0x07, 0xde,0xcb,0x83,0xf4, 0x18,0x6e,0x71,0xc1, 0xcc,0x3a,0x68,0x77, + 0xb9,0x38,0x3d,0x5b, 0x78,0x90,0x34,0xd7, 0x03,0x9b,0x1d,0xd7, 0x89,0xa1,0x5e,0x95, + 0x40,0x1a,0xcb,0xad, 0x96,0x94,0x97,0xf2, 0x14,0x6c,0x39,0xe2, 0xf3,0x39,0x76,0xed, + 0xd6,0x5f,0x29,0xc5, 0x19,0x1b,0xaa,0x1f, 0xdf,0x0e,0x1d,0xae, 0x3d,0x66,0xf8,0xd5, + 0x9c,0x9c,0x86,0x5d, 0xca,0x51,0x6b,0x6e, 0x70,0xe1,0x0c,0x6c, 0x7c,0x76,0x1b,0xfd, + 0xc6,0xea,0xed,0x7d, 0x68,0x5c,0xa0,0xc5, 0xdc,0xb2,0x4d,0x24, 0xd8,0xd8,0x0d,0xaf, + 0xb4,0xd2,0x28,0x7e, 0x91,0xaf,0x43,0x88, 0x31,0x34,0x39,0x08, 0xd8,0x63,0x14,0xe6, + 0xc8,0x1b,0x0e,0xf7, 0x0c,0xb1,0xcc,0x04, 0x03,0x32,0x33,0x22, 0x05,0x09,0x31,0x5e, + 0x8f,0xd2,0xc0,0xc1, 0x53,0x35,0x49,0x7d, 0xfb,0x2d,0xd6,0x43, 0x0a,0xaa,0x76,0x3f, + 0x88,0x37,0x5d,0x9e, 0x76,0xad,0xaa,0x03, 0x34,0x50,0xdb,0x0f, 0x41,0x86,0xd8,0x89, + 0xc3,0x47,0x10,0x2f, 0x2e,0x1a,0x82,0x95, 0x38,0x53,0x6a,0xac, 0xa8,0x37,0xe8,0x57, + 0x7d,0x40,0x9e,0xca, 0x10,0x84,0x5d,0xd2, 0x65,0x9c,0xcb,0xbe, 0xe9,0x57,0xd2,0xee, + 0x56,0xf2,0x6b,0xd4, 0xe1,0x2e,0x06,0x5a, 0xf4,0x16,0x54,0x56, 0x22,0x66,0xd6,0x34, + 0x1b,0x9a,0x7b,0x33, 0x87,0x99,0xf4,0x5a, 0x21,0xa1,0x8c,0x03, 0x86,0xe1,0x90,0xc5, + 0x0c,0x11,0x2f,0x1f, 0x6b,0x17,0xd8,0x8e, 0x13,0x2d,0x75,0x3a, 0x09,0x87,0x7b,0xcd, + 0xc1,0x75,0xa5,0xa7, 0x31,0xc4,0x4f,0xd6, 0x3f,0x68,0x81,0x49, 0x37,0x77,0x31,0x7f, + 0x5a,0x52,0xb2,0x1b, 0x3c,0x04,0xb4,0xc8, 0x97,0xeb,0xa9,0xe9, 0x9d,0x05,0xec,0xf7, + 0x97,0x38,0x83,0x9e, 0xea,0x2b,0x54,0xa0, 0xf9,0x6c,0x2c,0x8a, 0x60,0x28,0xb7,0xd9, + 0xb5,0x27,0xb0,0x85, 0xbf,0x86,0xf2,0xf2, 0x6b,0x31,0x1e,0x4b, 0x81,0xb7,0xc2,0x4f, + 0x6b,0x5d,0xec,0xdc, 0x5c,0xba,0xf0,0xe9, 0xaa,0x9a,0xa3,0x46, 0x78,0x3c,0x54,0xfc, + 0x95,0x1d,0x9f,0x0f, 0x66,0xe6,0x7a,0xf8, 0x14,0xce,0x18,0x15, 0xa9,0xa0,0x54,0xf1, + 0x56,0x98,0x96,0x5e, 0x36,0x03,0xc2,0xce, 0x9c,0xc9,0x24,0xb5, 0xb5,0xe0,0xb7,0x4b, + 0x86,0xef,0x7c,0xb1, 0xcc,0xa8,0x69,0x5d, 0x93,0x4b,0x99,0x79, 0xd1,0x5a,0xe7,0xcb, + 0x0a,0x39,0x8a,0x35, 0xf3,0x48,0xf5,0x5c, 0x04,0xd1,0x9b,0x38, 0x95,0xeb,0x75,0xd3, + 0xc0,0x23,0xc1,0x98, 0x84,0x75,0xb5,0x32, 0x6d,0x2e,0x1e,0xdd, 0xd3,0x4f,0x81,0xa9, + 0xa8,0x1c,0xba,0x86, 0x65,0xf5,0xf3,0x66, 0x0b,0xe5,0xfc,0x2e, 0x1b,0xd5,0x23,0x36, + 0x2a,0xc4,0x7a,0x36, 0x57,0x08,0xe8,0x9f, 0xcb,0xc1,0xed,0x9a, 0x93,0xc4,0xb4,0xbd, + 0x67,0x31,0x75,0x29, 0xe8,0xf1,0xac,0x75, 0xaf,0x5b,0x39,0xbb, 0x05,0x01,0x59,0x3e, + 0x3f,0x09,0xba,0xe2, 0x41,0x0d,0xc7,0xfb, 0xea,0x20,0x59,0x59, 0x99,0x9b,0xad,0x41, + 0xc8,0x10,0x22,0x49, 0x24,0x21,0x33,0x77, 0x16,0xda,0x1c,0x5f, 0x59,0xe4,0x5c,0x33, + 0x61,0x17,0x79,0xd7, 0x3a,0x53,0x42,0x21, 0xea,0xe0,0x8e,0x17, 0xc7,0x58,0x1b,0x78, + 0xa5,0x4d,0xfc,0xfc, 0xea,0x7d,0x9d,0x25, 0xab,0x98,0x27,0x14, 0x0d,0x60,0xc5,0x26, + 0xbf,0x0b,0x3f,0xad, 0x6e,0xd8,0x34,0x1e, 0x0e,0xe9,0x01,0xaf, 0xa5,0x9b,0x61,0x4b, + 0x3d,0xd5,0x72,0xca, 0x5e,0x56,0xa8,0x95, 0x8d,0x34,0xd9,0x34, 0x89,0xeb,0x84,0x12, + 0xc6,0x5e,0x9b,0xa0, 0x66,0xbe,0x3e,0x5e, 0xe9,0x78,0xb0,0xc8, 0x6c,0x06,0x12,0x64, + 0xd3,0x63,0xa7,0x62, 0xc0,0xc6,0x8d,0x62, 0xe8,0x6f,0x33,0xdc, 0x53,0x19,0xfb,0x13, + 0x9d,0x9f,0x09,0x3e, 0x2d,0x48,0xb0,0xc7, 0xfd,0xa2,0x9e,0x3c, 0x15,0xf0,0x8d,0xb2, + 0x32,0xf8,0x36,0x84, 0x46,0x25,0x75,0xcf, 0xe0,0x54,0xa1,0xeb, 0xf0,0x66,0xc3,0x12, + 0x8c,0x9a,0x06,0x3c, 0x2c,0x5f,0x54,0x0d, 0x3e,0x03,0x5d,0x28, 0xd7,0x8a,0x56,0xd4, + 0x5c,0x34,0x95,0x18, 0x86,0x82,0xa3,0x11, 0xc6,0x29,0x5e,0xa5, 0x0d,0x23,0x68,0x8e, + 0xde,0xdc,0x33,0x9d, 0x48,0x1e,0xf7,0xbd, 0x5a,0x7d,0xa4,0xbd, 0xc5,0x87,0xe7,0x44, + 0x51,0x15,0x55,0x2b, 0x88,0x50,0x31,0x35, 0x96,0xe9,0x81,0x4b, 0xcf,0xd3,0xea,0x20, + 0xe9,0x6f,0xa7,0xe2, 0x30,0xc8,0x9f,0xb5, 0x68,0x52,0x7e,0x4b, 0x01,0xc6,0x17,0x5c, + 0x56,0x56,0x9b,0xac, 0xe3,0xa6,0x17,0x96, 0x28,0x2b,0x42,0x74, 0x4c,0xc0,0x6a,0xe9, + 0x11,0xd9,0x96,0x33, 0xb1,0xae,0xce,0xc1, 0x90,0x8a,0xa5,0xb8, 0x64,0xf8,0xcc,0xa3, + 0x40,0xc4,0xa7,0x53, 0x82,0x2b,0xb7,0x59, 0x25,0x11,0x28,0x48, 0xa4,0xa1,0x20,0x6a, + 0x48,0x7e,0x1e,0xf7, 0x15,0xb4,0xfb,0x0d, 0xed,0x16,0xf0,0x63, 0x88,0xe1,0x05,0x53, + 0x0b,0x1d,0x89,0x1a, 0x1b,0x9b,0xec,0x34, 0x4b,0x33,0x72,0xd1, 0x0f,0xf3,0x53,0x90, + 0x3c,0x2f,0xa8,0x83, 0xb4,0x81,0xa8,0x21, 0x28,0x11,0x59,0xfc, 0xb1,0xd8,0xe2,0xde, + 0xe4,0xea,0x49,0x72, 0xf2,0x18,0x08,0xc5, 0x8f,0x01,0x3a,0x45, 0x23,0xc6,0x5d,0xf2, + 0xc9,0x50,0x63,0x56, 0x08,0xa2,0x20,0x18, 0x83,0xbb,0x89,0x56, 0x6c,0xcc,0xa3,0x39, + 0x90,0xe6,0x67,0x5d, 0x64,0x37,0xd9,0x9b, 0x30,0xff,0xf8,0x3a, 0x6e,0xcb,0x48,0x47, + 0x05,0x4a,0x05,0x42, 0x41,0xf8,0x87,0x7d, 0x36,0xfd,0xd4,0x2c, 0x0f,0x2f,0x4d,0x14, + 0xdd,0x55,0x6b,0xc7, 0xea,0x40,0x20,0x75, 0xfa,0x55,0x16,0x16, 0x9f,0xd9,0x6b,0x5f, + 0x09,0x04,0x27,0xcd, 0xb8,0xb2,0x83,0x7a, 0x30,0x3d,0xed,0x10, 0x18,0x71,0x89,0x7b, + 0xbb,0x46,0xd0,0x47, 0x97,0xf9,0x3e,0x2f, 0xd5,0xbe,0xa2,0xf7, 0x83,0x17,0x2b,0x87, + 0xe1,0xc8,0xbc,0xdf, 0xfe,0x89,0xcb,0xd5, 0xdd,0xe8,0xf4,0x6a, 0x6a,0x3d,0xb2,0x01, + 0x65,0x8f,0x9a,0x30, 0x5c,0x7a,0x58,0x4d, 0x06,0x16,0x8b,0x10, 0xc3,0x78,0xba,0x98, + 0xca,0xc9,0x93,0x17, 0x19,0xb5,0x2f,0x16, 0xc9,0x6b,0x51,0x89, 0xc7,0xf6,0x72,0xf5, + 0xea,0xbe,0xdd,0xf9, 0xa8,0xab,0x73,0x47, 0x11,0x8e,0xc5,0x40, 0x67,0x6d,0x61,0x5b, + 0x9f,0x43,0x2b,0xf5, 0x2d,0x4b,0xb0,0xce, 0x44,0x76,0xb1,0x8a, 0x01,0xba,0xb0,0xc2, + 0xab,0x69,0x3e,0xef, 0x75,0xea,0x6a,0xbd, 0x6a,0x46,0xf4,0x5d, 0x27,0x21,0x0c,0xfa, + 0x5b,0xed,0xa7,0x0b, 0x0f,0x13,0xd6,0x69, 0xb5,0x8f,0xe2,0xba, 0x6c,0x8f,0x49,0x7c, + 0xb3,0x5e,0x9c,0xd6, 0x43,0x2a,0x08,0x51, 0x71,0x84,0x30,0xba, 0x80,0x10,0x9a,0x32, + 0x05,0xf9,0x53,0xae, 0x97,0x82,0xa2,0x70, 0x61,0x3d,0x4d,0xd7, 0x17,0x8f,0xb6,0xd3, + 0x79,0x29,0xfa,0xc7, 0x9e,0xc4,0xde,0x91, 0x2f,0xb4,0x4b,0xe1, 0x42,0xc0,0xf8,0x28, + 0x43,0xc7,0x06,0x42, 0x10,0xaa,0x40,0x28, 0x49,0x40,0x09,0x48, 0x5a,0x59,0xf8,0x87, + 0x8e,0x43,0x3e,0xd3, 0xb8,0x17,0x1d,0xb5, 0x59,0x83,0x74,0x31, 0x11,0xa5,0xf2,0x8e, + 0x1e,0xbe,0x2d,0xbb, 0x18,0xf6,0x78,0x44, 0x82,0x40,0xf4,0xd0, 0x59,0xe8,0xd1,0xcf, + 0x90,0x25,0x0b,0x21, 0xf7,0x8f,0xc2,0x37, 0xe6,0xb3,0xd5,0x79, 0xe6,0x68,0x15,0x04, + 0x91,0x29,0x78,0x66, 0xf5,0x67,0x1f,0x54, 0x9f,0x08,0x02,0x24, 0xdc,0x29,0x90,0x04, + 0xaf,0x5a,0xc1,0xa2, 0x42,0x84,0x25,0x4a, 0x2d,0xc1,0x2b,0x54, 0x9c,0xa7,0x36,0x6f, + 0x59,0xe7,0x8d,0x44, 0x8f,0xa3,0xd4,0x91, 0xbd,0x3a,0x1f,0x37, 0x43,0x37,0xef,0x68, + 0x5f,0x2c,0x44,0x00, 0xcd,0xd1,0x41,0x1a, 0xe3,0x18,0x56,0xb0, 0x02,0x61,0x93,0x16, + 0xe6,0x2c,0xf4,0xd5, 0x25,0x52,0x41,0xa4, 0xa3,0x10,0xa4,0x47, 0x2b,0xdc,0xc5,0x89, + 0xae,0x41,0xa0,0xc7, 0x36,0xad,0x4e,0x34, 0x32,0x94,0x02,0xc0, 0x25,0x0d,0xa7,0x81, + 0xf3,0xf3,0x76,0x77, 0x0e,0xc7,0x67,0xbf, 0xa2,0x9a,0xe1,0x40, 0xc1,0xef,0x47,0x39, + 0xc4,0x39,0x4a,0x2c, 0x03,0xa6,0x0c,0xe1, 0x18,0xba,0x09,0xc1, 0xc3,0x00,0x50,0x4d, + 0x0b,0xde,0xbc,0x65, 0x73,0x39,0x9b,0x1c, 0x66,0xe2,0x44,0xb3, 0x55,0xed,0x0c,0x3f, + 0x66,0x06,0x92,0x9d, 0x9f,0x98,0xfe,0x10, 0x1e,0xa0,0xf3,0xf1, 0xe8,0xfe,0x55,0xeb, + 0x81,0x55,0x77,0xa4, 0xd3,0x57,0x2a,0xc1, 0xa0,0xcc,0xc9,0xa9, 0x83,0x32,0x06,0x0c, + 0xa7,0x0c,0xa4,0xaf, 0x23,0x5e,0xf3,0x72, 0x3f,0xf1,0xe6,0x59, 0x5b,0x4f,0xba,0xff, + 0xad,0xfc,0xbf,0xd4, 0xed,0x5e,0xa6,0xc6, 0xb2,0xbc,0x84,0xf1, 0xa7,0x24,0x80,0x07, + 0x66,0xee,0x58,0x79, 0x77,0x1a,0x89,0xc9, 0xa1,0xeb,0x29,0x02, 0x34,0xa1,0x03,0xd7, + 0xf0,0xee,0xfe,0xaa, 0x06,0xfd,0x80,0xd9, 0x0e,0x5a,0xa0,0x35, 0x71,0x74,0x76,0xbd, + 0x45,0x2e,0x96,0x01, 0x19,0xbc,0x12,0x06, 0x18,0x79,0x74,0x7d, 0x46,0x29,0x8d,0x0f, + 0x5e,0xe0,0xc4,0xf4, 0x63,0xcc,0xd7,0xdd, 0xd3,0xdf,0xf8,0x10, 0x23,0x85,0xb6,0xf0, + 0xf2,0x77,0x3e,0x61, 0xf5,0xaf,0xcd,0xed, 0x14,0x50,0x51,0x23, 0x21,0xe1,0xb0,0xec, + 0x51,0x02,0x73,0x97, 0x84,0x9d,0x67,0x7e, 0x44,0xe4,0x93,0xbc, 0x6b,0x7e,0x5b,0xf6, + 0xdc,0xaf,0x55,0x85, 0x3b,0xfe,0xca,0xdc, 0xad,0xd2,0x68,0xc6, 0xde,0x6c,0xfd,0x8f, + 0x91,0x69,0xe6,0xe9, 0x98,0x0e,0xcb,0xcb, 0x2b,0xbe,0x0c,0xaa, 0x4b,0xe7,0xa8,0xd5, + 0xf1,0xc3,0xd8,0xca, 0x09,0x88,0xf5,0xbe, 0xf3,0xe5,0x5f,0x9f, 0xba,0x28,0xa6,0x19, + 0xf1,0xd1,0xf7,0x6f, 0x7a,0xed,0x3a,0x50, 0x33,0x75,0x4c,0x6b, 0x5a,0xd5,0xc8,0xe9, + 0x58,0xfd,0x66,0x6e, 0x24,0xc3,0x47,0x1d, 0x4d,0x33,0xb8,0x69, 0xd2,0xfb,0xb1,0xa6, + 0x4c,0xd4,0x38,0x55, 0x1d,0x39,0x1d,0xb6, 0xe3,0x87,0x95,0x44, 0x53,0x5f,0xcc,0xfe, + 0x29,0x18,0x2d,0xa5, 0xeb,0x35,0xd2,0xfe, 0xd6,0x2b,0x89,0xf4, 0x24,0x51,0xb7,0x71, + 0x26,0x53,0x98,0xef, 0x3d,0x6c,0x5c,0xc8, 0xb6,0xd1,0x7b,0x6b, 0x6f,0x09,0xd5,0xc3, + 0x92,0xf5,0xc8,0xdc, 0x78,0x18,0x2b,0xb6, 0x93,0xb7,0xc7,0xc3, 0xf7,0x33,0x8a,0x63, + 0x88,0x96,0x15,0x95, 0x72,0x0f,0x17,0xda, 0x6e,0x96,0x10,0x0d, 0xe9,0x76,0xf5,0xef, + 0x28,0xe7,0x85,0xbe, 0x99,0x5f,0x93,0x44, 0x41,0xd6,0x21,0xd6, 0xd6,0x51,0x52,0xf5, + 0x34,0xdf,0xb6,0xc5, 0x9f,0x89,0x12,0x6b, 0x7b,0x6d,0xd4,0x92, 0x74,0xe0,0xd6,0x2e, + 0x63,0x57,0xa1,0x83, 0xa4,0xc2,0x79,0xcc, 0xea,0xfe,0x99,0x49, 0x6e,0x04,0x2a,0xd2, + 0xd0,0x05,0x8e,0x91, 0x3a,0x17,0xcb,0xa7, 0x35,0xcd,0x28,0x4e, 0x6e,0xec,0xd6,0x88, + 0xf6,0xcd,0xa6,0xc7, 0x79,0x9e,0x41,0xd8, 0x05,0x0b,0xa1,0x45, 0xba,0xcb,0xe3,0x23, + 0x78,0xa2,0x7b,0xfd, 0x27,0x95,0x22,0x9e, 0x9a,0xac,0x6c,0x24, 0x23,0x0d,0xe0,0x97, + 0x11,0x9f,0x76,0x56, 0xb9,0xf3,0x16,0x30, 0x4a,0x02,0xd2,0xf0, 0x9c,0x2d,0x50,0x64, + 0xe1,0xdf,0xfe,0x3b, 0xf7,0x9a,0xe5,0x59, 0xe4,0x97,0xbf,0x6e, 0xea,0x08,0xb9,0x23, + 0x59,0xaf,0x2d,0x19, 0xaf,0xaf,0xd6,0x4c, 0x93,0x61,0xc0,0xc8, 0xa1,0x94,0x8a,0x8e, + 0x2e,0xf2,0xd2,0xde, 0x67,0x66,0x75,0x57, 0x76,0x59,0x56,0xd7, 0x8d,0x9e,0xf1,0x33, + 0x56,0x4d,0xbc,0x9c, 0xdc,0xf8,0x9a,0x96, 0x14,0x73,0x33,0xaa, 0x6a,0x23,0xbd,0xc6, + 0x45,0xca,0x1c,0x56, 0xb7,0x4f,0x21,0xdd, 0x18,0xaa,0xe8,0xde, 0xe2,0xe6,0x38,0xb6, + 0xc8,0x66,0xb2,0xa9, 0xc9,0x20,0xf4,0xbd, 0x3d,0x6c,0x4d,0x77, 0xf4,0xa6,0x3a,0xdd, + 0x9d,0x7e,0x95,0x59, 0x1a,0xac,0x2f,0x52, 0xc7,0xa7,0xf5,0x73, 0x2f,0xaf,0xe0,0xe3, + 0x92,0x50,0x1f,0x21, 0xbe,0x7c,0x28,0x45, 0xaf,0x21,0x00,0x86, 0x1b,0x63,0xad,0xb2, + 0xbb,0x44,0x52,0x31, 0x26,0x74,0xef,0x4e, 0xe3,0xef,0x1d,0xfa, 0x5a,0xdd,0xbb,0x58, + 0xad,0x3d,0xac,0x66, 0x6a,0xad,0x82,0x06, 0x11,0x1a,0x2f,0xb0, 0x6f,0x9a,0x46,0x7c, + 0xd6,0x67,0x8f,0x47, 0x2b,0x93,0x4c,0x76, 0xf6,0x65,0xa5,0x83, 0x5e,0xf2,0x10,0xca, + 0xe3,0x38,0x80,0xad, 0x7b,0xf6,0x67,0x79, 0x17,0xc9,0x59,0xf3, 0xac,0xfb,0x2b,0xa5, + 0x18,0x96,0xe3,0xaf, 0x98,0xa9,0x67,0x8a, 0x64,0x3b,0xd9,0x98, 0x38,0x28,0xe8,0xac, + 0x5c,0xef,0x51,0x8b, 0x63,0x01,0xee,0x0b, 0xdd,0x4c,0x8b,0xcf, 0x19,0x2e,0x24,0xd5, + 0xf7,0x95,0x54,0x67, 0x76,0xab,0x67,0x94, 0xfb,0x0a,0x8e,0x75, 0xe8,0x4f,0xbb,0x21, + 0x72,0x5d,0x22,0x49, 0xcb,0x73,0xb5,0x27, 0x21,0x4d,0xb1,0x05, 0x12,0xb5,0x5b,0x77, + 0x94,0x9a,0xea,0xaa, 0x86,0xf0,0xad,0x95, 0xa8,0xbd,0x66,0xd0, 0x99,0x2d,0x13,0xe7, + 0xe9,0x8f,0xea,0x2c, 0x03,0xbc,0x85,0x86, 0x85,0x95,0x9d,0xfd, 0x9b,0xc1,0x95,0x2b, + 0x74,0x61,0x20,0x43, 0x0d,0x8b,0xc0,0x57, 0x86,0x7c,0x4f,0x34, 0xb5,0xa3,0x75,0xfa, + 0x2a,0x10,0x69,0x53, 0x68,0xb7,0xca,0x3d, 0x6b,0x2a,0xe6,0xd3, 0x2e,0xe6,0x9b,0x33, + 0x98,0xca,0xf8,0x20, 0x1b,0x5d,0x95,0x68, 0x24,0x47,0x7b,0xce, 0xee,0x2c,0xc2,0xad, + 0x55,0x27,0x81,0xcf, 0xf6,0x97,0x1e,0xa3, 0x33,0x76,0x90,0x97, 0x82,0xc2,0x6c,0xe9, + 0x9c,0xd6,0x9a,0x26, 0x1a,0x33,0x31,0x9c, 0x2d,0x5f,0x77,0x25, 0xc2,0x1f,0x67,0x12, + 0xd9,0x63,0x4a,0x87, 0xa2,0x8a,0x7a,0x0c, 0x8a,0xf2,0xcb,0x94, 0xeb,0x7e,0xd7,0x17, + 0xf4,0x8f,0xe7,0xfd, 0x1a,0x0b,0xa8,0xa8, 0x3d,0x2c,0xea,0x2f, 0xf2,0x32,0xe9,0x46, + 0x7f,0x12,0x91,0x1c, 0xa6,0xc5,0x09,0x28, 0x50,0xd0,0x15,0x37, 0xc7,0xe1,0x67,0xd0, + 0x8b,0x0e,0xa2,0x44, 0xcf,0xa8,0x7a,0xfe, 0x07,0xaa,0x87,0x24, 0x44,0xcd,0x4c,0x14, + 0xa7,0x38,0x50,0x4f, 0x23,0x4f,0x47,0xc3, 0xbd,0xcd,0xbf,0xa6, 0x47,0x63,0x31,0xb7, + 0x4d,0xa4,0x58,0x10, 0xa5,0x61,0x9e,0xe5, 0xdb,0x6e,0x41,0xd0, 0xcb,0xd2,0xd0,0xdc, + 0xca,0xe3,0xdd,0x2e, 0xb9,0xa2,0x6f,0x8f, 0xb6,0x67,0x16,0x56, 0x12,0xe8,0xc6,0xbf, + 0x6d,0x79,0x75,0x90, 0xf3,0x92,0x27,0x72, 0xad,0x74,0x99,0xc2, 0x3e,0x73,0xe3,0x20, + 0x88,0xec,0xdf,0xcf, 0xd1,0x97,0x09,0x28, 0xec,0xcf,0xb8,0x22, 0xa9,0x24,0x7b,0x0a, + 0x7e,0xdd,0x3a,0xec, 0xab,0x33,0xc6,0x34, 0x10,0x7b,0xa5,0xc1, 0xb4,0x1e,0x36,0x56, + 0x51,0x2b,0x95,0xcc, 0x8d,0x59,0xca,0xf3, 0x9b,0xd4,0xc0,0x65, 0xea,0x13,0x97,0x55, + 0x30,0xe8,0x5c,0x95, 0xda,0xb2,0xdb,0x54, 0x0b,0xc3,0x39,0xb7, 0x8a,0x9e,0x51,0xac, + 0xd1,0x98,0xb7,0x8d, 0xb5,0x97,0x02,0xc4, 0x22,0x65,0x5e,0x37, 0xe2,0x9b,0x13,0xdf, + 0x21,0x80,0x43,0xa2, 0xa1,0x5d,0x58,0xba, 0xa8,0x86,0xde,0xaa, 0x71,0x14,0x67,0xc9, + 0xc6,0x2b,0xc2,0x92, 0x50,0x23,0xd4,0x25, 0xc8,0x46,0xf9,0xdb, 0xbe,0x3e,0x4b,0x20, + 0xe1,0xee,0x09,0x13, 0x8c,0xdd,0xf7,0x94, 0x88,0x64,0x40,0xaf, 0xb0,0x54,0xba,0x2a, + 0x6b,0x03,0xf4,0xc3, 0xe3,0x89,0x99,0x20, 0x33,0xbe,0xac,0x87, 0x36,0x5e,0xad,0x82, + 0x55,0xa2,0xf1,0x99, 0x55,0x4b,0x8f,0xce, 0x31,0x24,0x25,0x3d, 0x24,0x24,0x20,0x38, + 0x99,0x0c,0x46,0x31, 0x38,0x4d,0x55,0xdd, 0x4b,0x4b,0x47,0x09, 0xef,0xdd,0x84,0xcd, + 0xdc,0x36,0x93,0xb6, 0xdb,0xec,0xf3,0x2e, 0x20,0x3c,0x0e,0x39, 0x4d,0x60,0x16,0x7b, + 0xf5,0xa9,0x77,0x54, 0x5e,0x3c,0x59,0xd2, 0xad,0xdb,0xfe,0xef, 0x94,0x87,0xf1,0xf7, + 0x82,0x74,0x8f,0xa5, 0x72,0x8d,0x7c,0x5c, 0xde,0xe0,0xef,0x10, 0xcf,0x07,0x5f,0x68, + 0xa5,0x60,0xe0,0xbe, 0x81,0x20,0x22,0xac, 0x66,0x2e,0x8e,0x2b, 0x51,0x64,0xc2,0xb3, + 0x47,0x5b,0x38,0xc6, 0x2c,0xc9,0x58,0x2b, 0x0a,0x72,0xcc,0x99, 0x1c,0x5a,0x11,0xce, + 0xcc,0x35,0xfe,0xd6, 0xbe,0xa6,0x95,0x71, 0x1a,0x8c,0x0f,0xc5, 0xb7,0x5e,0x87,0x0f, + 0x06,0x51,0xa7,0x2e, 0x23,0xe5,0xe2,0x21, 0xdd,0xa7,0xba,0xe9, 0x48,0xbb,0x30,0xfc, + 0x45,0x7e,0xd2,0x77, 0x26,0xa7,0x9f,0x27, 0x1c,0x1a,0x48,0x9d, 0x15,0xf7,0xfa,0xa4, + 0x23,0xbc,0x80,0xf2, 0x1a,0x03,0x4e,0x89, 0xfe,0x7d,0x15,0x48, 0x68,0xcf,0x3f,0xca, + 0xf9,0xb1,0x84,0x1b, 0x90,0x6f,0xb8,0x48, 0x2e,0xc5,0x2c,0x53, 0x00,0x05,0xb1,0x34, + 0xc3,0xfa,0xca,0x3f, 0xfd,0x03,0xa1,0x5b, 0xfe,0xa4,0x70,0xc2, 0x77,0x1a,0x68,0x72, + 0x99,0x3f,0x43,0x70, 0x0f,0x0f,0xa7,0x51, 0xdf,0xf5,0x6c,0x8f, 0xe8,0x65,0xe9,0x22, + 0x04,0x8c,0xdc,0xb7, 0xde,0xe0,0x9a,0x33, 0xd8,0x43,0xb9,0xe0, 0x3e,0xcb,0xe1,0xdd, + 0xf8,0x36,0xd3,0x2a, 0x1e,0x56,0xe6,0x9a, 0x32,0x37,0x76,0x64, 0x2e,0xfe,0x64,0x65, + 0x46,0x15,0xfd,0x11, 0xf0,0x7d,0xdf,0x69, 0xaa,0xc3,0xb1,0x49, 0xd6,0xf2,0xbd,0xfc, + 0x4d,0x3f,0x38,0xa7, 0x13,0xfb,0x5a,0x48, 0x4d,0x3d,0xce,0x43, 0x1a,0x08,0x4c,0x8a, + 0x00,0x4c,0x5a,0x0a, 0xb3,0x0b,0x0e,0x9e, 0x3c,0x2d,0x95,0x78, 0xe6,0x27,0x00,0xf3, + 0xdb,0x48,0xc0,0x49, 0x06,0x0a,0x19,0x46, 0xdc,0x3f,0xe5,0xe5, 0xe4,0x70,0x19,0xf1, + 0x99,0x64,0x0e,0x79, 0x01,0x2d,0xc6,0xde, 0xc9,0x65,0x44,0xc0, 0xfe,0xe6,0x07,0x94, + 0x52,0x60,0xe9,0xb4, 0x2c,0x82,0xae,0x41, 0x48,0x0e,0x35,0x74, 0xc1,0x95,0xe1,0x1d, + 0xa1,0xea,0x47,0x58, 0x17,0x79,0x14,0x90, 0x76,0x1f,0x12,0x13, 0x0d,0x1d,0x6b,0x61, + 0xe9,0xb0,0x22,0x58, 0xa0,0xfc,0xfc,0x06, 0x42,0x3e,0xa9,0x0c, 0xa9,0xdd,0x37,0x2b, + 0x70,0x39,0xf3,0x7b, 0x94,0xfe,0x4f,0xf8, 0x2e,0x66,0x35,0xed, 0x33,0xd3,0x36,0x1d, + 0xd2,0x45,0x9e,0xa1, 0xef,0x8a,0xa3,0xc0, 0x51,0x9e,0x9c,0x84, 0x67,0x5c,0xb2,0x3b, + 0x1b,0xf9,0xcc,0x1c, 0x93,0x45,0xfa,0x0b, 0xd4,0x85,0xde,0xd2, 0xa7,0x25,0xf8,0xff, + 0x4d,0xfb,0x61,0x56, 0x2f,0x1c,0x71,0xb9, 0x3e,0xa6,0x87,0x69, 0x45,0x39,0x67,0xdf, + 0x1a,0x73,0x1a,0x73, 0xc0,0x9b,0x80,0x6e, 0x0d,0x27,0x3a,0x62, 0x48,0xc8,0x2a,0x1c, + 0xc1,0x83,0xf8,0x49, 0x26,0x7f,0xd9,0xc6, 0x5d,0xa9,0x16,0xb3, 0xbc,0x3d,0xf6,0xe3, + 0xcf,0xf6,0x95,0x7d, 0x61,0xa3,0x47,0xdb, 0xf4,0x95,0xeb,0xdc, 0xb6,0x51,0x04,0x82, + 0x77,0xf9,0x8c,0x3a, 0x3d,0x18,0x37,0x93, 0xf8,0x3d,0xeb,0x75, 0xd8,0x56,0xc8,0x01, + 0xa9,0xe7,0x61,0xbf, 0x1e,0x1d,0xcd,0x5e, 0xaa,0x9f,0xdd,0xed, 0x7e,0x24,0x1c,0xda, + 0x22,0xa2,0xfd,0x85, 0x35,0x47,0xa5,0xf5, 0xeb,0x20,0x88,0x95, 0xd6,0xec,0x9e,0x0c, + 0x48,0x54,0xac,0xe3, 0x35,0x7d,0xde,0x3d, 0x86,0xe1,0x72,0x7c, 0xed,0x1e,0xde,0xb7, + 0xd5,0x78,0x41,0x9e, 0xd5,0x6c,0x0e,0xce, 0xe3,0xe2,0x7a,0x36, 0x7e,0xdf,0x72,0x2a, + 0x6d,0x99,0x40,0x2e, 0x02,0x2b,0xef,0xe3, 0x37,0x99,0xf8,0xc1, 0x51,0x68,0x21,0xe6, + 0x8f,0xfe,0x01,0xf8, 0x25,0x16,0x49,0x5a, 0x47,0x14,0xae,0xd8, 0x93,0xd5,0x65,0xb9, + 0x56,0x22,0xcd,0x98, 0x6b,0xae,0xda,0x67, 0x77,0xca,0x7a,0x94, 0xaf,0x82,0xc8,0xae, + 0xc8,0xa0,0x91,0xce, 0x31,0xff,0x0d,0x14, 0x78,0xe9,0xf2,0xcb, 0x16,0x70,0x3d,0xa5, + 0x99,0xee,0x1a,0x3f, 0x3e,0x0b,0x2b,0x3a, 0x17,0x88,0x68,0x7a, 0x8b,0x01,0x23,0xc2, + 0x49,0x06,0x09,0x90, 0x55,0x9c,0x3f,0x56, 0x0d,0x80,0x4f,0xfa, 0x94,0xc0,0x03,0xad, + 0x72,0x83,0x2e,0x26, 0x88,0x39,0x57,0x58, 0xbf,0x05,0x94,0xb7, 0x77,0x4d,0x8c,0xd8, + 0xb9,0x07,0x3a,0x3c, 0x65,0x1a,0x34,0xc3, 0x02,0x17,0xd2,0xa9, 0xf9,0xbd,0x52,0x01, + 0x80,0x27,0xa6,0x7a, 0x95,0xc3,0x53,0x6d, 0xdf,0xd3,0x6c,0x1c, 0x66,0x3f,0x4c,0xcb, + 0xf7,0xb7,0xa8,0xd6, 0xfb,0x2c,0xfc,0x37, 0x02,0xe2,0x12,0x08, 0x10,0x15,0x27,0xa0, + 0x1a,0x84,0x00,0xa6, 0xc5,0x11,0x0a,0x06, 0xd8,0xdc,0x7d,0xf5, 0xf6,0xc2,0xdb,0x5e, + 0x75,0x1b,0xc8,0x42, 0x2b,0xc8,0xc8,0xe8, 0x88,0x0b,0xee,0x72, 0x32,0x9d,0xd1,0xd7, + 0x5c,0x65,0x6b,0xe9, 0xcc,0x4a,0x64,0x19, 0x16,0x71,0x88,0x16, 0x14,0x8a,0x84,0x34, + 0x3a,0x1a,0x4b,0xdb, 0x21,0x12,0xc6,0x26, 0x8d,0x20,0xb9,0x6c, 0x21,0xc2,0xed,0x74, + 0x1b,0x16,0x64,0xd8, 0x76,0xb3,0x92,0x6d, 0x2b,0x52,0x6f,0xf1, 0xfa,0x7e,0xbf,0x22, + 0x45,0xee,0x05,0xe7, 0x89,0xf1,0x6c,0x83, 0x90,0x84,0x2f,0x6a, 0xd0,0x0b,0x01,0x26, + 0x8b,0xc6,0xd3,0x12, 0x84,0xc1,0x00,0xdc, 0x08,0x53,0xf1,0xc7, 0xcf,0xc5,0x23,0x72, + 0xba,0xe1,0xa9,0xb6, 0x7d,0x8e,0xce,0x55, 0xce,0x50,0x2e,0x0f, 0xa1,0xb3,0x4e,0xc8, + 0xcc,0xca,0xef,0xd8, 0x41,0x6a,0x58,0x53, 0x1d,0x32,0x72,0x4b, 0x76,0x6d,0x2e,0x8f, + 0x8d,0x18,0x1b,0x68, 0x47,0x6a,0x62,0xf6, 0x92,0xc4,0x9f,0xbf, 0x91,0x5d,0x87,0x15, + 0xf6,0xcf,0x5b,0xa9, 0xd3,0x1a,0x62,0xc2, 0xdf,0x72,0xff,0x0d, 0xfa,0x2b,0x4a,0x9a, + 0x6a,0x08,0x81,0x51, 0x51,0x47,0x48,0x1b, 0xe4,0x11,0xdc,0xff, 0x47,0x22,0x40,0x49, + 0x00,0x81,0x55,0x3f, 0x3e,0x7d,0x03,0x08, 0xce,0x49,0x18,0x97, 0x57,0x66,0x66,0xac, + 0xca,0x41,0x04,0x90, 0x5d,0xec,0x51,0x08, 0x49,0x13,0x80,0x13, 0xff,0x77,0x39,0x73, + 0xf6,0xa2,0xaf,0x57, 0xed,0xbc,0x2d,0xce, 0x2e,0xc6,0x9e,0xce, 0xfe,0x2d,0x18,0x45, + 0xaa,0xf0,0x79,0x57, 0xc2,0xeb,0xcd,0xd6, 0x6a,0xf6,0xf2,0xab, 0xd4,0x48,0x89,0x03, + 0x2c,0x0c,0x28,0x23, 0xc5,0xff,0x19,0xb5, 0x5c,0xf5,0xd1,0x7a, 0xa1,0xb2,0x62,0x5b, + 0x0f,0xb3,0xde,0xcc, 0xf3,0x41,0x23,0xcd, 0xe7,0x00,0x85,0x04, 0x47,0xf8,0xde,0x30, + 0x46,0xf5,0x1f,0xac, 0xd3,0xfb,0x73,0xcc, 0xf8,0x97,0x9e,0x66, 0x75,0x36,0x54,0x52, + 0xb5,0x34,0x97,0x0f, 0x44,0x50,0x56,0xca, 0xa2,0xe6,0x9b,0x45, 0xbe,0xca,0x3f,0x66, + 0x35,0x3e,0xc6,0x39, 0x66,0x7e,0x59,0x42, 0xee,0x19,0x56,0x93, 0x30,0x84,0xc9,0x1e, + 0x7c,0xfe,0xa0,0xf7, 0x78,0x01,0x88,0xa9, 0xa9,0xd0,0xc3,0x28, 0x6a,0xb9,0xbd,0xd9, + 0x9f,0x4e,0x4f,0xaa, 0x20,0x91,0x2f,0x38, 0x20,0x97,0x08,0xb7, 0x2e,0x95,0xd0,0x0c, + 0x28,0x96,0xdd,0x5e, 0x73,0xd5,0xca,0xe5, 0x54,0xa7,0x49,0x54, 0x41,0x25,0x08,0x69, + 0x90,0xa1,0x03,0x88, 0x00,0x61,0xd6,0x9d, 0x60,0xc7,0x0a,0x4d, 0x8a,0xdc,0x20,0xfe, + 0x37,0x4f,0xc6,0x89, 0xb2,0xb3,0x0a,0x68, 0x84,0x02,0x53,0x22, 0xd8,0xe8,0x9d,0xcd, + 0x2b,0xd6,0x90,0xab, 0x11,0x02,0xa8,0xad, 0x24,0x9c,0x08,0x93, 0x85,0x0b,0x30,0x32, + 0xde,0x06,0xa7,0x85, 0x08,0x6d,0x95,0xae, 0xa5,0x45,0x21,0x19, 0x61,0x25,0x6e,0xa4, + 0x1a,0xac,0x53,0x1c, 0xea,0x69,0xbd,0x39, 0x6f,0xcd,0xfb,0xa6, 0x5b,0xbd,0xae,0xa4, + 0x36,0xd9,0x24,0xd1, 0x26,0x0e,0xf3,0xec, 0x1b,0x05,0x30,0x9b, 0x49,0xb4,0xd8,0x9f, + 0x1a,0x12,0x21,0x85, 0xe4,0x45,0x49,0xa5, 0xbc,0x65,0xa6,0x89, 0x30,0x0a,0x28,0x83, + 0x09,0xa9,0xc2,0x96, 0x64,0xcf,0x8b,0xd8, 0xed,0xe4,0x54,0x5b, 0xd2,0x06,0x95,0xea, + 0xa8,0xda,0x5f,0x01, 0x6d,0x43,0xfc,0x22, 0x35,0xfb,0x63,0x65, 0xbe,0x99,0x28,0xd0, + 0x18,0x78,0xa5,0x50, 0x40,0xd2,0x61,0x93, 0x10,0x2b,0xc0,0x6f, 0x48,0xbb,0xea,0xe3, + 0x73,0x4b,0xd6,0xff, 0x5d,0xbb,0xa5,0x28, 0x7b,0x28,0x0e,0x99, 0xbd,0x9c,0xdd,0xcb, + 0x21,0xf8,0xbb,0x16, 0x86,0x85,0xe8,0x12, 0xec,0x0c,0x61,0xac, 0xc1,0x30,0xc2,0x5a, + 0x63,0xa0,0xb6,0x4a, 0x6c,0x0d,0x7f,0x36, 0xc7,0x00,0x26,0x18, 0x4e,0x82,0x30,0x32, + 0x54,0x00,0xe4,0x6e, 0xd7,0x5f,0x67,0x69, 0x65,0x89,0xaf,0x16, 0xd1,0xf9,0x2e,0xf0, + 0xdb,0x8a,0x31,0xeb, 0xc6,0x23,0x7a,0x82, 0x48,0x8a,0x82,0xa8, 0x41,0xec,0xfc,0xcb, + 0x7e,0xef,0x10,0xe0, 0x63,0x14,0x12,0x3a, 0xe0,0x1d,0x05,0x91, 0x06,0xe8,0x48,0x03, + 0xec,0x6f,0x50,0x3b, 0x60,0x10,0x0e,0x0a, 0x3d,0x4a,0x23,0xae, 0xf8,0xdd,0xcc,0x4c, + 0x59,0x70,0xe4,0x95, 0x98,0xa4,0x37,0xa0, 0xc9,0x40,0x1e,0x93, 0x29,0x16,0xc0,0x0d, + 0x66,0xc3,0x90,0x1a, 0x85,0xb7,0xe0,0x36, 0xe8,0x50,0xfb,0x9d, 0x5f,0x29,0xb9,0xf6, + 0x21,0x7c,0x90,0x02, 0x3e,0xfd,0x70,0x35, 0x69,0xef,0xde,0x28, 0x88,0x78,0x9a,0x61, + 0x85,0xc2,0xc4,0x44, 0x0c,0x9e,0x9a,0xe2, 0xf7,0xf3,0xdc,0x52, 0x29,0x2c,0x96,0x3c, + 0x9d,0xd9,0xb0,0x9c, 0x7a,0x9b,0xc0,0x16, 0x69,0xe1,0xb9,0xf0, 0xc5,0x08,0xa0,0x12, + 0xa1,0xb5,0x08,0x27, 0x1b,0x18,0x47,0x7f, 0xc3,0xb6,0x0e,0x48, 0x60,0x4c,0x83,0x11, + 0x2c,0xb8,0x34,0xdf, 0xf4,0xbe,0x43,0xb6, 0xb0,0xa5,0x3d,0x4e, 0x9c,0x21,0x2b,0x21, + 0xaf,0x1e,0xde,0xd6, 0xca,0x82,0x80,0x7d, 0x0b,0xcc,0xd0,0xf4, 0x46,0xbf,0x51,0x3d, + 0x99,0x49,0x76,0xc5, 0x41,0x42,0xe5,0x65, 0x79,0x79,0xf0,0x6d, 0xf2,0x85,0x01,0x1f, + 0x62,0x03,0x17,0x79, 0xf1,0xf8,0x1c,0x81, 0x7a,0x4f,0x2a,0xfb, 0x2c,0x97,0xb8,0x81, + 0xd5,0x9d,0x23,0x83, 0x8a,0xb0,0x1a,0x2a, 0x22,0x02,0xbb,0x10, 0x5d,0x5a,0xd1,0x24, + 0x4b,0x7e,0x8f,0xb3, 0xf4,0xf3,0x3c,0xce, 0xcd,0x84,0xdf,0x8d, 0x59,0x0b,0xb5,0x90, + 0xe0,0xc1,0x77,0x8b, 0x15,0x21,0x72,0x01, 0xe8,0xa0,0x8b,0xbf, 0x16,0x30,0x00,0x20, + 0x97,0xee,0x05,0x0d, 0x1c,0x41,0x10,0xcf, 0x04,0xd5,0xe3,0x28, 0x71,0x9d,0xe9,0x4a, + 0x15,0x07,0x1c,0x56, 0x26,0x6f,0xbe,0x1e, 0x5f,0x97,0x95,0xab, 0xfd,0x1f,0x13,0x23, + 0x37,0x29,0x90,0xf4, 0xda,0x72,0x3b,0xad, 0xef,0x55,0x32,0x6c, 0xab,0x38,0xcf,0x15, + 0x82,0x18,0xc3,0x7a, 0xe4,0x68,0x47,0x64, 0x50,0xfa,0x0c,0x30, 0x15,0x13,0x16,0xfb, + 0x7d,0xbf,0x89,0x1e, 0x4e,0x21,0x8e,0x0c, 0x14,0x03,0x13,0x2d, 0x23,0x8b,0x65,0xd8, + 0x1c,0xa8,0x6e,0xfd, 0x8c,0x14,0xc1,0x17, 0x87,0x9a,0xe0,0x74, 0x06,0x1a,0x87,0x0a, + 0xbf,0xa5,0x60,0xb2, 0x71,0x1e,0xff,0x5f, 0x17,0xa0,0xde,0xb7, 0xf1,0x9d,0x31,0x5d, + 0x27,0xf7,0x43,0x88, 0x8d,0xa2,0x22,0x57, 0x83,0xaf,0x09,0x8e, 0x29,0x1a,0xca,0xf9, + 0x12,0xa7,0x60,0x1d, 0x41,0x8a,0x23,0x94, 0x02,0x99,0xc8,0x6a, 0xa7,0xa0,0xf4,0x3e, + 0x6a,0x84,0x1b,0xc9, 0x3b,0xda,0x48,0x6f, 0x7f,0xc2,0x09,0x55, 0x1e,0x68,0x3d,0x9b, + 0xd8,0xe0,0x2e,0x7e, 0x9b,0xa4,0xcb,0xaf, 0xb8,0xea,0xf5,0xb8, 0xbd,0x7d,0xb7,0x61, + 0xe6,0xd9,0x91,0xd5, 0x81,0x1c,0x53,0x31, 0x85,0xb4,0x63,0x18, 0x3a,0x46,0x86,0x9c, + 0x0f,0x77,0x03,0x06, 0xbf,0x3e,0x17,0xff, 0x48,0x8e,0xa3,0x89, 0xcd,0x19,0xc6,0x7a, + 0x47,0x08,0xe0,0x93, 0xd5,0x0b,0x15,0xc9, 0x07,0x43,0x53,0x7a, 0xb3,0x08,0x97,0x1c, + 0x87,0x9c,0x59,0x55, 0x74,0x25,0x0a,0x09, 0x4c,0xa0,0xb3,0x22, 0xd2,0xb5,0xd3,0xff, + 0x40,0x7c,0xde,0xd3, 0xe7,0xc2,0xf2,0x8f, 0xe8,0xa8,0x3b,0x90, 0xb1,0xe2,0xdb,0x4e, + 0x44,0xf6,0x3f,0x09, 0xcd,0xde,0x9e,0xb2, 0x3b,0x6b,0x54,0xa1, 0xf6,0xfb,0xca,0xd9, + 0x4d,0x54,0xb3,0xf4, 0x27,0xeb,0x92,0x9c, 0xf3,0x2a,0xe0,0x6f, 0x0f,0xbc,0x96,0xb9, + 0xf5,0x35,0x8f,0x05, 0xd4,0xac,0xda,0x70, 0xc1,0xe8,0x65,0xd4, 0x4f,0x30,0xc0,0x66, + 0x5a,0x98,0xa9,0x63, 0x05,0xba,0x09,0x84, 0xb0,0x0f,0x30,0xc0, 0x12,0x1c,0x37,0xe5, + 0xb4,0x96,0xf5,0x20, 0xae,0x78,0xde,0x19, 0xa1,0xc4,0xbc,0x0d, 0x3d,0xdf,0xec,0xb7, + 0x5c,0x24,0x9d,0x17, 0xc6,0x02,0xbd,0xfc, 0x57,0x59,0x02,0xa9, 0x6f,0xfa,0x2e,0x0a, + 0xd3,0x78,0xc7,0x07, 0xd3,0x0f,0x4f,0x50, 0xcc,0x30,0x3d,0x4d, 0x2c,0xac,0x8d,0x4d, + 0xa9,0x1a,0x6d,0x76, 0xc2,0xdc,0x9e,0x3a, 0xcb,0x80,0x17,0x32, 0xdb,0xed,0xe5,0xc0, + 0x72,0x90,0x38,0xf2, 0x78,0x7e,0x69,0xd1, 0xb5,0x14,0xf6,0xbb, 0x74,0x15,0x05,0x09, + 0x60,0x7c,0xe0,0xb1, 0x4e,0x4c,0xed,0x55, 0xcf,0xbb,0x42,0xc4, 0xdd,0xe5,0xc9,0xfa, + 0x06,0x4a,0x6c,0x4c, 0x46,0xa4,0xab,0xdb, 0x92,0xa4,0x42,0xd1, 0x9c,0x67,0x01,0x8f, + 0xec,0xd9,0xd8,0xee, 0xd7,0x67,0x2c,0x23, 0x16,0xe8,0xb3,0x4a, 0x52,0xcb,0x47,0xc6, + 0x4a,0x4c,0xd5,0x57, 0x3b,0x27,0x88,0xf1, 0xf6,0xaf,0x7b,0x7c, 0x3a,0x71,0xdc,0x7f, + 0x31,0x75,0x98,0x81, 0x1c,0xe9,0x5f,0x85, 0xe3,0xc8,0x3b,0xcc, 0x6f,0x4a,0x3d,0x6c, + 0xe5,0xaf,0x19,0x40, 0x9d,0xc6,0xe3,0xa7, 0xd1,0xce,0xeb,0xcf, 0x26,0x46,0xc7,0xc3, + 0x8d,0xdb,0xe7,0x36, 0x4c,0x85,0x52,0x4c, 0x0d,0xd6,0x49,0x1c, 0x46,0x14,0xdf,0x54, + 0x55,0xcd,0xb0,0xba, 0x96,0xd4,0xc5,0x9c, 0xd5,0x15,0xa5,0x58, 0x06,0x54,0x50,0x10, + 0x07,0x81,0x99,0x49, 0x68,0x4c,0x40,0xd2, 0xe5,0x72,0x23,0xfc, 0xdf,0xa3,0x3f,0x9b, + 0x2f,0x4f,0xee,0xc1, 0x1f,0x66,0xb8,0x1d, 0x25,0xb6,0x5b,0x75, 0xe7,0xd1,0xc4,0x0d, + 0x6d,0xc5,0x49,0x23, 0x1a,0x7b,0x19,0x24, 0x6b,0xd8,0x85,0x8b, 0x5f,0x15,0x18,0xbd, + 0x15,0x8c,0x47,0x8a, 0x06,0x35,0xe0,0x76, 0x0e,0x03,0x90,0xe3, 0x07,0x8a,0xea,0x0b, + 0x8f,0x4a,0x9f,0x71, 0xf5,0x70,0x07,0xb6, 0xe9,0x71,0x38,0x5e, 0xe6,0x9f,0x9b,0x96, + 0x08,0xfb,0xa4,0x0c, 0x7c,0xb1,0x1b,0x93, 0xbd,0xbc,0xff,0x4d, 0x52,0x49,0xc0,0x49, + 0x33,0xf3,0x66,0x5a, 0xd1,0x23,0xdd,0x62, 0xe5,0x20,0xdd,0xcd, 0x64,0xf5,0x78,0x25, + 0x32,0x1e,0x7f,0x26, 0xbf,0x47,0x9c,0xde, 0xc3,0x5f,0xea,0xb9, 0xce,0x48,0xe0,0x66, + 0xb8,0x73,0xc0,0xf0, 0xf7,0x58,0x1c,0x69, 0x07,0xf8,0xf2,0x1d, 0x57,0x06,0xec,0xef, + 0xb9,0x17,0x47,0x69, 0x38,0x98,0xa5,0x06, 0x31,0xc7,0x9c,0x1a, 0x30,0x0c,0xf6,0xa6, + 0x01,0x4a,0x33,0x81, 0xd2,0x7c,0xe7,0xa4, 0x43,0xe4,0x4f,0x3a, 0x23,0x3c,0x84,0xcc, + 0xcc,0xc6,0x0a,0xc8, 0xd7,0xa9,0x5f,0x0f, 0xe9,0xff,0x36,0xac, 0x01,0x84,0x20,0x61, + 0xf1,0x08,0x45,0x98, 0x85,0x05,0x50,0x41, 0x41,0x0b,0x05,0xcd, 0xe6,0xf3,0x6b,0x38, + 0x70,0xe8,0x5f,0xb3, 0x27,0xaf,0x45,0x96, 0x28,0x19,0xdb,0x63, 0xd2,0x52,0x19,0x21, + 0x4d,0xca,0xf7,0xca, 0xf8,0xa3,0x74,0x22, 0x83,0xc8,0xe6,0x7b, 0x35,0x5a,0xc6,0x7f, + 0xdf,0xa3,0x6a,0x93, 0xfd,0x74,0xf4,0x19, 0xd7,0x6c,0x2e,0xe3, 0x5d,0xe3,0xaf,0xc5, + 0xfe,0xff,0xb5,0xcd, 0xab,0xcb,0xdb,0x79, 0x8a,0xd3,0xe2,0x42, 0x23,0x74,0x88,0x04, + 0x90,0x63,0x09,0x10, 0xdb,0x4c,0x68,0xdd, 0x9f,0x56,0x51,0x0d, 0x05,0x76,0xa9,0x27, + 0x01,0x00,0x02,0x20, 0x42,0x04,0x21,0x31, 0x90,0x08,0x44,0x04, 0x45,0xe2,0x1a,0x12, + 0x00,0x08,0x04,0xa2, 0x69,0xb4,0x09,0xa2, 0x13,0x14,0xdb,0x86, 0x86,0xdb,0x63,0x06, + 0xd3,0x18,0x36,0x21, 0xb4,0x81,0xa6,0x81, 0x8e,0x4a,0x8d,0x0c, 0xa4,0x9f,0x29,0xc9, + 0xc1,0x49,0x02,0xdb, 0xf8,0x0f,0xec,0x2c, 0xf0,0x0e,0xe2,0x77, 0x67,0x0d,0x85,0xa4, + 0x5c,0x7e,0x21,0x33, 0x65,0xdd,0xb7,0x18, 0x34,0xd0,0x91,0xe9, 0xd8,0x3c,0x0a,0x59, + 0x86,0x10,0x35,0xf0, 0xc0,0x18,0x03,0x2e, 0x52,0x04,0x13,0x3a, 0x07,0x58,0x1c,0x3d, + 0x4f,0x8d,0x04,0x16, 0xd0,0x56,0x85,0xc6, 0x57,0x28,0x4f,0x1a, 0xe4,0x7f,0x52,0xd5, + 0x22,0xc3,0xb6,0x81, 0x40,0x01,0xc8,0xc0, 0x54,0x23,0xb0,0x76, 0xfd,0xfe,0x7a,0x22, + 0x28,0x61,0x44,0xad, 0x34,0x4b,0xd2,0x76, 0x16,0x56,0x08,0x9b, 0x8c,0xd8,0x50,0x70, + 0x79,0x2d,0x31,0x11, 0x18,0x9a,0x85,0xc0, 0xc9,0x97,0x34,0x50, 0x30,0xb3,0x1f,0x6d, + 0xd3,0x1e,0x30,0xf3, 0x61,0xbf,0xda,0x71, 0x78,0x49,0x8f,0x0a, 0x44,0x18,0x35,0x3d, + 0xaa,0x14,0xd5,0xff, 0x8e,0xd0,0x20,0x6d, 0x52,0x41,0xc0,0x7c, 0xda,0xaa,0xad,0x0b, + 0x4c,0x6b,0x69,0x5d, 0xc0,0x78,0x02,0x4d, 0x7a,0xf5,0x6b,0xdf, 0x53,0x83,0x4d,0x14, + 0x14,0x04,0x58,0x54, 0x10,0x16,0x19,0x85, 0x71,0x43,0xdd,0x70, 0xb7,0x15,0x47,0x53, + 0x5d,0x14,0x8e,0x6d, 0x02,0x8a,0xf6,0xff, 0x92,0xdc,0xe9,0xbb, 0x0b,0x76,0x8c,0x3c, + 0x2c,0x78,0x94,0x3b, 0x53,0xbd,0xd1,0x16, 0x28,0x4a,0x80,0xe3, 0xe6,0x32,0x0f,0x13, + 0x27,0x45,0x14,0x4e, 0xb4,0x4a,0x61,0xd7, 0x0e,0xd0,0x2d,0x73, 0x48,0x2a,0xda,0x80, + 0xe3,0x4b,0x40,0x6e, 0x7f,0xf7,0x4a,0xab, 0xd2,0xa5,0x2b,0x74, 0x62,0xe2,0xe2,0x8e, + 0x4c,0x8f,0x49,0x9e, 0x3f,0xd7,0xf0,0xba, 0x4a,0x69,0x9e,0xa0, 0x10,0xdf,0xd5,0x61, + 0xb1,0xc1,0x4b,0x6c, 0x7f,0xf9,0xcd,0xde, 0xfc,0x93,0x7a,0x2b, 0xa8,0xe7,0x85,0x14, + 0x62,0x65,0xa5,0x48, 0xc0,0xb5,0x65,0xbe, 0x64,0xa8,0x54,0x4c, 0x44,0x10,0x3f,0x8d, + 0x97,0x64,0x55,0x98, 0xce,0x66,0x98,0x63, 0x55,0x5a,0x5e,0xb9, 0x39,0xfb,0xfb,0xe1, + 0x9c,0x97,0x8f,0x8a, 0x0f,0xe3,0x86,0x2a, 0x27,0xbb,0x71,0x2a, 0x6e,0x50,0x43,0xb5, + 0xdb,0xef,0x61,0xd4, 0x06,0xc5,0x60,0x88, 0x39,0x7e,0xfb,0xfb, 0x8a,0x49,0x81,0xf9, + 0xaf,0x3d,0x0c,0x28, 0xd6,0x74,0xdf,0x7a, 0xd2,0xf7,0x55,0xcb, 0x7c,0x07,0xd7,0xb0, + 0xc5,0x68,0xc0,0xd8, 0x73,0x3f,0xf6,0x9a, 0x3e,0xe7,0xb6,0x83, 0x07,0xb2,0x83,0x23, + 0x98,0x83,0xc3,0x62, 0x30,0x70,0x90,0xb2, 0x46,0x93,0x69,0x8d, 0x8f,0x4d,0xa0,0xee, + 0xb1,0x92,0x4b,0x8b, 0xee,0xfb,0x4a,0xab, 0x18,0x13,0xa1,0xaa, 0xc0,0xfc,0x0a,0x75, + 0xaf,0xe1,0x8c,0xf7, 0x70,0x6d,0xc0,0x20, 0xfb,0x59,0xae,0x00, 0xbe,0xe4,0x8c,0x58, + 0xf8,0xfe,0xfb,0xae, 0xfe,0x9b,0x54,0x78, 0x35,0x9b,0x70,0x14, 0x76,0x83,0x0b,0x8f, + 0x65,0x11,0x85,0xb5, 0xc7,0xb2,0x8f,0xf0, 0x98,0xa1,0x52,0xad, 0x74,0x61,0x58,0x75, + 0xb9,0xf2,0x82,0xa4, 0x92,0x82,0x55,0xae, 0x5c,0xf0,0x62,0x6f, 0x0e,0x46,0x3d,0xef, + 0x11,0xab,0x5d,0xf2, 0xf3,0xce,0xae,0x29, 0xc2,0xde,0x13,0xbf, 0x5d,0xd0,0xd3,0x60, + 0x1c,0x6f,0x35,0x17, 0xbf,0xb6,0x83,0x8f, 0x08,0xa9,0x15,0x7e, 0x43,0x84,0x32,0x8d, + 0x1b,0x93,0xb2,0x8a, 0xdb,0xb0,0xcf,0xa1, 0x09,0xa5,0xd3,0xf6, 0x5f,0x0b,0x5b,0xcf, + 0x43,0xe3,0xf8,0x7d, 0x2f,0x9d,0xa2,0x17, 0x1f,0x37,0xf4,0xb9, 0x90,0xc1,0x71,0xa6, + 0xf1,0x8c,0xb8,0x33, 0xc8,0x82,0x2c,0x7e, 0x9e,0x3d,0xf2,0x62, 0xd6,0x42,0xae,0xf6, + 0x46,0xff,0x84,0xee, 0xbe,0x45,0xfc,0xb5, 0xe3,0x3f,0x02,0xfd, 0xd7,0x91,0x13,0x96, + 0xc3,0xc0,0xd1,0xde, 0x3a,0xa9,0x71,0x9d, 0x5e,0x35,0x9a,0x44, 0xb7,0xc8,0x34,0x05, + 0x60,0x45,0xf1,0xb6, 0x6e,0xb4,0xbd,0xc3, 0x69,0x34,0x49,0x46, 0xab,0x83,0xee,0xf1, + 0x28,0x9b,0x56,0x46, 0xd1,0x2a,0xee,0xbb, 0x0a,0x7e,0xc2,0x37, 0xe7,0xdc,0xdf,0xa6, + 0xf3,0xf6,0x64,0x0b, 0xc4,0x6f,0x9d,0x69, 0x94,0x01,0x2e,0x55, 0x9a,0xb0,0x85,0xd7, + 0x1d,0xa1,0x21,0x83, 0x8a,0xce,0x69,0xa3, 0x49,0x6b,0x2b,0x26, 0x16,0xe4,0xd5,0x3c, + 0x84,0xfd,0x7d,0x26, 0x5f,0xc7,0x9f,0xf2, 0x61,0x1d,0x7b,0xef, 0xd4,0xb6,0xd1,0xbb, + 0xad,0x9e,0xd2,0xf5, 0x03,0x83,0xa7,0xc6, 0x6f,0x52,0x15,0x2d, 0xcd,0xf5,0xc3,0x1f, + 0xb7,0x42,0xb2,0xdb, 0xff,0x8f,0xa9,0x83, 0xb8,0x8f,0xa7,0x25, 0x61,0x54,0xa8,0x7c, + 0xb1,0xbb,0xb5,0x8c, 0x94,0x1d,0x9b,0x27, 0x69,0x27,0x52,0xdc, 0x6f,0x8b,0x84,0x15, + 0x68,0x40,0x9a,0xbd, 0xfd,0x9d,0xa7,0xd7, 0x81,0x5a,0x03,0x8c, 0xab,0x66,0xec,0x6b, + 0x2f,0xbd,0x1c,0xaa, 0x18,0x2d,0xb7,0x43, 0x5e,0xfe,0x84,0x9b, 0x1b,0x0d,0xb2,0x7e, + 0x86,0x19,0xaf,0x42, 0xc6,0x8a,0xa9,0x92, 0xda,0xbe,0x8d,0x7e, 0xc7,0xca,0x69,0xcb, + 0xf4,0xc9,0xe2,0xb3, 0xdd,0x8a,0x76,0x31, 0xdd,0x7e,0x25,0xdc, 0x19,0xaf,0x7a,0xe9, + 0x2f,0x9a,0x4d,0xf3, 0x2b,0x6c,0x9c,0x06, 0x2d,0xe9,0x9a,0xd1, 0x24,0xb3,0x92,0x6c, + 0xf5,0xd0,0xdd,0xac, 0xfe,0x5f,0xab,0xfa, 0x3f,0x2c,0xfd,0x67, 0xbd,0xc3,0xe9,0xe4, + 0xbf,0xec,0x6d,0xd6, 0xcf,0xd2,0x36,0xa1, 0x7f,0x03,0xdb,0xb6, 0x11,0x2c,0x03,0x7a, + 0x97,0x90,0x62,0x2f, 0x8d,0x4b,0x50,0x8a, 0x52,0x25,0xac,0xd8, 0x3d,0x43,0xa1,0x09, + 0x9b,0x85,0x57,0xd2, 0x5a,0x8b,0x77,0xf3, 0xe3,0x33,0xb3,0xdb, 0xc1,0x1f,0x74,0xc7, + 0x99,0xdd,0x60,0xe8, 0x30,0xed,0x5f,0x87, 0xea,0xe4,0x67,0xd2, 0xde,0x6e,0xf5,0xab, + 0x63,0xf4,0x15,0x60, 0x86,0x3c,0x87,0xeb, 0x60,0x82,0xc0,0x8b, 0xd6,0xc2,0xb4,0xeb, + 0xae,0xd6,0x32,0xfb, 0x21,0x6a,0xb5,0x04, 0x36,0x73,0x14,0x76, 0x53,0xae,0x6a,0x1e, + 0x3e,0x88,0x49,0x3b, 0x89,0x83,0xbc,0x62, 0xb7,0x63,0xcd,0x67, 0x54,0xa9,0x0c,0x2b, + 0x7a,0xaa,0x9b,0xfc, 0x90,0xc8,0x33,0x65, 0xb3,0x2c,0xd6,0x41, 0xfe,0x9f,0xa7,0x53, + 0x78,0xba,0x78,0x70, 0x0b,0x26,0xee,0x15, 0x07,0x3f,0x8b,0x68, 0x95,0x57,0x78,0x72, + 0x99,0x45,0xed,0x70, 0x92,0x9b,0x0d,0xbf, 0x63,0x03,0xc4,0x70, 0x61,0xf1,0x59,0x27, + 0x37,0xc6,0x58,0x88, 0xa9,0xde,0x06,0x09, 0x2b,0x00,0x54,0x0f, 0x5b,0xce,0xb5,0xca, + 0xca,0x75,0xff,0x50, 0xaa,0x8a,0x17,0xb9, 0xa5,0x88,0x61,0x62, 0x02,0x31,0x81,0xd8, + 0x17,0xde,0xb9,0xe9, 0x54,0xd2,0xfa,0xb3, 0x52,0x50,0x1b,0x40, 0xcc,0x5d,0x1c,0x2e, + 0xcf,0xb7,0x59,0x0e, 0x6f,0x21,0xda,0xa2, 0xf0,0xea,0x82,0x8b, 0x46,0xc5,0xc5,0x3e, + 0xd0,0x93,0x0f,0x11, 0x16,0xa3,0x3c,0xbe, 0x2b,0x01,0xd0,0x5f, 0xee,0xd7,0x3b,0x88, + 0x71,0xe3,0xab,0xe4, 0x70,0xb8,0x4f,0xec, 0xbe,0xcd,0xe5,0xf5, 0x5a,0x70,0xc2,0xca, + 0xaf,0x44,0xa5,0x96, 0xa1,0xa1,0xa0,0x49, 0x65,0xb6,0xea,0xd4, 0xcf,0x9b,0xd7,0x4f, + 0xa4,0x95,0xb3,0x59, 0xe9,0xe5,0xe3,0xe8, 0xa7,0xcc,0x43,0x76, 0x77,0x53,0x32,0x0d, + 0x12,0x53,0x1c,0xa7, 0x9e,0x9c,0xa6,0x62, 0x05,0x41,0xc2,0x69, 0x03,0x0a,0x05,0xc3, + 0x87,0xdc,0xce,0x6f, 0x18,0x29,0xb9,0x60, 0x67,0xef,0x6c,0x97, 0xb7,0x72,0xd4,0x3d, + 0x6e,0x63,0x9c,0x40, 0xc9,0x98,0x91,0xfa, 0x5d,0xcc,0x1d,0x38, 0x9d,0x79,0x9d,0x1e, + 0xd6,0xe9,0xfb,0xf5, 0xe9,0x20,0x6f,0xad, 0x76,0x41,0x81,0xc2, 0x9e,0x1d,0x6e,0x51, + 0xd0,0xc0,0x78,0x6d, 0xa0,0xe6,0xbd,0xe5, 0xcb,0x2c,0xea,0x4c, 0xec,0x91,0x06,0xf0, + 0xda,0x64,0xac,0xe5, 0x4c,0x37,0x18,0x29, 0x39,0xe4,0x8d,0x41, 0xea,0x47,0xe6,0x82, + 0xed,0x98,0xb4,0x38, 0x10,0x26,0x34,0xc9, 0x85,0x94,0xd0,0x44, 0x09,0x87,0x65,0xaa, + 0xb7,0x6b,0x89,0x7e, 0x7b,0x2f,0xf3,0x19, 0xf4,0x30,0x83,0xcc, 0x1b,0x23,0x00,0xfb, + 0xa8,0x08,0x30,0x0c, 0xc0,0x18,0x1d,0xbe, 0xbe,0xb5,0xce,0x1a, 0xae,0x3d,0x81,0x6b, + 0x63,0xb7,0xe4,0x51, 0xce,0xcf,0x39,0x97, 0xd8,0x76,0x9c,0xb5, 0xb9,0xdc,0xcb,0xff, + 0x99,0x2a,0xdf,0x61, 0x9f,0x7e,0xf8,0xc7, 0xe6,0x9e,0xff,0xed, 0xbb,0xde,0x39,0xf8, + 0x70,0x5a,0x1e,0xee, 0x72,0xd1,0xf9,0x48, 0xd8,0xec,0xa8,0x14, 0x2a,0x0e,0xe2,0x08, + 0x4c,0x4e,0xeb,0xba, 0x48,0xd1,0xa9,0xe1, 0xe6,0xd7,0xd0,0x0e, 0xb8,0x86,0xf6,0x15, + 0xca,0xf3,0x76,0xd6, 0x3d,0x66,0x58,0xa2, 0x07,0x79,0xc9,0xcf, 0x4d,0x2e,0xa0,0xbd, + 0x52,0xe1,0x60,0xf9, 0xca,0x28,0xf1,0x77, 0x24,0x4b,0x1a,0xa7, 0xee,0x59,0x7a,0x69, + 0xc6,0xfb,0x65,0xbb, 0x96,0xa8,0xef,0x76, 0x7b,0xcd,0x84,0xeb, 0x9b,0xac,0x81,0x32, + 0x01,0x72,0x77,0x7d, 0x3b,0x62,0x94,0xc4, 0x0d,0x94,0x6d,0x09, 0x83,0x63,0x1c,0x74, + 0x12,0x24,0xc0,0xe7, 0xda,0x30,0x35,0x9a, 0xcf,0xf9,0x6b,0x35, 0x5a,0x4a,0xab,0xe3, + 0x16,0x8c,0xa7,0xb7, 0x6e,0x55,0xbb,0x1a, 0xf4,0x50,0x6b,0x89, 0x81,0xff,0xa3,0x84, + 0x25,0x76,0x34,0xa9, 0x98,0x72,0xb6,0x47, 0x00,0x9b,0xc1,0x5b, 0x23,0x22,0x1c,0x0e, + 0x6e,0xcd,0xde,0x87, 0x24,0x85,0x6e,0x6f, 0x5a,0x3c,0xa1,0x00, 0xae,0xfd,0xa6,0x50, + 0x73,0x3e,0xae,0x9a, 0x92,0xd0,0x43,0xd6, 0x00,0x05,0xe6,0xf2, 0x6f,0xbf,0x6f,0x2b, + 0x32,0xe9,0xcc,0x53, 0xcc,0x56,0x6b,0x77, 0x06,0xcf,0x43,0x9e, 0xfb,0x26,0x7b,0x8f, + 0x66,0xea,0xde,0x32, 0xcf,0x36,0x17,0xc3, 0x1b,0x16,0x75,0xb4, 0xf2,0x66,0x24,0x9a, + 0x87,0x5b,0x04,0xff, 0xb8,0xcd,0x40,0x09, 0x8d,0x98,0x90,0x8e, 0x20,0x26,0x91,0xec, + 0x18,0x92,0x3f,0xd5, 0xa5,0x96,0xc3,0xc3, 0x69,0x6a,0x86,0x10, 0xfe,0x8d,0x68,0x22, + 0x1d,0xc9,0x20,0x89, 0x41,0x0d,0x1f,0xa4, 0x49,0x1e,0xcd,0xa0, 0x86,0x90,0x8e,0x1b, + 0x42,0x53,0x68,0x9b, 0x55,0x34,0x20,0x26, 0xd2,0x49,0x50,0x1f, 0x74,0x1a,0x47,0x2d, + 0x54,0x00,0xd9,0xc3, 0x18,0xa4,0x1b,0x77, 0x0b,0x14,0xab,0x6a, 0x81,0xcc,0x65,0x48, + 0x18,0x09,0xa6,0xf3, 0xb1,0xb3,0xf7,0x15, 0x3c,0x8d,0x66,0x0e, 0x26,0x93,0x97,0x8d, + 0x95,0x9b,0xf4,0x4b, 0x71,0x96,0xb4,0x7c, 0xbe,0xb7,0xe4,0x90, 0xe3,0xcd,0xe0,0x2d, + 0xf2,0x6a,0x5b,0x7c, 0x57,0x5d,0x9c,0xa1, 0x88,0xf0,0xed,0x17, 0x69,0xce,0xed,0xe9, + 0x72,0x65,0x8e,0x27, 0x17,0xa9,0xe1,0x6f, 0x27,0xbc,0xf0,0x17, 0x8d,0xd6,0xdf,0x4c, + 0x1a,0x5b,0x9f,0x9a, 0x88,0xd0,0x6f,0x16, 0x0c,0xc2,0xdc,0xfe, 0x78,0xe9,0xbd,0x5b, + 0xd2,0xc8,0x6b,0x3e, 0x57,0x19,0x54,0x56, 0xc1,0xc6,0xc5,0xee, 0x15,0x5e,0x87,0x9f, + 0xa0,0xbd,0xf2,0x2c, 0xa9,0x64,0xbf,0x3b, 0x1a,0xc4,0xc8,0x61, 0x84,0xdc,0xf5,0x2c, + 0x72,0xae,0xa9,0x16, 0xb6,0x60,0x02,0xbe, 0x98,0x00,0x03,0x31, 0x34,0x64,0x2c,0x86, + 0x1d,0xfb,0x11,0xaf, 0x66,0xf4,0x13,0x47, 0x52,0xc0,0xef,0x98, 0x0c,0x62,0x45,0x4c, + 0x43,0xe7,0xa0,0x20, 0x18,0x33,0x11,0x7d, 0x5e,0xd4,0x92,0xe8, 0x28,0x83,0x9b,0x62, + 0x3c,0x77,0x3a,0x94, 0x67,0xc7,0xef,0x59, 0x3b,0xa5,0xb6,0xfa, 0x1c,0xd5,0x9a,0xc2, + 0xbf,0x1f,0xd0,0xf7, 0x38,0xf7,0x5f,0xcb, 0xfd,0x79,0xfa,0xf1, 0xd6,0xd0,0x8e,0x03, + 0x5d,0x00,0xbf,0xaf, 0xb6,0xf0,0xac,0x67, 0xe9,0x30,0x57,0x6d, 0x7b,0x01,0x5d,0xde, + 0xca,0x16,0xe8,0x6b, 0x16,0x22,0x4c,0x0c, 0x66,0x82,0x18,0x36, 0x99,0x73,0x93,0x25, + 0x63,0x67,0xa5,0xd4, 0xf4,0x8a,0xd2,0x6a, 0xc5,0xf6,0x1f,0x21, 0xa1,0xff,0x02,0xd2, + 0x56,0xee,0x8c,0xd3, 0xc3,0x79,0x3d,0xda, 0xcd,0x75,0xf3,0x74, 0xd7,0x95,0xf0,0x6d, + 0x27,0x87,0x10,0xd0, 0xdd,0xf6,0x7b,0x4f, 0x41,0x41,0x40,0xa2, 0x4c,0x93,0x92,0xd2, + 0x96,0x6d,0x64,0x40, 0xa9,0xa6,0xf6,0xa2, 0x18,0xae,0x95,0x76, 0x9f,0x91,0x01,0x57, + 0xc6,0x5c,0xf2,0x88, 0x92,0x4e,0x6f,0x32, 0xe7,0x47,0x31,0x66, 0x40,0x5e,0xe5,0x72, + 0x86,0xa2,0xbf,0x81, 0xc6,0xb8,0x9a,0x6a, 0x32,0xc9,0xc0,0xcc, 0x54,0x42,0xc1,0xb4, + 0xc6,0xfb,0xd8,0x05, 0xef,0x09,0x40,0x9b, 0x21,0xae,0x9e,0x50, 0xa5,0x47,0x75,0x90, + 0x2d,0x0e,0xcc,0x28, 0x42,0xb0,0x8f,0x2f, 0xb2,0xe4,0xf8,0xd2, 0xd3,0x01,0x99,0x4e, + 0xe6,0xa6,0x07,0x17, 0x87,0x15,0xca,0xe6, 0x30,0x93,0x18,0x1e, 0xc5,0x34,0xcd,0xad, + 0xae,0x1a,0x51,0x61, 0x48,0xe2,0x0a,0x87, 0x0e,0x49,0x45,0xa5, 0x9d,0xb1,0x16,0xac, + 0x53,0x06,0x45,0x30, 0xa4,0x97,0x0e,0x8b, 0x91,0x63,0x83,0x4d, 0x66,0x56,0x71,0x48, + 0x92,0x2b,0x26,0x00, 0x49,0xa9,0x24,0xc1, 0xd9,0x34,0x08,0x25, 0xe4,0x90,0x14,0x15, + 0x51,0x06,0x70,0xf2, 0x11,0x79,0x02,0x23, 0x20,0x24,0xcb,0x67, 0x36,0x50,0x29,0x13, + 0x10,0x02,0x01,0x45, 0x10,0x06,0x6a,0x20, 0x1e,0x0a,0x94,0x49, 0x8c,0x0c,0x83,0x44, + 0x4a,0x49,0x04,0x57, 0x77,0x12,0x70,0xec, 0x24,0xa2,0x51,0x59, 0x3c,0x18,0x85,0x6f, + 0xad,0xdc,0x35,0xfc, 0x7c,0x59,0xef,0xb4, 0x79,0xbb,0x1b,0x15, 0xac,0x11,0x5c,0xd5, + 0x4a,0x8b,0x60,0x20, 0x72,0x19,0x03,0x3a, 0x13,0x1a,0x90,0x72, 0xe9,0x00,0x1c,0x49, + 0x20,0x23,0x25,0x40, 0x4a,0x44,0x82,0x42, 0x83,0x06,0x57,0x80, 0x8c,0xa3,0x00,0x92, + 0x02,0x00,0x90,0xb1, 0x8c,0xa5,0x23,0x06, 0x21,0xdd,0x50,0x48, 0xc5,0x0a,0xb9,0x52, + 0x08,0x21,0xd5,0xcc, 0x08,0x90,0x83,0x44, 0x3c,0xa0,0xc1,0x92, 0x05,0x0c,0x8c,0x22, + 0x92,0x8a,0xc6,0x2c, 0x02,0xc8,0x49,0x83, 0x04,0x72,0xa4,0x42, 0x28,0xb1,0x92,0xc9, + 0x44,0x20,0xe4,0xc4, 0x18,0x18,0x86,0x94, 0x60,0x20,0x04,0xa2, 0xa1,0x59,0x11,0x42, + 0x3b,0xa9,0x50,0xe0, 0x3b,0x33,0x86,0x20, 0x02,0x62,0x10,0x86, 0x80,0xab,0x8e,0xd0, + 0xc6,0x9f,0x75,0x97, 0x62,0x7a,0xf7,0x9d, 0x66,0xd3,0x2d,0x52, 0xe0,0x8b,0x50,0x98, + 0x3b,0xa9,0x94,0x16, 0xc9,0xa5,0x59,0x95, 0x22,0x8a,0x43,0x18, 0xe2,0xa1,0x4f,0xe9, + 0x8e,0x04,0x8d,0xf9, 0x6d,0xa4,0x15,0x23, 0x2f,0x6e,0x43,0x88, 0xea,0xa9,0x21,0x1f, + 0x2a,0xd7,0xee,0x67, 0xf0,0xc5,0x6e,0xb2, 0x55,0xb4,0x75,0x72, 0xf4,0x17,0x55,0xd7, + 0x36,0xf8,0x9d,0x8e, 0x47,0x3f,0x6d,0x94, 0x70,0xe1,0xc3,0x87, 0xdf,0x7d,0x4a,0x52, + 0xad,0xed,0x29,0x58, 0x45,0xf4,0xd6,0x05, 0xce,0x43,0x15,0x6b, 0xe2,0xeb,0x10,0x61, + 0x5c,0x69,0xa7,0x6a, 0x7c,0x2b,0x7f,0x9c, 0xeb,0xcd,0x6e,0x5a, 0x06,0x0f,0x01,0x17, + 0xc0,0x06,0x28,0xd5, 0xfc,0x1f,0x9b,0x72, 0x11,0x0e,0xa1,0x5f, 0xd9,0x24,0x00,0x3d, + 0xf4,0x97,0xa3,0xd6, 0xac,0x09,0xf0,0x7f, 0xc2,0x11,0x93,0xcd, 0xa1,0x51,0x64,0x65, + 0x25,0x94,0x44,0x56, 0x54,0x05,0x57,0x78, 0xc9,0xd8,0x10,0x49, 0x10,0x51,0x0a,0x55, + 0xe5,0x50,0x5d,0xe8, 0xd4,0x40,0x43,0x4d, 0x72,0xd6,0x0d,0x17, 0x9e,0x2e,0xf2,0xf7, + 0x16,0x5e,0x33,0x51, 0x0e,0xeb,0x79,0xf5, 0x73,0xa1,0x81,0xbd, 0xdf,0xbb,0xc8,0xd9, + 0x6f,0x91,0xe1,0x44, 0xd7,0x45,0x74,0x33, 0x67,0xef,0x5e,0x3d, 0xe2,0xd0,0x3e,0x9a, + 0x82,0x21,0xc5,0xa4, 0x66,0xa5,0x52,0x1a, 0x95,0x58,0x0d,0x86, 0x6a,0x91,0x1b,0x4b, + 0x6e,0xab,0x0a,0x17, 0x8c,0x70,0x65,0x10, 0x61,0xa7,0x7e,0xfc, 0x0f,0x54,0x96,0x27, + 0x9c,0xf5,0x3b,0x64, 0x96,0x93,0xce,0x5b, 0xf5,0xe6,0xc4,0x8c, 0x94,0x7a,0xdc,0x8f, + 0x5f,0xf7,0x7b,0xde, 0x9c,0xfb,0xbd,0x1d, 0x86,0x91,0xb5,0x6b, 0x29,0x12,0x67,0xc5, + 0xd8,0xea,0x62,0x50, 0x48,0xdb,0xae,0x6e, 0x7a,0xf4,0x26,0x51, 0x3f,0x13,0xc0,0xed, + 0x3a,0xc5,0x76,0x7c, 0x5b,0x7f,0x60,0x41, 0x7e,0xfa,0x8b,0xcb, 0xad,0xd6,0x05,0x73, + 0x5b,0x54,0xbb,0x3c, 0x41,0x50,0x82,0xdb, 0x26,0x96,0x62,0x3f, 0x80,0x4b,0xc9,0x2f, + 0x48,0x8d,0x5d,0xbd, 0x5d,0xcf,0xa1,0x9a, 0x9b,0xe7,0x46,0x88, 0xe2,0xbc,0x7e,0x02, + 0x58,0xdc,0x1d,0x03, 0x80,0x6f,0x8e,0x00, 0x9c,0xdb,0xc9,0x62, 0x2f,0x1f,0xc1,0xcc, + 0x21,0x69,0xf2,0x33, 0x6c,0x86,0xa4,0x28, 0x3a,0xe6,0x57,0xd2, 0x56,0xd6,0xf6,0x57, + 0xc1,0xb7,0x37,0xed, 0x8d,0x36,0x36,0x36, 0x21,0x8d,0x0d,0xb4, 0xc1,0x20,0x41,0x1b, + 0xd8,0x1b,0x51,0x59, 0xa9,0x08,0x80,0x40, 0x22,0x04,0x00,0x20, 0x42,0x21,0x27,0x7f, + 0x5d,0xdd,0x4e,0x6d, 0xb6,0xc6,0x0d,0x2a, 0x27,0xce,0x62,0xce, 0x8c,0x34,0x56,0xc8, + 0xd2,0xf3,0x72,0xdf, 0xf4,0x7a,0xe0,0x4b, 0x5b,0xe2,0x73,0xbd, 0xbe,0xfb,0x57,0x73, + 0x4b,0xd9,0x3b,0x13, 0x9a,0xb7,0x7f,0x9b, 0x3b,0xbe,0x3c,0x31, 0x73,0x5a,0x42,0xad, + 0x35,0x12,0xf6,0xc3, 0x45,0x43,0xb3,0x83, 0x6a,0xe9,0x37,0xcc, 0x31,0xa3,0xb2,0x3b, + 0xf3,0x11,0x80,0xf8, 0x4c,0x00,0x93,0x70, 0x03,0x55,0x8f,0xba, 0xc5,0x9e,0x2e,0x7c, + 0x9f,0x2e,0x94,0xc1, 0xb7,0x35,0xd3,0xd7, 0x8a,0xf5,0x2a,0x2d, 0x86,0x4d,0xab,0x9a, + 0x3e,0x1f,0x27,0x51, 0x87,0x87,0xac,0xcc, 0xbb,0xd7,0x97,0xdc, 0x05,0x23,0x81,0xb8, + 0x05,0x44,0x81,0x63, 0xed,0xaf,0x97,0xb5, 0x25,0x7c,0x6d,0x62, 0x85,0x2c,0x80,0x1c, + 0xaa,0x60,0x7d,0x45, 0x08,0x66,0xba,0xa1, 0xae,0x56,0xca,0x56, 0xcc,0x63,0x18,0xd5, + 0xd1,0x52,0xfa,0x58, 0x24,0x92,0xf7,0x1d, 0xc1,0x27,0x7c,0xe0, 0xba,0xe3,0x8e,0x6d, + 0x3b,0x75,0x61,0x86, 0x21,0x87,0xde,0xe1, 0x42,0x55,0x2f,0x29, 0xd3,0x1a,0xd5,0xc6, + 0xf2,0xd0,0x6e,0x7b, 0x15,0x2c,0xad,0xa8, 0xb5,0x53,0x1a,0x8e, 0x3a,0xb7,0x29,0x8e, + 0x4e,0xb0,0x8c,0xa2, 0xaa,0x73,0xc4,0x2d, 0xbd,0x03,0xb1,0x5a, 0x19,0x18,0xe3,0x15, + 0xa1,0xe5,0xb9,0x80, 0x8a,0xed,0x73,0x2e, 0x27,0x58,0x80,0x04, 0xc9,0x18,0x6a,0xc8, + 0x02,0x21,0x03,0x11, 0x3b,0x95,0x63,0x49, 0x29,0x12,0x04,0x5a, 0x63,0xa0,0x90,0x5b, + 0xd2,0x79,0x51,0xeb, 0x2f,0xe8,0x18,0x8a, 0xdc,0xa8,0x60,0x78, 0x77,0x3b,0x18,0x26, + 0x10,0x48,0x09,0x4e, 0xa3,0x0c,0xc9,0x68, 0x1b,0x5a,0x56,0xa1, 0xa3,0x2a,0x65,0x29, + 0x7b,0x26,0x9f,0xda, 0x83,0xb7,0xbe,0xe0, 0x6b,0x2f,0x78,0xea, 0xfa,0x5e,0x43,0x37, + 0x34,0xcd,0xdb,0x98, 0x18,0xd4,0x18,0x88, 0x13,0x6d,0xe9,0xf3, 0xaf,0x76,0x97,0xf8, + 0xf9,0x10,0xfc,0xaf, 0x87,0xc6,0xa2,0xee, 0x5c,0xa6,0xaa,0x83, 0xc6,0xd9,0x85,0x20, + 0x53,0xa4,0x41,0x1b, 0x27,0x77,0x66,0x46, 0xb2,0x37,0x27,0x89, 0xa9,0xc0,0x79,0x96, + 0x19,0xaa,0x00,0x0b, 0x49,0xe7,0xa8,0x63, 0xb4,0x04,0x77,0x85, 0x3e,0x57,0x27,0x35, + 0x82,0x77,0x5c,0xbf, 0x01,0xff,0xc7,0x1a, 0xd0,0x23,0xa3,0x7d, 0xd0,0xc8,0xa5,0xa1, + 0x14,0x0b,0x70,0x23, 0x82,0x07,0xce,0x60, 0xdb,0x5e,0x1d,0x0e, 0x23,0x59,0x77,0xfd, + 0xd4,0xf3,0xf4,0x87, 0x6b,0x39,0x51,0x7b, 0x2b,0xce,0x62,0x88, 0x9b,0x4a,0x02,0x61, + 0xe7,0x40,0x65,0xf2, 0xd9,0x15,0x4a,0x20, 0xa4,0x89,0x4b,0xe4, 0x65,0xd3,0xea,0xf1, + 0xa8,0xbb,0xbc,0x82, 0xed,0xe9,0xb5,0xfd, 0xf4,0x8e,0xff,0xf3, 0xf9,0x37,0xe8,0x57, + 0xd4,0x1a,0xfe,0x8c, 0xef,0xe4,0x84,0x2e, 0x20,0xba,0x45,0xc1, 0xca,0xec,0x52,0x04, + 0x3a,0x24,0x36,0x05, 0x14,0x82,0x04,0x74, 0xaa,0x6d,0x9a,0xe8, 0xf0,0xb7,0x35,0x39, + 0xba,0xae,0xdb,0xc0, 0x96,0x4d,0x6f,0x1d, 0x46,0x24,0xe2,0x66, 0x16,0x30,0xa8,0x68, + 0x06,0xe3,0x8a,0xba, 0xaa,0x8a,0xa5,0x89, 0xd5,0x83,0xc6,0x76, 0x21,0x26,0x3c,0xea, + 0xde,0xac,0x4a,0x8d, 0xb2,0x90,0x32,0xf0, 0xf8,0x99,0x06,0x4c, 0xde,0x23,0x31,0x7c, + 0x7c,0x25,0xef,0x79, 0x82,0x97,0xcc,0x5a, 0xc7,0xdc,0x53,0xaf, 0x8e,0x06,0xc7,0x5d, + 0x73,0x22,0xb4,0x56, 0x1f,0x03,0x1e,0xdf, 0x34,0x66,0x09,0x06, 0x0b,0x11,0xa6,0x4d, + 0xa6,0x03,0x6c,0x33, 0x86,0x06,0xc1,0xe5, 0xc9,0xeb,0x6a,0x75, 0x09,0x74,0x34,0x69, + 0x04,0x00,0x8e,0x39, 0xa8,0xd4,0x24,0x85, 0x17,0x2e,0x62,0x71, 0x0d,0xd4,0x2a,0x1b, + 0x3d,0x41,0x1c,0x80, 0xc2,0x99,0x69,0x72, 0x6d,0x19,0xfa,0x58, 0xcd,0x52,0x60,0xb8, + 0xc7,0x88,0x66,0x87, 0x4a,0x9b,0x0d,0x59, 0x59,0xb8,0x20,0xa8, 0x45,0x33,0x0e,0xee, + 0x3e,0xbc,0x36,0xb3, 0xbf,0xf5,0xd4,0xd3, 0x04,0xf3,0x79,0xfb, 0x3b,0xdc,0xbc,0xef, + 0x5d,0xbd,0x86,0xba, 0x57,0x6f,0x2e,0xe4, 0xd6,0xae,0x89,0x56, 0x8b,0xa3,0xcd,0xee, + 0xff,0x47,0x9b,0xe6, 0x4c,0x0a,0x4c,0x88, 0x72,0x82,0x97,0x44, 0x44,0x6d,0x3d,0x33, + 0x50,0x41,0x02,0x86, 0x9b,0x72,0x21,0xab, 0xb7,0x4a,0x9c,0x08, 0x9c,0x90,0xbf,0x98, + 0x91,0xc7,0xb2,0x54, 0x79,0x40,0x7e,0x30, 0xf2,0xc4,0xa5,0x0d, 0xa8,0xe7,0x1e,0x06, + 0x53,0x6c,0x5c,0x9d, 0x55,0x5a,0x36,0xf6, 0x36,0x2e,0x19,0x83, 0x9f,0xc6,0x30,0x07, + 0x48,0xd8,0x81,0xe6, 0xfb,0x91,0x63,0xec, 0xf9,0x69,0xe6,0xf2, 0x8f,0x5b,0x6d,0xca, + 0xb8,0x83,0x08,0x66, 0x38,0xc1,0x5f,0x02, 0xf0,0x78,0xaf,0x43, 0x90,0x44,0x45,0xf5, + 0x56,0x61,0x60,0x72, 0xd8,0x74,0xa6,0x75, 0xa9,0x59,0xbc,0xb9, 0x3f,0xb1,0xa2,0xf6, + 0x43,0x9b,0xd8,0xcc, 0x6e,0x45,0x8f,0xed, 0xb5,0x31,0xb5,0x7b, 0x32,0x10,0x84,0x05, + 0x76,0xc6,0x09,0xca, 0x10,0x90,0xaa,0x60, 0x90,0x64,0x34,0x90, 0xbe,0x93,0x12,0x82, + 0x31,0x8c,0x3a,0xbb, 0xe3,0xf0,0x3c,0xff, 0x83,0x43,0x25,0x36, 0x00,0x9c,0x32,0x48, + 0x7d,0xcb,0x9e,0xbf, 0x89,0x43,0x81,0x77, 0x1b,0x59,0x79,0x78, 0x19,0x30,0xd7,0x5e, + 0xba,0x1e,0xe9,0xc1, 0xe8,0xeb,0x9a,0xc4, 0x7b,0x5d,0x53,0xa1, 0xf5,0x4a,0x04,0x48, + 0xf6,0xd4,0x28,0x9a, 0x81,0xd4,0x63,0x54, 0xa9,0x1b,0xa4,0x47, 0x87,0xf3,0x18,0x72, + 0xf0,0x25,0x69,0xc4, 0xb4,0xb3,0xbf,0x33, 0x73,0xdc,0xf7,0x58, 0x13,0xa3,0x35,0x69, + 0x15,0x26,0xad,0xc7, 0xe0,0xef,0xf6,0x32, 0xff,0x6b,0xdd,0xb6, 0xb3,0x76,0xdb,0xa0, + 0x91,0xc0,0x01,0x39, 0xef,0x7e,0xed,0xdd, 0xda,0x14,0xca,0x07, 0x12,0xda,0x7b,0xf4, + 0x28,0x91,0xe4,0xd5, 0xf3,0x30,0xb4,0xd2, 0xf8,0x88,0x40,0x0a, 0x82,0x0c,0xce,0xf8, + 0xa5,0xbd,0x17,0xce, 0x54,0x3e,0x9a,0xbf, 0xdf,0x9f,0x0b,0xb8, 0xb1,0x8f,0xde,0xcb, + 0x69,0xe2,0xbe,0xc4, 0x2c,0x0a,0x70,0xdd, 0x85,0x3f,0x06,0xd5, 0x1b,0xf2,0x2a,0x61, + 0x3d,0xff,0xb1,0x14, 0xb6,0xcb,0xdc,0x44, 0x6b,0x50,0x27,0xe7, 0xd4,0x6c,0xac,0xf9, + 0x1b,0x6e,0x42,0xac, 0xb3,0xee,0x19,0x92, 0xe0,0xc3,0x26,0x65, 0x89,0x6d,0x05,0xf4, + 0xef,0x26,0x7d,0xd3, 0x2f,0xf2,0xf5,0xc9, 0x53,0x54,0x35,0xd8, 0x69,0xae,0x3b,0xcd, + 0x47,0x63,0xb2,0x76, 0x70,0xe1,0x59,0xfa, 0x12,0xe6,0x27,0x5f, 0x4f,0x15,0xad,0xa7, + 0x51,0x81,0xff,0x10, 0xba,0x39,0xd5,0xf6, 0xa1,0x20,0x5d,0x10, 0x70,0xbd,0xea,0x90, + 0x43,0xeb,0x9f,0x93, 0xf4,0x4e,0x9b,0x25, 0xbb,0xbd,0xe5,0xb8, 0x33,0x09,0x6a,0x6c, + 0x8c,0x5b,0x69,0xcf, 0xa5,0x2e,0xf1,0x8f, 0x06,0x77,0x8a,0x0a, 0xbd,0x0d,0x37,0x17, + 0xc1,0x86,0xb9,0x28, 0x2c,0x5a,0x6f,0x65, 0x78,0x56,0xc2,0xd8, 0x9e,0x95,0x7e,0xb7, + 0x4c,0xef,0x85,0x5d, 0xda,0x13,0x6d,0xc4, 0x98,0x11,0xd1,0xf8, 0x34,0xc6,0x12,0x5c, + 0xb5,0xe0,0xc5,0x5f, 0xa1,0x58,0x30,0xbc, 0x94,0xc6,0x7a,0x6b, 0xe4,0x5b,0x27,0x7a, + 0xbb,0x9f,0x67,0x85, 0x99,0x7c,0xd6,0x89, 0xd2,0xd3,0x2f,0xaf, 0x33,0x6f,0xa1,0xd4, + 0xed,0xe4,0x41,0xa4, 0xc8,0xad,0x65,0x2e, 0x5e,0xdf,0x13,0xe7, 0xf5,0xbc,0xeb,0x76, + 0x0a,0xb4,0x37,0xe9, 0x62,0xcb,0xb1,0x84, 0xe2,0x4c,0x49,0x9d, 0x4d,0x58,0x8d,0xe2, + 0x43,0xb3,0xc6,0x8d, 0xd8,0x35,0x12,0x22, 0xb5,0xea,0x2f,0xa0, 0xf9,0xbc,0x98,0xbf, + 0xb7,0xec,0x86,0xaa, 0x18,0x43,0x52,0x9c, 0x5f,0x27,0x57,0xc9, 0x8a,0x8c,0x95,0x1f, + 0x97,0x06,0x77,0xde, 0x81,0xe7,0xa7,0xc0, 0xbe,0xcc,0xf8,0x17, 0x0f,0xc4,0xfb,0xe3, + 0x07,0x0f,0x12,0xf3, 0xe7,0x2f,0x78,0x85, 0x5d,0x31,0x52,0x29, 0x22,0xc3,0x8f,0xb3, + 0xd8,0x7d,0x1c,0x7a, 0x63,0x67,0x3d,0xef, 0x43,0x0e,0x48,0x85, 0x0b,0x99,0x35,0xd4, + 0x16,0x19,0x79,0x73, 0x5d,0x56,0xf9,0xb5, 0xf5,0x97,0x9d,0xb9, 0x73,0x28,0x31,0x34, + 0x7c,0x65,0xd7,0x72, 0x2f,0x8d,0xd6,0x75, 0xae,0xc3,0xea,0x4f, 0x8e,0x40,0xe1,0x15, + 0xeb,0xd5,0x9d,0xbc, 0x5a,0x68,0xbd,0x80, 0x91,0x4a,0x5a,0x01, 0xad,0x89,0x27,0x74, + 0x88,0xcd,0x5e,0x33, 0xb6,0xf1,0xd3,0x7e, 0xf6,0x0d,0x85,0x4e, 0xcd,0x77,0x8c,0x1e, + 0x25,0xd9,0x07,0x49, 0xdc,0x74,0x25,0xac, 0x36,0x72,0x09,0x4b, 0x1a,0x82,0x7b,0xab, + 0xac,0x86,0x45,0x7c, 0xc6,0xf2,0xcb,0x9d, 0x0b,0x6f,0xdd,0x0c, 0x17,0xf6,0x26,0xf4, + 0x84,0x6b,0x76,0xda, 0xf9,0xe5,0xdf,0x4b, 0x16,0xea,0xf6,0x8c, 0xba,0x20,0x28,0x1b, + 0x7b,0xb1,0xc4,0x41, 0x79,0x22,0x04,0xdb, 0xe4,0xf3,0x21,0x12, 0x4b,0xcb,0x30,0xe7, + 0x40,0x82,0x62,0xe2, 0x02,0x48,0x1b,0x37, 0x09,0x60,0x8a,0x7b, 0x92,0x80,0x00,0x82, + 0x64,0x02,0x6e,0xde, 0x7b,0x9a,0xa4,0x4d, 0x67,0xb2,0xa9,0xd1, 0x0a,0x55,0x7f,0xbe, + 0x01,0x49,0x55,0x97, 0xc1,0xa1,0x4d,0x11, 0xa5,0x3a,0x31,0xf4, 0xb3,0x4a,0xb1,0xfb, + 0xd0,0xa4,0x56,0xc4, 0x86,0x7f,0x69,0x58, 0xa9,0x7c,0xfd,0xeb, 0x5d,0xff,0x99,0xe8, + 0xed,0xb2,0x51,0x3e, 0x57,0xef,0x07,0x8f, 0xb6,0x9d,0xc8,0xd9, 0x7d,0xbe,0x32,0x23, + 0x02,0x3e,0x2c,0xa8, 0xef,0x0f,0x23,0xca, 0xce,0xc5,0x09,0xc8, 0xa6,0xe2,0xba,0x43, + 0xb0,0x1d,0x02,0x95, 0x48,0x92,0xdd,0x6d, 0x00,0xd3,0xc8,0x0e, 0x42,0xcf,0xd3,0xf8, + 0xb2,0x2c,0x86,0x79, 0x76,0x16,0x64,0x28, 0xc6,0x62,0x8f,0x6a, 0x23,0x2e,0x91,0x42, + 0xb0,0x12,0x2e,0x19, 0xeb,0x96,0x15,0x35, 0x55,0xb9,0xc9,0x6e, 0x48,0xad,0x02,0x47, + 0x6a,0x6d,0x8a,0xad, 0xf2,0x12,0xfc,0xa6, 0xe7,0x98,0x7c,0x0d, 0x5e,0x4e,0x3e,0xf7, + 0x70,0x60,0x7a,0xd5, 0xa9,0x48,0x8e,0x26, 0x09,0x3a,0x81,0x68, 0x4d,0x62,0x05,0xbc, + 0x94,0x5b,0x20,0xaa, 0xb0,0xd9,0xa8,0x1f, 0x19,0x75,0x4c,0x77, 0x70,0x28,0x11,0xac, + 0xfa,0x1a,0x06,0x63, 0x97,0x48,0xb9,0x06, 0x6e,0x4f,0x46,0xa5, 0x74,0x42,0x74,0x91, + 0x06,0xeb,0x6f,0xb4, 0x33,0xb9,0x7a,0x12, 0xf0,0xbc,0x85,0xfc, 0x8f,0x1d,0x9c,0xaf, + 0x9e,0xdf,0x32,0xcc, 0xcf,0xc0,0x7b,0x30, 0xe6,0x31,0x10,0xc2, 0x4a,0x36,0x14,0xac, + 0xb2,0xcb,0x82,0xc7, 0x4c,0x61,0x17,0xfc, 0x3e,0x0b,0x2c,0xe3, 0x0a,0x3d,0x97,0xc6, + 0xdf,0xd6,0xdb,0x7a, 0x02,0x00,0xbc,0x98, 0x53,0x28,0xdd,0xbe, 0xfe,0x5e,0xf4,0xe9, + 0x86,0x30,0x79,0xa7, 0x10,0xcb,0xb1,0xf1, 0x57,0x69,0x6c,0x76, 0xb9,0x05,0xfb,0x19, + 0x96,0x65,0x67,0xd3, 0xa4,0x84,0x4b,0xef, 0x4c,0x92,0x74,0xc0, 0x44,0x5a,0x29,0x5b, + 0x2e,0xdb,0xa8,0xca, 0xef,0xe4,0x68,0x35, 0x95,0x43,0x39,0x96, 0xb3,0x31,0xeb,0xca, + 0x8f,0xd1,0xe9,0x53, 0x5c,0xb5,0x4e,0x0f, 0xf7,0xd1,0x45,0xb7, 0x7f,0x4b,0x35,0xd1, + 0x37,0x3c,0x02,0x01, 0x45,0xdc,0x00,0x78, 0x32,0x20,0xf5,0x44, 0xd5,0x7c,0x15,0x84, + 0xd6,0x64,0x49,0x25, 0x20,0x10,0x83,0xba, 0x71,0xd3,0x34,0xd4, 0x48,0x0f,0x4c,0x32, + 0x14,0x00,0x28,0xae, 0x24,0xc8,0x42,0x12, 0x08,0x08,0x10,0x09, 0x02,0x04,0x40,0x84, + 0x02,0xba,0x96,0xfa, 0xfb,0xe2,0x7a,0x8d, 0x96,0x27,0x57,0xf6, 0x33,0xd6,0xb9,0xed, + 0x9f,0x91,0xd4,0x7f, 0x97,0x1b,0x1e,0xb2, 0xbe,0x45,0xf6,0x19, 0x86,0x1a,0x3b,0xa1, + 0xe9,0x7f,0x9a,0xa7, 0x15,0x49,0x36,0x9b, 0x43,0x62,0x6d,0x54, 0xda,0x46,0x8e,0x13, + 0xc5,0x53,0x92,0x73, 0x6c,0x1c,0xc1,0x20, 0x80,0x05,0x00,0xa0, 0x44,0x02,0x80,0x01, + 0xb4,0x9b,0x01,0xb0, 0x06,0xc1,0xb4,0x9b, 0x10,0x36,0x80,0x6d, 0x26,0x0d,0x36,0x87, + 0x8a,0x16,0xb6,0xd0, 0x75,0x36,0x2c,0x14, 0x69,0xe9,0x97,0xea, 0xbc,0x1d,0x81,0x58, + 0x63,0x42,0x6d,0xb4, 0xd3,0x4d,0xa1,0xdb, 0xb6,0x97,0x76,0x6c, 0x9a,0xa8,0x0d,0x29, + 0xd8,0x1e,0xc7,0x77, 0x38,0x07,0xd3,0xdb, 0x4a,0xe5,0x2d,0x2d, 0x81,0xf8,0x2d,0x86, + 0x62,0x2f,0x7f,0x0d, 0x0a,0x0d,0xe5,0xe2, 0xf5,0x61,0xd1,0x40, 0x63,0x48,0x6c,0x26, + 0x4e,0x12,0x09,0x36, 0x3e,0x23,0xd9,0xf8, 0xb2,0xdb,0x13,0xd4, 0x72,0x51,0xfc,0x17, + 0x5b,0xce,0x57,0x7b, 0xde,0x7f,0x16,0x78, 0xe7,0xf5,0x36,0x3c, 0x10,0xf2,0xb6,0x30, + 0xb9,0x89,0x63,0x48, 0x12,0xa5,0xfe,0x5d, 0x3c,0xbf,0x24,0xd2, 0x86,0x97,0x33,0x96, + 0xb5,0x5b,0x59,0x81, 0xd3,0xf8,0xd6,0x77, 0x75,0xe8,0x40,0xbd, 0x87,0x5c,0xfe,0x57, + 0x8b,0x46,0x47,0x03, 0x9e,0xdc,0xd7,0xc5, 0xec,0xe2,0x8d,0x07, 0x85,0xde,0x5f,0xca, + 0xb6,0x05,0x59,0xac, 0xc0,0x76,0xc1,0x89, 0x08,0x81,0x8d,0x89, 0x26,0xc1,0x21,0x83, + 0x63,0x3e,0x6b,0x11, 0x1c,0xaa,0x81,0x28, 0x62,0x6c,0xaa,0x8a, 0xa4,0x42,0xe2,0x69, + 0xbd,0x2c,0x1c,0x2a, 0x3b,0x1a,0x8e,0xbb, 0x33,0xd8,0x4a,0x8b, 0x35,0xe4,0xb2,0x8a, + 0xf0,0x51,0xf6,0xa3, 0x9d,0x65,0xae,0x4f, 0x8e,0xf1,0xeb,0x79, 0x01,0xb0,0xd4,0x07, + 0x60,0xcd,0xc9,0xba, 0x48,0x67,0x5a,0xc8, 0x1a,0xf8,0x63,0x8e, 0x27,0xdf,0x9c,0x4a, + 0x73,0x90,0x89,0x49, 0xb9,0x49,0x82,0x10, 0x29,0x35,0x22,0x57, 0xa3,0x5b,0xaf,0x3d, + 0x8b,0x7f,0xd0,0x45, 0xdf,0x5b,0xa6,0xc4, 0xeb,0x30,0xf3,0xfa, 0x5e,0xab,0x86,0xe8, + 0xb2,0x37,0xf8,0xf8, 0xf2,0x77,0xa9,0xea, 0xe8,0xf3,0x3e,0xb7, 0xad,0xe6,0xf9,0xf8, + 0x89,0x5a,0x9d,0xf5, 0x2e,0xb2,0x59,0xcd, 0x4d,0x28,0x9a,0xc1, 0x48,0x77,0x47,0x1b, + 0xb2,0x63,0x19,0xb0, 0x86,0xd3,0x15,0x44, 0x8e,0x55,0x10,0x84, 0xaf,0x9d,0xfb,0xf4, + 0xd5,0xac,0xfc,0xb2, 0xba,0x4c,0x36,0x37, 0xd4,0x90,0x8a,0x15, 0xd3,0xdf,0xd0,0xa6, + 0xc1,0x9c,0x97,0x22, 0x73,0x58,0xfb,0x43, 0x6b,0xba,0x88,0xa3, 0xd9,0x23,0x45,0x51, + 0xb4,0xfb,0x9f,0xdc, 0x2a,0x3c,0xbe,0xff, 0x6b,0xc7,0x00,0x3b, 0x1b,0x4c,0x1a,0x49, + 0x34,0x3d,0xcd,0xc7, 0x11,0x6b,0x41,0x1f, 0x2f,0xcd,0xe8,0xe8, 0x6b,0xbc,0xbe,0x4a, + 0x2f,0x8b,0xba,0x7c, 0x37,0xcb,0x4e,0x67, 0xd9,0xb6,0x87,0x3d, 0xd4,0x69,0x77,0xf2, + 0x48,0xe5,0x75,0xe0, 0x63,0xea,0xf4,0xd0, 0x9c,0x46,0xa7,0x8c, 0x08,0x49,0x6a,0x08, + 0x91,0x1a,0x03,0x22, 0x03,0x4e,0x85,0x40, 0x34,0x42,0x69,0x51, 0xb6,0x41,0x0a,0x71, + 0x3a,0x25,0x36,0xe6, 0x9c,0x47,0xfb,0x22, 0x5a,0x52,0xe7,0x28, 0x7f,0x0c,0xc4,0x54, + 0x31,0x21,0x36,0x93, 0xa0,0x85,0x0d,0x02, 0x06,0x2f,0x1f,0x91, 0xe9,0xa4,0x8e,0x37, + 0x85,0xd5,0x55,0xae, 0xfc,0x77,0x95,0x4c, 0x05,0x7e,0x94,0x43, 0x36,0x18,0x37,0xa7, + 0x3d,0x71,0x08,0x18, 0x0c,0x4d,0xb0,0x6c, 0x43,0x01,0x67,0x98, 0x20,0x89,0xe3,0x4a, + 0x4c,0x13,0x4c,0x12, 0x1a,0x42,0x6c,0x00, 0xc6,0x86,0x73,0x20, 0x85,0x8b,0x23,0x95, + 0x30,0x46,0x88,0x13, 0xf2,0xd9,0x08,0xea, 0x0c,0xd0,0x38,0x26, 0xf1,0xd0,0xfd,0x66, + 0x3c,0xce,0x6f,0x87, 0x51,0x8d,0x43,0xc7, 0x5b,0x07,0xb2,0x5c, 0x4a,0x53,0x1a,0xee, + 0x5e,0xa2,0xf1,0x92, 0x44,0xc1,0xce,0x33, 0xc9,0xd0,0x7b,0x0e, 0x1b,0x2f,0x10,0x3f, + 0x9e,0xb6,0x9f,0xb9, 0x83,0x38,0xe9,0x59, 0x5e,0x6c,0x18,0x64, 0xef,0x87,0x1f,0xbb, + 0xfe,0x6e,0xf4,0xda, 0x4e,0xef,0x2e,0x93, 0x67,0x27,0x15,0x45, 0x11,0xef,0x43,0xbc, + 0xf1,0x77,0x36,0xb2, 0x7a,0xff,0xb3,0x16, 0x21,0x5c,0xdd,0xe2, 0x00,0x47,0xb7,0x01, + 0xbe,0xaf,0xe2,0xdb, 0x68,0x5b,0xb0,0xca, 0xe2,0xe3,0x54,0xff, 0xd7,0x6b,0x81,0x77, + 0xaf,0x04,0x40,0x27, 0xfe,0x8e,0xed,0x19, 0xa1,0xfe,0x98,0x4d, 0x3c,0xc9,0x4b,0x5f, + 0xa8,0x7b,0x1b,0x04, 0x77,0x09,0x46,0xb3, 0x95,0x05,0x8f,0xd2, 0xba,0x58,0x2b,0xf2, + 0x1b,0x14,0xea,0x9c, 0xa2,0x9a,0xc3,0x73, 0xaf,0x42,0xda,0xaa, 0x54,0x3d,0xf4,0x2d, + 0x26,0x94,0x17,0xb3, 0xc9,0x7a,0x57,0xbb, 0x78,0x05,0xf5,0xe6, 0x9d,0x58,0x85,0x72, + 0x6c,0xda,0x1a,0x9e, 0xeb,0xe3,0x63,0xb8, 0x26,0x19,0xef,0xad, 0x6d,0x76,0x36,0xf3, + 0xa9,0xd4,0x88,0x9a, 0xa1,0x1f,0xb7,0xe5, 0xe8,0x64,0xaf,0xb4, 0x0e,0x50,0x61,0x2a, + 0x9d,0x32,0xb0,0x96, 0x93,0x56,0xe5,0x35, 0x69,0x77,0x0d,0xdf, 0x3e,0x52,0xa2,0x7a, + 0x6d,0x67,0x17,0xda, 0x37,0x9a,0xb9,0xa8, 0x37,0x5c,0xbf,0xd3, 0x55,0xe5,0x53,0xe8, + 0x99,0x5a,0xc2,0xe5, 0x46,0x87,0x1a,0x27, 0x2e,0x2e,0x2b,0x73, 0xba,0x99,0xd9,0xee, + 0x87,0x27,0x93,0x34, 0xfb,0x65,0xf8,0x37, 0x91,0xdc,0x62,0x70, 0x3c,0x2f,0xf7,0x8e, + 0xe4,0x6f,0xa2,0xee, 0xd4,0xfb,0x3e,0x5b, 0xd4,0xb7,0x6b,0x2c, 0x09,0x02,0xc8,0xc2, + 0xe6,0x0c,0xc2,0xa6, 0xec,0xc4,0x42,0x88, 0x3a,0x4f,0x23,0x03, 0xc5,0x03,0x4d,0x7f, + 0x1f,0x96,0xc2,0xba, 0x94,0xbc,0xf6,0xda, 0x9b,0x48,0x77,0x35, 0x2e,0x3b,0x22,0x7b, + 0x05,0xf1,0xe9,0x60, 0xf9,0x7f,0x27,0xfc, 0x74,0x9c,0xeb,0xf1, 0xef,0x16,0x62,0xf3, + 0xff,0x6f,0xd1,0xed, 0x51,0xfa,0xf9,0x4e, 0x9b,0xbb,0x1c,0x5d, 0x7e,0x7a,0x73,0x93, + 0x7b,0xb1,0xeb,0x9b, 0x00,0xc8,0x16,0x4c, 0xdf,0x63,0x1c,0xa7, 0xb5,0x5d,0x55,0x7a, + 0x01,0xd7,0xee,0x7d, 0x7f,0x35,0xc7,0xdf, 0xdc,0xad,0xce,0xe8, 0x6f,0x79,0x8f,0x1f, + 0xe6,0xb7,0xbb,0x96, 0x5f,0x53,0xe8,0x10, 0xbe,0x58,0x3e,0x1c, 0xeb,0xba,0x0d,0x76, + 0xe6,0xdd,0xfd,0x9d, 0x34,0x88,0x8c,0x52, 0x40,0x60,0xec,0x74, 0x80,0x75,0x7d,0x05, + 0xd8,0x55,0x13,0x8e, 0x6d,0x27,0x2b,0xc4, 0xf6,0x16,0x1c,0xc3, 0x19,0x18,0x16,0xc9, + 0xa9,0xc8,0x6d,0xce, 0xa7,0xfe,0xd1,0xed, 0xc7,0xed,0xb7,0xf2, 0x76,0xba,0xbe,0xc1, + 0x4f,0xb1,0xc2,0xd1, 0xfa,0xea,0x53,0x80, 0x5e,0x69,0x4b,0x96, 0xfb,0x30,0x7c,0xed, + 0xd4,0x1f,0x67,0x9f, 0x42,0x19,0x44,0xf6, 0xf2,0x1f,0x5a,0xd0, 0x99,0x3f,0x4c,0xa7, + 0x1b,0x84,0x6c,0x97, 0x5d,0x09,0xec,0xfb, 0x34,0xdc,0x89,0xef, 0x13,0xc9,0x7a,0x74, + 0xc7,0x55,0x56,0x3d, 0x87,0xc4,0x53,0x4c, 0x80,0x3d,0x13,0x74, 0x49,0x1d,0xea,0x69, + 0x94,0xd2,0xf0,0x34, 0xe6,0xe9,0xf7,0xcf, 0x38,0xfd,0xf4,0x67, 0xdd,0x08,0x8c,0x91, + 0x0c,0x62,0xac,0x43, 0xd0,0x4b,0x39,0xae, 0xcc,0x85,0x60,0x0c, 0xe9,0xe1,0x80,0x7c, + 0x44,0xc5,0xc9,0xce, 0x83,0xc0,0x82,0x80, 0x94,0x6a,0xb4,0x3a, 0x05,0x1c,0x60,0xda, + 0xf0,0x38,0x7b,0x69, 0x25,0xe2,0x27,0x81, 0x7a,0xa2,0xe2,0x20, 0x01,0x02,0x40,0x20, + 0x02,0x04,0x21,0x09, 0x14,0x86,0xd7,0xf8, 0xe5,0x9c,0x13,0x5a, 0x46,0xa0,0x67,0x98, + 0x6b,0x87,0x9c,0xf6, 0x34,0xcd,0xec,0xfc, 0xf8,0xd7,0x24,0x6f, 0x10,0x00,0x47,0x8f, + 0xfe,0x12,0x41,0x35, 0x7a,0x84,0xeb,0xf4, 0xfd,0xae,0x27,0x87, 0xe5,0x65,0xb6,0xf4, + 0xfa,0x6f,0x6f,0x69, 0xcc,0x6a,0x44,0xd8, 0xfc,0x13,0x8f,0x41, 0x22,0xe7,0x5d,0x53, + 0xaa,0xfe,0x2e,0x98, 0x5c,0x89,0xa4,0xc6, 0x9a,0x32,0xab,0x3b, 0xfc,0x64,0x2a,0x0f, + 0xf1,0xd9,0x62,0x63, 0xef,0xcc,0xb2,0xd1, 0x2f,0xf1,0x42,0xe7, 0x49,0x87,0xe0,0xa9, + 0x74,0xb9,0x99,0x97, 0x10,0x96,0xfc,0x04, 0x19,0xc3,0x5c,0x8b, 0x07,0x02,0x17,0x04, + 0xee,0x4f,0xf7,0x9d, 0xed,0x9e,0x4f,0x8a, 0x5c,0x2c,0x2f,0x69, 0xf2,0x64,0x92,0x92, + 0x47,0xbc,0x6a,0x19, 0x02,0x50,0x22,0x0e, 0xf1,0xbe,0xed,0xd2, 0xa1,0xb9,0xea,0x89, + 0x4e,0x68,0x72,0x6d, 0xca,0xaa,0xa7,0x34, 0x03,0x33,0x0a,0xa0, 0x2a,0x94,0x6e,0x7d, + 0xfa,0x55,0x14,0x15, 0x0d,0xa8,0x65,0x1b, 0xf9,0xbf,0x55,0xcf, 0xaf,0x43,0x68,0xcd, + 0x96,0x38,0x0d,0xa8, 0x1b,0x1e,0xcc,0x29, 0xd1,0xa8,0xa2,0xc2, 0x28,0x3a,0xa9,0xa1, + 0xee,0xf7,0x9d,0xbf, 0x5d,0x89,0xd3,0xb7, 0x7b,0x91,0xb7,0xba, 0x3e,0x9e,0xe9,0xad, + 0x61,0xd6,0x9a,0xcd, 0x52,0x69,0x8f,0x81, 0x39,0xa1,0xb0,0xb1, 0xde,0xed,0x76,0x5f, + 0x3e,0xd6,0xef,0x7d, 0xf1,0xec,0x88,0x22, 0x0d,0x38,0x9a,0x07, 0x53,0xcf,0x02,0xcb, + 0x6a,0xf5,0x08,0xa1, 0x38,0x4a,0x62,0xaa, 0x14,0x4f,0xb5,0x06, 0x9f,0x08,0xa7,0xb3, + 0x28,0xcc,0x24,0x6c, 0xd7,0x4d,0xaa,0x88, 0x3e,0xb4,0x6a,0x63, 0x85,0x7f,0x90,0x04, + 0x96,0xbd,0x42,0x7e, 0x08,0x72,0x24,0xb3, 0xbf,0x56,0xbe,0x2f, 0xe8,0xf3,0xbc,0x4d, + 0x8e,0x1a,0x2f,0xb3, 0x1d,0xc1,0xdc,0xee, 0x6c,0xe2,0xc3,0xd8, 0x08,0x41,0xf4,0x91, + 0x7f,0x80,0x44,0x87, 0xf2,0xa6,0x10,0x21, 0xfa,0x0f,0xd2,0xcb, 0xba,0x40,0x00,0x84, + 0x5c,0x38,0x56,0x81, 0x52,0x5a,0x48,0x0b, 0xb7,0x05,0x47,0x89, 0xa0,0xa3,0x9b,0xad, + 0xc7,0xa7,0xab,0xe4, 0x79,0xde,0x50,0xeb, 0xf3,0x2d,0x74,0x3d, 0x1e,0xc0,0x92,0x73, + 0x98,0xb7,0xdd,0x75, 0x36,0x26,0x2f,0xdf, 0x15,0x02,0x43,0x5e, 0x02,0x27,0xb0,0x08, + 0x84,0xdf,0xe7,0xc2, 0xeb,0xe9,0xb2,0x31, 0xdd,0x41,0x14,0xc3, 0x13,0xbe,0x26,0xd7, + 0x8b,0x82,0xe2,0xf9, 0x0b,0xbc,0x95,0x66, 0x93,0x23,0x63,0xb7, 0xf5,0xbd,0xce,0xc3, + 0xc5,0xda,0xf9,0x1e, 0x0d,0x6f,0x1f,0x61, 0x0b,0x54,0xb0,0xb2, 0x24,0x61,0x86,0xc1, + 0xae,0x3d,0x5c,0x9f, 0x49,0x51,0xf3,0x8e, 0x3b,0x4d,0x49,0x9f, 0xba,0x84,0xab,0x58, + 0x18,0x03,0xf6,0x2c, 0x78,0xd0,0x7d,0xaa, 0x49,0x18,0xed,0x98, 0x91,0x30,0x3e,0x76, + 0xc8,0x9e,0xe0,0xf8, 0xb3,0x53,0xc6,0x88, 0x55,0x6b,0xf8,0x49, 0xd5,0x1f,0xb5,0x9e, + 0xa8,0x58,0x84,0xc1, 0x8c,0x41,0xe0,0x41, 0xcd,0x1b,0x29,0x94, 0x6a,0x4c,0x64,0xb9, + 0xc8,0x12,0x34,0x68, 0x2d,0xa3,0xd9,0x8c, 0xb3,0x5c,0x6b,0x9c, 0x13,0x2e,0x07,0xf2, + 0xd1,0x6a,0x14,0x17, 0x60,0xdd,0x7c,0x48, 0xd6,0x9f,0x64,0xca, 0xac,0xe6,0x4f,0x6f, + 0x76,0x81,0x26,0x60, 0x94,0x23,0x22,0xe9, 0x4f,0xd6,0xa4,0x08, 0xc3,0x21,0x3e,0x6b, + 0x10,0xed,0x67,0x77, 0x2f,0x72,0x1a,0x2d, 0x00,0xdc,0x5f,0x8a, 0xb3,0x49,0xdc,0xb0, + 0xa3,0x97,0xa2,0xd1, 0x39,0x64,0xd1,0x83, 0xf0,0xad,0xd5,0x54, 0x3d,0x88,0xe7,0x78, + 0xfc,0xf8,0x8e,0xab, 0xc2,0x5d,0x9f,0x81, 0xd7,0x4a,0xc9,0x28, 0xab,0x4e,0x23,0xe9, + 0xdd,0xc4,0xa2,0xe0, 0xae,0x4b,0xb3,0xf0, 0x34,0x50,0xc0,0x0d, 0x68,0xd0,0x13,0xf2, + 0x34,0x4e,0x9c,0x1a, 0x8b,0x23,0x75,0x8d, 0x52,0x85,0x4f,0x65, 0x67,0x86,0x99,0xa4, + 0xd2,0x1d,0x8e,0x7b, 0x0d,0x65,0x83,0x69, 0x67,0xe6,0x4a,0x71, 0xf6,0xbb,0xbd,0x54, + 0xff,0x91,0xda,0xff, 0x7e,0x08,0x4c,0xf6, 0x07,0x48,0xfa,0x96, 0x22,0xe7,0xe3,0x99, + 0x19,0xdf,0x90,0x14, 0xe6,0x2f,0x80,0x8f, 0xc4,0xee,0xe4,0xa8, 0x41,0x72,0x46,0x74, + 0x15,0x36,0x9d,0xcf, 0xfd,0x59,0x4e,0x24, 0xa6,0x26,0x27,0xda, 0x93,0x2c,0x9a,0xc3, + 0x4b,0xf2,0x8e,0xde, 0xa0,0x19,0xc8,0x54, 0xa4,0x95,0x2b,0xc1, 0x89,0x3f,0x50,0xa4, + 0xa8,0xa2,0xdf,0x15, 0xbb,0xeb,0x02,0xc3, 0x6c,0x81,0xf1,0x4d, 0x07,0x6d,0xa9,0x1c, + 0xbf,0xcd,0xed,0x7b, 0xfe,0xbe,0x49,0xcb, 0x90,0x41,0x77,0x4d, 0x78,0xb5,0x48,0x29, + 0xe1,0xf5,0x9a,0xa9, 0x8d,0x95,0x1f,0xeb, 0x66,0x3e,0x6c,0x11, 0xb5,0x65,0x86,0xf5, + 0x03,0x6e,0x43,0x5a, 0xef,0x52,0x5e,0xb1, 0xe9,0xb2,0x1f,0x9f, 0xb9,0x21,0x92,0x8d, + 0x5c,0x36,0x90,0x35, 0x77,0x0d,0xb5,0x3f, 0xaa,0xaa,0x94,0x62, 0x2d,0x52,0x83,0x30, + 0xf3,0x31,0x4b,0x1e, 0xf8,0x68,0xc5,0x4c, 0x13,0x68,0xe8,0x81, 0x10,0xe3,0xd9,0x7e, + 0xba,0xe1,0xd3,0xda, 0xee,0x71,0x6c,0xa9, 0x34,0x6d,0x31,0x46, 0x5f,0xd6,0xcf,0x08, + 0x61,0x44,0xc4,0x6b, 0x70,0x5a,0xb9,0x7c, 0x03,0x45,0x71,0x6b, 0x58,0x6e,0x7a,0xb1, + 0x99,0x9e,0x9d,0x33, 0xc6,0x51,0x61,0x66, 0x99,0xaf,0x69,0x40, 0xb3,0xf0,0xbe,0x72, + 0x9c,0x6e,0xed,0xe6, 0xe7,0xe2,0x79,0x79, 0x7a,0x6e,0x07,0xe6, 0xd6,0x6d,0xe8,0x70, + 0x6e,0x77,0x58,0x3c, 0xe5,0xec,0x2f,0xf5, 0xd2,0xdb,0x51,0xee, 0xc8,0xb8,0xee,0x1b, + 0xcf,0x48,0x92,0x46, 0x2e,0xd9,0x43,0x47, 0xe0,0x9f,0x63,0x9f, 0xf5,0x42,0x55,0x70, + 0x3d,0xbd,0x41,0xd2, 0xf8,0x19,0xfc,0xa8, 0xc0,0xa0,0xc0,0xb7, 0xc3,0x2f,0x7d,0x55, + 0xff,0x52,0x61,0x39, 0x03,0x0e,0x15,0xfb, 0x1b,0x28,0x93,0xa0, 0x6f,0xa7,0x20,0xa2, + 0x92,0xf4,0xc8,0x14, 0xbb,0xfc,0x42,0xdc, 0x2b,0xfe,0xd3,0xce, 0xb5,0x74,0xde,0x25, + 0x97,0x0f,0xa2,0x06, 0xd9,0x94,0x73,0xb2, 0x9a,0xbb,0xa0,0x62, 0x9b,0x82,0x03,0xb2, + 0x84,0xe8,0x29,0xe7, 0xe9,0xd6,0x70,0x4d, 0x1f,0x43,0xae,0x14, 0xea,0x6a,0xf3,0x32, + 0x77,0xca,0xfa,0xac, 0x4c,0x3a,0x75,0xca, 0x43,0x6a,0x7c,0x5d, 0xab,0xe4,0xb3,0xd0, + 0xb0,0xe0,0xac,0x49, 0x70,0xb4,0x8b,0xc9, 0x5c,0x54,0xcb,0xd1, 0x60,0x9d,0x48,0xf4, + 0x69,0xae,0xb0,0x60, 0x23,0x6a,0x36,0x22, 0x20,0xb8,0x62,0x89, 0x6a,0xf9,0x70,0xd5, + 0x7b,0xc3,0x77,0x93, 0xac,0x6f,0x0d,0x97, 0x13,0x91,0xad,0x41, 0xdd,0xbf,0xae,0xc7, + 0xd5,0xb6,0x8e,0x6e, 0x37,0xd3,0xeb,0x7c, 0x48,0xbc,0xab,0x66, 0xbd,0x91,0xdd,0x82, + 0x12,0x0c,0x75,0x03, 0x21,0xb8,0x82,0x21, 0x90,0xd0,0x7f,0xdf, 0x9c,0xaf,0xa1,0xa8, + 0xc1,0x6a,0x97,0xfc, 0x5a,0x2c,0x6d,0x62, 0xd1,0x03,0xf8,0xde, 0x59,0x20,0x52,0x10, + 0x98,0x24,0xd0,0xcf, 0x42,0x0f,0x41,0xc9, 0x24,0xc0,0xa5,0xc0, 0xdb,0x18,0xff,0x9f, + 0xf9,0xe7,0x4d,0x34, 0xd3,0x4c,0xe3,0x08, 0x41,0xd9,0x99,0x99, 0x99,0x9a,0x10,0xc9, + 0x8c,0x48,0x20,0x92, 0x0c,0x62,0xcc,0x76, 0x9e,0xa5,0x43,0x7f, 0x30,0xfe,0xdf,0x40, + 0x00,0x39,0x80,0x26, 0xe6,0x35,0xf1,0x9b, 0x95,0xd0,0xec,0x76, 0x20,0x79,0xd3,0xad, + 0x24,0xe5,0x1e,0x17, 0x97,0xa5,0x98,0x0b, 0x34,0xf3,0x76,0xb9, 0xa5,0x35,0xab,0x58, + 0xc6,0xca,0xb4,0xb9, 0x4e,0x8d,0xe3,0xf7, 0x5d,0xd8,0xc4,0x00, 0xac,0x06,0x9a,0x4c, + 0xe2,0xb6,0xee,0x39, 0xde,0x6d,0x58,0x55, 0x39,0x9f,0xc4,0x7c, 0x61,0x9f,0xb4,0xea, + 0xf2,0x96,0x2e,0x3a, 0xcb,0xda,0x5e,0xd8, 0xf1,0x22,0xdb,0xec, 0x7b,0xe4,0x69,0x85, + 0xb9,0x6b,0xb7,0x72, 0x47,0xe3,0x8a,0x19, 0xc2,0x9a,0xd8,0x56, 0x2b,0xe0,0x5a,0x88, + 0x3e,0x83,0x8c,0x38, 0xdf,0x5e,0xe3,0xf2, 0xe2,0x10,0x8c,0x3b, 0xcc,0x49,0x9e,0x55, + 0x9d,0x3e,0xc7,0x69, 0xd7,0xa5,0x47,0x04, 0xe3,0xab,0xa6,0x2a, 0x39,0xad,0x71,0x2d, + 0xaa,0x83,0x96,0x34, 0x6c,0x64,0x66,0xc4, 0x41,0xd1,0x60,0x22, 0x22,0xda,0xb6,0xe1, + 0x20,0x24,0xf2,0x91, 0xa1,0x60,0xe1,0x43, 0x29,0x98,0xc2,0x22, 0xc1,0xe2,0xac,0x5c, + 0xba,0x64,0x4f,0xf4, 0x5c,0x1b,0x8c,0x8e, 0xfa,0xdb,0x94,0xc8, 0xa5,0xc8,0x7c,0xfe, + 0x0e,0xa0,0x68,0xfe, 0xed,0xb6,0xd9,0x91, 0x00,0xfc,0x88,0x10, 0xc8,0xa0,0x5e,0xb0, + 0x28,0x1f,0xc7,0x90, 0x2f,0xf2,0x45,0xb8, 0xba,0xd9,0x0d,0x60, 0x7c,0xdf,0xce,0x81, + 0x5b,0x90,0xf8,0xb3, 0xb2,0x32,0x6f,0xa8, 0xcc,0xfa,0xb8,0x2c, 0x4c,0x13,0x26,0xd9, + 0xf6,0x42,0x71,0x58, 0x98,0x57,0x6a,0xe1, 0xaf,0x04,0xf2,0x45, 0xd7,0x82,0x76,0xf5, + 0x9c,0x3b,0x48,0xa4, 0x16,0x3a,0x8e,0x35, 0x32,0xd6,0x83,0xc5, 0xdb,0xe0,0x52,0x6c, + 0xb1,0x6a,0x68,0xa1, 0x00,0x7f,0x6f,0x47, 0x95,0xa5,0x70,0x9d, 0x8f,0x14,0xe3,0x43, + 0xda,0x74,0xa7,0xf6, 0x7d,0x0f,0x43,0x85, 0xcc,0xcb,0xd5,0x56, 0xe5,0xaf,0x33,0x73, + 0x36,0x99,0x92,0x53, 0x0c,0x61,0x25,0xc6, 0xe0,0x46,0xc3,0xb7, 0x3b,0xfc,0x8c,0x74, + 0xbb,0xc4,0x28,0xed, 0x31,0x6c,0xed,0x95, 0x76,0x05,0xd4,0x33, 0x90,0xc9,0x09,0x30, + 0x99,0x5a,0xd9,0x2c, 0xa6,0x0e,0x76,0x84, 0x0f,0x53,0x1d,0x6b, 0x59,0xfa,0x4f,0x30, + 0x87,0x40,0x4d,0xba, 0x4b,0x99,0x14,0xa0, 0xe2,0xcf,0x9b,0x95, 0xda,0xd8,0xfc,0x79, + 0xb5,0xa9,0xa5,0xe2, 0x33,0x2a,0x27,0xcb, 0xdd,0x59,0xc7,0x5a, 0xdf,0x33,0xe4,0x79, + 0xe2,0xaa,0x2b,0x81, 0x87,0x81,0xf4,0x85, 0x92,0xdd,0x09,0xfd, 0xbe,0x70,0x90,0x3f, + 0x83,0x46,0x03,0x25, 0x29,0x3d,0xc6,0x25, 0xfc,0x63,0x26,0xa6, 0x0d,0x99,0xd1,0x15, + 0xd6,0xf8,0x0b,0xef, 0xd1,0x3f,0x48,0x10, 0x3e,0x0e,0x1d,0x78, 0x8e,0x0a,0x4b,0x09, + 0xe9,0xe4,0x01,0x44, 0x98,0x34,0xa3,0xdc, 0xfc,0x95,0xba,0x8a, 0x7d,0xab,0x38,0x13, + 0xc6,0x8d,0x1f,0x51, 0x18,0xf9,0x81,0xa5, 0xf2,0x97,0x54,0x81, 0x99,0xda,0x22,0x95, + 0x30,0xc9,0xee,0x66, 0x4b,0xde,0xc9,0x1c, 0x31,0x2a,0x29,0x41, 0xbe,0xc6,0xb6,0x64, + 0x92,0x34,0xb2,0x1d, 0x79,0x01,0x3c,0xa6, 0x97,0xcc,0x15,0xc8, 0x15,0x9f,0x03,0x34, + 0xde,0xa7,0xe4,0x03, 0x7d,0xce,0x45,0x85, 0x3e,0xe8,0xa6,0xf1, 0x9e,0x9b,0x6c,0xa2, + 0x71,0x05,0xb5,0xc5, 0x80,0x82,0x57,0x38, 0x9b,0x23,0xe2,0x83, 0xfe,0xcb,0x85,0xcc, + 0x25,0x57,0xc1,0x87, 0x9b,0xd1,0xb1,0x8d, 0xc1,0xf7,0xb1,0x44, 0xfd,0x84,0x5d,0x9a, + 0xc7,0x22,0x1e,0x2d, 0x3b,0xe8,0x8b,0xf1, 0xa8,0xa1,0x33,0xc4, 0x48,0x6d,0x6c,0x74, + 0x73,0xa5,0xb5,0xae, 0x9e,0xcd,0xf9,0x6a, 0x91,0x7b,0xda,0x59, 0xd0,0x2b,0x7e,0x9e, + 0xfe,0xcd,0x45,0xc8, 0x79,0x88,0xcb,0x9e, 0x60,0xf4,0x71,0x7e, 0x4e,0x32,0xed,0x51, + 0xe4,0x9f,0x44,0xc3, 0xd6,0xdc,0x17,0x8a, 0x16,0xdb,0xcf,0xe5, 0x74,0xf2,0xaa,0xc1, + 0x32,0x20,0x1f,0x18, 0x02,0x6a,0xeb,0xb1, 0x77,0xc3,0xcd,0xac, 0x3c,0xb9,0x6a,0x88, + 0x52,0xde,0x9f,0x4f, 0xe1,0x12,0x9a,0x49, 0xdf,0x2f,0x44,0x69, 0xaa,0x6e,0x0a,0x01, + 0xd4,0x03,0xd0,0x15, 0xd2,0x01,0x7d,0x38, 0xf0,0xd0,0xc4,0xdd, 0x14,0x57,0x4f,0xd4, + 0x64,0x5f,0x90,0xde, 0xa0,0x6a,0xfc,0xe8, 0x49,0x2f,0x37,0x8f, 0x8b,0xbd,0xad,0x93, + 0x47,0xc6,0xbc,0xa4, 0xc9,0xd7,0xc2,0x52, 0xd1,0x9b,0x89,0x66, 0x73,0x81,0x0b,0x60, + 0xf8,0x7f,0x13,0x45, 0x2c,0x57,0xeb,0xa6, 0x71,0x7c,0xac,0x6a, 0x3c,0xfa,0x16,0x5f, + 0x67,0x0b,0xbc,0x1d, 0x8b,0xa8,0x7c,0x57, 0x1f,0x35,0xac,0x46, 0x14,0x31,0x60,0x33, + 0xaf,0xfa,0xe8,0x3b, 0x26,0x2f,0xa2,0x31, 0x36,0x90,0x36,0x29, 0x26,0x74,0xae,0x06, + 0x13,0x1a,0x4d,0x90, 0xc9,0xc1,0x76,0xe2, 0x40,0x29,0xc4,0x14, 0xa3,0x0d,0x95,0xc6, + 0xc7,0xf6,0x50,0x71, 0x6b,0x14,0xe3,0x9f, 0xad,0x3d,0x29,0x8a, 0x3c,0x79,0x5d,0x41, + 0x37,0x0f,0x20,0x77, 0x39,0x6a,0xa8,0x3c, 0x2b,0xbb,0x64,0x1b, 0xb5,0x20,0x67,0x84, + 0x1f,0x6c,0x56,0x40, 0x6f,0xdb,0xf7,0xf2, 0x39,0xaf,0x56,0x8c, 0x4d,0x6e,0x83,0x8b, + 0x52,0x80,0x6a,0xe9, 0xa3,0x7c,0xd1,0x26, 0x06,0x7b,0x36,0x1b, 0x3e,0x95,0xdc,0x05, + 0x0d,0x05,0x4c,0x0b, 0x3a,0x99,0xd4,0xbd, 0xd1,0x85,0x24,0x67, 0xe9,0xf8,0x94,0xf8, + 0xa3,0x09,0xdd,0xe9, 0xdc,0x52,0x4a,0x6e, 0xb2,0xf9,0x9c,0x7b, 0xb0,0xf4,0xf6,0x99, + 0x8d,0x2d,0x53,0x38, 0x6d,0x57,0x80,0x64, 0x45,0x12,0x94,0x73, 0x26,0x46,0x57,0xfa, + 0x20,0x7a,0x62,0x19, 0x7b,0x7f,0xe4,0xda, 0x7b,0x76,0xff,0x60, 0xf5,0xb2,0xae,0x70, + 0x74,0xb4,0x9e,0x9a, 0x59,0x2b,0x7d,0x31, 0x1d,0xdd,0xfd,0x9a, 0x09,0xd7,0xda,0x29, + 0x1b,0x64,0xff,0x37, 0xab,0x2d,0xc2,0x44, 0x40,0xc2,0xcb,0xf9, 0x6b,0xd3,0x16,0x84, + 0x0d,0x5c,0xb3,0xf4, 0x8a,0x67,0x28,0x17, 0xf3,0xf5,0xcd,0x07, 0x14,0x62,0x6c,0xba, + 0x52,0x03,0xc6,0xa0, 0xaa,0x5a,0x42,0xd1, 0x0c,0xce,0x13,0xfe, 0x86,0x83,0x49,0x5d, + 0x59,0xd0,0xc8,0xb0, 0xcd,0xf0,0x5e,0x4b, 0xe1,0xfd,0x0e,0x01, 0xa2,0xdd,0x50,0x72, + 0x97,0x2f,0xf9,0xd3, 0x95,0xd6,0xd6,0xb5, 0xcc,0x8e,0xba,0x6c, 0x17,0x40,0xd6,0xf9, + 0xc9,0xa0,0xd2,0xf4, 0xfa,0xe7,0x29,0x3c, 0xc7,0x29,0x77,0x32, 0x70,0x94,0xe1,0x25, + 0x10,0x63,0xe3,0xa7, 0x21,0x7a,0xb2,0xb0, 0x11,0x61,0x36,0xb7, 0xc6,0x73,0x6b,0xb6, + 0x14,0xc5,0x68,0xd4, 0x65,0xa0,0x68,0x1e, 0x02,0x1b,0x48,0x6d, 0x1c,0x7b,0x48,0x81, + 0x8d,0xa1,0x8c,0x1b, 0x4d,0xb1,0xb6,0x02, 0x10,0x00,0x24,0x00, 0xa1,0x08,0x10,0x94, + 0x42,0x91,0x0c,0x88, 0x62,0x8c,0x3d,0x9e, 0x1a,0x94,0x40,0x4d, 0x94,0x33,0xa6,0x81, + 0x40,0x86,0xd1,0x58, 0xcb,0x67,0x4f,0x91, 0x01,0x74,0xd3,0x19, 0x82,0xfb,0x3e,0xee, + 0x3f,0xab,0x38,0xed, 0x7d,0x4f,0x3f,0x1a, 0x92,0xdb,0x37,0x1b, 0xef,0xa4,0x69,0xd5, + 0x6e,0xe3,0xb7,0x5d, 0xf8,0x31,0xb7,0x0b, 0xe5,0x30,0x1e,0xff, 0xcd,0x9c,0x55,0xd6, + 0x2e,0x46,0x6d,0x4b, 0xdb,0x1f,0xa5,0xd2, 0x8a,0xc8,0x7f,0x1c, 0xf6,0x75,0x52,0x0d, + 0x4d,0xf8,0x39,0x33, 0x19,0x87,0xd4,0x56, 0xe9,0x99,0x13,0x50, 0x6a,0x9a,0x0a,0x50, + 0x50,0x61,0x11,0xf3, 0xb9,0x70,0x60,0xe6, 0x1f,0x9c,0xbf,0x13, 0xf7,0xa3,0xa1,0xb7, + 0x80,0x97,0xdc,0x55, 0xa1,0x74,0x22,0xa1, 0xaf,0xe3,0xdf,0x73, 0xff,0x93,0xb8,0xfa, + 0x7a,0x2d,0x40,0xea, 0x0c,0xfd,0xd4,0x04, 0xf5,0x50,0x94,0x9d, 0xaf,0xe4,0x82,0x25, + 0x02,0xdf,0x0e,0xfb, 0x5f,0x8b,0x22,0x86, 0x6d,0xf3,0xd1,0xf5, 0x04,0xb7,0x06,0xf2, + 0x04,0xba,0x91,0x67, 0x80,0x22,0x26,0x85, 0x68,0xc3,0x12,0xc5, 0x29,0x44,0xed,0x97, + 0x84,0x22,0x4d,0x33, 0x77,0xe4,0x2f,0xf9, 0x78,0x83,0x70,0x8d, 0x40,0xa7,0x16,0xbb, + 0xa7,0x55,0xa5,0x5b, 0xc3,0x33,0x0b,0x01, 0xbf,0xa1,0x7f,0x8c, 0x81,0xf0,0xac,0xad, + 0xaa,0xf4,0xb0,0xb6, 0x41,0x23,0xc6,0xc0, 0x8e,0x6c,0xe9,0x26, 0x49,0xc4,0x69,0x09, + 0x8d,0x37,0x87,0xfe, 0x05,0xf1,0xfa,0x2f, 0x97,0xbb,0xdb,0x74, 0xf7,0xf6,0xe1,0x6a, + 0x04,0xd2,0xb4,0xd1, 0x98,0xd5,0xfe,0xe1, 0xe0,0x52,0xb7,0x9b, 0x4c,0x8e,0x2b,0xa7, + 0xfd,0xb0,0x20,0xb1, 0x2c,0x16,0x60,0x22, 0x6a,0x27,0x85,0x2b, 0x3d,0x4b,0xa6,0x8a, + 0x60,0x74,0x02,0xc2, 0x88,0x6c,0x5a,0x97, 0xa3,0x42,0xc3,0xd7, 0xda,0xaf,0x8d,0x3a, + 0x42,0xf3,0xef,0xc1, 0x22,0x40,0x9b,0x7e, 0x4e,0x4d,0x49,0x8e, 0xd2,0x2a,0x22,0xb0, + 0x80,0x2e,0x5e,0xba, 0x8a,0x55,0x60,0xaa, 0x23,0x09,0x29,0x12, 0x70,0x8a,0x0d,0x87, + 0x56,0x1e,0x26,0x80, 0x2c,0x11,0xa2,0xb6, 0x99,0x63,0x35,0x52, 0x83,0x3c,0xa6,0xb8, + 0xa5,0x65,0x81,0x82, 0xed,0x6f,0xfd,0x38, 0x24,0x5b,0x45,0x3c, 0xc0,0x53,0xb8,0xab, + 0x51,0x73,0x7d,0x5f, 0x8f,0x6a,0xcd,0xf7, 0xba,0x30,0x9c,0xa6, 0xa1,0xea,0x1d,0x32, + 0x30,0x0c,0x03,0xa9, 0x06,0x5a,0xf6,0x60, 0x1d,0x52,0xf4,0xb0, 0x22,0xe2,0x8e,0x51, + 0x02,0x65,0x00,0x8c, 0x59,0x90,0x24,0x5a, 0xf9,0x82,0x06,0x9c, 0x62,0xd7,0x33,0x55, + 0x8b,0x8f,0x8a,0x7d, 0xdb,0x4c,0x46,0x95, 0x00,0x7b,0x02,0x82, 0x65,0x01,0x1a,0x85, + 0x08,0x04,0x4d,0xa4, 0x31,0x21,0x59,0x40, 0x42,0x40,0x00,0x4a, 0xb5,0x97,0x22,0xa6, + 0x25,0x77,0xa2,0x06, 0xc7,0x1d,0xd9,0x29, 0x09,0x8a,0x64,0xe9, 0x18,0x6a,0x61,0x60, + 0x86,0x10,0x8b,0x5b, 0x41,0xa9,0x44,0x07, 0xd2,0xb9,0x6a,0x8b, 0x75,0x38,0xad,0x51, + 0x26,0x08,0x9c,0xa8, 0x8b,0xb8,0x98,0x8b, 0x0c,0x17,0x8b,0x54, 0x55,0x05,0xd4,0x94, + 0x0a,0xb6,0x04,0x48, 0x45,0x4d,0xbb,0x83, 0x54,0x0c,0x25,0xed, 0xa4,0xaf,0xec,0xc0, + 0xea,0x8a,0x50,0x82, 0x21,0x8d,0xb6,0x8a, 0xea,0x57,0x8c,0x27, 0x31,0x0a,0xc9,0x28, + 0x49,0x80,0x58,0xda, 0x40,0xbf,0x3b,0x05, 0x69,0xa2,0xf1,0x36, 0xcd,0x1d,0x99,0x49, + 0x20,0xa5,0x88,0x3d, 0x76,0x8e,0xe7,0x89, 0x02,0x58,0x56,0x95, 0x2d,0x25,0x75,0xdc, + 0x61,0x52,0xa9,0xa2, 0x06,0x81,0xa4,0x8a, 0x6a,0x80,0x41,0xfb, 0xfc,0x68,0x42,0x0b, + 0xef,0x3e,0x38,0xac, 0x57,0x18,0x54,0xc0, 0x49,0xb5,0x3e,0xca, 0x03,0xdc,0xd8,0xbc, + 0xab,0x33,0xd1,0x8a, 0x7d,0xeb,0xea,0xdd, 0x1f,0x02,0xf8,0x92, 0x45,0x23,0xcb,0xc1, + 0xc3,0x91,0x4b,0x48, 0x20,0x6c,0x6b,0xac, 0xda,0xf5,0x9e,0x24, 0xcc,0xaf,0x0b,0xbc, + 0xf1,0xeb,0x51,0xd5, 0x7b,0x5f,0x3b,0x85, 0xa4,0xa3,0x25,0x99, 0x3e,0x8d,0xcc,0xc2, + 0x83,0x35,0xc4,0xd1, 0x94,0x25,0x05,0xf7, 0x0d,0xf7,0x25,0x8d, 0x26,0x15,0xc3,0x72, + 0x56,0x82,0x89,0xbf, 0x8a,0x99,0x00,0xb2, 0xc2,0x5c,0xde,0x8a, 0x9b,0xc4,0xaa,0xf8, + 0x22,0x95,0xf3,0xe0, 0x12,0x1c,0x6b,0xf0, 0xa4,0x2b,0xf6,0xb1, 0xec,0x7d,0x46,0x1e, + 0x2d,0x9d,0xc7,0xb1, 0x99,0xa7,0x67,0xb5, 0xf9,0xfb,0x8b,0x3e, 0xae,0x5c,0x05,0xc5, + 0x10,0x63,0x30,0x02, 0xf6,0xe7,0x34,0xc8, 0x1a,0x12,0x70,0xfd, 0x4f,0xff,0x17,0x72, + 0x45,0x38,0x50,0x90, 0x08,0xe9,0x08,0x24, + // 0x5cd8 = 23768 data bytes (33%) +}; + +static BZ2Manager_t lecode_pal_bin_mgr + = { lecode_pal_bin_bz2, sizeof(lecode_pal_bin_bz2), 0, 0 }; + +//----------------------------------------------------------------------------------- + +static const u8 lecode_usa_bin_bz2[] = // pool/ref/lecode/r32/lecode-USA.bin +{ + // decompressed size: 0x117a0 = 71584 bytes + 0x00,0x01,0x17,0xa0, + + // bzipped data + 0x42,0x5a,0x68,0x39, 0x31,0x41,0x59,0x26, 0x53,0x59,0x65,0xce, 0x12,0x9b,0x00,0x29, + 0xa4,0x7f,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xe0, 0x4e,0xb7,0xd2,0x7d, 0x77,0x6f,0x7a,0xfb, 0xb0,0xbd,0x89,0x4a, + 0x7d,0x86,0x76,0xf7, 0xb3,0xdc,0x62,0xde, 0x37,0x57,0x6c,0xdc, 0xba,0x9f,0x77,0x5d, + 0xeb,0xba,0xb7,0x61, 0x9b,0x19,0x53,0xb3, 0x29,0x3b,0x34,0x3a, 0xd7,0xa0,0x4d,0xed, + 0xc7,0x36,0x1f,0x47, 0x56,0xc9,0xad,0x20, 0xc8,0xb7,0xd7,0xaf, 0x28,0x69,0xbe,0xa9, + 0x3d,0x96,0x7b,0xbb, 0xdb,0xcd,0xee,0xf7, 0xb7,0x7a,0xf7,0x7b, 0x5e,0x58,0x02,0xae, + 0x44,0xf4,0xe5,0x76, 0x0d,0x5a,0x3e,0xbd, 0x1f,0x2e,0xee,0xf3, 0x9f,0x54,0x78,0xfb, + 0x9f,0x45,0x75,0x6c, 0xee,0xf7,0xdc,0x28, 0xdb,0x79,0xf6,0xdc, 0xf5,0xa7,0xb7,0xa7, + 0x27,0x4f,0x7b,0xba, 0xaa,0xec,0x58,0x3e, 0xd9,0xf5,0xe7,0x6d, 0xf6,0xda,0xd6,0xdb, + 0xd3,0x1d,0xbb,0xb7, 0xc6,0x7c,0xf6,0xde, 0x7d,0xdd,0xc7,0x8f, 0x0b,0x7b,0x87,0x70, + 0xfb,0xb5,0xe3,0x21, 0xe8,0xfa,0x94,0x33, 0x6c,0xf1,0xf2,0xf7, 0x19,0xbd,0x5f,0x7d, + 0x76,0xf9,0xbe,0xd9, 0xed,0xf4,0x3c,0xa9, 0xe7,0x9f,0x43,0xec, 0xe9,0x1d,0xf6,0xf7, + 0xbd,0xd5,0xa7,0xdd, 0xf4,0x2a,0x5d,0xed, 0x6b,0xdc,0xfa,0x7b, 0xcc,0x7d,0x07,0x77, + 0x67,0xae,0xbb,0xd5, 0xdb,0xbb,0x4d,0x47, 0xac,0xec,0xf5,0xd6, 0x55,0x2f,0x2a,0x0e, + 0xf6,0x1a,0x22,0x04, 0x00,0x08,0x1a,0x00, 0x13,0x00,0x02,0x19, 0x18,0x13,0x43,0x23, + 0x10,0x18,0x4d,0x32, 0x31,0x03,0x4d,0x34, 0x0c,0x82,0x7a,0x64, 0x34,0x0d,0x4d,0x30, + 0x53,0xc1,0x36,0xa3, 0x11,0x9a,0x4c,0x4c, 0x4d,0x1a,0x34,0xd4, 0xf1,0x34,0xd3,0x53, + 0x03,0x20,0xc9,0x4f, 0x19,0x34,0x00,0xc9, 0xa2,0x93,0xf5,0x37, 0xa5,0x4f,0x69,0x89, + 0x4f,0x69,0xa9,0xe9, 0x92,0x83,0x53,0x44, 0x26,0x13,0x40,0x01, 0x31,0x32,0x60,0x08, + 0xc0,0x13,0x40,0x00, 0x09,0x84,0x64,0xc4, 0xd4,0xc2,0x64,0x68, 0x6d,0x12,0x78,0x4d, + 0x30,0x81,0x1a,0x9e, 0xd2,0x31,0xa9,0xe8, 0x35,0x19,0xa8,0x61, 0x3d,0x04,0x32,0x34, + 0x6d,0x53,0xda,0x9a, 0x34,0xd4,0xf5,0x33, 0x13,0x1a,0x69,0x1a, 0x6a,0x32,0x6f,0x41, + 0x26,0xc5,0x32,0x31, 0xa4,0xc9,0xe4,0x8d, 0x1e,0x28,0xf4,0x6a, 0x34,0x1a,0x9a,0x10, + 0x00,0x02,0x68,0x00, 0x99,0x06,0x89,0x80, 0xa6,0xc2,0x69,0x84, 0x19,0x09,0x9a,0x00, + 0xd5,0x3c,0xd0,0x99, 0xa9,0x89,0x93,0x09, 0xa9,0xe4,0xd0,0xd5, 0x33,0xca,0x6d,0x46, + 0xca,0x9f,0xa6,0xa9, 0xfa,0x26,0x51,0xea, 0x62,0x3c,0x89,0xe3, 0x25,0x3c,0xa3,0xd3, + 0x4d,0x1a,0x99,0xa9, 0x99,0x4f,0x4d,0x4f, 0x53,0xc4,0xd4,0xfd, 0x53,0xd1,0x1e,0xa7, + 0x94,0xd0,0x64,0xd1, 0x90,0x6c,0xa1,0xa3, 0xd1,0xa4,0x3d,0x27, 0xa8,0x00,0xd3,0x42, + 0x68,0x88,0x4c,0x26, 0x41,0x1e,0xa9,0xfa, 0x26,0x26,0x48,0xf0, 0x53,0x01,0x34,0xcd, + 0x54,0xf2,0x78,0x4d, 0x34,0x51,0xfa,0xa7, 0xe9,0x31,0xaa,0x3c, 0x9e,0x8a,0x34,0xc8, + 0x79,0x4f,0x14,0x79, 0x4f,0x4d,0x36,0xa6, 0x99,0x4f,0x49,0xed, 0x50,0xf5,0x06,0x08, + 0xcd,0x43,0x47,0x94, 0x0f,0x4d,0x26,0xd4, 0xc8,0x7a,0x9e,0x90, 0xda,0x43,0x43,0xd4, + 0x79,0x47,0xa8,0xf2, 0x9a,0x63,0x53,0x46, 0x8f,0xd2,0x20,0x1a, 0x69,0xa6,0x98,0xd4, + 0x7a,0x4d,0x1a,0x68, 0x06,0x9e,0x94,0x22, 0x23,0x2a,0x79,0x4f, 0x4d,0x36,0x93,0x53, + 0x53,0xd9,0x4c,0x34, 0x26,0x0a,0x66,0xd4, 0xc2,0x9e,0x53,0xd4, 0xc2,0x7a,0x7a,0x4d, + 0x27,0xa2,0x79,0x4d, 0x3d,0x35,0x34,0xd1, 0x9a,0x47,0xa1,0x3c, 0x93,0xd1,0xa6,0x84, + 0xc9,0xa0,0xd9,0x1a, 0x8d,0x30,0x6a,0x64, 0xd3,0x4d,0x34,0x34, 0xf5,0x06,0x99,0xa4, + 0x07,0xa4,0xd1,0x84, 0x64,0x19,0x0d,0x34, 0x00,0x1a,0x68,0x69, 0xa0,0x00,0x03,0x4d, + 0x03,0x4d,0x00,0x91, 0x22,0x10,0x02,0x34, 0x01,0x32,0x0d,0x34, 0x0d,0x53,0xc0,0x98, + 0x99,0x34,0xc9,0x93, 0x10,0x0c,0x43,0x53, 0x06,0x9a,0x34,0x99, 0xa5,0x3d,0x4c,0x6a, + 0x79,0x4f,0x14,0xf0, 0x6a,0x7a,0x26,0x4d, 0x34,0x68,0xd4,0xda, 0x18,0x8d,0x0d,0x05, + 0x3d,0x3d,0x53,0xd9, 0x24,0xf6,0x4d,0x1a, 0x69,0xa9,0xe8,0x64, 0x13,0xd2,0x9e,0x28, + 0xcd,0x4f,0x04,0x9e, 0x9e,0x8a,0x7e,0xa7, 0xaa,0x79,0x46,0x9e, 0xa7,0xa9,0x99,0x4f, + 0x4d,0x34,0x7a,0x1a, 0x9b,0x4a,0x0a,0xe1, 0x6c,0x2e,0x0f,0x07, 0x70,0x35,0x7a,0x94, + 0x70,0xa6,0xae,0x88, 0x27,0x60,0xc3,0xfa, 0x1d,0xaf,0x11,0xb9, 0x6c,0x92,0x4d,0x21, + 0x2e,0xd8,0xe9,0x0a, 0x8d,0x44,0x04,0x09, 0x96,0x70,0xa0,0x85, 0x5b,0x7c,0x58,0xe8, + 0x4c,0x55,0xa8,0x85, 0x0c,0x04,0x6e,0xd8, 0x01,0x75,0xa4,0x96, 0xa6,0x8d,0x5d,0x55, + 0x09,0x05,0x67,0x08, 0x21,0x41,0xcc,0x22, 0x08,0xe7,0x30,0x07, 0x63,0x9f,0x82,0x90, + 0x34,0x62,0xb6,0x25, 0x92,0xc2,0x44,0xf2, 0x9b,0x38,0xe6,0x98, 0x53,0x67,0xce,0x77, + 0x99,0xac,0xc3,0x76, 0xba,0xb5,0xea,0xd5, 0x87,0x39,0xb2,0xb5, 0xac,0x55,0x9a,0x9d, + 0xac,0xa3,0xcb,0xad, 0x1e,0xbd,0x88,0x97, 0x33,0x69,0x81,0x0a, 0xea,0x85,0x5b,0xab, + 0xf5,0x37,0xdb,0x7b, 0x37,0xf7,0xf8,0x18, 0x33,0xe5,0xe5,0x81, 0xe9,0x5a,0x61,0xfd, + 0x36,0xc0,0xe8,0x03, 0x0c,0xba,0x99,0xc3, 0x19,0x54,0xab,0xf6, 0x16,0x2e,0x9d,0x8f, + 0x57,0x5a,0xbd,0x78, 0x2b,0xc0,0x42,0x10, 0x96,0xa3,0x92,0xcd, 0x92,0x42,0x33,0x73, + 0x20,0x0a,0x5b,0xe6, 0x9c,0x06,0x53,0x2c, 0x0c,0xa9,0xf3,0x54, 0x28,0x5b,0x76,0x23, + 0x29,0x99,0x6c,0xaf, 0x41,0x10,0xe0,0x6a, 0xb3,0x24,0xc9,0x35, 0x93,0xe8,0x61,0x88, + 0x49,0x0a,0x4d,0xa2, 0x3b,0x93,0x8a,0xd9, 0x76,0xfa,0x4f,0x1f, 0x4d,0xe0,0x5c,0xb0, + 0x00,0xe4,0x00,0xe4, 0x01,0xbd,0xe7,0x33, 0xba,0xbd,0x4f,0xfa, 0xf4,0xb7,0x1d,0x57, + 0xcc,0xc2,0xeb,0x59, 0x6d,0x0c,0x63,0x69, 0x9e,0xa2,0x8f,0x96, 0xcd,0x03,0x47,0xbd, + 0x61,0xad,0x68,0xd1, 0x54,0x40,0x7e,0xcf, 0xdb,0xe9,0xe3,0xfe, 0xdf,0x4d,0xda,0xec, + 0x03,0x05,0xbb,0x06, 0x10,0x0c,0x69,0x6f, 0xb8,0x5c,0xf0,0xa9, 0x44,0xf1,0x4f,0x29, + 0x3d,0x39,0xf9,0xbd, 0x95,0xc5,0xdc,0x4a, 0x26,0x72,0x95,0xd3, 0x77,0x78,0x92,0x44, + 0xf2,0x98,0x38,0xdd, 0xf4,0x66,0x74,0x30, 0x2c,0xe3,0x78,0xc1, 0x2f,0x78,0x8c,0x60, + 0x60,0x20,0x85,0x01, 0xf2,0x3d,0xdf,0xa9, 0x5f,0x5d,0xeb,0xed, 0x54,0x33,0xc5,0x9f, + 0x19,0x84,0xd7,0x86, 0x9e,0xd4,0xaf,0x96, 0x72,0xd8,0xff,0x69, 0x13,0x1c,0xdd,0xda, + 0xc1,0x77,0x1e,0x15, 0xc6,0x0a,0x32,0x3a, 0x2b,0x25,0x16,0xa0, 0xe8,0x9e,0x6b,0x95, + 0x57,0x8c,0xba,0x2c, 0x59,0x7b,0x0a,0x37, 0x4a,0x58,0x1c,0x1a, 0x64,0x75,0x50,0x64, + 0x5b,0x51,0xdc,0xfd, 0x68,0x14,0xc8,0xcb, 0xa5,0x4a,0x3b,0x98, 0xba,0x84,0x6e,0xa9, + 0x1c,0x1c,0xe6,0x12, 0x7d,0x50,0x74,0xbf, 0xc2,0x2c,0xc9,0x58, 0x26,0x2a,0x2f,0xf5, + 0x52,0xd4,0xcb,0x13, 0xa0,0x9a,0x2e,0x5f, 0x60,0x6c,0xe8,0x0d, 0xb4,0x99,0x0b,0x00, + 0xc6,0xee,0x2d,0x2b, 0xc8,0xe2,0x5b,0x4a, 0xe3,0x97,0x69,0xef, 0xa9,0x35,0x84,0xea, + 0x6c,0x37,0xb2,0x60, 0x97,0x5d,0x54,0x14, 0x85,0xe6,0xa1,0x51, 0x37,0x21,0xf0,0xf0, + 0x5a,0xd5,0x66,0x41, 0x2e,0x03,0x9e,0x5e, 0xa6,0x50,0x44,0x3c, 0x42,0xde,0x90,0xa2, + 0x54,0xad,0xbe,0x9b, 0x8f,0x57,0x02,0xa8, 0x04,0x04,0xbd,0x49, 0x3d,0x55,0x40,0x04, + 0x84,0x5c,0xcc,0xd8, 0x7c,0xdc,0x13,0x94, 0xb6,0x6f,0xa6,0xd2, 0xd4,0xf8,0x2a,0x37, + 0x74,0xf5,0xf6,0xfb, 0xa3,0x2d,0x95,0x9c, 0x17,0xdf,0x3d,0x9e, 0x24,0xe5,0x53,0x0f, + 0x86,0xd6,0x2a,0x79, 0xcd,0x1a,0x47,0x46, 0x4f,0x0a,0x2c,0xb8, 0xca,0xec,0x28,0xb9, + 0x50,0x55,0x8e,0x64, 0x7c,0x2b,0x10,0x24, 0xbd,0xf7,0x51,0x20, 0xc9,0x1a,0x65,0xeb, + 0x01,0x1c,0x62,0xe0, 0x97,0x50,0xe2,0xfa, 0xa0,0xb4,0x53,0xf3, 0x19,0x7b,0x14,0xfa, + 0x50,0x79,0xcd,0x1a, 0x42,0x35,0x3e,0xf6, 0xe3,0x33,0xd0,0xb3, 0x7e,0xe4,0x10,0xdc, + 0x17,0x80,0x78,0xca, 0x9f,0x59,0x8b,0xd0, 0x3a,0x0c,0x71,0xe0, 0xbd,0xba,0xcb,0x76, + 0x22,0xee,0xca,0x5d, 0x5a,0x75,0xd4,0x29, 0x0c,0x1e,0x3c,0x3b, 0x95,0x27,0xee,0x45, + 0xfb,0x67,0x08,0xfb, 0x74,0x32,0xd4,0x5a, 0x98,0x9b,0x0d,0x3d, 0x44,0x00,0x31,0xe7, + 0x0b,0x5f,0x1a,0x63, 0x77,0x15,0xe1,0xc7, 0x57,0xb8,0x3c,0x30, 0x62,0x31,0x8b,0x38, + 0x5a,0x09,0x89,0x98, 0x8f,0x47,0xea,0x26, 0x7b,0x6a,0x07,0xe6, 0x1c,0xe6,0x18,0xee, + 0x88,0x9b,0x51,0xb2, 0x55,0x06,0x02,0x51, 0xac,0x6d,0x13,0x07, 0xbc,0xa1,0x95,0x65, + 0x76,0x51,0x7e,0x9f, 0xc0,0xc2,0xcf,0x9b, 0x55,0x6c,0x66,0x61, 0x82,0x92,0xad,0x38, + 0xe0,0x5f,0xf1,0x35, 0xdf,0xea,0xa7,0xe9, 0x24,0x75,0x5e,0x01, 0x16,0x72,0xa7,0x85, + 0xbb,0x5c,0xe1,0x82, 0x23,0xb5,0xab,0xa4, 0xa6,0xa4,0x02,0x5c, 0x2e,0x87,0xb7,0xe7, + 0x66,0xae,0xb1,0x08, 0xb4,0x70,0x08,0x63, 0xf7,0x03,0x92,0x18, 0xa8,0x96,0x71,0x61, + 0x10,0x35,0x5b,0x5a, 0x4f,0x7b,0x2d,0xa6, 0x70,0xdb,0xf3,0xa1, 0x33,0xef,0xaa,0x3d, + 0x4c,0xd9,0x48,0xc3, 0x4e,0xea,0x80,0xa6, 0x40,0x15,0xed,0x37, 0xba,0xdb,0xa4,0x16, + 0xce,0xad,0x35,0x73, 0x26,0x7a,0x9d,0x8a, 0x98,0xa7,0x64,0xc1, 0x15,0x8f,0x4a,0xba, + 0x39,0x53,0x5c,0xb7, 0xc0,0x5d,0x80,0xd6, 0xe1,0x53,0xa0,0x69, 0x6c,0x25,0xcf,0xc6, + 0xb4,0x0f,0x0f,0x1d, 0x51,0xd4,0x45,0x86, 0x93,0xa9,0x71,0x8c, 0xb4,0xde,0xc9,0x42, + 0x95,0x7a,0x93,0xed, 0x09,0xca,0xcf,0xb3, 0x21,0x80,0x4c,0x05, 0x71,0x70,0xdd,0x6a, + 0x0e,0xc1,0xa6,0xc9, 0x6c,0xc0,0x5b,0x51, 0x59,0xb1,0x76,0x5a, 0xad,0xed,0x5a,0x6e, + 0x0c,0xc5,0x40,0x79, 0xf9,0xcd,0x0b,0x8a, 0x1c,0xdf,0x99,0x62, 0x08,0x83,0x05,0x4b, + 0xc6,0xd2,0x39,0x6f, 0x7b,0xaa,0xa2,0x9a, 0x50,0x1a,0x40,0x2e, 0x1e,0x25,0x52,0x53, + 0x74,0x58,0x21,0x2b, 0xca,0x7b,0x52,0x9c, 0xc0,0x98,0x68,0x4f, 0x80,0xba,0xe3,0x95, + 0xe0,0x29,0xc7,0x24, 0x90,0x84,0x21,0x42, 0xb8,0xf8,0xc3,0x85, 0x65,0xb0,0xcf,0xa9, + 0x10,0x45,0x40,0xde, 0xcd,0x7e,0xf6,0xe9, 0xf4,0x40,0x57,0xcc, 0xc7,0x4a,0xe9,0xe5, + 0xd2,0x81,0x77,0x11, 0x87,0xe4,0x18,0x7b, 0x8e,0x37,0x1c,0xea, 0xc2,0x0b,0xaa,0x16, + 0x94,0x40,0xe0,0x43, 0xaf,0x8b,0x42,0xc5, 0x5c,0x2b,0x78,0xb6, 0xd1,0x1a,0x19,0x3b, + 0x45,0x1f,0x84,0x82, 0xb5,0xe1,0x45,0x23, 0x1c,0x4f,0xd5,0x59, 0x89,0x85,0x69,0x83, + 0x62,0x35,0x7b,0x16, 0xe2,0xf5,0xc8,0xa8, 0x1d,0xa5,0x6f,0x10, 0x66,0xb7,0x9c,0xfd, + 0x26,0xe5,0xc8,0x56, 0x30,0x31,0x68,0x92, 0x24,0xa7,0x70,0x81, 0xca,0xe8,0x05,0xc4, + 0xcc,0x18,0x52,0xe8, 0xcc,0x40,0x8d,0x28, 0x44,0x38,0x92,0x53, 0x54,0x8e,0x21,0xbf, + 0x86,0xf4,0x40,0x03, 0x85,0x5a,0xb9,0x58, 0x38,0x23,0x9d,0x21, 0x20,0x9d,0xfa,0xe2, + 0xb4,0xfd,0xc6,0x4e, 0xcf,0xd7,0xe0,0x2d, 0x0a,0xf6,0xa4,0xf7, 0xb0,0x76,0xd6,0xa6, + 0x11,0xe0,0x4c,0x69, 0x11,0xf0,0x38,0x65, 0x2f,0x2e,0xd7,0xe3, 0xbf,0x34,0xdc,0xa7, + 0x42,0x6d,0x60,0xd0, 0xe1,0xc0,0x51,0x85, 0x70,0x39,0x16,0xa8, 0xdc,0x61,0xdf,0x31, + 0xa4,0x6a,0x31,0xcb, 0x56,0xf2,0x5a,0x14, 0xf6,0x56,0x5a,0xd1, 0xaf,0x79,0x70,0xdb, + 0x6d,0xa7,0xfb,0x7c, 0x4c,0x53,0x5f,0x94, 0xe7,0xa6,0x6c,0xd1, 0x4d,0x21,0xa3,0x14, + 0xc0,0x8a,0x2d,0x97, 0x23,0x31,0xe2,0x74, 0x3d,0x8c,0x49,0xb2, 0x06,0xf8,0x19,0xb3, + 0x3d,0x25,0xc2,0x73, 0x21,0xdf,0xdc,0x07, 0xb6,0x2d,0x4e,0x31, 0x28,0x42,0xcc,0x79, + 0x4e,0xd2,0x66,0xa5, 0x0c,0x9d,0x54,0xbe, 0x7e,0x52,0x6f,0xa4, 0x41,0xd9,0xc6,0xe5, + 0xb6,0xfd,0xaf,0x4d, 0x9a,0xce,0x0c,0xfc, 0xe4,0xcf,0x6f,0x6f, 0x4a,0xfd,0x8c,0x94, + 0xd3,0x47,0xe7,0x7c, 0x75,0x82,0xdd,0xfd, 0xc5,0xdf,0xc8,0x5e, 0x4e,0x7d,0xb8,0xce, + 0x61,0x7b,0x76,0x87, 0x4c,0x5b,0xb2,0xe3, 0xae,0xd0,0x58,0x28, 0x3d,0x42,0x24,0xf1, + 0x02,0x95,0x25,0x04, 0xef,0x22,0x21,0x70, 0xea,0xac,0xcc,0xcc, 0xb1,0x8e,0xd1,0x76, + 0x07,0xad,0x2e,0xf3, 0x35,0x9f,0x80,0xa3, 0x9b,0x85,0xf9,0xb9, 0x74,0x33,0x2d,0x5b, + 0xea,0x54,0x24,0x78, 0x8d,0xa4,0x48,0x17, 0xda,0x7b,0xe2,0x82, 0xeb,0x1b,0x18,0x38, + 0x98,0xba,0xce,0x3b, 0xf1,0xfb,0x1c,0xbb, 0xfe,0x3c,0x7d,0xaa, 0xd1,0xce,0x7f,0xbb, + 0x57,0x1f,0xb3,0x85, 0x45,0xf3,0xa4,0x5d, 0x40,0x3b,0x28,0x68, 0xcc,0xc5,0x59,0xb6, + 0x96,0x43,0x8e,0xa7, 0x77,0x67,0xde,0xad, 0x00,0x15,0x49,0x4c, 0x67,0xd0,0x17,0xe7, + 0xa3,0xae,0x2f,0x60, 0x88,0x6b,0x46,0xc5, 0x59,0x30,0xb0,0x10, 0xcc,0x9b,0xe6,0x6e, + 0x27,0xcc,0x10,0xdb, 0x05,0xe1,0x5e,0x78, 0xb2,0x76,0xcc,0x63, 0x19,0x8a,0x57,0x07, + 0x00,0x27,0xf7,0x5d, 0x33,0x24,0x6a,0x2a, 0x7e,0x51,0xc2,0x69, 0x01,0x0b,0xa3,0xbc, + 0x6e,0xf7,0x9c,0xff, 0x5d,0x0d,0x0f,0x74, 0x3b,0x9d,0x48,0xc9, 0x85,0xf7,0x5f,0x34, + 0x92,0x04,0x22,0x7d, 0x3a,0xca,0x23,0x38, 0x70,0x21,0x55,0x4b, 0x13,0xc7,0x82,0x19, + 0xda,0x5d,0x24,0x46, 0x02,0xe2,0xf3,0x4d, 0x89,0xbf,0xa7,0x05, 0x53,0x4c,0x21,0xaf, + 0xa5,0xd1,0xe9,0x66, 0x38,0x18,0xbd,0xa5, 0x2a,0x81,0x59,0x40, 0x51,0x3e,0xeb,0xb0, + 0xe0,0x56,0xca,0x6a, 0x0a,0xd8,0xc7,0x9f, 0x79,0x13,0xe2,0x54, 0x85,0x9f,0x82,0x42, + 0xcd,0x80,0xbd,0x84, 0x7f,0x9c,0xba,0x82, 0x8c,0xa2,0x8f,0x38, 0x2f,0x18,0xc6,0x31, + 0x94,0x00,0xca,0x4a, 0x69,0x77,0x20,0x20, 0x8f,0x7d,0x4c,0xf0, 0x4c,0xfd,0x1b,0x00, + 0xe4,0x31,0x23,0x6a, 0x84,0x05,0xd9,0x0e, 0x26,0xed,0x9c,0x9c, 0x72,0xb9,0x54,0xea, + 0x4a,0xe8,0x0a,0xec, 0xd9,0x75,0xb5,0xcc, 0x47,0x3f,0x5d,0xb0, 0xbb,0x31,0x04,0xf6, + 0x0e,0x03,0x25,0x95, 0x4b,0xfb,0xf6,0x58, 0x52,0xd4,0x64,0xe0, 0x49,0x01,0xa0,0x8d, + 0x07,0x06,0x08,0x39, 0x8b,0xbc,0x40,0x39, 0x86,0x51,0xc6,0xaf, 0x0a,0xd0,0x5c,0xcd, + 0xb1,0x93,0x4f,0x77, 0x7e,0x0f,0xa6,0x2a, 0x0d,0xc3,0x60,0xa1, 0xa2,0x75,0x61,0x11, + 0x9c,0xf3,0x1b,0x10, 0xc2,0xdc,0x6c,0xcf, 0x7c,0xf3,0x4c,0x35, 0x4c,0xe5,0xef,0xeb, + 0xea,0xb5,0xf1,0x2f, 0x34,0xbe,0x2d,0x44, 0xa2,0x72,0xf4,0xb4, 0x9b,0x47,0xa1,0xa9, + 0x2a,0x34,0x49,0xcf, 0x7e,0xb4,0xd1,0xd7, 0xb0,0x59,0xc3,0x00, 0x15,0x82,0xd8,0xb7, + 0xff,0xf3,0x53,0xff, 0x2e,0x97,0xd5,0x6b, 0xb5,0x3f,0xbc,0x95, 0x05,0x2c,0x56,0x96, + 0x32,0xb0,0x18,0xb4, 0x93,0x88,0x80,0xa6, 0x7d,0x27,0x29,0x0b, 0x8a,0x58,0x01,0x84, + 0x00,0x9a,0xbc,0x00, 0xf9,0xad,0x9a,0xb4, 0x1c,0xf5,0x2d,0x2f, 0xdf,0x98,0xe2,0x1f, + 0x57,0x01,0xa7,0x1d, 0x70,0xd9,0x4d,0x05, 0x4d,0x33,0x85,0xd7, 0xb5,0x31,0x81,0x13, + 0xad,0xe0,0xbc,0xdb, 0xf3,0x4f,0x9a,0xd0, 0x30,0x06,0x98,0x48, 0x89,0x32,0xc3,0x5c, + 0xe6,0x7d,0x50,0xb8, 0xda,0xe9,0x31,0xf6, 0xb8,0xe6,0x34,0x5b, 0x1c,0x7b,0x38,0xcd, + 0x38,0xe2,0xcd,0xa4, 0x03,0x4e,0x04,0xee, 0x5b,0x73,0x64,0x65, 0x47,0x61,0x55,0x9a, + 0x6c,0x61,0x7b,0xcd, 0xd3,0xb4,0x25,0xae, 0xb0,0x0f,0x12,0x46, 0x5d,0xe1,0x9f,0x9c, + 0xd4,0x42,0x7c,0x6c, 0x5b,0xbb,0xe8,0xc3, 0xa3,0xe4,0x6b,0x56, 0x46,0x8a,0xff,0xb3, + 0x78,0xc7,0xa5,0x6e, 0xaa,0x82,0x26,0x7e, 0x5e,0xd3,0x8c,0xa5, 0x11,0x34,0x41,0x31, + 0xac,0x92,0x1b,0x67, 0x5e,0x54,0x68,0xd4, 0xf2,0x49,0xf3,0xa1, 0x4d,0xa0,0x40,0xce, + 0xc5,0x3c,0x68,0xdc, 0xec,0xed,0xda,0xdd, 0x57,0x05,0x97,0x78, 0x0e,0x17,0x50,0x01, + 0x20,0x5a,0x92,0x80, 0x66,0x6d,0xdb,0xb2, 0x06,0x84,0x20,0x14, 0x25,0xcc,0x5d,0xc7, + 0x93,0x3e,0xbb,0x64, 0x36,0xe3,0x4e,0xad, 0x5b,0x42,0x60,0xbb, 0xda,0x71,0x83,0x25, + 0x50,0x12,0xf1,0x26, 0x00,0x4c,0x84,0x41, 0xd4,0x4f,0x81,0x8d, 0x12,0x9d,0x0a,0xa2, + 0x0e,0x26,0x67,0x3f, 0x6d,0x37,0x77,0x72, 0xa8,0x55,0xca,0x8d, 0xef,0x3a,0xb5,0xb2, + 0x94,0x8e,0x71,0x01, 0xa9,0xeb,0xea,0x19, 0xd8,0x9f,0x94,0xe1, 0x20,0xa4,0x62,0x65, + 0x16,0x52,0x57,0xcc, 0x5b,0x02,0x33,0x24, 0xb3,0x38,0xea,0xa7, 0x06,0xd6,0x65,0xb7, + 0x1b,0x82,0xc8,0x58, 0x02,0x10,0x18,0x60, 0x10,0x30,0x91,0x2f, 0xe1,0x1d,0x59,0x0e, + 0xad,0x25,0x6e,0x00, 0xb2,0xa5,0x97,0xe4, 0x12,0x95,0xc3,0x38, 0x93,0x2c,0x4e,0xde, + 0x5b,0xa6,0x31,0x44, 0xe1,0x55,0x5d,0xae, 0x59,0x3f,0x85,0x7b, 0xdb,0x40,0xf1,0x59, + 0x69,0x99,0xa9,0x30, 0x66,0x13,0x8e,0x24, 0xcb,0x39,0x3e,0x12, 0x69,0x26,0xe5,0x9e, + 0x07,0xa0,0xc2,0x59, 0x20,0x6f,0x6b,0xe7, 0x69,0xe6,0x8c,0xfc, 0xd7,0xc7,0x0d,0x8e, + 0xa4,0xc5,0xc7,0x56, 0x52,0x98,0x48,0xe7, 0xe7,0x9f,0x4c,0xca, 0x2e,0xcc,0xee,0x29, + 0xa0,0x42,0x35,0x6b, 0x6a,0xb6,0x51,0x44, 0xcc,0x6a,0xfa,0x7f, 0x1b,0x75,0x6a,0xf8, + 0x7c,0xda,0x8f,0x24, 0xee,0xb3,0x14,0x8d, 0x16,0x34,0x88,0x72, 0x24,0x34,0xfe,0x5b, + 0x75,0x55,0x4e,0xbd, 0x59,0x88,0x98,0xe4, 0x2e,0x6e,0xf0,0xba, 0xd2,0x01,0x19,0xa4, + 0x96,0x6b,0x03,0x50, 0x9b,0x36,0x11,0x43, 0x5a,0x66,0x1a,0x46, 0x6a,0x13,0x49,0x38, + 0x82,0x1a,0x87,0xf4, 0x98,0x51,0xa3,0x70, 0xb3,0x5a,0xdb,0xb1, 0x14,0x8e,0xc5,0x30, + 0x10,0xc2,0xcb,0xc9, 0x68,0xa1,0xa4,0x0d, 0x92,0x1c,0x34,0x91, 0x0c,0x0e,0x61,0xd1, + 0xaa,0xa2,0x5c,0x95, 0xe9,0x48,0x3d,0x56, 0xa6,0xb1,0x23,0x65, 0x3b,0x32,0x69,0x96, + 0x5a,0x2c,0x83,0x4d, 0x82,0xac,0xd4,0x98, 0x91,0x8c,0xc9,0x10, 0x9a,0xc5,0x11,0x20, + 0xc6,0x35,0xd8,0x70, 0x2c,0xea,0xeb,0x6e, 0x28,0xb2,0x02,0x0a, 0x03,0x92,0x55,0xaf, + 0xdb,0xa3,0x50,0xca, 0xe1,0x44,0x41,0x94, 0x41,0x83,0xa6,0x26, 0x89,0x92,0xbf,0xe8, + 0xd7,0x40,0x36,0x55, 0x48,0x73,0x4b,0x9e, 0x46,0x01,0x95,0x7f, 0xa1,0x11,0xce,0xd3, + 0xa2,0x3e,0x14,0x73, 0x37,0x8c,0x85,0x13, 0x59,0x96,0xe3,0x5e, 0x8a,0xcf,0x01,0xc1, + 0x7e,0x82,0x5e,0xae, 0xc3,0x7a,0x7c,0x6d, 0x73,0xa2,0x9e,0x77, 0xdb,0xa8,0x24,0xe8, + 0x2f,0x27,0x04,0x6a, 0x4b,0x51,0xa5,0x65, 0x41,0x03,0xb2,0x0a, 0x24,0x06,0xd1,0x02, + 0x53,0x34,0x1c,0xc4, 0x14,0xbd,0xe1,0x0f, 0xc5,0xc3,0x09,0x9d, 0x76,0x57,0xd5,0x4f, + 0x29,0xb7,0x0d,0x1e, 0x9a,0xca,0x79,0x57, 0x27,0x98,0x96,0xb2, 0x97,0x01,0x1e,0x75, + 0x26,0xb0,0x5b,0xf0, 0x1a,0xdb,0x21,0x8c, 0xaa,0xd2,0x7a,0xc3, 0xaf,0x35,0xb9,0x94, + 0x49,0x42,0x6c,0xb6, 0xd7,0x3d,0x0c,0x5e, 0x65,0xf1,0xc0,0x1d, 0xea,0x5c,0x3c,0xe7, + 0x0d,0x7c,0x0d,0x88, 0xbb,0xfe,0x9b,0xc5, 0x87,0x66,0x6b,0xd2, 0xa6,0x47,0x3d,0x76, + 0x0c,0x1d,0x3f,0xef, 0x33,0x27,0x7a,0xeb, 0xa0,0xad,0xd0,0xf5, 0xb7,0xf8,0xd3,0xd3, + 0x48,0x86,0xdc,0xe3, 0xf1,0x65,0x9f,0xa3, 0x4e,0xe8,0xd5,0x28, 0x31,0x6a,0xcf,0x84, + 0x9d,0xd3,0x54,0x1c, 0xe5,0xf9,0xe9,0x37, 0x26,0xf4,0x5c,0x20, 0x03,0x13,0x06,0x30, + 0xb4,0x19,0xf0,0x47, 0x06,0xda,0x2e,0xe5, 0x46,0x27,0x40,0xbe, 0xbe,0xd4,0x6c,0x67, + 0xad,0x2b,0xac,0xe4, 0x87,0x19,0x62,0x1b, 0x96,0x91,0xbf,0x6a, 0xfa,0x23,0x9d,0xa2, + 0x42,0x0f,0x39,0x92, 0x64,0xcd,0xeb,0xb8, 0xd7,0x89,0xa3,0xca, 0xd4,0xad,0xf7,0x4e, + 0x36,0x25,0xcb,0x1c, 0x13,0x06,0x2a,0x16, 0x9c,0x6c,0x21,0x82, 0x7c,0x8f,0xe3,0x65, + 0x69,0xb6,0xe7,0xe6, 0x20,0x47,0x88,0x23, 0xd0,0x5c,0x48,0x6d, 0xa0,0x74,0x95,0x3a, + 0x10,0x92,0x0e,0xe6, 0x73,0x78,0xb5,0x58, 0x39,0xb2,0x52,0xa2, 0x26,0x38,0x53,0xa0, + 0x96,0x2f,0xff,0xa6, 0xe5,0x6f,0x00,0x83, 0xee,0xac,0xed,0x99, 0xdc,0x8c,0x2b,0x5a, + 0xd8,0xff,0xab,0xfd, 0x74,0xd2,0x57,0xc9, 0x38,0x59,0xed,0x66, 0x05,0xa8,0xa2,0x4e, + 0x25,0x4c,0x3a,0x84, 0x90,0x50,0xd0,0x5b, 0x03,0xc2,0x8f,0x66, 0xc5,0xf6,0xe6,0x6b, + 0x3b,0x3d,0x95,0x0a, 0x7b,0x95,0xdf,0x63, 0x71,0x72,0xe9,0x32, 0x5a,0x17,0x01,0xf8, + 0x6f,0xc7,0x79,0x6c, 0xd5,0xe8,0x9e,0xeb, 0x10,0xd5,0xc4,0x72, 0x13,0xdf,0xdd,0xc2, + 0xc9,0x92,0xb5,0x61, 0xbd,0xde,0x1b,0xa8, 0xdb,0x88,0x09,0xc9, 0xc7,0x77,0x40,0x8c, + 0x1a,0xdf,0x75,0x0c, 0x12,0xb6,0x6f,0x5d, 0x38,0x17,0x96,0x74, 0xd4,0xb4,0x41,0xe8, + 0x1d,0x04,0x86,0xc6, 0x35,0xe1,0x03,0x57, 0xf8,0x3e,0x1f,0x19, 0x47,0xc2,0xf7,0x30, + 0xa5,0x13,0x4c,0x14, 0x1e,0xb4,0xa6,0xaf, 0x1b,0x90,0xb8,0x5e, 0xd1,0x7e,0xe5,0x07, + 0x88,0xb9,0x61,0x91, 0x23,0x4b,0x90,0x13, 0xb1,0xa2,0x09,0x11, 0xa5,0xf8,0x87,0x04, + 0x0b,0xc9,0x20,0x28, 0xd1,0x87,0x42,0xd1, 0xa8,0xa2,0x80,0xd3, 0x7d,0x32,0x8b,0xb4, + 0xa4,0x0d,0x63,0xf4, 0x2c,0x7c,0x0c,0x76, 0x13,0x18,0x1c,0x13, 0x8c,0x92,0xe9,0x78, + 0xb1,0x9b,0x38,0xa1, 0x21,0xcb,0x1d,0xed, 0x2c,0x30,0xe1,0xda, 0xfb,0x5b,0x51,0x1d, + 0x82,0xce,0x15,0xdb, 0x85,0xd1,0x7b,0x8c, 0x4c,0xee,0x40,0xb6, 0x7c,0x22,0x37,0xdc, + 0x65,0x00,0x39,0x30, 0xa9,0x8f,0xce,0xc3, 0xb8,0xcc,0x22,0xf8, 0x75,0x41,0xde,0x99, + 0x76,0x95,0x31,0x41, 0xef,0x14,0x0c,0xce, 0x12,0xdc,0x29,0x7f, 0x8c,0xa9,0x78,0x81, + 0x6c,0xa5,0x19,0xa1, 0x5e,0x11,0x58,0xa9, 0x74,0xe4,0x5b,0x02, 0x18,0x95,0x04,0xb7, + 0xa5,0xf0,0xa0,0xdf, 0xa1,0xab,0x66,0x77, 0x53,0x35,0x25,0xf4, 0x99,0x0a,0xf6,0x34, + 0x49,0x8c,0x7b,0xd8, 0xd6,0x4b,0x1d,0x84, 0x9a,0x6d,0x83,0x46, 0x24,0x05,0x96,0x1a, + 0x2b,0x77,0x64,0x52, 0xea,0x68,0x41,0x23, 0x3a,0x21,0x3a,0x79, 0x03,0x86,0x86,0x2c, + 0x84,0x42,0xd6,0x24, 0x69,0x14,0xf0,0x71, 0x28,0x69,0xd6,0x4a, 0x0d,0x4c,0x65,0x17, + 0x01,0x75,0xa6,0x1f, 0x0d,0x6a,0xcc,0x30, 0x91,0xc9,0x29,0xc5, 0xce,0x82,0xc2,0xb3, + 0x5a,0xbd,0x4e,0x71, 0xb0,0xd4,0xd1,0xa0, 0x83,0x86,0xe5,0x2e, 0xad,0x63,0x2a,0xc9, + 0x22,0x6f,0x25,0xa5, 0x6d,0x0d,0x26,0x0b, 0x3c,0x05,0x0a,0x14, 0x85,0xe1,0x9d,0x6e, + 0x22,0x8d,0xf9,0x20, 0xa2,0x25,0x47,0x22, 0xbc,0x1c,0x5c,0x7c, 0x78,0xeb,0xb7,0x71, + 0xf2,0x3b,0xf9,0x56, 0x76,0x79,0xb3,0x6b, 0x34,0xae,0xdc,0xd9, 0x08,0x50,0xd1,0xda, + 0x9c,0x76,0x1a,0x54, 0xa0,0x26,0x13,0x80, 0xff,0x5f,0x6c,0xe2, 0x64,0x23,0x03,0x0b, + 0x34,0x0d,0x84,0xc8, 0x88,0xd9,0xb6,0x90, 0xe5,0x9f,0x45,0x59, 0x1d,0x51,0x5d,0xe4, + 0xe5,0xec,0x9d,0xdc, 0x36,0x0e,0xcf,0xdb, 0x2e,0x86,0xbe,0x00, 0x3f,0xb3,0xf2,0x74, + 0x1b,0x3b,0xbe,0x5c, 0xd2,0x2c,0x11,0x9f, 0x6f,0x23,0x3c,0x6a, 0xb3,0xbb,0xb9,0xf3, + 0xbe,0x0c,0xe0,0xef, 0xb8,0x7a,0x6c,0x6f, 0xe0,0x3b,0x04,0x90, 0x6b,0x1e,0xa7,0xb0, + 0xf9,0xf1,0x17,0xcb, 0xdd,0x6d,0xdc,0x7d, 0x23,0xfe,0x84,0xad, 0x51,0x13,0xb1,0xd8, + 0x08,0xf8,0xf1,0x9e, 0x44,0x92,0x98,0x94, 0x10,0x84,0x58,0x7e, 0xa1,0x58,0x95,0x62, + 0x2e,0x97,0x3d,0xaf, 0xa0,0xd2,0x66,0xe9, 0x0a,0xa5,0x29,0x13, 0xe7,0x78,0x96,0xbb, + 0x7b,0xfd,0xc5,0x7e, 0xe7,0x96,0x30,0xf0, 0xe9,0x22,0x22,0xb6, 0xc1,0xa0,0x31,0x5a, + 0x0e,0x9d,0x86,0xd4, 0xd9,0x0c,0x8f,0x15, 0xfd,0x35,0x07,0x27, 0xc0,0xe8,0x47,0x6d, + 0xc1,0x00,0x33,0x07, 0x6f,0x10,0x11,0xef, 0x24,0xc5,0x34,0xc9, 0x78,0x0b,0x25,0x88, + 0xbc,0x82,0x41,0xef, 0x28,0x86,0x86,0x76, 0xdf,0x24,0x56,0xfc, 0x9e,0x0e,0x79,0x5d, + 0xbf,0x9a,0x33,0xf8, 0x2e,0xd9,0x16,0x60, 0x66,0x37,0x44,0x84, 0x6a,0xb1,0x75,0xe5, + 0x8a,0x30,0xe1,0xbc, 0x3d,0x56,0x16,0x2e, 0x34,0xdb,0x1b,0x7f, 0x86,0xd2,0xe5,0xf8, + 0x60,0xd5,0xd5,0x5f, 0xbb,0xb7,0x29,0x51, 0xc8,0xa8,0x73,0xc5, 0x33,0x13,0xbb,0x46, + 0x02,0xfa,0x73,0x45, 0xea,0xad,0x5f,0x18, 0x2d,0x7d,0x2f,0xf9, 0xfa,0x6f,0xc7,0x8b, + 0x75,0xd6,0xc1,0x5c, 0x0d,0x0b,0x55,0x9b, 0xb7,0xd8,0x4b,0x24, 0xa1,0xb6,0x97,0x38, + 0x6a,0x27,0x4c,0x16, 0x6a,0xcb,0xc9,0x31, 0xbf,0xec,0x80,0x61, 0xa6,0x41,0x15,0x04, + 0x8a,0xe4,0x6d,0xe9, 0x01,0x91,0xb5,0x85, 0xb7,0x6b,0xd5,0xb1, 0x74,0x6d,0x1c,0xfe, + 0x00,0xdb,0x6e,0x0e, 0xb0,0x6a,0x4d,0x74, 0x23,0x18,0xd7,0x49, 0xfc,0x50,0x4f,0x31, + 0x60,0x62,0x72,0xb9, 0xd4,0x2c,0xa3,0xbc, 0x3b,0xfe,0x36,0xb5, 0x16,0x14,0x76,0x5b, + 0xa9,0x1c,0x0b,0x3f, 0x01,0x90,0xc9,0x44, 0x3f,0x22,0x12,0x86, 0x45,0x11,0x39,0x34, + 0x8c,0x6f,0x6d,0x17, 0x19,0x43,0x48,0xd9, 0x6a,0xfb,0x3d,0x0e, 0x13,0x28,0xd0,0x11, + 0x0b,0x44,0x3a,0x86, 0x1d,0xa3,0x54,0xdf, 0xd2,0x70,0xff,0x87, 0x66,0x52,0x7c,0x86, + 0x2f,0x52,0xb5,0x9d, 0x5e,0xa3,0x33,0x67, 0x51,0x6f,0x6d,0x29, 0x21,0x6d,0x19,0xe4, + 0xb4,0x50,0x72,0x10, 0x91,0x53,0x25,0x61, 0x96,0x75,0xa4,0xe7, 0xaa,0xc9,0xa4,0xda, + 0x9f,0xe9,0x4f,0xbb, 0xaf,0x1d,0x9f,0x3c, 0x52,0x32,0x5c,0x04, 0x26,0xa7,0xaf,0x3e, + 0xd0,0x30,0x0c,0x52, 0xcd,0x58,0xc3,0x81, 0x73,0x81,0x70,0x4a, 0xb0,0x28,0x06,0x6c, + 0x2a,0x23,0xc8,0xe6, 0x6a,0xb8,0xa6,0x74, 0x1b,0x35,0xf9,0x95, 0x4e,0x0e,0xe8,0xa5, + 0x1f,0x9c,0xe9,0x2c, 0xfd,0xa5,0x23,0x42, 0xf0,0xa8,0x7f,0x3d, 0x78,0x99,0x03,0xce, + 0xaf,0xdb,0x54,0xab, 0x3e,0x4d,0xcc,0x16, 0xab,0xfb,0x08,0x94, 0x2e,0xc3,0x68,0xa4, + 0x4f,0x79,0x1d,0x41, 0xa0,0x73,0xd1,0x52, 0x15,0xdc,0xeb,0xb1, 0x1d,0xa8,0xa6,0x17, + 0x55,0x73,0x53,0x6a, 0x0a,0xbf,0x35,0x40, 0xe2,0xc6,0x6a,0xb6, 0x3a,0x80,0xc0,0x6b, + 0x18,0xf8,0xba,0x93, 0x84,0x8b,0x7d,0x24, 0xbd,0xa4,0xc1,0x09, 0x41,0x38,0xe0,0x36, + 0xd6,0xf3,0x6f,0x97, 0xc1,0xab,0x3d,0x3e, 0x0e,0xca,0xbf,0xaa, 0x76,0x38,0xa0,0x62, + 0x8c,0x47,0x49,0x1f, 0x55,0xac,0xbc,0x57, 0x5e,0xae,0xd6,0xdf, 0x6f,0xe6,0xcf,0xfb, + 0x58,0x08,0xc5,0xd7, 0x32,0x52,0x4a,0x6d, 0x78,0xdf,0xe5,0xad, 0xc4,0xba,0xc9,0xf7, + 0x24,0x00,0x10,0x09, 0x53,0xd9,0x7b,0x9e, 0xc7,0x2e,0x9a,0x4a, 0xcc,0x21,0xa4,0x0d, + 0x03,0x7a,0x66,0x40, 0xc1,0xb4,0x92,0x60, 0x9f,0xfb,0xe8,0x45, 0x2a,0x1b,0x6c,0xae, + 0x6d,0xa8,0x62,0x42, 0x21,0x44,0xde,0x7c, 0xb5,0x60,0x67,0x3e, 0xd7,0x9d,0x8b,0xb4, + 0x88,0x9d,0x09,0xd3, 0xb3,0x66,0x23,0xee, 0x36,0xb4,0xa6,0x3c, 0x47,0xd1,0x94,0xb5, + 0xa5,0x26,0x7b,0x38, 0xcc,0xc5,0x08,0xb0, 0x55,0x62,0x18,0x38, 0x20,0x92,0x33,0x04, + 0xf2,0x15,0x19,0xf0, 0x81,0xb6,0x37,0xd4, 0xc3,0x89,0x47,0x05, 0x68,0x2b,0x22,0xaa, + 0xc1,0x3c,0x57,0xa1, 0x28,0x44,0xe8,0x19, 0x78,0xb5,0xba,0xb0, 0x6f,0xab,0x5c,0xb3, + 0x30,0x8b,0xd7,0x4e, 0x8b,0x1f,0x26,0x8a, 0x1e,0xbc,0xaa,0x0d, 0x4f,0x48,0x20,0xef, + 0xd6,0x01,0xe8,0x95, 0x04,0xc5,0x83,0x58, 0xe2,0xf4,0xb3,0x0c, 0x2a,0xdf,0xd0,0x20, + 0xe0,0xcb,0x85,0x57, 0xde,0xf4,0x7b,0x99, 0x8f,0xc5,0x20,0x06, 0xb0,0xe1,0x11,0x10, + 0x85,0x5d,0x81,0x2a, 0xe4,0x7a,0xbf,0x52, 0x37,0xd3,0xfd,0x92, 0x47,0xf3,0x30,0x90, + 0xd1,0x36,0x92,0x1b, 0x11,0x8b,0x10,0x83, 0x97,0xaf,0x2c,0x19, 0x98,0xe5,0x54,0x75, + 0xd1,0x4c,0xb7,0x65, 0x29,0x18,0x0c,0x0f, 0x29,0xcf,0x56,0x55, 0x91,0xa2,0x39,0xca, + 0x7a,0x53,0xa2,0x2d, 0xca,0xcb,0x0c,0x3a, 0xe6,0x17,0x55,0x83, 0x7d,0xd1,0xf9,0x47, + 0xdc,0x56,0x61,0xb4, 0xb4,0x75,0x01,0x24, 0x18,0x62,0xdc,0xd2, 0x8f,0x63,0x50,0x1c, + 0x11,0x42,0x7c,0x15, 0x12,0xc2,0xc4,0x9a, 0x77,0x74,0x90,0x90, 0x35,0x33,0x5a,0x05, + 0x3b,0xba,0x4d,0x89, 0x04,0x22,0x6d,0xc1, 0xda,0x14,0x1f,0x8c, 0x69,0x25,0x08,0x68, + 0xb6,0x08,0x67,0xb8, 0xc1,0x98,0xbe,0x32, 0x3a,0x22,0x72,0x66, 0xa1,0x04,0x84,0x10, + 0x50,0xb3,0x75,0xee, 0xe3,0x2a,0xa5,0x1f, 0x14,0x18,0x12,0x50, 0x4f,0x6e,0xcc,0xde, + 0xc4,0xd4,0xe0,0xac, 0xdd,0xed,0x95,0x01, 0xa4,0x68,0x39,0x36, 0x7b,0x9a,0x3a,0x9a, + 0xd7,0x82,0xac,0x75, 0xb5,0x4e,0x1e,0xa8, 0xdb,0x42,0x25,0x6e, 0xac,0x49,0x93,0xbb, + 0xb4,0x2e,0x22,0x6a, 0xa8,0x75,0x42,0xff, 0x06,0x8a,0x65,0x39, 0x05,0x6c,0xfc,0x02, + 0x9a,0xcf,0xc4,0xa5, 0x00,0xf8,0xfa,0x42, 0x49,0x65,0x34,0x82, 0xe3,0x5c,0x6f,0x65, + 0xe0,0xb7,0x1c,0xa0, 0x13,0x21,0x01,0xb5, 0x5d,0xa7,0x19,0x72, 0x93,0x4b,0xed,0x94, + 0x24,0x6d,0xe2,0x03, 0xf3,0x93,0x56,0x23, 0x18,0x82,0x51,0x03, 0x15,0x44,0x15,0x48, + 0x3a,0x01,0xc4,0xfa, 0x92,0xa9,0x8a,0x4c, 0xdd,0x87,0xe8,0x67, 0x5a,0xd2,0x45,0x86, + 0x85,0x0b,0x50,0xb8, 0xf5,0x1c,0x09,0xa4, 0x85,0xd0,0xd7,0xaf, 0x62,0xe2,0x71,0x6f, + 0x55,0xa3,0x08,0xa4, 0xa5,0xb1,0xe8,0x29, 0x3e,0xc3,0xf6,0xa9, 0x2f,0x62,0xd1,0xbe, + 0x77,0x7d,0x5f,0x3b, 0xce,0xac,0x1d,0x4e, 0xd2,0xa0,0xac,0xc7, 0x33,0xc0,0xb8,0xec, + 0x41,0x5e,0xa7,0x95, 0x3d,0x61,0xab,0xb2, 0xd0,0x67,0x70,0xee, 0xc9,0xaf,0xcf,0x17, + 0x7c,0x32,0xb3,0x56, 0xc3,0x0d,0x94,0xb7, 0x8a,0x2d,0x8b,0xe3, 0xda,0xca,0xef,0x69, + 0x02,0x95,0x62,0xcf, 0xdd,0x32,0x35,0x24, 0x22,0x8a,0x32,0x55, 0x83,0x77,0x21,0x95, + 0x95,0x21,0x80,0x03, 0xd3,0x1d,0x22,0x06, 0xd6,0x2a,0xf0,0xa0, 0x35,0xc4,0x59,0x45, + 0x67,0x17,0x25,0xbb, 0xcf,0x79,0x38,0x55, 0x19,0x5c,0x79,0x0c, 0x34,0x67,0xc8,0xc7, + 0x05,0x19,0x40,0xdb, 0xa8,0xa7,0x6e,0xb9, 0xc1,0x80,0x05,0x9d, 0xbd,0x07,0x38,0x44, + 0xab,0xc9,0xb8,0x73, 0x8c,0xf4,0xa6,0x37, 0x42,0x49,0x6b,0x5a, 0x8d,0x58,0x11,0x36, + 0x15,0x96,0x79,0x10, 0x92,0xf7,0xec,0x42, 0xf0,0xe8,0x8e,0x31, 0x33,0x1f,0x48,0xcd, + 0x1c,0x51,0x7d,0x0c, 0xc0,0x78,0x39,0x1d, 0x63,0xdb,0x57,0x87, 0xc1,0xe4,0xf9,0x63, + 0x3a,0xc7,0x1a,0x68, 0x20,0x36,0x33,0x15, 0x6d,0x7a,0xd4,0x2a, 0x17,0x3d,0x20,0x14, + 0x21,0x32,0xdc,0xb7, 0x0f,0xbb,0x25,0x53, 0xb6,0xca,0xb5,0xba, 0xa8,0x66,0x2e,0xe9, + 0x4b,0xea,0x86,0xc0, 0xd5,0x42,0x05,0xe9, 0xe5,0xe2,0x6e,0x22, 0x12,0x16,0xf1,0x81, + 0x89,0xbb,0x2d,0x5c, 0x9d,0x62,0xdc,0x02, 0xc7,0xd9,0xd0,0x25, 0x2c,0xa7,0x14,0x74, + 0x35,0x4b,0xc8,0x88, 0x04,0x6b,0x5a,0x21, 0xf1,0x18,0x10,0xd0, 0x58,0xce,0x13,0x5c, + 0xbe,0x43,0x27,0xdb, 0xcb,0xd8,0x4b,0x26, 0x98,0x5f,0x2a,0xbc, 0x1a,0x76,0xad,0x34, + 0x71,0x83,0x03,0x0d, 0xc3,0x05,0xff,0x0e, 0xfa,0x04,0xbe,0xbe, 0x1e,0xa7,0x3a,0x78, + 0xac,0xcb,0xa1,0x49, 0x92,0xc7,0x6a,0xe4, 0xa1,0x07,0xea,0x69, 0x4b,0x4d,0x14,0x31, + 0x1e,0xc8,0x7a,0xc3, 0x71,0x05,0x66,0xb7, 0x4e,0x13,0x0c,0xa6, 0x8b,0x0e,0x5a,0x08, + 0xaf,0x9a,0x7f,0x8f, 0x19,0x76,0xae,0x36, 0x4d,0xd4,0xb3,0x68, 0xa3,0xd1,0xdb,0x61, + 0x6a,0x17,0x1e,0xc5, 0xa9,0x69,0x19,0x56, 0x31,0xb5,0x8a,0xd2, 0x23,0x46,0xb8,0x25, + 0x5b,0xd0,0x53,0x02, 0xe0,0x9f,0xb8,0x49, 0x89,0x8d,0xb4,0x15, 0x4c,0xdb,0x3d,0xc6, + 0x1f,0xc3,0xf5,0x53, 0x17,0x04,0x1e,0xe1, 0xe6,0x22,0x20,0x27, 0x87,0x3a,0x64,0x67, + 0xb3,0xb8,0xca,0x79, 0xd9,0xd4,0xfe,0x59, 0xc1,0xf6,0x6f,0x91, 0x64,0x88,0x89,0xbb, + 0x91,0xab,0x43,0x09, 0x2d,0x35,0x16,0xcf, 0x13,0x9f,0xdc,0xe6, 0xf6,0x9a,0x4d,0xc5, + 0x9d,0xdd,0xab,0x3a, 0x11,0xde,0x37,0x9c, 0x82,0x60,0x25,0xc0, 0xef,0xff,0xca,0x3b, + 0x3c,0xdf,0x51,0xca, 0xa8,0x25,0xc2,0x7a, 0xbb,0x0c,0xa7,0x24, 0xab,0x2a,0x12,0x36, + 0x0c,0x95,0x43,0x2e, 0x98,0xc3,0xdf,0xcb, 0x5a,0x22,0xfb,0xea, 0x9e,0x49,0xae,0xd9, + 0xf4,0x2c,0x90,0x5d, 0x20,0xf5,0xdc,0xcd, 0xe5,0x56,0xc7,0x6f, 0xc2,0xbb,0x69,0xf2, + 0x10,0x5c,0x66,0x33, 0xcb,0x31,0xa0,0x86, 0xd1,0xca,0xa8,0x84, 0x5c,0xc9,0x38,0x5b, + 0xf0,0x93,0x6e,0xe8, 0x0a,0x62,0x18,0x8f, 0x80,0xaa,0x52,0x76, 0x6c,0x57,0xa3,0xb2, + 0x9f,0x58,0xa1,0xf8, 0x3a,0xdc,0x4b,0xa9, 0xc6,0xa0,0xe5,0x24, 0xfc,0x23,0x08,0xb0, + 0xbb,0x87,0x97,0xd6, 0x1a,0x19,0x6a,0xa3, 0xee,0x4a,0x5a,0x29, 0xe1,0x6d,0x9d,0x9d, + 0x0e,0x21,0xa3,0xcf, 0x5f,0x46,0xe1,0x1a, 0xc4,0x69,0x50,0x02, 0x94,0xa5,0x24,0x90, + 0x96,0xb7,0xa5,0x2b, 0x3c,0x4d,0xab,0x89, 0x71,0xb7,0xd5,0xb6, 0x8b,0x0d,0x29,0xf2, + 0xf0,0x67,0x7b,0x88, 0x48,0xbf,0x4c,0x19, 0x9e,0x86,0x0c,0xe6, 0x78,0x0c,0x45,0x77, + 0xaa,0x7b,0xb6,0x85, 0xa8,0xf9,0x9a,0xe9, 0x60,0x7f,0x9e,0xaa, 0x94,0x1e,0xcb,0x77, + 0x06,0xb1,0x85,0x5d, 0x4e,0x3f,0xb2,0x90, 0x7b,0x2c,0xe8,0x6c, 0xbe,0xc5,0xe4,0xd3, + 0x00,0x5f,0x6b,0x42, 0xc8,0x69,0x1a,0x11, 0x8b,0x40,0xff,0x3d, 0x78,0xd8,0x30,0xab, + 0x3d,0x0b,0xc0,0x61, 0x61,0xf5,0x0d,0x59, 0xc5,0xde,0x49,0x23, 0x3b,0x57,0x1d,0xed, + 0x68,0x04,0x2a,0x9a, 0x4b,0x41,0x9f,0xb5, 0x21,0x2c,0x26,0x16, 0x98,0x50,0x35,0x53, + 0x86,0x3e,0xc6,0x21, 0xb2,0x88,0x0a,0xcd, 0x67,0x4e,0x29,0xab, 0xc5,0x94,0xd8,0x52, + 0x78,0x50,0x8a,0x98, 0xbb,0x26,0x96,0x53, 0xd2,0x35,0xeb,0xf6, 0xd3,0xbe,0xad,0xb4, + 0x6c,0x1b,0xa7,0x58, 0x12,0x22,0x5a,0x3d, 0x61,0x0b,0x19,0x69, 0xa3,0x61,0xd9,0x69, + 0xa9,0xcc,0xee,0xe3, 0x53,0x09,0x55,0x87, 0x8d,0xe6,0x3b,0x17, 0x2b,0xb4,0xe6,0xd3, + 0x62,0xce,0x36,0xf4, 0xd0,0xd4,0xb4,0x1a, 0x79,0x48,0x7c,0x32, 0x72,0xb0,0xee,0x49, + 0xa0,0xce,0xb6,0x08, 0x00,0x2d,0x4f,0x57, 0x71,0x2f,0xbf,0xb8, 0xfc,0x58,0x97,0xbc, + 0x15,0x50,0x6f,0xe9, 0x84,0x4b,0x0a,0x14, 0x39,0x1f,0x23,0xc8, 0xf2,0xff,0xde,0xcf, + 0x71,0xb5,0x9e,0x8e, 0x11,0xf6,0x79,0x58, 0x51,0xc6,0x40,0x40, 0xc3,0x41,0xa7,0xf2, + 0xfb,0xbd,0x1c,0x7d, 0x09,0x3f,0xa3,0x68, 0x6d,0xa1,0x47,0xa4, 0xdb,0x6a,0x53,0x07, + 0x24,0x06,0xdd,0xf6, 0x5c,0xf9,0x61,0x8e, 0xb5,0xf5,0x34,0xc7, 0x37,0xc1,0xac,0x19, + 0x78,0x2f,0x86,0x79, 0xa5,0xa0,0x42,0x92, 0xd3,0xd0,0x64,0x90, 0xb9,0x2a,0x56,0x5d, + 0x41,0x94,0x20,0xe5, 0xc6,0x96,0x2b,0xa5, 0x78,0x69,0xab,0xbd, 0xad,0x69,0x64,0x56, + 0xb7,0xba,0xdf,0xb3, 0xc1,0x01,0x6a,0xa5, 0x83,0x7b,0x5f,0x16, 0x6b,0xd6,0xc2,0x9b, + 0x1d,0x3c,0xea,0x0b, 0x56,0x7b,0xd3,0x9f, 0x3b,0xaf,0xbf,0x73, 0x9e,0x36,0x7a,0x0a, + 0x90,0x92,0xf3,0xf3, 0x0f,0x4b,0xca,0x98, 0x7c,0x86,0x18,0x4f, 0xd9,0xb4,0x8e,0x85, + 0x9f,0x37,0x8f,0x84, 0x22,0x86,0x92,0x33, 0x18,0xbe,0xeb,0x46, 0xa9,0xfb,0xf7,0xec, + 0x9a,0x32,0x98,0xa9, 0x7d,0xa3,0x35,0x8d, 0x17,0xf2,0x63,0x5e, 0x5d,0x81,0x24,0xab, + 0x5e,0x84,0x73,0xe5, 0xd8,0x0d,0xe0,0x03, 0x03,0x9f,0x69,0x7d, 0x46,0x92,0xcc,0x76, + 0x72,0xa1,0x56,0x07, 0xf3,0x4b,0x73,0xcb, 0x29,0xe5,0xa9,0x8a, 0x3c,0x7c,0xba,0xb4, + 0xf2,0xf4,0xf4,0x5a, 0x9c,0x2a,0xc9,0x43, 0x9d,0xdf,0xfa,0x15, 0x78,0x11,0xb2,0x36, + 0x7a,0x39,0x7c,0x4b, 0x17,0x60,0x20,0x36, 0x56,0x9a,0xe0,0x6b, 0x10,0x11,0x9c,0xd0, + 0xa1,0x3f,0x33,0x70, 0xda,0xa9,0xf3,0x7a, 0x98,0x70,0x50,0xe0, 0x2a,0x94,0x28,0x7d, + 0x26,0xc5,0x4f,0x34, 0x60,0xda,0xee,0xc5, 0xdd,0xa5,0x8f,0x9f, 0x7a,0x5b,0xcc,0xbe, + 0x92,0x07,0x03,0xaa, 0x2b,0xbe,0xfd,0x59, 0x54,0xdc,0xb1,0x79, 0x36,0xfa,0x88,0xb1, + 0x27,0x29,0x5d,0x93, 0x23,0x4d,0x80,0xd2, 0xf7,0x00,0x25,0x9d, 0x14,0x2b,0x04,0x25, + 0xc5,0x09,0x6a,0x44, 0xb7,0x06,0xcc,0x51, 0x43,0x19,0x9f,0xec, 0xd0,0x7b,0x46,0x23, + 0xb3,0x73,0x7c,0x3e, 0xe2,0x00,0xe9,0x2b, 0x11,0x65,0xac,0x4c, 0xe5,0xdc,0x68,0x43, + 0xaf,0xea,0xff,0xa7, 0xdc,0xee,0x95,0x1b, 0x4d,0x35,0xcc,0x0e, 0x25,0x1a,0x0b,0x57, + 0x6b,0xb1,0x75,0x6f, 0xe2,0x32,0xfb,0x33, 0xb3,0x20,0x98,0xc2, 0x7e,0xf2,0x52,0x41, + 0xe5,0x31,0x59,0x67, 0xfa,0x73,0x7d,0x94, 0x8e,0x47,0x71,0xba, 0x90,0x15,0xd3,0x12, + 0x47,0x2e,0x98,0x1d, 0xe7,0x7e,0x66,0x48, 0xd8,0x76,0x90,0xa9, 0x1b,0xb1,0xb5,0x90, + 0x8e,0x60,0x15,0x6b, 0x1c,0xb7,0x89,0x41, 0x21,0x85,0x2c,0x03, 0xa6,0x66,0x5b,0x3a, + 0xba,0x21,0x6e,0xd9, 0x0d,0x26,0xc0,0xd1, 0x1f,0x7f,0x71,0x23, 0x60,0xf9,0x6e,0x3a, + 0x0d,0xde,0xd0,0xd6, 0xc8,0x3f,0xbb,0xff, 0xd8,0x1f,0xbb,0x16, 0x59,0x66,0xc6,0xe1, + 0x0a,0x24,0xcc,0x79, 0x98,0xec,0xbf,0xe5, 0x1d,0x21,0xdb,0x78, 0xc5,0xc5,0x37,0x04, + 0x94,0xc8,0xca,0xac, 0x1b,0x98,0xce,0x18, 0x08,0x33,0x32,0x88, 0x76,0xed,0x35,0x9d, + 0xde,0x2b,0x66,0xdb, 0xfa,0x43,0xb0,0xe1, 0x5c,0xb3,0x32,0xf3, 0x31,0xe2,0xb9,0x1a, + 0x1a,0x62,0x9a,0x74, 0x6d,0x7e,0x11,0x93, 0x60,0x1d,0xe3,0xf9, 0x5e,0xda,0x0f,0x6f, + 0xd4,0x11,0x40,0xd7, 0xe6,0xd3,0x72,0x17, 0xe6,0x2a,0x19,0xed, 0x9e,0xe7,0x59,0x16, + 0xda,0xf9,0x7d,0x4c, 0x24,0x7e,0x96,0x6b, 0xb6,0x4a,0x14,0xb7, 0x64,0x1b,0xde,0xc6, + 0x05,0x89,0x29,0xc8, 0xab,0x03,0x51,0x20, 0xbc,0xc4,0xba,0x96, 0x10,0x0c,0xa6,0xfc, + 0xa5,0x5f,0x1f,0xf7, 0xe0,0x93,0x28,0x32, 0xed,0xca,0x51,0xc1, 0xb5,0xfb,0xf3,0xfc, + 0x8b,0xa8,0x54,0x75, 0x90,0x0a,0xf9,0xb0, 0x42,0xa3,0x55,0xff, 0xaf,0x60,0x86,0xb0, + 0xb7,0x71,0xf8,0xb8, 0x1e,0xdc,0x2f,0xf2, 0x63,0x56,0xd7,0xeb, 0xad,0x93,0xeb,0x1d, + 0x52,0xca,0xaa,0x20, 0xf7,0x37,0x25,0xf1, 0x5d,0x11,0xa2,0x68, 0x03,0xae,0x67,0xb7, + 0x65,0xab,0xb6,0x4b, 0x73,0x9e,0x07,0xa3, 0x29,0x21,0xb4,0xd2, 0x2c,0xb8,0x2d,0x68, + 0x8d,0xf9,0x32,0x7a, 0x88,0xf5,0x24,0xb8, 0x56,0xc3,0x61,0x6f, 0x29,0x82,0xe2,0x03, + 0xa5,0xc6,0x67,0x3e, 0xeb,0xc9,0xdf,0x78, 0xbb,0x59,0x7b,0x3f, 0x8f,0x49,0x79,0xeb, + 0xd0,0x40,0xe6,0x03, 0xbe,0x73,0xbf,0x54, 0xd8,0xc0,0x3c,0x1f, 0xe9,0x71,0x00,0x0c, + 0x5d,0x9f,0x25,0x9d, 0xd3,0x11,0x37,0x55, 0x0d,0xdc,0xb2,0xf6, 0xf7,0x3b,0x84,0x53, + 0xf2,0x51,0xc3,0x2d, 0xe8,0xd5,0x4e,0x34, 0x67,0x94,0xd2,0x10, 0x98,0x48,0x1b,0x3d, + 0x20,0xe7,0xa4,0x0f, 0x5f,0x10,0x2f,0x9f, 0x93,0x93,0x28,0xe0, 0x76,0x4f,0xe3,0x63, + 0x51,0x40,0x94,0x35, 0x96,0xce,0x51,0xab, 0x4d,0x7b,0x06,0xb0, 0xf4,0x18,0xb2,0x39, + 0xf6,0x8b,0xfe,0x2c, 0x25,0xf9,0x9a,0x03, 0xd2,0xfa,0x78,0xb8, 0x79,0x5c,0x5e,0x97, + 0x73,0xa6,0xa5,0xfb, 0x13,0x3f,0x5b,0xd5, 0x5a,0x0b,0xcc,0x4b, 0x62,0x3d,0x67,0x9b, + 0x0a,0x4c,0x16,0x2e, 0xbe,0x05,0xc9,0xbe, 0x57,0x3d,0xaf,0xc1, 0x9a,0xbe,0x30,0x52, + 0x80,0x19,0x4c,0x19, 0x4b,0xf8,0x18,0xd2, 0x87,0xd0,0xcc,0xb5, 0x52,0x76,0x01,0x90, + 0x1e,0x09,0xf8,0x1e, 0xdf,0x9d,0x7d,0xbc, 0xe7,0xfc,0xb8,0xaf, 0x5f,0x8d,0xc6,0xcb, + 0x39,0xde,0xb9,0xa3, 0x73,0x04,0x40,0xca, 0xe3,0x61,0x45,0xd7, 0xb8,0xc4,0x67,0x0f, + 0x69,0x38,0x53,0x5e, 0xa2,0x9b,0x5b,0x08, 0x82,0x1d,0x41,0x26, 0xa8,0xc3,0x58,0x3e, + 0xcd,0xbd,0x80,0x32, 0x18,0x63,0x50,0xcb, 0x20,0x90,0x81,0xc1, 0x38,0x3c,0x67,0x04, + 0x5a,0x65,0xda,0xf5, 0xdc,0x4e,0x8b,0xc7, 0xf2,0x2e,0xc7,0x07, 0x33,0xfb,0xd5,0xbe, + 0x1d,0x34,0x24,0xfe, 0x0c,0x2a,0x79,0x51, 0xcd,0x2e,0x73,0xe4, 0x9f,0xc5,0x47,0xae, + 0x25,0x61,0xc0,0xb9, 0xe8,0x65,0x43,0xc7, 0xca,0xb0,0x82,0x51, 0x28,0x55,0xa4,0xfa, + 0x5b,0x42,0x08,0x77, 0x8d,0x12,0x97,0xe4, 0x5e,0x7d,0x54,0x29, 0x03,0x2c,0x90,0x14, + 0xbd,0xe6,0x04,0xa1, 0x86,0x07,0x41,0xbd, 0x17,0xd8,0xa8,0xa1, 0x3a,0x53,0x07,0xba, + 0x7a,0x7b,0x90,0x71, 0x58,0x68,0x73,0xa3, 0x74,0xd7,0xbd,0xd6, 0xc2,0xf1,0x58,0x77, + 0x14,0x41,0x5c,0x6a, 0xf9,0xae,0x80,0x4f, 0xfb,0x3e,0xf4,0x80, 0x3b,0x96,0x51,0x47, + 0x1a,0xdf,0xbc,0x9e, 0x6c,0x54,0x28,0x09, 0x57,0xe7,0xd1,0xfa, 0x66,0xa7,0x57,0x5f, + 0xdb,0x7c,0xfe,0x57, 0x9d,0xa7,0xec,0x28, 0x5c,0xf8,0x26,0x83, 0xc8,0xe7,0x54,0xf9, + 0xea,0x16,0x98,0xe0, 0x20,0x69,0x8a,0x2e, 0x0c,0x0b,0xcc,0x40, 0xd9,0xb9,0x6f,0xce, + 0x89,0x55,0xae,0xed, 0x60,0x82,0x26,0x6c, 0xc3,0x6b,0xd4,0x36, 0x13,0xbe,0x70,0x80, + 0x3e,0x89,0x3a,0x33, 0xa9,0x93,0xd1,0x29, 0xbf,0x41,0x25,0x24, 0xff,0xcf,0xab,0x74, + 0x06,0x0b,0x5f,0x73, 0x59,0x03,0x3d,0x31, 0x8f,0x1a,0x8f,0x44, 0xa3,0x5f,0xc9,0xea, + 0xfe,0x74,0xb8,0x85, 0x87,0xec,0x3e,0x66, 0x3e,0x45,0x80,0xca, 0x90,0xba,0xb6,0xbb, + 0xe6,0x02,0xf3,0xc6, 0x0c,0x62,0x68,0x1b, 0x49,0xb1,0x14,0x35, 0x0c,0x88,0x93,0x83, + 0x30,0x26,0x49,0x74, 0xb7,0xd7,0x0a,0xd4, 0xaa,0xdb,0x36,0x37, 0x72,0xa8,0x94,0x06, + 0xe4,0x90,0x70,0xd5, 0x80,0x99,0xc6,0x33, 0xc0,0x62,0x5a,0xa6, 0xab,0x4c,0xf1,0x7d, + 0xb7,0x47,0xb8,0xdf, 0xf6,0xd2,0xf3,0x62, 0xb7,0x25,0x4f,0x4f, 0x24,0x18,0x0c,0x02, + 0xa6,0x20,0xd3,0x32, 0x2a,0xcb,0xad,0xf8, 0x82,0x65,0x8f,0x6b, 0x8b,0x5b,0x31,0x89, + 0x1e,0xb1,0x9b,0x16, 0x90,0x5b,0x67,0x22, 0xc4,0x23,0x1d,0x89, 0x07,0x46,0xcc,0xa1, + 0xe9,0xd8,0xb3,0xc7, 0x56,0xf1,0x69,0xbf, 0xda,0x53,0xe9,0xb5, 0xe3,0x3c,0x6f,0x2f, + 0x13,0x45,0xba,0xa2, 0x86,0x8d,0x37,0x0f, 0xf1,0xb0,0x4d,0x7f, 0x2f,0x9b,0xec,0x36, + 0x02,0x94,0xbf,0x54, 0xc1,0x39,0x05,0x06, 0xd5,0x3b,0x0d,0x0b, 0xa9,0x12,0x03,0x24, + 0x74,0xcf,0x57,0x65, 0xb5,0x24,0x75,0xfc, 0xc8,0x1c,0xed,0x38, 0xb9,0x8f,0x3c,0x9b, + 0x8b,0x8b,0xcd,0x95, 0xb1,0x42,0x13,0x99, 0x39,0xf2,0x7b,0x26, 0x16,0x28,0xb2,0xb2, + 0x56,0x12,0xb5,0xbd, 0x63,0xb4,0xb2,0x31, 0x14,0x40,0x13,0x34, 0x8b,0xc4,0x74,0x4d, + 0x18,0x82,0x38,0x89, 0x90,0x3d,0x2b,0x44, 0x36,0xd0,0x97,0x5e, 0xc5,0x26,0x36,0x09, + 0xb0,0x49,0x1a,0x49, 0xa1,0xb8,0xde,0x90, 0xdb,0x7f,0x25,0x80, 0x49,0x80,0xd8,0x90, + 0x68,0x1a,0x2c,0x30, 0x91,0xeb,0x4e,0x3f, 0xbd,0x38,0xf5,0xd2, 0xee,0xac,0xfc,0x26, + 0x1e,0xad,0x6f,0xde, 0xc8,0x00,0x7f,0x61, 0x93,0xfb,0x91,0x1f, 0x79,0xd1,0x26,0x20, + 0x50,0x88,0xfb,0x12, 0x92,0xa9,0xd6,0x74, 0x32,0x69,0x22,0xa0, 0xa8,0x36,0xa8,0xb4, + 0x33,0x9c,0x49,0xa4, 0xee,0xcb,0x36,0x2c, 0xcc,0xab,0x29,0x38, 0x47,0x75,0x02,0x46, + 0x02,0x85,0x09,0xd5, 0x0b,0x9c,0x6e,0x6b, 0xd4,0xf8,0x4e,0x00, 0xbb,0xb8,0xaa,0x6d, + 0xdf,0x5f,0xa5,0x89, 0x87,0x63,0xf5,0x60, 0x91,0x32,0x75,0x9d, 0x3f,0x47,0x70,0xb1, + 0x12,0xb5,0xf0,0x00, 0x39,0x22,0x20,0x09, 0x31,0x38,0xf8,0x5f, 0xab,0x24,0x4f,0x6a, + 0x7a,0x2a,0xed,0x87, 0xba,0x9a,0x26,0x31, 0x7a,0x70,0x53,0xc4, 0x90,0x8d,0x50,0xa1, + 0x1b,0x66,0x63,0x21, 0x78,0x2f,0x28,0x82, 0x37,0x8b,0x84,0x70, 0x60,0x12,0xb9,0xe8, + 0xed,0x9f,0xeb,0x6a, 0x55,0x55,0x8f,0xf6, 0xa0,0x45,0x7b,0x3d, 0x81,0x35,0x83,0x2e, + 0x3c,0xac,0x08,0x0a, 0x03,0x02,0x0d,0x07, 0x37,0xb1,0x01,0x48, 0x64,0xc2,0xc2,0x45, + 0x2b,0xe3,0xe2,0xbc, 0xce,0x77,0x4d,0x5e, 0x30,0xe0,0xa2,0x6c, 0xe2,0x44,0x62,0xfb, + 0xdd,0xd4,0xe7,0x1b, 0x38,0x32,0xe2,0xcd, 0xed,0xda,0xdd,0x15, 0x5a,0x6a,0x2f,0x08, + 0x4a,0xe1,0xd7,0x6d, 0x5d,0xec,0xf2,0x8a, 0x49,0xc6,0x48,0xbf, 0x96,0x79,0x4c,0xf2, + 0x41,0x10,0xec,0x7f, 0x5a,0xad,0x28,0x17, 0xba,0x6a,0x0c,0x27, 0xab,0x3d,0xd7,0xff, + 0x8d,0x71,0xc4,0xcb, 0x28,0x40,0xd0,0xd2, 0x59,0x40,0x82,0x57, 0x3a,0x9e,0x07,0xc3, + 0xf0,0x70,0xde,0xbc, 0x84,0x39,0xca,0x28, 0xe1,0x65,0x5b,0xc9, 0xcf,0x7a,0x3c,0xa7, + 0x97,0x42,0x41,0xd1, 0x74,0xab,0x7c,0xc9, 0x01,0x5b,0x61,0x5f, 0x6f,0x65,0xdb,0xfd, + 0x77,0x6b,0x72,0x6b, 0x8f,0x34,0x3d,0x49, 0x32,0x69,0xb6,0x57, 0x0e,0xc2,0x2d,0xfe, + 0x19,0xda,0xdb,0x17, 0x0f,0xe7,0x3f,0x56, 0xc4,0xe0,0xdc,0x30, 0x7f,0x5c,0xcd,0x2a, + 0xf9,0xba,0xfb,0xca, 0x87,0x81,0x9f,0x8c, 0xba,0x61,0x1b,0x16, 0xb6,0x1a,0xf8,0xfb, + 0xb5,0x51,0xf4,0x3f, 0x45,0xe3,0x57,0x14, 0xa6,0x03,0xae,0xec, 0x2a,0xca,0x0a,0x08, + 0x98,0xa3,0x48,0x1e, 0x46,0x8a,0x81,0x5d, 0x2a,0xbf,0x0b,0xda, 0xc4,0xbf,0xbb,0xe7, + 0x84,0x26,0x00,0xc1, 0xa1,0xba,0x24,0x08, 0x94,0x2c,0x46,0x9b, 0x6c,0x32,0xe7,0x02, + 0x31,0x1a,0xc7,0xfd, 0x9c,0xa7,0xf6,0x92, 0xf1,0x99,0x41,0xb6, 0xd6,0xf6,0xdc,0xde, + 0x57,0xc6,0xd6,0x24, 0x63,0x9a,0xf6,0x88, 0xe9,0x18,0x6b,0x1a, 0x9d,0x46,0xdf,0xd0, + 0x9a,0x3d,0xf4,0xdd, 0x64,0xbb,0xf2,0x73, 0x6b,0x37,0x2a,0x14, 0x8a,0x7f,0x91,0x40, + 0x50,0x15,0x07,0x39, 0x6a,0x42,0xd4,0x25, 0x5a,0x82,0x14,0x86, 0xa9,0x28,0x70,0xb9, + 0x8a,0x4a,0x09,0xb5, 0xdd,0xc1,0xcf,0xb0, 0xa7,0x75,0xda,0xd8, 0x97,0x31,0x8d,0x5f, + 0xcc,0x7e,0x77,0x17, 0xce,0x90,0x65,0x8d, 0x72,0xcc,0xb0,0x5e, 0xdd,0x73,0x9d,0xaf, + 0xc7,0xd6,0x52,0x0d, 0xdf,0x4a,0xac,0xd1, 0xc6,0xbf,0x2c,0x95, 0x9c,0x82,0x28,0x1c, + 0x26,0xe0,0xc3,0x68, 0x64,0xe6,0x9e,0xb1, 0x82,0x4a,0x94,0x69, 0x8d,0x8a,0x91,0x2c, + 0x5b,0xa9,0x49,0x43, 0x3d,0xcc,0x34,0xb3, 0x3c,0xaa,0xae,0xc5, 0xf6,0xae,0xc1,0xa2, + 0xc4,0x9a,0x0c,0xd5, 0x4f,0x19,0x04,0x95, 0xb1,0x31,0x7f,0x7f, 0x55,0xe5,0xcc,0xbf, + 0x41,0x16,0xec,0x06, 0xce,0xbf,0x24,0xd6, 0x36,0xce,0xb1,0x5b, 0x2e,0xc2,0x35,0xf7, + 0xf7,0x85,0x74,0x55, 0xd2,0x4e,0x69,0x5c, 0x71,0x10,0x61,0xa7, 0x58,0xa4,0xc5,0xda, + 0xf2,0xe7,0x55,0xf6, 0xbc,0xbc,0x3e,0x1f, 0xfd,0x7b,0x46,0xcf, 0x88,0xde,0x4c,0xbd, + 0x9f,0xa5,0x9e,0x16, 0xf7,0xfe,0xd0,0x75, 0x1c,0xac,0xce,0x57, 0x85,0xc9,0x65,0xff, + 0xdf,0x91,0xec,0x3b, 0x45,0xec,0x11,0x83, 0x59,0xf0,0x33,0xc1, 0xef,0xee,0xe5,0xaf, + 0x64,0x1b,0x8e,0x4a, 0x3e,0xf9,0xe8,0x0f, 0x9b,0xa3,0x0f,0x8d, 0xdb,0xbe,0x55,0x76, + 0x9a,0x53,0x2f,0x2d, 0xb7,0xb3,0x08,0xdf, 0x33,0xcd,0x92,0x46, 0xd5,0x91,0xa4,0x92, + 0xb4,0xcf,0xc9,0x2e, 0x85,0x4f,0x77,0xef, 0x2b,0xab,0x92,0x77, 0x6d,0x66,0xdc,0x27, + 0xf6,0xf8,0x1b,0x6b, 0x4c,0x4d,0x46,0xb9, 0xc0,0x61,0x28,0xc8, 0xbb,0xf8,0x37,0xcb, + 0xd1,0x78,0xf3,0xd8, 0x01,0x61,0xfa,0xfe, 0x2b,0x2e,0xd4,0xa7, 0x30,0xfb,0xa5,0x92, + 0xa4,0xe8,0x6b,0x3b, 0xe9,0x70,0xc7,0xf5, 0x8c,0x9a,0x4f,0x93, 0x70,0xe5,0x7a,0xb6, + 0xb1,0xf4,0xd0,0x7e, 0x15,0x7f,0xce,0x96, 0x3f,0x6b,0x65,0xd2, 0xd2,0x55,0xd4,0x34, + 0x43,0x95,0x92,0xf0, 0xf0,0x8b,0xaf,0x12, 0x91,0xb2,0xc3,0x08, 0x03,0xa5,0xf5,0xfb, + 0x6a,0xb3,0x5e,0xbb, 0xad,0x90,0xab,0x4b, 0x7f,0x66,0xa2,0x1d, 0x98,0x4e,0x95,0xe7, + 0x1f,0xf3,0xd6,0x1d, 0x52,0x49,0x63,0x92, 0x88,0x46,0xbf,0x53, 0xa8,0xab,0x08,0x5d, + 0xa0,0x7f,0x8c,0x5e, 0x06,0x62,0x0a,0x73, 0x51,0x65,0xb1,0x9f, 0xf4,0x63,0x8b,0x54, + 0x7d,0x27,0x3c,0xdd, 0xb7,0x57,0xde,0xe8, 0xaa,0xc7,0xbe,0xc8, 0x65,0x92,0x80,0xa1, + 0x93,0x5f,0xb2,0x75, 0x3d,0xc3,0xc5,0xb0, 0x80,0x17,0x30,0xc2, 0x11,0xcd,0xfc,0xa8, + 0x12,0x0b,0xfe,0x8c, 0xb5,0xab,0x20,0x85, 0xd6,0xfd,0x3e,0x8e, 0x7b,0x8c,0xb4,0xa7, + 0x3f,0xb4,0x07,0xe6, 0x05,0x0c,0xef,0xcb, 0x7f,0xda,0xf3,0xd9, 0xdf,0x90,0x15,0xcf, + 0x9c,0xf0,0xe3,0x2f, 0x56,0x03,0xec,0x7a, 0x5a,0xcd,0x6c,0xb3, 0x15,0xb5,0x5b,0x0f, + 0xe0,0xf7,0x1f,0x29, 0xbf,0x62,0x73,0x03, 0x6e,0x6f,0x63,0x1b, 0x58,0x9d,0x2d,0xb2, + 0xa9,0x10,0x3f,0x09, 0x1b,0xe5,0x18,0xc0, 0xe0,0xc3,0x6b,0x88, 0x8c,0x5f,0xdf,0x19, + 0x66,0x89,0x3b,0xc2, 0x04,0x18,0x20,0x63, 0x90,0x2f,0x96,0x6d, 0xf4,0x10,0x05,0xe1, + 0x60,0x28,0x36,0xc7, 0x85,0x31,0x5e,0xa4, 0x6a,0xa9,0xb4,0x33, 0x0b,0xb8,0xbf,0x3d, + 0x7e,0x33,0x3a,0x69, 0xd3,0x01,0x48,0x8a, 0x9d,0x9b,0x7c,0x7b, 0x9f,0x3f,0x33,0xaa, + 0x71,0xb9,0x91,0x1c, 0x86,0x97,0xd6,0x37, 0xa0,0x6b,0xa2,0x31, 0xa9,0xa1,0xc0,0x50, + 0x07,0x04,0x72,0x06, 0x9d,0x78,0x68,0x48, 0x0b,0x2b,0xfb,0xac, 0x49,0x04,0xa0,0x46, + 0xff,0x3d,0xfe,0xb0, 0x76,0x7c,0x0d,0x15, 0x2e,0xcf,0x47,0xe1, 0x39,0x8c,0x6f,0xc4, + 0xa1,0xae,0x57,0x47, 0x78,0xa0,0xe3,0x4a, 0x20,0x4f,0x18,0xda, 0xdb,0xed,0x26,0xa3, + 0x16,0x8f,0x93,0xe3, 0x5c,0x33,0xfe,0xd8, 0xd9,0xb8,0x08,0xe9, 0x79,0x9b,0x0c,0x9e, + 0x17,0x1f,0xb7,0xd6, 0xa0,0x36,0xc3,0xc3, 0xeb,0x1d,0x7b,0x79, 0x57,0x17,0x16,0xb7, + 0x88,0x48,0x8d,0xa0, 0x61,0x09,0x24,0x42, 0xbc,0x4e,0x0d,0x35, 0xcd,0xce,0x88,0x46, + 0x3c,0x66,0xfb,0xd4, 0x52,0x42,0x6e,0x9c, 0xa4,0xe9,0xb2,0x99, 0x83,0x7d,0x18,0x67, + 0x66,0xdb,0x71,0xb5, 0xcf,0xc4,0x8d,0x62, 0xb6,0xfd,0x73,0xb2, 0x5f,0x56,0x84,0x96, + 0x38,0xb6,0x92,0xd8, 0x69,0x1d,0xf2,0x38, 0x29,0xc0,0x73,0x51, 0x06,0x90,0xdb,0x9d, + 0x9c,0x1a,0xbe,0x82, 0xad,0x6b,0xb9,0xf5, 0x6b,0x4f,0x83,0xfd, 0xfa,0x54,0x36,0x89, + 0xe8,0x55,0xf9,0xea, 0x56,0xc9,0x7c,0x33, 0xd2,0xc3,0xa6,0x4c, 0x7a,0xb3,0xd6,0xc2, + 0xfa,0x16,0x33,0xc4, 0xdc,0xee,0xeb,0xa5, 0x53,0xa0,0xa7,0xc9, 0x6b,0xd9,0xa3,0x67, + 0x2e,0xcd,0x7d,0xe2, 0x76,0x2b,0xe8,0xbf, 0x8e,0x98,0xa2,0x98, 0x20,0xee,0xaf,0x3e, + 0x0b,0xed,0xda,0xbd, 0xa7,0x61,0x80,0x0e, 0xfd,0xc9,0x8c,0x3c, 0x02,0x0b,0x6f,0xa9, + 0xac,0x91,0x47,0x7a, 0x72,0xec,0x53,0xd8, 0x79,0x12,0xff,0x9b, 0x29,0x49,0x21,0x6f, + 0x92,0x39,0xd4,0x84, 0xbc,0x3d,0x9d,0xde, 0xab,0xc6,0x71,0xaf, 0xd6,0xd2,0x54,0x3b, + 0xe1,0x2e,0x78,0xd1, 0x8b,0x72,0x25,0x9e, 0x22,0x68,0xc3,0xd3, 0xd5,0xa2,0x19,0xfc, + 0xea,0xb7,0x67,0xdc, 0xc9,0xae,0x96,0x8d, 0x50,0x44,0xcb,0xe4, 0x70,0x93,0x29,0xd9, + 0xa4,0x81,0x94,0x36, 0x87,0xbb,0x70,0x11, 0xa4,0x45,0xdf,0x23, 0x03,0x50,0xa2,0x96, + 0x38,0x42,0xd6,0x35, 0x86,0x1f,0x48,0x00, 0xe1,0x70,0x29,0x1e, 0x58,0x05,0xbb,0xfd, + 0x3b,0x4e,0x77,0xbe, 0x9b,0x86,0x31,0x6a, 0x7f,0x38,0xfc,0xdc, 0xbf,0x0c,0x03,0x19, + 0x58,0x17,0x7d,0x0f, 0xc3,0xca,0x32,0x1b, 0x17,0xba,0xc3,0x0c, 0xe5,0x35,0x90,0x96, + 0x08,0x71,0xd6,0xd1, 0x3e,0x39,0xce,0xe5, 0x7b,0xf1,0x3f,0x15, 0xa4,0x79,0xac,0xae, + 0x1c,0x75,0x9e,0x12, 0xb9,0x9f,0x0a,0xf6, 0x6d,0x42,0xc8,0x1c, 0xef,0xd9,0x03,0x55, + 0xbb,0x5d,0x7c,0xe2, 0x03,0xef,0xa1,0xd0, 0x74,0xb1,0xe1,0x8c, 0x40,0xb0,0x82,0x3a, + 0x2a,0xfd,0x4c,0xea, 0xe5,0x45,0x4b,0x9c, 0x0c,0x94,0x32,0x09, 0x22,0xf9,0x29,0xec, + 0x7a,0x0a,0x5f,0x66, 0x36,0x85,0xcc,0x46, 0x9a,0x43,0x80,0x50, 0x74,0x4e,0xe6,0xa6, + 0x14,0x18,0x30,0x46, 0x92,0x18,0x90,0x60, 0xc1,0x2e,0x4d,0x86, 0x67,0x2f,0x3b,0x63, + 0x6a,0x75,0xa4,0x10, 0x01,0x55,0x16,0xa1, 0x8e,0xe4,0xaf,0xb5, 0x7e,0xb5,0x67,0xd4, + 0xff,0x66,0x8e,0x26, 0xc6,0x3d,0x1f,0xa3, 0xeb,0xa8,0x67,0x8a, 0x42,0xa0,0x5d,0x18, + 0x4c,0x72,0x53,0x88, 0x35,0xe8,0xb7,0x02, 0x62,0x8a,0xaa,0x63, 0x5e,0x8a,0x2c,0xd2, + 0x6e,0xf8,0x94,0xca, 0xaf,0x5f,0xd5,0xf2, 0xe5,0xd6,0xd3,0x3b, 0x43,0x2f,0x3e,0xa1, + 0x03,0xf9,0x91,0x26, 0x72,0x3c,0x5e,0x17, 0xc9,0xc1,0xa7,0xb9, 0xa1,0x24,0x88,0x56, + 0x84,0xb3,0xd2,0x4d, 0x1b,0x76,0xc8,0x40, 0x81,0x40,0x40,0x10, 0x26,0xf6,0xd2,0x4b, + 0x37,0x11,0x15,0x74, 0x9b,0x2e,0x5b,0x68, 0xfb,0x3f,0xae,0x0c, 0xed,0xc3,0x56,0xb0, + 0x82,0x11,0x70,0x65, 0xbd,0xc3,0xc1,0x37, 0xe3,0xd8,0x7f,0x0c, 0x89,0x79,0x14,0x6e, + 0xe3,0x20,0x30,0xf6, 0x3b,0x3f,0xf9,0xc3, 0x61,0x46,0xa3,0x3f, 0xd5,0x7b,0xa5,0x66, + 0x4b,0x8c,0x68,0x8e, 0x71,0xdf,0x81,0x3f, 0x9d,0x49,0xf3,0xc9, 0xad,0xd8,0x2e,0x01, + 0x44,0xa7,0x8c,0xa3, 0x39,0x18,0xff,0x12, 0x5e,0x22,0x7e,0x30, 0x80,0x74,0x6f,0x7c, + 0xc2,0x13,0x47,0x90, 0xa9,0x93,0x46,0xaa, 0x1a,0x06,0xa1,0xeb, 0xd4,0x74,0x30,0x4b, + 0x91,0x2f,0xab,0x4d, 0xb6,0x8c,0x45,0xd0, 0x28,0xab,0x0f,0x7f, 0xc9,0xf8,0x14,0x9d, + 0xb2,0x9c,0xfa,0x44, 0x64,0xdf,0x4d,0x3d, 0x1e,0x9a,0x7a,0xee, 0xf6,0x3c,0x20,0x66, + 0x08,0xc2,0x6f,0x51, 0x23,0x42,0xce,0x8f, 0xbf,0xbf,0x6f,0x8d, 0x5d,0x97,0xa3,0xde, + 0x52,0x4a,0x7d,0xab, 0x9f,0xb7,0x0e,0xce, 0x34,0x07,0x55,0xc7, 0x9e,0x8d,0x51,0xad, + 0x24,0xc8,0xa1,0x96, 0x78,0xe3,0x76,0x29, 0x2d,0x12,0x92,0x97, 0xbe,0xc8,0x78,0x67, + 0x1e,0x53,0x71,0xd4, 0x9b,0x2e,0x61,0xf4, 0xff,0x95,0xc7,0x02, 0x7d,0x3b,0x0f,0xd2, + 0x81,0x8e,0x54,0x77, 0x95,0xb8,0x4b,0x05, 0x4e,0xa9,0x69,0x73, 0xf8,0x1c,0x7f,0x11, + 0x5a,0xef,0xec,0xd8, 0x59,0x57,0xa2,0x72, 0x6b,0x32,0x0d,0x59, 0x22,0xbd,0x82,0x0f, + 0xb7,0x44,0x6e,0xd9, 0x09,0x36,0x35,0xdb, 0x31,0x50,0xdb,0x17, 0x06,0x72,0x1c,0x8f, + 0xba,0x60,0x7e,0xbe, 0x83,0x63,0x3a,0x81, 0x54,0xd2,0xe3,0x89, 0x67,0x12,0x1b,0x45, + 0xa5,0xaa,0xcf,0x12, 0x53,0x9b,0xd0,0xee, 0x5e,0x01,0x45,0x78, 0x5f,0xfc,0xd9,0xe5, + 0x2b,0xc3,0x24,0x27, 0x78,0x0e,0xb3,0x73, 0x8f,0x9f,0x3e,0x13, 0x38,0x75,0x74,0x10, + 0x71,0xab,0xf7,0x94, 0xa8,0x30,0xd3,0x53, 0x8b,0xe7,0xb7,0x72, 0xfa,0x16,0x37,0x90, + 0xd6,0xf7,0x2b,0x5b, 0x42,0xa0,0xa6,0xff, 0x11,0xbf,0x33,0x16, 0x13,0x87,0xd8,0x2b, + 0xd9,0x66,0xa9,0x71, 0xea,0xf2,0xb0,0x46, 0x7e,0x1b,0x1d,0x0b, 0x5b,0x55,0x42,0x1c, + 0x95,0x89,0xc4,0x25, 0xcf,0x2a,0x7b,0x8a, 0xf5,0x76,0xf1,0x2d, 0x2e,0x17,0x97,0xb1, + 0x7b,0xc8,0xae,0xa2, 0xae,0xc3,0x43,0x4e, 0x62,0x7e,0x86,0xae, 0xc0,0x68,0xec,0x6b, + 0x67,0x4a,0x9d,0x80, 0xde,0x4f,0xca,0x82, 0x9d,0x1e,0x32,0xf5, 0x3a,0xbf,0x4b,0x06, + 0xbc,0x22,0x3d,0x87, 0x61,0x6b,0x6d,0xae, 0xc0,0xa9,0x0e,0xd9, 0x8d,0xfc,0x4d,0xde, + 0x13,0xaa,0x75,0xcc, 0xd0,0x07,0x42,0x72, 0x48,0x5a,0x4a,0x3c, 0x61,0x32,0x8d,0x36, + 0x16,0x9a,0x78,0xaf, 0x69,0x3d,0x3a,0x8f, 0x9a,0x49,0x53,0xaf, 0xdf,0xdc,0xd7,0x70, + 0xde,0x07,0x3e,0xad, 0xa4,0xe7,0x35,0x34, 0xb7,0xe1,0x4a,0x96, 0xcf,0x13,0x4f,0x17, + 0x08,0xd4,0x41,0x4a, 0xc0,0x42,0x9a,0x4d, 0x6d,0xce,0xb2,0x8a, 0xa6,0xc6,0x27,0xc8, + 0x0a,0x57,0x15,0x10, 0x0c,0x16,0x73,0x0e, 0xdf,0x1d,0x41,0x01, 0x41,0xe5,0xa8,0x11, + 0x3c,0x8d,0x36,0x89, 0xdd,0x67,0x94,0xd6, 0x13,0x37,0x6f,0xf8, 0x6b,0x28,0x42,0xb4, + 0x30,0xca,0x68,0xe1, 0x33,0x68,0xc2,0x6d, 0x0b,0x25,0x96,0xd8, 0x69,0xd8,0xa4,0xc4, + 0xa8,0x60,0x8c,0xfb, 0x12,0xca,0x62,0x05, 0xac,0xf3,0xf5,0xf8, 0x92,0x4c,0x99,0x7f, + 0x0e,0xc6,0x82,0x7e, 0xfb,0x4f,0xcb,0x98, 0x82,0xae,0xc6,0xb2, 0x96,0xbf,0xb5,0x71, + 0x43,0x6d,0x21,0x9d, 0x87,0x95,0x69,0xe6, 0x4f,0x16,0x85,0x6e, 0x46,0x74,0xa9,0x1a, + 0x71,0xa6,0x1c,0x84, 0x26,0x3a,0x98,0x9d, 0x7f,0xc2,0x57,0xb9, 0x89,0xdc,0xe8,0xd0, + 0x60,0xcc,0xda,0x12, 0xa1,0xcd,0x57,0xc7, 0xfd,0x6e,0x6f,0x57, 0x82,0x15,0x1e,0xc6, + 0xb1,0x47,0xde,0xdb, 0x45,0x18,0xa3,0xe2, 0x2f,0xe5,0x4b,0xfe, 0x01,0x10,0x59,0xcf, + 0xe5,0x4e,0x65,0x93, 0x63,0x3d,0xcf,0x5f, 0x23,0x5d,0x7b,0x94, 0xb3,0x6d,0x77,0x63, + 0x83,0xaf,0x48,0xdd, 0xdd,0xea,0x5f,0x85, 0x9d,0xad,0x1d,0x86, 0x75,0xb5,0xbd,0xce, + 0x73,0x93,0x1a,0x7d, 0x83,0x8c,0x8d,0x81, 0xcc,0x0d,0x82,0x43, 0x44,0x9b,0x94,0xa2, + 0x9c,0x8a,0xc9,0x11, 0x11,0x92,0x55,0xcc, 0xa4,0x01,0x9b,0x83, 0x09,0x00,0x42,0x23, + 0x03,0x74,0xf7,0xa0, 0xe0,0x07,0x54,0x1c, 0x23,0x65,0x6b,0x1e, 0x62,0x52,0xca,0x6d, + 0xab,0x4b,0x31,0x57, 0x88,0xb5,0xf3,0x96, 0x1d,0x4c,0xc4,0xb6, 0xc3,0x4d,0xf4,0x18, + 0x8e,0x26,0x30,0xe5, 0xfe,0x8c,0x6e,0xa1, 0x07,0x92,0x57,0x73, 0x21,0x05,0x9a,0xf8, + 0xc9,0xa4,0x02,0x92, 0x5b,0xbb,0x48,0xcf, 0xf1,0xe1,0xa0,0xdc, 0x19,0x02,0xf7,0x4d, + 0x7b,0x00,0x49,0x8a, 0x50,0x70,0xc0,0xb7, 0x6a,0x1d,0x89,0xe4, 0x2d,0xdc,0x38,0xf9, + 0x45,0xf4,0x60,0xd5, 0x2b,0x7b,0xc3,0x5b, 0x39,0x6f,0x6d,0xca, 0x56,0xac,0xa4,0xe5, + 0x3d,0x6d,0x53,0xc0, 0x94,0x8e,0x9c,0xa1, 0x0d,0x3f,0x75,0x7a, 0x7b,0xa7,0xfe,0x8c, + 0x0a,0x2b,0xe1,0xa7, 0xb3,0xea,0xe6,0x42, 0x7d,0x6d,0x43,0x59, 0x42,0xfa,0x9a,0x4f, + 0x8d,0x39,0xe8,0xbc, 0x34,0x3f,0x0b,0xa4, 0x4f,0xd2,0x31,0x3d, 0x59,0x83,0x2a,0xe5, + 0x81,0x0e,0xb6,0xf8, 0xdf,0xac,0x6d,0xbb, 0x00,0xd5,0x81,0xd8, 0xcd,0x20,0xda,0x24, + 0x9d,0x14,0x25,0xa9, 0x77,0xad,0x73,0xe5, 0xf3,0xc6,0xcc,0x0c, 0xcc,0x0d,0x5f,0x53, + 0xc4,0xdb,0x2e,0xdc, 0x95,0x72,0x24,0x25, 0x93,0x11,0x7b,0xfe, 0x0b,0x16,0xba,0xf4, + 0xed,0x02,0x9b,0x64, 0x46,0xcc,0x0b,0xe1, 0x35,0xb7,0xe4,0xce, 0x62,0x6d,0xc7,0x2c, + 0x78,0xeb,0xeb,0x26, 0xfa,0xb3,0x76,0x6e, 0x84,0xa6,0x89,0x71, 0x3f,0xe6,0xee,0x5d, + 0xc7,0x53,0x19,0xf0, 0xf4,0x6d,0x10,0x5a, 0x1d,0xe2,0x0c,0xfc, 0x84,0x48,0xe7,0xd3, + 0xf8,0xd9,0x6d,0xb7, 0x99,0x4a,0x67,0x6b, 0x9f,0xcc,0x8f,0x9f, 0x97,0x12,0xd7,0x85, + 0x59,0xda,0x4e,0x9d, 0x6f,0xf0,0x43,0x0c, 0xc4,0xac,0x2e,0x9d, 0xdd,0x55,0x09,0x34, + 0xeb,0xfe,0xf2,0x9b, 0x1c,0xc1,0x91,0x01, 0x74,0xcf,0x55,0x73, 0x34,0x6a,0x47,0xb5, + 0x78,0x57,0x4c,0xe4, 0x69,0x62,0x9a,0x47, 0x19,0x40,0xe6,0xc8, 0x12,0xe7,0x85,0xe3, + 0x74,0xea,0x02,0x9d, 0x59,0xe3,0x3e,0x5e, 0x7b,0x3c,0x59,0x58, 0xf3,0x35,0x79,0xf2, + 0xfb,0x7d,0xce,0x3f, 0xf5,0xf3,0x24,0xb3, 0xff,0x11,0x59,0x31, 0x4d,0xb3,0x25,0x24, + 0x50,0xbf,0x87,0x3e, 0xb7,0x0e,0xbc,0xe8, 0xcb,0xce,0x2a,0xf7, 0x67,0x64,0x31,0x7e, + 0xda,0x5c,0x8d,0xe0, 0xed,0x2f,0x57,0x5e, 0x89,0x33,0x79,0xac, 0xc2,0xa0,0xa6,0x43, + 0xb7,0x36,0x97,0x37, 0xe7,0x90,0xb4,0x75, 0x79,0x96,0x18,0x8b, 0x28,0xec,0xcf,0x79, + 0xa2,0xde,0x29,0x49, 0x84,0x9f,0x8f,0x3d, 0x74,0x70,0x37,0xeb, 0xb6,0xe6,0xe6,0xe9, + 0xa5,0xd5,0x70,0xa1, 0x6d,0xdf,0x8f,0xb0, 0x39,0x93,0x44,0xb1, 0x49,0xbd,0x44,0x84, + 0x23,0x93,0x84,0xb0, 0x8b,0x24,0x29,0x07, 0x05,0x3f,0x98,0x2c, 0xed,0x7c,0x63,0xbf, + 0x7e,0x9c,0x65,0x3a, 0x3f,0x16,0xd5,0x87, 0x11,0xee,0xa1,0xe4, 0xe0,0xe8,0xca,0xea, + 0x12,0xd2,0xcb,0x84, 0x90,0xcb,0x59,0x9e, 0xb3,0xb7,0x69,0x69, 0x7e,0x05,0x90,0x1c, + 0x33,0x06,0x63,0x23, 0xe3,0x01,0x76,0x02, 0x8f,0x81,0x06,0xe7, 0x4b,0x4c,0xaa,0x5a, + 0x2a,0x0d,0x00,0x2d, 0xdf,0xcd,0x2d,0xc0, 0x54,0x8b,0x38,0x03, 0x10,0xda,0xb0,0x7d, + 0xc1,0x76,0x88,0xa7, 0xfc,0x37,0x2e,0xa5, 0xc7,0xae,0x69,0x84, 0x8f,0xcd,0x75,0x4f, + 0x9c,0xc2,0x9e,0xde, 0x9c,0x71,0xde,0xc0, 0x92,0xd4,0x2c,0x9c, 0x98,0xdb,0x74,0x9e, + 0x56,0x82,0xde,0xf6, 0xd3,0x1b,0x33,0xdd, 0x5b,0xbc,0xbd,0x5d, 0xac,0xae,0x72,0x30, + 0x7c,0xac,0xff,0x1e, 0x8e,0x17,0xa6,0xf6, 0x4d,0x4d,0xfb,0x70, 0x52,0x7e,0xb5,0x7e, + 0xc9,0x75,0x7d,0xff, 0x32,0x2e,0x7c,0x8c, 0x35,0x75,0x3b,0x6d, 0xb8,0xe6,0x36,0xc2, + 0x38,0xf2,0xa7,0x97, 0xf8,0x5a,0xb0,0x9d, 0x04,0x3b,0xc6,0x5e, 0x37,0xbf,0xbf,0xa3, + 0x3b,0x28,0x5b,0xad, 0x87,0x61,0x74,0x4d, 0x90,0xea,0xbe,0x54, 0xfb,0x75,0x79,0xd0, + 0x7e,0x4a,0x3f,0x22, 0xeb,0x50,0xd8,0xe0, 0x28,0xe4,0xc9,0xae, 0xf9,0x65,0xbb,0x97, + 0x5a,0xfa,0x71,0x9b, 0x25,0x25,0x77,0xcc, 0x1a,0x72,0xc6,0xaf, 0x63,0xff,0x22,0x17, + 0x84,0x74,0xb8,0x97, 0x88,0xcf,0x59,0x41, 0xe9,0x73,0x23,0xde, 0x6a,0x3d,0x18,0x6d, + 0xd6,0xdd,0x68,0xc9, 0xb7,0xc8,0x85,0x74, 0x2d,0x52,0xfb,0x7d, 0x8b,0x92,0xda,0xc7, + 0x31,0xcb,0x46,0x69, 0x4f,0x6b,0x7b,0x6d, 0x4d,0xed,0x3f,0x63, 0x93,0x11,0x1e,0x3e, + 0x5e,0x27,0xbe,0xb7, 0x5a,0xf2,0x40,0x45, 0xbd,0xfa,0x96,0xee, 0x6a,0x73,0x0f,0x3f, + 0xd7,0xca,0x08,0x70, 0x70,0xf8,0x42,0x0a, 0xd6,0xf0,0x7d,0x7a, 0xb7,0xb9,0xbc,0x4b, + 0xff,0x66,0x5f,0x2a, 0x5f,0xe0,0xea,0x3b, 0x69,0xb3,0xd9,0x0a, 0x82,0x8a,0xf1,0x93, + 0xc6,0x14,0x2a,0x67, 0x2b,0x6f,0x9f,0xcb, 0x68,0x6a,0xb2,0x71, 0xa5,0x83,0x2e,0x3e, + 0x4d,0x61,0x07,0x94, 0x9d,0x99,0x1f,0x2e, 0x87,0xf6,0xf2,0x78, 0x32,0x1f,0x2a,0xcb, + 0xb6,0xab,0xb6,0x58, 0x48,0xd4,0xd1,0xfc, 0xcc,0xf5,0xb8,0x7f, 0x7f,0x89,0xec,0xeb, + 0xf7,0x5b,0x47,0x02, 0x7e,0x04,0x1a,0xb4, 0x6c,0xf2,0x0a,0xc6, 0x7d,0x9d,0x94,0xe2, + 0x18,0x9b,0xa2,0x73, 0x01,0xb1,0x6e,0xc3, 0x6a,0x0b,0x09,0x17, 0x10,0x77,0xaa,0x65, + 0xbf,0xc2,0xb7,0xf1, 0x51,0xed,0xac,0xfd, 0x1b,0x67,0xb2,0x58, 0x9a,0x19,0x48,0xf5, + 0x1e,0x4e,0x29,0xe7, 0xbe,0xb8,0x63,0x93, 0x09,0xa4,0xa0,0x92, 0x7f,0xfa,0xab,0x4c, + 0xb4,0x90,0xb6,0xb2, 0x54,0xf6,0x12,0x73, 0xb2,0xf6,0xe1,0xa4, 0xcf,0x6f,0xe5,0x77, + 0xfe,0xa7,0xad,0x8b, 0x74,0xea,0x7c,0x69, 0x3d,0x93,0xd7,0x52, 0xae,0xea,0xbd,0x76, + 0xd8,0xad,0x6e,0xd4, 0x69,0x6f,0x78,0x98, 0xa5,0x1a,0x2a,0xad, 0x97,0xa2,0xfa,0xd7, + 0x5d,0xd5,0xc8,0x69, 0x7a,0xd6,0xee,0xd2, 0x26,0x66,0x06,0xe0, 0x30,0x3e,0xa7,0xd3, + 0xc6,0xa9,0x4b,0xc3, 0x7a,0xd3,0xa9,0xd5, 0x3f,0x7d,0x15,0x34, 0x0f,0x0b,0x78,0x7d, + 0x2d,0x5d,0x0c,0xb2, 0x1b,0xac,0x66,0xb2, 0xb6,0x4c,0xb0,0x57, 0x55,0x35,0xdb,0x95, + 0xe9,0x02,0xc0,0xb1, 0x46,0x60,0x19,0x90, 0x06,0x62,0xbd,0x01, 0x04,0x23,0x19,0x63, + 0xf7,0xfa,0x25,0xf0, 0xd5,0x7b,0x48,0x3b, 0x2c,0x9c,0xe3,0xce, 0x55,0xa2,0x31,0x14, + 0x0f,0x04,0xba,0xa3, 0xeb,0xb5,0x2f,0x6c, 0xa5,0x79,0x42,0x07, 0x4b,0xde,0xfd,0x39, + 0xa3,0x1d,0xb0,0xb1, 0x4b,0xad,0x4e,0x26, 0x9c,0x84,0x34,0x6e, 0xcd,0xd4,0xa5,0x08, + 0xc6,0xed,0xb0,0xef, 0x60,0x7b,0xa9,0x81, 0xf1,0xfc,0x6a,0x82, 0x84,0x1b,0xea,0x61, + 0xcf,0x3a,0x26,0x48, 0x87,0xdd,0xa7,0xf9, 0x32,0xe5,0x8e,0xac, 0x9b,0xa6,0x27,0x5e, + 0x9e,0xd1,0x4d,0x56, 0xe8,0xfa,0x1e,0x2f, 0x09,0xbc,0x5e,0xc1, 0x4d,0xa6,0x67,0xa7, + 0xf3,0xbc,0x9e,0x1e, 0xda,0x09,0x8d,0x53, 0x5f,0xcd,0x65,0x93, 0xb4,0xa8,0x1b,0xf5, + 0x97,0x0c,0xfc,0x9d, 0x86,0xaf,0xce,0x37, 0x57,0x30,0x52,0x1c, 0x3b,0x19,0x86,0x91, + 0x91,0xde,0x56,0x51, 0x40,0x26,0xa2,0x73, 0x52,0xec,0x50,0x2e, 0xfa,0x3c,0xf4,0x06, + 0x7b,0x7f,0x8c,0x0e, 0x1e,0x97,0x4f,0xb1, 0x0c,0xfa,0x8c,0x6c, 0x99,0xc9,0x32,0x04, + 0xac,0x53,0x90,0xb3, 0x5d,0x4a,0x0c,0xf6, 0xa7,0x7e,0x6e,0xa5, 0x92,0x3d,0x68,0xcc, + 0x28,0x9d,0x21,0xea, 0x22,0x95,0xca,0xf2, 0xfc,0x4c,0x47,0xf1, 0x06,0x83,0x51,0xbb, + 0xf8,0x20,0x7b,0x44, 0x08,0x01,0x3a,0x58, 0x5c,0x87,0x32,0x82, 0xa3,0x94,0x9b,0x55, + 0xae,0xb5,0x0d,0xef, 0x5c,0x55,0x52,0x76, 0x34,0x9a,0x7d,0x27, 0xcf,0xae,0x65,0x91, + 0x89,0xc6,0xde,0x56, 0xee,0x77,0x77,0x97, 0xce,0x94,0xb7,0x77, 0x3f,0x96,0xd3,0x6a, + 0xd7,0x7d,0x5b,0x71, 0xe0,0xf8,0x30,0x88, 0xb2,0x56,0x56,0xca, 0x76,0xc3,0x7a,0xd9, + 0x5f,0xaf,0x4c,0xae, 0x63,0x31,0x10,0xd5, 0xa5,0x9d,0x3b,0xba, 0x79,0x07,0xcf,0x63, + 0xe6,0x36,0x5a,0x7b, 0x3d,0x86,0x8f,0x49, 0x66,0xd6,0xc7,0xf7, 0xd0,0x0e,0x55,0x0e, + 0x77,0x54,0x4a,0x66, 0xb1,0x3a,0xd0,0xcb, 0x7b,0x70,0x56,0xa9, 0x4d,0xaa,0x8b,0x60, + 0x98,0x0c,0xb5,0xd8, 0xed,0xa1,0xe3,0xc4, 0x8d,0x4d,0x84,0x15, 0x6e,0x8a,0x7f,0x3d, + 0xaf,0xd9,0xe7,0xdf, 0x42,0x0e,0x00,0x79, 0xce,0xbc,0x82,0xb6, 0xc7,0x87,0xba,0xe6, + 0x37,0xd2,0xef,0x79, 0xbd,0x47,0x81,0xd3, 0xb7,0xb2,0x41,0xee, 0xd4,0xef,0xbb,0x82, + 0xa9,0xc9,0x39,0x8d, 0xde,0x0c,0xc3,0x8d, 0xa5,0x1c,0x2e,0xbd, 0x77,0x04,0x04,0xb8, + 0xbc,0x54,0xed,0xa9, 0xa9,0x4f,0x86,0x20, 0x04,0xc4,0xea,0xa7, 0x9a,0xda,0x5c,0x70, + 0x23,0xd8,0x90,0xcd, 0xe6,0x6b,0x94,0x1e, 0x6c,0x86,0xe7,0x6b, 0x6d,0x43,0x13,0x41, + 0x0b,0x2b,0x81,0x00, 0xe2,0xdb,0x6c,0xe1, 0x49,0xac,0x0c,0x50, 0x48,0x8f,0xbe,0x91, + 0xcc,0x68,0x3c,0x39, 0x19,0x2c,0x3a,0xc3, 0x08,0xbb,0x72,0x01, 0x61,0x38,0x35,0x7d, + 0xf5,0x25,0xf6,0x93, 0xbb,0x5a,0x0b,0x69, 0x77,0x1c,0x7b,0xd6, 0xc3,0x8b,0xe0,0x1d, + 0x53,0x63,0xe2,0xbf, 0x80,0x1a,0xf2,0x35, 0xe7,0xda,0xcc,0x56, 0x92,0x13,0x4d,0x71, + 0x17,0x57,0xe1,0x71, 0x9e,0x1a,0x5e,0xfe, 0x24,0x6b,0x98,0x64, 0x16,0x55,0x95,0x34, + 0x5e,0x9d,0x15,0xbe, 0x25,0xd8,0xb8,0xb6, 0x9b,0x57,0x46,0xd5, 0x2d,0xc1,0xda,0x6b, + 0xbf,0x9e,0xda,0x84, 0x64,0x42,0xbb,0x66, 0xf1,0x8b,0x64,0xc3, 0xd6,0xe1,0x64,0xd7, + 0xd0,0x49,0x9e,0xa2, 0x83,0xb1,0x7e,0x67, 0x49,0xe9,0x60,0x20, 0x22,0xac,0x5e,0xed, + 0xc1,0x4b,0x61,0xc7, 0x6f,0x80,0xea,0x9b, 0xdc,0x3a,0x3d,0xd2, 0x7f,0x33,0x32,0xd1, + 0x02,0x69,0x09,0x25, 0xc4,0x6c,0xe1,0x11, 0x72,0xf4,0xfa,0x22, 0x37,0xc0,0x7f,0x3b, + 0xeb,0x7e,0x4e,0x62, 0x9c,0xed,0xe4,0x6f, 0x67,0xdc,0xd2,0xf1, 0x25,0xd1,0x9d,0x5a, + 0x66,0x8b,0xe2,0xba, 0xe7,0xa4,0xb9,0x5b, 0x5b,0xd5,0x53,0x0b, 0x01,0x99,0x5c,0xf1, + 0x6d,0xb6,0x36,0x25, 0x8c,0x02,0x94,0x2a, 0xc3,0x4a,0xb9,0xc6, 0x46,0x25,0x7b,0xd6, + 0xd7,0x02,0x87,0x85, 0x15,0xca,0xdb,0x66, 0x3b,0x81,0xfa,0xc7, 0xd2,0xf0,0xff,0x74, + 0x2d,0x5e,0x90,0x07, 0x9c,0xce,0x2b,0xfc, 0x84,0xd9,0xf8,0x55, 0x47,0x1c,0xfe,0x79, + 0x19,0x18,0xbd,0x5d, 0xd8,0x35,0xc6,0x97, 0xe8,0x94,0x03,0xdd, 0x80,0x57,0xdf,0xa0, + 0xfc,0xa0,0xaa,0x8c, 0xd1,0xb4,0xb8,0x27, 0x05,0x27,0x36,0x75, 0x64,0x5e,0xb2,0xaa, + 0x5a,0xc5,0x66,0x30, 0x9c,0x1f,0x84,0x1a, 0x4d,0x8e,0xdb,0x90, 0xd9,0xbb,0x26,0xa0, + 0xfa,0x54,0x0c,0x4d, 0x57,0x2d,0x27,0x28, 0x4e,0x4e,0xad,0x1a, 0x54,0xd9,0x0a,0xc2, + 0x5d,0x8b,0x64,0xab, 0xc3,0xe9,0xab,0xde, 0x37,0xc7,0xd5,0x72, 0xfd,0x7e,0x61,0x62, + 0xfc,0x1e,0x77,0x13, 0x9a,0xd9,0x74,0xeb, 0x9f,0x5a,0x07,0xb2, 0x34,0x17,0x69,0x5c, + 0x04,0x40,0x90,0x8d, 0xa3,0x4c,0x22,0xee, 0xb6,0x1a,0x60,0x2d, 0x0e,0x06,0xe6,0xd2, + 0x27,0x9f,0xff,0x95, 0x68,0x42,0x8b,0x19, 0x84,0xdc,0x7c,0xdc, 0xc5,0x1a,0x29,0x91, + 0x65,0xc5,0xaf,0x28, 0x81,0xcc,0x01,0xbc, 0x5e,0xeb,0x28,0x5e, 0x6c,0x84,0x11,0x0d, + 0xa1,0x9d,0xd4,0x3b, 0xcd,0xb2,0x38,0x99, 0x9a,0x17,0x79,0x14, 0x96,0x1d,0xc9,0x4e, + 0x21,0x52,0xe5,0xb3, 0xbd,0x2a,0xb0,0xf6, 0xfd,0xd3,0x88,0x03, 0x3e,0x0c,0x58,0x8d, + 0xee,0xf1,0x9b,0xb6, 0xc3,0x71,0xca,0x68, 0xbc,0x21,0x2f,0x10, 0xe9,0x41,0xd0,0xc1, + 0xa5,0xd8,0xdb,0xd7, 0x70,0xb2,0xda,0x5c, 0x07,0x73,0x39,0x1a, 0x73,0xc0,0x8d,0x0a, + 0x20,0x18,0x31,0x70, 0x50,0xc9,0x76,0x27, 0x3b,0xc6,0x8c,0xee, 0xf7,0xdb,0xbb,0x89, + 0xf1,0x54,0xc3,0x61, 0x83,0x23,0x3e,0x07, 0xb6,0xe7,0x5f,0xa3, 0xe8,0xf3,0xf6,0x38, + 0x39,0xfb,0x58,0xec, 0xdc,0x61,0x4e,0x5b, 0xdd,0x1c,0x19,0xcc, 0xd9,0xe7,0xd8,0x6e, + 0xf1,0x2d,0xaf,0xab, 0x0b,0x94,0x18,0xbb, 0x56,0x49,0xa4,0x9b, 0x1b,0x01,0xb5,0xf6, + 0x9a,0x45,0x0f,0xed, 0x9a,0xf4,0x38,0x86, 0x79,0xc7,0x8f,0x1a, 0xbe,0x66,0x7e,0x46, + 0x63,0xaf,0xe5,0x78, 0x35,0xab,0x0c,0x6d, 0x36,0x90,0x67,0xf2, 0x21,0xfd,0xd5,0x45, + 0xee,0x13,0x08,0x37, 0xf1,0xe4,0xe1,0xa0, 0xe5,0xd1,0x4f,0x2a, 0xe8,0xbe,0x02,0x68, + 0x3d,0x2d,0xc2,0xc2, 0xe4,0x82,0xa9,0xb9, 0x80,0x0f,0xb2,0x4e, 0x31,0x19,0x8d,0x62, + 0xad,0x65,0x95,0x07, 0x05,0x0a,0xfa,0x6a, 0x85,0x37,0x12,0x94, 0xa1,0xdd,0x28,0x59, + 0xcc,0xf9,0x87,0x90, 0x7d,0x23,0x7a,0x6b, 0xc9,0xc9,0xc9,0x6e, 0x1e,0x32,0x8b,0x04, + 0x4c,0xde,0x61,0x52, 0x4b,0xa6,0x30,0xb2, 0xbf,0x72,0x5b,0x89, 0x48,0x84,0x21,0x24, + 0xb9,0xb1,0x89,0x8a, 0x18,0x94,0x29,0xef, 0x34,0xae,0xfa,0xe0, 0xe0,0x56,0xba,0x6d, + 0x0c,0xc3,0xb6,0xe5, 0xe0,0xb9,0xdf,0x58, 0xd2,0x4c,0xa5,0xf6, 0x6f,0xff,0xac,0x2c, + 0x37,0x87,0xdb,0xd3, 0x3e,0xad,0xab,0x69, 0xde,0xe4,0x96,0x04, 0x92,0xc7,0x8c,0xde, + 0x66,0x68,0x4c,0x5f, 0x22,0x3d,0xa0,0xbf, 0xda,0xb8,0xd3,0x05, 0xf6,0x90,0x1f,0x0c, + 0xa8,0x18,0x87,0x88, 0x86,0x4b,0xb2,0x52, 0x1f,0xa4,0x95,0xbd, 0x17,0x10,0x43,0xd1, + 0x48,0x18,0x94,0x4d, 0xdd,0xba,0x97,0xe3, 0x3d,0xc3,0xaa,0x6c, 0x9b,0x26,0xc6,0x02, + 0xf4,0x3e,0x12,0x7e, 0x5b,0x47,0x5f,0xa7, 0xa6,0x6f,0x56,0xad, 0xe5,0x03,0x85,0x85, + 0x3a,0x08,0x14,0x7e, 0x52,0x93,0x09,0x45, 0x62,0x58,0x3a,0x2b, 0x6e,0xa6,0x24,0x9e, + 0xae,0x0f,0xa7,0xaf, 0x65,0xc9,0xb5,0xd7, 0x49,0x50,0x48,0xe2, 0x5a,0xce,0x2d,0xbd, + 0x9e,0xde,0xc7,0x6e, 0x6a,0x09,0xd7,0x49, 0x47,0xef,0x14,0xf6, 0x58,0x5c,0x1e,0x81, + 0xd1,0xad,0x2a,0xd0, 0x2d,0xf2,0x9c,0xe9, 0xcb,0x29,0xe1,0xc2, 0x93,0x75,0x79,0xcd, + 0x87,0xd2,0x23,0x3b, 0x66,0xd6,0x03,0x97, 0x50,0xcc,0xbd,0x75, 0x19,0x82,0xf9,0xde, + 0xd3,0xa8,0x7b,0x24, 0x6a,0xc2,0x12,0x63, 0xf1,0x72,0x88,0x53, 0x9c,0x3f,0x0d,0xfd, + 0xd2,0x59,0x9d,0xdb, 0xa4,0x08,0xe2,0xfc, 0x72,0xed,0xac,0x94, 0x69,0x28,0x9b,0xb4, + 0x00,0x84,0x97,0x91, 0x52,0x9b,0x33,0x30, 0x61,0x36,0x3f,0xe9, 0x44,0x8b,0x2b,0x33, + 0x33,0x72,0x99,0x48, 0x20,0x97,0x76,0x69, 0x27,0x9f,0xf0,0x13, 0xda,0xf3,0xff,0x73, + 0xe5,0xdf,0xc3,0xd9, 0xf4,0x7c,0x1e,0x5f, 0x73,0x8f,0x3e,0xa7, 0x0a,0xee,0x7a,0x31, + 0xda,0xee,0x41,0x5b, 0x2b,0x33,0xa1,0xc8, 0x4c,0x6b,0x65,0x97, 0xae,0x60,0x9b,0x4f, + 0x34,0x81,0x86,0x4d, 0x7e,0x32,0x76,0xf9, 0xbb,0x60,0xd0,0x5d, 0x6f,0x10,0x1a,0xf5, + 0x2d,0xd9,0x29,0x65, 0xbc,0xae,0x59,0x4f, 0x66,0xb1,0x44,0xac, 0x69,0xe1,0x7a,0x96, + 0x1b,0xbe,0xd5,0x52, 0x0a,0x6c,0x74,0xec, 0xd9,0x27,0xce,0xe0, 0xaf,0x59,0x2c,0xe6, + 0xd9,0x30,0x9b,0x26, 0x56,0x72,0x76,0x2c, 0x0c,0x55,0xcf,0x2e, 0xdf,0x87,0xaa,0xe2, + 0xb8,0xa7,0x2c,0xea, 0x6a,0xca,0x6f,0x99, 0x62,0x18,0x67,0x78, 0xc5,0x3c,0x89,0x2b, + 0xe1,0x37,0x88,0xdb, 0x74,0xd7,0x44,0x0c, 0x58,0xcb,0xad,0xc6, 0xb1,0x53,0xe3,0x74, + 0xd4,0x61,0x8a,0xad, 0x0a,0x86,0x74,0xad, 0xe4,0xd8,0x0d,0xbc, 0xe9,0x5b,0x20,0xa5, + 0x8b,0xea,0x56,0xf4, 0xdc,0x35,0x15,0x18, 0x86,0x92,0xa3,0x11, 0xea,0x4a,0x5b,0xb3, + 0x53,0x4c,0xde,0x23, 0xb8,0xc7,0x96,0xbc, 0xd8,0x97,0x61,0xd0, 0x3b,0xaf,0x5d,0x5f, + 0x5b,0x79,0x3f,0x81, 0x52,0xb3,0x53,0x6c, 0x78,0x64,0x29,0x05, 0xb7,0x80,0x50,0x8c, + 0x87,0x65,0xc8,0xd2, 0x71,0x7d,0xc8,0x6c, 0x24,0xb2,0xf6,0x3d, 0x7c,0xa9,0x74,0x77, + 0x92,0x4b,0x62,0x2d, 0xe1,0x5a,0xbb,0x6e, 0xb7,0x1d,0xb0,0xb9, 0x82,0x82,0xbb,0x13, + 0xa2,0x65,0xfb,0x57, 0xc4,0x47,0x76,0x59, 0xd5,0xe5,0xef,0xa7, 0x64,0xc5,0x45,0x52, + 0xd9,0x4a,0x3b,0x99, 0x35,0x8c,0x54,0x46, 0x12,0xb6,0xf9,0x4a, 0x9a,0xa1,0x00,0xac, + 0x90,0x09,0x62,0x8a, 0x7a,0xfc,0x7c,0xa2, 0x23,0x58,0xc9,0x59, 0xcd,0xa2,0x91,0x12, + 0x07,0x36,0x64,0x0c, 0xb1,0xd3,0xf0,0xe9, 0x5a,0x1e,0x72,0xcd, 0xd7,0x3b,0xde,0x96, + 0xa3,0xef,0x91,0xfb, 0xcc,0x1c,0xa0,0x0e, 0xb0,0xc2,0x60,0x3e, 0xbf,0x91,0xa1,0xa0, + 0x6e,0xb5,0xa5,0x49, 0x2e,0x5e,0x43,0x20, 0x8d,0xa5,0x58,0xcc, 0xa9,0x76,0xac,0x58, + 0x50,0xd0,0x32,0x2a, 0x04,0x4f,0x90,0x0b, 0xc1,0x6f,0x5f,0xab, 0x30,0x66,0x51,0x1c, + 0xc7,0xf2,0xd3,0x5e, 0xed,0x77,0x89,0x6f, 0xa2,0x0f,0xbc,0xf7, 0x4d,0xf5,0x44,0x89, + 0xe4,0x8c,0x20,0x3e, 0x64,0xca,0x2f,0x8d, 0xc3,0x2f,0x9d,0x2c, 0x03,0xb6,0xa6,0xcb, + 0x44,0x38,0x59,0x6b, 0x01,0xfb,0x90,0x08, 0x1e,0xaf,0xa9,0x8d, 0xb2,0xb5,0xec,0xad, + 0x9b,0x34,0x6c,0x9d, 0xb1,0x9c,0xb0,0xc0, 0xf6,0xf3,0x80,0xf5, 0xd9,0x04,0xb2,0x70, + 0x3f,0xcb,0x97,0x47, 0x22,0x23,0xd1,0xf7, 0xdd,0x66,0x0c,0xfb, 0x2c,0x1e,0x1e,0xfa, + 0x77,0xec,0x05,0x9f, 0xc1,0x9f,0xfe,0xf5, 0xbf,0xfc,0x52,0x02, 0x44,0xde,0xe6,0x00, + 0x4f,0xa4,0x29,0x78, 0xd4,0xd0,0x78,0xea, 0x1a,0xa6,0x90,0xf9, 0x18,0x8a,0xe9,0x83, + 0x1a,0x7d,0x12,0x9d, 0x35,0xad,0x36,0x28, 0xab,0xae,0xf6,0x73, 0xf6,0x2a,0xbc,0xdf, + 0x73,0x11,0xc2,0x73, 0x47,0x05,0x59,0x57, 0x02,0xcf,0x3d,0x99, 0xb0,0xa3,0x43,0x18, + 0x7a,0x3a,0xb7,0x61, 0x9c,0x68,0xe7,0x64, 0x94,0x03,0x02,0xb3, 0x18,0xae,0x6e,0x75, + 0xdf,0xa5,0xe9,0xf4, 0xf9,0x14,0x8d,0xf1, 0x1e,0xa3,0x90,0x86, 0x7e,0xa7,0x4b,0x75, + 0xc4,0xd5,0xbf,0xea, 0xb4,0xdd,0xc5,0xf2, 0xf6,0xad,0x91,0xe9, 0xaf,0x6e,0xd7,0xd6, + 0x99,0xaf,0xb6,0x04, 0x31,0x3c,0x71,0x0c, 0x17,0x50,0x02,0x13, 0x26,0x40,0xbf,0x4a, + 0x65,0xd2,0xf0,0x62, 0xe7,0x06,0x6f,0x8d, 0x67,0xc8,0xdd,0x5e, 0xf9,0x32,0xfc,0xa7, + 0x91,0x5b,0x5d,0xc5, 0x97,0x24,0x7a,0x53, 0x21,0xbb,0xc2,0xc5, 0x37,0x90,0x2c,0x49, + 0x40,0x4a,0x45,0x1a, 0x7b,0xe6,0x47,0x33, 0x15,0xff,0x3d,0xcc, 0x2b,0xfb,0x1f,0xb3, + 0x4d,0x90,0xde,0x8a, 0x78,0x62,0xfb,0x06, 0x0f,0x84,0xfd,0xc3, 0x26,0xf9,0x36,0x9e, + 0x9f,0x07,0xc4,0xa6, 0x5c,0x12,0xa3,0xa4, 0x82,0xd2,0xc5,0x0e, 0xb4,0x71,0x28,0x55, + 0xf1,0x63,0xd9,0xee, 0x59,0x6c,0x39,0xe6, 0x68,0x18,0xd3,0x92, 0x25,0x2d,0x1b,0x7d, + 0x29,0xc7,0x55,0x27, 0xa3,0x01,0x12,0x6e, 0x14,0xc8,0x02,0x56, 0x9a,0xc9,0x51,0x21, + 0x42,0x12,0xa5,0x11, 0x80,0x90,0x61,0x5c, 0x8e,0x6b,0x9d,0x37, 0x7f,0xfc,0xc7,0xd5, + 0xd3,0xf6,0x24,0x23, 0x9c,0x8f,0xb3,0xf8, 0xd0,0x69,0xd4,0x22, 0x00,0x68,0x3f,0x9d, + 0x06,0xce,0x00,0x4b, 0x71,0xaa,0x1f,0xb7, 0x30,0xac,0x31,0x42, 0xdd,0x18,0xe5,0x31, + 0x2a,0x4a,0xa4,0x83, 0x29,0x46,0x21,0x48, 0x8d,0x87,0x23,0x16, 0x66,0xb5,0xad,0x06, + 0x60,0xd7,0xb5,0x38, 0xf0,0xf3,0xaa,0x01, 0x5c,0x25,0x0e,0x17, 0xd7,0xfe,0xbd,0x4e, + 0xd7,0x09,0xec,0xf6, 0xbb,0x7a,0xf7,0x06, 0x19,0x7d,0xd1,0xf2, 0x26,0x5c,0xeb,0xd8, + 0x9c,0x17,0x47,0x8c, 0x4f,0xe8,0xca,0x22, 0x68,0xaf,0x14,0x50, 0x4c,0x03,0x21,0x34, + 0x14,0x21,0x84,0x3d, 0xb8,0xb6,0xb8,0xb8, 0xcc,0xe5,0xaf,0x64, 0x4b,0x43,0x62,0xd4, + 0xc4,0x0b,0x30,0x2f, 0x71,0x8c,0xf9,0x90, 0x30,0x80,0x5c,0x8e, 0x8d,0x7a,0x3d,0x2b, + 0x15,0xc0,0xca,0xf8, 0x5a,0xad,0x5d,0x8a, 0xac,0x8d,0x06,0x66, 0x4d,0x4c,0x19,0x90, + 0x30,0x65,0x2c,0x65, 0x21,0x7b,0x14,0xf7, 0xd7,0xa8,0xf7,0x5e, 0x5b,0xab,0x2f,0xed, + 0x74,0xbb,0xff,0xaf, 0x79,0xff,0xb3,0x0b, 0x8a,0xca,0xd7,0x90, 0xae,0x48,0xdb,0x1c, + 0x01,0x4b,0xf1,0x71, 0xa7,0x8f,0x59,0x44, 0xfa,0xae,0xba,0xad, 0x20,0xdd,0x27,0xf1, + 0x8d,0x04,0x17,0xcb, 0xe0,0x53,0xfd,0xb6, 0x5c,0x47,0x0c,0x9d, 0xbb,0xa2,0x0c,0xa0, + 0x32,0xe3,0xb0,0x2e, 0x4f,0xc1,0x9e,0xea, 0xa4,0x9e,0xd3,0x4c, 0xd7,0x9b,0x5d,0xb5, + 0x3c,0x02,0x15,0xb2, 0x88,0x84,0x68,0x86, 0xb0,0xbc,0x27,0xf1, 0x74,0x57,0xb5,0x76, + 0x9d,0x5b,0x50,0xb6, 0x7a,0x8d,0xce,0x1e, 0x53,0xdf,0x0f,0x33, 0x00,0xec,0x25,0x29, + 0x09,0x30,0xc4,0x72, 0xd4,0x9f,0x1c,0x14, 0x21,0x5d,0xb4,0xde, 0x6b,0x74,0xa3,0xb0, + 0x0b,0x67,0x25,0x87, 0xbc,0x37,0x3d,0xd7, 0x53,0xe0,0x4d,0x4c, 0x3e,0x7b,0x1a,0x84, + 0xa0,0x3e,0xad,0xaf, 0x6e,0xaf,0x87,0xe4, 0x9d,0x4c,0x8c,0xc3, 0xb2,0xd1,0x42,0x5e, + 0x69,0x7c,0xca,0x36, 0x2f,0x57,0xd7,0xaa, 0xf7,0xaa,0x71,0x1d, 0x45,0x45,0xb2,0x3e, + 0xcf,0xb1,0x31,0x69, 0xa7,0xf9,0xe5,0x10, 0xc3,0x3e,0xd9,0x1e, 0x4d,0xef,0x4d,0xae, + 0x49,0xff,0xa1,0x8e, 0xbe,0xc5,0xb6,0xa6, 0xaf,0x9d,0x17,0x94, 0xc5,0x9c,0xc8,0x48, + 0x3a,0x79,0x1a,0x30, 0x93,0xa9,0xe9,0xda, 0xcb,0x97,0xa2,0xd9, 0xa2,0x39,0xb1,0xfb, + 0x6d,0x58,0x99,0xb4, 0x85,0xda,0xde,0x47, 0x77,0x6d,0x86,0xd6, 0x4f,0x71,0xf3,0x64, + 0xfd,0xfc,0x86,0xf3, 0x67,0xc6,0xa1,0x5d, 0xbf,0xca,0x92,0xe2, 0xd9,0xdf,0xa7,0x93, + 0x9f,0x12,0x9c,0x47, 0xd4,0xbc,0x97,0x36, 0x1c,0x17,0xe5,0x23, 0x75,0xaf,0xf1,0x3b, + 0x56,0x4b,0x57,0x77, 0x8f,0xfe,0x35,0x0a, 0x53,0x68,0x70,0x6b, 0x34,0x6e,0x0f,0xba, + 0xf5,0x6d,0xd2,0xc3, 0x01,0x9a,0x7c,0x7b, 0xbb,0xda,0x5a,0x61, 0x5f,0xa2,0x58,0x04, + 0xd8,0x88,0x39,0xc5, 0x3a,0xbe,0x65,0x35, 0x2f,0xd3,0x4d,0xf3, 0x5c,0x79,0xf8,0xbc, + 0xf4,0xe6,0x6b,0x71, 0x24,0x93,0x96,0xe6, 0x8b,0x0a,0xd6,0xf5, 0x58,0xf8,0xf8,0x8e, + 0xbc,0xa9,0x1c,0xf1, 0x48,0x64,0x08,0x35, 0xdb,0x20,0x0b,0x5c, 0x64,0xe7,0x55,0x59, + 0x39,0x6e,0x28,0x3a, 0x71,0x79,0x67,0x42, 0x84,0x97,0x2f,0x36, 0x78,0xf3,0x88,0x44, + 0x01,0x4f,0xf0,0xb4, 0xae,0x2e,0xc5,0x79, 0x61,0x59,0x4e,0x4e, 0xa3,0xcd,0xba,0xbd, + 0xd5,0xdf,0xb3,0x94, 0x84,0x69,0xa2,0x19, 0x74,0x5a,0xa9,0x5f, 0x77,0x1b,0x35,0x20, + 0x16,0x5a,0xb2,0xb0, 0x9b,0xab,0x50,0x65, 0xe1,0xe0,0x7b,0x57, 0xf4,0xb6,0xad,0x18, + 0xef,0x4a,0x25,0x77, 0x30,0x45,0xc9,0x1a, 0xdd,0x69,0x68,0xce, 0x7b,0x7c,0xaa,0x64, + 0x9a,0xed,0xc6,0xb2, 0xe3,0x31,0x15,0x5b, 0xdd,0xe6,0xa5,0xa9, 0xad,0xce,0xe8,0xaf, + 0x23,0x65,0xd3,0xbd, 0x6a,0xf3,0x87,0x9c, 0xaa,0x6c,0xc8,0xce, 0xa5,0x0f,0x49,0x75, + 0x1c,0x4b,0xe8,0x9b, 0x43,0x75,0xca,0xca, 0xb2,0x86,0xf5,0xec, 0x27,0x94,0xea,0x8c, + 0x46,0x9a,0x37,0xb7, 0xf9,0x8d,0xe9,0xeb, 0xd8,0xae,0xd1,0x39, 0x04,0x1e,0x17,0xa3, + 0xb1,0x87,0xb2,0xf4, 0x13,0x1d,0x5e,0xde, 0xef,0xcd,0xad,0x1f, 0x4f,0x0f,0xb5,0x8b, + 0xcd,0xf0,0xf3,0xaf, 0xe1,0x40,0xdb,0x12, 0x4f,0xf4,0x90,0xce, 0x8c,0x28,0x45,0xb4, + 0x20,0xfc,0x87,0x0b, 0xef,0x16,0x96,0x7a, 0x16,0xc4,0x50,0xc9, 0x65,0xc0,0x5b,0x7f, + 0x09,0x5f,0xab,0xb5, 0xec,0x5a,0xdd,0xaa, 0x70,0x22,0x86,0xca, 0xdb,0x20,0x61,0x23, + 0x74,0xfb,0xb6,0xf2, 0xc8,0xd7,0xa2,0xae, 0x5d,0x8b,0x1d,0x6f, 0x86,0xca,0xb9,0x0f, + 0xad,0x99,0x41,0xd8, 0x94,0x52,0xd7,0x41, 0xe9,0x54,0xcf,0x98, 0xc9,0x7f,0x12,0xbc, + 0x15,0x63,0x7f,0xa4, 0xb9,0x21,0x7b,0x9f, 0x25,0x5e,0x0e,0xb9, 0x8d,0x6a,0xe3,0xd0, + 0xe6,0x4c,0xc8,0x8b, 0x0b,0xe7,0x56,0xd0, 0x5b,0xa4,0x20,0x1e, 0x60,0xc7,0x44,0x87, + 0x6b,0x21,0xb4,0x6a, 0x7e,0xb3,0x46,0x83, 0x3b,0xe5,0xab,0xae, 0x29,0x70,0x28,0xb8, + 0xd9,0xa1,0x39,0xe4, 0x2a,0x95,0x32,0x49, 0xc3,0x27,0x6d,0x1f, 0x16,0xb6,0x68,0xc2, + 0xca,0x61,0x18,0xb4, 0x9e,0x55,0x92,0xeb, 0xa7,0x7a,0xfe,0x59, 0x5a,0x48,0xcd,0x5a, + 0x13,0x84,0xd3,0xc0, 0x40,0xa7,0x75,0xa8, 0x58,0x07,0x79,0x5a, 0xfd,0x23,0x16,0x38, + 0x66,0x6f,0x06,0x6c, 0xae,0x11,0x47,0x03, 0x0a,0x1b,0x15,0x8a, 0xbe,0xbe,0xa1,0x1c, + 0x2d,0x20,0xde,0xa4, 0x19,0xf5,0x76,0x8d, 0x14,0x37,0x66,0xaf, 0xa2,0x76,0xa9,0x42, + 0x25,0xd9,0xaf,0x7a, 0xd1,0xd3,0x0c,0x08, 0xfe,0x58,0x06,0xee, 0xdd,0xb2,0xaa,0x93, + 0x9b,0xf0,0xb8,0x97, 0xa8,0xb5,0x6a,0x1b, 0xe5,0xb6,0x97,0xe5, 0x61,0x9a,0x8d,0xbc, + 0x24,0x49,0x9d,0x0b, 0x92,0xd4,0x47,0x2d, 0x40,0x6e,0x74,0xc6, 0x6b,0x3d,0x6e,0xbb, + 0x8b,0x25,0xba,0x05, 0xc0,0x3a,0x30,0x21, 0x21,0x32,0x98,0x75, 0x34,0xe2,0x2d,0x70, + 0xd0,0xd6,0x1b,0xf0, 0x47,0xf2,0xb6,0xfb, 0x7e,0xde,0xee,0x1c, 0x0d,0x2f,0x5b,0x70, + 0x8b,0xa9,0x56,0xe8, 0x3f,0x4b,0x9a,0x81, 0x1d,0x2e,0xc0,0xe8, 0x34,0x13,0xf4,0x05, + 0x4d,0xe9,0xdb,0x1e, 0xbf,0xaa,0x81,0x2b, 0xec,0x23,0xc2,0xdf, 0xad,0x3d,0x0a,0xf1, + 0x67,0x46,0x66,0xd6, 0x62,0x89,0x48,0xf7, 0x2b,0x07,0x46,0x51, 0xe9,0xef,0x6a,0xea, + 0xf1,0x33,0x26,0x86, 0x75,0x4d,0xfa,0x4e, 0xa1,0xc2,0x1a,0x28, 0x76,0x4f,0xc0,0xdf, + 0x30,0xe8,0x6a,0x22, 0xda,0xeb,0xa4,0x6d, 0xde,0xeb,0x7c,0xc1, 0x33,0xc3,0xd6,0x2f, + 0x7f,0x22,0xc9,0x70, 0x60,0x5c,0xb2,0xac, 0x9a,0x38,0x39,0x09, 0x13,0x9b,0xa5,0x86, + 0x93,0x36,0x47,0x9c, 0xf0,0xc2,0x22,0x3a, 0xf7,0x53,0xb9,0xcb, 0x6b,0xcc,0xc7,0x0c, + 0xbe,0x49,0x06,0xc8, 0x88,0x72,0x99,0xf7, 0x19,0xbf,0xb0,0xff, 0x93,0x59,0x93,0x32, + 0x3e,0x21,0xe8,0xc2, 0x1e,0x77,0x56,0x70, 0x57,0x1f,0xbc,0x8b, 0x54,0x9d,0xff,0xbf, + 0xe5,0x48,0x6d,0xb4, 0x53,0x42,0xca,0x73, 0x95,0x2e,0x82,0xf0, 0x19,0x6f,0x2a,0x05, + 0xe4,0x9d,0x4c,0x75, 0x4f,0x86,0x6d,0x34, 0x50,0x43,0x57,0x4a, 0xb4,0xaf,0x28,0xa9, + 0x2c,0xea,0xb3,0x43, 0x2f,0x31,0x65,0x0b, 0x02,0x1c,0xe6,0x85, 0x46,0xb0,0x2f,0xa0, + 0x1a,0xaa,0x29,0xbf, 0x68,0xcf,0x13,0x6b, 0x53,0x81,0x24,0xd0, 0x24,0x3f,0x35,0x8c, + 0x3c,0x70,0x86,0x7a, 0x94,0x50,0x30,0x10, 0x1e,0xd1,0x22,0x69, 0x9b,0xbe,0xda,0x8b, + 0x2e,0x40,0xa1,0xbc, 0x24,0xeb,0xca,0xc7, 0xa4,0x1e,0x1c,0xb1, 0x01,0x7f,0xfd,0x23, + 0x7c,0xb9,0x2a,0x2d, 0xab,0x06,0x55,0x9a, 0x5c,0x14,0x9b,0xc6, 0xf2,0xc8,0x5b,0x8b, + 0x3d,0xf1,0xd0,0x0e, 0x1f,0xbc,0x0c,0x46, 0xc6,0x01,0xa2,0x53, 0xa9,0x66,0xcd,0x41, + 0xa3,0xfe,0x76,0x11, 0x4b,0x96,0xe5,0xaf, 0x03,0xbe,0xe9,0xf1, 0x1e,0x96,0x20,0xf7, + 0x41,0xb9,0x4d,0xc8, 0xf1,0x33,0x61,0xfd, 0x38,0x32,0xe3,0x4f, 0x6b,0xcd,0x3b,0x9a, + 0xcd,0x80,0x97,0x41, 0x41,0xf4,0xeb,0xe4, 0x41,0xda,0xfb,0x27, 0x74,0x87,0x1c,0x1d, + 0x9d,0x53,0x6d,0x5d, 0xdd,0xbe,0x81,0x84, 0x37,0x94,0xaa,0xd1, 0xc1,0x95,0x45,0x93, + 0x16,0xcd,0x1d,0x4c, 0xe3,0x20,0xb3,0x25, 0x60,0xac,0x29,0xcb, 0x32,0x64,0x78,0x34, + 0x23,0xb7,0x98,0x67, 0x49,0x5d,0x44,0x96, 0x5f,0x8b,0x44,0x59, 0x0d,0x4b,0xdc,0x27, + 0x8c,0xbd,0x8d,0xc7, 0x59,0xff,0x74,0xdd, 0x66,0xbe,0x37,0x6a, 0x46,0xd9,0x86,0x82, + 0x1b,0xea,0x91,0xd3, 0x9a,0x9e,0x5a,0xf1, 0x01,0x9e,0x10,0xf1, 0x39,0xde,0xd2,0x42, + 0x3b,0x68,0x0e,0xe1, 0x9c,0x7f,0x1e,0x5a, 0x0c,0x23,0x1b,0x4a, 0x5a,0x1c,0x7f,0xd3, + 0xd6,0xa6,0x0f,0xec, 0x83,0x73,0x09,0x05, 0xfa,0x92,0xc7,0x30, 0x00,0x51,0x25,0x97, + 0x7d,0x5d,0x47,0xdf, 0x64,0x77,0x95,0x7f, 0x8d,0x8e,0x10,0x56, 0x72,0xa1,0xfc,0x6b, + 0x44,0x7a,0x5f,0x3d, 0xaa,0x2d,0x8f,0x17, 0x8f,0xd5,0xae,0xfb, 0xb3,0xe6,0x3a,0x4f, + 0xbd,0xee,0xa0,0x90, 0xfe,0x4a,0x92,0x5f, 0x9e,0xf0,0x9a,0xb3, 0xd5,0x6d,0x22,0xaf, + 0x33,0xcd,0xe1,0x2d, 0xf4,0x4f,0x73,0x79, 0xe9,0xcc,0x99,0xdb, 0x5d,0xe3,0xa3,0xa3, + 0xef,0xcc,0x85,0x67, 0xb0,0x8d,0x00,0xca, 0xc1,0xd8,0x1e,0xcf, 0xdd,0xd0,0x6e,0x16, + 0x1f,0xcb,0x75,0x1f, 0xf5,0xfd,0xb5,0x95, 0x5e,0x59,0x4f,0x27, 0xb5,0x9d,0x91,0x9b, + 0x7b,0x86,0x86,0x1a, 0x68,0x36,0x0a,0x04, 0x22,0xa1,0xcd,0xbb, 0xcd,0xa3,0xd7,0xd7, + 0x0a,0xf0,0xe2,0xe6, 0x41,0x63,0x2c,0xfa, 0x27,0x2c,0x65,0xa5, 0x06,0x0a,0x99,0x57, + 0x3b,0x8f,0x9f,0xda, 0xbb,0xdb,0xb5,0xe3, 0xb4,0xd0,0x1f,0x01, 0x00,0xef,0x69,0x51, + 0x65,0x46,0x78,0x93, 0x4a,0xdf,0x84,0x56, 0x92,0xec,0x33,0xea, 0x05,0x9b,0x7b,0x1e, + 0x70,0x1b,0x7a,0x8a, 0x41,0xa8,0xe8,0x9d, 0x91,0xab,0x8d,0x9a, 0x40,0xfc,0xc8,0xa4, + 0x83,0x8f,0xcd,0x84, 0xc3,0x43,0x1d,0x90, 0xe2,0x06,0x55,0xe2, 0xa6,0xeb,0x89,0x2a, + 0xc0,0x4f,0x44,0xc5, 0xb4,0x23,0x62,0xd2, 0x18,0xc5,0xbe,0xec, 0x3f,0xde,0x7d,0x78, + 0xe2,0x62,0x95,0x93, 0x1b,0xa2,0x97,0x8f, 0x50,0x45,0xe0,0xa2, 0x4c,0xe1,0x5b,0x81, + 0x05,0x06,0xfd,0xe9, 0x93,0x66,0xb1,0x43, 0x4b,0x29,0x06,0x41, 0xad,0x9b,0x7c,0xd1, + 0x62,0x23,0x63,0xef, 0xf7,0x19,0x35,0xbb, 0x9d,0x4e,0xbf,0xb8, 0xd8,0x44,0xd5,0x54, + 0x74,0xa9,0x36,0xde, 0xd4,0xd5,0x55,0xf5, 0xf6,0x25,0xa8,0x39, 0xe9,0xb8,0xff,0x05, + 0x50,0x5e,0x02,0x99, 0xd3,0x1f,0x1f,0x3f, 0x1b,0x46,0x76,0xba, 0xaf,0x83,0xc9,0xed, + 0xfe,0xd7,0x77,0x57, 0x19,0xde,0xef,0xad, 0x5a,0xc0,0xc1,0x69, 0x15,0x23,0xc9,0x7d, + 0xde,0x74,0xcd,0xf6, 0xbe,0x89,0x2f,0x57, 0xba,0x4e,0x72,0x10, 0x7b,0x69,0x67,0xb2, + 0x85,0x57,0xea,0x57, 0x5f,0x8f,0x6d,0x62, 0xd3,0xa1,0xec,0x6a, 0x96,0x59,0x53,0x76, + 0x61,0xaf,0xa0,0x9f, 0x79,0x26,0xdc,0x7f, 0x5f,0xa5,0xc1,0x05, 0x83,0x10,0x29,0xb8, + 0x51,0x54,0x92,0x15, 0xbe,0x31,0xd8,0xd3, 0xe5,0xf4,0x6a,0x13, 0x93,0xf7,0xef,0xf4, + 0xce,0x48,0x43,0x6e, 0xd6,0xa0,0xdd,0x6d, 0xfe,0x77,0x63,0x73, 0xff,0x9d,0x77,0xf3, + 0x4c,0xc6,0xc0,0xfc, 0x63,0xb7,0xee,0x02, 0x83,0x48,0xb8,0x07, 0x60,0x6f,0x64,0xc9, + 0xf1,0xd4,0x0a,0x16, 0x16,0xe2,0x6c,0xd9, 0xda,0xca,0xd0,0x52, 0x88,0x47,0x77,0xc4, + 0xe9,0xb9,0xa1,0xf3, 0x80,0x3b,0xca,0x86, 0x89,0x23,0xf2,0xf9, 0x5c,0x8e,0x9f,0x0a, + 0xe1,0x46,0x9d,0x99, 0x4b,0x29,0xe5,0x59, 0x93,0xf2,0x1f,0x2b, 0x78,0x4b,0x8c,0x05, + 0x00,0xfd,0x99,0x5d, 0xf2,0x69,0x18,0x28, 0x42,0xd6,0xc6,0x1f, 0x97,0x06,0xd0,0x7d, + 0xf7,0x8e,0xb0,0x80, 0x80,0x86,0xb4,0x90, 0x56,0x34,0xa6,0x56, 0x46,0x47,0x2d,0x5b, + 0x71,0xae,0xfd,0xbc, 0xcd,0x65,0xdb,0xe9, 0xb1,0x2b,0x5c,0x19, 0xe1,0xce,0xea,0xd2, + 0xa1,0x9b,0x5c,0xe9, 0x7b,0xdf,0x31,0x05, 0x62,0x12,0xff,0x1d, 0x70,0xd6,0x67,0x23, + 0xef,0x3d,0x56,0xf6, 0xdf,0x8e,0x7f,0x08, 0xf9,0xec,0x4b,0x7d, 0xbe,0x92,0x0d,0xc0, + 0xd3,0x41,0x20,0x81, 0x01,0x52,0x7a,0x51, 0xab,0x40,0x04,0xa1, 0x82,0x42,0x10,0x50, + 0x36,0xc6,0xe3,0xf9, 0x57,0xf5,0x05,0xb6, 0xbc,0x6a,0x39,0x48, 0x42,0x2b,0xc8,0xcf, + 0x30,0xc0,0xf8,0xb0, 0x59,0x3e,0xa5,0x07, 0x39,0xc8,0xb2,0x85, 0xe8,0x7a,0x1e,0x06, + 0x53,0xd4,0x53,0xe3, 0xe2,0x73,0x14,0x6d, 0x07,0x65,0x8b,0x6a, 0xd4,0xd2,0x28,0xf1, + 0x71,0xec,0x08,0x66, 0x55,0x78,0xa4,0x82, 0xeb,0x32,0x47,0x65, 0x7f,0xd5,0xad,0xe7, + 0x86,0xd2,0x3c,0xc3, 0x81,0xde,0xba,0x5d, 0x41,0xbd,0x8a,0xea, 0xb8,0x9d,0x14,0x8b, + 0xf8,0x96,0xaf,0x67, 0xfe,0x35,0xa0,0x72, 0x48,0x48,0x30,0x92, 0x68,0xb8,0xda,0x62, + 0x50,0x98,0x82,0xe0, 0x66,0x6c,0xf3,0x4f, 0x9f,0x93,0x47,0x05, 0x75,0xdb,0x1b,0x53, + 0x6d,0x5d,0x73,0x6d, 0x3b,0x40,0xb0,0x3e, 0xa6,0x02,0x74,0x67, 0x30,0x65,0xb9,0xf7, + 0x50,0x57,0xec,0xd4, 0xae,0x58,0xe3,0x96, 0xac,0x32,0x2d,0x75, 0xca,0x1f,0x53,0x41, + 0xc8,0x5d,0xa1,0xec, 0x23,0x1b,0xc0,0x9c, 0x8a,0xec,0x33,0xfc, 0x58,0xd7,0x69,0x8d, + 0x31,0x5d,0x6f,0xf9, 0x9f,0x82,0xfe,0xb2, 0xb0,0x9a,0x6a,0x84, 0x88,0x50,0xa0,0xdf, + 0x8d,0xde,0x11,0xde, 0xf9,0xfd,0xb4,0xc0, 0x9a,0x01,0x22,0xaa, 0x7c,0xca,0x71,0xd8, + 0x45,0x26,0x91,0x05, 0xd5,0xd9,0x99,0xad, 0x32,0x90,0x41,0x24, 0x15,0x14,0xc9,0xb2, + 0x55,0x55,0xc8,0xaa, 0x81,0x5e,0xe2,0xb0, 0x9b,0x90,0xd6,0xd7, 0x77,0x83,0x47,0x0d, + 0x3a,0xcb,0x65,0x06, 0xb2,0x56,0x55,0x64, 0xb4,0xbf,0xdf,0x40, 0x8d,0xa7,0x3b,0xc1, + 0xb9,0xc0,0x91,0x5e, 0x9a,0x3c,0x47,0x19, 0x54,0xc4,0x41,0x6d, 0x7e,0x26,0xee,0x14, + 0xdd,0x73,0x2e,0x59, 0x2a,0x5d,0x54,0x47, 0x66,0xa8,0x15,0x0c, 0x9b,0x4a,0xfb,0x9e, + 0x1f,0x0e,0x67,0x9e, 0x09,0x1c,0xfe,0x80, 0x08,0x50,0x31,0x0d, 0xcb,0xe1,0x33,0x21, + 0x52,0x43,0xbe,0x25, 0xb6,0x23,0x9b,0xc2, 0x75,0xcd,0x99,0x59, 0xa1,0x21,0x62,0x98, + 0x58,0x3b,0x1d,0x50, 0x48,0x0c,0x39,0x55, 0xd4,0xac,0x8e,0x4e, 0x97,0xfb,0x3f,0x5b, + 0x58,0x8a,0xa3,0x1f, 0xfe,0x39,0x43,0x1b, 0x03,0xed,0x1d,0x6d, 0x21,0xa0,0x80,0x82, + 0x18,0x7e,0xd3,0xf6, 0x60,0xf4,0xf9,0x40, 0x61,0x49,0xce,0x86, 0x31,0x9d,0xbc,0x52, + 0x99,0xe0,0xa3,0x0e, 0x3f,0x08,0x79,0x2c, 0x7d,0x60,0x52,0x44, 0xbc,0xb0,0x82,0x5d, + 0x89,0x7a,0x5d,0x2b, 0xa0,0x18,0x51,0x2e, 0x51,0x60,0xf0,0x2b, 0x95,0xca,0xa9,0x4c, + 0xa4,0xa9,0x92,0x13, 0x4d,0x03,0x60,0x12, 0x01,0xa5,0x6a,0x00, 0xf8,0xf3,0xfe,0x79, + 0x13,0x65,0x13,0x21, 0x49,0x8a,0xdc,0x41, 0x73,0x41,0x06,0xb1, 0xd2,0xa8,0x88,0x74, + 0xb0,0x84,0xdc,0xa1, 0x07,0x18,0x33,0x5c, 0xcc,0x1d,0x37,0x5f, 0x08,0x6d,0x95,0xa6, + 0x5a,0x9c,0x14,0x84, 0x42,0x34,0x40,0xc2, 0xf5,0x48,0x35,0xd9, 0x06,0x78,0xf5,0xf4, + 0xe0,0x8f,0x7d,0xd7, 0x7e,0xab,0x93,0xc1, 0xae,0x88,0x24,0x31, 0xb4,0xad,0x32,0x6d, + 0x36,0x5e,0x6b,0xeb, 0x1b,0x45,0x02,0x9b, 0x13,0x6d,0x88,0x7e, 0x2c,0x24,0x43,0x0a, + 0x58,0x43,0xa9,0x34, 0x6f,0x1d,0xa6,0x29, 0x30,0x15,0x14,0x13, 0xb8,0x4c,0x86,0x21, + 0x09,0x4c,0xe4,0xb9, 0xf6,0xb3,0x85,0x4a, 0xde,0x69,0x2c,0xd9, 0xc1,0xd3,0x86,0xbe, + 0x49,0x5b,0x86,0x76, 0x6a,0xab,0x7e,0xb4, 0xb6,0xde,0x81,0x28, 0xd2,0x18,0x71,0x15, + 0x41,0x23,0x59,0x96, 0x7c,0x01,0x8d,0x21, 0xd3,0x90,0xf7,0xb4, 0xfc,0x93,0xe6,0xf4, + 0xbe,0xb3,0x05,0x16, 0xda,0x05,0x6c,0x8f, 0x89,0xd2,0x5a,0xbd, 0xeb,0xea,0x39,0xed, + 0x28,0x6d,0xcc,0x2e, 0x45,0x23,0x03,0x52, 0x8d,0x55,0x38,0x91, 0x27,0xba,0xb5,0x64, + 0x37,0x1d,0x7e,0x5f, 0x40,0x4f,0x01,0xc3, 0x43,0xa6,0x10,0x3d, 0x16,0xda,0x35,0xb7, + 0x75,0xfb,0x2b,0xd3, 0x6e,0xe6,0x14,0xb5, 0xfe,0x6c,0xe7,0x46, 0xd0,0xb1,0x99,0x7a, + 0x9a,0x4e,0x4d,0x15, 0x25,0x08,0xb6,0x23, 0xbc,0xce,0x3e,0xd7, 0xe7,0xe1,0x49,0x6c, + 0x1d,0xe9,0x8e,0x36, 0x07,0x4e,0xca,0x20, 0xd8,0x09,0x00,0x7d, 0x6d,0x9a,0x07,0x24, + 0x04,0x03,0x82,0x8e, 0xfd,0x11,0xda,0x3c, 0x36,0x32,0x92,0xd6, 0x1b,0x39,0x25,0x45, + 0xa8,0x0d,0x98,0x34, 0xe4,0x1f,0x7a,0xb4, 0xcc,0xe0,0x2b,0xee, 0xb0,0x36,0x65,0x7c, + 0x0b,0x17,0x6f,0x2d, 0xe9,0x91,0xf9,0xfc, 0x9f,0x1a,0xc6,0x3e, 0xe4,0xda,0x81,0x1e, + 0x96,0x80,0x35,0x2b, 0xc9,0x9d,0x94,0x91, 0xe5,0xa0,0x84,0x2f, 0xaf,0x0e,0x44,0x12, + 0x54,0x4f,0x51,0xba, 0x63,0x2a,0xcc,0x33, 0x34,0x93,0x8e,0xb6, 0x2c,0xdb,0x07,0x05, + 0x68,0xd7,0x18,0x02, 0x38,0x09,0x3d,0x88, 0xa1,0x14,0x02,0x48, 0x36,0xa1,0x04,0xe7, + 0x7b,0x06,0x73,0xd8, 0xe7,0xa1,0xc9,0x0a, 0x33,0x20,0xc9,0xdb, 0x1c,0x6c,0x67,0x47, + 0x2c,0x03,0x1d,0xbf, 0x37,0x30,0x4c,0x0c, 0x61,0xeb,0xb5,0xa1, 0x09,0x5d,0x84,0xb7, + 0x81,0x4d,0xd3,0x7a, 0x08,0x70,0x60,0x03, 0xca,0x3b,0x5d,0x1e, 0x94,0x74,0x1a,0xcf, + 0xd1,0x08,0x17,0x48, 0x49,0x09,0x27,0x4e, 0xd7,0x6e,0xfd,0x1b, 0x7c,0x6b,0x84,0x88, + 0x25,0x08,0x46,0xf9, 0xad,0xf8,0x1c,0xd9, 0xfb,0xb2,0xf7,0xde, 0x47,0x4d,0xb5,0x30, + 0xc9,0xe6,0x62,0x66, 0x92,0xf6,0x90,0x3a, 0xb5,0xd2,0x3a,0x7c, 0xa5,0x8c,0xd1,0x51, + 0x10,0x24,0x5b,0xb5, 0xa8,0x48,0x95,0x79, 0x0c,0xbf,0xb1,0xe4, 0xff,0xd6,0xb2,0xbe, + 0x07,0xde,0xcb,0xf2, 0x3e,0xf7,0x19,0x21, 0x91,0x0b,0x90,0x0e, 0x85,0x04,0x2c,0xf9, + 0x65,0x00,0x01,0xf1, 0x7e,0xa0,0x4d,0x52, 0x40,0x91,0x0b,0xa0, 0x9a,0xdc,0xa5,0xfe, + 0x8f,0x8f,0x2d,0x33, 0x26,0x2c,0x05,0x42, 0x43,0x4b,0xbb,0x8b, 0xcc,0xf0,0x6b,0x78, + 0xbf,0x0f,0x7b,0x46, 0x98,0x8d,0xcb,0x42, 0x01,0x20,0xf7,0x09, 0x50,0x08,0xe2,0xe8, + 0x74,0xc9,0x04,0x88, 0x53,0x11,0xca,0xc1, 0x0c,0x62,0xc9,0x1a, 0xb0,0x73,0x3d,0xdd, + 0x6a,0xc5,0x06,0x96, 0xaf,0xea,0xef,0xfc, 0x7e,0x3b,0x33,0x37, 0x93,0x50,0x22,0xa0, + 0xe4,0xf9,0xb9,0xc1, 0x23,0x6c,0xd4,0xe3, 0x46,0xa3,0x75,0x0e, 0xf7,0xb5,0x4c,0xa8, + 0x33,0xb7,0xdb,0x71, 0x3d,0x51,0x53,0x71, 0x52,0xbe,0xde,0xd1, 0x64,0xe4,0x3e,0x9e, + 0xad,0x6f,0x81,0xc1, 0x6f,0xbf,0x74,0xcb, 0x31,0x23,0xfd,0xe1, 0xe1,0x22,0xa8,0x88, + 0x95,0xc1,0xdb,0x84, 0xc8,0x34,0xdd,0x96, 0xce,0x61,0xb2,0x96, 0x05,0xac,0x21,0x82, + 0x53,0x40,0xc9,0x70, 0x1a,0xa5,0xcc,0x78, 0x3e,0xd3,0xe6,0x50, 0x72,0x79,0x3a,0x52, + 0x0c,0x3b,0xe2,0x35, 0xd2,0x7d,0x0f,0x9a, 0xfb,0xaa,0xe7,0x4c, 0x17,0xec,0x8e,0x89, + 0xea,0x78,0xeb,0xf8, 0x9b,0x9a,0x7e,0x2f, 0x5f,0xad,0xde,0xfe, 0x5a,0x16,0x82,0x9b, + 0x52,0xe3,0xa5,0xa7, 0x02,0x40,0x61,0xc8, 0x86,0x1a,0x38,0x88, 0x3e,0x4d,0x85,0x78, + 0x14,0xf5,0x14,0x51, 0x30,0xbf,0xaf,0xee, 0xd2,0xe0,0x68,0xf0, 0xab,0xcf,0x55,0x82, + 0xef,0x2c,0x0e,0x7e, 0x70,0x4a,0x83,0x12, 0x31,0x6a,0x64,0x20, 0xe1,0x54,0xde,0xc0, + 0xc6,0x25,0xb2,0x43, 0xe3,0x0b,0x2a,0xae, 0x10,0xa9,0x20,0x25, 0x40,0xa8,0x66,0x90, + 0xd0,0xb4,0x3e,0xa8, 0x1c,0xed,0x6f,0xa2, 0x82,0xe4,0x1f,0x17, 0x1c,0x7a,0xc0,0xb1, + 0xe5,0x5a,0xce,0x40, 0xfe,0x3f,0x9c,0x3f, 0x03,0x61,0x63,0x15, 0x81,0x94,0x50,0xfe, + 0x1f,0x41,0x5c,0x1a, 0x79,0xeb,0xf9,0xb6, 0x76,0x88,0x43,0x4d, 0x98,0x27,0x45,0xf8, + 0x10,0xc7,0x0d,0x2e, 0x33,0xa1,0x66,0x9e, 0x85,0x3b,0x40,0x79, 0xfa,0xea,0x89,0xe7, + 0x98,0x0c,0xfb,0x83, 0x15,0x1c,0x80,0xaf, 0xd5,0x4c,0x25,0xb6, 0x8c,0xd4,0x0e,0x57, + 0x6d,0xf7,0xb7,0x27, 0xd6,0xcc,0xab,0xd5, 0x9d,0x62,0xb8,0x77, 0xf7,0x83,0x3a,0xef, + 0xfa,0xdc,0xae,0x12, 0x4e,0x8b,0xe6,0x1a, 0xc1,0xf4,0x72,0x85, 0x4a,0xe7,0x2c,0xb3, + 0x83,0x62,0x0f,0x37, 0xc2,0x03,0xa9,0x26, 0x62,0x04,0x01,0xde, 0x90,0x4b,0x31,0x31, + 0x16,0xed,0x93,0x35, 0x99,0x85,0x6d,0xad, 0x55,0x58,0x00,0xb1, 0x2a,0xdf,0xb7,0x91, + 0x8a,0x0d,0xb1,0xb0, 0x61,0x03,0xc8,0xdc, 0xf9,0x87,0x46,0xb0, 0x5a,0xeb,0x0e,0xbc, + 0xd6,0x84,0xc8,0x1f, 0x38,0x2d,0x6b,0xe4, 0x5d,0x92,0x90,0xf6, 0xf1,0x21,0x0b,0x19, + 0xec,0xe9,0x39,0x84, 0x02,0x7f,0x48,0x85, 0x44,0x1b,0x3c,0xe0, 0x95,0x22,0x16,0xad, + 0x22,0x7c,0x86,0x5f, 0x13,0x67,0x83,0xb7, 0x5d,0xa3,0xcb,0xc4, 0xad,0xd2,0x66,0x94, + 0xa5,0x8b,0xde,0xea, 0x52,0x66,0xaa,0xba, 0x49,0x1a,0x7c,0xbf, 0x0f,0xb2,0xfb,0x03, + 0x8d,0x8b,0x1d,0xa9, 0x7d,0xa6,0x7e,0x07, 0xd5,0x74,0xaf,0x79, 0xe3,0xc8,0x2e,0xbf, + 0x0f,0x7b,0x19,0xe0, 0x50,0x1e,0x73,0x92, 0xa0,0x4e,0xff,0x7f, 0xf9,0x78,0x9a,0x3c, + 0x40,0xe2,0xa4,0x50, 0x70,0x11,0x8e,0x3a, 0xda,0x33,0x08,0x87, 0x30,0xc1,0x11,0x80, + 0x72,0x9a,0xd2,0x11, 0x4e,0x3d,0x45,0x3b, 0xf6,0x16,0xe5,0xb9, 0x32,0x67,0x35,0x45, + 0x69,0x56,0x01,0x95, 0x14,0x04,0x01,0xdf, 0xe8,0xe9,0x0b,0x22, 0x60,0x0d,0x2f,0x1f, + 0x2e,0x3f,0x5b,0xdb, 0x4f,0x89,0x2f,0xc7, 0xe7,0xc1,0x19,0x95, 0xd0,0x70,0x6e,0x32, + 0xe3,0x90,0x57,0xe8, 0x58,0x6e,0x45,0x49, 0x31,0x2c,0x99,0xec, 0xe4,0x1c,0x6b,0x48, + 0x2b,0x63,0xa3,0x1f, 0x81,0x5f,0x19,0xe3, 0x81,0x91,0x74,0x9c, 0x89,0x84,0xd9,0x33, + 0x23,0xa0,0x9c,0x0e, 0x67,0xb3,0xb1,0xfd, 0xde,0xd4,0x11,0xc7, 0xd3,0x89,0x9f,0xdd, + 0x2f,0xe7,0xcd,0x04, 0x3d,0xd2,0x02,0xda, 0x68,0x51,0xe2,0xaf, 0x9d,0xfb,0x3c,0xf2, + 0x49,0xbf,0x49,0x33, 0xf1,0xe5,0x73,0xa9, 0x11,0xee,0xf2,0x33, 0x90,0x64,0x3e,0xd0, + 0xec,0x2c,0xf2,0xb7, 0x2c,0x3d,0xcc,0x33, 0x41,0x81,0x53,0x8b, 0x6b,0xa3,0xf7,0xed, + 0xa7,0xae,0xe1,0x51, 0xba,0x76,0x86,0x90, 0xa5,0xa0,0x8d,0xb5, 0x88,0x43,0x25,0x25, + 0x65,0x8d,0xcc,0xba, 0x07,0x38,0x32,0x20, 0x18,0xd0,0x90,0x0d, 0x34,0x66,0xc3,0x84, + 0xf3,0x68,0x44,0xd2, 0x12,0x94,0x05,0x7f, 0xb3,0xb3,0x66,0xdf, 0x13,0x3c,0x97,0xd6, + 0x2d,0xe9,0x7a,0x9e, 0x32,0xe0,0x69,0x4c, 0x08,0x48,0x61,0x38, 0xdc,0x29,0xd3,0x54, + 0x11,0x33,0x1f,0xca, 0xf2,0xbc,0xae,0x6f, 0xc2,0xc8,0xd7,0xe1, 0x57,0x5c,0xba,0x1e, + 0x6e,0x84,0x50,0x33, 0xb2,0xc9,0xa4,0xa4, 0xcf,0x65,0x85,0x58, 0x16,0x2f,0xab,0xe5, + 0x1b,0x81,0x0a,0x8c, 0x1c,0x76,0x98,0x98, 0x68,0xd3,0x70,0x42, 0x7c,0x88,0xfe,0xd5, + 0xab,0x31,0x6e,0xd9, 0x0f,0x66,0x5f,0x28, 0xe8,0xc7,0xeb,0xfb, 0x39,0xab,0x44,0xbd, + 0x76,0x8d,0x75,0x28, 0x8f,0x4a,0x10,0x40, 0xcc,0x80,0x42,0x59, 0x6a,0x9a,0x4e,0x24, + 0xda,0x63,0x46,0xd9, 0x1e,0x54,0xa2,0x1a, 0x0a,0x35,0x49,0x38, 0x08,0x00,0x11,0x02, + 0x10,0x21,0x09,0x8c, 0x80,0x42,0x20,0x22, 0x2d,0x21,0xa1,0x20, 0x00,0x80,0x4a,0x26, + 0x9b,0x40,0x9a,0x21, 0x31,0x4d,0xb8,0x68, 0x60,0x08,0x48,0x20, 0x42,0x40,0xa1,0x04, + 0x42,0x44,0x34,0x0c, 0x72,0x54,0x66,0xca, 0x49,0xee,0xf7,0x10, 0x52,0x5e,0xa3,0x7d, + 0x7a,0x3f,0x05,0x17, 0x02,0xde,0xbb,0xa4, 0x82,0xc1,0x46,0x15, 0x27,0xf4,0x77,0x71, + 0x7c,0xb1,0xfb,0xae, 0xf2,0xdc,0x02,0xcd, 0x93,0x12,0xf6,0x45, 0x51,0x83,0x6a,0x8a, + 0xaa,0x91,0xc8,0xdf, 0xc1,0x2a,0x0d,0x45, 0x55,0x0c,0x6e,0xb5, 0x73,0xa2,0x26,0x4e, + 0xcf,0xcf,0xa1,0x17, 0xd1,0x6e,0x59,0x0c, 0xae,0x50,0x9e,0xbe, 0xfc,0x78,0x97,0x6b, + 0x16,0xdd,0xb7,0x65, 0x00,0x0a,0x50,0x0c, 0x45,0x66,0xb5,0xfd, 0x3e,0xf9,0xaf,0x1b, + 0xb7,0x5b,0x05,0x55, 0x18,0xc3,0x6a,0xed, 0x24,0x1b,0x23,0xad, 0xac,0x58,0x16,0x47, + 0x89,0x54,0xef,0x14, 0x35,0x5d,0xb2,0x28, 0x90,0x97,0xae,0x4e, 0x53,0xf4,0x6d,0x22, + 0xe3,0x8c,0x6a,0xc5, 0x7f,0xc7,0x66,0x2e, 0x99,0xf4,0x63,0x41, 0x83,0x13,0xad,0x65, + 0xa0,0xd7,0xfa,0xb9, 0x29,0x03,0x60,0xa4, 0x1c,0x07,0x8a,0x06, 0xce,0x85,0x20,0x41, + 0x39,0xaa,0x92,0x7a, 0x54,0x04,0x44,0xeb, 0xad,0xbb,0x2b,0x34, 0x2c,0x57,0xae,0xd0, + 0xcb,0xb0,0x8a,0x0b, 0xb2,0x91,0x70,0xaf, 0x3c,0x39,0x85,0xc8, 0xaa,0x3a,0x7a,0xe8, + 0xa4,0x73,0x68,0x14, 0x57,0xb9,0xe3,0xdc, 0x9d,0x36,0xc0,0xc6, 0xb2,0x32,0xb2,0x70, + 0xab,0x29,0xb2,0xf7, 0xb6,0xc2,0xb9,0x22, 0x48,0x28,0x98,0x37, 0x66,0xad,0x92,0xd9, + 0x52,0xbb,0x5c,0xec, 0xd8,0x5a,0x81,0xd8, 0xa9,0x8c,0x34,0xa0, 0x6a,0xc9,0x57,0x05, + 0x72,0xf1,0x9c,0x79, 0xc1,0x3c,0x65,0x00, 0xeb,0x2f,0x36,0x2c, 0xe3,0x7d,0x7b,0x86, + 0x94,0x15,0x9e,0xeb, 0xbb,0xbe,0x62,0xc9, 0x30,0x43,0x9f,0x57, 0x4f,0x92,0x0a,0x28, + 0xce,0xbf,0xf3,0xce, 0xc6,0x71,0x4d,0xe8, 0xae,0x9e,0x86,0x90, 0xc2,0x11,0x81,0x68, + 0xb3,0x51,0xe2,0xce, 0xac,0x16,0x12,0x70, 0x44,0x0f,0xf4,0x5d, 0x66,0x5d,0x71,0x93, + 0x31,0xa9,0xb6,0x68, 0xd2,0xf2,0xb0,0xbb, 0x04,0xd3,0xf2,0xee, 0x85,0xe5,0xf7,0x39, + 0xa1,0xf5,0xb0,0xd6, 0x42,0xe1,0x74,0xd3, 0x49,0xc1,0xcc,0x3f, 0x47,0x3b,0xd8,0xc8, + 0x48,0x88,0xc6,0x5c, 0x1c,0xe3,0x33,0x89, 0xa0,0x14,0x09,0x00, 0x3f,0x73,0x8f,0x25, + 0xf9,0xef,0xf6,0xdf, 0x9e,0xd2,0xed,0x6b, 0x97,0x3a,0x37,0xd5, 0xb0,0xc8,0x68,0xc3, + 0xe3,0x77,0x9f,0x92, 0x68,0xfe,0xcf,0x73, 0x06,0x23,0xfc,0x8f, 0x2b,0x79,0x07,0xba, + 0x62,0x31,0x31,0x50, 0xb2,0xc6,0x91,0x28, 0x41,0x20,0xe9,0xe7, 0xf7,0x9b,0x34,0x44, + 0x4b,0x5e,0x4e,0x6c, 0xe8,0x2f,0xd2,0xa6, 0xb3,0x23,0xe1,0xd7, 0xac,0xfe,0x10,0xd5, + 0x77,0x06,0xf4,0x82, 0x0f,0x4b,0x4d,0xc0, 0x0e,0x6e,0x04,0x3a, 0xdd,0x1c,0x0b,0x5f, + 0x99,0xd3,0x2d,0xcb, 0x63,0x4d,0x08,0x4c, 0x91,0xe8,0x07,0x7b, 0xaf,0xdf,0x19,0x78, + 0x5a,0xfa,0x7b,0x3a, 0xc6,0x71,0xda,0xbf, 0x2b,0x5b,0x42,0xad, 0x67,0x49,0x92,0x69, + 0xda,0x40,0xef,0x79, 0x01,0x52,0x49,0x43, 0x95,0x83,0xc7,0x9e, 0x3c,0x57,0xfd,0x9c, + 0xa4,0x84,0x06,0x0b, 0x56,0xbc,0x05,0xf1, 0x0e,0xb8,0xd5,0x01, 0x6d,0x7b,0xbf,0x79, + 0xd0,0xd6,0x51,0x38, 0xf1,0x7a,0x12,0x5d, 0xaa,0x3f,0x2a,0x0c, 0xb1,0x8a,0xc0,0x10, + 0xc1,0x16,0xcd,0x1b, 0x93,0xb2,0x86,0xc0, 0x64,0xcf,0xa5,0x07, 0x17,0xb4,0x81,0x63, + 0xae,0xd7,0xdb,0xfd, 0x3b,0x3e,0x5f,0xf4, 0xfb,0xdf,0x21,0x71, 0xf7,0xb0,0xfe,0x37, + 0x15,0xc5,0x99,0xca, 0xb1,0xf6,0x4e,0x22, 0x08,0x62,0xbf,0xb7, 0x26,0x56,0x53,0x39, + 0x1d,0x9d,0x60,0xc5, 0x33,0xab,0x0e,0xea, 0xdb,0x1f,0x45,0xec, 0xb3,0xa1,0x87,0xf6, + 0xad,0x86,0x0f,0x04, 0x6b,0x39,0x7b,0x88, 0x27,0x3c,0x95,0x69, 0xb0,0x91,0x1f,0xac, + 0x83,0x3c,0x54,0xc4, 0x1d,0x87,0x7e,0xe3, 0x0a,0xd5,0x65,0x26, 0x81,0x28,0xc0,0xcf, + 0xf5,0xfd,0x09,0x4d, 0x84,0x46,0xea,0x15, 0x37,0x1c,0x81,0x3e, 0xda,0x36,0xe7,0xd6, + 0xd9,0x4f,0x63,0x6f, 0xd6,0x90,0x7e,0xf2, 0xf1,0x9b,0xcb,0xb0, 0xca,0x00,0x97,0x2a, + 0xbd,0x48,0x82,0xaa, 0x8e,0x49,0x21,0x63, 0x86,0xaa,0xb9,0xc1, 0x4e,0xfd,0x5a,0xea, + 0x26,0x16,0xa6,0x60, 0x3c,0x84,0xfd,0xed, 0xfa,0xef,0xe1,0xd0, 0xf0,0xa0,0x16,0xf3, + 0x3e,0x3a,0xfc,0x17, 0x20,0xe2,0xf0,0xb1, 0xbd,0x74,0x8e,0x5b, 0x3f,0x71,0xca,0xd6, + 0x94,0xd8,0xbe,0x5b, 0x5f,0xcc,0x53,0x7b, 0xef,0xed,0x99,0xde, 0x5a,0xeb,0xc9,0xa3, + 0xfa,0x95,0x0f,0x9a, 0x3a,0x6b,0x78,0x49, 0x3e,0xe8,0xd8,0x3b, 0x64,0xaa,0xc8,0x6f, + 0xc1,0x2e,0xac,0x34, 0x6c,0x1f,0xca,0x5a, 0xfe,0x6c,0xff,0xb2, 0xfe,0xb3,0xf6,0xf9, + 0x94,0x59,0x5f,0x67, 0x7d,0xe6,0xe6,0x4e, 0xc1,0x6b,0xbe,0x1e, 0x0b,0xe9,0xf2,0x22, + 0xc1,0xdc,0xa7,0xe6, 0x61,0x9a,0xf0,0x2a, 0x68,0x8d,0x0c,0x96, 0xab,0xdb,0x5b,0xe5, + 0xff,0x91,0xa6,0xad, 0x5c,0x9d,0xb4,0x9c, 0xeb,0xd8,0xce,0x8d, 0x1d,0xd7,0xc0,0xbb, + 0x83,0x37,0x57,0x70, 0x97,0xc5,0x22,0xf9, 0x85,0x7a,0x16,0xe1, 0x7b,0x15,0x0d,0x70, + 0x92,0x59,0xe9,0x35, 0x78,0xe4,0x6e,0xd5, 0x7d,0x2b,0x27,0xf7, 0xcd,0xd4,0xf6,0x3a, + 0x9f,0x3b,0x58,0xf7, 0xaf,0xae,0xae,0x7e, 0x2b,0x13,0xef,0xdf, 0x7a,0xd4,0x84,0x28, + 0x01,0x9a,0x97,0x8f, 0xe1,0x2d,0x8f,0x47, 0x5e,0x8a,0x36,0xc4, 0xd1,0x80,0xee,0x4b, + 0x21,0x09,0x3e,0xd4, 0x89,0xf8,0x53,0x80, 0xc4,0xf8,0x35,0xd5, 0xc8,0xcb,0x71,0x17, + 0x11,0x6f,0xa1,0xca, 0xbb,0xd9,0xac,0xe5, 0x2e,0x6f,0xab,0x89, 0x9b,0x3f,0x63,0xb1, + 0xc5,0x53,0x0b,0xa2, 0xd5,0x52,0x18,0x51, 0x9f,0x39,0xf7,0xea, 0xd3,0xe8,0xce,0xde, + 0x7b,0x0b,0x37,0x53, 0x61,0x81,0x6d,0xa0, 0xb7,0x12,0x97,0xb6, 0xdd,0xed,0x1d,0x96, + 0x15,0xdd,0x3b,0xe8, 0x18,0x54,0x93,0xda, 0xd8,0x77,0xfe,0x33, 0x3d,0xdf,0x3d,0x9e, + 0x49,0x42,0x15,0x0d, 0xf2,0x59,0x09,0xf9, 0x11,0x5e,0xcd,0x86, 0x6b,0x90,0x1f,0xbf, + 0x5a,0x5f,0x70,0xf0, 0xad,0x92,0x68,0x22, 0x5c,0xc7,0x4d,0x7a, 0x4a,0xa3,0x83,0x93, + 0x6c,0x95,0x6b,0xd8, 0xf2,0x99,0x45,0xfa, 0xe1,0x25,0x3b,0x10, 0x1c,0xa7,0x9d,0x07, + 0x7b,0x6c,0xd7,0xf4, 0x95,0xdd,0xbe,0x79, 0x50,0xdb,0xcf,0x4f, 0x0d,0x09,0x24,0xc0, + 0x2c,0xd3,0xc6,0xf1, 0xe5,0x74,0xb8,0xac, 0xb7,0xf6,0x4a,0x28, 0x81,0x3f,0x2c,0xae, + 0x8c,0x23,0x80,0x62, 0x50,0x5c,0x79,0x27, 0xb4,0x89,0xd1,0x41, 0x7d,0x9a,0x14,0x71, + 0xd8,0x53,0xde,0x7b, 0xe9,0xa1,0x7d,0x36, 0xf9,0xc8,0x98,0x76, 0x1b,0x3e,0x58,0xd6, + 0x2c,0x1f,0x34,0x92, 0xf1,0x9d,0x74,0x09, 0x47,0x78,0x75,0x53, 0x9f,0xf7,0x13,0x03, + 0x42,0x0e,0xb0,0xf4, 0xb9,0xf2,0x8e,0xa5, 0xbe,0xfb,0x4b,0x49, 0x2f,0x93,0xfe,0xcf, + 0x60,0xb5,0x5e,0x28, 0x3b,0x46,0xba,0x27, 0x24,0x1d,0x82,0x59, 0x09,0x91,0x12,0x0e, + 0xf1,0x23,0xa1,0x79, 0xd3,0x3b,0x99,0xd4, 0x92,0xa6,0xdb,0x51, 0x3d,0x7e,0x76,0xc9, + 0x3e,0xe9,0x0c,0xb1, 0xbd,0x9b,0xad,0x34, 0x38,0xeb,0xf1,0xdd, 0xfa,0x12,0x98,0x86, + 0x1a,0x03,0x84,0xd2, 0x06,0x14,0x0a,0x3c, 0x2c,0x69,0xac,0xda, 0x86,0x17,0x7a,0xe1, + 0x5a,0x98,0xaa,0x4d, 0x92,0xb3,0x9d,0x96, 0x13,0x5d,0xa8,0x54, 0xcb,0x46,0xf4,0xfe, + 0xd9,0xff,0xd5,0x85, 0xc7,0x57,0xdd,0xfc, 0x3b,0x57,0xae,0x95, 0x9e,0x81,0x5a,0xd3, + 0x8a,0x16,0x1b,0x99, 0xd0,0x69,0x31,0xc9, 0xf1,0x8d,0x2c,0x44, 0xec,0xde,0x2f,0x35, + 0x73,0x76,0x70,0xdc, 0x16,0xf0,0xf0,0x7a, 0xa3,0x69,0x6b,0x99, 0x92,0x30,0xdc,0x50, + 0xc8,0x4e,0x24,0x7c, 0x47,0xde,0x1c,0x04, 0x17,0xc0,0x62,0xd0, 0xe0,0x60,0x65,0x51, + 0x05,0x9c,0xb9,0x83, 0x12,0x8e,0x8a,0x03, 0xfc,0x34,0xa8,0x7c, 0x78,0x9f,0xf7,0x0d, + 0xdf,0x64,0x83,0xcd, 0x9b,0x06,0x01,0xc5, 0x20,0x20,0xc0,0x33, 0x00,0x4f,0xef,0x2f, + 0xf2,0x4e,0x71,0x59, 0x08,0xa6,0x43,0x3f, 0x59,0xbc,0xe5,0xe2, 0x26,0xa6,0xdc,0xc9, + 0xff,0xeb,0xb7,0x2d, 0x74,0xdb,0xde,0x3f, 0x0b,0xc7,0xc9,0xfb, 0x6c,0xef,0xa5,0x59, + 0x7f,0xb4,0xcc,0xfd, 0xdb,0xec,0x07,0x3d, 0xdf,0xb7,0x47,0xf9, 0x7d,0x36,0x50,0x04, + 0x75,0x1b,0x69,0xe5, 0x0a,0x7b,0xfc,0xa0, 0x84,0x72,0xb8,0x6e, 0x52,0x84,0xf2,0x62, + 0x92,0xaa,0x26,0x9e, 0x66,0xe4,0xa2,0x57, 0xa8,0xe8,0xda,0x7b, 0xf7,0x58,0xf1,0x2a, + 0x07,0x87,0xb2,0xc8, 0xaa,0xa5,0x61,0xfb, 0x27,0xbf,0x9a,0xe9, 0x2c,0xb3,0xc6,0x4e, + 0x4c,0xd8,0x29,0x9f, 0xc8,0x4c,0x44,0x28, 0x5b,0xea,0x4d,0x1a, 0x61,0x0f,0x06,0x9b, + 0x59,0x3e,0xa3,0x07, 0xb5,0xcb,0x89,0x90, 0x0b,0x5d,0x7d,0xd4, 0x36,0x29,0x4c,0x40, + 0xd9,0x46,0xd1,0x02, 0x40,0x84,0x3d,0x84, 0x94,0x84,0x97,0x24, 0x8c,0x1e,0xd5,0xa9, + 0xed,0x54,0xa5,0x25, 0xa2,0xd0,0x83,0x51, 0x14,0xb0,0xc8,0x90, 0xae,0xfd,0x64,0xd3, + 0x1e,0xe0,0xf0,0x84, 0x41,0x04,0x4d,0xec, 0xf0,0xd3,0xac,0xe1, 0xe6,0xc7,0xd6,0x47, + 0xe3,0x1a,0x71,0xd1, 0xc1,0xc8,0xe7,0xee, 0x1e,0x5c,0xd9,0xa1, 0x5d,0x44,0x65,0xfd, + 0xf9,0x67,0x41,0x2d, 0xe3,0xb5,0x98,0xce, 0x0c,0x87,0x51,0xe7, 0x1c,0x52,0x7a,0xcc, + 0xc0,0x05,0xcf,0xad, 0x9d,0xfc,0x3c,0xcb, 0x79,0x27,0x56,0x30, 0x15,0x5a,0x0e,0xe6, + 0x16,0xd7,0x81,0x73, 0xf5,0xeb,0xff,0x83, 0xcb,0x3a,0x34,0xd5, 0xde,0xb2,0x2b,0x10, + 0xed,0x17,0xd4,0xc9, 0xb8,0x21,0x6e,0xd4, 0x39,0xe2,0xa3,0xdb, 0x14,0x4c,0x00,0x06, + 0x20,0x44,0x2b,0x9c, 0xc3,0xdc,0x02,0x69, 0x1b,0xd6,0x24,0x8f, 0x51,0xa5,0x98,0xc3, + 0xbf,0x69,0x6c,0x06, 0x10,0xfe,0x7d,0x68, 0x22,0x1e,0x04,0x90, 0x44,0xa0,0x86,0x8f, + 0x2c,0x49,0x1d,0x43, 0x41,0x0d,0x21,0x1e, 0x4b,0x42,0x53,0x68, 0x9b,0x55,0x34,0x20, + 0x26,0xd2,0x49,0x50, 0x1d,0xf8,0x34,0x8e, 0x66,0xa8,0x01,0xb3, 0xaf,0x18,0xa4,0x1c, + 0xa3,0x85,0x90,0xf8, 0x9d,0x01,0x09,0x54, 0xc4,0x1a,0x55,0xfd, 0x1c,0xc7,0x3b,0x71, + 0xce,0xe2,0x59,0x63, 0x72,0x35,0x5b,0x69, 0x4c,0xa5,0x5f,0x82, 0x7a,0x1d,0x0b,0x11, + 0x5a,0x1b,0xbd,0x0c, 0x5b,0x8f,0xe7,0xa6, 0x63,0xf4,0x80,0x6b, 0xf6,0xe1,0xb6,0x31, + 0x82,0x91,0xe2,0x1b, 0x9e,0xcf,0x73,0xb7, 0x96,0xd9,0x2a,0x24, 0xef,0x33,0x9a,0x7d, + 0x2e,0x11,0xdd,0x93, 0x28,0x6a,0xfc,0x44, 0x70,0xc9,0x4e,0xdf, 0xbf,0x16,0xcd,0xbf, + 0xbb,0xc8,0xe3,0xcf, 0x77,0x96,0x56,0xb4, 0x7f,0x8c,0x73,0x6c, 0x9c,0x65,0xea,0xa8, + 0xe8,0x40,0xe4,0xaf, 0xb7,0x8a,0xaf,0xff, 0x7d,0x0f,0x02,0x37, 0x93,0x9c,0xa6,0xa5, + 0xff,0x5c,0x2e,0x7a, 0x5a,0x3d,0x1e,0x76, 0xbb,0x5f,0xd2,0xe8, 0x69,0xc1,0xdc,0xd5, + 0xeb,0xec,0x02,0xd6, 0xb0,0x01,0xb3,0x58, 0xd0,0xb2,0xd8,0x7b, 0x86,0x83,0xb1,0xd9, + 0x41,0xbe,0x04,0xd1, 0xd6,0x30,0x3b,0xa6, 0x03,0x18,0x91,0x59, 0x88,0x7d,0x0c,0x04, + 0x03,0x06,0x64,0xaf, 0xf8,0xfb,0x12,0x4b, 0xa2,0xa2,0x0e,0x79, 0xaf,0x84,0xc0,0x9d, + 0x4b,0xbb,0x96,0x68, 0xd4,0xed,0xae,0x46, 0xbd,0x02,0xbe,0x3f, 0x6b,0x91,0x63,0xe7, + 0x7f,0x5e,0x86,0xb4, 0x4d,0x1e,0xb3,0x75, 0x0b,0x80,0x2e,0xbb, 0xd8,0xf7,0xb6,0x34, + 0x94,0x97,0xd7,0xf1, 0xe0,0x40,0x57,0x78, 0x12,0x85,0x88,0xd6, 0xe9,0x81,0x27,0x8c, + 0xd0,0xa1,0x34,0x18, 0x1b,0x72,0xc5,0xee, 0x3f,0x4d,0xa9,0xe0, 0xab,0x69,0x99,0xa8, + 0xe6,0xe2,0xda,0x7b, 0xa1,0xf7,0xcc,0x50, 0x91,0xc0,0x20,0x4c, 0xac,0xf0,0xb8,0x1f, + 0x0c,0xa9,0xdb,0x73, 0xc3,0x64,0x2d,0xee, 0x21,0x63,0xba,0xba, 0x74,0xc6,0x7c,0x3e, + 0x0e,0x14,0x49,0x92, 0x7a,0x52,0xca,0xf0, 0xad,0x40,0x51,0x46, 0x7a,0xb1,0x0d,0x2c, + 0x18,0x9c,0x8b,0xf3, 0xaf,0xe6,0xf8,0xf8, 0xfa,0xba,0x84,0x15, 0x97,0x79,0xac,0xc3, + 0xde,0xda,0x29,0xc5, 0x7a,0x5e,0xc0,0xd3, 0x5c,0xd8,0xf4,0x98, 0x98,0x6b,0x4e,0x64, + 0xea,0x61,0x26,0xc1, 0xb4,0xc6,0xf6,0xf0, 0x0b,0xbb,0x25,0x02, 0x6c,0x86,0xba,0x79, + 0x42,0x95,0x1c,0x5e, 0xd7,0x2c,0x5a,0x5e, 0x38,0x31,0x0c,0x24, 0x56,0x42,0xd1,0x40, + 0x2c,0x97,0xa1,0xf0, 0x3b,0x0f,0x07,0xe1, 0xd0,0x14,0x97,0x60, 0xca,0xcd,0xd3,0xd9, + 0x0e,0xcf,0xb0,0x81, 0x6b,0x68,0x17,0x66, 0x2f,0x81,0xd6,0x70, 0x05,0xa9,0x6d,0xf6, + 0x52,0x78,0xd1,0x5b, 0xb3,0xac,0x3d,0xde, 0x5c,0xae,0x30,0xd6, 0xa2,0xa5,0x11,0x20, + 0x8b,0x77,0xde,0x08, 0xa5,0xc5,0x40,0x05, 0x29,0x89,0x22,0x4d, 0x49,0x26,0x13,0x92, + 0xce,0x63,0x73,0xa9, 0x50,0x57,0x88,0x82, 0x88,0x99,0x3a,0x1a, 0x01,0x12,0x80,0x21, + 0x96,0xe6,0x09,0xc8, 0xa4,0x18,0x00,0x20, 0x14,0xaa,0x40,0xd1, 0x44,0x83,0xc9,0x52, + 0xa9,0xb1,0x91,0x98, 0x68,0x13,0x9a,0x49, 0x15,0xdd,0xc4,0xdc, 0x3b,0x09,0xa8,0x9c, + 0x2c,0xde,0x4c,0x42, 0xb7,0xc9,0xdc,0xb7, 0x8b,0x1e,0xf6,0x9c, 0x5d,0xdf,0xb7,0xde, + 0xdb,0xb5,0x6c,0x8c, 0x63,0x69,0x59,0x8b, 0xa2,0x26,0xc9,0x22, 0x53,0x4d,0xd3,0x66, + 0x89,0xb9,0xaa,0x02, 0x65,0x4a,0x82,0x9a, 0xa1,0x0d,0xaa,0x58, 0xd9,0x00,0xc9,0x95, + 0xe4,0x22,0x71,0x20, 0x93,0x02,0x40,0x90, 0xb1,0x13,0x9c,0xcc, 0x98,0x87,0x75,0x41, + 0x33,0x08,0x55,0xca, 0x90,0x41,0x0e,0xae, 0x64,0x44,0xc4,0x9a, 0x03,0xce,0x4c,0x19, + 0x24,0x50,0xcc,0xca, 0x12,0x70,0xb1,0x0c, 0x02,0xcc,0x4d,0x83, 0x04,0x72,0xa4,0x4a, + 0x11,0x62,0x6b,0x35, 0x12,0x93,0x93,0x00, 0xc8,0xc0,0x69,0xc4, 0x84,0x80,0x9c,0x28, + 0x56,0x44,0x50,0x8e, 0xea,0x54,0x38,0x0e, 0xcc,0xe1,0x88,0x00, 0x98,0x08,0x43,0x48, + 0x4f,0x77,0xb5,0xe2, 0x36,0xbe,0xd2,0xb6, 0xe8,0x0e,0xde,0xc5, 0x92,0x2c,0xc1,0x50, + 0xb6,0x55,0x08,0x04, 0xe2,0x42,0x81,0xd0, 0x93,0x19,0x72,0x0b, 0x18,0x28,0xa8,0x08, + 0x2a,0x53,0x70,0xc5, 0x0b,0xec,0x3c,0xc5, 0x7c,0x09,0x57,0xa9, 0x61,0xe0,0xf3,0x19, + 0xb6,0xe2,0xb3,0xcd, 0xfe,0x36,0x67,0x7c, 0xce,0x06,0xd3,0x23, 0x89,0x67,0x1b,0xbe, + 0xce,0xed,0x78,0x9a, 0xde,0xfb,0x6f,0x9d, 0xa1,0xbd,0x79,0xe7, 0x9e,0x79,0xe7,0x9a, + 0x69,0xa6,0xac,0x64, 0xce,0xae,0x8b,0x69, 0x95,0x05,0x3c,0x35, 0xa8,0xd3,0xbe,0xd1, + 0xa0,0xc2,0x99,0xd1, 0xcf,0x95,0x8d,0x9e, 0x9a,0xe5,0xbf,0xcd, 0x76,0xc5,0xab,0x02, + 0x2e,0x06,0x07,0x10, 0x4d,0x4a,0xef,0x81, 0xfc,0xb6,0xa8,0xa4, 0x9c,0x11,0x3e,0xd9, + 0x50,0x0f,0xba,0xaa, 0x37,0xda,0x95,0x91, 0x3e,0xcb,0xfc,0x65, 0x13,0x7a,0x34,0xac, + 0x2c,0xcc,0xe6,0xb3, 0x81,0x0b,0x3a,0x82, 0xab,0xbc,0x4d,0xd8, 0x10,0x49,0x12,0x51, + 0x2a,0xd5,0xd6,0x68, 0x49,0xdc,0x1c,0x28, 0x14,0x9b,0x24,0x13, 0xd8,0xf0,0xfc,0x8d, + 0x3c,0xb5,0x16,0xfa, 0x28,0x62,0x8e,0x1f, 0x17,0x2f,0x5f,0x40, 0x0e,0x2f,0x2a,0x1e, + 0xe3,0x7f,0xda,0x23, 0xe4,0xee,0x77,0x74, 0xa0,0x1a,0xfb,0xae, 0x34,0x51,0xf1,0xae, + 0xcf,0x97,0x76,0x8a, 0x14,0xaf,0x8c,0xea, 0xb7,0xc3,0x6c,0x99, 0xc1,0xb1,0x9a,0xad, + 0x06,0xde,0x6e,0xdc, 0x19,0xa3,0x0d,0x7c, 0x8a,0xc0,0x95,0x0a, 0x40,0x3f,0x80,0x92, + 0x5a,0xd6,0xfc,0x06, 0x7b,0x14,0xd5,0xf1, 0xfe,0x62,0xde,0xf6, 0xba,0xaa,0x35,0x2c, + 0xcb,0xf4,0xfe,0x2f, 0xcd,0x7b,0x13,0xcc, 0x20,0x15,0xa3,0xb4, 0xc7,0x6b,0x5e,0xea, + 0x3c,0x8d,0xec,0x3d, 0xb6,0xa4,0x29,0xe9, 0x1b,0x7f,0xda,0xe9, 0x2d,0x46,0x6d,0xc1, + 0xf8,0x5b,0x5e,0x4e, 0x4e,0xf5,0x5a,0xf5, 0x3f,0x28,0x80,0xf9, 0xed,0x07,0x77,0x7a, + 0xb8,0x5f,0x42,0xec, 0x53,0xab,0x7a,0x78, 0x82,0xa9,0x05,0xad, 0x9b,0xaa,0xc3,0x9e, + 0x49,0x48,0x5f,0xca, 0x23,0x5d,0x13,0x3e, 0xe6,0x06,0xeb,0xbe, 0xe4,0xb4,0x7f,0xaa, + 0xec,0xd1,0x1c,0xde, 0xc8,0xe9,0xd2,0xab, 0x8d,0xa6,0x70,0x0d, 0xeb,0xc1,0x13,0xd9, + 0xfb,0x0b,0xc5,0xd6, 0xba,0x22,0x15,0x78, 0x54,0x17,0x02,0x90, 0x09,0x89,0x64,0x15, + 0x9b,0x4a,0xb7,0x01, 0xd8,0x5c,0x3a,0xf3, 0xc0,0x88,0x04,0x08, 0x14,0x21,0x10,0x80, + 0x80,0x12,0x04,0x11, 0xd6,0xc0,0xda,0x8a, 0xda,0x90,0x88,0x04, 0x02,0x20,0x40,0x02, + 0x04,0x22,0x14,0x17, 0xf6,0x4b,0x73,0x98, 0x00,0x84,0x88,0x84, 0xd2,0xd2,0xb4,0x4e, + 0x00,0x50,0x8c,0x60, 0xac,0x49,0xfa,0xf4, 0x68,0xf0,0x6f,0x80, 0x31,0x9a,0x57,0xf9, + 0xdc,0x5b,0xbd,0x75, 0x77,0x33,0xf8,0x0e, 0x42,0xf3,0x5b,0xdc, 0xbe,0xcd,0x9b,0xdd, + 0xb4,0x44,0x20,0xcd, 0x7f,0x1f,0x45,0x5e, 0xf5,0xec,0xf6,0xcb, 0x23,0x7f,0x4c,0x5a, + 0xdc,0x6a,0x6f,0xd1, 0x72,0xc5,0x8e,0x6f, 0xd6,0x46,0x2a,0x68, 0x3f,0x22,0x03,0x0b, + 0x74,0x10,0x54,0xff, 0x0c,0x33,0x7a,0xce, 0xbd,0xa7,0x7a,0x02, 0x48,0x8e,0x73,0xa4, + 0x74,0xd7,0x32,0xea, 0x85,0x06,0x35,0xcb, 0x4f,0xd0,0xd3,0x5c, 0xd6,0x9b,0x36,0xee, + 0xfe,0x1f,0x1c,0x9d, 0xa3,0x4c,0xe0,0x66, 0x82,0x9a,0x40,0xb0, 0xf8,0xb7,0x35,0x2b, + 0xc9,0x57,0x47,0x88, 0xd0,0xa1,0x8a,0x03, 0x74,0xc0,0x3e,0x8a, 0x6c,0x32,0xdb,0x4d, + 0xd2,0xb5,0x99,0x23, 0x20,0x18,0xc6,0x68, 0x11,0xaa,0xa6,0x95, 0xcc,0x8f,0xc7,0x1d, + 0x9c,0x37,0x03,0x7f, 0x19,0xb1,0x6d,0xbc, 0x1c,0xaa,0x17,0x34, 0xa0,0x82,0x11,0x7d, + 0xcd,0x70,0x5f,0x40, 0x54,0x6e,0x28,0x50, 0x1a,0x45,0x46,0x55, 0x70,0xd4,0xea,0xb4, + 0x6b,0x29,0x77,0x5f, 0x47,0x37,0x0d,0x9d, 0x7a,0x63,0x8a,0x3b, 0xd2,0x33,0x05,0x10, + 0xe7,0x74,0x27,0x36, 0x70,0xd9,0xd4,0x81, 0x77,0x40,0x57,0x58, 0x7d,0x66,0xb4,0x11, + 0x15,0x6d,0xfc,0x78, 0x29,0x90,0x00,0x95, 0x23,0x0b,0x92,0x00, 0x88,0x40,0xeb,0x13, + 0xb2,0xd2,0xd6,0x41, 0x47,0x8e,0x2d,0x6a, 0x0d,0x04,0x82,0xbe, 0x53,0xba,0xaf,0x18, + 0x7d,0x6e,0x62,0x2b, 0x05,0x6f,0x83,0xe0, 0x7d,0x0e,0x86,0x01, 0x84,0x02,0x02,0x4b, + 0x93,0xc0,0x16,0xa4, 0x60,0x36,0xb5,0x0d, 0x43,0x46,0x7e,0x65, 0x29,0x74,0xcd,0x3f, + 0xb5,0x07,0x69,0x7f, 0xd6,0x6b,0xb0,0x75, 0xf5,0xf4,0xfc,0x76, 0xa3,0x50,0x6a,0x37, + 0x46,0x1e,0x4d,0x06, 0x5a,0x16,0xd7,0x91, 0xd5,0x64,0x6f,0xf2, 0xf3,0xb3,0xec,0x7a, + 0xef,0xd3,0xf5,0x55, 0xdc,0x89,0xed,0x82, 0xa0,0xf1,0xb7,0xc1, 0x48,0x18,0xdc,0x52, + 0x08,0xde,0xbb,0xbb, 0x32,0x35,0xd1,0xc1, 0x3c,0xad,0x2c,0xb7, 0xa1,0x63,0x53,0x00, + 0x11,0x61,0xbd,0xa1, 0x6b,0xb8,0xc5,0xe0, 0x79,0x7d,0x6e,0xa6, 0xf1,0xdb,0xf1,0x7a, + 0x29,0xff,0x86,0x06, 0x86,0xf8,0xce,0xf2, 0x8f,0x93,0xbb,0x33, 0x6d,0x4e,0x9a,0x91, + 0x15,0x85,0x30,0x40, 0xf2,0x98,0x36,0xc7, 0xa8,0xa9,0xfc,0xe3, 0x2b,0x6b,0xad,0xd2, + 0x0f,0x5b,0x61,0xe9, 0x95,0x40,0x1c,0xe3, 0x28,0x09,0x8b,0x59, 0x40,0xce,0xfa,0xbc, + 0xc9,0xb2,0xa8,0x80, 0x84,0xa7,0x93,0x17, 0x7c,0xbf,0xe3,0xc6, 0x5a,0xa5,0xc3,0x94, + 0xc5,0xca,0xad,0xf7, 0x6e,0x3e,0xee,0x1b, 0xe2,0x05,0x0a,0xf9, 0x98,0xc3,0xe6,0x44, + 0x7f,0x1d,0x44,0x0f, 0x21,0x88,0x22,0x10, 0x66,0x20,0xac,0xcd, 0x6d,0x49,0x7e,0x95, + 0x65,0x51,0x15,0xf0, 0xc4,0x31,0x09,0x57, 0xc2,0xe8,0x77,0x92, 0xc9,0x2e,0x07,0x1e, + 0xef,0xae,0xd8,0xf3, 0x3e,0xce,0xbc,0xcd, 0xbe,0xe9,0xff,0x1d, 0xe8,0xf2,0xfa,0x4a, + 0x61,0xeb,0xac,0xb4, 0xb0,0x6e,0x07,0x03, 0xc9,0x61,0x55,0x42, 0xeb,0x13,0xc9,0x1a, + 0x76,0x76,0x81,0x26, 0x3a,0x16,0x1d,0x5a, 0x85,0x1b,0x5b,0xc1, 0xc9,0x66,0x24,0xf5, + 0x7d,0x3b,0x57,0xd4, 0xd2,0x73,0x90,0x42, 0xb5,0xf5,0x40,0x76, 0x79,0x4e,0x0e,0x83, + 0x79,0x4f,0xc0,0xe0, 0xca,0xae,0x1e,0xe7, 0x6f,0xc2,0xed,0xf4, 0x76,0x65,0x64,0x78, + 0x78,0xf7,0xb8,0x07, 0xaa,0x12,0x0d,0x13, 0x11,0xb0,0x4d,0xa6, 0x03,0x6d,0xbe,0x70, + 0x60,0x63,0xbf,0x33, 0x27,0x89,0x53,0xa8, 0x4b,0xa4,0xa3,0x48, 0x20,0x04,0x6b,0xda, + 0x8c,0xc2,0x48,0x51, 0x7b,0x7b,0x81,0xc6, 0x37,0xad,0xa2,0x72, 0x33,0x98,0xac,0x8f, + 0xd8,0x23,0x61,0xf0, 0x5a,0x67,0xeb,0xe4, 0xfe,0x7a,0x26,0xbd, 0xba,0x14,0x48,0xf0, + 0x28,0x4c,0x36,0xbe, 0x43,0xc6,0x0a,0x03, 0xe6,0xb1,0x0f,0x8f, 0xee,0xec,0x7a,0x69, + 0xfb,0xff,0x7c,0xed, 0x4d,0x06,0xfb,0xf9, 0x0f,0xe2,0x59,0xbe, 0xcc,0xdd,0xa9,0x82, + 0xb4,0x91,0x49,0x61, 0xc7,0x4c,0x6e,0xd5, 0xc6,0x5f,0x18,0xbd, 0x6f,0x9a,0x5d,0xec, + 0x87,0xf1,0x7c,0x1d, 0xd6,0xf5,0xc0,0x1e, 0x25,0x5a,0x38,0x54, 0x8c,0x5d,0xa1,0x24, + 0x9b,0x4f,0x56,0xd4, 0x10,0x40,0xa1,0xa6, 0xdc,0x88,0x6b,0x09, 0xd3,0x38,0x41,0x09, + 0xce,0x10,0xbe,0x88, 0x81,0x78,0x41,0x09, 0xfd,0x80,0x21,0x0c, 0xad,0x80,0x9b,0xf4, + 0x1a,0x42,0xe4,0x31, 0x97,0xa1,0xa7,0x73, 0x52,0xea,0x44,0x86, 0xcc,0x3f,0xe7,0xf8, + 0x86,0x00,0xe9,0x1b, 0x28,0x75,0x61,0xd9, 0x78,0xc7,0xd1,0xe4, 0x1f,0x47,0xda,0x78, + 0x18,0x72,0x4a,0xc9, 0x5d,0x37,0xb2,0x67, 0x27,0x18,0x79,0x50, 0x1a,0x01,0xa0,0x47, + 0x26,0xbe,0xb3,0x2d, 0xb2,0x92,0xfc,0x07, 0x4a,0x3b,0x92,0xb6, 0x8b,0x10,0xfe,0xd5, + 0xa8,0xdf,0x49,0xea, 0x55,0x83,0x6d,0xdf, 0x5a,0xeb,0xb0,0xe9, 0x8d,0x87,0xa7,0x69, + 0x2d,0x66,0xe0,0x84, 0x81,0x01,0x67,0x65, 0x10,0x30,0x4e,0x7f, 0xb7,0xba,0xfd,0x3b, + 0xda,0x50,0x90,0xae, 0x34,0x97,0xf2,0x7c, 0xb7,0x47,0x37,0xb5, 0xfa,0x5f,0x6e,0x8a, + 0x16,0x9e,0x3b,0xc9, 0x43,0x67,0x75,0xf8, 0x31,0xb5,0xbd,0x79, 0xb8,0x2e,0xa1,0x25, + 0x61,0x89,0x50,0xd7, 0xd7,0x62,0x41,0xf5, 0x0c,0x11,0x28,0x64, 0x44,0x2f,0xaa,0x91, + 0xb0,0x75,0xf4,0x5a, 0x58,0x2b,0x04,0x04, 0xf8,0xb0,0x31,0xe2, 0x63,0x1f,0x5f,0xe2, + 0x61,0x31,0xb2,0xf9, 0xdb,0xca,0x70,0xd0, 0x85,0xbd,0x43,0xa1, 0xf4,0x20,0x23,0x23, + 0xb6,0x77,0x65,0xba, 0x74,0xe6,0xf5,0xac, 0x1c,0x05,0x48,0x7e, 0xb3,0x07,0x0b,0x9c, + 0x0e,0xce,0xb3,0x53, 0xdb,0x98,0xb8,0x5b, 0x81,0xd6,0x40,0x3c, 0xf5,0xa0,0x48,0x57, + 0x67,0x8d,0xf2,0xa1, 0xda,0xf7,0xd9,0x74, 0xaa,0x4b,0x50,0xad, 0x95,0xbb,0x6f,0xae, + 0xea,0xf8,0x93,0xbf, 0xaf,0xc0,0xea,0x1b, 0x90,0x12,0x59,0x20, 0x27,0x0f,0xd8,0x3b, + 0x7e,0xfd,0xc1,0x5c, 0xe4,0x70,0xdd,0x4f, 0x7a,0x85,0x12,0x3b, 0xd6,0xfe,0xdc,0xf9, + 0x95,0xf9,0x08,0x40, 0x0b,0x02,0x0d,0x56, 0xc8,0xad,0x18,0xcc, 0x7c,0x95,0xda,0x61, + 0xdd,0xdb,0x79,0x1f, 0x3a,0xa7,0x91,0x61, 0xc8,0x6a,0x7b,0x53, 0xf1,0xf9,0x54,0x20, + 0x0a,0xff,0x37,0x21, 0x1f,0x9c,0x45,0xd2, 0x0a,0x41,0xf2,0x28, 0xab,0xfa,0x9d,0xc9, + 0xf0,0xaa,0xb8,0x04, 0x3c,0x35,0x1d,0x53, 0xae,0x31,0x3a,0x95, 0xbe,0x2d,0xcd,0x68, + 0x30,0xcc,0xb8,0x20, 0xc6,0x19,0xaf,0xa0, 0xa1,0x3b,0x03,0x67, 0xa3,0x85,0x7f,0xcb, + 0x36,0x13,0x69,0xb5, 0x0d,0xe5,0x71,0x55, 0x1c,0xb9,0x36,0xba, 0x77,0x27,0x86,0xca, + 0xc6,0x9e,0x4c,0x94, 0xe4,0x50,0xd1,0xb1, 0xa9,0xe8,0x2c,0x3f, 0x04,0x0e,0x0d,0xbd, + 0x4b,0x70,0x90,0x2d, 0x48,0x36,0x5f,0x52, 0x8b,0xf0,0x7b,0x07, 0xe3,0xfa,0x27,0x4d, + 0x6e,0xeb,0x36,0xce, 0x89,0xc1,0xa6,0x25, 0xa8,0xb0,0x2f,0x2e, 0x53,0xad,0xa1,0x33, + 0x4a,0xb7,0x7b,0x3d, 0xd2,0x82,0x9f,0x4f, 0x88,0xda,0xb7,0xb0, 0x55,0x26,0x82,0x85, + 0xc4,0x74,0xf9,0xb3, 0x81,0xeb,0x79,0xba, 0x5c,0x6e,0xbd,0xcd, 0x2d,0xcf,0xf7,0x8f, + 0xae,0xc8,0x9a,0x04, 0x6b,0x6c,0x44,0x5a, 0x99,0xc3,0xc6,0x78, 0x10,0xec,0xc0,0xd4, + 0x5a,0xee,0xd9,0x79, 0x94,0x7a,0x8a,0x9f, 0xa5,0x5d,0xae,0xb6, 0x55,0x1b,0x2c,0x64, + 0xd3,0x80,0xcd,0xfb, 0xc5,0x29,0xc0,0xbe, 0xf5,0x70,0x22,0xd6, 0xe4,0xcb,0x83,0x8f, + 0x55,0xa8,0xb9,0x93, 0x3e,0x7f,0x47,0x8d, 0xef,0x6d,0x3c,0xcb, 0xa5,0xca,0xe2,0x1b, + 0xf4,0xa6,0xcc,0x8d, 0x09,0xbc,0xa8,0x93, 0xac,0x43,0x6b,0x0e, 0x15,0xc6,0x65,0x3e, + 0xcd,0xca,0x14,0x16, 0xd2,0x50,0x57,0x7b, 0xdf,0x41,0xee,0x7f, 0x88,0x5e,0x81,0x83, + 0xf4,0x27,0xc1,0xe4, 0x62,0x6f,0xe0,0x96, 0x2a,0x0f,0x47,0x79, 0x35,0xe7,0x5f,0x75, + 0xd9,0xb7,0x77,0x38, 0x1a,0x7d,0xed,0xa3, 0xf1,0x3e,0xe0,0x52, 0xa8,0xb4,0xbf,0xb2, + 0xa4,0xb4,0x6c,0xe5, 0x34,0x88,0xed,0xeb, 0xba,0x8f,0x37,0x2b, 0x7d,0xeb,0x30,0x86, + 0x54,0x19,0x9d,0x95, 0x27,0x6e,0x83,0xe9, 0x2f,0x30,0x31,0x93, 0x18,0x98,0x8f,0xa5, + 0xda,0xd9,0x8a,0x53, 0x37,0x65,0xc3,0x98, 0xac,0x90,0xd0,0x61, 0x8a,0xa3,0x18,0xd8, + 0x5f,0x1a,0x01,0x25, 0xe4,0x67,0x20,0x70, 0x8c,0x3c,0x3c,0x0b, 0x7e,0x1a,0xf6,0xc3, + 0x16,0x54,0x95,0x85, 0xe5,0x35,0xe1,0x26, 0x1b,0xb2,0x33,0xb8, 0xad,0x6f,0xf1,0x94, + 0x99,0x1b,0xf9,0x14, 0x7c,0x15,0x5d,0x30, 0x74,0x95,0x5c,0x1d, 0x27,0x6d,0xc0,0x96, + 0x2f,0x57,0xfa,0xc4, 0xd2,0x86,0x97,0x17, 0x93,0x6b,0x8a,0xc0, 0xab,0x55,0x9c,0x82, + 0xe6,0xc2,0xcd,0xec, 0xd3,0x73,0x77,0x19, 0x7d,0xe1,0x1c,0x66, 0xdf,0x8d,0x9e,0x86, + 0xfc,0xb2,0x6d,0xe0, 0xd1,0xa1,0xa2,0x02, 0x81,0xb7,0xc9,0x8e, 0x22,0x0c,0x29,0x10, + 0x26,0xde,0xe3,0x47, 0x08,0x92,0x5e,0xb5, 0x97,0xbf,0xe7,0x0a, 0xbf,0xd2,0xc6,0x92, + 0x1e,0x2d,0xe9,0x57, 0x4b,0x8c,0xf9,0x50, 0x01,0x8e,0xd0,0x7d, 0xbc,0x2f,0x3f,0xda, + 0xc6,0xb3,0xaa,0xe1, 0xfe,0x79,0xcf,0xac, 0x14,0xa8,0xf9,0x67, 0x94,0x93,0x5a,0xb6, + 0x99,0x0a,0x3f,0x9b, 0xd0,0xa6,0x35,0x65, 0xae,0x83,0x5e,0x12, 0x56,0x4f,0x08,0x1c, + 0x56,0xec,0x86,0x93, 0xc3,0xad,0x54,0x7f, 0xbe,0x37,0x72,0xa7, 0xc8,0xe6,0xfa,0xfe, + 0x2c,0x5c,0x4f,0x32, 0xfb,0xf8,0x85,0xf3, 0x7c,0xdf,0x66,0x7f, 0x27,0x98,0xfa,0x78, + 0x48,0x8a,0x08,0xd7, 0x77,0x6d,0x87,0xc8, 0x37,0xd2,0x5c,0xc8, 0xa1,0x3d,0x14,0xe0, + 0x6e,0x64,0x3e,0x00, 0xec,0x14,0xba,0x44, 0x97,0x37,0x74,0x05, 0xf4,0x88,0xe6,0xad, + 0xaf,0xc1,0x9f,0x8f, 0xd1,0xe3,0x5d,0xc7, 0x89,0xe8,0xf5,0xd7, 0x76,0xec,0xda,0x58, + 0xeb,0x6b,0x8f,0xc9, 0x08,0xd2,0x52,0x28, 0x56,0x07,0xb7,0x9b, 0xc8,0x9a,0xf5,0xcb, + 0x0a,0xaa,0xf6,0xed, 0x2a,0x41,0x80,0x7e, 0xd1,0xd2,0x9a,0xad, 0xd1,0xf6,0x9e,0x8f, + 0x3e,0x88,0xdc,0xbd, 0xb4,0x6c,0x7d,0xe9, 0x81,0xe7,0x59,0x25, 0x22,0x2c,0x99,0x12, + 0x62,0x86,0x78,0x9a, 0xc0,0x8b,0x99,0x08, 0x56,0x02,0xaa,0xc1, 0xb3,0x50,0x3d,0x32, + 0x14,0x34,0x78,0xf4, 0x88,0x66,0x77,0x2c, 0xe1,0xcf,0xd5,0x3b, 0xf2,0x6a,0x6f,0x05, + 0x7b,0x09,0x83,0x72, 0xa1,0x86,0xac,0x56, 0xd6,0xee,0x2b,0x22, 0xe4,0xfb,0x78,0xae, + 0x2b,0x3e,0x6f,0x9e, 0x7c,0xd6,0xcc,0x64, 0x6c,0x50,0x24,0x4a, 0x00,0x07,0xb1,0xc8, + 0x22,0x33,0x18,0xa9, 0x06,0xd7,0x87,0x49, 0xdf,0x66,0xc0,0x2a, 0xf9,0x55,0xbf,0x0f, + 0x2f,0xd8,0xb9,0x68, 0xa3,0xc9,0x3b,0x6c, 0x2a,0xcd,0xb0,0x3d, 0x30,0x81,0xdb,0xf5, + 0x54,0xb7,0x6e,0xdf, 0x06,0x52,0xf9,0xd3, 0x26,0x54,0x7a,0x57, 0x0f,0xcb,0xdf,0xfa, + 0xec,0xa4,0xd9,0xf6, 0x21,0x43,0xd3,0x06, 0x22,0x44,0x3c,0x51, 0x1a,0xc1,0x04,0x13, + 0xdc,0x50,0x24,0x8d, 0x64,0x00,0xab,0x64, 0x42,0x6c,0x7b,0xbe, 0xd7,0x33,0xe5,0x67, + 0x97,0x0b,0xba,0x9a, 0x91,0xc8,0x29,0xa1, 0x86,0xa6,0x97,0xcc, 0xfe,0xa8,0xa8,0x59, + 0x8f,0x92,0xef,0x68, 0xe3,0xcb,0xdf,0x28, 0xdf,0x35,0x0a,0x64, 0x53,0x4a,0x1d,0xe3, + 0x49,0x2d,0xe4,0x93, 0x5f,0xcc,0x4f,0x5c, 0x59,0xb8,0xb0,0x5a, 0xe1,0x22,0x49,0x29, + 0x00,0x84,0x1f,0x75, 0xc7,0x5c,0xd3,0x51, 0x20,0x3a,0xd1,0x90, 0xa0,0x01,0x45,0x91, + 0x26,0x42,0x10,0x90, 0x40,0x40,0x80,0x49, 0xb1,0xb1,0xa6,0x31, 0xb6,0x5f,0x0b,0x9e, + 0x77,0x81,0xf5,0x71, 0xfa,0xee,0x2e,0x82, 0xce,0x88,0xea,0x72, 0x3d,0x4c,0x89,0xd2, + 0xaf,0x22,0xf6,0x19, 0x86,0x1a,0x3b,0x23, 0xcc,0x7c,0xea,0xc7, 0x5c,0xa0,0x20,0x21, + 0x02,0x80,0x8a,0x9b, 0x48,0xb9,0x09,0xe0, 0xa9,0xc9,0x39,0xb6, 0x0e,0x60,0x90,0x40, + 0x02,0x80,0x50,0x22, 0x01,0x40,0x24,0x82, 0x20,0x12,0x40,0x92, 0x40,0x90,0x44,0x00, + 0x81,0xb4,0x03,0x69, 0x30,0x69,0xb4,0x3b, 0x3f,0x87,0x18,0x2e, 0x6d,0xa0,0x9c,0xba, + 0x9b,0x56,0x89,0x7d, 0x07,0x43,0xaa,0x78, 0x05,0x91,0x59,0x63, 0x42,0x6d,0xb4,0xd3, + 0x4d,0xa1,0xdd,0xba, 0x97,0xb4,0x78,0x0e, 0xd2,0x1d,0x75,0xd4, 0xbf,0xe2,0xdc,0x56, + 0xa0,0x9e,0x7f,0x04, 0xf6,0x0e,0xe3,0x57, 0xa3,0xff,0x8d,0x63, 0x7a,0x95,0xa0,0x78, + 0x38,0x31,0xeb,0x09, 0xa8,0x06,0x34,0x86, 0xc2,0x64,0xe1,0x20, 0x93,0x63,0xef,0x9e, + 0xd7,0xde,0x59,0xd2, 0x05,0x25,0x79,0x3a, 0x5f,0x01,0xc7,0x83, 0x9e,0x97,0xbe,0xe5, + 0x45,0x0f,0x8a,0x11, 0xb3,0xa0,0x35,0x18, 0x74,0x13,0x09,0x40, 0x22,0xb1,0x32,0x05, + 0x34,0x63,0x90,0x8e, 0xa2,0x48,0x90,0x64, 0x59,0xf1,0x8d,0x5b, 0x21,0x20,0x06,0xf2, + 0x8e,0x4a,0xa9,0x18, 0x03,0x66,0xe0,0x17, 0x91,0x3b,0x56,0xb7, 0xd8,0xe9,0x31,0x16, + 0x85,0x1c,0xe9,0x49, 0xe4,0x70,0xde,0x21, 0x57,0xad,0x2d,0xc8, 0x3d,0x27,0x60,0x10, + 0x90,0x88,0x18,0xd8, 0x92,0x6c,0x12,0x18, 0x36,0x33,0xcb,0x62, 0x23,0xc7,0x50,0x25, + 0x0c,0x4d,0x93,0x94, 0xd8,0x2a,0x7b,0x7d, 0x6d,0x0c,0x9c,0xa9, 0x77,0x13,0x11,0x9f, + 0xa4,0xd2,0xae,0xa6, 0x4c,0x42,0xa5,0x1b, 0x11,0xf8,0x6d,0xd4, 0x11,0x6b,0xc1,0xd1, + 0xfc,0xca,0xbc,0x30, 0x37,0xba,0x80,0x77, 0x22,0xe2,0x16,0x5e, 0x21,0x0b,0x6c,0x26, + 0x88,0xec,0x50,0xf7, 0x3e,0x34,0xdc,0xa7, 0x39,0x08,0x94,0x9b, 0x94,0x98,0x21,0x02, + 0x93,0x49,0x34,0xe3, 0x4d,0x02,0x4b,0x59, 0x0c,0xee,0xf4,0x9d, 0xf0,0x22,0x5f,0xc0, + 0x41,0x53,0xc4,0x78, 0xb7,0x7c,0x18,0xda, 0x4a,0xb8,0xb2,0x77, 0x4d,0xee,0x5d,0x5a, + 0xf6,0x3b,0x1e,0x87, 0x4f,0x87,0x25,0xb9, 0xe1,0xd1,0xec,0xa4, 0xdc,0xe3,0xa8,0xc4, + 0xc6,0xdb,0x37,0xc3, 0x3c,0x3f,0x11,0x9f, 0xe3,0xbc,0xdf,0x65, 0x5a,0xf3,0xf6,0xb1, + 0xe4,0xed,0x8c,0x8a, 0x3c,0xc9,0x73,0x5f, 0xa7,0x2f,0xa0,0xc5, 0x63,0x7c,0x32,0x11, + 0xcd,0x52,0xad,0x3a, 0x14,0xd8,0x33,0x13, 0x3e,0x3c,0xe7,0xf4, 0x22,0x8a,0x65,0x08, + 0x57,0x24,0x42,0x3b, 0x60,0xc0,0xa1,0xf8, 0xbb,0x60,0x96,0xdd, 0x5e,0x53,0xd9,0x00, + 0x1b,0xbc,0x64,0xb9, 0x3d,0xca,0x62,0x2c, 0xdd,0x58,0x2b,0x16, 0x32,0x33,0xd9,0x8b, + 0xd9,0x69,0x1f,0xbc, 0x7a,0x3e,0x42,0x3f, 0x44,0xba,0x0e,0xc7, 0xb7,0xb9,0x73,0x24, + 0xbd,0x99,0x8e,0x88, 0x4b,0x43,0xba,0x6d, 0x01,0x92,0xd4,0x9a, 0xee,0x5c,0x34,0x9b, + 0xc8,0x1a,0xa0,0x10, 0x25,0x36,0xda,0x69, 0xc1,0x20,0x60,0xe0, 0x7e,0x24,0x93,0x96, + 0x5d,0x5e,0x71,0x0a, 0x5e,0xb0,0x50,0xaa, 0x44,0x24,0x93,0xa0, 0x85,0x0d,0x02,0x06, + 0x2f,0x13,0x61,0xd6, 0xc9,0x1f,0x1b,0xdd, 0xf4,0xf7,0x7f,0xf3, 0xae,0x8b,0x00,0x2b, + 0xe9,0x56,0x86,0x6b, 0xf0,0xf0,0x4e,0x67, 0x01,0x08,0x18,0x0c, 0x4d,0xb0,0x6c,0x43, + 0x04,0x93,0x94,0x43, 0x04,0xd3,0x04,0x86, 0x90,0x99,0x00,0x0c, 0x66,0x25,0x40,0x07, + 0x22,0xa2,0xc8,0xf9, 0x08,0xfd,0x9b,0x40, 0xa7,0xd9,0x64,0x71, 0xcc,0xd9,0x9b,0xa7, + 0x12,0xdd,0x48,0x7b, 0xbf,0x0f,0x44,0xeb, 0x2f,0x7d,0xc8,0x33, 0xe3,0xaa,0xf5,0x64, + 0xd5,0x3b,0x92,0xec, 0xae,0x81,0x24,0x72, 0xcc,0xb3,0x13,0x9d, 0xa6,0xe6,0xd5,0x7c, + 0xfd,0xd7,0x57,0x5b, 0x4b,0xdb,0xa1,0x38, 0xb9,0x18,0x8e,0x74, 0x14,0x2c,0x31,0x87, + 0xbc,0x2c,0x25,0x2f, 0xb0,0xf7,0xcb,0x62, 0x2b,0x97,0xf7,0xc7, 0xc3,0x71,0x38,0x7d, + 0xfe,0xe2,0x7c,0x7e, 0xaf,0x4f,0xc0,0xf1, 0xe1,0x5a,0x20,0xf6, 0x2c,0xe1,0x80,0x47, + 0xaf,0x54,0x8d,0x2f, 0xd5,0xfe,0x7d,0x1e, 0x7d,0xcb,0x0c,0xae, 0x31,0xf4,0x7a,0xd7, + 0xa8,0x6f,0xa1,0xd2, 0xec,0xc1,0x10,0x1f, 0x6a,0xe1,0x7c,0x4d, 0x3e,0xce,0x18,0x7a, + 0xd2,0xe0,0xce,0x4e, 0x7b,0x63,0x69,0x45, 0xed,0x9f,0xbe,0x4a, 0xb7,0x9c,0xa7,0x2a, + 0xcf,0x02,0x35,0x60, 0xae,0x50,0xd9,0x28, 0xfd,0x21,0xc1,0xa6, 0xf2,0x89,0x1a,0xcf, + 0x43,0xa3,0x32,0xa1, 0x66,0x3f,0x2a,0xa8, 0xcd,0x03,0xd2,0xec, 0xdb,0x39,0xcb,0x85, + 0x76,0x4c,0x34,0x0a, 0x55,0x86,0x3d,0xe1, 0x2a,0xc9,0xc0,0xdf, 0x59,0xe7,0x76,0x97, + 0x08,0xbc,0x10,0x79, 0x00,0xcb,0x53,0x11, 0x19,0x60,0x67,0x19, 0x2f,0x3c,0xba,0x0c, + 0x27,0x4e,0x7f,0x77, 0xb0,0xb5,0x2c,0xbb, 0x12,0x2b,0xa3,0x2a, 0x87,0x90,0xda,0x67, + 0xb2,0x55,0x13,0x73, 0x0b,0x38,0x61,0xde, 0xb2,0x5e,0x07,0x5f, 0xc9,0xbd,0xa6,0xfe, + 0x78,0xbb,0x96,0x33, 0x70,0x3d,0x8b,0xb1, 0xf5,0x5d,0x39,0x71, 0xb2,0xcb,0x68,0xeb, + 0xb0,0xb8,0x6e,0x87, 0x1b,0x8b,0x33,0xc6, 0xd5,0x7e,0x0d,0xe1, 0xf7,0x38,0xea,0x3a, + 0x9e,0x2d,0x74,0x2e, 0xbb,0xc3,0xfb,0xfb, 0x91,0x7d,0x8b,0x60, 0x52,0x80,0xb0,0xc6, + 0x66,0xa1,0xba,0x4a, 0x04,0x19,0xfb,0xb8, 0x2e,0xb0,0x40,0xb3, 0xb5,0x8a,0xaa,0x9f, + 0x81,0x2f,0xee,0x5e, 0xfe,0x6e,0x47,0xab, 0xf8,0xec,0x6e,0x09, 0xdb,0xe2,0xb8,0xc1, + 0xca,0xf4,0x99,0x21, 0x95,0x8d,0x72,0xa2, 0xb7,0x2a,0x54,0xf8, 0x12,0xf0,0x67,0xf8, + 0x59,0x4d,0xdb,0x6c, 0x06,0x2f,0x98,0xb7, 0x44,0x9d,0xc2,0x51, 0x42,0x72,0xd2,0x52, + 0xa9,0x20,0x84,0xa3, 0x36,0x59,0x4f,0x1c, 0x6e,0x94,0x19,0xdc, 0x86,0x39,0xcc,0x03, + 0x7f,0xe5,0x65,0xe1, 0xee,0x77,0x3f,0x63, 0x97,0x78,0x78,0x29, 0x6e,0xfb,0xed,0x6b, + 0x9d,0x07,0x2b,0xf9, 0x4b,0xdb,0xbd,0xaf, 0xa3,0x96,0x21,0xa5, 0x62,0x58,0xa9,0xb0, + 0xe1,0x1b,0xd1,0xf2, 0x37,0x0b,0x30,0xfd, 0xa2,0x2c,0x3c,0xda, 0x58,0xdf,0xd9,0x8b, + 0x6f,0x23,0x17,0xb2, 0x7a,0xd6,0xab,0x79, 0x1c,0x4e,0x27,0x87, 0xf2,0x65,0x26,0x07, + 0xbc,0x55,0xbc,0x3e, 0x83,0x5b,0xfa,0x37, 0xfd,0x23,0x84,0x9e, 0xc8,0x91,0xd6,0x74, + 0x83,0xdf,0xfe,0xbe, 0x3c,0xf8,0x24,0xc6, 0xa6,0x5f,0x95,0x0c, 0xa6,0xd0,0xde,0x5b, + 0xcb,0x9f,0x5d,0x6e, 0x1e,0xec,0xd8,0x71, 0xbb,0xdf,0x2d,0xaf, 0xb2,0xd9,0xd0,0xe1, + 0xbd,0x4f,0x95,0x96, 0xfd,0x0a,0x54,0xd2, 0xe6,0x63,0x21,0xbf, 0x03,0x90,0x24,0x81, + 0xe8,0x17,0x1c,0xd3, 0x80,0xaa,0xa7,0xe3, 0x78,0x45,0x80,0xf3, 0x55,0x81,0x0e,0xfd, + 0x8f,0xa4,0xca,0x6c, 0xc6,0xa4,0xd9,0xe3, 0xcc,0x4d,0x00,0x4d, 0x9b,0x90,0x5e,0x6e, + 0xb6,0xc2,0x22,0x51, 0x83,0x7e,0x44,0xf2, 0x35,0xda,0x7e,0x03, 0xca,0x2f,0xd9,0xfd, + 0xbb,0x6b,0xa0,0x1c, 0x74,0xed,0x0a,0xe8, 0xd3,0x6d,0x8d,0x80, 0x08,0x00,0x81,0x08, + 0x42,0x44,0xe2,0xd7, 0x77,0x93,0xc1,0xbc, 0x8b,0x5c,0x3e,0xfa, 0xda,0x5c,0xd5,0xd5, + 0xbe,0x37,0x84,0xfc, 0xde,0xa6,0xf3,0x63, 0xbe,0xc3,0xdf,0xe0, 0xbf,0x60,0x04,0x60, + 0x77,0x52,0x41,0x35, 0xf7,0xa9,0xd9,0x5a, 0xd1,0xf8,0xda,0xde, 0x26,0x77,0xc0,0xfe, + 0x48,0xd4,0x6d,0xb2, 0xcd,0x08,0x9a,0x9a, 0x0e,0x29,0x02,0xf1, 0x3a,0x75,0x35,0xba, + 0xef,0x3f,0x70,0xc9, 0x72,0x26,0x72,0xbd, 0xae,0x53,0x59,0xcd, 0xf4,0x3c,0xe7,0x4d, + 0xc5,0xea,0x31,0x2a, 0xda,0x61,0x5f,0x76, 0xfc,0x5a,0xe8,0x2d, 0x6a,0x7b,0x09,0xde, + 0x9b,0x4f,0x2f,0x9f, 0x88,0x4b,0x6c,0x02, 0x0d,0x50,0xd6,0xe9, 0x83,0x81,0x33,0x5b, + 0x18,0x13,0xc1,0xda, 0x47,0xe3,0xb3,0xcd, 0xee,0x8d,0x92,0x3d, 0xff,0x97,0x20,0x24, + 0x0f,0xc4,0x81,0x43, 0x4c,0x13,0x1a,0x7e, 0x7c,0x47,0xd0,0x8a, 0x29,0x1b,0x9e,0x29, + 0x29,0xcd,0x0e,0x4d, 0xb9,0x55,0x54,0xe6, 0x84,0x02,0xa3,0x54, 0x93,0xdd,0xf2,0x7c, + 0x34,0xe6,0xad,0x75, 0x7c,0x6f,0x43,0xda, 0xfe,0x97,0xda,0x69, 0x3a,0x7b,0xc5,0x80, + 0xef,0x40,0xd6,0xfa, 0x9e,0x94,0xec,0x11, 0xe6,0xe3,0x65,0x24, 0x6f,0xba,0x29,0xd4, + 0x7b,0x56,0x0d,0xf4, 0x78,0xf3,0x87,0x34, 0x0a,0x5c,0x87,0x06, 0xa7,0x00,0x76,0x83, + 0x02,0xf8,0xc4,0x62, 0x05,0xa0,0xa2,0x84, 0x0c,0xc0,0xf0,0x68, 0xe8,0x22,0xfd,0xed, + 0xdc,0x4d,0x0b,0x30, 0x40,0x88,0x33,0xdf, 0xdd,0x38,0x9b,0x76, 0x16,0x5b,0x63,0xcc, + 0xbc,0x55,0x4c,0x41, 0xc1,0xad,0x51,0x8c, 0x51,0x30,0x34,0xd4, 0xa9,0x90,0x60,0x43, + 0x84,0x85,0x93,0x68, 0x95,0x12,0x84,0x60, 0xc3,0xb7,0x55,0x4a, 0x4d,0xe0,0x12,0xef, + 0x41,0x0b,0xb8,0xdb, 0x8d,0x8e,0xcd,0xff, 0xe7,0xc8,0xf0,0x7c, 0x7c,0x53,0xf7,0x4e, + 0x87,0x50,0xe1,0xe8, 0xac,0x36,0xbb,0xcf, 0x46,0x13,0x24,0xfa, 0x19,0x28,0x99,0x1a, + 0x44,0x5a,0xf1,0xf0, 0x29,0xd4,0x40,0x00, 0x7d,0xec,0x54,0xc6, 0x04,0x05,0x0e,0xe4, + 0x96,0xa2,0x02,0xbf, 0x5b,0x21,0x96,0x1b, 0x58,0xad,0x6b,0x2c, 0xbd,0xbf,0x73,0xd7, + 0x16,0xb2,0x4e,0x7c, 0xae,0xce,0x22,0x6c, 0x94,0x39,0xaa,0xa7, 0xdf,0xd7,0xf8,0x57, + 0x6c,0x63,0x0d,0x03, 0xf6,0xcf,0x28,0x53, 0xbd,0x89,0xf4,0xb7, 0x5c,0x8b,0xa9,0x8d, + 0xcb,0x44,0xf4,0xc4, 0x32,0xeb,0xcd,0xed, 0xfe,0x1e,0x25,0x86, 0xa7,0x80,0xc3,0xb9, + 0x1c,0x8a,0x43,0x8d, 0x77,0x03,0x71,0x2e, 0xe5,0x6a,0x83,0x28, 0xe1,0xf1,0xe5,0xe5, + 0xca,0x05,0xfc,0x10, 0x13,0xa6,0x53,0x64, 0xc9,0x75,0x83,0x5f, 0x2c,0x1d,0xb3,0x4a, + 0xd2,0xa6,0xb0,0xc0, 0xfd,0x0b,0xd8,0x9d, 0x5e,0xa2,0x6b,0xb3, 0x66,0x89,0xa3,0xc0, + 0xf0,0x34,0xfa,0xa7, 0x85,0xcd,0x53,0xd9, 0x4b,0xf2,0xf7,0x51, 0xf6,0x77,0x14,0xa3, + 0x4a,0xf1,0x1f,0x9b, 0xb0,0xf4,0x48,0xe8, 0xcb,0x39,0xb7,0xd1, 0x18,0xe7,0x67,0xdf, + 0x35,0x95,0xd2,0xb8, 0xea,0x32,0x3b,0x0c, 0xef,0x09,0xdf,0xdf, 0xee,0x2c,0x7b,0x6f, + 0x25,0xe6,0x4e,0x95, 0x17,0xbb,0x97,0xd2, 0x14,0x82,0x17,0x53, 0xba,0x6b,0x3c,0x2c, + 0x98,0xb3,0xe2,0xfd, 0x45,0x69,0x49,0xca, 0x44,0x38,0x5c,0x2c, 0xf5,0xb2,0x8d,0x31, + 0x86,0x45,0x75,0xb0, 0x20,0xcb,0x73,0x78, 0x1e,0x9b,0xaa,0xbd, 0xc9,0xdc,0xe9,0x06, + 0xdb,0x2c,0x59,0x0d, 0x45,0x6e,0x27,0xaf, 0x2b,0x88,0xd2,0x39, 0x61,0xa3,0x23,0xd5, + 0xe8,0x55,0x54,0x3e, 0xf3,0x71,0x7d,0x67, 0xee,0x89,0x56,0x2c, 0x7b,0x29,0x55,0x24, + 0xfe,0xc3,0x7e,0xf2, 0x6f,0x80,0xb0,0x15, 0xe6,0x0f,0x65,0xcb, 0x2f,0x5b,0xb8,0xd5, + 0x63,0x00,0x36,0xa4, 0x40,0x4f,0xda,0xd5, 0x3a,0xa0,0xd1,0x0a, 0xae,0x89,0xb5,0x14, + 0x4d,0x8f,0xb6,0xb0, 0x4d,0x1c,0x9e,0x4a, 0x96,0x07,0xa3,0xb5, 0xcb,0xd3,0x62,0xb9, + 0x7c,0x79,0x17,0xf7, 0xb3,0x7c,0x2a,0x6d, 0x18,0x44,0xd6,0x96, 0x8a,0x07,0x43,0x40, + 0x3b,0xc6,0x08,0x3e, 0xfb,0x01,0x67,0x56, 0xe9,0x7c,0xbd,0x44, 0x7e,0xc7,0xaf,0x65, + 0x9b,0x9e,0x05,0xc6, 0x16,0xc0,0xa9,0x2e, 0x9a,0xf9,0x5d,0xfb, 0xde,0x6e,0xd6,0xc2, + 0x86,0xa1,0xa3,0x76, 0xdc,0xcc,0x74,0x6a, 0x08,0x23,0x83,0xbe, 0x1e,0x8d,0x90,0x45, + 0x2f,0x39,0x06,0x4c, 0xcf,0xc4,0x75,0xb4, 0x8e,0x44,0x73,0x7c, 0xa6,0xc3,0x8c,0xdd, + 0x2b,0xa0,0x5c,0xb5, 0xee,0xe7,0x83,0xbc, 0x8e,0x3d,0x55,0x17, 0x9a,0x35,0x94,0x45, + 0x2d,0xe2,0x83,0x65, 0xb3,0xfd,0xed,0xee, 0x18,0x2f,0x73,0x29, 0x09,0x0d,0x0e,0x86, + 0xe6,0x0c,0xae,0xbd, 0x66,0xaa,0x79,0x98, 0x51,0xfa,0x6e,0x07, 0xdd,0x4c,0x6d,0x58, + 0xc8,0x39,0xea,0x06, 0xfc,0xa6,0xd6,0xf9, 0x0c,0x2d,0x80,0x9f, 0x0c,0x08,0xd4,0x00, + 0x44,0x2a,0x0c,0xda, 0x22,0x1f,0xc8,0xcb, 0x7b,0x97,0xc3,0xd2, 0x92,0xdb,0xd5,0x62, + 0x5a,0x63,0x8c,0xb1, 0x3f,0xe5,0x37,0xd3, 0xda,0xda,0x29,0x65, 0x21,0x2a,0x56,0xdb, + 0x7a,0xb0,0x19,0xbe, 0xb5,0x0b,0x95,0xd9, 0xe7,0x3a,0x4a,0x3b, 0xc3,0x1a,0xdd,0x0a, + 0x11,0xb9,0xc7,0xc6, 0x46,0xb9,0xa6,0x91, 0x93,0x0f,0xe3,0xf0, 0x2c,0xfe,0x6d,0xff, + 0xc9,0xf8,0x30,0xd0, 0x3c,0x37,0xdb,0xb8, 0x27,0xf9,0xe5,0x27, 0x57,0x27,0xa9,0xa7, + 0x64,0x6a,0x7d,0xa4, 0xb9,0x99,0x88,0xaf, 0x19,0x01,0x2b,0x2e, 0x78,0xf3,0xe4,0x26, + 0xee,0x5b,0xac,0x09, 0x20,0x6f,0xbf,0xa6, 0xd3,0xc5,0xd6,0x39, 0x19,0x5d,0xe5,0xcb, + 0x25,0x0c,0x85,0x2b, 0xba,0x45,0xab,0x19, 0xad,0xf4,0xcd,0xa2, 0xb4,0xc3,0x43,0x14, + 0x0d,0x76,0x84,0x13, 0x30,0x61,0xe4,0xf6, 0xa2,0xeb,0x71,0xcd, 0xb5,0x5d,0x9c,0x03, + 0xb8,0x7e,0x06,0x64, 0xb7,0x29,0xe2,0xc6, 0xcc,0xba,0xfb,0xfe, 0xe2,0x72,0x23,0x62, + 0x43,0x37,0x50,0x10, 0xd4,0xab,0x51,0x25, 0x26,0x8d,0xf5,0xce, 0x3e,0xde,0xab,0x78, + 0xec,0xfd,0x6e,0xa0, 0xb3,0xaa,0xb7,0xdb, 0x73,0xdb,0xc8,0x9f, 0x05,0xbb,0xe3,0xee, + 0xb2,0x1a,0x29,0x09, 0xcf,0x35,0x73,0x95, 0xb7,0x7a,0xa3,0x0a, 0x0b,0x06,0x9e,0xcd, + 0x22,0xde,0x86,0x57, 0xca,0xac,0x6b,0x98, 0x27,0x58,0x3c,0x9a, 0x6b,0xe5,0x0c,0x00, + 0x5b,0x22,0x39,0xc8, 0x10,0x4c,0xf1,0x82, 0xcd,0x28,0x75,0x89, 0xcb,0x71,0xdc,0xf9, + 0x99,0xf0,0x77,0xf5, 0x1a,0x6f,0x10,0x78, 0xfb,0xeb,0x06,0x08, 0xd8,0xca,0xa4,0x8b, + 0x35,0x3d,0x3d,0xbb, 0xa4,0xd4,0x62,0x94, 0xae,0x1e,0x60,0xc4, 0x83,0x3c,0xa0,0x64, + 0x37,0x10,0x44,0x32, 0x1a,0x0e,0x82,0x66, 0x8a,0xff,0xc4,0x92, 0xa1,0xfc,0x2d,0x26, + 0x4e,0xbd,0x69,0x01, 0xfc,0x4f,0x8a,0x48, 0x14,0x84,0x26,0x09, 0x34,0x33,0xe7,0x41, + 0xf3,0x9c,0x92,0x4c, 0x0a,0x5c,0x0d,0xb1, 0x8f,0xe8,0x7d,0x09, 0xc4,0x44,0x43,0xc4, + 0xa5,0x27,0x66,0x66, 0x66,0x66,0x69,0x4b, 0x42,0x20,0x82,0x09, 0x20,0xc4,0x33,0x1f, + 0xaa,0xe4,0xa8,0x6f, 0x8c,0x3e,0x37,0xcf, 0x00,0x3b,0x80,0x5c, 0x25,0xb0,0x5c,0x76, + 0xa3,0x8b,0xb7,0xdb, 0xb6,0xfb,0x37,0xf0, 0xdc,0xa2,0x4b,0x5d, 0xc3,0xa2,0xc2,0x6e, + 0xc5,0x1d,0x7d,0x9f, 0x08,0x99,0xa5,0x35, 0x0f,0x77,0x54,0x8d, 0x17,0xd0,0xe5,0xcf, + 0x22,0x4d,0x00,0x66, 0xcb,0x21,0x87,0x36, 0x57,0xc4,0xee,0xa5, 0x1c,0xe4,0xd5,0x24, + 0xb1,0xce,0x2b,0xce, 0x6a,0x7d,0xad,0x79, 0xc5,0x85,0x96,0x5a, 0x0d,0x4d,0x2e,0x90, + 0x74,0x9c,0x74,0xbd, 0x04,0x69,0xc5,0xb8, 0x6b,0xe3,0x39,0x23, 0xce,0x8a,0x59,0xf0, + 0xa6,0xb6,0x35,0xcb, 0x1b,0xf7,0x67,0xe5, 0xc6,0x2d,0xec,0x8e, 0x60,0x42,0x11,0x89, + 0x77,0x16,0x6f,0x74, 0xae,0x26,0x30,0x87, 0xa5,0x33,0x0f,0x39, 0x5c,0x75,0xb2,0x47, + 0x4e,0xcf,0x09,0xb2, 0xfb,0x09,0x94,0x03, 0xe2,0xb3,0x5e,0x05, 0xa3,0x66,0xe4,0x0e, + 0x56,0x81,0x20,0xd9, 0x04,0x6b,0x43,0x18, 0xd7,0xb9,0x39,0x56, 0xce,0x17,0x2f,0x32, + 0xe6,0x04,0xf8,0x17, 0x5b,0xfd,0xfd,0xa6, 0x81,0x93,0xc2,0x31, 0x84,0x21,0x78,0xeb, + 0x9d,0xb6,0xdb,0x2c, 0x00,0x7c,0x44,0x08, 0x64,0x90,0x22,0x27, 0x10,0x39,0x3c,0x60, + 0xd8,0x53,0x28,0xe6, 0xed,0x3e,0x4f,0x00, 0x7f,0x50,0x78,0xdf, 0x72,0xfb,0x3b,0x5b, + 0xeb,0xd3,0x81,0x2d, 0xf5,0xc9,0x17,0xdf, 0xa5,0x87,0x04,0x8c, 0xcd,0xe6,0xe5,0x61, + 0x56,0x9b,0x4b,0x58, 0x7c,0x55,0x30,0x77, 0x20,0xe1,0x70,0x36, 0x08,0x6c,0xdd,0xd2, + 0x4e,0x2c,0xd4,0x6b, 0x8f,0x8d,0x5e,0x03, 0x45,0x63,0x3f,0x26, 0xd1,0x83,0xa9,0x94, + 0x4a,0x40,0xb5,0xd8, 0x51,0xb7,0x52,0xdc, 0xc5,0x3f,0xb6,0xe1, 0x5b,0xbd,0x25,0xfd, + 0x3e,0x3d,0x5c,0x93, 0x39,0xb9,0x4e,0x1f, 0x3b,0x25,0x30,0xca, 0x0a,0x31,0x05,0xb8, + 0x34,0x7c,0x81,0xe2, 0xe5,0x78,0x14,0xbc, 0x54,0x28,0xf8,0x79, 0x2b,0x1a,0xdd,0xb9, + 0x66,0x47,0xa2,0x77, 0x52,0xbf,0x44,0x8e, 0x31,0xb9,0xb6,0xd2, 0x76,0x38,0x14,0x6c, + 0x81,0xf6,0xf3,0xb6, 0x3c,0xdf,0x72,0xaa, 0xc7,0x70,0x05,0x27, 0x08,0x71,0x31,0x07, + 0x28,0xa5,0x17,0xea, 0xf5,0x1b,0x6d,0x4f, 0xcd,0xed,0x34,0xcd, 0xc1,0xa3,0x0d,0x23, + 0xf6,0x7a,0x91,0xf9, 0xfa,0x32,0x53,0xf8, 0x2b,0x95,0x5e,0xb8, 0xe6,0xb1,0x7f,0x11, + 0x4c,0xad,0xc4,0xbf, 0x67,0xe2,0x24,0x16, 0x2b,0x11,0xc7,0xfd, 0xda,0xb3,0xbb,0xa6, + 0xac,0x31,0x9c,0x72, 0xe2,0x6c,0x83,0xf2, 0xec,0x76,0xa4,0x0f, 0x93,0xcd,0xc9,0x08, + 0x60,0xa4,0x88,0x9b, 0x9b,0x40,0x18,0x94, 0xbe,0xa1,0x1f,0x07, 0xdc,0xad,0xdc,0x23, + 0xdd,0x39,0xcd,0x9f, 0x98,0x75,0x32,0x23, 0xf0,0xd4,0x28,0x42, 0x70,0x1d,0x71,0xd0, + 0xbf,0x27,0x9a,0x8a, 0x92,0xfe,0xbe,0xc0, 0xa1,0x8b,0x71,0x80, 0x09,0xee,0x73,0x2a, + 0xa0,0xc4,0x85,0x47, 0x36,0xba,0x3a,0x6e, 0x70,0xd7,0x9c,0x68, 0x7a,0xeb,0x22,0x3d, + 0x89,0x21,0x9e,0xcb, 0xf1,0x2c,0x96,0xba, 0x23,0x68,0xbe,0x43, 0x36,0x29,0xc6,0x96, + 0xc3,0x1e,0x02,0x09, 0x5c,0xe2,0x6b,0xcf, 0x7a,0x0f,0xaa,0xb8, 0x5c,0xc2,0x55,0x7c, + 0x19,0x3c,0xdb,0x0e, 0x44,0x45,0x27,0xbd, 0xaf,0x28,0x06,0x48, 0xe9,0x9a,0xc7,0x1c, + 0x1e,0x2d,0x37,0xce, 0x18,0x53,0x51,0x42, 0x67,0x51,0xc3,0xb0, 0xd1,0xcd,0x95,0xfd, + 0x6e,0x7b,0x86,0xa1, 0x17,0x56,0x64,0x0e, 0xd6,0xc9,0x0a,0x10, 0xe1,0xa3,0x36,0x79, + 0xd3,0xd0,0xc1,0xf8, 0x95,0x3e,0x72,0xa3, 0xc5,0x3e,0xef,0x9a, 0xe3,0x51,0x33,0x5d, + 0x8f,0x81,0xef,0x26, 0x6e,0x5f,0x75,0xf1, 0x7c,0xde,0x9a,0x74, 0x7b,0x18,0x86,0xd8, + 0x5f,0x33,0x20,0xf8, 0x2c,0x5b,0x76,0x76, 0x8d,0x67,0x98,0x1b, 0xd1,0xf1,0x93,0xfa, + 0x8f,0x70,0x2d,0xd7, 0x0b,0x8d,0xdb,0x5c, 0x64,0x44,0xa7,0x3f, 0xd2,0xf8,0xc4,0xa6, + 0xa6,0x77,0x87,0x72, 0x69,0xab,0x70,0xe2, 0x10,0xc8,0x42,0x98, 0xd2,0x16,0xb9,0x00, + 0xbb,0x8d,0x1f,0xf4, 0xbc,0xc5,0x4b,0xfc, 0x8d,0xd2,0x0e,0xdb, 0xc4,0x84,0x92,0xf0, + 0xf6,0x31,0x6b,0x53, 0x64,0xfb,0xf3,0x32, 0x78,0xd8,0x4b,0xf2, 0xea,0x34,0x86,0xba, + 0x66,0x66,0xb8,0x20, 0x3b,0x0e,0xf7,0x47, 0x23,0xfd,0x93,0x38, 0xdf,0x07,0xe0,0x64, + 0x6e,0x3c,0x6a,0x45, 0xdb,0x0e,0xbb,0xbc, 0xfc,0x3c,0xd8,0x58, 0xbf,0x44,0x80,0xa6, + 0x20,0x3f,0x53,0x0f, 0x43,0xfa,0x50,0x75, 0xec,0x5f,0x78,0x62, 0x6d,0x20,0x6c,0x52, + 0x4c,0xe8,0x9c,0x0c, 0x26,0x34,0x9b,0x21, 0x93,0x82,0xe3,0x89, 0x00,0xa7,0x10,0x52, + 0x2a,0xe5,0x9b,0x72, 0xfa,0x4e,0xae,0x01, 0xd4,0xc4,0xa3,0xe0, 0x75,0xab,0xe1,0x68, + 0xc5,0xfb,0xfd,0x0c, 0x0d,0x2e,0x27,0x81, 0xc7,0x89,0x0a,0xe5, 0xaa,0xc9,0x6c,0x84, + 0xb8,0xaa,0x20,0x8a, 0xbd,0x9f,0xb8,0x61, 0xcc,0xce,0xff,0x29, 0xf1,0x28,0x55,0xcd, + 0x5c,0x2b,0x31,0x02, 0x0c,0x76,0xbc,0x8b, 0x70,0x85,0x43,0x0f, 0x86,0xe9,0x6b,0xae, + 0xe5,0xb5,0x52,0xcb, 0xeb,0xc9,0xeb,0x3a, 0x3e,0x46,0xc6,0xe2, 0xa0,0xc2,0x70,0x35, + 0x58,0x88,0xcd,0xf6, 0x73,0x3c,0xe4,0x3b, 0x3d,0x7c,0xe3,0x09, 0x76,0x64,0x45,0x02, + 0x94,0x74,0xfa,0x4e, 0x7a,0x81,0xe9,0xfc, 0x1e,0x5b,0x38,0xc6, 0x8d,0x32,0xc8,0xdc, + 0x4a,0x52,0xca,0x61, 0x6a,0xe4,0x9e,0x00, 0xb6,0xa2,0x21,0x33, 0x91,0x88,0x37,0x3e, + 0x79,0xbf,0xb3,0x57, 0xe9,0xf5,0xb7,0xcd, 0x94,0x33,0x04,0x21, 0xb9,0xd7,0xe9,0xa0, + 0x42,0x05,0xf4,0x73, 0xd4,0x8c,0x4b,0x94, 0x17,0x30,0xc3,0xf3, 0x12,0x66,0xf2,0x64, + 0x0e,0xde,0xc6,0x42, 0x92,0x36,0x27,0xe3, 0x59,0x3d,0xa3,0xfb, 0xce,0x5f,0x0b,0x5d, + 0xcb,0xe5,0xeb,0xd6, 0x1b,0x42,0x8b,0x80, 0x66,0x51,0xdf,0xf2, 0xf6,0x42,0x6e,0x22, + 0x63,0x15,0xd3,0xed, 0x68,0x62,0xaa,0xb8, 0xad,0xbb,0x61,0xd8, 0x4d,0x82,0xf7,0x6d, + 0x73,0x0e,0x4d,0x06, 0xd7,0xb5,0xb0,0x39, 0x49,0xe6,0xc4,0xa5, 0xce,0xca,0x10,0x4d, + 0x00,0x93,0xcd,0xcd, 0x22,0x4d,0x52,0xdb, 0x55,0x88,0x83,0xde, 0x3e,0x4a,0x20,0xf2, + 0xd9,0x36,0x58,0x7a, 0x93,0x40,0xc0,0x68, 0x30,0x90,0xda,0x43, 0x68,0xd1,0x11,0x09, + 0xa1,0x04,0x21,0x09, 0x04,0x00,0x80,0x01, 0x08,0x00,0x12,0x00, 0x50,0x81,0xb1,0x82, + 0x44,0x98,0x43,0x14, 0x31,0x62,0xee,0xf0, 0x09,0x24,0x13,0x65, 0x0c,0xe0,0x40,0xa0, + 0x43,0x68,0xac,0x07, 0x59,0xfa,0x00,0x6a, 0x6c,0x03,0x08,0x06, 0x1e,0x9f,0xe4,0xa0, + 0xd7,0x27,0xeb,0x97, 0x19,0xaf,0xa3,0x9b, 0x06,0xb1,0x6f,0x34, 0x43,0x23,0xf4,0x0f, + 0x01,0x57,0x0e,0x7f, 0xa6,0xab,0xd8,0x65, 0xbc,0x0b,0xf0,0xb6, 0x7f,0x3a,0x57,0x77, + 0x9a,0x3d,0x5c,0xf4, 0x55,0x7e,0xbe,0xe2, 0x74,0x67,0xbe,0x6f, 0x51,0xfc,0x14,0x23, + 0xcc,0xb7,0x1b,0x4c, 0x42,0x34,0xcc,0xce, 0x7b,0xfb,0xb0,0x1b, 0xd6,0x8a,0xcd,0x54, + 0xd1,0xc0,0x0b,0xbd, 0xdb,0xd2,0x4a,0x65, 0x3a,0xa7,0xa7,0xdf, 0x7c,0x8a,0xf1,0xb5, + 0x15,0x2b,0x1e,0x4b, 0x77,0x4e,0x82,0x77, 0xef,0xd8,0x6c,0x3f, 0x07,0x3d,0xe4,0x66, + 0x33,0xa8,0xad,0x2c, 0xb5,0xa6,0x94,0xf4, 0x0e,0x22,0x45,0xad, 0xeb,0x4e,0x4d,0x47, + 0x6b,0xae,0x4f,0x21, 0xa4,0xcb,0xc9,0x54, 0x2e,0x27,0x11,0xf7, 0xa2,0x5c,0xc1,0xdc, + 0x40,0x96,0xec,0x5a, 0xc0,0x01,0xa9,0x8c, 0xb2,0xf1,0xd8,0x64, 0xba,0x28,0x22,0xf3, + 0xb4,0xd0,0xe5,0x04, 0x3f,0xe3,0xd6,0xc7, 0xfe,0x3c,0x23,0x90, 0x52,0xae,0x58,0xd0, + 0x5c,0x9a,0xe8,0xf9, 0x3b,0x7e,0xe8,0xb0, 0x9d,0x16,0xae,0xcb, 0xe0,0xc4,0xaf,0x0b, + 0xdb,0x76,0x64,0xb7, 0xf3,0x99,0x18,0xa9, 0x9e,0x72,0x93,0x24, 0xe2,0x32,0x64,0xc6, + 0x9b,0xc0,0xff,0x21, 0xe6,0xf6,0x5f,0x63, 0xad,0xe8,0x3b,0x8b, 0xd7,0x11,0x9f,0x64, + 0x05,0x98,0x1e,0xb2, 0x0c,0xce,0x1c,0x61, 0x51,0x57,0xca,0xa6, 0x47,0xf3,0x41,0x1e, + 0x63,0x10,0x58,0xc4, 0xc3,0x44,0xa2,0xe1, 0x75,0xcb,0x93,0xaa, 0xd3,0x54,0x50,0xc5, + 0x17,0x06,0x24,0x0b, 0x3e,0x62,0xa1,0x60, 0xeb,0xee,0xec,0x65, 0x67,0x48,0x5d,0x13, + 0xc8,0x22,0x40,0x9b, 0x7a,0x59,0x35,0x26, 0x35,0x42,0xec,0x55, 0x88,0x02,0xf6,0xdb, + 0xa8,0xba,0x6e,0x8d, 0xaa,0xe9,0x5b,0xae, 0x6a,0x24,0x8b,0xc9, 0xc7,0xc3,0xe3,0x07, + 0x44,0x84,0xe9,0x88, 0x58,0x0e,0x29,0xad, 0x10,0xd1,0xaa,0x6b, 0x5a,0xd2,0xb2,0xc0, + 0xc5,0x76,0xb9,0xaf, 0xc1,0x04,0x8b,0x88, 0xa7,0x98,0x02,0x38, 0x53,0xd4,0xbb,0xc7, + 0xaa,0xe6,0xe9,0x52, 0xcb,0x63,0xe3,0xf6, 0x23,0x24,0xca,0x50, 0x8c,0x75,0x08,0xa3, + 0xba,0x48,0x3a,0x90, 0x69,0xb7,0x66,0x12, 0x04,0x99,0x32,0x64, 0x96,0x04,0x60,0x51, + 0xdb,0x14,0x09,0x29, 0x2a,0x04,0x92,0xe5, 0x30,0x40,0xd4,0x92, 0xd3,0x06,0xab,0x07, + 0x1e,0x31,0xf6,0xcd, 0x41,0x2a,0xe0,0x2b, 0x30,0xec,0x58,0x8d, 0x23,0x10,0x52,0xf0, + 0x13,0xa5,0x91,0x28, 0x04,0xd8,0x01,0x55, 0xbb,0xd3,0x65,0x9c, 0xbb,0x37,0x28,0xae, + 0x0d,0xbf,0x54,0xec, 0x96,0x30,0x14,0x14, 0x34,0x92,0x4e,0x34, 0xa5,0x04,0x30,0x94, + 0x35,0xe4,0x05,0x19, 0x54,0x09,0x7b,0xfb, 0x12,0xb5,0x32,0xb4, 0x99,0x26,0x08,0x9c, + 0xa8,0x8b,0x91,0x31, 0x23,0xbd,0xa6,0x29, 0x82,0xd4,0x94,0x0a, 0xac,0x3b,0x32,0x98, + 0x88,0x6d,0xde,0x1a, 0xa0,0x61,0x2e,0xb2, 0x4a,0xfd,0x98,0x1d, 0x51,0x4a,0x00,0xa5, + 0x84,0xa4,0xc6,0xdb, 0x45,0x75,0x2b,0xac, 0x27,0x31,0x0a,0xc9, 0x28,0x4a,0x98,0x00, + 0xb1,0xb6,0x81,0x7b, 0x86,0x80,0xbc,0x9b, 0x66,0x96,0xcc,0xa4, 0x90,0x50,0xc4,0x1c, + 0xc3,0x47,0x13,0xd9, 0xc0,0x96,0x25,0xa5, 0x4b,0x49,0x5b,0xec, 0xb2,0x69,0x54,0xd1, + 0x03,0x40,0xd2,0x45, 0x35,0x40,0x20,0xfa, 0x7e,0xee,0x10,0x82, 0xff,0x63,0x1e,0x0b, + 0x16,0x03,0x0a,0x98, 0x09,0x36,0xa7,0xd6, 0x40,0x7c,0xfb,0x17, 0xaa,0xd1,0xfd,0x48, + 0xa7,0xda,0x3e,0xa1, 0xd1,0xf1,0xef,0x92, 0x48,0xa4,0x7a,0x1c, 0x4c,0x69,0x14,0xb4, + 0x81,0x00,0xcc,0x19, 0x5b,0x51,0xdb,0x70, 0x14,0x10,0xfb,0x6d, 0x5e,0xf1,0x85,0x73, + 0xf7,0x1e,0x6d,0xec, 0x82,0xb0,0xe6,0x21, 0xfe,0x97,0x56,0xca, 0x0b,0x7d,0xfd,0xd1, + 0x41,0xa8,0x26,0x69, 0xfd,0xd4,0xb2,0xd4, 0xe3,0x5c,0x37,0x32, 0x77,0x97,0xcd,0xbb, + 0x14,0x4a,0x0a,0x28, 0x2e,0x09,0xe0,0xce, 0xe6,0xa1,0x37,0xa0, 0xf8,0x6f,0x5e,0x80, + 0x80,0xde,0xe9,0xfa, 0x01,0x9e,0x11,0xa1, 0xaf,0xe5,0x10,0x1f, 0x71,0x8c,0x6d,0xaa, + 0x47,0xaa,0x67,0x79, 0xe3,0xee,0xac,0xfe, 0xfd,0x0c,0x06,0x02, 0x8c,0x09,0x19,0x2c, + 0x00,0x8c,0x0e,0x6d, 0x90,0x6f,0xf3,0x39, 0x1f,0xa7,0xff,0xf1, 0x77,0x24,0x53,0x85, + 0x09,0x06,0x5c,0xe1, 0x29,0xb0, + // 0x5cc6 = 23750 data bytes (33%) +}; + +static BZ2Manager_t lecode_usa_bin_mgr + = { lecode_usa_bin_bz2, sizeof(lecode_usa_bin_bz2), 0, 0 }; + +//----------------------------------------------------------------------------------- + +static const u8 lecode_jap_bin_bz2[] = // pool/ref/lecode/r32/lecode-JAP.bin +{ + // decompressed size: 0x117a0 = 71584 bytes + 0x00,0x01,0x17,0xa0, + + // bzipped data + 0x42,0x5a,0x68,0x39, 0x31,0x41,0x59,0x26, 0x53,0x59,0xee,0x07, 0x6e,0x07,0x00,0x29, + 0xa7,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xe0, 0x4e,0xbb,0xee,0x4f, 0xac,0xfb,0xde,0xb7, 0xbc,0xe6,0xd8,0x95, + 0x27,0xd8,0x67,0x3d, 0xb9,0x63,0x36,0xb8, 0xdd,0x5d,0xb6,0x77, 0xb6,0xbc,0xfb,0xba, + 0xef,0xae,0xeb,0xb5, 0x7a,0x79,0xd8,0xc2, 0x7b,0x32,0xa1,0x28, 0xb7,0xad,0xbd,0xe0, + 0x6f,0xbb,0xde,0x25, 0xd1,0x46,0xaf,0xb3, 0x9c,0xda,0x06,0x8f, 0xb7,0x77,0x5a,0xa3, + 0xee,0xdc,0x3a,0xf5, 0xdf,0x50,0xbe,0xec, 0x77,0xb7,0x7d,0x3e, 0x77,0xc1,0x2f,0x4a, + 0x52,0xa7,0xbe,0xee, 0x77,0xa7,0x35,0x80, 0x4e,0xda,0xf6,0xfa, 0xf5,0xf3,0xde,0x7b, + 0x5b,0x3d,0x06,0xde, 0xfa,0x8b,0xef,0x65, 0x71,0x6e,0xf0,0x13, 0xdf,0x4f,0xbd,0xbd, + 0xf7,0xdb,0xbd,0x75, 0xf4,0x7a,0xaf,0x7b, 0x5b,0x7b,0x6d,0x5d, 0xb0,0x3e,0xbb,0xdf, + 0x70,0xdb,0x7d,0x5d, 0x55,0xda,0x9c,0x76, 0xe5,0xf1,0xef,0x9e, 0x4b,0xce,0x66,0xfb, + 0x15,0x57,0xb6,0x87, 0x1f,0x76,0xbe,0x32, 0x1e,0x8f,0xa8,0x0b, 0x5b,0x7b,0xcb,0xe5, + 0xf5,0xea,0xda,0x7d, 0x7c,0xbe,0xfb,0xbb, 0x25,0xf7,0x7d,0xc7, 0x4a,0x7b,0xce,0xfb, + 0xdc,0xf7,0xde,0x75, 0xc1,0xa6,0xc5,0x8f, 0x77,0xd0,0x2b,0xbd, 0xee,0xdd,0xf7,0xcf, + 0x69,0xd5,0x03,0xe9, 0xef,0xbe,0xfa,0xb5, 0xde,0x9b,0x34,0x18, 0x37,0xdd,0xb8,0x6f, + 0xb7,0xda,0xab,0x42, 0x0e,0xbc,0x34,0x44, 0x08,0x02,0x60,0x8d, 0x00,0x0d,0x00,0x01, + 0x18,0x6a,0x30,0x4d, 0x0d,0x34,0x34,0x34, 0x64,0x69,0xa0,0x0d, 0x03,0x46,0x89,0xe9, + 0xa1,0xa1,0x3d,0x09, 0x89,0x82,0x60,0x26, 0x13,0x69,0x3d,0x26, 0x13,0xd4,0xc9,0x89, + 0x93,0x4c,0x24,0xf0, 0x4d,0x32,0x19,0x0a, 0x9f,0xe9,0x4f,0xd4, 0xf2,0x53,0xf2,0x4f, + 0x46,0x49,0x9a,0x6a, 0x60,0x9a,0x69,0x3c, 0xd2,0x9e,0x93,0xc9, 0xb5,0x1a,0x50,0x6a, + 0x68,0x80,0x20,0x00, 0x98,0x13,0x00,0x00, 0x13,0x20,0x00,0x00, 0x98,0x13,0x23,0x44, + 0xc0,0x23,0x23,0x26, 0x1a,0x9a,0x64,0x68, 0x0c,0xa6,0x4c,0x4f, 0x4d,0x23,0x4f,0x46, + 0x9a,0x9a,0x31,0x34, 0xda,0x99,0x34,0xd1, 0x1f,0xa2,0x9b,0x48, 0xf4,0x99,0x93,0x51, + 0xb4,0x8f,0xd2,0x31, 0x32,0x8f,0x4f,0x51, 0xa4,0xf4,0x4f,0x50, 0xd1,0xea,0x69,0xa6, + 0x9e,0xa3,0x47,0xa4, 0xda,0x23,0x6a,0x68, 0x35,0x34,0x20,0x34, 0x01,0x32,0x34,0x09, + 0x84,0x1a,0x13,0x13, 0x08,0xc1,0x31,0x35, 0x53,0xf0,0xd2,0x6d, 0x34,0x98,0x03,0x48, + 0xcd,0x26,0x68,0x9b, 0x52,0x79,0x4f,0x41, 0xa5,0x1f,0x95,0x3c, 0xd4,0xcd,0x34,0x9a, + 0x4f,0x49,0xe1,0x35, 0x3c,0xa6,0x9a,0x7a, 0x9a,0x62,0x6f,0x54, 0xf5,0x3d,0x4d,0x3d, + 0x4c,0x27,0x92,0x79, 0x1a,0x8f,0x04,0xd4, 0xf5,0x3d,0x35,0x3d, 0x0c,0x91,0xa3,0x13, + 0x11,0xea,0x68,0xd1, 0xb4,0xd4,0x7a,0x4f, 0x44,0xd0,0xd1,0xa0, 0x1a,0x68,0x12,0x13, + 0x41,0x00,0x98,0x53, 0xc0,0x4d,0x34,0x1a, 0x69,0x36,0x85,0x36, 0x98,0xa6,0x69,0xe9, + 0x4c,0x69,0x34,0x99, 0xea,0x34,0xd3,0xd4, 0xcd,0xaa,0x9e,0x29, 0xe8,0x99,0x1e,0x35, + 0x26,0xc8,0x8f,0xd4, 0xd1,0xa1,0x3d,0x13, 0xd4,0xf4,0x8f,0x50, 0xd9,0x26,0x02,0x7a, + 0x40,0xda,0x26,0x04, 0x0f,0x28,0x7a,0x4f, 0x28,0xda,0x80,0xc9, 0x84,0xc4,0xcd,0x43, + 0x47,0xa8,0xd3,0xd4, 0x06,0x4d,0x0d,0x0d, 0x00,0xc8,0x0d,0x3d, 0x28,0x93,0x41,0x32, + 0x02,0xa7,0xe6,0x86, 0x95,0x3d,0x94,0xf2, 0x14,0xd8,0x09,0xa9, 0xfa,0xa7,0x85,0x3d, + 0x4f,0xd4,0x83,0xc0, 0xa6,0x8f,0x4d,0x47, 0xa9,0xe9,0x94,0x66, 0xa0,0x7a,0x35,0x3d, + 0x26,0x8f,0x53,0x69, 0x3d,0x4d,0x34,0x1a, 0x6d,0x26,0x87,0x92, 0x64,0xf5,0x34,0xc4, + 0x0d,0x03,0x43,0x4f, 0x28,0xd0,0x0d,0x1a, 0x34,0x00,0xf2,0x9e, 0xa6,0x9a,0x1a,0x00, + 0xf5,0x00,0x64,0x68, 0x34,0x00,0xf5,0x32, 0x1a,0x00,0x12,0x24, 0x42,0x02,0x1a,0x01, + 0x32,0x62,0x68,0x00, 0xc8,0x09,0x81,0x34, 0x64,0xd3,0x09,0x84, 0x68,0xd1,0xa0,0x6a, + 0x6d,0x13,0x09,0x80, 0x9e,0xa6,0x9a,0x61, 0x3d,0x4d,0x31,0x34, 0xc4,0x99,0x91,0xa3, + 0x4c,0x4c,0x10,0xd1, 0xa6,0x83,0x45,0x37, 0x88,0x62,0x6a,0x7a, 0x31,0x4d,0xa4,0xd3, + 0x47,0xa5,0x34,0x79, 0x34,0xf4,0x99,0x23, 0xc6,0x89,0xa8,0x78, 0xa1,0xe0,0xa7,0x99, + 0x4c,0xa7,0xea,0x41, 0x6a,0x9a,0xd7,0xf3, 0x79,0xbc,0x81,0xd6, 0xf3,0x91,0xd9,0xda, + 0x6d,0x13,0x1d,0x46, 0x1f,0xfc,0x77,0x3a, 0x2f,0x97,0x05,0x2b, 0x24,0x5c,0xd7,0x3a, + 0x46,0x0b,0x82,0x82, 0x05,0xd6,0x2e,0x4c, 0xc1,0x97,0xbf,0x36, 0x61,0x09,0x8a,0xb5, + 0x10,0xa1,0x80,0x8d, 0xb3,0x00,0x2e,0xda, 0x49,0x65,0xd1,0xa6, 0xaa,0xa1,0x20,0xac, + 0xe1,0x04,0x28,0x39, 0x84,0x41,0x20,0xe6, 0x00,0xec,0xed,0xe0, 0x24,0x0d,0x18,0xa3, + 0x92,0xe9,0x61,0x22, 0x81,0x4e,0x9e,0x73, 0x4d,0x29,0xd4,0x27, 0xbb,0xcd,0xcc,0xc4, + 0x76,0xc2,0xd6,0x6c, 0x58,0x87,0x3d,0xb2, 0xd7,0x16,0xac,0x4e, 0x4e,0x2c,0xb3,0xcc, + 0xb8,0x91,0x66,0xd4, 0x4b,0x99,0xd5,0x80, 0x85,0x77,0x4e,0xc5, 0xde,0x02,0x9a,0xdd, + 0x3d,0xd6,0x06,0x06, 0x0e,0x15,0x09,0x9a, 0xe0,0x3d,0x48,0x38, 0x9e,0x3b,0x60,0x74, + 0x01,0x88,0x5d,0x34, 0xe1,0x8c,0xaa,0x55, 0xfa,0xbb,0x17,0x67, 0x59,0xc2,0xad,0x5e, + 0xbc,0x15,0xe0,0x21, 0x08,0x4b,0x47,0xb7, 0xcf,0x49,0x21,0x19, 0xec,0xe4,0x01,0x4b, + 0x7c,0x93,0x80,0xc6, 0x65,0x81,0x95,0x3e, 0x4a,0x85,0x0b,0x66, 0xc4,0x63,0x33,0x1d, + 0x95,0xe8,0x22,0x1c, 0x0d,0x56,0x64,0x99, 0x26,0xb1,0x79,0xa8, 0x62,0x12,0x42,0x93, + 0x68,0x8e,0xd0,0xd7, 0x6e,0x7e,0x16,0xa3, 0xfa,0x6a,0xb8,0xd8, 0x55,0x40,0x1c,0x80, + 0x1c,0x80,0x3b,0x1f, 0x37,0xa0,0xe5,0xb5, 0xbf,0xe3,0xf8,0xf1, 0x9e,0xcf,0xe9,0x5f, + 0xfb,0x56,0x5b,0x43, 0x18,0xda,0x67,0xae, 0xa3,0xc8,0x66,0x69, 0xa3,0xbc,0x61,0xa8, + 0x68,0xcd,0xd4,0x40, 0x7a,0xdf,0xed,0xfc, 0xb3,0x1f,0xed,0xfc, 0x9d,0x2a,0xb0,0x20, + 0x6e,0xfc,0x10,0x38, 0x21,0xc4,0xf8,0x9f, 0x3b,0xce,0x09,0x9a, 0x37,0x90,0x5a,0x97, + 0x96,0x7d,0xf7,0x94, 0xf2,0x38,0x14,0x91, 0x67,0x15,0xcb,0x67, 0x57,0xe6,0x3d,0xe2, + 0x5c,0xfc,0xaf,0x95, 0x27,0xa9,0x17,0x4d, 0x06,0x3f,0x9a,0x12, 0xfd,0x44,0x63,0x03, + 0x01,0x00,0x26,0x0f, 0x93,0xef,0x79,0x16, 0x74,0x7d,0xad,0xc2, 0x86,0x78,0xbb,0xe3, + 0x32,0x9b,0x10,0xd3, 0xdc,0x15,0xfa,0xee, 0x5b,0x1f,0xea,0xa2, 0x6b,0x9b,0xfc,0x65, + 0x17,0xf2,0x55,0x2f, 0x10,0x11,0x72,0xb6, 0xae,0x08,0xb5,0x46, 0xd1,0xdb,0x96,0xa6, + 0x01,0x9b,0x16,0x5c, 0x3c,0x18,0xe4,0x23, 0x61,0x73,0x25,0x87, 0x35,0x46,0x55,0xd5, + 0x9e,0xe0,0xe7,0x81, 0x54,0x8c,0xca,0x56, 0xa7,0xd5,0x47,0xf1, 0xc8,0xdd,0x32,0x38, + 0x39,0xcc,0x24,0xf2, 0x81,0xd3,0x07,0x24, 0xb6,0x73,0xda,0x26, 0xad,0x99,0xf2,0x92, + 0xa9,0x6d,0xe6,0x86, 0x80,0xc2,0xbe,0xc1, 0xe7,0xa8,0x06,0xda, 0x4c,0x85,0x82,0x65, + 0xf6,0x77,0x4a,0xee, 0x35,0x6d,0xa5,0x84, 0xe5,0xee,0x78,0x74, 0x4d,0x62,0x3a,0x8d, + 0x87,0x63,0x26,0x09, 0x96,0x57,0x41,0x48, 0x5f,0xc2,0x85,0xc5, 0x0c,0xb8,0x03,0xe1, + 0x8b,0x86,0x1b,0x04, 0xc8,0x0e,0xfc,0xad, 0x8c,0xf0,0x44,0x3e, 0x31,0x71,0x08,0x53, + 0x2a,0x97,0x3e,0x43, 0xaf,0xd9,0x02,0xb0, 0x04,0x04,0xc3,0xaa, 0xb9,0x8a,0xe4,0x02, + 0x42,0x3e,0x76,0x7c, 0xbe,0x7e,0x35,0x22, 0x32,0xdf,0x76,0xd1, 0xbc,0xf1,0x54,0x70, + 0x6a,0xf5,0x37,0xfb, 0x73,0x19,0x56,0xe3, 0x62,0xbe,0x67,0x32, 0x49,0xca,0xa6,0x1f, + 0x19,0xac,0x24,0xf4, 0x8d,0x19,0xf7,0x46, 0x2f,0x37,0x16,0x5c, 0x63,0x75,0x74,0x5d, + 0x54,0x15,0x66,0x0c, 0x4f,0x8b,0x62,0x04, 0x97,0x7b,0xd0,0xc8, 0x30,0x46,0xf9,0xd5, + 0x97,0x08,0xe1,0x96, 0xf8,0xbe,0x79,0xc5, 0x78,0xc2,0x4a,0x7f, 0x01,0x96,0x97,0x17, + 0x96,0xe7,0xeb,0xb2, 0x67,0xa4,0x68,0xbd, 0xec,0xfc,0xaf,0x42, 0x85,0x86,0xae,0x5d, + 0x4f,0x2f,0x00,0xef, 0x0a,0x2f,0xdc,0x5e, 0xb0,0x1d,0xd2,0xfd, 0x63,0x9a,0xd4,0x72, + 0x5b,0x3b,0x2e,0xec, 0x9f,0xe6,0x25,0x9f, 0x0a,0x20,0xb3,0xd6, 0x3a,0xdb,0x27,0x07, + 0x6c,0x2b,0xb4,0x38, 0x47,0x4a,0x16,0x4a, 0x6a,0xc5,0x16,0xce, 0xa2,0xe3,0xb9,0x01, + 0xaf,0x9e,0x2e,0x3c, 0x49,0x5c,0xb5,0x66, 0x2c,0xb5,0xf9,0xc7, 0x8a,0x1c,0x66,0xb1, + 0xe6,0x16,0x04,0xa9, 0x95,0x1e,0x6f,0xcd, 0x4d,0x17,0x16,0x10, 0x4a,0x73,0x98,0x65, + 0x3c,0x23,0x71,0x67, 0x09,0x74,0x18,0x09, 0xe3,0x6a,0xe2,0x25, 0x1e,0xe2,0xc6,0x5d, + 0xb6,0x5b,0x46,0x0a, 0x7d,0x86,0x98,0x80, 0xdb,0x4b,0x93,0x37, 0x14,0x35,0x17,0x53, + 0xae,0x86,0x7d,0xa5, 0x78,0x1b,0x4a,0x39, 0x12,0x3c,0xbf,0x20, 0x8b,0x38,0xd3,0xbf, + 0xdb,0x2e,0x54,0xbd, 0x11,0xd8,0x55,0xec, 0x69,0xa9,0x00,0x97, 0x39,0xec,0x3b,0x2e, + 0x5a,0x6a,0xed,0x88, 0x45,0xa3,0x80,0x43, 0x1f,0xc0,0x1c,0x90, 0xcd,0x74,0xb3,0xcb, + 0x0c,0x81,0xac,0x45, 0xaa,0xf7,0x95,0xb7, 0xcf,0x1d,0x47,0xdf, 0x84,0xd7,0xfe,0xd6, + 0x1d,0x2c,0xe9,0x68, 0xc4,0x4e,0xee,0x98, 0xac,0x40,0x15,0xf5, 0x67,0xba,0x17,0x68, + 0x2d,0xb5,0x8a,0xcb, 0x6c,0xe5,0xf4,0x78, 0xcb,0x63,0x9d,0xb3, 0x04,0x57,0x3d,0x4b, + 0x28,0xec,0xe8,0x3b, 0x75,0x84,0xcb,0x41, 0x5a,0x2b,0x9d,0x03, 0x5d,0x6e,0x97,0x7f, + 0x0b,0x10,0xbe,0x3c, 0x55,0xc7,0x4d,0x16, 0xea,0x4e,0xc5,0xd6, 0xb6,0x49,0xc0,0x92, + 0x95,0x4b,0x36,0xd4, 0x6c,0x13,0xb5,0xe0, 0x6e,0x43,0x00,0x98, 0x4a,0xd5,0xa7,0x2b, + 0xd2,0x7a,0x1c,0xdc, 0xc7,0x0c,0x05,0xcd, 0x36,0x1c,0x17,0xc5, 0x9d,0xd6,0x56,0xaa, + 0xe8,0xd9,0xae,0x03, 0xf0,0x4c,0xa1,0x6a, 0x97,0xbc,0xf8,0x56, 0xf0,0xc6,0x1a,0x2a, + 0x9e,0x26,0x43,0xb7, 0x58,0x19,0xd4,0xd3, 0x52,0x13,0x48,0x05, 0xa7,0xc9,0x74,0x95, + 0x0d,0x56,0x18,0x4b, 0x33,0xcf,0x70,0x53, 0x34,0x26,0x9a,0x13, 0xe0,0x2e,0xf9,0x85, + 0x7a,0x0a,0x79,0xc9, 0x24,0x21,0x08,0x50, 0xa9,0x70,0x47,0x5f, 0x74,0xd8,0x69,0x57, + 0x88,0x2d,0xd0,0x35, 0xa7,0x3f,0x7b,0x76, 0xfa,0x20,0x2b,0xf6, 0xb2,0x12,0xbb,0x79, + 0x76,0xa0,0x61,0xc4, 0x61,0xfd,0x43,0x13, 0xa9,0xef,0x39,0x87, 0x5a,0x10,0x61,0x60, + 0xbc,0xb2,0x07,0x02, 0x1d,0x9c,0x6a,0x76, 0xac,0x61,0xd1,0xb7, 0x8f,0x11,0x53,0x27, + 0x05,0x47,0xe1,0x20, 0xb5,0x98,0x91,0x50, 0xc7,0x14,0x73,0xae, 0xe3,0x69,0x7a,0xa0, + 0xd8,0xca,0xc0,0x8f, 0x47,0x01,0xd8,0xe9, 0x1d,0x4b,0xdf,0xa0, 0xca,0xd2,0xf7,0xb9, + 0x1d,0x53,0xb1,0x30, 0x60,0x62,0xd5,0x24, 0x49,0x56,0xd2,0x07, 0x97,0xba,0x14,0xa6, + 0xe1,0x42,0x99,0x52, 0x6a,0x04,0x69,0x62, 0x21,0xc4,0xa2,0x9c, 0xa4,0x81,0x0d,0xfc, + 0x37,0xa2,0xd8,0x0e, 0xbe,0xe2,0xc9,0x5a, 0x38,0x23,0x9d,0x21, 0x24,0x9d,0xfb,0x43, + 0x0e,0xf3,0x91,0x9d, 0xd5,0x7d,0x7e,0x6b, 0x54,0xb2,0x70,0x6f, 0x24,0x9b,0x4a,0xa9, + 0x85,0x8a,0x17,0x4c, 0x54,0x94,0x1c,0x3a, 0x9f,0x36,0xaf,0x42, 0x79,0xad,0x6d,0x22, + 0x16,0xb0,0xc3,0x07, 0x10,0x05,0xd4,0xce, 0x5f,0x63,0x70,0x8d, 0x1c,0x5d,0x5b,0x59, + 0x0a,0x9c,0x39,0xeb, 0xdf,0xcf,0xa5,0x57, 0x73,0x76,0xad,0x63, 0x37,0xf6,0x9c,0x71, + 0xc4,0xfd,0xdf,0x8b, 0x8e,0x6c,0x12,0x99, 0xf9,0x77,0x48,0xaa, 0x90,0xa3,0x14,0xa1, + 0x14,0xdc,0x2e,0x76, 0x6b,0xc4,0xe9,0xfe, 0x3c,0x59,0xd2,0x46, 0xb0,0x33,0x66,0xbb, + 0xda,0x49,0xcd,0x87, 0x81,0x48,0x3d,0xb5, 0x14,0xe3,0x16,0x9c, 0x2c,0xd7,0x95,0xa0, + 0xcd,0xd9,0x53,0xca, 0xea,0x92,0xf0,0x72, 0xd3,0x7d,0x26,0x06, 0xd6,0x37,0xd4,0x6d, + 0xf9,0x9e,0x9b,0x39, 0xae,0x15,0x0c,0xf4, 0xcf,0x46,0x8d,0x5c, 0x06,0x72,0x93,0x4d, + 0x1e,0xdb,0xe3,0xae, 0x17,0xe7,0xd2,0xbc, 0xe4,0x31,0x2b,0x4a, 0x88,0xcf,0x65,0x8a, + 0x2a,0x9d,0x31,0x45, 0xab,0x8e,0xdb,0x5e, 0xb8,0x50,0x7b,0x44, 0x49,0xbb,0x0a,0x60, + 0xca,0x19,0xd6,0x18, 0x44,0xd1,0x2a,0xb3, 0x33,0x32,0xbf,0xba, 0x46,0x8c,0x0f,0x72, + 0x6d,0xdd,0x95,0x9b, 0xea,0x79,0xf8,0x9e, 0xff,0x1e,0x96,0x75, 0xab,0x7d,0x0a,0x84, + 0x8d,0xdb,0x89,0x12, 0x06,0x77,0x7f,0xee, 0x29,0x32,0xc1,0xb2, 0x43,0xa9,0x8f,0xe8, + 0xba,0xf7,0x47,0x8b, 0xb2,0xc1,0xe6,0x4e, 0xec,0x98,0x9d,0x34, 0x1d,0xda,0xf9,0x5a, + 0x91,0x2c,0xce,0xfa, 0x46,0x56,0x03,0x91, 0x15,0x39,0x71,0xd8, 0x71,0x4c,0x21,0xd7, + 0x93,0xc2,0xbb,0xf7, 0x2b,0xc2,0x05,0x62, 0x5b,0x26,0x04,0x06, 0x7b,0x94,0x62,0x17, + 0xac,0x44,0x33,0xc6, 0xe1,0x79,0x35,0xb8, 0x48,0x6e,0x4e,0x33, 0x76,0xa8,0xca,0x22, + 0xb9,0x0c,0xc4,0xcd, 0x11,0x76,0x77,0x0c, 0x63,0x19,0xaa,0x96, 0x8e,0x00,0x4f,0xbd, + 0x78,0xcd,0x91,0xa9, 0xad,0xf8,0x87,0x25, 0x48,0x08,0x65,0x1d, 0xe3,0x98,0x1d,0xbc, + 0x18,0x91,0x52,0xf6, 0xc3,0xdb,0xea,0x86, 0x4c,0x50,0x3d,0x01, 0xa4,0x90,0x21,0x14, + 0x6a,0xd7,0x59,0x1b, 0xe1,0xc7,0x89,0x75, 0xad,0xe8,0x8f,0x0c, 0x37,0xbb,0xbd,0x48, + 0x9c,0x03,0x22,0xff, 0x37,0x1b,0x4e,0xac, 0x35,0x8d,0x29,0x0d, 0xbd,0x5d,0xe6,0xc3, + 0x35,0xc0,0xc6,0xef, 0x2a,0xd7,0x0b,0x4b, 0x02,0xa1,0xf7,0xfd, 0xcf,0x16,0xe3,0x2d, + 0xa0,0x28,0xe6,0x3d, 0x0b,0xd8,0x9f,0xb9, 0x62,0x17,0x5f,0xae, 0x4a,0xed,0x80,0xbe, + 0x84,0x7e,0x73,0x0a, 0x0a,0x92,0xca,0x44, 0xf0,0xc4,0x63,0x18, 0xc6,0x50,0x03,0x29, + 0x2d,0x5b,0xc9,0x21, 0x04,0x7b,0xfa,0xc7, 0x80,0x67,0xe8,0xd5, 0x0e,0x43,0x32,0x77, + 0x08,0x40,0x61,0xa8, 0x71,0x3b,0x72,0xe4, 0xe3,0x73,0x8d,0x4e, 0x59,0x5d,0x01,0x5d, + 0x9a,0xef,0x6b,0x5c, 0xc1,0x73,0xe9,0x35, 0x77,0x73,0x10,0x4f, 0x56,0xe0,0x31,0x59, + 0x54,0xbf,0xd7,0x5d, 0x7f,0x2d,0x1e,0x2d, 0xc9,0x20,0x57,0x2f, 0xe5,0x02,0x25,0x09, + 0xf6,0xf2,0x21,0x1b, 0x38,0x38,0xed,0x66, 0x6c,0xd1,0xe1,0xe7, 0x76,0x58,0xfc,0xd6, + 0xa0,0x8e,0x31,0xe2, 0xda,0xbd,0xce,0xbb, 0xdc,0xcc,0x53,0x7a, 0x5f,0xc4,0x50,0x71, + 0xa5,0x85,0xf9,0xcb, 0x3d,0xcb,0xd1,0x33, 0x2b,0xa1,0xc9,0xe2, 0x59,0xd5,0x6b,0xe6, + 0xaf,0xf2,0x17,0xcd, 0xde,0x25,0x49,0xce, 0xdc,0x6e,0x1b,0x53, 0xa1,0xad,0x2b,0x35, + 0x25,0x29,0xc4,0x5a, 0xb5,0xb6,0x6b,0x1b, 0x7a,0x40,0x03,0x6d, 0x14,0xc8,0x85,0xfb, + 0xf8,0xff,0xbf,0x8a, 0xaf,0x65,0xdb,0x71, 0xfe,0x1a,0x18,0x18, 0xb1,0xf8,0x92,0x76, + 0x20,0x86,0xee,0x8d, 0xbb,0xec,0x77,0xb4, 0x69,0x43,0xc6,0x50, 0x01,0x34,0x02,0x55, + 0xf8,0x07,0xd0,0x70, 0xd5,0xe1,0xee,0x56, 0xb1,0x83,0x04,0xae, 0xa2,0x05,0xf0,0x94, + 0xeb,0xce,0x9b,0x5e, 0xa0,0xb9,0xa5,0xe4, 0xed,0x55,0x2b,0x42, 0x37,0x9c,0xc3,0x7d, + 0xc8,0x28,0x1f,0x41, 0x40,0xc0,0x1a,0x52, 0x44,0x69,0x9f,0x15, 0x93,0x9a,0x05,0xc3, + 0x23,0x79,0x91,0x95, 0xbc,0xca,0x31,0xa3, 0xdc,0x65,0x5d,0xe4, 0xa9,0xd7,0x58,0x71, + 0x20,0x1a,0x60,0x4f, 0x6c,0x9c,0xa1,0x23, 0x6a,0x3b,0x0b,0x2e, 0xaf,0x4d,0x0b,0xf5, + 0x37,0x4e,0x09,0x2f, 0x77,0x82,0x78,0x92, 0x75,0xd7,0xa6,0x7e, 0x73,0x54,0x09,0xf2, + 0xf1,0xaf,0x2f,0xe3, 0x0d,0xe7,0xca,0xd0, 0x5d,0x1a,0x8c,0x7b, 0xbc,0x26,0x7d,0x4a, + 0x2b,0x28,0x22,0x69, 0x64,0xe8,0x72,0x54, 0xa2,0x26,0xa0,0x26, 0x77,0xa9,0x03,0x55, + 0xd7,0x99,0x3a,0x95, 0xbc,0x25,0x37,0x21, 0x4d,0xd0,0x40,0xd1, 0xcd,0xa5,0xe9,0xd8, + 0xcb,0xbf,0x77,0x81, 0x64,0x96,0x5e,0x10, 0x39,0x8e,0xa0,0x02, 0x40,0xbb,0x0a,0x01, + 0xa1,0xbf,0x7e,0xd0, 0x34,0xe5,0x00,0xa8, 0x97,0x33,0x85,0x89, 0x0c,0xfa,0xed,0x8e, + 0xdb,0xfd,0xdd,0x7a, 0xd7,0x45,0x01,0x77, 0xba,0xe3,0x1b,0x21, 0x50,0x12,0xf3,0x0c, + 0x00,0xa1,0x08,0x83, 0x95,0x4e,0x2d,0xe9, 0x8a,0x54,0x55,0x10, 0x79,0x6c,0xed,0xf5, + 0xf4,0xdf,0x5f,0x4f, 0x58,0xac,0x95,0x3c, 0x0e,0xde,0xbd,0xca, 0xd5,0x0e,0x71,0x09, + 0xaa,0xed,0xed,0x8c, 0xf4,0x70,0x4f,0x38, 0x48,0x29,0x1a,0x96, 0x9b,0x69,0x2d,0x5b, + 0x57,0x20,0x8c,0xd9, 0x30,0xde,0x52,0xe9, 0xc3,0xb8,0x96,0xe7, 0x97,0xd6,0xb6,0x18, + 0x00,0x84,0x26,0x18, 0x44,0x0c,0x24,0x4c, 0x1a,0xd3,0xaf,0x21, 0xd7,0xa8,0xbd,0xa0, + 0x2e,0xd6,0xbb,0x82, 0x41,0x3c,0xad,0x37, 0x8d,0x2c,0xa8,0x1b, 0x99,0xa9,0x3c,0x10, + 0xce,0x14,0x51,0xb4, 0x92,0xc2,0xf7,0x56, 0xab,0x20,0x37,0x29, 0xec,0xb1,0x6c,0x91, + 0x83,0x0e,0x8e,0x38, 0x0f,0xa7,0xe1,0x78, 0x69,0x44,0x4a,0x83, 0x1b,0xdf,0x3d,0x74, + 0x98,0x20,0x70,0xf5, 0xf4,0x77,0x79,0xe3, 0x4b,0x3d,0xf1,0x03, 0x62,0x29,0x33,0x81, + 0xd5,0x94,0xa6,0x61, 0x1b,0xea,0x69,0x55, 0x9d,0x52,0xe5,0x9d, 0xfd,0x5a,0x64,0x23, + 0x58,0xb7,0x6c,0x65, 0x14,0x4c,0xc6,0xb3, 0xb1,0xe0,0x6f,0xe2, 0xbe,0x1d,0xf5,0x77, + 0x92,0xb7,0xf9,0xaa, 0x46,0xb7,0x8d,0x26, 0x1c,0x99,0x2a,0xff, 0xe7,0x4e,0xb2,0xc9, + 0xd9,0xb1,0x35,0x13, 0x5c,0x86,0x0d,0xe1, 0x97,0x20,0x80,0x46, 0x71,0x25,0x9e,0x60, + 0x68,0xd3,0x66,0xae, 0x28,0x6b,0x42,0xc3, 0x3e,0xcd,0x1a,0x69, 0x27,0x10,0x43,0x50, + 0xfc,0xf6,0x14,0x67, 0x5c,0x2c,0xf3,0x5b, 0x36,0x22,0x91,0xd8, 0xa6,0x02,0x18,0x59, + 0x78,0xad,0x14,0x34, 0x81,0xb2,0x43,0x86, 0x92,0x21,0x81,0xbc, 0x74,0x69,0x68,0x96, + 0xde,0xf2,0x52,0x0c, 0xac,0xba,0xc4,0x8d, 0x74,0xec,0xc9,0xa6, 0x59,0x68,0xb2,0x0d, + 0x36,0x0a,0xb3,0x52, 0x62,0x46,0x1b,0x24, 0x42,0x6f,0x4a,0x22, 0x49,0x9b,0xd8,0x52, + 0xe0,0x5b,0xad,0xbd, 0xdf,0xd4,0xb0,0x04, 0x94,0x07,0x20,0xab, 0x62,0xdf,0xa9,0xaa, + 0x31,0x80,0xa2,0x20, 0xdb,0x10,0x60,0xf1, 0x89,0x44,0xd9,0x60, 0xfb,0xeb,0x28,0x06, + 0xd7,0xdb,0x45,0xa0, 0x5d,0xc9,0x18,0x0e, 0x12,0x98,0xfb,0x09, 0x92,0x8e,0xc1,0x12, + 0x72,0x64,0x9e,0xd0, 0x52,0xc9,0xae,0xdb, 0x93,0x99,0xa7,0x47, 0x90,0xe0,0xbf,0x41, + 0x1e,0x81,0x7c,0xdd, 0xed,0x73,0xa8,0x9f, 0x27,0x9a,0xa0,0x93, 0xa6,0xbd,0x5e,0x34, + 0xef,0x23,0x78,0xd1, 0x8c,0xa0,0x81,0xd9, 0x05,0x10,0x06,0x82, 0x04,0xa6,0x80,0x39, + 0x88,0x2d,0x81,0xc9, 0x1e,0xd7,0x5c,0x13, 0x35,0xf1,0x6a,0xeb, 0x1e,0x79,0xb4,0x54, + 0x7a,0xac,0x2d,0xfb, 0xf7,0x87,0x95,0x2a, 0xd7,0xb2,0x02,0x3e, 0x7d,0x45,0x61,0xb9, + 0xe0,0xab,0x7a,0x86, 0x72,0xee,0x25,0x76, 0x67,0x62,0x73,0x73, 0x28,0x92,0x84,0xd9, + 0x7d,0xc6,0x92,0x19, 0xbd,0xd7,0x7c,0x90, 0x07,0x8a,0x97,0x5f, 0x9e,0xe1,0xa7,0x3f, + 0xa6,0x17,0x9f,0xbf, 0x84,0xb8,0xef,0x0d, 0x7c,0x55,0x88,0xe7, 0xb2,0xc1,0x83,0xa7, + 0xfe,0x67,0x64,0x79, 0x47,0x5d,0x35,0x6e, 0x87,0xac,0xc5,0xe4, 0xd3,0x76,0x93,0x2d, + 0xb1,0x89,0xd3,0x46, 0x96,0xa5,0x5d,0xb9, 0xae,0x24,0xcd,0xdb, 0x7b,0xf4,0xed,0xda, + 0xb0,0xe7,0x27,0xcb, 0x49,0xbb,0x1c,0x01, 0x69,0x00,0x18,0x9a, 0x31,0x85,0x81,0xc1, + 0x86,0x74,0x3b,0xd8, 0xfb,0x65,0x9a,0x9a, 0x16,0x76,0xf7,0x03, 0x71,0x45,0x89,0xef, + 0x37,0x98,0x1d,0x6d, 0xa8,0xaf,0x14,0x8d, 0x35,0x56,0x76,0x73, 0xb2,0x48,0x41,0xe0, + 0x30,0x4c,0x19,0xa6, 0x77,0x0a,0xa2,0x50, 0xf8,0xd8,0xea,0xfb, 0x67,0x1a,0x45,0xd8, + 0x0e,0xa8,0xc1,0x7b, 0x72,0xc5,0x1a,0x2e, 0x9c,0xc1,0x7a,0xe2, 0xfb,0x0f,0x13,0x66, + 0x7e,0xd1,0x02,0x44, 0x41,0x22,0x9b,0x02, 0x4b,0x6d,0x79,0xd2, 0x58,0xe8,0x42,0x48, + 0x3b,0x99,0xed,0xed, 0xec,0x32,0x73,0x65, 0x25,0x50,0x4d,0x70, 0xa6,0xea,0x60,0xc0, + 0xfd,0xfb,0xe5,0xf9, 0xe4,0x1f,0x76,0x47, 0xee,0x59,0x77,0x10, 0x15,0xad,0x7e,0x9f, + 0x56,0x8a,0x0a,0xd8, 0x87,0x37,0x8b,0xa6, 0xbc,0xb3,0x14,0x49, 0xc4,0xa9,0x87,0x50, + 0x92,0x0a,0x1a,0x0b, 0x40,0x78,0x71,0xd9, 0x98,0x2e,0xd2,0x82, 0x6f,0x47,0x42,0xa9, + 0x29,0x52,0x5b,0x78, 0x5d,0x24,0x52,0xc2, 0x1c,0xc8,0x17,0x0b, 0x18,0x81,0xc8,0x38, + 0xa3,0x13,0x51,0xc7, 0x7d,0x7c,0x26,0x90, 0x8a,0x55,0x31,0x0e, 0x1e,0x55,0x48,0x2f, + 0x60,0x70,0xf8,0x46, 0xe3,0xf4,0xe2,0xd9, 0x39,0x58,0xee,0xe9, 0x11,0x83,0x4b,0xee, + 0x3b,0x24,0xb5,0xcd, 0xeb,0xa7,0x02,0xf2, 0xe7,0x62,0xa4,0x14, 0x1e,0x99,0xd0,0x48, + 0x6c,0x63,0x5e,0x10, 0x33,0x1c,0xbf,0x0f, 0x8e,0x83,0xfc,0x3e, 0x55,0x30,0xd2,0xd2, + 0x0d,0x1d,0x5b,0x59, 0x7c,0x76,0xf6,0x33, 0x33,0xb6,0xe7,0xd6, 0x23,0xc4,0x8c,0xc1, + 0x24,0xa9,0xd0,0x6f, 0x45,0xd1,0xd6,0x45, 0x0d,0x4c,0xfe,0x13, 0x82,0x05,0xf5,0xc8, + 0x0a,0x95,0x21,0xd3, 0x82,0xd0,0x54,0x40, 0x57,0x5a,0x6d,0x47, 0x69,0x49,0x19,0x6f, + 0xd0,0xb9,0xf0,0x71, 0xdf,0xb4,0x50,0x60, 0xf1,0x8e,0x32,0x4b, 0xab,0xe5,0x46,0x46, + 0x89,0x42,0x43,0x96, 0x3e,0x52,0xab,0x58, 0x72,0x2f,0x7a,0x2b, 0xb3,0x3e,0x8d,0x69, + 0x2a,0xed,0xb3,0xd1, 0x7b,0x7c,0xe6,0x77, 0x20,0x5f,0x3d,0xf9, 0x1c,0x3e,0x4a,0x80, + 0x1c,0x99,0x54,0xc4, 0xdc,0xcb,0xb8,0xcf, 0x23,0x14,0x3a,0xa0, 0xf5,0x86,0x3b,0x4a, + 0xd8,0xa0,0xf8,0x0a, 0x06,0x7e,0xca,0xe0, 0x29,0x8b,0xc9,0x54, 0xc3,0x20,0x5f,0x21, + 0x47,0x26,0x2b,0xb2, 0x29,0x15,0x15,0xdc, 0x8b,0x20,0x43,0x12, 0xa0,0x4b,0xb1,0x2f, + 0x85,0x05,0xa8,0x6a, 0xc9,0xa1,0xd6,0xcd, 0x49,0x7d,0x40,0x85, 0x79,0x87,0x12,0x63, + 0x1f,0x21,0x1a,0x89, 0x66,0x18,0x49,0xa6, 0xd8,0x34,0x60,0xc0, 0x59,0x61,0x9b,0xb7, + 0x77,0x22,0x97,0x53, 0x44,0x02,0x33,0xa2, 0x14,0x28,0x90,0x38, 0x54,0xc5,0x92,0x88, + 0x59,0x69,0x1a,0x4d, 0x7c,0x2c,0x5a,0x9b, 0x0b,0x29,0x40,0xb1, 0x8e,0xa3,0x00,0x30, + 0xbc,0xd3,0xe2,0x2f, 0x65,0x96,0x52,0x39, 0x24,0x94,0x5d,0x72, 0xf6,0x15,0x9a,0xd5, + 0xea,0x73,0x8d,0x66, 0x5d,0x19,0xa8,0x39, 0xf7,0x29,0x70,0x96, 0x1a,0xac,0x92,0x26, + 0xf1,0x5a,0x56,0xd0, 0xd2,0x60,0xb3,0x20, 0xa1,0x42,0x90,0xbc, 0x83,0xbd,0xf2,0xca, + 0x38,0xa4,0x82,0x88, 0x95,0x9c,0x7b,0x31, 0xba,0x6c,0x4c,0x49, 0xe6,0x70,0x67,0xc8, + 0xfb,0xf8,0xb0,0xe5, 0xe7,0xd1,0xad,0xaa, 0xcb,0xf4,0x66,0x42, 0xc6,0x9d,0x70,0x71, + 0xc2,0xd7,0x25,0x01, 0x31,0x1c,0x08,0x36, 0xb7,0x2e,0xa6,0x42, 0x30,0x30,0xbb,0xa4, + 0x6d,0x6b,0x62,0x33, 0x68,0x58,0x8b,0x34, 0xfa,0xaa,0xe8,0xe9, 0x8b,0x2f,0xa6,0x6c, + 0xa7,0x77,0x0d,0x8d, 0xd9,0xfb,0x25,0xd3, 0xd7,0xc6,0x03,0xe9, 0x7b,0x9d,0x36,0xd1, + 0xee,0x57,0x3c,0x8b, 0x84,0x69,0x5f,0xc7, 0xd2,0x1a,0xcc,0xee, 0xee,0x7e,0x47,0x8b, + 0x49,0x3c,0x3e,0x46, 0xed,0x92,0xc0,0xee, 0x12,0x41,0xac,0xfd, 0xff,0x6d,0xf3,0xe2, + 0x2e,0x57,0x55,0xbb, 0x71,0xcf,0x3f,0xb8, 0x94,0x54,0x44,0xee, 0x76,0x22,0x46,0x3c, + 0x67,0x91,0x25,0x26, 0x25,0x84,0x21,0x16, 0x9f,0xa8,0x56,0xa5, 0xda,0xb7,0xd4,0xd5, + 0xe2,0x28,0x33,0xf9, 0xec,0xf9,0x54,0xa5, 0x22,0x7b,0xff,0x6f, 0x6b,0xb1,0xbe,0xec, + 0xab,0xf6,0x7b,0x93, 0x03,0x02,0x92,0x22, 0x2b,0x6a,0xda,0x03, 0x09,0x81,0xcf,0xb4, + 0x71,0x46,0xb8,0xc9, 0xf2,0xdf,0xd6,0x50, 0x78,0x9e,0x36,0xe8, 0x7c,0x8e,0xb4,0x00, + 0xd6,0x06,0xee,0x20, 0x23,0xde,0xca,0xb7, 0x34,0xd9,0x98,0x2b, 0xa5,0x8a,0xc4,0x92, + 0x41,0xef,0x6a,0x05, 0x4c,0xed,0xbe,0x50, 0xb8,0xf5,0xfc,0x88, 0x66,0x7e,0x3b,0x80, + 0x43,0x8e,0xfa,0x81, 0xac,0x81,0x64,0x89, 0x64,0x03,0x0b,0xf9, 0xf8,0x81,0xb5,0xa4, + 0x39,0x14,0x97,0xf3, 0xa7,0xd0,0x49,0x10, 0x22,0x2f,0xb2,0xe1, 0xb3,0xf6,0x23,0xaf, + 0xc9,0xdf,0xdc,0xd4, 0x35,0x5d,0xe0,0xd7, 0x34,0x6d,0x64,0x2e, 0x1a,0x90,0x5f,0xaf, + 0xc2,0x5e,0xd7,0xb7, 0x7e,0x60,0x5b,0xf5, 0x7d,0x6f,0xe5,0x3e, 0x42,0x9b,0xbb,0x16, + 0x24,0x44,0xc3,0x89, 0x70,0xc3,0x97,0x5d, 0x4c,0xf9,0x27,0x87, 0x14,0xc9,0xc2,0xa3, + 0x78,0xc1,0x85,0x5d, 0xbe,0x93,0x1b,0xf3, 0x10,0x0d,0x29,0xb0, 0x45,0x49,0x22,0xc9, + 0x1b,0x48,0x80,0xcb, 0xde,0x1d,0x6c,0xda, 0xe5,0x18,0xb9,0xa6, 0x8e,0x5e,0xe0,0xdb, + 0x6e,0x0f,0x68,0x35, 0x26,0xb8,0x03,0x18, 0xd7,0x37,0xd3,0x41, 0x3c,0xe2,0xb9,0x83, + 0xb9,0xd2,0x50,0xb1, 0x97,0x05,0x75,0xba, 0x7a,0xb4,0x57,0x87, 0xd1,0x6b,0x24,0xb9, + 0x9b,0x1d,0x70,0x98, 0xa4,0xd9,0xd9,0x38, 0x86,0x27,0x43,0x9c, 0x88,0x85,0x6f,0x80, + 0xed,0x0a,0x86,0x91, 0xae,0xd3,0x75,0xb9, 0x37,0xec,0xa3,0x34, 0x44,0x2c,0xd8,0xea, + 0x18,0x75,0xcd,0x53, 0x7d,0x9f,0xe7,0xf8, 0x3a,0xf2,0x93,0xc5, 0x62,0xf5,0xeb,0x59, + 0xd3,0x68,0xf3,0x9a, 0xfa,0x8b,0x7c,0x5c, 0xa4,0x85,0xc4,0xb4, 0xa6,0x71,0x70,0x91, + 0x4b,0x30,0xe7,0x61, 0x96,0x74,0xe5,0x13, 0xcb,0xa6,0x93,0x62, 0x7e,0xfa,0x7b,0x8a, + 0xf1,0xd6,0x72,0xa5, 0x24,0x95,0xd8,0x21, 0x37,0x7e,0xa0,0xf7, 0x81,0x80,0x62,0x95, + 0x5e,0x1c,0x4e,0x46, 0x17,0x17,0x00,0x9b, 0x00,0xa8,0x0c,0xf9, 0x54,0x47,0x83,0x9d, + 0xac,0xe2,0xad,0x19, 0x38,0xd6,0x55,0x30, 0x76,0x0a,0x51,0xf3, 0x2e,0xdc,0xf4,0x15, + 0x4e,0x8e,0x10,0xac, 0x7d,0x0b,0x39,0xe6, 0x40,0xf4,0xaf,0xc4, 0x54,0xaf,0x42,0x1b, + 0xd6,0x8b,0xb6,0x6d, 0x4c,0x4a,0xf1,0x1b, 0x75,0x8a,0xfd,0xdc, 0xea,0xa3,0x48,0xe7, + 0xa4,0xb4,0x4c,0xbb, 0x85,0xad,0x7a,0xaa, 0xd8,0x9f,0x19,0x93, 0x54,0x54,0x36,0xdf, + 0xae,0xb0,0x75,0x83, 0x2a,0xb6,0x4a,0xc0, 0xc0,0x67,0x35,0xce, 0xfc,0xe3,0x84,0x87, + 0x78,0x68,0xe9,0x4c, 0x10,0x94,0x13,0x8e, 0x5d,0xb6,0xb7,0x7c, 0x5e,0x3f,0x33,0x56, + 0x66,0x7c,0xce,0xb2, 0xbe,0x53,0xb1,0xed, 0xc0,0xc2,0x18,0x8e, 0x0c,0x7d,0x76,0xb1, + 0xf0,0x9d,0x7a,0xbd, 0xc5,0xbe,0xbf,0xcd, 0x9f,0xa6,0xc0,0x46, 0x16,0xa5,0x92,0x92, + 0x53,0x6b,0xc5,0xfd, 0x7a,0x8c,0x1b,0xb6, 0x4f,0xb2,0x20,0x00, 0x80,0x4a,0x9e,0xaf, + 0xb7,0xea,0xb1,0xe9, 0xa4,0xac,0xc2,0x1a, 0x40,0xd0,0x37,0xa1, 0x64,0x0c,0x1b,0x49, + 0x26,0x09,0xfc,0x8a, 0x11,0x4a,0x86,0xdc, 0xa2,0x6e,0xfa,0x86, 0x24,0x22,0x14,0x4e, + 0x17,0xf6,0xab,0x03, 0x4a,0x73,0x77,0x33, 0x85,0x54,0xcd,0x2a, 0x27,0x77,0x6d,0xb3, + 0x3d,0xa6,0xde,0xaa, 0xb1,0x26,0x7e,0xbc, 0x46,0xf6,0x21,0x9e, 0xdb,0xcc,0xc5,0x08, + 0xb8,0x55,0x66,0x58, 0x38,0x20,0x92,0x33, 0x85,0x31,0xd5,0x19, 0xf3,0x00,0xd5,0x38, + 0xaa,0x65,0xc4,0x4f, 0x58,0x99,0xf5,0x20, 0xa5,0x40,0x3e,0x41, 0xd0,0x10,0x81,0xe0, + 0x11,0x80,0x5b,0xb3, 0x60,0xf3,0x15,0x5e, 0xb8,0xe0,0x2e,0x0b, 0xe3,0xad,0xc9,0xcb, + 0x88,0x3c,0x01,0x45, 0x35,0xbd,0x52,0x41, 0xe2,0x2c,0x83,0xd1, 0x2a,0x0a,0x0b,0x86, + 0xc1,0xd2,0xf4,0xd4, 0x0c,0x2b,0xe2,0x54, 0x10,0x74,0x91,0xb3, 0x5f,0x73,0xd1,0xec, + 0x50,0x77,0xc4,0x00, 0xd6,0x15,0xf9,0x0c, 0x25,0x28,0x42,0xb0, 0xc0,0x95,0x82,0x39, + 0x3f,0x5e,0x37,0xb3, 0xf5,0x64,0x8f,0x09, 0x84,0x86,0x89,0xb4, 0x90,0xd8,0x8c,0x38, + 0x84,0x1b,0xca,0xf2, 0xbe,0x99,0x88,0x55, 0x47,0xb5,0x8a,0x65, 0xb7,0x3f,0x65,0x49, + 0x17,0xcc,0x0f,0x25, 0xd1,0xa8,0x2b,0x66, 0x73,0xa7,0xa1,0x4f, 0x3c,0x70,0x4b,0xa9, + 0x59,0x62,0x1d,0xb3, 0x2c,0x2c,0xc9,0xbc, 0xf1,0xec,0x8f,0x39, 0x69,0xe6,0xd5,0xd8, + 0xec,0xc1,0x24,0x19, 0x66,0x99,0xa6,0x9e, 0xeb,0x66,0x0e,0x08, 0xa1,0xbe,0x0b,0x09, + 0xc1,0x72,0x4d,0x3b, 0xea,0xe8,0x34,0x8d, 0xee,0x83,0x48,0xab, 0xb8,0xaa,0x9b,0xe7, + 0x52,0x08,0x44,0xd8, 0x07,0x48,0xa0,0xf6, 0xa6,0xb8,0x50,0x86, 0xb5,0xb4,0x86,0x7c, + 0x26,0x0c,0xc5,0xef, 0xa3,0xa2,0x27,0x2e, 0x8a,0x10,0x40,0x92, 0x0a,0x16,0x6e,0xb9, + 0xdc,0x64,0xd6,0xa3, 0xe7,0x03,0x22,0x2f, 0x30,0x53,0xe9,0x9d, 0x9b,0xbc,0x36,0x38, + 0x31,0x37,0x73,0x61, 0x40,0x68,0x1a,0x0d, 0xcb,0x3b,0x8a,0x3a, 0x7a,0xd7,0x02,0xac, + 0x45,0xb2,0x4e,0x1e, 0x9c,0xd9,0xc2,0x25, 0x6e,0xac,0x29,0x93, 0xbb,0xbd,0x2e,0x91, + 0x35,0x54,0x3a,0xa1, 0x7e,0x96,0x8a,0x65, 0x3b,0x44,0xc2,0xbe, 0x27,0x19,0x9a,0x98, + 0x2a,0x96,0x6a,0x25, 0x28,0x07,0xb2,0xae, 0x12,0x4a,0xa6,0x90, 0x30,0x14,0xe1,0xf6, + 0x7f,0x8c,0xde,0x68, 0xa0,0x14,0x21,0x01, 0xbf,0x65,0xe7,0x19, 0x51,0x0d,0x1d,0x92, + 0x84,0x9d,0xfc,0xc8, 0x7c,0xda,0x2b,0x11, 0x78,0x82,0x52,0x24, 0xd5,0x10,0x55,0x20, + 0xe0,0x0e,0x27,0xd3, 0x95,0x4c,0x52,0x65, 0xf8,0x7e,0xb6,0x75, 0x2d,0x24,0x58,0x68, + 0x50,0xb4,0x6b,0x8a, 0x4b,0xcc,0x74,0x44, 0x09,0xb5,0x5d,0x76, 0x5e,0x42,0xb7,0x77, + 0xba,0x60,0x2c,0x89, 0x24,0x1d,0x09,0x1f, 0x18,0xf7,0x68,0x89, 0xeb,0x4a,0x0e,0x51, + 0xbf,0xd5,0xf2,0xf9, 0x69,0x87,0xad,0xc4, 0xa0,0x16,0x19,0xf5, 0xfe,0xcf,0x03,0xb1, + 0x05,0x7c,0xef,0xda, 0xd3,0x5c,0x6f,0x72, 0xb4,0xd9,0xdc,0x3b, 0xb2,0x6f,0xb7,0x45, + 0xdf,0x32,0x2d,0xaf, 0x8c,0xc3,0x2a,0x38, 0x4a,0x2f,0x8c,0x51, 0xec,0x63,0x0b,0x9b, + 0x22,0xaa,0xf3,0x74, 0xb7,0xec,0x8d,0x54, 0x09,0xa9,0x46,0x42, 0xb0,0x6e,0x70,0x65, + 0x65,0x49,0x60,0x00, 0xe3,0x9d,0xc1,0x03, 0x6f,0x35,0xf7,0xf2, 0x2e,0x76,0x94,0x89, + 0xc9,0x3d,0xb5,0xbb, 0xdf,0x32,0xfc,0x2c, 0xeb,0x2a,0x1e,0x05, 0x77,0x13,0x01,0x45, + 0x07,0x14,0xe1,0x5b, 0x79,0xb3,0x77,0x15, 0x28,0x40,0x01,0xea, 0xfb,0x02,0x20,0x94, + 0xab,0xc9,0xb8,0x73, 0x8c,0xcc,0xa6,0x37, 0x42,0x49,0x6a,0x1a, 0x8d,0x30,0x11,0x36, + 0x15,0x96,0x65,0x10, 0x92,0xef,0x58,0x85, 0xf2,0xa8,0x8d,0x52, 0x66,0x63,0x3e,0xcc, + 0xec,0x51,0x7c,0x86, 0x5c,0x77,0xb8,0x9e, 0xd5,0xf1,0x75,0xe1, 0xf3,0x5b,0x8d,0xd1, + 0xa4,0xb1,0xad,0x33, 0x50,0x1a,0xc9,0x8a, 0xb7,0x10,0x9b,0xa4, 0x84,0xdd,0x40,0x0a, + 0x10,0x98,0xd8,0x6e, 0x47,0xaa,0x25,0x53, 0xb5,0xdb,0x5d,0xe0, 0x56,0x33,0x97,0x80, + 0xa5,0xf5,0x83,0x63, 0x35,0x72,0x81,0x7c, 0xbc,0x7e,0x5e,0xfe, 0x69,0x54,0xc5,0xe6, + 0x0e,0xd8,0xb3,0x6e, 0x75,0x16,0xa0,0x16, 0x63,0x5f,0x40,0x94, 0xb1,0x9f,0x51,0x2a, + 0x7d,0x85,0x69,0x6a, 0xa2,0x01,0x1a,0x96, 0x88,0x7e,0xdd,0x81, 0x0d,0x05,0x9c,0xa1, + 0x35,0xbb,0xc4,0x64, 0xfb,0x19,0x70,0xe5, 0x8b,0x4c,0x2f,0xe9, 0xaf,0x06,0x8d,0xab, + 0x4d,0x1c,0x40,0xc0, 0xc1,0x70,0xc4,0x67, 0x06,0x7c,0xce,0xe6, 0x04,0xb0,0x72,0xf4, + 0x92,0xc2,0x66,0x3d, 0x0a,0x4c,0x96,0x23, 0x57,0x52,0x84,0x1f, 0xb9,0xa5,0x2d,0x0c, + 0x50,0xc4,0x76,0x23, 0xd3,0x9b,0x35,0x15, 0x6c,0x2a,0x6c,0x96, 0x42,0x9d,0x91,0xce, + 0x28,0x2d,0x2f,0xa4, 0xb7,0x37,0x03,0xea, 0x7f,0x77,0x0b,0x0e, 0xae,0x1b,0x13,0x52, + 0x6e,0x62,0x3f,0x9b, 0xa3,0xc8,0xd6,0x4f, 0x2a,0x42,0x6f,0x88, 0xc6,0x11,0x98,0x85, + 0x70,0x66,0x88,0x93, 0x26,0xb1,0x2c,0xdd, 0x3a,0x58,0x75,0x0a, 0xd9,0xc2,0x7f,0x0b, + 0x4a,0x2d,0xf5,0x17, 0x50,0xdb,0x7d,0xf6, 0x3f,0xed,0xf2,0x53, 0x15,0x8a,0xb1,0x3f, + 0xc7,0xc0,0xfa,0xda, 0x09,0xe4,0x22,0xdb, 0xe4,0x4a,0xa8,0xb8, 0x46,0x2e,0x97,0x83, + 0xf7,0x6b,0x71,0xbc, 0x15,0x32,0x17,0xd7, 0xb6,0x9d,0x94,0xdb, 0x99,0x7e,0xf5,0x10, + 0x84,0xa5,0x1a,0x3a, 0x2c,0xab,0x5b,0x7c, 0xca,0x1d,0xb5,0x1c, 0xb6,0x73,0x5a,0x33, + 0x2c,0x13,0x81,0xa7, 0x44,0xc8,0x01,0x3c, 0x5e,0x5f,0xfa,0x29, 0xd6,0x4a,0xdc,0xee, + 0x97,0x06,0x70,0x45, 0xd3,0x32,0x83,0x93, 0xf2,0x3a,0x0e,0x62, 0x6b,0x49,0x03,0x90, + 0x68,0xaa,0x21,0x75, 0xc7,0x3d,0xf8,0x11, 0xb1,0x33,0x8c,0xfb, 0x07,0x30,0x70,0xbc, + 0xaf,0x5c,0x43,0x01, 0x84,0x14,0x73,0x7a, 0xbc,0x09,0x4e,0x87, 0xa5,0xec,0x6f,0xda, + 0x79,0x0a,0x2f,0x0b, 0x10,0xc2,0x58,0x6d, 0x30,0x85,0xb2,0x86, 0xe0,0xc2,0xc4,0x70, + 0xad,0x09,0x36,0xeb, 0x81,0x46,0x41,0x90, 0xf1,0x6a,0x4a,0x4e, 0xb5,0x5a,0x6e,0x34, + 0x0f,0xe0,0x83,0x1f, 0xd4,0xc5,0xac,0xda, 0x4d,0x9a,0xf0,0x3e, 0x9a,0x4f,0xea,0x89, + 0xc1,0x46,0xf7,0xc5, 0x57,0xb3,0x15,0xd1, 0x7e,0x7f,0xe8,0x42, 0x2c,0x26,0x4c,0xd2, + 0x55,0x79,0xe2,0xde, 0x9c,0xe4,0x6d,0x51, 0xa7,0x47,0x07,0x42, 0x80,0x14,0xe7,0x39, + 0x24,0x84,0xb5,0x3e, 0xc8,0xae,0xf0,0xb8, 0xb7,0x18,0xa4,0xf5, 0xd8,0x0a,0xed,0xa2, + 0xcb,0x4a,0x7c,0x8c, 0x21,0x5f,0x4e,0x0c, 0xe7,0xfd,0x6f,0x67, 0x30,0x54,0xbc,0xa7, + 0xb8,0x68,0x56,0xbe, 0x9e,0xa2,0x57,0x5f, 0xbb,0x2a,0x94,0x1c, 0xa6,0xd6,0x0d,0x2b, + 0x0a,0xba,0x7c,0x1e, 0xce,0x41,0xd9,0xe8, 0xa1,0xb2,0xf5,0x8b, 0xc9,0xa6,0x00,0xbe, + 0x6b,0x1d,0x90,0xd2, 0x31,0xc7,0x78,0xd1, 0x8c,0xff,0xf7,0x66, 0xcc,0xb5,0x4c,0x2b, + 0xe2,0xc2,0xef,0x58, 0x5a,0x7d,0x23,0x56, 0xf0,0xb8,0xf9,0x24, 0x68,0xb2,0xe3,0xd9, + 0x56,0x80,0x42,0xa9, 0xa4,0xb1,0xec,0xc0, 0x96,0x03,0x0b,0x2d, 0x2a,0x5a,0xf7,0xdd, + 0x6c,0x14,0x30,0xac, 0xd6,0x89,0xd2,0xd1, 0x23,0xe5,0x42,0x26, 0xc5,0xd6,0xb0,0x33, + 0xcd,0x58,0xe2,0x6f, 0x15,0x76,0x8d,0x4b, 0x74,0x65,0x04,0x88, 0x97,0x11,0xbb,0x68, + 0xd4,0x1a,0xe5,0xbf, 0xf8,0xfa,0xea,0x3d, 0x9f,0x70,0xb6,0x88, 0x29,0xcc,0xea,0x75, + 0x9d,0xfc,0x4a,0xc9, 0x13,0x82,0x35,0xf2, 0x83,0x49,0x11,0x1a, 0xe5,0x04,0xb4,0x5a, + 0x99,0x48,0x79,0x89, 0xca,0xb3,0xb7,0x26, 0x83,0x3c,0xd8,0x20, 0x00,0x95,0x7d,0x85, + 0xb4,0xbb,0x9e,0xff, 0x6b,0x39,0x38,0x2e, 0xd3,0x2f,0x9c,0x28, 0xfc,0xac,0xb4,0x93, + 0x0a,0x86,0x0c,0x76, 0xfe,0x69,0x9f,0x77, 0xf9,0xdb,0xc9,0xaf, 0x16,0x32,0xd7,0xb8, + 0x88,0xc2,0x86,0x0f, 0x01,0x04,0x89,0x36, 0x3b,0xba,0x09,0x58, 0x59,0x35,0x54,0xf1, + 0x37,0x12,0xeb,0x20, 0x7f,0xb2,0x2f,0x59, 0x67,0x0f,0x24,0x07, 0x1d,0xfe,0x77,0x7e, + 0x08,0x6b,0xd4,0xaa, 0x88,0xa8,0x59,0x0c, 0xba,0x69,0x4b,0x86, 0x42,0x92,0xd3,0xd0, + 0x64,0x90,0xbc,0x2b, 0xb6,0xce,0x64,0x90, 0x8c,0xb2,0xca,0x6e, 0x1a,0x1f,0x30,0x28, + 0xb3,0x9b,0x40,0x30, 0xc7,0x9f,0xb7,0x78, 0x4a,0x13,0x72,0x06, 0x2d,0xe9,0xe9,0x8f, + 0x9b,0x1d,0x54,0x6d, 0x71,0x5e,0x49,0xe5, 0xd7,0xe2,0x9f,0x3a, 0x3b,0x4f,0xbf,0x75, + 0xbf,0x35,0xf9,0x55, 0x21,0x25,0xa9,0xf4, 0x76,0x32,0x0f,0x98, 0xc2,0xf9,0xf6,0x2d, + 0x23,0x96,0x67,0xd1, 0x68,0x44,0xda,0x48, 0xc9,0x62,0xfb,0x8d, 0x1a,0x47,0xdd,0x3e, + 0xc1,0xa3,0x15,0x8a, 0x96,0xb2,0x98,0xb4, 0xe5,0x98,0x12,0x4a, 0x8b,0x50,0x8e,0x4c, + 0xb5,0x01,0xbb,0x00, 0x68,0xbe,0x4d,0x72, 0x6c,0x48,0xc8,0x76, 0xf0,0xe1,0x56,0x07, + 0xe4,0x16,0xe7,0x98, 0x37,0x14,0x4f,0xd4, 0xd5,0x53,0x9f,0x97, 0xf2,0xbd,0xa9,0xed, + 0x61,0x47,0xab,0xfa, 0xfb,0x4f,0xc5,0xf5, 0x2c,0x77,0x35,0x85, 0xbd,0x13,0xff,0x06, + 0xdb,0x62,0x42,0x0b, 0xa7,0x7c,0x06,0xb9, 0x01,0x31,0x19,0xcd, 0x47,0x7d,0xf4,0x71, + 0x05,0x95,0x68,0x43, 0xd7,0x82,0xaa,0x1a, 0xcf,0xd4,0xe0,0x36, 0xba,0x7d,0x5d,0x69, + 0x70,0x50,0xe5,0x15, 0x4c,0x05,0x0f,0xd7, 0x6d,0x2a,0xb2,0x70, 0xb0,0x85,0xed,0x1b, + 0x3e,0xb6,0x2c,0x70, 0x72,0xf9,0x12,0x38, 0xbf,0x8e,0x57,0xa0, 0xfd,0x08,0xad,0xbd, + 0x30,0xc2,0x4e,0x7f, 0x58,0x1a,0xd2,0x89, 0x4a,0xcb,0x9b,0x5b, 0x0c,0x08,0x0f,0x01, + 0xb6,0x19,0x6c,0x45, 0x66,0x83,0x6c,0xc3, 0x6a,0xd2,0x24,0xf5, 0x4d,0x23,0xb1,0x61, + 0x0c,0xf9,0xa4,0xf4, 0x06,0x00,0xc6,0xad, 0x6c,0x69,0x60,0xc7, 0x30,0xde,0x4c,0x16, + 0x96,0x30,0x0c,0xfe, 0x37,0xda,0xc7,0xd4, 0x12,0xb3,0x92,0x4e, 0x5d,0x5b,0xab,0x16, + 0xd5,0xc3,0x23,0x05, 0x9a,0x3f,0x8a,0xcb, 0xf6,0x68,0xb2,0x60, 0x98,0xcf,0xf4,0x65, + 0x1d,0xe4,0xf6,0xfa, 0x2a,0x10,0x79,0x2c, 0x57,0x4c,0xfd,0xfc, 0x97,0x57,0x23,0x92, + 0xda,0x6d,0xe4,0x05, 0x94,0xc4,0x91,0xf0, 0xd8,0x1d,0xb7,0x76, 0x68,0x24,0x6a,0xfd, + 0xcc,0x5e,0x32,0xa1, 0xbb,0x3b,0x19,0x08, 0xe4,0x01,0x57,0xb3, 0xbc,0xf1,0x28,0x24, + 0x30,0xa5,0x88,0x33, 0x4c,0x93,0x43,0x69, 0x36,0xaf,0x99,0x65, 0xac,0xd9,0xf8,0x20, + 0xd4,0xbd,0xce,0xb6, 0x0c,0xab,0x90,0x1f, 0xfe,0xfc,0x97,0x5f, 0xcf,0x03,0x03,0x49, + 0x51,0x75,0x84,0x4d, 0x26,0x62,0xc3,0x8d, 0xe2,0x8f,0xf8,0xf6, 0xec,0xc4,0x8b,0xb6, + 0x59,0x9a,0x6d,0xe1, 0x29,0x58,0xa8,0x6e, 0x63,0x28,0x60,0x22, 0x25,0x08,0x32,0x74, + 0x75,0xf5,0xd7,0x6d, 0x1a,0x61,0x1b,0x85, 0xc0,0xfd,0x74,0xd6, 0x24,0x7a,0x97,0x90, + 0x5e,0xc5,0x82,0x32, 0x5c,0xf3,0xcd,0x7e, 0x21,0x92,0x60,0x1e, 0xfd,0xf8,0xde,0xf6, + 0x0f,0x8f,0xe0,0xf1, 0x84,0xa9,0x1a,0xff, 0xd7,0x23,0xc5,0xc8, 0x53,0x67,0x6c,0xf6, + 0x9a,0x98,0xb6,0xd7, 0x8f,0xa1,0x84,0x8f, 0xda,0xcd,0x56,0xb9, 0x42,0x97,0x81,0xb5, + 0x24,0x6a,0xff,0x9c, 0x0b,0x0a,0x53,0x91, 0x5a,0xe6,0x5e,0x4d, 0xd5,0x01,0x7a,0xc4, + 0xba,0x46,0x10,0x0c, 0xad,0x7f,0x29,0x59, 0xc5,0xf9,0x57,0xe4, 0xca,0x0c,0x7b,0xb9, + 0x7e,0x49,0xcb,0x98, 0xbb,0xf5,0xe9,0x14, 0xbe,0xe4,0x25,0xf9, 0x9a,0x30,0x9d,0x92, + 0x15,0x35,0x62,0xbf, 0xb1,0x17,0x08,0x6b, 0x8b,0x87,0x8f,0xd2, 0xed,0x9e,0xfc,0xaf, + 0xcd,0xc1,0x63,0x63, 0x59,0x63,0x27,0x52, 0xea,0x96,0xaa,0x80, 0x3c,0x92,0x9e,0xff, + 0x0e,0x7c,0x77,0x48, 0xcf,0x34,0x01,0xd5, 0x30,0xb5,0x93,0x79, 0x68,0xba,0xa2,0x8b, + 0xd8,0x84,0x36,0x9a, 0x45,0x87,0x05,0x9c, 0x83,0x7c,0x4c,0x9e, 0x54,0x7f,0xf6,0x85, + 0x35,0xaa,0xf3,0xde, 0xe3,0x4d,0xc9,0x7c, 0xf0,0x39,0x2e,0xce, 0x7d,0xff,0xec,0x7f, + 0xef,0x48,0xfa,0x9f, 0x0f,0xc8,0xaa,0x3d, 0x3f,0x90,0xdc,0x5a, 0x87,0x74,0x0f,0x11, + 0xcf,0x45,0x2c,0x9c, 0x7f,0x2e,0x3c,0x0f, 0x71,0x20,0x99,0x0e, 0xc4,0x8f,0xd0,0x63, + 0x88,0xb3,0xe4,0xe3, 0x97,0x13,0x41,0xbb, 0x96,0x7d,0x7e,0x6f, 0x30,0xf9,0xfd,0x03, + 0xf9,0x26,0xf0,0x47, 0x61,0x72,0xcb,0x1b, 0x2d,0x63,0x0a,0xe8, 0x03,0x95,0xac,0x0e, + 0x0b,0x3f,0x67,0x62, 0x5e,0x9f,0xa3,0x74, 0x53,0xdb,0xfc,0xc7, 0x9d,0xc7,0xdf,0xd3, + 0x4a,0x03,0x34,0xcd, 0xdb,0x41,0x81,0x4e, 0x0c,0x97,0x30,0xc2, 0xf7,0xd7,0xf1,0xe4, + 0x02,0xf5,0xbd,0x1c, 0x1b,0xec,0xcf,0xb7, 0xea,0x76,0x9a,0x2a, 0x5f,0x60,0x63,0xd6, + 0xd1,0xda,0x3d,0xc3, 0x17,0x9e,0xc4,0x6f, 0xc7,0xa9,0x6a,0x18, 0x8f,0xae,0xd2,0xe5, + 0x1e,0xeb,0x4f,0x19, 0x9d,0x5d,0xed,0x33, 0x20,0xa9,0x81,0x26, 0x46,0x53,0x86,0x53, + 0x5a,0x1c,0x01,0x44, 0xf9,0x53,0x8d,0x94, 0xbc,0xbd,0x64,0x06, 0xad,0x1f,0x22,0x74, + 0x7d,0x8b,0x9d,0x47, 0xf4,0xe9,0x54,0xf9, 0xbc,0x3f,0x4e,0xa5, 0xce,0xe1,0xc5,0x33, + 0x88,0x62,0x06,0x56, 0xbe,0x5d,0x2f,0x6a, 0xea,0x0e,0x10,0xf5, 0xf3,0xe5,0x3b,0xd6, + 0x53,0x3b,0x8b,0x8c, 0x21,0xd5,0x13,0x0a, 0x8a,0x0b,0x0c,0xb3, 0xb9,0x17,0xc8,0x21, + 0x40,0x60,0x61,0x50, 0x10,0x38,0xc6,0xff, 0x0d,0xbd,0x19,0x9d, 0x79,0xca,0x29,0x7b, + 0xd5,0x72,0x3c,0xaf, 0x87,0xe2,0x61,0xcf, 0x1f,0x3f,0xe9,0xab, 0x7d,0x0a,0xb6,0xf0, + 0xfe,0xe6,0x55,0x3e, 0x34,0xfd,0x22,0xe7, 0x4e,0x13,0xe4,0xd4, 0xf6,0x4c,0x5c,0x70, + 0x30,0x79,0x39,0x32, 0xf3,0xfd,0xf7,0x15, 0x1d,0x96,0x2e,0x74, 0x2d,0x77,0x2c,0x66, + 0xe2,0x64,0x5a,0xef, 0x98,0x89,0xe1,0xf5, 0x3c,0xf2,0x02,0x9c, 0xa0,0x3a,0x4f,0x7d, + 0x50,0xd6,0x22,0xa1, 0xf6,0x2f,0xf7,0xda, 0xbf,0x0b,0xac,0xa8, 0xd9,0x3d,0xab,0x0f, + 0x11,0xe5,0x56,0xbc, 0x91,0xdb,0xfb,0xa8, 0x0c,0xf6,0x1c,0x6e, 0x1e,0xa1,0x95,0xb5, + 0x50,0xae,0xd8,0x76, 0xb4,0xc1,0x64,0x6a, 0xa6,0x08,0xfe,0x34, 0x11,0x01,0x1a,0xcc, + 0x22,0x43,0xed,0x47, 0x26,0x36,0x1c,0x04, 0xf8,0x33,0x7d,0x03, 0x4e,0x9f,0xe3,0xe5, + 0x3a,0x7f,0x31,0xcb, 0x41,0x73,0x1e,0x32, 0x1b,0xbe,0x5d,0x5a, 0x4a,0xd4,0xdd,0x3b, + 0xa7,0x28,0x9c,0x00, 0xea,0xf5,0xa7,0x9d, 0x77,0x6f,0xe9,0x63, 0x51,0x6b,0xb9,0xa4, + 0x84,0xac,0x58,0x2d, 0xf5,0xb1,0x6c,0xd4, 0x78,0xc6,0x03,0xf2, 0x95,0xc6,0xf8,0xec, + 0xf7,0x45,0x3e,0x14, 0x29,0x49,0x62,0x65, 0xee,0x6e,0x05,0xeb, 0x5f,0x77,0x5b,0x06, + 0x14,0xe3,0x2f,0x67, 0x95,0xe5,0xcb,0xda, 0x95,0x9f,0x53,0xc2, 0xc2,0xc3,0xb0,0x18, + 0xb2,0x17,0x44,0xd7, 0xbe,0x60,0x2f,0xbe, 0x30,0x63,0x13,0x40, 0xda,0x4d,0x88,0xa1, + 0xa8,0x64,0x44,0x9c, 0x19,0x21,0x32,0x4b, 0x81,0x7a,0xb9,0x7b, 0x52,0xab,0x5a,0xd8, + 0xdd,0xd5,0x51,0x28, 0x0d,0x89,0x20,0xe6, 0x95,0x80,0x99,0xa5, 0x67,0xc2,0x62,0x59, + 0x4d,0x56,0x99,0xfd, 0x5d,0x8f,0x2d,0xb1, 0xde,0x75,0x92,0xfe, 0xa8,0xad,0xb1,0xa7, + 0x83,0x24,0x17,0x18, 0x05,0x4c,0x41,0x9f, 0x64,0x55,0x8f,0x5b, 0xf3,0x04,0xcb,0x1d, + 0x7e,0x15,0x6c,0xe3, 0x12,0x39,0x97,0xc2, 0xfa,0xdc,0x57,0xe4, 0xe1,0x50,0x08,0xb8, + 0xce,0x31,0x88,0x46, 0x33,0x12,0x0e,0x03, 0x32,0x46,0x96,0x41, 0xd3,0x3c,0x4a,0x30, + 0x7b,0x5a,0x79,0x46, 0x18,0x9f,0x6b,0x0f, 0x3b,0x39,0xb4,0x68, 0xb9,0xbf,0xcd,0x21, + 0x69,0xfe,0xc7,0xe1, 0xef,0x38,0xc1,0x4a, 0x61,0xd7,0x40,0x48, 0x4d,0x44,0xec,0x76, + 0xf7,0xd2,0x20,0x0c, 0x51,0xdb,0xbd,0x5e, 0x8b,0x50,0x91,0xd6, 0xf7,0x12,0x37,0x55, + 0x74,0xd9,0x8f,0x4c, 0x7c,0x0b,0x97,0xf1, 0xe2,0xf9,0x59,0x8b, 0xaf,0xaa,0xaf,0xf9, + 0x74,0x52,0x2c,0xd6, 0x8a,0x2d,0x38,0xa5, 0x58,0x8b,0xdb,0x3d, 0x25,0xa3,0x19,0xa4, + 0x0b,0x1d,0x97,0xac, 0xf0,0xda,0x30,0x44, 0x75,0xa9,0x90,0x3c, 0xeb,0x44,0x36,0xd0, + 0x97,0x52,0xc5,0x26, 0x36,0x09,0xb0,0x49, 0x12,0x13,0xe4,0x08, 0x6d,0xbf,0x9e,0xc0, + 0x24,0xc0,0x6d,0x21, 0x15,0x9a,0xfa,0x2f, 0xd0,0x99,0xfd,0xe6, 0xcb,0xe0,0x9b,0x25, + 0xcf,0x6e,0x2d,0x77, 0xcc,0x39,0x55,0xbf, 0x7c,0xb8,0x00,0xfe, 0x90,0xa7,0xf6,0x5b, + 0xf7,0x85,0x12,0x14, 0x25,0x0e,0x13,0xe5, 0x65,0x28,0xa4,0xaa, 0x50,0x29,0xc4,0x40, + 0xd0,0xd1,0x66,0xab, 0xaa,0x53,0x4c,0xc3, 0x43,0xbb,0x2d,0x18, 0xb3,0x32,0xac,0x43, + 0x84,0x77,0x50,0x20, 0xc8,0x50,0xa1,0x3a, 0xb1,0xda,0xf5,0x1d, 0x8f,0xcd,0xf1,0xce, + 0x42,0x79,0x3f,0x67, 0x67,0xa7,0xf9,0x7f, 0xc7,0x9f,0x1a,0xc7, 0xfa,0x5c,0x90,0x3a, + 0x3d,0x0e,0xec,0xd2, 0xa4,0x4a,0xe1,0xb1, 0x8f,0x80,0x72,0x44, 0x40,0x12,0x91,0xb8, + 0x28,0x9f,0x0d,0x71, 0x3c,0x9d,0xeb,0x9b, 0x16,0x43,0xf1,0x55, 0x32,0x6d,0x20,0xa0, + 0x7a,0x33,0x3a,0x4b, 0xa4,0x29,0x6b,0x82, 0x94,0xac,0x5f,0x69, 0x46,0xbf,0xa7,0x07, + 0x67,0x21,0x06,0xb3, 0xa1,0xe3,0xf0,0xb7, 0xba,0x9e,0x43,0x7a, 0x7c,0x69,0x91,0x67, + 0xf6,0xf6,0x8a,0xd6, 0x61,0x70,0xf4,0x58, 0x49,0x4d,0x09,0x61, 0xb3,0x2f,0x7e,0x94, + 0xf1,0xa5,0x73,0x12, 0x79,0x07,0x5f,0xac, 0xf6,0xff,0xf3,0xf1, 0xd4,0xff,0x34,0xf0, + 0x96,0xe5,0xe5,0x91, 0x22,0xb8,0xb3,0xbf, 0xdb,0x81,0x44,0xd7, 0xb3,0x4c,0xa5,0xe8, + 0xfa,0xc8,0x3d,0xe3, 0xa6,0xd4,0x0a,0xe3, 0x41,0x84,0xfa,0x8b, 0xbc,0x89,0xdf,0x63, + 0x94,0x93,0x9a,0xcc, 0x3f,0x1e,0x7a,0x59, 0xf4,0x52,0x12,0x3b, 0x23,0xe8,0xdb,0x81, + 0xa7,0xb3,0xd1,0xef, 0xa5,0x3a,0xb4,0x7f, 0x0f,0x3f,0xfe,0x7d, 0x58,0x52,0x69,0x60, + 0x40,0xd0,0xdb,0x2a, 0xa0,0x41,0x39,0xb4, 0x4f,0xf6,0xdf,0xf3, 0x3e,0x4e,0x14,0x2c, + 0x5d,0xf6,0x50,0x14, 0x63,0x58,0xa8,0xbe, 0x7f,0xad,0xc8,0x50, 0x90,0x74,0x1c,0x8a, + 0xe5,0x19,0x9f,0x38, 0x74,0x01,0x63,0x5f, 0x67,0x6d,0x6d,0xdd, 0xfa,0x95,0x71,0xfb, + 0x33,0xdb,0x12,0x45, 0x41,0x67,0xff,0x12, 0xb5,0xea,0x51,0x67, 0x68,0x5b,0x39,0x03, + 0xf4,0x82,0x2c,0xa6, 0x03,0xaf,0x1c,0x9a, 0xa2,0x50,0xb9,0xf0, 0x94,0x6e,0x89,0x73, + 0x76,0x78,0x1e,0x2f, 0x51,0x2f,0xcc,0x0a, 0x43,0x24,0x52,0x5e, 0x93,0xdc,0x55,0x49, + 0x15,0x05,0x51,0x80, 0xef,0x9b,0xc7,0xa6, 0x66,0xd3,0x24,0x80, 0xf6,0xd9,0xee,0xb2, + 0x5e,0x9d,0xdc,0x66, 0x3b,0x0f,0xce,0x44, 0xae,0x31,0xc5,0x98, 0xbe,0x11,0x34,0x8c, + 0xc4,0xa0,0x09,0x32, 0xf5,0xad,0xd7,0xf9, 0x9e,0x3c,0x8c,0xd6, 0x5f,0x69,0xca,0x61, + 0x7c,0xdc,0xa4,0x8c, 0x03,0x4e,0xd1,0x1c, 0xfb,0x0c,0xa6,0xa7, 0x51,0xc5,0xfa,0x93, + 0x47,0xc6,0x9b,0xac, 0x97,0x7e,0x4e,0x6d, 0x64,0x62,0x42,0x91, 0x4f,0x5a,0xa0,0x28, + 0x0a,0x82,0xa3,0x96, 0xb5,0x31,0x67,0x52, 0xaf,0x49,0x0a,0x43, 0x55,0x14,0x35,0x0b, + 0x79,0x04,0xc2,0x23, 0x78,0x1b,0xe5,0xb3, 0x7a,0x4b,0xb4,0x9d, 0xad,0x06,0x87,0xf2, + 0x7d,0x6f,0x49,0x00, 0x54,0x04,0x6e,0x06, 0x74,0x41,0x01,0x4e, 0x03,0x12,0x35,0xfb, + 0xd7,0x7a,0x5e,0x35, 0xf3,0x00,0x14,0x47, 0x66,0xb2,0x48,0xaf, 0x84,0x9a,0x20,0x2f, + 0xe7,0x08,0x53,0x9c, 0x1c,0xb3,0x04,0x95, 0x14,0x34,0xc6,0xc7, 0x44,0x19,0x54,0xca, + 0x4a,0x21,0xf7,0xca, 0x03,0x3d,0xcf,0x15, 0x56,0xb9,0xb7,0xac, 0xfa,0x6c,0x69,0x8d, + 0xe7,0xe9,0x78,0x68, 0x24,0xad,0x89,0x8b, 0xce,0xea,0x3b,0xb9, 0x97,0xd4,0x11,0x6e, + 0xc0,0x5e,0x59,0x54, 0x19,0x4f,0xae,0x17, 0x8a,0x64,0x42,0x7b, 0x02,0x17,0x01,0xd9, + 0xaf,0x93,0x4a,0x84, 0x4d,0x8d,0x08,0x40, 0x78,0x46,0xc0,0x58, 0x3e,0xa3,0xc0,0x0b, + 0x5e,0xd7,0xe0,0xf3, 0x3d,0xae,0xd3,0x99, 0x8f,0x44,0xce,0x1d, 0x3a,0xdf,0xd6,0x20, + 0x15,0x5f,0xce,0x81, 0x98,0xf1,0xa8,0x2f, 0xf8,0xfe,0x33,0x2f, 0x17,0x7d,0xe4,0x5b, + 0x45,0xec,0x11,0xc2, 0xad,0xf8,0x99,0xfe, 0xfe,0x0d,0xd4,0xce, 0x9e,0x51,0xb8,0xf5, + 0x51,0xe2,0xa2,0x7d, 0xf5,0x74,0x62,0xe9, 0xb6,0xaf,0x55,0x5d, 0xa6,0x74,0xcb,0x94, + 0xdb,0xfe,0xa1,0xdb, 0xe3,0x7d,0x29,0x64, 0x6d,0x19,0x13,0xd7, 0xb1,0xcf,0xbf,0xc4, + 0x2e,0x3e,0x33,0x8b, 0xf3,0xad,0x5e,0xf5, 0xfe,0x7e,0x56,0x4c, 0x29,0xce,0xc9,0xd7, + 0x47,0xd1,0x65,0x13, 0x92,0xac,0x6e,0x08, 0x43,0x0a,0x69,0xaf, 0x2d,0x68,0x68,0x97, + 0x2d,0x61,0xd9,0x80, 0xc0,0xd2,0x7a,0x4d, 0x1d,0xa9,0x80,0x30, 0xfb,0xa3,0x5b,0x51, + 0xd9,0xf7,0xbf,0xba, 0x7e,0x16,0x3f,0xbc, 0x09,0xf4,0xf1,0xad, 0x1c,0xbd,0xc2,0xbb, + 0xce,0xc2,0xa3,0xde, 0x70,0x7d,0x84,0x33, 0xff,0xba,0x98,0xe8, 0x73,0x06,0x2b,0x6a, + 0xf0,0xae,0x89,0xc5, 0x78,0xc3,0x13,0x96, 0x91,0xb6,0x9a,0x40, 0x1d,0xef,0xa1,0xdf, + 0xd8,0x99,0xfd,0x5d, 0x9c,0xc5,0xd4,0xc7, 0xb3,0xb1,0x8a,0xb8, 0x29,0x4c,0xe1,0xb3, + 0x9f,0x65,0x71,0xe9, 0x9a,0x87,0x4e,0x6a, 0xa5,0x38,0x5b,0xf4, 0x4c,0x63,0xa0,0xc3, + 0x41,0x11,0x54,0xbc, 0x2c,0xec,0x35,0x06, 0x87,0x21,0xaa,0x83, 0xd3,0x80,0x5e,0x49, + 0xb8,0xdb,0xfb,0xbf, 0xe3,0xa0,0x3b,0x33, 0x14,0xf1,0xea,0x1e, 0x7d,0x94,0x39,0x4b, + 0x9f,0xd7,0xb0,0xdf, 0xe4,0x68,0x40,0x92, 0x28,0xab,0xe1,0x71, 0x14,0x27,0xb6,0x29, + 0xdc,0x42,0xa0,0xe4, 0xaf,0x61,0xe8,0x3e, 0x6f,0x81,0x32,0xbc, 0xdf,0x98,0x0f,0xf2, + 0x05,0xea,0x7b,0x4f, 0xf2,0xf7,0x79,0x4c, 0xe2,0x88,0x07,0x95, 0xe7,0xf0,0x70,0x3f, + 0x0f,0x8b,0x14,0x34, 0x8c,0x80,0xeb,0xa7, 0xab,0x57,0x81,0x87, 0x86,0x5e,0x49,0x8a, + 0x1f,0xf5,0xfd,0x9d, 0x1c,0x3f,0x5e,0x22, 0xb9,0xcc,0x2d,0x36, 0xc3,0x8e,0x9f,0x13, + 0xa2,0xa6,0x65,0xcb, 0xcb,0xd6,0xbb,0xa4, 0x88,0x11,0xbe,0xd6, 0xcb,0x5d,0xe9,0x1b, + 0x55,0x7d,0x3c,0x56, 0x32,0xbb,0x14,0x31, 0xf7,0x66,0xea,0x1c, 0xb9,0x0b,0x3a,0x5c, + 0x26,0x35,0x0e,0xe9, 0x27,0x68,0x19,0x11, 0x18,0x18,0xe5,0xd7, 0xdc,0x1e,0x47,0x09, + 0xa6,0xa2,0x75,0x80, 0x51,0x85,0x8f,0x8d, 0x77,0xd1,0xcc,0xec, 0x1b,0x6f,0xa3,0x5b, + 0x90,0xdf,0x78,0xab, 0xed,0x2e,0xe9,0xa5, 0xa5,0x95,0xd1,0x48, 0x71,0x29,0xc3,0x16, + 0x83,0x31,0x05,0x1f, 0x76,0x8f,0x42,0x95, 0x31,0x50,0x47,0xf6, 0xfc,0x2e,0x97,0xe3, + 0x7b,0xde,0xff,0x85, 0xc6,0xfb,0xda,0x75, 0xba,0x32,0x1a,0xf9, 0x17,0xfe,0xc3,0xdd, + 0x6e,0xd5,0x21,0xc2, 0xa2,0x71,0x74,0x43, 0xc0,0xdf,0xf2,0xe9, 0x49,0x52,0x65,0x1f, + 0x23,0x80,0xc7,0xbd, 0x91,0x5d,0xf4,0xba, 0xb9,0xf0,0x74,0xec, 0xe6,0x7c,0x8f,0x88, + 0x70,0xd6,0xea,0x2f, 0x25,0xcf,0xde,0xd4, 0x6f,0xc0,0xe9,0xfb, 0x33,0xa0,0x4a,0xbf, + 0x58,0xe8,0x31,0xe1, 0xbb,0x47,0x8d,0x8b, 0xc4,0x85,0xc1,0x12, 0x3b,0x96,0x1f,0xfb, + 0x4a,0x49,0x4d,0xd3, 0x94,0x9d,0x36,0x53, 0x30,0x70,0xe3,0x8c, 0xdd,0x74,0x8e,0x5e, + 0x7b,0xf1,0x2b,0x2d, 0x6a,0x3d,0xbc,0x92, 0x63,0x7d,0x4e,0x5b, 0x3c,0xa8,0x53,0x59, + 0x56,0x4b,0xe4,0x71, 0x53,0xb6,0x73,0x5d, 0x06,0x7a,0x6d,0xa6, 0x93,0x9c,0xaf,0x8c, + 0xa3,0x39,0xbd,0xd4, 0x68,0xf0,0x5c,0xfe, 0xb9,0x50,0xb5,0xe9, 0x77,0x51,0xbf,0x81, + 0x38,0xf8,0x2e,0x03, 0x1c,0xbb,0xa8,0xa4, 0xbf,0xa7,0x05,0x5b, 0x9e,0x84,0xad,0xd8, + 0xb6,0xe6,0xf7,0x71, 0x7b,0x84,0xbe,0x4b, 0x1d,0x28,0x53,0xb1, 0xa7,0x48,0xdb,0xa5, + 0xdf,0xad,0x47,0xa5, 0x10,0x42,0x49,0xcb, 0x9e,0xde,0x9f,0xee, 0xab,0xb5,0xa7,0x7d, + 0xf3,0xb5,0x04,0x5e, 0x68,0x92,0x2e,0x33, 0xa8,0xe6,0x6b,0xf0, 0xeb,0x50,0x66,0x7e, + 0x0c,0x3e,0x76,0x7e, 0x07,0xff,0x25,0xfb, 0xb9,0xf9,0x48,0x19, 0xe4,0x83,0xea,0x81, + 0x87,0xa9,0xe9,0xd8, 0xd8,0x77,0x4e,0x36, 0xbd,0xae,0xce,0x54, 0x1c,0x61,0x2f,0xc5, + 0xe7,0xde,0xa4,0x5c, 0x01,0x2d,0x19,0x19, 0x62,0xb9,0x84,0xf1, 0x5e,0x69,0xe9,0xa7, + 0xd1,0xc9,0xec,0xea, 0x3a,0xf6,0x1c,0x15, 0xaf,0xfe,0x39,0x49, 0x95,0x04,0xfa,0x40, + 0xf8,0x2b,0xd0,0xb7, 0xd2,0xd9,0x3b,0xa4, 0x23,0xd5,0x57,0x79, 0x21,0xa1,0x32,0xc7, + 0x54,0x08,0xda,0x16, 0x4f,0x64,0x80,0x40, 0x9d,0x36,0x00,0x3b, 0x4f,0xa7,0x1d,0xd6, + 0xcf,0xf5,0x57,0xda, 0xea,0xbd,0x2c,0xd7, 0xdb,0xf1,0x81,0x2c, 0x3d,0x87,0x3b,0xde, + 0x7d,0x15,0x2b,0x6e, 0xf4,0x34,0x0a,0x4b, 0x05,0x62,0x03,0x0b, 0xc0,0xd8,0x5a,0x45, + 0x04,0xaf,0x23,0xc8, 0x69,0x1e,0x83,0x29, 0x0d,0x7d,0x6e,0x6d, 0x5a,0xb2,0x16,0x26, + 0xcf,0xa9,0x9b,0x83, 0xad,0xee,0xf9,0xf7, 0x7b,0xb1,0xbb,0x2e, 0xcd,0x43,0x2f,0xea, + 0x84,0xf6,0x1b,0xfe, 0xab,0x4f,0x52,0xe2, 0xed,0x56,0x93,0x44, 0x92,0xfc,0x3b,0x6e, + 0x63,0xb2,0xa3,0x47, 0xc6,0x59,0x95,0x64, 0xd5,0xfb,0x39,0xd7, 0x79,0xda,0xc5,0xbd, + 0x8d,0xc9,0x22,0xbb, 0x5d,0x7f,0xbb,0xbe, 0x92,0x2b,0xba,0xc4, 0xd0,0x39,0xb3,0x03, + 0x46,0x51,0xd4,0x72, 0x05,0xbc,0x54,0x4a, 0x1c,0x8a,0x7c,0xd8, 0xed,0xb1,0x58,0xab, + 0x6d,0xb3,0x78,0x21, 0xf4,0x7a,0x3f,0x07, 0xd4,0xf5,0x9d,0x5b, 0xf9,0xc7,0xe0,0x0c, + 0xd7,0xd4,0x40,0x80, 0x9a,0x63,0x2b,0x13, 0xae,0x68,0x58,0x1b, 0x39,0xfe,0xa7,0x5a, + 0xa8,0x7a,0xfb,0x2f, 0x49,0xd6,0x8c,0x04, 0xa1,0x1e,0xac,0x4e, 0x9a,0x2a,0x00,0x7c, + 0x25,0x62,0x3a,0x4e, 0xe2,0xef,0x61,0xea, 0x31,0x3d,0x7c,0x24, 0x93,0x45,0xb6,0x19, + 0x12,0x20,0x7d,0x4b, 0x81,0x36,0x36,0x26, 0xd3,0x6d,0x32,0x23, 0xa8,0x90,0x65,0xa4, + 0xa9,0xf7,0x79,0x7c, 0xc6,0x69,0xf6,0x6b, 0x50,0x19,0xda,0x06, 0xad,0x62,0x04,0x42, + 0xe0,0xcb,0x01,0x4a, 0xf3,0xd3,0xce,0xd1, 0xfe,0x0c,0x8b,0x75, 0x71,0x30,0x9d,0xb4, + 0x9b,0xfa,0x5c,0x6f, 0xbd,0xe8,0xae,0x96, 0xa2,0xcd,0x5f,0x19, 0xe7,0xd8,0x0e,0x93, + 0x22,0xc9,0x0f,0x8e, 0x06,0xab,0xeb,0x60, 0xce,0xf1,0xe3,0xbb, 0x81,0x59,0xe7,0x2f, + 0xd6,0x3d,0x5c,0x4d, 0xab,0x0f,0xb1,0xa1, 0xff,0x29,0xb6,0x59, 0xd1,0x40,0xe8,0xe5, + 0xfa,0x04,0x2e,0x87, 0x96,0xc9,0x96,0x4e, 0x59,0x2b,0x86,0xa1, 0xc4,0xd2,0x75,0x73, + 0xe7,0xe4,0x42,0xf5, 0x62,0xda,0xb4,0x23, 0x3d,0x59,0xbb,0x8e, 0x1f,0xfb,0xea,0x68, + 0x55,0xe8,0x57,0xbf, 0x72,0xa0,0x78,0x6d, 0x76,0x0a,0x4e,0x73, 0x14,0xbd,0xec,0xde, + 0x54,0x82,0x64,0x64, 0x21,0xbd,0x14,0x8c, 0xe5,0x25,0x46,0xd3, 0x76,0xe2,0xa9,0x76, + 0x5e,0xc7,0x85,0x49, 0x88,0x2d,0x5c,0xfd, 0x30,0x59,0xc0,0x02, 0x13,0x16,0x79,0xa8, + 0x0a,0x35,0xfe,0x13, 0xe2,0x8a,0x6d,0xdb, 0x8d,0xb8,0xa8,0xa0, 0x4c,0xa3,0x35,0xa4, + 0xd8,0xef,0x84,0xbe, 0x67,0x13,0xa9,0xee, 0x67,0xdf,0x18,0x27, 0x43,0x80,0xfa,0xb1, + 0x6a,0x45,0x22,0x23, 0xf4,0x55,0x7b,0x12, 0x66,0x01,0xba,0x3e, 0x50,0xe8,0x6b,0x89, + 0xec,0x1e,0x39,0x0a, 0x94,0x44,0xa9,0x37, 0x9e,0x76,0x7a,0x43, 0x46,0x8a,0xa2,0xba, + 0xdd,0xbd,0x11,0x60, 0x8c,0xe9,0x50,0x53, 0x15,0x55,0xcb,0xb4, 0x55,0xc7,0x97,0x45, + 0x7b,0x33,0x69,0x32, 0x07,0xc0,0x82,0x1f, 0x83,0x6e,0x42,0x9c, 0xe0,0xbc,0xe7,0xa0, + 0xfb,0xd3,0x80,0x6a, 0x19,0x0f,0x7d,0xf7, 0x74,0xa2,0xba,0x31, 0xa9,0xd3,0x4e,0x68, + 0x38,0x68,0x4e,0xa5, 0xb0,0x98,0x78,0x4e, 0x89,0x28,0x87,0x6a, 0xb8,0x54,0x71,0x27, + 0x40,0xde,0xa7,0x8b, 0x5f,0x60,0x83,0x8d, 0xff,0x49,0x5a,0xe3, 0x11,0x35,0x39,0x59, + 0x92,0x5f,0x3f,0x73, 0x8f,0xe9,0xb4,0xbd, 0xcc,0xd0,0x77,0xab, 0x08,0x4d,0xb6,0xc5, + 0x7a,0xdf,0x5d,0xa5, 0xa7,0xfd,0x33,0x15, 0xac,0xb6,0x4b,0xf7, 0xdc,0xf5,0xbc,0x55, + 0x1e,0x6f,0x1f,0xe7, 0x39,0xf9,0xe1,0x83, 0x6d,0x4b,0x2f,0x3a, 0x4a,0x9b,0x6c,0xa6, + 0x15,0xd0,0xdb,0x4e, 0x4a,0xda,0x74,0x29, 0x7c,0x0e,0x06,0xff, 0x3e,0x3d,0xcd,0x9b, + 0x86,0x99,0x0b,0x39, 0x36,0x13,0xd9,0xad, 0x91,0xe5,0x3e,0xa8, 0xea,0x3c,0x01,0x84, + 0xdb,0x82,0xd1,0xd5, 0x1c,0xe4,0xd2,0x70, 0x1b,0xe3,0x29,0x22, 0x7a,0xf5,0x1f,0x45, + 0xd2,0xda,0x48,0xac, 0xd6,0x29,0x37,0xc2, 0x4e,0x65,0x61,0x06, 0x12,0xb4,0x08,0x53, + 0xda,0x1d,0xd9,0xab, 0x2c,0xef,0x17,0x77, 0x43,0x69,0x59,0x87, 0xf0,0x22,0x41,0x93, + 0x46,0x83,0xc9,0x55, 0xf1,0x6c,0xbf,0xb5, 0xb3,0xb1,0x21,0x79, 0x37,0x57,0x7c,0x10, + 0xa5,0x99,0xd3,0x33, 0x53,0x79,0x84,0x6f, 0x24,0x14,0x05,0xc4, 0xb5,0x1d,0xfe,0x46, + 0xd0,0xad,0x94,0x35, 0xd9,0x5c,0x90,0x09, 0x94,0x52,0x06,0x10, 0x9a,0x4a,0xbb,0xbb, + 0x4c,0x38,0x77,0x9f, 0x42,0x82,0x58,0xad, 0x61,0xe3,0x46,0x0b, 0x3c,0xa6,0xb6,0x4c, + 0x9b,0xf0,0x6a,0x50, 0x85,0x64,0x62,0x3d, 0x83,0x35,0x2c,0x24, 0xd0,0xb1,0x19,0x65, + 0x86,0x5b,0x14,0x98, 0x96,0x03,0x04,0x63, 0xb1,0x2f,0x62,0xc4, 0x0b,0x57,0xfe,0x3c, + 0x5e,0x04,0x93,0x3e, 0x5d,0x07,0x29,0x83, 0x67,0x8b,0x9f,0x99, 0x73,0x1c,0x65,0xb0, + 0xfc,0x00,0x46,0x8a, 0xb5,0x18,0x6d,0xd3, 0x36,0x9b,0xc8,0x36, 0x24,0x48,0x84,0x1f, + 0x94,0x12,0x33,0x52, 0xe5,0x44,0x32,0x66, 0x7c,0x72,0x0e,0x4c, 0x75,0x24,0xe6,0xee, + 0x14,0xf1,0x22,0x77, 0x3e,0x34,0x01,0xfc, 0x44,0xaa,0x1f,0x3a, 0x7a,0x23,0xd6,0xca, + 0x7f,0xbb,0x16,0xc1, 0xb9,0x83,0x23,0xed, 0x6b,0x17,0x9f,0xc5, 0x61,0x75,0x75,0x18, + 0xad,0xf9,0x96,0xbf, 0x00,0x45,0x17,0x76, 0xbd,0x1b,0xd7,0x5d, 0x36,0xa3,0xdd,0x16, + 0x3d,0x5e,0x36,0x96, 0xaa,0xed,0xaf,0xfb, 0x8c,0x2d,0x09,0x29, 0x9b,0xa1,0xb3,0x4f, + 0xd4,0x6d,0x6a,0xab, 0x3c,0xd8,0xf4,0x6d, 0x60,0x39,0x31,0xa8, 0x10,0xd2,0xcb,0x39, + 0x81,0xb4,0x48,0x79, 0x84,0xd8,0xa5,0x14, 0xe4,0x58,0x48,0x88, 0x8c,0x92,0xce,0x25, + 0x20,0x0d,0x0c,0x18, 0x48,0x02,0x09,0x18, 0x19,0xbd,0xe8,0x38, 0x00,0xf4,0x5b,0xa3, + 0x46,0x1c,0x69,0x69, 0x4a,0x29,0x90,0xd5, 0xb5,0x11,0xba,0x4d, 0x64,0x40,0xa8,0x6d, + 0xb3,0xad,0xb3,0x16, 0xdc,0xcd,0x52,0x0b, 0x85,0x43,0x3f,0x75, 0x5b,0x78,0x83,0xdb, + 0x96,0x35,0xcd,0x20, 0xd3,0x9b,0xf5,0x92, 0x02,0xf6,0xef,0xc6, 0x93,0x70,0xe5,0x69, + 0x06,0xe6,0xc9,0x17, 0xb8,0xca,0xb1,0x64, 0x09,0x51,0x0a,0xdb, 0x0c,0x0a,0x32,0x83, + 0xc1,0x40,0x85,0x1c, 0x97,0x23,0xc3,0x81, 0x58,0xa8,0xde,0x1a, 0x3b,0x86,0xd1,0xfe, + 0xca,0xd6,0x25,0xa7, 0x2d,0xe3,0x6f,0xe8, 0xb1,0xcf,0x98,0x97, 0x0c,0xa1,0x0d,0xaf, + 0xe8,0xea,0xda,0x58, 0xeb,0x20,0x7d,0xc8, 0x35,0x99,0xc5,0x4f, 0x71,0xd9,0x4f,0x89, + 0x6d,0x22,0xb6,0xba, 0xb6,0x0d,0xc2,0x4f, 0xcd,0x41,0xe8,0xbf, 0x34,0x4e,0xbf,0x7c, + 0x9f,0xaa,0x62,0x7b, 0x98,0xd0,0xcb,0x44, 0xa1,0x57,0x2f,0xb1, 0x37,0xf9,0x0e,0xb7, + 0xb9,0x0e,0x44,0x3d, 0xed,0xe9,0x07,0xea, 0xdc,0xef,0x10,0x9e, 0x06,0xbb,0x71,0x0f, + 0xc3,0xd1,0x37,0x5c, 0x1d,0xb4,0x1c,0x97, 0x0f,0x67,0xc5,0x6d, 0xf2,0x66,0x11,0x6e, + 0x9c,0xe8,0x8c,0x61, 0x71,0xd9,0x8b,0xb1, 0x4e,0x08,0x53,0x7c, 0x88,0xda,0x21,0x8c, + 0x5d,0x75,0x3f,0x16, 0x8b,0x34,0x2a,0x79, 0x83,0xd1,0x63,0x42, 0x7f,0xec,0x9f,0xb7, + 0x74,0x26,0x2a,0x95, 0x7f,0xd3,0x7b,0x36, 0x9f,0x63,0x1d,0xf0, 0xfb,0xb0,0x50,0x5b, + 0x0f,0x0d,0x06,0x7e, 0x42,0x24,0x83,0xec, 0xf8,0xb9,0xed,0xba, 0xbc,0xd5,0x34,0xb5, + 0xef,0xe6,0xc8,0xd3, 0xce,0x89,0x17,0x89, 0x65,0xda,0x4e,0x9d, 0x71,0xb0,0xc3,0x2d, + 0x62,0x59,0x17,0x8e, 0xef,0x2c,0x04,0x95, 0xe8,0x79,0x8b,0xf5, 0x7b,0x61,0x9d,0x41, + 0xb5,0x8f,0x84,0xd9, 0x98,0x54,0x8f,0xf5, 0x1a,0xdb,0xd6,0xf3, 0x32,0xa3,0x04,0x33, + 0x41,0xcd,0x98,0x25, 0xe1,0x06,0x23,0x74, 0xeb,0x02,0xa5,0x35, 0x77,0xcd,0x01,0x6b, + 0x32,0xe5,0xf3,0x1f, 0xc5,0xb5,0x7b,0xee, 0xf2,0x6f,0xbd,0xce, 0xce,0x43,0x48,0x6c, + 0x98,0xa5,0xd9,0x8e, 0x92,0x28,0x5e,0xc2, 0x9b,0x5b,0xaf,0xaf, 0x32,0xdd,0x88,0x05, + 0x5e,0xe4,0xed,0x43, 0x37,0xad,0xa5,0x46, 0xd2,0x1e,0x96,0x33, 0x6d,0xde,0x93,0xb8, + 0xbb,0x3c,0xab,0xd5, 0xf6,0x11,0xbb,0xba, 0xb5,0x80,0x79,0x0b, 0x0a,0xb7,0x69,0x65, + 0xa8,0xf2,0x8e,0xdd, 0x17,0xd4,0x5a,0x4b, 0x54,0x69,0x27,0xf7, 0x74,0x59,0x46,0x9e, + 0x9b,0x2e,0x3b,0xa3, 0x78,0xa6,0x57,0x74, 0xa2,0x71,0xee,0xdf, 0x6c,0x73,0x27,0x5c, + 0xb9,0xaf,0x67,0x1e, 0xd5,0x18,0x0a,0x8e, 0x8d,0x83,0x1d,0x33, 0x50,0xc5,0xea,0xcd, + 0xc4,0xb1,0x0f,0xd5, 0xea,0xf6,0x43,0xc9, 0xfa,0x3d,0xc7,0x54, 0xfd,0xca,0x90,0x78, + 0x48,0xb9,0x77,0xed, 0x4b,0x3a,0xff,0x23, 0x8c,0xdf,0x24,0x32, 0xd3,0x65,0x71,0xf9, + 0x86,0x99,0x0d,0x50, 0x16,0x20,0x75,0xcc, 0x19,0x8a,0xcb,0xa0, 0x34,0x40,0x28,0xf4, + 0x10,0x6f,0x0a,0x8a, 0x8a,0x95,0x99,0xed, 0x91,0x92,0xae,0x07, 0xd2,0xeb,0xe9,0xde, + 0xba,0x27,0x9c,0x01, 0x08,0xf3,0x75,0xaf, 0x54,0x7b,0x36,0xcf, 0xf9,0x56,0xb5,0xb7, + 0xf7,0x39,0xc1,0xc7, 0xf4,0x6e,0xb3,0xbd, 0x65,0x71,0xe2,0x71, 0xc7,0x0d,0xb5,0x77, + 0x93,0x02,0xa9,0x60, 0xbb,0x6e,0xd5,0xb9, 0x28,0xa7,0xfb,0xe9, 0xde,0xe4,0x7e,0x85, + 0x3a,0x35,0x96,0x5f, 0x0b,0x92,0x89,0x3e, 0x66,0xcf,0xc9,0x85, 0xe6,0x5d,0x37,0xc1, + 0x8b,0xbb,0x68,0xe6, 0x1b,0x88,0xd2,0x3a, 0x8a,0x8b,0xab,0xf8, 0xfc,0x79,0xdd,0x9c, + 0xad,0xb9,0x79,0x47, 0x79,0xc0,0xe7,0xb8, 0xd2,0x39,0x53,0xd3, 0xf9,0xff,0xde,0xa4, + 0x71,0x0e,0xef,0x5c, 0xc4,0x6f,0x7b,0x1d, 0xd4,0xda,0xf1,0x74, 0xc7,0x06,0xdd,0x94, + 0x4f,0x9c,0x75,0xe0, 0x2a,0xb4,0xfb,0x26, 0x3a,0x11,0x7a,0x54, 0xfb,0x6b,0xdd,0x8b, + 0xa3,0x4d,0x67,0xa7, 0xcc,0xfb,0xff,0x02, 0xfd,0x71,0x16,0xfb, 0x11,0xaf,0xa6,0x5a, + 0x8e,0xb0,0x30,0xfd, 0x3a,0xbd,0xd7,0xb0, 0xf1,0x44,0xc0,0xc0, 0xd8,0xf2,0x38,0x54, + 0x79,0x9a,0x43,0xd7, 0x74,0x45,0x6c,0x9c, 0x2b,0x1f,0x74,0xf9, 0x11,0x0e,0x46,0x49, + 0x2d,0xb5,0xbe,0xfe, 0xc9,0xf7,0xfc,0xea, 0xe6,0xb0,0x3c,0xd5, 0x7e,0x5d,0x04,0xb3, + 0x4f,0xe6,0xe7,0xd6, 0xd8,0xe7,0x16,0x17, 0x0e,0x7d,0x8a,0x17, 0xf2,0x4b,0x33,0x9a, + 0x11,0xb0,0x14,0xd0, 0x7b,0x0b,0x7f,0xc7, 0xe3,0x88,0xef,0x35, 0x79,0xe4,0x51,0xbf, + 0xd2,0xf7,0x06,0x2f, 0x61,0x73,0x5c,0xd7, 0xf9,0xed,0xf4,0x32, 0xf6,0x2f,0x07,0x0f, + 0x63,0xf2,0xe7,0x0f, 0xb7,0x65,0x0c,0x55, 0x6a,0x88,0x48,0x52, 0x51,0x64,0x23,0x41, + 0xfc,0x67,0xd6,0x60, 0xf3,0x44,0x6c,0x19, 0x73,0x2b,0x56,0x10, 0xfa,0xca,0x09,0x71, + 0xc0,0xce,0x7f,0x9e, 0xc7,0x9d,0x29,0xfa, 0xac,0xbb,0x6a,0xcc, 0xca,0xc1,0x78,0x6d, + 0xdb,0x4e,0xcf,0x77, 0x47,0xe1,0xd0,0x71, 0x7c,0x15,0xbb,0x07, 0x01,0xe8,0xa9,0xbd, + 0x1e,0xae,0x92,0xb5, 0x59,0x17,0x0d,0xd3, 0x50,0x6b,0xb2,0x9e, 0xaa,0xdf,0xbe,0xd5, + 0x37,0xa5,0xb1,0x95, 0x71,0xf2,0xe9,0x94, 0x99,0x8c,0xb1,0x5a, 0x3e,0x4d,0xa7,0xd7, + 0xad,0xc9,0x48,0xf3, 0xec,0xde,0xff,0xcc, 0x36,0xd5,0x15,0x79, 0x43,0xfb,0x5f,0x2b, + 0x47,0x8b,0xc4,0x71, 0x12,0x38,0xaf,0x2f, 0xd7,0x8b,0x4a,0x4e, 0xbb,0xfc,0xb6,0xf4, + 0x9d,0xb2,0xee,0x11, 0xd7,0xe8,0x79,0xfe, 0x2f,0xa7,0xf8,0x31, 0x7b,0x07,0xce,0x1a, + 0x47,0xe6,0xd0,0xae, 0xed,0xc4,0x79,0x77, 0x96,0x5b,0xa7,0x19, 0x9f,0xc2,0xd1,0x14, + 0x1b,0xa9,0xab,0x4f, 0x53,0x90,0xac,0xa9, 0x6c,0xe7,0x57,0x83, 0x1e,0x6b,0x6b,0xf7, + 0x10,0x62,0xe1,0xb8, 0x1d,0x7f,0x00,0x73, 0xf2,0x6b,0xd6,0xfa, 0x30,0x56,0xec,0xb8, + 0x07,0xf1,0xad,0xd3, 0x41,0xe2,0x75,0x11, 0xbf,0xe7,0xf9,0x3d, 0xd3,0x39,0xfe,0x36, + 0xd6,0x73,0x83,0xf2, 0x69,0x9d,0x83,0x98, 0xf8,0x75,0x6c,0xce, 0x6e,0xa1,0x6e,0x5b, + 0x06,0xd0,0x36,0x70, 0x20,0x84,0x66,0xfc, 0x4c,0xff,0x9b,0xc5, 0x56,0xe2,0xfb,0x8d, + 0x6f,0x0e,0xa6,0xeb, 0x15,0xef,0x95,0xd4, 0x9f,0x6d,0xce,0x3c, 0x32,0xed,0x4f,0xa5, + 0xb5,0xc1,0xba,0x4a, 0xcd,0x59,0x1c,0x1e, 0x7e,0xb5,0x11,0x92, 0xd8,0x5d,0x58,0xed, + 0xd3,0x8b,0xab,0x2d, 0x0a,0xb4,0x6f,0x4d, 0xcb,0x94,0x5c,0xc8, 0xb7,0x1e,0xbd,0x2b, + 0xf5,0x00,0x74,0x21, 0x9c,0x6b,0xa2,0x07, 0x3d,0xa4,0x23,0x06, 0x63,0x2d,0x7f,0xfb, + 0xef,0xcf,0x61,0x39, 0xdd,0x36,0x32,0x10, 0xb3,0x89,0xf4,0xe6, 0x30,0x39,0x16,0x33, + 0x99,0x6c,0xab,0x6a, 0x4c,0x9a,0x96,0x37, 0xaa,0x9f,0xde,0x96, 0xf1,0x89,0x75,0x0a, + 0xd2,0x33,0x73,0x92, 0xf6,0xb1,0x96,0x58, 0x31,0xbd,0x5c,0x2e, 0xce,0x22,0xa7,0x57, + 0xc9,0x3c,0xfe,0x82, 0x26,0x5b,0x81,0x92, 0xd8,0x34,0x92,0xa7, 0xe3,0x62,0x54,0x03, + 0x9d,0x21,0x97,0xc2, 0x31,0x7c,0x5e,0xda, 0xfe,0x33,0x9a,0xd3, 0x5c,0x5d,0xa4,0x4d, + 0x2b,0xaf,0x9c,0x21, 0x8e,0xd0,0x09,0x8a, 0x00,0x6b,0xc7,0x8f, 0x6d,0xb7,0x76,0xe1, + 0x1c,0xc1,0x38,0xb6, 0xc4,0xd2,0x0d,0xa4, 0xa5,0xf0,0x30,0xed, 0xdc,0x2e,0xd5,0xbf, + 0x1c,0xe5,0x1b,0x10, 0xff,0x7e,0xd2,0x1d, 0xc3,0xdc,0x8c,0x16, 0xab,0xd3,0x8a,0x68, + 0x61,0xc4,0x61,0xd1, 0x15,0x1b,0x19,0xac, 0x4e,0x1b,0x8d,0xca, 0xa2,0x5f,0x45,0x96, + 0xc0,0xd4,0x47,0x57, 0x54,0xf6,0x33,0xda, 0x2c,0xf7,0x7f,0x56, 0xcb,0x15,0x83,0xc0, + 0xe9,0xf1,0xbe,0x76, 0xeb,0x4d,0xab,0x84, 0x52,0xd5,0xd4,0xcf, 0xa1,0x6b,0x9e,0x5d, + 0xee,0x37,0x5f,0xb2, 0xb4,0x87,0x46,0x51, 0x5b,0xe6,0x52,0xfd, 0x90,0xde,0x36,0x57, + 0xc3,0xad,0x56,0xca, 0xca,0x31,0xab,0x4c, 0xbd,0xab,0xac,0x0c, 0xa3,0xd7,0x92,0x53, + 0x9a,0x1d,0x9e,0x53, 0x5d,0xa1,0xb7,0xca, 0xb5,0xc9,0x7f,0xbd, 0x28,0xe4,0x53,0x66, + 0x73,0x65,0xa1,0xdb, 0x52,0x5f,0x03,0x3b, 0xac,0xf9,0x65,0xd2, 0x9c,0xba,0x8b,0x67, + 0xcc,0x0c,0x97,0x23, 0x1f,0xe6,0x9d,0x70, 0x97,0xc5,0xe1,0xa1, 0xd0,0xea,0x0e,0x13, + 0x59,0xb1,0xb4,0x78, 0xfc,0x42,0x5d,0xe9, 0xdf,0x58,0xee,0x21, 0xed,0x1f,0xdb,0xe1, + 0xeb,0xaf,0xde,0xfe, 0x93,0x6b,0xa0,0x73, 0x42,0x61,0xee,0x35, 0x0f,0x9c,0xf9,0x88, + 0x9d,0xdf,0x20,0x8b, 0x7a,0x2e,0x50,0x21, 0x34,0x94,0xf6,0x8d, 0x21,0x0c,0x0b,0x38, + 0xbd,0x82,0xb1,0xb3, 0x6b,0x4d,0xe8,0xc4, 0x28,0x93,0xbc,0xaa, 0x79,0x5d,0x8e,0x8b, + 0x7b,0x24,0xc4,0xa6, 0x5b,0x25,0xb5,0x50, 0x72,0x65,0x76,0xf8, 0xda,0x7a,0x48,0xda, + 0x48,0x9d,0x3e,0xb5, 0xf3,0x8c,0xce,0xd5, 0xba,0x56,0x7c,0x2c, 0x70,0x81,0x33,0xb8, + 0x9f,0xb2,0xd4,0xee, 0xe7,0xd0,0xbd,0x5c, 0x61,0x97,0x34,0x80, 0x5c,0x4f,0x0d,0x1f, + 0x7c,0xde,0xa7,0xbe, 0xf2,0xb1,0xea,0xaf, 0xab,0xce,0xdf,0x60, 0xb6,0x1d,0xe7,0xd0, + 0x3a,0xc6,0xcb,0xc9, 0x7f,0x6c,0x1a,0x6b, 0xf5,0x0f,0xb8,0x9a, 0xb5,0x5e,0x12,0x8a, + 0x32,0x2f,0x3c,0x9e, 0x9b,0xbe,0x70,0x30, 0xbb,0xf7,0x88,0xd2, 0x5d,0x80,0x58,0xd3, + 0x93,0xa9,0xe9,0x44, 0x57,0xb4,0xaa,0x28, 0x4e,0xb6,0x8f,0x74, 0xcc,0x59,0x47,0x52, + 0xbb,0x5a,0x2e,0x2c, 0x46,0x44,0x4c,0xb8, 0x6f,0x92,0x5b,0x75, 0x48,0xf8,0xb0,0xb2, + 0xb7,0x69,0x7a,0x5b, 0xe9,0xc3,0x28,0xd1, 0xad,0xbd,0xcb,0x40, 0x46,0x15,0xb7,0xc3, + 0x80,0xae,0x55,0x06, 0xfb,0x2d,0xd4,0xe3, 0xda,0x89,0xab,0xa5, 0x72,0x78,0x34,0x48, + 0xc7,0x20,0x4a,0x1d, 0x01,0xb7,0x72,0x88, 0xda,0xba,0xfc,0x99, 0x97,0xe6,0x8f,0x6b, + 0x8d,0xee,0x2b,0xf5, 0x66,0x63,0x3e,0x5f, 0xbb,0x0f,0xea,0xc0, 0x9a,0x77,0x3f,0x02, + 0xb5,0xe9,0xd0,0xe2, 0xa4,0x39,0x5f,0x37, 0x8d,0x54,0x2e,0x06, 0x65,0xc1,0xe2,0xdb, + 0xec,0xac,0xc9,0x18, 0x14,0x9e,0x8a,0xd0, 0xd2,0xb0,0x71,0x73, 0x87,0x62,0xf5,0xbd, + 0x20,0x9d,0x2e,0x05, 0xdb,0xad,0xc3,0x3c, 0xb1,0xee,0x8f,0x1f, 0xb3,0xde,0xc4,0xd3, + 0xd9,0x00,0xf3,0xdb, 0xd4,0x42,0xe2,0x2f, 0xcd,0xfd,0x41,0xf7, 0xb5,0x66,0xd0,0xd1, + 0xe6,0x23,0x8a,0x62, 0x16,0x3b,0x26,0xed, 0x63,0x6a,0xb4,0xb7, 0x1c,0xc8,0x0e,0x18, + 0x06,0x8e,0x79,0x0b, 0x70,0x85,0x46,0x69, 0xd2,0xc3,0x14,0x92, 0x94,0xa3,0x3a,0xb2, + 0x5f,0x6f,0x3f,0xc1, 0x8d,0xcd,0x7b,0x9b, 0x63,0x33,0xfe,0x82, 0x7d,0xa7,0x41,0xdd, + 0x68,0x5f,0xc1,0x75, 0x35,0xf2,0x37,0x39, 0x3b,0x3d,0x8e,0x15, 0x29,0x64,0x9c,0x9d, + 0x7a,0xf6,0x2e,0x1a, 0x8d,0xc2,0xf0,0xa2, 0x34,0x51,0x39,0x2a, 0x5d,0x45,0xe1,0xb6, + 0xc0,0x7b,0x99,0x9b, 0xdf,0x73,0x26,0x09, 0xbe,0x5f,0x16,0x3f, 0x09,0xd7,0x70,0x3a, + 0xe1,0x54,0xfb,0xd2, 0xaa,0xc8,0x0f,0xc1, 0x10,0x24,0x23,0x9d, 0x69,0x84,0x58,0xa5, + 0x86,0xa8,0x55,0xae, 0x5b,0xdd,0x62,0x63, 0x71,0x7b,0xdb,0xac, 0x72,0x34,0xba,0x1b, + 0x98,0xf9,0x16,0x68, 0xbe,0xea,0x37,0x55, 0x29,0x53,0x2e,0xe9, 0xd5,0xb9,0x88,0xc0, + 0x1a,0x17,0x99,0xcc, 0xcc,0x17,0x93,0x04, 0x20,0xf1,0xea,0xe6, 0x79,0x54,0xef,0x6e, + 0xd1,0xc8,0xd7,0x69, 0x59,0xc8,0xa8,0xb9, 0x85,0x5b,0x86,0x8e, 0xb5,0x2b,0xc2,0xe9, + 0xfe,0x8b,0x69,0xe3, 0x42,0x85,0x5a,0x8f, 0xe2,0xcf,0x7d,0xec, 0xa8,0x3f,0x79,0x86, + 0xe6,0x1b,0xdc,0xc3, 0xa6,0x7c,0x79,0x37, 0xdf,0x2e,0xd6,0x14, 0x0d,0x35,0xbb,0xeb, + 0xe3,0xb3,0xde,0xee, 0x6a,0xd1,0xa6,0x03, 0x59,0x55,0x72,0x92, 0x92,0xfd,0x84,0xed, + 0x56,0x9e,0x0f,0x0f, 0x32,0x74,0xe8,0xaa, 0x78,0x4d,0x19,0x32, 0x33,0x9f,0xfe,0x67, + 0x29,0x48,0xdb,0xc4, 0x5f,0x6b,0x11,0x9b, 0x62,0x18,0x39,0x89, 0x22,0x46,0xb8,0xe1, + 0xa1,0x0b,0x9b,0x92, 0x03,0x1b,0x26,0xda, 0xfb,0x10,0xb7,0x03, 0x17,0x5c,0xc9,0x34, + 0x93,0x63,0x60,0x36, 0xbe,0x8b,0x48,0xa1, 0xff,0x81,0xab,0x43, 0x88,0x66,0x59,0xf3, + 0xa3,0xb6,0xde,0xcf, 0xc7,0xcd,0xba,0xfc, 0x67,0x79,0x5a,0xb0, 0xc6,0xd3,0x69,0x0b, + 0x0b,0x17,0xea,0xd4, 0x6c,0x76,0x76,0x24, 0xbf,0x5f,0x7b,0xaf, 0x94,0x68,0x76,0xae, + 0x5c,0xe6,0x8d,0xea, 0xe5,0xb1,0x0d,0xc8, 0x5d,0x7f,0xf0,0xb8, 0x3c,0xa1,0x15,0x45, + 0x99,0x21,0x7b,0x68, 0xd0,0x29,0x72,0xf5, 0x4d,0x6b,0x2a,0x0e, 0x3a,0x15,0xe8,0xeb, + 0x15,0x73,0xf1,0x11, 0x2e,0xe9,0x51,0x67, 0x29,0xe9,0x8d,0x8f, 0x74,0xf9,0x05,0xfd, + 0x57,0xcc,0x5b,0xb7, 0x2d,0x6d,0xde,0x4c, 0x95,0x91,0x55,0x2f, 0x6e,0x3a,0x87,0x3c, + 0x6f,0xcc,0x6c,0xdf, 0x1e,0x4d,0x90,0x84, 0x24,0x96,0xf0,0x62, 0x62,0x86,0x25,0x0a, + 0x5d,0x3f,0x83,0x77, 0xf8,0x63,0x81,0x5d, 0x6e,0x32,0x66,0x97, 0x4b,0xe2,0xda,0xb3, + 0xd6,0x57,0xf0,0x13, 0x55,0x0e,0xe0,0xfe, 0x22,0x0d,0x91,0x49, 0xd1,0x5d,0x3c,0xa2, + 0x33,0xa6,0x28,0x32, 0xcd,0x0a,0x0c,0x69, 0x8f,0x75,0xb9,0x49, 0x84,0xac,0xe6,0x4e, + 0xdd,0x8c,0x3d,0xeb, 0xaa,0x68,0xbe,0xa2, 0x04,0x01,0xb5,0x83, 0x51,0x7d,0xc3,0x58, + 0x7d,0x0c,0x61,0xfc, 0x17,0xa7,0x8d,0x75, 0x88,0xf1,0x9c,0x0e, 0x87,0x31,0x3d,0x85, + 0xe7,0xc1,0x8a,0xba, 0xb7,0xa3,0x95,0x69, 0xb4,0x70,0x2a,0xcb, 0xe5,0xbf,0xb3,0xb8, + 0xb5,0x77,0xbd,0x25, 0xbc,0x99,0xbe,0xa4, 0x70,0xc0,0xab,0x49, 0x02,0x9f,0x84,0xb4, + 0xa4,0xb2,0xf1,0xb0, 0x1e,0x15,0xf8,0x52, 0xa4,0x92,0xd6,0xc7, 0x74,0xdd,0x1d,0xeb, + 0xbd,0xa2,0xc7,0x30, 0x58,0xaa,0x9d,0xb2, 0xab,0x82,0xe6,0x25, 0x8d,0xa1,0x59,0x46, + 0xde,0x86,0xbb,0x52, 0x3a,0xab,0x93,0x46, 0xa2,0x71,0x2b,0x2d, 0xd5,0x4f,0x00,0x8e, + 0x4c,0xc3,0x23,0xd3, 0xd4,0x61,0x7a,0xf1, 0xb3,0x27,0x19,0x18, 0x99,0xdb,0x81,0xcb, + 0xa8,0x66,0x5e,0x75, 0x4c,0xc1,0x7e,0x5f, 0xc0,0xe5,0x3d,0xa4, 0x6b,0x4a,0xb1,0x1f, + 0x3f,0x02,0xe6,0x1e, 0x01,0xf7,0x19,0x7d, 0xab,0x58,0x79,0xd8, 0x4a,0x36,0xe9,0xf5, + 0xba,0xdb,0xbb,0x4f, 0x73,0x78,0xdc,0xe5, 0x01,0x59,0x3c,0x1e, 0xa5,0xba,0xf2,0x41, + 0x0d,0xcc,0xff,0x65, 0x10,0x59,0x59,0x99, 0x9b,0x69,0x94,0x82, 0x09,0x77,0x66,0x83, + 0x68,0x77,0xb5,0x78, 0x9e,0x9b,0xb8,0x58, 0x3a,0x86,0xc4,0xf0, 0x38,0xce,0x95,0xd3, + 0x84,0x7b,0x18,0x43, 0x87,0x60,0x1b,0x7a, 0x9d,0x6d,0xf6,0x85, 0x5e,0xd6,0x9a,0xba, + 0xab,0x19,0xad,0xdb, 0x2f,0xe1,0xa3,0x65, 0x91,0x67,0x90,0xd9, 0xa8,0xb8,0x3d,0x2f, + 0x7c,0xa2,0xdf,0x0f, 0xd1,0xd6,0xfc,0xce, 0xfb,0xab,0x97,0xf9, 0x1d,0x53,0xb4,0x96, + 0xe9,0x3a,0xe6,0x1c, 0x0e,0xd1,0x52,0x4a, 0x71,0x7a,0x86,0x6c, 0x83,0xf2,0xf8,0xeb, + 0xcb,0x8d,0x16,0xca, 0x61,0x46,0x4d,0xb6, 0x8a,0x7a,0x26,0x06, 0x6b,0xdd,0x2f,0x3f, + 0xb3,0xac,0xe2,0xc9, 0xab,0xd3,0x9d,0xe6, 0xb4,0x51,0xf3,0xae, 0x4b,0x0d,0x1f,0x84, + 0x53,0xc2,0x85,0x7c, 0xc3,0x86,0x46,0xaf, 0x27,0x08,0x48,0xcd, 0xbc,0xbb,0xde,0x9e, + 0xe5,0x6f,0x7b,0x93, 0x53,0x0c,0xda,0xf4, 0xeb,0x1a,0x31,0x7f, 0x22,0xe0,0x6e,0xf7, + 0xa7,0x6c,0x72,0x97, 0x31,0x54,0xae,0x1d, 0x1c,0x35,0x4a,0x8c, 0x43,0x42,0xa3,0x11, + 0xd8,0x14,0xbf,0x6d, 0x6d,0x43,0x86,0x47, 0x6d,0x89,0x1a,0xee, 0xa4,0x0f,0x6b,0xea, + 0xd6,0xcf,0x5f,0x4e, 0xf6,0xfb,0xfb,0xe9, 0x15,0xca,0xaa,0x95, 0xce,0x28,0x18,0x9b, + 0xab,0x8e,0x60,0xa6, 0x27,0xba,0xeb,0x21, 0xd3,0x0f,0xcf,0x72, 0xd8,0x69,0xd5,0xf7, + 0xcd,0x16,0x1f,0x58, 0xc0,0x76,0x04,0x77, 0x66,0x82,0xe2,0xad, 0x15,0x3d,0xe9,0x1c, + 0xe9,0x40,0xac,0x09, 0xd0,0x99,0x80,0xd5, 0xf1,0x11,0xed,0x8a, 0xde,0x2b,0x2a,0xfa, + 0x75,0x8c,0xe2,0x2a, 0x4b,0x73,0x28,0xec, 0xa4,0xd6,0x59,0x50, 0x8c,0x45,0x65,0xee, + 0x94,0x38,0x4c,0x8c, 0x44,0x17,0x23,0x11, 0x01,0x30,0x82,0x5a, 0xb9,0x51,0x51,0x1a, + 0xd6,0x52,0xee,0x60, 0xa9,0x11,0x20,0x73, 0x66,0xdb,0x6b,0x87, 0x5b,0xa3,0x56,0x09, + 0xe7,0xae,0xdd,0x88, 0xc0,0xe8,0xf5,0x18, 0x3d,0x77,0xe9,0x45, 0xc9,0x07,0x0d,0x1a, + 0x02,0x37,0xde,0x57, 0x25,0xc9,0x2f,0xb5, 0xce,0x6f,0x15,0x4b, 0xc2,0xae,0x47,0x1e, + 0x73,0x52,0xeb,0x27, 0x92,0x4d,0xc1,0xbd, 0x99,0x14,0x64,0x02, 0xf0,0xbe,0x6c,0x3a, + 0xb3,0x66,0x65,0x17, 0xc6,0x87,0x99,0x9d, 0xb9,0xc4,0xee,0x73, 0x16,0x81,0xef,0xaa, + 0xb4,0x23,0x7d,0x11, 0x22,0x89,0x22,0x48, 0x1f,0xa8,0x73,0x93, 0xbc,0x7b,0x22,0x51, + 0x30,0x9f,0xaf,0xcd, 0x3b,0x03,0xe9,0x3b, 0xee,0x93,0x71,0x9c, 0xbf,0xaa,0xae,0x68, + 0xf5,0x50,0x41,0xfd, 0xbe,0x7e,0xe7,0x9b, 0xe8,0x3f,0xca,0x9e, 0x85,0xa3,0x89,0x76, + 0xc6,0x6f,0x06,0x07, 0x6d,0x38,0x0c,0xcf, 0xe1,0xb7,0x53,0xf2, 0xcf,0x47,0x3c,0xc2, + 0x90,0x52,0x46,0xa8, 0x10,0xf0,0x5d,0x7b, 0x8f,0x54,0x79,0x97, 0x43,0xc6,0x60,0x77, + 0xfc,0xde,0x94,0x75, 0x8f,0xdc,0xac,0x33, 0xc9,0xa4,0x21,0xee, 0x4c,0x05,0x13,0xd1, + 0x17,0xfe,0x16,0x02, 0x1d,0xfe,0x12,0xa6, 0xb6,0x39,0xb9,0xd7, 0x46,0xe3,0x27,0xcc, + 0x5e,0x6d,0x94,0xd5, 0xad,0x94,0xd6,0x22, 0xb6,0xc7,0xaf,0x69, 0x8f,0x55,0xe5,0xcf, + 0x21,0x10,0x5c,0xd4, 0xbf,0xc5,0x56,0xc2, 0xb3,0xb3,0xbe,0xe3, 0x34,0x28,0x62,0x0b, + 0x5a,0xd8,0x40,0xce, 0x44,0x75,0xeb,0x94, 0x02,0xe6,0xde,0xa9, 0x5c,0xbd,0x03,0xae, + 0x97,0x4f,0x9f,0xd6, 0xa7,0x6f,0x7b,0xf6, 0x9c,0x84,0x33,0xf6, 0xba,0x32,0xb7,0x7e, + 0x54,0x47,0x25,0xa6, 0xde,0x3f,0x93,0xb3, 0x6c,0x8e,0xa2,0xf6, 0x8d,0x6f,0xd3,0x98, + 0xac,0xc8,0x8d,0x87, 0xcb,0x31,0x8a,0xa6, 0x08,0xd3,0xb4,0x2f, 0xe1,0xb5,0xaa,0x57, + 0xc6,0xdb,0x54,0x71, 0x9e,0x7f,0x89,0xf3, 0xbb,0xae,0xc3,0xe6, 0xcb,0xf5,0x1e,0x4d, + 0x6d,0x4f,0x5f,0x2f, 0x53,0x6c,0x4c,0x7f, 0xc0,0xe7,0xd4,0x88, 0x1a,0x61,0xa0,0x70, + 0x6a,0x08,0x38,0x08, 0x40,0x5e,0xf6,0x41, 0x4f,0x72,0x76,0xff, 0xc3,0xe9,0xe9,0xc5, + 0x43,0x9f,0xeb,0x30, 0xe0,0x29,0xe3,0x6d, 0x5c,0xca,0x1d,0x3e, 0xf6,0xab,0xf5,0xb6, + 0x95,0xf0,0xf5,0xa2, 0x9a,0x89,0x2f,0x9c, 0xe3,0x7b,0x8e,0xb2, 0xa2,0x51,0xb5,0xef, + 0x95,0xe7,0xe9,0xe6, 0xba,0x6f,0x88,0x0d, 0x6b,0x89,0x22,0x52, 0xd3,0x37,0xe9,0x0d, + 0x95,0x49,0x3d,0x63, 0x6c,0x72,0x88,0x44, 0xda,0x6d,0xca,0xd4, 0x18,0x14,0x03,0x10, + 0xc2,0x8a,0x0f,0x88, 0xa8,0x8c,0xd7,0xea, 0xe4,0xb9,0xef,0x27, 0x53,0xda,0xf9,0x47, + 0x9d,0xfd,0x98,0x39, 0x37,0x0b,0xce,0x23, 0xd7,0xe8,0xef,0xcf, 0x69,0x4e,0xb9,0x88, + 0x0e,0x8a,0x2f,0xfb, 0x5a,0x4e,0xff,0x6f, 0x6f,0x0d,0x4f,0x32, 0xae,0xfa,0xa6,0x70, + 0x72,0x29,0x54,0x83, 0x78,0xd4,0x43,0x42, 0x91,0x1c,0xc7,0xd8, 0x8a,0xd3,0x5c,0xbb, + 0x41,0x94,0x78,0xe6, 0xa7,0x1c,0x7c,0xf2, 0x80,0x58,0x24,0xa1, 0xb8,0x79,0x5d,0xbe, + 0x7b,0x4f,0x80,0x78, 0x1d,0x3e,0xba,0xbd, 0xad,0x05,0x11,0x23, 0xb7,0x4c,0xc8,0xf7, + 0x87,0xce,0xf8,0x94, 0x97,0x9d,0x4c,0x17, 0xb1,0x21,0x44,0xb1, 0x47,0x29,0x22,0xbc, + 0xe6,0x48,0x1a,0x35, 0x07,0x91,0x91,0xd2, 0x97,0x32,0xfb,0x31, 0x99,0x53,0x37,0x8f, + 0xb0,0x84,0x97,0x18, 0xb3,0x6c,0x8c,0xd9, 0xc4,0xb3,0x02,0xe2, 0xfc,0xcf,0x8e,0xfe, + 0x30,0x0e,0xa0,0xfe, 0x15,0xe8,0xf6,0x2c, 0x57,0x03,0x0d,0xae, 0xf2,0x74,0x98,0xb5, + 0x59,0x1a,0x0c,0xcc, 0x9a,0x98,0x33,0x20, 0x60,0xcb,0x00,0x65, 0x31,0xb4,0x90,0x79, + 0x6f,0x11,0x89,0x77, 0x97,0x55,0x8f,0xdb, 0xa1,0x91,0xc7,0x7e, 0xf2,0x1a,0x26,0x31, + 0x95,0xf8,0xa2,0x17, 0x83,0x4d,0x5a,0x00, 0x1e,0xf6,0xb2,0x58, 0x72,0xf3,0xfa,0x49, + 0xb9,0xa1,0xee,0xa8, 0xde,0x2c,0xa1,0x81, 0xeb,0x34,0x1b,0xef, 0xeb,0x40,0xdf,0x72, + 0x1b,0x21,0xcb,0x54, 0x06,0xae,0x3c,0xb3, 0xc9,0xfb,0x6a,0x40, 0x58,0x04,0x59,0xc5, + 0x20,0x55,0x0e,0x0d, 0x1e,0x73,0x14,0xc6, 0x87,0xaa,0x70,0x66, 0x3e,0xc4,0x70,0x35, + 0x57,0x74,0xf8,0x7d, 0xb4,0x08,0xe9,0x38, 0xae,0x9f,0x1f,0x8c, 0xff,0x81,0xf5,0xef, + 0xcf,0x32,0x8a,0x28, 0x28,0x91,0x8c,0xf0, 0xe0,0x3d,0xf2,0x20, 0x4e,0x72,0xcf,0xce, + 0x97,0x7a,0x44,0xe4, 0x93,0xba,0x6b,0xdd, 0x17,0x7c,0x2d,0xb7, 0x5b,0x85,0x3b,0xde, + 0xcd,0xab,0x53,0x92, 0x32,0x70,0x3c,0x3f, 0xb4,0xda,0x3a,0x3a, 0x1b,0x16,0xc4,0x25, + 0xf3,0x0b,0xc2,0xe6, 0xd9,0xbf,0x6b,0xa9, 0x5d,0xef,0x34,0xe2, 0x3a,0xab,0x8b,0x84, + 0x7a,0x7e,0x44,0x8c, 0x4a,0x7f,0x04,0xa9, 0x98,0x75,0x35,0x91, 0xfc,0xb9,0x32,0xed, + 0x13,0x3f,0xce,0xde, 0x37,0xa0,0xf6,0xac, 0x7a,0x51,0x7e,0x9b, 0x37,0x1b,0x28,0x48, + 0x6e,0xa6,0x4f,0x22, 0x12,0x75,0x3a,0x31, 0x5f,0x4b,0xd7,0xb7, 0x55,0x1f,0xcf,0x1e, + 0x7f,0x53,0xd8,0x66, 0x53,0x17,0x2b,0xf9, 0xbc,0xe9,0x18,0x0d, 0x25,0x7c,0x8e,0xf2, + 0x5e,0xa6,0x2b,0x78, 0xb4,0x23,0xd3,0xb2, 0xdf,0xe2,0xca,0x71, 0x1d,0xdf,0x47,0x1b, + 0x3a,0x25,0x68,0x92, 0xea,0xe8,0x39,0xb4, 0xe0,0xbd,0x82,0x37, 0x25,0xfe,0x17,0x29, + 0xac,0xfe,0xa3,0x7d, 0x8b,0xf8,0x5f,0x94, 0xc6,0xf0,0xd2,0xb8, 0x51,0xb8,0x3f,0x5d, + 0xf7,0xe9,0x25,0x88, 0x03,0x4a,0xfc,0xbb, 0xcb,0xea,0xda,0xf0, 0xb7,0x38,0xb0,0x49, + 0xb1,0x10,0x73,0x8c, 0x75,0xb5,0xab,0x29, 0x25,0x34,0xdf,0x34, 0xc8,0x9f,0x8d,0xb0, + 0x9c,0xd6,0xc7,0x59, 0x28,0x9c,0xb7,0x35, 0xbd,0xe5,0xbd,0xf5, 0xf6,0x26,0x46,0x2b, + 0xbf,0x53,0x83,0xf2, 0x8a,0x53,0x50,0x20, 0xdd,0x4c,0x40,0x11, 0xb2,0x13,0xa5,0x88, + 0xba,0x73,0x9c,0x57, 0x82,0xe3,0x06,0x8a, 0xd0,0xde,0x51,0x6c, 0xd0,0xee,0xf5,0x08, + 0x3a,0x00,0xa0,0xf8, 0xd8,0x4d,0x56,0x5f, 0xc7,0xb5,0xc2,0x55, 0x3e,0x24,0x7f,0x32, + 0xa5,0x8b,0xbb,0x36, 0xf8,0xc8,0x46,0x3b, 0xc1,0x89,0x11,0x9f, 0x6a,0x5e,0xdd,0xeb, + 0x11,0xa0,0x16,0x7a, 0xd3,0x71,0xdb,0xad, 0x68,0x67,0xe4,0x43, 0xfc,0x78,0x95,0xb6, + 0xea,0xb3,0xf2,0xcb, 0xf2,0x5d,0x39,0x80, 0x2f,0x08,0xd4,0x97, 0x9a,0x8d,0x7b,0xdc, + 0x35,0x93,0x24,0xd8, 0x6e,0x33,0xe9,0xe8, 0xa2,0xcb,0x7b,0xfd, 0x24,0xb2,0xf0,0x34, + 0x77,0x97,0xf1,0xb3, 0xeb,0xe0,0x34,0x79, 0xc7,0xd2,0x59,0x36, 0xb2,0x74,0xb5,0x21, + 0xec,0x98,0x51,0xc4, 0xcd,0xe3,0x68,0x6e, 0xbc,0xac,0xdb,0xb4, 0x37,0xb3,0x72,0x9e, + 0x6b,0xaa,0x91,0x15, 0xd5,0xc0,0xca,0xd1, 0x6f,0x5a,0xf9,0x9b, 0x2a,0xa7,0x24,0x83, + 0xc2,0xfb,0x7b,0x68, 0x7b,0x7f,0xb4,0x98, 0xec,0xfa,0x8b,0xcf, 0x33,0x0e,0xc7,0x03, + 0x37,0xd2,0xb6,0xf4, 0x79,0x9d,0x4e,0x56, 0x3d,0x08,0xc9,0x32, 0xa1,0x0e,0x6e,0xe6, + 0x98,0xb8,0x64,0x25, 0x21,0x9b,0x9a,0x76, 0x78,0xb9,0x08,0xa8, 0x46,0x25,0x8e,0xb6, + 0xb8,0xef,0xfa,0xa7, 0x4e,0xf5,0xdf,0x80, 0x87,0xdd,0x67,0x5c, 0xbb,0x24,0xe1,0xdf, + 0x20,0x29,0x90,0xc4, 0x4e,0xb1,0x1f,0x40, 0x86,0x03,0x27,0x64, 0xb4,0xda,0xf4,0xba, + 0xf6,0xd7,0xcb,0x81, 0x8a,0x94,0x9e,0x8d, 0x65,0xad,0xf8,0xcf, 0xc2,0xab,0x62,0xf9, + 0x99,0xea,0xb1,0x3c, 0x75,0x9e,0xc2,0x35, 0x63,0x5c,0xa3,0x29, 0x6e,0x12,0xf6,0x78, + 0x36,0x78,0x26,0x07, 0x67,0x91,0x0b,0x4b, 0x1b,0x13,0xb9,0x9f, 0xe8,0x32,0xcb,0x18, + 0x0f,0x29,0x6e,0x53, 0x01,0xdd,0xd2,0x5c, 0x47,0xec,0x77,0x34, 0xa0,0xf3,0x3d,0xe5, + 0x5c,0xa3,0xab,0x93, 0xcf,0xe0,0xda,0x68, 0xd1,0x23,0x82,0x7e, 0x49,0x7c,0x17,0x56, + 0xf6,0x97,0x4f,0x3e, 0x84,0x89,0x7d,0xe5, 0x5d,0x97,0x51,0x15, 0xd2,0x8d,0x93,0x95, + 0xaf,0x17,0xd9,0x0b, 0x44,0x26,0x4f,0x40, 0xfa,0x15,0x32,0xde, 0xe2,0xc0,0x3a,0xaf, + 0xc5,0xe7,0x98,0xc7, 0x50,0xb3,0x76,0x32, 0xa5,0xe4,0x22,0xa2, 0x16,0x24,0x36,0x2c, + 0x72,0xbe,0xd9,0xe8, 0x46,0xc6,0xe8,0xfd, 0x2d,0x60,0xba,0x9f, 0x5c,0x20,0xfe,0x7e, + 0x03,0x75,0x0d,0xe9, 0xab,0xce,0x3c,0xaa, 0x50,0x89,0xe6,0x8b, 0xea,0x1a,0xbc,0x61, + 0x81,0x2b,0xc5,0x00, 0xde,0xe7,0x1b,0x2a, 0x4b,0x0d,0x76,0xf3, 0x4e,0xe5,0x56,0xb6, + 0xcd,0x92,0x67,0x59, 0xb2,0xbf,0x95,0x96, 0x69,0x78,0xdf,0xe3, 0x24,0xba,0x81,0x85, + 0x0c,0xe7,0x9d,0x0b, 0x4f,0x13,0x0e,0xb7, 0x2c,0xd1,0xb3,0xa8, 0xd6,0xf6,0x72,0x5d, + 0x40,0xfd,0xbc,0x4b, 0x8d,0xc6,0x95,0x05, 0x48,0xea,0x6d,0xad, 0xd7,0xae,0xa9,0xaf, + 0x5b,0xb7,0xa7,0x4b, 0x53,0xf0,0xff,0xec, 0xcf,0x3b,0xf3,0xf1, 0xa3,0x41,0xfc,0x1a, + 0xc7,0xc0,0x9f,0x55, 0x07,0xeb,0x75,0xe8, 0x12,0x5c,0x84,0xfb, 0xd4,0x24,0x68,0x51, + 0x4e,0x13,0x28,0x53, 0xce,0x9c,0x28,0xeb, 0x20,0x4e,0x43,0xf2, 0x93,0xcf,0xe8,0xdd, + 0xf0,0x94,0x74,0x66, 0x6d,0x67,0xef,0xca, 0x4a,0xb9,0x58,0x42, 0x19,0x4a,0xa7,0xeb, + 0xb5,0xae,0xa7,0x9e, 0x34,0x33,0xc4,0x35, 0xd9,0x37,0x4b,0x63, 0x18,0x12,0xef,0xe0, + 0x85,0xce,0x91,0xd0, 0xa8,0xcb,0x83,0xba, 0x91,0xc7,0xb5,0x39, 0x2d,0x13,0x7d,0x8f, + 0x52,0xce,0x24,0x8c, 0x25,0xd1,0xac,0xd5, 0x36,0xbc,0x98,0xd0, 0xf3,0xd2,0x26,0x72, + 0xa6,0x42,0x4c,0xe1, 0x3b,0x36,0x96,0xa4, 0x1d,0x5c,0xfd,0xbd, 0xfd,0x3b,0x48,0xad, + 0xcf,0x9e,0xbc,0x57, 0x40,0x2e,0x8e,0xbf, 0xee,0xaf,0xca,0x65, 0x5e,0x74,0x98,0xf5, + 0xeb,0x88,0xe9,0x5d, 0xcb,0xe5,0x3a,0x6f, 0x5d,0x32,0x57,0x6f, 0xeb,0xa6,0xed,0x54, + 0xc5,0xef,0xbe,0xda, 0x06,0xae,0xa2,0x69, 0xda,0x99,0xb5,0xae, 0x9a,0xf1,0x99,0x70, + 0xd5,0x02,0xf3,0x0e, 0xf3,0x11,0x53,0xe6, 0x1b,0xad,0x35,0x0c, 0x3d,0x0e,0x35,0x2a, + 0x3e,0xb2,0xe4,0xc3, 0xcb,0xcc,0x1b,0x7e, 0x6b,0x08,0x60,0x10, 0xee,0x94,0x1c,0x56, + 0x16,0xae,0x11,0xb5, 0xa6,0x9c,0x15,0x19, 0xf2,0x71,0x8a,0xb0, 0xa4,0x94,0x08,0xf4, + 0x89,0x72,0x0e,0xdc, 0x21,0x9e,0x15,0x14, 0x8c,0x04,0x07,0x94, 0xe8,0x9e,0x66,0xeb, + 0xf9,0x28,0xf5,0x82, 0x05,0xad,0x6f,0x68, 0x82,0xc9,0x74,0x43, 0xb3,0xbf,0x4d,0x90, + 0x18,0x8a,0x79,0x1e, 0x5c,0xbd,0x73,0x22, 0x55,0x9c,0x4e,0xad, 0x23,0x7c,0xcf,0xe3, + 0x21,0x30,0x4e,0xf2, 0x4e,0x80,0x70,0xde, 0xa0,0xca,0x33,0x16, 0xec,0x5c,0x19,0xda, + 0x9e,0x0d,0x0a,0x11, 0xc5,0xcf,0xc1,0xed, 0x64,0xea,0x39,0x3b, 0x52,0x56,0xd7,0x62, + 0xe6,0x8f,0x55,0xcd, 0xbc,0xed,0x3b,0x56, 0xaf,0x62,0x9f,0x87, 0xbe,0xb3,0x78,0xa2, + 0xb7,0xf1,0xd6,0xbd, 0xde,0xe2,0xc9,0xe6, 0x0a,0x15,0x5d,0x13, 0x6e,0xc2,0x51,0x85, + 0xaf,0x10,0xf2,0x2a, 0x8f,0x5a,0x56,0x89, 0xd6,0x8b,0xb6,0x86, 0xe6,0x2d,0x82,0x19, + 0xf5,0x36,0xdc,0xd8, 0xd8,0xc0,0xc3,0x14, 0x13,0x9a,0x94,0xdd, 0xa8,0xcd,0x8b,0x83, + 0x22,0xe4,0x73,0x5d, 0x72,0xc5,0xc6,0x4b, 0x05,0x41,0x1d,0xb5, 0x1c,0x2f,0xbc,0x84, + 0x1d,0xd3,0x81,0x3a, 0x92,0xbc,0x68,0x21, 0x08,0x4f,0xf7,0xaf, 0xe5,0xec,0x69,0x7e, + 0xe7,0xd2,0xd5,0x7a, 0xb9,0x58,0x07,0xff, 0x5c,0x08,0xc4,0x8f, 0xa9,0x54,0xbd,0xa5, + 0xbd,0xbe,0x53,0x69, 0x95,0x0c,0x84,0x77, 0x59,0x9d,0xc1,0xa9, 0xcf,0x99,0xce,0x16, + 0x67,0xa4,0x8d,0xaf, 0x4b,0xe9,0xc8,0x8f, 0xc1,0x07,0xa1,0x7f, 0x91,0x5c,0x98,0xcf, + 0x55,0xfd,0x69,0xa3, 0x81,0xa4,0x8f,0x5b, 0x02,0xd2,0x30,0xf6, 0x22,0xf3,0x5c,0x9f, + 0x8b,0x3d,0x8a,0x00, 0x09,0xf3,0x6c,0x19, 0xbe,0xa3,0x59,0xf7, 0xd6,0x38,0x54,0x3f, + 0xa4,0x1b,0x80,0xad, 0x1e,0x1e,0x1e,0x45, 0xa2,0x3f,0xfd,0xbc, 0xc2,0xea,0x54,0x75, + 0xdc,0x6c,0x8f,0x84, 0xc8,0xdf,0x40,0xea, 0x0b,0xe4,0xbf,0xe0, 0xe0,0x9a,0x33,0xf3, + 0x62,0x7c,0xae,0x2b, 0xdc,0xdd,0xa3,0xab, 0x8b,0x49,0xaa,0xd3, 0xcd,0xe9,0xb0,0x11, + 0xb1,0xdc,0x03,0x21, 0xb2,0xfa,0x51,0x9d, 0x15,0xd0,0xbc,0x83, 0xe0,0xef,0xb6,0x7c, + 0x85,0x87,0xf6,0xf3, 0xfb,0x7d,0x1f,0xb7, 0x0f,0x57,0xeb,0x95, 0xe5,0x3f,0xb5,0x9c, + 0x9c,0xf3,0xcd,0x44, 0x50,0xd3,0x3f,0x60, 0xa1,0x42,0x63,0x10, 0x59,0x0a,0xb8,0x9a, + 0xa9,0x00,0xb5,0xab, 0xb7,0x32,0x15,0x08, 0x97,0x6b,0x21,0x50, 0xa2,0x48,0x2c,0x4b, + 0x35,0xf2,0xa0,0x6e, 0x3e,0xad,0x23,0x4e, 0x1a,0x94,0x07,0x86, 0x40,0x3d,0xcc,0xb6, + 0x61,0x71,0xbe,0x12, 0x63,0xcb,0xf3,0x4a, 0xc4,0xfc,0xfd,0xf5, 0xb0,0x61,0xc7,0xe6, + 0x03,0x91,0x55,0x30, 0x6b,0xfc,0x03,0xb4, 0x3d,0x08,0xea,0x02, 0xe3,0x45,0x39,0xcd, + 0xae,0xb2,0x10,0x86, 0x46,0xf4,0xcc,0x37, 0x7d,0x30,0xe9,0x53, 0x73,0xc2,0x98,0x60, + 0x27,0xdc,0x31,0xa5, 0x7e,0xd8,0xad,0x8c, 0x6c,0x1e,0xfd,0x70, 0xfb,0xdf,0xb3,0x10, + 0x4c,0x5e,0x99,0x31, 0xe8,0x14,0xdc,0x05, 0x05,0x7e,0xf4,0xf7, 0x85,0x4d,0xe0,0x28, + 0x4d,0x4a,0x71,0x19, 0xd7,0x2b,0x8e,0xc6, 0xf6,0x63,0x07,0x27, 0x70,0xdf,0xc7,0xb3, + 0x71,0xdf,0xe7,0xf5, 0x3c,0x5f,0xb4,0x3d, 0xcf,0xea,0xf1,0x90, 0x67,0x84,0xc7,0x33, + 0xfb,0x4f,0xc1,0x9f, 0x50,0x4d,0x9e,0xe0, 0xfe,0x24,0xe4,0x52, 0x5a,0x93,0x0c,0xf5, + 0x28,0x82,0x6d,0x82, 0x3e,0xc9,0xe5,0x91, 0x8f,0x54,0x39,0x0b, 0x71,0x54,0xe2,0x12, + 0xea,0x27,0x99,0x1a, 0x9b,0xd9,0x8b,0x7f, 0x2a,0x73,0x89,0xae, 0xc5,0xff,0x1e,0xfd, + 0x6b,0x5d,0xfe,0x9b, 0x56,0xaf,0x1d,0x11, 0x8c,0x15,0x0d,0xc8, 0xd7,0xc5,0x79,0xcc, + 0xa8,0xa0,0xd7,0xdd, 0x28,0x86,0x9c,0x2f, 0x66,0x42,0x5b,0xf8, 0xa0,0x03,0xb1,0xd0, + 0x8b,0xac,0x13,0x91, 0xec,0xa9,0xf7,0xb7, 0xba,0xeb,0x9e,0x37, 0x39,0xd8,0xe1,0x91, + 0x6a,0xee,0x14,0xda, 0x3d,0x87,0xf5,0x5a, 0x82,0x45,0x31,0xdb, 0xb4,0x78,0x64,0x58, + 0x4f,0x1f,0xe1,0x72, 0xfd,0xa3,0xa5,0xe3, 0xeb,0xbe,0x3d,0xe2, 0x11,0xd9,0xcd,0xba, + 0xd7,0xba,0x2d,0xae, 0xc3,0xc2,0xe8,0x6d, 0x3f,0x1e,0xdc,0x44, 0xfe,0xa0,0x35,0x0e, + 0x0f,0x7c,0x77,0xac, 0xbf,0xd6,0x09,0x22, 0xcc,0x21,0x11,0xf4, 0x49,0x4a,0x4c,0x7c, + 0xe9,0x26,0x0d,0x35, 0x9c,0x15,0x2a,0xe9, 0x6b,0x2c,0x3c,0x94, 0xa9,0x08,0xf7,0x99, + 0x1c,0x9f,0x8a,0x1f, 0x44,0x03,0xc1,0xb0, 0x6a,0x12,0x3c,0x4d, 0x55,0x6f,0x60,0x74, + 0x81,0xd4,0x3b,0xca, 0xd7,0xbd,0x76,0xb7, 0xed,0x5a,0xd2,0x19, 0x17,0xdb,0xb5,0xc0, + 0xc9,0x8c,0x2f,0x41, 0x02,0xf1,0x95,0x4c, 0xc1,0x62,0x1f,0xed, 0x87,0xf7,0x5f,0xdb, + 0x0e,0x8b,0xcb,0xe0, 0x3a,0xe7,0x68,0x32, 0xc2,0x68,0xe4,0x75, 0x11,0x38,0x3c,0x75, + 0x3f,0x8e,0x49,0xdb, 0x52,0x6a,0x66,0x7c, 0x55,0x1b,0x14,0x02, 0x06,0x29,0x25,0x53, + 0xf7,0xf5,0x88,0x06, 0x00,0x9a,0xf9,0x71, 0x63,0xc9,0xca,0x7e, 0xda,0x1e,0xfb,0x7c, + 0xc7,0xeb,0x0a,0xf1, 0xdc,0x4b,0x6d,0xbf, 0xb3,0xc3,0xba,0x32, 0xb0,0xa1,0x08,0x37, + 0x4f,0x20,0xeb,0x60, 0x14,0xd8,0xa2,0x21, 0x40,0xdb,0x1b,0x8f, 0x51,0x7d,0xe0,0xb6, + 0xd7,0x95,0x46,0xdc, 0xe6,0x06,0x0b,0xa0, 0x42,0x20,0x1c,0xf8, 0xe7,0x0c,0x8f,0x59, + 0x31,0xa9,0x82,0x43, 0xba,0xb7,0xb4,0xb1, 0xbd,0x55,0xde,0xe4, 0xe0,0x26,0x0e,0xc9, + 0x5c,0xdf,0xed,0xe4, 0x2e,0x20,0xb1,0x93, 0x7a,0x90,0x5e,0xa6, 0xfd,0xa2,0x57,0x6d, + 0x6d,0xb1,0x67,0xe7, 0x18,0x70,0x3b,0x19, 0x05,0xd4,0x1b,0x08, 0xac,0xb6,0x7a,0xbd, + 0x21,0xd3,0xec,0x8b, 0x67,0x37,0x5b,0xf6, 0xc0,0x1a,0x48,0x81, 0x10,0x0e,0xc9,0x34, + 0x5d,0xb6,0x98,0x94, 0x26,0x20,0xbb,0x0c, 0x4c,0x7c,0xdb,0xfa, 0x9b,0xc8,0xee,0xea, + 0xc8,0xad,0x74,0xed, 0xbb,0xaf,0xcf,0x79, 0xc9,0xf4,0xdc,0xff, 0x11,0xc4,0xd6,0x1f, + 0xf6,0x7c,0x14,0xed, 0x0e,0x7c,0xcb,0x5f, 0xf0,0xa0,0xb5,0x0c, 0xd4,0xad,0x9f,0x39, + 0x55,0xb3,0xe6,0x45, 0xec,0xf1,0x10,0xfe, 0xf8,0x82,0x11,0x5a, 0x31,0xa1,0x4c,0x42, + 0x76,0xc9,0x0c,0x8c, 0x03,0x3d,0x11,0xde, 0x66,0x0c,0xa2,0xb2, 0xe4,0xb9,0x0e,0xf5, + 0xf8,0x6b,0x48,0x9a, 0x6a,0x84,0x88,0x50, 0xa0,0xe4,0x89,0x7d, 0x56,0x75,0xdf,0x6f, + 0xa7,0xa8,0x2a,0x41, 0x43,0x88,0x7f,0xf1, 0xad,0xd4,0xb0,0x9a, 0xa8,0x93,0x25,0xd5, + 0xd9,0x99,0xae,0xb2, 0x90,0x41,0x24,0x17, 0x7f,0x49,0x5c,0x45, 0x11,0x34,0x82,0x7a, + 0xae,0x46,0xe3,0xf0, 0xc5,0xbb,0x5e,0xc7, 0xdd,0x54,0xc5,0xd1, 0x32,0xd4,0xbf,0x59, + 0x2b,0x2a,0xb2,0x5a, 0x79,0x74,0x70,0xa3, 0x5d,0xcb,0xd4,0xd1, 0xee,0x25,0x57,0xbf, + 0x49,0x08,0x06,0x58, 0x28,0xc8,0x61,0xb2, 0xfa,0xac,0xd5,0x73, 0xec,0xa2,0x42,0x0e, + 0x39,0x94,0xbe,0xc3, 0x6b,0xe7,0xcd,0xfd, 0x21,0x47,0xd1,0xfa, 0x61,0x13,0x31,0x3e, + 0xe7,0x7f,0x5d,0x1b, 0xb4,0x7e,0xd3,0x2b, 0xb0,0x3c,0x8e,0xfe, 0xf3,0xc8,0xd3,0x53, + 0x65,0x45,0x2b,0x4b, 0x49,0x70,0xf4,0x85, 0x05,0x6c,0x8a,0x2e, 0x69,0x33,0xfc,0x8e, + 0x41,0xfc,0x31,0x78, 0x9a,0xa3,0x74,0xcf, 0xde,0xd7,0x0d,0x95, 0x68,0x73,0xa4,0x26, + 0x48,0xfa,0x93,0xfa, 0xe3,0xdc,0x60,0x06, 0x61,0x53,0x53,0xa1, 0x86,0x40,0xd5,0x73, + 0x73,0xc5,0x9f,0xd7, 0x27,0xd3,0x10,0x48, 0x97,0x96,0x10,0x4b, 0x84,0x5d,0x4b,0x82, + 0xe8,0x06,0x14,0x4b, 0x8d,0x57,0x9b,0xfa, 0xe5,0x35,0xc7,0x4a, 0x65,0x25,0x50,0x41, + 0x25,0x0d,0x38,0x50, 0x81,0xc0,0x40,0x03, 0x14,0x9c,0x25,0x6a, 0x00,0xf9,0x34,0x47, + 0x86,0xc5,0x36,0x51, 0x38,0x1b,0x29,0x27, 0x05,0xb8,0x85,0x75, 0x99,0x83,0x29,0x81, + 0x53,0x4c,0xa2,0x08, 0xa6,0x01,0x42,0x62, 0x6e,0x4c,0x34,0xc6, 0x96,0x0b,0xdc,0xef, + 0x4f,0x08,0x6d,0x95, 0xad,0xca,0x90,0x78, 0xe1,0x52,0xba,0xa9, 0x06,0x97,0x0c,0xc4, + 0x3a,0x1a,0x6f,0x46, 0x8d,0xd7,0x37,0xeb, 0x4a,0xea,0xfa,0xb4, 0x48,0x42,0x92,0x10, + 0x25,0x21,0x40,0x5e, 0x11,0xdb,0x2d,0x34, 0x35,0x31,0x02,0x0d, 0xd8,0xa1,0x33,0x86, + 0x25,0x71,0x84,0x9a, 0x4d,0x95,0x93,0x32, 0xde,0xe6,0xea,0x02, 0x6d,0x01,0x4b,0x29, + 0xcc,0x41,0x36,0x43, 0x19,0x28,0x33,0x2c, 0xf6,0x87,0x8e,0x44, 0x8b,0xfb,0x80,0x35, + 0x4e,0xbc,0x71,0xb1, 0x40,0x17,0x51,0x4e, 0x0f,0x08,0x52,0xf7, 0xde,0x1c,0x0d,0xf5, + 0xc9,0x46,0x81,0x9b, 0x9e,0x72,0x19,0x04, 0x9b,0x7f,0x8c,0xea, 0xcc,0x58,0x07,0x2a, + 0x0c,0x92,0x09,0x3d, 0xd3,0xc8,0xd6,0x76, 0xf8,0x8c,0xaa,0x1c, 0x18,0x1e,0x7a,0x76, + 0xdf,0x6f,0x19,0x60, 0xd5,0xc7,0x52,0xb8, 0xd3,0x9e,0x03,0xbc, 0x23,0x18,0x5a,0xaa, + 0x60,0xfa,0xd2,0x1d, 0x05,0x9a,0xae,0x1a, 0x80,0xcc,0xeb,0xeb, 0x6f,0x42,0x62,0x88, + 0xe8,0x23,0x02,0x67, 0x1d,0x00,0xdd,0xf1, 0x19,0x17,0x25,0x89, 0x16,0x44,0x48,0x22, + 0x82,0xd2,0x35,0xbe, 0x6c,0xe7,0x46,0xc4, 0xaf,0x9d,0xbc,0xa6, 0x93,0x6e,0x8a,0x92, + 0x84,0x5a,0x11,0xef, 0x3d,0x1b,0xf3,0xcd, 0x7f,0x57,0x9a,0x80, 0xd7,0x3b,0x98,0x17, + 0x56,0xc3,0xb4,0xa2, 0x57,0x37,0xa6,0x00, 0x5e,0x55,0xbe,0x91, 0xc2,0x09,0x10,0x3b, + 0xfd,0x54,0xaf,0xf3, 0x97,0x67,0x23,0x84, 0xea,0xcf,0x5a,0x87, 0x3a,0x2a,0xc5,0x37, + 0xc2,0x9c,0x83,0xf0, 0x56,0x99,0x94,0x05, 0x7e,0x2a,0xe6,0xc4, 0xaf,0x72,0xc5,0xdd, + 0xe2,0xe4,0x0c,0x2e, 0xe7,0xb1,0xf1,0xbc, 0x4d,0xcd,0xac,0x5d, 0xc1,0x5b,0x68,0x04, + 0xbb,0xec,0x90,0xd3, 0x2f,0x16,0x74,0xa1, 0x3e,0x67,0x10,0xc7, 0xef,0xb3,0x49,0x12, + 0x5b,0x4c,0x18,0xed, 0xab,0x6f,0xec,0x16, 0x1c,0x95,0xdf,0xa1, 0xba,0x77,0x6b,0xd9, + 0x59,0xdd,0x84,0x56, 0x5e,0x37,0xe0,0xa2, 0x3d,0xd9,0xb4,0x38, 0xc3,0x2c,0xba,0xda, + 0x0a,0xf3,0xb8,0xc4, 0x77,0xfa,0x4d,0x83, 0x93,0x0c,0x62,0x30, 0x5e,0x1a,0xde,0x2e, + 0xbb,0xdd,0x56,0xdb, 0xf4,0xa8,0x32,0x4b, 0x93,0xda,0x83,0xa1, 0x43,0xb4,0xb1,0xd6, + 0xb4,0xc0,0x4c,0x26, 0x01,0x6d,0xca,0x54, 0xbd,0xc0,0xbb,0xa6, 0x9c,0xc0,0xb8,0xe0, + 0x90,0x32,0xc1,0x63, 0x68,0x22,0x08,0x1d, 0xea,0x02,0x40,0x3f, 0xf7,0x1c,0x0e,0x9f, + 0xda,0xa7,0xb7,0xf1, 0x74,0xf2,0xc4,0x61, 0x35,0xe7,0x59,0x08, 0xe9,0x1c,0x13,0x15, + 0xa4,0x72,0x78,0xab, 0x05,0xa2,0xa2,0xbc, 0xa4,0x24,0x5b,0xb5, 0xa0,0x48,0x97,0x30, + 0x8f,0x61,0xfd,0xde, 0x7f,0x8d,0xbf,0xe5, 0xb0,0xfd,0x2e,0x07, 0xc9,0xc0,0xbb,0xe4, + 0x4d,0xe9,0x52,0x0b, 0x84,0x18,0x8a,0x02, 0xc3,0x80,0x03,0xd2, 0xf1,0x81,0x06,0x9a, + 0x14,0x88,0x67,0x42, 0x6b,0xf1,0x10,0x71, 0x1f,0x24,0x92,0xa4, 0xa8,0x9e,0x0c,0x05, + 0x05,0x77,0x9d,0x17, 0x75,0x39,0xf2,0xdc, 0xc4,0xca,0x14,0x5c, 0x46,0x87,0x44,0x47, + 0xba,0xde,0x74,0xf3, 0x26,0xca,0xb2,0x8c, 0x85,0x58,0x21,0x8d, 0x05,0x73,0x75,0xd9, + 0xd6,0xac,0x50,0x67, 0x71,0x6f,0x7e,0xc7, 0x43,0xf2,0xb2,0x32, 0x78,0xc5,0x01,0x05, + 0xc0,0xa8,0xc1,0xa8, 0x81,0x34,0xc9,0xa0, 0xd1,0xc4,0x3b,0xed, 0x53,0x2a,0x0c,0xff, + 0xee,0xab,0x55,0xbc, 0xe7,0x0a,0xac,0xf5, 0x53,0x10,0xdd,0x2c, 0x6a,0xfd,0x75,0x70, + 0x5d,0x9f,0x7f,0x0f, 0x6f,0x72,0xe7,0x70, 0xf3,0x74,0xcf,0x69, 0x47,0xdf,0x8d,0x16, + 0x56,0x01,0x8c,0x9f, 0xcd,0xee,0xc2,0x25, 0x9a,0x86,0xcb,0x6b, 0x40,0xd9,0x2b,0x82, + 0xca,0x21,0x80,0x54, 0xc0,0xc8,0x70,0x1a, 0x25,0xe8,0x3c,0x0f, 0x9a,0x1c,0xe4,0xee, + 0x94,0xd4,0x10,0xdd, 0x99,0x4b,0x62,0xd6, 0x79,0xa0,0xea,0x49, 0x88,0xb6,0x0e,0x5b, + 0xa6,0xed,0x4f,0x51, 0x8e,0x37,0x2b,0x73, 0xd5,0xe7,0x5d,0xfb, 0xbe,0xc3,0xc6,0x82, + 0x1f,0x38,0x04,0x80, 0xbc,0x11,0x09,0xe8, 0xd2,0x20,0xe9,0x3b, 0x0d,0x30,0x31,0x71, + 0xaf,0xbc,0x08,0x5f, 0xf5,0x2a,0x3a,0x8d, 0xa7,0xb5,0x33,0x6d, 0x34,0x8e,0x11,0xd7, + 0x13,0xc5,0x0b,0x2c, 0x90,0x60,0x36,0x8a, 0x91,0x58,0x0f,0x82, 0x2d,0x18,0x15,0x60, + 0xc9,0x2f,0x62,0x15, 0x24,0x04,0xa8,0x15, 0x0d,0x12,0x1a,0x93, 0x5c,0xbf,0x44,0x0e, + 0x47,0x93,0xcb,0x41, 0x66,0x0f,0xed,0xc0, 0x1e,0x84,0x2c,0x75, 0xad,0xaf,0x11,0x1f, + 0x5f,0xe7,0x3f,0x73, 0xa5,0xb0,0x8e,0xdb, 0xd6,0xa4,0x5e,0xbf, 0x5c,0x9e,0xe6,0xae, + 0x83,0x1e,0x7d,0x9d, 0xaa,0x10,0xae,0xd0, 0x13,0xa2,0xe9,0x21, 0x9e,0xb1,0x2f,0x8a, + 0xe8,0x5c,0xc9,0xd1, 0xad,0x04,0x1e,0x86, 0x7d,0x74,0xf4,0x0c, 0x06,0x85,0x23,0x15, + 0x4c,0x80,0xcf,0xed, 0x2c,0x13,0x94,0x7b, 0x83,0x00,0x48,0x7d, 0xde,0x83,0xc9,0xe5, + 0xa4,0x31,0xba,0x1c, 0xa3,0x3c,0x3b,0xe8, 0x00,0xbd,0x7f,0xd7, 0x79,0xa0,0x10,0x62, + 0x5a,0x31,0x21,0xa2, 0xfb,0x15,0x01,0x2c, 0x55,0xf8,0xcc,0xa1, 0x3a,0x1d,0x0c,0x9f, + 0xcc,0x07,0x7a,0x5c, 0xc2,0xa0,0x0f,0x05, 0x74,0xaa,0x8d,0x04, 0xec,0x83,0xb6,0x7e, + 0xfb,0x55,0xda,0x85, 0xb3,0x19,0x25,0x57, 0x00,0x2c,0x4a,0xff, 0xde,0xe6,0xc8,0x76, + 0x88,0x38,0xf1,0x36, 0xbd,0x57,0xca,0x42, 0x73,0xc5,0xd6,0x79, 0xd8,0x99,0x42,0x58, + 0x1f,0x38,0x2d,0x08, 0x08,0xb8,0xeb,0x73, 0x62,0x3a,0xe6,0x7a, 0x3f,0x3f,0x9e,0x7f, + 0xb0,0x46,0x5b,0xbd, 0x31,0x1e,0x92,0xf5, 0x1c,0x12,0xa4,0x43, 0x2a,0xd2,0x3a,0xed, + 0x97,0x71,0xbb,0xb1, 0xdb,0xb1,0xce,0xe3, 0xa3,0x56,0xe8,0xb3, 0x4a,0x52,0xc5,0xc7, + 0xcc,0x94,0x99,0xaa, 0xad,0xb4,0xae,0x0b, 0x7b,0xc1,0xdf,0xf6, 0x5f,0x76,0x7d,0x3a, + 0xb1,0xda,0x9c,0xd8, 0x67,0x21,0xba,0xce, 0x95,0xf0,0x3c,0x78, 0xff,0x7d,0xb6,0x90, + 0xa6,0x16,0x7a,0x4b, 0x3e,0x2a,0xa1,0x37, 0x37,0x2b,0x7b,0x16, 0xd7,0xa1,0x76,0x91, + 0x49,0xbb,0x45,0x61, 0xe2,0xe9,0xcc,0x20, 0x97,0x24,0xc0,0xdd, 0xea,0x08,0x45,0x18, + 0x54,0x94,0xf2,0xac, 0x2d,0x4b,0x8d,0x33, 0x13,0x9a,0xa2,0xb4, 0xab,0x00,0xca,0x8a, + 0x02,0x00,0xf8,0x79, 0xca,0x4b,0x22,0x62, 0x06,0x97,0x8d,0x99, 0x8f,0xe2,0xfe,0xdc, + 0xfe,0x9c,0xb6,0x5c, 0x7c,0x11,0xf6,0xeb, 0x81,0xcd,0xdd,0x32, 0xe9,0xd7,0x9f,0x05, + 0xc3,0x4d,0x6d,0x45, 0x49,0x89,0x2d,0x85, 0x0b,0xb8,0x68,0x35, 0xed,0x02,0xaf,0x88, + 0x8c,0x4e,0x0d,0x8c, 0xc3,0xc4,0x03,0x16, 0xf0,0x9c,0x89,0x84, 0xd9,0x33,0x17,0x9a, + 0x9c,0x0e,0x63,0xdf, 0x63,0x57,0xf1,0x41, 0x1c,0xdd,0x94,0x5d, 0x3f,0x09,0x8f,0x4a, + 0x70,0x21,0xfa,0x08, 0x09,0x13,0x82,0x8f, 0x16,0x7c,0xef,0xde, 0xda,0x24,0x9b,0xf4, + 0x93,0x3f,0x36,0x66, 0xc2,0xa9,0x1e,0xf3, 0x2f,0x45,0x06,0x43, 0xec,0x46,0xb2,0x87, + 0x87,0xb8,0x61,0xe6, 0x41,0x9a,0x0c,0x0c, 0x25,0xf9,0xae,0x77, 0xb3,0x99,0x83,0x71, + 0x12,0x8d,0xcb,0xa4, 0x34,0x89,0x2c,0xdc, 0x8d,0x94,0x62,0x19, 0x29,0x33,0x34,0x6e, + 0x66,0xd0,0x39,0x82, 0xa8,0x33,0x20,0x1a, 0xe6,0x18,0x07,0x1c, 0x33,0xa1,0xe2,0x80, + 0xe7,0x98,0x87,0x3a, 0x63,0xc6,0x5b,0xcb, 0xcb,0xcb,0x59,0x3c, 0x22,0x63,0xa3,0xb6, + 0x67,0x67,0xe7,0x7a, 0x0d,0x01,0x98,0x60, 0x42,0x43,0x0a,0x26, 0xeb,0xa6,0xa0,0xb0, + 0x30,0x48,0x9b,0xc9, 0xf2,0x7c,0x9d,0xdf, 0x4e,0xda,0x9e,0xcf, 0x16,0x7a,0x8d,0x38, + 0xae,0xac,0x03,0x1c, 0x10,0xed,0x2a,0x2e, 0x17,0x02,0xd8,0x05, 0xe2,0x6a,0x71,0xa7, + 0x05,0x6a,0x41,0x05, 0x47,0x02,0xb3,0x42, 0x4c,0x33,0x90,0xd9, 0x90,0xbd,0x91,0x1f, + 0x85,0x6c,0x55,0x53, 0xa6,0x43,0xdd,0x9c, 0xc4,0xc2,0x18,0xfd, 0x7b,0xae,0x6b,0x51, + 0x3b,0x8b,0xb6,0x5d, 0x4a,0x83,0x32,0x1b, 0xd4,0x20,0x84,0x82, 0x33,0x79,0x8d,0x27, + 0x12,0x6d,0x31,0xa1, 0x70,0x9c,0x47,0xc9, 0x92,0x65,0x66,0xa8, 0x93,0x80,0x80,0x01, + 0x10,0x21,0x02,0x10, 0x98,0xc8,0x3b,0x76, 0x9a,0x20,0x22,0x2d, 0x21,0xa1,0x20,0x00, + 0x80,0x4a,0x28,0x4d, 0xa0,0x4d,0x10,0x98, 0xa8,0x6e,0x1a,0x18, 0x02,0x12,0x08,0x10, + 0x90,0x28,0x43,0x48, 0x1a,0x68,0x18,0xe4, 0xaa,0xd1,0x4a,0x49, 0xf1,0xdb,0x58,0x29, + 0x2f,0x68,0xdf,0x5e, 0xc7,0xde,0xa2,0xf0, 0x2d,0xea,0xf4,0xb0, 0x58,0x28,0xc1,0xa4, + 0xf8,0x06,0xad,0x2b, 0xbd,0x47,0xc4,0xe6, 0x0b,0x2c,0x18,0xd7, 0xf3,0x2a,0x5c,0x2b, + 0x62,0x94,0x61,0xb3, 0x87,0x84,0x28,0x06, 0xee,0x94,0x04,0x1f, 0xbb,0x5a,0xec,0x1d, + 0x78,0x80,0xf6,0xf8, 0x70,0x83,0x15,0x05, 0xe8,0xda,0xc8,0x76, 0x82,0x84,0xf6,0x19, + 0x14,0xfc,0xcc,0x4b, 0x83,0x09,0xdb,0x86, 0x50,0x00,0xa5,0x00, 0xce,0x2b,0x45,0xb3, + 0xfe,0x3b,0xa6,0xc4, 0x38,0x78,0x68,0x9e, 0xd3,0x44,0xbd,0x47, 0x61,0x65,0x60,0x8a, + 0x1c,0x26,0xc2,0x83, 0x83,0xf7,0x5a,0x62, 0x22,0x31,0x75,0xad, 0xe6,0xc6,0xf0,0xe6, + 0x28,0xcd,0x1b,0x02, 0x59,0xca,0x61,0xbf, 0xf3,0x84,0xc7,0x9e, 0x22,0x50,0x57,0x6c, + 0xf2,0xf2,0x13,0x1e, 0xfe,0x82,0x0c,0x1a, 0xa9,0x79,0x4a,0xb2, 0xbf,0xed,0xda,0x44, + 0x0d,0x90,0x90,0x70, 0x1f,0x28,0x5c,0x3a, 0x16,0x85,0x04,0xee, 0xda,0x4a,0xa9,0x58, + 0x12,0x6f,0x5e,0xb6, 0xf6,0x45,0x99,0xd6, 0x57,0x59,0x40,0x45, 0xf5,0x41,0x02,0xfb, + 0x30,0xbc,0x2b,0x7c, 0x67,0x02,0xf2,0xd1, 0x7e,0xe6,0xb4,0x12, 0x0b,0x94,0x01,0x17, + 0x4e,0xcb,0xff,0x0e, 0xfb,0xc5,0x30,0x01, 0x7e,0xe8,0xc9,0xdb, 0x68,0x2b,0x29,0xba, + 0xf8,0x9a,0xc2,0xc8, 0x44,0x80,0xa2,0x80, 0xe1,0xd1,0x5b,0x6c, 0xd9,0x31,0x13,0x6c, + 0x38,0xa3,0xb4,0x0b, 0x60,0xd2,0x0a,0xae, 0x20,0x71,0xa5,0x9f, 0x34,0x6d,0x5e,0x95, + 0x08,0x99,0x96,0x0d, 0x2b,0x23,0x4e,0xdf, 0x3f,0xe8,0x2b,0x81, 0xea,0xf6,0xbe,0x8a, + 0x62,0x20,0x61,0xb9, 0xdb,0x57,0x04,0xfa, 0xb8,0xcf,0xc2,0xce, 0x3b,0x82,0x6e,0xc5, + 0x8d,0x3d,0x24,0x52, 0x36,0xb2,0x92,0x64, 0x60,0x6e,0x6a,0x99, 0x50,0x79,0x77,0x48, + 0x5c,0x2e,0x26,0x62, 0x08,0x1f,0xe6,0xca, 0xf7,0xd6,0x18,0xb3, 0x1a,0x4c,0xe3,0x36, + 0x7a,0x7c,0x69,0x7c, 0x04,0xf3,0x07,0xdf, 0x0c,0xe5,0x9f,0x61, 0x43,0xf9,0x11,0x85, + 0x8b,0xfe,0xf9,0xf9, 0x73,0x72,0x82,0x1f, 0x3f,0x6b,0xe4,0xab, 0x50,0x19,0x82,0x66, + 0x10,0x81,0x86,0xd5, 0xfc,0x21,0x61,0x30, 0x3f,0x2d,0xe7,0x9b, 0x85,0x19,0x1d,0x07, + 0xdf,0xb4,0xb7,0x75, 0xcb,0xae,0x79,0xf5, 0x2c,0x31,0x1a,0x30, 0x35,0xfb,0xdf,0xcd, + 0x34,0x7a,0x5d,0xdc, 0x18,0x38,0xb0,0x66, 0x79,0x08,0x3b,0xb6, 0x23,0x07,0x09,0x0b, + 0x1c,0x69,0x36,0x98, 0xd8,0xf4,0x79,0xbe, 0xc7,0x15,0x24,0xbe, 0x35,0x34,0x53,0x05, + 0xf5,0x53,0x95,0x8a, 0x1f,0x89,0x5b,0x2e, 0x75,0xcd,0x24,0xd2, 0x09,0xf5,0x81,0x87, + 0xb7,0x76,0x90,0x04, 0xee,0x60,0xa6,0xbf, 0x95,0xfb,0x1a,0x7f, 0x5e,0x16,0xbc,0x17, + 0x51,0x94,0x0e,0x3d, 0xd8,0x9b,0x3f,0x7f, 0x87,0xc0,0xa7,0xb3, 0xe1,0x6e,0x9b,0xaf, + 0xda,0xab,0xf6,0x74, 0x54,0xbb,0xad,0x1f, 0x64,0xa8,0xf9,0x3e, 0x20,0x58,0xdf,0xf4, + 0x93,0x52,0x36,0xfa, 0x38,0xfe,0x2d,0x5f, 0x3c,0xae,0xee,0x27, 0xc8,0xeb,0x9e,0x1b, + 0x18,0x91,0x74,0xf6, 0x01,0x7e,0xda,0x2f, 0xa5,0x08,0xed,0x31, 0x9f,0xf8,0x5e,0x75, + 0xcf,0xb1,0x47,0xc4, 0x7e,0x54,0xca,0xbe, 0x21,0xbf,0x19,0x46, 0x8d,0xc9,0xd1,0x45, + 0x6e,0x19,0x33,0xe7, 0x3f,0x9e,0xd6,0xc2, 0xb1,0xf4,0x35,0xfc, 0xbe,0xcf,0xc5,0xf7, + 0x4b,0xec,0x7a,0x85, 0xc7,0xd9,0xdc,0xf7, 0xe0,0x53,0xfa,0x33, 0xf8,0x46,0x3c,0x34, + 0x07,0x80,0x1f,0xfe, 0x7f,0xa5,0x4e,0x96, 0xea,0x5e,0x94,0xa3, 0x13,0xee,0x7b,0xad, + 0x59,0x92,0xe4,0xc4, 0xf6,0x19,0xdb,0x5c, 0xd4,0x9a,0x2b,0xee, 0xc6,0xd7,0x8d,0xec, + 0x3a,0x82,0xe3,0xbd, 0x56,0x33,0x09,0x07, 0xdd,0x14,0x19,0xc1, 0x56,0x11,0x77,0xf9, + 0xce,0xb4,0xbd,0x86, 0xd2,0x68,0x92,0x8c, 0x2d,0xff,0xb9,0xfc, 0x74,0x0d,0x4c,0x8d, + 0xf1,0x4a,0xd9,0xd7, 0x61,0x4f,0xde,0x46, 0xf4,0xfb,0x6b,0xc4, 0xdd,0x7d,0x19,0xc1, + 0x78,0x8d,0xe3,0x59, 0x65,0x00,0x49,0x95, 0x5e,0xa4,0x21,0x75, 0xc7,0x2c,0x90,0xc1, + 0xc7,0xaf,0x6c,0xef, 0x15,0x3c,0x45,0xec, 0x2c,0x98,0x95,0x26, 0x13,0xe8,0x4f,0xdc, + 0xe2,0x33,0x06,0x2d, 0x1b,0x50,0x8d,0x39, 0x58,0xe2,0xb9,0x01, 0x71,0x71,0xd0,0x3b, + 0x06,0xbe,0xc9,0x60, 0x4f,0xbe,0xbe,0xe4, 0xe4,0x35,0xb7,0x5f, 0xdd,0xfe,0x1e,0xae, + 0x3e,0x45,0x3d,0x02, 0x62,0x5b,0xfb,0xf3, 0xe4,0x8d,0x4b,0xba, 0x29,0x97,0x88,0xa3, + 0xbc,0x99,0x2b,0x3f, 0xcb,0x2e,0xc4,0x30, 0xf0,0x7d,0x21,0x7b, 0xd9,0x73,0x7a,0x0f, + 0xeb,0x3f,0x6f,0x95, 0x45,0xab,0x1a,0xb7, 0x9f,0xcd,0x95,0x3a, 0xfd,0xa6,0xf8,0x73, + 0xdf,0x4f,0x93,0x6f, 0x03,0x78,0x9f,0x89, 0x82,0x6b,0xa0,0xb1, 0xa2,0x2a,0x64,0xba, + 0x77,0xb1,0x6f,0x18, 0xfc,0x86,0xb4,0xd7, 0x9e,0x51,0xb1,0x77, 0x17,0xf5,0xe7,0xd6, + 0xb1,0x17,0xb4,0xdc, 0x06,0x7d,0x9e,0x2a, 0x7f,0x2d,0x9c,0x95, 0x33,0xa4,0xf8,0x6f, + 0x59,0x82,0x6d,0x52, 0x53,0xb7,0x4b,0x93, 0xa1,0x1c,0x96,0x65, 0xb8,0xf9,0x9f,0x7e, + 0xd6,0xc7,0xec,0x7b, 0x7c,0x6f,0xb5,0x96, 0xfb,0x91,0x69,0x7d, 0x2c,0x66,0x94,0x70, + 0x5f,0xfe,0x2a,0xc2, 0x1c,0x00,0xd6,0xc5, 0xf5,0xb4,0x35,0xf2, 0x2a,0xe9,0xa2,0xac, + 0x8c,0x25,0x9a,0x07, 0x93,0x1b,0x04,0x24, 0xff,0x65,0x6f,0xe9, 0xa7,0x01,0x5a,0xaa, + 0x3a,0xd6,0x73,0xb6, 0xb0,0xce,0xe6,0xb1, 0xe3,0x76,0x58,0x1b, 0x96,0x1d,0xab,0xcf, + 0xfa,0x19,0x1b,0x7a, 0x3b,0x8d,0xc6,0x4a, 0xd8,0xdd,0x25,0x56, 0x21,0x8d,0x38,0xfb, + 0xd8,0x20,0xad,0x57, 0xa5,0x36,0x97,0xac, 0xc3,0x96,0xd8,0x57, 0x1b,0xb5,0x21,0x2f, + 0x4f,0x0b,0x69,0x65, 0xbe,0x53,0xa7,0x90, 0x10,0x67,0x30,0x5f, 0xf8,0x4b,0xea,0xfc, + 0x7f,0xaa,0xc6,0x92, 0x66,0x19,0x6d,0xb4, 0xb4,0x2e,0xe6,0x0b, 0x96,0x16,0x61,0x53, + 0x01,0xf0,0xfe,0xca, 0x4d,0xcd,0xbd,0x39, 0x50,0x13,0x93,0x79, 0x52,0x07,0x2f,0x26, + 0xe0,0x6a,0x5e,0xc8, 0x67,0x11,0x85,0x58, 0x0c,0x8e,0x40,0xd9, 0xd9,0xf9,0x4c,0x3b, + 0xcb,0xa3,0x7d,0xb5, 0x59,0xbb,0xe7,0x12, 0x09,0x15,0x2b,0xa0, 0xc1,0x25,0x60,0x09, + 0x47,0xab,0xe3,0xd9, 0xeb,0x72,0xdd,0x7f, 0xed,0x95,0x41,0x3e, 0xd6,0xc9,0xe3,0xe1, + 0x98,0x56,0x00,0xc4, 0xc0,0xbc,0xe2,0x9e, 0x8d,0x3d,0x29,0x9b, 0x03,0x28,0x28,0xe3, + 0xb6,0xa9,0xbf,0xd6, 0x4d,0x0c,0x69,0x37, 0xcb,0x44,0xc3,0xb2, 0xd9,0xf2,0xe6,0xb8, + 0xb8,0x3e,0x51,0x24, 0xe7,0x6a,0x88,0xee, 0xce,0xaf,0xd4,0x40, 0x19,0xaf,0xf1,0x8f, + 0x4f,0x66,0x51,0x94, 0x9f,0xbf,0xdb,0xed, 0xd3,0xd0,0xf6,0x63, 0x9e,0xe3,0x75,0x01, + 0xd8,0x73,0x40,0xe4, 0x83,0xa8,0x9a,0x42, 0xc4,0x44,0x83,0xc4, 0x93,0xa1,0xbb,0xab, + 0x8f,0x81,0x75,0x7c, 0x9b,0xf7,0xb7,0x2b, 0x6d,0xb3,0xb7,0x8b, 0x7a,0x48,0x75,0x5a, + 0x97,0x3d,0x41,0xa9, 0xdb,0xb7,0xdd,0xc7, 0xe8,0x5b,0xaa,0x98, 0x60,0x1c,0x2c,0x90, + 0x61,0x7a,0x5a,0x14, 0xbf,0x52,0xd3,0xb5, 0x42,0x9b,0x92,0x06, 0x7b,0x8d,0x82,0xf7, + 0x76,0xed,0x43,0xbe, 0xd7,0xb9,0xc1,0x0c, 0x99,0x89,0xcf,0xd1, 0xec,0x20,0xf0,0x22, + 0x75,0xe6,0x74,0x79, 0x77,0x0f,0xde,0xaf, 0x45,0x02,0x85,0x8d, 0x40,0xc0,0xdf,0xcd, + 0x0e,0x3e,0x51,0x64, 0x4f,0x8c,0x9d,0xa1, 0xa9,0x8e,0xc1,0xb4, 0xe1,0xba,0x2e,0x09, + 0xe8,0x7c,0x22,0x57, 0x0b,0xab,0xbb,0x20, 0xf0,0xcb,0xb5,0x88, 0x81,0x8a,0x5c,0xe1, + 0xf9,0x0e,0x67,0x08, 0x70,0x8a,0x59,0x75, 0x47,0x9f,0x81,0xca, 0xa0,0x2f,0x61,0x37, + 0x3f,0x29,0x5b,0x19, 0x0b,0x8f,0xf9,0x6a, 0x7d,0xac,0x90,0x79, 0x23,0x60,0xc0,0x3e, + 0xe2,0x02,0x0c,0x03, 0x30,0x05,0x1e,0xc6, 0xb3,0x08,0xe6,0xfb, 0x27,0x1c,0xc8,0x6a, + 0xb0,0xfb,0x1e,0x0d, 0xea,0x76,0x79,0xcc, 0xbf,0xe9,0xd7,0x72, 0xd7,0xc8,0xd5,0x6f, + 0x76,0x7e,0xd4,0x77, 0xc0,0xcf,0xb1,0x32, 0xcb,0xfa,0xa7,0xbf, 0xfb,0x6d,0xb6,0xee, + 0x7c,0x1f,0x46,0x73, 0xc5,0xf2,0xc1,0x7c, 0x58,0x8b,0x0d,0x7c, 0x15,0x0a,0x0c,0x04, + 0x10,0x35,0x28,0x6e, 0xd4,0x26,0x55,0xa2, 0x7a,0xf9,0x84,0x86, 0xdb,0xe7,0x4b,0xc0, + 0xb6,0x0b,0xd7,0xc9, 0xfe,0xd9,0xea,0xc1, 0x34,0x06,0xdf,0xcb, 0xc3,0xaa,0xa5,0x81, + 0xfb,0xa6,0xe2,0x9f, 0x9a,0xb2,0xcf,0x59, 0x39,0x33,0x60,0xa7, 0x3f,0x11,0x35,0x16, + 0xa1,0x6e,0x2f,0x96, 0xa9,0xbe,0x9b,0xfb, 0xf7,0xc5,0x05,0x4a, 0xa6,0xef,0x24,0x4c, + 0x80,0x5b,0x3b,0xee, 0x9d,0xb1,0x4a,0x62, 0x06,0xca,0x1b,0x44, 0x09,0x02,0x10,0xfc, + 0x7c,0x94,0x84,0x06, 0xc8,0x8c,0x1e,0xd6, 0x9d,0xab,0x52,0x9f, 0xb2,0xaa,0xf0,0x83, + 0x41,0x6e,0x58,0xc4, 0x48,0x5b,0x86,0xba, 0x69,0x8f,0x9e,0x3b, 0x10,0xc8,0xf7,0xc4, + 0xfe,0xef,0x12,0x96, 0x23,0x9b,0xed,0xaf, 0x49,0x1e,0xb8,0xb0, 0x93,0x93,0x10,0x83, + 0x95,0xb1,0x79,0x99, 0x89,0x42,0xb9,0xf9, 0x0f,0x2f,0x2a,0x40, 0x2b,0x74,0xd3,0xd6, + 0xfb,0xf9,0x09,0x96, 0x85,0x0e,0xf3,0x01, 0x90,0x00,0xb9,0x31, 0x13,0x9e,0xbc,0x85, + 0x9c,0x55,0xde,0xb1, 0xee,0x0b,0x83,0xce, 0x83,0xb9,0xe2,0xfb, 0x9e,0xf5,0x7f,0x65, + 0xe5,0x9d,0x3b,0xa5, 0xb8,0x8d,0x45,0x62, 0x0e,0x58,0xd8,0x63, 0xd0,0x21,0x3d,0xa0, + 0x73,0xf1,0x91,0xed, 0x0a,0x46,0x00,0x03, 0x10,0x22,0x10,0x4e, 0x63,0xb6,0x04,0xd2, + 0x37,0x8c,0x49,0x1f, 0xcd,0xa5,0x92,0xc3, 0xb9,0x69,0x6a,0x46, 0x10,0xfc,0xba,0xd0, + 0x44,0x3b,0x92,0x41, 0x12,0x82,0x1a,0x3f, 0x50,0x92,0x39,0xf6, 0x82,0x1a,0x42,0x3e, + 0x93,0x42,0x53,0x68, 0x9b,0x55,0x34,0x20, 0x26,0xd2,0x49,0x50, 0x1e,0x98,0x34,0x8d, + 0xdd,0x50,0x03,0x67, 0x58,0x31,0x48,0x36, 0xce,0x16,0x23,0xd5, 0xf2,0xa4,0x25,0x53, + 0x10,0x68,0x17,0x97, 0xc7,0x56,0xe6,0x39, 0x9c,0x7b,0x1a,0x9f, 0xf1,0x80,0xcb,0x51, + 0xe0,0xe6,0xb5,0xa7, 0x67,0x83,0x62,0x3a, 0xcf,0xc9,0xc3,0x47, 0xb8,0xfe,0x16,0xac, + 0x78,0x63,0x1a,0xf2, 0xa8,0x75,0x52,0x02, 0xa1,0xda,0x1b,0x9e, 0xbb,0x6b,0xb2,0x9a, + 0xd6,0x5d,0x8c,0xb6, 0x8b,0x25,0xa4,0xce, 0x4a,0xbb,0xb1,0x65, 0x17,0x9e,0xa4,0x92, + 0x15,0xb4,0x3f,0x9c, 0xd0,0xb8,0x6d,0xe2, 0x86,0x93,0x3b,0x4f, 0xa6,0xcd,0x56,0xd8, + 0xae,0xf5,0x63,0x8a, 0xf8,0x17,0x0a,0xa2, 0xc2,0x1a,0xbb,0x4d, 0xb8,0x55,0x7c,0x7e, + 0x6b,0x3f,0x25,0xc3, 0x52,0xff,0x7d,0xd4, 0x74,0x3c,0xbc,0xb3, 0xb8,0xfb,0xbe,0x23, + 0x8a,0xd9,0xe4,0xd3, 0x73,0x6d,0xce,0x74, 0x56,0x41,0x71,0x0c, 0x00,0x6c,0xd4,0x34, + 0x2c,0x76,0x1d,0xb3, 0x41,0x1b,0x08,0x37, 0xa0,0x9a,0x3a,0x66, 0x07,0x6a,0xc0,0x63, + 0x12,0x2a,0x62,0x1f, 0x02,0x02,0x01,0x83, 0x31,0x57,0xa3,0xc3, 0x24,0xb9,0xaa,0x20, + 0xe5,0x98,0x8e,0xfd, 0xce,0xa5,0xef,0x65, 0x9d,0x1a,0x9d,0xb5, 0xb5,0xb4,0xac,0x52, + 0x2b,0xd1,0xf6,0x59, 0x8b,0x3e,0x5f,0xdb, 0xc9,0xad,0x1c,0x2a, 0x11,0xce,0xb5,0xec, + 0x05,0xe9,0x70,0xfe, 0x15,0x8c,0xf5,0x25, 0xfa,0xf7,0x17,0x20, 0x2b,0xbb,0x92,0x81, + 0x61,0x6b,0xe0,0x93, 0x4b,0x30,0xd0,0x43, 0x06,0xd3,0x2e,0x68, 0x89,0x58,0xd8,0x68, + 0x32,0xb8,0x26,0x70, 0xc4,0x66,0xe3,0xa1, 0x8b,0x63,0xcd,0x0e, 0x18,0xda,0x0e,0x8b, + 0xa1,0xfb,0x65,0x6d, 0xdb,0x9a,0xd1,0x35, 0x62,0xee,0x06,0xa7, 0xb8,0x62,0x98,0xf5, + 0xef,0x12,0x83,0x02, 0x29,0x16,0x08,0x24, 0x28,0x9b,0x24,0xe4, 0xb4,0x05,0x9b,0x58, + 0xf0,0x2a,0x69,0xcc, 0xd4,0x43,0x16,0x0b, 0x89,0xca,0xb7,0x9b, 0x41,0x67,0x03,0x23, + 0x2a,0x69,0x2a,0xcb, 0x6d,0xd8,0xe0,0x6f, 0x2b,0x97,0x2a,0x0c, 0x2c,0xf7,0xb6,0x33, + 0xf7,0x7e,0xff,0x57, 0x80,0xb3,0x15,0xef, 0x5b,0xc4,0xd2,0x42, 0x4d,0x83,0x69,0x8d, + 0xf9,0x90,0x0b,0xde, 0x12,0x81,0x36,0x43, 0x5a,0xc9,0x42,0x95, 0x1c,0x3c,0x61,0x67, + 0xb6,0x01,0xa4,0x29, 0x42,0xb2,0x8f,0x93, 0xd5,0x78,0x1d,0xa6, 0x7e,0x80,0xb5,0x9e, + 0xce,0x68,0x68,0x0e, 0xb7,0xaa,0xc8,0xb9, 0x5d,0x20,0xdb,0xe7, 0x85,0xd0,0x88,0x4f, + 0x3b,0xc3,0x17,0xa4, 0x54,0x37,0xca,0x32, 0x65,0x70,0x19,0xf9, 0xd5,0xea,0xb5,0xd0, + 0xb7,0x6e,0x53,0x9c, 0xb8,0x4e,0x33,0xea, 0x54,0x94,0x49,0xb3, 0x97,0x3a,0x59,0x4b, + 0x8a,0x81,0x22,0xa4, 0xc4,0x04,0x9a,0x92, 0x4c,0x27,0x25,0xc4, 0x31,0xb9,0xd4,0xa8, + 0x2b,0xb8,0x82,0x19, 0xc3,0xd0,0x4b,0xd0, 0x11,0x34,0x02,0x8c, 0xb8,0x55,0xd2,0x0a, + 0x49,0x90,0x02,0x01, 0x5d,0x70,0x0d,0x4a, 0x20,0x3c,0x2a,0x57, 0x46,0x30,0x68,0x1a, + 0x45,0x28,0x90,0x8a, 0xee,0xe2,0x8e,0x1d, 0x85,0x14,0x52,0x56, 0x8f,0x0c,0x42,0xb7, + 0xca,0xf5,0x6d,0xc1, 0x9f,0x83,0x57,0x96, 0xe1,0x7e,0x27,0x41, 0x7e,0xed,0xf2,0x2f, + 0x1b,0x52,0xe2,0xdf, 0x08,0x1c,0x86,0x40, 0xce,0x84,0xcd,0xc8, 0x72,0xe9,0x00,0x38, + 0xa2,0x40,0x9a,0x2a, 0x02,0x52,0x48,0x24, 0x28,0x30,0xca,0xf0, 0x26,0x93,0x01,0x28, + 0x04,0x02,0x42,0xcc, 0xd2,0x94,0x30,0xc4, 0x3b,0xaa,0x0a,0x19, 0x42,0xae,0x54,0x82, + 0x08,0x75,0x73,0x04, 0x50,0x43,0x48,0x7a, 0x43,0x06,0x48,0x28, 0x68,0x62,0x52,0x92, + 0xb3,0x2c,0x02,0xd0, 0x51,0x83,0x04,0x72, 0xa4,0x44,0xa2,0xcd, 0x16,0x8a,0x22,0x1c, + 0x99,0x06,0x0c,0x86, 0xa4,0xc0,0x80,0x29, 0x2a,0x15,0x91,0x14, 0x23,0xba,0x95,0x0e, + 0x03,0xb3,0x38,0x62, 0x00,0x26,0x42,0x10, 0xd0,0x29,0xc2,0xdc, 0x6c,0xb6,0xfb,0x42, + 0xc6,0xe1,0x9d,0xfd, 0xcb,0x48,0xb6,0x5c, 0x11,0x6a,0x13,0x07, 0x6e,0x65,0x05,0xd1, + 0x34,0xab,0x32,0xa4, 0x51,0x48,0x72,0x2f, 0x1b,0x31,0x9e,0x32, 0x75,0x1a,0xfa,0x3e, + 0x06,0x15,0x39,0x15, 0x5d,0x16,0xfe,0x46, 0xda,0xd0,0xaf,0xaa, 0x73,0xdb,0x6e,0x8f, + 0x85,0xa7,0xba,0xd7, 0xf2,0xef,0x35,0xdd, 0xd6,0xf7,0x9b,0xca, 0xcf,0xef,0x37,0xfc, + 0xce,0x26,0x93,0xef, 0xbe,0xfb,0xef,0xbe, 0xa5,0x29,0x57,0x3b, 0x59,0xac,0xa2,0xea, + 0x5b,0x61,0x6f,0x8c, 0xc5,0x3c,0x7d,0x46, 0xb2,0x48,0xc7,0x34, 0x73,0xdd,0x46,0xbf, + 0x45,0x79,0x6e,0xea, 0xbd,0x8a,0xe2,0x2d, 0x85,0x3e,0xe0,0x4d, 0x4a,0x7d,0xcf,0x9f, + 0x7b,0x45,0x24,0xe0, 0x89,0xf6,0x2a,0x80, 0x3d,0xdd,0x17,0xcc, 0xeb,0x2c,0x13,0xdf, + 0x79,0x31,0x34,0x7a, 0x9a,0x2e,0x2d,0x0d, 0x28,0xb4,0x91,0x2b, 0x4a,0xc2,0xab,0xbc, + 0xd1,0xd8,0x10,0x49, 0x10,0x70,0xb3,0x67, 0x4b,0x0a,0x11,0xe8, 0x9c,0x2c,0x16,0x96, + 0x38,0x66,0x6b,0xe2, 0x78,0xd9,0xb2,0xd5, 0x63,0xe5,0x21,0xaa, 0x38,0xba,0x90,0x6d, + 0xe8,0x81,0xa9,0xa9, 0x17,0x97,0x2a,0x11, 0xf1,0x2e,0xfa,0xaa, 0x30,0x0c,0xc9,0x9b, + 0xf7,0x4e,0xf8,0xd3, 0x8f,0x8b,0x3d,0x10, 0x61,0xd2,0x33,0x6c, 0x5a,0x63,0x4d,0xcc, + 0x00,0xd8,0x65,0xa9, 0x09,0xaf,0x05,0xc3, 0x11,0x09,0xbe,0x3a, 0x01,0x94,0x48,0xc3, + 0x5c,0xd6,0xd8,0x0f, 0x4c,0xd9,0x1b,0xdd, 0xb2,0xda,0xe5,0x18, 0xe6,0xf9,0xac,0x7e, + 0x58,0x39,0xd4,0xe8, 0xe8,0x34,0xbd,0x7f, 0xdb,0xf9,0x53,0xf4, 0xf1,0x74,0xb6,0x38, + 0xcb,0xf3,0x6a,0x2b, 0xdc,0x8c,0x0d,0x2c, 0x56,0x43,0x15,0x13, 0x32,0xa1,0x5a,0x6c, + 0xeb,0x99,0x4e,0xc9, 0x4e,0xa3,0x3f,0xe8, 0x68,0xed,0x97,0xc8, 0xda,0xd1,0xf6,0x84, + 0x33,0xe7,0xb3,0x4e, 0xe9,0x6c,0xef,0xd7, 0x34,0x82,0x76,0x7c, 0xe9,0xe2,0x84,0xf9, + 0x86,0x54,0x4e,0x18, 0x69,0x07,0xd0,0x36, 0x70,0x0f,0xd9,0x32, 0xbd,0x36,0xbe,0x59, + 0xf3,0xf1,0x89,0xbe, 0x72,0x68,0x8d,0xef, 0xe4,0x71,0x52,0xc7, 0x8d,0xb3,0x38,0x06, + 0x7c,0x26,0xb3,0xf4, 0xd7,0x87,0x33,0x48, 0x85,0x5f,0xa1,0x39, 0x80,0x29,0x00,0x98, + 0x98,0x41,0x63,0xf2, 0x69,0xd7,0xe2,0xba, 0x0b,0xc4,0x2d,0xa8, 0x22,0x01,0x02,0x05, + 0x08,0x44,0x20,0x20, 0x04,0x81,0x04,0x75, 0x90,0x36,0xa2,0xab, 0x52,0x11,0x00,0x80, + 0x44,0x08,0x00,0x40, 0x84,0x42,0x83,0x02, 0xb9,0x66,0x73,0x00, 0x10,0x91,0x10,0x9a, + 0x5b,0x28,0x09,0x26, 0xfc,0xc1,0x68,0x73, 0xb6,0x28,0xd5,0xe0, 0xf6,0x80,0x18,0xd7, + 0x1e,0x07,0x75,0xda, 0xeb,0xf0,0xdc,0xce, 0xe2,0xba,0x13,0x5b, 0x5a,0x7d,0xa3,0x3b, + 0xe6,0x1e,0x10,0xba, 0xb8,0x90,0xab,0x66, 0xd0,0xf0,0x33,0x1c, 0xa5,0x31,0x67,0x67, + 0x97,0x72,0x8c,0x0b, 0x16,0x2e,0xba,0x08, 0xc0,0x4d,0x07,0xe5, 0x40,0x66,0xfa,0x00, + 0x82,0xa7,0xf7,0xe1, 0x9b,0xc6,0x73,0x2e, 0x7c,0xf8,0x4d,0xb3, 0x9c,0xe9,0x0c,0x35, + 0x8c,0xb2,0x81,0x31, 0x79,0x3d,0x97,0x10, 0x70,0x67,0xc6,0xb6, 0xb6,0xa5,0x59,0xd7, + 0x30,0x9b,0x43,0x76, 0x7f,0xca,0x46,0xce, 0x05,0x6c,0x40,0xae, 0xbe,0x5d,0x0b,0x79, + 0x4f,0xa3,0x5a,0xc6, 0x50,0xa7,0x8e,0x03, 0x96,0xc6,0x07,0xd5, 0x4d,0x1d,0x0b,0x99, + 0xb5,0xca,0xd8,0xc8, 0xd8,0x06,0x31,0xbe, 0x41,0x1b,0x26,0xca, 0xd5,0xaf,0xa7,0xc5, + 0x2c,0xb7,0xb8,0xef, 0x09,0x7b,0x87,0x05, 0xde,0x98,0xeb,0xa2, 0x52,0xb7,0x72,0xe5, + 0xd0,0xb1,0xc9,0xb0, 0xe4,0xa2,0xd1,0x89, 0x10,0x5f,0xa8,0x31, 0x25,0x86,0x20,0x48, + 0x87,0x25,0x3a,0xd2, 0xe1,0xdd,0x5b,0x5e, 0x33,0xa0,0x93,0xb7, 0x98,0x04,0x66,0x4a, + 0x21,0xcf,0x10,0xbd, 0x7a,0x07,0x62,0xb2, 0x32,0x72,0x06,0x0b, 0x43,0xc5,0x73,0x01, + 0x16,0xcd,0x67,0x58, 0x99,0x62,0x00,0x13, 0x24,0x61,0x8e,0x40, 0x11,0x09,0xfd,0xaa, + 0xd9,0x0c,0x55,0xb2, 0x56,0x33,0x66,0x36, 0xa8,0xde,0xcc,0xad, 0xe7,0x5f,0x6a,0xaf, + 0xec,0xe0,0xe9,0x13, 0x7a,0xd7,0xa4,0xe3, 0x3c,0x2e,0xf3,0x9d, 0xc3,0x46,0x1b,0x0c, + 0xed,0xc8,0xc3,0x31, 0xda,0x06,0xd6,0x89, 0xa8,0x23,0x0b,0x74, 0x82,0x86,0x36,0xf4, + 0x8c,0x5f,0x78,0xe3, 0x90,0xef,0x77,0x61, 0xd5,0x95,0xe7,0xde, 0xd0,0xa0,0x28,0x65, + 0x07,0xb0,0x93,0x11, 0x4c,0x0d,0x85,0x91, 0x51,0xf5,0xf4,0x09, 0x12,0x64,0x76,0x5d, + 0x0e,0x7a,0xc6,0x87, 0x41,0x55,0x69,0x42, 0x3c,0x6d,0x81,0x0c, 0x2e,0xb7,0x4c,0x66, + 0xb6,0x73,0x9c,0xa4, 0xa5,0x70,0xda,0x3e, 0x67,0x45,0x8b,0x3a, 0xce,0x45,0xb8,0x00, + 0xaa,0x56,0x1c,0x47, 0x12,0x47,0x66,0xc3, 0xcc,0xea,0xf2,0xfc, 0x79,0x8b,0xdd,0xf5, + 0x5b,0xba,0x3e,0xcc, 0x19,0xab,0x83,0x3e, 0x2d,0x1b,0x53,0x39, 0x62,0x54,0x52,0x88, + 0xbf,0x14,0xc6,0x87, 0xed,0x30,0x6e,0x2f, 0x5b,0x5b,0xfb,0xd3, 0xd6,0x5f,0x5a,0x6b, + 0xf4,0xa3,0x9d,0x6c, 0x6d,0x59,0x4d,0xb1, 0x10,0x70,0x28,0x09, 0xcf,0x6b,0xa8,0x1a, + 0x1e,0x63,0x36,0x8c, 0xaa,0x24,0x2c,0xa5, 0xf2,0x32,0x69,0xfd, 0x9e,0x25,0x05,0xbb, + 0xb8,0x5a,0x3f,0x52, 0x0e,0xe3,0x81,0xe1, 0x5e,0xa1,0x5c,0xa0, 0xd6,0x73,0x84,0x2f, + 0xd6,0xe8,0xbd,0x45, 0xf3,0x2f,0x4f,0x6d, 0xd2,0x85,0x0e,0x64, 0x4a,0xd3,0x19,0x20, + 0xc1,0x80,0xb6,0x2a, 0xd3,0x28,0x97,0x82, 0xa7,0x9a,0xd3,0x73, 0x6b,0x57,0xba,0x5e, + 0x3d,0xb7,0x35,0x1f, 0x98,0x1c,0x7e,0xef, 0x84,0x21,0x48,0xea, 0x35,0xe7,0x18,0x66, + 0x80,0xb0,0x70,0x02, 0x9b,0xdd,0x5b,0x0b, 0x2c,0x15,0x18,0xa5, 0xc9,0xee,0x4f,0x08, + 0xd3,0x28,0x12,0x63, 0x9f,0x59,0xef,0xce, 0xa8,0xde,0xd2,0x23, 0x2d,0x1d,0x2d,0x27, + 0x70,0xfd,0xf6,0x66, 0xda,0x7d,0xf8,0x7e, 0x50,0x0d,0xf5,0x79, 0x17,0xd1,0xbf,0xe6, + 0xe6,0xad,0x33,0x79, 0x5e,0xb4,0xbb,0xe9, 0xf4,0x7b,0x2d,0x8f, 0x3b,0xf9,0x33,0x96, + 0x65,0x60,0x7d,0x27, 0x47,0x73,0x9a,0x34, 0xa2,0x41,0x9c,0x62, 0x35,0x69,0xb4,0xd2, + 0x40,0x06,0xd4,0x60, 0x50,0xf1,0xa4,0xfc, 0x25,0x47,0x50,0x4b, 0xd1,0xd0,0xd2,0x08, + 0x01,0x1b,0x66,0xa3, 0x36,0x92,0x14,0x3e, 0xfd,0x2e,0xa0,0xe7, 0xdc,0x2c,0x1d,0xdd, + 0x4e,0x41,0x8a,0xf0, 0x6f,0xc8,0xd7,0x3e, 0xe9,0xc5,0x79,0xfc, 0x1e,0xe5,0x13,0xe0, + 0xe1,0x8a,0x64,0x78, 0x96,0x26,0x9c,0x67, 0x92,0xf9,0x82,0xc0, 0xfa,0x0d,0x3b,0xe0, + 0xfd,0xd8,0x6d,0x7e, 0xd3,0xf9,0xfd,0xcd, 0x5f,0x82,0xf9,0xa9, 0xa1,0x28,0x65,0xa7, + 0xae,0x38,0x2a,0xde, 0x57,0x7c,0xf1,0xf4, 0x97,0x6d,0xbb,0x82, 0x26,0xcc,0xe1,0x47, + 0xcd,0xb0,0xf4,0x6e, 0xbf,0x93,0x00,0x34, 0x35,0xcc,0x28,0xd1, 0x62,0x69,0x24,0xda, + 0x7a,0x56,0xa0,0x82, 0x05,0x0d,0x36,0xe4, 0x43,0x57,0x8f,0x61, 0x52,0xa2,0x48,0x21, + 0x3a,0x20,0xfc,0x24, 0x63,0x0f,0x44,0x24, 0x64,0x10,0x42,0xff, 0x24,0x09,0x86,0xd3, + 0x44,0x5a,0xf0,0xd8, 0x9b,0xe0,0xab,0x6b, 0xb9,0xd3,0xc5,0xc1, 0xc7,0xaf,0x5d,0xe5, + 0x4d,0xa5,0xef,0x8c, 0x01,0xd2,0x6a,0x23, 0x34,0x46,0x5b,0xb0, 0x8f,0x29,0x3b,0xbf, + 0x08,0xfa,0xce,0x6f, 0x13,0x16,0x49,0x68, 0x3a,0x5b,0x97,0x7b, 0x05,0x6b,0xf9,0x19, + 0x43,0xe4,0xce,0x34, 0x66,0x22,0x57,0x31, 0xb7,0x1b,0x49,0x12, 0x0f,0xd2,0x2b,0x9e, + 0x6c,0xed,0x6c,0xbf, 0xcb,0xe9,0xdf,0xe6, 0xae,0xf6,0x3f,0x0e, 0xcf,0x57,0xc5,0x3f, + 0x03,0x5b,0xeb,0x69, 0x52,0xd4,0xec,0xc8, 0x42,0x10,0x16,0x5b, 0x18,0x27,0x28,0x42, + 0x42,0xae,0xc1,0x20, 0xc8,0x69,0x21,0x7d, 0x66,0x25,0x0d,0x24, 0x70,0xf6,0x51,0xee, + 0x7c,0xff,0xdd,0xaa, 0xe3,0xe8,0xb0,0x1a, 0x43,0x8f,0x67,0xa5, 0xa4,0xe1,0x7b,0xac, + 0xbe,0x83,0x61,0x9a, 0xd0,0xf3,0x72,0x42, 0x8c,0x3a,0xcd,0x74, 0x23,0xed,0x9c,0x1e, + 0xff,0x94,0xf6,0xc2, 0x93,0xc7,0x37,0x0e, 0x81,0xc0,0x5c,0x87, 0x86,0xd1,0xc3,0x27, + 0x01,0x7a,0xad,0xcd, 0xeb,0xca,0xc8,0x63, 0x47,0xd3,0x40,0xdb, 0x42,0x59,0xd2,0x41, + 0x5c,0x8a,0xbc,0xdc, 0x5e,0x5f,0x79,0x09, 0x65,0xdd,0x9d,0x80, 0xca,0xc7,0x46,0xff, + 0x5d,0x97,0x74,0xaf, 0x00,0x3f,0xde,0x63, 0x9f,0x18,0x19,0x38, 0x00,0x1a,0xef,0x88, + 0x92,0x1b,0x8d,0x95, 0xc3,0x36,0x16,0x38, 0xc5,0x5a,0xba,0x2f, 0x4c,0x8c,0x89,0x96, + 0x11,0xbf,0x76,0x26, 0x1a,0x07,0xb2,0x94, 0x80,0xb8,0x30,0xdb, 0x25,0xe2,0x80,0xf8, + 0x52,0x07,0x4b,0x60, 0xa0,0xe1,0x65,0x65, 0x2e,0xa3,0x61,0xbf, 0x2b,0x51,0x6f,0x62, + 0x68,0x7c,0xfc,0xbe, 0x8f,0xb3,0xcc,0xc3, 0x13,0xa3,0xd3,0xb7, 0x6a,0x4f,0xa4,0x11, + 0xee,0xfe,0x66,0x6c, 0xfb,0x43,0x9f,0x71, 0x3c,0x43,0x57,0x89, 0x16,0xcf,0x05,0x0d, + 0xaf,0x4e,0x15,0x5b, 0x09,0x20,0x83,0x14, 0xcd,0x9e,0xed,0x09, 0x30,0xbc,0xcd,0x64, + 0x0c,0xfe,0x29,0xd0, 0x1b,0x65,0x9c,0xe6, 0xc3,0xac,0x5c,0x3d, 0x79,0xa9,0xb0,0x76, + 0x80,0x70,0xab,0x7a, 0xac,0xe5,0xa7,0x2a, 0x8e,0x1b,0x5b,0x4f, 0x7e,0xc0,0xfc,0x90, + 0x3a,0x39,0xf5,0x73, 0x82,0x40,0xb2,0x41, 0xc2,0xa2,0xfc,0x1f, 0xb8,0x7e,0x3f,0x9b, + 0xf2,0xd1,0xee,0x2f, 0x5d,0xed,0xcd,0xaf, 0x74,0xf0,0xcd,0x26, 0x29,0xb6,0x31,0x2e, + 0xd3,0xb6,0xa5,0x3f, 0x74,0xc7,0xe9,0xd1, 0x78,0xa1,0xab,0xb6, 0xe3,0x38,0xbd,0xfc, + 0x35,0x89,0x41,0x62, 0xe3,0x3d,0x87,0xdf, 0xde,0x05,0xb0,0xd3, 0xc0,0xee,0xb9,0xf0, + 0xf7,0x7d,0x67,0xd4, 0x1e,0x03,0xa2,0xec, 0x0a,0xd5,0xf3,0x51, 0x54,0xd0,0x39,0xe2, + 0xd3,0xc5,0xa1,0xa2, 0xb2,0xb3,0x2a,0x66, 0xcf,0xfc,0xaa,0x74, 0xf2,0x39,0x57,0x2c, + 0x64,0xd4,0x78,0xd2, 0xfd,0xce,0xd1,0x5a, 0xaf,0xaf,0xf6,0xf8, 0x30,0xec,0x78,0xb2, + 0x60,0x55,0x64,0x59, 0x8d,0x32,0x66,0xef, 0x1f,0xe1,0xf5,0xbd, 0x1b,0x4c,0x15,0x98, + 0x6f,0x92,0xd9,0xdc, 0xd6,0xa2,0xfd,0xbd, 0x4b,0xac,0x3a,0x4e, 0x52,0xa3,0x79,0xb3, + 0xa9,0xda,0xbb,0x4a, 0x93,0x18,0xd4,0x97, 0xe3,0x77,0xb0,0xfb, 0x3d,0xf8,0x66,0x91, + 0x84,0x14,0xa8,0xc3, 0xa7,0xad,0xd5,0xf2, 0x22,0xa1,0x3a,0x9c, 0x12,0x60,0x4d,0x03, + 0xf0,0xbe,0xfc,0xd7, 0xf7,0x99,0x1a,0xfe, 0x2d,0x98,0x23,0x82, 0x01,0x81,0x85,0x3e, + 0xeb,0xc7,0x5e,0xe9, 0x0d,0xdc,0x31,0x52, 0x39,0x23,0xd5,0xce, 0xf7,0x5c,0x2f,0x2f, + 0x1a,0x98,0xce,0x9a, 0xd7,0x47,0x57,0x3a, 0x21,0x3e,0xe1,0xe6, 0x04,0x64,0xc6,0x1e, + 0x1b,0xe9,0x96,0xf7, 0x51,0x8a,0x6f,0x04, 0xb8,0x2f,0x94,0x7a, 0xea,0x52,0xeb,0xc8, + 0x17,0xc6,0x99,0xc7, 0x72,0x1e,0xd3,0x78, 0x72,0x07,0x08,0xb9, 0xb9,0xaf,0x3b,0x82, + 0xb4,0xd1,0x79,0x3d, 0x25,0x6e,0xcc,0xf3, 0x5e,0x92,0x62,0x90, 0x8c,0xf6,0x32,0xb8, + 0xfe,0x42,0xd2,0xce, 0x83,0x32,0x97,0x29, 0x77,0x8c,0x1e,0x25, 0xd9,0x07,0x49,0xdc, + 0x74,0x25,0xac,0x06, 0x71,0x49,0x4b,0x1a, 0x7a,0x7b,0x2b,0x38, 0xac,0x8b,0x6c,0xb6, + 0xf2,0x8b,0xb3,0x85, 0xb7,0xed,0xc3,0xda, 0xf3,0x7d,0x50,0x61, 0x85,0x99,0xad,0x4d, + 0x68,0x91,0x33,0x90, 0xad,0x59,0x63,0x80, 0xb0,0x22,0x2c,0xe0, 0x47,0x88,0x32,0xe4, + 0x40,0x9b,0x7b,0x3c, 0xec,0x22,0x49,0x7c, 0xf6,0x5e,0x78,0x10, 0xab,0xfc,0x1c,0x29, + 0x21,0xe0,0xde,0x4a, 0xba,0x5a,0x9f,0x1a, 0x00,0x30,0xda,0x01, 0xd8,0xf9,0x3c,0xa4, + 0x4d,0xe7,0x2c,0x93, 0x6c,0x29,0x95,0xef, 0x51,0x29,0x57,0x2c, 0xba,0xd5,0x08,0x56, + 0xdb,0xce,0x42,0x9f, 0xb2,0xb6,0xe1,0x7f, 0xa3,0x89,0x24,0xab, 0x17,0x41,0x6c,0x54, + 0x76,0xc8,0x86,0x77, 0xcd,0xc4,0xac,0x3c, 0x7d,0x57,0xbb,0xd9, 0xee,0x4f,0x53,0x6f, + 0xe9,0x88,0xde,0x35, 0xe3,0xf7,0xea,0xc6, 0x7a,0xbb,0xa8,0x2c, 0x84,0x36,0x3b,0x21, + 0xf8,0x6e,0xd5,0x4c, 0x00,0x9f,0xa7,0x2c, 0x3d,0x0c,0xdb,0x3e, 0x98,0xe1,0xf1,0x53, + 0x1e,0x20,0xc7,0xc2, 0x0f,0x02,0x7f,0xae, 0xa9,0x3c,0x06,0xae, 0x90,0xa3,0xde,0x8f, + 0x00,0x47,0x21,0xdb, 0x50,0x1d,0x05,0x54, 0x10,0x12,0xf7,0xd7, 0x36,0xd9,0xb2,0xcc, + 0x28,0xb8,0xc7,0x1c, 0x2c,0x7d,0x99,0x02, 0xb2,0x99,0x93,0x2f, 0x2a,0x90,0xc6,0xdc, + 0x4d,0xde,0x9e,0x35, 0x73,0x62,0xa2,0xa5, 0x3b,0x9b,0xa9,0x4c, 0x8a,0x60,0x48,0xd7, + 0xfc,0xf7,0xe4,0xca, 0xbc,0xaf,0xf0,0xad, 0x3e,0xec,0xdd,0xee, 0x9d,0x9d,0x1e,0x45, + 0x9b,0x8e,0x79,0x01, 0xf4,0xf1,0x90,0x81, 0x60,0xcd,0x19,0x1d, 0x11,0xc7,0x33,0x94, + 0x85,0x7e,0xc2,0xd5, 0x66,0x82,0xeb,0xd5, 0x52,0x44,0x84,0x61, 0xea,0x66,0x1c,0x57, + 0x6b,0xb0,0x6a,0x3c, 0xfd,0xc3,0xf2,0xc9, 0xa1,0xbb,0x16,0x0c, 0x25,0xfb,0x85,0x0c, + 0x35,0x62,0x47,0x13, 0x89,0xd9,0xe2,0x60, 0x54,0x31,0xc0,0xe4, 0x71,0xfe,0x86,0xb8, + 0x4f,0xba,0x36,0x50, 0x9f,0x00,0xf2,0x45, 0x04,0x46,0x62,0x9e, 0xf9,0x28,0xe0,0x53, + 0x32,0x2b,0x8a,0xa6, 0x40,0xab,0xa6,0x57, 0xe7,0x78,0x7d,0xdc, 0xeb,0x25,0x1e,0x4b, + 0xb4,0x98,0xa1,0x5f, 0xce,0xea,0x07,0x21, 0x68,0xae,0x32,0xb7, 0xb7,0x0e,0x38,0x13, + 0x1a,0x3d,0x83,0xb6, 0x6c,0xea,0x2d,0x61, 0x22,0x57,0x77,0xf9, 0xb9,0x7d,0x25,0x8e, + 0xbf,0x1c,0xc1,0x63, 0x32,0x4c,0xd6,0x71, 0x3a,0x48,0x44,0xbf, 0x24,0xc9,0x27,0x4c, + 0x04,0x45,0xa2,0x95, 0xb1,0xec,0x3a,0x7c, 0x9f,0xd9,0xce,0x4c, 0xd4,0xe0,0xd4,0xa4, + 0x79,0xa3,0xe2,0x91, 0xab,0x9d,0x71,0xa7, 0xea,0xfd,0x09,0xb0, 0x5e,0x9f,0xa2,0xef, + 0x7c,0xe3,0x41,0x1d, 0x0a,0xb9,0x7c,0x70, 0xa0,0x22,0xdf,0x50, 0x00,0xeb,0xa4,0x9a, + 0xe4,0x09,0xac,0x3a, 0xd6,0xd6,0x1b,0x59, 0x71,0x24,0x94,0x80, 0x42,0x0d,0xe3,0x8f, + 0x54,0xd3,0x51,0x20, 0x37,0xc3,0x21,0x40, 0x02,0x8a,0xc2,0x4c, 0x84,0x21,0x20,0x80, + 0x81,0x00,0x90,0x20, 0x44,0x08,0x40,0x27, 0x40,0x38,0x71,0xd1, 0xdb,0xfb,0x34,0x2f, + 0xde,0x58,0x76,0x23, 0xdb,0xef,0x70,0x76, 0x7f,0xa7,0xfa,0x73, 0x05,0x82,0x37,0x84, + 0x1e,0x3f,0x0f,0xc0, 0x95,0x6c,0x0e,0x5b, 0xa6,0xb9,0xa1,0x74, 0x91,0x99,0x19,0x08, + 0x14,0x04,0x54,0x6d, 0x23,0x16,0x13,0xb8, 0xa7,0x24,0xe6,0xd8, 0x39,0x82,0x41,0x00, + 0x0a,0x01,0x43,0x1a, 0x6c,0x4d,0x80,0xda, 0x4d,0x80,0xd8,0x03, 0x60,0xda,0x4d,0x88, + 0x1b,0x40,0x36,0x93, 0x06,0x9b,0x43,0xe0, 0xfe,0x8c,0x60,0xbb, 0xf7,0x3b,0x6c,0x99, + 0x97,0x3a,0x5b,0xbb, 0xb2,0x55,0x99,0x54, 0xaf,0x8b,0x62,0xb6, 0xc6,0x84,0xdb,0x69, + 0xa6,0x9b,0x43,0xb9, 0x71,0x2e,0xd1,0xdf, 0x3b,0x28,0x75,0xd7, 0x4a,0xfa,0x6c,0xd5, + 0x6a,0x09,0xe7,0x6e, 0x2b,0x6d,0x5d,0xde, 0x4a,0x3f,0x9f,0x0a, 0x44,0x9e,0x27,0x89, + 0x5e,0x07,0x7d,0x7d, 0x1c,0xf1,0x35,0x00, 0xc6,0x90,0xd8,0x4c, 0x9c,0x24,0x12,0x6c, + 0x7d,0xcb,0xda,0x73, 0x3d,0xbe,0xe0,0x9e, 0xa3,0x9e,0xf1,0xf8, 0xeb,0xbd,0x2f,0x89, + 0xa4,0xcd,0x43,0x30, 0xfc,0x0b,0x3d,0xe8, 0x7c,0xdd,0x7c,0x2e, 0xbe,0x50,0x09,0x58, + 0x7e,0x6f,0xfb,0xf9, 0x3f,0xdd,0xad,0xa7, 0xf3,0xd4,0x96,0xba, 0x50,0x97,0x2b,0x9e, + 0x5a,0xed,0xe4,0xc0, 0xf2,0x27,0xeb,0x18, 0x86,0x54,0x80,0x2c, 0x3e,0x80,0xf7,0x50, + 0xa7,0x77,0x9a,0xc6, 0xe0,0x18,0x8b,0xd2, 0xa1,0x58,0x17,0x5d, 0x47,0x89,0x61,0xea, + 0xf3,0x26,0x1e,0x9b, 0xb0,0x0c,0x11,0x02, 0x08,0x0c,0x6c,0x49, 0x36,0x09,0x0c,0x1b, + 0x19,0xf5,0x18,0x88, 0xdc,0x28,0x12,0x86, 0x26,0xca,0xa8,0xaa, 0x44,0x2f,0x89,0xa7, + 0xf4,0xf0,0x70,0xa8, 0xe1,0xd4,0x68,0x37, 0xb1,0x3b,0x15,0xbf, 0xed,0x35,0x90,0x57, + 0x82,0x97,0xcb,0x32, 0xcf,0x99,0xd4,0x78, 0x75,0x6e,0xbe,0x58, 0x6c,0x73,0x81,0xd7, + 0x33,0x72,0x6e,0xd2, 0x1a,0xcc,0x13,0x44, 0x66,0x21,0xfa,0xde, 0xe2,0x6e,0x53,0x9c, + 0x84,0x4a,0x4d,0xca, 0x4c,0x10,0x81,0x49, 0xa9,0x12,0xd8,0x8d, 0x68,0x3c,0x64,0x4b, + 0xbc,0xd9,0x3b,0xe0, 0x46,0xc3,0xfa,0x50, 0xf8,0x5e,0x26,0xfb, 0xd8,0xf2,0xaf,0x32, + 0x7c,0xac,0x54,0x89, 0x3b,0xd5,0xf5,0xee, 0x33,0x5b,0xff,0x83, 0xa1,0x86,0xe0,0xcc, + 0xe9,0xb8,0x3e,0xce, 0xc2,0x61,0xce,0x22, 0xa4,0x4f,0x54,0x49, 0x77,0x87,0x1f,0xf8, + 0x98,0xa8,0xae,0xda, 0xc5,0x35,0xd0,0xd3, 0xa3,0x1d,0x4e,0x21, 0xd5,0xe9,0x26,0xc3, + 0x27,0xfe,0x23,0x32, 0x50,0xc6,0x0c,0xf3, 0x61,0x04,0xa9,0x85, 0x89,0xa9,0xaa,0x49, + 0x30,0x0c,0x52,0x5e, 0x86,0x1e,0x22,0x98, 0x53,0xe0,0x10,0x85, 0x71,0xe4,0x20,0x2e, + 0x29,0xbb,0xbd,0xc0, 0x4a,0xf1,0xb5,0x18, 0x1b,0x20,0x03,0x67, 0x4c,0x97,0x27,0x75, + 0xd9,0xfc,0x4f,0x37, 0x1c,0x8f,0xd5,0x69, 0x01,0x5f,0x07,0x91, 0xab,0x4c,0x99,0xee, + 0x0f,0x36,0x77,0xaf, 0xc8,0xef,0xad,0x73, 0x36,0x71,0x56,0x6b, 0x27,0x12,0x17,0x37, + 0x28,0x8e,0x4b,0x5c, 0x10,0x92,0xc6,0x22, 0x44,0x70,0x46,0x44, 0x05,0xc4,0x2a,0x00, + 0x4c,0x27,0x11,0x39, 0x12,0x24,0xa7,0x0e, 0x1b,0x84,0xe2,0x1c, 0x67,0x4b,0xbd,0xa1, + 0xd9,0xd3,0x40,0x86, 0x34,0x24,0x9d,0x04, 0x28,0x68,0x10,0x31, 0x3f,0x77,0xda,0x6b, + 0x3f,0x1d,0x08,0xf9, 0xbd,0xe5,0x8e,0x8b, 0xf2,0xde,0x53,0x64, 0x05,0x7c,0x94,0x43, + 0x35,0x78,0x17,0xa6, 0xfe,0xf5,0x08,0x18, 0x0c,0x4d,0xb0,0x6c, 0x43,0x04,0x93,0x94, + 0x43,0x04,0xd3,0x04, 0x86,0x90,0x9b,0x01, 0x1a,0x79,0xcc,0x29, 0xb4,0x3b,0xb9,0xab, + 0x04,0xfd,0xcc,0x56, 0xc7,0xc8,0x33,0x81, 0x04,0xe5,0x58,0xd9, 0xe8,0x77,0x1d,0xf7, + 0x4f,0x54,0xd3,0xf0, 0x70,0xe3,0xa2,0xeb, 0x76,0x16,0xd0,0xf2, 0x61,0xbd,0xf5,0xda, + 0x38,0x97,0x39,0xa6, 0x96,0x54,0x1f,0x0b, 0x96,0xcb,0xf1,0x13, 0xef,0x3f,0xbd,0x3b, + 0xa8,0xed,0xd2,0x9c, 0x74,0xac,0xaf,0x3a, 0x1e,0x2a,0x40,0xc3, 0xdb,0xb4,0xc9,0xfb, + 0xcf,0x7a,0xfe,0xbf, 0xc7,0xca,0xdb,0x4a, 0x45,0xec,0xb2,0xb2, 0xd1,0xda,0x67,0x03, + 0xa1,0xb2,0xb6,0x7e, 0x57,0x16,0xb0,0x80, 0xac,0x74,0x49,0x32, 0xe5,0x2b,0x2f,0xe0, + 0xdd,0xcd,0xb8,0x54, 0x34,0x6a,0xc0,0x46, 0xbc,0xb9,0x84,0x03, 0x52,0xd6,0xdf,0x74, + 0xc0,0x88,0x04,0x0c, 0xc2,0x1a,0x99,0x56, 0x74,0x5f,0x3f,0x5b, 0xb0,0x26,0x06,0xac, + 0xe5,0xa8,0x60,0xff, 0x4f,0x3d,0x1d,0xc2, 0x51,0xb4,0xed,0xf8, 0xb1,0x17,0x12,0x0b, + 0x6d,0x4d,0x60,0xc9, 0x49,0x74,0x86,0xe6, 0x9f,0x2a,0xf6,0x8d, 0x4f,0x53,0xd9,0x9d, + 0x50,0xb1,0xbd,0xa9, 0x08,0x66,0xd6,0x8f, 0x0b,0xf0,0xcc,0x42, 0x62,0xc2,0xb3,0xde, + 0x63,0x60,0xa7,0xf3, 0x0c,0x76,0xc4,0xcb, 0x25,0xb7,0xf9,0x29, 0xdf,0x3f,0xcd,0xce, + 0x23,0x4c,0x22,0x70, 0x42,0x36,0x3a,0x66, 0x85,0xba,0x0c,0x24, 0x7c,0x0a,0x3e,0x56, + 0x1d,0x54,0x60,0xd0, 0xd9,0xd6,0x93,0xe8, 0x92,0xbe,0xce,0x4c, 0xac,0xde,0x39,0xcb, + 0x8d,0xd6,0xa6,0xc2, 0x65,0xee,0xb7,0x91, 0xa7,0x93,0xbe,0x79, 0x0b,0xe3,0xa1,0xfe, + 0x1d,0x18,0x86,0xce, 0xba,0x6f,0xad,0xc4, 0x66,0x74,0xb3,0xae, 0x7a,0x3c,0x5e,0x24, + 0xc7,0x17,0x65,0xe2, 0x6f,0x27,0xb9,0xaa, 0x83,0xa5,0xf5,0x36, 0x94,0xb8,0x62,0x67, + 0x17,0xaa,0x94,0xfb, 0xff,0x29,0x1c,0x35, 0x90,0x26,0x42,0x6c, 0x71,0x4c,0x30,0x60, + 0x2c,0x61,0xe1,0x84, 0x88,0x84,0x6f,0x5c, 0xf1,0x30,0x3d,0x70, 0x34,0x31,0xd7,0xd6, + 0x4b,0x7d,0x6a,0x5d, 0x34,0xc6,0x4c,0x67, 0xf7,0x4b,0x50,0x6e, 0x4d,0xdc,0x31,0xcd, + 0xfe,0x95,0x32,0x95, 0x6d,0xec,0x6a,0xa8, 0xd6,0xff,0x6c,0xe0, 0xf8,0xf6,0x49,0xef, + 0x4d,0xf0,0xfb,0xd8, 0x47,0x4e,0x2a,0xc3, 0x19,0xe4,0xa0,0xc4, 0xdf,0xb8,0xed,0x24, + 0x25,0x94,0x47,0x28, 0xb1,0x37,0x63,0x72, 0xa0,0xf3,0xfc,0xfc, 0x23,0x79,0xd6,0xfb, + 0x7c,0x8e,0x8f,0x6d, 0xb6,0xfe,0xce,0x5d, 0x32,0x13,0x26,0x3e, 0xf7,0x7a,0x96,0xfc, + 0x0a,0x27,0x38,0xcc, 0x18,0xc1,0xfa,0x51, 0x46,0xeb,0x65,0xd8, 0x1b,0xd6,0xfb,0x0a, + 0xae,0x99,0xea,0x36, 0xdc,0xfa,0x3c,0x27, 0xb5,0xab,0xe4,0xc2, 0x99,0x8f,0xab,0xd5, + 0x36,0xa6,0x96,0x5b, 0x3d,0x0f,0x7a,0x37, 0xd9,0xa9,0xe5,0xee, 0xb6,0x3f,0x5b,0x5b, + 0x86,0x87,0x51,0xe3, 0xb7,0xb9,0x61,0x5b, 0xa2,0xe1,0x6d,0xa5, 0x61,0x8d,0xff,0x3a, + 0xfd,0xc1,0x13,0x1f, 0x3c,0xbc,0x8c,0xaa, 0xd6,0xfd,0x02,0xaa, 0x8f,0xac,0xe1,0x75, + 0x1a,0xb5,0xd7,0xcf, 0x42,0x0f,0x41,0xe2, 0xd5,0x4f,0x51,0x48, 0xb4,0x6b,0xff,0xc0, + 0xe0,0x14,0x83,0xcf, 0x5f,0x41,0xcb,0xc1, 0xa2,0x87,0xf1,0xfd, 0xfa,0xc1,0xf0,0x6e, + 0x75,0xfe,0x0e,0xc7, 0x1e,0x9a,0xe1,0xa7, 0x67,0x97,0x63,0xf6, 0xb2,0x34,0xc0,0xad, + 0xdd,0x52,0xc0,0xbc, 0x6e,0xb6,0x95,0xb9, 0x3b,0xeb,0xf9,0x29, 0xdb,0xd1,0xe7,0x7b, + 0x03,0x15,0x5f,0x58, 0xec,0x35,0x57,0x89, 0x25,0xa7,0x9d,0xd2, 0x8b,0xb4,0x40,0x02, + 0x04,0x80,0x40,0x44, 0x46,0x20,0x40,0x81, 0x00,0x49,0x33,0x99, 0x14,0xe7,0xc9,0x01, + 0x88,0x3b,0xae,0x3a, 0x5d,0x03,0x97,0x59, 0x4f,0x67,0x60,0x7d, 0xee,0x74,0x1c,0x1f, + 0x22,0xa4,0x46,0x29, 0x0e,0x00,0x46,0xf3, 0xe9,0x49,0x04,0xe1, 0xb2,0x89,0xd7,0xf0, + 0xb3,0x37,0x7a,0x64, 0xe4,0x45,0xbf,0x91, 0xf3,0xec,0xf8,0x6c, 0xc8,0x9a,0x1e,0xe8, + 0xe4,0x10,0x39,0xc9, 0xb6,0x5c,0xed,0xd7, 0xd4,0x1a,0xa4,0x4a, 0xcc,0x71,0xae,0x6c, + 0x3c,0xbf,0x6d,0xc5, 0x47,0x53,0xab,0xc6, 0xa3,0x9c,0xe9,0x38, 0x1a,0x08,0xe8,0x77, + 0xba,0xcf,0x65,0x3b, 0xb3,0x75,0xa3,0xd0, 0xc4,0x25,0xf0,0xc0, 0x41,0xaf,0x1a,0xe0, + 0x30,0x70,0x20,0xeb, 0xba,0x4d,0x4f,0xce, 0xa2,0xfa,0xa3,0xc2, 0xed,0x6d,0xef,0xb7, + 0x06,0xc1,0x1f,0x1f, 0xeb,0x48,0x09,0x03, 0xd2,0xc0,0xa1,0xa6, 0x09,0x8d,0x3f,0xc3, + 0x11,0xf7,0xa2,0x89, 0x2a,0xaf,0xaa,0x59, 0xdc,0x15,0x65,0x55, 0x69,0x97,0x70,0x41, + 0x24,0x42,0x88,0x65, 0xf6,0x3e,0x4f,0x1d, 0xdc,0x5b,0x7b,0xbd, 0xee,0xf6,0x7f,0x3b, + 0xe9,0xf6,0xff,0x32, 0xfd,0xf5,0x64,0xb7, 0x1a,0xa0,0x62,0x81, 0xd1,0xfb,0x90,0xee, + 0x46,0xfe,0xff,0x19, 0x21,0x80,0x8c,0x7e, 0x97,0x51,0x00,0x43, 0xe0,0xae,0x3d,0x10, + 0x32,0x36,0x0a,0x59, 0x1c,0x01,0x66,0xb1, 0x88,0xc4,0x0b,0x74, 0x92,0x46,0x04,0x40, + 0x6b,0x76,0xf8,0xb8, 0x59,0x2f,0x34,0x78, 0x7c,0xc6,0x41,0x81, 0x8c,0x19,0xf1,0x12, + 0x73,0x69,0xe8,0x51, 0x47,0x7c,0x9f,0x8f, 0x74,0x95,0xe9,0x3f, 0x4f,0x3b,0x2d,0x24, + 0x5b,0x64,0xe3,0xa6, 0x03,0x01,0x01,0x54, 0x64,0x12,0x83,0xbc, 0x45,0xc6,0x05,0x37, + 0x80,0x22,0xd4,0xc3, 0xb0,0x42,0xee,0x47, 0x33,0xf6,0xd5,0x44, 0x7e,0x7c,0x6d,0x4e, + 0xfe,0xfa,0xff,0xab, 0x13,0xde,0xb1,0xda, 0xed,0x7c,0x57,0xb7, 0xb0,0xa4,0x7f,0x3e, + 0x42,0x22,0xa6,0x3e, 0xa9,0x19,0x5f,0x13, 0x1e,0x1b,0x9a,0xd6, 0x20,0x00,0x4d,0x20, + 0x2b,0x86,0x96,0x52, 0x5a,0xa4,0x0e,0xad, 0xca,0x61,0xe3,0xf8, 0xde,0x64,0xeb,0x5a, + 0xa5,0x87,0xad,0x85, 0x35,0x9f,0xb5,0xb2, 0xff,0xe5,0x55,0x28, 0x44,0x5e,0x52,0x83, + 0x31,0x8d,0xe1,0xb6, 0xbf,0xfa,0xa1,0xe8, 0xe4,0xb1,0xfd,0x6f, 0x55,0x30,0xf9,0x5b, + 0x5f,0xb3,0xb2,0x2d, 0x28,0x5e,0x41,0xae, 0xa5,0x24,0x9d,0x25, 0x7c,0x4f,0xee,0xa6, + 0xc4,0xc5,0x45,0xdd, 0x4a,0x4a,0x9d,0xaa, 0x20,0x35,0xeb,0x61, 0xb2,0x33,0x3d,0x60, + 0xfd,0x75,0xe9,0x31, 0x9c,0x1c,0x77,0x07, 0xbe,0xb3,0x9b,0xcb, 0x22,0x49,0x91,0xb6, + 0xd4,0x5d,0x6c,0xd8, 0xa3,0xbd,0x6b,0x2f, 0x40,0xaf,0x70,0x6f, 0x83,0x62,0xd6,0x51, + 0x74,0xeb,0x69,0x6a, 0x34,0xc5,0x8c,0x97, 0x51,0x94,0xd2,0xaa, 0xb8,0xc5,0x36,0x7e, + 0x25,0xca,0x9e,0xd3, 0xf6,0x4c,0xaf,0x66, 0x23,0x0c,0x86,0xe6, 0x36,0x46,0x54,0xde, + 0xd7,0x2d,0xe4,0xa6, 0xd0,0xec,0xbb,0x77, 0xf5,0x88,0x40,0x31, 0x56,0x73,0xa0,0xc2, + 0xf2,0x68,0xd1,0x98, 0xeb,0x75,0x90,0x23, 0xa7,0x90,0x5e,0x65, 0xef,0x75,0xa3,0xf9, + 0x1a,0x6b,0xcf,0x9f, 0x5b,0xcc,0xec,0xa0, 0xe8,0xfa,0x32,0x2f, 0x1f,0xba,0x68,0xd0, + 0xbe,0xdb,0xdd,0xc1, 0x94,0xc5,0x34,0xd2, 0xde,0x69,0x77,0x32, 0x0c,0x56,0x2e,0x26, + 0x94,0x35,0xb6,0x9b, 0x0d,0x1e,0x06,0xd9, 0xd8,0xd8,0x50,0x95, 0xff,0x3b,0xd9,0xac, + 0xa2,0x94,0xa0,0xaf, 0x72,0xc3,0x46,0x47, 0x71,0x9b,0x55,0x50, 0xf7,0x17,0xc8,0x97, + 0x7f,0x08,0x4a,0xb1, 0x87,0xf6,0xd2,0xaa, 0x4a,0xa2,0xb7,0x74, 0xec,0x4e,0x5c,0xac, + 0x0b,0x8a,0x5d,0x6f, 0xa1,0x9a,0x86,0x00, 0x69,0x46,0x80,0x9f, 0xb1,0x9a,0x74,0x40, + 0xd4,0x59,0x1b,0x44, 0xa3,0xa8,0xa0,0x46, 0x62,0xf5,0xcd,0xd7, 0x62,0x6f,0x77,0xbe, + 0x27,0xa3,0x23,0xb0, 0xd2,0x4d,0xef,0x3f, 0xd6,0x60,0x22,0x66, 0xf3,0x02,0xda,0x0a, + 0x1f,0x65,0xfe,0x9c, 0x9f,0xad,0xf5,0x02, 0xb2,0xe8,0x76,0xff, 0x34,0x7f,0xb3,0xd5, + 0x64,0xe8,0x41,0x7a, 0x43,0x2e,0x0a,0x9e, 0xf3,0xe4,0x3a,0xe2, 0x66,0xec,0x67,0x94, + 0xad,0x31,0x33,0x85, 0xa1,0x70,0x4c,0xf2, 0x2b,0x0a,0xcf,0xa8, 0x5b,0xe5,0x41,0x9c, + 0xa6,0x0d,0x24,0xa9, 0x3e,0x12,0x0c,0x56, 0xa0,0xcd,0x03,0x50, 0x7a,0xa6,0xe1,0xba, + 0x68,0x44,0x72,0x38, 0x86,0xc1,0xd2,0xc7, 0x2b,0x2e,0x35,0x7a, 0xdd,0xa6,0xb3,0x2c, + 0xc8,0xb3,0xcb,0x82, 0x0f,0x61,0x9f,0xa1, 0xb9,0x83,0x2d,0x8c, 0x8f,0x4d,0xb3,0x85, + 0xb8,0x93,0x4b,0x19, 0xe3,0xff,0x5d,0x90, 0xd8,0xd4,0x1b,0x86, 0x8b,0xe0,0x79,0xc1, + 0xce,0xb1,0xbe,0x53, 0x59,0x3c,0xfb,0x12, 0x18,0x11,0xa9,0x17, 0xf1,0x10,0xd9,0x24, + 0x08,0x81,0xfa,0x15, 0xff,0xe7,0x4a,0x39, 0xba,0xad,0x76,0x05, 0x94,0x16,0x97,0xf3, + 0x2d,0xa4,0x1c,0x0a, 0x9a,0x5a,0x1d,0x24, 0xda,0x6a,0xd4,0xd7, 0x74,0x5f,0x64,0xbc, + 0xfc,0x87,0xd8,0x59, 0xae,0x2f,0xa6,0xb4, 0x1f,0x48,0x98,0xbd, 0x67,0x24,0x77,0x9d, + 0x6d,0x8b,0x2a,0x02, 0x5e,0x9e,0x97,0xc1, 0x4f,0xe3,0xbf,0x70, 0x3e,0x50,0xf7,0xd8, + 0x73,0xbd,0xa6,0xa8, 0x17,0x48,0x83,0x24, 0xcb,0x45,0x08,0x8c, 0xb0,0x4f,0x80,0x97, + 0x33,0x31,0x15,0xb9, 0x40,0x4b,0x25,0xfd, 0x13,0xd1,0xca,0xf6, 0x81,0x24,0x87,0x2b, + 0xfe,0x2e,0xd4,0x56, 0x63,0x76,0x79,0xc6, 0x15,0x32,0x17,0xa7, 0x10,0x56,0x53,0xe3, + 0x97,0x45,0x69,0x8e, 0xc3,0x34,0x0a,0x06, 0x9a,0xb2,0x09,0x96, 0x31,0xba,0xa8,0xe1, + 0xec,0xf7,0x79,0xed, 0x9f,0x1b,0x25,0x3c, 0xd9,0xfc,0x3e,0x5b, 0x64,0x5b,0x34,0xdd, + 0xc0,0x51,0xc9,0x90, 0x41,0x8a,0x53,0x20, 0x72,0x00,0x6b,0x98, 0xbb,0x62,0x96,0x59, + 0x2d,0xe9,0x6f,0x43, 0x1d,0xdb,0x6e,0x4e, 0xc7,0x28,0xe9,0x4f, 0xd9,0xe9,0x31,0x68, + 0xe4,0x11,0x3b,0x3c, 0x6e,0x5a,0x1c,0x37, 0x06,0xb6,0x31,0x2a, 0x58,0x29,0xc5,0xd5, + 0x4b,0xc5,0x46,0x5f, 0x7e,0xc1,0x3a,0xa1, 0xe2,0x26,0xbe,0x30, 0xc0,0x46,0xd8,0x6c, + 0x42,0xa1,0xe3,0x2a, 0xd4,0xe8,0x36,0x54, 0x67,0xfd,0x67,0x1f, 0x8f,0xce,0x5b,0x8e, + 0x83,0x9f,0xa7,0x7e, 0xcb,0x3a,0x1c,0xde, 0x0a,0x07,0xf4,0xba, 0x7b,0xc6,0xe8,0x35, + 0xfa,0x0e,0xbd,0xe2, 0xcd,0xeb,0x5e,0x1e, 0x08,0x21,0x10,0x0c, 0xc4,0x50,0x42,0x92, + 0xaa,0x15,0x49,0x0d, 0x07,0x2b,0xca,0xf4, 0x34,0x97,0xed,0x50, 0xfb,0xfc,0xfe,0x2f, + 0x10,0xb3,0xe0,0xfe, 0x2f,0x84,0x48,0x14, 0x84,0x26,0x09,0x34, 0x33,0xe9,0x41,0xfa, + 0x25,0x91,0x10,0x80, 0x24,0xa8,0x24,0x82, 0x0f,0xc1,0xf0,0x5e, 0x66,0x66,0x5e,0x62, + 0x21,0xd9,0x99,0x99, 0x99,0x9a,0x23,0x4e, 0x64,0x8c,0x6d,0x8e, 0x9a,0x65,0x27,0xc5, + 0x72,0xf0,0x4b,0xd3, 0x33,0xff,0xb8,0x03, 0x78,0x0b,0xa5,0x5a, 0xb5,0xaf,0xd1,0xf5, + 0x5b,0x2d,0x93,0x6f, 0x4a,0xfe,0x33,0x94, 0x49,0x69,0x35,0x94, 0x57,0x80,0xaf,0x47, + 0x3f,0x63,0xaf,0x53, 0x59,0xd5,0x98,0x6a, 0xe9,0x96,0xe0,0xc9, 0xe2,0xf7,0x67,0x12, + 0x4d,0x00,0x2a,0xc1, 0xde,0x63,0xce,0x46, 0xb3,0x5e,0xe3,0xcd, 0x58,0x28,0x72,0x38, + 0xe7,0xbb,0xdb,0x77, 0xba,0x43,0x13,0x38, 0x56,0xd3,0x6d,0xa2, 0xba,0xe0,0xf1,0x3f, + 0x8d,0x1a,0x21,0x6d, 0x1a,0xf2,0x1c,0x91, 0xfe,0x31,0x43,0x3c, 0x19,0xad,0x65,0x62, + 0xb8,0xe2,0x93,0xdd, 0x1f,0x35,0xcc,0x1c, 0xf0,0x60,0x60,0x60, 0xfd,0xbd,0xb2,0x51, + 0x0f,0xbf,0x67,0x1f, 0xf3,0x53,0x8b,0xb0, 0x9f,0x8c,0xb6,0x4a, 0xf9,0x81,0xaf,0x15, + 0x59,0x94,0x83,0xf2, 0xb5,0x70,0xfe,0x4b, 0x2d,0x3f,0xba,0x23, 0xe3,0x90,0xa9,0xc5, + 0x85,0xc3,0x84,0x99, 0x44,0x91,0x14,0x1b, 0xf5,0x7b,0x98,0x45, 0xc9,0xee,0x76,0xea, + 0xdb,0xcf,0xdd,0xe4, 0x38,0xac,0x14,0xa9, 0x0f,0x27,0xf8,0x6b, 0xb5,0xca,0x80,0x1d, + 0x91,0x03,0x0d,0x13, 0x88,0xd6,0x4e,0x3c, 0xff,0x28,0x58,0xc3, 0x96,0x6e,0xef,0xb6, + 0xfa,0x43,0x92,0x1d, 0xb7,0xf2,0xde,0xe6, 0xe7,0x6d,0x37,0x92, 0xa5,0xdd,0xbf,0xbc, + 0x22,0xf4,0x2f,0x71, 0xa0,0x91,0x9b,0x75, 0x4b,0x8b,0x09,0xc4, 0x85,0x57,0xe3,0x29, + 0x8b,0xea,0x88,0xa8, 0x1d,0xc9,0x35,0x6c, 0xe7,0x19,0x23,0xc9, 0x24,0xdb,0x67,0x4b, + 0x5a,0xdb,0x87,0xb5, 0xc0,0xa4,0xca,0xc5, 0x9f,0x4d,0x08,0x01, 0xce,0x1b,0x54,0x75, + 0x64,0x2f,0xfe,0xeb, 0x6a,0x3a,0xde,0x17, 0xbc,0xdc,0x6e,0xe8, 0xe4,0xac,0x6a,0xb2, + 0xb6,0x59,0x52,0x26, 0xde,0x33,0x03,0x56, 0x7e,0x9c,0x7c,0x60, 0xfc,0xa3,0x17,0x7b, + 0x83,0x56,0xf4,0xad, 0x1f,0x7a,0x23,0xe4, 0xc5,0xc1,0xa5,0x30, 0x02,0x6a,0x90,0x14, + 0x4c,0x0e,0x6c,0x7d, 0x85,0x24,0xc5,0xe4, 0x0e,0x76,0x06,0xc3, 0xde,0xfc,0x67,0x19, + 0x21,0xd0,0x13,0x2e, 0x52,0xe6,0x02,0x50, 0x71,0x47,0xea,0x68, 0x77,0x3a,0xec,0x54, + 0x3e,0xdb,0xbf,0xf4, 0x32,0xa6,0x99,0x8a, 0x4a,0x17,0xdb,0xe2, 0x64,0x31,0xd3,0x39, + 0x72,0x3d,0xf9,0x60, 0x4a,0xd0,0x5f,0x61, 0xbe,0xb0,0xb2,0x5b, 0xa1,0x3e,0x3e,0xb8, + 0x48,0x0e,0x1a,0x32, 0x09,0xbd,0xe6,0x98, 0x98,0xd8,0x99,0x34, 0x30,0x4b,0x95,0x4b, + 0xd3,0x76,0x5c,0xe0, 0x39,0x77,0x58,0x21, 0x64,0x0f,0xec,0xf3, 0x75,0xe2,0xdc,0x25, + 0x44,0x5a,0xb4,0x70, 0x16,0xc0,0x49,0xfe, 0x10,0xe6,0xfe,0x94, 0xfb,0x28,0x6f,0xb8, + 0xe5,0x68,0xba,0x05, 0x9f,0x2e,0x3f,0x2e, 0x1a,0x80,0xac,0x0e, 0x9e,0x20,0x9d,0x59, + 0x49,0x77,0x31,0x47, 0x10,0x25,0xc5,0x38, 0x37,0x78,0x46,0xac, 0x24,0x8d,0x2c,0x08, + 0x89,0x21,0xc4,0xbc, 0x2b,0x6d,0xef,0x0c, 0x42,0x06,0x1f,0xe2, 0x68,0x98,0xfb,0xcc, + 0x88,0x71,0xaf,0xfe, 0x8c,0x94,0xfb,0xe2, 0x9b,0xc6,0x73,0x9b, 0x63,0xd3,0x56,0x5a, + 0xca,0xc0,0x10,0x4a, 0xe5,0xd3,0x62,0x7e, 0x78,0x3f,0x5d,0x70, 0xb9,0x84,0xaa,0xf4, + 0x32,0x77,0xb5,0x18, 0x28,0xea,0x8f,0x77, 0x54,0x4f,0x99,0x23, 0xa4,0xb3,0x24,0xa0, + 0x1c,0x98,0x76,0xbc, 0xff,0xae,0x28,0x0d, 0x45,0x09,0xa5,0x5e, 0x89,0x9f,0xa5,0x8d, + 0xce,0xde,0x4b,0x5d, 0x61,0x67,0xe9,0x28, 0x45,0xdc,0xbc,0x71, 0x8c,0xbc,0x7d,0xbd, + 0x75,0x92,0x8b,0x90, 0xe1,0x23,0x30,0x79, 0x93,0xce,0xbb,0xde, 0xe1,0xb9,0x74,0xcb, + 0x0d,0xf1,0xf2,0x65, 0xdb,0xe9,0x94,0x28, 0xd8,0x4c,0x45,0xca, 0x81,0xf8,0x3f,0x23, + 0x5f,0xab,0xe1,0x74, 0xb3,0x0b,0x35,0x32, 0x20,0x21,0xcc,0x01, 0x78,0xd3,0xf5,0x75, + 0x1b,0x6c,0xe2,0xc2, 0xed,0xe5,0x5c,0x54, 0xdf,0x37,0xa5,0xf1, 0x89,0x9b,0x8a,0x2b, + 0xbb,0x73,0x4e,0x1d, 0xb8,0x28,0x53,0xc4, 0x83,0xcf,0x96,0xa9, 0x00,0x92,0x3f,0xa3, + 0x38,0x7e,0x8e,0x92, 0x95,0xea,0x9d,0xcc, 0x1d,0x97,0xd0,0x84, 0x92,0xf1,0x6c,0xeb, + 0x25,0x6f,0x69,0x68, 0xf8,0xb3,0x31,0x35, 0xd0,0x95,0x6f,0xc7, 0x9d,0x25,0x9a,0xe6, + 0x02,0x03,0x87,0xdd, 0x64,0xc8,0xff,0x74, 0xee,0x3f,0x03,0xbf, 0xc3,0xd5,0x78,0xf7, + 0xbe,0x8f,0x99,0xf4, 0xba,0x6e,0x86,0xca, 0xf3,0x9a,0xfe,0x81, 0xde,0x3d,0xbb,0xf9, + 0xed,0x66,0x58,0x4d, 0xa3,0x11,0xaf,0x97, 0xfd,0x68,0x3a,0xe6, 0x2f,0xb8,0x31,0x36, + 0x90,0x36,0x29,0x26, 0x74,0x0e,0x06,0x13, 0x1a,0x4d,0x90,0xc9, 0xc1,0x7c,0xe2,0x40, + 0x29,0xc4,0x14,0x8a, 0xb1,0x2b,0x32,0xfe, 0x73,0x83,0x4b,0x9b, 0x83,0x9e,0x7e,0x4b, + 0xd0,0xd1,0x72,0xe6, 0xc2,0x83,0x45,0xb5, 0xef,0x77,0xd4,0xd0, 0x78,0x5a,0x68,0x37, + 0xcd,0x2b,0xc6,0x50, 0xca,0xfd,0xd7,0xc5, 0x97,0x58,0xf9,0x4c, 0x6e,0x56,0xac,0x1d, + 0xd7,0x87,0x52,0xa4, 0x1a,0xb5,0x8d,0x08, 0xc5,0x61,0x37,0xee, 0x58,0x18,0xf9,0xb8, + 0x5e,0x55,0xec,0x52, 0xc1,0x78,0x76,0x21, 0x19,0xc1,0x76,0x9a, 0x37,0x28,0x6b,0x40, + 0x25,0x75,0xbe,0xc9, 0x67,0x23,0x3c,0x82, 0x36,0x0d,0xfe,0x23, 0x7c,0x49,0xde,0x1e, + 0xb7,0x11,0xd0,0x78, 0x5a,0x9c,0x58,0xb7, 0xec,0x26,0xf8,0x8c, 0x63,0x41,0x41,0xfd, + 0x0f,0x42,0x0c,0x9e, 0x70,0x98,0xbd,0x4f, 0xb8,0xab,0xa9,0x5d, 0x77,0xcb,0x3e,0xaf, + 0xd6,0xda,0xe2,0x5e, 0x6f,0x2f,0xa4,0x01, 0x88,0xdc,0xf7,0x96, 0xeb,0x63,0xda,0x39, + 0x45,0xf3,0x8a,0xdb, 0x8e,0xb7,0xdf,0xce, 0xf8,0x6f,0xa4,0x88, 0x18,0x46,0x73,0xb6, + 0x29,0x33,0x1a,0xd9, 0x47,0xa9,0x14,0xee, 0x10,0x5f,0xfc,0x62, 0x24,0xc4,0xd9,0x74, + 0xe4,0x45,0xcd,0x0e, 0x09,0x69,0x1c,0x7a, 0x04,0x2b,0xce,0x5e, 0x92,0xbf,0x4b,0xcb, + 0xb0,0x60,0x64,0x4e, 0x20,0xf8,0x3d,0x66, 0xe4,0x6c,0x25,0x63, 0x62,0xa1,0x51,0x8e, + 0xe5,0xe6,0xa0,0xa9, 0x5d,0x8f,0x01,0xbf, 0x72,0x09,0x83,0x11, 0x18,0xc6,0xd1,0x23, + 0x91,0x80,0xb1,0x7d, 0xdc,0x04,0x1c,0xa5, 0x67,0x21,0x24,0xbd, 0x89,0x42,0x0a,0x10, + 0x09,0x3c,0xf6,0x78, 0x89,0x35,0x4b,0x6c, 0xbb,0x1d,0x82,0x50, 0x77,0xcf,0x71,0x10, + 0x79,0xcc,0x9b,0x2c, 0xbc,0xbc,0xda,0x4d, 0x03,0x58,0x08,0x6d, 0x21,0xb4,0x6a,0xda, + 0x44,0x0c,0x6d,0x0c, 0x60,0xda,0x6d,0x8d, 0xb6,0xd8,0xc6,0xdb, 0x6c,0x1b,0x6c,0x43, + 0x1b,0x18,0x24,0x49, 0xa8,0x69,0x43,0x16, 0x1e,0xd6,0xd9,0x24, 0x82,0x6c,0xa1,0x9c, + 0x84,0x0a,0x04,0x36, 0x8a,0xc1,0xfd,0xf9, 0x98,0x0b,0x4d,0x31, 0x97,0xef,0xd3,0xfe, + 0x88,0xfc,0xba,0x63, 0xb4,0xff,0x4f,0x2b, 0x31,0x4a,0xd6,0x74, 0x19,0x06,0xff,0xbe, + 0x34,0x8b,0x38,0x73, 0xda,0xd3,0x78,0x99, 0x5c,0x85,0xf2,0x30, 0x50,0xe3,0x03,0xde, + 0x81,0x38,0xac,0x87, 0xb0,0xc6,0x67,0xcc, 0x55,0x68,0x1c,0xfc, 0xd6,0x65,0x52,0x0d, + 0xcd,0xe8,0x39,0x43, 0x12,0xe7,0x5a,0xd9, 0x1f,0xa6,0x40,0x14, 0x29,0x42,0x83,0x28, + 0x8f,0x8b,0xea,0x21, 0x83,0xd4,0xb3,0x99, 0xf8,0xad,0xf8,0x3f, 0xa5,0x8f,0x5e,0xc7, + 0x1a,0x45,0x7f,0x65, 0x56,0xd5,0x82,0x31, 0xdb,0x15,0xbb,0xcf, 0x3d,0x8f,0xcb,0x75, + 0x9f,0x5f,0x3b,0xa3, 0x1d,0x60,0xce,0x5d, 0x40,0x4f,0x4b,0x07, 0x8a,0xd1,0x37,0x75, + 0xf4,0x20,0x89,0x40, 0xb7,0xc3,0xc0,0xd6, 0xdf,0x48,0xa1,0x9c, 0x6e,0x6e,0x3c,0xe1, + 0x2f,0x2c,0x76,0x90, 0x25,0xd5,0x8b,0x64, 0x00,0x88,0x9a,0x15, 0x83,0x10,0x4a,0xe1, + 0x45,0x09,0xdd,0x97, 0x44,0x22,0x4d,0x33, 0xa0,0xf1,0x97,0xd6, 0xfb,0xc1,0xd1,0x23, + 0x56,0x2c,0xd0,0xbc, 0xe9,0xc5,0xe9,0x6e, 0xfb,0xb3,0x50,0x58, 0x1c,0x9a,0xd7,0xf6, + 0x48,0x17,0xce,0x0b, 0xb5,0xb0,0xc2,0x23, 0xc1,0x55,0x11,0xbe, 0x56,0x93,0x24,0xe2, + 0x2e,0x13,0x1a,0x6f, 0x07,0xbc,0x17,0xcd, 0xf4,0x5f,0x4f,0x7b, 0xb7,0xea,0x2f,0x2d, + 0x42,0xcd,0x09,0xa5, 0x61,0xa3,0x94,0x6b, 0x27,0x72,0x27,0x81, 0x45,0x3e,0x13,0xc3, + 0x8f,0x7c,0x5a,0xbf, 0x8a,0xcc,0x0a,0x02, 0x40,0x46,0xc7,0xc6, 0x40,0xee,0x99,0x06, + 0xe7,0xa3,0x31,0x14, 0x51,0x08,0x18,0xa2, 0x64,0x15,0x30,0x84, 0x68,0x8c,0xe2,0x15, + 0xbd,0xad,0x8a,0xbc, 0x94,0xe8,0x85,0xbe, 0x77,0xe8,0x90,0x26, 0xde,0xe2,0x4d,0x49, + 0x8d,0x50,0x58,0x15, 0x2d,0xa5,0x24,0xe0, 0xba,0xb2,0x6c,0x55, 0x85,0x51,0x4d,0xa9, + 0xa9,0xaa,0x80,0x8c, 0x01,0xc0,0xeb,0xe0, 0x70,0x01,0x50,0x91, 0x2b,0x86,0xcb,0x35, + 0x2a,0x94,0x69,0x9a, 0xd4,0x34,0xad,0x30, 0x30,0x9d,0xae,0x4f, 0xf0,0x41,0x22,0xe9, + 0x14,0xef,0x42,0x9d, 0xc5,0x59,0x77,0x39, 0x2a,0xfa,0xb6,0xac, 0xdf,0x76,0x46,0x1b, + 0x94,0xd4,0x1d,0x63, 0x8d,0x47,0x48,0x0e, 0xba,0x0a,0x16,0xad, 0xfb,0x51,0xc0,0x96, + 0x4c,0x82,0xc0,0x8c, 0x65,0x1d,0xb4,0xaa, 0x04,0x33,0x2c,0x00, 0x62,0x82,0x5b,0x6c, + 0xc1,0x03,0x55,0x2b, 0x8d,0xbd,0x51,0x50, 0x71,0xe1,0x1f,0x6e, 0xf5,0x08,0x9b,0x18, + 0x01,0x99,0xce,0x50, 0x83,0x01,0x08,0x05, 0x0e,0x1a,0x19,0x21, 0x59,0x40,0x42,0x40, + 0x00,0x52,0xf6,0x13, 0x91,0x6e,0x75,0xf7, 0xae,0x0e,0x0f,0xb7, 0x76,0x4b,0x11,0x25, + 0x92,0x1f,0x56,0x30, 0x10,0xca,0x62,0x5f, 0x0d,0x01,0x46,0x55, 0x03,0xf5,0x6c,0x7b, + 0x64,0xad,0x24,0x31, 0x01,0x03,0xb4,0x2d, 0xd5,0x70,0x88,0x3d, 0xb4,0xac,0xa8,0xb5, + 0x91,0x45,0x56,0x04, 0x48,0x45,0xa6,0xdd, 0xd8,0xd5,0x03,0x09, 0x75,0x32,0x57,0xb6, + 0x60,0x75,0x45,0x25, 0x2d,0x20,0x25,0x26, 0x36,0xda,0x2b,0xa9, 0x5d,0xb0,0x9c,0xc4, + 0x2b,0x24,0xa1,0x26, 0x01,0x63,0x65,0x02, 0xf5,0x1a,0x02,0xf1, 0x60,0x44,0x33,0x43, + 0x66,0x52,0x48,0x29, 0x62,0x0f,0xf5,0x68, 0xeb,0xbd,0xf4,0x09, 0x61,0x5a,0x54,0xb4, + 0x95,0xbf,0x71,0x6a, 0x95,0x4d,0x10,0x34, 0x0d,0x24,0x53,0x54, 0x02,0x0f,0xe7,0xdf, + 0xc2,0x10,0x5e,0xe5, 0xc7,0x86,0xc5,0x71, 0x85,0x4c,0x04,0x9b, 0x53,0xf6,0xb0,0x1e, + 0x85,0x8b,0xca,0xb3, 0xbf,0x66,0x29,0xf7, 0xaf,0xa3,0x74,0x79, 0x17,0xc4,0x92,0x29, + 0x1e,0x4e,0x0e,0x1c, 0x8a,0x5a,0x41,0x03, 0x63,0x5d,0x26,0xcf, 0xa4,0xf0,0xe6,0x63, + 0xfb,0xfe,0xc7,0xbe, 0xad,0x47,0x4d,0xce, 0xf9,0x7f,0xa3,0x41, 0x46,0x3b,0x31,0xff, + 0x24,0x26,0x65,0x41, 0x69,0x77,0xa0,0x27, 0xea,0x09,0xdc,0x07, 0xac,0x96,0x5a,0x3a, + 0xa7,0x0d,0xc9,0x5a, 0x3b,0xdb,0x7d,0x7a, 0x60,0x05,0x96,0x13, 0x06,0xf0,0x56,0x7c, + 0x09,0x55,0xe8,0x45, 0x43,0xd7,0xa0,0x24, 0x5d,0xeb,0xb0,0xa4, 0x2b,0xf6,0xb3,0x36, + 0x3d,0x16,0x1e,0x05, 0x9d,0xaf,0x06,0x66, 0x53,0x3e,0x17,0x97, 0xb7,0xb3,0xfa,0x72, + 0x60,0x2e,0x28,0x83, 0x15,0x80,0x17,0xb7, 0x37,0xcc,0x38,0xd4, 0x93,0x8b,0xd1,0xff, + 0xf1,0x77,0x24,0x53, 0x85,0x09,0x0e,0xe0, 0x76,0xe0,0x70, + // 0x5cdb = 23771 data bytes (33%) +}; + +static BZ2Manager_t lecode_jap_bin_mgr + = { lecode_jap_bin_bz2, sizeof(lecode_jap_bin_bz2), 0, 0 }; + +//----------------------------------------------------------------------------------- + +static const u8 lecode_kor_bin_bz2[] = // pool/ref/lecode/r32/lecode-KOR.bin +{ + // decompressed size: 0x117a0 = 71584 bytes + 0x00,0x01,0x17,0xa0, + + // bzipped data + 0x42,0x5a,0x68,0x39, 0x31,0x41,0x59,0x26, 0x53,0x59,0x4d,0x6c, 0x56,0x62,0x00,0x29, + 0xad,0x7f,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xe0, 0x4e,0xbb,0xee,0x4f, 0xaf,0x78,0xeb,0xef, 0x7d,0xc6,0xd8,0x94, + 0xab,0xe8,0x6b,0xbe, 0xfb,0xef,0x3e,0xe3, 0x36,0xbe,0x37,0x6b, 0xbb,0x37,0x3d,0x77, + 0xb7,0xd7,0xd3,0x9f, 0x3b,0xe3,0xc3,0xcd, 0x8c,0x26,0xc3,0x13, 0x66,0x47,0x7d,0xf4, + 0xf7,0x81,0x9f,0x61, 0xc9,0xd3,0xd1,0xd7, 0x76,0x4e,0xfb,0xb9, 0x07,0x44,0x86,0xaf, + 0x66,0x88,0xf9,0xed, 0xbb,0xb9,0xdf,0x6f, 0x68,0xee,0xc8,0x7b, 0xef,0x75,0xf3,0xe6, + 0x6d,0xb2,0x82,0xea, 0x93,0xee,0xd7,0xaf, 0x70,0x05,0x6b,0xdb, 0xeb,0xcd,0xf7,0x7b, + 0xaf,0x17,0xd5,0x1d, 0x5b,0xea,0xbe,0xb5, 0xd8,0x34,0x9c,0x7d, 0x1f,0x6d,0x3d,0xef, + 0xbb,0xe5,0xf7,0xb7, 0x6f,0xbd,0xab,0xdb, 0xee,0x7d,0xbb,0xe7, 0xd7,0x5e,0xf9,0x80, + 0x51,0xeb,0x4a,0xfb, 0x1a,0xed,0x33,0x37, 0x3b,0x9f,0x1f,0x1f, 0x27,0x9b,0xcc,0x61, + 0xf2,0xaf,0x66,0x3e, 0xf2,0x4f,0x88,0x87, 0x47,0xd4,0x0b,0xe6, 0x7b,0xd7,0x3e,0x77, + 0xdd,0xa3,0x7d,0x5f, 0x7a,0xef,0xbb,0x3e, 0xf6,0x5d,0xb7,0x3a, 0x94,0xee,0x77,0xb3, + 0xbe,0xfb,0xc3,0x94, 0x17,0xb5,0x69,0xf7, 0x55,0x03,0x9d,0xb6, 0xfa,0xfb,0xdd,0xf6, + 0xbd,0x83,0xd3,0x5e, 0xfb,0x9a,0xd7,0xd5, 0xf5,0xf2,0xfb,0x0f, 0x1a,0xce,0xb3,0xeb, + 0x6d,0x13,0xd4,0xa8, 0x3b,0xec,0x35,0x34, 0x41,0x34,0x00,0x04, 0x64,0x00,0x69,0x30, + 0x98,0x4c,0x13,0x00, 0x04,0xd3,0x4d,0x1a, 0x34,0x32,0x64,0xd3, 0x43,0x4c,0x44,0xf2, + 0x62,0x34,0x68,0xd3, 0x43,0x53,0x34,0x98, 0x13,0x27,0xa3,0x42, 0x7a,0x00,0x13,0x4d, + 0x30,0x4c,0x4c,0x53, 0x68,0xd5,0x4f,0xf4, 0xa7,0xb4,0xd3,0x26, 0x4d,0x01,0x3d,0x32, + 0x4c,0x9e,0x9a,0x06, 0x89,0xea,0x69,0x8a, 0x7a,0x69,0xa6,0xa7, 0xa8,0xf2,0x4d,0x4f, + 0xd4,0x1a,0x9a,0x40, 0x09,0xa6,0x80,0x00, 0x00,0x04,0xc4,0xc0, 0xa9,0xf9,0x34,0x06, + 0x82,0x64,0xc2,0x65, 0x3d,0x00,0x08,0xc4, 0xc4,0xc9,0xa9,0xe9, 0xa4,0xf4,0x32,0x27, + 0x90,0xd4,0xca,0x79, 0x4f,0x53,0xda,0x93, 0xcd,0x13,0x1a,0x53, 0xc4,0x63,0x53,0x53, + 0xd1,0xb4,0x4c,0xa7, 0xa4,0xf4,0x8c,0xd4, 0xfd,0x14,0xf2,0x46, 0x8f,0x4c,0x49,0xfa, + 0x53,0x6a,0x69,0xe5, 0x03,0x4c,0x4d,0xea, 0x86,0xd4,0xda,0x8d, 0x0d,0x34,0x0d,0xa9, + 0xa0,0xd4,0xd0,0x40, 0xd0,0x98,0x8c,0x40, 0x26,0x8d,0x06,0x80, 0x13,0x26,0x98,0x4d, + 0x1a,0x18,0x40,0xca, 0x7a,0x00,0x00,0x53, 0xd3,0x68,0xa9,0xe9, 0xe4,0x62,0x0a,0x7a, + 0x34,0x60,0x9b,0x41, 0x34,0x65,0x1f,0xa5, 0x1e,0x9b,0x4a,0x32, 0x79,0xa0,0xd5,0x34, + 0xf4,0x6a,0x36,0x48, 0xf4,0xf2,0xa7,0xa4, 0xc9,0xe5,0x19,0xa9, 0xa6,0x9b,0x48,0xf2, + 0x09,0xe9,0x34,0x0c, 0x9a,0x0f,0x51,0xe8, 0xd2,0x1e,0x89,0xea, 0x7a,0x80,0x69,0xa1, + 0x34,0x44,0x01,0x1a, 0x98,0x4c,0x99,0x32, 0x1a,0x06,0x45,0x3c, 0xc8,0x86,0xd2,0xa7, + 0xb1,0x31,0x34,0xc4, 0x4d,0x4f,0x05,0x3d, 0xa3,0x21,0x34,0x66, 0xa8,0xd3,0xc0,0xa3, + 0xca,0x1e,0xd2,0x9e, 0x4d,0x4f,0x53,0xca, 0x1b,0x51,0xfa,0x51, 0x8d,0x35,0x1e,0x93, + 0x69,0x0c,0x9e,0xa0, 0xd1,0xb5,0x1a,0x79, 0x35,0x1e,0xa1,0xe9, 0x3d,0x43,0x11,0xea, + 0x3f,0x4a,0x34,0x33, 0x51,0xea,0x7a,0x8f, 0x26,0xa0,0xd1,0xea, 0x68,0x03,0xd4,0x06, + 0x20,0x34,0xf4,0xa4, 0x24,0xf5,0x19,0x34, 0x68,0xa9,0xf8,0x9e, 0x89,0xa6,0x8c,0x53, + 0x6a,0x6a,0x7b,0x49, 0x9a,0x21,0xea,0x4f, 0xd1,0x4f,0x14,0xfd, 0x4c,0xd4,0x68,0xca, + 0x7a,0x4c,0x46,0x99, 0x3d,0x4d,0x94,0xda, 0x47,0x91,0x3d,0x09, 0xe9,0x3d,0x4d,0x0f, + 0x53,0x41,0x91,0x93, 0x4c,0x27,0xa9,0x93, 0x4d,0x1a,0x69,0xea, 0x64,0x69,0x93,0xd2, + 0x34,0x18,0x8d,0x18, 0x98,0x86,0x81,0xea, 0x0d,0x0d,0x06,0x83, 0x46,0x4d,0x00,0x0f, + 0x50,0x06,0x9a,0x68, 0x04,0x89,0x10,0x80, 0x80,0x00,0x26,0x46, 0x40,0x68,0x1a,0x08, + 0xc4,0x69,0x90,0xc2, 0x35,0x3c,0x43,0x21, 0xa0,0xd1,0x88,0x98, 0x1a,0x4f,0x48,0xc9, + 0xb4,0xd2,0x60,0x9a, 0x9b,0x10,0xc9,0xa6, 0x43,0x42,0x66,0x99, 0x4f,0x46,0x14,0xf4, + 0x98,0x4d,0xa9,0xe5, 0x3c,0x93,0x0d,0x32, 0x29,0xe9,0xa9,0xe9, 0x8d,0x53,0xf4,0x35, + 0x18,0x87,0xa2,0x32, 0x8c,0x4c,0x34,0xf4, 0xa1,0xe9,0xa6,0x46, 0xa0,0x57,0x8d,0xe5, + 0x76,0x1d,0x86,0x90, 0xe3,0xf6,0x68,0xec, 0x6c,0x38,0x8a,0x07, 0x59,0x87,0xff,0x1d, + 0xde,0xe2,0x61,0x6f, 0x52,0xa4,0x8b,0x7b, 0x33,0xa4,0x60,0xba, 0x27,0xa0,0x5c,0x6a, + 0x35,0x74,0x03,0x4f, 0xfb,0xd8,0x68,0x4c, 0x55,0xa8,0x85,0x0c, 0x04,0x6d,0x58,0x01, + 0x72,0xd2,0x4b,0x4d, 0x46,0xa2,0xaa,0x84, 0x82,0xb3,0x84,0x10, 0xa0,0xe6,0x11,0x44, + 0xa3,0x98,0x03,0xb1, 0xb9,0x82,0x88,0x34, 0x82,0x92,0x4b,0x23, 0x90,0x85,0x22,0xa1, + 0x44,0xe6,0x9e,0x54, 0x29,0x51,0x77,0xa1, 0xad,0xbe,0xed,0x75, 0x6d,0x58,0xb1,0x12, + 0x8b,0x75,0x6c,0xdb, 0xb1,0x41,0x28,0xd3, 0x4f,0x3a,0xcc,0xab, 0x56,0xe2,0xf4,0xd4, + 0x2b,0x01,0x0e,0xed, 0x4b,0x17,0x71,0x53, 0xe2,0x6f,0x2e,0x62, 0xe2,0xe3,0x63,0xd2, + 0x9d,0x9e,0x07,0xb5, 0x0a,0xff,0xd0,0x6e, 0x0e,0x80,0x17,0xcb, 0xac,0x9c,0x31,0x95, + 0x4a,0xbf,0x16,0xc5, 0xc9,0xd8,0xf5,0xb5, 0xab,0xd7,0x82,0xbc, 0x04,0x21,0x09,0x69, + 0x36,0xd9,0xf9,0x24, 0x23,0x3f,0x95,0x00, 0x52,0xdf,0x34,0xe0, 0x31,0xd9,0x60,0x65, + 0x4f,0x9a,0xa1,0x42, 0xd9,0xb1,0x18,0xec, 0xce,0x32,0xbd,0x04, 0x43,0x81,0xaa,0xcc, + 0x93,0x24,0xd6,0x2f, 0x29,0x0c,0x42,0x48, 0x52,0x6d,0x11,0xdc, 0x9a,0xde,0x5f,0xb6, + 0xc9,0xfe,0x99,0x5e, 0x05,0xed,0xa0,0x03, 0x90,0x03,0x90,0x06, 0xfb,0x73,0xa1,0xd7, + 0x6b,0x3f,0xd7,0xfb, 0x72,0x7c,0x4f,0x32, 0xfb,0xae,0x65,0xb4, 0x31,0x8d,0xa6,0x7e, + 0xd5,0x1e,0x5b,0x32, 0x5a,0x3e,0x13,0x0c, 0xd6,0x8c,0xf5,0x44, 0x07,0xfb,0xfe,0xbf, + 0xd9,0x87,0xfa,0xff, 0x63,0x75,0x57,0x02, 0x06,0xdb,0x82,0x07, 0x04,0x2e,0xf5,0x7c, + 0x2e,0x90,0x4c,0xd0, 0xde,0x69,0x65,0x26, 0xa5,0xbf,0xcb,0x9c, 0x4d,0x36,0x6a,0x41, + 0x12,0xd4,0x6d,0x99, 0xb7,0x9d,0x31,0xe6, 0x92,0xe2,0x53,0xe1, 0xc4,0xda,0x85,0x8d, + 0x46,0x5f,0x9c,0x13, 0xff,0x04,0x63,0x03, 0x01,0x40,0x30,0x0f, 0x9b,0xfe,0xde,0x4e, + 0x1f,0x55,0xf7,0x38, 0x2c,0x1a,0x73,0x72, 0x19,0x6a,0x72,0x9a, 0xb8,0x25,0xa9,0x6e, + 0x17,0xcf,0xe7,0xa2, 0xe2,0x19,0x99,0x27, 0x13,0x28,0x1c,0xcf, 0x90,0x06,0x3d,0x1e, + 0x02,0xc2,0x9d,0x38, 0xe0,0x15,0xb1,0x21, 0x98,0x05,0x55,0x38, 0xb2,0xd3,0xab,0x2c, + 0xc8,0x87,0x7e,0xc2, 0x07,0x28,0xe2,0x8b, 0xca,0x7f,0x7b,0xb2, 0x02,0xa9,0x19,0xa4, + 0xaa,0x9e,0xfa,0x6f, 0x44,0x8d,0xe4,0x11, 0xc1,0xce,0x61,0x1f, 0xa0,0x0e,0x98,0x39, + 0x05,0x9b,0x2b,0x64, 0xdd,0x93,0x5e,0x82, 0x57,0x25,0xad,0x08, 0x67,0x8b,0xdb,0x17, + 0x9c,0xc4,0xe0,0xdb, 0x49,0x90,0xaf,0x0d, 0x37,0x71,0x55,0x57, 0x8c,0xb6,0xd2,0xbd, + 0x72,0xec,0xfb,0x29, 0xe6,0x56,0x5d,0x0d, 0x86,0xfa,0x4c,0x13, 0x4d,0x30,0x82,0x8c, + 0xbf,0x75,0x0c,0x09, 0xfa,0xa8,0x04,0xc0, 0xcd,0xb3,0x2e,0x02, 0x68,0x07,0xbc,0xdc, + 0xb9,0x41,0x10,0xf1, 0x8b,0x86,0x42,0x99, 0x54,0xb7,0xf3,0xde, 0x99,0x5c,0x0a,0xc0, + 0x10,0x12,0xfd,0x2a, 0x89,0x55,0x00,0x12, 0x11,0xf2,0xb2,0xe1, 0xf2,0xf0,0x4e,0x52, + 0xd4,0xbe,0xc9,0xa5, 0xb3,0xf3,0x94,0x69, 0x53,0x95,0x73,0xba, 0x32,0xc7,0xb3,0x83, + 0x0d,0xf1,0xb1,0x89, 0x39,0x54,0xc3,0xc4, 0x6b,0x05,0x3c,0xc6, 0x8d,0x03,0xa3,0x17, + 0x81,0x16,0x5c,0x63, 0xf1,0x68,0xb8,0xa8, 0x2a,0xc3,0x31,0x3c, 0x3b,0x10,0x24,0xbf, + 0x77,0xa8,0x90,0x5c, 0x8d,0xe4,0xd6,0x58, 0x21,0xd6,0x97,0x00, 0xb9,0xc7,0x15,0xe4, + 0x09,0x69,0x7f,0xc9, 0x95,0x9b,0x1b,0xbc, 0x73,0xf5,0xd8,0x33, 0xd2,0x34,0x6e,0xf6, + 0x8e,0x6f,0x42,0x95, 0x86,0x5c,0xba,0xa2, 0x5e,0x09,0xde,0x15, 0x5f,0x51,0xbc,0x00, + 0x39,0xcd,0xf2,0xe1, 0xc0,0xbb,0xcd,0x7e, 0x69,0x77,0xa5,0x2e, 0xc1,0x39,0xf4,0xaa, + 0x0c,0x3e,0x5c,0x5b, 0xf5,0x51,0xdf,0x8c, 0x17,0x4e,0x11,0xeb, 0xd2,0xcd,0x53,0x35, + 0x44,0xf8,0xaa,0xe5, 0xc2,0x03,0x7d,0x31, 0x6d,0xe5,0x48,0xed, 0x8a,0xf1,0x6a,0x98, + 0xec,0xcf,0x14,0x38, 0xad,0xe3,0x50,0x16, 0x82,0x44,0xc8,0x8f, 0xe0,0xf9,0xe9,0xa2, + 0xea,0x84,0x12,0x1c, 0xe6,0x19,0x2f,0x89, 0xae,0xa9,0xd2,0x61, 0x06,0x02,0x51,0xb1, + 0x75,0x12,0x0f,0x6d, 0x46,0x61,0xc6,0x9c, 0x46,0x0a,0x7f,0xb5, 0xb6,0x60,0x36,0xbe, + 0xdc,0xce,0x45,0x0d, 0x46,0x16,0xf3,0xc1, 0xaf,0x65,0x7f,0xa5, 0xaf,0xa3,0x8f,0x1b, + 0xec,0x69,0x11,0x67, 0x1e,0x77,0xdb,0x55, 0xce,0x97,0x82,0x3b, 0x7a,0xb8,0x54,0xd4, + 0x80,0x4b,0x83,0xbf, 0xfd,0xcd,0xf4,0xd5, 0xcb,0x10,0x8b,0x47, 0x42,0x43,0x1f,0xbd, + 0x1c,0x90,0x62,0xba, 0x3a,0x45,0x90,0x40, 0xd6,0x23,0x60,0xbd, 0xee,0xf7,0x3a,0x43, + 0xaa,0xf7,0xa1,0xb3, 0xff,0x0a,0x8f,0xe6, 0xd1,0x9a,0x85,0xf4, 0xae,0xd4,0x15,0x88, + 0x02,0xc3,0xac,0xf7, 0x5d,0x75,0x02,0xdc, 0x58,0xac,0xae,0x6c, 0x9e,0x9f,0x15,0x58, + 0xc7,0x70,0xc1,0x16, 0x67,0xa9,0x5d,0x1d, 0x8c,0xf7,0xae,0x34, 0xcd,0x36,0x17,0xbc, + 0x60,0xe8,0x1a,0x9b, 0x54,0xbd,0xf8,0xd9, 0x86,0x60,0xe9,0x30, 0x3c,0x84,0x5a,0xad, + 0x39,0x6f,0x37,0x98, 0x9b,0xf8,0xe9,0x54, 0xaf,0x65,0x46,0xd0, 0x9e,0xb3,0x81,0xc8, + 0xcc,0x02,0x61,0x2b, 0x16,0x1d,0xb3,0xa4, 0xfc,0x3a,0xcd,0x5b, 0xa6,0x02,0xde,0x9b, + 0x2e,0x8b,0xd2,0xce, 0xe2,0x56,0xaa,0xf0, 0xcd,0x60,0x09,0x90, 0x50,0x58,0xb1,0x4b, + 0xb5,0xf9,0x16,0xb0, 0xcd,0x0d,0x95,0x4f, 0x2b,0x1d,0xeb,0x8b, 0xfc,0xea,0x69,0xa9, + 0x09,0xa3,0x02,0xc4, 0xc2,0x61,0x25,0x3e, 0xf3,0x08,0x25,0xa9, 0x4f,0x6c,0x54,0x1b, + 0x13,0xcd,0x0d,0xf0, 0x17,0x79,0x85,0x78, 0x15,0x13,0x92,0x28, 0x20,0x82,0x09,0x95, + 0x3f,0x90,0x38,0xd7, 0x1b,0x8d,0x4a,0xf1, 0x44,0x74,0x07,0x12, 0x83,0xf7,0xb7,0x5f, + 0x45,0x05,0x88,0xcc, 0xa4,0x6e,0xbc,0xba, 0x98,0x5d,0xc4,0x81, 0xee,0x8b,0xfb,0xfe, + 0x5f,0x30,0xea,0xc3, 0x0b,0xaa,0x16,0x9a, 0x40,0xe0,0x44,0xb5, 0x95,0x52,0xdd,0x8c, + 0x8c,0x08,0xf2,0x62, 0xa8,0x64,0xa1,0x26, 0xfc,0x22,0x15,0xaf, 0x12,0x2a,0x18,0xe2, + 0x8e,0x75,0xcc,0xd6, 0xd8,0xaa,0x0d,0x8a, 0xbb,0xf9,0xbb,0xcb, 0xf7,0xa6,0xd2,0x3a, + 0xd8,0xbe,0x41,0x97, 0xc2,0xe7,0x63,0xef, 0x9e,0x89,0x93,0x03, 0x15,0xe2,0x44,0x75, + 0x6c,0x20,0x7a,0x1b, 0xa1,0x4e,0x7e,0x3c, 0x39,0xd5,0x67,0xa0, 0x24,0x4d,0x11,0x4e, + 0x26,0x15,0x04,0xe5, 0x08,0x8f,0xe2,0x3d, 0x10,0x00,0xe3,0x59, 0xb4,0x56,0xce,0x08, + 0xe7,0x44,0x4b,0x27, 0x7e,0xf8,0xb3,0x4b, 0x7f,0x9b,0xb7,0xf7, 0xfb,0x05,0xa1,0xe1, + 0xd7,0xa4,0xf6,0x0f, 0x53,0x18,0xc2,0x54, 0x09,0xea,0x45,0x7c, 0x0e,0x19,0x47,0xd6, + 0x8d,0xda,0x3f,0x35, 0x0c,0xe7,0x42,0x85, 0x90,0xa1,0xc3,0x80, 0x9b,0x0a,0xe3,0x73, + 0x6d,0x91,0xbc,0xd4, 0x60,0x37,0x8e,0xb9, 0xc3,0xe0,0x31,0x7d, 0x2d,0x2a,0xbb,0x4b, + 0x95,0xe9,0xda,0xbe, 0xb0,0xeb,0xae,0xa7, 0xfb,0xfc,0x6c,0x63, 0x60,0x95,0x09,0x92, + 0x6d,0x51,0x55,0x21, 0x66,0x29,0x02,0x29, 0xba,0x5e,0x16,0x83, 0xc4,0xaa,0x7f,0x56, + 0x4d,0x09,0x63,0x88, 0x0c,0xdd,0x9d,0xf5, 0x34,0xa7,0xc4,0xc5, 0xa6,0x1e,0xdb,0x8c, + 0x71,0x93,0x52,0x1e, 0x83,0xca,0xd0,0xa7, 0xec,0xea,0x66,0xf5, 0x68,0xf3,0x73,0x92, + 0x7d,0x2e,0x0e,0xde, 0x47,0xce,0x7f,0xfc, 0x63,0x36,0xcd,0xed, 0x5d,0xd6,0x7a,0x8f, + 0x77,0x77,0x7f,0x92, 0xbc,0xe5,0x29,0x1e, 0xc4,0x87,0x6c,0x37, 0xe3,0xde,0x63,0x76, + 0xae,0x5a,0xe8,0xdd, 0x8c,0xf5,0xb9,0x76, 0xc9,0xd4,0x2e,0xde, 0x83,0xb8,0xda,0x36, + 0x12,0x1d,0x63,0x19, 0x1c,0x50,0x96,0x3c, 0xd0,0x0d,0xf2,0x42, 0x0b,0x16,0x9a,0x8b, + 0xc8,0x8d,0x8c,0x6e, 0x7b,0xe0,0x3a,0xf2, 0x4e,0x2c,0xed,0x9d, 0xd0,0xca,0xc1,0x7c, + 0x9c,0xc9,0xf9,0x46, 0x2c,0xef,0x52,0x31, 0xf7,0x8e,0xa4,0x46, 0x1a,0xdb,0x7b,0x82, + 0x93,0x4c,0x9b,0x20, 0x3c,0x99,0xbe,0xa3, 0xcf,0xf7,0x1e,0xfb, 0x33,0x07,0xae,0x9d, + 0xd7,0xb3,0x3a,0x84, 0x1d,0xf3,0x19,0x3f, 0xa1,0x12,0x9a,0xdc, 0xc6,0xd2,0x80,0xd2, + 0x8a,0x9c,0x98,0xcc, 0xba,0xb6,0x50,0xf3, 0xe9,0xe0,0x5c,0xfb, 0x76,0x70,0x81,0x58, + 0x95,0x91,0x02,0x03, 0x5d,0xd2,0x30,0xcb, 0xd5,0x22,0x1b,0x21, 0xa2,0xc4,0x78,0x9a, + 0x64,0x39,0x1f,0x15, 0xcb,0x14,0x64,0x11, 0x5b,0x86,0xa2,0x6a, 0x88,0xb9,0x3b,0xa6, + 0x31,0x8c,0xdd,0x4b, 0x07,0x00,0x27,0xe9, 0xbe,0x67,0x08,0xd4, 0xd5,0xf9,0x47,0x21, + 0x68,0x08,0x69,0x1f, 0x1d,0xdb,0xfe,0xde, 0x0c,0x38,0xa9,0x7b, 0x41,0xfd,0xcd,0x43, + 0x26,0x28,0x1f,0x80, 0xd1,0xc6,0x10,0x8a, 0x35,0x6c,0xd4,0x8d, 0xc8,0xe3,0x44,0xc2, + 0xad,0x68,0x8f,0xd6, 0x0e,0x6d,0xae,0xd2, 0x27,0x00,0xd0,0xbe, 0xd6,0x62,0xf5,0x75, + 0x61,0xac,0x69,0x08, 0x68,0x60,0xef,0x76, 0x1a,0x0e,0x06,0x57, 0xcc,0xc1,0xae,0x15, + 0x9a,0x05,0x53,0xf0, 0x7b,0x9e,0xbe,0xce, 0x73,0x60,0x52,0x4c, 0x7a,0x57,0xa2,0xfe, + 0x85,0x48,0x5c,0xfc, 0xf2,0xd6,0x6e,0x06, 0x1c,0x33,0xf8,0x6b, 0xa6,0x2a,0xdb,0x15, + 0xa5,0xc8,0x72,0xb1, 0x8c,0x63,0x30,0x01, 0x98,0xb6,0x67,0x1a, 0xb8,0x41,0x1f,0x53, + 0x80,0x7a,0x06,0x95, 0x1b,0x91,0x08,0x5d, 0x7e,0x0a,0x10,0x1c, 0x78,0x41,0x63,0x85, + 0x09,0xc7,0x2f,0x8f, 0x4e,0x98,0xae,0x80, 0xae,0xcd,0x77,0x5d, 0x5c,0xc0,0x73,0xea, + 0xf5,0xb7,0x33,0x10, 0x4f,0x5a,0xe0,0x31, 0x59,0x54,0xbf,0xef, 0xae,0xbe,0x96,0x93, + 0x16,0xee,0x48,0x22, 0xe6,0xee,0x4d,0x42, 0x93,0x83,0xa6,0x92, 0x70,0xb5,0x4d,0x71, + 0x5c,0x36,0x79,0x68, 0x2f,0xb1,0x35,0x38, 0x3b,0x2d,0x22,0x7a, 0xb2,0xfe,0xad,0x8c, + 0x42,0xc6,0x03,0xa2, 0xc2,0xbb,0x6e,0x63, 0x77,0x0c,0x2e,0x46, 0xa4,0xf7,0xef,0x34, + 0xc8,0xaa,0x67,0x1b, 0x75,0x5f,0x4d,0xb4, 0xd5,0x2f,0xa8,0x5f, 0x55,0xb3,0x4a,0x27, + 0xdb,0x67,0x67,0x36, 0xbb,0x9c,0xa9,0x2a, 0x34,0x49,0xcf,0x74, 0xb4,0xd0,0x57,0x2e, + 0x35,0xa9,0x00,0x0d, 0x97,0x52,0x99,0xf7, 0xef,0x7b,0xfb,0xe8, 0xd5,0xd3,0xe0,0x5e, + 0xff,0xb8,0xe9,0xea, 0x38,0x7b,0xb8,0x9a, 0xc0,0x42,0xca,0x3e, 0x15,0xdd,0x2b,0xa8, + 0xf9,0x08,0x2a,0x45, 0x00,0x11,0x80,0x12, 0xef,0x80,0x3e,0x7b, 0xa6,0xb3,0x87,0xba, + 0x55,0xa6,0x0c,0x12, 0x3c,0x88,0x18,0xd3, 0x2d,0xe7,0xde,0x36, 0x52,0xc3,0x06,0x93, + 0x91,0xb1,0x5c,0x8d, 0x89,0xaf,0xbb,0x85, 0x31,0xd8,0x27,0x9f, 0x3d,0x60,0xc0,0x1a, + 0x42,0x44,0xd4,0xcb, 0x15,0x73,0x9a,0x06, 0x03,0x43,0x6f,0x8f, 0x93,0xb7,0xc9,0x31, + 0xa6,0xe8,0xe4,0xdc, 0xe4,0x2d,0xe7,0x99, 0x75,0x20,0x1a,0x80, 0x27,0xf3,0x1d,0x9f, + 0x1b,0x89,0xbb,0x0a, 0xac,0xa6,0xd6,0x1f, 0xe6,0x69,0x28,0x44, 0xb5,0xdc,0x63,0xc5, + 0x97,0x9f,0x78,0xcf, 0xce,0x6a,0xa1,0x2e, 0xf3,0x2b,0x0b,0x12, 0x40,0xde,0xf3,0x75, + 0xcb,0x21,0xaf,0x5f, 0xa5,0xc3,0x63,0xdb, 0xc0,0x55,0x31,0x17, 0x37,0x1b,0x57,0xd0, + 0x29,0x44,0x4d,0x70, 0x26,0x34,0x12,0x43, 0x5e,0xeb,0xc7,0x8d, 0x75,0x4f,0x24,0x9e, + 0xc0,0x29,0xb4,0x08, 0x19,0x9a,0xa9,0xdb, 0x8d,0xbe,0xa6,0xe5, 0xad,0x1a,0xe0,0xb2, + 0xee,0x01,0xc8,0x75, 0x00,0x12,0x05,0xa9, 0x28,0x06,0x66,0xe5, 0xcb,0x20,0x6b,0x21, + 0x00,0xa1,0x2e,0x62, 0xf6,0x14,0x99,0xf6, 0x8d,0xa8,0x6d,0xb6, 0xca,0xac,0xfb,0x42, + 0x60,0xbb,0xda,0x71, 0x83,0x11,0x50,0x12, 0xf1,0x26,0x00,0x4c, 0x84,0x41,0xf5,0xb3, + 0xd3,0xb7,0x12,0x9d, 0x0a,0xa2,0x0e,0x06, 0x56,0xd6,0xe2,0x6f, 0x6f,0x65,0x51,0x57, + 0x2a,0x77,0xfd,0xbd, 0x9d,0xba,0xaa,0x1c, 0xe2,0x13,0x55,0xd0, 0xb2,0x33,0xf3,0x60, + 0x94,0xe1,0x20,0xa3, 0x6e,0x4a,0x6e,0x24, 0xb0,0x1b,0xb7,0x04, 0x67,0x09,0x97,0x32, + 0x58,0x4e,0x15,0xb4, 0x96,0xfc,0xae,0x3b, 0x81,0x90,0x08,0x42, 0x61,0xa6,0x20,0x61, + 0x1a,0x60,0xc4,0x3b, 0x11,0x9d,0x8a,0x8c, 0x58,0x02,0xe5,0x57, 0x30,0x46,0x25,0x2b, + 0x0e,0x62,0xc9,0x32, 0x0f,0x53,0x3d,0x17, 0x82,0x21,0xc2,0x69, 0xb7,0x96,0x58,0xfd, + 0x25,0x70,0x65,0x06, 0x8a,0x8b,0x0b,0xc0, 0x44,0xc1,0x77,0x47, 0x1c,0x27,0xd4,0x71, + 0xfc,0x74,0x62,0xa3, 0x49,0x7d,0xf7,0x41, 0x64,0x57,0x20,0x6f, 0xed,0x33,0x36,0x59, + 0x63,0x37,0x2d,0xf0, 0x83,0x61,0x29,0x31, 0x75,0xd5,0x94,0xa6, 0x41,0x1b,0x59,0xe6, + 0xd3,0x2a,0x8b,0xa9, 0x3b,0x6a,0x6b,0x08, 0x46,0xad,0x6d,0x56, 0xc9,0xa6,0x91,0x8d, + 0x6b,0x63,0xc2,0xe0, 0xc6,0x7c,0x3b,0xfa, 0xef,0x26,0x70,0x74, 0x13,0x91,0x1e,0x44, + 0xb8,0x92,0xe5,0xa9, 0xff,0x9b,0xc5,0x55, 0x4a,0xd5,0x89,0xe8, 0x4f,0x72,0x17,0x37, + 0x8e,0x5d,0xa9,0x00, 0x86,0x89,0x25,0x9f, 0x60,0x69,0x13,0x66, 0xb6,0x28,0x6b,0x44, + 0xc3,0x40,0xcd,0x22, 0x69,0x27,0x10,0x43, 0x50,0xfd,0x16,0x14, 0x65,0xb8,0x59,0xf6, + 0xb6,0x6c,0x45,0x23, 0xb1,0x4c,0x04,0x30, 0xb2,0xf1,0x5a,0x28, 0x69,0x03,0x64,0x87, + 0x0d,0x24,0x43,0x03, 0x72,0xe8,0xd3,0xd1, 0x2d,0xb5,0xd4,0xa4, 0x1a,0x5d,0x35,0x62, + 0x46,0xba,0x76,0x64, 0xd3,0x2c,0xb4,0x59, 0x06,0x9b,0x05,0x59, 0xa9,0x31,0x23,0x09, + 0x92,0x21,0x34,0x0a, 0x22,0x41,0x8b,0x77, 0xa1,0xc0,0xb3,0x9f, 0xa1,0xb6,0xa2,0xc8, + 0x08,0x28,0x0e,0x21, 0x56,0xc3,0xb9,0x46, 0xa1,0x95,0xd2,0x88, 0x83,0x14,0x83,0x07, + 0xcc,0x4b,0x27,0x0b, 0x07,0xbc,0xae,0x80, 0x6c,0xab,0x28,0xb3, 0xcb,0xba,0x23,0x00, + 0xe3,0x1f,0x75,0x13, 0xa8,0x6b,0x51,0x3b, 0x91,0x3a,0x46,0xc2, 0x51,0x59,0xb5,0xcd, + 0x66,0x93,0x29,0xa4, 0x98,0xe7,0xc7,0xd1, 0xec,0x63,0x9a,0xb7, 0xa7,0x79,0xf5,0xf7, + 0x38,0x90,0x36,0xf2, 0xa3,0x9c,0xbe,0xa7, 0x32,0x8c,0xc9,0x50, 0xce,0x90,0x38,0x64, + 0x14,0x06,0x75,0x13, 0x9c,0xf0,0x73,0x10, 0x55,0xff,0x20,0x7b, 0x3d,0x60,0x4d,0x0b, + 0xd2,0xc0,0xac,0x79, 0x4d,0xbc,0x59,0xea, 0xb2,0xaf,0x9b,0x74, 0x79,0x12,0xbc,0xa6, + 0x80,0x47,0x52,0x2a, 0x8e,0xe1,0x3d,0xe1, 0x3b,0xb8,0x43,0xb9, 0xd6,0x66,0x72,0x0e, + 0xbd,0x07,0x06,0x4d, 0x14,0xc9,0xa6,0x97, 0xea,0x35,0x11,0x6d, 0x7b,0x3d,0x4e,0xf8, + 0x01,0xf3,0xd2,0xe3, 0x69,0x39,0x67,0xca, 0xda,0x8c,0x2f,0xd3, 0xc3,0x58,0x72,0xcd, + 0x86,0x55,0x88,0xe7, 0xb4,0xc1,0x87,0x53, 0x24,0xfa,0x7a,0xbc, 0x6e,0x69,0xd7,0x5c, + 0xad,0xba,0xea,0xb0, 0x70,0xe7,0x9e,0x91, 0x0d,0xa3,0x87,0xc2, 0x96,0xb7,0x5f,0x4e, + 0x51,0xaa,0x50,0x62, 0xd5,0x9f,0x1d,0x39, 0x4d,0x50,0x73,0x47, 0xf7,0xd2,0x6e,0x6e, + 0x08,0xba,0x40,0x06, 0x26,0xcc,0x61,0x5c, 0x6f,0xa1,0x9d,0x85, 0x16,0xe6,0x77,0x6c, + 0xc3,0x94,0x62,0x6f, 0xaa,0xb8,0x1b,0x4a, 0x4c,0xcf,0x98,0xe6, 0x50,0x79,0xc6,0xe6, + 0xde,0xad,0x1d,0x5a, 0xf0,0xa6,0x9c,0xeb, 0x24,0x20,0xf4,0x5c, 0x27,0x0c,0xee,0x7f, + 0x2b,0x01,0x35,0x3b, 0x0c,0xc6,0x7d,0x83, 0x8d,0xa1,0x76,0x63, 0x8e,0x60,0xdd,0x62, + 0xcb,0x1a,0x31,0x43, 0x46,0x38,0x35,0x5a, 0xeb,0x5d,0xe1,0xf9, 0x28,0x09,0x51,0x44, + 0xaa,0x8b,0x89,0x6d, 0xf5,0x4e,0x8a,0xa7, 0x41,0x04,0x50,0x3b, 0x9a,0x2d,0x47,0xb0, + 0xc1,0xcd,0xad,0x46, 0xa8,0x9e,0xe1,0x3d, 0xdc,0xe1,0x8d,0xfa, 0x6e,0xad,0xe5,0x10, + 0x7d,0xf2,0xa3,0xba, 0x65,0xcc,0x40,0x56, 0xb5,0xf0,0x7e,0x47, 0x35,0xdc,0x47,0xea, + 0xad,0x58,0xb3,0x8e, 0x70,0xb3,0x9a,0xab, 0xdb,0x88,0xa2,0x4e, 0x25,0x4c,0x3a,0x84, + 0x90,0x50,0xd0,0x5c, 0x81,0xe3,0x47,0x74, 0xc5,0xea,0x4c,0xd5, 0x76,0x7b,0x0a,0x14, + 0xf6,0xcb,0xc1,0xc4, 0xed,0xb2,0x69,0x31, 0xda,0x17,0x91,0xcd, 0x41,0xfc,0x2f,0x25, + 0x99,0xb9,0x6f,0x6f, 0x80,0x66,0xc4,0x72, 0x69,0x56,0xb4,0x73, 0x8e,0x7e,0xb4,0xb8, + 0xd0,0xe8,0x0d,0x7d, 0x68,0x20,0x13,0x8a, 0xa7,0x71,0x24,0x56, 0xa4,0x03,0x2a,0x0b, + 0xe6,0x24,0xb4,0xdc, 0xfb,0x86,0xc2,0x7a, 0x6e,0xbd,0x47,0xc8, 0x3c,0x89,0xd0,0x48, + 0x66,0x96,0xc5,0x8a, 0xc7,0x7b,0xe3,0x6e, 0x60,0xf4,0xfc,0x7a, 0x61,0xa5,0xa5,0x1a, + 0x38,0xcd,0x69,0xf7, 0x3b,0xd8,0xc7,0x9d, 0xb7,0x3e,0xc9,0x1e, 0x44,0x61,0x92,0x4a, + 0x9d,0x16,0xf4,0x37, 0x25,0xa3,0x05,0x11, 0xae,0x3e,0x61,0xc1, 0x02,0xe9,0x90,0x17, + 0xf7,0xf4,0xef,0xa8, 0xba,0x2f,0xd0,0x19, 0xe6,0x5c,0x5f,0xcd, 0x4d,0x71,0xb3,0x95, + 0x0d,0x9f,0x57,0xaf, 0x5a,0x86,0xaf,0xb2, 0x38,0xe1,0x9e,0xd3, 0xc2,0xcb,0x6c,0xc2, + 0x84,0x87,0x2c,0x79, 0xaa,0x58,0x61,0xc0, 0xb5,0xf6,0x36,0xa2, 0x3b,0x25,0x9c,0x2b, + 0xb6,0xff,0x79,0xf0, 0x35,0x4c,0xee,0x40, 0xb8,0x7e,0x11,0x1b, 0x0d,0xc4,0x01,0x36, + 0xe9,0x85,0x7b,0xa3, 0xa6,0x73,0x32,0x19, 0x7c,0x4e,0x11,0xdc, 0x3a,0x3d,0xa5,0x79, + 0x34,0x7f,0x04,0x06, 0x46,0xd2,0x2e,0x9a, 0xbe,0xdc,0x42,0xb0, 0x25,0x5c,0x4a,0x31, + 0x85,0x5c,0x8a,0x82, 0x9e,0xd5,0xc8,0xac, 0x04,0x31,0x29,0xc4, 0xb7,0xc5,0x81,0x41, + 0x6f,0x0d,0x56,0x34, 0x3b,0x69,0x92,0x3e, 0xd3,0x21,0x5d,0x61, 0x44,0x98,0xc7,0xcc, + 0x46,0xa6,0x58,0x6c, 0x24,0xd3,0x6c,0x1a, 0x30,0x20,0x2c,0xb0, 0xcf,0x5b,0xb9,0x90, + 0x4c,0x94,0x23,0x08, 0x24,0x67,0x44,0x28, 0xd2,0x20,0x70,0xa1, 0x8b,0x35,0x08,0x7a, + 0xd4,0x4d,0x2e,0xb6, 0x3e,0x4d,0x4d,0xa5, 0x94,0x60,0xd7,0xcb, 0x4d,0x70,0x17,0x5a, + 0x79,0xef,0xad,0x66, 0xcd,0x99,0xc3,0x9c, 0xe2,0xe3,0x7f,0x61, 0x59,0xad,0x5e,0xa7, + 0x38,0xd6,0xe9,0xa8, 0xc9,0x83,0xa9,0x72, 0x97,0x5e,0xb0,0x95, 0x64,0x91,0x37,0x8a, + 0xd2,0xb6,0x86,0x93, 0x05,0x8c,0x10,0x7a, 0xd2,0x24,0xc9,0x6d, 0x5e,0xa3,0x6d,0x07, + 0x22,0xd8,0xd2,0x56, 0x1e,0x0d,0x9c,0x0e, 0x5a,0xfa,0xfa,0x9e, 0x17,0x1d,0x4f,0xad, + 0xde,0x51,0x61,0xe3, 0x67,0x6a,0x6b,0x34, 0xae,0xe4,0xd9,0x9a, 0x49,0x83,0x5c,0xa3, + 0xaf,0xdd,0xbb,0x07, 0xbe,0xa0,0x5d,0xe2, 0x67,0x5a,0x7c,0x05, 0x02,0x0d,0x8e,0x42, + 0x6e,0x6b,0x18,0x49, 0xd1,0x66,0xdf,0xe0, 0xae,0x7e,0x63,0x79, 0x03,0x59,0x71,0xf1, + 0xb1,0xdd,0xdc,0x36, 0x0e,0xdf,0xc5,0x5d, 0x66,0xd7,0x00,0x1e, 0xb7,0x8f,0xac,0x6c, + 0xcf,0x05,0x72,0xc8, 0xb0,0x46,0x6d,0xcd, 0x46,0x68,0xd0,0x67, 0x77,0x73,0xcc,0xf9, + 0x2a,0xa8,0x53,0x74, 0xd1,0xe8,0x36,0xc1, 0x07,0x34,0xbf,0x7b, 0xbe,0xe9,0xd1,0x16, + 0xce,0xe2,0xcd,0xa7, 0x14,0xff,0x32,0x50, 0x68,0x82,0xcd,0x56, 0x88,0x7a,0x68,0x57, + 0x30,0x51,0x29,0x88, 0xa0,0x84,0x22,0x59, 0xe2,0x85,0x2d,0x15, 0x2d,0x09,0x95,0xcb, + 0x4a,0xa6,0x22,0xe2, 0xa2,0xc2,0xa8,0x42, 0x02,0x55,0xb7,0xec, 0x75,0xae,0x2e,0x56, + 0xd8,0x63,0x83,0xa7, 0x4a,0x03,0x9c,0xeb, 0xa5,0x88,0xc0,0x07, 0x84,0x00,0xb5,0x23, + 0x0c,0x41,0x70,0x6b, 0x3d,0x17,0xf8,0x29, 0x8f,0x23,0x9d,0xbb, 0x1c,0xce,0xc4,0x00, + 0xcc,0x1d,0xe4,0x50, 0x47,0xc2,0x99,0x1c, 0xd3,0xe7,0x62,0xac, 0x8d,0xf5,0xe5,0x92, + 0x07,0xc2,0xaa,0x14, 0x33,0xb6,0xb3,0x46, 0x17,0xab,0xe5,0xd3, 0x34,0xc9,0xb6,0xc0, + 0x86,0x94,0xc5,0x83, 0x57,0x02,0xb9,0x12, 0x90,0x0c,0x2f,0xa5, 0xc3,0x0e,0x2a,0x33, + 0x91,0x47,0x7d,0x3a, 0x59,0xe9,0x22,0x04, 0x45,0xe8,0x3a,0x6d, 0x8e,0xb8,0x13,0x7b, + 0x79,0xd0,0xe0,0x91, 0x9b,0x29,0x1b,0x17, 0x44,0x6b,0x23,0x7c, 0x33,0x20,0x09,0xc6, + 0xf6,0x04,0x4d,0xbd, 0x38,0x46,0xf7,0xe6, 0xfc,0xfe,0xea,0x73, 0xd8,0x98,0xe3,0x88, + 0x07,0x48,0x1c,0x4b, 0x66,0x5d,0xb8,0xd0, 0x96,0x39,0x43,0xab, 0x68,0xe1,0x73,0x5f, + 0x30,0x65,0x77,0x33, 0x12,0x63,0x7b,0xc4, 0x03,0x6b,0x70,0x11, 0x52,0x48,0xae,0x46, + 0xe1,0xb0,0xe4,0xb7, 0xb0,0xb6,0x6d,0x6f, 0x58,0xba,0x36,0x8d, 0xf5,0xd8,0xdb,0x6e, + 0x0f,0x68,0x35,0x26, 0xba,0x01,0x8c,0x6b, 0x07,0x83,0xec,0xa4, 0x51,0x94,0xaf,0x30, + 0x79,0x7c,0xca,0x16, 0x39,0xe0,0x1f,0x0b, 0x8f,0xad,0x45,0x85, 0x1c,0x6d,0xa4,0x8e, + 0x7e,0xcf,0xc6,0x64, 0x32,0x51,0x0f,0xcc, 0x84,0xa1,0x91,0x44, 0x44,0xc1,0x61,0xf7, + 0x91,0x70,0xca,0x1a, 0x46,0xbb,0x51,0xd9, 0x67,0xaf,0x99,0x46, 0x74,0x88,0x59,0x43, + 0xa8,0x61,0xb3,0xed, 0x61,0x55,0x7d,0xa2, 0xe9,0x7a,0x9d,0x81, 0x49,0xf2,0xd8,0xbf, + 0x6d,0x6b,0x59,0xec, 0xcc,0xbd,0x85,0x45, 0xbd,0x94,0xa4,0x85, 0xc8,0xb4,0xa6,0x6c, + 0xa1,0x22,0x96,0x4a, 0xbb,0x2c,0x66,0x93, 0x9e,0x9f,0x16,0x93, 0x62,0x7f,0xee,0x9f, + 0x7f,0x5e,0x38,0xdc, 0xe8,0x80,0xc9,0x70, 0x10,0x9b,0x3e,0x51, 0xfb,0xf0,0xc0,0x31, + 0x4a,0x5b,0x1a,0x77, 0x74,0xee,0x09,0x54, 0x04,0xc0,0xcb,0x85, 0x44,0x79,0x1d,0x56, + 0x7b,0x8a,0x66,0x41, 0xc3,0xae,0x91,0x23, 0xb7,0x29,0x37,0xd4, 0xf0,0x2c,0x7b,0x8a, + 0x46,0x65,0xe1,0x50, 0xf9,0xf5,0xe4,0xfa, 0x6e,0x82,0x54,0xaf, 0xe4,0xaa,0x57,0x99, + 0x26,0xef,0xc5,0xbb, 0x1d,0x64,0x4a,0x17, 0x25,0x17,0x91,0xa7, 0xe3,0x47,0x64,0x38, + 0x67,0x3d,0x35,0x44, 0xd3,0xd8,0x78,0xaf, 0xd9,0x2b,0x13,0xc9, 0x68,0xd5,0x57,0x0d, + 0x6f,0x92,0xa0,0xf3, 0x26,0x5d,0x9e,0x4a, 0x81,0x80,0x8e,0xb6, 0xc1,0x7f,0x07,0x2e, + 0x0a,0x4b,0x9e,0x04, 0xbb,0xa9,0x82,0x12, 0x82,0x71,0xcf,0xb6, 0xd6,0xeb,0x67,0x91, + 0xd0,0xd5,0x9c,0x9f, 0x43,0xc7,0xd7,0xd3, 0x3b,0x1d,0x98,0x18, 0x63,0x11,0xc0,0x8f, + 0xac,0xd6,0x4e,0x1b, 0xaf,0x57,0x6b,0x6f, 0xdb,0xfd,0x39,0xfe, 0x06,0x02,0x30,0x71, + 0x59,0x29,0x25,0x36, 0xbe,0x6f,0xe7,0xcd, 0xc0,0xb9,0x64,0xfb, 0x92,0x00,0x08,0x04, + 0xa9,0xec,0x7d,0xef, 0x17,0x39,0x4d,0x25, 0x66,0x10,0xd2,0x06, 0x81,0xbd,0x1b,0x20, + 0x60,0xda,0x49,0x30, 0x4f,0xc8,0xa1,0x14, 0xa5,0x24,0xb2,0xb9, 0xb8,0xa1,0x89,0x08, + 0x85,0x13,0x71,0xf4, 0x55,0x81,0x9c,0xfb, 0x5d,0x8c,0x5e,0xa4, 0x44,0xe8,0x4e,0xce, + 0xcd,0x98,0x8e,0xd3, 0x5b,0x4a,0x61,0x44, 0x7b,0x32,0x96,0xd2, 0x52,0x67,0xb3,0x6d, + 0x98,0xa1,0x16,0x0a, 0xac,0x43,0x07,0x04, 0x12,0x46,0x50,0x9e, 0xa1,0x51,0x9f,0x20, + 0x0d,0x79,0xc3,0x53, 0x0e,0x25,0x1c,0x74, 0xcb,0xa2,0x09,0xd0, 0x07,0xc4,0x3a,0xb1, + 0x24,0x0f,0x20,0x45, 0xd1,0x67,0x7f,0x58, 0xe8,0xa9,0x6e,0xc3, 0x80,0xb7,0x6e,0x0e, + 0x46,0x36,0xa6,0x52, 0x3a,0x42,0x6a,0x6a, 0x7a,0x41,0x07,0x6c, 0xb0,0x0f,0x3a,0xa8, + 0x26,0x2c,0x1a,0xc7, 0x3f,0xc2,0x98,0x61, 0x56,0xea,0x81,0x07, 0x3d,0x2d,0xfd,0x5e, + 0x06,0xf3,0x6f,0x31, 0xe2,0x90,0x25,0x61, 0xc2,0x22,0x21,0x0a, 0xbb,0x02,0x55,0xc8, + 0xde,0xfe,0xd8,0xe6, 0x27,0xfa,0xa4,0x8f, 0x19,0x87,0xe6,0x99, 0x08,0xa1,0xa4,0x86, + 0xc4,0x61,0x44,0x20, 0xdd,0x58,0x95,0xec, 0xcc,0x42,0xaa,0x39, 0xe8,0xa6,0x5b,0x62, + 0x94,0x8b,0xc6,0x07, 0xcf,0x73,0xd4,0x95, 0x62,0xe5,0x1f,0x56, 0x9e,0x94,0xe8,0xc7, + 0x90,0xb2,0x06,0x1d, 0xc2,0xdc,0x69,0x66, 0xfa,0x23,0xd6,0x1d, 0x36,0xac,0x1b,0x71, + 0xb7,0xdd,0x82,0x48, 0x5a,0xef,0x0d,0x6e, 0x7c,0x4d,0xd8,0x38, 0x22,0xa5,0x20,0x68, + 0x5c,0x06,0xca,0x52, 0xe7,0x36,0xac,0x90, 0x33,0xf2,0xda,0x05, 0x3b,0xca,0x4d,0x8f, + 0xce,0x50,0xa1,0x13, 0x5d,0xb7,0x0b,0x9a, 0x50,0x78,0xc6,0xb8, 0x50,0x86,0xb5,0xb4, + 0x43,0x3d,0xf6,0x0c, 0xc5,0xee,0xa3,0xa2, 0x27,0xa5,0xc6,0xa3, 0x04,0x10,0x26,0x41, + 0x42,0xcd,0xed,0x9d, 0xc6,0xa6,0xb5,0x1f, 0x3c,0x18,0x12,0x50, 0x4f,0xda,0x33,0x37, + 0x87,0xcd,0x2d,0x72, 0x07,0xd1,0x68,0x38, 0x34,0xe0,0x0d,0x91, 0x40,0x38,0x84,0x7b, + 0xd9,0x76,0xd4,0xbe, 0x04,0xf5,0x49,0xbd, 0x42,0xa7,0x6e,0x2e, 0x6f,0x99,0x03,0xdb, + 0xa6,0x33,0x87,0xbd, 0x34,0xb6,0x81,0xd2, 0x6c,0xcb,0x35,0x4f, 0x60,0xa0,0x78,0x79, + 0x33,0x81,0x4c,0xd5, 0x01,0x24,0x99,0xaa, 0xcc,0xa0,0x1d,0xe4, 0xc1,0x24,0xb2,0x1a, + 0x41,0x70,0xd7,0x21, 0xd6,0xf8,0xb2,0xde, 0x34,0x16,0xeb,0x40, 0x87,0x71,0x66,0xe2, + 0x66,0x1d,0x14,0x4a, 0x8e,0x24,0x0a,0x9d, 0x6d,0x34,0x93,0xce, 0x55,0x12,0x65,0xcb, + 0x1b,0x48,0x93,0x54, 0x41,0x54,0x83,0xa2, 0x1c,0x4f,0xd9,0x95, 0x4c,0x52,0x67,0x2e, + 0x1f,0xe8,0xce,0x2b, 0x49,0x16,0x1a,0x14, 0x2d,0x3a,0xd9,0xa8, 0xe8,0xe6,0x92,0x17, + 0x02,0xbd,0x7b,0x17, 0x09,0xc5,0xbd,0x56, 0x58,0x45,0x25,0x2d, 0x8f,0x26,0x93,0xed, + 0xbe,0xf5,0x25,0xee, 0x1a,0x0e,0x94,0xdc, 0xea,0x7a,0xae,0xa9, 0x2f,0xe7,0xf3,0xb3, + 0x02,0xb3,0x1f,0x77, 0xe3,0x5d,0x76,0x20, 0xaf,0xd7,0x75,0xd3, 0xd0,0x1a,0x18,0xfa, + 0xc6,0x77,0x0e,0xec, 0x9b,0x4d,0x91,0x77, 0xc8,0x95,0x9a,0xb7, 0xac,0x31,0xe5,0xb9, + 0x51,0x70,0x61,0x8f, 0x7d,0x2b,0xdd,0xbc, 0x0a,0x55,0xaa,0xcd, 0xd1,0x64,0x6a,0x48, + 0x45,0x14,0x62,0x2b, 0x06,0xee,0xc3,0x2b, 0x2a,0x43,0x00,0x06, 0x61,0x5c,0x10,0x16, + 0xcc,0x37,0xe3,0xb0, 0x17,0xd7,0x32,0xa6, 0x28,0x17,0x64,0xed, 0xf7,0xe3,0x4e,0xa2, + 0xc9,0xc6,0x87,0xcc, 0x6d,0x66,0x80,0x8c, 0x70,0x53,0x8a,0x17, 0x5f,0x45,0x5b,0x8a, + 0xd0,0x20,0x1f,0x41, 0xec,0x48,0x82,0x52, 0xaf,0x26,0xe1,0xce, 0x31,0xa5,0x31,0xba, + 0x12,0x4b,0x35,0xa8, 0xd4,0x01,0x13,0x61, 0x59,0x63,0x22,0x12, 0x5e,0x1b,0x10,0xbe, + 0x55,0x11,0xab,0x4c, 0xc3,0xd0,0x33,0x2e, 0x28,0xbd,0x43,0x2e, 0xdd,0xe6,0x27,0x60, + 0xf6,0x55,0xe1,0xf0, 0x79,0x6d,0xc9,0x99, 0x63,0x8f,0x32,0xd4, 0x0d,0xc3,0x84,0xa6, + 0x8a,0x6c,0x52,0x49, 0xb1,0x90,0x0a,0x10, 0x99,0x6d,0xdb,0x7f, 0xdf,0x12,0xa9,0xdc, + 0xe2,0xda,0xd1,0xa8, 0x65,0x2e,0x8a,0x97, 0xcf,0x0d,0x81,0xaa, 0x84,0x0b,0xd0,0xcb, + 0xe2,0xed,0xa2,0x12, 0x16,0xee,0xa3,0x82, 0x2c,0x5a,0x79,0x8b, 0x2a,0x02,0x63,0x73, + 0x72,0x08,0x8d,0x92, 0x56,0x5d,0x74,0xda, 0xf7,0x2b,0xd7,0x77, 0x01,0x0d,0x53,0x44, + 0x3e,0xd9,0x81,0x0d, 0x05,0xad,0x28,0x9a, 0xdb,0xe2,0x32,0x79, 0xc3,0xba,0x9f,0x6f, + 0x3c,0x6a,0xa1,0x79, 0xd6,0x20,0xd2,0x35, 0x6d,0xa3,0x58,0x30, 0x30,0x9c,0x30,0x5f, + 0xc3,0xec,0xbe,0x1c, 0x84,0xb0,0xb4,0xfa, 0x59,0x62,0x33,0x26, 0x85,0x26,0x4b,0x1b, + 0x07,0xeb,0xf3,0x46, 0x1e,0xc7,0x55,0x44, 0xf9,0x9f,0x81,0x5d, 0x60,0x59,0x84,0x1f, + 0xa1,0xa5,0x2d,0x44, 0x5b,0x62,0x3d,0xc8, 0xec,0x9b,0x68,0x2b, 0x35,0xcb,0xb8,0x4c, + 0x32,0x9a,0x2c,0x39, 0x68,0xa2,0xbe,0x94, 0xff,0x1f,0x57,0x61, 0x83,0x5b,0x19,0x02, + 0x25,0x4d,0x55,0x24, 0xbe,0xfe,0x64,0x4b, 0x06,0xca,0x20,0x6b, 0x64,0x63,0x09,0xab, + 0xc1,0xb8,0x66,0xc8, 0x50,0xa1,0x6c,0x95, 0x69,0x2c,0xc9,0x44, 0xfd,0xa4,0x57,0xa8, + 0xcc,0xa5,0x52,0x96, 0x2e,0x5b,0x9a,0xcc, 0xf2,0x3e,0x1f,0x0f, 0x42,0xc8,0x15,0xe6, + 0x66,0xa7,0x82,0xd8, 0xcf,0x84,0x8b,0xd6, 0xea,0x11,0x7d,0xa1, 0xde,0x51,0xbf,0xd1, + 0x51,0x21,0x7d,0xbb, 0xc4,0xed,0x53,0x6e, 0x62,0xb9,0xe5,0xcc, 0x08,0x0e,0x82,0x46, + 0x90,0x51,0x90,0xf3, 0xec,0x6a,0x31,0x1a, 0xd8,0xda,0x66,0x35, 0x2c,0x58,0x45,0x82, + 0x6c,0x26,0xa6,0xcc, 0x80,0x13,0xa2,0xc1, 0xf1,0x29,0x79,0x13, 0x9b,0xb2,0x58,0x19, + 0xa9,0x1c,0x9d,0xb4, 0x99,0x7a,0x39,0x38, 0x05,0xaa,0x27,0x6d, 0x49,0xf0,0x8b,0x37, + 0xd4,0x4f,0x91,0x45, 0x17,0x78,0x33,0xe4, 0x18,0x0b,0x85,0xd4, 0x6c,0xc5,0x24,0xae, + 0x13,0x5b,0x9e,0x46, 0xe6,0x2a,0x71,0x19, 0x7b,0x5b,0x8b,0xbd, 0x55,0xbc,0xb2,0xda, + 0xb8,0x15,0x93,0x09, 0x59,0x69,0x84,0x2d, 0x84,0x37,0x05,0x9b, 0xfc,0xf4,0xa1,0x17, + 0x2d,0x29,0x35,0xb0, 0x49,0x89,0x1c,0xc5, 0xb7,0x0c,0xcb,0x55, 0x27,0xa7,0x50,0x5f, + 0xc1,0x08,0xbe,0x8e, 0xe7,0x32,0xb7,0x4d, 0xe9,0xec,0x19,0x7f, 0x7c,0x61,0x8a,0xd3, + 0xc2,0x39,0x5d,0xd0, 0xcc,0x6d,0x4c,0x79, 0xd2,0x96,0x54,0xef, 0xb9,0x37,0x67,0x3d, + 0x80,0x67,0xf1,0xaf, 0x51,0xb5,0x46,0xa9, 0x1a,0x34,0x00,0xa5, 0x29,0x49,0x24,0x25, + 0xab,0xea,0x0a,0xcf, 0x03,0x92,0x71,0x2d, 0x7d,0xea,0xb6,0xd1, 0x61,0xa5,0x3d,0x9c, + 0x1b,0x76,0x91,0x79, 0x44,0x19,0xee,0xc6, 0xee,0x73,0x05,0x53, 0xd3,0x3d,0xb3,0x42, + 0xd1,0x66,0xea,0xa5, 0x73,0xeb,0xe9,0x69, 0x41,0xdd,0xed,0x20, 0xd3,0xb0,0xab,0x89, + 0x83,0xdd,0xfd,0x39, 0x87,0xb9,0xd2,0x43, 0x65,0xeb,0x17,0xcf, 0xaf,0x5a,0x40,0x5f, + 0x35,0x92,0xc8,0x69, 0x19,0x23,0x16,0x43, 0xff,0x3b,0x11,0xac, 0x61,0x56,0x34,0x2f, + 0x09,0x85,0x87,0xd5, 0xb5,0x67,0x0b,0x75, 0x24,0x8d,0x26,0x9e, 0x3e,0x15,0x68,0x49, + 0x22,0xed,0xa2,0xb3, 0x49,0x64,0x5a,0x81, 0x2b,0xe6,0x16,0x9a, 0x55,0x35,0xd9,0x3f, + 0xb8,0xe8,0x61,0x59, 0xac,0xc7,0x4b,0x44, 0x8f,0xdf,0x84,0x4d, 0x8b,0xdb,0x58,0x80, + 0xdd,0xb0,0xb3,0xa1, 0xf1,0x24,0xb9,0x2b, 0xd5,0x69,0xa3,0x5a, 0xdc,0xfa,0xdc,0xd0, + 0x99,0x29,0xeb,0xb9, 0x96,0x8d,0x69,0xc8, 0xae,0x77,0xc6,0xe4, 0x68,0xf6,0x7e,0x0a, + 0xdb,0x20,0xa7,0x0b, 0x86,0xca,0xf7,0xae, 0x56,0xc9,0xcc,0xd3, 0x62,0xd0,0xb6,0xf4, + 0xf0,0xd4,0xb4,0x9a, 0x89,0x48,0x7a,0xb4, 0xe5,0x68,0xef,0xa4, 0xf3,0x43,0x31,0xdb, + 0x04,0x00,0x13,0x59, 0xd7,0xe7,0xec,0xa5, 0xe2,0xd8,0xce,0x5c, 0xe7,0xa7,0x82,0xc2, + 0x61,0x12,0xbf,0x86, 0xb4,0x0a,0x76,0xbf, 0x26,0xff,0xc4,0xf5, 0x17,0x73,0x97,0xeb, + 0x96,0xbd,0xbf,0x89, 0xc2,0x10,0x60,0x81, 0x5d,0x0d,0x63,0xfc, 0x2b,0x68,0xab,0xa9, + 0x3d,0x37,0x85,0xc3, 0x07,0x1f,0x95,0x17, 0x0d,0x35,0x83,0x92, 0x03,0xaf,0xfa,0xcf, + 0x73,0x43,0x7f,0x5a, 0x92,0x26,0xcb,0x54, 0x34,0xf2,0xbf,0x7c, 0x06,0x62,0x51,0x83, + 0x25,0x36,0x68,0x1e, 0x7e,0xc7,0x87,0x25, 0x43,0x2f,0xb1,0xa0, 0x32,0xa5,0x4c,0xf1, + 0xc8,0x2c,0xf0,0xea, 0x0b,0xd3,0xa1,0xb7, 0xa3,0x6d,0x37,0x66, 0x82,0xfe,0xe7,0x3f, + 0x56,0xd9,0xef,0x4e, 0x72,0x9e,0x07,0x21, 0x3a,0x5b,0xa8,0xaf, 0xe8,0x3e,0x70,0xee, + 0xff,0xa2,0xe3,0x9b, 0x35,0xb5,0xaa,0x11, 0xf0,0x9a,0x40,0xbf, 0x0b,0x0f,0xe0,0x61, + 0x76,0xfb,0x86,0x91, 0xbe,0x67,0x98,0xd0, 0x89,0xb4,0x91,0x90, 0xc5,0xea,0xb4,0x69, + 0x1f,0xc4,0x7d,0xb3, 0x46,0x1b,0x15,0x2d, 0x66,0x31,0x6a,0x0b, 0x30,0x24,0x95,0x16, + 0xa1,0x1b,0xd2,0xd4, 0x07,0x13,0xd8,0x00, 0x40,0x1c,0xdb,0x12, 0x39,0x6c,0x88,0xc3, + 0x6a,0xb0,0x3f,0x30, 0x5a,0x7c,0x71,0xc0, 0x93,0xf8,0x9e,0xbe, 0x94,0xf3,0x9b,0xfe, + 0xf0,0xa8,0x48,0xf0, 0xff,0xd9,0x5b,0xfd, 0xfe,0xeb,0xd5,0xab, 0xc4,0x81,0x63,0x78, + 0xfe,0x96,0xde,0x5b, 0x52,0x80,0x58,0x2a, 0x06,0xd0,0x80,0x8a, 0xc6,0x0a,0x76,0xca, + 0xbe,0xc6,0x8b,0xbe, 0xd1,0x3e,0x97,0x4b, 0x37,0x05,0x0e,0x02, 0xa9,0x51,0x43,0xfe, + 0xad,0x95,0x4c,0x2d, 0x76,0xe0,0x6d,0xb3, 0x2b,0xf7,0x97,0xe5, 0xb9,0xc5,0xe0,0xd2, + 0x6c,0x7c,0x57,0x1b, 0x0f,0xe2,0xa2,0xbc, 0xb8,0xc5,0xda,0xd5, 0x69,0x87,0x5a,0x51, + 0x29,0x59,0x73,0x6b, 0x91,0xbf,0x80,0xf0, 0x9b,0x61,0xa6,0x62, 0x2b,0x34,0x1b,0x76, + 0x1b,0x56,0x91,0x27, 0xac,0x69,0x1f,0xb8, 0xc4,0x76,0x2e,0x4d, 0x07,0x43,0x41,0x14, + 0xb5,0x77,0xa0,0x5e, 0xdf,0x18,0x3a,0xee, 0x1f,0xa3,0xde,0xec, 0xd5,0x1c,0x76,0x1d, + 0xbd,0x7e,0x7a,0x7b, 0xfa,0xb5,0xe9,0x23, 0x20,0x8d,0x99,0xd7, 0x0a,0xec,0xd2,0x18, + 0xd8,0x4d,0x4e,0x84, 0xa7,0xea,0xa5,0x28, 0x4b,0xb7,0x14,0x56, 0x17,0xf3,0xd8,0x6e, + 0xa4,0x73,0x1c,0x87, 0x27,0x20,0x2b,0xa6, 0x24,0x8e,0xe1,0x81, 0xde,0x7b,0xe3,0x2a, + 0x46,0xab,0xb3,0x85, 0x48,0xdd,0x8d,0x7c, 0x84,0x72,0xe0,0xab, 0x58,0xdb,0xf8,0xd4, + 0x12,0x18,0x52,0xc4, 0x19,0x0c,0x93,0x47, 0xb3,0x88,0x17,0x5d, 0x28,0x93,0x5e,0xfd, + 0x9e,0xf9,0xac,0xf9, 0xf8,0x60,0xd5,0x3d, 0xbf,0x1f,0x02,0xfc, 0x9f,0xfe,0xe7,0x34, + 0xfd,0x9d,0x48,0xaa, 0x39,0xac,0x92,0x46, 0xc8,0xe7,0x1c,0xdf, 0xee,0xff,0xe3,0x68, + 0x9d,0xd5,0x0e,0xf8, 0xc9,0x64,0x53,0x0b, 0xc8,0x67,0x88,0x03, 0x91,0x11,0x99,0x16, + 0x57,0x83,0xc5,0x5e, 0xbf,0x24,0xa0,0x73, 0xdc,0x1a,0xf2,0x2d, 0xb2,0xfe,0x2b,0x11, + 0x8a,0xe7,0x92,0xd7, 0xf5,0x0c,0x93,0x00, 0xc1,0x7d,0x17,0xbb, 0x83,0xa0,0xd7,0xf1, + 0x88,0x95,0x23,0x5f, 0xe3,0xcc,0xec,0x64, 0x29,0xb3,0xdd,0x3e, 0x57,0x4f,0x16,0xda, + 0xf9,0xbc,0x38,0x48, 0xfc,0xec,0xd3,0x6b, 0x54,0x29,0x6d,0x08, 0x37,0x7f,0xb2,0x05, + 0x81,0x29,0xc8,0xaa, 0xeb,0x45,0x20,0xba, 0x62,0x5d,0x5b,0x08, 0x06,0x53,0x79,0x29, + 0x57,0xc3,0xff,0xed, 0xe1,0x32,0x83,0x1a, 0xdc,0xa5,0x1c,0xf5, 0xad,0xb7,0xed,0xa4, + 0x53,0xfb,0x90,0x0a, 0xf5,0xd8,0x64,0x23, 0x53,0xea,0x3d,0x64, 0x35,0x6b,0x76,0xff, + 0x03,0x0d,0xed,0x42, 0xf3,0x2d,0xd6,0xd8, 0x55,0xd6,0xc9,0xc5, 0x75,0x4b,0x2a,0xa8, + 0x83,0xc8,0xbb,0x2f, 0x9a,0xe8,0x83,0x2c, 0xa0,0x03,0xda,0x30, 0xb3,0x71,0x60,0xb5, + 0x39,0xdd,0x44,0x21, 0xb4,0xd2,0x2b,0xb8, 0x2c,0x64,0x19,0x64, 0xc9,0xe8,0x23,0xfe, + 0x30,0xe9,0x97,0x91, 0x16,0x65,0x1e,0x93, 0x4f,0x01,0x2d,0x5b, 0x91,0xd9,0xf7,0x5f, + 0xf7,0xb4,0x9b,0xef, 0xd1,0x2f,0x8a,0xf4, 0xd3,0xae,0x81,0x1a, 0x69,0x87,0x93,0x28, + 0xf3,0x1e,0x71,0x75, 0xfe,0x1c,0xcb,0xc3, 0x16,0xcb,0x21,0x9d, 0xac,0xd6,0xb7,0x4b, + 0x27,0x0d,0x75,0x4e, 0xd1,0xb3,0x0f,0x67, 0x0b,0x04,0xf4,0xfc, 0xc3,0xf1,0x4d,0x48, + 0x2f,0x25,0x58,0x2f, 0xc8,0xdd,0x18,0x2e, 0x75,0x26,0x98,0x1a, 0xeb,0xa1,0x9d,0x40, + 0x1e,0xbc,0xd8,0x72, 0x38,0xb8,0xc0,0x9f, 0xbb,0xf9,0x0f,0x6d, 0xf6,0x7e,0x25,0x34, + 0xa0,0x33,0xcc,0xe5, 0xda,0xb6,0xc5,0x83, 0x95,0x87,0x25,0xf9, 0x58,0x5e,0xfc,0xe8, + 0x01,0x7e,0x9e,0x57, 0xea,0x60,0xdf,0xe4, 0x7b,0x6e,0xbb,0x69, 0x99,0x4b,0xed,0x4c, + 0xed,0x6d,0x95,0xb1, 0x06,0x20,0xf5,0x4d, 0x43,0x05,0x78,0xcd, 0xe3,0x58,0xaf,0x6f, + 0x97,0x1c,0x9e,0x36, 0xb6,0xf2,0x68,0x28, 0xd0,0xa7,0x0b,0x50, 0xd6,0x9a,0x1a,0x98, + 0xd0,0x77,0xf2,0x2c, 0x52,0x95,0x74,0xb0, 0x0e,0x35,0x97,0x68, 0xbc,0xf6,0x76,0x57, + 0xfe,0x0f,0x4a,0xa2, 0xfa,0x9b,0x45,0xe6, 0x79,0x8d,0xf0,0x5b, 0xbe,0x9f,0x3b,0x67, + 0xc6,0x04,0x64,0xb3, 0xd7,0xf3,0xde,0xd6, 0x1c,0xdd,0x99,0x6b, 0xe5,0x8d,0x8a,0xea, + 0xa5,0xb0,0xae,0x87, 0x30,0xf5,0x06,0x25, 0x31,0x33,0x06,0xc3, 0x38,0xe5,0xe1,0x18, + 0x4c,0x10,0x19,0x03, 0x83,0x8f,0x38,0xa0, 0x6a,0xb7,0x43,0x35, 0x00,0xcb,0x49,0x4b, + 0x3f,0xd0,0xe9,0xb5, 0x53,0x7b,0xaa,0xfe, 0xa5,0x6e,0x2d,0x33, 0x64,0xfe,0xfe,0x15, + 0x3f,0x62,0x3d,0x32, 0xe7,0x36,0x49,0xf3, 0x28,0xf5,0xc4,0xac, 0x38,0x17,0x7d,0x4c, + 0x58,0x78,0xfe,0xdb, 0x0a,0x8e,0xcb,0x2b, 0x1a,0x6c,0xcc,0x2a, 0x65,0x19,0xe3,0x64, + 0x10,0x88,0x63,0x7d, 0x4d,0x18,0xa6,0x04, 0x6d,0x40,0x32,0xff, 0x12,0xa2,0xa1,0x05, + 0x45,0x16,0xba,0x48, 0x8c,0x42,0xca,0x20, 0x3e,0x79,0x51,0x78, 0xdd,0x01,0x7b,0x8d, + 0x17,0x4d,0x67,0xb0, 0x63,0x6a,0xc8,0x2e, 0xe3,0x69,0xf9,0xe1, 0x7c,0x96,0x1d,0xad, + 0x50,0x5a,0x1a,0xd5, 0xb0,0x4f,0xe5,0x42, 0x41,0xdc,0xe4,0xf7, 0xf2,0xcb,0xfc,0xd1, + 0xcc,0x88,0x84,0x01, 0x1d,0xfb,0x8f,0x50, 0x91,0xa9,0xee,0xb7, 0x83,0x90,0xe7,0x1c, + 0xda,0xdf,0x41,0xd2, 0xc3,0x7f,0xca,0xc7, 0x50,0xd2,0xa6,0x65, 0xd7,0x27,0x72,0xe9, + 0x43,0x42,0x3b,0x03, 0x4b,0x34,0x3a,0x6d, 0x9a,0x71,0x21,0x13, 0x7e,0xcb,0xc9,0x54, + 0x1c,0x1a,0x94,0x98, 0xb1,0x0d,0x34,0x87, 0x68,0x26,0x38,0xe2, 0x04,0xba,0x06,0x70, + 0x45,0x8e,0x8d,0xb7, 0x4a,0x34,0xe6,0x42, 0x0d,0x09,0xc9,0xa9, 0x6c,0x03,0x82,0x37, + 0x32,0x52,0x0c,0x39, 0xc6,0xa7,0x95,0xc4, 0xf9,0xb2,0xeb,0x8a, 0xcf,0xaf,0xf9,0x38, + 0x38,0x56,0x03,0x16, 0x42,0xea,0xda,0xef, 0x18,0x0b,0xc2,0x18, 0x31,0x89,0xa0,0x6d, + 0x26,0xc4,0x50,0xd4, 0x32,0x22,0x4e,0x0c, 0xf0,0x4c,0x92,0xdf, 0xde,0x2e,0x82,0xd4, + 0xaa,0xd8,0x36,0x37, 0x71,0x54,0x4a,0x03, 0x94,0x24,0x1c,0x05, 0x60,0x26,0x66,0xb3, + 0xbf,0x62,0x5a,0x66, 0xab,0x4c,0xf3,0x7b, 0x7c,0xcd,0x8f,0x31, 0xd9,0x4b,0xcd,0x8a, + 0xdc,0x1a,0x5c,0x20, 0xba,0x60,0x14,0xb1, 0x06,0x7d,0x91,0x4e, 0x3d,0x3f,0x8c,0x26, + 0x57,0xed,0x70,0x2b, 0x67,0x98,0x91,0xbf, 0x77,0x8c,0x11,0x6d, 0x9c,0x93,0x10,0x8c, + 0x16,0x24,0x1c,0xfb, 0x31,0x46,0x96,0x19, 0xb9,0x77,0xf4,0x5e, 0x77,0x74,0xfe,0xb6, + 0x18,0x1e,0x7f,0xa3, 0x7f,0x91,0x45,0x0d, 0x19,0x7d,0x1f,0xe4, 0x90,0xb9,0xef,0xa7, + 0xf4,0x3b,0x4d,0x79, 0x0d,0x5e,0xd7,0xa8, 0x6c,0x26,0x62,0x75, 0xf9,0x97,0x12,0x52, + 0x03,0x00,0xec,0xde, 0x9d,0x8e,0x69,0x23, 0x91,0xde,0x40,0xce, 0xa7,0x3d,0x92,0xf3, + 0xd4,0x5d,0x5c,0x8f, 0x3e,0x57,0x05,0x08, 0x4e,0xf6,0x73,0xf4, 0x39,0x2c,0x59,0xad, + 0x14,0x5a,0x71,0x4a, 0xb1,0x17,0x96,0x7a, 0xab,0x46,0x3b,0x48, 0x16,0x71,0x97,0x8c, + 0xf0,0xda,0x30,0x04, 0x76,0x09,0x9f,0x96, 0x44,0x68,0x18,0xa0, 0x68,0x4b,0xaf,0x62, + 0x93,0x1b,0x04,0xd8, 0x24,0x89,0x23,0xf7, 0x87,0x1b,0x92,0x1b, 0x6f,0xc9,0x67,0xd1, + 0x62,0x53,0x60,0x36, 0x90,0x8b,0x2c,0x3d, 0xec,0x8f,0xaa,0x71, 0x4d,0x8c,0xcd,0x62, + 0xf6,0x3b,0x4b,0x5f, 0x15,0x87,0x36,0xb7, 0xaf,0x9d,0x00,0x1f, 0xd5,0x64,0xfc,0xb5, + 0x5f,0xdd,0x32,0x62, 0x10,0x04,0x54,0x0b, 0xfa,0xec,0xc9,0x33, 0x43,0x22,0x1d,0x11, + 0x0a,0x82,0xa0,0xda, 0xa2,0xd0,0xce,0x71, 0x26,0x93,0xbb,0x2c, 0xd8,0xb3,0x32,0xac, + 0xa4,0xe1,0x1d,0xd4, 0x09,0x18,0x0a,0x14, 0x27,0x4e,0x3b,0x9e, 0x17,0x61,0xe7,0xf3, + 0x0e,0x22,0x7a,0xbc, 0x0e,0x0f,0x95,0xf2, 0xfd,0xe7,0x97,0x95, 0x4f,0xf9,0xac,0xa0, + 0xf3,0xff,0x8e,0x49, 0x4b,0x77,0xcf,0x5f, 0x05,0xc2,0x48,0x14, 0xf3,0x9b,0xac,0x4f, + 0xeb,0xde,0x2b,0xdc, 0xdf,0x4a,0xb7,0x08, 0xfe,0xfe,0xf2,0x9f, 0x6f,0x46,0x86,0xde, + 0xc6,0x07,0xa4,0x32, 0xc9,0x75,0x65,0x2d, 0x74,0x49,0x4a,0xd5, 0xfe,0xa0,0x6b,0xe6, + 0x72,0xb0,0x20,0xe3, 0xfa,0x8e,0x67,0x0b, 0x79,0xaa,0xe6,0xb7, 0x87,0xfc,0x4c,0x8c, + 0xee,0x5f,0xb9,0x56, 0xb1,0x17,0x91,0xa6, 0xa2,0x9d,0x86,0x10, 0x54,0x30,0xc4,0x87, + 0xac,0xf7,0x41,0x3c, 0xe4,0xb1,0xf1,0x72, 0xfb,0xda,0x7c,0x4d, 0xb7,0x27,0xc0,0xfa, + 0x18,0x54,0xfc,0x83, 0xe3,0x45,0x3a,0xc8, 0x59,0xca,0x21,0x68, 0xbf,0xf5,0xde,0x4e, + 0x6b,0x86,0xbc,0x6c, 0xb9,0x1a,0x5e,0x2c, 0x1d,0xe3,0xa9,0x8a, 0xf1,0xab,0x4c,0x58, + 0xaf,0xad,0xbb,0x96, 0xeb,0x23,0x3e,0x52, 0x4d,0x67,0x1f,0xcd, 0x96,0x6c,0xf1,0x24, + 0x24,0x7d,0x9f,0xf2, 0xf6,0xa1,0xdb,0xe9, 0xb8,0x18,0x98,0x79, 0xde,0xd7,0xef,0xae, + 0xc8,0x19,0x6a,0xd3, 0x02,0x3b,0x0b,0x34, 0x81,0xcc,0xd2,0xdd, 0x14,0x5e,0x2d,0x17, + 0x07,0xf2,0x74,0xfa, 0x91,0xf8,0x34,0x1b, 0x17,0xd0,0x5f,0x1e, 0x43,0x19,0x38,0xf5, + 0x53,0x18,0x0e,0x07, 0x4c,0xb9,0xa6,0x49, 0x2a,0x5d,0x8d,0x85, 0x9d,0xad,0xb7,0x62, + 0xe7,0xfd,0xab,0x57, 0x36,0x67,0x5a,0x48, 0x90,0x87,0x72,0xc7, 0x5c,0x38,0xd2,0xb7, + 0xfd,0x13,0xb5,0xca, 0x17,0x03,0x92,0x3c, 0x89,0x91,0xd5,0x6e, 0x1b,0xe1,0xa4,0x1f, + 0x9b,0xd0,0x98,0x6a, 0x64,0xc9,0xb1,0x74, 0xe3,0xf5,0xe8,0x30, 0x9b,0x23,0x4d,0x4c, + 0x1f,0xdb,0x4b,0x6e, 0x9c,0x4a,0x62,0x98, 0x80,0x6d,0xfc,0xa0, 0x94,0x99,0x6a,0x73, + 0xa9,0xa5,0xb9,0xc2, 0xdd,0x4b,0xeb,0xdc, 0x3b,0xee,0x7f,0xf1, 0x29,0x48,0xb0,0x74, + 0x03,0x95,0x57,0xd9, 0x4d,0x17,0x64,0x00, 0x25,0x7f,0x33,0x50, 0xae,0xf9,0x28,0x0f, + 0x6b,0xb9,0xff,0xb1, 0xb0,0x99,0xc9,0x66, 0xf7,0x3b,0xec,0x5f, 0x1f,0x50,0x91,0x86, + 0x6b,0x1a,0x23,0xa6, 0x61,0xa8,0x6a,0x75, 0x1b,0x3e,0x34,0xd1, 0xf0,0xe6,0xeb,0x25, + 0xf0,0x09,0xcd,0xac, 0xac,0xe4,0x29,0x14, 0xf6,0x4a,0x02,0x80, 0xa8,0x39,0xeb,0x52, + 0x16,0x88,0x54,0x0e, 0xb5,0x24,0x29,0x13, 0x21,0x41,0x43,0x85, 0x8f,0x48,0x20,0x8d, + 0xb4,0x3e,0x61,0x3a, 0x5c,0x05,0x91,0x8f, 0x80,0x59,0x89,0x15, 0x07,0xab,0xed,0x75, + 0x59,0x05,0x00,0x84, 0x07,0x00,0xe6,0xa8, 0x20,0xc5,0x28,0x53, 0xaf,0xa4,0xca,0xe0, + 0x71,0xe5,0x14,0x06, 0xf5,0x8a,0xab,0x40, 0x3b,0x2f,0x0c,0x63, 0x4d,0xdf,0x4d,0x0c, + 0x9c,0xd3,0xdc,0xc3, 0x60,0x51,0x44,0x10, 0xe2,0x1d,0x06,0x40, 0xe7,0xa0,0xaf,0x29, + 0x0a,0x1f,0xe7,0x50, 0x1a,0x1e,0x9c,0xad, 0x5e,0xef,0x97,0xac, 0xfa,0xcc,0x99,0x8d, + 0xe8,0xa9,0x78,0x28, 0x24,0xad,0x89,0x8b, 0xd6,0xeb,0xbc,0xc9, 0x97,0xd4,0x11,0x6e, + 0xc0,0x6b,0xeb,0xed, 0x5a,0xa4,0xa7,0xce, 0xce,0x57,0x46,0xaf, 0x76,0x54,0x17,0xae, + 0xb7,0x4b,0x29,0xa5, 0x6d,0xc4,0x41,0x7c, 0x9d,0x62,0x91,0xdc, 0x10,0xa0,0xc7,0x8b, + 0xba,0xaf,0xb9,0xd6, 0x8f,0xdf,0xd5,0x91, 0x0e,0x09,0x13,0xe4, 0x6c,0x7f,0x38,0x20, + 0x6a,0xae,0xf1,0xc6, 0x7b,0xe9,0x48,0x54, 0x59,0x72,0x56,0xfb, 0xfb,0xce,0x61,0x58, + 0x2b,0x98,0x3f,0x99, 0x5b,0xd5,0x5f,0xf4, 0xff,0x6c,0x39,0x1d, 0x64,0x6b,0x31,0xca, + 0x3f,0xdb,0x36,0xee, 0xf7,0xd1,0x84,0xa7, 0xda,0xba,0x4d,0x56, 0x1a,0x22,0x37,0x31, + 0x97,0x61,0xeb,0x3c, 0xe7,0x42,0x38,0xfb, 0x55,0x8c,0xe9,0xd4, 0x3b,0xbf,0xc1,0xe5, + 0x94,0x2f,0xc7,0xf1, 0xa9,0x8d,0x75,0x03, 0x3f,0x1b,0x18,0x12, 0xe9,0x5a,0x65,0x62, + 0x26,0xb6,0x78,0xf6, 0x40,0xc1,0xe0,0xa0, 0xc4,0xff,0xe6,0x4d, 0x7e,0xc1,0xa3,0x07, + 0xab,0xcc,0xc4,0x96, 0x1f,0x6f,0x9a,0xc5, 0xba,0x55,0xe4,0x1d, 0x75,0x32,0x94,0x7e, + 0xf7,0x5f,0xc4,0x8a, 0xed,0x7e,0x2b,0x5c, 0x24,0x79,0x9c,0x98, 0x24,0xd1,0x7b,0xe2, + 0xc9,0x79,0xa6,0xde, 0xfd,0xe4,0x35,0xff, 0x5c,0x8a,0xa8,0x76, 0xfe,0x25,0xd6,0x81, + 0x84,0x4d,0x2b,0x0c, 0xb3,0x35,0x53,0x9c, 0x6d,0xb4,0x01,0x17, 0xd3,0xf0,0x2b,0x4b, + 0x32,0xf6,0xcf,0x25, 0x85,0xb3,0xfd,0xda, 0xd8,0xb6,0xa1,0x3a, 0x99,0x8f,0x41,0xe8, + 0xb2,0x3a,0x44,0x92, 0xc9,0x25,0x21,0x19, 0xfa,0xed,0x6d,0x68, 0x83,0x4b,0x14,0xb3, + 0x19,0x96,0xca,0x7e, 0x27,0x63,0xc1,0xee, 0xf1,0x3c,0xed,0x6f, 0xc1,0x04,0x1e,0xf1, + 0x6e,0xff,0x87,0x99, 0xe6,0xb4,0xbe,0x6c, 0xe6,0x3a,0x87,0x5e, 0x90,0xc1,0x4b,0x1e, + 0xbe,0xf1,0xbf,0xac, 0xd0,0x81,0x04,0x52, 0xa6,0x6f,0x2f,0x9c, 0x57,0x28,0x3e,0x42, + 0xaa,0x24,0x16,0xa1, 0x53,0x98,0x15,0x97, 0x01,0x11,0x9d,0x2e, 0x18,0x1e,0xb0,0x15, + 0x33,0x72,0x9f,0x1f, 0x73,0x9f,0xf6,0xb0, 0xd5,0x98,0x0c,0xa7, 0xc4,0xef,0xd9,0xe2, + 0xed,0xb4,0xeb,0x80, 0xec,0xed,0xf1,0xb5, 0x14,0x27,0xb1,0x6c, 0xce,0x27,0xe6,0xf5, + 0xe1,0x2a,0x3f,0x56, 0x8b,0x63,0x74,0x6f, 0x57,0x1f,0x5e,0x9c, 0x8b,0x0c,0x24,0x43, + 0x04,0x44,0x6f,0x08, 0xc6,0x07,0x06,0x1b, 0x5d,0x42,0x31,0x7e, 0xa0,0xcb,0x34,0xd4, + 0xdc,0x31,0x95,0xd8, 0xa1,0x8f,0xc1,0x5d, 0x25,0xdd,0xd9,0x5a, 0xf2,0xb9,0x41,0xbd, + 0x8b,0xc9,0xde,0xc8, 0xda,0xe3,0xdb,0xb2, 0x6d,0x1f,0x5f,0x9b, 0x19,0xee,0x1d,0xbd, + 0xed,0x1a,0x90,0xa7, 0x22,0x8b,0xcf,0x58, 0xd2,0xf9,0x5d,0x07, 0x73,0x73,0x93,0xab, + 0xcb,0x23,0xa4,0xf8, 0xa9,0xf3,0x13,0xdf, 0x14,0x4d,0x06,0xb8, 0x20,0x0b,0x7b,0xa4, + 0x56,0x21,0x35,0xf8, 0xea,0x21,0xfe,0xa4, 0x91,0x81,0x92,0x07, 0xd8,0x43,0xfe,0xfc, + 0x2d,0x86,0xee,0xe6, 0x8f,0x61,0x75,0x71, 0x19,0x12,0xcf,0xcd, 0x9c,0xf7,0x1d,0x5d, + 0x69,0xd2,0x1d,0x79, 0x03,0x89,0x82,0x1f, 0x85,0xb6,0xc5,0x9c, 0x4a,0x8f,0xe3,0xf8, + 0xf9,0xf5,0xff,0x7d, 0x2e,0x29,0xdc,0x5c, 0x95,0x4d,0x7e,0x4e, 0x62,0xa3,0x67,0x5a, + 0x70,0xcb,0x17,0x09, 0x7e,0xdb,0xdd,0xca, 0x34,0xb7,0xb2,0x66, 0x74,0x08,0x99,0xd5, + 0xc7,0x41,0x8e,0xf9, 0xba,0x38,0x74,0x9a, 0x0d,0x06,0x7c,0x44, 0x38,0x5e,0xef,0xe1, + 0x52,0x21,0x36,0xed, 0x92,0x89,0xf6,0x36, 0x03,0x93,0x64,0x36, 0x5b,0x2a,0xda,0x59, + 0xf2,0x85,0xeb,0xda, 0xba,0xed,0x62,0x27, 0x38,0xd7,0x95,0xd7, 0xce,0xa1,0x6c,0xb6, + 0x6c,0xe4,0x47,0x2d, 0x5f,0x0e,0x1c,0x14, 0x1a,0x33,0x6f,0x36, 0xb0,0xeb,0xfe,0x23, + 0x0c,0x68,0xf6,0xf2, 0x24,0xc2,0x73,0xc4, 0xee,0x61,0xeb,0xd1, 0xed,0xe4,0x79,0xe9, + 0x49,0xc7,0x70,0x17, 0xee,0xae,0x46,0x25, 0xbf,0x8e,0x12,0x9d, 0x37,0xa1,0x33,0x6c, + 0x20,0x73,0x35,0xb1, 0xb9,0x48,0xf2,0xd7, 0xfb,0x90,0xe8,0x65, 0xcf,0x95,0xd4,0x23, + 0xbe,0x5d,0x1f,0xdc, 0x83,0x0f,0x92,0x6c, 0xdb,0x54,0xc7,0xf5, 0x92,0xcc,0x58,0x2b, + 0x71,0xc8,0x94,0x07, 0x6d,0x1a,0x63,0x0d, 0xb9,0x0c,0xc2,0xdb, 0xa5,0x52,0x10,0x58, + 0x27,0x2b,0x34,0xb7, 0xbf,0xdd,0x1f,0xfb, 0x9d,0x42,0x00,0xcf, 0x38,0x1f,0x60,0x0c, + 0x3d,0x6f,0xb3,0x64, 0xe5,0xff,0x1c,0x2d, 0xf6,0xf3,0xef,0xca, 0x87,0xee,0x18,0x71, + 0x9e,0xb9,0x9d,0xd3, 0x0d,0x3b,0x5a,0xb6, 0x5f,0xb7,0x8f,0x0a, 0xda,0x3c,0x82,0xd5, + 0x4c,0xeb,0x2e,0x73, 0x19,0x2f,0x69,0x94, 0x08,0xd6,0xac,0x20, 0x06,0xbc,0x87,0x7e, + 0xc9,0xfe,0x97,0xf0, 0x62,0xf3,0x78,0xf3, 0xf6,0xf8,0xe2,0x2d, 0xb5,0xde,0xcb,0x00, + 0xe2,0xa9,0x68,0x01, 0xf0,0xff,0x1f,0x43, 0xea,0x7f,0x2d,0x15, 0xf9,0x4c,0xdf,0x73, + 0x9d,0xf4,0x5f,0x9f, 0xf2,0x81,0x2b,0xfd, 0x77,0x0b,0xd5,0xdb, 0x29,0x5b,0x79,0x05, + 0xf0,0x68,0x14,0xd6, 0x12,0x57,0x61,0xaf, 0xc7,0x0b,0x68,0xa2, 0xb3,0xa2,0xf2,0x3e, + 0x63,0x48,0xfa,0x8c, 0xac,0x1a,0xeb,0x15, 0xb7,0xea,0xdd,0xa0, 0xe8,0xcb,0x54,0xb3, + 0xf8,0xff,0x5c,0x1c, 0x6f,0xb1,0x49,0x7b, 0xf8,0xae,0x8b,0xa3, 0x56,0xcb,0xff,0xf7, + 0xe2,0xf9,0xf0,0xe6, 0xb9,0x2d,0x3d,0x1a, 0xba,0xcb,0x65,0x4c, 0x34,0x42,0x5b,0x2c, + 0xef,0x3f,0xdc,0xd1, 0xa6,0xe4,0xec,0x7f, 0xe2,0x75,0xd3,0x58, 0x2c,0xaf,0xd2,0xc6, + 0x01,0xde,0xc3,0xfa, 0xb8,0x50,0x60,0xb2, 0x36,0x4f,0x12,0x6a, 0x01,0x99,0x27,0x87, + 0x68,0xba,0x5b,0x4a, 0xf6,0x10,0xcb,0xc9, 0x34,0x40,0x57,0x4d, 0x81,0xdb,0x60,0x7c, + 0x8c,0x7b,0x58,0x34, 0x3f,0x24,0x6e,0xcf, 0xf7,0xbe,0x77,0xf5, 0xee,0x35,0x8f,0xf4, + 0xe1,0xd1,0x9f,0x15, 0x4e,0xa1,0xb1,0x20, 0x40,0x28,0xa0,0x7c, 0xd5,0x64,0x26,0x9b, + 0xe2,0xc6,0x6a,0x55, 0x44,0x31,0x80,0x59, 0x6d,0xd1,0x67,0xf4, 0x36,0x01,0xb9,0x11, + 0x88,0x6a,0xca,0x32, 0xd4,0x20,0x7e,0x7c, 0x49,0x9b,0x6e,0xdf, 0xa4,0x77,0xbd,0xdc, + 0x24,0x93,0x45,0x96, 0x1a,0xa9,0x10,0x3e, 0xbd,0xc0,0x9b,0x1b, 0x13,0x69,0xb6,0x99, + 0x11,0x71,0x20,0xd2, 0xa4,0xa9,0xee,0xba, 0x7e,0xa3,0xac,0xf6, 0xbc,0x3f,0x70,0x58, + 0xeb,0x0b,0x56,0xb1, 0x4c,0x4a,0x86,0xb8, 0x3b,0x1e,0xc7,0xca, 0x37,0xf5,0x2c,0x8c, + 0xb0,0x7c,0x38,0xa7, 0x7c,0xb9,0xec,0xcd, 0x0f,0x15,0x72,0x18, 0x0c,0xf7,0x6d,0x96, + 0x85,0x63,0x2a,0x21, 0xc8,0x79,0xa0,0x46, 0xdc,0xc9,0x45,0xfc, 0x1f,0x03,0xac,0x43, + 0x56,0x39,0x23,0x96, 0xf8,0xf0,0x92,0xb8, 0xe5,0x5a,0xc0,0x54, 0xfe,0x69,0x73,0x53, + 0xe8,0x87,0xa7,0x44, 0xe7,0x58,0x84,0x68, 0xff,0xf2,0xe3,0x26, 0x8b,0x74,0x2a,0x18, + 0x86,0x92,0x68,0xd7, 0x4b,0x96,0x8a,0x03, 0xd8,0x87,0x62,0xc0, 0xc4,0x5a,0xf2,0x71, + 0x12,0x3f,0x1e,0x6d, 0x52,0x78,0x39,0x58, 0x16,0xa9,0x07,0x24, 0xc7,0x66,0x96,0xc2, + 0x59,0x29,0xfc,0x17, 0x34,0x80,0xcb,0x11, 0x84,0x07,0x19,0x03, 0x42,0xad,0x25,0x06, + 0xf1,0x9e,0x31,0x55, 0xbd,0x4f,0xa1,0x28, 0xf9,0xd6,0x2d,0x7e, 0x99,0xc5,0xf1,0x40, + 0x36,0xaa,0x2b,0x78, 0xa4,0x98,0xd1,0xe2, 0x85,0x14,0x8b,0x86, 0x99,0x71,0x49,0xfb, + 0x21,0x06,0x5a,0x4b, 0x57,0x54,0x0d,0x28, 0x46,0xd6,0xfd,0x07, 0x53,0x0f,0x85,0xb4, + 0x49,0x99,0x1a,0xc8, 0x26,0x70,0xbf,0x8a, 0x78,0x12,0x83,0xab, 0xed,0x16,0x83,0xcd, + 0x51,0x0a,0x75,0xad, 0xb1,0xd8,0x05,0xa8, 0x8b,0x9d,0xea,0x80, 0xc4,0x41,0xa8,0x81, + 0xd0,0x9c,0xc9,0xae, 0x15,0x63,0xd1,0xbd, 0xd4,0xc0,0xa1,0x08, 0xd4,0x3d,0x69,0x20, + 0x80,0x5a,0xe1,0x4e, 0x6c,0x89,0x88,0xac, 0x34,0x83,0x60,0x35, 0xf7,0x7c,0x27,0x12, + 0x93,0xb6,0xc6,0x4a, 0x80,0x2c,0x26,0xe6, 0xb2,0x52,0xe0,0x53, 0x60,0xa6,0xd4,0x3b, + 0x00,0x94,0x78,0xbd, 0x3c,0x55,0x1b,0xf4, 0x64,0x9f,0xda,0x2f, 0xea,0xb0,0x6c,0x02, + 0x0f,0xc4,0x71,0xe1, 0xd8,0xa9,0x0e,0x56, 0x06,0xd9,0x07,0x19, 0xdf,0x85,0x49,0x21, + 0x42,0x9a,0x9b,0x1f, 0x62,0x31,0xeb,0xe6, 0xf4,0x7f,0x2b,0x19, 0xaa,0x7c,0x85,0x75, + 0x6c,0x10,0xc4,0xc0, 0x51,0xd3,0x2e,0xb2, 0xa6,0xce,0xbb,0xde, 0x2b,0x34,0xb9,0xff, + 0x23,0x2f,0x7c,0xbb, 0xec,0xb1,0xd4,0xe5, 0x14,0xac,0x9f,0xa0, 0x2a,0x19,0x24,0xf5, + 0x94,0x2c,0x3b,0x67, 0xb5,0x66,0x6f,0xca, 0xb2,0xdf,0xeb,0xb8, 0x5b,0xac,0x9a,0x1b, + 0x0a,0x1a,0x3e,0x45, 0x6d,0x3c,0xa1,0x0e, 0xc0,0x6a,0x75,0xb3, 0x2f,0x64,0x4a,0x9a, + 0xa9,0xf2,0xa8,0x35, 0xfc,0x74,0x44,0x3d, 0x9b,0x3e,0xb4,0x38, 0xec,0x87,0x1a,0x0f, + 0xa0,0x4d,0x9f,0xb7, 0x87,0xe6,0xec,0x62, 0xc9,0x98,0xcc,0xa2, 0x6b,0x3e,0x6f,0xc9, + 0x98,0x23,0xc9,0x52, 0xa1,0x0c,0x2a,0x67, 0xde,0x07,0x52,0x96, 0x78,0xf6,0xb7,0x70, + 0xa6,0x55,0xa8,0x29, 0xc6,0x62,0xb4,0xd7, 0x11,0xea,0xe3,0x1e, 0x45,0x9b,0x5b,0x97, + 0xb2,0x22,0x54,0xb3, 0x73,0x8a,0x13,0xb7, 0x42,0x66,0xb5,0x27, 0x18,0xe6,0x92,0x0a, + 0x4a,0xc1,0x04,0xac, 0xcd,0xfa,0x38,0x10, 0x13,0x35,0x77,0xf8, 0xd8,0x6b,0x2d,0xe7, + 0xa4,0x23,0x5d,0x71, 0x5b,0x91,0xcd,0xa0, 0xbb,0x77,0x7e,0x45, 0x04,0xb1,0x5a,0xc1, + 0xc7,0x8c,0xa6,0x7f, 0x23,0x5a,0x56,0x68, 0x5f,0xf7,0x56,0x50, 0x85,0x68,0x61,0xad, + 0x68,0xe1,0x33,0x31, 0x84,0xda,0x16,0x3b, 0x2d,0xb0,0xd2,0xb1, 0x49,0x89,0x6c,0xd8, + 0x23,0x3a,0xc4,0xb3, 0x18,0x30,0x06,0xc4, 0xeb,0x75,0x72,0xa0, 0xc4,0x12,0x0f,0x23, + 0x79,0x09,0xf3,0x9b, 0xd8,0x0c,0xc6,0xc0, 0xaa,0xce,0x35,0xa3, 0xaa,0x36,0xe6,0x09, + 0xfb,0x7a,0xb6,0x97, 0x73,0xc7,0xce,0x2c, 0x02,0x33,0xe5,0x48, 0xd3,0xcd,0x21,0xc8, + 0x44,0x63,0xab,0x33, 0x61,0xb7,0x62,0x27, 0xb2,0xbe,0x6c,0xe4, 0x98,0x39,0xfd,0x32, + 0x1e,0x0c,0x68,0xcf, 0xeb,0xc1,0x90,0xdc, 0xf0,0xd0,0xfe,0xac, 0x16,0x23,0xfc,0x2c, + 0xb0,0xbd,0x7e,0x92, 0xfe,0xc4,0xff,0x84, 0x21,0x01,0x9b,0x9a, 0x94,0x99,0x64,0xdc, + 0xa7,0xb8,0x4b,0xfd, 0xbe,0x3e,0x35,0x75, 0x9b,0xef,0x3b,0xac, 0xde,0xe1,0x13,0x7a, + 0x3a,0x79,0x7e,0xe3, 0x7d,0xd5,0x57,0xda, 0xb2,0x70,0x2d,0xb7, 0x72,0x63,0x51,0x21, + 0xbd,0xe5,0xa1,0x0b, 0x84,0xce,0x61,0xdc, 0x3c,0xa7,0xa1,0x96, 0x6c,0xdb,0x6a,0x75, + 0xae,0xb2,0xa4,0x1c, 0xaf,0x25,0x89,0x20, 0xc4,0x68,0x5c,0xce, 0xb8,0x80,0x2e,0xf3, + 0x20,0x46,0x75,0x4b, 0x3b,0x74,0xdb,0x15, 0xc5,0x46,0x73,0xaa, 0xb9,0x4d,0xbc,0x78, + 0x57,0x15,0xbe,0xca, 0xb6,0x52,0xa4,0xa1, 0x52,0x0b,0x75,0xc3, 0x2e,0xd2,0xb7,0xc2, + 0x41,0xed,0x4b,0x51, 0x6f,0x48,0x36,0xee, 0x82,0x92,0x02,0x73, 0x1a,0x77,0x7d,0x23, + 0x40,0xb2,0x92,0x06, 0xe3,0xcc,0x18,0x5a, 0x8b,0xdb,0x02,0x6c, 0x72,0x83,0x8e,0x05, + 0x39,0xa1,0xe0,0xc0, 0x21,0x4f,0x35,0xc0, 0xf2,0x21,0x58,0x2a, 0x76,0x0d,0x29,0xc3, + 0x79,0x5e,0xc2,0xb6, 0x67,0x25,0x39,0xe3, 0x7b,0x1e,0x44,0xe4, 0x36,0x85,0x08,0x6d, + 0x7f,0x1a,0xf5,0xfe, 0xab,0xff,0x6e,0x06, 0x0a,0xf9,0x09,0x6d, 0xbb,0x49,0xd0,0xdf, + 0x48,0xab,0x9b,0x83, 0x8b,0x5d,0x17,0xc6, 0xa0,0xf4,0x61,0x9a, 0x9e,0x7f,0x01,0x5f, + 0x14,0xc5,0x1c,0xae, 0x99,0xa8,0x96,0x29, 0xe1,0xf3,0x0d,0xf7, 0x87,0x1b,0xbd,0x0e, + 0xc4,0x3e,0x85,0x82, 0x13,0x2a,0xda,0xed, 0x10,0x98,0xf5,0x1b, 0x38,0x7f,0x87,0x70, + 0x6e,0xa0,0x7a,0x78, 0x75,0xf6,0x0e,0x4f, 0x52,0xbb,0x44,0xab, 0x91,0x29,0x1e,0xa2, + 0x2a,0xf8,0x7d,0x93, 0x11,0xb5,0x52,0x84, 0x13,0xdd,0x21,0x23, 0x44,0x2f,0x8d,0xa3, + 0x81,0xce,0xa2,0xc5, 0x1a,0x7c,0xc1,0xbb, 0x5f,0x3a,0x8f,0xe6, 0xa3,0xb6,0x74,0x27, + 0x28,0x8f,0x6f,0xf9, 0x30,0xa7,0xd4,0xe3, 0x49,0x7c,0x3a,0xe8, 0x48,0x16,0xaf,0x8c, + 0x81,0x9f,0x90,0x8b, 0x28,0xfb,0x2e,0x4e, 0x7b,0x7d,0x86,0x72, 0x7a,0x5e,0x0e,0x9c, + 0x0a,0x12,0xf5,0x34, 0x23,0x47,0xe1,0xdb, 0x78,0x8b,0xb7,0x7d, 0x85,0xf0,0xc3,0x31, + 0xad,0x8b,0xcf,0x2f, 0x59,0x08,0xa9,0xda, 0xfa,0xa9,0xed,0xb4, 0x46,0x6c,0x05,0xd2, + 0x3d,0x95,0xcc,0xa3, 0x0f,0x5a,0xd6,0xdc, 0xa6,0xbf,0x73,0x8c, 0xec,0x17,0xd3,0x2c, + 0xb0,0x81,0xaf,0x87, 0xfb,0x90,0xab,0xc6, 0xe7,0x48,0x14,0x19, 0x4d,0x19,0xc1,0x7a, + 0xab,0xf0,0xdf,0xad, 0xce,0xdc,0x3e,0xe9, 0x72,0xb1,0xbf,0x07, 0x22,0x5b,0x68,0xac, + 0x18,0xa7,0xdc,0x94, 0x8a,0x14,0xf1,0x61, 0x50,0xe7,0xdb,0xb5, 0x3e,0x32,0xf3,0xca, + 0xd6,0x11,0xd9,0x0c, 0x62,0xb7,0x99,0x27, 0x7c,0x3e,0xc6,0x1a, 0xeb,0xe9,0x93,0x2e, + 0x73,0xef,0xd2,0x4f, 0x35,0xdb,0x3b,0x29, 0xf5,0x4e,0xf4,0xac, 0xc7,0xed,0xe5,0x2c, + 0xee,0xf9,0xd7,0x84, 0xd3,0x05,0xbb,0x4a, 0x2a,0xc9,0x3f,0x5d, 0x45,0xa4,0x69,0x69, + 0x34,0xeb,0xdc,0x0b, 0x95,0xb4,0xc3,0xd7, 0xe7,0x9a,0xf4,0xce, 0xe7,0x44,0xe6,0x4e, + 0x4b,0x06,0xbb,0x8c, 0xfb,0x8a,0x50,0x95, 0x2e,0x05,0x73,0x1d, 0x34,0x68,0x62,0xf0, + 0xcd,0xb0,0xef,0x62, 0x9b,0xf7,0x73,0x69, 0x8f,0x6b,0x1c,0x3a, 0x9d,0xff,0x27,0x36, + 0xd9,0x58,0xd7,0x10, 0xf2,0x2f,0x99,0x1b, 0x48,0xfa,0xd6,0xcb, 0xcc,0x40,0x5b,0x02, + 0xde,0xd2,0xe5,0x85, 0xae,0xc8,0x0c,0xd8, 0x1e,0xd9,0x02,0x21, 0x92,0xc3,0x03,0xb4, + 0x01,0x31,0x83,0x07, 0xcb,0x2f,0x88,0xa4, 0x2d,0x40,0x8e,0x07, 0x4f,0x49,0x51,0xd1, + 0x51,0x8d,0xb9,0x00, 0xc4,0x36,0xed,0x9f, 0x84,0x5c,0xb4,0x55, 0xe9,0xbc,0x87,0xb4, + 0x23,0x99,0x04,0x87, 0xe3,0x1f,0x09,0x80, 0xb2,0x7f,0xd2,0x94, 0x68,0x99,0xca,0xb9, + 0x8b,0x0a,0xa5,0x44, 0xe2,0xf1,0x93,0x42, 0x52,0x01,0x5e,0xe5, 0x6c,0xf5,0x47,0xda, + 0xae,0xda,0x4d,0x72, 0xfa,0x3d,0x62,0x25, 0xbd,0x0c,0xc7,0x1a, 0x0b,0xaf,0x8b,0x33, + 0x59,0x65,0xc6,0x76, 0x1a,0x90,0x59,0xda, 0xf1,0xda,0x63,0xf0, 0x7c,0xf9,0xbd,0xdc, + 0x6d,0xae,0xee,0x86, 0xef,0x7f,0x68,0xeb, 0x68,0xe6,0x48,0x9e, 0xd3,0xe3,0x2d,0x1c, + 0x53,0xbd,0xca,0x66, 0x6b,0xff,0x83,0xbe, 0x9f,0x94,0x2d,0xd9, 0xe0,0x57,0x69,0x12, + 0xce,0x3b,0x10,0x15, 0x4e,0xcd,0x8e,0xe6, 0x1e,0x7d,0x2e,0xea, 0xeb,0x2d,0xd1,0xc7, + 0x53,0xd2,0x4f,0x7f, 0xf4,0xef,0x54,0x37, 0x71,0x64,0x35,0xf5, 0xc9,0xc5,0xb2,0x3e, + 0x27,0xe2,0xfb,0x15, 0x1e,0xe2,0xa1,0xa5, 0x46,0x36,0x9b,0xc6, 0xcd,0x40,0x68,0xac, + 0x87,0x11,0x90,0x7d, 0xb6,0xf2,0x93,0x87, 0x6e,0xe8,0xef,0x5a, 0x8b,0x34,0x38,0xdd, + 0x77,0x3e,0x6f,0xe0, 0x96,0x4b,0xbb,0x53, 0xb6,0xf9,0xe3,0x19, 0x73,0xf6,0xd7,0x29, + 0x55,0x15,0xff,0x2e, 0x2e,0x5b,0x8a,0xbf, 0x60,0xae,0x24,0x43, 0x44,0xb5,0xf7,0x1d, + 0x29,0xa6,0xb1,0x6d, 0xf9,0x7c,0x40,0xc3, 0x7b,0x2e,0xfc,0xc1, 0x3c,0xb4,0x9f,0x96, + 0x21,0x3c,0x87,0x40, 0x45,0x96,0x70,0x9d, 0xc0,0x6c,0xe7,0x38, 0xe9,0x9c,0xb0,0x88, + 0x28,0x42,0x53,0x6c, 0x15,0x10,0x3e,0xba, 0x15,0x7b,0x9f,0x27, 0x6d,0x14,0x22,0x65, + 0x3c,0xbe,0x8e,0x43, 0x11,0xf6,0xdb,0x21, 0xdd,0xf6,0x5e,0xcf, 0x33,0xe0,0x6b,0x3e, + 0x9c,0x4e,0xd7,0x0f, 0xdc,0xc0,0xd8,0xe5, 0x66,0x61,0x25,0xee, 0x50,0xe4,0x61,0xc3, + 0x6b,0xbe,0xce,0x6e, 0x1e,0x84,0xc7,0x6d, 0x5e,0xee,0x4a,0x52, 0x7f,0xbb,0xe3,0x43, + 0x1d,0x53,0xa8,0xf5, 0xe7,0x94,0xf9,0xdb, 0x7b,0x9a,0xb3,0x9a, 0xf7,0xfb,0x24,0x68, + 0xca,0xd5,0x4e,0x34, 0xc6,0x3e,0xcf,0x22, 0xbf,0x11,0xe9,0xe7, 0x1d,0x7c,0xd3,0x6c, + 0xe2,0x95,0x73,0x2c, 0x9f,0x76,0x0f,0xe4, 0x80,0xb9,0xcf,0xa5, 0x29,0x16,0xe2,0x1b, + 0xdd,0x84,0xf0,0xc8, 0xc5,0x74,0x72,0xd2, 0x0e,0x19,0x36,0x7c, 0x75,0xbe,0x7f,0x57, + 0x89,0xde,0x97,0x97, 0xd1,0x39,0x6c,0xc6, 0x4f,0x32,0x95,0x77, 0x76,0x5c,0xca,0x9d, + 0xdd,0x34,0x8c,0x86, 0x3f,0x9d,0xb2,0x14, 0x9a,0x4e,0x9f,0x4f, 0xae,0xf9,0x4a,0x4d, + 0xd6,0xcd,0x6d,0x5e, 0x14,0x99,0xed,0xf1, 0x1c,0x42,0x8d,0x8f, 0xbd,0x0e,0x47,0x3f, + 0xcb,0xcc,0xc1,0xad, 0xcf,0x85,0x57,0x17, 0xa6,0x8f,0x8f,0x91, 0x44,0x8f,0x0f,0xb6, + 0x8d,0xe7,0x07,0x77, 0xb8,0x67,0x0b,0x95, 0xb5,0x95,0xcf,0xf8, 0xd4,0xce,0xc1,0xce, + 0xf8,0x15,0x6c,0xca, 0x45,0xcb,0x36,0x0d, 0xa0,0x6c,0xdf,0x1c, 0x1c,0xc2,0x4f,0x17, + 0x47,0xc6,0xe1,0xa9, 0x97,0x43,0x61,0x0b, 0x2b,0xef,0x66,0xbb, 0x9d,0xba,0x3c,0x1c, + 0x03,0xc2,0x2e,0x31, 0xf4,0x76,0x78,0x56, 0x11,0x66,0x9c,0x7e, 0x2f,0x93,0xc2,0x9e, + 0x32,0x5b,0x8b,0x35, 0x79,0x09,0x44,0xda, 0xd7,0x43,0x2e,0xcc, 0xc9,0xb6,0x60,0x8c, + 0x6f,0x07,0x17,0x93, 0x3d,0x20,0x58,0xeb, 0x45,0x09,0x9d,0xc5, 0x11,0xd4,0x76,0x16, + 0xc8,0x87,0xb1,0xad, 0xe8,0xeb,0x23,0x8b, 0xa3,0x96,0xd5,0x94, 0xb7,0xc8,0xea,0x2a, + 0xfb,0x2e,0x7f,0x1a, 0xcb,0xa4,0xc7,0x17, 0x2c,0x96,0x57,0x13, 0x3d,0xbe,0xe3,0x5b, + 0xd5,0xb6,0x76,0xc2, 0x12,0x5a,0x7b,0xab, 0x96,0x97,0xa5,0x1b, 0xd5,0x42,0xab,0xe1, + 0x35,0x57,0xdc,0xf2, 0xe5,0xe8,0xa0,0xa3, 0x78,0x19,0x7d,0x73, 0x07,0xf4,0x1c,0x9c, + 0x8a,0x40,0x7b,0x31, 0x36,0x5e,0xaa,0xef, 0x29,0x5b,0x8e,0x61, 0x84,0x7b,0xcf,0x01, + 0x3f,0x94,0x04,0x94, 0x10,0x8d,0xa7,0xba, 0x2c,0xc6,0xbf,0xe3, 0x0a,0x02,0x04,0xbe, + 0x42,0x26,0x74,0x7f, 0x55,0xcb,0x38,0x63, 0xd8,0x2f,0x29,0x90, 0x35,0xff,0x5e,0x33, + 0xe9,0x0e,0x1f,0x6e, 0x29,0xf6,0xa6,0x61, 0xc6,0x83,0xdc,0xed, 0x41,0xce,0xdc,0xe4, + 0xe5,0x78,0x4d,0x25, 0xd3,0x26,0xc5,0xaa, 0xc5,0xa6,0x43,0x97, 0x3a,0xfd,0x5b,0xbb, + 0xd7,0x31,0x3a,0xbc, 0x95,0x0c,0x8d,0xd6, 0x8a,0xeb,0xc1,0x80, 0xb6,0x4e,0x36,0x97, + 0x51,0x5f,0xb0,0xdc, 0x69,0xb5,0x6d,0x92, 0xda,0x37,0xdb,0x5b, 0xd3,0x5f,0xaa,0xeb, + 0x2d,0xb2,0xd9,0xf2, 0xde,0x9f,0x34,0x9e, 0xc7,0x37,0x63,0x61, 0xba,0x64,0x9e,0x8f, + 0x5a,0x9e,0x6b,0x35, 0x0a,0xc5,0x85,0x9e, 0x81,0xbc,0xbe,0x21, 0xd3,0x97,0xf2,0x7b, + 0x1f,0x2b,0x37,0xaf, 0xbc,0xd2,0x59,0x4d, 0xc3,0xfe,0xb7,0x63, 0x97,0x3f,0x9d,0xbf, + 0x32,0x56,0xb3,0xba, 0xc0,0xb6,0x8f,0x42, 0x6b,0x34,0x22,0xcd, 0x25,0x2f,0x48,0x0b, + 0xaa,0x6c,0xc6,0xd0, 0xb2,0x02,0x3f,0x5b, 0x83,0x03,0x8f,0xea, 0x4e,0x3b,0xd7,0x79, + 0x39,0xf7,0x4f,0x47, 0x33,0x20,0xe7,0x37, 0xab,0x81,0xca,0xed, 0x60,0xf2,0xb7,0xda, + 0x1a,0xdb,0x0e,0xde, 0xa3,0x83,0x78,0xd2, 0x6c,0x83,0xb9,0x13, 0xbc,0x75,0xb8,0x3e, + 0x2b,0x7c,0x73,0x1b, 0x22,0x36,0x47,0x0f, 0x74,0xf4,0x7a,0xf6, 0x0d,0x88,0x0d,0x2c, + 0x2e,0xc9,0x38,0x7c, 0x52,0x98,0xad,0x38, 0x70,0xf0,0x4c,0x62, 0xd4,0x2b,0x4f,0x27, + 0x4d,0xbc,0x8c,0x5d, 0x1b,0x9e,0xce,0x60, 0xa4,0x32,0xf1,0xbb, 0x5d,0xa6,0xcb,0x81, + 0x0f,0x43,0x07,0x23, 0x86,0xed,0xa5,0xc6, 0x71,0xa2,0x52,0xbb, 0x59,0xa0,0x81,0x19, + 0xad,0x8e,0xb6,0x61, 0xbb,0x8d,0x8e,0xc5, 0xac,0x28,0x0b,0x6e, 0x40,0x2c,0x23,0x43, + 0x17,0x5c,0x3d,0x56, 0x14,0x6e,0xde,0x45, 0x6c,0xb6,0xe3,0x23, 0x3a,0xcc,0x6c,0xf6, + 0xa7,0x5c,0x6c,0x65, 0x2b,0xc8,0x00,0xc7, 0x9b,0x58,0x7b,0x27, 0xf5,0x12,0x56,0xca, + 0x28,0xc4,0x3a,0xe1, 0xe5,0xf7,0x0d,0x85, 0x06,0xe5,0xd2,0x19, 0x2c,0xbc,0x15,0x1d, + 0x62,0x72,0x3b,0x98, 0x35,0x72,0xf2,0x42, 0x36,0x32,0x5b,0x3c, 0x45,0xd4,0xf2,0x0e, + 0xb5,0xfc,0x7a,0x2e, 0xa8,0x8c,0x88,0x9a, 0x74,0xdd,0x22,0xdb, 0xae,0x39,0x81,0xb5, + 0x39,0xb7,0x4b,0xde, 0xfe,0xfa,0x68,0xd5, 0x1a,0x25,0x6e,0x75, 0x68,0x08,0xc2,0xb2, + 0xe8,0x40,0x4f,0xd8, 0x35,0xf2,0xe8,0x1b, 0xca,0x3a,0xa3,0x91, 0x4b,0x41,0x8f,0x3c, + 0x43,0xd3,0x88,0xc2, 0xe8,0x96,0x69,0x9b, 0x54,0x42,0xd4,0xd7, 0x5d,0x11,0xbf,0xb9, + 0xfa,0xdc,0x7f,0x5d, 0x3b,0xa8,0x4f,0x97, 0xfb,0x65,0x39,0x31, 0x52,0x0d,0xa5,0x22, + 0xb5,0x5e,0x17,0x4d, 0xb4,0x92,0xe1,0x6d, 0x2e,0xca,0xa8,0x58, 0x0c,0xfb,0x07,0x6f, + 0x1f,0x69,0x66,0x58, 0xc4,0xd5,0x96,0x2b, 0x44,0x46,0xc1,0xc6, 0x65,0xfb,0x17,0x9a, + 0xa6,0x12,0xa7,0xfb, 0x37,0x5d,0x6e,0x98, 0xf6,0xc7,0xb4,0x2e, 0xb8,0x4f,0xb3,0xd6, + 0xa0,0x7a,0x2e,0x7d, 0x6d,0x7b,0xca,0x66, 0x58,0x66,0xce,0xad, 0xe0,0x60,0x7c,0x12, + 0xe4,0x90,0x79,0x0f, 0x6a,0xe1,0x42,0x62, 0xa4,0x77,0x2c,0x8c, 0x07,0x20,0x02,0x3b, + 0x36,0x7d,0x24,0x1d, 0x68,0x75,0x49,0x35, 0x33,0x6f,0x8a,0xa0, 0xa4,0xe6,0xce,0xac, + 0x8b,0xd5,0x69,0x3f, 0x0e,0x9b,0x0b,0x12, 0xc8,0xfa,0x41,0x3a, 0x2e,0x6f,0xef,0x7b, + 0x5f,0x8d,0x64,0x6e, 0x2e,0xde,0x64,0xdb, 0xc2,0xa7,0x13,0x33, 0x82,0xed,0x4d,0xc5, + 0xd2,0x78,0x75,0xad, 0xdc,0xbb,0xa2,0xd0, 0x5a,0x44,0x86,0xdf, 0x22,0x82,0x58,0x92, + 0xbe,0x4f,0x95,0x38, 0x76,0xd0,0x34,0xf1, 0x7c,0x4e,0x6b,0xaa, 0x62,0xa4,0xae,0x3c, + 0xe7,0x7c,0x1e,0x58, 0xec,0xd6,0x99,0xed, 0xcd,0x35,0xb2,0x59, 0xa0,0x44,0x09,0x08, + 0xe6,0x9a,0x61,0x16, 0xd5,0x18,0x6a,0x85, 0x4e,0x6e,0xcf,0xa5, 0xc0,0xc1,0xef,0xf8, + 0x15,0x63,0x3b,0xf8, 0x72,0x4b,0x31,0xa5, 0xcc,0x6e,0x9b,0xb5, 0x7b,0xfa,0x2a,0x2a, + 0xa6,0x06,0x1b,0xb9, 0x06,0x23,0x00,0x6f, 0x47,0x9b,0x38,0x62, 0x6e,0x84,0x30,0xf5, + 0x43,0x3b,0xae,0x77, 0x9d,0x3a,0x1d,0xc6, 0x9e,0xc6,0xf6,0x75, 0x65,0x83,0x90,0x46, + 0xdc,0xea,0x1e,0x8b, 0x79,0x85,0x43,0x4b, 0x3e,0x64,0xa3,0x6b, 0x3e,0x9d,0x9d,0x38, + 0x31,0xf3,0x60,0x99, 0xad,0x87,0xbe,0x65, 0x74,0x86,0xf7,0x2c, 0xe9,0xa1,0x3f,0x2a, + 0xfb,0xbb,0xb1,0x85, 0x03,0x6d,0xe6,0xf6, 0x33,0x6d,0xf9,0x3b, 0x8c,0xb1,0x67,0x4e, + 0xa8,0x0e,0x65,0x56, 0xca,0x4a,0x4b,0xdd, 0x29,0xcc,0xbd,0xf0, 0xb9,0x9a,0x17,0x74, + 0x6a,0xb0,0x85,0xb8, 0x64,0x68,0xcb,0xfe, 0x10,0x60,0xda,0x71, 0x2a,0xb9,0xc1,0xaa, + 0xec,0xf2,0x1a,0xbe, 0xca,0x69,0x61,0xe5, 0x35,0x54,0xc7,0x32, 0x72,0x44,0x8c,0xbd, + 0x6d,0xbc,0x7c,0xe7, 0x19,0x88,0x51,0xb4, 0x14,0x88,0x88,0x04, 0x09,0x20,0x8f,0x04, + 0x84,0x50,0xfd,0x43, 0x8e,0x43,0x88,0x67, 0xe0,0x3d,0xec,0x66, 0xf3,0x33,0xf5,0x32, + 0xdd,0x7b,0xcf,0x87, 0x5a,0xb0,0xc6,0xd3, 0x69,0x0b,0x07,0x4e, 0x7c,0x33,0x73,0x9c, + 0xfa,0x56,0x06,0x36, 0x53,0x28,0x1b,0xe2, 0x57,0x29,0x03,0xd1, 0xf6,0xfb,0x54,0x77, + 0xc8,0x95,0xd4,0x31, 0xc0,0xc0,0x07,0xaf, 0xf8,0xd8,0x17,0x88, 0x2a,0xaa,0x76,0x22, + 0x03,0xf6,0x49,0xcc, 0x23,0x36,0xd1,0x59, 0x06,0x59,0x50,0x70, 0x10,0xae,0xfe,0xa1, + 0x4d,0x29,0x4a,0x50, 0xee,0x94,0x2c,0xe6, 0x7e,0x09,0xe8,0xce, 0x5f,0xd1,0x5c,0x3a, + 0x2f,0x51,0x8f,0x8f, 0xad,0x7e,0x15,0xd5, 0x19,0x56,0xd4,0x54, 0x58,0xce,0x51,0x25, + 0xd2,0x19,0xbc,0xfe, 0x2f,0xd6,0x9a,0x4c, 0x84,0x21,0x24,0xb7, 0x43,0x13,0x14,0x31, + 0x28,0x52,0xde,0xe9, 0xdd,0xdd,0x91,0xc0, 0x2c,0xf2,0x73,0x1c, 0x0f,0xb9,0xe8,0x94, + 0x5b,0xf1,0x2b,0xc0, 0xe2,0x0f,0xf3,0x1f, 0x8e,0x40,0xac,0x9c, 0x1e,0x04,0x3f,0x6e, + 0x52,0xd2,0x1b,0xbc, 0x24,0xbc,0xc1,0x36, 0xdf,0xfb,0xf6,0x13, 0x7a,0x6c,0x5d,0x6e, + 0x12,0x61,0x41,0x86, 0xf5,0xd2,0xee,0x86, 0x2e,0xf2,0x07,0x5c, 0x2f,0x55,0x02,0x68, + 0x5a,0x83,0x71,0xf5, 0xa8,0x70,0xb8,0xea, 0x8f,0xce,0x4b,0x3e, 0x93,0xc8,0x21,0xe9, + 0x24,0x0d,0x5d,0x91, 0xb5,0x2f,0xa6,0x09, 0xc7,0xbb,0x7d,0x5b, 0x77,0x49,0xd1,0xa8, + 0x6a,0x9e,0xf9,0x3d, 0x05,0x9d,0xaf,0x0f, 0x31,0xdd,0x9b,0x18, 0x34,0x8e,0x19,0x15, + 0x69,0x20,0x53,0xf1, 0x15,0x21,0x29,0x89, 0xac,0x87,0xc5,0xa7, 0x0e,0x44,0x92,0x5b, + 0xc8,0xdc,0xb9,0x47, 0x78,0xf7,0x6c,0xa3, 0x98,0x28,0xaa,0x9d, 0xc2,0xab,0x86,0xef, + 0x6e,0xbe,0xe4,0x9b, 0x06,0xe2,0x28,0xe3, 0xea,0x11,0xb9,0xf4, 0xd2,0x0b,0x21,0x28, + 0xd6,0x95,0x68,0x17, 0x0c,0xa6,0xc0,0xdb, 0xc6,0x54,0xf8,0x93, 0x52,0x6f,0x2e,0x4e, + 0xf5,0xfd,0x8d,0xf2, 0x8c,0xdc,0x8d,0x85, 0xb0,0xe5,0xd4,0x33, 0x2f,0x7d,0x5b,0x30, + 0x5f,0xe3,0xe8,0x56, 0xa4,0xcc,0x84,0x92, 0x87,0x41,0x0f,0xc1, 0xb9,0xdc,0x14,0xc9, + 0x70,0xe0,0xf4,0xa8, 0x5e,0x57,0xed,0x8f, 0xe5,0xd4,0x1e,0x34, 0xdf,0x85,0x93,0x4b, + 0x44,0x99,0x49,0xa2, 0xfc,0xe0,0x1d,0x06, 0xea,0xf4,0x8d,0xd8, 0x92,0x08,0x6e,0xbf, + 0xfd,0x14,0x48,0xb2, 0xb3,0x33,0x37,0xb7, 0x65,0x20,0x82,0x5d, 0xd9,0xa4,0x9e,0x26, + 0xdb,0xc1,0xee,0xbd, 0x0c,0x2c,0x9f,0xa1, 0xcf,0x70,0x3e,0x46, 0x3f,0x7a,0xe1,0x75, + 0x7c,0x19,0xe6,0x29, 0x05,0xed,0xbc,0xc8, 0x35,0xca,0x92,0xf7, 0x75,0xb8,0xad,0x94, + 0x9a,0xb9,0x95,0xc6, 0x67,0x3c,0xc2,0x06, 0x11,0x19,0xac,0x74, 0xce,0xbd,0x9b,0x20, + 0xc0,0x69,0xf7,0x87, 0x0c,0x7a,0xda,0x15, 0x92,0xb4,0xf1,0xba, 0xb8,0x7f,0x47,0x8c, + 0xed,0x05,0xb9,0xfe, 0x4b,0x0d,0xc7,0x72, 0xa9,0x05,0x39,0xdf, 0x6a,0xcd,0x88,0x7f, + 0x83,0x7e,0xbc,0x89, 0x66,0x36,0x3b,0x09, 0xb2,0x62,0xe6,0x27, 0x6a,0xc0,0xc5,0x5b, + 0x25,0xd1,0xe0,0xe8, 0x38,0xae,0x29,0xde, 0x9c,0xfd,0x09,0x4d, 0xf2,0xac,0x43,0x0c, + 0xcf,0x28,0xa7,0xea, 0x49,0x5f,0x20,0xdf, 0x23,0x5f,0xc5,0xbc, 0x20,0x6a,0xad,0xae, + 0x87,0x12,0xc5,0x4f, 0x6f,0x8b,0x46,0x1a, 0xaa,0xb5,0x95,0x0c, 0xc9,0x7b,0x5b,0xb8, + 0xb6,0x43,0xf7,0xdc, 0x56,0xc4,0x29,0x67, 0x02,0x95,0xc2,0x9b, 0x86,0xa2,0xa3,0x10, + 0xd2,0x54,0x62,0x39, 0x25,0x2e,0xd6,0xa6, 0x55,0x0b,0xa1,0x6e, 0xee,0xe7,0xd1,0xcc, + 0xc4,0xb7,0xbd,0x13, 0xb5,0xe9,0x6a,0x7b, 0xaa,0xf3,0x76,0x34, 0x2a,0x68,0x6d,0x8f, + 0x08,0x85,0x20,0xac, 0xef,0x09,0xc8,0xc2, 0xf0,0x3a,0xd9,0x3a, 0x5f,0xe3,0xf2,0x18, + 0x6b,0x69,0xcb,0x69, 0x56,0x7c,0xe6,0x03, 0xb1,0x23,0x7a,0x66, 0x2c,0x2a,0xcd,0x53, + 0xc9,0x23,0xb2,0x32, 0x22,0xc1,0x0b,0x20, 0xa5,0xdb,0x56,0x08, 0x8e,0xec,0xa7,0x5f, + 0x8b,0x62,0x6a,0x4c, 0xfa,0x28,0x96,0xde, 0x51,0xbe,0x93,0x5c, 0x29,0x41,0x16,0x55, + 0x67,0xcb,0x50,0xd4, 0xe4,0x02,0xa4,0x31, 0x10,0x0f,0xca,0xf0, 0x93,0xaf,0xa8,0x85, + 0x44,0x3c,0xcd,0x42, 0xf6,0xef,0x94,0x84, 0x48,0x1c,0xd9,0x08, 0x1d,0xc8,0xd3,0xdf, + 0xc9,0xbe,0x3c,0x75, 0xea,0xf6,0xae,0x98, 0xa1,0xe5,0xdc,0xac, 0x06,0xb7,0xec,0x30, + 0xbd,0x92,0xe3,0xdf, 0xee,0x23,0x48,0x47, 0x3b,0xf4,0xf9,0xbe, 0x6d,0x7d,0xce,0x9f, + 0x98,0x55,0x2b,0xda, 0xe4,0x5d,0xf3,0x07, 0x49,0xb4,0x38,0x23, 0x1d,0x3d,0xbd,0x59, + 0xf2,0x97,0x06,0xf2, 0x64,0x4f,0x18,0x05, 0x9e,0xee,0xa0,0xd3, 0x95,0x22,0x34,0x47, + 0x46,0x12,0x52,0x5e, 0xe6,0xbf,0x7f,0x73, 0x76,0x1d,0x75,0xf7, 0xcd,0xda,0x3d,0x5f, + 0xaa,0x32,0x5f,0x5a, 0x27,0xd4,0x0a,0x02, 0xfe,0x05,0x30,0x4d, 0x7e,0x93,0xa8,0x3e, + 0x27,0x2d,0x63,0x22, 0xea,0x9a,0x7a,0x23, 0xf5,0xa0,0x83,0xd4, 0xfb,0x9b,0x8e,0x07, + 0x4d,0xf8,0x69,0xea, 0x1a,0x36,0x0e,0xd8, 0xcd,0xd0,0xc0,0xf0, 0x27,0x01,0xf1,0x70, + 0xbb,0x79,0xe2,0x3e, 0x71,0x54,0x61,0x4c, 0x0c,0x3c,0x3c,0x1e, 0xdb,0x84,0x9b,0xda, + 0x9d,0xba,0xe0,0x3e, 0x58,0x4c,0xb7,0xf5, 0x43,0x98,0xb2,0x6b, 0x49,0x9a,0x01,0x23, + 0xfa,0xc2,0x8b,0x91, 0x48,0xee,0xa2,0x75, 0x5c,0x84,0x68,0x65, 0x09,0xa9,0x1b,0x69, + 0x54,0x87,0x67,0xc4, 0x47,0x41,0x3d,0xdf, 0x76,0x7d,0x2d,0x97, 0xbf,0x9d,0xb6,0x49, + 0xef,0x8d,0xf5,0x0f, 0xc2,0x71,0x8b,0x0b, 0x5f,0xa2,0xfd,0x7d, 0xfe,0xe7,0x67,0xd7, + 0x9d,0x5b,0xb9,0x1a, 0x4e,0x82,0xf3,0x87, 0x47,0x51,0x10,0x37, 0xda,0x2c,0x62,0x76, + 0x92,0xed,0xf9,0x9d, 0x8d,0x5e,0x05,0x03, 0x39,0xcf,0x61,0xa8, 0x3a,0xff,0x63,0xa9, + 0xb7,0xf3,0x75,0x2f, 0xbb,0x6c,0x37,0x11, 0x15,0xbb,0x36,0x47, 0xec,0x2b,0x6c,0xc7, + 0xb5,0x29,0x5d,0x9d, 0x06,0x13,0xdc,0x71, 0x06,0x2a,0x98,0x23, 0x35,0xa1,0x7e,0x8d, + 0xb5,0x52,0xbd,0x36, 0xfa,0xc3,0x79,0xf5, 0x76,0x9e,0x4f,0x7f, 0xe0,0x76,0xbe,0x54, + 0xbf,0xc0,0xf3,0x6b, 0xea,0xfb,0x49,0x6d, 0xc9,0x0d,0xbb,0xa1, 0x60,0x9b,0xb8,0x06, + 0x76,0x83,0x80,0x84, 0x04,0xe3,0x5c,0x07, 0xb5,0x67,0x5b,0xee, 0x64,0xe2,0x9b,0x46, + 0x9a,0xf0,0x4d,0xc6, 0x36,0x0c,0xde,0x21, 0xc2,0xd8,0xbd,0x66, 0xb6,0x4d,0x7d,0x1a, + 0x01,0x8e,0x3a,0xa7, 0x36,0xe3,0x01,0x67, 0x62,0x51,0xc8,0x7f, 0x55,0xe3,0x72,0x7c, + 0x8f,0x6e,0x0d,0x65, 0x92,0x44,0xa5,0xa5, 0x6f,0x9f,0x38,0xda, 0x24,0xf4,0xa0,0x22, + 0x4d,0xc2,0x98,0x80, 0x72,0xb3,0x05,0xed, 0x00,0xc4,0x30,0xa2, 0x85,0xda,0x2a,0x3a, + 0x9d,0xdf,0x07,0xcb, 0xd3,0xf6,0xde,0x61, 0xd4,0xd9,0xfa,0x1f, 0x5b,0x2b,0x26,0xe8, + 0xbb,0x3e,0xff,0xec, 0xea,0x78,0xdc,0x4a, 0x12,0x03,0xaa,0xd7, 0x5f,0xf6,0xf6,0x0d, + 0xaf,0x71,0x6f,0x15, 0x4f,0x1d,0x5e,0xd6, 0x67,0x45,0x91,0x4a, 0xa4,0x1b,0xc7,0xa2, + 0x18,0xc9,0x35,0xcd, 0xfd,0xf5,0x5e,0x66, 0xea,0x06,0xf2,0xde, 0xf2,0x09,0xaf,0xc3, + 0xa4,0x13,0x64,0x5f, 0xc4,0x28,0x85,0xec, 0xbe,0xde,0x67,0x1f, 0x7c,0xf5,0x7c,0x7e, + 0xd6,0xbd,0xc0,0xc3, 0x1b,0xb7,0x3c,0x69, 0x97,0x1c,0x97,0xfa, 0xf5,0xd3,0x2e,0xe2, + 0x81,0x44,0xb1,0x07, 0x29,0x22,0x8b,0x14, 0x50,0x4c,0x1a,0x35, 0x46,0x42,0xf7,0xda, + 0x2e,0xe8,0xea,0x38, 0x7c,0x3d,0xff,0x3b, 0x56,0x8d,0x70,0xf9, 0xeb,0x4c,0xc3,0xb0, + 0x1d,0x8e,0xd2,0xc7, 0x95,0x87,0x8c,0x1e, 0x81,0xe6,0x6f,0x63, 0xe8,0x6f,0xaa,0x0e, + 0x63,0xdc,0x71,0xbd, 0xb6,0xfa,0x8a,0xee, 0x1b,0x6a,0xd3,0x1b, 0x43,0x1a,0xcf,0x35, + 0xa3,0xfb,0xb9,0xdb, 0xef,0x2e,0xc6,0xf9, 0xbd,0xaa,0x6d,0x69, 0xb3,0xde,0x7f,0xc1, + 0x61,0x7b,0x99,0xcd, 0x58,0x56,0xd7,0x18, 0x4b,0x92,0x25,0xce, 0x00,0xed,0x6b,0x23, + 0x46,0x77,0x43,0x7d, 0x29,0x22,0x3b,0x09, 0x3c,0x86,0x34,0x08, 0x2d,0x64,0xe9,0x7d, + 0x93,0x2c,0xbb,0x25, 0xa8,0xb9,0xb3,0x05, 0x9b,0x8e,0xdd,0xf0, 0xbd,0x29,0xe2,0xd2, + 0x11,0xf6,0x39,0x08, 0x36,0x87,0x8b,0x47, 0xd2,0x62,0x98,0xd0, 0xf4,0x0e,0x0c,0x2f, + 0x79,0x1e,0x56,0x65, 0xcd,0x3e,0x17,0xbb, 0x81,0x1d,0x5e,0xc7, 0x3f,0x8d,0xb3,0xf2, + 0x8f,0x46,0xf8,0xf9, 0xb4,0x51,0x41,0x44, 0x8c,0x77,0x85,0x0d, 0xf9,0x43,0x4c,0x89, + 0xcb,0x49,0x3a,0xa2, 0xed,0xa9,0xc8,0x22, 0xd1,0xc7,0x0c,0x9a, 0x70,0x32,0x78,0x4f, + 0x12,0x6c,0xd9,0xea, 0x1a,0x26,0x90,0x28, 0x8b,0xca,0x1c,0x3e, 0xf1,0xd3,0xae,0xa4, + 0x5e,0x1b,0x97,0x2c, 0xb7,0x17,0x71,0x52, 0x2b,0x55,0x28,0xce, 0x90,0xe1,0xcc,0x2a, + 0x81,0xfa,0x3d,0x9e, 0xcb,0xa5,0x5d,0x9f, 0x6a,0x50,0x66,0x19, 0x08,0x74,0x73,0x66, + 0xde,0xd4,0xa4,0xf3, 0xa9,0x93,0x5f,0x96, 0x67,0x59,0x9d,0xf4, 0xe1,0x7c,0xc6,0x0f, + 0xeb,0x9f,0x23,0x52, 0xa6,0x34,0xef,0x92, 0x92,0xed,0x42,0x3f, 0x7f,0x93,0x66,0xaa, + 0x1d,0x09,0x5a,0x5b, 0xee,0xc3,0x42,0x38, 0xba,0xb7,0x9f,0xe0, 0x49,0xc8,0x6d,0x33, + 0x97,0xaf,0x99,0xe2, 0xe6,0x35,0x42,0x94, 0x9a,0x96,0x9a,0xf9, 0x73,0x1c,0x49,0x77, + 0xf6,0x75,0x9a,0x71, 0x6b,0x45,0x63,0x07, 0xcf,0x71,0x6d,0x12, 0xf7,0x48,0xdc,0x97, + 0xd7,0xfb,0xb6,0xde, 0x46,0xff,0x85,0x99, 0xe0,0x24,0x53,0x5b, 0xc3,0x81,0x69,0x46, + 0x81,0xef,0x66,0x60, 0x23,0x7c,0x06,0x6b, 0x7c,0x9b,0xd8,0x98, 0x3a,0xf0,0xaf,0xcd, + 0x2c,0x72,0x6e,0x44, 0x1c,0xe5,0x1d,0x5f, 0x4b,0x05,0x3c,0x54, 0x92,0x7c,0xdb,0x32, + 0x8e,0x57,0xeb,0xd0, 0x66,0xc7,0x2a,0x61, 0x39,0x68,0xd1,0xf2, 0x23,0xe2,0x44,0xc9, + 0x93,0x92,0xef,0xed, 0x75,0xae,0x0a,0x53, 0x20,0x41,0xb5,0x31, 0x00,0x23,0xb8,0x4a, + 0x8e,0x2a,0xc9,0x5b, 0xc1,0x7b,0x42,0x0c, 0x79,0xdc,0xfa,0x51, 0xdc,0xcc,0x74,0xf3, + 0xb6,0xe4,0x26,0x80, 0x54,0x61,0xc8,0x79, 0xa6,0xf3,0x07,0x92, 0xc2,0x79,0xb9,0x7f, + 0xb3,0x77,0x7e,0xd6, 0x05,0x4c,0xa4,0x23, 0x59,0x11,0xa8,0xb9, 0xe3,0xca,0xdc,0xba, + 0x5a,0x2b,0xe2,0xd0, 0x56,0x66,0x43,0x75, 0x6b,0x0d,0x0b,0xf8, 0x9f,0x7b,0x12,0xae, + 0xe5,0x46,0x39,0x05, 0xcf,0xb4,0xe6,0x00, 0xae,0x46,0xa4,0xb4, 0xd4,0x34,0xde,0xe2, + 0x2a,0x91,0x24,0xbb, 0x43,0x3f,0x03,0x45, 0x0b,0x0d,0x5d,0xd2, 0x47,0x69,0xa9,0xae, + 0xdf,0x5e,0x91,0xa1, 0x5b,0x0d,0xb3,0xce, 0xcb,0x5c,0xaa,0x4c, 0xcb,0xd7,0x6a,0xc4, + 0xd9,0x2e,0x9b,0x89, 0xdb,0xe6,0xf1,0x1d, 0x79,0x99,0xd7,0x10, 0x6a,0xd5,0xb4,0xb3, + 0x9d,0x55,0x8a,0xa6, 0xc7,0x13,0x33,0x45, 0xaa,0xdb,0x06,0x2d, 0x28,0x94,0xb2,0x0f, + 0x0b,0xd4,0xdb,0xc4, 0xdc,0x7d,0x64,0x87, 0x27,0x79,0x85,0xe9, 0xd9,0x95,0xb2,0xbf, + 0xd0,0x8f,0xea,0x79, 0x7a,0xec,0x58,0xb0, 0x29,0x12,0x2f,0xf8, 0xe8,0x33,0xaf,0x87, + 0x0c,0xb7,0x24,0x62, 0x11,0xbe,0xf6,0xcb, 0x4e,0xbf,0x9c,0x6c, 0xa2,0x86,0x4b,0x2d, + 0x35,0xb9,0xf2,0xd5, 0xfa,0x8b,0x5c,0xb6, 0xb9,0x6a,0x9a,0x71, 0x43,0x65,0x6e,0x10, + 0x32,0x48,0xd2,0x7d, 0xc3,0x79,0xa4,0x30, 0x1a,0x3b,0x45,0xc6, 0x6f,0xd1,0xe6,0x38, + 0xc6,0xaa,0x06,0x73, 0x69,0x3f,0x35,0x4a, 0xb7,0xe2,0xcc,0x95, 0x5b,0xe9,0x1c,0x2f, + 0xe2,0xe3,0xfc,0xc6, 0x23,0x87,0x39,0xae, 0x72,0x5b,0xbd,0xf2, 0xd9,0xeb,0x33,0xdc, + 0xd9,0xb4,0x3d,0x07, 0x8f,0xf2,0x24,0x44, 0xf0,0xad,0xd8,0x5b, 0x7e,0x40,0x3c,0xc8, + 0x70,0x84,0xc7,0x5c, 0xd4,0x1a,0x93,0x62, 0x0a,0x8a,0x0d,0x2e, 0xf1,0x5d,0x32,0x9d, + 0x07,0x05,0xc6,0xdd, 0x04,0x9e,0x90,0xb2, 0x5c,0x82,0x46,0x07, 0x8e,0xfd,0x9e,0xbd, + 0x8e,0xac,0x83,0x09, 0xba,0x6b,0x4b,0x62, 0xa6,0xd9,0x65,0x1e, 0x1d,0x2b,0xe5,0x65, + 0xd7,0xd4,0x9d,0x17, 0x1d,0x8c,0x92,0xa3, 0xed,0xf4,0xd8,0x02, 0x2d,0xc6,0xef,0x9a, + 0xd6,0xfb,0x50,0xe4, 0xd1,0xd5,0x9b,0xc9, 0x3e,0xb2,0x5a,0x61, 0xe3,0x6f,0xd5,0xf4, + 0x0b,0xa3,0xce,0x07, 0x36,0x17,0x71,0xe9, 0xb8,0x21,0x25,0x7c, 0xf2,0xe2,0x20,0xe7, + 0xbe,0x73,0xb5,0x5c, 0x0c,0xb2,0x2d,0xba, 0xa0,0x0a,0x1e,0x3b, 0xaa,0x54,0x97,0x3e, + 0x47,0x71,0xd9,0xdd, 0x53,0x6e,0xdc,0x37, 0xcb,0x6c,0x2f,0x65, 0x65,0x9a,0x3c,0x08, + 0x48,0x93,0x3a,0x17, 0xfe,0x13,0x5a,0x39, 0x50,0x19,0xf3,0x3c, 0xce,0x77,0x51,0xdb, + 0xc9,0x78,0xc0,0xb4, 0x47,0x44,0xe3,0xe4, 0x26,0x51,0x47,0x52, 0xb2,0x0d,0x68,0xd5, + 0x4d,0x8a,0x67,0xfe, 0x61,0xba,0x1e,0xed, 0xbb,0xd7,0x5c,0xcf, 0x7c,0x67,0x51,0x2d, + 0x13,0x1c,0x83,0xdb, 0xe3,0x50,0x21,0x52, 0xd8,0x9d,0x06,0x79, 0x65,0xa9,0xcb,0xa3, + 0x6c,0x77,0x82,0xd0, 0x77,0x8f,0xac,0xde, 0xef,0x65,0x6e,0x05, 0x38,0xf9,0x53,0x62, + 0x56,0xa1,0x62,0x91, 0x8b,0x2f,0x1f,0xd6, 0x6b,0xb8,0x8c,0x71, 0xda,0xf1,0x75,0x79, + 0x5b,0x79,0x5e,0x90, 0xbb,0xed,0xb4,0x20, 0x89,0xdf,0x82,0x74, 0x2e,0x71,0x6d,0x36, + 0x11,0xba,0xff,0xc4, 0xe1,0xb6,0x4e,0x70, 0x33,0x5a,0xc1,0x8d, 0x94,0xbc,0x34,0xd7, + 0x4e,0x31,0x1e,0x9e, 0x1e,0x62,0x45,0x07, 0x6a,0x59,0x24,0xce, 0x95,0xc6,0xb8,0x34, + 0x89,0x5a,0x6c,0x31, 0xbd,0xd4,0xf8,0x89, 0x57,0x24,0xfb,0xd2, 0x2c,0x92,0x47,0x71, + 0x5f,0xb1,0x5e,0xd3, 0x59,0x77,0xd5,0xd5, 0xd7,0x59,0x07,0x94, 0xb9,0x17,0xc3,0xce, + 0xf2,0xce,0x0a,0xe1, 0x7d,0xbc,0x5a,0xa4, 0xf0,0xf9,0x7c,0x69, 0x0d,0x7e,0xb9,0x3b, + 0x8b,0x29,0x93,0x52, 0xeb,0x17,0x4d,0x96, 0xfa,0xa0,0x5e,0x98, 0xe7,0xe1,0x2a,0x7e, + 0xd1,0xb4,0xd1,0x41, 0x7f,0x2f,0x74,0xcd, 0x49,0x8a,0x60,0x99, 0x7d,0x8a,0x01,0xc9, + 0x94,0x2e,0x50,0xc8, 0x21,0xdb,0x2c,0x3a, 0xbc,0x2c,0x18,0x46, 0x75,0x34,0xe9,0x96, + 0x69,0x84,0xeb,0x35, 0x61,0x49,0x2c,0x11, 0xe9,0x13,0x04,0x1d, 0xb4,0x75,0xf4,0x0f, + 0x88,0xa8,0x38,0x79, 0x8c,0x7b,0x2b,0xba, 0xf7,0x51,0x7a,0xa9, 0x81,0xbb,0xe8,0x8a, + 0x7c,0xb3,0x75,0x7b, 0x6f,0xd8,0x0f,0x4b, 0x04,0xc0,0x71,0x7e, 0x33,0x7a,0xd3,0x7d, + 0x2a,0x7b,0x15,0x8c, 0x9a,0xf8,0x5c,0xea, 0x46,0x92,0xe8,0x10, 0xc4,0x08,0xed,0xc1, + 0xd0,0x0e,0x1a,0xc9, 0x05,0xa1,0x56,0xc5, 0x19,0xc2,0x7c,0x68, 0xf8,0xf7,0xa2,0x5f, + 0xf6,0xfb,0xd7,0xf6, 0x53,0x96,0xbd,0x69, 0x1d,0x9d,0xdb,0x2d, 0xb4,0xc4,0x9b,0xdf, + 0xc5,0x47,0xeb,0x4a, 0x26,0xf4,0x66,0x52, 0x37,0x37,0xdc,0xda, 0x49,0x7b,0x3b,0x3b, + 0xec,0xcf,0x57,0x61, 0xd0,0x3b,0xfb,0x3d, 0xb0,0xa4,0x91,0xe8, 0xdc,0x62,0x43,0xd8, + 0x4a,0x77,0x88,0x73, 0x01,0xdb,0xd8,0x2d, 0x78,0x1b,0x5b,0x8d, 0x43,0x86,0x09,0xc9, + 0x4a,0x67,0x28,0xc9, 0x95,0x91,0x89,0x66, 0x5d,0x9b,0xae,0x38, 0xb2,0xc9,0x58,0xa0, + 0x47,0x6d,0x6b,0x85, 0xf8,0x72,0x41,0xd4, 0xf6,0x72,0x02,0x49, 0x23,0x35,0x30,0x91, + 0xa8,0x1f,0x17,0x52, 0xf5,0xcc,0x63,0xd9, 0xbb,0x8e,0x64,0x17, 0x88,0x9a,0xda,0x7c, + 0x2d,0x92,0xa2,0xcd, 0xf6,0x4b,0x70,0x21, 0x7e,0xb8,0xfb,0xd2, 0x4b,0xcd,0xb9,0x90, + 0x21,0x12,0x19,0x4d, 0x18,0x47,0x47,0x29, 0x5b,0xab,0xf5,0x26, 0x47,0xdf,0x83,0x03, + 0x3b,0x5c,0xff,0x49, 0x9f,0x36,0xff,0xcf, 0xa1,0x1d,0x03,0xd2, 0xbf,0x9f,0x85,0x6d, + 0x18,0xbc,0x80,0xbc, 0xf7,0x27,0xfd,0xf3, 0xdc,0xa0,0x0d,0x61, 0x3d,0x81,0x84,0xe1, + 0x38,0x1f,0xba,0x3c, 0xab,0xbf,0xed,0x87, 0xd9,0x84,0xaf,0x6a, 0x43,0x9e,0xc1,0xf4, + 0x3e,0xbb,0x50,0x35, 0xd5,0xd3,0xf4,0x5b, 0xf8,0x91,0x8c,0x50, 0x27,0xdf,0xa9,0xf1, + 0x38,0x32,0xeb,0x72, 0xe2,0xf2,0x3c,0xb7, 0xdd,0x65,0xd3,0x6a, 0xcc,0xec,0x9e,0x44, + 0xb3,0xd7,0xd8,0xd8, 0x78,0x8d,0xe9,0x18, 0x6c,0x7e,0xb3,0xe7, 0xc6,0x31,0xe7,0xc8, + 0x5c,0x2f,0xe9,0xe4, 0x76,0x14,0x1e,0x5f, 0x6d,0x97,0xc3,0xe9, 0xd5,0xe3,0xbd,0x03, + 0x4b,0xa3,0x3d,0x9e, 0x7f,0x26,0xe6,0x9e, 0x08,0x76,0x30,0x55, 0x33,0xf0,0x84,0x63, + 0x9b,0x6d,0xf0,0xc4, 0xd6,0x4a,0x09,0xf5, 0x8e,0xeb,0x39,0x97, 0x7c,0xf8,0x0c,0xcc, + 0xc2,0x45,0x03,0x04, 0xcc,0x9b,0x3d,0x9f, 0xa3,0xde,0xf6,0x2b, 0xf3,0x97,0x5c,0x0f, + 0xc6,0x40,0x32,0xb9, 0x85,0x55,0x41,0x96, 0x0e,0xa6,0x9d,0xf3, 0x8a,0x21,0xe5,0x4d, + 0x6c,0x28,0x55,0x8b, 0x48,0x00,0x2d,0x2b, 0x12,0x6b,0x43,0xb3, 0x3a,0xc3,0x7c,0xe2, + 0x08,0x16,0xa9,0xbb, 0x96,0xb7,0x58,0x0d, 0x8c,0x2c,0xa7,0x5c, 0x0f,0xc9,0x7b,0x12, + 0x8a,0x0f,0x2e,0xf5, 0xa0,0x8f,0xa4,0x43, 0x9f,0x41,0xe3,0x72, 0xf4,0x06,0x64,0x9a, + 0x3f,0x82,0x9f,0x89, 0xf8,0x5a,0xdf,0x60, 0xad,0xbf,0x90,0x6c, 0x0b,0x84,0x8a,0xfd, + 0x23,0xde,0x15,0x57, 0xc0,0x85,0x0e,0x2b, 0xe2,0x33,0x2d,0xa5, 0x8e,0xba,0xa4,0x33, + 0x06,0xdd,0x43,0x7c, 0x39,0xb3,0xf9,0x7e, 0x0e,0xaf,0x55,0xc0, 0xe8,0xf4,0x5b,0x09, + 0xbe,0xde,0x8f,0xab, 0xde,0xf3,0x3c,0xeb, 0x3b,0xb5,0x47,0x2b, 0x95,0x88,0xd8,0x7b, + 0xc0,0xe2,0xd3,0x18, 0xa2,0x53,0x2a,0x90, 0x93,0xde,0x45,0x0e, 0x71,0x3e,0xd7,0x06, + 0x85,0x32,0x98,0xd3, 0xb4,0xfd,0x6e,0x3b, 0xeb,0xce,0x2b,0x57, 0xcc,0xf4,0xf6,0x99, + 0x1d,0x5e,0xc6,0xde, 0xb3,0x76,0xe4,0x63, 0x05,0x4c,0x3c,0x25, 0x6b,0x1c,0x90,0xc9, + 0x4a,0xa6,0x8b,0xed, 0x6d,0x69,0x4b,0xa5, 0x6c,0xf4,0xc0,0xeb, 0xfc,0xe8,0x3f,0x02, + 0x5a,0xa6,0xac,0xb3, 0x30,0x0c,0x1e,0x6f, 0xef,0x54,0x48,0x9c, 0x10,0x62,0x7f,0x9c, + 0xe5,0xf5,0xae,0x1d, 0xe6,0x66,0x0a,0x05, 0x5e,0x23,0x3c,0x92, 0x68,0x31,0xd3,0x37, + 0xf1,0xb8,0xaf,0xdc, 0x24,0x66,0x65,0x57, 0xd9,0xee,0xed,0x92, 0x9b,0x8d,0xda,0xf9, + 0x3f,0x2b,0x51,0x83, 0xf7,0x7b,0xef,0x57, 0x56,0x9e,0x39,0xec, 0x7d,0x60,0x8a,0x4f, + 0xd7,0x83,0xab,0x65, 0x4f,0x4d,0x52,0x0b, 0x0d,0x80,0xb5,0x36, 0xfe,0x97,0x7c,0xad, + 0x8a,0xca,0x65,0x2a, 0x42,0x3e,0x26,0xfb, 0x9f,0xf5,0x83,0xe7, 0x12,0x34,0xb4,0xac, + 0x30,0x58,0x83,0xe9, 0x0a,0xf9,0xc7,0x9e, 0x34,0x14,0xbd,0xe5, 0x8a,0x74,0x85,0xb2, + 0x9d,0x2d,0x57,0x5d, 0x29,0x42,0x98,0x59, 0x3e,0x05,0xcd,0x85, 0xdf,0xd6,0xb6,0x03, + 0xa3,0x1c,0x88,0x28, 0x23,0x87,0x99,0x29, 0x58,0xb7,0xf9,0xe2, 0xb5,0xde,0x04,0xc3, + 0x04,0x0b,0xcc,0x49, 0xb1,0xa2,0x98,0x10, 0xb1,0x25,0x0e,0x87, 0xaa,0x60,0x16,0x9d, + 0xd2,0xd3,0x38,0xbb, 0xff,0xf5,0xeb,0xfb, 0xcb,0x8e,0x0f,0xe8, 0xe1,0x5f,0x5e,0xf9, + 0x78,0xf7,0x1d,0xe7, 0x2f,0x89,0x72,0x75, 0x98,0x50,0x84,0x1c, 0xab,0xea,0x8e,0x2c, + 0x02,0x9b,0x14,0x44, 0x28,0x1b,0x63,0x71, 0xf6,0x82,0xdb,0x5f, 0xd6,0xbe,0x75,0x1b, + 0x38,0x42,0x2b,0xc8, 0xc6,0x61,0x79,0xe2, 0xc1,0x64,0xfa,0xd4, 0x1a,0x1d,0x7b,0x3e, + 0x95,0x2b,0xdf,0x55, 0x7b,0xcc,0xeb,0xa8, 0x0e,0xd9,0x61,0xe2, 0xd6,0x68,0x4a,0xde, + 0xaf,0x50,0x80,0x6f, 0xba,0xd9,0xfa,0x4c, 0xbb,0xca,0xef,0xdc, 0x33,0xc3,0x9f,0xc6, + 0x61,0x23,0xbe,0xa1, 0xc2,0xe5,0x67,0xa0, 0x43,0x39,0xff,0x13, 0xe4,0xca,0x1d,0x00, + 0xf3,0x48,0x48,0x2f, 0x52,0x67,0x76,0xd5, 0xcb,0x69,0x89,0x49, 0x31,0x05,0xc8,0x55, + 0xac,0xc8,0x7f,0x27, 0x6f,0x1e,0x0d,0x55, 0x16,0x9d,0xbf,0x61, 0xd3,0x72,0x9a,0x3c, + 0x9a,0x11,0xdd,0xf4, 0xd2,0xe9,0x46,0x47, 0x45,0xbf,0x71,0xbb, 0xa6,0x6d,0x7e,0x88, + 0xc5,0xa3,0x70,0x44, 0x73,0xdd,0x8b,0xbb, 0xd4,0xb8,0x57,0xdc, 0xea,0xdb,0xca,0xfa, + 0x58,0x52,0x54,0x81, 0x6d,0xfb,0x37,0xa9, 0xd0,0x9a,0x12,0xba, 0xdd,0x6e,0x3a,0xd7, + 0xe7,0x2d,0x02,0x69, 0xaa,0x12,0x21,0x42, 0x83,0x74,0x4b,0xce, 0x67,0x5f,0xf7,0xbd, + 0x8d,0x41,0x52,0x04, 0x8a,0xa9,0xf9,0x54, 0xe7,0xd8,0x45,0x26, 0x91,0x05,0xd5,0xd9, + 0x99,0xad,0x32,0x90, 0x41,0x24,0x17,0x7e, 0x9e,0xa9,0x4a,0x68, 0x9c,0xf8,0x4f,0x26, + 0x85,0xfe,0xbc,0x31, 0xaf,0xd8,0xef,0xe8, 0x21,0x65,0x96,0xd3, 0xc0,0xa8,0x85,0x13, + 0x51,0x0c,0x35,0x3b, 0x47,0x83,0x02,0x9a, 0xfa,0xfb,0x69,0x1c, 0xad,0x23,0xf1,0x16, + 0x46,0xa8,0x85,0x80, 0x64,0x5a,0xee,0x0e, 0x75,0x4c,0x92,0x86, 0xeb,0x22,0x2a,0x72, + 0xbe,0x8d,0x86,0x27, 0x59,0xb1,0xdc,0xca, 0x6b,0x41,0x8f,0xe7, 0xf3,0x40,0x3a,0x42, + 0x0b,0xf9,0x61,0x2c, 0x61,0x52,0x61,0xf8, 0x09,0x1d,0x28,0xe5, 0x61,0x35,0xe5,0x4a, + 0x28,0xc0,0xc7,0x50, 0xd2,0x6a,0x17,0x67, 0xa4,0x28,0x2b,0x67, 0x68,0xbb,0xd3,0x68, + 0xb0,0xfd,0x7c,0x4a, 0x3a,0x88,0xf2,0x77, 0x50,0x58,0x3f,0xe2, 0x17,0x19,0x9a,0x4c, + 0xb0,0xa2,0x47,0xf1, 0x4f,0xe8,0x8f,0xd8, 0x5f,0x86,0x1a,0xa6, 0xb3,0xa1,0xaf,0x68, + 0xf2,0x46,0xb4,0x86, 0xef,0x93,0x3f,0x92, 0x4f,0x86,0x41,0x22, 0x5f,0x38,0x20,0x97, + 0x10,0xb9,0x97,0x05, 0xd0,0x0c,0x28,0x72, 0xdb,0x2b,0xbe,0x7e, 0xb9,0x5c,0xa6,0x94, + 0xe9,0x1d,0x4d,0x40, 0xc2,0x4a,0x4d,0x49, 0x34,0x0d,0x80,0x48, 0x06,0x95,0xa8,0x3e, + 0x2c,0xfc,0x29,0x13, 0xa4,0x8a,0x68,0x86, 0xc2,0x6d,0x16,0xd9, 0x0d,0x17,0x19,0x11, + 0xa7,0x68,0xac,0x0c, 0x15,0x4d,0x32,0x98, 0x8a,0xa6,0x42,0x93, 0x9c,0x19,0xa6,0xa6, + 0x15,0xe6,0x83,0x89, 0x08,0x6d,0x92,0xaf, 0x6e,0x09,0xd2,0x0f, 0x3c,0x12,0x56,0x5d, + 0x48,0x35,0x38,0x66, 0x29,0xd5,0x50,0x5e, 0x0d,0x6e,0xbf,0x2f, 0xc1,0xb8,0xbc,0xae, + 0x8a,0x4b,0x53,0x20, 0x1b,0x03,0xae,0x74, 0x34,0xee,0xe0,0xf4, 0x8d,0x7a,0x84,0x4d, + 0x83,0x69,0xb0,0x1b, 0x3c,0x47,0x59,0x8a, 0x4c,0x1b,0xac,0x9e, 0xe6,0xdc,0x0a,0x4d, + 0x02,0xa2,0x88,0x58, 0x4c,0x09,0xb0,0x84, 0xc9,0x3c,0xe7,0x5f, 0xb4,0x92,0xa4,0xb7, + 0xa1,0x0d,0x13,0xcd, 0xa3,0x65,0x7a,0x05, 0xb5,0x0f,0xd3,0x29, 0xb7,0xd8,0xbb,0x9f, + 0xbd,0x3f,0x5d,0xb5, 0x3a,0x4c,0xe6,0x4b, 0x84,0x50,0xd8,0x26, 0x72,0x8b,0x50,0x06, + 0x89,0x8a,0x82,0x09, 0x38,0xb7,0xe4,0xfe, 0xcd,0x86,0x3a,0xf0, 0xee,0xc8,0xc1,0x62, + 0x43,0x53,0x04,0x73, 0xe4,0x22,0x15,0x7b, 0xef,0xad,0x8d,0x6c, 0xe6,0xe9,0x80,0xae, + 0x8f,0x0c,0x1d,0xa2, 0x47,0x1f,0x9a,0x8d, 0x55,0x18,0x91,0x27, 0xb6,0xb3,0x61,0x5e, + 0x3e,0x57,0x8b,0x95, 0xd0,0x13,0xbd,0xbc, 0x89,0x34,0x71,0x22, 0xbc,0x85,0x43,0x51, + 0xa1,0x7a,0xdb,0xbd, 0x2d,0xdc,0x9b,0xb9, 0xd9,0xcb,0x8f,0xf3, 0xa7,0x3a,0x39,0x22, + 0xbe,0x86,0xea,0x9a, 0x4d,0xc2,0x2a,0x4a, 0x11,0x68,0x47,0xba, 0xba,0x0f,0xb7,0xf9, + 0xf8,0x52,0x46,0xba, 0xea,0xfa,0xdd,0xa0, 0xee,0xa9,0x52,0xba, 0xde,0x17,0xc1,0x73, + 0x57,0x39,0x23,0xb0, 0x09,0x10,0x3b,0xdd, 0x64,0xaf,0x73,0xb7, 0x26,0xf7,0x01,0xd5, + 0x95,0x6a,0x1c,0xe8, 0xab,0x10,0xe7,0x05, 0x39,0x03,0xed,0x34, 0x91,0x74,0x00,0x6f, + 0x3a,0x1c,0x90,0xdc, 0x2e,0x4c,0x80,0xda, 0x22,0x5e,0x97,0xb5, 0xfb,0x5d,0x15,0xd1, + 0x60,0x67,0x09,0x75, 0xa0,0x04,0xfb,0x95, 0x80,0xbc,0x33,0xa9, 0x68,0xd7,0xf1,0xbf, + 0xc4,0x2c,0x7c,0xcc, 0x84,0x89,0x2e,0x52, 0xfe,0x3b,0xda,0xdc, 0xed,0x78,0x57,0x5f, + 0x53,0x97,0x77,0x4b, 0xaa,0xb1,0xcb,0x85, 0x52,0xf9,0x64,0xdf, 0x74,0x6c,0x4e,0x44, + 0xcc,0x2a,0xd8,0x89, 0x9f,0xa7,0xb5,0x7c, 0x53,0x79,0x18,0x20, 0xd8,0xc2,0x84,0x8c, + 0x17,0xc1,0x2e,0xdf, 0xe3,0x3c,0x2e,0x00, 0xc3,0x5a,0xe4,0x2a, 0x29,0x0b,0xc7,0xf2, + 0x01,0xd0,0x9a,0xa8, 0x64,0x7d,0x23,0x19, 0xe4,0xd2,0x05,0x40, 0x3b,0x8e,0x8e,0x32, + 0xf3,0xfb,0xb3,0x5d, 0xa7,0x9e,0xc8,0xa4, 0xe4,0xd8,0xa8,0x28, 0x5b,0x89,0x5d,0xdd, + 0xdc,0xed,0xee,0x9b, 0x28,0x6d,0x31,0x4b, 0xd6,0x91,0x2b,0xaf, 0x36,0x46,0x2f,0xb0, + 0xf1,0xfa,0x5e,0x44, 0xbe,0x27,0x93,0x7f, 0x9e,0x25,0xbb,0x81, 0xd5,0xa9,0x91,0xec, + 0x71,0x96,0x0b,0x45, 0x44,0x40,0x91,0x6e, 0xd6,0x89,0x22,0x5c, 0xe2,0x2c,0x7b,0x1d, + 0x4f,0x3f,0x9f,0x95, 0x75,0xda,0xad,0xba, 0xf7,0x5a,0x64,0x45, 0x50,0x54,0xc0,0x36, + 0x13,0x6f,0xa6,0x4d, 0x56,0x00,0x0e,0x8d, 0xfa,0x01,0x39,0x3e, 0xf0,0xc6,0x1a,0x30, + 0x8c,0xad,0x5b,0xfa, 0xbe,0xec,0x5d,0x0a, 0x83,0x54,0x56,0x26, 0x6f,0x3e,0x27,0x67, + 0x91,0xf1,0xb3,0x7f, 0x57,0x85,0xa7,0xce, 0x33,0xf9,0xf4,0x44, 0xa5,0xa4,0xcc,0x23, + 0xb9,0xdd,0x71,0x26, 0x4d,0x9a,0x72,0x33, 0xa5,0x41,0x26,0x11, 0x80,0x54,0x5b,0xee, + 0xd3,0x50,0x24,0x14, 0x9d,0x17,0x3f,0x99, 0x9b,0x26,0x5e,0x49, 0x8e,0x0c,0x13,0x03, + 0x27,0x45,0x13,0x8a, 0xeb,0x2e,0x3e,0x64, 0x37,0x7b,0xff,0x66, 0xfa,0x61,0x03,0x9e, + 0x55,0x03,0x5f,0xc0, 0xe9,0x0a,0x7d,0x0d, 0x3a,0xee,0x9d,0x82, 0x9c,0x10,0xbd,0x3a, + 0x9e,0xff,0x5f,0x27, 0xa2,0xdf,0x35,0xdd, 0x38,0x5a,0xbe,0x27, 0xf8,0xc2,0x41,0x44, + 0x4f,0x98,0xc9,0xf0, 0xb6,0x61,0x11,0x26, 0xc4,0x56,0xe5,0xf1, 0x06,0xa7,0x58,0x16, + 0x34,0x84,0xf9,0x47, 0x81,0x8c,0x6a,0x18, 0xa5,0xd3,0x72,0x1d, 0x31,0x3c,0x22,0x0e, + 0xe6,0x39,0xfa,0x0c, 0x37,0xdd,0x13,0x9b, 0x2d,0xc0,0x55,0xde, 0x93,0xda,0xc4,0x0e, + 0x12,0xe2,0xf5,0x1c, 0xa3,0x92,0xae,0xef, 0xd6,0xeb,0x75,0x3c, 0xef,0x5f,0xa7,0x6e, + 0xbc,0x51,0xe8,0x00, 0x8b,0x13,0x06,0x30, 0x96,0x88,0x31,0x83, 0x64,0x57,0x56,0x81, + 0x4b,0x4d,0x3d,0xba, 0x81,0xfd,0x62,0xa1, 0x5a,0xaa,0xd2,0x3d, 0x99,0x9a,0x56,0xa4, + 0x72,0x5d,0x83,0xbe, 0xa5,0x90,0x83,0xa3, 0xa5,0xbd,0x59,0x80, 0x4b,0x8e,0x43,0xcd, + 0x2c,0x2a,0xba,0x32, 0x85,0x04,0xa6,0x50, 0x58,0x91,0x65,0x68, 0xfe,0x80,0x73,0xb5, + 0x1b,0xf3,0x9b,0x8c, 0x5f,0xd3,0x1a,0x57, 0xc1,0x42,0xab,0x63, 0x28,0xfb,0xea,0xff, + 0x12,0x9b,0xdf,0x1e, 0xba,0x1f,0x6f,0x56, 0x91,0x6d,0xfc,0x09, 0xe6,0x64,0xaa,0x97, + 0xf4,0xe5,0x6c,0x10, 0x85,0x72,0xe0,0x9b, 0x97,0x71,0x0c,0x3a, 0xf4,0xf3,0xa2,0x18, + 0x98,0x1d,0x56,0x05, 0x2a,0x41,0x17,0x59, 0xf8,0x2c,0x68,0x18, 0x0d,0x0b,0xc3,0x15, + 0xf6,0xb8,0x35,0xe5, 0x28,0x27,0x24,0xef, 0x18,0x02,0x44,0xc7, 0xbc,0x07,0xd3,0xcb, + 0x48,0x67,0x78,0x75, 0xaa,0xe0,0xf0,0x2e, 0x83,0x32,0xe7,0xf4, 0xdc,0x57,0x09,0x27, + 0x45,0xe9,0x7e,0xa5, 0x79,0xc5,0xc7,0x14, 0x96,0xf7,0xa1,0xf6, 0x26,0x30,0xfe,0x7f, + 0x49,0xfd,0x41,0xe4, 0xe6,0x33,0x08,0x01, 0xeb,0xda,0x0b,0x09, 0x77,0x48,0x16,0x0d, + 0xb4,0x6b,0x75,0x97, 0x42,0xb8,0xfc,0x45, 0x30,0x00,0x60,0xca, 0x87,0xeb,0xe8,0xda, + 0x87,0xbc,0x5a,0x61, 0x03,0xcb,0xde,0xf9, 0xbb,0x34,0x27,0x64, 0x2e,0x76,0x47,0x55, + 0x27,0x44,0xb1,0x42, 0x70,0x59,0xf0,0x91, 0x69,0x2a,0x6f,0x63, 0x39,0x08,0x64,0xd3, + 0x23,0xed,0x3c,0xc3, 0x80,0x9f,0x04,0x85, 0x74,0x19,0xf3,0x6c, 0x94,0x63,0x0e,0x22, + 0xed,0x38,0x2b,0x71, 0x19,0x38,0x1e,0xe5, 0x76,0x86,0xc2,0x19, 0x4f,0x49,0x7a,0x10, + 0x85,0xda,0x8e,0xfa, 0x10,0x44,0x9a,0x77, 0x71,0xd8,0xee,0x0f, 0x3f,0xb6,0xea,0xdb, + 0xcd,0xf6,0xa4,0xbc, 0x9b,0x77,0x72,0xed, 0x53,0xf0,0x54,0x38, 0x71,0x01,0xbf,0xda, + 0xc4,0xfb,0xd6,0x33, 0xb7,0xb6,0xbc,0x75, 0x02,0x30,0xf0,0xf5, 0x3e,0x9e,0x86,0x74, + 0x79,0x88,0x13,0xfb, 0xa3,0xd5,0x15,0x7d, 0x11,0x03,0x99,0x53, 0x18,0x80,0x15,0x38, + 0xa0,0x73,0x04,0xe0, 0x54,0x0a,0x65,0x98, 0x5a,0x96,0xd0,0xc5, 0x9c,0xd5,0x15,0xa5, + 0x58,0x06,0x54,0x50, 0x10,0x07,0xbf,0xa0, 0xb0,0x26,0x20,0x69, 0x7c,0xbc,0x78,0xff, + 0x67,0xf5,0xe7,0xe5, 0xcb,0xf0,0x7a,0x70, 0x47,0xd8,0xae,0x07, 0x0a,0xdb,0x2d,0xba, + 0xfc,0x2a,0x21,0xb5, 0xb6,0x15,0x24,0x96, 0x1c,0xf9,0x09,0x08, 0xd7,0xb4,0x85,0x5b, + 0x09,0x18,0x5c,0x36, 0xe5,0x29,0xe0,0x0a, 0x13,0x02,0x50,0x12, 0x02,0x48,0x24,0x50, + 0xe1,0x24,0xe0,0x92, 0x3d,0xb7,0x3d,0x6f, 0x22,0xea,0x88,0xe7, 0xef,0x2a,0xed,0xbc, + 0x55,0xfd,0x3b,0x80, 0x43,0xfc,0xc8,0x09, 0x53,0xc2,0x6f,0x55, 0x7e,0xf3,0xe1,0xdb, + 0xa2,0x94,0x04,0x52, 0x3f,0x81,0x3b,0xd0, 0xaa,0x47,0xbd,0x9d, 0xa6,0x81,0x9d,0x7c, + 0x74,0xd3,0x89,0x07, 0x61,0xdd,0xdc,0xf3, 0xbc,0x16,0xd0,0x3a, 0xaf,0x7b,0x19,0xc2, + 0x24,0x06,0xa6,0x73, 0x5d,0x8e,0xa7,0x13, 0x13,0xb5,0x94,0x7f, 0x09,0xe1,0xd8,0x94, + 0x6e,0x2d,0x1d,0xfc, 0xd3,0xac,0x8d,0x8b, 0x24,0xe2,0xd1,0xc7, 0xd5,0x0b,0x18,0x05, + 0x7b,0x03,0x00,0xc3, 0x06,0x6c,0x19,0x26, 0x8e,0x77,0xa4,0x1e, 0x13,0x62,0xad,0x91, + 0x91,0x90,0x9e,0xb1, 0x25,0x6a,0x55,0x85, 0xb3,0xf5,0xd7,0x01, 0x42,0x60,0x41,0xc1, + 0x83,0xc3,0x5b,0xbc, 0x76,0x98,0x30,0x48, 0x3c,0xe9,0x5f,0xf4, 0xba,0x59,0x5e,0x2e, + 0x26,0xbe,0xfe,0xc2, 0xbd,0x07,0x97,0x90, 0x28,0x19,0xd8,0x76, 0x98,0xd5,0x15,0x69, + 0xb2,0x02,0xb5,0xed, 0x9b,0xf5,0x7e,0x51, 0xb5,0x11,0x41,0xf1, 0xed,0x9c,0xc7,0xb6, + 0x55,0xed,0x65,0x77, 0xe8,0xd9,0x24,0xfd, 0x7a,0x79,0xee,0x5e, 0xfa,0xb9,0xf5,0xf5, + 0x1b,0xeb,0xc6,0x7f, 0xbf,0xec,0xba,0xde, 0xc6,0xa7,0xa0,0xeb, 0xea,0x9e,0xcd,0xb0, + 0xec,0x06,0x9b,0x01, 0xb0,0xcf,0xb4,0x88, 0x77,0x12,0x92,0x90, 0xd1,0xba,0x47,0xf8, + 0x94,0x43,0x41,0x4b, 0x53,0xc9,0xc0,0x40, 0x00,0x88,0x10,0x81, 0x08,0x4c,0x64,0x02, + 0x11,0x01,0x11,0x59, 0x0d,0x09,0x00,0x04, 0x02,0x51,0x32,0x6d, 0x02,0x68,0x84,0xc5, + 0x33,0x70,0xd0,0xc0, 0x10,0x90,0x40,0x84, 0x81,0x42,0x08,0x84, 0x88,0x21,0x21,0x0c, + 0x92,0xce,0x66,0x43, 0xc1,0xdf,0x28,0x81, 0xc4,0xbf,0x1d,0x2d, 0xf5,0xfe,0x18,0xba, + 0x05,0xbd,0x2d,0x5a, 0x8b,0x02,0x5a,0x88, 0x1c,0xb3,0x84,0x2a, 0xb5,0xd0,0x71,0xc5, + 0x55,0x0c,0x16,0xf1, 0xe6,0xb7,0x6c,0x4a, 0x73,0x61,0xbc,0xbd, 0x74,0x4c,0x0d,0x84, + 0xe6,0x08,0x26,0x95, 0x0e,0x84,0x38,0x7b, 0x1e,0x6c,0x90,0x5f, 0x41,0x6a,0x58,0x6c, + 0xae,0x50,0x9e,0xb7, 0x0a,0x3c,0x8b,0xd5, 0x8b,0x8e,0xda,0x45, 0x00,0x0a,0x50,0x0c, + 0x92,0xb3,0x5a,0xfd, 0xa7,0x82,0xd7,0xcd, 0xeb,0xcd,0x82,0xaa, 0x8c,0x63,0xda,0xbd, + 0x49,0x06,0xd4,0x71, 0x9c,0x0b,0x0e,0x8e, 0x8b,0x6c,0xc4,0x46, 0x26,0xe1,0x74,0x34, + 0x66,0x0d,0x14,0x0c, 0xa9,0x9f,0x69,0xe3, 0x1e,0x68,0x7d,0xc0, 0xe7,0xa8,0xeb,0x10, + 0x93,0x3c,0x99,0xc8, 0x30,0x6e,0xce,0x8d, 0xac,0xfa,0x6e,0xfb, 0xaf,0xcf,0x20,0x6d, + 0x32,0x41,0xc0,0x80, 0xa2,0x78,0xe8,0x54, 0x48,0x27,0xf3,0x64, 0xa4,0x95,0x02,0x22, + 0x7d,0xf7,0x5f,0x9e, 0xe5,0x37,0x1b,0x6c, 0x8c,0x08,0x5c,0x54, 0x12,0x17,0x19,0x85, + 0xb1,0x53,0xea,0x1c, 0x0b,0x6b,0x35,0xec, 0x2a,0x41,0x00,0xb9, 0x40,0x13,0x00,0x62, + 0x95,0xdc,0xfc,0xdb, 0x8e,0x25,0x3b,0xa0, 0x5c,0xb4,0x31,0xb1, 0x72,0x55,0x94,0xda, + 0xaa,0x58,0x59,0xc2, 0xc4,0x22,0x40,0x51, 0x40,0x6f,0xcd,0x5a, 0x98,0xaf,0x8d,0x17, + 0xec,0x52,0xd5,0x95, 0xac,0x1d,0x3a,0x98, 0xa1,0x24,0x03,0x15, 0x93,0x6a,0x67,0x0b, + 0x3f,0x28,0x07,0x0b, 0x9d,0xb5,0xae,0xc5, 0x0c,0xd4,0x55,0xbf, 0x9c,0xc2,0x72,0xaf, + 0xa1,0xa7,0xea,0x26, 0xe0,0x81,0x86,0x3e, 0x9b,0x22,0x11,0xd1, 0x5f,0x59,0xf8,0xda, + 0xc4,0x71,0x49,0xc8, 0x77,0x59,0x35,0x07, 0x18,0xfc,0xc4,0x06, 0x65,0x55,0x6d,0xd9, + 0x8d,0xe4,0xc2,0xe0, 0xb8,0x47,0xbd,0x30, 0x2f,0xcd,0x56,0x1d, 0xb1,0x56,0x43,0x49, + 0x9d,0x5e,0xbf,0x4f, 0x95,0x37,0xb4,0x65, 0xff,0xf3,0xfc,0xc3, 0x96,0x3a,0x1b,0x21, + 0x3e,0xb8,0xd8,0xd4, 0xb1,0x8c,0x45,0x30, 0xe6,0x1f,0x7f,0xd5, 0xfb,0x59,0x89,0x04, + 0x40,0xcd,0x83,0x9c, 0x6c,0x73,0x3e,0xc8, 0x60,0x24,0x01,0xdb, 0xcc,0xf4,0x24,0x3f, + 0x3b,0x81,0xea,0xda, 0x5d,0xb5,0x72,0xe3, 0x7e,0xfd,0x93,0x0c, 0x36,0x8b,0xfd,0x76, + 0xeb,0xf2,0x4d,0x1f, 0x77,0xbf,0x83,0xdc, 0xbf,0xce,0xf1,0xf7, 0x70,0x78,0x0c,0x46, + 0x06,0x0a,0x16,0x40, 0xd2,0x6d,0x31,0xb1, 0xe6,0x65,0x76,0x78, 0xa9,0x25,0x75,0xa5, + 0xf4,0x2a,0xac,0x5f, 0x56,0xaf,0x2b,0x54, 0x3f,0x1e,0xc5,0x79, 0xf8,0x86,0x9a,0x73, + 0x1d,0xdd,0x02,0x3d, 0x7c,0xc9,0x80,0x1d, 0xe7,0xc4,0x1a,0x9d, 0x2d,0xd6,0x73,0xe1, + 0x6c,0xb6,0xd9,0x92, 0x28,0x41,0xc6,0x7c, 0x7f,0x6e,0xef,0x33, 0x30,0xf9,0x7d,0x45, + 0x95,0x6a,0xf8,0x9b, 0xf9,0xc4,0x65,0x54, 0x3d,0x3a,0xeb,0x65, 0xfb,0x8e,0x40,0x50, + 0xc8,0x33,0xd3,0x57, 0xb5,0x6b,0xbf,0x83, 0xe3,0x96,0x22,0x29, 0xcf,0x09,0x8b,0x1d, + 0xe2,0xb3,0x0d,0xf8, 0xb8,0xc0,0xa7,0x8e, 0xdf,0xdb,0x6c,0x2f, 0x65,0x5a,0x6e,0xf7, + 0x6f,0xfd,0xba,0x8e, 0x4c,0x09,0xa8,0xd3, 0x76,0x61,0xc1,0x19, 0xe6,0x0c,0xcc,0xdc, + 0xd0,0x7b,0x85,0x97, 0xf1,0xa0,0x7f,0x9e, 0xc1,0xe2,0xef,0x99, 0x8f,0x87,0xa7,0xfd, + 0xfe,0x83,0xa1,0xc1, 0xd3,0x1f,0x57,0xc1, 0xe8,0x45,0x50,0xf0, 0xf1,0x55,0x6b,0xbb, + 0xf2,0xe7,0x78,0x2c, 0x7e,0xce,0x46,0x26, 0x42,0xce,0x2b,0x2b, 0x12,0x62,0x93,0xc6, + 0x8b,0x7b,0x6d,0x05, 0xd7,0xd8,0x73,0x87, 0x89,0xea,0x5a,0x8d, 0x37,0x18,0x70,0xfb, + 0x3d,0xd4,0x3a,0x13, 0x22,0x66,0xab,0x89, 0x13,0xbd,0x24,0x1a, 0x02,0x9a,0x22,0xf0, + 0x1d,0x69,0x56,0x4d, 0xa4,0xd0,0xa5,0x18, 0x1b,0xbf,0x6f,0xa9, 0x29,0xb0,0xc8,0xde, + 0x31,0x54,0x79,0xe8, 0x13,0x86,0x8d,0xc1, 0xf6,0x56,0x13,0x6b, 0xe9,0xce,0x0c,0x44, + 0x6f,0x32,0xd1,0xa4, 0x01,0x1e,0x45,0x6a, 0x70,0x86,0x18,0x1d, 0x69,0x21,0x93,0x8a, + 0x8e,0xfb,0xe4,0x70, 0x95,0x59,0x49,0x85, 0xc9,0xd7,0xef,0xa1, 0x3e,0xc7,0x09,0xa9, + 0x98,0x74,0x3c,0x38, 0x47,0x1a,0x36,0x7d, 0xf7,0x19,0xe8,0x51, 0xc5,0xc5,0x40,0xe6, + 0xf2,0xf0,0x9d,0xc0, 0xa1,0x7b,0xd6,0x62, 0xb7,0xa0,0xae,0x5f, 0xb7,0xbf,0x9d,0xc7, + 0xa9,0xb3,0x26,0x65, 0xbe,0xbe,0x3d,0xa0, 0xeb,0x2c,0x52,0x4c, 0x7c,0x25,0x9d,0xf4, + 0xd4,0xb3,0x99,0xd7, 0x17,0x34,0x32,0xf8, 0x92,0xbb,0x78,0xd6, 0xf6,0x3e,0x5c,0xb7, + 0xf2,0xcc,0xcc,0xf8, 0xef,0x39,0xd7,0x61, 0x7a,0x9a,0xca,0x38, 0x8d,0xb8,0x43,0xe7, + 0x3e,0xa3,0x2e,0x3c, 0x1d,0xf2,0x5f,0x5b, 0x18,0xd7,0x42,0xa6, 0x8a,0xa1,0x91,0xde, + 0xbd,0x8d,0x79,0x7f, 0xc8,0x6a,0x0b,0x79, 0xa4,0xed,0x4a,0x2e, 0xb3,0x34,0x24,0x4a, + 0x75,0xf9,0x57,0x70, 0x66,0xbe,0x0d,0xea, 0x3f,0x15,0x7c,0x56, 0x15,0xea,0x1c,0x05, + 0xfa,0x6b,0x26,0xaa, 0x8a,0x3a,0xe4,0x5b, 0x3d,0x72,0x3a,0xc5, 0x5f,0xce,0xe7,0xdb, + 0x37,0xe2,0xa5,0xb1, 0xf8,0x38,0xdd,0x0d, 0x6a,0x80,0x19,0xf7, 0x2a,0xe2,0xda,0x99, + 0x4e,0xde,0x6a,0xe5, 0xfe,0x7c,0x11,0x4e, 0x80,0x7b,0x0b,0x26, 0x7d,0x36,0xf3,0x30, + 0x36,0xa8,0xc0,0xb4, 0x81,0xa7,0x44,0xdb, 0x67,0xc2,0x13,0x26, 0xe6,0xaf,0x09,0x53, + 0xd7,0x77,0x43,0x11, 0xac,0xed,0x8c,0x33, 0xba,0xf6,0x7c,0xbe, 0xbe,0xae,0xaa,0x8c, + 0xc6,0xf9,0x5d,0x0b, 0xda,0xe8,0x5a,0x9a, 0x97,0x92,0xb9,0xd3, 0xb1,0x20,0x85,0xc7, + 0x87,0xd8,0xb8,0x71, 0x82,0x69,0x31,0xfb, 0x88,0x59,0x1e,0xca, 0xb7,0xdb,0xc9,0xb3, + 0x3f,0xa9,0x52,0x2a, 0xf8,0x38,0xfb,0x5a, 0x8e,0x33,0x67,0x49, 0x49,0x06,0x8a,0x9d, + 0x0f,0x12,0x83,0x9d, 0xff,0x9a,0xe6,0x82, 0x4c,0x33,0x9f,0xd0, 0xd9,0xe2,0xdc,0x0d, + 0xd3,0x8d,0x38,0xc9, 0x80,0xf7,0xbd,0xcb, 0xde,0x29,0x14,0x06, 0x1b,0x07,0xd4,0x37, + 0x74,0x16,0x1a,0x76, 0xe9,0x88,0xf2,0x11, 0x7a,0xa0,0x19,0x1c, 0x81,0xbf,0xdd,0xa8, + 0xf0,0xaa,0x1b,0x5e, 0x3d,0x0d,0x9d,0x8a, 0x48,0x93,0x8f,0xae, 0x13,0x2f,0x20,0x0f, + 0x05,0x63,0x79,0xf2, 0xf7,0xb8,0xcc,0xb5, 0xf0,0x14,0x50,0xfe, 0x86,0x59,0x59,0x30, + 0x90,0x01,0x89,0x31, 0x4b,0xda,0x3c,0x28, 0x9b,0x98,0x31,0x02, 0x4d,0x72,0xaa,0x75, + 0x7f,0xc2,0x92,0x0b, 0x69,0xb7,0xcd,0x42, 0x69,0xd8,0x65,0xea, 0xc6,0xb1,0x60,0xfa, + 0xc2,0x46,0x4e,0xd5, 0x09,0x2e,0xce,0xa7, 0xa0,0x80,0x19,0xef, 0xf2,0x4f,0x4f,0x64, + 0x52,0x13,0xa3,0xc0, 0xd2,0xd2,0x47,0x91, 0xfd,0xae,0xdf,0xb6, 0x5e,0x28,0x3a,0x8d, + 0xb4,0x4e,0x48,0x1d, 0x64,0xda,0x14,0x44, 0x48,0x3c,0x49,0x3a, 0x1c,0xb8,0xb6,0xeb, + 0xee,0x2f,0x53,0x7c, 0xfe,0x8a,0xb6,0x59, 0xbb,0x65,0x7d,0x14, 0x3c,0xbe,0x45,0xbe, + 0xbc,0xd4,0xed,0x5c, 0xef,0x26,0xfa,0x36, 0xab,0xa6,0x19,0x07, 0x0a,0x48,0x30,0xbb, + 0x2f,0xb9,0x4b,0xc2, 0xb0,0xf5,0x50,0xb7, 0x23,0x81,0xaf,0xf7, 0xd6,0xb1,0x73,0x6a, + 0xdc,0x3b,0x9c,0xa7, 0x77,0xa1,0xa3,0x33, 0x3a,0x65,0x1e,0x64, 0x1e,0x14,0x4f,0x3e, + 0xd6,0xf3,0x93,0x6d, 0x32,0xed,0x8a,0x28, 0x13,0xed,0x39,0x01, 0x91,0xba,0xa1,0x0e, + 0x36,0x49,0x63,0xcb, 0x34,0x9e,0x9f,0xc8, 0xfc,0x8c,0x9b,0x8d, 0x0d,0xc1,0x6f,0x8f, + 0x3f,0xef,0x12,0xf8, 0x3b,0xfb,0x92,0x0f, 0x8d,0x55,0x8d,0x8a, 0x07,0xe7,0x36,0x6b, + 0xc2,0x71,0xe0,0x8b, 0x95,0x2f,0x6f,0x71, 0xdd,0xf6,0xd3,0x3e, 0xb7,0x16,0x56,0x86, + 0xc4,0x7a,0xbe,0x9e, 0xae,0xba,0xf0,0xab, 0xe4,0x60,0xfe,0xaa, 0x59,0xb5,0x2d,0x04, + 0x8e,0x3d,0xa6,0x00, 0x44,0x00,0x9b,0x61, 0xe3,0xe5,0x1a,0x52, 0xe4,0xa1,0x96,0x1a, + 0xda,0xdf,0x2b,0x95, 0x39,0x8a,0x95,0x6b, 0x1d,0xfa,0x37,0x6a, 0xc7,0x43,0x83,0xc4, + 0xfc,0xbf,0x6c,0xae, 0xe5,0x7f,0xc9,0x20, 0xb7,0xe6,0x89,0x19, 0x3d,0xb6,0x13,0x5f, + 0x9f,0x17,0x71,0xf8, 0xfc,0x96,0x2e,0xcd, 0x1f,0x96,0xd8,0x62, 0xd2,0x36,0x2f,0x0c, + 0xe6,0x0f,0xd3,0x98, 0xe2,0xa4,0x67,0x12, 0x94,0x18,0xff,0xab, 0xee,0xd1,0x1a,0xb9, + 0x4c,0x77,0x4a,0xcf, 0xcb,0xd1,0xd4,0x89, 0x20,0x36,0xf5,0x19, 0x24,0xd2,0xad,0x2e, + 0xc0,0xb4,0xd2,0xf6, 0xb4,0x51,0xae,0xa6, 0xb8,0x5a,0x46,0x47, 0x01,0x68,0xf0,0x66, + 0x8e,0xa7,0x2f,0x9c, 0x96,0xb0,0xf1,0xb3, 0x3e,0xe6,0xa2,0x6b, 0x43,0x9a,0xc4,0x13, + 0x20,0x17,0x1b,0x63, 0xa3,0x6c,0x52,0x98, 0x40,0xd9,0x3b,0x68, 0x81,0x20,0x42,0x1f, + 0x9d,0x92,0x90,0x92, 0xeb,0x48,0x5e,0x5b, 0x4b,0x91,0x5f,0x47, 0xa2,0xea,0x6a,0x53, + 0x65,0x55,0x10,0x85, 0x4a,0x44,0x85,0xda, 0x05,0x93,0x4c,0x6d, 0x47,0x80,0x4c,0x8d, + 0xd8,0x8d,0xf2,0x69, 0x3f,0x5a,0x46,0xd2, 0xb6,0x1d,0xd4,0x7b, 0x81,0x83,0xf7,0xe1, + 0xa8,0xf7,0x70,0x5c, 0x67,0xf3,0x87,0x4f, 0x4b,0x15,0x75,0x6a, 0x60,0x13,0xdf,0x30, + 0xc8,0xfb,0x73,0x12, 0x1c,0xf0,0x9f,0x44, 0x71,0x56,0x00,0x19, 0xd5,0x54,0xaf,0xcd, + 0xc9,0xb7,0xba,0xc0, 0x90,0x75,0x91,0xb9, 0xdd,0x3d,0xb2,0xbc, 0xf9,0xbf,0xe5,0x68, + 0x87,0x12,0xf5,0x90, 0x6b,0xae,0xd9,0x09, 0x36,0x77,0xb6,0x39, 0xfd,0xbf,0x29,0xa4, + 0x83,0x47,0x6c,0xbc, 0xf7,0x52,0xfc,0xc6, 0x95,0x00,0x26,0x36, 0x66,0xc2,0x3d,0xe0, + 0x26,0x91,0xbb,0x62, 0x48,0xfd,0x2d,0x2c, 0xa6,0x1e,0x0b,0x4b, 0x54,0x30,0x87,0xe7, + 0x56,0x82,0x21,0xde, 0x49,0x04,0x4a,0x08, 0x68,0xff,0x21,0x24, 0x70,0x1a,0x08,0x69, + 0x08,0xf9,0xcd,0x09, 0x4d,0xa2,0x6d,0x54, 0xd0,0x80,0x9b,0x49, 0x25,0x40,0x7a,0xa0, + 0xd2,0x39,0x8a,0xa0, 0x02,0x21,0x7c,0x08, 0x19,0x00,0x53,0x91, 0xcc,0xf8,0xa5,0x6b, + 0x81,0xcc,0x65,0x48, 0x18,0x0c,0x41,0xbd, 0x1c,0x76,0x57,0x3f, 0xcf,0xa8,0xb0,0xa4, + 0xff,0x55,0x19,0xca, 0x9a,0xbc,0xae,0x34, 0xad,0xe8,0x57,0x43, 0xdb,0xe9,0xff,0x48, + 0x86,0x99,0xfb,0xb5, 0xdf,0xa5,0x3b,0x1d, 0x6c,0xd7,0x91,0x14, 0x29,0x5c,0x1d,0x99, + 0x6b,0xf0,0x76,0x72, 0x5a,0xea,0x41,0x6d, 0xa6,0xb4,0xd4,0xdd, 0x46,0xb8,0xdf,0xad, + 0x09,0x8d,0x9f,0x7e, 0x32,0x98,0xb7,0xb8, 0x91,0x7e,0xcb,0x37, 0x00,0xfc,0xae,0x37, + 0x96,0xe9,0xcc,0x57, 0x61,0x55,0x34,0xac, 0x7f,0xa7,0x4c,0xfc, 0xf8,0x18,0x6f,0x1f, + 0x09,0x35,0x60,0x3d, 0x18,0x98,0xae,0x36, 0x26,0x8e,0x8a,0xff, 0x3d,0x96,0x44,0x5a, + 0xd5,0x12,0xb8,0x13, 0xb0,0xea,0x36,0xb1, 0xb8,0xb2,0x60,0x0b, 0x56,0xc0,0x06,0xcd, + 0x53,0x42,0xce,0x30, 0xef,0x5a,0x0e,0xdb, 0x61,0x07,0x32,0x09, 0xa3,0x88,0xc0,0xee, + 0xd8,0x0c,0x62,0x45, 0x66,0x21,0xef,0xe0, 0x20,0x18,0x33,0x19, 0x7a,0x5e,0xc8,0x92, + 0xe8,0xe8,0x8f,0xdd, 0x7c,0xfb,0x48,0x9d, 0x4a,0x32,0xc6,0xbd, 0xdc,0x0a,0xf0,0x74, + 0x5c,0x2d,0xa5,0x6e, 0x50,0xb3,0xdc,0xe2, 0xda,0xf3,0x3f,0x9b, 0x2a,0x98,0x9a,0xe3, + 0xd9,0xd2,0x35,0xd0, 0x8b,0xec,0xf6,0xde, 0xfa,0xc6,0x86,0x93, 0x01,0x5f,0xb0,0xed, + 0x9e,0x04,0xa1,0x61, 0x59,0x85,0xb8,0x36, 0xd0,0x50,0xd2,0xc0, 0x68,0x21,0x83,0x69, + 0x8e,0xf3,0x94,0x21, 0x59,0xd9,0x69,0x35, 0x3d,0x1a,0xb8,0x4d, 0x58,0xbe,0xc3,0xe4, + 0x32,0xff,0xcc,0x3a, 0x06,0x43,0xc2,0xec, 0x73,0x0a,0xb7,0x50, 0xd3,0x99,0x31,0x4f, + 0xba,0x42,0x57,0x75, 0x77,0x13,0xbc,0xab, 0xe5,0xb6,0x0c,0x45, 0x1b,0xa1,0x01,0x06, + 0x07,0x49,0x04,0x12, 0x16,0x90,0xb3,0xf2, 0x1a,0x2d,0xba,0x69, 0xc6,0xa8,0x86,0x96, + 0x04,0x4e,0x45,0x89, 0xd7,0xf9,0xff,0x2e, 0x74,0x24,0xa9,0x5a, 0xa8,0x17,0x81,0xdd, + 0xdf,0x6f,0x2a,0x30, 0x34,0x5d,0x89,0xa3, 0xb7,0xef,0xba,0x5b, 0xd5,0x7f,0xa4,0x31, + 0x34,0xf0,0x93,0x60, 0xda,0x63,0x7d,0xcc, 0x02,0xf7,0x84,0xa0, 0x4d,0x90,0xd7,0x57, + 0x28,0x52,0xa3,0xe1, 0xe3,0x0b,0x41,0xca, 0x06,0x12,0x29,0x42, 0xc9,0x80,0xc8,0xf8, + 0xfd,0x97,0x95,0xde, 0x50,0x91,0x93,0x6e, 0x31,0x73,0x34,0x56, 0x43,0xb4,0xec,0xb0, + 0x6f,0x2b,0x16,0x0c, 0x82,0x09,0xcd,0x75, 0x9b,0xb1,0x6a,0x57, 0xf6,0xab,0x8b,0x12, + 0x13,0xd6,0xde,0xb3, 0x3e,0xed,0x6e,0xdb, 0x12,0x19,0xf5,0x2a, 0x4c,0x25,0x0d,0x08, + 0xb4,0xea,0x60,0xc1, 0x5a,0x20,0x40,0x4d, 0x34,0x08,0x93,0x52, 0x49,0x84,0xe4,0xb5, + 0x6c,0x6e,0x74,0xaa, 0x0b,0x11,0x10,0x51, 0x13,0x27,0x44,0xa9, 0x19,0x45,0x20,0x86, + 0x5b,0x99,0xf3,0x91, 0x48,0x30,0x00,0x40, 0x29,0x54,0x81,0xa2, 0x89,0x07,0x92,0xa5, + 0x53,0x63,0x23,0x30, 0xd0,0x27,0x34,0x92, 0x2b,0xbb,0x89,0xb8, 0x76,0x13,0x51,0x38, + 0x59,0xbc,0x98,0x85, 0x6f,0x53,0x6e,0xdf, 0x93,0x18,0xf4,0xe1, 0xe8,0xf0,0xb7,0x17, + 0x2d,0x5c,0x22,0xd9, 0xb2,0x96,0x16,0xe0, 0x40,0xe4,0x32,0x06, 0x74,0x26,0x2c,0x49, + 0xcb,0xa4,0x80,0x71, 0x34,0x90,0x89,0xaa, 0x02,0x52,0x08,0x24, 0x28,0x32,0x65,0x79, + 0x08,0x9c,0x48,0x24, 0xc0,0x90,0x24,0x2c, 0x44,0xe7,0x33,0x26, 0x21,0xdd,0x50,0x4c, + 0xc2,0x15,0x72,0xa4, 0x10,0x43,0xab,0x99, 0x11,0x31,0x26,0x80, 0xf3,0x93,0x06,0x49, + 0x14,0x33,0x32,0x84, 0x9c,0x2c,0x43,0x00, 0xb3,0x13,0x60,0xc1, 0x1c,0xa9,0x12,0x84, + 0x58,0x9a,0xcd,0x44, 0xa4,0xe4,0xc0,0x32, 0x30,0x1a,0x71,0x21, 0x20,0x27,0x0a,0x15, + 0x91,0x14,0x23,0xba, 0x95,0x0e,0x03,0xb3, 0x39,0x26,0x03,0x74, 0x89,0x92,0xa0,0xab, + 0x59,0xf8,0x73,0xf2, 0xd3,0x6d,0xec,0x4b, 0x3b,0x62,0xcb,0x2c, 0xd0,0xe0,0x8b,0x30, + 0x30,0x76,0xa6,0x50, 0x5b,0x11,0x31,0x95, 0x20,0xa1,0x82,0x49, 0x81,0x75,0x2a,0xc9, + 0xd2,0x4a,0x34,0x2b, 0x83,0x32,0xb5,0xd4, 0xbe,0x6c,0x0a,0x52, 0x67,0x34,0x1d,0x2b, + 0xd3,0xd1,0x12,0xda, 0x6d,0xf6,0xd7,0x85, 0xe2,0x65,0xea,0xe3, 0x75,0xb8,0x17,0xbb, + 0xdd,0xa7,0x63,0xd6, 0xe7,0xec,0x36,0xbc, 0x4e,0xab,0x78,0xd3, 0x4d,0x34,0xd3,0x4d, + 0x30,0xc3,0x0c,0x4d, 0xce,0x83,0x2a,0xfa, 0x34,0x9f,0xc8,0x11, 0xef,0x2b,0x16,0x3d, + 0x9b,0xa8,0x18,0x47, 0x13,0x51,0xce,0x3e, 0x1e,0xbf,0x73,0x6a, 0xdd,0x56,0x2a,0x08, + 0x2d,0x01,0x66,0xff, 0xb8,0x08,0x51,0xdb, 0xc5,0xf7,0x78,0x52, 0x80,0xea,0x15,0xfb, + 0xe4,0x90,0x07,0x91, 0x35,0xe8,0x74,0x16, 0x44,0xfb,0xff,0x5e, 0x51,0x37,0xa3,0x4a, + 0xc2,0xcc,0xce,0x6b, 0x38,0x10,0xb3,0xa8, 0x2a,0xbb,0xc4,0xdd, 0x81,0x04,0x91,0x25, + 0x12,0xad,0x5e,0x76, 0x06,0x0c,0xd5,0x09, 0x84,0xe0,0x1c,0xb6, 0x7a,0xb7,0x07,0x95, + 0x46,0xf2,0x19,0x5f, 0x3d,0x0b,0x41,0x4c, 0x67,0xda,0xd5,0x3d, 0x03,0x3f,0x80,0xde, + 0x5f,0x35,0x70,0x8e, 0x05,0xc6,0x5e,0x09, 0xb0,0x8c,0x8d,0xcf, 0xb8,0x73,0xa4,0x8f, + 0x3d,0x04,0x82,0x29, 0x54,0xbe,0x33,0xef, 0xf4,0x06,0xe3,0x39, 0x41,0xe1,0xaf,0x61, + 0xed,0x35,0x52,0xab, 0x32,0x29,0x9e,0x57, 0xe5,0x06,0x4b,0x06, 0x1b,0x27,0x27,0x81, + 0xf5,0x09,0xd2,0x93, 0xf5,0x58,0xef,0x52, 0xd7,0x9f,0xcf,0x6b, 0xfc,0xd5,0x4b,0x22, + 0x92,0x6b,0x03,0xb7, 0xbb,0xfc,0x7e,0x29, 0x3f,0x50,0x80,0xb1, 0xa2,0xcd,0x66,0xea, + 0x59,0xcd,0xcf,0xc5, 0xbf,0xd4,0x42,0x59, 0xd7,0xc1,0xc9,0x24, 0x6d,0x1e,0xda,0xb9, + 0x69,0x58,0xc9,0x23, 0xe9,0xac,0x30,0x14, 0xce,0x58,0xf0,0xe5, 0x7d,0xd1,0x01,0xf7, + 0xda,0x7d,0x59,0xe6, 0x47,0xc8,0xce,0x3e, 0x30,0xb1,0x68,0xaf, 0xc5,0x16,0x88,0x27, + 0x25,0xa5,0x57,0x55, 0xcf,0x38,0xa5,0xa1, 0xfb,0xc4,0x6b,0xcc, 0xf6,0xd9,0x6f,0xf8, + 0x5f,0x43,0xe6,0x28, 0xfd,0xd9,0xa3,0x39, 0xc4,0x95,0x96,0x8d, 0x8e,0x3e,0xe0,0xe0, + 0x1a,0x00,0xa0,0xc7, 0x9c,0xb4,0x6e,0x76, 0xc0,0x84,0x8f,0x36, 0x8a,0xe0,0x54,0x01, + 0x20,0x81,0x05,0x27, 0x54,0xaf,0xc7,0xee, 0x5d,0x01,0x94,0x36, 0xc4,0x22,0x01,0x02, + 0x05,0x08,0x44,0x20, 0x20,0x04,0x81,0x04, 0x75,0x70,0x36,0xa2, 0xd1,0xa9,0x08,0x80, + 0x40,0x22,0x04,0x00, 0x20,0x42,0x21,0x41, 0x77,0x6a,0x5b,0xcd, 0x30,0x00,0x84,0x88, + 0x8e,0xd1,0x51,0x3f, 0xa0,0xa2,0xc4,0xf6, 0x48,0x06,0xea,0x5d, 0xef,0x51,0xbe,0xf3, + 0x7b,0xa0,0x0c,0x6d, 0x3f,0x43,0xc1,0xee, 0x76,0xda,0x78,0x77, 0x5f,0x06,0x11,0x61, + 0xfc,0x59,0x36,0xb7, 0x3f,0x2a,0x54,0x53, 0x0f,0x53,0xc4,0xae, 0xdc,0x10,0x53,0xc6, + 0xab,0x13,0x9e,0xaa, 0x2d,0x6c,0xb4,0xd7, 0xb4,0x5c,0x59,0xb3, 0xcf,0x70,0xed,0x4b, + 0x05,0x34,0x1f,0xda, 0x80,0xbe,0xe1,0x84, 0x15,0x9f,0xe1,0x86, 0x73,0x2c,0xec,0xdc, + 0xfa,0xb0,0x99,0x11, 0xce,0x74,0x47,0x7e, 0xa9,0x95,0x4c,0x24, 0x2f,0x52,0x61,0xce, + 0xf3,0x2b,0x02,0x54, 0x18,0x35,0x6c,0xba, 0xf3,0xca,0xcb,0x51, 0xa4,0x1c,0x0d,0x40, + 0x50,0x48,0x15,0xce, 0x05,0x39,0x33,0x5f, 0x5a,0x6a,0x31,0x96, 0x35,0x3e,0x7d,0x5d, + 0x48,0x0f,0xd9,0x98, 0xc0,0xf8,0x14,0xa7, 0x51,0xba,0xa5,0xaa, 0x7b,0x61,0x2b,0x80, + 0x18,0xc6,0x59,0x1a, 0xbd,0x25,0x56,0xbe, 0x9f,0x0c,0xb2,0xde, 0xe4,0x3e,0x1e,0xee, + 0x99,0x14,0x78,0x23, 0xb4,0x8d,0x52,0x43, 0x97,0x2e,0x85,0xae, 0xe5,0x9b,0x4e,0x4a, + 0x2e,0x04,0x48,0x83, 0x19,0x31,0xb3,0x9c, 0x18,0x83,0x26,0x24, 0xa4,0xab,0x4c,0xc2, + 0x81,0x86,0xbf,0x4e, 0x8b,0xc7,0x6f,0x31, 0xc8,0xcc,0x14,0x53, 0x9d,0xd0,0xa6,0xdd, + 0xc3,0x77,0x52,0xc6, 0x2d,0x61,0x71,0x61, 0xcf,0x6d,0x55,0x08, 0xeb,0x71,0x65,0x53, + 0x84,0x99,0x00,0x09, 0x62,0x30,0xc2,0x20, 0x08,0x84,0x1e,0xdd, 0x2b,0xca,0xc7,0x98, + 0x52,0xe5,0x88,0xf6, 0x07,0xd2,0x44,0x2b, 0xea,0x3c,0xb2,0xf5, 0x87,0xf4,0xcc,0x45, + 0x74,0xa9,0xe5,0x79, 0x9f,0x3b,0x83,0x00, 0xc2,0x01,0x01,0x35, 0xc9,0xe0,0x08,0xe4, + 0x60,0x1b,0x59,0x8d, 0x43,0x46,0x4c,0xca, 0x52,0xeb,0x1a,0x7f, 0xcd,0x07,0x61,0x7b, + 0xd4,0xea,0xef,0x35, 0xb5,0xf4,0x9c,0x86, 0x66,0x61,0x99,0xcb, 0x17,0xf8,0xb4,0x19, + 0xc4,0x2e,0x4b,0x6b, 0xa8,0xc0,0xd3,0xc6, 0xcc,0xcd,0x5e,0xff, 0xe0,0xfb,0x9a,0xb8, + 0xb7,0xa7,0x46,0x54, 0x1f,0x1f,0x74,0x14, 0x81,0x6b,0x88,0x41, 0x1c,0xdb,0xbb,0xb3, + 0x23,0x5d,0x1b,0xf3, 0xd7,0x67,0x63,0x3d, 0x0c,0x39,0xa6,0x89, 0x00,0x4a,0xc3,0x7b, + 0x13,0xbd,0xf3,0xfb, 0x4d,0x2d,0x63,0x61, 0xd3,0xf7,0x3b,0x2a, 0x3f,0xbb,0x26,0xec, + 0x67,0xbc,0x9e,0xd0, 0xca,0xb2,0x4a,0x8a, 0x51,0x5a,0x57,0xc9, 0x50,0x10,0x3c,0xf6, + 0x0c,0x37,0x7c,0x7a, 0xdc,0x7b,0x36,0xd7, 0x3f,0x80,0x3b,0xcb, 0x0f,0x5e,0xd2,0xac, + 0x46,0x12,0x37,0x54, 0x04,0xc8,0xd0,0x50, 0x32,0xf8,0x99,0x33, 0x65,0x51,0x00,0xe8, + 0x47,0x13,0xcf,0x87, 0x57,0xf1,0xe4,0xa8, 0xcd,0xa9,0xcd,0x1f, 0xf5,0xe1,0xfd,0x77, + 0x8e,0x0c,0x0c,0xdd, 0x51,0x31,0x9b,0x10, 0xc8,0x4d,0xc1,0x83, 0x92,0x0d,0xc5,0x95, + 0xf3,0xbd,0x01,0x96, 0x5c,0x70,0xa9,0x8c, 0xd6,0x49,0x18,0xe4, 0x08,0x06,0xe8,0x5f, + 0xee,0x11,0x20,0x70, 0x75,0x36,0x8e,0xf8, 0x1b,0xdb,0xdf,0x16, 0x6b,0x75,0xe6,0x75, + 0x0e,0x9f,0xb6,0x0f, 0x5b,0x0d,0x54,0x2f, 0x5b,0x20,0xc0,0x7c, 0x0c,0x1e,0x17,0x2d, + 0x65,0x14,0x19,0x35, 0x4c,0xee,0xc6,0xa1, 0x84,0x08,0xc1,0x48, 0xe3,0xa9,0x5f,0xd7, + 0xa7,0x49,0x9e,0x7a, 0x0b,0x33,0x45,0xeb, 0x4b,0x4c,0xeb,0xdd, 0xdb,0xe8,0x26,0x60, + 0x45,0x63,0xbc,0xa0, 0x6e,0x59,0x4c,0xc7, 0x53,0x2f,0x73,0x57, 0x89,0x1f,0x9b,0xa8, + 0xda,0x5f,0x70,0xbe, 0x8e,0x06,0x7e,0xcc, 0xec,0x8f,0xa9,0xaa, 0xef,0xbe,0xe8,0x8c, + 0xd1,0x20,0xcb,0x62, 0x36,0x09,0xb4,0xc0, 0x6d,0xb7,0xce,0x8c, 0x0c,0xa7,0xa4,0x93, + 0xd5,0xd0,0xe8,0x12, 0xf6,0x93,0xb4,0x82, 0x00,0x46,0xa1,0xa8, 0xc6,0x49,0x0a,0x2e, + 0x6e,0x73,0x7a,0xf6, 0xf8,0xf9,0xd3,0xd1, 0x9c,0xc5,0x78,0x18, 0x23,0x77,0x9a,0xa7, + 0x13,0xf4,0xb7,0xb7, 0x68,0x9e,0xff,0x00, 0x53,0x23,0xc0,0xa2, 0x6d,0xd6,0xb4,0x9f, + 0x30,0x50,0x3c,0x1d, 0x53,0x9f,0x37,0xd9, 0xda,0xd9,0x31,0xf7, 0xfd,0x93,0xaf,0x04, + 0x5e,0xb6,0xca,0xeb, 0x9a,0xcf,0xea,0x75, 0xbf,0xc1,0x46,0xae, 0xab,0xfb,0xdb,0xfc, + 0xab,0x95,0x71,0x72, 0x95,0xbb,0x13,0x3e, 0xaf,0xad,0xdf,0x79, 0x5f,0x83,0x71,0x49, + 0xf7,0xec,0x28,0x48, 0x76,0x9c,0x32,0x6d, 0x11,0x6a,0x69,0x24, 0xda,0x7a,0x56,0xa0, + 0x82,0x05,0x0d,0x36, 0xe6,0x43,0x57,0x7b, 0xd8,0x9b,0x11,0x4d, 0x1c,0xc1,0xfd,0x24, + 0xc5,0xe2,0x0a,0x29, 0xe9,0x81,0x09,0x40, 0x5a,0xd3,0x8d,0x98, 0xa1,0xe4,0xc2,0xf1, + 0x9b,0x68,0x6b,0xf7, 0x96,0xeb,0xdc,0x95, 0x29,0xb8,0x6e,0xda, 0x0e,0xe7,0xb8,0x30, + 0x07,0x7c,0x91,0xb3, 0x83,0xba,0x5b,0xad, 0xc2,0x2b,0x37,0x47, 0x97,0xba,0xc3,0x99, + 0x63,0x14,0x20,0x5f, 0x0a,0xb6,0x99,0x96, 0x14,0x39,0xce,0x34, 0xf8,0xfe,0x0e,0x03, + 0xb3,0x11,0x17,0xae, 0xbd,0x8a,0xf1,0x73, 0x06,0x93,0x54,0x8b, 0x57,0xf2,0x22,0x3d, + 0xe4,0xe1,0xfe,0xf7, 0xd2,0xc1,0xcb,0xbb, 0xc9,0xf8,0x76,0x3d, 0xae,0xc9,0xfe,0xf6, + 0xbf,0xfa,0x6f,0x11, 0xad,0xe5,0x48,0x10, 0x01,0x80,0xd0,0x08, 0x1d,0xa8,0x63,0x05, + 0x38,0x81,0x21,0x1e, 0xc9,0xa4,0x8b,0x2c, 0x12,0x0c,0xf3,0x49, 0x0b,0xfe,0x8c,0x4a, + 0x1a,0x48,0xe3,0x6d, 0x23,0xb4,0xfe,0x5f, 0x5f,0x9f,0xe6,0xa8, 0xb0,0x1a,0x71,0x56, + 0x41,0x94,0xe6,0xbf, 0x69,0x25,0x79,0x3f, 0x0f,0x99,0xd2,0x50, 0x06,0x06,0x16,0x74, + 0x2d,0x84,0xb1,0xc1, 0xe4,0xf4,0x18,0x18, 0xdb,0x36,0x67,0x33, 0x8d,0xa9,0xc0,0x50, + 0x86,0xf9,0x63,0x85, 0xc7,0x03,0x8b,0x66, 0xba,0x36,0xf2,0xb4, 0x19,0xe0,0xf6,0xc8, + 0x0f,0x3e,0xd4,0x29, 0x0c,0xec,0x30,0x7c, 0x1c,0xdd,0x97,0x7b, 0x45,0xa6,0xc8,0x36, + 0x1c,0x64,0xe8,0xeb, 0x34,0x27,0x6c,0xf1, 0x9a,0x93,0x5f,0xe3, 0xe7,0x23,0x34,0x54, + 0x61,0x82,0xd8,0x4a, 0x2e,0x4e,0xd2,0xbd, 0x34,0x3b,0x53,0xba, 0x5f,0x29,0x34,0xaa, + 0xec,0xec,0xfd,0xec, 0x3b,0xfc,0xaf,0xab, 0x29,0x05,0x43,0x2d, 0x6c,0xfa,0x2c,0xf5, + 0xe9,0x75,0x46,0x3a, 0x7a,0x6a,0x5b,0xc1, 0x31,0xbb,0x84,0xe2, 0xc4,0xae,0x64,0xde, + 0x13,0xb8,0xf6,0x82, 0xe5,0xf3,0x70,0xa7, 0x7a,0xd9,0x17,0x84, 0x58,0x21,0x3f,0x3b, + 0xde,0x83,0x52,0x68, 0xa1,0x58,0x1b,0x4d, 0x80,0x7a,0x5a,0x65, 0x19,0xab,0x2e,0x62, + 0xf8,0xda,0x49,0x5e, 0x33,0x8c,0x43,0x28, 0x08,0x2b,0x84,0x6d, 0x27,0x10,0xe0,0x5b, + 0xf6,0x2e,0xb9,0x57, 0xf2,0xbf,0x70,0x6c, 0xea,0x0d,0xb3,0x37, 0xe9,0x8c,0x7a,0xbc, + 0x3d,0x63,0x30,0x43, 0x62,0x99,0xee,0xbd, 0xbe,0x8e,0x44,0x3e, 0x99,0x6c,0xff,0x39, + 0x41,0xf9,0x9c,0xb2, 0x39,0x31,0xf4,0x02, 0x20,0x4c,0x20,0xd8, 0xa1,0xb4,0xe3,0x64, + 0x7e,0x07,0xed,0xfb, 0x08,0x25,0x27,0xc3, 0xd7,0xd1,0xe2,0x32, 0x32,0xc9,0x48,0x8b, + 0x0b,0xb4,0x91,0xb4, 0xa5,0x26,0xdd,0x9f, 0x06,0x8b,0xe5,0x0d, 0x5f,0x8d,0xc6,0x75, + 0x8b,0xe8,0x6b,0x12, 0xc2,0x8b,0x8c,0xfd, 0x7c,0xfb,0x90,0xad, 0x37,0xa7,0x99,0xdf, + 0x76,0xb1,0x6e,0xb7, 0x9e,0x10,0xf3,0x1f, 0x17,0x20,0x59,0xda, 0x66,0x22,0x39,0x9c, + 0x36,0xf2,0xe2,0xdc, 0x83,0xb7,0x55,0x45, 0xa7,0xd5,0xeb,0xeb, 0xfe,0x15,0x32,0x65, + 0xf7,0x92,0x18,0xd6, 0xd5,0x65,0xb6,0x23, 0x94,0xea,0xbd,0xc3, 0xe6,0x62,0xc3,0xaf, + 0x66,0x54,0x0d,0xc6, 0x0b,0x61,0x6a,0x44, 0xe9,0xdc,0x0c,0xaf, 0x3f,0xf9,0xbe,0x96, + 0x9d,0xc2,0xc3,0xa7, 0x2a,0x73,0x2d,0xeb, 0x52,0x99,0x6b,0x52, 0xe3,0x0a,0x9b,0xb4, + 0xe9,0x5d,0x66,0x55, 0xed,0xde,0xa5,0x49, 0x9c,0x5a,0x4c,0x75, 0x7a,0x10,0xfe,0x2e, + 0x38,0x6a,0x91,0x84, 0x14,0xa8,0xc3,0xe4, 0xe2,0x69,0x43,0x2c, 0xda,0x53,0x27,0x5f, + 0x4f,0x98,0xfc,0x0f, 0xbf,0x3e,0xf6,0xeb, 0xfc,0xae,0xb5,0x9c, 0x5a,0xf0,0xce,0x86, + 0x11,0x7f,0x83,0x87, 0x63,0xce,0x62,0xc2, 0x21,0xb7,0x66,0xac, 0xef,0xec,0x8f,0x4d, + 0x27,0x2b,0x87,0x2f, 0xd1,0xc6,0xaa,0x35, 0xb0,0xe9,0x77,0x56, 0x1e,0xbb,0x10,0x27, + 0xbd,0xc6,0x8e,0x90, 0xbf,0x7e,0x6d,0x09, 0x3e,0x2c,0xab,0xd4, 0xb8,0xa5,0xc5,0x7e, + 0xa3,0xe7,0x78,0xab, 0x2d,0x34,0x63,0x19, 0xdf,0x21,0xd0,0x7b, 0x5d,0xe9,0xc8,0x1c, + 0x23,0x1f,0x1f,0x4f, 0x75,0xd7,0x35,0x60, 0x64,0xca,0x92,0xb5, 0x6a,0x53,0x55,0x24, + 0xc5,0x80,0x46,0x7f, 0x52,0xbe,0x6e,0xad, 0x52,0x4e,0x82,0x85, 0x2f,0x92,0xc3,0xe6, + 0x0f,0x93,0x0d,0x03, 0xa4,0xee,0xbc,0x12, 0xdd,0xfb,0x53,0x49, 0x6a,0x34,0x98,0xfa, + 0xab,0x5c,0x76,0xc5, 0x96,0x53,0x8c,0x17, 0xc0,0x85,0xb9,0x95, 0xc3,0xd2,0x1b,0xed, + 0x03,0x0b,0xfc,0xac, 0x34,0xd9,0x44,0x8a, 0x0e,0xc2,0xab,0x25, 0x1c,0x28,0x1b,0x7b, + 0x71,0xc4,0x41,0x7b, 0x22,0x04,0xdb,0xe4, 0xf3,0xd0,0x89,0x25, 0x86,0xcb,0xaf,0x4e, + 0x15,0x7f,0x4b,0x06, 0x48,0x78,0x17,0x52, 0xae,0x8d,0x27,0xce, 0x38,0x00,0x40,0x11, + 0x80,0xd5,0x39,0xf8, 0xf5,0x87,0x90,0xd0, 0xd9,0xa3,0x49,0x8c, 0x29,0xe5,0x3f,0x9c, + 0xc2,0x50,0x13,0xcb, 0xac,0xb8,0x74,0x28, 0x53,0x48,0x48,0x45, 0xe0,0x61,0x16,0x20, + 0x56,0x4d,0x5e,0x00, 0x52,0x1b,0x6a,0x61, 0x75,0xb7,0xca,0xa6, 0x3f,0x6d,0xdd,0x97, + 0x0f,0x99,0xeb,0xee, 0x64,0xed,0xe1,0xb9, 0x5f,0xed,0xef,0x2f, 0x77,0x06,0xd7,0x7e, + 0xf7,0x16,0x55,0xe9, 0x58,0xfd,0xdb,0xd4, 0xc2,0x22,0x42,0x3e, 0x7b,0x50,0x9f,0x7c, + 0x7d,0x13,0x9b,0x9e, 0x46,0x12,0x04,0xe9, 0x0d,0x0e,0xe2,0x7f, 0x35,0x42,0x74,0x0d, + 0x4d,0x14,0x4a,0x8f, 0x6e,0x6e,0xfc,0x65, 0x10,0xed,0x20,0x7b, 0x25,0xe7,0xaa,0xb4, + 0x04,0x7e,0x26,0x0d, 0xdf,0x70,0x55,0x62, 0x8a,0x55,0x3c,0x4a, 0xeb,0xb9,0x8d,0x67, + 0x9e,0x11,0xc3,0x54, 0x8a,0x0a,0x40,0x91, 0x76,0x71,0xcb,0x68, 0x29,0xe8,0xe6,0xda, + 0x53,0xc0,0x91,0x57, 0x7b,0xdf,0x4b,0x95, 0x2a,0x3c,0x6c,0x8f, 0xa8,0xb3,0xd6,0xa7, + 0x8a,0xae,0xb5,0x8a, 0x7f,0x7c,0x40,0x7b, 0xd3,0x68,0x40,0x88, 0x32,0xc6,0x46,0xb0, + 0x5a,0x19,0x8b,0xd1, 0xa1,0x8d,0x84,0x5c, 0x13,0x4e,0x09,0x7a, 0x41,0xc9,0x18,0x79, + 0xb4,0x27,0x10,0xab, 0x5d,0xad,0x0c,0x5f, 0xf0,0x5a,0xd3,0x30, 0x26,0xe2,0xb9,0x72, + 0x3b,0x4d,0x12,0x20, 0xc5,0x75,0x6d,0x6f, 0x95,0x59,0x13,0x46, 0xaf,0x9f,0xcb,0x5b, + 0x21,0xfe,0xe5,0x43, 0xf3,0x38,0x02,0x2e, 0x20,0xe6,0x4d,0x93, 0xd9,0xe7,0xf7,0xd6, + 0xcd,0x94,0x15,0x0b, 0x7b,0xa3,0x92,0xa3, 0xcc,0xfb,0x5e,0x8c, 0xc0,0xe2,0x4e,0xf3, + 0xdd,0x68,0xb3,0xba, 0xba,0x7e,0x07,0x14, 0xbd,0x2c,0x08,0x0f, 0xbb,0xf4,0xa8,0xe4, + 0xdc,0xb9,0xf0,0xb6, 0x1d,0xb5,0x29,0xce, 0xf6,0xb7,0x35,0x29, 0xcc,0xfa,0x1c,0x6d, + 0x7d,0xef,0x43,0x24, 0x61,0x90,0x46,0x58, 0xca,0xd5,0xa1,0x80, 0xa8,0x1b,0xd6,0x70, + 0xc8,0x61,0x40,0x55, 0x74,0x33,0x8d,0x53, 0xa5,0xef,0xce,0x71, 0x5f,0x00,0xb3,0xed, + 0x69,0x32,0x9d,0x1e, 0x87,0xac,0xc3,0x61, 0x7e,0xc2,0x10,0xe9, 0x4d,0x9c,0x43,0x4e, + 0x94,0xc6,0x0a,0x67, 0x40,0xe3,0xee,0x96, 0x41,0x35,0x2a,0xbe, 0x6b,0x49,0x12,0x49, + 0x48,0x04,0x20,0xfb, 0x2e,0x3d,0xab,0x4d, 0x44,0x80,0xe9,0x46, 0x42,0x80,0x05,0x15, + 0xc4,0x99,0x08,0x42, 0x41,0x01,0x02,0x01, 0x20,0x40,0x88,0x10, 0x80,0x56,0x12,0xb7, + 0xf2,0x76,0xbd,0x4f, 0x79,0x67,0x71,0xbf, 0xce,0xd5,0xab,0xe8, 0xf7,0x9f,0xdf,0x13, + 0xca,0xc0,0x6a,0xd2, 0x0f,0x16,0xd2,0x15, 0xd5,0xf2,0xbe,0x4b, 0x3f,0x59,0x18,0xdd, + 0xf5,0x41,0xd4,0x94, 0x04,0x04,0x20,0x50, 0x11,0x43,0x69,0x16, 0x61,0x3b,0xf5,0x34, + 0x93,0x99,0xb0,0x73, 0x02,0x41,0x00,0x0a, 0x01,0x40,0x88,0x05, 0x00,0x90,0xda,0x4d, + 0x80,0xd8,0x03,0x60, 0xda,0x4d,0x88,0x1b, 0x40,0x36,0x93,0x06, 0x9b,0x43,0xdf,0x98, + 0xa0,0xee,0x79,0x39, 0x1d,0x55,0x9b,0x26, 0xca,0x9f,0x93,0x54, 0xef,0x4b,0x22,0xb2, + 0xc6,0x84,0xdb,0x69, 0xa6,0x9b,0x43,0xb9, 0xb9,0x4b,0xba,0x2e, 0x4a,0xb0,0x8a,0x63, + 0x98,0x39,0x9d,0x65, 0xa4,0xea,0xc4,0xf8, 0x6e,0xea,0x38,0xfa, 0xee,0x2c,0x3d,0xa3, + 0x71,0x7d,0x8b,0x4b, 0x45,0xd5,0xd3,0xd9, 0x29,0xa1,0xa4,0x26, 0x90,0xd8,0x4c,0x9c, + 0x24,0x12,0x6c,0x7d, 0xf3,0xd9,0xf7,0xde, 0xff,0x68,0x4f,0x53, 0xb2,0xf0,0x7e,0x0d, + 0xce,0x9f,0xe2,0x7d, 0xcc,0xff,0x8f,0x9e, 0x3d,0xe7,0x4f,0x6e, 0xe4,0x31,0xb6,0x10, + 0xbb,0x59,0x40,0x25, 0xac,0x7d,0x34,0x69, 0xe4,0x1e,0x4b,0x52, 0x69,0x73,0x59,0x2b, + 0x5b,0xcb,0x4c,0x0e, 0xa7,0xed,0xeb,0x77, 0x15,0xe8,0x40,0xb7, 0x7d,0x6b,0xe9,0xf9, + 0xed,0x17,0x1d,0xd2, 0xf5,0x5b,0x5a,0xf8, 0xdd,0x86,0x3c,0xa9, 0xd0,0xee,0xf0,0xb0, + 0x25,0x5f,0x06,0xad, 0x33,0x30,0x5d,0xf0, 0x31,0x21,0x10,0x31, 0xb1,0x24,0xd8,0x24, + 0x30,0x6c,0x67,0x96, 0xc4,0x47,0x70,0xa0, 0x4a,0x18,0x9b,0x2a, 0xa3,0xa5,0xad,0x32, + 0x4a,0xe3,0x53,0xea, 0x61,0x61,0xd1,0xd6, 0xd4,0x65,0xee,0x62, 0x76,0x2b,0x49,0x64, + 0x95,0xa0,0xa1,0xf2, 0x9c,0xe4,0x16,0x77, 0x7d,0x47,0x85,0x5b, 0x58,0x19,0xdd,0x28, + 0x75,0xac,0xdb,0x19, 0x69,0x0c,0xae,0xc8, 0x1a,0xd8,0x0e,0x3b, 0xcf,0xc5,0x38,0x94, + 0xd3,0x48,0x44,0xa4, 0xdc,0xa4,0xc1,0x08, 0x14,0x9a,0x91,0x2e, 0x2c,0x6b,0x9c,0xdd, + 0x59,0xb9,0xd0,0x45, 0x8e,0xaf,0x07,0x35, 0xaa,0xbe,0xee,0x30, 0x7a,0xae,0x13,0xac, + 0xc3,0xed,0x32,0x71, 0x06,0x6f,0x35,0x9b, 0xf6,0x2e,0xed,0x3b, 0x5d,0xae,0x87,0x4b, + 0x7d,0x1f,0x61,0xbd, 0xf4,0xa8,0x64,0x1b, 0x54,0x51,0x09,0x4a, 0x07,0xfd,0x41,0x51, + 0x8e,0x7c,0xb6,0x72, 0x6c,0xfc,0xd9,0xce, 0xaf,0x1e,0x88,0xe1, 0x4a,0x24,0xdf,0x2d, + 0xd2,0x47,0x31,0xeb, 0xe4,0x73,0xf8,0x4c, 0x6f,0xa6,0x21,0x14, 0x2b,0xaf,0x8b,0x14, + 0x29,0xb0,0x67,0x25, 0xc8,0x9f,0x2f,0x1b, 0x66,0x72,0x7a,0xb8, 0x8a,0x38,0x28,0xd0, + 0x54,0x6c,0xb7,0xbe, 0x98,0x93,0xe2,0x66, 0x6a,0x2c,0x40,0x0c, 0x9b,0xad,0x96,0x5c, + 0x67,0x59,0x48,0xcf, 0x7a,0x9c,0x85,0x7e, 0xc9,0x48,0xa1,0x94, 0x9d,0xe2,0xea,0x11, + 0x20,0x5b,0x52,0x7e, 0x5f,0x79,0xf2,0xfa, 0x66,0x4c,0x5f,0x0a, 0xcf,0xf5,0x0f,0x17, + 0x04,0x8c,0x39,0x25, 0x95,0xcb,0x36,0x80, 0xce,0x35,0x26,0xbb, 0xa7,0x0d,0x14,0x32, + 0x1e,0x38,0xca,0x5b, 0x72,0x64,0x05,0x11, 0x10,0x34,0xe2,0x66, 0x30,0x70,0x36,0x3c, + 0x55,0x71,0x96,0xa7, 0xe7,0xe7,0x50,0x9a, 0x21,0x44,0x41,0x3a, 0x70,0xc4,0xa2,0x16, + 0x78,0x12,0x50,0x2f, 0x17,0x61,0xfd,0x32, 0x47,0x8b,0xdf,0x56, 0xe9,0xbd,0x6b,0xaa, + 0x6c,0x00,0xaf,0x52, 0x8c,0x09,0x41,0xad, 0xc0,0x9a,0xbd,0x39, 0xbb,0xc4,0x20,0x60, + 0x31,0x36,0xc1,0xb1, 0x18,0x10,0x09,0x28, 0xe0,0xd3,0x29,0x30, 0x4d,0x30,0x48,0x69, + 0x09,0xca,0x00,0x4a, 0x12,0x06,0x11,0x9b, 0x0d,0x39,0x41,0x0f, 0xbb,0xf4,0xd7,0x1e, + 0x51,0x99,0x33,0x12, 0x5e,0xab,0x8b,0xed, 0x77,0x7e,0x3f,0x6d, 0x82,0xbb,0xd7,0x3d, + 0x43,0xc9,0x8d,0xe6, 0xa3,0xa6,0xe6,0xa7, 0xb6,0xa1,0xc5,0x42, 0xac,0xb7,0x57,0x67, + 0x35,0xee,0x34,0x64, 0xbb,0xad,0xac,0xa4, 0xf7,0xa8,0x4a,0x1a, 0x3e,0x3f,0x9a,0xf1, + 0xe9,0x9b,0xef,0x63, 0x34,0x6d,0x63,0xf9, 0x7e,0xb7,0x23,0xe2, 0x8b,0x7b,0x6b,0x17, + 0x05,0xa5,0xdc,0xf2, 0x3c,0xee,0x74,0x03, 0xc2,0x96,0x99,0xa2, 0x18,0xb2,0x12,0xa8, + 0x22,0x7d,0x89,0x1a, 0x65,0x9e,0x76,0xf7, 0x2e,0xcb,0x66,0x57, 0x0c,0xec,0x19,0xeb, + 0xba,0xcd,0xb8,0x22, 0x03,0xee,0x50,0x56, 0xe7,0xb9,0xc9,0xa4, 0x68,0x13,0xec,0x78, + 0x77,0x7e,0x02,0xfe, 0x43,0x22,0xda,0xae, 0x51,0xb5,0x6f,0xa1, 0x94,0x09,0x85,0xc8, + 0xd6,0x46,0xd1,0xa6, 0x1a,0x92,0x79,0x79, 0xb3,0x8e,0x6e,0xaf, 0xa3,0xd1,0x94,0x4c, + 0xdf,0xda,0xc4,0xee, 0xff,0xc4,0x4d,0xdb, 0xc3,0x64,0xbe,0xcb, 0x67,0x16,0x01,0xd2, + 0xba,0xf6,0x21,0x2b, 0x40,0xaf,0x44,0x53, 0x59,0x6f,0x17,0x77, 0x5f,0xd7,0xe2,0xf5, + 0xa7,0xed,0x04,0x6d, 0x11,0x33,0xcd,0xe8, 0xcf,0xaf,0x84,0xe0, 0xe4,0x10,0xa2,0x5f, + 0x61,0x27,0x49,0xd2, 0x48,0xfa,0x67,0x71, 0x0b,0x90,0xf7,0x02, 0xde,0x6d,0xaf,0x4e, + 0xca,0xe6,0xbf,0x7d, 0x5b,0x9f,0x22,0x5a, 0x07,0x63,0xe7,0xb6, 0xa8,0xa5,0xbb,0x57, + 0x35,0x03,0xed,0xe9, 0xc6,0x1d,0xe3,0x46, 0x7b,0x2a,0xdb,0x9e, 0x2e,0xaa,0x5e,0x62, + 0xd7,0xf8,0x72,0x39, 0x12,0xbb,0xfd,0xb7, 0xda,0xd6,0x3b,0x0e, 0x96,0x87,0xb7,0xe8, + 0xf8,0x1c,0x6d,0x25, 0xe2,0xe1,0xf6,0x5d, 0x8f,0xe6,0xff,0xae, 0xad,0xb8,0x34,0x98, + 0x01,0x22,0x70,0x42, 0x08,0xb4,0x7c,0x6d, 0xd2,0xec,0x48,0x0d, 0xe1,0xe9,0x56,0x57, + 0xc4,0x96,0x31,0x85, 0x1c,0x86,0xfe,0x0b, 0x01,0x9c,0xbd,0x01, 0x38,0x76,0x52,0x54, + 0x4f,0x99,0x66,0x29, 0x66,0x6d,0x14,0x5d, 0x8b,0xff,0xbf,0xcd, 0x1f,0x04,0x77,0x1b, + 0x2f,0x52,0xd5,0xa5, 0x32,0xeb,0xc4,0x1c, 0x9d,0x94,0x71,0x18, 0x46,0x1c,0xfc,0xa3, + 0x65,0x39,0xe3,0x72, 0x90,0xbd,0xf2,0xb7, 0x7e,0x4d,0x4b,0x46, 0x78,0x59,0xad,0xf6, + 0x12,0xd9,0x46,0xad, 0xfc,0x4d,0xf0,0x18, 0xeb,0x9e,0xb3,0xcb, 0x4d,0xc1,0x87,0x69, + 0x41,0x0c,0xcd,0x65, 0xe9,0xba,0xfe,0x92, 0xab,0x26,0x78,0xf6, 0x76,0x11,0xd2,0x0e, + 0xe2,0x32,0x72,0xd8, 0xb5,0xf8,0x8d,0x3f, 0xf5,0x7d,0xdc,0x8d, 0xe5,0x58,0x2f,0xf6, + 0xed,0xed,0x90,0xd1, 0xf3,0xe9,0x3a,0x12, 0xde,0x59,0x03,0xfe, 0xfc,0xd8,0xc8,0xaf, + 0x9d,0xe1,0xe0,0x3a, 0x13,0xd6,0x18,0x8a, 0xb8,0xc8,0x88,0xb5, 0x34,0x1d,0x93,0x50, + 0x37,0xe1,0xcf,0x30, 0xf9,0x31,0x2d,0x46, 0xed,0xc2,0x74,0x2e, 0x4e,0x9a,0xf1,0x0b, + 0x01,0xf6,0x94,0x51, 0x90,0x07,0xa2,0x6e, 0x41,0x23,0x74,0x9a, 0x65,0x6d,0xb2,0x34, + 0xdf,0xe9,0xc4,0x8f, 0xb1,0xd1,0x3a,0xbc, 0xdd,0xc2,0xe6,0x9c, 0xb3,0x04,0x57,0xf8, + 0x64,0xc3,0x9f,0x29, 0xd0,0xe0,0x4f,0x3c, 0x5f,0xbe,0x0a,0x4c, 0x29,0xc9,0x13,0xec, + 0xf9,0x9a,0xd8,0x9d, 0xca,0xb2,0xba,0x13, 0x23,0xf8,0xb5,0x94, 0x94,0x5b,0x67,0x30, + 0xa1,0x2c,0xf0,0x57, 0xd4,0x37,0x27,0x89, 0x8b,0x25,0x36,0x36, 0x6b,0x23,0xb1,0xae, + 0xf1,0x74,0x0b,0x3b, 0x5b,0xc4,0xe2,0x6c, 0x24,0x97,0x9a,0x9a, 0x9b,0x75,0x17,0x28, + 0x80,0x04,0x09,0x00, 0x80,0x04,0xc6,0x31, 0x83,0xa1,0x5c,0x7a, 0x1a,0x6c,0x5b,0xb5, + 0x6f,0x6d,0x2b,0x61, 0xaf,0xaf,0x6f,0x77, 0xb0,0xfc,0xbd,0x95, 0xc7,0x45,0xe7,0xe7, + 0x2e,0x93,0xbd,0x80, 0x23,0xc4,0xee,0xa4, 0x84,0x56,0x6a,0x51, 0xb0,0xd8,0x79,0x7e, + 0x65,0x3f,0x9d,0x6b, 0x01,0xa6,0xa8,0xf5, 0x30,0x72,0x4c,0x4c, 0x66,0x44,0xc4,0xa1, + 0xce,0x20,0xd1,0x77, 0x9e,0xa7,0xe8,0x22, 0x15,0x65,0x0c,0x66, 0x11,0xf7,0x90,0xb5, + 0x6c,0x25,0x36,0x55, 0x50,0x89,0x6d,0x77, 0x7e,0xc7,0x89,0x5c, 0xe7,0xa7,0xd8,0x75, + 0xb3,0x5b,0x9d,0xee, 0xdb,0x47,0xc2,0x44, 0x25,0x98,0x02,0x0e, 0x38,0x6b,0xa1,0x60, + 0xe0,0x42,0xc8,0x77, 0x33,0x6c,0xf8,0x77, 0xc7,0x55,0xdc,0x61, 0x9a,0xe4,0x7c,0x5f, + 0x95,0x20,0x24,0x0f, 0xdc,0x40,0xa1,0xa6, 0x09,0x8d,0x3f,0x56, 0x23,0xd4,0x8a,0x29, + 0x71,0x13,0xcf,0xb9, 0x4e,0x63,0x56,0x55, 0x56,0x88,0x77,0x04, 0x12,0x44,0x94,0x49, + 0x97,0xef,0xbf,0x9f, 0x66,0xee,0x3d,0x9b, 0x5c,0xbe,0xfb,0x79, 0xd1,0xfc,0x6f,0x4b, + 0x7d,0xa3,0xe1,0xea, 0x33,0x7e,0xae,0xd7, 0xa6,0x03,0xc2,0x03, 0xa0,0xe1,0x7d,0x9f, + 0xb1,0x5f,0x8f,0x39, 0x1e,0x47,0x6b,0x33, 0xbd,0x96,0xdf,0xd5, 0xfa,0x7f,0xc4,0xd6, + 0x31,0x93,0xd7,0xd8, 0x36,0xb8,0x07,0x2c, 0x6b,0x75,0x69,0xa6, 0x3a,0xe7,0x02,0x8a, + 0x10,0xd8,0x20,0x77, 0x3a,0xe3,0xe5,0x66, 0x45,0xa3,0xa5,0xc9, 0x58,0x30,0x31,0x82, + 0xfc,0x54,0xcc,0xd3, 0xc4,0x18,0x63,0xb6, 0x2d,0x49,0x48,0x8d, 0x8e,0xbd,0x28,0xf0, + 0x24,0xce,0xcb,0x4d, 0xa3,0x60,0xe1,0x47, 0xdf,0xa0,0xe4,0xdd, 0xe7,0xad,0x53,0x06, + 0xa2,0x43,0x1b,0xbe, 0x03,0xfc,0x20,0x07, 0x20,0xc3,0x6f,0x13, 0x33,0x67,0xae,0x82, + 0xff,0x7c,0xad,0x7e, 0xa7,0xa1,0xc2,0xa7, 0x85,0xd3,0x78,0xa2, 0x78,0x38,0x58,0x5f, + 0x87,0x3e,0x06,0x00, 0xfc,0x82,0x53,0x86, 0x71,0x91,0x31,0x76, 0x44,0x64,0xfe,0x8e, + 0x35,0x03,0x2e,0xf9, 0x00,0x01,0x84,0xa2, 0x54,0x2c,0xb0,0x1d, 0x59,0x49,0x56,0x34, + 0x40,0xad,0xd3,0xa9, 0xda,0xe0,0xe4,0xad, 0x37,0x87,0xf8,0x5b, 0x0d,0xf2,0xd8,0x0d, + 0x75,0x42,0xe6,0x8d, 0xb3,0x22,0x99,0xfa, 0x36,0x90,0x30,0xd0, 0x7b,0xff,0xc9,0xf2, + 0xc8,0x5d,0x73,0x79, 0x03,0x5a,0xc2,0x3b, 0x2c,0x7a,0xf9,0x7b, 0x48,0xbe,0xa8,0x7d, + 0xfa,0x2e,0x95,0xda, 0x70,0xaf,0x38,0x5a, 0x9f,0x79,0x56,0xf1, 0x87,0x9d,0x26,0x97, + 0xbb,0xcc,0x17,0x41, 0x31,0x86,0x73,0x18, 0xe6,0x8f,0x33,0x98, 0x07,0x40,0x4a,0x11, + 0xa4,0x4c,0xa5,0x6a, 0x97,0x25,0x60,0x26, 0x2a,0x9a,0xa0,0x8c, 0x99,0x02,0x23,0x6f, + 0x8d,0x48,0x71,0x3e, 0x24,0x4d,0xa2,0x42, 0x49,0x09,0x24,0x6d, 0xbe,0x6f,0x83,0xa3, + 0x9d,0x95,0x52,0x9d, 0x62,0x83,0xa6,0xc7, 0x1d,0x0e,0xc8,0xba, 0x37,0xd2,0x46,0x63, + 0xf7,0xaf,0x6c,0xf5, 0xc3,0x2a,0xd2,0xc7, 0x64,0xcb,0xbf,0x43, 0x43,0x23,0x41,0x7b, + 0x0b,0x5f,0xdc,0xdf, 0x69,0x7d,0x3d,0x65, 0xe7,0x8f,0x5b,0xcb, 0xb4,0xa0,0xe0,0x0e, + 0xe5,0xf6,0xcc,0x5a, 0xfa,0x53,0x89,0x12, 0x00,0x2a,0x01,0x11, 0x01,0xb8,0x93,0xc7, + 0xa0,0x08,0x12,0x30, 0x74,0x5d,0x8c,0xe5, 0xdd,0xdd,0x55,0xb6, 0x78,0x6c,0x24,0xcd, + 0x53,0xe1,0xab,0xc5, 0xdb,0x3f,0x99,0xb6, 0x6a,0xb9,0x82,0x85, 0xa2,0xce,0xa6,0x98, + 0x71,0xc9,0x2b,0xdb, 0x8d,0x2c,0x0b,0x79, 0x82,0x0a,0x2f,0xaf, 0xec,0xa1,0x44,0x1a, + 0x96,0x4f,0x70,0xea, 0x4f,0x73,0x7a,0xa8, 0x37,0x18,0xde,0xbf, 0xcc,0xc1,0x22,0x00, + 0x31,0x9b,0x38,0x47, 0x85,0x82,0x34,0x80, 0x92,0x50,0xfb,0x34, 0x1f,0xd9,0x48,0x1e, + 0x46,0x3f,0x19,0xe8, 0x69,0x70,0x2b,0xa7, 0xe7,0xfc,0xee,0x24, 0x6e,0xbb,0x33,0x7d, + 0x35,0x75,0x33,0x67, 0xfe,0xb4,0x00,0xf2, 0xfa,0x1a,0x08,0x1d, 0x04,0x70,0xa8,0xfa, + 0x64,0xb3,0xa5,0xe1, 0x06,0x96,0xef,0xfe, 0x47,0xff,0xf9,0x6a, 0xed,0x27,0x41,0xb8, + 0x03,0x3c,0x0d,0xde, 0x98,0x6e,0xe3,0x48, 0x7e,0xd9,0xac,0x25, 0xd0,0x69,0x2a,0xb9, + 0xa6,0x66,0x5d,0x42, 0xa0,0xc5,0x0d,0x1f, 0x74,0x72,0x34,0xa0, 0x89,0xfe,0x45,0x06, + 0x4c,0xdf,0x70,0x6e, 0xb5,0x61,0xc8,0x8e, 0x6d,0x6b,0x30,0xcd, 0x11,0x4c,0xc1,0x84, + 0xd8,0x78,0x97,0x18, 0x96,0x2a,0x1f,0x9b, 0x25,0x3f,0xb1,0xe6, 0xee,0x37,0x1b,0x0b, + 0x65,0xed,0x08,0x7c, 0x09,0xf4,0xa9,0x9e, 0x02,0x04,0x66,0x06, 0x3f,0xa2,0xfa,0xba, + 0x58,0x03,0xdd,0xec, 0x85,0xce,0xb8,0x9e, 0x69,0x66,0x30,0x1b, 0x32,0x30,0x06,0xf4, + 0x03,0xfd,0x17,0xb4, 0xb9,0x98,0x0c,0xee, 0xc2,0xe0,0x78,0x6c, 0x68,0x80,0xde,0xc4, + 0xfe,0x9a,0xa1,0xd2, 0xd8,0xcd,0xe3,0x66, 0x96,0xa6,0xc4,0xb7, 0x41,0xbd,0x59,0xbf, + 0xfa,0x52,0xfe,0x67, 0x53,0x24,0x8a,0x74, 0xb6,0x9d,0x46,0x56, 0x7d,0x59,0xc6,0x8a, + 0xad,0x69,0xec,0x24, 0xd7,0x08,0x94,0x5f, 0x3a,0x36,0xd6,0xd0, 0xf1,0x36,0x4e,0xed, + 0xec,0xb7,0x7f,0xf9, 0x22,0xc4,0x33,0x26, 0xbb,0x5f,0xd1,0xcf, 0xf2,0x80,0xd6,0xa8, + 0xba,0x38,0x17,0x3c, 0x9c,0x25,0xd2,0x08, 0xf7,0x0c,0xa9,0x11, 0x08,0x5e,0x09,0xc2, + 0x14,0xf2,0x1f,0x69, 0x99,0xf7,0x45,0x20, 0xf0,0x4b,0x56,0x4e, 0x67,0xbf,0xc7,0xa6, + 0x7e,0xd6,0x11,0xa8, 0xb8,0xd7,0xd5,0x3f, 0xec,0xcc,0x8d,0xeb, 0x3e,0x45,0x98,0x3a, + 0xce,0x3a,0xdf,0xba, 0x44,0xf3,0x19,0xf1, 0x28,0xb7,0xf7,0x97, 0x16,0x1c,0xab,0x2b, + 0x26,0x35,0x8f,0x7b, 0x38,0x9e,0x07,0x44, 0xd8,0x48,0xd4,0xc6, 0x24,0x60,0xd8,0xb2, + 0x00,0x20,0xe2,0x8c, 0x90,0x40,0x20,0x80, 0x18,0xf6,0x53,0x8c, 0x1f,0xd4,0x92,0xdf, + 0x23,0x92,0x2b,0xf7, 0x77,0x36,0x3d,0x47, 0x0d,0x5f,0x67,0xdd, 0x6e,0x6b,0xa6,0xe1, + 0x88,0x7d,0x97,0x5d, 0x2b,0x61,0x31,0x50, 0xc1,0xfa,0xc7,0x4b, 0x17,0x03,0xe8,0xe1, + 0xe0,0x3f,0x80,0x57, 0x18,0x28,0xe8,0xc6, 0x02,0x39,0x21,0xb1, 0x0a,0x77,0x9b,0x54, + 0xd4,0xc7,0xf5,0x53, 0xe8,0x7a,0xce,0xdf, 0xf6,0x9a,0xdb,0xdd, 0xce,0x45,0x4d,0x3c, + 0x9f,0xe3,0xce,0xfa, 0x6c,0x98,0x53,0x73, 0xb8,0x9a,0x29,0x65, 0x6a,0xbf,0x17,0x41, + 0xd2,0x51,0x2a,0x6c, 0xea,0x27,0x72,0x5e, 0x8c,0x48,0x31,0xd4, 0x0c,0x86,0xe2,0x08, + 0x86,0x43,0x41,0xbe, 0xcb,0xfb,0x36,0x37, 0x15,0x8c,0x06,0x43, 0xa9,0xf8,0x7a,0x1c, + 0x7d,0x62,0xd1,0x03, 0xf8,0xfe,0x39,0x20, 0x52,0x10,0x98,0x24, 0xd0,0xcf,0x36,0x0f, + 0x35,0xc9,0x24,0xc0, 0xa4,0xa8,0x24,0x82, 0x0f,0x99,0xe6,0x3c, 0x44,0x44,0x3c,0x4a, + 0x52,0x76,0x66,0x66, 0x66,0x66,0x94,0xb5, 0xd1,0x04,0x10,0x49, 0x06,0x21,0xa4,0xf6, + 0x7b,0xe8,0x25,0xe7, 0x1f,0x8b,0xd7,0x00, 0xee,0x01,0x71,0x17, 0x1c,0xb6,0x1a,0x5e, + 0xcf,0x67,0xb3,0x6d, 0xf1,0x9f,0x8a,0xe5, 0x12,0x5a,0xce,0x96, 0x8b,0x09,0xbb,0x14, + 0x76,0x16,0x7d,0xf2, 0x99,0x70,0x6b,0x82, 0x35,0x95,0x25,0x86, 0x61,0xf7,0x54,0xf2, + 0x0e,0x42,0x00,0x54, 0x86,0x0c,0x99,0x96, 0x47,0x37,0x68,0xa6, 0x97,0x18,0x66,0x4c, + 0xf8,0xcd,0x67,0xb9, 0xe0,0xcc,0x2c,0xe9, 0xe7,0xde,0x6d,0xac, 0x58,0xf3,0x7f,0xce, + 0x0e,0x93,0x91,0xfc, 0x68,0xd1,0x8b,0x95, 0x6b,0xec,0x39,0x23, 0xd1,0x8a,0x19,0xe2, + 0xcd,0x71,0xd5,0x8a, 0xe7,0x9c,0xf0,0xef, 0x31,0x77,0x62,0x06, 0x06,0x10,0x19,0x82, + 0x89,0x3b,0xe1,0x2d, 0x94,0x2e,0xfd,0xdd, 0xc4,0x7d,0x9d,0x1c, 0xa4,0x56,0xe9,0x66, + 0xb1,0x9e,0x1a,0xe3, 0xad,0xb5,0xaa,0x1f, 0x95,0xcb,0x50,0x5e, 0xb0,0xdb,0x7a,0x70, + 0x81,0x43,0x1e,0xc2, 0x92,0xe2,0x6d,0x63, 0x24,0xb6,0x3c,0xb7, 0x3f,0x73,0x75,0x52, + 0xbf,0xeb,0xbc,0x4e, 0xbf,0xc3,0xf8,0xdd, 0x3f,0xcc,0xad,0xbd, 0x79,0xaf,0x46,0x8e, + 0xd7,0xe7,0xe1,0x1d, 0xf7,0x7d,0x4c,0xb3, 0xf0,0x96,0x0a,0x41, 0x86,0xa9,0xc4,0xab, + 0x87,0x4c,0xb0,0xb9, 0x82,0xc4,0xe3,0x25, 0xde,0xe3,0xfe,0xa7, 0x9a,0x39,0x41,0xfb, + 0x9f,0x4a,0x0e,0xbb, 0x4f,0xe0,0xe0,0x50, 0xa2,0xff,0x0c,0x8b, 0xd7,0xc4,0xd6,0x42, + 0x23,0x33,0xc2,0x54, 0x59,0x4a,0xa5,0x2e, 0xfd,0x55,0x35,0xdf, 0x5c,0x20,0x77,0x65, + 0x4c,0x3c,0x41,0xf8, 0x52,0x56,0x64,0xa7, 0xba,0xaa,0xec,0xc9, 0xcd,0xe0,0xe4,0xdd, + 0xad,0xa2,0xd1,0xbc, 0x47,0xcb,0x48,0x1d, 0xe5,0xe3,0xe8,0xeb, 0x48,0x68,0xf8,0x6d, + 0x25,0xdb,0x76,0x3c, 0xbd,0x0d,0x34,0xb6, 0x56,0x6e,0xb6,0xb7, 0x56,0xfd,0x54,0x02, + 0x24,0x52,0x08,0x00, 0xa0,0x85,0x73,0x34, 0xbf,0xc6,0x54,0x90, 0x3e,0xf8,0x20,0x6f, + 0x4e,0x12,0xfa,0xf6, 0x09,0x64,0x5a,0x1f, 0x11,0xec,0xa4,0x87, 0x60,0x8e,0x58,0xe3, + 0x9e,0x37,0xa9,0x19, 0x63,0x43,0x27,0x34, 0x07,0xa9,0x90,0xcc, 0x7e,0x1f,0x94,0xb2, + 0xc7,0x6a,0x06,0x29, 0xaa,0x1a,0xc6,0xa0, 0xe5,0x0c,0x5c,0xdd, 0x3e,0xce,0xbb,0xbf, + 0x84,0xa5,0x14,0x93, 0xd4,0x1f,0x8f,0xb9, 0xae,0x88,0xcd,0xdf, 0xc9,0xdc,0x18,0xb6, + 0x26,0xc8,0x1b,0x42, 0x23,0x9e,0x7d,0x41, 0x44,0x34,0x3a,0x3c, 0x1e,0x10,0x80,0x17, + 0xae,0x07,0xa0,0xf7, 0xd5,0x8f,0xc2,0x23, 0x2e,0x40,0x86,0x29, 0xbb,0x5e,0x68,0x1f, + 0x0d,0xcb,0xe0,0xe3, 0xfa,0x3f,0x73,0x62, 0x23,0x84,0x68,0x8b, 0x36,0x4e,0x07,0xa5, + 0x8c,0x8b,0xec,0x91, 0xee,0xfe,0x04,0xb9, 0x50,0xde,0xf2,0x4b, 0x1c,0x31,0x22,0xdb, + 0xf9,0x47,0xa4,0xcf, 0x1f,0xad,0xf9,0xce, 0x94,0x20,0x9e,0x41, 0xde,0x36,0x4a,0x60, + 0xea,0xf3,0xbe,0x77, 0x56,0x72,0x45,0xe1, 0xbc,0x07,0x07,0x49, 0x62,0xd5,0x4e,0x85, + 0xea,0x12,0xe6,0x69, 0x2b,0xe9,0x3b,0x83, 0x2c,0x71,0x59,0xf1, 0x2f,0x44,0x44,0xbc, + 0x50,0x67,0x75,0xe2, 0x59,0x2f,0x7a,0x09, 0x9c,0x27,0xaa,0xcb, 0x38,0x8a,0x83,0x6c, + 0xf2,0x00,0x1c,0xc9, 0xdb,0xa2,0xc4,0xb8, 0x80,0xbf,0x65,0x42, 0xa4,0x10,0x9b,0xa0, + 0xb3,0x8d,0x48,0xe8, 0x43,0x51,0x77,0xb6, 0x46,0x76,0xb1,0xed, 0x89,0x42,0x7e,0x1c, + 0x29,0x2b,0xd4,0x13, 0x04,0x92,0x46,0x5f, 0x51,0x21,0xca,0xcc, 0x68,0xe5,0x4d,0xb4, + 0xae,0xb9,0xe5,0x24, 0x63,0x7c,0x32,0xa0, 0x74,0xf6,0x07,0x48, 0xc3,0x96,0x7c,0xe9, + 0x5b,0x16,0x8d,0xef, 0x0f,0x1f,0xc8,0x4e, 0x68,0xb8,0x85,0xe5, 0xfa,0x47,0x0c,0xf7, + 0xa7,0x36,0xd3,0xc7, 0xe5,0xf5,0xad,0x13, 0xf2,0x1a,0xb2,0x41, 0xc8,0x18,0x07,0x44, + 0x32,0x40,0x11,0x11, 0x10,0x12,0x6b,0xfb, 0x5a,0xcd,0xfe,0x7d, 0x41,0xe3,0x47,0x53, + 0x3d,0x8e,0xdc,0xf5, 0xaf,0x86,0x22,0xf6, 0x57,0x75,0xa2,0x24, 0x55,0x33,0x06,0x7a, + 0x4f,0x1a,0x9c,0xfa, 0x03,0x6b,0x50,0x0d, 0xfd,0xb6,0x6b,0xd3, 0xf5,0x3e,0x8d,0x2b, + 0xf6,0x9e,0xfe,0x0f, 0x6f,0xfc,0x30,0x17, 0x0d,0x21,0x7c,0xac, 0xd8,0xb8,0xe4,0x6d, + 0x1f,0x92,0x66,0x26, 0xae,0x12,0xcf,0x1f, 0xbf,0x19,0x3c,0xd8, 0x78,0xf2,0x0e,0x2f, + 0x83,0x9e,0x91,0xff, 0x29,0x9e,0x1f,0xc6, 0xc3,0xd9,0xf9,0xbd, 0x7d,0x2b,0xd9,0xda, + 0xd6,0x49,0x6a,0xfd, 0xb9,0x16,0xdc,0x9f, 0x95,0xad,0x85,0xf2, 0xf1,0x20,0x29,0x74, + 0xb4,0x31,0xa9,0xfd, 0x64,0x16,0x58,0xac, 0x8c,0x4d,0xa4,0x0d, 0x8a,0x49,0x9d,0x0b, + 0x81,0x84,0xc6,0x93, 0x64,0x32,0x70,0x5c, 0x15,0x60,0x02,0x3a, 0xa8,0x80,0x94,0x14, + 0x5f,0x35,0x94,0x66, 0x64,0x28,0xed,0xbd, 0x7e,0x33,0x75,0x9e, 0x2f,0xb4,0x6c,0xea, + 0xb0,0x61,0xfe,0x64, 0x40,0xd7,0xf3,0xde, 0x27,0x43,0x39,0x0c, 0x7f,0x0e,0xff,0x51, + 0x35,0x30,0x7c,0x56, 0x8c,0x06,0x54,0xca, 0x4d,0x19,0xc4,0xda, 0xdc,0x7b,0xdf,0xdd, + 0xa8,0xb3,0xbc,0xa3, 0x1b,0x3f,0xfb,0xd4, 0x8a,0x9b,0x88,0x11, 0x6d,0xad,0xc3,0x30, + 0x87,0x24,0xc8,0x7a, 0x2d,0x8e,0x60,0x65, 0x48,0x01,0xa4,0x6b, 0x8a,0x42,0xfb,0xd0, + 0x93,0x9b,0x2a,0x58, 0x8a,0x5a,0x92,0x08, 0xc3,0xd4,0x4f,0xbf, 0xf2,0xfc,0x6b,0x76, + 0xa1,0xb9,0x7e,0x34, 0xd2,0x93,0x4b,0xd3, 0x72,0x46,0x31,0xa0, 0x10,0x7f,0xf8,0xf5, + 0x1b,0xf5,0x43,0xb2, 0xee,0xf8,0x17,0xc5, 0xb0,0x61,0xd2,0xcd, 0xa2,0x4b,0x19,0x8a, + 0x9d,0xc9,0xc8,0x38, 0x01,0x4d,0x34,0x3a, 0x26,0xa2,0xce,0x4d, 0x78,0x25,0x9c,0x84, + 0xd0,0xd9,0xa9,0xd2, 0xfb,0x3e,0x1b,0x48, 0x91,0x03,0x08,0xef, 0xbf,0x55,0x02,0x21, + 0xf2,0xe7,0xbd,0x43, 0x3c,0xaf,0xba,0x38, 0xaf,0x58,0xf9,0x24, 0x23,0x10,0xac,0x6f, + 0x5a,0x70,0xd2,0xb8, 0xd9,0x39,0xbb,0x83, 0x89,0xc7,0xaf,0x39, 0xd7,0x99,0x3e,0x77, + 0x3a,0xb1,0x60,0xb4, 0xc1,0xe1,0x0b,0x83, 0xce,0xa1,0x52,0xc0, 0x13,0xe3,0x46,0xa4, + 0xa8,0xa3,0x6c,0xe6, 0xac,0x2b,0x8a,0x5c, 0xcb,0x54,0x09,0x63, 0x11,0x18,0xdf,0x29, + 0x00,0xdc,0xb9,0x34, 0x1c,0x86,0x9c,0x88, 0x79,0xe8,0x94,0xbf, 0xb2,0x50,0x82,0x68, + 0x04,0x9e,0x7b,0x3c, 0x44,0x9a,0xa5,0xb6, 0xaa,0x23,0x3f,0x23, 0xe0,0x3d,0xa4,0x41, + 0xc0,0x65,0x0c,0xb2, 0xf3,0x32,0x44,0xd0, 0x30,0xbe,0x43,0x69, 0x0d,0xa3,0x56,0xd2, + 0x20,0x63,0x69,0x08, 0x48,0x20,0x04,0x00, 0x08,0x40,0x00,0x90, 0x02,0x84,0x20,0x42, + 0x51,0x0a,0x42,0x86, 0x94,0x31,0x60,0xf2, 0x98,0x24,0x92,0x09, 0xb2,0x86,0x6f,0xe0, + 0x50,0x21,0xb4,0x56, 0x0f,0xb5,0x8b,0x01, 0x69,0xa6,0x33,0x3a, 0x2f,0xa2,0x13,0x56, + 0xc4,0x25,0xe1,0xc4, 0x8d,0x4f,0xd1,0xd0, 0x7c,0xa1,0xb0,0x97, 0x8d,0xe7,0x60,0x5f, + 0x26,0xd1,0xaf,0x73, 0x51,0xf7,0xad,0xb7, 0x0a,0xe6,0x66,0x6e, 0x7d,0x54,0x9a,0xd4, + 0xc5,0xc9,0xa5,0x12, 0xb9,0x9f,0xeb,0x8e, 0x9e,0x8c,0x0f,0x91, 0xc0,0xdb,0xed,0xa8, + 0x55,0xc8,0xaf,0x6c, 0xef,0x11,0x8c,0x2f, 0x2e,0x6c,0x6e,0x1c, 0x46,0xd8,0x56,0x84, + 0x54,0x17,0xcb,0x23, 0x00,0x56,0xdc,0xed, 0x12,0x53,0x0a,0x9f, 0x79,0x1e,0x5f,0xd0, + 0xa7,0x57,0xb1,0xfd, 0x34,0x95,0xbf,0xe6, 0x22,0xc4,0x52,0xc8, 0xbe,0x8f,0x77,0xbe, + 0xf4,0xfb,0x2f,0xd1, 0xa0,0xd2,0x8e,0xa0, 0xcb,0xb5,0x01,0x3d, 0x44,0x25,0x27,0x6b, + 0xca,0x69,0xc9,0xa8, 0xd8,0xa2,0xeb,0x87, 0xc4,0x92,0x9c,0x59, 0x78,0x4f,0xbd,0x12, + 0xe5,0xce,0xe2,0x04, 0xba,0x81,0x6b,0xc0, 0x11,0x13,0x21,0x5b, 0x17,0xc2,0x56,0x49, + 0xe7,0x4e,0xb9,0x54, 0x4b,0x0c,0x73,0x34, 0xce,0x6f,0xbf,0x7e, 0x3f,0xbf,0x5a,0x98, + 0x95,0xaa,0xb6,0xc2, 0xaf,0x34,0x6c,0xb3, 0x2b,0x76,0x05,0xa2, 0x73,0xad,0x75,0x2f, + 0xe8,0x09,0x57,0x2e, 0x2b,0x53,0xdb,0x4c, 0xae,0x84,0x0a,0x7c, 0x77,0x29,0x32,0x4e, + 0x23,0x36,0x4c,0x34, 0xdd,0xef,0x92,0x2e, 0xfb,0x77,0xfa,0x37, 0x3c,0xa7,0xb3,0xb8, + 0xb8,0x46,0x4b,0x20, 0x2c,0xc1,0xe8,0x46, 0xaa,0x46,0x7f,0xa6, 0x8b,0xf7,0x45,0x6a, + 0xde,0x65,0x53,0xa1, 0xbf,0x26,0x3e,0xa3, 0x10,0x4a,0x9c,0x1c, 0x04,0x4d,0x61,0x3b, + 0x3d,0x4b,0x9d,0x35, 0x10,0x50,0x0a,0x30, 0xa2,0x0e,0x04,0x0b, 0x52,0xf4,0x63,0x31, + 0x39,0xfb,0x55,0xf2, 0xfc,0x9a,0x29,0x53, 0x67,0x6f,0x2b,0xf1, 0xc9,0xb2,0x21,0x7d, + 0xbb,0x28,0x65,0x2b, 0x68,0x1a,0x14,0x99, 0x04,0x93,0x7e,0xe2, 0xc1,0xb0,0xab,0x25, + 0x51,0x12,0x9a,0xcd, 0xc2,0x30,0x37,0x9d, 0x7e,0x1e,0xe0,0x70, 0x2a,0x29,0x8b,0xd9, + 0x45,0x35,0xa2,0x1a, 0x35,0x4d,0x6b,0x1a, 0x56,0x58,0x18,0x4e, 0xd7,0x3b,0xfd,0x90, + 0x48,0xb8,0x45,0x3b, 0xc0,0xa7,0x6f,0x56, 0xa2,0xf7,0x4d,0x57, 0x34,0x52,0xc6,0x17, + 0x80,0x31,0x30,0xd5, 0xe4,0x8a,0x76,0x86, 0x6c,0x92,0x12,0x0e, 0xc4,0x16,0x9e,0x8b, + 0xb8,0x0f,0x26,0x4d, 0x41,0x70,0x46,0x1a, 0x8e,0xe2,0x15,0x10, 0x90,0x09,0x11,0x0a, + 0x81,0x21,0x71,0x18, 0x20,0x6a,0x49,0x70, 0xf6,0xaa,0x31,0x9c, 0x72,0xcf,0xba,0x7a, + 0x08,0xad,0x40,0x1e, 0xd9,0x8a,0xd3,0x0d, 0x13,0x10,0x52,0xef, 0x13,0xa5,0x91,0x28, + 0x04,0xd8,0x01,0x55, 0x17,0x17,0x74,0x32, 0xce,0x72,0xc5,0xcd, 0x16,0x69,0x77,0x74, + 0xdd,0x92,0xca,0x24, 0x32,0x49,0xf6,0x12, 0xa1,0x0c,0x25,0x0d, 0x79,0x01,0x46,0x55, + 0x03,0xf4,0xeb,0x7b, 0x30,0x56,0x70,0x18, 0x80,0x81,0xe5,0x44, 0x5b,0x89,0x89,0x1f, + 0x06,0x98,0xa6,0x0b, 0x52,0x50,0x2a,0xaf, 0xe2,0x42,0x2d,0x36, 0xee,0x46,0xa8,0x18, + 0x4b,0xda,0xc9,0x5e, 0xd9,0x81,0xd5,0x14, 0xa1,0x04,0x43,0x1b, 0x6d,0x15,0xd4,0xae, + 0x58,0x4e,0x62,0x15, 0x92,0x50,0x93,0x00, 0xb1,0xc9,0xc0,0xbb, 0xf7,0x69,0x80,0x5d, + 0x2b,0xe8,0x86,0x68, 0x6d,0x4a,0x49,0x05, 0x4c,0x41,0xfa,0x9a, 0x3b,0x6f,0x77,0x02, + 0x58,0x36,0xd5,0x2d, 0x25,0x71,0xda,0x5a, 0xa5,0x53,0x44,0x0d, 0x03,0x49,0x14,0xd5, + 0x00,0x83,0xf9,0xfc, 0x18,0x12,0x57,0x2d, 0x2b,0xdf,0x93,0x1f, 0x1d,0x8a,0xf1,0x85, + 0x66,0x20,0xa4,0x62, 0x41,0x0d,0x51,0xc5, 0x80,0xf4,0x2c,0xdd, 0xd6,0xcb,0xfe,0x58, + 0xa7,0x2d,0xf0,0xdd, 0x1a,0xdb,0xe2,0x49, 0x14,0x8f,0x3b,0x83, 0x87,0x22,0x96,0x90, + 0x40,0x22,0x04,0x6c, 0xfd,0x16,0x7f,0x86, 0x90,0x85,0xc2,0xd5, 0xef,0x17,0x27,0x71, + 0x6b,0xd1,0xee,0xe2, 0x13,0x85,0x21,0x09, 0xe2,0x6d,0x6c,0x90, 0xb8,0xe1,0x69,0x4d, + 0x02,0x90,0x94,0xa7, 0xf1,0x21,0x6d,0x3e, 0x31,0xa3,0x33,0x2b, 0x1b,0xa2,0xff,0x7e, + 0x8b,0x60,0xc3,0x02, 0xf4,0xa7,0x0d,0x0f, 0xe5,0x42,0xa3,0x07, 0xd6,0x47,0x18,0x08, + 0x13,0x30,0x25,0x40, 0x34,0xe2,0x35,0x37, 0x3d,0x22,0x03,0xa8, 0xbc,0xbe,0x1a,0x46, + 0x95,0x9f,0x03,0xcd, 0xdb,0x59,0xf5,0x73, 0xb0,0x17,0x6a,0x20, 0xc5,0x60,0x05,0xe5, + 0xde,0xf1,0x90,0x6f, 0x72,0xb9,0x4f,0xaf, 0xff,0xf1,0x77,0x24, 0x53,0x85,0x09,0x04, + 0xd6,0xc5,0x66,0x20, + // 0x5cf4 = 23796 data bytes (33%) +}; + +static BZ2Manager_t lecode_kor_bin_mgr + = { lecode_kor_bin_bz2, sizeof(lecode_kor_bin_bz2), 0, 0 }; + diff --git a/project/src/lib-breff.c b/project/src/lib-breff.c index ca7e366..4c2c262 100644 --- a/project/src/lib-breff.c +++ b/project/src/lib-breff.c @@ -270,7 +270,7 @@ enumError CreateBREFF SortSubFilesSZS(szs,SORT_BREFF); - if ( logging > 1 ) + if ( logging >= 2 ) { printf("\nsorted file list:\n"); int i; diff --git a/project/src/lib-brres.c b/project/src/lib-brres.c index 3397810..f89ae29 100644 --- a/project/src/lib-brres.c +++ b/project/src/lib-brres.c @@ -789,7 +789,7 @@ enumError CreateBRRES //--- clean - if (logging) + if ( logging >= 1 ) dump_brres_group(broot,endian); FREE(ep_list); @@ -998,7 +998,7 @@ int IterateFilesBRRES //--- iterate groups #if defined(TEST) || 1 - if (logging) + if ( logging >= 1 ) dump_brres_group(root,endian); #endif diff --git a/project/src/lib-checksum.c b/project/src/lib-checksum.c index b4f19ba..0355e0b 100644 --- a/project/src/lib-checksum.c +++ b/project/src/lib-checksum.c @@ -59,8 +59,10 @@ void CreateSSChecksum ( char *buf, uint bufsize, const sha1_size_t *ss ) if (opt_db64) { PRINT("TAB64=%.65s\n",TableEncode64BySetup); - EncodeBase64(buf,bufsize,ss,sizeof(*ss), - TableEncode64BySetup, false,0,0 ); + const int coding = opt_coding64 == ENCODE_OFF ? ENCODE_BASE64URL : opt_coding64; + EncodeByMode(buf,bufsize,(ccp)ss,sizeof(*ss),coding); +//DEL EncodeBase64(buf,bufsize,ss,sizeof(*ss), +//DEL TableEncode64BySetup, false,0,0 ); } else if (opt_base64) { @@ -113,7 +115,9 @@ void CreateSSChecksumDB ( char *buf, uint bufsize, const sha1_size_t *ss ) DASSERT(bufsize>CHECKSUM_DB_SIZE); DASSERT(ss); - EncodeBase64(buf,bufsize,ss,sizeof(*ss),TableEncode64url,false,0,0); + const int coding = opt_coding64 == ENCODE_OFF ? ENCODE_BASE64URL : opt_coding64; + EncodeByMode(buf,bufsize,(ccp)ss,sizeof(*ss),coding); +//DEL EncodeBase64(buf,bufsize,ss,sizeof(*ss),TableEncode64url,false,0,0); } /////////////////////////////////////////////////////////////////////////////// @@ -170,492 +174,59 @@ enumError GetSSByFile ( sha1_size_t *ss, ccp path1, ccp path2 ) return err; } -// -/////////////////////////////////////////////////////////////////////////////// -/////////////// struct DistributionInfo_t /////////////// -/////////////////////////////////////////////////////////////////////////////// - -void InitializeDistributionInfo - ( DistributionInfo_t * dinf, bool add_default_param ) -{ - DASSERT(dinf); - memset(dinf,0,sizeof(*dinf)); - InitializeParamField(&dinf->translate); - dinf->translate.free_data = true; - InitializeParamField(&dinf->param); - dinf->param.free_data = true; - - uint slot; - for ( slot = 0; slot < MAX_DISTRIBUTION_ARENA; slot++ ) - { - ParamField_t *pf = dinf->arena + slot; - InitializeParamField(pf); - pf->free_data = true; - } - - for ( slot = 0; slot < MAX_DISTRIBUTION_TRACK; slot++ ) - { - ParamField_t *pf = dinf->track + slot; - InitializeParamField(pf); - pf->free_data = true; - } - - if (add_default_param) - AddParamDistributionInfo(dinf,true); -} - /////////////////////////////////////////////////////////////////////////////// - -void ResetDistributionInfo ( DistributionInfo_t * dinf ) -{ - if (dinf) - { - ResetParamField(&dinf->translate); - ResetParamField(&dinf->param); - - uint slot; - for ( slot = 0; slot < MAX_DISTRIBUTION_ARENA; slot++ ) - ResetParamField(dinf->arena+slot); - for ( slot = 0; slot < MAX_DISTRIBUTION_TRACK; slot++ ) - ResetParamField(dinf->track+slot); - } -} - /////////////////////////////////////////////////////////////////////////////// -void AddParamDistributionInfo ( DistributionInfo_t * dinf, bool overwrite ) +int IsSSChecksum ( sha1_size_t *res, ccp source, int slen ) { - DASSERT(dinf); - - char buf[100]; + // slen < 0 => strlen(source) + // returns: 0:fail, 1:SHA1, 2:DB64 - //-- UUID - - uuid_buf_t uuid; - bool create_uuid = overwrite; - if (!create_uuid) - { - const ParamFieldItem_t *it = FindParamField(&dinf->param,"UUID"); - if ( !it || !it->data || ScanUUID(uuid,(ccp)it->data) == (ccp)it->data ) - create_uuid = true; - } - - if (create_uuid) - { - CreateTextUUID(buf,sizeof(buf)); - ReplaceParamField(&dinf->param,"UUID",false,0,STRDUP(buf)); - } + ccp end = source + ( slen < 0 ? strlen(source) : slen ); + // skip leading controls + while ( source < end && (uchar)*source <= ' ' ) + source++; - //-- time stamps - - time_t tim = time(0); - struct tm *tm = localtime(&tim); - strftime(buf,sizeof(buf),"%F %T %z",tm); - - if ( overwrite || !FindParamField(&dinf->param,"FIRST-CREATION") ) - ReplaceParamField(&dinf->param,"FIRST-CREATION",false,0,STRDUP(buf)); - ReplaceParamField(&dinf->param,"LAST-UPDATE",false,0,STRDUP(buf)); -} - -// -/////////////////////////////////////////////////////////////////////////////// -/////////////// slot translation /////////////// -/////////////////////////////////////////////////////////////////////////////// + ccp start = source; + while ( source < end && (uchar)*source > ' ' ) + source++; -char * ScanSlot ( uint *res_slot, ccp source, bool need_point ) -{ - DASSERT(res_slot); - DASSERT(source); - *res_slot = 0; + sha1_size_t temp; + if (!res) + res = &temp; - char *end; - uint slot = strtoul(source,&end,10); - if ( !need_point - && slot >= MIN_DISTRIBUTION_SLOT - && slot < MAX_DISTRIBUTION_TRACK - && (uchar)*end <= ' ' - && ( end-source == 2 || end-source == 3 )) + const uint len = source - start; + if ( len == 40 ) { - *res_slot = slot; - return end; - } - - slot *= 10; - if ( slot < MIN_DISTRIBUTION_SLOT || slot >= MAX_DISTRIBUTION_TRACK || *end != '.' ) - return (char*)source; - - uint track = strtoul(end+1,&end,10); - slot += track; - if ( track < 1 || track > 9 || slot >= MAX_DISTRIBUTION_TRACK ) - return (char*)source; - - *res_slot = slot; - while ( *end == ' ' || *end == '\t' ) - end++; - return end; -} - -/////////////////////////////////////////////////////////////////////////////// - -void NormalizeSlotTranslation ( char *buf, uint bufsize, ccp name, - char ** p_first_para, char ** p_first_brack ) -{ - DASSERT(buf); - DASSERT(bufsize>10); - - if (!name) - name = ""; - - char *dest = buf, *buf_end = buf + bufsize - 4; - char *first_para = 0; - char *first_brack = 0; - - uint have_space = 0; - while ( *name && dest < buf_end ) - { - int ch = (uchar)*name++; - switch(ch) + ccp ptr; + for ( ptr = start; ptr < source; ptr++ ) { - case ' ': - case '_': - case '-': - case '+': - have_space++; - break; - - case '\'': - break; // ignore - - case '[': - if (!first_brack) - first_brack = dest; - goto bracket; - - case '(': - if (!first_para) - first_para = dest; - // fall through - - case '{': - bracket: - ch = '('; - // fall through - - case '.': - if (have_space) - { - have_space = 0; - *dest++ = ' '; - } - *dest++ = ch; - break; - - case '}': - case ')': - case ']': - *dest++ = ')'; - break; - - default: - ch = tolower(ch); - if ( ch >= 'a' && ch <= 'z' || ch >= '0' && ch <= '9' ) - { - if (have_space) - { - have_space = 0; - *dest++ = ' '; - } - *dest++ = ch; - } + const u8 type = TableNumbers[(u8)*ptr]; + if ( type >= 16 ) break; } - } - - if ( dest > buf ) - { - if ( dest > buf+4 && !memcmp(dest-4,".szs",4) || !memcmp(dest-4,".wbz",4) ) - dest -= 4; - if ( dest > buf+2 && !memcmp(dest-2,"_d",2) ) - dest -= 2; - *dest = 0; - - if ( first_brack) - { - if ( first_brack >= dest ) - first_brack = 0; - else - dest = first_brack; - } - - if ( first_para >= dest ) - first_para = 0; - } - else - first_para = first_brack = 0; - - if (p_first_para) - *p_first_para = first_para; - if (p_first_brack) - *p_first_brack = first_brack; -} - -/////////////////////////////////////////////////////////////////////////////// - -uint DefineSlotTranslation - ( ParamField_t *translate, bool is_arena, uint slot, ccp name ) -{ - DASSERT(translate); - if (!name) - return 0; - - if (is_arena) - { - if ( slot >= MAX_DISTRIBUTION_ARENA ) - slot = 0; - else - slot += DISTRIBUTION_ARENA_DELTA; - } - else - { - if ( slot >= MAX_DISTRIBUTION_TRACK ) - slot = 0; - } - - char buf[1000]; - char *first_para = 0, *first_brack = 0; - NormalizeSlotTranslation(buf,sizeof(buf),name,&first_para,&first_brack); - - uint count = 0; - if (*buf) - { - ReplaceParamField(translate,buf,false,slot,0); - count++; - - if (first_brack) - { - *first_brack = 0; - ReplaceParamField(translate,buf,false,slot,0); - count++; - } - if (first_para) + if ( ptr == source ) { - *first_para = 0; - ReplaceParamField(translate,buf,false,slot,0); - count++; + Sha1Hex2Bin(res->hash,start,source); + return 1; } } - - return count; -} - -/////////////////////////////////////////////////////////////////////////////// - -#undef EARLY_NUM_SLOT -#define EARLY_NUM_SLOT 1 - -int FindSlotByTranslation ( const ParamField_t *translate, ccp fname, ccp sha1 ) -{ - DASSERT(translate); - ccp slash = strrchr(fname,'/'); - if (slash) - fname = slash+1; - - #if EARLY_NUM_SLOT - uint slot; - ScanSlot(&slot,fname,false); - if (slot) - return slot; - #endif - - char buf[1000]; - - char *first_para = 0, *first_brack = 0; - NormalizeSlotTranslation(buf,sizeof(buf),fname,&first_para,&first_brack); - const ParamFieldItem_t *it = FindParamField(translate,buf); - if ( !it && first_brack ) - { - *first_brack = 0; - it = FindParamField(translate,buf); - } - - if ( !it && first_para ) - { - *first_para = 0; - it = FindParamField(translate,buf); - } - - if ( !it && sha1 ) - it = FindParamField(translate,sha1); - - - #if EARLY_NUM_SLOT - return it ? it->num : 0; - #else - if (it) - return it->num; - - uint slot; - ScanSlot(&slot,fname,false); - return slot; - #endif -} - -#undef EARLY_NUM_SLOT - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -void ScanSlotTranslation - ( ParamField_t *translate, ParamField_t *param, ccp fname, bool ignore ) -{ - DASSERT(translate); - DASSERT(fname); - PRINT(" - scan translation%s: %s\n", param ? "+param" : "", fname); - - szs_file_t szs; - InitializeSZS(&szs); - enumError err = LoadSZS(&szs,fname,true,ignore,true); - if (err) - return; - - - //--- support for special file formats - - switch((int)szs.fform_arch) - { - case FF_BMG: - if (verbose>1) - printf(" - scan translation [BMG]: %s\n",fname); - ResetSZS(&szs); - return; - } - - - //--- standard text file - - if ( verbose > 1 ) - printf("Scan translation%s[TEXT/%s]: %s\n", - param ? "+param" : "", - GetExtFF(szs.fform_file,szs.fform_arch), fname ); - else if ( verbose >= 0 ) - printf("Scan %s\n",fname); - - char *eol = (char*)szs.data; - char *end = eol + szs.size; - - for(;;) + else if ( len == CHECKSUM_DB_SIZE ) { - while ( eol < end && (uchar)*eol <= ' ' ) - eol++; - if ( eol == end ) - break; - - char *src = eol; - while ( eol < end && *eol != 0 && *eol != '\r' && *eol != '\n' ) - eol++; - *eol = 0; - - if ( *src == '#' || *src == '!' ) - continue; - - - //--- manage parameters - - if ( *src == '@' ) - { - if (!param) - continue; - - char name_buf[100], *name = name_buf; - src++; - - for(;;) - { - const char ch = *src; - if ( !isalnum(ch) && ch != '_' && ch != '-' && ch != '.' ) - break; - src++; - if ( name < name_buf + sizeof(name_buf) - 1 ) - *name++ = toupper(ch); - } - - while ( src < eol && (uchar)*src <= ' ' ) - src++; - if ( src < eol && *src == '=' ) - { - src++; - while ( src < eol && (uchar)*src <= ' ' ) - src++; - } - - if ( name > name_buf ) - { - //PRINT(" %.*s = |%.*s|\n",(int)(name-name_buf),name_buf,(int)(eol-src),src); - ReplaceParamField( param, MEMDUP(name_buf,name-name_buf), - true, 0, MEMDUP(src,eol-src) ); - } - continue; - } - - //PRINTF("LINE: |%.*s|\n",(int)(eol-src),src); - - - //--- skip "()" | detect SHA1 checksum - - char *sha1 = 0; - if ( *src == '(' ) - { - while ( src < eol && *src != ')' ) - src++; - if ( src++ == eol ) - continue; - } - else - { - // detect sha1 checksum - - char *x = src; - while ( x < eol && isalnum((int)*x) ) - x++; - if ( x < eol && x - src == 40 ) - { - sha1 = src; - src = x; - } - } - - while ( src < eol && (uchar)*src <= ' ' ) - src++; - - const bool is_arena = *src == 'a' || *src == 'A'; - if (is_arena) - src++; - - if (!isdigit((int)*src)) - continue; - - uint slot; - src = ScanSlot(&slot,src,true); // ??? - if (!slot) - continue; - - char *tab = strrchr(src,'\t'); - if (tab) - src = tab; - while ( src < eol && (uchar)*src <= ' ' ) - src++; - - DefineSlotTranslation(translate,is_arena,slot,src); - if (sha1) + char buf[sizeof(sha1_size_t)+12]; + uint len64 = DecodeBase64(buf,sizeof(buf),start,len,TableDecode64url,false,0); + if ( len64 == sizeof(sha1_size_t) ) { - sha1[40] = 0; - DefineSlotTranslation(translate,is_arena,slot,sha1); + memcpy(res,buf,sizeof(*res)); + return 2; } } - ResetSZS(&szs); + // no a checksum + memset(res,0,sizeof(sha1_size_t)); + return 0; } // diff --git a/project/src/lib-checksum.h b/project/src/lib-checksum.h index 2215f0b..dec46e4 100644 --- a/project/src/lib-checksum.h +++ b/project/src/lib-checksum.h @@ -41,6 +41,7 @@ #define _GNU_SOURCE 1 #include "dclib-types.h" +#include "lib-ledis.h" typedef struct szs_file_t szs_file_t; @@ -57,7 +58,7 @@ typedef struct szs_file_t szs_file_t; typedef struct sha1_size_t { sha1_hash_t hash; // SHA1 checksum (binary) - u32 size; // size of date (big endian) + u32 size; // size of data (big endian) } __attribute__ ((packed)) sha1_size_t; @@ -74,88 +75,10 @@ void CreateSSChecksumDBBySZS ( char *buf, uint bufsize, const szs_file_t *szs ); enumError GetSSByFile ( sha1_size_t *ss, ccp path1, ccp path2 ); -// -/////////////////////////////////////////////////////////////////////////////// -/////////////// struct DistributionInfo_t /////////////// -/////////////////////////////////////////////////////////////////////////////// - -#define DISTRIB_MAGIC8 "#DISTRIB" -#define DISTRIB_MAGIC8_NUM 0x2344495354524942ull - -#define DISTRIBUTION_FILE_VERSION 1 -#define MIN_DISTRIBUTION_SLOT 10 // included -#define MAX_DISTRIBUTION_TRACK 10000 // excluded -#define MAX_DISTRIBUTION_ARENA 1000 // excluded -#define DISTRIBUTION_ARENA_DELTA 100000 - -#define DEFAULT_DISTIBUTION_FNAME "distribution.txt" - -//----------------------------------------------------------------------------- - -static inline bool IsValidDistribArena ( uint slot ) -{ - return slot == DISTRIBUTION_ARENA_DELTA - || slot >= DISTRIBUTION_ARENA_DELTA+MIN_DISTRIBUTION_SLOT - && slot < DISTRIBUTION_ARENA_DELTA+MAX_DISTRIBUTION_ARENA; -} - -static inline bool IsValidDistribTrack ( uint slot ) -{ - return !slot - || slot >= MIN_DISTRIBUTION_SLOT && slot < MAX_DISTRIBUTION_TRACK; -} - -static inline bool IsValidDistribSlot ( uint slot ) -{ - return !slot - || slot >= MIN_DISTRIBUTION_SLOT - && slot < MAX_DISTRIBUTION_TRACK - || slot == DISTRIBUTION_ARENA_DELTA - || slot >= DISTRIBUTION_ARENA_DELTA+MIN_DISTRIBUTION_SLOT - && slot < DISTRIBUTION_ARENA_DELTA+MAX_DISTRIBUTION_ARENA; -} - -//----------------------------------------------------------------------------- -// [[DistributionInfo_t]] - -typedef struct DistributionInfo_t -{ - ParamField_t translate; - ParamField_t param; - ParamField_t arena[MAX_DISTRIBUTION_ARENA]; - ParamField_t track[MAX_DISTRIBUTION_TRACK]; -} -DistributionInfo_t; - -//----------------------------------------------------------------------------- - -void InitializeDistributionInfo - ( DistributionInfo_t * dinf, bool add_default_param ); -void ResetDistributionInfo ( DistributionInfo_t *dinf ); -void AddParamDistributionInfo ( DistributionInfo_t * dinf, bool overwrite ); - -enumError ScanDistribFile - ( DistributionInfo_t *dinf, ccp fname, int ignore, bool assume_arena ); - -// -/////////////////////////////////////////////////////////////////////////////// -/////////////// slot translation /////////////// -/////////////////////////////////////////////////////////////////////////////// - -char * ScanSlot ( uint *res_slot, ccp source, bool need_point ); - -void NormalizeSlotTranslation ( char *buf, uint bufsize, ccp name, - char ** p_first_para, char ** p_first_brack ); - -uint DefineSlotTranslation - ( ParamField_t *translate, bool is_arena, uint slot, ccp name ); - -// 'sha1' can be NULL -int FindSlotByTranslation ( const ParamField_t *translate, ccp fname, ccp sha1 ); - -// 'param' not NULL: Scan "@PARAM = VALUE" lines and store result. -void ScanSlotTranslation - ( ParamField_t *translate, ParamField_t *param, ccp fname, bool ignore ); +// slen < 0 => strlen(source) +// returns: 0:fail, 1:SHA1, 2:DB64 +// if res != NULL: scanned SHA1 +int IsSSChecksum ( sha1_size_t *res, ccp source, int slen ); // /////////////////////////////////////////////////////////////////////////////// diff --git a/project/src/lib-ctcode.c b/project/src/lib-ctcode.c index 4b3f0bb..ff92a0c 100644 --- a/project/src/lib-ctcode.c +++ b/project/src/lib-ctcode.c @@ -36,7 +36,7 @@ ***************************************************************************/ #include "lib-ctcode.h" -#include "lib-lecode.h" +#include "lib-ledis.h" #include "lib-szs.h" #include "lib-xbmg.h" #include "lib-bzip2.h" @@ -95,7 +95,7 @@ void SetName16 ( u16 *dest, ccp src ) /////////////////////////////////////////////////////////////////////////////// -static void SetTrackBMG +void SetTrackBMG ( ctcode_t *ctcode, // valid CTCODE bmg_t *bmg, // destination BMG @@ -152,6 +152,18 @@ static inline void SetTrackString //----------------------------------------------------------------------------- +static inline void SetTrackXString +( + ctcode_t *ctcode, // valid CTCODE + uint tidx, // index of the track + ccp text // any text +) +{ + SetTrackBMG(ctcode,&ctcode->track_xstring,tidx,text); +} + +//----------------------------------------------------------------------------- + static inline void SetTrackIdentifier ( ctcode_t *ctcode, // valid CTCODE @@ -299,6 +311,33 @@ static ccp GetTrackString } //----------------------------------------------------------------------------- +#if 0 + + static ccp GetTrackXString + ( + char *buf, // dest buffer + uint size, // size of 'buf' + ctcode_t *ctcode, // valid CTCODE + uint tidx, // index of the track + const bmg_item_t *bi // NULL or bmg text + ) + { + DASSERT(buf); + DASSERT(size); + DASSERT(ctcode); + + if ( !bi || !bi->len ) + bi = FindItemBMG(&ctcode->track_xstring,tidx+ctcode->ctb.track_name1.beg); + + if ( bi && bi->len ) + PrintString16BMG(buf,size,bi->text,bi->len,BMG_UTF8_MAX,0,opt_bmg_colors); + else + *buf = 0; + return buf; + } + +#endif +//----------------------------------------------------------------------------- static ccp GetTrackIdentifier ( @@ -449,8 +488,11 @@ void InitializeCTCODE ( ctcode_t * ctcode, ct_mode_t ct_mode ) ctcode->use_lecode = lecode_enabled; ctcode->fname = EmptyString; + + ctcode->n_strings = 4; InitializeBMG(&ctcode->track_file); InitializeBMG(&ctcode->track_string); + InitializeBMG(&ctcode->track_xstring); InitializeBMG(&ctcode->track_ident); } @@ -461,6 +503,7 @@ void ResetCTCODE ( ctcode_t * ctcode ) DASSERT(ctcode); ResetBMG(&ctcode->track_file); ResetBMG(&ctcode->track_string); + ResetBMG(&ctcode->track_xstring); ResetBMG(&ctcode->track_ident); ResetDataCTCODE(ctcode,false); FreeString(ctcode->fname); @@ -480,7 +523,7 @@ static void SetupUsedSlotList ( u8 *slot_list, uint n_slots, uint le_phase ) { memset( slot_list + MKW_ARENA_BEG, 2, - LE_FIRST_LOWER_CT_SLOT - MKW_ARENA_BEG ); + LE_FIRST_CT_SLOT - MKW_ARENA_BEG ); if ( le_phase == 1 ) { const uint max = n_slots < LE_FIRST_UPPER_CT_SLOT @@ -525,7 +568,7 @@ void SetupUsedSlotsCTCODE ( ctcode_t * ctcode ) { SetupUsedSlotList( ctcode->used_slot, sizeof(ctcode->used_slot), ctcode->ctb.le_phase ); - ctcode->n_tracks = LE_FIRST_LOWER_CT_SLOT; + ctcode->n_tracks = LE_FIRST_CT_SLOT; } else { @@ -1227,7 +1270,7 @@ void DumpCTCODE ( FILE *f, uint indent, ctcode_t * ctcode ) PrepareExportCTCODE(ctcode); - if ( ctcode->fform == FF_CT_TEXT ) + if ( ctcode->fform == FF_CTDEF ) fprintf(f,"\n%*sSections in virtual binary code:\n\n",indent,""); else fprintf(f,"\n%*sSections:\n\n",indent,""); @@ -1251,7 +1294,7 @@ void DumpCTCODE ( FILE *f, uint indent, ctcode_t * ctcode ) if (long_count) { - if ( ctcode->fform == FF_CT_TEXT ) + if ( ctcode->fform == FF_CTDEF ) fprintf(f,"\n%*sHexdump of headers in virtual binary code:\n",indent,""); else fprintf(f,"\n%*sHexdump of headers:\n",indent,""); @@ -1379,8 +1422,6 @@ static int InsertTrackIntoCup ( ctcode_t *ctcode, uint tidx, bool hidden ) DASSERT(ctcode); DASSERT( tidx < ctcode->max_tracks ); -// [[2do]] [[hidden]] - if (hidden) { ctcode->tracks_defined++; @@ -1567,6 +1608,15 @@ static enumError ScanRTL_Option ( ctcode_t *ctcode, ScanInfo_t * si ) ctcode->use_le_flags = num > 0; PRINT("%%LE-FLAGS = %d\n",ctcode->use_le_flags); } + else if (!strcmp(name,"N-STRINGS")) + { + long num; + enumError err = ScanUValueSI(si,&num,false); + if (err) + return err; + ctcode->n_strings = num < 0 || num > 255 ? 255 : num; + PRINT("%%LE-STRINGS = %d\n",ctcode->n_strings); + } else if (!strcmp(name,"REPLACE-AT")) { long num; @@ -1883,7 +1933,8 @@ static enumError ScanRTL_Track //--- scan track_file, track_string and track_ident => create fname - char *track_file = 0, *track_string = 0, *track_ident = 0; + // in scan order! + char *track_file = 0, *track_string = 0, *track_ident = 0, *track_xstring = 0; char fname[100]; err = ConcatStringsSI(si,&track_file,0); @@ -1892,6 +1943,7 @@ static enumError ScanRTL_Track abort: FreeString(track_file); FreeString(track_string); + FreeString(track_xstring); FreeString(track_ident); return err; } @@ -1926,9 +1978,30 @@ static enumError ScanRTL_Track err = ConcatStringsSI(si,&track_ident,0); if (err) goto abort; + + if ( NextCharSI(si,false) == ';' ) + { + SkipCharSI(si,';'); + err = ConcatStringsSI(si,&track_xstring,0); + if (err) + goto abort; + } } } + //-- skip additional strings + + for ( int n = (int)ctcode->n_strings - 4; n > 0; n-- ) + { + if ( NextCharSI(si,false) == ';' ) + { + SkipCharSI(si,';'); + err = ConcatStringsSI(si,0,0); + if (err) + goto abort; + } + } + CheckEolSI(si); @@ -1948,10 +2021,17 @@ static enumError ScanRTL_Track track_string = ReplaceName(track_string,"@SLOT@",buf); track_string = ReplaceName(track_string,"@@","@"); PRINT(">>> REPLACED: %s\n",track_string); + + PRINT(">>> REPLACE: %s\n",track_xstring); + snprintf(buf,sizeof(buf),"%03X",tidx); + track_xstring = ReplaceName(track_xstring,"@SLOT@",buf); + track_xstring = ReplaceName(track_xstring,"@@","@"); + PRINT(">>> REPLACED: %s\n",track_xstring); } SetTrackFile(ctcode,tidx,track_file); SetTrackString(ctcode,tidx,track_string); + SetTrackXString(ctcode,tidx,track_xstring); SetTrackIdentifier(ctcode,tidx,track_ident); td->music_id = htonl(music_id); @@ -1973,6 +2053,7 @@ static enumError ScanRTL_Track FreeString(track_file); FreeString(track_string); + FreeString(track_xstring); FreeString(track_ident); return ERR_OK; @@ -2026,7 +2107,7 @@ enumError ScanSetupArena ( ctcode_arena_t *ca, ScanInfo_t * si ) if (err) return err; - if ( property_id > 0 && ( property_id < MKW_ARENA_BEG || property_id >= MKW_ARENA_END )) + if ( property_id > 0 && !IsMkwArena(property_id) ) { ccp eol = FindNextLineFeedSI(si,true); if ( si->no_warn <= 0 ) @@ -2236,7 +2317,7 @@ enumError ScanTextArena break; default: - // ignore all other section without any warnings + // ignore all other sections without any warnings break; } @@ -2363,7 +2444,7 @@ enumError ScanTextCTCODE break; default: - // ignore all other section without any warnings + // ignore all other sections without any warnings break; } @@ -2384,6 +2465,7 @@ enumError ScanTextCTCODE // [[file-name]] UsePatchingListBMG(&ctcode->track_string); + //UsePatchingListBMG(&ctcode->track_xstring); CalcCupRefCTCODE(ctcode,true); return max_err; } @@ -2874,7 +2956,7 @@ enumError ScanLEBinCTCODE for ( tidx = 0; tidx < max; tidx++, td++, prop++, music++, flags++, ct_flags++ ) { - if ( tidx >= 0x2a && tidx < LE_FIRST_LOWER_CT_SLOT ) + if ( tidx >= 0x2a && tidx < LE_FIRST_CT_SLOT ) { td->music_id = htonl(0x75); td->property_id = htonl(0); @@ -2945,7 +3027,8 @@ enumError ScanCTCODE enumError err; // [[analyse-magic]] - switch (GetByMagicFF(data,data_size,data_size)) + const file_format_t fform = GetByMagicFF(data,data_size,data_size); + switch (fform) { case FF_BRRES: err = ScanBrresCTCODE(ctcode,ct_mode,data,data_size,cdata); @@ -2969,14 +3052,14 @@ enumError ScanCTCODE ctcode->fform = FF_CT1_DATA; break; - case FF_CT_TEXT: + case FF_CTDEF: #if USE_NEW_CONTAINER_CTC FreeContainerData(cdata); #else FreeContainer(cdata); #endif - err = ScanTextCTCODE(ctcode,ct_mode,data,data_size); - ctcode->fform = FF_CT_TEXT; + err = ScanTextCTCODE(ctcode,ct_mode,data,data_size); + ctcode->fform = FF_CTDEF; break; case FF_LE_BIN: @@ -2985,7 +3068,7 @@ enumError ScanCTCODE #else FreeContainer(cdata); #endif - err = ScanLEBinCTCODE(ctcode,ct_mode,data,data_size); + err = ScanLEBinCTCODE(ctcode,ct_mode,data,data_size); ctcode->fform = FF_LE_BIN; break; @@ -2997,13 +3080,21 @@ enumError ScanCTCODE #endif if (ct_mode) InitializeCTCODE(ctcode,ct_mode); - return ERROR0(ERR_INVALID_DATA, - "No CTCODE file: %s\n", ctcode->fname ? ctcode->fname : "?"); + + ccp fname = ctcode->fname ? ctcode->fname : "?"; + return fform == FF_UNKNOWN + ? ERROR0(ERR_INVALID_DATA, + "Need CT-CODE compatible file, but have unknown file format: %s\n", + fname) + : ERROR0(ERR_INVALID_DATA, + "Need CT-CODE compatible file, but file format is %s: %s", + GetNameFF(fform,0),fname); } if ( !err && opt_patch_names ) PatchNamesCTCODE(ctcode); + ImportCtcodeLDUMP(ctcode); return err; } @@ -3059,7 +3150,7 @@ enumError LoadCTCODE if (!strcmp(fname,"0")) { - ctcode->fform = FF_CT_TEXT; + ctcode->fform = FF_CTDEF; ctcode->fname = STRDUP(fname); return ERR_OK; } @@ -3183,7 +3274,7 @@ enumError SaveTextCTCODE fputs(section_sep,F.f); } else - fprintf(F.f,"%s\r\n\r\n",CT_TEXT_MAGIC8); + fprintf(F.f,"%s\r\n\r\n",CT_DEF_MAGIC8); MARK_USED(keybuf,namebuf); fprintf( F.f, text_ctcode_setup_cr, @@ -3232,7 +3323,6 @@ enumError SaveTextCTCODE if ( omode.mode & 1 && ctcode->used_tracks ) { -// [[2do]] [TRACK-LIST] fprintf(F.f,"%s[RACING-TRACK-LIST]\r\n%s", section_sep, omode.syntax @@ -3600,7 +3690,7 @@ enumError SaveMessageCTCODE prev_cup = bi->text; prev_cup_len = bi->len; } - else if ( prev_cup && tidx >= LE_FIRST_LOWER_CT_SLOT ) + else if ( prev_cup && tidx >= LE_FIRST_CT_SLOT ) { bmg_item_t *bi = InsertItemBMG(&bmg,ctcode->ctb.cup_ref.beg+tidx,0,0,0); @@ -3888,7 +3978,7 @@ enumError SaveCTCODE { REF("rmcj","mod2.bin", ctcode_mod2_jap_bz2), FF_MOD2 }, { REF("rmcj","ovr1.bin", ctcode_ovr1_jap_bz2), FF_OVR1 }, - // [[2do]] [[ct-korea]] + // [[ct-korea]] { REF("rmck","boot_code.bin", 0), FF_CT0_CODE }, { REF("rmck","boot_data.bin", 0), FF_CT0_DATA }, { REF("rmck","bad1code.bin", 0), FF_CT1_CODE }, @@ -4056,7 +4146,7 @@ enumError SaveCTCODE static const u32 pal[] = { 0x8065920c, 0x80653644, 0x8065a034, 0 }; static const u32 usa[] = { 0x80654d84, 0x8064f1bc, 0x80655bac, 0 }; static const u32 jap[] = { 0x80658878, 0x80652cb0, 0x806596a0, 0 }; - static const u32 kor[] = { 0 }; // [[2do]] [[ct-korea]] + static const u32 kor[] = { 0 }; // [[ct-korea]] DeactivateMOD2( bz2s+BIDX_MOD2, lang_mode, pal, usa, jap, kor ); } @@ -4068,7 +4158,7 @@ enumError SaveCTCODE static const u32 pal[] = { 0x808a5b30, 0 }; static const u32 usa[] = { 0x808a1058, 0 }; static const u32 jap[] = { 0x808a4c90, 0 }; - static const u32 kor[] = { 0 }; // [[2do]] [[ct-korea]] + static const u32 kor[] = { 0 }; // [[ct-korea]] DeactivateMOD2( bz2s+BIDX_MOD2, lang_mode, pal, usa, jap, kor ); } } @@ -4521,7 +4611,7 @@ int ScanOptAllowSlots ( ccp arg ) } } - if ( logging > 1 ) // must be set before --allow-slots + if ( logging >= 2 ) // must be set before --allow-slots HexDump16(stdlog,0,0,ctcode_used_slot,sizeof(ctcode_used_slot)); return 0; } diff --git a/project/src/lib-ctcode.h b/project/src/lib-ctcode.h index 9f6bf5b..e419f11 100644 --- a/project/src/lib-ctcode.h +++ b/project/src/lib-ctcode.h @@ -58,8 +58,8 @@ #define CT_MOD2_MAGIC_NUM 0x4d4f4432 #define CT_OVR1_MAGIC_NUM 0x4f565231 -#define CT_TEXT_MAGIC8 "#CT-CODE" -#define CT_TEXT_MAGIC8_NUM 0x2343542d434f4445ull +#define CT_DEF_MAGIC8 "#CT-CODE" +#define CT_DEF_MAGIC8_NUM 0x2343542d434f4445ull #define CT_CODE_TEX_OFFSET 0x760 // CTCODE offset in TEX0 file #define CT_CODE_TEX_IMAGE_OFF 0x658c0 // IMAGE offset in TEX0 file @@ -83,11 +83,16 @@ #define LE_CODE_MAX_TRACKS BMG_N_LE_TRACK // max supported tracks #define LE_CODE_MAX_CUPS BMG_N_LE_RCUP // max supported cups, must be <= 0x100 + +#define LE_FIRST_CT_SLOT MKW_LE_SLOT_BEG // LE: first used custom slot +#define LE_LAST_CT_SLOT (MKW_LE_SLOT_END-1) // LE: last used custom slot +#define LE_FIRST_RANDOM_SLOT MKW_LE_RANDOM_BEG // LE: first used random slot +#define LE_LAST_RANDOM_SLOT (MKW_LE_RANDOM_END-1) // LE: last used random slot + +// 3 [[obsolete]] definitions #define LE_FIRST_LOWER_CT_SLOT 0x44 // LE: first used custom slot #define LE_FIRST_UPPER_CT_SLOT 0x120 // LE: first used upper custom slot #define LE_LAST_UPPER_CT_SLOT 0x13d // LE: first used upper custom slot -#define LE_FIRST_RANDOM_SLOT 0x3e // LE: first used upper custom slot -#define LE_LAST_RANDOM_SLOT 0x41 // LE: first used upper custom slot #define CODE_MAX_TRACKS LE_CODE_MAX_TRACKS // max(CT/LE CODE_MAX_TRACKS) #define CODE_MAX_CUPS LE_CODE_MAX_CUPS // max(CT/LE CODE_MAX_CUPS) @@ -112,6 +117,9 @@ typedef u8 le_flags_t; // type of ttack flags static inline int TrackByAliasLE ( le_property_t prop, le_music_t music ) { return prop << 8 | music; } +ccp PrintLEFT ( le_flags_t flags ); +le_flags_t ScanLEFT ( ccp text ); + // /////////////////////////////////////////////////////////////////////////////// /////////////// ctcode_*_t /////////////// @@ -229,7 +237,7 @@ ctcode_cupref_t; typedef struct ctcode_arena_t { le_property_t prop[MKW_N_ARENAS]; // only valid if !=0 - le_music_t music[MKW_N_ARENAS]; // only valid if le_prop[]!=0 + le_music_t music[MKW_N_ARENAS]; // only valid if prop[]!=0 } ctcode_arena_t; @@ -266,7 +274,7 @@ typedef struct ctcode_t uint n_unused_cups; // number of unused cups - //--- arenas setup fir LE-CODE + //--- arenas setup for LE-CODE ctcode_arena_t arena; // data of section [SETUP-ARENA] @@ -282,6 +290,7 @@ typedef struct ctcode_t bmg_t track_file; // file names of any length bmg_t track_string; // track strings of any length + bmg_t track_xstring; // extended track strings of any length bmg_t track_ident; // identifiers of any length (e.g. checksums) // property, music and le_flags @@ -309,6 +318,7 @@ typedef struct ctcode_t bool replace_at; // true: Replace "@..@" on track names bool use_lecode; // true: enable le-code support bool use_le_flags; // true: le_flags enabled + u8 n_strings; // number of used strings in track params (for syntax check) struct le_lpar_t *lpar; // NULL or LPAR parameters @@ -397,6 +407,14 @@ ccp PrintMusicID ( uint mid, bool force_hex ); ccp PrintPropertyID ( uint tid, bool force_hex ); ccp PrintArenaSlot ( uint tid, bool force_hex ); +void SetTrackBMG +( + ctcode_t *ctcode, // valid CTCODE + bmg_t *bmg, // destination BMG + uint tidx, // index of the track + ccp text // any text +); + /////////////////////////////////////////////////////////////////////////////// enumError ScanSetupArena ( ctcode_arena_t *ca, ScanInfo_t * si ); @@ -421,7 +439,7 @@ int IterateFilesCTCODE //----------------------------------------------------------------------------- static inline bool IsCtcodeFF ( file_format_t ff ) - { return ff == FF_TEX_CT || ff == FF_CT_TEXT || ff == FF_LE_BIN; } + { return ff == FF_TEX_CT || ff == FF_CTDEF || ff == FF_LE_BIN; } //----------------------------------------------------------------------------- diff --git a/project/src/lib-file.c b/project/src/lib-file.c index 18a5bd1..16037f7 100644 --- a/project/src/lib-file.c +++ b/project/src/lib-file.c @@ -46,6 +46,7 @@ #include <dirent.h> #include <stddef.h> +#include "dclib-utf8.h" #include "lib-std.h" #include "lib-szs.h" #include "lib-rarc.h" @@ -59,8 +60,7 @@ #include "lib-rkg.h" #include "lib-image.h" #include "lib-staticr.h" -#include "lib-ctcode.h" -#include "lib-lecode.h" +#include "lib-ledis.h" #include "lib-common.h" #include "lib-bzip2.h" #include "lib-checksum.h" @@ -758,7 +758,7 @@ file_format_t GetByMagicFF case ADDR_PORT_MAGIC_NUM: return FF_PORTDB; //--- see below for BOM support - case CT_TEXT_MAGIC8_NUM: return FF_CT_TEXT; + case CT_DEF_MAGIC8_NUM: return FF_CTDEF; case DISTRIB_MAGIC8_NUM: return FF_DISTRIB; case ITEMSLT_TEXT_MAGIC_NUM: return FF_ITEMSLT_TXT; case OBJFLOW_TEXT_MAGIC8_NUM: return FF_OBJFLOW_TXT; @@ -767,6 +767,12 @@ file_format_t GetByMagicFF case GH_KART_TEXT_MAGIC8_NUM: return FF_GH_KART_TXT; case GH_KOBJ_TEXT_MAGIC8_NUM: return FF_GH_KOBJ_TXT; case LE_LPAR_MAGIC_NUM: return FF_LPAR; + case LE_DEFINE_MAGIC8_NUM: return FF_LEDEF; + case LE_DISTRIB_MAGIC8_NUM: return FF_LEDIS; + case LE_REFERENCE_MAGIC8_NUM: return FF_LEREF; + case LE_STRINGS_MAGIC8_NUM: return FF_LESTR; + case LE_SHA1REF_MAGIC8_NUM: return FF_SHA1REF; + case LE_PREFIX_MAGIC8_NUM: return FF_PREFIX; } } @@ -867,7 +873,7 @@ file_format_t GetByMagicFF const u64 magic64 = be64(data+bom_len); switch(magic64) { - case CT_TEXT_MAGIC8_NUM: return FF_CT_TEXT; + case CT_DEF_MAGIC8_NUM: return FF_CTDEF; case DISTRIB_MAGIC8_NUM: return FF_DISTRIB; case ITEMSLT_TEXT_MAGIC_NUM: return FF_ITEMSLT_TXT; case OBJFLOW_TEXT_MAGIC8_NUM: return FF_OBJFLOW_TXT; @@ -1955,8 +1961,8 @@ void SearchConfigHelper ( search_file_list_t *sfl, int stop_mode ) ccp etc[] = { "wiimm", "" }; SearchConfig(sfl,CONFIG_FILE, opt,2, &xdg_home,1, &home,1, etc,2, etc+1,1, 0,0, stop_mode ); - if (logging>3) - DumpSearchFile(stdout,2,sfl,logging>4,"Config search list"); + if ( logging >= 4 ) + DumpSearchFile(stdout,2,sfl,logging>=5,"Config search list"); } //----------------------------------------------------------------------------- @@ -2543,7 +2549,7 @@ static char * trim_line ( char * ptr, bool allow_quote, char ** begin ) buf_ptr = MALLOC(need); buf_size = need; } - + uint scanned_len; int elen = ScanEscapedString(buf_ptr,buf_size,ptr,slen,true,-1,&scanned_len); if ( elen > slen ) @@ -3528,6 +3534,7 @@ int ScanOptCoding64 ( ccp arg ) { ENCODE_BASE64URL, "URL", 0, 0 }, { ENCODE_BASE64STAR, "STAR", 0, 0 }, { ENCODE_BASE64XML, "XML", 0, 0 }, + { ENCODE_HEX, "HEX", 0, 0 }, { 0,0,0,0 } }; @@ -3547,9 +3554,9 @@ int ScanOptCoding64 ( ccp arg ) EncodeMode_t SetupCoding64 ( EncodeMode_t mode, EncodeMode_t fallback ) { - PRINT("SetupCoding64(%d,%d) std=%d, url=%d, star=%d, xml=%d\n", + PRINT("SetupCoding64(%d,%d) std=%d, url=%d, star=%d, xml=%d, hex=%d\n", mode, fallback, - ENCODE_BASE64, ENCODE_BASE64URL, ENCODE_BASE64STAR, ENCODE_BASE64XML ); + ENCODE_BASE64, ENCODE_BASE64URL, ENCODE_BASE64STAR, ENCODE_BASE64XML, ENCODE_HEX ); switch(mode) { @@ -3577,6 +3584,14 @@ EncodeMode_t SetupCoding64 ( EncodeMode_t mode, EncodeMode_t fallback ) TableEncode64BySetup = TableEncode64xml; break; + #if 0 + case ENCODE_HEX: + PRINT("USE ENCODE_HEX\n"); + TableDecode64BySetup = TableDecode64; + TableEncode64BySetup = TableEncode64; + break; + #endif + default: PRINT("BASE64 -> FALLBACK\n"); return SetupCoding64( fallback == ENCODE_OFF @@ -3853,5 +3868,649 @@ slot_info_t GetSlotByName ( mem_t name, bool minus_for_empty ) // /////////////////////////////////////////////////////////////////////////////// +/////////////// mkw_prefix_t /////////////// +/////////////////////////////////////////////////////////////////////////////// + +#include "prefix.inc" + +static const mkw_prefix_t *current_prefix_tab = 0; +static int current_prefix_tab_len = 0; + +/////////////////////////////////////////////////////////////////////////////// + +int ScanOptLoadPrefix ( ccp arg ) +{ + if ( !arg || !*arg ) + return 0; + + raw_data_t raw; + enumError err = LoadRawData(&raw,true,arg,0,opt_ignore>0,0); + if ( !err && raw.fform == FF_PREFIX ) + DefinePrefixTable(raw.data,raw.data_size); + ResetRawData(&raw); + return err > ERR_WARNING; +} + +/////////////////////////////////////////////////////////////////////////////// + +static int compare_prekey ( mkw_prefix_t *a, mkw_prefix_t *b ) +{ + return strcmp(a->prefix,b->prefix); +} + +//----------------------------------------------------------------------------- + +const mkw_prefix_t * ScanPrefixTable ( ScanText_t *st ) +{ + DASSERT(st); + if (!st) + return 0; + + enum + { + IDX_PREFIX, + IDX_INFO, + IDX_FLAGS, + IDX_ORDER, + IDX_COLOR, + IDX__N + }; + + st->detect_sections++; + + int n_elem = 0; + while (NextLineScanText(st)) + { + ccp pipe = memchr(st->line,'|',st->eol-st->line); + if ( pipe && pipe > st->line ) + n_elem++; + } + if (!n_elem) + return 0; + + mkw_prefix_t *tab = CALLOC( n_elem+1, sizeof(*tab) ); + mkw_prefix_t *ptr = tab; + + RewindScanText(st); + while ( ptr < tab+n_elem < n_elem && NextLineScanText(st) ) + { + mem_t srcline = { .ptr = st->line, .len = st->eol - st->line }; + mem_t src[IDX__N+2]; + const uint n = SplitByCharMem(src,IDX__N+1,srcline,'|'); + if ( n <= IDX_INFO ) + continue; + + PRINT0("LINE %d/%d: %.*s | %.*s | %.*s | %.*s | %.*s |\n", + lineno, n_elem, + src[IDX_PREFIX].len, src[IDX_PREFIX].ptr, + src[IDX_INFO].len, src[IDX_INFO].ptr, + src[IDX_FLAGS].len, src[IDX_FLAGS].ptr, + src[IDX_ORDER].len, src[IDX_ORDER].ptr, + src[IDX_COLOR].len, src[IDX_COLOR].ptr ); + + StringCopySMem(ptr->prefix,sizeof(ptr->prefix),src[IDX_PREFIX]); + ptr->info = MEMDUP(src[IDX_INFO].ptr,src[IDX_INFO].len); + if ( n > IDX_ORDER ) + ptr->order = str2l(src[IDX_ORDER].ptr,0,10); + if ( n > IDX_COLOR ) + ptr->color = str2l(src[IDX_COLOR].ptr,0,10); + + if ( n > IDX_FLAGS ) + { + mkw_prefix_flags_t flags = 0; + mem_t f = src[IDX_FLAGS]; + if (memchr(f.ptr,'N',f.len)) flags |= MPF_NINTENDO; + if (memchr(f.ptr,'M',f.len)) flags |= MPF_MARIOKART; + if (memchr(f.ptr,'1',f.len)) flags |= MPF_PREFIX1; + if (memchr(f.ptr,'2',f.len)) flags |= MPF_PREFIX2; + ptr->flags = flags; + } + ptr++; + } + + qsort( tab, n_elem, sizeof(*tab), (qsort_func)compare_prekey ); + + st->detect_sections--; + return tab; +} + +/////////////////////////////////////////////////////////////////////////////// + +const mkw_prefix_t * DefinePrefixTable ( cvp source, uint len ) +{ + ScanText_t st; + SetupScanText(&st,source,len); + + if (current_prefix_tab) + { + for ( mkw_prefix_t *ptr = (mkw_prefix_t*)current_prefix_tab; ptr->info; ptr++ ) + FreeString(ptr->info); + FREE((void*)current_prefix_tab); + } + + current_prefix_tab = ScanPrefixTable(&st); + current_prefix_tab_len = 0; + if (current_prefix_tab) + for ( const mkw_prefix_t *ptr = current_prefix_tab; ptr->info; ptr++ ) + current_prefix_tab_len++; + + ResetScanText(&st); + return current_prefix_tab; +} + +/////////////////////////////////////////////////////////////////////////////// + +const mkw_prefix_t * GetPrefixTable(void) +{ + if (!current_prefix_tab) + { + DecodeBZIP2Manager(&prefix_inc_mgr); + DefinePrefixTable(prefix_inc_mgr.data,prefix_inc_mgr.size); + } + + return current_prefix_tab; +} + +/////////////////////////////////////////////////////////////////////////////// + +const mkw_prefix_t * FindPrefix ( ccp pre, int pre_len, bool exact ) +{ + if ( !pre || !*pre ) + return 0; + + char pbuf[20]; + if ( pre_len < 0 ) + pre_len = strlen(pre); + if ( !pre_len || pre_len >= sizeof(pbuf) ) + return 0; + if (pre[pre_len]) + { + memcpy(pbuf,pre,pre_len); + pbuf[pre_len] = 0; + pre = pbuf; + } + + const mkw_prefix_t *tab = GetPrefixTable(); + if (!tab) + return 0; + + for ( int i = 0; i < 2; i++ ) + { + int beg = 0; + int end = current_prefix_tab_len - 1; + while ( beg <= end ) + { + const uint idx = (beg+end)/2; + const mkw_prefix_t *p = tab + idx; + const int stat = strcmp(pre,p->prefix); + if ( stat < 0 ) + end = idx - 1 ; + else if ( stat > 0 ) + beg = idx + 1; + else + return p; + } + + if ( exact || i ) + return 0; + + StringUpperS(pbuf,sizeof(pbuf),pre); + if (!strcmp(pbuf,pre)) + return 0; + pre = pbuf; + } + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +enumError SavePrefixTable ( FILE *f, const mkw_prefix_t * tab ) +{ + if (!tab) + tab = GetPrefixTable(); + if ( !tab || !f ) + return ERR_MISSING_PARAM; + + fprintf(f, + "#PREFIX1\r\n" + "#> prefix|info|flags|order|\r\n" + "# Info flags: N: by Nintento, M: Original Mario Kart\r\n" + "# Functional flags: 1|2: Can be used as first|second part of a combi\r\n" + "#%.68s\r\n" + ,Minus300 ); + + int count = 0, fw_prefix = 0, fw_info = 0; + for ( ; tab->info; tab++ ) + { + count++; + exmem_t prefix = EscapeStringPipeCircS(tab->prefix); + exmem_t info = EscapeStringPipeCircS(tab->info); + + if ( fw_prefix < prefix.data.len ) + fw_prefix = prefix.data.len; + if ( fw_info < info.data.len ) + fw_info = info.data.len; + + fprintf(f,"%s|%s|%s%s%s%s|%u|\r\n", + prefix.data.ptr, info.data.ptr, + tab->flags & MPF_NINTENDO ? "N" : "", + tab->flags & MPF_MARIOKART ? "M" : "", + tab->flags & MPF_PREFIX1 ? "1" : "", + tab->flags & MPF_PREFIX2 ? "2" : "", + tab->order ); + + FreeExMem(&prefix); + FreeExMem(&info); + } + + fprintf(f, + "#-------------------\r\n" + "# %u prefixes total\r\n" + "# Max prefix len:%2u\r\n" + "# Max info len:%4u\r\n" + ,count + ,fw_prefix + ,fw_info + ); + + return ERR_OK; +} + +/////////////////////////////////////////////////////////////////////////////// + +enumError SavePrefixTableFN ( ccp fname, const mkw_prefix_t * tab ) +{ + File_t F; + enumError err = CreateFileOpt(&F,true,fname,false,0); + if (!err) + err = SavePrefixTable(F.f,tab); + CloseFile(&F,0); + return err; +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// split_filename_t /////////////// +/////////////////////////////////////////////////////////////////////////////// + +ccp opt_plus = "+"; + +/////////////////////////////////////////////////////////////////////////////// + +void ResetSPF ( split_filename_t *spf ) +{ + if (spf) + { + if (spf->input_alloced) + FreeString(spf->input); + FreeString(spf->norm.ptr); + InitializeSPF(spf); + } +} + +/////////////////////////////////////////////////////////////////////////////// + +void AnalyseSPF +( + split_filename_t *spf, // valid pointet + bool init_spf, // true: InitializeSPF(), false: ResetSPF() + ccp source, // NULL or ponter to name + ccp src_end, // end of source. if 0 then use strlen() + CopyMode_t cpm, // copy mode for 'source' + ccp plus_mode // NULL or string of chars +) +{ + if (!spf) + return; + + //--- setup + + if ( init_spf) + InitializeSPF(spf); + else + ResetSPF(spf); + + if ( !source || !*source || src_end && src_end <= source ) + return; + + char buf[100]; + + + //--- store input data + + if ( cpm == CPM_COPY ) + { + // optimization: we need only the base name + const int nlen = src_end ? src_end - source : strlen(source); + char *slash = memrchr(source,'/',nlen); + if (slash) + source = slash+1; + } + + int nlen = src_end ? src_end - source : strlen(source); + spf->input = CopyData(source,nlen,cpm,&spf->input_alloced); + + char *name = (char*)spf->input; + char *end = name + nlen; + + + //--- remove leading directory and store source + + char *slash = memrchr(name,'/',nlen); + if (slash) + { + slash++; + nlen -= slash - name; + name = slash; + } + + spf->source.ptr = name; + spf->source.len = nlen; + + + //--- split source into name + d + ext + + // find last space or ']' or ')' + for ( char *p1 = end-1; p1 > name; p1-- ) + { + if ( *p1 == '.' ) + { + spf->f_ext.ptr = p1; + spf->f_ext.len = end - p1; + end = p1; + nlen = end - name; + break; + } + + if ( (uchar)*p1 <= ' ' || *p1 == ']' || *p1 == ')' ) + break; + } + + if ( nlen >= 2 && end[-1] == 'd' && end[-2] == '_' ) + { + end -= 2; + spf->f_d.ptr = end; + spf->f_d.len = 2; + nlen -= 2; + } + + spf->f_name.ptr = name; + spf->f_name.len = nlen;; + + + //--- alloc name buffer and normalize blanks,controls and "ː⁄" + + char *p1 = MALLOC(nlen+1), *p2; + spf->norm.ptr = p1; + int have_blank = 0; + for ( ccp src = name; src < end; src++ ) + { + if ( (uchar)*src > ' ' ) + { + if ( have_blank && p1 > spf->norm.ptr ) + *p1++ = ' '; + + if (!memcmp(src,"ː",sizeof("ː")-1)) + { + *p1++ = ':'; + src += sizeof("ː") - 2; + } + else if (!memcmp(src,"⁄",sizeof("⁄")-1)) + { + *p1++ = '/'; + src += sizeof("⁄") - 2; + } + else + *p1++ = *src; + have_blank = 0; + } + else + have_blank++; + } + + *p1 = 0; + name = (char*)spf->norm.ptr; + end = p1; + nlen = end - name; + spf->norm.len = nlen; + + + //--- attributes and authors + + p1 = memrchr(name,'[',nlen); + if (p1) + { + p2 = memrchr(name,']',nlen); + if ( !p2 || p2 <= p1 ) + p2 = end; + + spf->attribs.ptr = p1+1; + spf->attribs.len = p2 - spf->attribs.ptr; + end = p1; + while ( end > name && end[-1] == ' ' ) + end--; + nlen = end - name; + } + + p1 = memrchr(name,'(',nlen); + if (p1) + { + p2 = memrchr(name,')',nlen); + if ( !p2 || p2 <= p1 ) + p2 = end; + + spf->authors.ptr = p1+1; + spf->authors.len = p2 - spf->authors.ptr; + end = p1; + while ( end > name && end[-1] == ' ' ) + end--; + nlen = end - name; + } + + + //--- check version number + + p1 = memrchr(name,' ',nlen); + p2 = memrchr(name,'}',nlen); + if ( !p1 || p2 && p1 < p2 ) + p1 = p2; + if (p1) + { + p1++; + p2 = buf; + for ( char *src = p1; src < end && p2 < buf+sizeof(buf)-1 && isalpha((int)*src); src++ ) + *p2++ = tolower((int)*src); + + int plen = p2 - buf, valid = 0; + switch (plen) + { + case 1: + valid = !memcmp(buf,"v",1) + || !memcmp(buf,"t",1); + break; + + case 2: + valid = !memcmp(buf,"rc",2) + || !memcmp(buf,"vx",2); + break; + + case 3: + valid = !memcmp(buf,"pre",3) + || !memcmp(buf,"poc",3) + || !memcmp(buf,"rcx",3); + break; + + case 4: + valid = !memcmp(buf,"beta",4) + || !memcmp(buf,"test",4) + || !memcmp(buf,"vjam",4); + break; + + case 5: + valid = !memcmp(buf,"alpha",5); + break; + + case 7: + valid = !memcmp(buf,"preview",7); + break; + } + + if (valid) + { + spf->version.ptr = p1; + spf->version.len = end - p1; + end = p1; + while ( end > name && end[-1] == ' ' ) + end--; + nlen = end - name; + } + } + + + //--- check extra + + p1 = memrchr(name,'{',nlen); + if (!p1) + p1 = memrchr(name,'(',nlen); + if (p1) + { + p2 = memrchr(p1,'}',end-p1); + if (!p2) + p2 = memrchr(p1,')',end-p1); + if (!p2) + p2 = end; + if ( p1 < p2 ) + { + spf->extra.ptr = p1+1; + spf->extra.len = p2 - spf->extra.ptr; + end = p1; + while ( end > name && end[-1] == ' ' ) + end--; + nlen = end - name; + } + } + + + //--- plus + + spf->plus_order = 999999; + if ( *name == '+' ) + { + p2 = strchr(name,' '); + if (p2) + { + p1 = name; + while ( *p1 == '+' ) + p1++; + if ( p1 == p2 ) + p1--; + + spf->plus_order = 998000 - (p1-name) * 1000; + if ( spf->plus_order < 0 ) + spf->plus_order = 0; + + ccp found = plus_mode ? strchr(plus_mode,*p1) : 0; + spf->plus_order += found ? found - plus_mode : 500 + *p1; + + spf->plus.ptr = name; + spf->plus.len = p2 - name; + name = p2+1; + nlen = end - name; + } + } + + + //--- special chars + + #if SUPPORT_SPLIT_SIGN + p1 = name; + for (;;) + { + p2 = NextUTF8Char(p1); + const int len = p2 - p1; + if ( ( !len || memcmp(p1,"→",len) && memcmp(p1,"»",len) ) + && ( len != 1 || !strchr("~>^",*p1) ) + ) + { + break; + } + p1 = p2; + } + if ( p1 > name ) + { + if ( *p1 == ' ' ) + p1++; + spf->sign.ptr = name; + spf->sign.len = p1 - name; + name = p1; + nlen = end - name; + } + #endif + + + //--- boost + + if (!strncasecmp(name,"boost:",6)) + { + spf->boost.ptr = name; + spf->boost.len = 6; + name += 6; + if ( *name == ' ' ) + name++; + nlen = end - name; + } + + + //--- game prefix + + spf->game_order = 999999; + p1 = memchr(name,' ',nlen); + if (p1) + { + const mkw_prefix_t *pre1 = FindPrefix(name,p1-name,true); + if (pre1) + { + spf->game1.ptr = name; + spf->game1.len = p1 - name; + spf->game = spf->game1; + spf->game_color = pre1->color; + spf->game_order = 1000 * pre1->order; + int add_game = 998; + name = p1+1; + nlen = end - name; + + if ( pre1->flags & MPF_PREFIX1 ) + { + p1 = memchr(name,' ',nlen); + if (p1) + { + const mkw_prefix_t *pre2 = FindPrefix(name,p1-name,true); + if ( pre2 && pre2->flags & MPF_PREFIX2 ) + { + spf->game2.ptr = name; + spf->game2.len = p1 - name; + spf->game.len += spf->game2.len + 1; + name = p1+1; + nlen = end - name; + add_game = 2*pre2->order; + } + } + } + spf->game_order += add_game; + if (spf->boost.len) + spf->game_order++; + } + } + + + //--- finally we have the pure name + + spf->name.ptr = name; + spf->name.len = nlen; +} + +// +/////////////////////////////////////////////////////////////////////////////// /////////////// END /////////////// /////////////////////////////////////////////////////////////////////////////// diff --git a/project/src/lib-geohit.c b/project/src/lib-geohit.c index 1d5a357..655a0f0 100644 --- a/project/src/lib-geohit.c +++ b/project/src/lib-geohit.c @@ -450,7 +450,7 @@ enumError ScanTextGEOHIT break; default: - // ignore all other section without any warnings + // ignore all other sections without any warnings break; } diff --git a/project/src/lib-itemslot.c b/project/src/lib-itemslot.c index 8e32690..2ec467c 100644 --- a/project/src/lib-itemslot.c +++ b/project/src/lib-itemslot.c @@ -486,7 +486,7 @@ enumError ScanTextITEMSLOT break; default: - // ignore all other section without any warnings + // ignore all other sections without any warnings break; } diff --git a/project/src/lib-kmp-pflags.c b/project/src/lib-kmp-pflags.c index d6d84da..3f827a3 100644 --- a/project/src/lib-kmp-pflags.c +++ b/project/src/lib-kmp-pflags.c @@ -1468,7 +1468,7 @@ void AnalysePFlagScenarios } #if defined(TEST) || defined(HAVE_WIIMM_EXT) - if ( logging > 1 ) + if ( logging >= 2 ) { XDump_t xd; InitializeXDump(&xd); @@ -1869,7 +1869,7 @@ static uint DiffXPF ( xpf_mode1_info_t *l1, xpf_mode1_info_t *l2, int loop ) //--- logging - if ( logging > 1 ) + if ( logging >= 2 ) { LogListXPF(l1,1,"patching list",loop,max_eval); LogListXPF(l2,2,"reference list",loop,max_eval); @@ -1951,7 +1951,7 @@ enumError RepairXPF ( kmp_t *kmp ) while (DiffXPF(kinfo,rinfo,loop)) loop++; - if ( logging > 1 ) + if ( logging >= 2 ) fputc('\n',stdlog); FREE(rinfo); diff --git a/project/src/lib-kmp-text.c b/project/src/lib-kmp-text.c index 1e83f41..9d041ac 100644 --- a/project/src/lib-kmp-text.c +++ b/project/src/lib-kmp-text.c @@ -1894,7 +1894,7 @@ static void TermGL const bool auto_prev = gl->ph->ac_mode == KMP_AC_PREV || gl->ph->ac_mode == KMP_AC_AUTO_PREV && !grp->have_prev_cmd; - if (sect_ph==KMP_ENPH) PRINT1("auto_prev=%d ; %s\n",auto_prev,grp->name); + //if (sect_ph==KMP_ENPH) PRINT1("auto_prev=%d ; %s\n",auto_prev,grp->name); #else const bool auto_prev = gl->ph->ac_mode == KMP_AC_PREV @@ -5696,7 +5696,7 @@ enumError ScanTextKMP break; default: - // ignore all other section without any warnings + // ignore all other sections without any warnings break; } diff --git a/project/src/lib-lecode.c b/project/src/lib-lecode.c index 26bd3b8..ad6d94c 100644 --- a/project/src/lib-lecode.c +++ b/project/src/lib-lecode.c @@ -36,11 +36,13 @@ ***************************************************************************/ #include "dclib-xdump.h" -#include "lib-lecode.h" +#include "lib-ledis.h" #include "lib-std.h" #include "lib-mkw.h" #include "lib-szs.h" +#include "lib-bzip2.h" #include "lpar.inc" +#include "lecode.inc" #include <stddef.h> @@ -49,11 +51,11 @@ /////////////// vars /////////////// /////////////////////////////////////////////////////////////////////////////// -ccp opt_le_define = 0; ccp opt_le_arena = 0; ccp opt_lpar = 0; ccp opt_track_dest = 0; ParamField_t opt_track_source = {0}; +int opt_szs_mode = TFMD_LINK; ccp opt_le_alias = 0; bool opt_engine_valid = false; @@ -77,26 +79,72 @@ uint GetNextRacingTrackLE ( uint tid ) if ( ++tid == 0xff ) tid++; - if ( tid > MKW_N_TRACKS && tid < LE_FIRST_LOWER_CT_SLOT ) - tid = LE_FIRST_LOWER_CT_SLOT; + if ( tid > MKW_N_TRACKS && tid < LE_FIRST_CT_SLOT ) + tid = LE_FIRST_CT_SLOT; return tid; } /////////////////////////////////////////////////////////////////////////////// -int ScanOptTrackSource ( ccp arg, int mode ) +int ScanOptTrackSource ( ccp arg, int arg_len, int mode ) { - if ( arg && *arg ) + static ccp last_key = ""; // for optimization if scanning path/*.szs + + if (arg) { - if (!opt_track_source.field) - InitializeParamField(&opt_track_source); - AppendParamField(&opt_track_source,arg,false,mode,0); + if ( arg_len < 0 ) + arg_len = strlen(arg); + if ( arg_len > 0 ) + { + char path[PATH_MAX]; + StringCopySM(path,sizeof(path),arg,arg_len); + if ( path[arg_len-1] == '/' ) + path[--arg_len] = 0; + + if ( arg_len > 0 + && strcmp(last_key,path) + && !FindParamField(&opt_track_source,path) + ) + { + PRINT("APPEND TRACK_SOURCE: 0x%03x %s\n",mode,path); + if (!opt_track_source.field) + InitializeParamField(&opt_track_source); + ParamFieldItem_t *it + = AppendParamField(&opt_track_source,path,false,mode,0); + if (it) + last_key = it->key; + } + } } return 0; } /////////////////////////////////////////////////////////////////////////////// +int ScanOptSzsMode ( ccp arg ) +{ + const KeywordTab_t keytab[] = + { + { 0, "OFF", 0, 0 }, + { TFMD_COPY, "COPY", "CP", 0 }, + { TFMD_MOVE, "MOVE", "MV", 0 }, + { TFMD_MOVE1, "MOVE1", "MV1", 0 }, + { TFMD_LINK, "LINK", "LN", 0 }, + { 0,0,0,0 } + }; + + int abbrev_count; + const KeywordTab_t *cmd = ScanKeyword(&abbrev_count,arg,keytab); + if (!cmd) + return 1; + + opt_szs_mode = cmd->id; + PRINT1("SZS-MODE=%d\n",opt_szs_mode); + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// + int ScanOpt200cc ( ccp arg ) { const int stat @@ -210,6 +258,7 @@ ccp GetLecodeSpeedoName ( speedo_mode_t mode ) } /////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// ccp GetLecodeDebugName ( le_debug_mode_t mode ) { @@ -284,16 +333,16 @@ int ScanOptDebug ( ccp arg ) } /////////////////////////////////////////////////////////////////////////////// - #if 0 -int ScanOptReserved_1bb ( ccp arg ) -{ + + int ScanOptReserved_1bb ( ccp arg ) + { opt_reserved_1bb = str2l(arg,0,10); PRINT("RESERVED_1BB=%d\n",opt_reserved_1bb); return 0; -} -#endif + } +#endif /////////////////////////////////////////////////////////////////////////////// int ScanOptAlias ( ccp arg ) @@ -356,7 +405,7 @@ int ScanOptEngine ( ccp arg ) return ERROR0(ERR_SYNTAX, "Invalid argument for option --engine, »a,b,c« expected: %s",arg); - if (sum > 0.0 ) + if ( sum > 0.0 ) { sum = 100/sum; uint total = 100; @@ -420,12 +469,50 @@ const VarMap_t * SetupVarsLECODE() { "SPEEDO$2", SPEEDO_FRACTION2 }, { "SPEEDO$3", SPEEDO_FRACTION3 }, + { "BT", LTTY_ARENA }, + { "VS", LTTY_TRACK }, + { "FILL", -1 }, + + { "RALL", MKW_LE_RANDOM_BEG+0 }, + { "RORIG", MKW_LE_RANDOM_BEG+1 }, + { "RCUST", MKW_LE_RANDOM_BEG+2 }, + { "RNEW", MKW_LE_RANDOM_BEG+3 }, + + { "LE$STRING_LIST_ENABLED", LE_STRING_LIST_ENABLED }, + { "LE$STRING_SET_ENABLED", LE_STRING_SET_ENABLED }, + { "LE$TYPE_MARKERS_ENABLED",LE_TYPE_MARKERS_ENABLED }, + {0,0} }; const struct inttab_t * ip; for ( ip = inttab; ip->name; ip++ ) DefineIntVar(&vm,ip->name,ip->val); + + char name[20]; + ccp prefix = GetNameLTTY(LTTY_ARENA); + for ( int slot = MKW_ARENA_BEG; slot < MKW_ARENA_END; slot++ ) + { + snprintf(name,sizeof(name),"%s%u",prefix,slot); + StringUpperS(name,sizeof(name),name); + DefineIntVar(&vm,name,slot); + } + + prefix = GetNameLTTY(LTTY_TRACK); + for ( int slot = MKW_TRACK_BEG; slot < MKW_TRACK_END; slot++ ) + { + snprintf(name,sizeof(name),"%s%u",prefix,slot); + StringUpperS(name,sizeof(name),name); + DefineIntVar(&vm,name,slot); + } + + prefix = GetNameLTTY(LTTY_RANDOM|LTTY_TRACK); + for ( int slot = MKW_LE_RANDOM_BEG; slot < MKW_LE_RANDOM_END; slot++ ) + { + snprintf(name,sizeof(name),"%s%u",prefix,slot); + StringUpperS(name,sizeof(name),name); + DefineIntVar(&vm,name,slot); + } } return &vm; } @@ -671,6 +758,148 @@ bool SetupLecodeDebugIfEmptyLPAR ( le_lpar_t *lpar ) // /////////////////////////////////////////////////////////////////////////////// +/////////////// enum le_region_t /////////////// +/////////////////////////////////////////////////////////////////////////////// + +le_region_t GetLEREG ( char ch ) +{ + switch (ch) + { + case 'p': case 'P': return LEREG_PAL; + case 'u': case 'U': return LEREG_USA; + case 'j': case 'J': return LEREG_JAP; + case 'k': case 'K': return LEREG_KOR; + } + return LEREG_UNKNOWN; +} + +/////////////////////////////////////////////////////////////////////////////// + +ccp GetNameLEREG ( le_region_t lereg, ccp return_on_invalid ) +{ + switch (lereg) + { + case LEREG_PAL: return "PAL"; + case LEREG_USA: return "USA"; + case LEREG_JAP: return "JAP"; + case LEREG_KOR: return "KOR"; + default: return return_on_invalid; + } +} + +/////////////////////////////////////////////////////////////////////////////// + +// replace last '@' by region name. +// returns either NULL on error or 'name' or 'buf'. If !buf or to small, then use circ-buf. + +ccp PatchNameLEREG ( char *buf, uint bufsize, ccp name, le_region_t lereg ) +{ + if (!name) + return 0; + + ccp at = strrchr(name,'@'); + ccp reg = GetNameLEREG(lereg,0); + if ( !at || !reg ) + return name; + + const uint pos = at - name; + const uint need = strlen(name)+ 3; // includes term-0 + + if ( ( !buf || !bufsize ) && need <= CIRC_BUF_MAX_ALLOC ) + { + buf = GetCircBuf(need); + bufsize = need; + } + + if ( buf && bufsize >= need ) + { + memcpy(buf,name,pos); + memcpy(buf+pos,reg,3); + strcpy(buf+pos+3,at+1); + return buf; + } + + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +const mem_t GetLecodeLEREG ( le_region_t reg ) +{ + BZ2Manager_t *lm; + switch (reg) + { + case LEREG_PAL: lm = &lecode_pal_bin_mgr; break; + case LEREG_USA: lm = &lecode_usa_bin_mgr; break; + case LEREG_JAP: lm = &lecode_jap_bin_mgr; break; + case LEREG_KOR: lm = &lecode_kor_bin_mgr; break; + default: return NullMem; + } + + DecodeBZIP2Manager(lm); + mem_t res = { .ptr = (ccp)lm->data, .len = lm->size }; + return res; +} + +/////////////////////////////////////////////////////////////////////////////// + +ccp GetLecodeBuildLEREG ( le_region_t reg ) +{ + return GetBuildLECODE(GetLecodeLEREG(reg)); +} + +//----------------------------------------------------------------------------- + +ccp GetBuildLECODE ( mem_t lecode ) +{ + if ( !lecode.ptr || lecode.len < sizeof(le_binary_head_v4_t) ) + return "?"; + + const le_binary_head_v4_t *head = (le_binary_head_v4_t*)lecode.ptr; + return ntohl(head->version) < 4 + ? PrintCircBuf("%u",ntohl(head->build_number)) + : PrintCircBuf("%u (%.10s)",ntohl(head->build_number),head->timestamp); +} + +/////////////////////////////////////////////////////////////////////////////// + +ccp GetLecodeInfoLEREG ( le_region_t reg ) +{ + return GetInfoLECODE(GetLecodeLEREG(reg)); +} + +//----------------------------------------------------------------------------- + +ccp GetInfoLECODE ( mem_t lecode ) +{ + if ( !lecode.ptr || lecode.len < sizeof(le_binary_head_v4_t) ) + return "?"; + + const le_binary_head_v4_t *head = (le_binary_head_v4_t*)lecode.ptr; + ccp region = head->region == 'P' ? "PAL" + : head->region == 'E' ? "USA" + : head->region == 'J' ? "JAP" + : head->region == 'K' ? "KOR" + : "?"; + ccp debug = head->debug == 'D' ? "/debug" : ""; + + return ntohl(head->version) < 4 + ? PrintCircBuf("%s%s v%u, build %u, %u bytes", + region, debug, + ntohl(head->version), + ntohl(head->build_number), + ntohl(head->size) ) + : PrintCircBuf("%s%s v%u, build %u (%s UTC), %u bytes", + region, debug, + ntohl(head->version), + ntohl(head->build_number), + head->timestamp, + ntohl(head->size) ); +} + +// +/////////////////////////////////////////////////////////////////////////////// /////////////// LPAR support /////////////// /////////////////////////////////////////////////////////////////////////////// @@ -938,12 +1167,16 @@ static void NormalizeLPAR ( le_lpar_t * lp ) if ( sum != 0 && sum != 100 ) { double factor = 100.0/sum; - lp->engine[0] = lp->engine[0] * factor; - lp->engine[1] = lp->engine[1] * factor; + lp->engine[0] = double2int( lp->engine[0] * factor ); + lp->engine[1] = double2int( lp->engine[1] * factor ); sum = lp->engine[0] + lp->engine[1]; if ( sum > 100 ) lp->engine[1] -= sum-100; lp->engine[2] = 100 - lp->engine[0] - lp->engine[1]; + PRINT0("NORM ENGINE: %u + %u + %u = %u [200cc=%d])\n", + lp->engine[0], lp->engine[1], lp->engine[2], + lp->engine[0] + lp->engine[1] + lp->engine[2], + lp->enable_200cc ); } if ( lp->thcloud_frames < 1 || lp->thcloud_frames > 0x7fff ) @@ -1047,33 +1280,52 @@ enumError SaveTextLPAR DASSERT(fname); PRINT("SaveTextLPAR(%s,%d)\n",fname,set_time); - - //--- open file - File_t F; enumError err = CreateFileOpt(&F,true,fname,testmode,fname); if ( err > ERR_WARNING || !F.f ) return err; + err = SaveTextFileLPAR(lpar,F.f,true); + + ResetFile(&F,set_time); + return err; +} + +/////////////////////////////////////////////////////////////////////////////// + +enumError SaveTextFileLPAR +( + le_lpar_t *lpar, // LE-CODE parameters + FILE *f, // open file + bool print_full // true: print ehader + append section [END] +) +{ + DASSERT(lpar); + DASSERT(f); + PRINT("SaveTextFileLPAR(%s,%d)\n",fname,set_time); + //--- print header + syntax info - if ( print_header && !brief_count && !export_count ) - fprintf(F.f,text_lpar_head_cr); - else - fprintf(F.f,"%s\r\n",LE_LPAR_MAGIC); + if (print_full) + { + if ( print_header && !brief_count && !export_count ) + fprintf(f,text_lpar_head_cr); + else + fprintf(f,"%s\r\n",LE_LPAR_MAGIC); + } //--- print section SetupLecodeDebugIfEmptyLPAR(lpar); - err = WriteSectionLPAR(F.f,lpar); + enumError err = WriteSectionLPAR(f,lpar); //--- print footer - fputs(section_end,F.f); - ResetFile(&F,set_time); + if (print_full) + fputs(section_end,f); return err; } @@ -1394,6 +1646,7 @@ enumError AnalyseLEBinary ana->valid = LE_HEAD_FOUND; ana->version = head->phase; + ana->region = GetLEREG(head->region); ana->data = data; ana->size = data_size; ana->head = head; @@ -1646,6 +1899,24 @@ enumError AnalyseLEBinary /////////////////////////////////////////////////////////////////////////////// +le_region_t GetLERegion ( const le_analyse_t *ana ) +{ + if (ana->valid) + { + const le_binary_head_t *h = ana->head; + switch (h->region) + { + case 'P': return LEREG_PAL; + case 'E': return LEREG_USA; + case 'J': return LEREG_JAP; + case 'K': return LEREG_KOR; + } + } + return LEREG_UNKNOWN; +} + +/////////////////////////////////////////////////////////////////////////////// + void CalculateStatsLE ( le_analyse_t *ana ) { ResetLEAnalyseUsage(ana); @@ -1659,7 +1930,7 @@ void CalculateStatsLE ( le_analyse_t *ana ) ? ana->max_property : ana->max_music; if ( ana->max_slot > ana->max_flags ) ana->max_slot = ana->max_flags; - if ( ana->max_slot < LE_FIRST_LOWER_CT_SLOT ) + if ( ana->max_slot < LE_FIRST_CT_SLOT ) return; @@ -1673,7 +1944,7 @@ void CalculateStatsLE ( le_analyse_t *ana ) used++; } - for ( slot = LE_FIRST_LOWER_CT_SLOT; slot < ana->n_slot; slot++ ) + for ( slot = LE_FIRST_CT_SLOT; slot < ana->n_slot; slot++ ) { total++; if (IsLESlotUsed(ana,slot)) @@ -1704,7 +1975,7 @@ const le_usage_t * GetLEUsage ( const le_analyse_t *ana0, bool force_recalc ) if ( force_recalc && ana->usage ) ResetLEAnalyseUsage(ana); - if ( ana->usage || ana->max_slot < LE_FIRST_LOWER_CT_SLOT ) + if ( ana->usage || ana->max_slot < LE_FIRST_CT_SLOT ) return ana->usage; ana->usage_size = ana->n_slot > 0x100 ? ana->n_slot : 0x100; @@ -1734,7 +2005,7 @@ const le_usage_t * GetLEUsage ( const le_analyse_t *ana0, bool force_recalc ) usage[slot] = IsLESlotUsed(ana,slot) ? LEU_S_TRACK|LEU_F_ONLINE : LEU_F_ONLINE; - for ( slot = LE_FIRST_LOWER_CT_SLOT; slot < ana->usage_size; slot++ ) + for ( slot = LE_FIRST_CT_SLOT; slot < ana->usage_size; slot++ ) { if (IsLESlotUsed(ana,slot)) { @@ -1904,7 +2175,7 @@ static ccp GetSlotInfo ccp music1 = "", music0 = ""; const int music = ana->music ? ana->music[tid] : -1; ccp musicx = GetMkwMusicName3(music); - if ( tid < MKW_ORIGINAL_END || tid >= LE_FIRST_LOWER_CT_SLOT ) + if ( tid < MKW_ORIGINAL_END || tid >= LE_FIRST_CT_SLOT ) { if ( music < MKW_MUSIC_MIN_ID || music > MKW_MUSIC_MAX_ID ) { @@ -2029,7 +2300,7 @@ static void DumpLETracks //--- battle cups - if ( ana->n_cup_track && ana->cup_track ) + if ( ana->n_cup_arena && ana->cup_arena ) { fprintf(f,"\n%*s%s" "%u cup%s with battle tracks (%s):%s\n", indent-2,"", col->heading, @@ -2042,7 +2313,7 @@ static void DumpLETracks { if ( cp[0] || cp[1] || cp[2] || cp[3] || cp[4] ) { - fprintf(f,"%*s" "Cup %2u:",indent,"",cup); + fprintf(f,"%*s" "Cup %3u:",indent,"",cup); uint warnings; DumpLECup(f,ana,cp,5,col,CHECK_ARENA,&warnings,done); if (warnings) @@ -2075,7 +2346,7 @@ static void DumpLETracks { if ( cp[0] || cp[1] || cp[2] || cp[3] ) { - fprintf(f,"%*s" "Cup %2u:",indent,"",cup); + fprintf(f,"%*s" "Cup %3u:",indent,"",cup); uint warnings; DumpLECup(f,ana,cp,4,col,CHECK_TRACK,&warnings,done); if (warnings) @@ -2176,7 +2447,7 @@ static void DumpLETracks uint first_unused_slot = max_used_slot + 1; if (!IsRacingTrackLE(first_unused_slot)) - first_unused_slot = LE_FIRST_LOWER_CT_SLOT; + first_unused_slot = LE_FIRST_CT_SLOT; const int unused_slots = ana->n_slot - first_unused_slot; if ( unused_slots > 0 ) fprintf(f,"%*s > %u slot%s beginning with slot %u (%x/hex) are not used.\n", @@ -2332,7 +2603,7 @@ void DumpLEAnalyse ( FILE *f, uint indent, const le_analyse_t *ana ) const le_binary_head_v4_t *h = ana->head_v4; DASSERT(h); fprintf(f, - "%*s" "Timestamp: %s\n" + "%*s" "Timestamp: %s UTC\n" ,indent,"", h->timestamp ); } @@ -2351,7 +2622,7 @@ void DumpLEAnalyse ( FILE *f, uint indent, const le_analyse_t *ana ) const le_binary_param_t *h = ana->param; DASSERT(h); fprintf(f, - "\n%*s%s" "Parameters:%s\n" + "\n%*s%s" "Parameters (LPAR):%s\n" "%*s" "Magic: %.4s\n" "%*s" "Version: %u\n" "%*s" "Param size: %x/hex = %u bytes\n" @@ -2612,7 +2883,8 @@ void DumpLEAnalyse ( FILE *f, uint indent, const le_analyse_t *ana ) /////////////// copy track files /////////////// /////////////////////////////////////////////////////////////////////////////// -void CopyTrackFile ( uint tid, ccp name ) +void TransferTrackFile + ( LogFile_t *log, uint dest_slot, ccp src_name, TransferMode_t flags ) { if ( opt_track_dest && IsDirectory(opt_track_dest,false) @@ -2620,23 +2892,24 @@ void CopyTrackFile ( uint tid, ccp name ) { char src[PATH_MAX]; char dest[PATH_MAX]; + flags &= TFMD_M_FLAGS; ParamFieldItem_t *ptr = opt_track_source.field, *end; for ( end = ptr + opt_track_source.used; ptr < end; ptr++ ) { - PathCatBufPPE(src,sizeof(src),ptr->key,name,".szs"); + PathCatBufPPE(src,sizeof(src),ptr->key,src_name,".szs"); struct stat st; if ( !stat(src,&st) && S_ISREG(st.st_mode) ) { - snprintf(dest,sizeof(dest),"%s/%03x.szs",opt_track_dest,tid); - if (!TransferFile(src,dest,ptr->num,0666)) + snprintf(dest,sizeof(dest),"%s/%03x.szs",opt_track_dest,dest_slot); + if (!TransferFile(log,dest,src,ptr->num|flags,0666)) { - PathCatBufPPE(src,sizeof(src),ptr->key,name,"_d.szs"); + PathCatBufPPE(src,sizeof(src),ptr->key,src_name,"_d.szs"); if ( !stat(src,&st) && S_ISREG(st.st_mode) ) { - snprintf(dest,sizeof(dest),"%s/%03x_d.szs",opt_track_dest,tid); - TransferFile(src,dest,ptr->num,0666); + snprintf(dest,sizeof(dest),"%s/%03x_d.szs",opt_track_dest,dest_slot); + TransferFile(log,dest,src,ptr->num|flags,0666); } } break; @@ -2645,6 +2918,32 @@ void CopyTrackFile ( uint tid, ccp name ) } } +/////////////////////////////////////////////////////////////////////////////// + +void TransferTrackBySlot + ( LogFile_t *log, uint dest_slot, uint src_slot, TransferMode_t flags ) +{ + if ( IsValidLecodeSlot(dest_slot) + && IsValidLecodeSlot(src_slot) + && opt_track_dest + && IsDirectory(opt_track_dest,false) + ) + { + flags &= TFMD_M_FLAGS; + + char dest[PATH_MAX], src[PATH_MAX]; + snprintf( dest, sizeof(dest), "%s/%03x.szs", opt_track_dest, dest_slot ); + snprintf( src, sizeof(src), "%s/%03x.szs", opt_track_dest, src_slot ); + + if (!TransferFile(log,dest,src,TFMD_LINK|flags,0666)) + { + snprintf( dest, sizeof(dest), "%s/%03x_d.szs", opt_track_dest, dest_slot ); + snprintf( src, sizeof(src), "%s/%03x_d.szs", opt_track_dest, src_slot ); + TransferFile(log,dest,src,TFMD_LINK|flags,0666); + } + } +} + // /////////////////////////////////////////////////////////////////////////////// /////////////// LECODE file /////////////// @@ -2674,7 +2973,7 @@ const ctcode_t * LoadLEFile ( uint le_phase ) { PRINT("le=%d, ctm=%d[%s]\n", le_phase, ct_mode, GetCtModeNameBMG(ct_mode,true) ); - if ( logging > 1 ) + if ( logging >= 2 ) fprintf(stdlog,"Load LE definition (%s)\n", GetCtModeNameBMG(ct_mode,true) ); @@ -2731,8 +3030,8 @@ enumError ApplyCTCODE ( le_analyse_t * ana, const ctcode_t * ctcode ) if ( prop && music && flags ) { - const uint max = ana->max_slot < LE_FIRST_LOWER_CT_SLOT - ? ana->max_slot : LE_FIRST_LOWER_CT_SLOT; + const uint max = ana->max_slot < LE_FIRST_CT_SLOT + ? ana->max_slot : LE_FIRST_CT_SLOT; uint tid; for ( tid = 0; tid < max; tid++ ) { @@ -2754,7 +3053,7 @@ enumError ApplyCTCODE ( le_analyse_t * ana, const ctcode_t * ctcode ) { uint cup_idx, max = ctcode->n_racing_cups; if ( max > ana->max_cup_track ) - max = ana->max_cup_track ; + max = ana->max_cup_track; for ( cup_idx = 0; cup_idx < max; cup_idx++, cup++ ) { @@ -2832,6 +3131,9 @@ enumError ApplyCTCODE ( le_analyse_t * ana, const ctcode_t * ctcode ) //--- copy/move/link track files + LogFile_t log0 = { .log = stdlog }; + LogFile_t *log = logging >= 3 ? &log0 : 0; + char buf[500]; const bmg_item_t * bi = ctcode->track_file.item; const bmg_item_t * bi_end = bi + ctcode->track_file.item_used; @@ -2839,7 +3141,7 @@ enumError ApplyCTCODE ( le_analyse_t * ana, const ctcode_t * ctcode ) { PrintString16BMG( buf, sizeof(buf), bi->text, bi->len, BMG_UTF8_MAX, 0, true ); - CopyTrackFile(bi->mid - ctcode->ctb.track_name1.beg,buf); + TransferTrackFile(log,bi->mid - ctcode->ctb.track_name1.beg,buf,0); } CalculateStatsLE(ana); @@ -2863,7 +3165,7 @@ bool DefineAliasLE ( le_analyse_t * ana, uint slot, uint alias ) for(;;) { if ( alias >= ana->n_slot - || alias >= MKW_ARENA_BEG && alias < LE_FIRST_LOWER_CT_SLOT ) + || alias >= MKW_ARENA_BEG && alias < LE_FIRST_CT_SLOT ) { printf("ALIAS: Invalid alias: %x = %x\n",slot,alias); return false; @@ -3040,7 +3342,6 @@ static enumError ScanTextLPAR_CHAT ) { PRINT(">> ScanTextLPAR_CHAT(pass=%u)\n",is_pass2+1); - // [[2do]] ??? //--- setup data @@ -3356,7 +3657,7 @@ enumError ScanTextLPAR break; default: - // ignore all other section without any warnings + // ignore all other sections without any warnings break; } diff --git a/project/src/lib-lecode.h b/project/src/lib-lecode.h index c8ed13d..4d724ad 100644 --- a/project/src/lib-lecode.h +++ b/project/src/lib-lecode.h @@ -59,7 +59,7 @@ #define LE_CUP_MAGIC "CUP2" #define LE_COURSE_MAGIC "CRS2" -#define LE_RESERVED_SLOTS (LE_FIRST_LOWER_CT_SLOT - 32) +#define LE_RESERVED_SLOTS (LE_FIRST_CT_SLOT - 32) #define LE_MAX_BLOCK_TRACK 50 //----------------------------------------------------------------------------- @@ -239,6 +239,49 @@ ccp GetPredefDebugName ( predef_debug_t pd_mode ); // /////////////////////////////////////////////////////////////////////////////// +/////////////// enum le_region_t /////////////// +/////////////////////////////////////////////////////////////////////////////// +// [[le_region_t]] + +typedef enum le_region_t +{ + LEREG_UNKNOWN = 0, + + LEREG_PAL, + LEREG_USA, + LEREG_JAP, + LEREG_KOR, + + LEREG__BEG = LEREG_PAL, + LEREG__END = LEREG_KOR, + LEREG__N = LEREG__END - LEREG__BEG + 1, +} +le_region_t; + +//----------------------------------------------------------------------------- + +le_region_t GetLEREG ( char ch ); // anylse first char only +ccp GetNameLEREG ( le_region_t lereg, ccp return_on_invalid ); + +// replace last '@' by region name. +// returns either NULL on error or 'name' or 'buf'. If !buf or to small, then use circ-buf. +ccp PatchNameLEREG ( char *buf, uint bufsize, ccp name, le_region_t lereg ); + +const mem_t GetLecodeLEREG ( le_region_t reg ); + +// returns circ-buf +ccp GetLecodeBuildLEREG ( le_region_t reg ); +ccp GetLecodeInfoLEREG ( le_region_t reg ); + +//----------------------------------------------------------------------------- +// some more global functions, used as helpers for *LEREG functions + +// returns circ-buf +ccp GetBuildLECODE ( mem_t lecode ); +ccp GetInfoLECODE ( mem_t lecode ); + +// +/////////////////////////////////////////////////////////////////////////////// /////////////// le_lpar_t /////////////// /////////////////////////////////////////////////////////////////////////////// // [[le_lpar_t]] [[new-lpar]] @@ -288,6 +331,7 @@ extern const u16 chat_mode_mkwfun[BMG_N_CHAT]; //----------------------------------------------------------------------------- void InitializeLPAR ( le_lpar_t *lpar, bool load_lpar ); +static inline void ResetLPAR ( le_lpar_t *lpar ) {} enumError LoadLPAR ( @@ -316,6 +360,13 @@ enumError SaveTextLPAR bool set_time // true: set time stamps ); +enumError SaveTextFileLPAR +( + le_lpar_t *lpar, // LE-CODE parameters + FILE *f, // open file + bool print_full // true: print ehader + append section [END] +); + enumError WriteSectionLPAR ( FILE *f, // output files @@ -677,6 +728,7 @@ typedef struct le_analyse_t le_valid_t valid; // see LE_VALID_* above uint version; // version = phase + le_region_t region; // one of LEREG_* const u8 *data; // pointer to raw data u32 size; // data size @@ -762,6 +814,8 @@ enumError AnalyseLEBinary uint data_size // data size ); +le_region_t GetLERegion ( const le_analyse_t *ana ); + void CalculateStatsLE ( le_analyse_t *ana ); const le_usage_t * GetLEUsage ( const le_analyse_t *ana0, bool force_recalc ); char GetLEUsageChar ( le_usage_t usage ); @@ -771,7 +825,10 @@ ccp GetLEValid ( le_valid_t valid ); void CalculateStatsLE ( le_analyse_t *ana ); void DumpLEAnalyse ( FILE *f, uint indent, const le_analyse_t *ana ); -static inline bool IsLESlotUsed ( le_analyse_t *ana, uint slot ) +void TransferTrackFile ( LogFile_t *log, uint dest_slot, ccp src_name, TransferMode_t flags ); +void TransferTrackBySlot ( LogFile_t *log, uint dest_slot, uint src_slot, TransferMode_t flags ); + +static inline bool IsLESlotUsed ( const le_analyse_t *ana, uint slot ) { return slot < ana->n_slot && ana->music[slot]; } /////////////////////////////////////////////////////////////////////////////// @@ -792,17 +849,17 @@ const VarMap_t * SetupVarsLECODE(); static inline bool IsRacingTrackLE ( uint tid ) { return tid < MKW_N_TRACKS - || tid >= LE_FIRST_LOWER_CT_SLOT && tid != 0xff; } + || tid >= LE_FIRST_CT_SLOT && tid != 0xff; } uint GetNextRacingTrackLE ( uint tid ); /////////////////////////////////////////////////////////////////////////////// -extern ccp opt_le_define; extern ccp opt_le_arena; extern ccp opt_lpar; extern ccp opt_track_dest; extern ParamField_t opt_track_source; +extern int opt_szs_mode; extern ccp opt_le_alias; extern bool opt_engine_valid; @@ -816,7 +873,8 @@ extern int opt_lecode_debug; extern bool opt_complete; -int ScanOptTrackSource ( ccp arg, int mode ); +int ScanOptTrackSource ( ccp arg, int arg_len, int mode ); +int ScanOptSzsMode ( ccp arg ); int ScanOptAlias ( ccp arg ); int ScanOptEngine ( ccp arg ); int ScanOpt200cc ( ccp arg ); diff --git a/project/src/lib-ledis.c b/project/src/lib-ledis.c new file mode 100644 index 0000000..e85b31a --- /dev/null +++ b/project/src/lib-ledis.c @@ -0,0 +1,6815 @@ + +/*************************************************************************** + * _______ _______ _______ * + * | ___ |____ | ___ | * + * | | |_| / /| | |_| * + * | |_____ / / | |_____ * + * |_____ | / / |_____ | * + * _ | | / / _ | | * + * | |___| |/ /____| |___| | * + * |_______|_______|_______| * + * * + * Wiimms SZS Tools * + * https://szs.wiimm.de/ * + * * + *************************************************************************** + * * + * This file is part of the SZS project. * + * Visit https://szs.wiimm.de/ for project details and sources. * + * * + * Copyright (c) 2011-2022 by Dirk Clemens <wiimm@wiimm.de> * + * * + *************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * See file gpl-2.0.txt or http://www.gnu.org/licenses/gpl-2.0.txt * + * * + ***************************************************************************/ + +#include "dclib-utf8.h" +#include "dclib-regex.h" +#include "lib-ledis.h" +#include "lib-checksum.h" +#include "lib-szs.h" +#include "db-mkw.h" +#include "crypt.h" + +#include "ledis.inc" +#include "distrib.inc" + +#include <dirent.h> + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// global vars /////////////// +/////////////////////////////////////////////////////////////////////////////// + +ccp opt_create_dump = 0; // NULL of filename +le_distrib_t ledis_dump = {0}; // data collector for 'opt_create_dump' +int ledis_dump_enabled = 0; // -1:done, 0:disabled, 1:enabled + +ccp opt_le_define = 0; // NULL or last defined filename +StringField_t le_define_list = {0}; // list with all filenames + +/////////////////////////////////////////////////////////////////////////////// + +static const le_cup_ref_t standard_bt_ref[MKW_N_ARENAS] = + { 33,32,35,34,36, 39,40,41,37,38 }; + +static const le_cup_ref_t standard_vs_ref[MKW_N_TRACKS] = + { 8, 1, 2, 4, 16,20,25,26, 0, 5, 6, 7, 27,31,23,18, + 9,15,11, 3, 21,30,29,17, 14,10,12,13, 24,22,19,28 }; + +static const le_cup_ref_t mkwfun_random_ref[MKW_N_LE_RANDOM] = + { 62, 63, 64, 65 }; + +/////////////////////////////////////////////////////////////////////////////// + +#if LE_TYPE_MARKERS_ENABLED + #define LTT_MARKER_ARENA 0x1000 + #define LTT_MARKER_TRACK 0x2000 + #define LTT_MARKER__ALL 0x3000 +#endif + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// helpers /////////////// +/////////////////////////////////////////////////////////////////////////////// + +#define DUMP_CUP_SLOTS_ENABLED 0 + +#if DUMP_CUP_SLOTS_ENABLED + static void DumpCupSlots ( const le_distrib_t *ld, ccp info ) + { + fflush(stdout); + fflush(stderr); + + const int min = 68; + const int max = min + 15; + + fprintf(stdlog,"CUP-SLOT %d..%d:",min,max); + for ( int slot = min; slot <= max; slot++ ) + { + le_track_t *lt = GetTrackLD((le_distrib_t*)ld,slot); + if (lt) + fprintf(stdlog," %d",lt->cup_slot); + else + fputs(" -",stdlog); + } + + if (info) + fprintf(stdlog," # %s\n",info); + else + fputs("\n",stdlog); + fflush(stdlog); + } +#else + static inline void DumpCupSlots ( le_distrib_t const *ld, ccp info ) {} +#endif + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// enum le_track_type_t /////////////// +/////////////////////////////////////////////////////////////////////////////// + +ccp GetNameLTTY ( le_track_type_t track_type ) +{ + return track_type & LTTY_TRACK + ? "vs" + : track_type & LTTY_ARENA + ? "bt" + : track_type & LTTY_RANDOM + ? "rd" + : "xx"; +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// le_options_t /////////////// +/////////////////////////////////////////////////////////////////////////////// + +le_options_t defaultLEO = LEO__DEFAULT; + +//----------------------------------------------------------------------------- + +static KeywordTab_t keywords_leo[] = +{ + { LEO__DEFAULT, "RESET", 0, ~0 }, + { 0, "CLEAR", 0, ~0 }, + + { LTT_SHA1, "SHA1", 0, LEO_LTT_SELECTOR }, + { LTT_SHA1_D, "D-SHA1", "DSHA1", LEO_LTT_SELECTOR }, + { LTT_IDENT, "IDENT", 0, LEO_LTT_SELECTOR }, + { LTT_IDENT_D, "D-IDENT", "DIDENT", LEO_LTT_SELECTOR }, + { LTT_FILE, "FILES", 0, LEO_LTT_SELECTOR }, + { LTT_NAME, "NAMES", 0, LEO_LTT_SELECTOR }, + { LTT_XNAME, "XNAMES", 0, LEO_LTT_SELECTOR }, + { LTT_XNAME2, "X2NAMES", 0, LEO_LTT_SELECTOR }, + #if LE_STRING_LIST_ENABLED + { LTT_TEMP1, "TEMP1", 0, LEO_LTT_SELECTOR }, + { LTT_TEMP2, "TEMP2", 0, LEO_LTT_SELECTOR }, + #endif + + { LEO_MKW, "MKW", 0, 0 }, + { LEO_MKW1, "MKW1", 0, 0 }, + { LEO_MKW2, "MKW2", 0, 0 }, + { LEO_CTCODE, "CT-CODE", "CTCODE", 0 }, + { LEO_LECODE, "LE-CODE", "LECODE", 0 }, + + { LEO_IN_EMPTY, "IN-EMPTY", "INEMPTY", 0 }, + { LEO_IN_EMPTY, "IEMPTY", 0, 0 }, + { LEO_IN_MINUS, "IN-MINUS", "INMINUS", 0 }, + { LEO_IN_MINUS, "IMINUS", 0, 0 }, + { LEO_IN_ALL, "IN-ALL", "INALL", 0 }, + { LEO_IN_ALL, "IALL", 0, 0 }, + + { LEO_OVERWRITE, "OVERWRITE", 0, LEO_M_HOW }, + { LEO_INSERT, "INSERT", 0, LEO_M_HOW }, + { LEO_REPLACE, "REPLACE", 0, LEO_M_HOW }, + + { LEO_VERSUS, "VERSUS", "VS", 0 }, + { LEO_BATTLE, "BATTLE", "BT", 0 }, + { LEO_CUSTOM, "CUSTOM", 0, 0 }, + { LEO_ORIGINAL, "ORIGINAL", 0, 0 }, + { LEO_NO_D_FILES, "NO-D", "NOD", 0 }, + + { LEO_OUT_EMPTY, "OUT-EMPTY", "OUTEMPTY", 0 }, + { LEO_OUT_EMPTY, "OEMPTY", 0, 0 }, + { LEO_OUT_MINUS, "OUT-MINUS", "OUTMINUS", 0 }, + { LEO_OUT_MINUS, "OMINUS", 0, 0 }, + { LEO_OUT_ALL, "OUT-ALL", "OUTALL", 0 }, + { LEO_OUT_ALL, "OALL", 0, 0 }, + + { LEO_IN_LECODE, "IN-LECODE", "INLECODE", 0 }, + { LEO_IN_LECODE, "ILECODE", 0, 0 }, + { LEO_BRIEF, "BRIEF", 0, 0 }, + + { LEO_HELP, "HELP", "H", 0 }, + + { LEO_CUT_STD, "CUT-STD", "CUTSTD", 0 }, + { LEO_CUT_CTCODE, "CUT-CTCODE", "CUTCTCODE", 0 }, + + {0,0,0,0} +}; + +/////////////////////////////////////////////////////////////////////////////// + +le_options_t SetupDefaultLEO(void) +{ + defaultLEO = LEO__DEFAULT; + if ( !print_header || brief_count ) + defaultLEO |= LEO_BRIEF; + return defaultLEO; +} + +/////////////////////////////////////////////////////////////////////////////// + +le_options_t ScanLEO ( le_options_t current, ccp arg, ccp err_info ) +{ + if (!arg) + return current; + + keywords_leo[0].id = SetupDefaultLEO(); + + s64 stat = ScanKeywordList(arg,keywords_leo,0,true,0,current,err_info,ERR_SYNTAX); + PRINT0("ScanLEO(%#05x,%s) => %#05x\n",current,arg,(le_options_t)stat); + return stat != -1 ? stat : current; +} + +/////////////////////////////////////////////////////////////////////////////// + +bool IsInputNameValidLEO ( ccp name, le_options_t opt ) +{ + return !name || !*name + ? ( opt & LEO_IN_EMPTY ) != 0 + : *name == '-' && !name[1] + ? ( opt & LEO_IN_MINUS ) != 0 + : true; +} + +/////////////////////////////////////////////////////////////////////////////// + +bool IsOutputNameValidLEO ( ccp name, le_options_t opt ) +{ + return !name || !*name + ? ( opt & LEO_OUT_EMPTY ) != 0 + : *name == '-' && !name[1] + ? ( opt & LEO_OUT_MINUS ) != 0 + : true; +} + +/////////////////////////////////////////////////////////////////////////////// + +bool IsAssignmentAllowedLEO ( ccp cur_name, ccp new_name, le_options_t opt ) +{ + if (!IsInputNameValidLEO(new_name,opt)) + return false; + + switch ( opt & LEO_M_HOW ) + { + case 0: + case LEO_OVERWRITE: return true; + case LEO_INSERT: return !IsOutputNameValidLEO(cur_name,opt); + case LEO_REPLACE: return IsOutputNameValidLEO(cur_name,opt); + default: return false; + } +} + +/////////////////////////////////////////////////////////////////////////////// + +ccp GetUpperNameLTT ( le_track_text_t ltt ) +{ + switch ( ltt & LEO_LTT_SELECTOR ) + { + case LTT_SHA1: return "SHA1"; + case LTT_SHA1_D: return "D-SHA1"; + case LTT_IDENT: return "IDENT"; + case LTT_IDENT_D: return "D-IDENT"; + case LTT_FILE: return "FILE"; + case LTT_NAME: return "NAME"; + case LTT_XNAME: return "XNAME"; + case LTT_XNAME2: return "XNAME2"; + #if LE_STRING_LIST_ENABLED + case LTT_TEMP1: return "TEMP1"; + case LTT_TEMP2: return "TEMP2"; + #endif + } + return 0; +} + +//----------------------------------------------------------------------------- + +ccp GetLowerNameLTT ( le_track_text_t ltt ) +{ + switch ( ltt & LEO_LTT_SELECTOR ) + { + case LTT_SHA1: return "sha1"; + case LTT_SHA1_D: return "d-sha1"; + case LTT_IDENT: return "ident"; + case LTT_IDENT_D: return "d-ident"; + case LTT_FILE: return "file"; + case LTT_NAME: return "name"; + case LTT_XNAME: return "xname"; + case LTT_XNAME2: return "xname2"; + #if LE_STRING_LIST_ENABLED + case LTT_TEMP1: return "temp1"; + case LTT_TEMP2: return "temp2"; + #endif + } + return 0; +} + +//----------------------------------------------------------------------------- + +int GetDModeLTT ( le_track_text_t ltt ) +{ + // returns 0:unknown ltt, 1:std string, 2:_d string, 3:both + + switch ( ltt & LEO_LTT_SELECTOR ) + { + case LTT_SHA1: + case LTT_IDENT: + return 1; + + case LTT_SHA1_D: + case LTT_IDENT_D: + return 2; + + case LTT_FILE: + case LTT_NAME: + case LTT_XNAME: + case LTT_XNAME2: + #if LE_STRING_LIST_ENABLED + case LTT_TEMP1: + case LTT_TEMP2: + #endif + return 3; + } + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// + +ccp GetTextLEO ( le_options_t opt ) +{ + char buf[300], *dest = buf, *end = buf + sizeof(buf) - 1; + + static const le_options_t ctab[] = + { LEO_IN_ALL, LEO_M_ARENA, LEO_M_ORIGINAL, LEO_OUT_ALL, 0 }; + + for ( const le_options_t *cptr = ctab; *cptr; cptr++ ) + if ( ( opt & *cptr ) == *cptr ) + opt &= ~*cptr; + + *dest = 0; + PrintKeywordList(dest,end-dest,0,keywords_leo,opt,0,INT64_MIN); + if ( dest > buf && !*dest ) + *--dest = 0; + return CopyCircBuf0(buf,strlen(buf)); +} + +/////////////////////////////////////////////////////////////////////////////// + +ccp GetInputFilterLEO ( le_options_t opt ) +{ + static const le_options_t mask + = LEO_M_BMG + | LEO_IN_ALL + | LEO_M_HOW + ; + return GetTextLEO(opt&mask); +} + +/////////////////////////////////////////////////////////////////////////////// + +ccp GetOutputFilterLEO ( le_options_t opt ) +{ + static const le_options_t mask + = LEO_M_ARENA + | LEO_M_ORIGINAL + | LEO_NO_D_FILES + | LEO_OUT_ALL + ; + return GetTextLEO(opt&mask); +} + + +/////////////////////////////////////////////////////////////////////////////// + +bool GetBmgBySlotLEO + ( char *buf, uint bufsize, const bmg_t *bmg, int slot, le_options_t opt ) +{ + if ( !bmg || slot < 0 ) + return 0; + + if (!(opt&LEO_M_BMG)) + opt |= LEO_M_BMG; + + + //-- LE-CODE + + if ( opt & LEO_LECODE && slot < BMG_N_LE_TRACK ) + { + const bmg_item_t *bi = FindItemBMG(bmg,slot+MID_LE_TRACK_BEG); + if ( bi && bi->text ) + { + PrintString16BMG(buf,bufsize,bi->text,bi->len,BMG_UTF8_MAX,0,1); + if (IsInputNameValidLEO(buf,opt)) + return true; + } + } + + + //-- CT-CODE + + if ( opt & LEO_CTCODE && slot < BMG_N_CT_TRACK ) + { + const bmg_item_t *bi = FindItemBMG(bmg,slot+MID_CT_TRACK_BEG); + if ( bi && bi->text ) + { + PrintString16BMG(buf,bufsize,bi->text,bi->len,BMG_UTF8_MAX,0,1); + if (IsInputNameValidLEO(buf,opt)) + return true; + } + } + + + //-- MKW2 + + if ( opt & LEO_MKW2 ) + { + const bmg_item_t *bi + = IsMkwTrack(slot) + ? FindItemBMG(bmg,slot+MID_TRACK1_BEG) + : IsMkwArena(slot) + ? FindItemBMG(bmg,slot-BMG_N_TRACK+MID_ARENA1_BEG) + : 0; + + if ( bi && bi->text ) + { + PrintString16BMG(buf,bufsize,bi->text,bi->len,BMG_UTF8_MAX,0,1); + if (IsInputNameValidLEO(buf,opt)) + return true; + } + } + + + //-- MKW1 + + if ( opt & LEO_MKW1 ) + { + const bmg_item_t *bi + = IsMkwTrack(slot) + ? FindItemBMG(bmg,slot+MID_TRACK2_BEG) + : IsMkwArena(slot) + ? FindItemBMG(bmg,slot+MID_ARENA2_BEG) + : 0; + + if ( bi && bi->text ) + { + PrintString16BMG(buf,bufsize,bi->text,bi->len,BMG_UTF8_MAX,0,1); + if (IsInputNameValidLEO(buf,opt)) + return true; + } + } + + return false; +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// struct le_strpar_t /////////////// +/////////////////////////////////////////////////////////////////////////////// + +const le_strpar_t NullLSP = {0}; +const le_strpar_t DefaultLSP = { .opt = LEO__DEFAULT }; + +/////////////////////////////////////////////////////////////////////////////// + +void ResetLSP ( le_strpar_t *par ) +{ + if (par) + { + #if LE_STRING_SET_ENABLED + FreeString(par->key); + #endif + InitializeLSP(par,par->opt); + } +} + +/////////////////////////////////////////////////////////////////////////////// + +char * ScanLSP ( le_strpar_t *par, ccp arg, enumError *ret_err ) +{ + static const KeywordTab_t keytab[] = + { + { LTT_SHA1, "SHA1", 0, 0 }, + { LTT_SHA1_D, "D-SHA1", "DSHA1", 0 }, + { LTT_IDENT, "IDENT", 0, 0 }, + { LTT_IDENT_D, "D-IDENT", "DIDENT", 0 }, + { LTT_FILE, "FILES", 0, 0 }, + { LTT_NAME, "NAMES", 0, 0 }, + { LTT_XNAME, "XNAMES", 0, 0 }, + { LTT_XNAME2, "X2NAMES", 0, 0 }, + #if LE_STRING_LIST_ENABLED + { LTT_TEMP1, "TEMP1", 0, 0 }, + { LTT_TEMP2, "TEMP2", 0, 0 }, + #endif + {0,0,0,0} + }; + + //-------------- + + if ( !par || !arg ) + return (char*)arg; + + ccp src = arg; + while ( *src > 0 && *src <= ' ' ) + src++; + + enumError err = ERR_OK; + + #if LE_STRING_SET_ENABLED + if ( *src == '[' ) + { + src++; + ccp end = strchr(src,']'); + if (!end) + err = ERR_SYNTAX; + else + { + SetKeyNameLSP(par,src,end-src); + src = end+1; + } + } + else + #endif + { + char name[50], *nptr = name; + while ( isalnum((int)*src) && nptr < name + sizeof(name) -2 ) + *nptr++ = *src++; + *nptr = 0; + + int abbrev_count; + const KeywordTab_t *cmd = ScanKeyword(&abbrev_count,name,keytab); + + if (!cmd) + err = ERR_SEMANTIC; + else + par->opt = par->opt & ~LEO_LTT_SELECTOR | cmd->id; + } + + //--- terminate + + if (ret_err) + *ret_err = err; + + if ( err == ERR_OK ) + { + while ( *src > 0 && *src <= ' ' ) + src++; + arg = src; + } + + return (char*)arg; +} + +/////////////////////////////////////////////////////////////////////////////// + +ccp GetNameLSP ( const le_strpar_t *par ) +{ + if (par) + { + ccp name = GetLowerNameLTT(par->opt); + if (name) + return name; + + #if LE_STRING_SET_ENABLED + if (IsValidSetLSP(par)) + return PrintCircBuf("[%s]",par->key); + #endif + } + return "?"; +} + +/////////////////////////////////////////////////////////////////////////////// + +ccp GetOptionsLSP ( const le_strpar_t *par, le_options_t mask ) +{ + if (!par) + return 0; + + #if LE_STRING_SET_ENABLED + if (IsValidSetLSP(par)) + return PrintCircBuf("[%s],%s", + par->key, GetTextLEO(par->opt&~LEO_LTT_SELECTOR&mask) ); + #endif + return GetTextLEO(par->opt&mask); +} + +/////////////////////////////////////////////////////////////////////////////// + +enumError ScanOptionsLSP ( le_strpar_t *par, ccp arg, ccp err_info ) +{ + if ( !par || !arg ) + return ERR_MISSING_PARAM; + + #if LE_STRING_SET_ENABLED + while ( *arg > 0 && *arg <= ' ' ) + arg++; + + if ( *arg == '[' ) + { + enumError err; + arg = ScanLSP(par,arg,&err); + if (err) + return err; + } + #endif + + par->opt = ScanLEO(par->opt,arg,err_info); + return ERR_OK; +} + +/////////////////////////////////////////////////////////////////////////////// +#if LE_STRING_SET_ENABLED + + void SetKeyNameLSP ( le_strpar_t *par, ccp key, int key_len ) + { + if ( par && par->key != key ) + { + FreeString(par->key); + if ( key && *key ) + { + if ( key_len < 0 ) + key_len = strlen(key); + par->key = MEMDUP(key,key_len); + par->opt = par->opt & ~LEO_LTT_SELECTOR | LTT_STRSET; + } + else + par->key = 0; + } + } + +#endif +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// struct le_cup_t /////////////// +/////////////////////////////////////////////////////////////////////////////// + +void InitializeLECUP ( le_cup_t *lc, uint max_cups, uint tracks_per_cup ) +{ + DASSERT(lc); + memset(lc,0,sizeof(*lc)); + lc->max = max_cups; + lc->tracks = tracks_per_cup; + lc->fill_slot = -1; + lc->fill_src = -1; + lc->dirty = true; +} + +/////////////////////////////////////////////////////////////////////////////// + +void ResetLECUP ( le_cup_t *lc ) +{ + if (lc) + { + FREE(lc->list); + InitializeLECUP(lc,lc->max,lc->tracks); + } +} + +/////////////////////////////////////////////////////////////////////////////// + +le_cup_ref_t * GetLECUP ( const le_cup_t *lc, uint cup_index ) +{ + return lc && cup_index < lc->used + ? lc->list + cup_index * lc->tracks + : 0; +} + +/////////////////////////////////////////////////////////////////////////////// + +le_cup_ref_t * DefineLECUP ( le_cup_t *lc, uint cup_index ) +{ + if ( !lc || cup_index >= lc->max ) + return 0; + + const uint size_per_cup = sizeof(*lc->list) * lc->tracks; + + if ( cup_index >= lc->size ) + { + uint n_cups = cup_index + lc->size/4 + 100; + if ( n_cups > lc->max ) + n_cups = lc->max; + + lc->list = REALLOC( lc->list, n_cups * size_per_cup ); + lc->size = n_cups; + ASSERT( lc->size <= lc->max ); + } + ASSERT( cup_index < lc->size ); + + if ( cup_index >= lc->used ) + { + lc->dirty = true; + le_cup_ref_t *beg = lc->list + lc->used * lc->tracks; + lc->used = cup_index + 1; + ASSERT( lc->used <= lc->size ); + le_cup_ref_t *end = lc->list + lc->used * lc->tracks; + memset( beg, ~0, (u8*)end-(u8*)beg ); + } + ASSERT( cup_index < lc->used ); + + return lc->list + cup_index * lc->tracks; +} + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +uint GetCupSlotLECUP ( const le_cup_t *lc, const le_cup_ref_t *ptr ) +{ + if ( !lc || !lc->list || !ptr ) + return 0; + + const uint idx = ptr - lc->list; + const uint cup = idx / lc->tracks; + return cup < lc->used + ? 10 * cup + (idx % lc->tracks) + 11 + : 0; +} + +/////////////////////////////////////////////////////////////////////////////// + +void AppendLECUP ( le_cup_t *lc, le_cup_ref_t ref ) +{ + if ( lc && ref >= 0 ) + { + if ( lc->cur_index >= lc->tracks ) + { + lc->cur_index = 0; + lc->cur_cup++; + } + + le_cup_ref_t *cr = DefineLECUP(lc,lc->cur_cup); + if (cr) + { + lc->dirty = true; + cr += lc->cur_index++; + *cr = ref; + } + } +} + +/////////////////////////////////////////////////////////////////////////////// + +void CloseLECUP ( le_cup_t *lc ) +{ + if (lc) + { + lc->close_used = true; + if ( lc->cur_index ) + lc->cur_index = lc->tracks; + } +} + +/////////////////////////////////////////////////////////////////////////////// + +void PackLECUP ( le_cup_t *lc ) +{ + if ( !lc || !lc->used ) + return; + + PRINT("PackLECUP(%d) < N=%d\n",lc->tracks,lc->used); + le_cup_ref_t *dest = lc->list; + le_cup_ref_t *end = lc->list + lc->used * lc->tracks; + + for ( le_cup_ref_t *src = lc->list; src < end; src++ ) + if ( *src >= 0 ) + *dest++ = *src; + + lc->used = ( dest - lc->list + lc->tracks - 1 ) / lc->tracks; + end = lc->list + lc->used * lc->tracks; + while ( dest < end ) + *dest++ = -1; + PRINT("PackLECUP(%d) > N=%d\n",lc->tracks,lc->used); +} + +/////////////////////////////////////////////////////////////////////////////// + +void EvenLECUP ( le_cup_t *lc ) +{ + if (lc) + { + DefineLECUP( lc, lc->tracks == 4 ? 5 : 1 ); + if ( lc->used & 1 ) + DefineLECUP(lc,lc->used); + } +} + +/////////////////////////////////////////////////////////////////////////////// + +bool HaveInvalidLECUP ( le_cup_t *lc ) +{ + if (lc) + { + le_cup_ref_t *end = lc->list + lc->used * lc->tracks; + for ( le_cup_ref_t *ptr = lc->list; ptr < end; ptr++ ) + if ( *ptr < 0 ) + return true; + } + return false; +} + +/////////////////////////////////////////////////////////////////////////////// + +void FillLECUP ( le_cup_t *lc, le_cup_ref_t fallback ) +{ + if (!lc) + return; + + le_cup_ref_t *end = lc->list + lc->used * lc->tracks; + for ( le_cup_ref_t *ptr = lc->list; ptr < end; ptr++ ) + if ( *ptr < 0 ) + *ptr = fallback; +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// le_track_t /////////////// +/////////////////////////////////////////////////////////////////////////////// + +void InitializeLT ( le_track_t *lt ) +{ + DASSERT(lt); + memset(lt,0,sizeof(*lt)); + lt->track_status = LTS_VALID; + #if LE_STRING_SET_ENABLED + InitializeParamField(<->str_set); + lt->str_set.free_data = true; + #endif +} + +/////////////////////////////////////////////////////////////////////////////// + +void ClearStringsLT ( le_track_t *lt ) +{ + if (lt) + { + FreeString(lt->file); + FreeString(lt->name); + FreeString(lt->xname); + FreeString(lt->lti[0].ident); + FreeString(lt->lti[1].ident); + + lt->file = 0; + lt->name = 0; + lt->xname = 0; + memset(lt->lti,0,sizeof(*lt->lti)); + + #if LE_STRING_LIST_ENABLED + for ( int idx = 0; idx < LTT__LIST_SIZE; idx++ ) + FreeString(lt->str_list[idx]); + memset(lt->str_list,0,sizeof(lt->str_list)); + #endif + + #if LE_STRING_SET_ENABLED + ResetParamField(<->str_set); + #endif + } +} + +/////////////////////////////////////////////////////////////////////////////// + +void ClearLT ( le_track_t *lt, le_track_type_t ltty ) // auto-ltty if 0 +{ + if (lt) + { + ClearStringsLT(lt); + + const int slot = lt->track_slot; + memset(lt,0,sizeof(*lt)); + lt->track_slot = slot; + lt->track_type = ltty ? ltty : IsMkwArena(slot) ? LTTY_ARENA : LTTY_TRACK; + } +} + +/////////////////////////////////////////////////////////////////////////////// + +void MoveLT ( le_track_t *dest, le_track_t *src ) +{ + if ( dest && src && dest != src ) + { + ClearLT(dest,0); + memcpy(dest,src,sizeof(*dest)); + + src->file = 0; + src->name = 0; + src->xname = 0; + src->lti[0].ident = 0; + src->lti[1].ident = 0; + ClearLT(src,0); + } +} + +/////////////////////////////////////////////////////////////////////////////// + +void SetupStandardArenaLT ( le_track_t *lt, uint setup_slot ) +{ + if (IsMkwArena(setup_slot)) + setup_slot -= MKW_ARENA_BEG; + if ( setup_slot < MKW_N_ARENAS ) + SetupByTrackInfoLT(lt,arena_info+setup_slot); +} + +/////////////////////////////////////////////////////////////////////////////// + +void SetupStandardTrackLT ( le_track_t *lt, uint setup_slot ) +{ + if (IsMkwTrack(setup_slot)) + SetupByTrackInfoLT(lt,track_info+setup_slot); + else if (IsMkwArena(setup_slot)) + { + setup_slot -= MKW_ARENA_BEG; + SetupByTrackInfoLT(lt,arena_info+setup_slot); + } +} + +/////////////////////////////////////////////////////////////////////////////// + +void SetupByTrackInfoLT ( le_track_t *lt, const TrackInfo_t *ti ) +{ + if ( !lt || !ti ) + return; + + lt->cup_slot = ti->def_slot; + lt->track_type = IsMkwArena(ti->track_id) ? LTTY_ARENA : LTTY_TRACK; + lt->property = ti->track_id; + lt->music = ti->music_id; + + le_strpar_t spar = { .opt = LEO__DEFAULT|LEO_IN_ALL }; + SetFileLT(lt,&spar,ti->track_fname); + SetNameLT(lt,&spar,ti->name_en); + + sha1_hex_t hex; + Sha1Bin2Hex(hex,ti->sha1[0]); + SetIdentOptLT(lt,hex,false,false,LEO_IN_ALL); + + const u32 have_d = be32(ti->sha1[TI_SHA1_IS_D]); + if (have_d) + { + Sha1Bin2Hex(hex,ti->sha1[TI_SHA1_IS_D]); + SetIdentOptLT(lt,hex,true,false,LEO_IN_ALL); + } + + // last action because SetIdent*LT() clears 'is_original' + lt->is_original = lt->lti[0].orig_sha1 = lt->lti[1].orig_sha1 = lt->track_slot == ti->track_id; +} + +/////////////////////////////////////////////////////////////////////////////// + +void SetupLecodeRandomTrackLT ( le_track_t *lt, uint setup_slot ) +{ + if (IsLecodeRandom(setup_slot)) + { + lt->track_status = LTS_ACTIVE; + lt->track_type = LTTY_RANDOM|LTTY_TRACK; + lt->cup_slot = setup_slot - MKW_LE_RANDOM_BEG + 91; + lt->property = 0; + lt->music = MKW_MUSIC_MIN_ID; + + static ccp names[] = + { + "Random: All Tracks", + "Random: Original Tracks", + "Random: Custom Tracks", + "Random: New Tracks", + }; + + if (IsLecodeRandom(setup_slot)) + SetNameLT(lt,0,names[setup_slot-MKW_LE_RANDOM_BEG]); + } +} + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +// -1:wrong slot or not a battle, 0:correct slots, +// 1:wrong property, 2:wrong music, 3:both wrong + +int HaveUsualBattleSlots ( le_track_t *lt ) +{ + if ( !lt || !IsArenaLTTY(lt->track_type) || !IsMkwArena(lt->track_slot) ) + return -1; + + const TrackInfo_t *ai = arena_info + lt->track_slot - MKW_ARENA_BEG; + return ( lt->property == lt->track_slot ? 0 : 1 ) + | ( lt->music == ai->music_id ? 0 : 2 ); +} + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +void ClearIdentLT ( le_track_t *lt ) +{ + FreeString(lt->lti[0].ident); + FreeString(lt->lti[1].ident); + lt->lti[0].ident = lt->lti[1].ident = 0; + + lt->lti[0].have_sha1 = lt->lti[1].have_sha1 = 0; + lt->lti[0].orig_sha1 = lt->lti[1].orig_sha1 = 0; + lt->is_original = 0; +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// Set*LT() functions /////////////// +/////////////////////////////////////////////////////////////////////////////// + +void SetIdentOptLT + ( le_track_t *lt, ccp ident, bool use_d, bool csum_only, le_options_t opt ) +{ + le_strpar_t spar = { .opt = opt, .use_d = use_d, .csum_only = csum_only }; + SetIdentLT(lt,&spar,ident); +} + +//----------------------------------------------------------------------------- + +void SetIdentLT ( le_track_t *lt, const le_strpar_t *par, ccp ident ) +{ + // par: opt, use_d, csum_only + if (!lt) + return; + if (!par) + par = &DefaultLSP; + + le_track_id_t *lti = lt->lti + (par->use_d>0); + if ( IsAssignmentAllowedLEO(lti->ident,ident,par->opt) ) + { + if (!par->use_d) + ClearIdentLT(lt); + + if (ident) + { + while ( *ident == ' ' || *ident == '\t' ) + ident++; + + sha1_size_t sha1size; + const int stat = IsSSChecksum(&sha1size,ident,-1); + if (stat) + { + lti->have_sha1 = true; + memcpy(lti->sha1bin,sha1size.hash,sizeof(lti->sha1bin)); + FreeString(lti->ident); + lti->ident = stat == 2 ? STRDUP(ident) : 0; + } + else + { + lti->have_sha1 = false; + memset(lti->sha1bin,0,sizeof(lti->sha1bin)); + FreeString(lti->ident); + lti->ident = par->csum_only ? 0 : STRDUP(ident); + } + + //-- calculate is_orig + + bool is_orig = false; + if (lti->have_sha1) + { + const TrackInfo_t *ti = + IsMkwTrack(lt->track_slot) + ? track_info + lt->track_slot + : IsMkwArena(lt->track_slot) + ? arena_info + lt->track_slot - MKW_ARENA_BEG + : 0; + + if (ti) + { + const u8 *sptr = ti->sha1[ par->use_d ? TI_SHA1_IS_D : 0 ]; + if (lti->have_sha1) + is_orig = !memcmp(lti->sha1bin,sptr,sizeof(lti->sha1bin)) + || !memcmp(lti->sha1bin,sptr+TI_SHA1_NORM,sizeof(lti->sha1bin)); + else + is_orig = !*(u32*)sptr; + } + } + + lti->orig_sha1 = is_orig; + } + lt->is_original = lt->lti[0].orig_sha1 && lt->lti[1].orig_sha1; + } +} + +/////////////////////////////////////////////////////////////////////////////// + +void SetFileLT ( le_track_t *lt, const le_strpar_t *par, ccp fname ) +{ + // par: opt + + if (!par) + par = &DefaultLSP; + + if ( lt && IsAssignmentAllowedLEO(lt->file,fname,par->opt) ) + { + FreeString(lt->file); + lt->file = STRDUP(fname); + } +} + +/////////////////////////////////////////////////////////////////////////////// + +void SetNameLT ( le_track_t *lt, const le_strpar_t *par, ccp name ) +{ + // par: opt + + if (!par) + par = &DefaultLSP; + + if ( lt && IsAssignmentAllowedLEO(lt->name,name,par->opt) ) + { + FreeString(lt->name); + if ( lt->xname && !strcmp(lt->xname,name) ) + { + lt->name = lt->xname; + lt->xname = 0; + } + else + lt->name = STRDUP(name); + } +} + +/////////////////////////////////////////////////////////////////////////////// + +void SetXNameLT ( le_track_t *lt, const le_strpar_t *par, ccp xname ) +{ + // par: opt + + if (!par) + par = &DefaultLSP; + + if ( lt && IsAssignmentAllowedLEO(lt->xname,xname,par->opt) ) + { + FreeString(lt->xname); + if ( !lt->name || strcmp(lt->name,xname) ) + lt->xname = STRDUP(xname); + } +} + +/////////////////////////////////////////////////////////////////////////////// +#if LE_STRING_LIST_ENABLED + + void SetListLT ( le_track_t *lt, const le_strpar_t *par, ccp text ) + { + // par: ltt, opt + + if (!par) + par = &DefaultLSP; + + const le_track_text_t ltt = par->opt & LEO_LTT_SELECTOR; + + if ( lt && ltt >= LTT__LIST_BEG && ltt < LTT__LIST_END ) + { + ccp *ptr = lt->str_list + ltt - LTT__LIST_BEG; + if (IsAssignmentAllowedLEO(*ptr,text,par->opt)) + { + FreeString(*ptr); + *ptr = STRDUP(text); + } + } + } + +#endif // LE_STRING_LIST_ENABLED +/////////////////////////////////////////////////////////////////////////////// +#if LE_STRING_SET_ENABLED + + void SetSetLT ( le_track_t *lt, const le_strpar_t *par, ccp text ) + { + // par: ltt, key, opt + if ( lt && par && par->key ) + { + PRINT0(" %u [%s] = %s\n",lt->track_slot,par->key,text); + ReplaceParamField(<->str_set,par->key,false,0,STRDUP(text)); + } + } + + //---------------------------------------------------------------------------- + + void SetByKeyLT ( le_track_t *lt, ccp key, ccp text ) + { + le_strpar_t par = { .key = key }; + SetSetLT(lt,&par,text); + } + +#endif // LE_STRING_SET_ENABLED +/////////////////////////////////////////////////////////////////////////////// + +void SetTextOptLT ( le_track_t *lt, ccp text, le_options_t opt ) +{ + le_strpar_t par = { .opt = opt }; + SetTextLT(lt,&par,text); +} + +//----------------------------------------------------------------------------- + +void SetTextLT ( le_track_t *lt, const le_strpar_t *par, ccp text ) +{ + // par: ltt, * + + le_strpar_t mypar = {0}; + if (par) + mypar = *par; + + const le_track_text_t ltt = mypar.opt & LEO_LTT_SELECTOR; + switch (ltt) + { + case LTT_SHA1: + mypar.use_d = false; + mypar.csum_only = true; + SetIdentLT(lt,&mypar,text); + break; + + case LTT_IDENT: + mypar.use_d = false; + mypar.csum_only = false; + SetIdentLT(lt,&mypar,text); + break; + + case LTT_SHA1_D: + mypar.use_d = true; + mypar.csum_only = true; + SetIdentLT(lt,&mypar,text); + break; + + case LTT_IDENT_D: + mypar.use_d = true; + mypar.csum_only = false; + SetIdentLT(lt,&mypar,text); + break; + + case LTT_FILE: + SetFileLT(lt,&mypar,text); + break; + + case LTT_NAME: + SetNameLT(lt,&mypar,text); + break; + + case LTT_XNAME: + case LTT_XNAME2: + SetXNameLT(lt,&mypar,text); + break; + + #if LE_STRING_SET_ENABLED + case LTT_STRSET: + SetSetLT(lt,&mypar,text); + break; + #endif + + default: + #if LE_STRING_LIST_ENABLED + if ( ltt >= LTT__LIST_BEG && ltt < LTT__LIST_END ) + SetListLT(lt,&mypar,text); + #endif + break; + } +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// Get*LT() functions /////////////// +/////////////////////////////////////////////////////////////////////////////// + +ccp GetSha1LT ( const le_track_t *lt, bool use_d, ccp return_on_empty ) +{ + const le_track_id_t *lti = lt->lti + (use_d>0); + if ( !lt || lt->track_status < LTS_EXPORT || !lti->have_sha1 ) + return return_on_empty; + + char *buf = GetCircBuf(sizeof(sha1_hex_t)); + Sha1Bin2Hex(buf,lti->sha1bin); + return buf; +} + +/////////////////////////////////////////////////////////////////////////////// + +ccp GetIdentLT ( const le_track_t *lt, bool use_d, bool use_sha1, ccp return_on_empty ) +{ + const le_track_id_t *lti = lt->lti + (use_d>0); + if ( !lt || lt->track_status < LTS_EXPORT ) + return return_on_empty; + + return lti->ident + ? ( *lti->ident ? lti->ident : return_on_empty ) + : use_sha1 + ? GetSha1LT(lt,use_d,return_on_empty) + : return_on_empty; +} + +/////////////////////////////////////////////////////////////////////////////// + +ccp GetFileLT ( const le_track_t *lt, ccp return_on_empty ) +{ + return lt && lt->track_status >= LTS_EXPORT && lt->file && *lt->file + ? lt->file + : return_on_empty; +} + +/////////////////////////////////////////////////////////////////////////////// + +ccp GetNameLT ( const le_track_t *lt, ccp return_on_empty ) +{ + return lt && lt->track_status >= LTS_EXPORT && IsOutputNameValidLEO(lt->name,0) + ? lt->name + : return_on_empty; +} + +//----------------------------------------------------------------------------- + +ccp GetXNameLT ( const le_track_t *lt, ccp return_on_empty ) +{ + return lt && lt->track_status >= LTS_EXPORT && IsOutputNameValidLEO(lt->xname,0) + ? lt->xname + : return_on_empty; +} + +//----------------------------------------------------------------------------- + +ccp GetXName2LT ( const le_track_t *lt, ccp return_on_empty ) +{ + if ( !lt || lt->track_status < LTS_EXPORT ) + return return_on_empty; + + return IsOutputNameValidLEO(lt->xname,0) + ? lt->xname + : IsOutputNameValidLEO(lt->name,0) + ? lt->name + : return_on_empty; +} + +/////////////////////////////////////////////////////////////////////////////// +#if LE_STRING_LIST_ENABLED + + ccp GetListLT ( const le_track_t *lt, le_options_t opt, ccp return_on_empty ) + { + const le_track_text_t ltt = opt & LEO_LTT_SELECTOR; + + if ( lt + && lt->track_status >= LTS_EXPORT + && ltt >= LTT__LIST_BEG + && ltt < LTT__LIST_END + ) + { + ccp text = lt->str_list[ ltt - LTT__LIST_BEG ]; + if ( text && *text ) + return text; + } + + return return_on_empty; + } + +#endif // LE_STRING_LIST_ENABLED +/////////////////////////////////////////////////////////////////////////////// +#if LE_STRING_SET_ENABLED + + ccp GetSetLT ( const le_track_t *lt, const le_strpar_t *par, ccp return_on_empty ) + { + if ( lt + && lt->track_status >= LTS_EXPORT + && IsValidSetLSP(par) + ) + { + const ParamFieldItem_t *it = FindParamField(<->str_set,par->key); + if (it) + return it->data; + } + return return_on_empty; + } + +#endif // LE_STRING_SET_ENABLED +/////////////////////////////////////////////////////////////////////////////// + +ccp GetTextLT ( const le_track_t *lt, const le_strpar_t *par, ccp return_on_empty ) +{ + if (!par) + return return_on_empty; + + #if LE_STRING_SET_ENABLED + if (IsValidSetLSP(par)) + return GetSetLT(lt,par,return_on_empty); + #endif + return GetTextOptLT(lt,par->opt,return_on_empty); +} + +//----------------------------------------------------------------------------- + +ccp GetTextOptLT ( const le_track_t *lt, le_options_t opt, ccp return_on_empty ) +{ + const le_track_text_t ltt = opt & LEO_LTT_SELECTOR; + switch (ltt) + { + case LTT_SHA1: return GetSha1LT(lt,false,return_on_empty); + case LTT_SHA1_D: return GetSha1LT(lt,true, return_on_empty); + case LTT_IDENT: return GetIdentLT(lt,false,false,return_on_empty); + case LTT_IDENT_D: return GetIdentLT(lt,true, false,return_on_empty); + + case LTT_FILE: return GetFileLT(lt,return_on_empty); + case LTT_NAME: return GetNameLT(lt,return_on_empty); + case LTT_XNAME: return GetXNameLT(lt,return_on_empty); + case LTT_XNAME2: return GetXName2LT(lt,return_on_empty); + + default: + #if LE_STRING_LIST_ENABLED + if ( ltt >= LTT__LIST_BEG && ltt < LTT__LIST_END ) + return GetListLT(lt,ltt,return_on_empty); + #endif + break; + } + + return return_on_empty; +} + +/////////////////////////////////////////////////////////////////////////////// + +ccp * GetPtrLT ( const le_track_t *lt, const le_strpar_t *par ) +{ + #if LE_STRING_SET_ENABLED + if (IsValidSetLSP(par)) + { + ParamFieldItem_t *it = FindParamField(<->str_set,par->key); + return it ? (ccp*)&it->data : 0; + } + #endif + return par ? GetPtrOptLT(lt,par->opt,par->allow_d) : 0; +} + +//----------------------------------------------------------------------------- + +ccp * GetPtrOptLT ( const le_track_t *lt, le_options_t opt, bool allow_d ) +{ + const le_track_text_t ltt = opt & LEO_LTT_SELECTOR; + switch (ltt) + { + case LTT_IDENT_D: + if (allow_d) + return (ccp*)<->lti[1].ident; + break; + + case LTT_IDENT: return (ccp*)<->lti[0].ident; + case LTT_FILE: return (ccp*)<->file; + case LTT_NAME: return (ccp*)<->name; + case LTT_XNAME: return (ccp*)<->xname; + + default: + #if LE_STRING_LIST_ENABLED + if ( ltt >= LTT__LIST_BEG && ltt < LTT__LIST_END ) + return (ccp*)lt->str_list + ltt - LTT__LIST_BEG; + #endif + break; + } + + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +ccp GetSlotNameLT ( const le_track_t *lt ) +{ + if (!lt) + return 0; + + static const char rslot_name[][6] = { "rAll", "rOrig", "rCust", "rNew" }; + + ccp pre = GetNameLTTY(lt->track_type); + return lt->track_slot >= MKW_LE_RANDOM_BEG && lt->track_slot <= MKW_LE_RANDOM_END + ? rslot_name[ lt->track_slot - MKW_LE_RANDOM_BEG ] + : PrintCircBuf( "%s%u", pre, lt->track_slot ); +} + +/////////////////////////////////////////////////////////////////////////////// + +ccp GetCupLT ( const le_track_t *lt, ccp return_on_empty ) +{ + if (!lt) + return return_on_empty; + + const bool hidden = IsHiddenLETF(lt->flags); + if (!lt->cup_slot) + return hidden ? "H" : "-"; + + return PrintCircBuf("%s%s%u.%u", + hidden ? "H" : "", + IsArenaLTTY(lt->track_type) ? "A" : IsRandomLTTY(lt->track_type) ? "R" : "", + lt->cup_slot / 10, lt->cup_slot % 10 ); +} + +//----------------------------------------------------------------------------- + +ccp GetCupAlignLT ( const le_track_t *lt ) +{ + ccp res = GetCupLT(lt,"-"); + return IsHiddenLETF(lt->flags) + ? PrintCircBuf("%8s",res) + : PrintCircBuf("%6s ",res); +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// Quote*LT() functions /////////////// +/////////////////////////////////////////////////////////////////////////////// + +ccp QuoteSha1LT ( const le_track_t *lt, bool use_d, ccp return_on_empty ) +{ + ccp res = GetSha1LT(lt,use_d,return_on_empty); + return QuoteStringCircS(res,"\"\"",CHMD__MODERN); +} + +/////////////////////////////////////////////////////////////////////////////// + +ccp QuoteIdentLT ( const le_track_t *lt, bool use_d, bool use_sha1, ccp return_on_empty ) +{ + ccp res = GetIdentLT(lt,use_d,use_sha1,return_on_empty); + return QuoteStringCircS(res,EmptyQuote,CHMD__MODERN); +} + +/////////////////////////////////////////////////////////////////////////////// + +ccp QuoteFileLT ( const le_track_t *lt, ccp return_on_empty ) +{ + ccp res = GetFileLT(lt,return_on_empty); + return QuoteStringCircS(res,EmptyQuote,CHMD__MODERN); +} + +/////////////////////////////////////////////////////////////////////////////// + +ccp QuoteNameLT ( const le_track_t *lt, ccp return_on_empty ) +{ + ccp res = GetNameLT(lt,return_on_empty); + return QuoteStringCircS(res,EmptyQuote,CHMD__MODERN); +} + +/////////////////////////////////////////////////////////////////////////////// + +ccp QuoteXNameLT ( const le_track_t *lt, ccp return_on_empty ) +{ + ccp res = GetXNameLT(lt,return_on_empty); + return QuoteStringCircS(res,EmptyQuote,CHMD__MODERN); +} + +/////////////////////////////////////////////////////////////////////////////// + +ccp QuoteXName2LT ( const le_track_t *lt, ccp return_on_empty ) +{ + ccp res = GetXName2LT(lt,return_on_empty); + return QuoteStringCircS(res,EmptyQuote,CHMD__MODERN); +} + +/////////////////////////////////////////////////////////////////////////////// +#if LE_STRING_LIST_ENABLED + + ccp QuoteListLT ( const le_track_t *lt, le_options_t opt, ccp return_on_empty ) + { + ccp res = GetListLT(lt,opt,return_on_empty); + return QuoteStringCircS(res,EmptyQuote,CHMD__MODERN); + } + +#endif // LE_STRING_LIST_ENABLED +/////////////////////////////////////////////////////////////////////////////// +#if LE_STRING_SET_ENABLED + + ccp QuoteSetLT ( const le_track_t *lt, const le_strpar_t *par, ccp return_on_empty ) + { + ccp res = GetSetLT(lt,par,return_on_empty); + return QuoteStringCircS(res,EmptyQuote,CHMD__MODERN); + } + +#endif // LE_STRING_SET_ENABLED +/////////////////////////////////////////////////////////////////////////////// + +ccp QuoteTextLT ( const le_track_t *lt, const le_strpar_t *par, ccp return_on_empty ) +{ + if (!par) + return return_on_empty; + + #if LE_STRING_SET_ENABLED + if (IsValidSetLSP(par)) + return QuoteSetLT(lt,par,return_on_empty); + #endif + return QuoteTextOptLT(lt,par->opt,return_on_empty); +} +//----------------------------------------------------------------------------- + +ccp QuoteTextOptLT ( const le_track_t *lt, le_options_t opt, ccp return_on_empty ) +{ + const le_track_text_t ltt = opt & LEO_LTT_SELECTOR; + switch (ltt) + { + case LTT_SHA1: return QuoteSha1LT(lt,false,return_on_empty); break; + case LTT_SHA1_D: return QuoteSha1LT(lt,true, return_on_empty); break; + case LTT_IDENT: return QuoteIdentLT(lt,false,false,return_on_empty); break; + case LTT_IDENT_D: return QuoteIdentLT(lt,true, false,return_on_empty); break; + + case LTT_NAME: return QuoteNameLT(lt,return_on_empty); break; + case LTT_XNAME: return QuoteXNameLT(lt,return_on_empty); break; + case LTT_XNAME2: return QuoteXName2LT(lt,return_on_empty); break; + case LTT_FILE: return QuoteFileLT(lt,return_on_empty); break; + + default: + #if LE_STRING_LIST_ENABLED + if ( ltt >= LTT__LIST_BEG && ltt < LTT__LIST_END ) + return QuoteListLT(lt,ltt,return_on_empty); + #endif + break; + } + + return return_on_empty; +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// le_distrib_t: management /////////////// +/////////////////////////////////////////////////////////////////////////////// + +void InitializeLD ( le_distrib_t *ld ) +{ + DASSERT(ld); + memset(ld,0,sizeof(*ld)); + + ld->is_initialized = true; + ld->scan.bt.add_unused = true; + ld->scan.bt.add_unused = true; + ld->auto_setup = LAS_DEFAULT; + + InitializeLSP(&ld->spar,SetupDefaultLEO()); + InitializeLECUP(&ld->cup_battle,BMG_MAX_BCUP,BMG_BCUP_TRACKS); + InitializeLECUP(&ld->cup_versus,BMG_MAX_RCUP,BMG_RCUP_TRACKS); + + InitializeParamField(&ld->dis_param); + ld->dis_param.free_data = true; + + InitializeEML(&ld->group); +} + +/////////////////////////////////////////////////////////////////////////////// + +void ResetLD ( le_distrib_t *ld ) +{ + if (ld) + { + ResetArchLD(ld); + ResetTracksAndCupsLD(ld); + ResetParamField(&ld->dis_param); + FREE(ld->lpar); + ResetLSP(&ld->spar); + + if (ld->ctcode) + { + ResetCTCODE(ld->ctcode); + FREE(ld->ctcode); + } + + for ( int reg = 0; reg < LEREG__N; reg++ ) + if (ld->lecode_alloced[reg]) + FREE((u8*)ld->lecode[reg].ptr); + + InitializeLD(ld); + } +} + +/////////////////////////////////////////////////////////////////////////////// + +void ResetTracksAndCupsLD ( le_distrib_t *ld ) +{ + if (ld) + { + le_track_t *lt = ld->tlist; + le_track_t *end = lt + ld->tlist_used; + for ( ; lt < end; lt++ ) + ResetLT(lt); + + FREE(ld->tlist); + ld->tlist = 0; + ld->tlist_used = ld->tlist_size = 0; + + FREE(ld->reflist); + ld->reflist = 0; + ld->reflist_used = ld->reflist_size = 0; + + ResetLECUP(&ld->cup_battle); + ResetLECUP(&ld->cup_versus); + } +} + +/////////////////////////////////////////////////////////////////////////////// + +void AutoSetupLD ( le_distrib_t *ld, le_auto_setup_t auto_setup ) +{ + if (!ld) + return; + + ld->auto_setup = auto_setup; + for ( int slot = MKW_TRACK_BEG; slot < MKW_ARENA_END; slot++ ) + DefineTrackLD(ld,slot,true); + for ( int slot = MKW_LE_RANDOM_BEG; slot < MKW_LE_RANDOM_END; slot++ ) + DefineTrackLD(ld,slot,true); + + if ( auto_setup & LAS_ARENA ) + { + DefineLECUP(&ld->cup_battle,1); + memcpy(ld->cup_battle.list,standard_bt_ref,sizeof(standard_bt_ref)); + } + + if ( auto_setup & LAS_TRACK ) + { + DefineLECUP(&ld->cup_versus,7); + memcpy(ld->cup_versus.list,standard_vs_ref,sizeof(standard_vs_ref)); + } + + if ( auto_setup & LAS_TEMPLATE ) + { + le_cup_ref_t *ref = DefineLECUP(&ld->cup_versus,8); + if (ref) + memcpy(ref,mkwfun_random_ref,sizeof(mkwfun_random_ref)); + + ref = DefineLECUP(&ld->cup_versus,9); + if (ref) + { + for ( int i = 1; i <= 6; i++ ) + { + le_track_t *lt = DefineFreeTrackLD(ld,LTTY_TRACK,true); + if (lt) + { + lt->property = 10+i; + lt->music = NormalizeMusicID(20+i); + + char buf[30]; + snprintf(buf,sizeof(buf),"file_%03u",lt->track_slot); + SetFileLT(lt,0,buf); + + if ( i == 3 ) + { + lt->flags = LETF_RND_HEAD; + SetNameLT(lt,0,"Head of a group"); + *ref++ = lt->track_slot; + } + else if ( i == 4 || i == 5 ) + { + lt->flags = LETF_RND_GROUP; + snprintf(buf,sizeof(buf),"Group Track #%u (hidden)",i-3); + SetNameLT(lt,0,buf); + SetIdentOptLT(lt,"SHA1 of SZS",false,false,0); + } + else + { + snprintf(buf,sizeof(buf),"Test Track #%u",i); + SetNameLT(lt,0,buf); + SetIdentOptLT(lt,"SHA1 of SZS",false,false,0); + *ref++ = lt->track_slot; + } + + snprintf(buf,sizeof(buf),"Extended Name #%u",i); + SetXNameLT(lt,0,buf); + } + } + } + } +} + +/////////////////////////////////////////////////////////////////////////////// + +void AnalyzeLD ( le_distrib_t *ld, bool force_new_analysis ) +{ + if ( !ld || ld->ana.valid && !force_new_analysis ) + return; + + memset(&ld->ana,0,sizeof(ld->ana)); + ld->ana.valid = true; + ld->ana.bt.orig_tracks = true; + ld->ana.vs.orig_tracks = true; + + ld->ana.bt.add_unused = !ld->scan.valid || ld->scan.bt.add_unused; + ld->ana.vs.add_unused = !ld->scan.valid || ld->scan.vs.add_unused; + + for ( int slot = MKW_ARENA_BEG; slot < MKW_ARENA_END; slot++ ) + { + le_track_t *lt = GetTrackLD(ld,slot); + if ( !lt || lt->track_status < LTS_EXPORT || !lt->is_original ) + { + ld->ana.bt.orig_tracks = false; + break; + } + } + + for ( int slot = MKW_TRACK_BEG; slot < MKW_TRACK_END; slot++ ) + { + le_track_t *lt = GetTrackLD(ld,slot); + if ( !lt || lt->track_status < LTS_EXPORT || !lt->is_original ) + { + ld->ana.vs.orig_tracks = false; + break; + } + } +} + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +void CutLD ( le_distrib_t *ld, le_options_t opt ) +{ + if (!ld) + return; + + if ( opt & LEO_CUT_STD ) + ClearTracksLD( ld, BMG_N_TRACK + BMG_N_ARENA, INT_MAX ); + + if ( opt & LEO_CUT_CTCODE ) + { + ClearTracksLD( ld, CT_CODE_MAX_TRACKS, INT_MAX ); + ClearTracksLD( ld, BMG_N_TRACK, BMG_N_TRACK + BMG_N_ARENA ); + } +} + +//----------------------------------------------------------------------------- + +void ClearTracksLD ( le_distrib_t *ld, int from, int to ) +{ + if (!ld) + return; + + if ( from < 0 ) + from = 0; + if ( to > ld->tlist_used ) + to = ld->tlist_used; + + le_track_t *lt = ld->tlist + from; + le_track_t *end = ld->tlist + to; + + for ( ; lt < end; lt++ ) + { + FreeString(lt->lti[0].ident); + FreeString(lt->lti[1].ident); + FreeString(lt->name); + FreeString(lt->file); + memset(lt,0,sizeof(*lt)); + } + + if ( ld->tlist_used == to ) + ld->tlist_used = from; +} + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +uint PackTracksLD ( const le_distrib_t *ld ) +{ + if (!ld) + return 0; + + if ( ld->tlist_used < LE_FIRST_CT_SLOT ) + return LE_FIRST_CT_SLOT; + + int slot; + for ( slot = ld->tlist_used - 1; slot >= LE_FIRST_CT_SLOT; slot-- ) + { + le_track_t *lt = ld->tlist + slot; + if ( lt->track_status >= LTS_ACTIVE ) + break; + ClearLT(lt,0); + } + return ((le_distrib_t*)ld)->tlist_used = slot+1; +} + +/////////////////////////////////////////////////////////////////////////////// + +void CheckTracksLD ( const le_distrib_t *ld ) +{ + if (!ld) + return; + + le_track_t *lt = ld->tlist; + for ( int slot = 0; slot < ld->tlist_used; slot++, lt++ ) + { + if ( lt->track_status < LTS_ACTIVE ) + continue; + + if ( lt->track_type & LTTY_TRACK ) + { + if (!IsMkwTrack(lt->property)) + lt->track_status = LTS_FAIL; + } + else + { + if (!IsMkwArena(lt->property)) + lt->track_status = LTS_FAIL; + } + } + + PackTracksLD(ld); +} + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +le_track_t * GetTrackLD ( le_distrib_t *ld, int slot ) +{ + if ( !ld || !IsValidLecodeSlot(slot) || slot >= ld->tlist_used ) + return 0; + + le_track_t *lt = ld->tlist + slot; + return lt->track_status < LTS_ACTIVE ? 0 : lt; +} + +/////////////////////////////////////////////////////////////////////////////// + +le_track_t * DefineTrackLD ( le_distrib_t *ld, int slot, bool mark_export ) +{ + if ( !ld || !IsValidLecodeSlot(slot) ) + return 0; + + if (!ld->is_initialized) + InitializeLD(ld); + + uint need = slot + 1; + if ( need > ld->tlist_size ) + { + static const int tab[] = { 512, 1024, 2048, LE_MAX_TRACKS, 0 }; + for ( const int *ptr = tab; *ptr; ptr++ ) + if ( need <= *ptr ) + { + need = *ptr; + break; + } + + ld->tlist = REALLOC( ld->tlist, need * sizeof(*ld->tlist) ); + memset( ld->tlist + ld->tlist_size, 0, ( need - ld->tlist_size) * sizeof(*ld->tlist) ); + ld->tlist_size = need; + + FREE(ld->reflist); + ld->reflist = 0; + ld->reflist_used = ld->reflist_size = 0; + } + + DASSERT( slot >= 0 && slot <= MKW_MAX_TRACK_SLOT ); + DASSERT( slot < ld->tlist_size ); + + if ( ld->tlist_used <= slot ) + ld->tlist_used = slot + 1; + if ( ld->tlist_used < LE_FIRST_CT_SLOT ) + ld->tlist_used = LE_FIRST_CT_SLOT; + ASSERT( ld->tlist_used <= ld->tlist_size ); + + le_track_t *lt = ld->tlist + slot; + if ( lt->track_status == LTS_INVALID ) + { + // initialize + + InitializeLT(lt); + lt->track_slot = slot; + + if ( IsMkwArena(slot) ) + { + lt->track_type = LTTY_ARENA; + if ( ld->auto_setup & LAS_ARENA ) + SetupStandardArenaLT(lt,slot); + } + else if ( IsLecodeRandom(slot) ) + { + lt->track_status = LTS_ACTIVE; + lt->track_type = LTTY_RANDOM|LTTY_TRACK; + if ( ld->auto_setup & LAS_RANDOM ) + SetupLecodeRandomTrackLT(lt,slot); + } + else + { + lt->track_type = LTTY_TRACK; + if ( IsMkwTrack(slot) && ld->auto_setup & LAS_TRACK ) + SetupStandardTrackLT(lt,slot); + } + + DirtyCupLD(ld,lt->track_type); + } + + if ( mark_export && lt->track_status < LTS_ACTIVE ) + lt->track_status = LTS_EXPORT; + + return lt; +} + +/////////////////////////////////////////////////////////////////////////////// + +le_track_t * DefineFreeTrackLD + ( le_distrib_t *ld, le_track_type_t ltty, bool mark_export ) +{ + if (!ld) + return 0; + + if (!ltty) + ltty = LTTY_TRACK | LTTY_ARENA; + const int slot_beg + = ltty == LTTY_TRACK + ? MKW_TRACK_BEG + : ltty == LTTY_ARENA + ? MKW_ARENA_BEG + : ltty & (LTTY_TRACK|LTTY_ARENA) + ? LE_FIRST_CT_SLOT + : -1; + + if ( slot_beg < 0 ) + return 0; + + for ( int slot = slot_beg; slot <= LE_LAST_CT_SLOT; slot++ ) + { + if ( slot == MKW_TRACK_END && !(ltty<TY_ARENA) || slot == MKW_ARENA_END ) + slot = LE_FIRST_CT_SLOT; + + le_track_t *lt = DefineTrackLD(ld,slot,false); + if ( lt && lt->track_status < LTS_ACTIVE ) + { + if (mark_export) + lt->track_status = LTS_EXPORT; + lt->track_type = ltty; + DirtyCupLD(ld,ltty); + return lt; + } + } + + return 0; +} + +/////////////////////////////////////////////////////////////////////////////// + +le_track_t * DefineGroupTrackLD + ( le_distrib_t *ld, le_track_type_t ltty, bool mark_export ) +{ + if (!ld) + return 0; + + if (!ltty) + ltty = LTTY_TRACK | LTTY_ARENA; + DirtyCupLD(ld,ltty); + + int slot = PackTracksLD(ld); + ASSERT ( slot >= LE_FIRST_CT_SLOT ); + return DefineTrackLD(ld,slot,mark_export); +} + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +int FindFreeTracksLD ( le_distrib_t *ld, le_track_type_t ltty, int n ) +{ + int beg, end; + if ( ltty == LTTY_TRACK ) + { + beg = MKW_TRACK_BEG; + end = MKW_TRACK_END; + } + else if ( ltty == LTTY_ARENA ) + { + beg = MKW_ARENA_BEG; + end = MKW_ARENA_END; + } + else + { + beg = LE_FIRST_CT_SLOT; + end = 0; + } + + int prev = -10, start = -10; + for ( int slot = beg; slot < LE_LAST_CT_SLOT; slot++ ) + { + if ( slot == end ) + slot = LE_FIRST_CT_SLOT; + + if ( slot < ld->tlist_used && IsActiveLT(ld->tlist+slot) ) + continue; + + if ( prev+1 != slot ) + start = slot; + prev = slot; + if ( start + n == slot ) + return start; + } + return -1; +} + +/////////////////////////////////////////////////////////////////////////////// + +le_track_t * ReserveTracksLD + ( le_distrib_t *ld, le_track_type_t ltty, int n, bool mark_export ) +{ + const int first = FindFreeTracksLD(ld,ltty,n); + if ( first < 0 ) + return 0; + for ( int slot = first; slot < first + n; slot++ ) + { + le_track_t *lt = DefineTrackLD(ld,slot,mark_export); + lt->track_type = ltty; + lt->track_status = mark_export ? LTS_EXPORT : LTS_ACTIVE; + } + return ld->tlist + first; +} + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +void ClearUserFlagsAndCupsLD ( le_distrib_t *ld ) +{ + if (ld) + { + le_track_t *lt = ld->tlist; + for ( int slot = 0; slot < ld->tlist_used; slot++, lt++ ) + { + lt->user_flags = 0; + lt->cup_slot = 0; + } + } +} + +/////////////////////////////////////////////////////////////////////////////// + +bool HaveWiimmCupLD ( const le_distrib_t *ld ) +{ + if (!ld) + return false; + + le_cup_ref_t *ref = GetLECUP(&ld->cup_versus,8); + return ref && ref[0] == 62 && ref[1] == 63 && ref[2] == 64 && ref[3] == 65; +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// le_distrib_t: scan text files /////////////// +/////////////////////////////////////////////////////////////////////////////// + +static ccp xstring ( char *buf, int bufsize, mem_t src ) +{ + if (!src.len) + return 0; + + StringCopySM(buf,bufsize,src.ptr,src.len); + ScanEscapedStringPipe(buf,bufsize,buf,0); + return buf; +} + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +void ScanDumpLD +( + le_distrib_t *ld, // valid structure + bool init_ld, // TRUE: initialze 'ld' + const void * data, // data to scan + uint data_size // size of 'data' +) +{ + ScanText_t st; + SetupScanText(&st,data,data_size); + ScanDumpSTLD(ld,init_ld,&st); + ResetScanText(&st); +} + +//----------------------------------------------------------------------------- + +void ScanDumpSTLD +( + le_distrib_t *ld, // valid structure + bool init_ld, // TRUE: initialze 'ld' + ScanText_t *st // initialized source +) +{ + if ( !ld || !st ) + return; + + st->detect_sections++; + + for(;;) + { + if (!st->is_section) + NextLineScanText(st); + if (st->is_eot) + break; + + if (!st->is_section) + continue; + + ccp sect = st->line + 1; + int slen = st->eol - 1 - sect; + PRINT0("SECTION: %.*s\n",slen,sect); + + if (!strncasecmp(sect,"TOOL",4)) + { + PRINT0(">> TOOL: ignore\n"); + st->is_section = false; + } + else if (!strncasecmp(sect,"SETTINGS",8)) + { + PRINT0(">> SETTINGS: 2do\n"); + // [[2do]] ??? + st->is_section = false; + } + else if (!strncasecmp(sect,"DISTRIBUTION-PARAM",18)) + { + ImportDistribSTLD(ld,st); + } + else if ( !strncasecmp(sect,"LECODE-PARAMETERS",17) + || !strncasecmp(sect,"CHAT-MESSAGE-MODES",18) + || !strncasecmp(sect,"DEBUG-DOCU",10) + || !strncasecmp(sect,"DEBUG-1",7) + || !strncasecmp(sect,"DEBUG-2",7) + || !strncasecmp(sect,"DEBUG-3",7) + || !strncasecmp(sect,"DEBUG-4",7) + ) + { + SetupLparLD(ld,false); + ccp start = st->line; + while ( NextLineScanText(st) && !st->is_section ) + ; + ScanTextLPAR(ld->lpar,false,0,start,st->line-start); + } + else if (!strncasecmp(sect,"CUP-REF",7)) + { + PRINT0(">> CUP-REF: 2do\n"); + ScanRefSTLD(ld,false,st); + } + else if (!strncasecmp(sect,"TRACK-REF",9)) + { + PRINT0(">> TRACK-REF: 2do\n"); + ScanRefSTLD(ld,false,st); + } + else if (!strncasecmp(sect,"TRACK-STRINGS",13)) + { + PRINT0(">> TRACK-STRINGS: 2do\n"); + ScanStrSTLD(ld,false,st); + } + else if ( !strncasecmp(sect,"END",3) + || !strncasecmp(sect,"LECODE-INFO",6) ) + { + // simply ignore + st->is_section = false; + } + else + { + ERROR0(ERR_WARNING,"Unknown section will be ignored: %.*s\n",slen,sect); + st->is_section = false; + } + } + + st->detect_sections--; +} + + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +void ScanRefLD +( + le_distrib_t *ld, // valid structure + bool init_ld, // TRUE: initialze 'ld' + const void * data, // data to scan + uint data_size // size of 'data' +) +{ + ScanText_t st; + SetupScanText(&st,data,data_size); + ScanRefSTLD(ld,init_ld,&st); + ResetScanText(&st); +} + +/////////////////////////////////////////////////////////////////////////////// + +void ScanRefSTLD +( + le_distrib_t *ld, // valid structure + bool init_ld, // TRUE: initialze 'ld' + ScanText_t *st // initialized source +) +{ + if ( !ld || !st ) + return; + + if ( init_ld || !ld->is_initialized ) + InitializeLD(ld); + + enum + { + IDX_TSLOT, // track_slot + IDX_TYPE, // 'vs' | 'bt' + IDX_ORIGINAL, + IDX_CUP_SLOT, // cup slot + IDX_CUP_NAME, // cup name + IDX_PROPERTY, + IDX_MUSIC, + IDX_FLAGS, + IDX_HIDDEN, + IDX_SHA1, + IDX_SHA1_D, + IDX_IDENT, + IDX_IDENT_D, + IDX_FILE, + IDX_FILE_D, + IDX_NAME, + IDX_NAME_D, + IDX_XNAME, + IDX_XNAME_D, + IDX__N + }; + + while (NextLineScanText(st)) + { + mem_t srcline = { .ptr = st->line, .len = st->eol - st->line }; + mem_t src[IDX__N+2]; + const uint n = SplitByCharMem(src,IDX__N+1,srcline,'|'); + if ( n < IDX_FLAGS ) + continue; + + const int tslot = str2l(src[IDX_TSLOT].ptr,0,10); + le_track_t *lt = DefineTrackLD(ld,tslot,true); + if (!lt) + continue; + + PRINT0("LINE[%d]: %.*s|\n",tslot,(int)(ptr-line),line); + + lt->cup_slot = str2l(src[IDX_CUP_SLOT].ptr,0,10); + lt->property = str2l(src[IDX_PROPERTY].ptr,0,10); + lt->music = str2l(src[IDX_MUSIC].ptr,0,10); + lt->flags = str2l(src[IDX_FLAGS].ptr,0,10); + + char buf[LE_TRACK_STRING_MAX+1]; + if ( n > IDX_SHA1 ) SetIdentOptLT(lt,xstring(buf,sizeof(buf),src[IDX_SHA1]), 0,1,ld->spar.opt ); + if ( n > IDX_IDENT ) SetIdentOptLT(lt,xstring(buf,sizeof(buf),src[IDX_IDENT]), 0,0,ld->spar.opt ); + if ( n > IDX_SHA1_D ) SetIdentOptLT(lt,xstring(buf,sizeof(buf),src[IDX_SHA1_D]), 1,1,ld->spar.opt ); + if ( n > IDX_IDENT_D ) SetIdentOptLT(lt,xstring(buf,sizeof(buf),src[IDX_IDENT_D]),1,0,ld->spar.opt ); + if ( n > IDX_FILE ) SetFileLT (lt,&ld->spar,xstring(buf,sizeof(buf),src[IDX_FILE] ) ); + if ( n > IDX_NAME ) SetNameLT (lt,&ld->spar,xstring(buf,sizeof(buf),src[IDX_NAME] ) ); + if ( n > IDX_XNAME ) SetXNameLT(lt,&ld->spar,xstring(buf,sizeof(buf),src[IDX_XNAME]) ); + + #if 0 + // this is the last action to overwrite previous changes + if (src[IDX_ORIGINAL].len) + lt->is_original = str2l(src[IDX_ORIGINAL].ptr,0,10); + #endif + } +} + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +void ScanStrLD +( + le_distrib_t *ld, // valid structure + bool init_ld, // TRUE: initialze 'ld' + const void * data, // data to scan + uint data_size // size of 'data' +) +{ + ScanText_t st; + SetupScanText(&st,data,data_size); + ScanStrSTLD(ld,init_ld,&st); + ResetScanText(&st); +} + +/////////////////////////////////////////////////////////////////////////////// + +void ScanStrSTLD +( + le_distrib_t *ld, // valid structure + bool init_ld, // TRUE: initialze 'ld' + ScanText_t *st // initialized source +) +{ + if ( !ld || !st ) + return; + + if ( init_ld || !ld->is_initialized ) + InitializeLD(ld); + + enum + { + IDX_TSLOT, // track_slot + IDX_D_MODE, // bit fields: 1: set std, 2: set _d, 3: set both + IDX_IS_SET, + IDX_NAME, + IDX_STRING, + IDX__N + }; + + while (NextLineScanText(st)) + { + mem_t srcline = { .ptr = st->line, .len = st->eol - st->line }; + mem_t src[IDX__N+2]; + const uint n = SplitByCharMem(src,IDX__N+1,srcline,'|'); + if ( n < IDX__N ) + continue; + + const int tslot = str2l(src[IDX_TSLOT].ptr,0,10); + le_track_t *lt = DefineTrackLD(ld,tslot,true); + if (!lt) + continue; + + le_strpar_t spar = { .opt = LEO__DEFAULT|LEO_IN_ALL }; + if ( str2l(src[IDX_IS_SET].ptr,0,10) > 0 ) + #if LE_STRING_SET_ENABLED + SetKeyNameLSP(&spar,src[IDX_NAME].ptr,src[IDX_NAME].len); + #else + continue; + #endif + else + ScanLSP(&spar,src[IDX_NAME].ptr,0); + + char buf[LE_TRACK_STRING_MAX+1]; + StringCopySM(buf,sizeof(buf),src[IDX_STRING].ptr,src[IDX_STRING].len); + ScanEscapedStringPipe(buf,sizeof(buf),buf,0); + + PRINT1(">>>> %s = %s\n",GetNameLSP(&spar),buf); + const int dmode = str2l(src[IDX_D_MODE].ptr,0,10); + if ( dmode == 2 ) + spar.use_d = true; + SetTextLT(lt,&spar,buf); + } +} + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +void ScanSha1LD +( + le_distrib_t *ld, // valid structure + bool init_ld, // TRUE: initialze 'ld' + const void * data, // data to scan + uint data_size // size of 'data' +) +{ + ScanText_t st; + SetupScanText(&st,data,data_size); + ScanSha1STLD(ld,init_ld,&st); + ResetScanText(&st); +} + +/////////////////////////////////////////////////////////////////////////////// + +void ScanSha1STLD +( + le_distrib_t *ld, // valid structure + bool init_ld, // TRUE: initialze 'ld' + ScanText_t *st // initialized source +) +{ + if ( !ld || !st ) + return; + + if ( init_ld || !ld->is_initialized ) + InitializeLD(ld); + + while (NextLineScanText(st)) + ScanSha1LineLD(ld,st->line,st->eol,true); +} + +/////////////////////////////////////////////////////////////////////////////// + +bool ScanSha1LineLD +( + le_distrib_t *ld, // valid structure + ccp src, // NULL or start of line + ccp end, // end of line + bool ident_only // TRUE: SetIdent*LT() only +) +{ + if ( !ld || !src || !end ) + return false; + + bool is_arena = false; + bool is_d = false; + uint tslot = -1; + uint cup = 0; + + int pi; + char buf[300]; + int valid_sha1 = false; + sha1_size_t bin; + enum { P_TYPE, P_FLAGS, P_SHA1, P_TSLOT, P_CUP, P_NAME }; + + for ( pi = P_TYPE; pi <= P_NAME; pi++ ) + { + while ( src < end && (uchar)*src <= ' ' ) + src++; + + ccp par = src; + while ( src < end && (uchar)*src > ' ' ) + src++; + + switch (pi) + { + case P_TYPE: + PRINT0("TYPE: %.*s\n",(int)(src-par),par); + if ( src - par != 2 ) + return false; + if (!strncasecmp(par,"bt",2)) + is_arena = true; + else if (strncasecmp(par,"vs",2)) + return false; + break; + + case P_FLAGS: + PRINT0("FLAGS: %.*s\n",(int)(src-par),par); + StringCopySM(buf,sizeof(buf),par,src-par); + is_d = strchr(buf,'d') != 0; + break; + + case P_SHA1: + PRINT0("SHA1: %.*s\n",(int)(src-par),par); + valid_sha1 = IsSSChecksum(&bin,par,src-par); + break; + + case P_TSLOT: + PRINT0("TSLOT: %.*s\n",(int)(src-par),par); + { + char *scan_end; + tslot = str2ul(par,&scan_end,10); + if ( tslot > MKW_MAX_TRACK_SLOT || scan_end != src ) + return false; + } + break; + + case P_CUP: + PRINT0("CUP: %.*s\n",(int)(src-par),par); + { + if ( *par == 'a' || *par == 'A' ) + par++; + if ( par < src ) + { + ccp pt = strchr(par,'.'); + if ( pt && pt < src ) + cup = str2ul(par,0,10) * 10 + str2ul(pt+1,0,10); + } + } + break; + + case P_NAME: + src = end-1; + while ( src >= par && (uchar)*src <= ' ' ) + src--; + src++; + PRINT0("XNAME: %.*s\n",(int)(src-par),par); + StringCopySM(buf,sizeof(buf),par,src-par); + break; + } + } + + if (!valid_sha1) + return false; + + sha1_hex_t hex; + Sha1Bin2Hex(hex,bin.hash); + PRINT0(">>> arena=%d, d=%d, tslot=%4d, cup=%2d : %s : |%s|\n", + is_arena, is_d, tslot, cup, hex, buf ); + + le_track_t *lt = DefineTrackLD(ld,tslot,true); + if (!ident_only) + { + lt->track_type = is_arena ? LTTY_ARENA : LTTY_TRACK; + lt->cup_slot = cup; + SetXNameLT(lt,0,buf); + } + SetIdentOptLT(lt,hex,is_d,true,0); + return true; +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// le_distrib_t: scan ledef /////////////// +/////////////////////////////////////////////////////////////////////////////// + +static const KeywordTab_t * scan_cmd +( + ScanInfo_t *si, // valid structure + const KeywordTab_t *commands, // command table + ccp section, // name of section + enumError *max_err // NULL or max_err variable +) +{ + DASSERT(si); + DASSERT(commands); + + char buf[100]; + if (!ScanNameSI(si,buf,sizeof(buf),true,true,0)) + { + if (!si->no_warn) + { + ccp eol = FindNextLineFeedSI(si,true); + ScanFile_t *sf = si->cur_file; + DASSERT(sf); + ERROR0(ERR_WARNING, + "File %s, section [%s], line #%u:\nMissing command: %.*s\n", + sf->name, section, sf->line, + (int)(eol - sf->prev_ptr), sf->prev_ptr ); + } + if ( max_err && *max_err < ERR_WARNING ) + *max_err = ERR_WARNING; + GotoEolSI(si); + return 0; + } + + int abbrev_count; + const KeywordTab_t *cmd = ScanKeyword(&abbrev_count,buf,commands); + if (!cmd) + { + if (!si->no_warn) + { + ScanFile_t *sf = si->cur_file; + ccp msg = GetKeywordError(commands,buf,abbrev_count,0); + ERROR0(ERR_WARNING, + "File %s, section [%s], line #%u:\n%s\n", + sf->name, section, sf->line, msg ); + } + if ( max_err && *max_err < ERR_WARNING ) + *max_err = ERR_WARNING; + GotoEolSI(si); + return 0; + } + + return cmd; +} + +/////////////////////////////////////////////////////////////////////////////// + +static enumError scan_track ( le_track_t *lt, ScanInfo_t *si ) +{ + if ( !lt || !si || !si->ld ) + return ERR_MISSING_PARAM; + le_distrib_t *ld = si->ld; + + memset(lt,0,sizeof(*lt)); + lt->track_status = LTS_EXPORT; + + enumError err; + ScanIndexSI(si,&err,0,0,ld->is_pass2?0:2); + if (err) + return err; + + uint uval; + err = ScanUIntValueSI(si,&uval); + if (err) + return err; + lt->track_type = uval; + + err = ScanUIntValueSI(si,&uval); + if (err) + return err; + lt->property = uval; + + err = ScanUIntValueSI(si,&uval); + if (err) + return err; + lt->music = NormalizeMusicID(uval); + + DEFINE_VAR(var); + err = ScanValueSI(si,&var); + if (!err) + lt->flags = var.mode == VAR_STRING ? ScanLEFT(var.str) : GetIntV(&var); + ResetV(&var); + + PRINT0("TRACK %s: t=%d, p=%d, m=%d, f:%x\n", + last_index_name, lt->track_type, lt->property, lt->music, lt->flags ); + + if ( lt->track_type == LTTY_TRACK ) + { + if (!IsMkwTrack(lt->property)) + { + if (!si->no_warn) + { + ScanFile_t *sf = si->cur_file; + ERROR0(ERR_WARNING, + "File %s, section [TRACK-LIST], line #%u:\n" + "Versus track with invalid property %d.\n", + sf->name, sf->line, lt->property ); + } + return ERR_WARNING; + } + } + else if ( lt->track_type == LTTY_ARENA ) + { + if (!IsMkwArena(lt->property)) + { + if (!si->no_warn) + { + ScanFile_t *sf = si->cur_file; + ERROR0(ERR_WARNING, + "File %s, section [TRACK-LIST], line #%u:\n" + "Battle arena with invalid property %d.\n", + sf->name, sf->line, lt->property ); + } + return ERR_WARNING; + } + } + else + { + if (!si->no_warn) + { + ScanFile_t *sf = si->cur_file; + ERROR0(ERR_WARNING, + "File %s, section [TRACK-LIST], line #%u:\n" + "Invalid track type (not bt, not vs).\n", + sf->name, sf->line ); + } + return ERR_WARNING; + } + + return err; +} + +//----------------------------------------------------------------------------- + +static enumError ScanLeDefTRACKS +( + le_distrib_t *ld, // valid structure + ScanInfo_t *si, // valid structure + int pass // 1|2 +) +{ + if ( !ld || !si ) + return ERR_MISSING_PARAM; + + enum { C_SLOT, C_TRACK, C_IDENT, C_FILE, C_NAME, C_XNAME, + C_LIST, C_STD_ARENAS, C_STD_VERSUS }; + enum { O_STRING = 0x100 }; + + static const KeywordTab_t commands[] = + { + { C_SLOT, "SLOT", 0, 0 }, + { C_TRACK, "TRACK", 0, 0 }, + + { C_IDENT, "IDENT", 0, O_STRING }, + { C_FILE, "FILE", 0, O_STRING }, + { C_NAME, "NAME", 0, O_STRING }, + { C_XNAME, "XNAME", 0, O_STRING }, + + #if LE_STRING_LIST_ENABLED + { C_LIST, "TEMP1", 0, O_STRING|LTT_TEMP1 }, + { C_LIST, "TEMP2", 0, O_STRING|LTT_TEMP2 }, + #endif + + { C_STD_ARENAS, "STANDARD-BATTLE-ARENAS", + "STANDARDBATTLEARENAS", 0 }, + { C_STD_VERSUS, "STANDARD-VERSUS-TRACKS", + "STANDARDVERSUSTRACKS", 0 }, + { C_STD_VERSUS, "STD_VERSUS", 0, 0 }, + + { 0,0,0,0 } + }; + + s_nsec_t total_nsec = -GetTimerNSec(), get_track_nsec = 0; + + enumError max_err = ERR_OK; + int next_slot = -1, count = 0; + DEFINE_VAR(string_par); + le_track_t *current_lt = 0; + le_strpar_t spar = { .opt = ld->spar.opt }; + + for (;;) + { + if (IsSectionOrEotSI(si,true)) + break; + + bool define_set = false; + + #if LE_STRING_SET_ENABLED + char ch = NextCharSI(si,true); + if ( ch == '[' ) + { + ccp eol = GetEolSI(si); + if (eol) + { + ScanFile_t *sf = si->cur_file; + DASSERT(sf); + ccp beg = sf->ptr+1; + ccp ptr = memchr(beg,']',eol-beg); + if ( ptr && ptr < eol ) + { + SetKeyNameLSP(&spar,beg,ptr-beg); + sf->ptr = ptr+1; + PRINT0("[%s] = %.*s\n",buf,(int)(eol-sf->ptr),sf->ptr); + define_set = true; + } + } + } + #endif + + const KeywordTab_t *cmd = 0; + if (!define_set) + { + cmd = scan_cmd(si,commands,"TRACK-LIST",&max_err); + if (!cmd) + continue; + } + + const le_options_t opt = cmd ? cmd->opt : 0; + if ( opt & O_STRING || define_set ) + { + if (!current_lt) + { + if (!si->no_warn) + { + ccp eol = FindNextLineFeedSI(si,true); + ScanFile_t *sf = si->cur_file; + DASSERT(sf); + ERROR0(ERR_WARNING, + "File %s, section [TRACK-LIST], line #%u:\nNo current track: %.*s\n", + sf->name, sf->line, + (int)(eol - sf->prev_ptr), sf->prev_ptr ); + } + if ( max_err < ERR_WARNING ) + max_err = ERR_WARNING; + GotoEolSI(si); + continue; + } + + enumError err = ScanStringSI(si,&string_par); + if ( max_err < err ) + max_err = err; + + #if LE_STRING_SET_ENABLED + if (define_set) + { + SetSetLT(current_lt,&spar,string_par.str); + continue; + } + #endif + } + + ASSERT(cmd); + switch(cmd->id) + { + case C_SLOT: + ScanIntValueSI(si,&next_slot); + PRINT0("NEXT-SLOT: %d\n",next_slot); + CheckEolSI(si); + continue; // skip 'next_slot=-1' + + case C_TRACK: + { + current_lt = 0; + le_track_t temp; + if (!scan_track(&temp,si)) + { + count++; + + get_track_nsec -= GetTimerNSec(); + le_track_t *lt + = next_slot >= 0 + ? DefineTrackLD(ld,next_slot,true) // SLOT has highest priority + : IsRandomLETF(temp.flags) + ? DefineGroupTrackLD(ld,temp.track_type,true) // append random tracks always + : DefineFreeTrackLD(ld,temp.track_type,true); // fallback: search a free slot + get_track_nsec += GetTimerNSec(); + + if (lt) + { + temp.track_slot = lt->track_slot; + MoveLT(lt,&temp); + if (*last_index_name) + { + #if LE_TYPE_MARKERS_ENABLED + uint val = lt->track_slot; + if ( lt->track_type & LTTY_ARENA ) + val |= LTT_MARKER_ARENA; + if ( lt->track_type & LTTY_TRACK ) + val |= LTT_MARKER_TRACK; + DefineIntVar(&si->gvar,last_index_name,val); + #else + DefineIntVar(&si->gvar,last_index_name,lt->track_slot); + #endif + } + current_lt = lt; + } + } + ClearLT(&temp,0); + } + break; + + case C_IDENT: + SetIdentOptLT(current_lt,string_par.str,false,true,ld->spar.opt); + break; + + case C_FILE: + SetFileLT(current_lt,&spar,string_par.str); + break; + + case C_NAME: + SetNameLT(current_lt,&spar,string_par.str); + break; + + case C_XNAME: + SetXNameLT(current_lt,&spar,string_par.str); + break; + + #if LE_STRING_LIST_ENABLED + case C_LIST: + SetListLT(current_lt,&spar,string_par.str); + break; + #endif // LE_STRING_LIST_ENABLED + + case C_STD_ARENAS: + for ( int slot = MKW_ARENA_BEG; slot < MKW_ARENA_END; slot++ ) + SetupStandardArenaLT(DefineFreeTrackLD(ld,LTTY_ARENA,true),slot); + current_lt = 0; + break; + + case C_STD_VERSUS: + for ( int slot = MKW_TRACK_BEG; slot < MKW_TRACK_END; slot++ ) + SetupStandardTrackLT(DefineFreeTrackLD(ld,LTTY_TRACK,true),slot); + current_lt = 0; + break; + } + CheckEolSI(si); + next_slot = -1; + } + + ResetV(&string_par); + + if ( log_timing >= 1 ) + { + total_nsec += GetTimerNSec(); + fprintf(stdlog, + "%sLE-DEF: %d tracks scanned in %s," + " of which %s are searching free slots.\n", + verbose >= 1 ? " > " : "", + count, + PrintTimerNSec6(0,0,total_nsec,0), + PrintTimerNSec6(0,0,get_track_nsec,0) ); + } + + return max_err; +} + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +static void add_reflist_to_cup + ( le_distrib_t *ld, const le_cup_ref_t *slot_list, int n_slots ) +{ + if ( !ld || !slot_list || n_slots < 1 ) + return; + + while ( n_slots-- > 0 ) + { + #if LE_TYPE_MARKERS_ENABLED + le_cup_ref_t val = *slot_list++; + le_cup_ref_t slot = val & ~LTT_MARKER__ALL; + PRINT0("APPEND %d (val:%x)%s\n",slot,val,IsValidLecodeSlot(slot)?"":" INVALID!"); + #else + le_cup_ref_t slot = *slot_list++; + PRINT0("APPEND %d %s\n",slot,IsValidLecodeSlot(slot)?"":" INVALID!"); + #endif + if (!IsValidLecodeSlot(slot)) + continue; + + le_track_t *lt = GetTrackLD(ld,slot); + if ( !IsVisibleLT(lt) ) + { + #if LE_TYPE_MARKERS_ENABLED + if ( val & LTT_MARKER_TRACK ) + AppendLECUP(&ld->cup_versus,slot); + + if ( val & LTT_MARKER_ARENA ) + AppendLECUP(&ld->cup_battle,slot); + #endif + continue; + } + + if ( lt->track_type & LTTY_TRACK ) + { + lt->user_flags |= LTTY_TRACK; + AppendLECUP(&ld->cup_versus,slot); + } + + if ( lt->track_type & LTTY_ARENA ) + { + lt->user_flags |= LTTY_ARENA; + AppendLECUP(&ld->cup_battle,slot); + } + } +} + +//----------------------------------------------------------------------------- + +static void append_to_cup ( ScanInfo_t *si ) +{ + if ( !si || !si->ld ) + return; + + for(;;) + { + char ch = NextCharSI(si,false); + if (!ch) + break; + + int val; + const enumError err = ScanIntValueSI(si,&val); + if (err) + return; + + le_cup_ref_t ref = val; + add_reflist_to_cup(si->ld,&ref,1); + SkipCharSI(si,','); + } +} + +//----------------------------------------------------------------------------- + +static void close_cup ( ScanInfo_t *si ) +{ + if ( !si || !si->ld ) + return; + + for(;;) + { + char ch = NextCharSI(si,false); + if (!ch) + break; + + int val; + const enumError err = ScanIntValueSI(si,&val); + if (err) + return; + + if ( val == LTTY_ARENA ) + CloseLECUP(&si->ld->cup_battle); + else if ( val == LTTY_TRACK ) + CloseLECUP(&si->ld->cup_versus); + SkipCharSI(si,','); + } +} + +//----------------------------------------------------------------------------- + +static enumError ScanLeDefCUPS +( + le_distrib_t *ld, // valid structure + ScanInfo_t *si, // valid structure + int pass // 1|2 +) +{ + if ( !ld || !si ) + return ERR_MISSING_PARAM; + + enum { C_APPEND, C_NEW_CUP, C_STD_CUPS, C_MKWFUN, C_UNUSED }; + enum { O_BOOL_VAL = 1, O_BT = 2, O_VS = 4 }; + static const KeywordTab_t commands[] = + { + { C_APPEND, "APPEND", 0, 0 }, + { C_NEW_CUP, "NEW-CUP", "NEWCUP", 0 }, + + { C_STD_CUPS, "STANDARD-BATTLE-CUPS", "STANDARDBATTLECUPS", O_BT }, + { C_STD_CUPS, "STANDARD-VERSUS-CUPS", "STANDARDVERSUSCUPS", O_VS }, + { C_STD_CUPS, "STANDARD-CUPS", "STANDARDCUPS", O_BT|O_VS }, + + { C_MKWFUN, "MKWFUN-RANDOM-CUP", "MKWFUNRANDOMCUP", 0 }, + + { C_UNUSED, "ADD-UNUSED-ARENAS", "ADDUNUSEDARENAS", O_BOOL_VAL|O_BT }, + { C_UNUSED, "ADD-UNUSED-TRACKS", "ADDUNUSEDTRACKS", O_BOOL_VAL|O_VS }, + { C_UNUSED, "ADD-UNUSED", "ADDUNUSED", O_BOOL_VAL|O_BT|O_VS }, + + { 0,0,0,0 } + }; + + enumError max_err = ERR_OK; + bool bool_val = false; + + for (;;) + { + char ch = NextCharSI(si,true); + if ( !ch || ch == '[' ) + break; + + const KeywordTab_t *cmd = scan_cmd(si,commands,"TRACK-LIST",&max_err); + if (!cmd) + continue; + + if ( cmd->opt & O_BOOL_VAL ) + { + SkipCharSI(si,'='); + int val; + const enumError err = ScanIntValueSI(si,&val); + if (!err) + bool_val = val > 0; + else if ( max_err < err ) + max_err = err; + } + + switch(cmd->id) + { + case C_APPEND: + append_to_cup(si); + break; + + case C_NEW_CUP: + close_cup(si); + break; + + case C_STD_CUPS: + if (cmd->opt&O_BT) + add_reflist_to_cup(ld,standard_bt_ref,MKW_N_ARENAS); + if (cmd->opt&O_VS) + add_reflist_to_cup(ld,standard_vs_ref,MKW_N_TRACKS); + break; + + case C_MKWFUN: + for ( int slot = MKW_LE_RANDOM_BEG; slot <= MKW_LE_RANDOM_END; slot++ ) + DefineTrackLD(ld,slot,true); + add_reflist_to_cup(ld,mkwfun_random_ref,MKW_N_LE_RANDOM); + break; + + case C_UNUSED: + if (cmd->opt&O_BT) + ld->scan.bt.add_unused = bool_val; + if (cmd->opt&O_VS) + ld->scan.vs.add_unused = bool_val; + break; + } + CheckEolSI(si); + } + + return max_err; +} + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +enumError ScanLeDefLD +( + le_distrib_t *ld, // valid structure + bool init_ld, // TRUE: initialze 'ld' + const void * data, // data to scan + uint data_size, // size of 'data' + ccp fname, // NULL or filename for error messages + CopyMode_t cm_fname // copy mode of 'fname' +) +{ + ScanText_t st; + SetupScanText(&st,data,data_size); + SetFilenameScanText(&st,fname,cm_fname); + const enumError err = ScanLeDefSTLD(ld,init_ld,&st); + ResetScanText(&st); + return err; +} + +/////////////////////////////////////////////////////////////////////////////// + +enumError ScanLeDefSTLD +( + le_distrib_t *ld, // valid structure + bool init_ld, // TRUE: initialze 'ld' + ScanText_t *st // initialized source +) +{ + enum { SECT_TOOL, SECT_TRACKS, SECT_CUPS, SECT_END }; + static const KeywordTab_t sections[] = + { + { SECT_TOOL, "TOOL", 0, 1 }, + { SECT_TRACKS, "TRACK-LIST", "TRACKLIST", 1 }, + { SECT_CUPS, "CUP-LIST", "CUPLIST", 2 }, + { SECT_END, "END", 0, 0 }, + { 0,0,0,0 } + }; + + if ( !ld || !st ) + return ERR_MISSING_PARAM; + + if ( init_ld || !ld->is_initialized ) + InitializeLD(ld); + + if (!ld->second_ledef) + { + ld->second_ledef = true; + ResetTracksAndCupsLD(ld); + memset(&ld->scan,0,sizeof(ld->scan)); + ld->scan.valid = true; + ld->scan.bt.add_unused = true; + ld->scan.vs.add_unused = true; + ClearUserFlagsAndCupsLD(ld); + } + + ScanInfo_t si; + InitializeSI(&si,st->data,st->data_size,st->fname,0); + si.predef = SetupVarsLECODE(); + si.ld = ld; + + enumError max_err = ERR_OK; + for ( int pass = 1; pass <= 2; pass++ ) + { + if ( pass > 1 ) + RestartSI(&si); + + PRINT("----- pass %u\n",pass); + max_err = ERR_OK; + ld->is_pass2 = pass == 2; + si.no_warn = pass == 1; + si.total_err = 0; + DefineIntVar(&si.gvar, "$PASS", pass ); + + for(;;) + { + char ch = NextCharSI(&si,true); + if (!ch) + break; + + if ( ch != '[' ) + { + NextLineSI(&si,true,false); + continue; + } + ResetLocalVarsSI(&si,0); + + si.cur_file->ptr++; + char name[40]; + ScanNameSI(&si,name,sizeof(name),true,true,0); + PRINT0("--> pass=%u: #%04u: %s\n",pass,si.cur_file->line,name); + + int abbrev_count; + const KeywordTab_t *cmd = ScanKeyword(&abbrev_count,name,sections); + if ( !cmd || abbrev_count ) + continue; + NextLineSI(&si,false,false); + PRINT0("Path %d, section %s\n",pass,cmd->name1); + PRINT0("--> %-6s #%-4u |%.3s|\n",cmd->name1,si.cur_file->line,si.cur_file->ptr); + + // check pass + if ( cmd->opt == pass ) + si.no_warn = false; + else if ( cmd->opt ) + continue; // wrong pass + else + si.no_warn = pass == 1; + + enumError err = ERR_OK; + switch (cmd->id) + { + case SECT_TRACKS: err = ScanLeDefTRACKS(ld,&si,pass); break; + case SECT_CUPS: err = ScanLeDefCUPS(ld,&si,pass); break; + + default: + // ignore all other sections without any warnings + break; + } + + if ( max_err < err ) + max_err = err; + } + #if HAVE_PRINT0 + if ( logging >= 1 ) + { + printf("VAR DUMP/GLOBAL PASS %u:\n",pass); + DumpVarMap(stdout,3,&si.gvar,false); + } + #endif + } + + + //--- terminate + + + CheckLevelSI(&si); + if ( max_err < ERR_WARNING && si.total_err ) + max_err = ERR_WARNING; + PRINT("ERR(ScanTextKMP) = %u (errcount=%u)\n", max_err, si.total_err ); + ResetSI(&si); + return max_err; +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// le_distrib_t: cup helpers /////////////// +/////////////////////////////////////////////////////////////////////////////// + +void DirtyCupLD ( le_distrib_t *ld, le_track_type_t ltty ) +{ + if (ld) + { + if ( ltty & LTTY_ARENA ) + ld->cup_battle.dirty = true; + if ( ltty & LTTY_TRACK ) + ld->cup_versus.dirty = true; + } +} + +/////////////////////////////////////////////////////////////////////////////// + +le_track_t * FindFillTrackLD ( le_distrib_t *ld, le_cup_t *lc, bool allow_candidate ) +{ + if ( !ld || !lc ) + return 0; + + le_track_type_t ltty = GetLttyLECUP(lc); + + le_track_t *fill = GetTrackLD(ld,lc->fill_slot); + if ( !fill || fill->track_status != LTS_FILL || !(fill->track_type<ty) ) + { + fill = 0; + le_track_t *lt = ld->tlist; + for ( int slot = 0; slot < ld->tlist_used ; slot++, lt++ ) + if ( lt->track_status >= LTS_FILL && lt->track_type & ltty ) + { + if ( lt->track_status == LTS_FILL ) + { + // we have already a fill track + fill = lt; + lc->fill_slot = fill->track_slot; + break; + } + if ( allow_candidate && !fill ) + fill = lt; + } + } + return fill; +} + +/////////////////////////////////////////////////////////////////////////////// + +bool PrintCupRefLD ( FILE *f, le_distrib_t *ld, le_cup_t *lc ) +{ + if ( !f || !lc || !lc->used ) + return false; + + le_track_t *fill = FindFillTrackLD(ld,lc,true); + const int fill_slot = fill ? fill->track_slot : -999; + ccp type = lc->tracks == BMG_BCUP_TRACKS ? "BT" : "VS"; + + #if 1 + le_cup_ref_t *cup = lc->list; + for ( int i = 0; i< lc->used; i++ ) + { + fprintf(f,"%s|%u|",type,i); + for ( int nt = lc->tracks; nt > 0; nt--, cup++ ) + fprintf(f,"%d|", *cup == fill_slot ? -1 : *cup ); + fputs("\r\n",f); + } + return true; + #else + if ( lc->tracks == BMG_BCUP_TRACKS ) + { + le_cup_ref_t *cup = lc->list; + for ( int i = 0; i< lc->used; i++, cup += BMG_BCUP_TRACKS ) + fprintf(f,"bt|%u|%d|%d|%d|%d|%d|\r\n", + i, cup[0], cup[1], cup[2], cup[3], cup[4] ); + return true; + } + + if ( lc->tracks == BMG_RCUP_TRACKS ) + { + le_cup_ref_t *cup = lc->list; + for ( int i = 0; i< lc->used; i++, cup += BMG_RCUP_TRACKS ) + fprintf(f,"vs|%u|%d|%d|%d|%d|\r\n", + i, cup[0], cup[1], cup[2], cup[3] ); + return true; + } + ASSERT(0); + return false; + #endif +} + +/////////////////////////////////////////////////////////////////////////////// + +void update_cup_helper +( + le_distrib_t *ld, // valid distrib + le_cup_t *lc, // cup to update + le_track_type_t ltty, // LTTY_ARENA | LTTY_TRACK + le_cup_ref_t p_fallback, // fall back if no track is found + bool add_missed // true: add missed files (user_flag==0) +) +{ + DASSERT(ld); + DASSERT(lc); + PRINT("update_cup_helper(%d,fb=%d,add=%d) #%u: used=%d, dirty=%d\n", + lc->tracks, p_fallback, add_missed, + __LINE__, lc->used, lc->dirty ); + + + //--- remove invalid cup references & mark used + + le_cup_ref_t *end = lc->list + lc->used * lc->tracks; + for ( le_cup_ref_t *ptr = lc->list; ptr < end; ptr++ ) + { + if ( *ptr >= 0 ) + { + le_track_t *lt = GetTrackLD(ld,*ptr); + if ( IsVisibleLT(lt) && lt->track_type & ltty ) + lt->user_flags |= ltty; + else + *ptr = -1; + } + } + + + //--- append not used tracks + + if (add_missed) + { + le_track_t *lt = ld->tlist; + for ( int slot = 0; slot < ld->tlist_used; slot++, lt++ ) + if ( IsVisibleLT(lt) && lt->track_type & ltty && !(lt->user_flags<ty) ) + AppendLECUP(lc,slot); + } + + + //--- pack, even num of cups + + if (!lc->close_used) + PackLECUP(lc); + EvenLECUP(lc); + + + //--- fill cups + + if (HaveInvalidLECUP(lc)) + { + le_strpar_t spar = { .opt = LEO__DEFAULT|LEO_IN_ALL }; + le_track_t *fill = FindFillTrackLD(ld,lc,true); + + if (!fill) + { + fill = DefineFreeTrackLD(ld,ltty,true); + SetupStandardTrackLT(fill,p_fallback); + fill->track_status = LTS_FILL; + lc->fill_slot = fill->track_slot; + lc->fill_src = -1; + } + else if ( fill->track_status != LTS_FILL ) + { + le_track_t *next = DefineTrackLD(ld,ld->tlist_used,true); + if (next) + { + next->track_status = LTS_FILL; + next->property = fill->property; + next->music = fill->music; + lc->fill_slot = next->track_slot; + lc->fill_src = fill->track_slot; + + SetFileLT(next,&spar,GetFileLT(fill,0)); + SetIdentOptLT(next,GetIdentLT(fill,false,true,0),false,false,LEO_IN_ALL); + SetIdentOptLT(next,GetIdentLT(fill,true, true,0),true, false,LEO_IN_ALL); + fill = next; + } + } + + if (fill) + { + if ( fill->track_status == LTS_FILL ) + { + fill->flags = 0; + fill->track_type = ltty; + SetNameLT(fill,&spar,"-"); + } + + FillLECUP(lc,fill->track_slot); + } + } + + + //--- assign cup_slot's + + if ( lc->tracks == 4 ) + DumpCupSlots(ld,"before assign"); + + end = lc->list + lc->used * lc->tracks; + for ( le_cup_ref_t *ptr = lc->list; ptr < end; ptr++ ) + { + if ( *ptr >= 0 ) + { + le_track_t *lt = GetTrackLD(ld,*ptr); + if ( lt && !lt->cup_slot && lt->track_type & ltty ) + { + lt->cup_slot = GetCupSlotLECUP(lc,ptr); + if ( lt->flags & LETF_RND_HEAD ) + { + for ( int hslot = lt->track_slot+1; hslot < ld->tlist_used; hslot++ ) + { + le_track_t *hlt = GetTrackLD(ld,hslot); + if ( IsActiveLT(hlt) && IsHiddenLETF(hlt->flags) ) + hlt->cup_slot = lt->cup_slot; + else + break; + } + } + } + } + } + + if ( lc->tracks == 4 ) + DumpCupSlots(ld,"behind assign"); + + //--- terminate + + lc->dirty = false; + PRINT("update_cup_helper(%d) #%u: used=%d, dirty=%d\n",lc->tracks,__LINE__,lc->used,lc->dirty); +} + +//----------------------------------------------------------------------------- + +void UpdateCupsLD ( le_distrib_t *ld ) +{ + if (!ld) + return; + + CloseArchLD(ld); + if ( ld->cup_battle.used && !ld->cup_battle.dirty && ld->cup_versus.used && !ld->cup_versus.dirty ) + return; + + PRINT0("UpdateCupsLD() N=%d,%d, dirty=%d,%d\n", + ld->cup_battle.used, ld->cup_versus.used, + ld->cup_battle.dirty, ld->cup_versus.dirty ); + s_nsec_t dur_nsec = -GetTimerNSec(); + + + //--- clear user flags + + CheckTracksLD(ld); + ClearUserFlagsAndCupsLD(ld); + + + //--- battle cups + + if (!ld->cup_battle.used) + add_reflist_to_cup(ld,standard_bt_ref,MKW_N_ARENAS); + + update_cup_helper( ld, &ld->cup_battle, LTTY_ARENA,MKW_ARENA_BEG, + !ld->scan.valid || ld->scan.bt.add_unused ); + + + //--- versus cups + + if (!ld->cup_versus.used) + add_reflist_to_cup(ld,standard_vs_ref,MKW_N_TRACKS); + + update_cup_helper( ld, &ld->cup_versus, LTTY_TRACK,MKW_TRACK_BEG, + !ld->scan.valid || ld->scan.vs.add_unused ); + + + //--- terminate + + if ( log_timing >= 1 ) + { + dur_nsec += GetTimerNSec(); + fprintf(stdlog,"%sUpdateCupsLD() N=%d,%d, done in %s\n", + verbose >= 1 ? " > " : "", + ld->cup_battle.used, ld->cup_versus.used, + PrintTimerNSec6(0,0,dur_nsec,0) ); + } +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// le_distrib_t: manage archive /////////////// +/////////////////////////////////////////////////////////////////////////////// +// [[track-arch]] + +void ResetLTA ( le_track_arch_t *ta, bool reset_lt ) +{ + if (ta) + { + if (reset_lt) + ResetLT(&ta->lt); + FreeString(ta->name_order); + FreeString(ta->version); + memset(ta,0,sizeof(*ta)); + } +} + +/////////////////////////////////////////////////////////////////////////////// + +void ResetArchLD ( le_distrib_t *ld ) +{ + if (ld) + { + le_track_arch_t *ta = ld->arch; + le_track_arch_t *end = ta + ld->arch_used; + for ( ; ta < end; ta++ ) + ResetLTA(ta,true); + ld->arch = 0; + ld->arch_used = 0; + ld->arch_size = 0; + + exmem_key_t *ek = ld->group.list; + exmem_key_t *gend = ek + ld->group.used; + for ( ; ek < gend; ek++ ) + { + le_group_info_t *gi = (le_group_info_t*)ek->data.data.ptr; + FREE(gi->list); + } + ResetEML(&ld->group); + } +} + +/////////////////////////////////////////////////////////////////////////////// + +static void AddToGroup ( le_distrib_t *ld, le_track_arch_t *ta, mem_t grp ) +{ + if ( !ld || !ta || !grp.len ) + return; + + mem_t pre = { .ptr = ta->lt.track_type == LTTY_ARENA ? "A" : "T", .len = 1 }; + mem_t key = MemCat2A(pre,grp); + PRINT0("+GRP[%.*s] += %d\n",key.len,key.ptr,ta->lt.track_slot); + + exmem_key_t *ek = FindInsertEML(&ld->group,key.ptr,CPM_MOVE,0); + if (!ek->data.data.ptr) + { + ek->data.data.ptr = CALLOC(1,sizeof(le_group_info_t)); + ek->data.data.len = sizeof(le_group_info_t); + ek->data.is_alloced = true; + le_group_info_t *gi = (le_group_info_t*)ek->data.data.ptr; + gi->group = ld->group.used; + } + + le_group_info_t *gi = (le_group_info_t*)ek->data.data.ptr; + ta->group = gi->group; + + #if 0 + char xbuf[30]; + snprintf(xbuf,sizeof(xbuf),"%d %s",ta->group,ek->key); + SetByKeyLT(&ta->lt,"grp",xbuf); + #endif + + + //-- append index to list; + + if ( ta->lt.flags & LETF_RND_HEAD && !gi->n_head++ ) + gi->head1 = ta->lt.track_slot; + if ( ta->lt.flags & LETF_RND_GROUP ) + gi->n_group++; + + if ( gi->used >= gi->size ) + { + gi->size = gi->used + 10; + gi->list = REALLOC( gi->list, gi->size * sizeof(*gi->list) ); + } + ASSERT( gi->used < gi->size ); + gi->list[gi->used++] = ta->lt.track_slot; +} + +/////////////////////////////////////////////////////////////////////////////// + +le_track_arch_t * GetNextArchLD ( le_distrib_t *ld ) +{ + if (!ld) + return 0; + + if ( ld->arch_used >= ld->arch_size ) + { + static const int tab[] = { 100, 200, 500, 100, 2000, LE_MAX_TRACKS, 0 }; + uint need = ld->arch_used + 1; + for ( const int *ptr = tab; *ptr; ptr++ ) + if ( need <= *ptr ) + { + need = *ptr; + break; + } + + ld->arch = REALLOC( ld->arch, need * sizeof(*ld->arch) ); + memset( ld->arch + ld->arch_size, 0, ( need - ld->arch_size ) * sizeof(*ld->arch) ); + ld->arch_size = need; + } + + DASSERT( ld->arch_used < ld->tlist_size ); + + le_track_arch_t *ta = ld->arch + ld->arch_used; + memset(ta,0,sizeof(*ta)); + InitializeLT(&ta->lt); + + ta->lt.track_slot = ld->arch_used++; // index of 'arch' + ta->lt.track_status = LTS_EXPORT; + ta->attr_order = 1000; + ta->plus_order = 10000000; + ta->game_order = 10000000; + return ta; +} + +/////////////////////////////////////////////////////////////////////////////// + +enumError AddToArchLD ( le_distrib_t *ld, raw_data_t *raw ) +{ + if ( !ld || !raw ) + return ERR_MISSING_PARAM; + + char buf[LE_TRACK_STRING_MAX+1]; + exmem_dest_t exdest = { .buf = buf, .buf_size = sizeof(buf), .try_circ = true }; + + szs_file_t szs; + AssignSZS(&szs,true,raw->data,raw->data_size,false,raw->fform,raw->fname); + + analyse_szs_t as; + AnalyseSZS(&as,true,&szs,raw->fname); + PRINT0("SHA1: %s, slots: r=%d a=%d m=%d\n", + as.sha1_szs, + as.slotinfo.race_slot, as.slotinfo.arena_slot, as.slotinfo.music_index ); + + split_filename_t spf; + AnalyseSPF(&spf,true,raw->fname,0,CPM_LINK,opt_plus); + + enumError err = ERR_WARNING; + if ( as.valid_track && !spf.f_d.len ) + { + ccp slash = strrchr(raw->fname,'/'); + if (slash) + ScanOptTrackSource(raw->fname,slash-raw->fname,opt_szs_mode); + else + ScanOptTrackSource(".",1,opt_szs_mode); + + err = ERR_OK; + le_track_arch_t *ta = GetNextArchLD(ld); + + if (szs.is_arena) + { + ta->lt.track_type = LTTY_ARENA; + ta->lt.property = MKW_ARENA_BEG; + + if (as.slotinfo.arena_slot) + { + int slot = as.slotinfo.arena_slot - 11; + slot = slot/10*5 + slot%10; + if ( (uint)slot < MKW_N_ARENAS ) + ta->lt.property = arena_pos_default[slot] + MKW_ARENA_BEG; + } + } + else + { + ta->lt.track_type = LTTY_TRACK; + ta->lt.property = MKW_TRACK_BEG; + + if (as.slotinfo.race_slot) + { + int slot = as.slotinfo.race_slot - 11; + slot = slot/10*4 + slot%10; + if ( (uint)slot < MKW_N_TRACKS ) + ta->lt.property = track_pos_default[slot]; + } + } + ta->lt.music = as.slotinfo.music_index + ? as.slotinfo.music_index + : NormalizeMusicID(ta->lt.property); + + if (spf.plus.len) + ta->lt.flags |= LETF_NEW; + + + //-- setup basic strings + + mem_t space = { .ptr = " ", .len = 1 }; + le_strpar_t spar = { .opt = LEO__DEFAULT | LEO_IN_ALL | LEO_OUT_ALL }; + + SetIdentLT(&ta->lt,&spar,as.sha1_szs); + + StringCopySM(buf,sizeof(buf),spf.f_name.ptr,spf.f_name.len); + SetFileLT(&ta->lt,&spar,buf); + + #if SUPPORT_SPLIT_SIGN + mem_t list[] = { spf.sign, spf.boost, spf.game, spf.name, spf.extra }; + #else + mem_t list[] = { spf.boost, spf.game, spf.name, spf.extra }; + #endif + mem_src_t msrc = { .src = list, .n_src = sizeof(list)/sizeof(*list) }; + exmem_t exsum = ExMemCat(&exdest,space,&msrc); + SetNameLT(&ta->lt,&spar,exsum.data.ptr); + FreeExMem(&exsum); + + StringCopySM(buf,sizeof(buf),spf.norm.ptr,spf.norm.len); + SetXNameLT(&ta->lt,&spar,buf); + + //-- setup arch extensions + + mem_t sum = MemCatSep3A(space,spf.name,spf.version,spf.extra); + ta->name_order = sum.ptr; + ta->version = MEMDUP(spf.version.ptr,spf.version.len); + + //-- setup order & group + + mem_t grp = {0}; + mem_t attr_list[100+1]; + const int n = SplitByCharMem(attr_list,100,spf.attribs,','); + for ( int i = 0; i < n; i++ ) + { + mem_t attr = attr_list[i]; + if ( !attr.ptr || !attr.len ) + continue; + + if (!memcmp(attr.ptr,"head=",5)) + { + ta->lt.flags |= LETF_RND_HEAD; + grp = MidMem(attr,5,attr.len); + } + else if (!memcmp(attr.ptr,"grp=",4)) + { + ta->lt.flags |= LETF_RND_GROUP; + if (!grp.len) + grp = MidMem(attr,4,attr.len); + } + else if ( grp.len && !StrCmpMem(attr,"grp") ) + { + ta->lt.flags |= LETF_RND_GROUP; + } + else if ( !StrCmpMem(attr,"new") ) + ta->lt.flags |= LETF_NEW; + else if (!memcmp(attr.ptr,"order=",6)) + ta->attr_order = str2l(attr.ptr+6,0,10); + } + + if (grp.len) + AddToGroup(ld,ta,grp); + + //--- plus_order, game_order + + ta->plus_order = spf.plus_order; + ta->game_order = spf.game_order; +// ta->game_color = spf.game_color; + + + //-- clean + + PRINT0("order=%d,%d,%d, grp=%d \"%.*s\"\n", + ta->attr_order, ta->plus_order, ta->game_order, + ta->group, grp.len, grp.ptr ); + } + + //-- clean & return + + ResetSPF(&spf); + ResetAnalyseSZS(&as); + ResetSZS(&szs); + return err; +} + +/////////////////////////////////////////////////////////////////////////////// + +static int cmp_order ( const le_track_arch_t **pa, const le_track_arch_t **pb ) +{ + const le_track_arch_t *a = *pa; + const le_track_arch_t *b = *pb; + ASSERT(a&&b); + + int res = ( a->lt.track_type & LTTY_TRACK ) - ( b->lt.track_type & LTTY_TRACK ); + if (!res) + { + res = a->attr_order - b->attr_order; + if (!res) + { + res = a->plus_order - b->plus_order; + if (!res) + { + res = strcasecmp(a->name_order,b->name_order); + if (!res) + { + res = a->game_order - b->game_order; + if (!res) + res = (int)a->lt.track_slot - (int)b->lt.track_slot; + } + } + } + } + return res; +} + +//----------------------------------------------------------------------------- + +bool CloseArchLD ( le_distrib_t *ld ) +{ + if ( !ld || !ld->arch ) + return false; + + //-- manage groups + + exmem_key_t *ek = ld->group.list; + exmem_key_t *gend = ek + ld->group.used; + for ( ; ek < gend; ek++ ) + { + le_group_info_t *gi = (le_group_info_t*)ek->data.data.ptr; + const bool clear_group = !gi->n_group || gi->n_group == 1 && !gi->n_head; + + if ( !clear_group && !gi->n_head && gi->used ) + { + // first member becomes head + gi->n_head++; + gi->head1 = *gi->list; + } + + for ( int i = 0; i < gi->used; i++ ) + { + int index = gi->list[i]; + PRINT0("A: %zd/%d : %d/%d/%d : %d/%d/%d\n", + ek-ld->group.list, ld->group.used, + i, gi->used, gi->size, + index, ld->arch_used, ld->arch_size ); + ASSERT( index < ld->arch_used ); + + le_track_arch_t *ta = ld->arch + index; + if (clear_group) + { + if ( ta->lt.flags & LETF_RND_GROUP ) + { + ta->lt.flags &= ~LETF__RND; + ta->group = 0; + } + else + ta->lt.track_status = LTS_VALID; // deactivate track + } + else if ( index == gi->head1 ) + ta->lt.flags |= LETF_RND_HEAD; + else if ( ta->lt.flags & LETF_RND_GROUP ) + ta->lt.flags &= ~LETF_RND_HEAD; + else + ta->lt.track_status = LTS_VALID; // deactivate track + } + } + + + //--- [[2do]] order + + le_track_arch_t **order = MALLOC( (ld->arch_used+1) * sizeof(*order) ); + le_track_arch_t **ptr = order; + + le_track_arch_t *ta = ld->arch; + le_track_arch_t *end = ta + ld->arch_used; + for ( ; ta < end; ta++ ) + if ( ta->lt.track_status >= LTS_EXPORT && !IsHiddenLETF(ta->lt.flags) ) + *ptr++ = ta; + *ptr = 0; + + int n_order = ptr - order; + if ( n_order > 1 ) + qsort( order, n_order, sizeof(*order), (qsort_func)cmp_order ); + + + //--- assign tracks + + for ( ptr = order; *ptr; ptr++ ) + { + le_track_arch_t *ta = *ptr; + le_track_t *lt = IsRandomLETF(ta->lt.flags) + ? DefineGroupTrackLD(ld,ta->lt.track_type,true) + : DefineFreeTrackLD(ld,ta->lt.track_type,true); + ta->lt.track_slot = lt->track_slot; + *lt = ta->lt; + + if (ta->group) + { + for ( exmem_key_t *ek = ld->group.list; ek < gend; ek++ ) + { + le_group_info_t *gi = (le_group_info_t*)ek->data.data.ptr; + if ( gi->group == ta->group ) + { + for ( int i = 0; i < gi->used; i++ ) + { + int index = gi->list[i]; + PRINT0("B: %zd/%d : %d/%d/%d : %d/%d/%d\n", + ek-ld->group.list, ld->group.used, + i, gi->used, gi->size, + index, ld->arch_used, ld->arch_size ); + ASSERT( index < ld->arch_used ); + + le_track_arch_t *ta2 = ld->arch + index; + if ( ta2 != ta && IsHiddenLETF(ta2->lt.flags) ) + { + le_track_t *lt2 = DefineFreeTrackLD(ld,0,true); + ta2->lt.track_slot = lt2->track_slot; + *lt2 = ta2->lt; + ResetLTA(ta2,false); + } + } + break; + } + } + } + + ResetLTA(ta,false); + } + + ld->cup_battle.dirty = true; + ld->cup_versus.dirty = true; + + FREE(order); + ResetArchLD(ld); + return true; +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// le_distrib_t: import /////////////// +/////////////////////////////////////////////////////////////////////////////// + +void ImportLD ( le_distrib_t *ld, const le_distrib_t *src ) +{ + // [[2do]] ??? +} + +/////////////////////////////////////////////////////////////////////////////// + +void SetupLparLD ( le_distrib_t *ld, bool load_lpar ) +{ + if ( !ld || ld->lpar ) + return; + + ld->lpar = MALLOC(sizeof(*ld->lpar)); + InitializeLPAR(ld->lpar,load_lpar); + PatchLPAR(ld->lpar); + ld->lpar->limit_mode = LPM_FORCE_AUTOMATIC; +} + +/////////////////////////////////////////////////////////////////////////////// + +void ImportLparLD ( le_distrib_t *ld, const le_lpar_t *lpar ) +{ + if ( !ld || !lpar ) + return; + + SetupLparLD(ld,false); + ASSERT(ld->lpar); + memcpy(ld->lpar,lpar,sizeof(*ld->lpar)); + PatchLPAR(ld->lpar); + ld->lpar->limit_mode = LPM_FORCE_AUTOMATIC; +} + +/////////////////////////////////////////////////////////////////////////////// + +void ImportAnaLD ( le_distrib_t *ld, const le_analyse_t *ana ) +{ + if ( !ld || !ana || !ana->valid ) + return; + + + //--- import lecode binary + lpar + + if ( ld->spar.opt & LEO_IN_LECODE ) + AssignLecodeLD(ld,GetLERegion(ana),ana->data,ana->size); + ImportLparLD(ld,&ana->lpar); + + + //--- import tracks + + DefineTrackLD(ld,ana->n_slot-1,false); // alloc reference list of good size + + for ( int slot = 0; slot < ana->n_slot; slot++ ) + { + if ( slot == MKW_ARENA_END ) + slot = LE_FIRST_CT_SLOT; + + if (!IsLESlotUsed(ana,slot)) + continue; + + le_track_t *lt = DefineTrackLD(ld,slot,true); + if (lt) + { + if (ana->property) lt->property = ana->property[slot]; + if (ana->music) lt->music = ana->music[slot]; + if (ana->flags) lt->flags = ana->flags[slot]; + } + } + + + //--- arena cups and slots + + if ( ana->n_cup_arena && ana->cup_arena ) + { + const uint *ref_src = ana->cup_arena; + for ( int cup_idx = 0; cup_idx < ana->n_cup_arena; cup_idx++ ) + { + le_cup_ref_t *ref_dest = DefineLECUP(&ld->cup_battle,cup_idx); + for ( int i = 0; i < BMG_BCUP_TRACKS; i++ ) + { + int slot = htonl( ana->cup_arena[ BMG_BCUP_TRACKS*cup_idx + i ] ); + le_track_t *lt = DefineTrackLD(ld,slot,false); + if ( lt && IsArenaLTTY(lt->track_type) ) + { + lt->cup_slot = 10*cup_idx + i + 11; + if ( ref_dest && ref_src ) + *ref_dest++ = ntohl(*ref_src++); + } + } + } + } + + + //--- racing cups and slots + + if ( ana->n_cup_track && ana->cup_track ) + { + const uint *ref_src = ana->cup_track; + for ( int cup_idx = 0; cup_idx < ana->n_cup_track; cup_idx++ ) + { + le_cup_ref_t *ref_dest = DefineLECUP(&ld->cup_versus,cup_idx); + for ( int i = 0; i < BMG_RCUP_TRACKS; i++ ) + { + int slot = htonl( ana->cup_track[ BMG_RCUP_TRACKS*cup_idx + i ] ); + le_track_t *lt = DefineTrackLD(ld,slot,false); + if ( lt && !IsArenaLTTY(lt->track_type) ) + { + lt->cup_slot = 10*cup_idx + i + 11; + if ( ref_dest && ref_src ) + *ref_dest++ = ntohl(*ref_src++); + } + } + } + } + + PackTracksLD(ld); +} + +/////////////////////////////////////////////////////////////////////////////// + +void ImportCtcodeLD ( le_distrib_t *ld, const ctcode_t *ctcode ) +{ + if ( !ld || !ctcode ) + return; + + + //--- setup lower slots with defaults + + for ( int slot = 0; slot < MKW_ARENA_END; slot++ ) + { + le_track_t *lt = DefineTrackLD(ld,slot,true); + lt->property = slot; + lt->music = GetMkwMusicSlot(slot); + } + + + //--- copy track properties + + le_strpar_t spar = { .opt = LEO__DEFAULT|LEO_IN_ALL }; + + const ctcode_crs1_data_t *td = ctcode->crs->data; + if (td) + { + const int max = ctcode->n_tracks; + for ( int slot = 0; slot < max; slot++, td++ ) + { + if ( slot == MKW_ARENA_END ) + { + slot = LE_FIRST_CT_SLOT; + td = ctcode->crs->data + slot; + } + + le_track_t *lt = DefineTrackLD(ld,slot,true); + if (lt) + { + if (IsMkwArena(slot)) + { + const u8 prop = ctcode->arena.prop[slot-MKW_ARENA_BEG]; + if (prop) // invalid if 0 + { + lt->property = prop; + lt->music = ctcode->arena.music[slot-MKW_ARENA_BEG]; + } + } + else + { + lt->property = ntohl(td->property_id); + lt->music = ntohl(td->music_id); + lt->flags = ctcode->le_flags[slot]; + } + + char buf[200]; + const int str_idx = ctcode->ctb.track_name1.beg + slot; + const bmg_item_t *bi; + + bi = FindItemBMG(&ctcode->track_ident,str_idx); + if ( bi && bi->text ) + { + PrintString16BMG(buf,sizeof(buf),bi->text,bi->len,BMG_UTF8_MAX,0,1); + SetIdentLT(lt,&spar,buf); + } + + bi = FindItemBMG(&ctcode->track_file,str_idx); + if ( bi && bi->text ) + { + PrintString16BMG(buf,sizeof(buf),bi->text,bi->len,BMG_UTF8_MAX,0,1); + SetFileLT(lt,&spar,buf); + } + + bi = FindItemBMG(&ctcode->track_string,str_idx); + if ( bi && bi->text ) + { + PrintString16BMG(buf,sizeof(buf),bi->text,bi->len,BMG_UTF8_MAX,0,1); + SetNameLT(lt,&spar,buf); + } + + bi = FindItemBMG(&ctcode->track_xstring,str_idx); + if ( bi && bi->text ) + { + PrintString16BMG(buf,sizeof(buf),bi->text,bi->len,BMG_UTF8_MAX,0,1); + SetXNameLT(lt,&spar,buf); + } + } + } + } + + + //--- battle cups and tracks + + const ctcode_cup1_data_t *cup; + cup = ctcode->cup_battle; + if (cup ) + { + uint max = ctcode->n_battle_cups; + if ( max > ld->cup_battle.max ) + max = ld->cup_battle.max; + + for ( int cup_idx = 0; cup_idx < max; cup_idx++, cup++ ) + { + le_cup_ref_t *dest = DefineLECUP(&ld->cup_battle,cup_idx); + for ( int i = 0; i < BMG_BCUP_TRACKS; i++ ) + { + const int slot = ntohl(cup->track_id[i]); + le_track_t *lt = DefineTrackLD(ld,slot,false); + if ( lt && IsArenaLTTY(lt->track_type) ) + { + lt->cup_slot = 10*cup_idx + i + 11; + if (dest) + *dest++ = slot; + } + } + } + } + + + //--- racing cups and tracks + + cup = ctcode->cup_racing; + if (cup) + { + uint max = ctcode->n_racing_cups; + if ( max > ld->cup_versus.max ) + max = ld->cup_versus.max; + + for ( int cup_idx = 0; cup_idx < max; cup_idx++, cup++ ) + { + le_cup_ref_t *dest = DefineLECUP(&ld->cup_versus,cup_idx); + for ( int i = 0; i < BMG_RCUP_TRACKS; i++ ) + { + const int slot = ntohl(cup->track_id[i]); + le_track_t *lt = DefineTrackLD(ld,slot,false); + if ( lt && !IsArenaLTTY(lt->track_type) ) + { + lt->cup_slot = 10*cup_idx + i + 11; + if (dest) + *dest++ = slot; + } + } + } + } +} + +/////////////////////////////////////////////////////////////////////////////// + +void ImportBmgLD ( le_distrib_t *ld, const bmg_t *bmg, const le_strpar_t *par ) +{ + if ( !ld || !bmg ) + return; + + if (!par) + par = &ld->spar; + + char buf[LE_TRACK_STRING_MAX+1]; + for ( int slot = 0; slot < ld->tlist_used; slot++ ) + { + le_track_t *lt = GetTrackLD(ld,slot); + if ( lt && GetBmgBySlotLEO(buf,sizeof(buf),bmg,slot,ld->spar.opt) ) + SetTextLT(lt,par,buf); + } +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// le_distrib_t: import files and options /////////////// +/////////////////////////////////////////////////////////////////////////////// + +enumError ImportRawDataLD +( + le_distrib_t *ld, // destination + raw_data_t *raw // source +) +{ + enumError err = ERR_MISSING_PARAM; + if ( ld && raw ) + { + if (!ld->is_initialized) + InitializeLD(ld); + + if ( logging >= 2 && raw->fname ) + fprintf(stdlog,"Import data to LD: %s\n",raw->fname); + + err = ERR_OK; + switch(raw->fform) + { + case FF_LEDEF: + err = ScanLeDefLD(ld,false,raw->data,raw->data_size,raw->fname,CPM_LINK); + break; + + case FF_LEDIS: + ScanDumpLD(ld,false,raw->data,raw->data_size); + break; + + case FF_LEREF: + ScanRefLD(ld,false,raw->data,raw->data_size); + break; + + case FF_LESTR: + ScanStrLD(ld,false,raw->data,raw->data_size); + break; + + case FF_SHA1REF: + ScanSha1LD(ld,false,raw->data,raw->data_size); + break; + + case FF_LE_BIN: + { + le_analyse_t ana; + err = AnalyseLEBinary(&ana,raw->data,raw->data_size); + if (!err) + ImportAnaLD(ld,&ana); + ResetLEAnalyse(&ana); + } + break; + + case FF_PREFIX: + DefinePrefixTable(raw->data,raw->data_size); + break; + + case FF_LPAR: + { + le_lpar_t lpar; + InitializeLPAR(&lpar,true); + err = ScanTextLPAR(&lpar,false,raw->fname,raw->data,raw->data_size); + if (!err) + ImportLparLD(ld,&lpar); + ResetLPAR(&lpar); + } + break; + + case FF_BMG: + case FF_BMG_TXT: + { + bmg_t bmg; + err = ScanBMG(&bmg,true,raw->fname,raw->data,raw->data_size); + if (!err) + ImportBmgLD(ld,&bmg,&ld->spar); + ResetBMG(&bmg); + } + break; + + case FF_DISTRIB: + err = ImportDistribLD(ld,raw->data,raw->data_size); + break; + + case FF_U8: + err = AddToArchLD(ld,raw); + break; + + case FF_BRRES: + case FF_TEX_CT: + case FF_CT1_DATA: + case FF_CTDEF: + if (!ld->ctcode) + ld->ctcode = MALLOC(sizeof(*ld->ctcode)); + InitializeCTCODE(ld->ctcode,CTM_LECODE2); + err = ScanRawDataCTCODE(ld->ctcode,CTM_NO_INIT,raw,0); + if (!err) + ImportCtcodeLD(ld,ld->ctcode); + ResetCTCODE(ld->ctcode); + break; + + case FF_UNKNOWN: + err = ERROR0(ERR_INVALID_DATA, + "Need LE-CODE compatible file, but have unknown file format: %s\n", + raw->fname); + break; + + default: + err = ERROR0(ERR_INVALID_DATA, + "Need LE-CODE compatible file, but file format is %s: %s", + GetNameFF(raw->fform_file,raw->fform),raw->fname); + } + } + return err; +} + +/////////////////////////////////////////////////////////////////////////////// + +struct search_t +{ + le_distrib_t *ld; + int count; + enumError max_err; +}; + +//----------------------------------------------------------------------------- + +static enumError search_func +( + mem_t path, // full path of existing file, never NULL + uint st_mode, // copy of struct stat.st_mode, see "man 2 stat" + void *param // user defined parameter +) +{ + if (!S_ISREG(st_mode)) + return ERR_JOB_IGNORED; + + struct search_t *s = (struct search_t*)param; + ASSERT(s); + ASSERT(s->ld); + + const enumError err = ImportFileLD(s->ld,path.ptr,false,false); + if ( s->max_err < err ) + s->max_err = err; + s->count++; + return err; +} + +//----------------------------------------------------------------------------- + +enumError ImportFileLD +( + le_distrib_t *ld, // destination + ccp fname, // file name of source + bool use_wildcard, // true & file not exist: search files + bool support_options // support options (leading '+' and no slash ) +) +{ + enumError err = ERR_MISSING_PARAM; + if ( ld && fname ) + { + if (!ld->is_initialized) + InitializeLD(ld); + + if ( support_options && *fname == '+' ) + ld->spar.opt = ScanLEO(ld->spar.opt,fname+1,"Filter option"); + else + { + struct stat st; + if ( use_wildcard && HaveWildcards(MemByString(fname)) && stat(fname,&st) ) + { + struct search_t param = { .ld = ld }; + SearchPaths(fname,0,false,search_func,¶m); + return param.count + ? param.max_err + : ERROR0(ERR_CANT_OPEN,"File not found: %s\n",fname); + } + + raw_data_t raw; + err = LoadRawData(&raw,true,fname,0,opt_ignore>0,0); + if (!err) + err = ImportRawDataLD(ld,&raw); + ResetRawData(&raw); + } + } + return err; +} + +/////////////////////////////////////////////////////////////////////////////// + +void ImportOptionsLD ( le_distrib_t *ld ) +{ + if (ld) + { + if (!ld->is_initialized) + InitializeLD(ld); + + ccp *ptr = le_define_list.field, *end; + for ( end = ptr + le_define_list.used; ptr < end; ptr++ ) + ImportFileLD(ld,*ptr,true,false); + } +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// le_distrib_t: export /////////////// +/////////////////////////////////////////////////////////////////////////////// + +bool ExportAnaLD ( const le_distrib_t *ld, le_analyse_t *ana ) +{ + if ( !ld && !ana ) + return false; + + + //--- assign LPAR + + if (ld->lpar) + ana->lpar = *ld->lpar; + + + //--- slots and flags + + ana->n_slot = 0; + int max = PackTracksLD(ld); + + le_property_t *prop = ana->property; + le_music_t *music = ana->music; + le_flags_t *flags = ana->flags; + + if ( prop && music && flags ) + { + if ( max > ana->max_slot ) + max = ana->max_slot; + ana->n_slot = max; + + const le_track_t *lt = ld->tlist; + for ( int slot = 0; slot < max; slot++, lt++ ) + { + if ( lt->track_status < LTS_EXPORT ) + continue; + prop[slot] = lt->property; + music[slot] = lt->music; + flags[slot] = lt->flags; + } + } + + + //--- copy battle cups + + ana->n_cup_arena = 0; + + le_cup_track_t *cup_dest = ana->cup_arena; + if (cup_dest) + { + uint max = ld->cup_battle.used; + if ( max > ana->max_cup_arena ) + max = ana->max_cup_arena; + + for ( int cup_idx = 0; cup_idx < max; cup_idx++ ) + { + const le_cup_ref_t *ref = GetLECUP(&ld->cup_battle,cup_idx); + if (ref) + { + *cup_dest++ = htonl(*ref++); + *cup_dest++ = htonl(*ref++); + *cup_dest++ = htonl(*ref++); + *cup_dest++ = htonl(*ref++); + *cup_dest++ = htonl(*ref++); + ana->n_cup_arena++; + } + } + } + + + //--- copy racing cups + + ana->n_cup_track = 0; + + cup_dest = ana->cup_track; + if (cup_dest) + { + uint max = ld->cup_versus.used; + if ( max > ana->max_cup_track ) + max = ana->max_cup_track; + + for ( int cup_idx = 0; cup_idx < max; cup_idx++ ) + { + const le_cup_ref_t *ref = GetLECUP(&ld->cup_versus,cup_idx); + if (ref) + { + *cup_dest++ = htonl(*ref++); + *cup_dest++ = htonl(*ref++); + *cup_dest++ = htonl(*ref++); + *cup_dest++ = htonl(*ref++); + ana->n_cup_track++; + } + } + } + PRINT("%s() #%u: n_cups=%d+%d\n",__FUNCTION__,__LINE__,ana->n_cup_arena,ana->n_cup_track); + + + //--- setup by version + + switch (ana->param_vers) + { + case 1: + ana->cup_par->n_racing_cups = htonl(ana->n_cup_track); + ana->cup_par->n_battle_cups = htonl(ana->n_cup_arena); + ana->course_par->n_slot = htonl(ana->n_slot); + break; + } + + + //--- finalize + + PatchLECODE(ana); + return false; +} + +/////////////////////////////////////////////////////////////////////////////// + +bool ExportCtCodeLD ( const le_distrib_t *ld, ctcode_t *ctc ) +{ + // [[2do]] ??? + return false; +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// le_distrib_t: reference list /////////////// +/////////////////////////////////////////////////////////////////////////////// + +static void PrintSectionTool ( FILE *f, bool be_verbose ) +{ + DASSERT(f); + + if (be_verbose) + fprintf(f,text_ledis_tool_cr, + tool_name, SYSTEM2, VERSION, REVISION_NUM, DATE ); + else + fprintf(f, + "\r\n[TOOL]\r\n" + "TOOL = %s\r\n" + "SYSTEM = %s\r\n" + "VERSION = %s\r\n" + "REVISION = %u\r\n" + "DATE = %s\r\n" + "\r\n", + tool_name, SYSTEM2, VERSION, REVISION_NUM, DATE ); +} + +/////////////////////////////////////////////////////////////////////////////// + +int SetupReferenceList ( le_distrib_t *ld, FilterFuncLD filter, le_options_t opt ) +{ + const uint need = ld->tlist_used + 1; + if ( ld->reflist_size < need ) + { + FREE(ld->reflist); + ld->reflist = CALLOC(need,sizeof(*ld->reflist)); + ld->reflist_size = need; + } + + le_track_t *lt = ld->tlist, **dest = ld->reflist; + for ( int slot = 0; slot < ld->tlist_used; slot++, lt++ ) + if ( filter ? filter(lt,opt) : lt->track_status >= LTS_EXPORT ) + *dest++ = lt; + *dest = 0; + + ld->reflist_used = dest - ld->reflist; + ASSERT( ld->reflist_used < ld->reflist_size ); + return ld->reflist_used ; +} + +/////////////////////////////////////////////////////////////////////////////// + +static bool check_filter ( const le_track_t *lt, le_options_t opt ) +{ + const le_options_t a = opt & LEO_M_ARENA; + if ( a == LEO_VERSUS && !IsTrackLTTY(lt->track_type) || a == LEO_BATTLE && !IsArenaLTTY(lt->track_type) ) + return false; + + const le_options_t o = opt & LEO_M_ORIGINAL; + if ( o == LEO_CUSTOM && lt->is_original || o == LEO_ORIGINAL && !lt->is_original ) + return false; + + return true; +} + +//----------------------------------------------------------------------------- + +static bool filter_options_td ( const le_track_t *lt, le_options_t opt ) +{ + return lt->track_status >= LTS_EXPORT + && check_filter(lt,opt); +} + +//----------------------------------------------------------------------------- + +static bool filter_name_td ( const le_track_t *lt, le_options_t opt ) +{ + return lt->track_status >= LTS_EXPORT + && check_filter(lt,opt) + && IsOutputNameValidLEO(lt->name,opt); +} + +//----------------------------------------------------------------------------- + +static bool filter_xname2_td ( const le_track_t *lt, le_options_t opt ) +{ + return lt->track_status >= LTS_EXPORT + && check_filter(lt,opt) + && ( IsOutputNameValidLEO(lt->name,opt) || IsOutputNameValidLEO(lt->xname,opt) ); +} + +/////////////////////////////////////////////////////////////////////////////// + +static int cmp_cup_lt ( const le_track_t **pa, const le_track_t **pb ) +{ + const le_track_t *a = *pa; + const le_track_t *b = *pb; + ASSERT(a&&b); + + int res = a->track_type - b->track_type; + if (!res) + { + res = a->cup_slot - b->cup_slot; + if (!res) + res = a->track_slot - b->track_slot; + } + return res; +} + +//----------------------------------------------------------------------------- + +int SortByCupLD ( le_distrib_t *ld, FilterFuncLD filter, le_options_t opt ) +{ + DASSERT(ld); + + UpdateCupsLD(ld); + int n = SetupReferenceList(ld,filter,opt); + if ( n > 1 ) + qsort( ld->reflist, n, sizeof(*ld->reflist), (qsort_func)cmp_cup_lt ); + return n; +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// le_distrib_t: listings /////////////// +/////////////////////////////////////////////////////////////////////////////// + +enumError CreateDumpLD ( FILE *f, le_distrib_t *ld ) +{ + if ( !f || !ld ) + return ERR_MISSING_PARAM; + + UpdateCupsLD(ld); + + export_count++; + brief_count++; + + fprintf(f, + "%s : LE-CODE distribution\r\n" + "%s[TOOL]\r\n\r\n" + "TOOL = %s\r\n" + "SYSTEM = %s\r\n" + "VERSION = %s\r\n" + "REVISION = %u\r\n" + "DATE = %s\r\n" + "\r\n", + LE_DISTRIB_MAGIC8, + section_sep, + tool_name, SYSTEM2, VERSION, REVISION_NUM, DATE ); + + #if 0 + fprintf(f, + "%s[SETTINGS]\r\n\r\n" + "\r\n", + section_sep + ); + #endif + + + //--- distribution params + + if (ld->dis_param.used) + { + int count = 0; + ParamFieldItem_t *it = ld->dis_param.field, *end; + for ( end = it + ld->dis_param.used; it < end; it++ ) + { + ccp data = (ccp)it->data; + if ( data && *data ) + { + if (!count++) + fprintf(f,"%s[DISTRIBUTION-PARAM]\r\n\r\n",section_sep); + + int len = strlen(it->key); + ccp sep = len > 14 ? " " : len > 6 ? "\t" : "\t\t"; + fprintf(f,"@%s%s= %s\r\n", it->key, sep, data ); + } + } + } + + + //-- lecode info + + fprintf(f,"%s[LECODE-INFO]\r\n# Info about current lecode binaries:\r\n\r\n", + section_sep ); + CreateLeInfoLD(f,ld,true); + + + //-- LPAR + + if (ld->lpar) + CreateLparLD(f,ld,false); + + + //-- cup reference + + fprintf(f,"%s[CUP-REF]\r\n\r\n",section_sep); + + if (PrintCupRefLD(f,ld,&ld->cup_battle)) + fputs("\r\n",f); + + if (PrintCupRefLD(f,ld,&ld->cup_versus)) + fputs("\r\n",f); + + + //-- track reference + + fprintf(f,"%s[TRACK-REF]\r\n\r\n",section_sep); + const enumError err1 = CreateRefLD(f,ld,false); + + + //-- track strings + + fprintf(f,"%s[TRACK-STRINGS]\r\n\r\n",section_sep); + const enumError err2 = CreateStringsLD(f,ld); + + + //-- end + + fprintf(f, + "%s[END]\r\n" + "# This section is ignored.\r\n" + "\r\n", + section_sep ); + + export_count--; + brief_count--; + return err1 > err2 ? err1 : err2; +} + +/////////////////////////////////////////////////////////////////////////////// + +enumError CreateRefLD ( FILE *f, le_distrib_t *ld, bool add_strings ) +{ + if ( !f || !ld ) + return ERR_MISSING_PARAM; + + UpdateCupsLD(ld); + SetupReferenceList(ld,filter_options_td,ld->spar.opt); + + fprintf(f,"%s : LE-CODE track reference v1\r\n",LE_REFERENCE_MAGIC8); + + ccp filter = GetOutputFilterLEO(ld->spar.opt&LEO_M_OUTPUT); + if (filter) + fprintf(f,"# Active output filter: %s\r\n",filter); + + fprintf(f, + "#> track_slot|type|orig|cup_slot|cup_slot_name|property|music|flags|hidden|sha1|sha1_d|%s\r\n", + add_strings ? "ident|ident_d|file|file_d|name|name_d|xname|xname_d|" : "" ); + + const bool no_d = ( ld->spar.opt & LEO_NO_D_FILES ) != 0; + int count = 0; + + for ( le_track_t **plt = ld->reflist; *plt; plt++ ) + { + count++; + const le_track_t *lt = *plt; + + fprintf(f,"%u|%s|%u|%u|%s|%u|%u|%u|%u|%s|%s|", + lt->track_slot, GetNameLTTY(lt->track_type), + lt->is_original, + lt->cup_slot, GetCupLT(lt,""), + lt->property, lt->music, + lt->flags, IsHiddenLETF(lt->flags), + GetSha1LT(lt,0,""), + no_d ? 0 : GetSha1LT(lt,1,"") ); + + if (add_strings) + { + exmem_t id1 = EscapeStringPipeCircS(GetIdentLT(lt,0,false,0)); + exmem_t id2 = EscapeStringPipeCircS( no_d ? 0 : GetIdentLT(lt,1,false,0) ); + exmem_t file = EscapeStringPipeCircS(GetFileLT(lt,0)); + exmem_t name = EscapeStringPipeCircS(GetNameLT(lt,0)); + exmem_t xname = EscapeStringPipeCircS(GetXNameLT(lt,0)); + + fprintf(f,"%s|%s|%s||%s||%s||\r\n", + id1.data.ptr, + id2.data.ptr, + file.data.ptr, + name.data.ptr, + xname.data.ptr ); + + FreeExMem(&id1); + FreeExMem(&id2); + FreeExMem(&file); + FreeExMem(&name); + FreeExMem(&xname); + } + else + fputs("\r\n",f); + } + + if ( count > 1 ) + fprintf(f,"#-----\r\n# %u records total\r\n",count); + return ERR_OK; +} + +/////////////////////////////////////////////////////////////////////////////// + +enumError CreateStringsLD ( FILE *f, le_distrib_t *ld ) +{ + if ( !f || !ld ) + return ERR_MISSING_PARAM; + + SetupReferenceList(ld,filter_options_td,ld->spar.opt); + fprintf(f,"%s : LE-CODE track strings v1\r\n",LE_STRINGS_MAGIC8); + + ccp filter = GetOutputFilterLEO(ld->spar.opt&LEO_M_OUTPUT); + if (filter) + fprintf(f,"# Active output filter: %s\r\n",filter); + + fputs("#> track_slot|d_mode|is_set|name|string|\r\n",f); + + const bool allow_d = !( ld->spar.opt & LEO_NO_D_FILES ); + int n_strings = 0, n_tracks = 0; + + for ( le_track_t **plt = ld->reflist; *plt; plt++ ) + { + n_tracks++; + const le_track_t *lt = *plt; + + for ( int ltt = 0; ltt < LTT__N; ltt++ ) + { + ccp *ptr = GetPtrOptLT(lt,ltt,allow_d); + if ( ptr && *ptr ) + { + n_strings++; + exmem_t text = EscapeStringPipeCircS(*ptr); + fprintf(f,"%u|%u|0|%s|%s|\r\n", + lt->track_slot, + GetDModeLTT(ltt), + GetLowerNameLTT(ltt), + text.data.ptr ); + FreeExMem(&text); + } + } + + #if LE_STRING_SET_ENABLED + ParamFieldItem_t *end = lt->str_set.field + lt->str_set.used; + for ( ParamFieldItem_t *ptr = lt->str_set.field; ptr < end; ptr++ ) + { + n_strings++; + exmem_t name = EscapeStringPipeCircS(ptr->key); + exmem_t text = EscapeStringPipeCircS(ptr->data); + fprintf(f,"%u|3|1|%s|%s|\r\n", + lt->track_slot, + name.data.ptr, + text.data.ptr ); + FreeExMem(&name); + FreeExMem(&text); + } + #endif + } + + if ( n_tracks > 1 ) + fprintf(f,"#-----\r\n# %u strings for %u tracks total\r\n",n_strings,n_tracks); + return ERR_OK; +} + +/////////////////////////////////////////////////////////////////////////////// + +static u32 GetPrefixIdByName ( ccp name, bool is_arena ) +{ + intx_t res; + res.u32[0] = 0; + + if ( name && *name == '+' ) + for ( int i = 0; i < 4 && (u8)*name > ' ' ; i++ ) + res.s8[i] = *name++; + return is_arena ? ~res.u32[0] : res.u32[0]; +} + +//----------------------------------------------------------------------------- + +uint GetNameFw ( le_distrib_t *ld, bool use_xname ) +{ + uint fw = 4; + if (ld->reflist) + { + for ( le_track_t **plt = ld->reflist; *plt; plt++ ) + { + le_track_t *lt = *plt; + ccp name = use_xname ? GetXName2LT(lt,"") : lt->name; + uint nlen = strlen8(name) + GetEscapeLen(name,-1,CHMD__MODERN,'"'); + if ( fw < nlen ) + fw = nlen; + } + } + return fw; +} + +//----------------------------------------------------------------------------- + +enumError CreateNamesLD ( FILE *f, le_distrib_t *ld, bool use_xname ) +{ + if ( !f || !ld ) + return ERR_MISSING_PARAM; + + SortByCupLD( ld, use_xname ? filter_xname2_td : filter_name_td, ld->spar.opt ); + + uint fw = GetNameFw(ld,use_xname) + 11; + fprintf(f,"\r\n%.*s\r\n Cup Name\r\n%.*s\r\n", + fw, Minus300, fw, Minus300 ); + + u32 prev_id = 0; + int count = 0, prev_cup = -1; + for ( le_track_t **plt = ld->reflist; *plt; plt++ ) + { + le_track_t *lt = *plt; + + ccp name = use_xname ? GetXName2LT(lt,"") : lt->name; + u32 cur_id = GetPrefixIdByName(name,IsArenaLTTY(lt->track_type)); + if (!count++) + prev_id = cur_id; + + int cur_cup = lt->cup_slot / 10; + + if ( prev_id != cur_id ) + { + prev_id = cur_id; + prev_cup = cur_cup; + fprintf(f,"\r\n%.*s\r\n\r\n",fw,Minus300); + } + else if ( prev_cup != cur_cup ) + { + prev_cup = cur_cup; + fputs("\r\n",f); + } + + exmem_t esc = EscapeStringEx(name,-1,EmptyString,EmptyString,CHMD__MODERN,0,false); + fprintf(f,"%s %s\r\n", GetCupAlignLT(lt), esc.data.ptr); + FreeExMem(&esc); + } + + if ( count > 1 ) + fprintf(f,"\r\n%.*s\r\n\r\n",fw,Minus300); + else + fputs("\r\n",f); + + return ERR_OK; +} + +/////////////////////////////////////////////////////////////////////////////// + +enumError CreateInfoLD ( FILE *f, le_distrib_t *ld, bool use_xname ) +{ + if ( !f || !ld ) + return ERR_MISSING_PARAM; + + DumpCupSlots(ld,"before sort"); + SortByCupLD( ld, use_xname ? filter_xname2_td : filter_name_td, ld->spar.opt ); + DumpCupSlots(ld,"behind sort"); + + uint fw = GetNameFw(ld,use_xname) + 33; + fprintf(f,"\r\n%.*s\r\n()\t Cup Prop\tMusic\tName\r\n%.*s\r\n", + fw, Minus300, fw, Minus300 ); + + u32 prev_id = 0; + int count = 0, prev_cup = -1; + for ( le_track_t **plt = ld->reflist; *plt; plt++ ) + { + le_track_t *lt = *plt; + + ccp name = use_xname ? GetXName2LT(lt,"") : lt->name; + u32 cur_id = GetPrefixIdByName(name,IsArenaLTTY(lt->track_type)); + if (!count++) + prev_id = cur_id; + + int cur_cup = lt->cup_slot / 10; + + if ( prev_id != cur_id ) + { + prev_id = cur_id; + prev_cup = cur_cup; + fprintf(f,"\r\n%.*s\r\n\r\n",fw,Minus300); + } + else if ( prev_cup != cur_cup ) + { + prev_cup = cur_cup; + fputs("\r\n",f); + } + + exmem_t esc = EscapeStringEx(name,-1,EmptyString,EmptyString,CHMD__MODERN,0,false); + fprintf(f,"()\t%s %s\t%s\t%s\r\n", + GetCupAlignLT(lt), + PrintPropertyID(lt->property,false), + PrintMusicID(lt->music,false), + esc.data.ptr ); + FreeExMem(&esc); + } + + if ( count > 1 ) + fprintf(f,"\r\n%.*s\r\n\r\n",fw,Minus300); + else + fputs("\r\n",f); + + return ERR_OK; +} + +/////////////////////////////////////////////////////////////////////////////// + +enumError CreateSha1LD + ( FILE *f, le_distrib_t *ld, bool use_xname, bool add_comments ) +{ + if ( !f || !ld ) + return ERR_MISSING_PARAM; + + UpdateCupsLD(ld); + SetupReferenceList(ld,filter_options_td,ld->spar.opt); + + static char sep[] = "#----------\r\n"; + + if (add_comments) + { + fprintf(f, + "%s\r\n" + "# A SHA1 list, that can be used for example @ Wiimmfi.de\r\n" + ,LE_SHA1REF_MAGIC8 ); + + ccp filter = GetOutputFilterLEO(ld->spar.opt&LEO_M_OUTPUT); + if ( filter && *filter ) + fprintf(f,"# Active output filter: %s\r\n",filter); + + fputs( "# Columns: TYPE FLAGS SHA1 TRACK_SLOT CUP NAME\r\n" + "# During the import, only the first 4 columns are evaluated.\r\n" + "# Flags: d:is _d file / t:title only / h:hidden / o:original track\r\n" + ,f ); + } + + int count = 0, prev_type = 99; + for ( le_track_t **plt = ld->reflist; *plt; plt++ ) + { + const le_track_t *lt = *plt; + + if ( prev_type != lt->track_type ) + { + prev_type = lt->track_type; + fputs( add_comments ? sep : "\r\n", f ); + } + + const int max = ld->spar.opt & LEO_NO_D_FILES ? 0 : 1; + for ( int d = 0; d <= max; d++ ) + { + const le_track_id_t *lti = lt->lti + d; + if ( lti->have_sha1 ) + { + count++; + sha1_hex_t hex; + Sha1Bin2Hex(hex,lti->sha1bin); + + ccp name = use_xname ? GetXName2LT(lt,0) : GetNameLT(lt,0); + exmem_t esc = EscapeStringEx(name,-1,EmptyString,EmptyString,CHMD__MODERN,0,false); + + fprintf(f,"%s %c%c%c%c %s %4d %s %s\r\n", + GetNameLTTY(lt->track_type), + d ? 'd' : '-', + IsTitleLETF(lt->flags) ? 't' : '-', + IsHiddenLETF(lt->flags) ? 'h' : '-', + lti->orig_sha1 ? 'o' : '-', + hex, lt->track_slot, GetCupAlignLT(lt), + esc.data.ptr ); + FreeExMem(&esc); + } + } + } + + if ( count > 3 && add_comments ) + fprintf(f,"%s# %u records total\r\n",sep,count); + return ERR_OK; +} + +/////////////////////////////////////////////////////////////////////////////// + +enumError CreateCtDefLD ( FILE *f, le_distrib_t *ld ) +{ + if ( !f || !ld ) + return ERR_MISSING_PARAM; + + UpdateCupsLD(ld); + const bool have_wiimm_cup = HaveWiimmCupLD(ld); + + fprintf(f,text_ledis_ctdef_header_cr,CT_DEF_MAGIC8,have_wiimm_cup); + + int prev_cup = 0, tidx = (8+have_wiimm_cup)*4; + for ( int slot = BMG_LE_FIRST_CTRACK; slot < ld->tlist_used; slot++ ) + { + le_track_t *lt = GetTrackLD(ld,slot); + if ( !lt || lt->track_status < LTS_EXPORT ) + continue; + char type; + if (IsHiddenLETF(lt->flags)) + type = 'H'; + else + { + type = 'T'; + const int cur_cup = tidx++/4; + if ( prev_cup != cur_cup ) + { + prev_cup = cur_cup; + fprintf(f,"\r\nC \"Cup %u\"\r\n",cur_cup); + } + } + + fprintf(f,"%c %s\t; %s\t; 0x%02x\t; %s; %s; %s; %s\r\n", + type, + PrintMusicID(lt->music,false), + PrintPropertyID(lt->property,false), + lt->flags, + QuoteFileLT(lt,""), + QuoteNameLT(lt,""), + QuoteIdentLT(lt,false,true,""), + QuoteXNameLT(lt,"") ); + } + + fputs("\r\n",f); + + extern const char text_ctcode_setup_arena_cr[]; + int count = 0; + for ( int slot = MKW_ARENA_BEG; slot < MKW_ARENA_END; slot++ ) + { + le_track_t *lt = GetTrackLD(ld,slot); + if ( !lt || lt->track_status < LTS_EXPORT || HaveUsualBattleSlots(lt) <= 0 ) + continue; + + if (!count++) + fprintf(f,"\r\n%s",text_ctcode_setup_arena_cr); + + fprintf(f,"%s\t%s\t%s\t# A%u\r\n", + PrintPropertyID(lt->track_slot,false), + PrintPropertyID(lt->property,false), + PrintMusicID(lt->music,false), + lt->cup_slot ); + } + if (count) + fputs("\r\n",f); + + return ERR_OK; +} + +/////////////////////////////////////////////////////////////////////////////// + +static void print_ledef_text + ( FILE *f, const le_distrib_t *ld, int max_len, ccp name, ccp text ) +{ + DASSERT(f); + DASSERT(ld); + DASSERT(name); + + if (IsOutputNameValidLEO(text,ld->spar.opt)) + { + ccp esc = EscapeStringS(text,"",CHMD__MODERN); + const int n_tabs = ( max_len - strlen8(name) ) / 8; + if ( n_tabs > 0 ) + fprintf(f,"\t%s%.*s\"%s\"\r\n",name,n_tabs,Tabs20,esc); + else + fprintf(f,"\t%s \"%s\"\r\n",name,esc); + FreeString(esc); + } +} + +//----------------------------------------------------------------------------- + +static void print_ledef_track + ( FILE *f, const le_distrib_t *ld, const le_track_t *lt ) +{ + DASSERT(f); + DASSERT(ld); + DASSERT(lt); + + char comment[30], *dest = comment; + if ( lt->lti[0].orig_sha1 ) + dest = StringCopyE(dest,comment+sizeof(comment),", original"); + if ( IsHiddenLETF(lt->flags) ) + dest = StringCopyE(dest,comment+sizeof(comment),", hidden"); + *dest = 0; + + ccp type = GetNameLTTY(lt->track_type); + fprintf(f,"\r\nTRACK %s%u\t%s\t%s\t%s\t\"%s\"%s%s\r\n", + type, + lt->track_slot, + type, + PrintPropertyID(lt->property,false), + PrintMusicID(lt->music,false), + PrintLEFT(lt->flags), + *comment ? "\t#" : "", + *comment ? comment+1 : "" ); + + #if LE_STRING_SET_ENABLED + int max_len = 0; + ParamFieldItem_t *set_end = lt->str_set.field + lt->str_set.used; + if (lt->str_set.used) + { + for ( ParamFieldItem_t *ptr = lt->str_set.field; ptr < set_end; ptr++ ) + if (IsOutputNameValidLEO(ptr->data,ld->spar.opt)) + { + const int slen = strlen8(ptr->key); + if ( max_len < slen ) + max_len = slen; + } + } + max_len = ( max_len + 18 ) / 8 * 8 - 1; + #else + int max_len = 7; + #endif + + print_ledef_text(f,ld,max_len,"ident",GetIdentLT(lt,false,true,0)); + print_ledef_text(f,ld,max_len,"file",GetFileLT(lt,0)); + print_ledef_text(f,ld,max_len,"name",GetNameLT(lt,0)); + print_ledef_text(f,ld,max_len,"xname",GetXNameLT(lt,0)); + + #if LE_STRING_LIST_ENABLED + for ( int ltt = LTT__LIST_BEG; ltt < LTT__LIST_END; ltt++ ) + { + ccp *ptr = GetPtrOptLT(lt,ltt,true); + if ( ptr && *ptr ) + print_ledef_text(f,ld,max_len,GetLowerNameLTT(ltt),GetListLT(lt,ltt,0)); + } + #endif + + #if LE_STRING_SET_ENABLED + if (lt->str_set.used) + { + max_len -= 2; + for ( ParamFieldItem_t *ptr = lt->str_set.field; ptr < set_end; ptr++ ) + if (IsOutputNameValidLEO(ptr->data,ld->spar.opt)) + { + ccp esc = EscapeStringS(ptr->data,"",CHMD__MODERN); + const int n_tabs = ( max_len - strlen8(ptr->key) ) / 8; + if ( n_tabs > 0 ) + fprintf(f,"\t[%s]%.*s\"%s\"\r\n",ptr->key,n_tabs,Tabs20,esc); + else + fprintf(f,"\t[%s] \"%s\"\r\n",ptr->key,esc); + FreeString(esc); + } + } + #endif + +} + +//----------------------------------------------------------------------------- + +static void print_ledef_cup + ( FILE *f, le_distrib_t *ld, const le_cup_t *lc, int sep_index ) +{ + DASSERT(f); + DASSERT(cup); + DASSERT(title); + + if (!lc->used) + return; + + + //--- get field widths + + int max = LE_FIRST_CT_SLOT; + for ( int i = 0; i < lc->used; i++ ) + { + le_cup_ref_t *ref = GetLECUP(lc,i); + if (ref) + for ( int t = 0; t < lc->tracks; t++ ) + if ( max < ref[t] ) + max = ref[t]; + } + + char buf[20]; + const int fw_cup = snprintf(buf,sizeof(buf),"%d",lc->used-1); + const int fw_track = snprintf(buf,sizeof(buf),"%d",max) + 2; + + + //--- print cups + + ccp sep = ""; + int count = 0, next_sep = -1; + const int cup_end = lc->used; + for ( int i = 0; i < cup_end; i++ ) + { + le_cup_ref_t *ref = GetLECUP(lc,i); + if ( i+2 <= cup_end && !memcmp(standard_bt_ref,ref,sizeof(standard_bt_ref)) ) + { + fputs(sep,f); + fputs("# 2 battle cups with standard layout (STANDARD-BATTLE-CUPS):\r\n",f); + next_sep = count+2; + } + else if ( i+8 <= cup_end && !memcmp(standard_vs_ref,ref,sizeof(standard_vs_ref)) ) + { + fputs(sep,f); + fputs("# 8 versus cups with standard layout (STANDARD-VERSUS-CUPS):\r\n",f); + next_sep = count+8; + } + else if ( !memcmp(mkwfun_random_ref,ref,sizeof(mkwfun_random_ref)) ) + { + fputs(sep,f); + fputs("# 1 versus cup with standard MKW-Fun random slots (MKWFUN-RANDOM-CUP):\r\n",f); + next_sep = count+1; + } + + if (ref) + { + if ( count == next_sep || count >= next_sep && count == sep_index ) + fputs(sep,f); + count++; + sep = "\r\n"; + + fputs("APPEND",f); + for ( int t = 0; t < lc->tracks; t++ ) + { + const int slot = ref[t]; + ccp info = "-1"; + if ( slot >= 0 ) + { + const le_track_t *lt = GetTrackLD(ld,slot); + if ( IsActiveLT(lt) ) + { + if ( lt->track_status == LTS_FILL ) + info = "fill"; + else + info = GetSlotNameLT(lt); + } + } + fprintf(f,"\t%*s",fw_track,info); + } + fprintf(f,"\t# %*d\r\n",fw_cup,i); + } + } + fputs(sep,f); +} + +//----------------------------------------------------------------------------- + +enumError CreateLeDefLD ( FILE *f, le_distrib_t *ld ) +{ + if ( !f || !ld ) + return ERR_MISSING_PARAM; + + UpdateCupsLD(ld); + AnalyzeLD(ld,true); + const bool be_verbose = !(ld->spar.opt & LEO_BRIEF); + + if (be_verbose) + fprintf(f,text_ledis_ledef_header_cr,LE_DEFINE_MAGIC8); + else + fprintf(f,"%s\r\n",LE_DEFINE_MAGIC8); + + PrintSectionTool(f,be_verbose); + + //-- TRACK-LIST + + if (be_verbose) + fprintf(f,text_ledis_ledef_track_list_cr); + else + fprintf(f,"\r\n[TRACK-LIST]\r\n"); + + // battle arenas + + ccp info = "\r\n#--- battle arenas\r\n"; + int first = MKW_ARENA_BEG; + if (ld->ana.bt.orig_tracks) + { + first = MKW_ARENA_END; + fprintf(f,"%s\r\nSTANDARD-BATTLE-ARENAS\r\n",info); + info = 0; + } + + for ( int slot = first; slot < ld->tlist_used; slot++ ) + { + const le_track_t *lt = GetTrackLD(ld,slot); + if ( !lt || lt->track_status < LTS_EXPORT || !IsArenaLTTY(lt->track_type) ) + continue; + + if (info) + { + fputs(info,f); + info = 0; + } + + print_ledef_track(f,ld,lt); + } + + // versus tracks + + info = "\r\n#--- versus tracks\r\n"; + first = MKW_TRACK_BEG; + if (ld->ana.vs.orig_tracks) + { + first = MKW_TRACK_END; + fprintf(f,"%s\r\nSTANDARD-VERSUS-TRACKS\r\n",info); + info = 0; + } + + for ( int slot = first; slot < ld->tlist_used; slot++ ) + { + const le_track_t *lt = GetTrackLD(ld,slot); + if ( !lt || lt->track_status < LTS_EXPORT || IsArenaLTTY(lt->track_type) ) + continue; + + if (info) + { + fputs(info,f); + info = 0; + } + + print_ledef_track(f,ld,lt); + } + + fputs("\r\n",f); + + + //-- CUP-LIST + + if (be_verbose) + fprintf(f,text_ledis_ledef_cup_list_cr); + else + fprintf(f,"\n\r\n[CUP-LIST]\r\n\r\n"); + + // battle cups + + fputs("#--- battle cups\r\n\r\n",f); + print_ledef_cup(f,ld,&ld->cup_battle,2); + + fprintf(f, + "# Append unused battle arenas automatically (0=NO/1=YES):\r\n" + "ADD-UNUSED-ARENAS = %s\r\n" + "\r\n" + ,ld->ana.bt.add_unused ? "yes" : "no" + ); + + // versus cups + + fputs("#--- versus cups\r\n\r\n",f); + print_ledef_cup(f,ld,&ld->cup_versus,8); + + fprintf(f, + "# Append unused versus tracks automatically (0=NO/1=YES):\r\n" + "ADD-UNUSED-TRACKS = %s\r\n" + "\r\n" + ,ld->ana.vs.add_unused ? "yes" : "no" + ); + + + //-- END + + if (be_verbose) + fputs("\r\n#\f\r\n###########\r\n [END]\r\n###########\r\n",f); + else + fputs("\r\n[END]\r\n",f); + + return ERR_OK; +} + +/////////////////////////////////////////////////////////////////////////////// + +enumError CreateLecode4LD ( ccp fname, le_distrib_t *ld ) +{ + if ( !fname || !ld ) + return ERR_MISSING_PARAM; + + ccp at = strrchr(fname,'@'); + if (!at) + return ERROR0(ERR_WARNING,"Missing '@' in filename: %s\n",fname); + + char path[PATH_MAX]; + if ( strlen(fname) > sizeof(path) - 4 ) + return ERROR0(ERR_WARNING,"Filename too long: %s\n",fname); + + char *tag = path + (at-fname); + memcpy(path,fname,tag-path); + strncpy(tag+3,at+1,path+sizeof(path)-tag-3); + + for ( le_region_t reg = LEREG__BEG; reg <= LEREG__END; reg++ ) + { + memcpy(tag,GetNameLEREG(reg,"@@@"),3); + File_t F; + enumError err = CreateFileOpt(&F,true,path,false,0); + if (!err) + err = CreateLecodeLD(F.f,ld,reg); + if (err) + return err; + } + + return ERR_OK; +} + +/////////////////////////////////////////////////////////////////////////////// + +enumError CreateLecodeLD ( FILE *f, le_distrib_t *ld, le_region_t region ) +{ + if ( !f || !ld ) + return ERR_MISSING_PARAM; + + UpdateCupsLD(ld); + + mem_t lecode = GetLecodeLD(ld,region); + if (!lecode.ptr) + return ERR_MISSING_PARAM; + + le_analyse_t ana; + u8 *data = MEMDUP(lecode.ptr,lecode.len); + if (!AnalyseLEBinary(&ana,data,lecode.len)) + { + ExportAnaLD(ld,&ana); + fwrite(data,lecode.len,1,f); + } + FREE(data); + return ERR_OK; +} + +/////////////////////////////////////////////////////////////////////////////// + +enumError CreateLeInfoLD ( FILE *f, const le_distrib_t *ld, bool list_only ) +{ + if ( !f || !ld ) + return ERR_MISSING_PARAM; + + if (!list_only) + { + const ColorSet_t *colset = GetFileColorSet(f); + fprintf(f,"\r\n%sCurrent LE-CODE binaries:%s\r\n\r\n",colset->caption,colset->reset); + } + + for ( le_region_t reg = LEREG__BEG; reg <= LEREG__END; reg++ ) + { + mem_t builtin = GetLecodeLEREG(reg); + mem_t current = GetLecodeLD(ld,reg); + if ( current.ptr ) + fprintf(f," %s, %s\r\n", + GetInfoLECODE(current), + current.ptr == builtin.ptr ? "built-in" : "loaded" ); + } + fputs("\r\n",f); + return ERR_OK; +} + +/////////////////////////////////////////////////////////////////////////////// + +enumError CreateLparLD ( FILE *f, le_distrib_t *ld, bool print_full ) +{ + if ( !f || !ld ) + return ERR_MISSING_PARAM; + + SetupLparLD(ld,true); + return SaveTextFileLPAR(ld->lpar,f,print_full); +} + +/////////////////////////////////////////////////////////////////////////////// + +enumError CreateBmgLD ( FILE *f, le_distrib_t *ld, bool bmg_text ) +{ + if ( !f || !ld ) + return ERR_MISSING_PARAM; + + bmg_t bmg; + InitializeBMG(&bmg); + + le_options_t source = ld->spar.opt & LEO_M_BMG; + if (!source) + source = LEO_M_BMG; + + for ( int slot = 0; slot < ld->tlist_used; slot++ ) + { + le_track_t *lt = GetTrackLD(ld,slot); + if ( !lt || lt->track_status < LTS_EXPORT ) + continue; + + ccp text = GetTextLT(lt,&ld->spar,0); + if (!IsOutputNameValidLEO(text,ld->spar.opt)) + continue; + + PRINT0("SLOT %d: %s\n",slot,text); + + if ( source & LEO_MKW1 ) + { + const u32 mid = IsMkwTrack(slot) + ? slot+MID_TRACK1_BEG + : IsMkwArena(slot) + ? slot-BMG_N_TRACK+MID_ARENA1_BEG + : 0; + + if (mid) + { + bmg_item_t *bi = InsertItemBMG(&bmg,mid,0,0,0); + ASSERT(bi); + AssignItemTextBMG(bi,text,-1); + } + } + + if ( source & LEO_MKW2 ) + { + const u32 mid = IsMkwTrack(slot) + ? slot+MID_TRACK2_BEG + : IsMkwArena(slot) + ? slot-BMG_N_TRACK+MID_ARENA2_BEG + : 0; + + if (mid) + { + bmg_item_t *bi = InsertItemBMG(&bmg,mid,0,0,0); + ASSERT(bi); + AssignItemTextBMG(bi,text,-1); + } + } + + if ( source & LEO_CTCODE && slot < BMG_N_CT_TRACK ) + { + bmg_item_t *bi = InsertItemBMG(&bmg,slot+MID_CT_TRACK_BEG,0,0,0); + ASSERT(bi); + AssignItemTextBMG(bi,text,-1); + } + + if ( source & LEO_LECODE ) + { + bmg_item_t *bi = InsertItemBMG(&bmg,slot+MID_LE_TRACK_BEG,0,0,0); + ASSERT(bi); + AssignItemTextBMG(bi,text,-1); + } + } + + enumError err = bmg_text || isatty(fileno(f)) + ? SaveTextFileBMG( &bmg, f, 0, long_count > 0, + brief_count > 0 ? brief_count : !print_header ) + : SaveRawFileBMG(&bmg,f,0); + + ResetBMG(&bmg); + return err; +} + +/////////////////////////////////////////////////////////////////////////////// + +static void debug_cups ( FILE *f, const le_cup_t *lc ) +{ + fprintf(f,"%6u (0x%x) cups used, %u (0x%x) alloced (%s)\r\n", + lc->used, lc->used, lc->size, lc->size, + PrintSize1000(0,0,lc->size*sizeof(*lc->list)*lc->tracks,0) ); + + if (!lc->used) + return; + + u16 count[LE_MAX_TRACKS] = {0}; + int slots_used = 0, different = 0, max_use = 0; + + const le_cup_ref_t *end = lc->list + lc->used * lc->tracks; + for ( const le_cup_ref_t *ptr = lc->list; ptr < end; ptr++ ) + { + uint idx = *ptr; + if ( idx < LE_MAX_TRACKS ) + { + slots_used++; + if (!count[idx]++) + different++; + if ( max_use < count[idx] ) + max_use = count[idx]; + } + } + + fprintf(f,"%6u slots total, %u slots used.\r\n", + lc->used*lc->tracks, slots_used ); + fprintf(f,"%6u different track references, max %u for one track.\r\n", + different, max_use ); +} + +//----------------------------------------------------------------------------- + +enumError CreateDebugLD ( FILE *f, const le_distrib_t *ld ) +{ + if ( !f || !ld ) + return ERR_MISSING_PARAM; + + const ColorSet_t *colset = GetFileColorSet(f); + + //--- basics + + fprintf(f,"\r\n%sBasic settings:%s\r\n",colset->caption,colset->reset); + fprintf(f, + " Current auto-setup: 0x%x\r\n" + " Current options: %s\r\n" + ,ld->auto_setup + ,GetOptionsLSP(&ld->spar,LEO__ALL) + ); + + + //--- tracks + + fprintf(f,"\r\n%sTracks:%s\r\n",colset->caption,colset->reset); + fprintf(f," %u (0x%x) tracks used, %u (0x%x) alloced (%s)\r\n", + ld->tlist_used, ld->tlist_used, ld->tlist_size, ld->tlist_size, + PrintSize1000(0,0,ld->tlist_size*sizeof(*ld->tlist),0) ); + + uint n_status[LTS__N] = {0}; + uint n_arena = 0, n_track = 0, n_random = 0; + uint n_text[LTT__N] = {0}, size_text[LTT__N] = {0}; + uint n_sha1 = 0, n_sha1_d = 0; + + #if LE_STRING_SET_ENABLED + typedef struct count_t { uint n; uint size; } count_t; + exmem_list_t str_count; + InitializeEML(&str_count); + #endif + + le_track_t *lt = ld->tlist; + for ( int slot = 0; slot < ld->tlist_used; slot++, lt++ ) + { + if ( lt->track_status < LTS__N ) + n_status[lt->track_status]++; + + if ( lt->track_status < LTS_ACTIVE ) + continue; + + if ( lt->track_type & LTTY_ARENA ) n_arena++; + if ( lt->track_type & LTTY_TRACK ) n_track++; + if ( lt->track_type & LTTY_RANDOM ) n_random++; + + if (lt->lti[0].have_sha1) n_sha1++; + if (lt->lti[1].have_sha1) n_sha1_d++; + + for ( int ltt = 0; ltt < LTT__N; ltt++ ) + { + ccp *ptr = GetPtrOptLT(lt,ltt,true); + if ( ptr && *ptr ) + { + n_text[ltt]++; + size_text[ltt] += GetGoodAllocSize(strlen(*ptr) + 1); + } + } + + #if LE_STRING_SET_ENABLED + ParamFieldItem_t *end = lt->str_set.field + lt->str_set.used; + for ( ParamFieldItem_t *ptr = lt->str_set.field; ptr < end; ptr++ ) + { + exmem_key_t *ek = FindInsertEML(&str_count,ptr->key,CPM_LINK,0); + if (!ek->data.data.ptr) + { + ek->data.data.ptr = CALLOC(1,sizeof(count_t)); + ek->data.data.len = sizeof(count_t); + ek->data.is_alloced = true; + } + count_t *cnt = (count_t*)ek->data.data.ptr; + cnt->n++; + cnt->size += GetGoodAllocSize(strlen(ptr->data)+1); + } + #endif + } + + fprintf(f,"%s Summaries by track status:%s\n",colset->heading,colset->reset); + for ( int i = 0; i < LTS__N; i++ ) + if (n_status[i]) + fprintf(f,"%8u of status %s\n",n_status[i],GetNameLTS(i)); + + fprintf(f,"%s Summaries by track type:%s\n",colset->heading,colset->reset); + if (n_arena) fprintf(f,"%8u of type BATTLE ARENA\n",n_arena); + if (n_track) fprintf(f,"%8u of type VERSUS TRACK\n",n_track); + if (n_random) fprintf(f,"%8u of type RANDOM\n",n_random); + + fprintf(f,"%s String usage:%s\n",colset->heading,colset->reset); + if (n_sha1) + fprintf(f,"%8u string%c of type SHA1 (not alloced)\n", + n_sha1, n_sha1 == 1 ? ' ' : 's' ); + if (n_sha1_d) + fprintf(f,"%8u string%c of type D-SHA1 (not alloced)\n", + n_sha1_d, n_sha1_d == 1 ? ' ' : 's' ); + + for ( int ltt = 0; ltt < LTT__N; ltt++ ) + { + if (n_text[ltt]) + { + char type[20]; + snprintf(type,sizeof(type),"%s,",GetUpperNameLTT(ltt)); + fprintf(f,"%8u string%c of type %-8s %s\n", + n_text[ltt], n_text[ltt] == 1 ? ' ' : 's', + type, PrintSize1000(0,0,size_text[ltt],DC_SFORM_ALIGN)); + } + } + + #if LE_STRING_SET_ENABLED + if (str_count.used) + { + fprintf(f,"%s String set usage:%s\n",colset->heading,colset->reset); + exmem_key_t *end = str_count.list + str_count.used; + for ( exmem_key_t *ek = str_count.list; ek < end; ek++ ) + { + count_t *cnt = (count_t*)ek->data.data.ptr; + fprintf(f,"%8u, %s : %s\n", + cnt->n, PrintSize1000(0,0,cnt->size,DC_SFORM_ALIGN), ek->key ); + } + } + #endif // LE_STRING_SET_ENABLED + + //--- cups + + fprintf(f,"\r\n%sBattle Cups:%s\r\n",colset->caption,colset->reset); + debug_cups(f,&ld->cup_battle); + + fprintf(f,"\r\n%sVersus Cups:%s\r\n",colset->caption,colset->reset); + debug_cups(f,&ld->cup_versus); + + //--- misc + + fprintf(f,"\r\n%sCurrent LE-CODE binaries:%s\r\n",colset->caption,colset->reset); + CreateLeInfoLD(f,ld,true); + + //--- terminate + + #if LE_STRING_SET_ENABLED + ResetEML(&str_count); + #endif + + return ERR_OK; +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// le_distrib_t: text jobs /////////////// +/////////////////////////////////////////////////////////////////////////////// + +enumError SubstLD ( le_distrib_t *ld, const le_strpar_t *dest, ccp arg ) +{ + if ( !ld || !dest || !arg || !*arg ) + return ERR_MISSING_PARAM; + + //--- setup + + Regex_t re; + enumError err = ScanRegex(&re,true,arg); + PRINT0("err=%d, valid=%d\n",err,re.valid); + if ( err || !re.valid ) + { + ResetRegex(&re); + return err ? err : ERR_INVALID_DATA; + } + + struct { FastBuf_t b; char space[1000]; } result; + InitializeFastBuf(&result,sizeof(result)); + + SetupReferenceList(ld,filter_options_td,dest->opt); + + //--- main loop + + for ( le_track_t **plt = ld->reflist; *plt; plt++ ) + { + le_track_t *lt = *plt; + if ( lt->track_status < LTS_EXPORT ) + continue; + + ccp text = GetTextLT(lt,dest,0); + if ( text && *text ) + { + ReplaceRegex(&re,&result.b,text,-1); + SetTextLT(lt,dest,result.b.buf); + } + } + + //--- terminate + + ResetRegex(&re); + ResetFastBuf(&result.b); + return ERR_OK; +} + +/////////////////////////////////////////////////////////////////////////////// + +enumError CopyLD ( le_distrib_t *ld, const le_strpar_t *dest, + const le_strpar_t *src, int n_src ) +{ + if ( !ld || !dest || !src || n_src < 1 ) + return ERR_MISSING_PARAM; + + char buf[LE_TRACK_STRING_MAX+10]; + + SetupReferenceList(ld,filter_options_td,dest->opt); + for ( le_track_t **plt = ld->reflist; *plt; plt++ ) + { + le_track_t *lt = *plt; + char *bufptr = buf; + for ( int idx = 0; idx < n_src; idx++ ) + { + if ( bufptr > buf ) + *bufptr++ = '\1'; + ccp text = GetTextLT(lt,src+idx,0); + if (IsInputNameValidLEO(text,src[idx].opt)) + bufptr = StringCopyE(bufptr,buf+sizeof(buf),text); + if ( bufptr >= buf + LE_TRACK_STRING_MAX ) + { + buf[LE_TRACK_STRING_MAX-1] = 0; + break; + } + } + + ccp *ptr = GetPtrLT(lt,dest); + if (IsAssignmentAllowedLEO( ptr ? *ptr : 0,buf,dest->opt)) + SetTextLT(lt,dest,buf); + } + return ERR_OK; +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// le_distrib_t: copy files /////////////// +/////////////////////////////////////////////////////////////////////////////// + +enumError TransferFilesLD ( le_distrib_t *ld, bool logit, bool testmode ) +{ + LogFile_t log0 = { .log = stdlog }; + LogFile_t *log = logit ? &log0 : 0; + + TransferMode_t flags = testmode ? TFMD_F_TEST : 0; + + le_track_t *lt = ld->tlist; + for ( int slot = 0; slot < ld->tlist_used; slot++, lt++ ) + if ( lt->track_status >= LTS_EXPORT ) + { + ccp file = GetFileLT(lt,0); + if (file) + TransferTrackFile(log,lt->track_slot,file,flags); + } + + // support for fill-tracks + TransferTrackBySlot(log,ld->cup_battle.fill_slot,ld->cup_battle.fill_src,flags); + TransferTrackBySlot(log,ld->cup_versus.fill_slot,ld->cup_versus.fill_src,flags); + + return ERR_OK; +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// le_distrib_t: distribution /////////////// +/////////////////////////////////////////////////////////////////////////////// + +void UpdateDistribLD ( le_distrib_t *ld, bool overwrite ) +{ + DASSERT(ld); + char buf[100]; + + UpdateCupsLD(ld); + + + //-- UUID + + uuid_buf_t uuid; + bool create_uuid = overwrite; + if (!create_uuid) + { + const ParamFieldItem_t *it = FindParamField(&ld->dis_param,"UUID"); + if ( !it || !it->data || ScanUUID(uuid,(ccp)it->data) == (ccp)it->data ) + create_uuid = true; + } + + if (create_uuid) + { + CreateTextUUID(buf,sizeof(buf)); + ReplaceParamField(&ld->dis_param,"UUID",false,0,STRDUP(buf)); + } + + + //-- time stamps + + ccp tim = PrintTimeByFormat("%F %T %z",GetTimeSec(false)); + + if ( overwrite || !FindParamField(&ld->dis_param,"FIRST-CREATION") ) + ReplaceParamField(&ld->dis_param,"FIRST-CREATION",false,0,STRDUP(tim)); + ReplaceParamField(&ld->dis_param,"LAST-UPDATE",false,0,STRDUP(tim)); +} + +/////////////////////////////////////////////////////////////////////////////// + +bool AddDistribParamLD ( le_distrib_t *ld, ccp src, ccp end ) +{ + if ( !src || *src != '@' ) + return false; + + char name_buf[100], *name = name_buf; + src++; + + //-- scan name + + for(;;) + { + const char ch = *src; + if ( !isalnum(ch) && ch != '_' && ch != '-' && ch != '.' ) + break; + src++; + if ( name < name_buf + sizeof(name_buf) - 1 ) + *name++ = toupper(ch); + } + + //-- skip spaces + + while ( src < end && (uchar)*src <= ' ' ) + src++; + + //--- check for '=' + + if ( src < end && *src == '=' ) + { + src++; + while ( src < end && (uchar)*src <= ' ' ) + src++; + } + + if ( name > name_buf ) + { + PRINT0("@%.*s = |%.*s|\n",(int)(name-name_buf),name_buf,(int)(end-src),src); + ReplaceParamField( &ld->dis_param, MEMDUP(name_buf,name-name_buf), + true, 0, MEMDUP(src,end-src) ); + } + return true; +} + +/////////////////////////////////////////////////////////////////////////////// + +enumError ImportDistribLD ( le_distrib_t *ld, cvp data, uint size ) +{ + if ( !ld || !data || !size ) + return ERR_MISSING_PARAM; + + ScanText_t st; + SetupScanText(&st,data,size); + const enumError err = ImportDistribSTLD(ld,&st); + ResetScanText(&st); + return err; +} + +//----------------------------------------------------------------------------- + +enumError ImportDistribSTLD ( le_distrib_t *ld, ScanText_t *st ) +{ + if ( !ld || !st ) + return ERR_MISSING_PARAM; + + while (NextLineScanText(st)) + { + PRINT0("LINE: |%.*s|\n",(int)(st->eol-st->line),st->line); + if ( *st->line == '@' ) + AddDistribParamLD(ld,st->line,st->eol); + else + ScanSha1LineLD(ld,st->line,st->eol,false); + } + return ERR_OK; +} + +/////////////////////////////////////////////////////////////////////////////// + +enumError CreateDistribLD ( FILE *f, le_distrib_t *ld, bool use_xname ) +{ + if ( !f || !ld ) + return ERR_MISSING_PARAM; + + UpdateDistribLD(ld,false); + + ccp uuid = GetParamFieldStr(&ld->dis_param,1,"UUID",""); + fprintf(f,text_distrib_head_cr + + ,GetParamFieldStr(&ld->dis_param,1,"COMMENT1","") + ,GetParamFieldStr(&ld->dis_param,1,"COMMENT2","") + ,GetParamFieldStr(&ld->dis_param,1,"COMMENT3","") + ,GetParamFieldStr(&ld->dis_param,1,"COMMENT4","") + ,GetParamFieldStr(&ld->dis_param,1,"COMMENT5","") + + ,GetParamFieldStr(&ld->dis_param,1,"USER-CT-WIIMM","") + ,GetParamFieldStr(&ld->dis_param,1,"USER-WIIMMFI","") + ,GetParamFieldStr(&ld->dis_param,1,"USER-CT-WIIKI","") + ,GetParamFieldStr(&ld->dis_param,1,"USER-MISC","") + ,GetParamFieldStr(&ld->dis_param,1,"MAIL","") + ,GetParamFieldStr(&ld->dis_param,1,"NOTE-FOR-WIMMM","") + + ,GetParamFieldStr(&ld->dis_param,1,"NAME","?") + ,GetParamFieldStr(&ld->dis_param,1,"VERSION","?") + ,GetParamFieldStr(&ld->dis_param,1,"AUTHORS","?") + ,GetParamFieldStr(&ld->dis_param,1,"RELEASE-DATE","") + ,GetParamFieldStr(&ld->dis_param,1,"KEYWORDS","") + ,GetParamFieldStr(&ld->dis_param,1,"PREDECESSOR","") + + ,GetParamFieldStr(&ld->dis_param,1,"WIIMMFI-REGION","") + ,GetParamFieldStr(&ld->dis_param,1,"INFO-TEXT","") + ,GetParamFieldStr(&ld->dis_param,1,"INFO-URL","") + + ,uuid + ,GetParamFieldIntMM(&ld->dis_param,1,"DISPLAY-MODE",3,0,3) + ,GetParamFieldIntMM(&ld->dis_param,1,"DATABASE-NAME",1,0,1) + ,GetParamFieldIntMM(&ld->dis_param,1,"VIEW-COMMENT",0,0,1) + ,GetParamFieldIntMM(&ld->dis_param,1,"ENABLE-NEW",0,0,1) + ,GetParamFieldIntMM(&ld->dis_param,1,"ENABLE-AGAIN",0,0,1) + ,GetParamFieldIntMM(&ld->dis_param,1,"ENABLE-FILL",0,0,1) + ,GetParamFieldIntMM(&ld->dis_param,1,"ENABLE-UPDATE",0,0,1) + ,GetParamFieldIntMM(&ld->dis_param,1,"ENABLE-BOOST",0,0,1) + + ,uuid + ,VERSION + ,REVISION_NUM + ,GetParamFieldStr(&ld->dis_param,1,"FIRST-CREATION","") + ,GetParamFieldStr(&ld->dis_param,1,"LAST-UPDATE","") + ); + + + //--- mark some more params as 'used' + + GetParamFieldStr(&ld->dis_param,1,"WSZST-VERSION",""); + GetParamFieldStr(&ld->dis_param,1,"WSZST-REVISION",""); + + + //--- additional parameters + + ccp info = text_distrib_param_cr; + + const ParamFieldItem_t *it = ld->dis_param.field; + for ( int i = 0; i < ld->dis_param.used; i++, it++ ) + if (!it->num) + { + int len = strlen(it->key); + ccp sep = len > 14 ? " " : len > 6 ? "\t" : "\t\t"; + fprintf(f,"%s@%s%s= %s\r\n", info, it->key, sep, (ccp)it->data ); + info = ""; + } + + + //--- sha1 list of tracks and arenas + + fputs(text_distrib_tracks_cr,f); + CreateSha1LD(f,ld,use_xname,false); + fputs("\r\n",f); + + return ERR_OK; +} + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// lecode support + +void FreeLecodeLD ( le_distrib_t *ld, le_region_t reg ) +{ + if ( !ld || reg < LEREG__BEG || reg > LEREG__END ) + return; + + const int idx = reg - LEREG__BEG; + if (ld->lecode_alloced[idx]) + FREE((u8*)ld->lecode[idx].ptr); + ld->lecode[idx].ptr = 0; + ld->lecode[idx].len = 0; + ld->lecode_alloced[idx] = false; +} + +/////////////////////////////////////////////////////////////////////////////// + +mem_t AssignLecodeLD ( le_distrib_t *ld, le_region_t reg, cvp data, uint size ) +{ + if ( !ld || reg < LEREG__BEG || reg > LEREG__END ) + return NullMem; + + FreeLecodeLD(ld,reg); + const int idx = reg - LEREG__BEG; + mem_t *lec = ld->lecode + idx; + if ( data && size ) + { + lec->ptr = MEMDUP(data,size); + lec->len = size; + ld->lecode_alloced[idx] = true; + } + + return *lec; +} + +/////////////////////////////////////////////////////////////////////////////// + +mem_t GetLecodeLD ( const le_distrib_t *ld, le_region_t reg ) +{ + if ( !ld || reg < LEREG__BEG || reg > LEREG__END ) + return NullMem; + + const int idx = reg - LEREG__BEG; + mem_t lecode = ld->lecode[idx]; + if (!lecode.ptr) + lecode = GetLecodeLEREG(reg); + return lecode; +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// ledis_dump support /////////////// +/////////////////////////////////////////////////////////////////////////////// + +int EnableLDUMP ( ccp filename ) +{ + if ( ledis_dump_enabled >= 0 ) + { + ledis_dump_enabled = 1; + if (filename) + { + FreeString(opt_create_dump); + opt_create_dump = STRDUP(filename); + } + } + return ledis_dump_enabled; +} + +/////////////////////////////////////////////////////////////////////////////// + +enumError CloseLDUMP() +{ + enumError err = ERR_NOTHING_TO_DO; + if ( ledis_dump_enabled > 0 ) + { + if ( opt_create_dump && *opt_create_dump && ledis_dump.tlist_used ) + { + File_t F; + err = CreateFile(&F,true,opt_create_dump,FM_OVERWRITE|FM_STDIO|FM_TOUCH); + if (!err) + err = CreateRefLD(F.f,&ledis_dump,true); + CloseFile(&F,0); + } + ResetLD(&ledis_dump); + ledis_dump_enabled = -1; + } + return err; +} + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +void ImportAnaLDUMP ( const le_analyse_t *ana ) +{ + if ( ledis_dump_enabled > 0 ) + ImportAnaLD(&ledis_dump,ana); +} + +/////////////////////////////////////////////////////////////////////////////// + +void ImportCtcodeLDUMP ( const ctcode_t *ctcode ) +{ + if ( ledis_dump_enabled > 0 ) + ImportCtcodeLD(&ledis_dump,ctcode); +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// struct DistributionInfo_t /////////////// +/////////////////////////////////////////////////////////////////////////////// + +void InitializeDistributionInfo + ( DistributionInfo_t * dinf, bool add_default_param ) +{ + DASSERT(dinf); + memset(dinf,0,sizeof(*dinf)); + InitializeLD(&dinf->ld); + InitializeParamField(&dinf->translate); + dinf->translate.free_data = true; + + uint slot; + for ( slot = 0; slot < MAX_DISTRIBUTION_ARENA; slot++ ) + { + ParamField_t *pf = dinf->arena + slot; + InitializeParamField(pf); + pf->free_data = true; + } + + for ( slot = 0; slot < MAX_DISTRIBUTION_TRACK; slot++ ) + { + ParamField_t *pf = dinf->track + slot; + InitializeParamField(pf); + pf->free_data = true; + } + + if (add_default_param) + AddParamDistributionInfo(dinf,true); +} + +/////////////////////////////////////////////////////////////////////////////// + +void ResetDistributionInfo ( DistributionInfo_t * dinf ) +{ + if (dinf) + { + ResetParamField(&dinf->translate); + ResetLD(&dinf->ld); + + uint slot; + for ( slot = 0; slot < MAX_DISTRIBUTION_ARENA; slot++ ) + ResetParamField(dinf->arena+slot); + for ( slot = 0; slot < MAX_DISTRIBUTION_TRACK; slot++ ) + ResetParamField(dinf->track+slot); + } +} + +/////////////////////////////////////////////////////////////////////////////// + +void AddParamDistributionInfo ( DistributionInfo_t * dinf, bool overwrite ) +{ + DASSERT(dinf); + UpdateDistribLD(&dinf->ld,overwrite); +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// slot translation /////////////// +/////////////////////////////////////////////////////////////////////////////// + +char * ScanSlot ( uint *res_slot, ccp source, bool need_point ) +{ + DASSERT(res_slot); + DASSERT(source); + *res_slot = 0; + + char *end; + uint slot = strtoul(source,&end,10); + if ( !need_point + && slot >= MIN_DISTRIBUTION_SLOT + && slot < MAX_DISTRIBUTION_TRACK + && (uchar)*end <= ' ' + && ( end-source == 2 || end-source == 3 )) + { + *res_slot = slot; + return end; + } + + slot *= 10; + if ( slot < MIN_DISTRIBUTION_SLOT || slot >= MAX_DISTRIBUTION_TRACK || *end != '.' ) + return (char*)source; + + uint track = strtoul(end+1,&end,10); + slot += track; + if ( track < 1 || track > 9 || slot >= MAX_DISTRIBUTION_TRACK ) + return (char*)source; + + *res_slot = slot; + while ( *end == ' ' || *end == '\t' ) + end++; + return end; +} + +/////////////////////////////////////////////////////////////////////////////// + +void NormalizeSlotTranslation ( char *buf, uint bufsize, ccp name, + char ** p_first_para, char ** p_first_brack ) +{ + DASSERT(buf); + DASSERT(bufsize>10); + + if (!name) + name = ""; + + char *dest = buf, *buf_end = buf + bufsize - 4; + char *first_para = 0; + char *first_brack = 0; + + uint have_space = 0; + while ( *name && dest < buf_end ) + { + int ch = (uchar)*name++; + switch(ch) + { + case ' ': + case '_': + case '-': + case '+': + have_space++; + break; + + case '\'': + break; // ignore + + case '[': + if (!first_brack) + first_brack = dest; + goto bracket; + + case '(': + if (!first_para) + first_para = dest; + // fall through + + case '{': + bracket: + ch = '('; + // fall through + + case '.': + if (have_space) + { + have_space = 0; + *dest++ = ' '; + } + *dest++ = ch; + break; + + case '}': + case ')': + case ']': + *dest++ = ')'; + break; + + default: + ch = tolower(ch); + if ( ch >= 'a' && ch <= 'z' || ch >= '0' && ch <= '9' ) + { + if (have_space) + { + have_space = 0; + *dest++ = ' '; + } + *dest++ = ch; + } + break; + } + } + + if ( dest > buf ) + { + if ( dest > buf+4 && !memcmp(dest-4,".szs",4) || !memcmp(dest-4,".wbz",4) ) + dest -= 4; + if ( dest > buf+2 && !memcmp(dest-2,"_d",2) ) + dest -= 2; + *dest = 0; + + if ( first_brack) + { + if ( first_brack >= dest ) + first_brack = 0; + else + dest = first_brack; + } + + if ( first_para >= dest ) + first_para = 0; + } + else + first_para = first_brack = 0; + + if (p_first_para) + *p_first_para = first_para; + if (p_first_brack) + *p_first_brack = first_brack; +} + +/////////////////////////////////////////////////////////////////////////////// + +uint DefineSlotTranslation + ( ParamField_t *translate, bool is_arena, uint slot, ccp name ) +{ + DASSERT(translate); + if (!name) + return 0; + + if (is_arena) + { + if ( slot >= MAX_DISTRIBUTION_ARENA ) + slot = 0; + else + slot += DISTRIBUTION_ARENA_DELTA; + } + else + { + if ( slot >= MAX_DISTRIBUTION_TRACK ) + slot = 0; + } + + char buf[1000]; + char *first_para = 0, *first_brack = 0; + NormalizeSlotTranslation(buf,sizeof(buf),name,&first_para,&first_brack); + + uint count = 0; + if (*buf) + { + ReplaceParamField(translate,buf,false,slot,0); + count++; + + if (first_brack) + { + *first_brack = 0; + ReplaceParamField(translate,buf,false,slot,0); + count++; + } + + if (first_para) + { + *first_para = 0; + ReplaceParamField(translate,buf,false,slot,0); + count++; + } + } + + return count; +} + +/////////////////////////////////////////////////////////////////////////////// + +#undef EARLY_NUM_SLOT +#define EARLY_NUM_SLOT 1 + +int FindSlotByTranslation ( const ParamField_t *translate, ccp fname, ccp sha1 ) +{ + DASSERT(translate); + ccp slash = strrchr(fname,'/'); + if (slash) + fname = slash+1; + + #if EARLY_NUM_SLOT + uint slot; + ScanSlot(&slot,fname,false); + if (slot) + return slot; + #endif + + char buf[1000]; + + char *first_para = 0, *first_brack = 0; + NormalizeSlotTranslation(buf,sizeof(buf),fname,&first_para,&first_brack); + const ParamFieldItem_t *it = FindParamField(translate,buf); + if ( !it && first_brack ) + { + *first_brack = 0; + it = FindParamField(translate,buf); + } + + if ( !it && first_para ) + { + *first_para = 0; + it = FindParamField(translate,buf); + } + + if ( !it && sha1 ) + it = FindParamField(translate,sha1); + + + #if EARLY_NUM_SLOT + return it ? it->num : 0; + #else + if (it) + return it->num; + + uint slot; + ScanSlot(&slot,fname,false); + return slot; + #endif +} + +#undef EARLY_NUM_SLOT + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +void ScanSlotTranslation + ( ParamField_t *translate, le_distrib_t *ld, ccp fname, bool ignore ) +{ + DASSERT(translate); + DASSERT(fname); + PRINT(" - scan translation%s: %s\n", ld ? "+ld" : "", fname); + + szs_file_t szs; + InitializeSZS(&szs); + enumError err = LoadSZS(&szs,fname,true,ignore,true); + if (err) + return; + + + //--- support for special file formats + + switch((int)szs.fform_arch) + { + case FF_BMG: + if (verbose>1) + printf(" - scan translation [BMG]: %s\n",fname); + ResetSZS(&szs); + return; + } + + + //--- standard text file + + if ( verbose > 1 ) + printf("Scan translation%s[TEXT/%s]: %s\n", + ld ? "+ld" : "", + GetExtFF(szs.fform_file,szs.fform_arch), fname ); + else if ( verbose >= 0 ) + printf("Scan %s\n",fname); + + char *eol = (char*)szs.data; + char *end = eol + szs.size; + + for(;;) + { + while ( eol < end && (uchar)*eol <= ' ' ) + eol++; + if ( eol == end ) + break; + + char *src = eol; + while ( eol < end && *eol != 0 && *eol != '\r' && *eol != '\n' ) + eol++; + *eol = 0; + + if ( *src == '#' || *src == '!' ) + continue; + + + //--- manage parameters + + if ( *src == '@' ) + { + if (ld) + AddDistribParamLD(ld,src,eol); + continue; + } + + PRINT0("LINE: |%.*s|\n",(int)(eol-src),src); + + + //--- scan new sha1 list + + if (ScanSha1LineLD(ld,src,eol,false)) + continue; + + + //--- skip "()" | detect SHA1 checksum + + char *sha1 = 0; + if ( *src == '(' ) + { + while ( src < eol && *src != ')' ) + src++; + if ( src++ == eol ) + continue; + } + else + { + // detect sha1 checksum + + char *x = src; + while ( x < eol && isalnum((int)*x) ) + x++; + if ( x < eol && x - src == 40 ) + { + sha1 = src; + src = x; + } + } + + while ( src < eol && (uchar)*src <= ' ' ) + src++; + + const bool is_arena = *src == 'a' || *src == 'A'; + if (is_arena) + src++; + + if (!isdigit((int)*src)) + continue; + + uint slot; + src = ScanSlot(&slot,src,true); // ??? + if (!slot) + continue; + + char *tab = strrchr(src,'\t'); + if (tab) + src = tab; + while ( src < eol && (uchar)*src <= ' ' ) + src++; + + DefineSlotTranslation(translate,is_arena,slot,src); + if (sha1) + { + sha1[40] = 0; + DefineSlotTranslation(translate,is_arena,slot,sha1); + } + } + + ResetSZS(&szs); +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// misc /////////////// +/////////////////////////////////////////////////////////////////////////////// + +void ScanOptLeDefine ( ccp arg ) +{ + opt_le_define = arg; + if ( arg && *arg ) + AppendStringField(&le_define_list,arg,false); +} + +/////////////////////////////////////////////////////////////////////////////// + +ccp PrintLEFT ( le_flags_t flags ) +{ + char *buf = GetCircBuf(5); + buf[0] = flags & LETF_NEW ? 'N' : '-'; + buf[1] = flags & LETF_RND_HEAD ? 'H' : '-'; + buf[2] = flags & LETF_RND_GROUP ? 'G' : '-'; + buf[3] = flags & LETF_ALIAS ? 'A' : '-'; + buf[4] = 0; + return buf; +} + +/////////////////////////////////////////////////////////////////////////////// + +le_flags_t ScanLEFT ( ccp text ) +{ + le_flags_t res = 0; + if (text) + { + if ( strchr(text,'N') || strchr(text,'n') ) res |= LETF_NEW; + if ( strchr(text,'H') || strchr(text,'h') ) res |= LETF_RND_HEAD; + if ( strchr(text,'G') || strchr(text,'g') ) res |= LETF_RND_GROUP; + if ( strchr(text,'A') || strchr(text,'a') ) res |= LETF_ALIAS; + } + return res; +} + +/////////////////////////////////////////////////////////////////////////////// + +ccp GetNameLTS ( le_track_status_t lts ) +{ + switch(lts) + { + case LTS_INVALID: return "INVALID"; + case LTS_VALID: return "VALID"; + case LTS_FAIL: return "FAIL"; + case LTS_ACTIVE: return "ACTIVE"; + case LTS_FILL: return "FILL"; + case LTS_EXPORT: return "EXPORT"; + case LTS__N: break; + } + return 0; +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// END /////////////// +/////////////////////////////////////////////////////////////////////////////// + diff --git a/project/src/lib-ledis.h b/project/src/lib-ledis.h new file mode 100644 index 0000000..b39d629 --- /dev/null +++ b/project/src/lib-ledis.h @@ -0,0 +1,1059 @@ + +/*************************************************************************** + * _______ _______ _______ * + * | ___ |____ | ___ | * + * | | |_| / /| | |_| * + * | |_____ / / | |_____ * + * |_____ | / / |_____ | * + * _ | | / / _ | | * + * | |___| |/ /____| |___| | * + * |_______|_______|_______| * + * * + * Wiimms SZS Tools * + * https://szs.wiimm.de/ * + * * + *************************************************************************** + * * + * This file is part of the SZS project. * + * Visit https://szs.wiimm.de/ for project details and sources. * + * * + * Copyright (c) 2011-2022 by Dirk Clemens <wiimm@wiimm.de> * + * * + *************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * See file gpl-2.0.txt or http://www.gnu.org/licenses/gpl-2.0.txt * + * * + ***************************************************************************/ + +#ifndef SZS_LIB_LEDIS_H +#define SZS_LIB_LEDIS_H 1 + +#include "lib-std.h" +#include "lib-mkw.h" +#include "lib-ctcode.h" +#include "lib-lecode.h" + +#include "dclib-parser.h" + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// support options /////////////// +/////////////////////////////////////////////////////////////////////////////// + +// If 1, then enable the string list 'le_track_t::str_list' with some +// predifined string types. + +#define LE_STRING_LIST_ENABLED 1 + +//----------------------------------------------------------------------------- + +// If 1, then enable the string set 'le_track_t::str_set'. It supports any +// number of strings that can be accessed by '[name]'. + +#define LE_STRING_SET_ENABLED 1 + +//----------------------------------------------------------------------------- + +// LE-DEF can set track-type markers in vars to remember the track type. +// So [CUP-LIST] can be defined before [TRACK-LIST]. Anyway, because [TRACK-LIST] +// is scanned in pass-1 and [CUP-LIST] in pass-2 this can be always set to 0. + +#define LE_TYPE_MARKERS_ENABLED 0 + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// definitions /////////////// +/////////////////////////////////////////////////////////////////////////////// + +#define LE_DEFINE_MAGIC8 "#LE-DEF1" +#define LE_DEFINE_MAGIC8_NUM 0x234c452d44454631ull + +#define LE_DISTRIB_MAGIC8 "#LE-DIST" +#define LE_DISTRIB_MAGIC8_NUM 0x234c452d44495354ull + +#define LE_REFERENCE_MAGIC8 "#LE-REF1" +#define LE_REFERENCE_MAGIC8_NUM 0x234c452d52454631ull + +#define LE_STRINGS_MAGIC8 "#LE-STR1" +#define LE_STRINGS_MAGIC8_NUM 0x234c452d53545231ull + +#define LE_SHA1REF_MAGIC8 "#SHA1REF" +#define LE_SHA1REF_MAGIC8_NUM 0x2353484131524546ull + +#define LE_PREFIX_MAGIC8 "#PREFIX1" +#define LE_PREFIX_MAGIC8_NUM 0x2350524546495831ull + +#define LE_MAX_TRACKS (MKW_MAX_TRACK_SLOT+1) +#define LE_TRACK_STRING_MAX 500 + +//----------------------------------------------------------------------------- + +typedef u16 le_group_t; + +typedef struct le_track_t le_track_t; +typedef struct le_distrib_t le_distrib_t; +typedef struct raw_data_t raw_data_t; + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// global vars /////////////// +/////////////////////////////////////////////////////////////////////////////// + +extern ccp opt_create_dump; // NULL of filename +extern le_distrib_t ledis_dump; // data collector for 'opt_create_dump' +extern int ledis_dump_enabled; // -1:done, 0:disabled, 1:enabled + +extern ccp opt_le_define; // NULL or last defined filename +extern StringField_t le_define_list; // list with all filenames + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// enum le_track_type_t /////////////// +/////////////////////////////////////////////////////////////////////////////// +// [[le_track_type_t]] + +typedef enum le_track_type_t +{ + LTTY_NONE = 0x00, + LTTY_ARENA = 0x01, // true: is a battle arena + LTTY_TRACK = 0x02, // true: is a versus track + LTTY_RANDOM = 0x04, // true: is a LE-CODE random slot + LTTY__NEXT = 0x08, // next free bit +} +__attribute__ ((packed)) le_track_type_t; + +//----------------------------------------------------------------------------- + +static inline bool IsArenaLTTY ( le_track_type_t track_type ) + { return ( track_type & LTTY_ARENA ) > 0; } + +static inline bool IsTrackLTTY ( le_track_type_t track_type ) + { return ( track_type & LTTY_TRACK ) > 0; } + +static inline bool IsRandomLTTY ( le_track_type_t track_type ) + { return ( track_type & LTTY_RANDOM ) > 0; } + +ccp GetNameLTTY ( le_track_type_t track_type ); + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// enum le_track_status_t /////////////// +/////////////////////////////////////////////////////////////////////////////// +// [[le_track_status_t]] + +typedef enum le_track_status_t +{ + LTS_INVALID = 0, // record not initalized + LTS_VALID, // record initalized, but inactive + LTS_FAIL, // record initalized and inactive with any invalid settings + LTS_ACTIVE, // record initalized and active + LTS_FILL, // record initalized and active and used as fill-track + LTS_EXPORT, // record initalized and active and can be exported + LTS__N +} +__attribute__ ((packed)) le_track_status_t; + +ccp GetNameLTS ( le_track_status_t lts ); + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// enum le_track_text_t /////////////// +/////////////////////////////////////////////////////////////////////////////// +// [[le_track_text_t]] + +typedef enum le_track_text_t +{ + LTT_UNDEFINED = 0, // always NULL to support GetTextLEO() + LTT_SHA1, // access SHA1 checksum (standard) + LTT_SHA1_D, // access SHA1 checksum (_d file) + LTT_IDENT, // access identification (standard) + LTT_IDENT_D, // access identification (_d file) + LTT_FILE, // access file name + LTT_NAME, // access name + LTT_XNAME, // access xname + LTT_XNAME2, // access xname with fallback to name + + #if LE_STRING_LIST_ENABLED + // part of string-list, accesses by 'str_list[index-LTT__LIST_BEG]' + LTT_TEMP1, // temporary string + LTT_TEMP2, // temporary string + #endif + + #if LE_STRING_SET_ENABLED + LTT_STRSET, // access str_set[name] + #endif + + LTT__N, // number of modes + LTT__DEFAULT = LTT_NAME, + + #if LE_STRING_LIST_ENABLED + // pool range + LTT__LIST_BEG = LTT_TEMP1, + LTT__LIST_END = LTT_TEMP2+1, + LTT__LIST_SIZE = LTT__LIST_END - LTT__LIST_BEG, + #endif +} +le_track_text_t; + +//----------------------------------------------------------------------------- + +ccp GetUpperNameLTT ( le_track_text_t ltt ); // 'ltt' is masked by LEO_LTT_SELECTOR +ccp GetLowerNameLTT ( le_track_text_t ltt ); // 'ltt' is masked by LEO_LTT_SELECTOR + +// returns 0:unknown ltt, 1:std string, 2:_d string, 3:both +int GetDModeLTT ( le_track_text_t ltt ); + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// enum le_options_t /////////////// +/////////////////////////////////////////////////////////////////////////////// +// [[le_options_t]] + +typedef enum le_options_t +{ + //-- text selector + + LEO_LTT_SELECTOR = 0x000000f, // mask to store le_track_text_t selector + + + //-- BMG input source selector. If none is set then use all + + LEO_MKW1 = 0x0000010, // import track names from MKW set 1 (0x2454../0x24b8..) + LEO_MKW2 = 0x0000020, // import track names from MKW set 2 (0x2490../0x24cc..) + LEO_CTCODE = 0x0000040, // import track names from CT-CODE (0x4000..) + LEO_LECODE = 0x0000080, // import track names from LE-CODE (0x7000..) + LEO_MKW = LEO_MKW1 | LEO_MKW2, + LEO_M_BMG = LEO_MKW | LEO_CTCODE | LEO_LECODE, + + + //-- BMG input options + + LEO_IN_EMPTY = 0x0000100, // accept empty strings as valid + LEO_IN_MINUS = 0x0000200, // accept minus strings as valid + LEO_IN_ALL = LEO_IN_EMPTY | LEO_IN_MINUS, + + + //-- BMG operator + + LEO_INSERT = 0x0000400, // insert only new strings into the source. + LEO_REPLACE = 0x0000800, // replace only strings that are already defined. + LEO_OVERWRITE = 0x0000c00, // insert all valid strings + LEO_M_HOW = 0x0000c00, + + + //-- Output filter pairs. Only valid if exact 1 bit is set + + LEO_VERSUS = 0x0001000, // use racing tracks only (!lt->arena) + LEO_BATTLE = 0x0002000, // use battle arenas only (lt->arena) + LEO_M_ARENA = LEO_VERSUS | LEO_BATTLE, + + LEO_CUSTOM = 0x0004000, // use custom tracks only (!lt->original) + LEO_ORIGINAL = 0x0008000, // use original tracks only (lt->original) + LEO_M_ORIGINAL = LEO_CUSTOM | LEO_ORIGINAL, + + LEO_NO_D_FILES = 0x0010000, // suppred info about _d files + + LEO_M_OUTPUT = LEO_M_ARENA | LEO_M_ORIGINAL | LEO_NO_D_FILES, + + + //-- Output filter flags + + LEO_OUT_EMPTY = 0x0020000, // accept empty strings as valid + LEO_OUT_MINUS = 0x0040000, // accept minus strings as valid + LEO_OUT_ALL = LEO_OUT_EMPTY | LEO_OUT_MINUS, + + + //-- more options + + LEO_IN_LECODE = 0x0100000, // import lecode binary + LEO_BRIEF = 0x0200000, // suppress descriptions + + + //-- special signals + + LEO_HELP = 0x1000000, // print help and exit + + LEO_CUT_STD = 0x2000000, // cut for standard distribution. + LEO_CUT_CTCODE = 0x4000000, // cut for CT-CODE distribution. + LEO_M_CUT = LEO_CUT_STD | LEO_CUT_CTCODE, + + + //-- misc + + LEO__ALL = 0x7ffffff, + LEO__DEFAULT = LTT__DEFAULT | LEO_OVERWRITE, + LEO__SRC = LEO_LTT_SELECTOR | LEO_IN_ALL, + LEO__DEST = LEO_LTT_SELECTOR | LEO_OUT_ALL | LEO_M_OUTPUT | LEO_M_HOW, +} +le_options_t; + +//----------------------------------------------------------------------------- + +extern le_options_t defaultLEO; +le_options_t SetupDefaultLEO(void); + +le_options_t ScanLEO ( le_options_t current, ccp arg, ccp err_info ); + +bool IsInputNameValidLEO ( ccp name, le_options_t opt ); // LEO_IN_EMPTY|LEO_IN_MINUS +bool IsOutputNameValidLEO ( ccp name, le_options_t opt ); // LEO_OUT_EMPTY|LEO_OUT_MINUS + +// Options: LEO_M_HOW, LEO_IN_*, LEO_OUT_* +bool IsAssignmentAllowedLEO ( ccp cur_name, ccp new_name, le_options_t opt ); + +ccp GetTextLEO ( le_options_t opt ); +ccp GetInputFilterLEO ( le_options_t opt ); +ccp GetOutputFilterLEO ( le_options_t opt ); + +// Options: LEO_IN_*, LEO_M_BMG +bool GetBmgBySlotLEO + ( char *buf, uint bufsize, const bmg_t *bmg, int slot, le_options_t opt ); + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// struct le_strpar_t /////////////// +/////////////////////////////////////////////////////////////////////////////// +// [[le_strpar_t]] + +typedef struct le_strpar_t +{ + le_options_t opt; // string selector and options + + bool use_d; // true: use _d variant if available + bool allow_d; // true: allow _d pointers + bool use_sha1; // true: get use_sha1 as fallback for ident + bool csum_only; // true: set sha1 only, but not an ident string. + + #if LE_STRING_SET_ENABLED + ccp key; // NULL or key for LTT_STRSET, alloced, lower case + #endif +} +le_strpar_t; + +//----------------------------------------------------------------------------- + +extern const le_strpar_t NullLSP, DefaultLSP; + +static inline void InitializeLSP ( le_strpar_t *par, le_options_t opt ) + { DASSERT(par); memset(par,0,sizeof(*par)); par->opt = opt; } +void ResetLSP ( le_strpar_t *par ); + +static inline void SetOptionsLSP ( le_strpar_t *par, le_options_t opt ) + { if (par) par->opt = opt; } + +char * ScanLSP ( le_strpar_t *par, ccp arg, enumError *ret_err ); +ccp GetNameLSP ( const le_strpar_t *par ); +ccp GetOptionsLSP ( const le_strpar_t *par, le_options_t mask ); +enumError ScanOptionsLSP ( le_strpar_t *par, ccp arg, ccp err_info ); + +//----------------------------------------------------------------------------- + +#if LE_STRING_SET_ENABLED + + // key can be 'par->key' => don't change it + // if key_len < 0: use strlen(key) + void SetKeyNameLSP ( le_strpar_t *par, ccp key, int key_len ); + + static inline bool IsValidSetLSP ( const le_strpar_t *par ) + { return par && ( par->opt & LEO_LTT_SELECTOR ) == LTT_STRSET && par->key; } + +#endif + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// struct le_cup_t /////////////// +/////////////////////////////////////////////////////////////////////////////// +// [[le_cup_ref_t]] [[le_cup_t]] + +typedef s16 le_cup_ref_t; + +typedef struct le_cup_t +{ + le_cup_ref_t *list; // list with tracks => list[size][tracks] + uint used; // used cups of 'list' + uint size; // alloced cups of 'list' + uint max; // max pssible cups of 'list' + uint tracks; // number of tracks of each cup + + uint cur_cup; // current cup + uint cur_index; // current index + + int fill_slot; // -1 or fill slot + int fill_src; // -1 or source of fill slot + + bool dirty; // true: call UpdateCupsLD() to recalc cup-track relations + bool close_used; // true: CloseLECUP() (command NEW-CUP) used +} +le_cup_t; + +/////////////////////////////////////////////////////////////////////////////// + +void InitializeLECUP ( le_cup_t *lc, uint max_cups, uint tracks_per_cup ); +void ResetLECUP ( le_cup_t *lc ); + +le_cup_ref_t * GetLECUP ( const le_cup_t *lc, uint cup_index ); +le_cup_ref_t * DefineLECUP ( le_cup_t *lc, uint cup_index ); + +// return 0 or cup slot like 21 +uint GetCupSlotLECUP ( const le_cup_t *lc, const le_cup_ref_t *ptr ); + +void AppendLECUP ( le_cup_t *lc, le_cup_ref_t ref ); +void CloseLECUP ( le_cup_t *lc ); +void PackLECUP ( le_cup_t *lc ); +void EvenLECUP ( le_cup_t *lc ); +void FillLECUP ( le_cup_t *lc, le_cup_ref_t fallback ); +bool HaveInvalidLECUP ( le_cup_t *lc ); + +static inline le_track_type_t GetLttyLECUP ( const le_cup_t *lc ) + { return lc && lc->tracks == 5 ? LTTY_ARENA : LTTY_TRACK; } + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// struct le_track_id_t /////////////// +/////////////////////////////////////////////////////////////////////////////// +// [[le_track_id_t]] + +typedef struct le_track_id_t +{ + // keep it small! + + bool have_sha1; // true: 'sha1bin' is valid + bool orig_sha1; // true: 'sha1bin' is original (or normed) + sha1_hash_t sha1bin; // sha1 of track, created from ident + ccp ident; // NULL or identfication, fallback 'sha1bin' +} +le_track_id_t; + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// struct le_track_t /////////////// +/////////////////////////////////////////////////////////////////////////////// +// [[le_track_t]] + +typedef struct le_track_t +{ + // keep it small! + + u16 track_slot; // index of le_distrib_t, 0..MKW_MAX_TRACK_SLOT + u16 cup_slot; // 0 or 'cup * 10 + tidx' + + le_track_status_t track_status; // LTS_INVALID | LTS_VALID | LTS_ACTIVE | LTS_EXPORT + le_track_type_t track_type; // LTTY_NONE | LTTY_ARENA | LTTY_TRACK | LTTY_RANDOM + u8 is_original; // 0:is custom, 1:is original + u8 user_flags; // free usable flags + + le_property_t property; // property + le_music_t music; // music slot + le_flags_t flags; // flags + + le_track_id_t lti[2]; // index 0: normal, index 1:_d + ccp file; // NULL or filename of track + ccp name; // NULL or name of track + ccp xname; // NULL or extended name of track, fallback 'name' + + #if LE_STRING_LIST_ENABLED + ccp str_list[LTT__LIST_SIZE]; + // list of strings + #endif + + #if LE_STRING_SET_ENABLED + ParamField_t str_set; // set of strings, accessed by '[name]' + #endif +} +le_track_t; + +//----------------------------------------------------------------------------- + +void InitializeLT ( le_track_t *lt ); +void ClearStringsLT ( le_track_t *lt ); + +void ClearLT ( le_track_t *lt, le_track_type_t ltty ); // auto-ltty if 0 +void MoveLT ( le_track_t *dest, le_track_t *src ); +static inline void ResetLT ( le_track_t *lt ) { ClearLT(lt,0); } + +void SetupStandardArenaLT ( le_track_t *lt, uint setup_slot ); // slots 0..9 || 32..41 +void SetupStandardTrackLT ( le_track_t *lt, uint setup_slot ); // slots 0..31 +void SetupByTrackInfoLT ( le_track_t *lt, const TrackInfo_t *ti ); + +void SetupLecodeRandomTrackLT ( le_track_t *lt, uint setup_slot ); // slots 62..65 + +// -1:wrong slot or not a battle, 0:correct slots, +// 1:wrong property, 2:wrong music, 3:both wrong +int HaveUsualBattleSlots ( le_track_t *lt ); + +void ClearIdentLT ( le_track_t *lt ); + +//----------------------------------------------------------------------------- + +static inline bool IsActiveLT ( const le_track_t *lt ) + { return lt && lt->track_status >= LTS_ACTIVE; } + +static inline bool IsExportLT ( const le_track_t *lt ) + { return lt && lt->track_status >= LTS_EXPORT; } + +static inline bool IsVisibleLT ( const le_track_t *lt ) + { return lt && lt->track_status >= LTS_ACTIVE && !IsHiddenLETF(lt->flags); } + +//----------------------------------------------------------------------------- +// SetListLT(), SetText*LT(): use 'opt & LEO_LTT_SELECTOR' to select text +// recognized options: LEO_M_HOW | LEO_IN_* + +void SetIdentLT ( le_track_t *lt, const le_strpar_t *par, ccp ident ); // par: opt, use_d, csum_only +void SetFileLT ( le_track_t *lt, const le_strpar_t *par, ccp fname ); // par: opt +void SetNameLT ( le_track_t *lt, const le_strpar_t *par, ccp name ); // par: opt +void SetXNameLT ( le_track_t *lt, const le_strpar_t *par, ccp xname ); // par: opt +#if LE_STRING_LIST_ENABLED +void SetListLT ( le_track_t *lt, const le_strpar_t *par, ccp text ); // par: ltt, opt +#endif +#if LE_STRING_SET_ENABLED +void SetSetLT ( le_track_t *lt, const le_strpar_t *par, ccp text ); // par: ltt, key, opt +void SetByKeyLT ( le_track_t *lt, ccp key, ccp text ); +#endif +void SetTextLT ( le_track_t *lt, const le_strpar_t *par, ccp text ); // par: ltt, * + +//----------------------------------------------------------------------------- +// set with 'opt' + +void SetIdentOptLT ( le_track_t *lt, ccp ident, bool use_d, bool csum_only, le_options_t opt ); +void SetTextOptLT ( le_track_t *lt, ccp text, le_options_t opt ); + +//----------------------------------------------------------------------------- +// use 'opt & LEO_LTT_SELECTOR' to select text + +ccp * GetPtrLT ( const le_track_t *lt, const le_strpar_t *par ); +ccp * GetPtrOptLT ( const le_track_t *lt, le_options_t opt, bool allow_d ); + +ccp GetSha1LT ( const le_track_t *lt, bool use_d, ccp return_on_empty ); +ccp GetIdentLT ( const le_track_t *lt, bool use_d, bool use_sha1, ccp return_on_empty ); +ccp GetFileLT ( const le_track_t *lt, ccp return_on_empty ); +ccp GetNameLT ( const le_track_t *lt, ccp return_on_empty ); +ccp GetXNameLT ( const le_track_t *lt, ccp return_on_empty ); +ccp GetXName2LT ( const le_track_t *lt, ccp return_on_empty ); + +ccp GetTextLT ( const le_track_t *lt, const le_strpar_t *par, ccp return_on_empty ); +ccp GetTextOptLT ( const le_track_t *lt, le_options_t opt, ccp return_on_empty ); + +ccp QuoteSha1LT ( const le_track_t *lt, bool use_d, ccp return_on_empty ); +ccp QuoteIdentLT ( const le_track_t *lt, bool use_d, bool use_sha1, ccp return_on_empty ); +ccp QuoteFileLT ( const le_track_t *lt, ccp return_on_empty ); +ccp QuoteNameLT ( const le_track_t *lt, ccp return_on_empty ); +ccp QuoteXNameLT ( const le_track_t *lt, ccp return_on_empty ); +ccp QuoteXName2LT ( const le_track_t *lt, ccp return_on_empty ); + +ccp QuoteTextLT ( const le_track_t *lt, const le_strpar_t *par, ccp return_on_empty ); +ccp QuoteTextOptLT ( const le_track_t *lt, le_options_t opt, ccp return_on_empty ); + +//----------------------------------------------------------------------------- + +#if LE_STRING_LIST_ENABLED + + ccp GetListLT ( const le_track_t *lt, le_options_t opt, ccp return_on_empty ); + ccp QuoteListLT ( const le_track_t *lt, le_options_t opt, ccp return_on_empty ); + +#endif + +#if LE_STRING_SET_ENABLED + + ccp GetSetLT ( const le_track_t *lt, const le_strpar_t *par, ccp return_on_empty ); + ccp QuoteSetLT ( const le_track_t *lt, const le_strpar_t *par, ccp return_on_empty ); + +#endif + +//----------------------------------------------------------------------------- + +ccp GetSlotNameLT ( const le_track_t *lt ); + +ccp GetCupLT ( const le_track_t *lt, ccp return_on_empty ); +ccp GetCupAlignLT ( const le_track_t *lt ); + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// struct le_track_arch_t /////////////// +/////////////////////////////////////////////////////////////////////////////// +// [[le_track_arch_t]] + +typedef struct le_track_arch_t +{ + le_track_t lt; // usual track data + le_group_t group; // group id + + // all string alloced + + ccp name_order; // relevant name for order + ccp version; // version + + // order := attr_order plus_order name_order game_order + + s16 attr_order; // order by attribute, default=1000 + uint plus_order; // order by plus prefix + uint game_order; // order by game prefix +} +le_track_arch_t; + +//----------------------------------------------------------------------------- + +void ResetLTA ( le_track_arch_t *ta, bool reset_lt ); + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// enum le_auto_setup_t /////////////// +/////////////////////////////////////////////////////////////////////////////// +// [[le_auto_setup_t]] + +typedef enum le_auto_setup_t +{ + LAS_OFF = 0, + LAS_ARENA = LTTY_ARENA, // true: setup original battle arenas automatically + LAS_TRACK = LTTY_TRACK, // true: setup original versus tracks automatically + LAS_RANDOM = LTTY_RANDOM, // true: setup LE-CODE random slots automatically + LAS_DEFAULT = LAS_ARENA | LAS_TRACK | LAS_RANDOM, + + LAS_TEMPLATE = LTTY__NEXT // true: insert example tracks +} +__attribute__ ((packed)) le_auto_setup_t; + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// le_type_settings_t + le_settings_t /////////////// +/////////////////////////////////////////////////////////////////////////////// +// [[le_type_settings_t]] + +typedef struct le_type_settings_t +{ + bool orig_tracks; // true: tracks are original + bool add_unused; // true: add unused arenas/tracks +} +__attribute__ ((packed)) le_type_settings_t; + +/////////////////////////////////////////////////////////////////////////////// +// [[le_settings_t]] + +typedef struct le_settings_t +{ + bool valid; // true if scan or analysis done + le_type_settings_t bt; // battle settings + le_type_settings_t vs; // versus settings +} +le_settings_t; + +/////////////////////////////////////////////////////////////////////////////// +// [[le_group_info_t]] + +typedef struct le_group_info_t +{ + uint group; // group number + + u16 *list; // list of group members + uint used; // number of group members + uint size; // alloced elements of 'list' + + uint n_head; // number of head members + uint n_group; // number of grp members + uint head1; // first head member, valid if 'n_head>0' +} +le_group_info_t; + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// struct le_distrib_t /////////////// +/////////////////////////////////////////////////////////////////////////////// +// [[le_distrib_t]] + +typedef struct le_distrib_t +{ + //-- basic data + + bool is_initialized; // true: data is InitializeLD() + le_auto_setup_t auto_setup; // bit files (LAS_*) + le_strpar_t spar; // current string param, incl. default 'opt' + + le_track_t *tlist; // list of tracks + uint tlist_used; // used elements in 'tlist' + uint tlist_size; // alloced 'tlist' elements + + + //-- more data + + ParamField_t dis_param; // parameter list for FF_DISTRIB + le_lpar_t *lpar; // NULL or LPAR settings + le_cup_t cup_battle; // track list for battle cups + le_cup_t cup_versus; // track list for versus cups + mem_t lecode[LEREG__N]; // LE-CODE data + bool lecode_alloced[LEREG__N]; + // true, if 'lecode' is alloced + le_settings_t scan; // settings by ScanLeDefLD() + le_settings_t ana; // settings by AnalyzeLD() + + + //-- this is a reference list, setup by e.g. Sort*() + //-- the list is termianted by a NULL pointer. + + le_track_t **reflist; // reference list, terminated by NULL + uint reflist_used; // used elements in 'tlist' + uint reflist_size; // alloced 'tlist' elements + + //-- track archive + + le_track_arch_t *arch; // list of tracks + uint arch_used; // used elements in 'arch' + uint arch_size; // alloced 'tlist' elements + + exmem_list_t group; // group manager + + + //-- helper data + + ctcode_t *ctcode; // NULL or temporary file + + + //-- scan helpers + + bool is_pass2; // true on pass2 + bool second_ledef; // true: don't clear tracks and cups +} +le_distrib_t; + +//----------------------------------------------------------------------------- + +void InitializeLD ( le_distrib_t *ld ); +void ResetLD ( le_distrib_t *ld ); +void ResetTracksAndCupsLD ( le_distrib_t *ld ); +void AutoSetupLD ( le_distrib_t *ld, le_auto_setup_t auto_setup ); + +void AnalyzeLD ( le_distrib_t *ld, bool force_new_analysis ); + +void CutLD ( le_distrib_t *ld, le_options_t opt ); // opt=LEO_M_CUT +void ClearTracksLD ( le_distrib_t *ld, int from, int to ); + +void SetupLparLD ( le_distrib_t *ld, bool load_lpar ); + +//----------------------------------------------------------------------------- +// trackhelpers + +uint PackTracksLD ( const le_distrib_t *ld ); +void CheckTracksLD ( const le_distrib_t *ld ); + +le_track_t * GetTrackLD ( le_distrib_t *ld, int slot ); +le_track_t * DefineTrackLD ( le_distrib_t *ld, int slot, bool mark_export ); +le_track_t * DefineFreeTrackLD ( le_distrib_t *ld, le_track_type_t ltty, bool mark_export ); +le_track_t * DefineGroupTrackLD ( le_distrib_t *ld, le_track_type_t ltty, bool mark_export ); + +le_track_t * FindFillTrackLD ( le_distrib_t *ld, le_cup_t *lc, bool allow_candidate ); + +int FindFreeTracksLD ( le_distrib_t *ld, le_track_type_t ltty, int n ); +le_track_t * ReserveTracksLD ( le_distrib_t *ld, le_track_type_t ltty, int n, bool mark_export ); + +//----------------------------------------------------------------------------- +// cup helpers + +void ClearUserFlagsAndCupsLD ( le_distrib_t *ld ); +bool HaveWiimmCupLD ( const le_distrib_t *ld ); + +void DirtyCupLD ( le_distrib_t *ld, le_track_type_t ltty ); +void UpdateCupsLD ( le_distrib_t *ld ); + +bool PrintCupRefLD ( FILE *f, le_distrib_t *ld, le_cup_t *lc ); + +//----------------------------------------------------------------------------- +// manage archive [[track-arch]] + +void ResetArchLD ( le_distrib_t *ld ); +le_track_arch_t * GetNextArchLD ( le_distrib_t *ld ); +enumError AddToArchLD ( le_distrib_t *ld, raw_data_t *raw ); +bool CloseArchLD ( le_distrib_t *ld ); // return true on activity + +//----------------------------------------------------------------------------- + +typedef bool (*FilterFuncLD) ( const le_track_t *lt, le_options_t opt ); + +int SetupReferenceList ( le_distrib_t *ld, FilterFuncLD filter, le_options_t opt ); +int SortByCupLD ( le_distrib_t *ld, FilterFuncLD filter, le_options_t opt ); + +//----------------------------------------------------------------------------- + +void ScanDumpLD +( + le_distrib_t *ld, // valid structure + bool init_ld, // TRUE: initialze 'ld' + const void * data, // data to scan + uint data_size // size of 'data' +); + +void ScanDumpSTLD +( + le_distrib_t *ld, // valid structure + bool init_ld, // TRUE: initialze 'ld' + ScanText_t *st // initialized source +); + +//----------------------------------------------------------------------------- + +enumError ScanLeDefLD +( + le_distrib_t *ld, // valid structure + bool init_ld, // TRUE: initialze 'ld' + const void * data, // data to scan + uint data_size, // size of 'data' + ccp fname, // NULL or filename for error messages + CopyMode_t cm_fname // copy mode of 'fname' +); + +enumError ScanLeDefSTLD +( + le_distrib_t *ld, // valid structure + bool init_ld, // TRUE: initialze 'ld' + ScanText_t *st // initialized source +); + +//----------------------------------------------------------------------------- + +void ScanRefLD +( + le_distrib_t *ld, // valid structure + bool init_ld, // TRUE: initialze 'ld' + const void * data, // data to scan + uint data_size // size of 'data' +); + +void ScanRefSTLD +( + le_distrib_t *ld, // valid structure + bool init_ld, // TRUE: initialze 'ld' + ScanText_t *st // initialized source +); + +//----------------------------------------------------------------------------- + +void ScanStrLD +( + le_distrib_t *ld, // valid structure + bool init_ld, // TRUE: initialze 'ld' + const void * data, // data to scan + uint data_size // size of 'data' +); + +void ScanStrSTLD +( + le_distrib_t *ld, // valid structure + bool init_ld, // TRUE: initialze 'ld' + ScanText_t *st // initialized source +); + +//----------------------------------------------------------------------------- + +void ScanSha1LD +( + le_distrib_t *ld, // valid structure + bool init_ld, // TRUE: initialze 'ld' + const void * data, // data to scan + uint data_size // size of 'data' +); + +void ScanSha1STLD +( + le_distrib_t *ld, // valid structure + bool init_ld, // TRUE: initialze 'ld' + ScanText_t *st // initialized source +); + +bool ScanSha1LineLD +( + le_distrib_t *ld, // valid structure + ccp src, // NULL or start of line + ccp end, // end of line + bool ident_only // TRUE: SetIdent*LT() only +); + +//----------------------------------------------------------------------------- + +enumError ImportRawDataLD +( + le_distrib_t *ld, // destination + raw_data_t *raw // source +); + +enumError ImportFileLD +( + le_distrib_t *ld, // destination + ccp fname, // file name of source + bool use_wildcard, // true & file not exist: search files + bool support_options // support options (leading '+' and no slash ) +); + +void ImportOptionsLD ( le_distrib_t *ld ); + +void ImportLD ( le_distrib_t *ld, const le_distrib_t *src ); +void ImportLparLD ( le_distrib_t *ld, const le_lpar_t *lpar ); +void ImportAnaLD ( le_distrib_t *ld, const le_analyse_t *ana ); +void ImportCtcodeLD ( le_distrib_t *ld, const ctcode_t *ctcode ); +void ImportBmgLD ( le_distrib_t *ld, const bmg_t *bmg, const le_strpar_t *par ); + +//----------------------------------------------------------------------------- + +bool ExportAnaLD ( const le_distrib_t *ld, le_analyse_t *ana ); +bool ExportCtCodeLD ( const le_distrib_t *ld, ctcode_t *ctcode ); + +//----------------------------------------------------------------------------- +// create files + +enumError CreateDumpLD ( FILE *f, le_distrib_t *ld ); +enumError CreateRefLD ( FILE *f, le_distrib_t *ld, bool add_strings ); +enumError CreateStringsLD ( FILE *f, le_distrib_t *ld ); +enumError CreateNamesLD ( FILE *f, le_distrib_t *ld, bool use_xname ); +enumError CreateInfoLD ( FILE *f, le_distrib_t *ld, bool use_xname ); +enumError CreateSha1LD ( FILE *f, le_distrib_t *ld, bool use_xname, bool add_comments ); +enumError CreateCtDefLD ( FILE *f, le_distrib_t *ld ); +enumError CreateLeDefLD ( FILE *f, le_distrib_t *ld ); +enumError CreateLecodeLD ( FILE *f, le_distrib_t *ld, le_region_t region ); +enumError CreateLparLD ( FILE *f, le_distrib_t *ld, bool print_full ); +enumError CreateBmgLD ( FILE *f, le_distrib_t *ld, bool bmg_text ); + +enumError CreateLeInfoLD ( FILE *f, const le_distrib_t *ld, bool list_only ); +enumError CreateDebugLD ( FILE *f, const le_distrib_t *ld ); + +enumError CreateLecode4LD ( ccp fname, le_distrib_t *ld ); + +//----------------------------------------------------------------------------- +// special jobs + +enumError SubstLD ( le_distrib_t *ld, const le_strpar_t *dest, ccp arg ); +enumError CopyLD ( le_distrib_t *ld, const le_strpar_t *dest, + const le_strpar_t *src, int n_src ); + +enumError TransferFilesLD ( le_distrib_t *ld, bool logit, bool testmode ); + +//----------------------------------------------------------------------------- +// distribution support + +void UpdateDistribLD ( le_distrib_t *ld, bool overwrite ); +bool AddDistribParamLD ( le_distrib_t *ld, ccp src, ccp end ); + +enumError ImportDistribLD ( le_distrib_t *ld, cvp data, uint size ); +enumError ImportDistribSTLD ( le_distrib_t *ld, ScanText_t *st ); + +enumError CreateDistribLD ( FILE *f, le_distrib_t *ld, bool use_xname ); + +//----------------------------------------------------------------------------- +// lecode support + +void FreeLecodeLD ( le_distrib_t *ld, le_region_t reg ); +mem_t AssignLecodeLD ( le_distrib_t *ld, le_region_t reg, cvp data, uint size ); +mem_t GetLecodeLD ( const le_distrib_t *ld, le_region_t reg ); + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// ledis_dump support /////////////// +/////////////////////////////////////////////////////////////////////////////// + +int EnableLDUMP ( ccp filename ); +enumError CloseLDUMP(); + +void ImportAnaLDUMP ( const le_analyse_t *ana ); +void ImportCtcodeLDUMP ( const ctcode_t *ctcode ); + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// struct DistributionInfo_t /////////////// +/////////////////////////////////////////////////////////////////////////////// + +#define DISTRIB_MAGIC8 "#DISTRIB" +#define DISTRIB_MAGIC8_NUM 0x2344495354524942ull + +#define DISTRIBUTION_FILE_VERSION 1 +#define MIN_DISTRIBUTION_SLOT 10 // included +#define MAX_DISTRIBUTION_TRACK 10000 // excluded +#define MAX_DISTRIBUTION_ARENA 1000 // excluded +#define DISTRIBUTION_ARENA_DELTA 100000 + +#define DEFAULT_DISTIBUTION_FNAME "distribution.txt" + +//----------------------------------------------------------------------------- + +static inline bool IsValidDistribArena ( uint slot ) +{ + return slot == DISTRIBUTION_ARENA_DELTA + || slot >= DISTRIBUTION_ARENA_DELTA+MIN_DISTRIBUTION_SLOT + && slot < DISTRIBUTION_ARENA_DELTA+MAX_DISTRIBUTION_ARENA; +} + +static inline bool IsValidDistribTrack ( uint slot ) +{ + return !slot + || slot >= MIN_DISTRIBUTION_SLOT && slot < MAX_DISTRIBUTION_TRACK; +} + +static inline bool IsValidDistribSlot ( uint slot ) +{ + return !slot + || slot >= MIN_DISTRIBUTION_SLOT + && slot < MAX_DISTRIBUTION_TRACK + || slot == DISTRIBUTION_ARENA_DELTA + || slot >= DISTRIBUTION_ARENA_DELTA+MIN_DISTRIBUTION_SLOT + && slot < DISTRIBUTION_ARENA_DELTA+MAX_DISTRIBUTION_ARENA; +} + +//----------------------------------------------------------------------------- +// [[DistributionInfo_t]] + +typedef struct DistributionInfo_t +{ + le_distrib_t ld; + ParamField_t translate; + ParamField_t arena[MAX_DISTRIBUTION_ARENA]; + ParamField_t track[MAX_DISTRIBUTION_TRACK]; +} +DistributionInfo_t; + +//----------------------------------------------------------------------------- + +void InitializeDistributionInfo + ( DistributionInfo_t * dinf, bool add_default_param ); +void ResetDistributionInfo ( DistributionInfo_t *dinf ); +void AddParamDistributionInfo ( DistributionInfo_t * dinf, bool overwrite ); + +enumError ScanDistribFile + ( DistributionInfo_t *dinf, ccp fname, int ignore, bool assume_arena ); + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// slot translation /////////////// +/////////////////////////////////////////////////////////////////////////////// + +char * ScanSlot ( uint *res_slot, ccp source, bool need_point ); + +void NormalizeSlotTranslation ( char *buf, uint bufsize, ccp name, + char ** p_first_para, char ** p_first_brack ); + +uint DefineSlotTranslation + ( ParamField_t *translate, bool is_arena, uint slot, ccp name ); + +// 'sha1' can be NULL +int FindSlotByTranslation ( const ParamField_t *translate, ccp fname, ccp sha1 ); + +// 'param' not NULL: Scan "@PARAM = VALUE" lines and store result. +void ScanSlotTranslation + ( ParamField_t *translate, le_distrib_t *ld, ccp fname, bool ignore ); + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// misc /////////////// +/////////////////////////////////////////////////////////////////////////////// + +void ScanOptLeDefine ( ccp arg ); + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// END /////////////// +/////////////////////////////////////////////////////////////////////////////// + +#endif // SZS_LIB_LEDIS_H + diff --git a/project/src/lib-lex.c b/project/src/lib-lex.c index 5640674..eb992d9 100644 --- a/project/src/lib-lex.c +++ b/project/src/lib-lex.c @@ -1542,8 +1542,8 @@ enumError ScanLEXFunc default: AppendElementLEX(lex,magic,data,size,true); #if HAVE_PRINT0 - if (logging>1) - DumpElementsLEX(stdout,lex,logging>2); + if ( logging >= 2 ) + DumpElementsLEX(stdout, lex, logging >= 3 ); #endif } return ERR_OK; @@ -1582,8 +1582,8 @@ enumError ScanRawLEX else UpdateLEX(lex,opt_complete,false); - if (logging>0) - DumpElementsLEX(stdout,lex,logging>2); + if ( logging >= 1 ) + DumpElementsLEX( stdout, lex, logging >= 3 ); return err; } diff --git a/project/src/lib-mdl.c b/project/src/lib-mdl.c index 7b3650f..9f11950 100644 --- a/project/src/lib-mdl.c +++ b/project/src/lib-mdl.c @@ -4105,7 +4105,7 @@ ccp RenameForSlot42MDL } #ifdef TEST - //if ( logging > 1 && stdlog ) + //if ( logging >= 2 && stdlog ) { fprintf(stdlog, "\tRename %u MDL material%s:\n", diff --git a/project/src/lib-minigame.c b/project/src/lib-minigame.c index a9ae7a6..7cc3e84 100644 --- a/project/src/lib-minigame.c +++ b/project/src/lib-minigame.c @@ -540,7 +540,7 @@ enumError ScanTextMINIGAME break; default: - // ignore all other section without any warnings + // ignore all other sections without any warnings break; } diff --git a/project/src/lib-numeric.h b/project/src/lib-numeric.h index c52261b..b83658a 100644 --- a/project/src/lib-numeric.h +++ b/project/src/lib-numeric.h @@ -112,7 +112,17 @@ enum #define LETF_ALIAS 0x08 // use TrackByAliasLE(prop,music) // as alias for another track -#define LETF__ALL 0x0f +#define LETF__RND 0x06 // both random flags +#define LETF__ALL 0x0f // all bits of above + +static inline bool IsTitleLETF ( uint flags ) + { return (flags&(LETF_RND_HEAD|LETF_RND_GROUP)) == LETF_RND_HEAD; } + +static inline bool IsHiddenLETF ( uint flags ) + { return (flags&(LETF_RND_HEAD|LETF_RND_GROUP)) == LETF_RND_GROUP; } + +static inline bool IsRandomLETF ( uint flags ) + { return (flags&(LETF_RND_HEAD|LETF_RND_GROUP)) != 0; } //----------------------------------------------------------------------------- // [[lpar_mode_t]] @@ -1040,7 +1050,7 @@ enumError ParserCalc ( const VarMap_t * predef ); // /////////////////////////////////////////////////////////////////////////////// -/////////////// scan text /////////////// +/////////////// scan info /////////////// /////////////////////////////////////////////////////////////////////////////// // [[TextCommand_t]] @@ -1229,7 +1239,7 @@ typedef struct ScanInfo_t //--- init data ccp init_data; // begin of text - uint init_data_size; // end of text + uint init_data_size; // total size of text ccp init_name; // name or file for warnings int init_revision; // revision number at start @@ -1267,6 +1277,7 @@ typedef struct ScanInfo_t struct kmp_t * kmp; // for KMP scanning struct lex_t * lex; // for LEX scanning struct mdl_t * mdl; // for MDL scanning + struct le_distrib_t * ld; // for LEDEF scanning } ScanInfo_t; @@ -1767,6 +1778,17 @@ char NextCharSI //----------------------------------------------------------------------------- +bool IsSectionOrEotSI +( + // Call NextCharSI() and check for new section or EOT (return true if found) + // Section name is stored in 'last_index_name' (upper case) + + ScanInfo_t * si, // valid data + bool skip_lines // true: skip empty lines +); + +//----------------------------------------------------------------------------- + char SkipCharSI ( // return next non skipped character @@ -1793,6 +1815,13 @@ enumError CheckLevelSI //----------------------------------------------------------------------------- +ccp GetEolSI +( + ScanInfo_t * si // valid data +); + +//----------------------------------------------------------------------------- + void GotoEolSI ( ScanInfo_t * si // valid data @@ -1877,8 +1906,8 @@ uint ScanNameSI enumError ConcatStringsSI ( ScanInfo_t * si, // valid data - char ** dest_str, // store string here, use FREE + MALLOC - uint * len // not NULL: store length of return string here + char ** dest_str, // not NULL: store string here, use FREE + MALLOC + uint * ret_len // not NULL: store length of return string here ); //----------------------------------------------------------------------------- @@ -1891,10 +1920,10 @@ enumError ScanStringSI //----------------------------------------------------------------------------- -extern char last_index_name[VARNAME_SIZE+1]; - int ScanIndexSI ( + // varname is stored in 'last_index_name' (upper case) + ScanInfo_t * si, // valid data enumError * err, // return value: error code int index, // index to define if name @@ -1906,7 +1935,13 @@ int ScanIndexSI //----------------------------------------------------------------------------- -void SetIndexName ( ccp name ); +extern char last_index_name[VARNAME_SIZE+1]; + +static inline void SetIndexName ( ccp name ) + { StringUpperS(last_index_name,sizeof(last_index_name),name); } + +static inline void SetIndexNameM ( mem_t name ) + { MemUpperS(last_index_name,sizeof(last_index_name),name); } //----------------------------------------------------------------------------- diff --git a/project/src/lib-objflow.c b/project/src/lib-objflow.c index d7cb1cc..c01c25d 100644 --- a/project/src/lib-objflow.c +++ b/project/src/lib-objflow.c @@ -397,7 +397,7 @@ enumError ScanTextOBJFLOW break; default: - // ignore all other section without any warnings + // ignore all other sections without any warnings break; } diff --git a/project/src/lib-pack.c b/project/src/lib-pack.c index 9473108..d5d906b 100644 --- a/project/src/lib-pack.c +++ b/project/src/lib-pack.c @@ -166,7 +166,7 @@ enumError CreatePACK SortSubFilesSZS(szs,SORT_AUTO); - if ( logging > 1 ) + if ( logging >= 2 ) { printf("\nsorted file list:\n"); int i; diff --git a/project/src/lib-parser-func.c b/project/src/lib-parser-func.c index 6854619..1285694 100644 --- a/project/src/lib-parser-func.c +++ b/project/src/lib-parser-func.c @@ -74,6 +74,13 @@ void DefineParserVars ( VarMap_t * vm ) struct inttab_t { ccp name; int val; }; static const struct inttab_t inttab[] = { + { "NO", 0 }, + { "YES", 1 }, + { "OFF", 0 }, + { "ON", 1 }, + { "DISABLED", 0 }, + { "ENABLED", 1 }, + { "INT$MIN", INT_MIN }, { "INT$MAX", INT_MAX }, @@ -179,6 +186,7 @@ void DefineMkwVars ( VarMap_t * vm ) { "LE$F_NEW", LETF_NEW }, { "LE$F_HEAD", LETF_RND_HEAD }, { "LE$F_GROUP", LETF_RND_GROUP }, + { "LE$F_ALIAS", LETF_ALIAS }, { "LE$PRODUCTIVE", LPM_PRODUCTIVE }, { "LE$TESTING", LPM_TESTING }, diff --git a/project/src/lib-parser.c b/project/src/lib-parser.c index f375395..7271258 100644 --- a/project/src/lib-parser.c +++ b/project/src/lib-parser.c @@ -2216,6 +2216,51 @@ char NextCharSI /////////////////////////////////////////////////////////////////////////////// +bool IsSectionOrEotSI +( + // Call NextCharSI() and check for new section or EOT (return true if found) + // Section name is stored in 'last_index_name' (upper case) + + ScanInfo_t * si, // valid data + bool skip_lines // true: skip empty lines +) +{ + DASSERT(si); + + *last_index_name = 0; + char ch = NextCharSI(si,skip_lines); + if (!ch) + return true; + + if ( ch == '[' ) + { + ScanFile_t *sf = si->cur_file; + DASSERT(sf); + ccp beg = sf->ptr + 1; + ccp eol = beg; + while ( eol < sf->end && *eol != '\n' ) + eol++; + eol--; + while ( eol > beg && (uchar)*eol <= ' ' ) + eol--; + + if ( *eol == ']' ) + { + int len = eol - beg; + if ( len > 0 && !memchr(beg,'[',len) && !memchr(beg,']',len) ) + { + mem_t name = { .ptr = beg, .len = len }; + SetIndexNameM(name); + return true; + } + } + } + + return false; +} + +/////////////////////////////////////////////////////////////////////////////// + char SkipCharSI ( // return next non skipped character @@ -2372,6 +2417,25 @@ enumError CheckLevelSI /////////////////////////////////////////////////////////////////////////////// +ccp GetEolSI +( + ScanInfo_t * si // valid data +) +{ + DASSERT(si); + ScanFile_t *sf = si->cur_file; + DASSERT(sf); + + ccp ptr = sf->ptr, prev = sf->prev_ptr; + GotoEolSI(si); + ccp eol = sf->ptr; + sf->ptr = ptr; + sf->prev_ptr = prev; + return eol; +} + +/////////////////////////////////////////////////////////////////////////////// + void GotoEolSI ( ScanInfo_t * si // valid data @@ -2647,12 +2711,14 @@ uint ScanNameSI enumError ConcatStringsSI ( ScanInfo_t * si, // valid data - char ** dest_str, // store string here, use FREE + MALLOC + char ** dest_str, // not NULL: store string here, use FREE + MALLOC uint * ret_len // not NULL: store length of return string here ) { DASSERT(si); + //-- clear result + if (dest_str) { FreeString(*dest_str); @@ -2661,6 +2727,9 @@ enumError ConcatStringsSI if (ret_len) *ret_len = 0; + + //-- scan string + // [[var-string-]] support of dynamic buffer char buf[5000]; char *buf_end = buf + sizeof(buf) - 1; @@ -2711,6 +2780,8 @@ enumError ConcatStringsSI } } + //-- store result + const uint len = dest - buf; if (ret_len) *ret_len = len; @@ -2781,10 +2852,10 @@ enumError ScanStringSI char last_index_name[VARNAME_SIZE+1] = {0}; -//----------------------------------------------------------------------------- - int ScanIndexSI ( + // varname is stored in 'last_index_name' (upper case) + ScanInfo_t * si, // valid data enumError * err, // return value: error code int index, // index to define if name @@ -2805,6 +2876,7 @@ int ScanIndexSI char ch = NextCharSI(si,false); if (IsNum(ch,0)) { + *last_index_name = 0; u32 num; *err = ScanU32SI(si,&num,1,0); if (il) @@ -2872,16 +2944,18 @@ int ScanIndexSI //----------------------------------------------------------------------------- +#if 0 // [[2do]] [[obsolete]] void SetIndexName ( ccp name ) { if (!name) name = ""; char *dest = last_index_name; - char *end = dest + sizeof(last_index_name) -1 ; - while ( dest < end && *name ) + char *endbuf = dest + sizeof(last_index_name) -1 ; + while ( dest < endbuf && *name ) *dest++ = toupper((int)*name++); *dest = 0; } +#endif //----------------------------------------------------------------------------- diff --git a/project/src/lib-pat.c b/project/src/lib-pat.c index 535c8d7..55a66be 100644 --- a/project/src/lib-pat.c +++ b/project/src/lib-pat.c @@ -1466,7 +1466,7 @@ enumError ScanTextPAT break; default: - // ignore all other section without any warnings + // ignore all other sections without any warnings break; } diff --git a/project/src/lib-staticr.c b/project/src/lib-staticr.c index eef7e60..2cd338a 100644 --- a/project/src/lib-staticr.c +++ b/project/src/lib-staticr.c @@ -2574,12 +2574,12 @@ ct_dol_ext_t ct_dol_ext_kor = { 0x802a5000, { "rmck/boot_code.bin;boot_code.bin", - 0, 0, // [[2do]] [[ct-korea]] + 0, 0, // [[ct-korea]] FF_CT0_CODE }, 0x80002800, { "rmck/boot_data.bin;boot_data.bin", - 0, 0, // [[2do]] [[ct-korea]] + 0, 0, // [[ct-korea]] FF_CT0_DATA }, }; @@ -2904,7 +2904,7 @@ const addr_port_t * GetPortingRecord ( str_mode_t mode, u32 addr ) } const addr_port_t *p = base[beg]; - PRINT1("%u/%u: %08x + %06x + %06x, %08x\n", + PRINT0("%u/%u: %08x + %06x + %06x, %08x\n", beg, addr_port_records, p->addr[region], p->size1, p->size2, (p[1]).addr[region] ); @@ -4841,7 +4841,7 @@ static bool CleanDol ( staticr_t * str ) // return TRUE if dol data modified. uint sect_list; dol_header_t *dol_head = (dol_header_t*)str->data; - uint new_size = RemoveDolSections(dol_head,0x7f83,§_list,logging>2?stdlog:0); + uint new_size = RemoveDolSections(dol_head,0x7f83,§_list,logging>=3?stdlog:0); bool stat = new_size > 0; noPRINT("SIZE: %x -> %x / sect=%x\n",str->data_size,new_size,sect_list); if (stat) @@ -4963,7 +4963,8 @@ static void InititializeGCT() wcode_job.grow_size = 0x0100; wcode_data.grow_size = 0x0400; - if (logging>2) TraceGCT("Init"); + if ( logging >= 3 ) + TraceGCT("Init"); } } @@ -5268,7 +5269,7 @@ static enumError SetupCodeLoader + code_size - cheat_offset; #if defined(TEST) || defined(DEBUG) // || HAVE_WIIMM_EXT - if (logging>2) + if ( logging >= 3 ) fprintf(stderr, "SetupCodeLoader() %d+%d+%d = %d, c-off=0x%x, ch-type=%d, seg=%d => %s\n", code_size, wcode_job.used, wcode_data.used, total_data_size, @@ -5919,7 +5920,8 @@ static enumError AddWCode ( cvp data, uint size ) } } term: - if (logging>2) TraceGCT("WCode"); + if ( logging >= 3 ) + TraceGCT("WCode"); return ERR_OK; } @@ -5984,7 +5986,7 @@ static enumError AddCheatCode InsertGrowBuffer(&gecko_data,mgr->data,mgr->size); u64 magic = hton64(GCT_MAGIC8_NUM); InsertGrowBuffer(&gecko_data,&magic,sizeof(magic)); - if (logging>2) + if ( logging >= 3 ) TraceGCT("Setup"); } @@ -6189,7 +6191,7 @@ static uint AddSectionsDOL if ( gecko_data.used ) { - if (logging>0) + if ( logging >= 1 ) fprintf(stdlog,">> GCT DATA/GROW, %u = 0x%x bytes\n", gecko_data.used, gecko_data.used ); @@ -6203,7 +6205,7 @@ static uint AddSectionsDOL InsertGrowBuffer(&gecko_data,&term,sizeof(term)); count += AddSectionGCH(str,gecko_data.ptr,gecko_data.used,"GCT",false); - if ( verbose > 1 || logging > 1 ) + if ( verbose > 1 || logging >= 2 ) { fputs("\n Memory map of code handler and GCT files:\n",stdlog); PrintMemMap(&gct_data_mem,stdlog,5,"part"); diff --git a/project/src/lib-std.c b/project/src/lib-std.c index 3200eb4..1059810 100644 --- a/project/src/lib-std.c +++ b/project/src/lib-std.c @@ -75,11 +75,13 @@ /////////////////////////////////////////////////////////////////////////////// ccp opt_config = 0; +bool opt_no_pager = false; ccp tool_name = "?"; ccp std_share_path = 0; ccp share_path = 0; volatile int verbose = 0; volatile int logging = 0; +volatile int log_timing = 0; bool allow_all = false; char escape_char = '%'; bool use_utf8 = true; @@ -368,6 +370,7 @@ void SetupColors() void SetupLib ( int argc, char ** argv, ccp tname, ccp tvers, ccp ttitle ) { SetupProgname(argc,argv,tname,tvers,ttitle); + ProgInfo.error_level = ERRLEV_HEADING; #if LOG_PROGINFO PRINT1("PROG1: %s | %s | %s\n",ProgInfo.progname,ProgInfo.progdir,ProgInfo.progpath); @@ -412,284 +415,6 @@ void SetupLib ( int argc, char ** argv, ccp tname, ccp tvers, ccp ttitle ) TRACE("BIG_ENDIAN=%d\n",BIG_ENDIAN); #endif - // numeric types - - TRACE("- int\n"); - TRACE_SIZEOF(bool); - TRACE_SIZEOF(short); - TRACE_SIZEOF(int); - TRACE_SIZEOF(long); - TRACE_SIZEOF(long long); - TRACE_SIZEOF(size_t); - TRACE_SIZEOF(off_t); - - TRACE_SIZEOF(int8_t); - TRACE_SIZEOF(int16_t); - TRACE_SIZEOF(int32_t); - TRACE_SIZEOF(int64_t); - TRACE_SIZEOF(uint8_t); - TRACE_SIZEOF(uint16_t); - TRACE_SIZEOF(uint32_t); - TRACE_SIZEOF(uint64_t); - - TRACE_SIZEOF(u8); - TRACE_SIZEOF(u16); - TRACE_SIZEOF(u32); - TRACE_SIZEOF(u64); - TRACE_SIZEOF(s8); - TRACE_SIZEOF(s16); - TRACE_SIZEOF(s32); - TRACE_SIZEOF(s64); - TRACE_SIZEOF(be16_t); - TRACE_SIZEOF(be32_t); - TRACE_SIZEOF(be64_t); - - TRACE("- numeric vectors\n"); - TRACE_SIZEOF(float); - TRACE_SIZEOF(float32); - TRACE_SIZEOF(float3); - TRACE_SIZEOF(float3List_t); - - TRACE_SIZEOF(double); - TRACE_SIZEOF(double3); - TRACE_SIZEOF(double3List_t); - - TRACE_SIZEOF(float34); - TRACE_SIZEOF(double34); - TRACE_SIZEOF(MatrixD_t); - - TRACE("- mem\n"); - TRACE_SIZEOF(mem_t); - TRACE_SIZEOF(exmem_t); - TRACE_SIZEOF(exmem_key_t); - TRACE_SIZEOF(exmem_list_t); - - TRACE("- sha1\n"); - TRACE_SIZEOF(sha1_hash_t); - TRACE_SIZEOF(sha1_hex_t); - TRACE_SIZEOF(sha1_type_t); - TRACE_SIZEOF(sha1_db_t); - - TRACE("- arch\n"); - TRACE_SIZEOF(yaz0_header_t); - TRACE_SIZEOF(wbz_header_t); - TRACE_SIZEOF(szs_subfile_t); - TRACE_SIZEOF(szs_subfile_list_t); - TRACE_SIZEOF(szs_file_t); - TRACE_SIZEOF(szs_extract_t); - TRACE_SIZEOF(szs_iterator_t); - TRACE_SIZEOF(string_pool_t); - TRACE_SIZEOF(u8_header_t); - TRACE_SIZEOF(u8_node_t); - TRACE_SIZEOF(pack_header_t); - TRACE_SIZEOF(pack_metric_t); - TRACE_SIZEOF(rarc_file_header_t); - TRACE_SIZEOF(rarc_header_t); - TRACE_SIZEOF(rarc_node_t); - TRACE_SIZEOF(rarc_entry_t); - - TRACE("- sub file system\n"); - TRACE_SIZEOF(SubDirList_t); - TRACE_SIZEOF(SubDir_t); - TRACE_SIZEOF(SubFileList_t); - TRACE_SIZEOF(SubFile_t); - - TRACE("- brres\n"); - TRACE_SIZEOF(brres_t); - TRACE_SIZEOF(brres_header_t); - TRACE_SIZEOF(brres_root_t); - TRACE_SIZEOF(brres_group_t); - TRACE_SIZEOF(brres_entry_t); - TRACE_SIZEOF(brsub_header_t); - TRACE_SIZEOF(brsub_list_t); - TRACE_SIZEOF(brsub_cut_t); - TRACE_SIZEOF(grp_entry_t); - TRACE_SIZEOF(tex_info_t); - - TRACE("- breff\n"); - TRACE_SIZEOF(breff_item_data_t); - TRACE_SIZEOF(breff_item_list_t); - TRACE_SIZEOF(breff_item_name_t); - TRACE_SIZEOF(breff_root_t); - TRACE_SIZEOF(breff_root_head_t); - TRACE_SIZEOF(breft_image_t); - - TRACE("- bmg\n"); - TRACE_SIZEOF(bmg_header_t); - TRACE_SIZEOF(bmg_section_t); - TRACE_SIZEOF(bmg_inf_t); - TRACE_SIZEOF(bmg_inf_item_t); - TRACE_SIZEOF(bmg_dat_t); - TRACE_SIZEOF(bmg_mid_t); - TRACE_SIZEOF(bmg_flw_t); - TRACE_SIZEOF(bmg_fli_t); - TRACE_SIZEOF(bmg_t); - TRACE_SIZEOF(bmg_item_t); - - TRACE("- ctcode\n"); - TRACE_SIZEOF(ctcode_header_t); - TRACE_SIZEOF(ctcode_sect_info_t); - TRACE_SIZEOF(ctcode_cup1_head_t); - TRACE_SIZEOF(ctcode_cup1_data_t); - TRACE_SIZEOF(ctcode_crs1_head_t); - TRACE_SIZEOF(ctcode_crs1_data_t); - TRACE_SIZEOF(ctcode_t); - - TRACE("- kcl\n"); - TRACE_SIZEOF(kcl_mode_t); - TRACE_SIZEOF(kcl_t); - TRACE_SIZEOF(kcl_head_t); - TRACE_SIZEOF(kcl_triangle_t); - TRACE_SIZEOF(kcl_tridata_status_t); - TRACE_SIZEOF(kcl_tridata_flt_t); - TRACE_SIZEOF(kcl_tridata_dbl_t); - TRACE_SIZEOF(kcl_tridata0_t); - TRACE_SIZEOF(kcl_tridata1_t); - TRACE_SIZEOF(kcl_tridata_t); - TRACE_SIZEOF(kcl_tri_param_t); - TRACE_SIZEOF(kcl_cube_t); - TRACE_SIZEOF(kcl_tri_t); - - TRACE("- kmp\n"); - TRACE_SIZEOF(kmp_t); - TRACE_SIZEOF(kmp_ph_t); - TRACE_SIZEOF(kmp_flag_t); - TRACE_SIZEOF(kmp_file_mkw_t); - TRACE_SIZEOF(kmp_gopt_t); - TRACE_SIZEOF(kmp_gopt2_t); - TRACE_SIZEOF(kmp_group_t); - TRACE_SIZEOF(kmp_group_list_t); - TRACE_SIZEOF(kmp_group_name_t); - TRACE_SIZEOF(kmp_rtobj_t); - TRACE_SIZEOF(kmp_rtobj_list_t); - TRACE_SIZEOF(kmp_linfo_mode); - TRACE_SIZEOF(kmp_linfo_t); - - TRACE_SIZEOF(kmp_area_entry_t); - TRACE_SIZEOF(kmp_came_entry_t); - TRACE_SIZEOF(kmp_ckph_entry_t); - TRACE_SIZEOF(kmp_ckpt_entry_t); - TRACE_SIZEOF(kmp_cnpt_entry_t); - TRACE_SIZEOF(kmp_enph_entry_t); - TRACE_SIZEOF(kmp_enpt_entry_t); - TRACE_SIZEOF(kmp_gobj_entry_t); - TRACE_SIZEOF(kmp_itph_entry_t); - TRACE_SIZEOF(kmp_itpt_entry_t); - TRACE_SIZEOF(kmp_jgpt_entry_t); - TRACE_SIZEOF(kmp_ktpt_entry_t); - TRACE_SIZEOF(kmp_mspt_entry_t); - TRACE_SIZEOF(kmp_poti_group_t); - TRACE_SIZEOF(kmp_poti_point_t); - TRACE_SIZEOF(kmp_stgi_entry_t); - - TRACE_SIZEOF(pos_param_t); - TRACE_SIZEOF(pos_file_t); - - TRACE("- mdl\n"); - TRACE_SIZEOF(mdl_t); - TRACE_SIZEOF(mdl_head_t); - TRACE_SIZEOF(mdl_sect0_t); - TRACE_SIZEOF(mdl_sect1_t); - TRACE_SIZEOF(mdl_sect2_t); - TRACE_SIZEOF(mdl_sect8_t); - TRACE_SIZEOF(mdl_sect8_layer_t); - TRACE_SIZEOF(mdl_sect10_t); - TRACE_SIZEOF(mdl_minimap_t); - - TRACE("- pat\n"); - TRACE_SIZEOF(pat_t); - TRACE_SIZEOF(pat_element_t); - TRACE_SIZEOF(pat_analyse_t); - TRACE_SIZEOF(pat_head_t); - TRACE_SIZEOF(pat_s0_bhead_t); - TRACE_SIZEOF(pat_s0_belem_t); - TRACE_SIZEOF(pat_s0_sref_t); - TRACE_SIZEOF(pat_s0_shead_t); - TRACE_SIZEOF(pat_s0_selem_t); - - TRACE("- static rel\n"); - TRACE_SIZEOF(rel_header_t); - TRACE_SIZEOF(rel_sect_info_t); - TRACE_SIZEOF(rel_imp_t); - TRACE_SIZEOF(rel_data_t); - TRACE_SIZEOF(rel_type_t); - - TRACE("- tpl, bti\n"); - TRACE_SIZEOF(tpl_header_t); - TRACE_SIZEOF(tpl_imgtab_t); - TRACE_SIZEOF(tpl_pal_header_t); - TRACE_SIZEOF(tpl_img_header_t); - TRACE_SIZEOF(bti_header_t); - - TRACE("- common.szs\n"); - TRACE_SIZEOF(geohit_bin_t); - TRACE_SIZEOF(geohit_t); - TRACE_SIZEOF(itemslot_bin_t); - TRACE_SIZEOF(itemslot_t); - TRACE_SIZEOF(minigame_kmg_head_t); - TRACE_SIZEOF(minigame_kmg_t); - - TRACE("---\n"); - TRACE_SIZEOF(Color_t); - TRACE_SIZEOF(KeywordTab_t); - TRACE_SIZEOF(Container_t); - TRACE_SIZEOF(ContainerData_t); - TRACE_SIZEOF(DataContainer_t); - TRACE_SIZEOF(File_t); - TRACE_SIZEOF(FileAttrib_t); - TRACE_SIZEOF(FormatField_t); - TRACE_SIZEOF(FormatFieldItem_t); - TRACE_SIZEOF(FuncInfo_t); - TRACE_SIZEOF(FuncParam_t); - TRACE_SIZEOF(Image_t); - TRACE_SIZEOF(ImageGeometry_t); - TRACE_SIZEOF(iobuf); - TRACE_SIZEOF(List_t); - TRACE_SIZEOF(MemItem_t); - TRACE_SIZEOF(ParamList_t); - TRACE_SIZEOF(PatchImage_t); - TRACE_SIZEOF(ScanFile_t); - TRACE_SIZEOF(ScanInfo_t); - TRACE_SIZEOF(ScanLoop_t); - TRACE_SIZEOF(ScanMacro_t); - TRACE_SIZEOF(ScanParamMode); - TRACE_SIZEOF(ScanParam_t); - TRACE_SIZEOF(SetupDef_t); - TRACE_SIZEOF(ListDef_t); - TRACE_SIZEOF(SetupParam_t); - TRACE_SIZEOF(StringField_t); - TRACE_SIZEOF(SubstString_t); - TRACE_SIZEOF(TrackInfo_t); - TRACE_SIZEOF(VarMode_t); - TRACE_SIZEOF(IntMode_t); - TRACE_SIZEOF(Var_t); - TRACE_SIZEOF(VarMap_t); - - TRACE("- DbFile\n"); - TRACE_SIZEOF(DbFile_t); - TRACE_SIZEOF(DbFile); - TRACE_SIZEOF(UsedFile_t); - TRACE_SIZEOF(DbFileSZS_t); - TRACE_SIZEOF(DbFileSZS); - TRACE_SIZEOF(DbFileRefSZS); - TRACE_SIZEOF(UsedFileSZS_t); - TRACE_SIZEOF(DbFileSHA1_t); - TRACE_SIZEOF(DbFileSHA1); - TRACE_SIZEOF(DbFileRefSHA1); - TRACE_SIZEOF(UsedFileSHA1_t); - TRACE_SIZEOF(DbFileFILE_t); - TRACE_SIZEOF(DbFileFILE); - TRACE_SIZEOF(DbFileRefFILE); - TRACE_SIZEOF(UsedFileFILE_t); - TRACE_SIZEOF(DbFileGROUP_t); - TRACE_SIZEOF(DbFileGROUP); - TRACE_SIZEOF(DbFileRefGROUP); - TRACE_SIZEOF(UsedFileGROUP_t); - - TRACE("- DbObject\n"); - TRACE_SIZEOF(ObjectInfo); - TRACE_SIZEOF(UsedObject_t); - // assertions TRACE("-\n"); @@ -717,7 +442,8 @@ void SetupLib ( int argc, char ** argv, ccp tname, ccp tvers, ccp ttitle ) TRACE("-\n"); - //----- some assertion + + //----- more assertions #if HAVE_ASSERT { @@ -741,6 +467,7 @@ void SetupLib ( int argc, char ** argv, ccp tname, ccp tvers, ccp ttitle ) } #endif + //----- initialize data structures InitializeParamField(&patch_bmg_list); @@ -769,6 +496,7 @@ void SetupLib ( int argc, char ** argv, ccp tname, ccp tvers, ccp ttitle ) #endif } + //--- misc SetupStandardSZS(); @@ -787,6 +515,8 @@ void NormalizeOptions ) { SetupColors(); + ProgInfo.error_level = logging > 0 ? ERRLEV_EXTENDED : ERRLEV_HEADING; + //--- load configuration @@ -795,6 +525,12 @@ void NormalizeOptions share_path = config->share_path; + //--- logging & log_timing + + if ( logging >= 3 && !log_timing ) + log_timing++; + + //--- diff, delta and minimize minimize_level = delta_count < 9 ? delta_count : 9; @@ -964,8 +700,9 @@ ccp LibGetErrorText ( int stat, ccp ret_not_found ) void SetupPager() { - if (isatty(fileno(stdout))) + if ( !opt_no_pager && isatty(fileno(stdout)) ) { + fflush(stdout); opt_colorize = 1; SetupColors(); StdoutToPager(); @@ -3938,6 +3675,7 @@ void cmd_version_section if ( verbose > 0 ) printf( + "\n" #ifdef _POSIX_C_SOURCE "posix_c_source=%s\n" #endif @@ -4101,9 +3839,52 @@ enumError cmd_argtest ( int argc, char ** argv ) { printf("ARGUMENT TEST: %u arguments:\n",argc); - int idx; - for ( idx = 0; idx < argc; idx++ ) - printf("%4u.: |%s|\n",idx,argv[idx]); + for ( int idx = 0; idx < argc; idx++ ) + printf("%4u: |%s|\n",idx,argv[idx]); + return ERR_OK; +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// command expand /////////////// +/////////////////////////////////////////////////////////////////////////////// + +static enumError path_found ( mem_t path, uint st_mode, void * param ) +{ + printf(" > %s%s\n", path.ptr, S_ISDIR(st_mode) ? "/" : "" ); + return ERR_OK; +} + +//----------------------------------------------------------------------------- + +enumError cmd_expand ( int argc, char ** argv ) +{ + SetupPager(); + printf("%sExpand %d Argument%s:%s\n", + colout->caption, + n_param, n_param == 1 ? "" : "s", + colout->reset ); + + bool allow_hidden = false; + for ( ParamList_t *param = first_param; param; param = param->next ) + { + if (!strcmp(param->arg,"/h")) + { + allow_hidden = false; + printf("%sIgnore hidden files.%s\n", colout->info, colout->reset ); + } + else if (!strcmp(param->arg,"+h")) + { + allow_hidden = true; + printf("%sSearch hidden files too.%s\n", colout->info, colout->reset ); + } + else + { + NORMALIZE_FILENAME_PARAM(param); + printf("%s%s%s\n", colout->hint, param->arg, colout->reset ); + SearchPaths(param->arg,0,allow_hidden,path_found,0); + } + } return ERR_OK; } @@ -4221,16 +4002,16 @@ enumError cmd_filetype() if ( long_count > 1 ) printf("\n" - "type decomp vers valid file name\n" - "%.*s\n", max_len + 29, Minus300 ); + "type decomp vers valid file name\n" + "%.*s\n", max_len + 31, Minus300 ); else if ( long_count ) printf("\n" - "type decomp vers file name\n" - "%.*s\n", max_len + 23, Minus300 ); + "type decomp vers file name\n" + "%.*s\n", max_len + 25, Minus300 ); else printf("\n" - "type file name\n" - "%.*s\n", max_len + 8, Minus300 ); + "type file name\n" + "%.*s\n", max_len + 9, Minus300 ); } ParamList_t *param; @@ -4339,14 +4120,14 @@ enumError cmd_filetype() else valid = IsValid(buf,written,fatt.size,0,fform2,param->arg); } - printf("%-6s %-6s %7s %-5s %s\n", + printf("%-7s %-7s %7s %-5s %s\n", stat1, stat2, vbuf, valid_text[valid], param->arg ); } else - printf("%-6s %-6s %7s %s\n",stat1,stat2,vbuf,param->arg); + printf("%-7s %-7s %7s %s\n",stat1,stat2,vbuf,param->arg); } else - printf("%-6s %s\n",stat1,param->arg); + printf("%-7s %s\n",stat1,param->arg); } } @@ -5199,7 +4980,7 @@ file_format_t RepairMagic if ( rep->mode == REPMD_ANALYZE && rep->magic_len ) { - if (logging>1) + if ( logging >= 2 ) fprintf(stderr,"REPAIR MAGIC: %s -> %s (%s) : %s\n", PrintID(data,rep->magic_len,0), PrintID(rep->magic,rep->magic_len,0), @@ -6619,7 +6400,7 @@ valid_t IsValidKCL //--- logging - if ( logging > 1 ) + if ( logging >= 2 ) { fprintf(stdlog,"\nMemory map of KCL sections: %s\n", fname ? fname : "" ); PrintMemMap(&mm,stdlog,3,"info"); diff --git a/project/src/lib-std.h b/project/src/lib-std.h index f5d042d..599a25c 100644 --- a/project/src/lib-std.h +++ b/project/src/lib-std.h @@ -2100,6 +2100,136 @@ ccp GetSha1Data ( cvp data, uint size ); // /////////////////////////////////////////////////////////////////////////////// +/////////////// mkw_prefix_flags_t /////////////// +/////////////////////////////////////////////////////////////////////////////// +// [[mkw_prefix_flags_t]] + +typedef enum mkw_prefix_flags_t +{ + MPF_NINTENDO = 0x01, // N: by Nintendo + MPF_MARIOKART = 0x02, // M: Mario Kaert series + MPF_PREFIX1 = 0x04, // 1: can be used as part 1 for a prefix pair + MPF_PREFIX2 = 0x08, // 2: can be used as part 2 for a prefix pair +} +__attribute__ ((packed)) mkw_prefix_flags_t; + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// mkw_prefix_t /////////////// +/////////////////////////////////////////////////////////////////////////////// +// [[mkw_prefix_t]] + +typedef struct mkw_prefix_t +{ + char prefix[8]; + ccp info; // if NULL: list terminator + mkw_prefix_flags_t flags; + u8 order; + u8 color; +} +mkw_prefix_t; + +/////////////////////////////////////////////////////////////////////////////// + +int ScanOptLoadPrefix ( ccp arg ); + +struct ScanText_t; +const mkw_prefix_t * ScanPrefixTable ( struct ScanText_t *st ); +const mkw_prefix_t * DefinePrefixTable ( cvp source, uint len ); +const mkw_prefix_t * GetPrefixTable(void); +const mkw_prefix_t * FindPrefix ( ccp pre, int pre_len, bool exact ); + +// if tab==0: Use GetPrefixTable() +enumError SavePrefixTable ( FILE *f, const mkw_prefix_t * tab ); +enumError SavePrefixTableFN ( ccp fname, const mkw_prefix_t * tab ); + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// split_filename_t /////////////// +/////////////////////////////////////////////////////////////////////////////// +// [[split_filename_t]] + +#define SUPPORT_SPLIT_SIGN 0 + +typedef struct split_filename_t +{ + mem_t source; // full source without leading directories + + //--- split source into 3 parts + + mem_t f_name; // name part + mem_t f_d; // empty or "_d" + mem_t f_ext; // file extention + + //--- split name into 3 parts + + mem_t norm; // normalized name, alloced + + mem_t plus; + #if SUPPORT_SPLIT_SIGN + mem_t sign; + #endif + mem_t boost; + mem_t game1; + mem_t game2; + mem_t game; + mem_t name; + mem_t extra; + mem_t version; + mem_t authors; + mem_t attribs; + + + //--- misc + + uint plus_order; + uint game_order; + uint game_color; + + ccp input; + bool input_alloced; +} +split_filename_t; + +//----------------------------------------------------------------------------- + +extern ccp opt_plus; + +static inline void InitializeSPF ( split_filename_t *spf ) + { DASSERT(spf); memset(spf,0,sizeof(*spf)); } + +void ResetSPF ( split_filename_t *spf ); +void AnalyseSPF +( + split_filename_t *spf, // valid pointet + bool init_spf, // true: InitializeSPF(), false: ResetSPF() + ccp source, // NULL or ponter to name + ccp src_end, // end of source. if 0 then use strlen() + CopyMode_t cpm, // copy mode for 'source' + ccp plus_mode // NULL or string of format '[max][','][chars]' +); + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// output_mode_t /////////////// +/////////////////////////////////////////////////////////////////////////////// +// [[output_mode_t]] + +typedef struct output_mode_t +{ + bool syntax; // true: print syntax infos + u8 mode; // 1:list, 2:ref, 3:full + bool cross_ref; // true: print cross reference infos + bool hex; // true: force hex out + bool lecode; // true: print LE-CODE specific data +} +output_mode_t; + +extern output_mode_t output_mode; +void InitializeOutputMode ( output_mode_t * outmode ); + +// +/////////////////////////////////////////////////////////////////////////////// /////////////// misc /////////////// /////////////////////////////////////////////////////////////////////////////// // [[IsArena_t]] @@ -2141,6 +2271,7 @@ void cmd_version_section enumError cmd_config(); enumError cmd_install(); enumError cmd_argtest ( int argc, char ** argv ); +enumError cmd_expand ( int argc, char ** argv ); enumError cmd_error(); enumError cmd_filetype(); enumError cmd_fileattrib(); @@ -2259,25 +2390,6 @@ static inline ccp PrintU16M1 ( u16 num ) // /////////////////////////////////////////////////////////////////////////////// -/////////////// output_mode_t /////////////// -/////////////////////////////////////////////////////////////////////////////// -// [[output_mode_t]] - -typedef struct output_mode_t -{ - bool syntax; // true: print syntax infos - u8 mode; // 1:list, 2:ref, 3:full - bool cross_ref; // true: print cross reference infos - bool hex; // true: force hex out - bool lecode; // true: print LE-CODE specific data -} -output_mode_t; - -extern output_mode_t output_mode; -void InitializeOutputMode ( output_mode_t * outmode ); - -// -/////////////////////////////////////////////////////////////////////////////// /////////////// apple only /////////////// /////////////////////////////////////////////////////////////////////////////// @@ -2301,12 +2413,14 @@ extern const u8 TestDataLEX[8*1]; /////////////////////////////////////////////////////////////////////////////// extern ccp opt_config; +extern bool opt_no_pager; extern ccp config_path; extern ccp tool_name; extern ccp std_share_path; extern ccp share_path; extern volatile int verbose; extern volatile int logging; +extern volatile int log_timing; extern bool allow_all; extern char escape_char; extern bool use_utf8; diff --git a/project/src/lib-szs-create.c b/project/src/lib-szs-create.c index 9463e5b..8d394b7 100644 --- a/project/src/lib-szs-create.c +++ b/project/src/lib-szs-create.c @@ -890,7 +890,7 @@ enumError CreateSZS //--- debugging - if ( logging > 1 ) + if ( logging >= 2 ) { int i; for ( i = 0; i < szs->subfile.used; i++ ) @@ -4884,7 +4884,7 @@ void AnalyseSZS ( analyse_szs_t *as, // result bool init_sa, // true: init 'as', false: reset 'as' - szs_file_t *szs, // SZS filre t analysze + szs_file_t *szs, // SZS file to analysze ccp fname // NULL or fname for slot analysis ) { diff --git a/project/src/lib-szs.c b/project/src/lib-szs.c index 7230c73..9fe30db 100644 --- a/project/src/lib-szs.c +++ b/project/src/lib-szs.c @@ -1218,7 +1218,7 @@ static enumError BackTrackYAZ ( yaz_compr_t *yaz, uint max_depth ) if ( max_depth > BACK_TRACK_MAX_DEPTH ) max_depth = BACK_TRACK_MAX_DEPTH; - if (logging) + if ( logging >= 1 ) { fprintf(stdlog,">>YAZ back tracking: depth=%u, max-depth=%u\n", max_depth, BACK_TRACK_MAX_DEPTH ); @@ -2483,7 +2483,7 @@ enumError CreateU8 //--- debugging - if ( logging > 0 ) + if ( logging >= 1 ) { printf("----- internal file list -----\n"); IterateFilesParSZS(szs,PrintFileSZS,0,false,true,0,0,SORT_NONE); diff --git a/project/src/lib-szs.h b/project/src/lib-szs.h index 8fd85bb..834b4e0 100644 --- a/project/src/lib-szs.h +++ b/project/src/lib-szs.h @@ -1384,8 +1384,8 @@ typedef struct raw_data_t DataContainer_t *old_container; // old data [[container]] support, init with NULL Container_t container; // container data - -} raw_data_t; +} +raw_data_t; /////////////////////////////////////////////////////////////////////////////// @@ -1461,7 +1461,7 @@ typedef struct analyse_szs_t sha1_hex_t sha1_vrcorn; // SHA1 of vrcorn sha1_hex_t sha1_minimap; // SHA1 of minimap - //--- slots of orgiginal tarcks: 0:none, 11.84:track 111..125:arena + //--- slots of orgiginal tracks: 0:none, 11.84:track 111..125:arena u8 sha1_kmp_slot; u8 sha1_kmp_norm_slot; @@ -1502,7 +1502,7 @@ void AnalyseSZS ( analyse_szs_t *as, // result bool init_sa, // true: init 'as', false: reset 'as' - szs_file_t *szs, // SZS filre t analysze + szs_file_t *szs, // SZS file to analysze ccp fname // NULL or fname for slot analysis ); diff --git a/project/src/lib-xbmg.c b/project/src/lib-xbmg.c index 5a82e46..0c46cc4 100644 --- a/project/src/lib-xbmg.c +++ b/project/src/lib-xbmg.c @@ -1287,7 +1287,7 @@ int ScanOptFilterBMG ( ccp arg ) memset( filter_message+a3, value, b3-a3 ); } - if ( logging > 1 ) + if ( logging >= 2 ) HexDump016(stderr,0,0,filter_message,MAX_FILTER_MSG); return 0; diff --git a/project/src/prefix.inc b/project/src/prefix.inc new file mode 100644 index 0000000..00ea477 --- /dev/null +++ b/project/src/prefix.inc @@ -0,0 +1,83 @@ + +static const u8 prefix_inc_bz2[] = +{ + // decompressed size: 0x9c1 = 2497 bytes + 0x00,0x00,0x09,0xc1, + + // bzipped data + 0x42,0x5a,0x68,0x39, 0x31,0x41,0x59,0x26, 0x53,0x59,0xb6,0xa4, 0x97,0xb5,0x00,0x00, + 0xe9,0xdf,0x80,0x00, 0x12,0x61,0xef,0x7f, 0xf0,0x3f,0xef,0xdf, 0xf0,0x3f,0xef,0xff, + 0xe4,0x50,0x04,0x3e, 0x64,0xe8,0x6b,0x76, 0xdd,0xbb,0x6d,0xb3, 0x93,0x98,0x68,0x85, + 0x3d,0x34,0xd1,0x3d, 0x13,0x43,0x04,0xda, 0xa3,0x4f,0x28,0xda, 0x69,0x0c,0x80,0x00, + 0x00,0xd0,0x34,0x25, 0x31,0xa6,0x4c,0x9a, 0x69,0xa9,0x18,0x01, 0x06,0x80,0x62,0x06, + 0x80,0xd0,0x68,0x01, 0xa0,0x9a,0x14,0xf4, 0x29,0x93,0xf4,0xd5, 0x07,0xa4,0xd0,0x34, + 0x68,0xd0,0x7a,0x80, 0x00,0x68,0x00,0x1c, 0xd3,0x13,0x26,0x4d, 0x18,0x4c,0x13,0x13, + 0x4c,0x02,0x60,0x10, 0xc1,0x18,0x11,0x80, 0x48,0x90,0x99,0x05, 0x32,0x30,0x8d,0x35, + 0x3d,0x02,0x81,0xb5, 0x06,0xd4,0x1b,0x21, 0x91,0xa9,0xed,0x0a, 0x1e,0xa3,0x04,0x83, + 0xd8,0x12,0x0f,0x4f, 0x8f,0x1f,0xcf,0x62, 0xf3,0xa7,0x6b,0xfb, 0x7b,0x6f,0x95,0x62, + 0x02,0x47,0x86,0x11, 0x59,0xfa,0xdf,0x33, 0x67,0x8d,0x76,0x56, 0xec,0x0f,0x49,0x5b, + 0xa3,0xef,0xe0,0xac, 0x11,0x79,0xe9,0xbf, 0xca,0x78,0x97,0xe8, 0xad,0xaf,0xf3,0xe2, + 0xc6,0xc9,0x43,0x41, 0x6c,0x19,0x85,0xa9, 0x64,0xa1,0x96,0x5c, 0x29,0xaa,0x08,0x49, + 0x5d,0x5d,0xf5,0xbd, 0xcf,0xab,0x70,0xba, 0xf6,0x09,0xee,0xb5, 0x20,0x31,0xc4,0xda, + 0xa9,0x4d,0x01,0xf3, 0x15,0xc8,0x3f,0x73, 0xc9,0x91,0xd5,0x34, 0x61,0x38,0xae,0x29, + 0x4c,0x66,0xf2,0x7b, 0xb3,0xb6,0x39,0xc7, 0x8d,0x87,0x28,0xdc, 0x05,0xfd,0xea,0xc2, + 0x3f,0x62,0xa6,0xbd, 0x2f,0xcb,0x8f,0x7b, 0x61,0x51,0xab,0x40, 0x07,0xac,0x81,0x28, + 0xfb,0x69,0x5c,0xdd, 0xda,0x68,0x09,0xfd, 0x6c,0xa5,0x72,0x45, 0x55,0x7b,0xed,0x65, + 0x72,0xfd,0xfb,0x0b, 0xc5,0xa0,0x73,0xee, 0x1b,0x6d,0x26,0x21, 0x2b,0xb0,0xc7,0x28, + 0x72,0x93,0x3b,0xa8, 0x44,0x44,0x28,0x85, 0x3e,0x89,0xc9,0x09, 0x29,0xfb,0xe0,0xf9, + 0x31,0x82,0x49,0x9b, 0x35,0x59,0xa8,0x2e, 0x34,0xc9,0x6d,0x89, 0x3c,0x00,0x56,0x6c, + 0xe1,0x84,0x35,0x17, 0xc1,0x51,0xe0,0x42, 0xe3,0x41,0x16,0x65, 0x41,0x0f,0x4d,0x0c, + 0xe2,0x85,0x58,0xdb, 0x4f,0xd7,0x6f,0x7d, 0xc6,0x8a,0x99,0x9e, 0xdf,0x73,0x8e,0x3c, + 0xb1,0xd8,0xca,0x7d, 0x60,0x33,0x26,0x1c, 0xfa,0x8e,0x23,0x75, 0x16,0xac,0x9b,0x51, + 0x55,0xe7,0x9e,0x65, 0xfe,0x25,0x24,0xc2, 0x7a,0x21,0x32,0xe3, 0xca,0x43,0xdf,0x3e, + 0x37,0x75,0x65,0xb2, 0x45,0x40,0xe4,0x60, 0xb2,0x66,0x6c,0xd6, 0x9b,0x26,0x41,0xf1, + 0xa0,0x96,0x01,0xc2, 0xcb,0xaf,0x64,0x34, 0x3e,0x5e,0x4e,0x4c, 0xb1,0x46,0x22,0x4c, + 0x69,0x8d,0xa7,0x99, 0xa2,0xd6,0xd5,0x21, 0x27,0x41,0xe7,0x25, 0x22,0x96,0xc7,0x86, + 0xe8,0x53,0xb5,0x6b, 0xb5,0x8a,0xeb,0xed, 0xa7,0xdf,0x6b,0xfd, 0x59,0x62,0x22,0x61, + 0x91,0x9a,0xef,0x5e, 0x93,0x46,0x3b,0x0e, 0x6d,0x88,0xf5,0xbb, 0xe4,0xe8,0x0e,0x4a, + 0xc1,0xa0,0x2b,0x4c, 0x81,0x5a,0xda,0x54, 0x14,0x75,0x88,0x3f, 0x84,0x40,0xc4,0xdb, + 0x1b,0xd7,0x10,0xdb, 0x11,0xbd,0x64,0x2e, 0x6b,0x5f,0x23,0x5e, 0x06,0x9e,0x23,0x0c, + 0x18,0xd3,0x26,0xd2, 0x4f,0x7e,0x7c,0xe5, 0x2b,0x61,0x13,0x89, 0xcd,0xfb,0x6b,0x3c, + 0x54,0x88,0x08,0x64, 0xe8,0x81,0x94,0x94, 0x28,0x13,0x6a,0xf2, 0x58,0xd8,0xc1,0xc2, + 0xa2,0x5e,0x8e,0x93, 0xd6,0x6c,0x71,0x02, 0x45,0xdb,0x53,0x4a, 0xa8,0x97,0x36,0x90, + 0xcd,0x66,0xc3,0xdf, 0x70,0xb2,0x5e,0xe8, 0xe8,0x37,0x21,0x52, 0x85,0xbf,0x7c,0xcb, + 0x00,0x15,0x59,0xf4, 0x80,0x56,0xca,0x16, 0x59,0x2b,0xae,0xe0, 0x95,0xee,0xff,0xe4, + 0xaf,0xb5,0xa5,0xf3, 0x33,0x53,0x31,0x75, 0xb5,0x8b,0xb6,0x3a, 0xf9,0xe4,0x6d,0x7c, + 0x29,0x84,0x24,0x70, 0x82,0x1b,0x56,0x60, 0xc3,0x9d,0xba,0xe5, 0x53,0xca,0x26,0xfc, + 0x35,0xa0,0xed,0x53, 0x91,0x8d,0x8d,0xa5, 0xc6,0x1a,0x3a,0x35, 0x36,0x6d,0xbe,0xf1, + 0xf8,0xc6,0xe6,0x9c, 0xc3,0x18,0x2e,0x18, 0x21,0xb7,0x0a,0x77, 0x6d,0x68,0xd6,0x79, + 0x85,0x8b,0xb5,0x57, 0xb1,0x3b,0xae,0x70, 0x1a,0xea,0x29,0xb3, 0x10,0xbe,0xc0,0xd0, + 0xa2,0xdc,0xcc,0x9b, 0x72,0x09,0x74,0xb9, 0x01,0x8a,0x30,0x5d, 0x1e,0xe5,0x2d,0x65, + 0xb3,0xb5,0x0c,0x38, 0x2c,0x2e,0xad,0xda, 0x7e,0xea,0x2e,0x2d, 0xdc,0x37,0x5e,0x44, + 0x2e,0x9d,0x72,0xb9, 0xe1,0xbe,0x46,0x19, 0xc5,0x06,0x70,0x41, 0x42,0xa3,0x04,0x43, + 0x3d,0xd9,0x35,0x70, 0x49,0x29,0x3d,0xb9, 0x6f,0x9d,0x71,0xd4, 0x4b,0x40,0xbf,0x88, + 0xc9,0x47,0x62,0xb2, 0x22,0x0e,0x49,0xf2, 0x85,0x65,0xce,0x8c, 0x8b,0x15,0x23,0x14, + 0x60,0x4d,0x2e,0x5b, 0x84,0xa6,0x16,0xbd, 0x73,0xd1,0x32,0x1b, 0x98,0xa6,0xf5,0xc0, + 0x50,0xb8,0x6e,0x08, 0x74,0xca,0x14,0xd3, 0x72,0x80,0x20,0x44, 0xfa,0xef,0xa4,0xf1, + 0xa1,0x0c,0x91,0x29, 0x36,0x5c,0x22,0x30, 0x40,0x19,0x90,0x3c, 0x0d,0x91,0xe1,0x22, + 0xb9,0x81,0xec,0x54, 0x34,0x36,0xc0,0x8c, 0x25,0x05,0x3d,0xe3, 0x56,0x94,0xc2,0x8e, + 0x4d,0x0b,0xaf,0x8d, 0xa1,0x70,0x8b,0x74, 0x6a,0x32,0xc9,0x36, 0x08,0x60,0x00,0xa2, + 0x84,0x66,0x11,0x40, 0xcc,0x10,0x96,0x14, 0x51,0x9d,0x89,0x4b, 0x59,0x86,0xe9,0x4b, + 0x7d,0xb9,0x0e,0xaa, 0x9f,0x64,0x64,0x62, 0x5f,0x4e,0x96,0x02, 0x6f,0x94,0xa1,0x9f, + 0xfa,0x82,0x32,0x82, 0x8d,0x80,0x37,0x41, 0x89,0xdf,0x26,0x7a, 0xea,0x66,0xa8,0xb4, + 0x99,0x76,0x88,0x39, 0xf6,0x60,0x89,0x9c, 0xb7,0xe3,0xc0,0xe9, 0x73,0xc7,0xaa,0x7b, + 0x5f,0x5e,0x5a,0xfc, 0x4a,0x8b,0x3b,0xfd, 0x1a,0x53,0x6b,0x76, 0x25,0x2d,0x39,0x35, + 0x4e,0x65,0x38,0x1d, 0x8a,0x81,0xe8,0x4c, 0x66,0x6a,0xf4,0x0b, 0xfd,0x29,0x67,0xbf, + 0x8a,0x8e,0xe5,0x64, 0x00,0x9f,0xc8,0x7b, 0x96,0x84,0x2a,0xb1, 0x50,0x97,0x2c,0x49, + 0xcf,0x7a,0x00,0x77, 0xa8,0xe3,0xa0,0x4b, 0x64,0xa7,0x74,0x57, 0x3e,0x46,0x74,0x21, + 0x82,0x0e,0xef,0xf3, 0x20,0x5f,0xa6,0x07, 0xd6,0x88,0x47,0x8d, 0x20,0x5f,0xe4,0x43, + 0x60,0x8f,0x26,0xa9, 0x28,0x6e,0x90,0xe1, 0x43,0x6e,0x23,0xca, 0x37,0xd6,0xca,0xa9, + 0x4f,0x6d,0xe4,0x49, 0xb4,0x09,0x31,0x1e, 0x22,0x12,0xc0,0x3f, 0x2b,0x97,0xc3,0xb6, + 0x03,0x2e,0xce,0xef, 0x09,0xae,0x57,0x4e, 0x6c,0xf8,0x1f,0xc4, 0xbd,0xba,0x7f,0x3e, + 0xae,0xff,0x0e,0xd6, 0xcf,0x0a,0x4e,0xc7, 0xdc,0xd9,0x0f,0xf8, 0xed,0x49,0xfd,0xb1, + 0xc1,0x60,0x49,0x96, 0x7d,0x94,0xa4,0x66, 0xaf,0x43,0xd7,0x4f, 0xa5,0x4f,0x92,0x68, + 0x3c,0x52,0xb3,0x4c, 0x3e,0x0a,0xa5,0xde, 0x71,0xcd,0xb5,0x0a, 0x6d,0x45,0x45,0x7d, + 0xf5,0xee,0x29,0x8c, 0x6e,0xe5,0x46,0x26, 0x40,0xcc,0x5d,0x8b, 0xb6,0xd8,0xf8,0x6d, + 0x89,0xc2,0x23,0x7e, 0x3a,0x4e,0xac,0x63, 0x22,0x6a,0xbe,0x4f, 0x07,0x28,0x61,0x65, + 0x10,0x6a,0x87,0xf8, 0xbb,0x92,0x29,0xc2, 0x84,0x85,0xb5,0x24, 0xbd,0xa8, + // 0x45e = 1118 data bytes (45%) +}; + +static BZ2Manager_t prefix_inc_mgr + = { prefix_inc_bz2, sizeof(prefix_inc_bz2), 0, 0 }; + diff --git a/project/src/ui/tab-wbmgt.inc b/project/src/ui/tab-wbmgt.inc index 753342c..8e38144 100644 --- a/project/src/ui/tab-wbmgt.inc +++ b/project/src/ui/tab-wbmgt.inc @@ -67,6 +67,10 @@ "wbmgt ARGTEST ...", 0 /* copy of wszst */ }, + { T_DEF_CMD, "EXPAND", "EXPAND", + "wbmgt EXPAND ...", + 0 /* copy of wszst */ }, + { T_DEF_CMD, "TEST", "TEST", "wbmgt TEST [options]... [ignored]...", 0 /* copy of wszst */ }, @@ -212,6 +216,10 @@ "MAX_WIDTH", "max-width|maxwidth", 0, 0 /* copy of wszst */ }, + { T_OPT_G|F_IGNORE, + "NO_PAGER", "no-pager|nopager", + 0, 0 /* copy of wszst */ }, + { T_OPT_GM, "QUIET", "q|quiet", 0, 0 /* copy of wszst */ }, @@ -221,6 +229,9 @@ { T_OPT_GM, "LOGGING", "L|logging", 0, 0 /* copy of wszst */ }, + { T_OPT_GM, "TIMING", "timing", + 0, 0 /* copy of wszst */ }, + { T_OPT_GP, "WARN", "W|warn", 0, 0 /* copy of wszst */ }, @@ -471,13 +482,16 @@ //---------- COMMAND wbmgt ARGTEST ---------- { T_CMD_BEG, "ARGTEST", 0,0,0 }, + { T_ALL_OPT, 0, 0,0,0 }, + //---------- COMMAND wbmgt EXPAND ---------- + + { T_CMD_BEG, "EXPAND", 0,0,0 }, { T_ALL_OPT, 0, 0,0,0 }, //---------- COMMAND wbmgt TEST ---------- { T_CMD_BEG, "TEST", 0,0,0 }, - { T_ALL_OPT, 0, 0,0,0 }, //---------- COMMAND wbmgt COLORS ---------- diff --git a/project/src/ui/tab-wctct.inc b/project/src/ui/tab-wctct.inc index bb24731..312a34a 100644 --- a/project/src/ui/tab-wctct.inc +++ b/project/src/ui/tab-wctct.inc @@ -68,6 +68,10 @@ "wctct ARGTEST ...", 0 /* copy of wszst */ }, + { T_DEF_CMD, "EXPAND", "EXPAND", + "wctct EXPAND ...", + 0 /* copy of wszst */ }, + { T_DEF_CMD, "TEST", "TEST", "wctct TEST [options]... [ignored]...", 0 /* copy of wszst */ }, @@ -199,6 +203,10 @@ "MAX_WIDTH", "max-width|maxwidth", 0, 0 /* copy of wszst */ }, + { T_OPT_G|F_IGNORE, + "NO_PAGER", "no-pager|nopager", + 0, 0 /* copy of wszst */ }, + { T_OPT_GM, "QUIET", "q|quiet", 0, 0 /* copy of wszst */ }, @@ -208,6 +216,9 @@ { T_OPT_GM, "LOGGING", "L|logging", 0, 0 /* copy of wszst */ }, + { T_OPT_GM, "TIMING", "timing", + 0, 0 /* copy of wszst */ }, + { T_OPT_GP, "WARN", "W|warn", 0, 0 /* copy of wszst */ }, @@ -346,6 +357,11 @@ { T_OPT_GO, "REPAIR_MAGICS", "repair-magics|repairmagics", 0, 0 /* copy of wszst */ }, + { T_OPT_GP, "CREATE_DISTRIB", "create-distrib|createdistrib", + "file", + "Create a LE-CODE distribution dump with a track list and more info about" + " the current distribution. Store the dump info a file." }, + #if OPT_OLD_NEW { H_OPT_GM, "OLD", "OLD", 0, 0 /* copy of wszst */ }, @@ -589,13 +605,16 @@ //---------- COMMAND wctct ARGTEST ---------- { T_CMD_BEG, "ARGTEST", 0,0,0 }, + { T_ALL_OPT, 0, 0,0,0 }, + + //---------- COMMAND wctct EXPAND ---------- + { T_CMD_BEG, "EXPAND", 0,0,0 }, { T_ALL_OPT, 0, 0,0,0 }, //---------- COMMAND wctct TEST ---------- { T_CMD_BEG, "TEST", 0,0,0 }, - { T_ALL_OPT, 0, 0,0,0 }, //---------- COMMAND wctct COLORS ---------- diff --git a/project/src/ui/tab-wimgt.inc b/project/src/ui/tab-wimgt.inc index 3ab70bd..bc5e27e 100644 --- a/project/src/ui/tab-wimgt.inc +++ b/project/src/ui/tab-wimgt.inc @@ -68,6 +68,10 @@ "wimgt ARGTEST ...", 0 /* copy of wszst */ }, + { T_DEF_CMD, "EXPAND", "EXPAND", + "wimgt EXPAND ...", + 0 /* copy of wszst */ }, + { T_DEF_CMD, "TEST", "TEST", "wimgt TEST [options]... [ignored]...", 0 /* copy of wszst */ }, @@ -169,6 +173,10 @@ "MAX_WIDTH", "max-width|maxwidth", 0, 0 /* copy of wszst */ }, + { T_OPT_G|F_IGNORE, + "NO_PAGER", "no-pager|nopager", + 0, 0 /* copy of wszst */ }, + { T_OPT_GM, "QUIET", "q|quiet", 0, 0 /* copy of wszst */ }, @@ -178,6 +186,9 @@ { T_OPT_GM, "LOGGING", "L|logging", 0, 0 /* copy of wszst */ }, + { T_OPT_GM, "TIMING", "timing", + 0, 0 /* copy of wszst */ }, + { T_OPT_GP, "WARN", "W|warn", 0, 0 /* copy of wszst */ }, @@ -419,13 +430,16 @@ //---------- COMMAND wimgt ARGTEST ---------- { T_CMD_BEG, "ARGTEST", 0,0,0 }, + { T_ALL_OPT, 0, 0,0,0 }, + //---------- COMMAND wimgt EXPAND ---------- + + { T_CMD_BEG, "EXPAND", 0,0,0 }, { T_ALL_OPT, 0, 0,0,0 }, //---------- COMMAND wimgt TEST ---------- { T_CMD_BEG, "TEST", 0,0,0 }, - { T_ALL_OPT, 0, 0,0,0 }, //---------- COMMAND wimgt COLORS ---------- diff --git a/project/src/ui/tab-wkclt.inc b/project/src/ui/tab-wkclt.inc index 2a137c8..ebeda48 100644 --- a/project/src/ui/tab-wkclt.inc +++ b/project/src/ui/tab-wkclt.inc @@ -67,6 +67,10 @@ "wkclt ARGTEST ...", 0 /* copy of wszst */ }, + { T_DEF_CMD, "EXPAND", "EXPAND", + "wkclt EXPAND ...", + 0 /* copy of wszst */ }, + { T_DEF_CMD, "TEST", "TEST", "wkclt TEST [options]... [ignored]...", 0 /* copy of wszst */ }, @@ -282,6 +286,10 @@ "MAX_WIDTH", "max-width|maxwidth", 0, 0 /* copy of wszst */ }, + { T_OPT_G|F_IGNORE, + "NO_PAGER", "no-pager|nopager", + 0, 0 /* copy of wszst */ }, + { T_OPT_GM, "QUIET", "q|quiet", 0, 0 /* copy of wszst */ }, @@ -291,6 +299,9 @@ { T_OPT_GM, "LOGGING", "L|logging", 0, 0 /* copy of wszst */ }, + { T_OPT_GM, "TIMING", "timing", + 0, 0 /* copy of wszst */ }, + { T_OPT_GP, "WARN", "W|warn", 0, 0 /* copy of wszst */ }, @@ -588,7 +599,11 @@ //---------- COMMAND wkclt ARGTEST ---------- { T_CMD_BEG, "ARGTEST", 0,0,0 }, + { T_ALL_OPT, 0, 0,0,0 }, + + //---------- COMMAND wkclt EXPAND ---------- + { T_CMD_BEG, "EXPAND", 0,0,0 }, { T_ALL_OPT, 0, 0,0,0 }, //---------- COMMAND wkclt TEST ---------- diff --git a/project/src/ui/tab-wkmpt.inc b/project/src/ui/tab-wkmpt.inc index 0b2a49a..b647c4d 100644 --- a/project/src/ui/tab-wkmpt.inc +++ b/project/src/ui/tab-wkmpt.inc @@ -67,6 +67,10 @@ "wkmpt ARGTEST ...", 0 /* copy of wszst */ }, + { T_DEF_CMD, "EXPAND", "EXPAND", + "wkmpt EXPAND ...", + 0 /* copy of wszst */ }, + { T_DEF_CMD, "TEST", "TEST", "wkmpt TEST [options]... [ignored]...", 0 /* copy of wszst */ }, @@ -266,6 +270,10 @@ "MAX_WIDTH", "max-width|maxwidth", 0, 0 /* copy of wszst */ }, + { T_OPT_G|F_IGNORE, + "NO_PAGER", "no-pager|nopager", + 0, 0 /* copy of wszst */ }, + { T_OPT_GM, "QUIET", "q|quiet", 0, 0 /* copy of wszst */ }, @@ -275,6 +283,9 @@ { T_OPT_GM, "LOGGING", "L|logging", 0, 0 /* copy of wszst */ }, + { T_OPT_GM, "TIMING", "timing", + 0, 0 /* copy of wszst */ }, + { T_OPT_GP, "WARN", "W|warn", 0, 0 /* copy of wszst */ }, @@ -685,7 +696,11 @@ //---------- COMMAND wkmpt ARGTEST ---------- { T_CMD_BEG, "ARGTEST", 0,0,0 }, + { T_ALL_OPT, 0, 0,0,0 }, + + //---------- COMMAND wkmpt EXPAND ---------- + { T_CMD_BEG, "EXPAND", 0,0,0 }, { T_ALL_OPT, 0, 0,0,0 }, //---------- COMMAND wkmpt TEST ---------- diff --git a/project/src/ui/tab-wlect.inc b/project/src/ui/tab-wlect.inc index d5ac35d..3581bef 100644 --- a/project/src/ui/tab-wlect.inc +++ b/project/src/ui/tab-wlect.inc @@ -67,6 +67,10 @@ "wlect ARGTEST ...", 0 /* copy of wszst */ }, + { T_DEF_CMD, "EXPAND", "EXPAND", + "wlect EXPAND ...", + 0 /* copy of wszst */ }, + { T_DEF_CMD, "TEST", "TEST", "wlect TEST [options]... [ignored]...", 0 /* copy of wszst */ }, @@ -161,17 +165,23 @@ { T_SEP_CMD, 0,0,0,0 }, //----- separator ----- { T_DEF_CMD, "CREATE", "CREATE|CR", - "wlect CREATE [keyword]", + "wlect CREATE [keyword] ...", "Create a file and print it to standard output." + " Options {--dest} and {--DEST} can forc another destination." " The kind of file is defined by KEYWORD." - " Use command without keywords to get a list of possible keywords." + " The command can create LEX files, a LPAR file or a track listing." + "\n " + " Use the command without keyword to get an extended description." }, + + { T_DEF_CMD, "DISTRIBUTION", "DISTRIBUTION|DIS|DISTRIB", + "wlect DISTRIBUTION [argument]...", + "This command manages data for LE-CODE track distributions." + " It reads any number of source files with different file types," + " collects the data and creates any number of files with different file types." "\n " - " The following keywords are possible:" - " @LEX@ for a LEX text file with all known sections except @TEST@." - " @LEX+@ for a LEX text file with all known sections including @TEST@." - " @SET1, CANN, HIPT@ and @TEST@ (section names)" - " for a LEX text file with 1 section only." - " @LPAR@ for an example LE-CODE parameter file." }, + " Use the command without keyword to get an extended description." + "\n " + "This command is still under development. Its use is therefore EXPERIMENTAL!" }, { T_DEF_CMD, "CAT", "CAT", "wlect CAT [source]...", @@ -222,6 +232,10 @@ "MAX_WIDTH", "max-width|maxwidth", 0, 0 /* copy of wszst */ }, + { T_OPT_G|F_IGNORE, + "NO_PAGER", "no-pager|nopager", + 0, 0 /* copy of wszst */ }, + { T_OPT_GM, "QUIET", "q|quiet", 0, 0 /* copy of wszst */ }, @@ -231,6 +245,9 @@ { T_OPT_GM, "LOGGING", "L|logging", 0, 0 /* copy of wszst */ }, + { T_OPT_GM, "TIMING", "timing", + 0, 0 /* copy of wszst */ }, + { T_OPT_GP, "WARN", "W|warn", 0, 0 /* copy of wszst */ }, @@ -253,6 +270,12 @@ "This option is completely ignored by wlect." " It only exists due to compatibility with the other tools." }, + { T_OPT_GP, "LOAD_PREFIX", "load-prefix|loadprefix", + 0, 0 /* copy of wszst */ }, + + { T_OPT_CP, "PLUS", "plus", + 0, 0 /* copy of wszst */ }, + { T_OPT_GMP, "CHDIR", "chdir", 0, 0 /* copy of wszst */ }, @@ -407,6 +430,11 @@ { T_OPT_GO, "REPAIR_MAGICS", "repair-magics|repairmagics", 0, 0 /* copy of wszst */ }, + { T_OPT_CP, "CREATE_DISTRIB", "create-distrib|createdistrib", + "file", + "Create a LE-CODE distribution dump with a track list and more info about" + " the current distribution. Store the dump info a file." }, + #if OPT_OLD_NEW { H_OPT_GM, "OLD", "OLD", 0, 0 /* copy of wszst */ }, @@ -542,6 +570,15 @@ " directory specified by option {--track-dir}." " If linking fails, the file is copied." }, + { T_OPT_CP, "SZS_MODE", "szs-mode|szsmode", + "mode", + "If a track is inserted via the SZS file," + " then the associated directory is automatically included in the list" + " of search directories for option {--track-dir}." + " This option now sets the transfer mode. @OFF@ turns this feature off." + " The values @COPY@, @MOVE@, @MOVE1@ and @LINK@ define one of the 4 modes." + " Default mode is @LINK@." }, + { T_SEP_OPT, 0,0,0,0 }, //----- separator ----- { T_OPT_C, "COMPLETE", "C|complete", @@ -721,13 +758,16 @@ //---------- COMMAND wlect ARGTEST ---------- { T_CMD_BEG, "ARGTEST", 0,0,0 }, + { T_ALL_OPT, 0, 0,0,0 }, + //---------- COMMAND wlect EXPAND ---------- + + { T_CMD_BEG, "EXPAND", 0,0,0 }, { T_ALL_OPT, 0, 0,0,0 }, //---------- COMMAND wlect TEST ---------- { T_CMD_BEG, "TEST", 0,0,0 }, - { T_ALL_OPT, 0, 0,0,0 }, //---------- COMMAND wlect COLORS ---------- @@ -821,6 +861,7 @@ { T_COPT, "VERBOSE", 0,0, "For LE-CODE binaries: If set, print a track slot usage table." }, { T_COPY_GRP, "PATCH", 0,0,0 }, + { T_COPT, "CREATE_DISTRIB",0,0,0 }, //---------- COMMAND wlect DL ---------- @@ -851,6 +892,7 @@ { T_COPY_GRP, "DEST", 0,0,0 }, // { T_COPT, "NO_CHECK", 0,0,0 }, { T_COPT, "IGNORE", 0,0,0 }, + { T_COPT, "CREATE_DISTRIB",0,0,0 }, //---------- COMMAND wlect LPAR ---------- @@ -878,8 +920,22 @@ { T_COPT, "LEX_PURGE", 0,0,0 }, { H_COPT, "LEX_RM_FEAT", 0,0,0 }, { T_SEP_OPT, 0,0,0,0 }, + { T_COPT, "LE_DEFINE", 0,0,0 }, + { T_COPT, "LOAD_BMG", 0,0,0 }, + { T_SEP_OPT, 0,0,0,0 }, { T_COPY_GRP, "PARAM", 0,0,0 }, + //---------- COMMAND wlect DISTRIBUTION ---------- + + { T_CMD_BEG, "DISTRIBUTION", 0,0,0 }, + { T_COPT, "LOAD_PREFIX", 0,0,0 }, + { T_COPT, "PLUS", 0,0,0 }, + { T_COPY_GRP, "TRACK_COPY", 0,0,0 }, + { T_COPT, "SZS_MODE", 0,0,0 }, + { T_SEP_OPT, 0,0,0,0 }, + { T_COPY_GRP, "TEXTOUT", 0,0,0 }, + { T_COPY_GRP, "DEST", 0,0,0 }, + //---------- COMMAND wlect CAT ---------- { T_CMD_BEG, "CAT", 0,0,0 }, diff --git a/project/src/ui/tab-wmdlt.inc b/project/src/ui/tab-wmdlt.inc index 85018fd..bb03e3b 100644 --- a/project/src/ui/tab-wmdlt.inc +++ b/project/src/ui/tab-wmdlt.inc @@ -67,6 +67,10 @@ "wmdlt ARGTEST ...", 0 /* copy of wszst */ }, + { T_DEF_CMD, "EXPAND", "EXPAND", + "wmdlt EXPAND ...", + 0 /* copy of wszst */ }, + { T_DEF_CMD, "TEST", "TEST", "wmdlt TEST [options]... [ignored]...", 0 /* copy of wszst */ }, @@ -192,6 +196,10 @@ "MAX_WIDTH", "max-width|maxwidth", 0, 0 /* copy of wszst */ }, + { T_OPT_G|F_IGNORE, + "NO_PAGER", "no-pager|nopager", + 0, 0 /* copy of wszst */ }, + { T_OPT_GM, "QUIET", "q|quiet", 0, 0 /* copy of wszst */ }, @@ -201,6 +209,9 @@ { T_OPT_GM, "LOGGING", "L|logging", 0, 0 /* copy of wszst */ }, + { T_OPT_GM, "TIMING", "timing", + 0, 0 /* copy of wszst */ }, + { T_OPT_GP, "WARN", "W|warn", 0, 0 /* copy of wszst */ }, @@ -457,7 +468,11 @@ //---------- COMMAND wmdlt ARGTEST ---------- { T_CMD_BEG, "ARGTEST", 0,0,0 }, + { T_ALL_OPT, 0, 0,0,0 }, + + //---------- COMMAND wmdlt EXPAND ---------- + { T_CMD_BEG, "EXPAND", 0,0,0 }, { T_ALL_OPT, 0, 0,0,0 }, //---------- COMMAND wmdlt TEST ---------- diff --git a/project/src/ui/tab-wpatt.inc b/project/src/ui/tab-wpatt.inc index b2f193e..aa7b71d 100644 --- a/project/src/ui/tab-wpatt.inc +++ b/project/src/ui/tab-wpatt.inc @@ -67,6 +67,10 @@ "wpatt ARGTEST ...", 0 /* copy of wszst */ }, + { T_DEF_CMD, "EXPAND", "EXPAND", + "wpatt EXPAND ...", + 0 /* copy of wszst */ }, + { T_DEF_CMD, "TEST", "TEST", "wpatt TEST [options]... [ignored]...", 0 /* copy of wszst */ }, @@ -160,6 +164,10 @@ "MAX_WIDTH", "max-width|maxwidth", 0, 0 /* copy of wszst */ }, + { T_OPT_G|F_IGNORE, + "NO_PAGER", "no-pager|nopager", + 0, 0 /* copy of wszst */ }, + { T_OPT_GM, "QUIET", "q|quiet", 0, 0 /* copy of wszst */ }, @@ -169,6 +177,9 @@ { T_OPT_GM, "LOGGING", "L|logging", 0, 0 /* copy of wszst */ }, + { T_OPT_GM, "TIMING", "timing", + 0, 0 /* copy of wszst */ }, + { T_OPT_GP, "WARN", "W|warn", 0, 0 /* copy of wszst */ }, @@ -355,7 +366,11 @@ //---------- COMMAND wpatt ARGTEST ---------- { T_CMD_BEG, "ARGTEST", 0,0,0 }, + { T_ALL_OPT, 0, 0,0,0 }, + + //---------- COMMAND wpatt EXPAND ---------- + { T_CMD_BEG, "EXPAND", 0,0,0 }, { T_ALL_OPT, 0, 0,0,0 }, //---------- COMMAND wpatt TEST ---------- diff --git a/project/src/ui/tab-wstrt.inc b/project/src/ui/tab-wstrt.inc index 4015738..d540bcd 100644 --- a/project/src/ui/tab-wstrt.inc +++ b/project/src/ui/tab-wstrt.inc @@ -68,6 +68,10 @@ "wstrt ARGTEST ...", 0 /* copy of wszst */ }, + { T_DEF_CMD, "EXPAND", "EXPAND", + "wstrt EXPAND ...", + 0 /* copy of wszst */ }, + { T_DEF_CMD, "TEST", "TEST", "wstrt TEST [options]... [ignored]...", 0 /* copy of wszst */ }, @@ -223,6 +227,10 @@ "MAX_WIDTH", "max-width|maxwidth", 0, 0 /* copy of wszst */ }, + { T_OPT_G|F_IGNORE, + "NO_PAGER", "no-pager|nopager", + 0, 0 /* copy of wszst */ }, + { T_OPT_GM, "QUIET", "q|quiet", 0, 0 /* copy of wszst */ }, @@ -232,6 +240,9 @@ { T_OPT_GM, "LOGGING", "L|logging", 0, 0 /* copy of wszst */ }, + { T_OPT_GM, "TIMING", "timing", + 0, 0 /* copy of wszst */ }, + { T_OPT_GP, "WARN", "W|warn", 0, 0 /* copy of wszst */ }, @@ -923,13 +934,16 @@ //---------- COMMAND wstrt ARGTEST ---------- { T_CMD_BEG, "ARGTEST", 0,0,0 }, + { T_ALL_OPT, 0, 0,0,0 }, + //---------- COMMAND wstrt EXPAND ---------- + + { T_CMD_BEG, "EXPAND", 0,0,0 }, { T_ALL_OPT, 0, 0,0,0 }, //---------- COMMAND wstrt TEST ---------- { T_CMD_BEG, "TEST", 0,0,0 }, - { T_ALL_OPT, 0, 0,0,0 }, //---------- COMMAND wstrt COLORS ---------- @@ -997,6 +1011,7 @@ { T_COPT, "FADDR", 0,0,0 }, { T_COPT, "SNAME", 0,0,0 }, { T_COPT, "LOGGING", 0,0,0 }, + { T_COPT, "TIMING", 0,0,0 }, { T_SEP_OPT, 0,0,0,0 }, { T_COPY_GRP, "HEXDUMP", 0,0,0 }, diff --git a/project/src/ui/tab-wszst.inc b/project/src/ui/tab-wszst.inc index d836fdf..3fbde8d 100644 --- a/project/src/ui/tab-wszst.inc +++ b/project/src/ui/tab-wszst.inc @@ -89,7 +89,18 @@ { T_DEF_CMD, "ARGTEST", "ARGTEST", "wszst ARGTEST ...", "This debug command accepts all kinds of parameters" - " and prints one line for each parameter." }, + " and prints one line for each parameter." + " All tools know the ARGTEST command." }, + + { T_DEF_CMD, "EXPAND", "EXPAND", + "wszst EXPAND ...", + "This debug command accepts (like ARGTEST) all kinds of parameters" + " and prints one line for each parameter." + " After that, the parameter is treated as a filename with wildcards" + " and all matching files are searched." + " The special parameters '+h' and '/h' enable or disable the search" + " for hidden directories and files (files beginning with a point)." + " All tools know the EXPAND command." }, { T_DEF_CMD, "TEST", "TEST", "wszst TEST [options]... [ignored]...", @@ -105,12 +116,14 @@ { T_DEF_CMD, "ERROR", "ERROR|ERR", "wszst ERROR [error_code]", "Translate an exit code to a message name." - " If no exit code is entered, print a table with all error messages." }, + " If no exit code is entered, print a table with all error messages." + " All tools know the ERROR command." }, { T_DEF_CMD, "FILETYPE", "FILETYPE|FT", "wszst FILETYPE file...", "Scan the header of the entered files and print file type" - " and path for each file as list." }, + " and path for each file as list." + " All tools know the FILETYPE command." }, { T_DEF_CMD, "FILEATTRIB", "FILEATTRIB|FA", "wszst FILEATTRIB [keyword]...", @@ -118,7 +131,8 @@ " If at least one keyword is entered, only matching file types" " are printed." " A keyword is either a file type (like 'BRRES' or 'BMG')" - " or one of the printed keywords (like 'ARCHIVE' or 'EXTRACT')." }, + " or one of the printed keywords (like 'ARCHIVE' or 'EXTRACT')." + " All tools know the FILEATTRIB command." }, { T_DEF_CMD, "BRSUB", "BRSUB", "wszst BRSUB [file]...", @@ -130,17 +144,20 @@ { T_DEF_CMD, "SYMBOLS", "SYMBOLS", "wszst SYMBOLS", - "Print predefined symbols of text parser to standard output." }, + "Print predefined symbols of text parser to standard output." + " Many tools know the SYMBOLS command." }, { T_DEF_CMD, "FUNCTIONS", "FUNCTIONS", "wszst FUNCTIONS [key]...", "Print a list with all parser functions." " If one or more keys entered," - " then only functions that match at least one key are printed." }, + " then only functions that match at least one key are printed." + " Many tools know the FUNCTIONS command." }, { T_DEF_CMD, "CALCULATE", "CALCULATE", "wszst CALCULATE expression...", - "Calculate each expression and print the result to standard output." }, + "Calculate each expression and print the result to standard output." + " Many tools know the CALCULATE command." }, { T_DEF_CMD, "MATRIX", "MATRIX", "wszst MATRIX [patch-option]... [vector]...", @@ -352,6 +369,11 @@ "wszst ANALYZE [source]...", "Analyse track files and print results in machine readable format." }, + { T_DEF_CMD, "SPLIT", "SPLIT", + "wszst SPLIT [source]...", + "Analyse (file) names and split them into the different parts." + " Print the results in machine readable format." }, + { T_DEF_CMD, "IS_TEXTURE", "IS-TEXTURE|ISTEXTURE", "wszst IS-TEXTURE --reference reference [source]...", "Test each source to see if it's a texture hack versus a reference file." @@ -368,7 +390,7 @@ "wszst FEATURES [source]...", "Analyse track files and create a feature list in machine readable format." }, - { T_DEF_CMD, "DISTRIBUTION", "DISTRIBUTION|DIST", + { T_DEF_CMD, "DISTRIBUTION", "DISTRIBUTION|DIS|DISTRIB", "wszst DISTRIBUTION result source...\n" "wszst DISTRIBUTION directory [source]...", "Load each @SOURCE@ (SZS, WBZ, U8 or WU8) and calculate a checksum" @@ -384,7 +406,9 @@ "\n " " If file @RESULT@ exists, it is automatically added as last source" " to the list of option --source, but only if not already added." - " On scanning of file @result@, parameters are scanned too." }, + " On scanning of file @result@, parameters are scanned too." + "\n " + "See »welect DISTRIBUTION« for a new and alternative implementation of this." }, { T_SEP_CMD, 0,0,0,0 }, //----- separator ----- @@ -694,6 +718,11 @@ " for help and some other messages." " The default is 120. This option is ignored if --width is set." }, + { T_OPT_G|F_IGNORE, + "NO_PAGER", "no-pager|nopager", + 0, + "Forbid the internal usage of a pager." }, + { T_OPT_GM, "QUIET", "q|quiet", 0, "Be quiet and print only error messages." @@ -710,7 +739,13 @@ { T_OPT_GM, "LOGGING", "L|logging", 0, - "This debug option enables the logging of internal lists and maps." }, + "This debug option enables the logging of internal lists and maps." + " Set it up to three times to be more verbose.\n" }, + + { T_OPT_GM, "TIMING", "timing", + 0, + "Activate the timing of some operations." + " Logging level 3 activates them too.\n" }, { T_OPT_GP, "WARN", "W|warn", "list", @@ -765,6 +800,25 @@ " The optional parameter is deprecated and ignored." "\1 See https://szs.wiimm.de/opt/lecode for details." }, + { T_OPT_GP, "LOAD_PREFIX", "load-prefix|loadprefix", + "file", + "Read in a PREFIX file and replace the internal prefix database with the content." + " https://ct.wiimm.de/export/prefix is the authoritative source for this." }, + + { T_OPT_CP, "PLUS", "plus", + "chars", + "If a name begins with a plus sign, then all characters up to the first space" + " are recognized as a plus prefix." + " The first part consists of all the plus signs followed by any other characters." + " The first character of the second part is used to determine the sort value." + " If the second part is empty, then the last plus sign is used instead." + "\n " + " The higher sorting value is now calculated from the number of plus signs" + " in the first part, the more plus signs, the smaller the value." + " The first character from the second part determines the lower value." + " If it is in parameter CHARS then the position determines the value," + " otherwise the ASCII value to which 500 is added." }, + { T_OPT_GMP, "CHDIR", "chdir", "dir", "Set a new working directory for all following options," @@ -1531,7 +1585,7 @@ 0, "Print an ID with 8 characters instead of a SHA-1 sum with" " 40 characters. The SHA-1 sum is used to calculate the ID." - " The ID consists of '0'-'9' and 'a'-'w' (32 characters)." }, + " The ID consists of '0'-'9' and 'a'-'v' (32 different characters)." }, { T_OPT_CO, "BASE64", "base64", "[=mode]", @@ -2578,6 +2632,7 @@ { T_COPT, "RM_AIPARAM", 0,0,0 }, { T_COPY_GRP, "ALIGN", 0,0,0 }, { T_COPT, "LOGGING", 0,0,0 }, + { T_COPT, "TIMING", 0,0,0 }, { T_COPY_GRP, "ENCODE", 0,0,0 }, { T_COPT, "AUTO_ADD", 0,0,0 }, { T_COPT, "MIPMAPS", 0,0,0 }, @@ -2663,7 +2718,11 @@ //---------- COMMAND wszst ARGTEST ---------- { T_CMD_BEG, "ARGTEST", 0,0,0 }, + { T_ALL_OPT, 0, 0,0,0 }, + + //---------- COMMAND wszst EXPAND ---------- + { T_CMD_BEG, "EXPAND", 0,0,0 }, { T_ALL_OPT, 0, 0,0,0 }, //---------- COMMAND wszst TEST ---------- @@ -2840,6 +2899,7 @@ { T_COPT, "BRIEF", 0,0, "Limit output to SZS specific data." }, { T_COPT, "LOGGING", 0,0,0 }, + { T_COPT, "TIMING", 0,0,0 }, //---------- COMMAND wszst _CODE ---------- @@ -3030,6 +3090,19 @@ { T_COPT, "DEST", 0,0,0 }, { T_COPT, "DEST2", 0,0,0 }, + //---------- COMMAND wszst SPLIT ---------- + + { T_CMD_BEG, "SPLIT", 0,0,0 }, + { T_COPT, "LOAD_PREFIX", 0,0,0 }, + { T_COPT, "PLUS", 0,0,0 }, + { T_SEP_OPT, 0,0,0,0 }, + { T_COPT, "IGNORE", 0,0,0 }, + { T_SEP_OPT, 0,0,0,0 }, + { T_COPY_GRP, "SCRIPT", 0,0,0 }, + { T_SEP_OPT, 0,0,0,0 }, + { T_COPT, "DEST", 0,0,0 }, + { T_COPT, "DEST2", 0,0,0 }, + //---------- COMMAND wszst IS_TEXTURE ---------- { T_CMD_BEG, "IS_TEXTURE", 0,0,0 }, @@ -3247,6 +3320,7 @@ { T_COPT, "IGNORE_SETUP", 0,0,0 }, { T_COPY_GRP, "ALIGN", 0,0,0 }, { T_COPT, "LOGGING", 0,0,0 }, + { T_COPT, "TIMING", 0,0,0 }, { T_COPY_GRP, "ENCODE", 0,0,0 }, { T_COPT, "MIPMAPS", 0,0,0 }, { T_COPT, "NO_MIPMAPS", 0,0,0 }, diff --git a/project/src/ui/ui-wbmgt.c b/project/src/ui/ui-wbmgt.c index aa991c4..0741af3 100644 --- a/project/src/ui/ui-wbmgt.c +++ b/project/src/ui/ui-wbmgt.c @@ -353,6 +353,11 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = " --width is set." }, + { OPT_NO_PAGER, false, false, false, true, false, 0, "no-pager", + 0, + "Forbid the internal usage of a pager." + }, + { OPT_QUIET, false, false, false, false, false, 'q', "quiet", 0, "Be quiet and print only error messages. Multiple usage is possible." @@ -368,7 +373,14 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = { OPT_LOGGING, false, false, false, false, false, 'L', "logging", 0, - "This debug option enables the logging of internal lists and maps." + "This debug option enables the logging of internal lists and maps. Set" + " it up to three times to be more verbose.\n" + }, + + { OPT_TIMING, false, false, false, false, false, 0, "timing", + 0, + "Activate the timing of some operations. Logging level 3 activates" + " them too.\n" }, { OPT_WARN, false, false, false, false, false, 'W', "warn", @@ -541,7 +553,7 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = " helper option." }, - {0,0,0,0,0,0,0,0,0,0} // OPT__N_TOTAL == 64 + {0,0,0,0,0,0,0,0,0,0} // OPT__N_TOTAL == 66 }; @@ -641,6 +653,7 @@ static const KeywordTab_t CommandTab[] = { CMD_HELP, "?", 0, 0 }, { CMD_CONFIG, "CONFIG", 0, 0 }, { CMD_ARGTEST, "ARGTEST", 0, 0 }, + { CMD_EXPAND, "EXPAND", 0, 0 }, { CMD_TEST, "TEST", 0, 0 }, { CMD_COLORS, "COLORS", 0, 0 }, { CMD_ERROR, "ERROR", "ERR", 0 }, @@ -684,9 +697,12 @@ static const struct option OptionLong[] = { "width", 1, 0, GO_WIDTH }, { "max-width", 1, 0, GO_MAX_WIDTH }, { "maxwidth", 1, 0, GO_MAX_WIDTH }, + { "no-pager", 0, 0, GO_NO_PAGER }, + { "nopager", 0, 0, GO_NO_PAGER }, { "quiet", 0, 0, 'q' }, { "verbose", 0, 0, 'v' }, { "logging", 0, 0, 'L' }, + { "timing", 0, 0, GO_TIMING }, { "warn", 1, 0, 'W' }, { "de", 0, 0, GO_DE }, { "colors", 2, 0, GO_COLORS }, @@ -840,39 +856,41 @@ static const OptionIndex_t OptionIndex[UIOPT_INDEX_SIZE] = /* 0x083 */ OPT_COMPATIBLE, /* 0x084 */ OPT_WIDTH, /* 0x085 */ OPT_MAX_WIDTH, - /* 0x086 */ OPT_DE, - /* 0x087 */ OPT_COLORS, - /* 0x088 */ OPT_NO_COLORS, - /* 0x089 */ OPT_CT_CODE, - /* 0x08a */ OPT_LE_CODE, - /* 0x08b */ OPT_CHDIR, - /* 0x08c */ OPT_POINTS, - /* 0x08d */ OPT_UTF_8, - /* 0x08e */ OPT_NO_UTF_8, - /* 0x08f */ OPT_FORCE, - /* 0x090 */ OPT_REPAIR_MAGICS, - /* 0x091 */ OPT_OLD, - /* 0x092 */ OPT_STD, - /* 0x093 */ OPT_NEW, - /* 0x094 */ OPT_EXTRACT, - /* 0x095 */ OPT_NUMBER, - /* 0x096 */ OPT_ALIGN, - /* 0x097 */ OPT_MACRO_BMG, - /* 0x098 */ OPT_FILTER_BMG, - /* 0x099 */ OPT_BMG_ENDIAN, - /* 0x09a */ OPT_BMG_ENCODING, - /* 0x09b */ OPT_BMG_INF_SIZE, - /* 0x09c */ OPT_BMG_MID, - /* 0x09d */ OPT_FORCE_ATTRIB, - /* 0x09e */ OPT_DEF_ATTRIB, - /* 0x09f */ OPT_NO_ATTRIB, - /* 0x0a0 */ OPT_X_ESCAPES, - /* 0x0a1 */ OPT_OLD_ESCAPES, - /* 0x0a2 */ OPT_NO_BMG_COLORS, - /* 0x0a3 */ OPT_BMG_COLORS, - /* 0x0a4 */ OPT_NO_BMG_INLINE, - /* 0x0a5 */ OPT_SECTIONS, - /* 0x0a6 */ 0,0,0,0, 0,0,0,0, 0,0, + /* 0x086 */ OPT_NO_PAGER, + /* 0x087 */ OPT_TIMING, + /* 0x088 */ OPT_DE, + /* 0x089 */ OPT_COLORS, + /* 0x08a */ OPT_NO_COLORS, + /* 0x08b */ OPT_CT_CODE, + /* 0x08c */ OPT_LE_CODE, + /* 0x08d */ OPT_CHDIR, + /* 0x08e */ OPT_POINTS, + /* 0x08f */ OPT_UTF_8, + /* 0x090 */ OPT_NO_UTF_8, + /* 0x091 */ OPT_FORCE, + /* 0x092 */ OPT_REPAIR_MAGICS, + /* 0x093 */ OPT_OLD, + /* 0x094 */ OPT_STD, + /* 0x095 */ OPT_NEW, + /* 0x096 */ OPT_EXTRACT, + /* 0x097 */ OPT_NUMBER, + /* 0x098 */ OPT_ALIGN, + /* 0x099 */ OPT_MACRO_BMG, + /* 0x09a */ OPT_FILTER_BMG, + /* 0x09b */ OPT_BMG_ENDIAN, + /* 0x09c */ OPT_BMG_ENCODING, + /* 0x09d */ OPT_BMG_INF_SIZE, + /* 0x09e */ OPT_BMG_MID, + /* 0x09f */ OPT_FORCE_ATTRIB, + /* 0x0a0 */ OPT_DEF_ATTRIB, + /* 0x0a1 */ OPT_NO_ATTRIB, + /* 0x0a2 */ OPT_X_ESCAPES, + /* 0x0a3 */ OPT_OLD_ESCAPES, + /* 0x0a4 */ OPT_NO_BMG_COLORS, + /* 0x0a5 */ OPT_BMG_COLORS, + /* 0x0a6 */ OPT_NO_BMG_INLINE, + /* 0x0a7 */ OPT_SECTIONS, + /* 0x0a8 */ 0,0,0,0, 0,0,0,0, /* 0x0b0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* 0x0c0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* 0x0d0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, @@ -913,109 +931,115 @@ static u8 option_allowed_cmd_ARGTEST[32] = // cmd #4 1,1 }; -static u8 option_allowed_cmd_TEST[32] = // cmd #5 +static u8 option_allowed_cmd_EXPAND[32] = // cmd #5 { 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1 }; -static u8 option_allowed_cmd_COLORS[32] = // cmd #6 +static u8 option_allowed_cmd_TEST[32] = // cmd #6 +{ + 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, + 1,1 +}; + +static u8 option_allowed_cmd_COLORS[32] = // cmd #7 { 0,1,0,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0 }; -static u8 option_allowed_cmd_ERROR[32] = // cmd #7 +static u8 option_allowed_cmd_ERROR[32] = // cmd #8 { 0,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,1 }; -static u8 option_allowed_cmd_FILETYPE[32] = // cmd #8 +static u8 option_allowed_cmd_FILETYPE[32] = // cmd #9 { 0,1,0,0,0, 0,0,0,0,0, 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0 }; -static u8 option_allowed_cmd_FILEATTRIB[32] = // cmd #9 +static u8 option_allowed_cmd_FILEATTRIB[32] = // cmd #10 { 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0 }; -static u8 option_allowed_cmd_POINTS[32] = // cmd #10 +static u8 option_allowed_cmd_POINTS[32] = // cmd #11 { 0,1,0,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0 }; -static u8 option_allowed_cmd_REGEXP[32] = // cmd #11 +static u8 option_allowed_cmd_REGEXP[32] = // cmd #12 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0 }; -static u8 option_allowed_cmd_EXTRACT[32] = // cmd #12 +static u8 option_allowed_cmd_EXTRACT[32] = // cmd #13 { 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0 }; -static u8 option_allowed_cmd_SECTIONS[32] = // cmd #13 +static u8 option_allowed_cmd_SECTIONS[32] = // cmd #14 { 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0 }; -static u8 option_allowed_cmd_LIST[32] = // cmd #14 +static u8 option_allowed_cmd_LIST[32] = // cmd #15 { 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,1, 1,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0 }; -static u8 option_allowed_cmd_SLOTS[32] = // cmd #15 +static u8 option_allowed_cmd_SLOTS[32] = // cmd #16 { 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,1, 1,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0 }; -static u8 option_allowed_cmd_DIFF[32] = // cmd #16 +static u8 option_allowed_cmd_DIFF[32] = // cmd #17 { 0,0,0,0,1, 0,1,0,0,0, 0,0,0,0,1, 1,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0 }; -static u8 option_allowed_cmd_CAT[32] = // cmd #17 +static u8 option_allowed_cmd_CAT[32] = // cmd #18 { 0,1,1,1,0, 0,0,0,0,0, 0,0,1,0,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0 }; -static u8 option_allowed_cmd_MIX[32] = // cmd #18 +static u8 option_allowed_cmd_MIX[32] = // cmd #19 { 0,1,1,1,0, 0,0,0,0,0, 0,0,1,0,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0 }; -static u8 option_allowed_cmd_IDENTIFIER[32] = // cmd #19 +static u8 option_allowed_cmd_IDENTIFIER[32] = // cmd #20 { 0,1,1,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0 }; -static u8 option_allowed_cmd_DECODE[32] = // cmd #20 +static u8 option_allowed_cmd_DECODE[32] = // cmd #21 { 0,1,1,1,1, 1,1,1,1,1, 1,1,1,0,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0 }; -static u8 option_allowed_cmd_ENCODE[32] = // cmd #21 +static u8 option_allowed_cmd_ENCODE[32] = // cmd #22 { 0,0,0,0,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 }; -static u8 option_allowed_cmd_PATCH[32] = // cmd #22 +static u8 option_allowed_cmd_PATCH[32] = // cmd #23 { 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0 @@ -1037,9 +1061,11 @@ static const InfoOption_t * option_tab_tool[] = OptionInfo + OPT_COMPATIBLE, OptionInfo + OPT_WIDTH, OptionInfo + OPT_MAX_WIDTH, + OptionInfo + OPT_NO_PAGER, OptionInfo + OPT_QUIET, OptionInfo + OPT_VERBOSE, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_WARN, OptionInfo + OPT_DE, OptionInfo + OPT_COLORS, @@ -1094,6 +1120,12 @@ static const InfoOption_t * option_tab_cmd_ARGTEST[] = 0 }; +static const InfoOption_t * option_tab_cmd_EXPAND[] = +{ + + 0 +}; + static const InfoOption_t * option_tab_cmd_TEST[] = { @@ -1422,7 +1454,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "wbmgt [option]... command [option|parameter|file]...", "Wiimms BMG Tool : Convert and patch raw and text BMG (message) files.", 0, - 26, + 28, option_tab_tool, 0 }, @@ -1488,13 +1520,32 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = 0, "wbmgt ARGTEST ...", "This debug command accepts all kinds of parameters and prints one" - " line for each parameter.", + " line for each parameter. All tools know the ARGTEST command.", 0, 0, option_tab_cmd_ARGTEST, option_allowed_cmd_ARGTEST }, + { CMD_EXPAND, + false, + false, + false, + "EXPAND", + 0, + "wbmgt EXPAND ...", + "This debug command accepts (like ARGTEST) all kinds of parameters and" + " prints one line for each parameter. After that, the parameter is" + " treated as a filename with wildcards and all matching files are" + " searched. The special parameters '+h' and '/h' enable or disable the" + " search for hidden directories and files (files beginning with a" + " point). All tools know the EXPAND command.", + 0, + 0, + option_tab_cmd_EXPAND, + option_allowed_cmd_EXPAND + }, + { CMD_TEST, false, false, @@ -1534,7 +1585,8 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "ERR", "wbmgt ERROR [error_code]", "Translate an exit code to a message name. If no exit code is entered," - " print a table with all error messages.", + " print a table with all error messages. All tools know the ERROR" + " command.", 0, 4, option_tab_cmd_ERROR, @@ -1549,7 +1601,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "FT", "wbmgt FILETYPE file...", "Scan the header of the entered files and print file type and path for" - " each file as list.", + " each file as list. All tools know the FILETYPE command.", 0, 2, option_tab_cmd_FILETYPE, @@ -1566,7 +1618,8 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "Print a table with attributes for all known file types. If at least" " one keyword is entered, only matching file types are printed. A" " keyword is either a file type (like 'BRRES' or 'BMG') or one of the" - " printed keywords (like 'ARCHIVE' or 'EXTRACT').", + " printed keywords (like 'ARCHIVE' or 'EXTRACT'). All tools know the" + " FILEATTRIB command.", 0, 1, option_tab_cmd_FILEATTRIB, diff --git a/project/src/ui/ui-wbmgt.h b/project/src/ui/ui-wbmgt.h index 855342f..31f238f 100644 --- a/project/src/ui/ui-wbmgt.h +++ b/project/src/ui/ui-wbmgt.h @@ -100,9 +100,11 @@ typedef enum enumOptions OPT_COMPATIBLE, OPT_WIDTH, OPT_MAX_WIDTH, + OPT_NO_PAGER, OPT_QUIET, OPT_VERBOSE, OPT_LOGGING, + OPT_TIMING, OPT_WARN, OPT_DE, OPT_COLORS, @@ -125,7 +127,7 @@ typedef enum enumOptions OPT_NEW, OPT_EXTRACT, - OPT__N_TOTAL // == 64 + OPT__N_TOTAL // == 66 } enumOptions; @@ -212,6 +214,8 @@ typedef enum enumOptions // // OB_CMD_ARGTEST = ~(u64)0, // +// OB_CMD_EXPAND = ~(u64)0, +// // OB_CMD_TEST = ~(u64)0, // // OB_CMD_COLORS = OB_LONG @@ -304,6 +308,7 @@ typedef enum enumCommands CMD_HELP, CMD_CONFIG, CMD_ARGTEST, + CMD_EXPAND, CMD_TEST, CMD_COLORS, CMD_ERROR, @@ -326,7 +331,7 @@ typedef enum enumCommands CMD_PATCH, - CMD__N // == 23 + CMD__N // == 24 } enumCommands; @@ -373,6 +378,8 @@ typedef enum enumGetOpt GO_COMPATIBLE, GO_WIDTH, GO_MAX_WIDTH, + GO_NO_PAGER, + GO_TIMING, GO_DE, GO_COLORS, GO_NO_COLORS, diff --git a/project/src/ui/ui-wctct.c b/project/src/ui/ui-wctct.c index 1344aa3..2d15c1f 100644 --- a/project/src/ui/ui-wctct.c +++ b/project/src/ui/ui-wctct.c @@ -453,6 +453,11 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = " --width is set." }, + { OPT_NO_PAGER, false, false, false, true, false, 0, "no-pager", + 0, + "Forbid the internal usage of a pager." + }, + { OPT_QUIET, false, false, false, false, false, 'q', "quiet", 0, "Be quiet and print only error messages. Multiple usage is possible." @@ -468,7 +473,14 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = { OPT_LOGGING, false, false, false, false, false, 'L', "logging", 0, - "This debug option enables the logging of internal lists and maps." + "This debug option enables the logging of internal lists and maps. Set" + " it up to three times to be more verbose.\n" + }, + + { OPT_TIMING, false, false, false, false, false, 0, "timing", + 0, + "Activate the timing of some operations. Logging level 3 activates" + " them too.\n" }, { OPT_WARN, false, false, false, false, false, 'W', "warn", @@ -616,6 +628,12 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = ">>> THE RESULT MAY BE INVALID OUTPUT FILES! <<<" }, + { OPT_CREATE_DISTRIB, false, false, false, false, false, 0, "create-distrib", + "file", + "Create a LE-CODE distribution dump with a track list and more info" + " about the current distribution. Store the dump info a file." + }, + { OPT_OLD, false, true, false, false, false, 0, "OLD", 0, "Developer option: Cancel --NEW and use old implementation if" @@ -672,7 +690,7 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = " 0x3b:0x41 and 0x44:0xfe." }, - {0,0,0,0,0,0,0,0,0,0} // OPT__N_TOTAL == 83 + {0,0,0,0,0,0,0,0,0,0} // OPT__N_TOTAL == 86 }; @@ -834,6 +852,7 @@ static const KeywordTab_t CommandTab[] = { CMD_HELP, "?", 0, 0 }, { CMD_CONFIG, "CONFIG", 0, 0 }, { CMD_ARGTEST, "ARGTEST", 0, 0 }, + { CMD_EXPAND, "EXPAND", 0, 0 }, { CMD_TEST, "TEST", 0, 0 }, { CMD_COLORS, "COLORS", 0, 0 }, { CMD_ERROR, "ERROR", "ERR", 0 }, @@ -875,9 +894,12 @@ static const struct option OptionLong[] = { "width", 1, 0, GO_WIDTH }, { "max-width", 1, 0, GO_MAX_WIDTH }, { "maxwidth", 1, 0, GO_MAX_WIDTH }, + { "no-pager", 0, 0, GO_NO_PAGER }, + { "nopager", 0, 0, GO_NO_PAGER }, { "quiet", 0, 0, 'q' }, { "verbose", 0, 0, 'v' }, { "logging", 0, 0, 'L' }, + { "timing", 0, 0, GO_TIMING }, { "warn", 1, 0, 'W' }, { "de", 0, 0, GO_DE }, { "colors", 2, 0, GO_COLORS }, @@ -944,6 +966,8 @@ static const struct option OptionLong[] = { "force", 0, 0, GO_FORCE }, { "repair-magics", 2, 0, GO_REPAIR_MAGICS }, { "repairmagics", 2, 0, GO_REPAIR_MAGICS }, + { "create-distrib", 1, 0, GO_CREATE_DISTRIB }, + { "createdistrib", 1, 0, GO_CREATE_DISTRIB }, { "OLD", 0, 0, GO_OLD }, { "STD", 0, 0, GO_STD }, { "NEW", 0, 0, GO_NEW }, @@ -1058,57 +1082,60 @@ static const OptionIndex_t OptionIndex[UIOPT_INDEX_SIZE] = /* 0x083 */ OPT_COMPATIBLE, /* 0x084 */ OPT_WIDTH, /* 0x085 */ OPT_MAX_WIDTH, - /* 0x086 */ OPT_DE, - /* 0x087 */ OPT_COLORS, - /* 0x088 */ OPT_NO_COLORS, - /* 0x089 */ OPT_CT_CODE, - /* 0x08a */ OPT_LE_CODE, - /* 0x08b */ OPT_OLD_SPINY, - /* 0x08c */ OPT_CRS1, - /* 0x08d */ OPT_CHDIR, - /* 0x08e */ OPT_ROUND, - /* 0x08f */ OPT_RAW, - /* 0x090 */ OPT_BMG_ENDIAN, - /* 0x091 */ OPT_BMG_ENCODING, - /* 0x092 */ OPT_BMG_INF_SIZE, - /* 0x093 */ OPT_BMG_MID, - /* 0x094 */ OPT_FORCE_ATTRIB, - /* 0x095 */ OPT_DEF_ATTRIB, - /* 0x096 */ OPT_NO_ATTRIB, - /* 0x097 */ OPT_X_ESCAPES, - /* 0x098 */ OPT_OLD_ESCAPES, - /* 0x099 */ OPT_NO_BMG_COLORS, - /* 0x09a */ OPT_BMG_COLORS, - /* 0x09b */ OPT_NO_BMG_INLINE, - /* 0x09c */ OPT_NO_ECHO, - /* 0x09d */ OPT_UTF_8, - /* 0x09e */ OPT_NO_UTF_8, - /* 0x09f */ OPT_FORCE, - /* 0x0a0 */ OPT_REPAIR_MAGICS, - /* 0x0a1 */ OPT_OLD, - /* 0x0a2 */ OPT_STD, - /* 0x0a3 */ OPT_NEW, - /* 0x0a4 */ OPT_EXTRACT, - /* 0x0a5 */ OPT_LIST, - /* 0x0a6 */ OPT_REF, - /* 0x0a7 */ OPT_FULL, - /* 0x0a8 */ OPT_HEX, - /* 0x0a9 */ OPT_CT_DIR, - /* 0x0aa */ OPT_CT_LOG, - /* 0x0ab */ OPT_ALLOW_SLOTS, - /* 0x0ac */ OPT_IMAGES, - /* 0x0ad */ OPT_LOAD_BMG, - /* 0x0ae */ OPT_PATCH_BMG, - /* 0x0af */ OPT_MACRO_BMG, - /* 0x0b0 */ OPT_FILTER_BMG, - /* 0x0b1 */ OPT_PATCH_NAMES, - /* 0x0b2 */ OPT_ORDER_BY, - /* 0x0b3 */ OPT_ORDER_ALL, - /* 0x0b4 */ OPT_DYNAMIC, - /* 0x0b5 */ OPT_WRITE_TRACKS, - /* 0x0b6 */ OPT_NUMBER, - /* 0x0b7 */ OPT_SECTIONS, - /* 0x0b8 */ 0,0,0,0, 0,0,0,0, + /* 0x086 */ OPT_NO_PAGER, + /* 0x087 */ OPT_TIMING, + /* 0x088 */ OPT_DE, + /* 0x089 */ OPT_COLORS, + /* 0x08a */ OPT_NO_COLORS, + /* 0x08b */ OPT_CT_CODE, + /* 0x08c */ OPT_LE_CODE, + /* 0x08d */ OPT_OLD_SPINY, + /* 0x08e */ OPT_CRS1, + /* 0x08f */ OPT_CHDIR, + /* 0x090 */ OPT_ROUND, + /* 0x091 */ OPT_RAW, + /* 0x092 */ OPT_BMG_ENDIAN, + /* 0x093 */ OPT_BMG_ENCODING, + /* 0x094 */ OPT_BMG_INF_SIZE, + /* 0x095 */ OPT_BMG_MID, + /* 0x096 */ OPT_FORCE_ATTRIB, + /* 0x097 */ OPT_DEF_ATTRIB, + /* 0x098 */ OPT_NO_ATTRIB, + /* 0x099 */ OPT_X_ESCAPES, + /* 0x09a */ OPT_OLD_ESCAPES, + /* 0x09b */ OPT_NO_BMG_COLORS, + /* 0x09c */ OPT_BMG_COLORS, + /* 0x09d */ OPT_NO_BMG_INLINE, + /* 0x09e */ OPT_NO_ECHO, + /* 0x09f */ OPT_UTF_8, + /* 0x0a0 */ OPT_NO_UTF_8, + /* 0x0a1 */ OPT_FORCE, + /* 0x0a2 */ OPT_REPAIR_MAGICS, + /* 0x0a3 */ OPT_CREATE_DISTRIB, + /* 0x0a4 */ OPT_OLD, + /* 0x0a5 */ OPT_STD, + /* 0x0a6 */ OPT_NEW, + /* 0x0a7 */ OPT_EXTRACT, + /* 0x0a8 */ OPT_LIST, + /* 0x0a9 */ OPT_REF, + /* 0x0aa */ OPT_FULL, + /* 0x0ab */ OPT_HEX, + /* 0x0ac */ OPT_CT_DIR, + /* 0x0ad */ OPT_CT_LOG, + /* 0x0ae */ OPT_ALLOW_SLOTS, + /* 0x0af */ OPT_IMAGES, + /* 0x0b0 */ OPT_LOAD_BMG, + /* 0x0b1 */ OPT_PATCH_BMG, + /* 0x0b2 */ OPT_MACRO_BMG, + /* 0x0b3 */ OPT_FILTER_BMG, + /* 0x0b4 */ OPT_PATCH_NAMES, + /* 0x0b5 */ OPT_ORDER_BY, + /* 0x0b6 */ OPT_ORDER_ALL, + /* 0x0b7 */ OPT_DYNAMIC, + /* 0x0b8 */ OPT_WRITE_TRACKS, + /* 0x0b9 */ OPT_NUMBER, + /* 0x0ba */ OPT_SECTIONS, + /* 0x0bb */ 0,0,0,0, 0, /* 0x0c0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* 0x0d0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* 0x0e0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, @@ -1148,109 +1175,115 @@ static u8 option_allowed_cmd_ARGTEST[47] = // cmd #4 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1 }; -static u8 option_allowed_cmd_TEST[47] = // cmd #5 +static u8 option_allowed_cmd_EXPAND[47] = // cmd #5 +{ + 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, + 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1 +}; + +static u8 option_allowed_cmd_TEST[47] = // cmd #6 { 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1 }; -static u8 option_allowed_cmd_COLORS[47] = // cmd #6 +static u8 option_allowed_cmd_COLORS[47] = // cmd #7 { 0,0,1,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0 }; -static u8 option_allowed_cmd_ERROR[47] = // cmd #7 +static u8 option_allowed_cmd_ERROR[47] = // cmd #8 { 0,0,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,1 }; -static u8 option_allowed_cmd_FILETYPE[47] = // cmd #8 +static u8 option_allowed_cmd_FILETYPE[47] = // cmd #9 { 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1,0 }; -static u8 option_allowed_cmd_FILEATTRIB[47] = // cmd #9 +static u8 option_allowed_cmd_FILEATTRIB[47] = // cmd #10 { 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0 }; -static u8 option_allowed_cmd_SYMBOLS[47] = // cmd #10 +static u8 option_allowed_cmd_SYMBOLS[47] = // cmd #11 { 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0 }; -static u8 option_allowed_cmd_FUNCTIONS[47] = // cmd #11 +static u8 option_allowed_cmd_FUNCTIONS[47] = // cmd #12 { 0,0,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 }; -static u8 option_allowed_cmd_CALCULATE[47] = // cmd #12 +static u8 option_allowed_cmd_CALCULATE[47] = // cmd #13 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0 }; -static u8 option_allowed_cmd_FLOAT[47] = // cmd #13 +static u8 option_allowed_cmd_FLOAT[47] = // cmd #14 { 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0 }; -static u8 option_allowed_cmd_EXPORT[47] = // cmd #14 +static u8 option_allowed_cmd_EXPORT[47] = // cmd #15 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0 }; -static u8 option_allowed_cmd_RAWDUMP[47] = // cmd #15 +static u8 option_allowed_cmd_RAWDUMP[47] = // cmd #16 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,1,0, 0,0,0,0,0, 0,0 }; -static u8 option_allowed_cmd_DUMP[47] = // cmd #16 +static u8 option_allowed_cmd_DUMP[47] = // cmd #17 { 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 1,1,1,1,1, 0,0,0,0,0, 0,0,0,0,0, 0,0 }; -static u8 option_allowed_cmd_CAT[47] = // cmd #17 +static u8 option_allowed_cmd_CAT[47] = // cmd #18 { 0,0,0,1,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 0,1,1,1,1, 1,1,0,1,1, 1,1,1,1,1, 0,1,0,0,0, 0,0,0,0,0, 1,0 }; -static u8 option_allowed_cmd_BMG[47] = // cmd #18 +static u8 option_allowed_cmd_BMG[47] = // cmd #19 { 0,0,1,1,1, 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,1,1,1,1, 1,1,0,1,1, 1,1,1,1,1, 0,1,0,0,0, 0,0,0,0,0, 1,0 }; -static u8 option_allowed_cmd_TRACKS[47] = // cmd #19 +static u8 option_allowed_cmd_TRACKS[47] = // cmd #20 { 0,0,1,1,1, 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 0,1,1,1,1, 1,1,0,1,1, 1,1,1,1,1, 0,1,0,0,0, 0,0,0,0,0, 1,0 }; -static u8 option_allowed_cmd_DECODE[47] = // cmd #20 +static u8 option_allowed_cmd_DECODE[47] = // cmd #21 { 0,0,0,1,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 0,1,1,1,1, 1,1,0,1,1, 1,1,1,1,1, 0,1,1,1,1, 1,1,1,1,1, 1,0 }; -static u8 option_allowed_cmd_CREATE[47] = // cmd #21 +static u8 option_allowed_cmd_CREATE[47] = // cmd #22 { 0,0,1,1,1, 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,1,1,0,0, 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0 }; -static u8 option_allowed_cmd_PATCH[47] = // cmd #22 +static u8 option_allowed_cmd_PATCH[47] = // cmd #23 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,0, 0,0,0,1,1, 1,1,1,1,1, 0,1,1,1,1, 1,1,1,1,1, 1,0 @@ -1272,9 +1305,11 @@ static const InfoOption_t * option_tab_tool[] = OptionInfo + OPT_COMPATIBLE, OptionInfo + OPT_WIDTH, OptionInfo + OPT_MAX_WIDTH, + OptionInfo + OPT_NO_PAGER, OptionInfo + OPT_QUIET, OptionInfo + OPT_VERBOSE, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_WARN, OptionInfo + OPT_DE, OptionInfo + OPT_COLORS, @@ -1292,6 +1327,7 @@ static const InfoOption_t * option_tab_tool[] = OptionInfo + OPT_TEST, OptionInfo + OPT_FORCE, OptionInfo + OPT_REPAIR_MAGICS, + OptionInfo + OPT_CREATE_DISTRIB, OptionInfo + OPT_NONE, // separator @@ -1334,6 +1370,12 @@ static const InfoOption_t * option_tab_cmd_ARGTEST[] = 0 }; +static const InfoOption_t * option_tab_cmd_EXPAND[] = +{ + + 0 +}; + static const InfoOption_t * option_tab_cmd_TEST[] = { @@ -1654,7 +1696,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "Wiimms CT-CODE Tool : Manage the CT-CODE extension. BRRES, TEX0," " CT-CODE, CT-TEXT and LE-BIN files are accepted as input.", 0, - 28, + 31, option_tab_tool, 0 }, @@ -1720,13 +1762,32 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = 0, "wctct ARGTEST ...", "This debug command accepts all kinds of parameters and prints one" - " line for each parameter.", + " line for each parameter. All tools know the ARGTEST command.", 0, 0, option_tab_cmd_ARGTEST, option_allowed_cmd_ARGTEST }, + { CMD_EXPAND, + false, + false, + false, + "EXPAND", + 0, + "wctct EXPAND ...", + "This debug command accepts (like ARGTEST) all kinds of parameters and" + " prints one line for each parameter. After that, the parameter is" + " treated as a filename with wildcards and all matching files are" + " searched. The special parameters '+h' and '/h' enable or disable the" + " search for hidden directories and files (files beginning with a" + " point). All tools know the EXPAND command.", + 0, + 0, + option_tab_cmd_EXPAND, + option_allowed_cmd_EXPAND + }, + { CMD_TEST, false, false, @@ -1766,7 +1827,8 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "ERR", "wctct ERROR [error_code]", "Translate an exit code to a message name. If no exit code is entered," - " print a table with all error messages.", + " print a table with all error messages. All tools know the ERROR" + " command.", 0, 4, option_tab_cmd_ERROR, @@ -1781,7 +1843,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "FT", "wctct FILETYPE file...", "Scan the header of the entered files and print file type and path for" - " each file as list.", + " each file as list. All tools know the FILETYPE command.", 0, 2, option_tab_cmd_FILETYPE, @@ -1798,7 +1860,8 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "Print a table with attributes for all known file types. If at least" " one keyword is entered, only matching file types are printed. A" " keyword is either a file type (like 'BRRES' or 'BMG') or one of the" - " printed keywords (like 'ARCHIVE' or 'EXTRACT').", + " printed keywords (like 'ARCHIVE' or 'EXTRACT'). All tools know the" + " FILEATTRIB command.", 0, 1, option_tab_cmd_FILEATTRIB, @@ -1843,7 +1906,8 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "CALCULATE", 0, "wctct CALCULATE expression...", - "Calculate each expression and print the result to standard output.", + "Calculate each expression and print the result to standard output." + " Many tools know the CALCULATE command.", 0, 1, option_tab_cmd_CALCULATE, diff --git a/project/src/ui/ui-wctct.h b/project/src/ui/ui-wctct.h index 532b082..f55d4ad 100644 --- a/project/src/ui/ui-wctct.h +++ b/project/src/ui/ui-wctct.h @@ -115,9 +115,11 @@ typedef enum enumOptions OPT_COMPATIBLE, OPT_WIDTH, OPT_MAX_WIDTH, + OPT_NO_PAGER, OPT_QUIET, OPT_VERBOSE, OPT_LOGGING, + OPT_TIMING, OPT_WARN, OPT_DE, OPT_COLORS, @@ -136,6 +138,7 @@ typedef enum enumOptions OPT_TEST, OPT_FORCE, OPT_REPAIR_MAGICS, + OPT_CREATE_DISTRIB, OPT_OLD, OPT_STD, OPT_NEW, @@ -144,7 +147,7 @@ typedef enum enumOptions OPT_CT_LOG, OPT_ALLOW_SLOTS, - OPT__N_TOTAL // == 83 + OPT__N_TOTAL // == 86 } enumOptions; @@ -248,6 +251,8 @@ typedef enum enumOptions // // OB_CMD_ARGTEST = ~(u64)0, // +// OB_CMD_EXPAND = ~(u64)0, +// // OB_CMD_TEST = ~(u64)0, // // OB_CMD_COLORS = OB_LONG @@ -374,6 +379,7 @@ typedef enum enumCommands CMD_HELP, CMD_CONFIG, CMD_ARGTEST, + CMD_EXPAND, CMD_TEST, CMD_COLORS, CMD_ERROR, @@ -395,7 +401,7 @@ typedef enum enumCommands CMD_PATCH, - CMD__N // == 23 + CMD__N // == 24 } enumCommands; @@ -443,6 +449,8 @@ typedef enum enumGetOpt GO_COMPATIBLE, GO_WIDTH, GO_MAX_WIDTH, + GO_NO_PAGER, + GO_TIMING, GO_DE, GO_COLORS, GO_NO_COLORS, @@ -470,6 +478,7 @@ typedef enum enumGetOpt GO_NO_UTF_8, GO_FORCE, GO_REPAIR_MAGICS, + GO_CREATE_DISTRIB, GO_OLD, GO_STD, GO_NEW, diff --git a/project/src/ui/ui-wimgt.c b/project/src/ui/ui-wimgt.c index 7ffff1c..c6eca37 100644 --- a/project/src/ui/ui-wimgt.c +++ b/project/src/ui/ui-wimgt.c @@ -316,6 +316,11 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = " --width is set." }, + { OPT_NO_PAGER, false, false, false, true, false, 0, "no-pager", + 0, + "Forbid the internal usage of a pager." + }, + { OPT_QUIET, false, false, false, false, false, 'q', "quiet", 0, "Be quiet and print only error messages. Multiple usage is possible." @@ -331,7 +336,14 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = { OPT_LOGGING, false, false, false, false, false, 'L', "logging", 0, - "This debug option enables the logging of internal lists and maps." + "This debug option enables the logging of internal lists and maps. Set" + " it up to three times to be more verbose.\n" + }, + + { OPT_TIMING, false, false, false, false, false, 0, "timing", + 0, + "Activate the timing of some operations. Logging level 3 activates" + " them too.\n" }, { OPT_WARN, false, false, false, false, false, 'W', "warn", @@ -492,7 +504,7 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = " helper option." }, - {0,0,0,0,0,0,0,0,0,0} // OPT__N_TOTAL == 57 + {0,0,0,0,0,0,0,0,0,0} // OPT__N_TOTAL == 59 }; @@ -588,6 +600,7 @@ static const KeywordTab_t CommandTab[] = { CMD_HELP, "?", 0, 0 }, { CMD_CONFIG, "CONFIG", 0, 0 }, { CMD_ARGTEST, "ARGTEST", 0, 0 }, + { CMD_EXPAND, "EXPAND", 0, 0 }, { CMD_TEST, "TEST", 0, 0 }, { CMD_COLORS, "COLORS", 0, 0 }, { CMD_ERROR, "ERROR", "ERR", 0 }, @@ -625,9 +638,12 @@ static const struct option OptionLong[] = { "width", 1, 0, GO_WIDTH }, { "max-width", 1, 0, GO_MAX_WIDTH }, { "maxwidth", 1, 0, GO_MAX_WIDTH }, + { "no-pager", 0, 0, GO_NO_PAGER }, + { "nopager", 0, 0, GO_NO_PAGER }, { "quiet", 0, 0, 'q' }, { "verbose", 0, 0, 'v' }, { "logging", 0, 0, 'L' }, + { "timing", 0, 0, GO_TIMING }, { "warn", 1, 0, 'W' }, { "de", 0, 0, GO_DE }, { "colors", 2, 0, GO_COLORS }, @@ -766,33 +782,34 @@ static const OptionIndex_t OptionIndex[UIOPT_INDEX_SIZE] = /* 0x083 */ OPT_COMPATIBLE, /* 0x084 */ OPT_WIDTH, /* 0x085 */ OPT_MAX_WIDTH, - /* 0x086 */ OPT_DE, - /* 0x087 */ OPT_COLORS, - /* 0x088 */ OPT_NO_COLORS, - /* 0x089 */ OPT_CT_CODE, - /* 0x08a */ OPT_LE_CODE, - /* 0x08b */ OPT_CHDIR, - /* 0x08c */ OPT_UTF_8, - /* 0x08d */ OPT_NO_UTF_8, - /* 0x08e */ OPT_FORCE, - /* 0x08f */ OPT_REPAIR_MAGICS, - /* 0x090 */ OPT_OLD, - /* 0x091 */ OPT_STD, - /* 0x092 */ OPT_NEW, - /* 0x093 */ OPT_EXTRACT, - /* 0x094 */ OPT_NUMBER, - /* 0x095 */ OPT_MIPMAPS, - /* 0x096 */ OPT_NO_MIPMAPS, - /* 0x097 */ OPT_N_MIPMAPS, - /* 0x098 */ OPT_MAX_MIPMAPS, - /* 0x099 */ OPT_MIPMAP_SIZE, - /* 0x09a */ OPT_FAST_MIPMAPS, - /* 0x09b */ OPT_CMPR_DEFAULT, - /* 0x09c */ OPT_PRE_CONVERT, - /* 0x09d */ OPT_STRIP, - /* 0x09e */ OPT_SECTIONS, - /* 0x09f */ 0, - /* 0x0a0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, + /* 0x086 */ OPT_NO_PAGER, + /* 0x087 */ OPT_TIMING, + /* 0x088 */ OPT_DE, + /* 0x089 */ OPT_COLORS, + /* 0x08a */ OPT_NO_COLORS, + /* 0x08b */ OPT_CT_CODE, + /* 0x08c */ OPT_LE_CODE, + /* 0x08d */ OPT_CHDIR, + /* 0x08e */ OPT_UTF_8, + /* 0x08f */ OPT_NO_UTF_8, + /* 0x090 */ OPT_FORCE, + /* 0x091 */ OPT_REPAIR_MAGICS, + /* 0x092 */ OPT_OLD, + /* 0x093 */ OPT_STD, + /* 0x094 */ OPT_NEW, + /* 0x095 */ OPT_EXTRACT, + /* 0x096 */ OPT_NUMBER, + /* 0x097 */ OPT_MIPMAPS, + /* 0x098 */ OPT_NO_MIPMAPS, + /* 0x099 */ OPT_N_MIPMAPS, + /* 0x09a */ OPT_MAX_MIPMAPS, + /* 0x09b */ OPT_MIPMAP_SIZE, + /* 0x09c */ OPT_FAST_MIPMAPS, + /* 0x09d */ OPT_CMPR_DEFAULT, + /* 0x09e */ OPT_PRE_CONVERT, + /* 0x09f */ OPT_STRIP, + /* 0x0a0 */ OPT_SECTIONS, + /* 0x0a1 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0, /* 0x0b0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* 0x0c0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* 0x0d0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, @@ -829,62 +846,67 @@ static u8 option_allowed_cmd_ARGTEST[26] = // cmd #4 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1 }; -static u8 option_allowed_cmd_TEST[26] = // cmd #5 +static u8 option_allowed_cmd_EXPAND[26] = // cmd #5 { 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1 }; -static u8 option_allowed_cmd_COLORS[26] = // cmd #6 +static u8 option_allowed_cmd_TEST[26] = // cmd #6 +{ + 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1 +}; + +static u8 option_allowed_cmd_COLORS[26] = // cmd #7 { 0,1,0,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_ERROR[26] = // cmd #7 +static u8 option_allowed_cmd_ERROR[26] = // cmd #8 { 0,1,1,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1 }; -static u8 option_allowed_cmd_FILETYPE[26] = // cmd #8 +static u8 option_allowed_cmd_FILETYPE[26] = // cmd #9 { 0,1,0,0,0, 0,0,0,0,0, 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_FILEATTRIB[26] = // cmd #9 +static u8 option_allowed_cmd_FILEATTRIB[26] = // cmd #10 { 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_LIST[26] = // cmd #10 +static u8 option_allowed_cmd_LIST[26] = // cmd #11 { 0,1,1,0,0, 0,0,0,0,0, 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_LIST_L[26] = // cmd #11 +static u8 option_allowed_cmd_LIST_L[26] = // cmd #12 { 0,1,1,0,0, 0,0,0,0,0, 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_LIST_LL[26] = // cmd #12 +static u8 option_allowed_cmd_LIST_LL[26] = // cmd #13 { 0,1,1,0,0, 0,0,0,0,0, 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_DECODE[26] = // cmd #13 +static u8 option_allowed_cmd_DECODE[26] = // cmd #14 { 0,0,0,0,1, 1,1,1,1,1, 1,1,1,0,1, 1,1,1,1,1, 1,1,1,1,1, 0 }; -static u8 option_allowed_cmd_ENCODE[26] = // cmd #14 +static u8 option_allowed_cmd_ENCODE[26] = // cmd #15 { 0,0,0,0,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0 }; -static u8 option_allowed_cmd_CONVERT[26] = // cmd #15 +static u8 option_allowed_cmd_CONVERT[26] = // cmd #16 { 0,0,0,0,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0 }; -static u8 option_allowed_cmd_COPY[26] = // cmd #16 +static u8 option_allowed_cmd_COPY[26] = // cmd #17 { 0,0,0,0,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0 }; @@ -905,9 +927,11 @@ static const InfoOption_t * option_tab_tool[] = OptionInfo + OPT_COMPATIBLE, OptionInfo + OPT_WIDTH, OptionInfo + OPT_MAX_WIDTH, + OptionInfo + OPT_NO_PAGER, OptionInfo + OPT_QUIET, OptionInfo + OPT_VERBOSE, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_WARN, OptionInfo + OPT_DE, OptionInfo + OPT_COLORS, @@ -959,6 +983,12 @@ static const InfoOption_t * option_tab_cmd_ARGTEST[] = 0 }; +static const InfoOption_t * option_tab_cmd_EXPAND[] = +{ + + 0 +}; + static const InfoOption_t * option_tab_cmd_TEST[] = { @@ -1188,7 +1218,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "Wiimms Image Tool : Extract and convert graphic images. The file" " formats TPL, TEX, BTI, BREFT and PNG are supported.", 0, - 23, + 25, option_tab_tool, 0 }, @@ -1254,13 +1284,32 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = 0, "wimgt ARGTEST ...", "This debug command accepts all kinds of parameters and prints one" - " line for each parameter.", + " line for each parameter. All tools know the ARGTEST command.", 0, 0, option_tab_cmd_ARGTEST, option_allowed_cmd_ARGTEST }, + { CMD_EXPAND, + false, + false, + false, + "EXPAND", + 0, + "wimgt EXPAND ...", + "This debug command accepts (like ARGTEST) all kinds of parameters and" + " prints one line for each parameter. After that, the parameter is" + " treated as a filename with wildcards and all matching files are" + " searched. The special parameters '+h' and '/h' enable or disable the" + " search for hidden directories and files (files beginning with a" + " point). All tools know the EXPAND command.", + 0, + 0, + option_tab_cmd_EXPAND, + option_allowed_cmd_EXPAND + }, + { CMD_TEST, false, false, @@ -1300,7 +1349,8 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "ERR", "wimgt ERROR [error_code]", "Translate an exit code to a message name. If no exit code is entered," - " print a table with all error messages.", + " print a table with all error messages. All tools know the ERROR" + " command.", 0, 4, option_tab_cmd_ERROR, @@ -1315,7 +1365,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "FT", "wimgt FILETYPE file...", "Scan the header of the entered files and print file type and path for" - " each file as list.", + " each file as list. All tools know the FILETYPE command.", 0, 2, option_tab_cmd_FILETYPE, @@ -1332,7 +1382,8 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "Print a table with attributes for all known file types. If at least" " one keyword is entered, only matching file types are printed. A" " keyword is either a file type (like 'BRRES' or 'BMG') or one of the" - " printed keywords (like 'ARCHIVE' or 'EXTRACT').", + " printed keywords (like 'ARCHIVE' or 'EXTRACT'). All tools know the" + " FILEATTRIB command.", 0, 1, option_tab_cmd_FILEATTRIB, diff --git a/project/src/ui/ui-wimgt.h b/project/src/ui/ui-wimgt.h index 4595e8e..1373c02 100644 --- a/project/src/ui/ui-wimgt.h +++ b/project/src/ui/ui-wimgt.h @@ -94,9 +94,11 @@ typedef enum enumOptions OPT_COMPATIBLE, OPT_WIDTH, OPT_MAX_WIDTH, + OPT_NO_PAGER, OPT_QUIET, OPT_VERBOSE, OPT_LOGGING, + OPT_TIMING, OPT_WARN, OPT_DE, OPT_COLORS, @@ -118,7 +120,7 @@ typedef enum enumOptions OPT_NEW, OPT_EXTRACT, - OPT__N_TOTAL // == 57 + OPT__N_TOTAL // == 59 } enumOptions; @@ -193,6 +195,8 @@ typedef enum enumOptions // // OB_CMD_ARGTEST = ~(u64)0, // +// OB_CMD_EXPAND = ~(u64)0, +// // OB_CMD_TEST = ~(u64)0, // // OB_CMD_COLORS = OB_LONG @@ -244,6 +248,7 @@ typedef enum enumCommands CMD_HELP, CMD_CONFIG, CMD_ARGTEST, + CMD_EXPAND, CMD_TEST, CMD_COLORS, CMD_ERROR, @@ -260,7 +265,7 @@ typedef enum enumCommands CMD_COPY, - CMD__N // == 17 + CMD__N // == 18 } enumCommands; @@ -306,6 +311,8 @@ typedef enum enumGetOpt GO_COMPATIBLE, GO_WIDTH, GO_MAX_WIDTH, + GO_NO_PAGER, + GO_TIMING, GO_DE, GO_COLORS, GO_NO_COLORS, diff --git a/project/src/ui/ui-wkclt.c b/project/src/ui/ui-wkclt.c index adcb273..df62da4 100644 --- a/project/src/ui/ui-wkclt.c +++ b/project/src/ui/ui-wkclt.c @@ -265,7 +265,7 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = 0, "Print an ID with 8 characters instead of a SHA-1 sum with 40" " characters. The SHA-1 sum is used to calculate the ID. The ID" - " consists of '0'-'9' and 'a'-'w' (32 characters)." + " consists of '0'-'9' and 'a'-'v' (32 different characters)." }, { OPT_BASE64, true, false, false, false, false, 0, "base64", @@ -453,6 +453,11 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = " --width is set." }, + { OPT_NO_PAGER, false, false, false, true, false, 0, "no-pager", + 0, + "Forbid the internal usage of a pager." + }, + { OPT_QUIET, false, false, false, false, false, 'q', "quiet", 0, "Be quiet and print only error messages. Multiple usage is possible." @@ -468,7 +473,14 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = { OPT_LOGGING, false, false, false, false, false, 'L', "logging", 0, - "This debug option enables the logging of internal lists and maps." + "This debug option enables the logging of internal lists and maps. Set" + " it up to three times to be more verbose.\n" + }, + + { OPT_TIMING, false, false, false, false, false, 0, "timing", + 0, + "Activate the timing of some operations. Logging level 3 activates" + " them too.\n" }, { OPT_WARN, false, false, false, false, false, 'W', "warn", @@ -680,7 +692,7 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = " helper option." }, - {0,0,0,0,0,0,0,0,0,0} // OPT__N_TOTAL == 77 + {0,0,0,0,0,0,0,0,0,0} // OPT__N_TOTAL == 79 }; @@ -914,6 +926,7 @@ static const KeywordTab_t CommandTab[] = { CMD_HELP, "?", 0, 0 }, { CMD_CONFIG, "CONFIG", 0, 0 }, { CMD_ARGTEST, "ARGTEST", 0, 0 }, + { CMD_EXPAND, "EXPAND", 0, 0 }, { CMD_TEST, "TEST", 0, 0 }, { CMD_COLORS, "COLORS", 0, 0 }, { CMD_ERROR, "ERROR", "ERR", 0 }, @@ -965,9 +978,12 @@ static const struct option OptionLong[] = { "width", 1, 0, GO_WIDTH }, { "max-width", 1, 0, GO_MAX_WIDTH }, { "maxwidth", 1, 0, GO_MAX_WIDTH }, + { "no-pager", 0, 0, GO_NO_PAGER }, + { "nopager", 0, 0, GO_NO_PAGER }, { "quiet", 0, 0, 'q' }, { "verbose", 0, 0, 'v' }, { "logging", 0, 0, 'L' }, + { "timing", 0, 0, GO_TIMING }, { "warn", 1, 0, 'W' }, { "de", 0, 0, GO_DE }, { "colors", 2, 0, GO_COLORS }, @@ -1122,53 +1138,55 @@ static const OptionIndex_t OptionIndex[UIOPT_INDEX_SIZE] = /* 0x083 */ OPT_COMPATIBLE, /* 0x084 */ OPT_WIDTH, /* 0x085 */ OPT_MAX_WIDTH, - /* 0x086 */ OPT_DE, - /* 0x087 */ OPT_COLORS, - /* 0x088 */ OPT_NO_COLORS, - /* 0x089 */ OPT_CT_CODE, - /* 0x08a */ OPT_LE_CODE, - /* 0x08b */ OPT_CHDIR, - /* 0x08c */ OPT_SCALE, - /* 0x08d */ OPT_SHIFT, - /* 0x08e */ OPT_XSS, - /* 0x08f */ OPT_YSS, - /* 0x090 */ OPT_ZSS, - /* 0x091 */ OPT_ROT, - /* 0x092 */ OPT_XROT, - /* 0x093 */ OPT_YROT, - /* 0x094 */ OPT_ZROT, - /* 0x095 */ OPT_TRANSLATE, - /* 0x096 */ OPT_NULL, - /* 0x097 */ OPT_NEXT, - /* 0x098 */ OPT_ASCALE, - /* 0x099 */ OPT_AROT, - /* 0x09a */ OPT_TFORM_SCRIPT, - /* 0x09b */ OPT_KCL, - /* 0x09c */ OPT_KCL_FLAG, - /* 0x09d */ OPT_KCL_SCRIPT, - /* 0x09e */ OPT_TRI_AREA, - /* 0x09f */ OPT_TRI_HEIGHT, - /* 0x0a0 */ OPT_FLAG_FILE, - /* 0x0a1 */ OPT_XTRIDATA, - /* 0x0a2 */ OPT_SLOT, - /* 0x0a3 */ OPT_ID, - /* 0x0a4 */ OPT_BASE64, - /* 0x0a5 */ OPT_DB64, - /* 0x0a6 */ OPT_CODING, - /* 0x0a7 */ OPT_ROUND, - /* 0x0a8 */ OPT_NO_ECHO, - /* 0x0a9 */ OPT_UTF_8, - /* 0x0aa */ OPT_NO_UTF_8, - /* 0x0ab */ OPT_FORCE, - /* 0x0ac */ OPT_REPAIR_MAGICS, - /* 0x0ad */ OPT_TINY, - /* 0x0ae */ OPT_OLD, - /* 0x0af */ OPT_STD, - /* 0x0b0 */ OPT_NEW, - /* 0x0b1 */ OPT_EXTRACT, - /* 0x0b2 */ OPT_NUMBER, - /* 0x0b3 */ OPT_SECTIONS, - /* 0x0b4 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, + /* 0x086 */ OPT_NO_PAGER, + /* 0x087 */ OPT_TIMING, + /* 0x088 */ OPT_DE, + /* 0x089 */ OPT_COLORS, + /* 0x08a */ OPT_NO_COLORS, + /* 0x08b */ OPT_CT_CODE, + /* 0x08c */ OPT_LE_CODE, + /* 0x08d */ OPT_CHDIR, + /* 0x08e */ OPT_SCALE, + /* 0x08f */ OPT_SHIFT, + /* 0x090 */ OPT_XSS, + /* 0x091 */ OPT_YSS, + /* 0x092 */ OPT_ZSS, + /* 0x093 */ OPT_ROT, + /* 0x094 */ OPT_XROT, + /* 0x095 */ OPT_YROT, + /* 0x096 */ OPT_ZROT, + /* 0x097 */ OPT_TRANSLATE, + /* 0x098 */ OPT_NULL, + /* 0x099 */ OPT_NEXT, + /* 0x09a */ OPT_ASCALE, + /* 0x09b */ OPT_AROT, + /* 0x09c */ OPT_TFORM_SCRIPT, + /* 0x09d */ OPT_KCL, + /* 0x09e */ OPT_KCL_FLAG, + /* 0x09f */ OPT_KCL_SCRIPT, + /* 0x0a0 */ OPT_TRI_AREA, + /* 0x0a1 */ OPT_TRI_HEIGHT, + /* 0x0a2 */ OPT_FLAG_FILE, + /* 0x0a3 */ OPT_XTRIDATA, + /* 0x0a4 */ OPT_SLOT, + /* 0x0a5 */ OPT_ID, + /* 0x0a6 */ OPT_BASE64, + /* 0x0a7 */ OPT_DB64, + /* 0x0a8 */ OPT_CODING, + /* 0x0a9 */ OPT_ROUND, + /* 0x0aa */ OPT_NO_ECHO, + /* 0x0ab */ OPT_UTF_8, + /* 0x0ac */ OPT_NO_UTF_8, + /* 0x0ad */ OPT_FORCE, + /* 0x0ae */ OPT_REPAIR_MAGICS, + /* 0x0af */ OPT_TINY, + /* 0x0b0 */ OPT_OLD, + /* 0x0b1 */ OPT_STD, + /* 0x0b2 */ OPT_NEW, + /* 0x0b3 */ OPT_EXTRACT, + /* 0x0b4 */ OPT_NUMBER, + /* 0x0b5 */ OPT_SECTIONS, + /* 0x0b6 */ 0,0,0,0, 0,0,0,0, 0,0, /* 0x0c0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* 0x0d0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* 0x0e0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, @@ -1208,169 +1226,175 @@ static u8 option_allowed_cmd_ARGTEST[41] = // cmd #4 1,1,1,1,1, 1,1,1,1,1, 1 }; -static u8 option_allowed_cmd_TEST[41] = // cmd #5 +static u8 option_allowed_cmd_EXPAND[41] = // cmd #5 { 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1 }; -static u8 option_allowed_cmd_COLORS[41] = // cmd #6 +static u8 option_allowed_cmd_TEST[41] = // cmd #6 +{ + 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, + 1,1,1,1,1, 1,1,1,1,1, 1 +}; + +static u8 option_allowed_cmd_COLORS[41] = // cmd #7 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_ERROR[41] = // cmd #7 +static u8 option_allowed_cmd_ERROR[41] = // cmd #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, 1,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 1 }; -static u8 option_allowed_cmd_FILETYPE[41] = // cmd #8 +static u8 option_allowed_cmd_FILETYPE[41] = // cmd #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, 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 0 }; -static u8 option_allowed_cmd_FILEATTRIB[41] = // cmd #9 +static u8 option_allowed_cmd_FILEATTRIB[41] = // cmd #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,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_SYMBOLS[41] = // cmd #10 +static u8 option_allowed_cmd_SYMBOLS[41] = // cmd #11 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_FUNCTIONS[41] = // cmd #11 +static u8 option_allowed_cmd_FUNCTIONS[41] = // cmd #12 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_CALCULATE[41] = // cmd #12 +static u8 option_allowed_cmd_CALCULATE[41] = // cmd #13 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_MATRIX[41] = // cmd #13 +static u8 option_allowed_cmd_MATRIX[41] = // cmd #14 { 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,0,0, 1,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_FLOAT[41] = // cmd #14 +static u8 option_allowed_cmd_FLOAT[41] = // cmd #15 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_EXPORT[41] = // cmd #15 +static u8 option_allowed_cmd_EXPORT[41] = // cmd #16 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_CAT[41] = // cmd #16 +static u8 option_allowed_cmd_CAT[41] = // cmd #17 { 0,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,1, 1,0,0,0,0, 0,0,0,0,1, 0 }; -static u8 option_allowed_cmd_DECODE[41] = // cmd #17 +static u8 option_allowed_cmd_DECODE[41] = // cmd #18 { 0,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,1, 1,1,1,1,1, 1,1,1,1,1, 0 }; -static u8 option_allowed_cmd_ENCODE[41] = // cmd #18 +static u8 option_allowed_cmd_ENCODE[41] = // cmd #19 { 0,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,1, 1,1,1,1,1, 1,1,1,1,1, 0 }; -static u8 option_allowed_cmd_COPY[41] = // cmd #19 +static u8 option_allowed_cmd_COPY[41] = // cmd #20 { 0,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,1, 1,1,1,1,1, 1,1,1,1,1, 0 }; -static u8 option_allowed_cmd_CFF[41] = // cmd #20 +static u8 option_allowed_cmd_CFF[41] = // cmd #21 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, 0,0,0,0,0, 1,0,1,0,1, 1,1,1,1,1, 1,1,1,1,1, 0 }; -static u8 option_allowed_cmd_TYPES[41] = // cmd #21 +static u8 option_allowed_cmd_TYPES[41] = // cmd #22 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_FLAGS[41] = // cmd #22 +static u8 option_allowed_cmd_FLAGS[41] = // cmd #23 { 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,0,0, 0,1,1,0,0, 1,0,0,0,0, 0,0,0,0,1, 0 }; -static u8 option_allowed_cmd_DUMP[41] = // cmd #23 +static u8 option_allowed_cmd_DUMP[41] = // cmd #24 { 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,0,0, 1,0,1,0,0, 1,0,0,0,0, 0,0,0,0,1, 0 }; -static u8 option_allowed_cmd_DBRIEF[41] = // cmd #24 +static u8 option_allowed_cmd_DBRIEF[41] = // cmd #25 { 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,0,0, 1,0,1,0,0, 1,0,0,0,0, 0,0,0,0,1, 0 }; -static u8 option_allowed_cmd_LIST[41] = // cmd #25 +static u8 option_allowed_cmd_LIST[41] = // cmd #26 { 0,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, 1,0,0,0,0, 0,0,0,0,1, 0 }; -static u8 option_allowed_cmd_TRIANGLES[41] = // cmd #26 +static u8 option_allowed_cmd_TRIANGLES[41] = // cmd #27 { 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,0,0, 1,0,1,0,0, 1,0,0,0,0, 0,0,0,0,1, 0 }; -static u8 option_allowed_cmd_TRAVERSE[41] = // cmd #27 +static u8 option_allowed_cmd_TRAVERSE[41] = // cmd #28 { 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,0,0, 1,0,1,0,0, 1,0,0,0,0, 0,0,0,0,1, 0 }; -static u8 option_allowed_cmd_FALL[41] = // cmd #28 +static u8 option_allowed_cmd_FALL[41] = // cmd #29 { 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,0,0, 1,0,1,0,0, 1,0,0,0,0, 0,0,0,0,1, 0 }; -static u8 option_allowed_cmd_CHECK[41] = // cmd #29 +static u8 option_allowed_cmd_CHECK[41] = // cmd #30 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1,0,1,0,1, 1,0,0,0,0, 0,0,0,0,1, 0 }; -static u8 option_allowed_cmd_SHA1[41] = // cmd #30 +static u8 option_allowed_cmd_SHA1[41] = // cmd #31 { 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0, 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,1, 0 }; -static u8 option_allowed_cmd_ANALYZE[41] = // cmd #31 +static u8 option_allowed_cmd_ANALYZE[41] = // cmd #32 { 0,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,1, 0 }; -static u8 option_allowed_cmd_BLOW[41] = // cmd #32 +static u8 option_allowed_cmd_BLOW[41] = // cmd #33 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 0 @@ -1392,9 +1416,11 @@ static const InfoOption_t * option_tab_tool[] = OptionInfo + OPT_COMPATIBLE, OptionInfo + OPT_WIDTH, OptionInfo + OPT_MAX_WIDTH, + OptionInfo + OPT_NO_PAGER, OptionInfo + OPT_QUIET, OptionInfo + OPT_VERBOSE, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_WARN, OptionInfo + OPT_DE, OptionInfo + OPT_COLORS, @@ -1450,6 +1476,12 @@ static const InfoOption_t * option_tab_cmd_ARGTEST[] = 0 }; +static const InfoOption_t * option_tab_cmd_EXPAND[] = +{ + + 0 +}; + static const InfoOption_t * option_tab_cmd_TEST[] = { &option_cmd_TEST_VERBOSE, @@ -2131,7 +2163,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "Wiimms KCL Tool : Analyze, modify, export and create KCL and OBJ" " files.", 0, - 27, + 29, option_tab_tool, 0 }, @@ -2197,13 +2229,32 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = 0, "wkclt ARGTEST ...", "This debug command accepts all kinds of parameters and prints one" - " line for each parameter.", + " line for each parameter. All tools know the ARGTEST command.", 0, 0, option_tab_cmd_ARGTEST, option_allowed_cmd_ARGTEST }, + { CMD_EXPAND, + false, + false, + false, + "EXPAND", + 0, + "wkclt EXPAND ...", + "This debug command accepts (like ARGTEST) all kinds of parameters and" + " prints one line for each parameter. After that, the parameter is" + " treated as a filename with wildcards and all matching files are" + " searched. The special parameters '+h' and '/h' enable or disable the" + " search for hidden directories and files (files beginning with a" + " point). All tools know the EXPAND command.", + 0, + 0, + option_tab_cmd_EXPAND, + option_allowed_cmd_EXPAND + }, + { CMD_TEST, false, false, @@ -2243,7 +2294,8 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "ERR", "wkclt ERROR [error_code]", "Translate an exit code to a message name. If no exit code is entered," - " print a table with all error messages.", + " print a table with all error messages. All tools know the ERROR" + " command.", 0, 4, option_tab_cmd_ERROR, @@ -2258,7 +2310,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "FT", "wkclt FILETYPE file...", "Scan the header of the entered files and print file type and path for" - " each file as list.", + " each file as list. All tools know the FILETYPE command.", 0, 2, option_tab_cmd_FILETYPE, @@ -2275,7 +2327,8 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "Print a table with attributes for all known file types. If at least" " one keyword is entered, only matching file types are printed. A" " keyword is either a file type (like 'BRRES' or 'BMG') or one of the" - " printed keywords (like 'ARCHIVE' or 'EXTRACT').", + " printed keywords (like 'ARCHIVE' or 'EXTRACT'). All tools know the" + " FILEATTRIB command.", 0, 1, option_tab_cmd_FILEATTRIB, @@ -2320,7 +2373,8 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "CALCULATE", 0, "wkclt CALCULATE expression...", - "Calculate each expression and print the result to standard output.", + "Calculate each expression and print the result to standard output." + " Many tools know the CALCULATE command.", 0, 1, option_tab_cmd_CALCULATE, diff --git a/project/src/ui/ui-wkclt.h b/project/src/ui/ui-wkclt.h index 50c89ca..352a4b8 100644 --- a/project/src/ui/ui-wkclt.h +++ b/project/src/ui/ui-wkclt.h @@ -109,9 +109,11 @@ typedef enum enumOptions OPT_COMPATIBLE, OPT_WIDTH, OPT_MAX_WIDTH, + OPT_NO_PAGER, OPT_QUIET, OPT_VERBOSE, OPT_LOGGING, + OPT_TIMING, OPT_WARN, OPT_DE, OPT_COLORS, @@ -138,7 +140,7 @@ typedef enum enumOptions OPT_NEW, OPT_EXTRACT, - OPT__N_TOTAL // == 77 + OPT__N_TOTAL // == 79 } enumOptions; @@ -240,6 +242,8 @@ typedef enum enumOptions // // OB_CMD_ARGTEST = ~(u64)0, // +// OB_CMD_EXPAND = ~(u64)0, +// // OB_CMD_TEST = ~(u64)0, // // OB_CMD_COLORS = OB_LONG @@ -367,6 +371,7 @@ typedef enum enumCommands CMD_HELP, CMD_CONFIG, CMD_ARGTEST, + CMD_EXPAND, CMD_TEST, CMD_COLORS, CMD_ERROR, @@ -398,7 +403,7 @@ typedef enum enumCommands CMD_BLOW, - CMD__N // == 33 + CMD__N // == 34 } enumCommands; @@ -443,6 +448,8 @@ typedef enum enumGetOpt GO_COMPATIBLE, GO_WIDTH, GO_MAX_WIDTH, + GO_NO_PAGER, + GO_TIMING, GO_DE, GO_COLORS, GO_NO_COLORS, diff --git a/project/src/ui/ui-wkmpt.c b/project/src/ui/ui-wkmpt.c index 3d566eb..6cce3b2 100644 --- a/project/src/ui/ui-wkmpt.c +++ b/project/src/ui/ui-wkmpt.c @@ -545,6 +545,11 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = " --width is set." }, + { OPT_NO_PAGER, false, false, false, true, false, 0, "no-pager", + 0, + "Forbid the internal usage of a pager." + }, + { OPT_QUIET, false, false, false, false, false, 'q', "quiet", 0, "Be quiet and print only error messages. Multiple usage is possible." @@ -560,7 +565,14 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = { OPT_LOGGING, false, false, false, false, false, 'L', "logging", 0, - "This debug option enables the logging of internal lists and maps." + "This debug option enables the logging of internal lists and maps. Set" + " it up to three times to be more verbose.\n" + }, + + { OPT_TIMING, false, false, false, false, false, 0, "timing", + 0, + "Activate the timing of some operations. Logging level 3 activates" + " them too.\n" }, { OPT_WARN, false, false, false, false, false, 'W', "warn", @@ -877,7 +889,7 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = " helper option." }, - {0,0,0,0,0,0,0,0,0,0} // OPT__N_TOTAL == 94 + {0,0,0,0,0,0,0,0,0,0} // OPT__N_TOTAL == 96 }; @@ -1125,6 +1137,7 @@ static const KeywordTab_t CommandTab[] = { CMD_HELP, "?", 0, 0 }, { CMD_CONFIG, "CONFIG", 0, 0 }, { CMD_ARGTEST, "ARGTEST", 0, 0 }, + { CMD_EXPAND, "EXPAND", 0, 0 }, { CMD_TEST, "TEST", 0, 0 }, { CMD_COLORS, "COLORS", 0, 0 }, { CMD_ERROR, "ERROR", "ERR", 0 }, @@ -1175,9 +1188,12 @@ static const struct option OptionLong[] = { "width", 1, 0, GO_WIDTH }, { "max-width", 1, 0, GO_MAX_WIDTH }, { "maxwidth", 1, 0, GO_MAX_WIDTH }, + { "no-pager", 0, 0, GO_NO_PAGER }, + { "nopager", 0, 0, GO_NO_PAGER }, { "quiet", 0, 0, 'q' }, { "verbose", 0, 0, 'v' }, { "logging", 0, 0, 'L' }, + { "timing", 0, 0, GO_TIMING }, { "warn", 1, 0, 'W' }, { "de", 0, 0, GO_DE }, { "colors", 2, 0, GO_COLORS }, @@ -1366,67 +1382,69 @@ static const OptionIndex_t OptionIndex[UIOPT_INDEX_SIZE] = /* 0x083 */ OPT_COMPATIBLE, /* 0x084 */ OPT_WIDTH, /* 0x085 */ OPT_MAX_WIDTH, - /* 0x086 */ OPT_DE, - /* 0x087 */ OPT_COLORS, - /* 0x088 */ OPT_NO_COLORS, - /* 0x089 */ OPT_CT_CODE, - /* 0x08a */ OPT_LE_CODE, - /* 0x08b */ OPT_CHDIR, - /* 0x08c */ OPT_SCALE, - /* 0x08d */ OPT_SHIFT, - /* 0x08e */ OPT_XSS, - /* 0x08f */ OPT_YSS, - /* 0x090 */ OPT_ZSS, - /* 0x091 */ OPT_ROT, - /* 0x092 */ OPT_XROT, - /* 0x093 */ OPT_YROT, - /* 0x094 */ OPT_ZROT, - /* 0x095 */ OPT_YPOS, - /* 0x096 */ OPT_TRANSLATE, - /* 0x097 */ OPT_NULL, - /* 0x098 */ OPT_NEXT, - /* 0x099 */ OPT_ASCALE, - /* 0x09a */ OPT_AROT, - /* 0x09b */ OPT_TFORM_SCRIPT, - /* 0x09c */ OPT_RM_GOBJ, - /* 0x09d */ OPT_BATTLE, - /* 0x09e */ OPT_EXPORT_FLAGS, - /* 0x09f */ OPT_ROUTE_OPTIONS, - /* 0x0a0 */ OPT_WIM0, - /* 0x0a1 */ OPT_SLOT, - /* 0x0a2 */ OPT_POS_MODE, - /* 0x0a3 */ OPT_POS_FILE, - /* 0x0a4 */ OPT_PNG, - /* 0x0a5 */ OPT_LOAD_KCL, - /* 0x0a6 */ OPT_KCL, - /* 0x0a7 */ OPT_KCL_FLAG, - /* 0x0a8 */ OPT_KCL_SCRIPT, - /* 0x0a9 */ OPT_TRI_AREA, - /* 0x0aa */ OPT_TRI_HEIGHT, - /* 0x0ab */ OPT_FLAG_FILE, - /* 0x0ac */ OPT_XTRIDATA, - /* 0x0ad */ OPT_KMP, - /* 0x0ae */ OPT_SPEED_MOD, - /* 0x0af */ OPT_KTPT2, - /* 0x0b0 */ OPT_TFORM_KMP, - /* 0x0b1 */ OPT_REPAIR_XPF, - /* 0x0b2 */ OPT_GAMEMODES, - /* 0x0b3 */ OPT_ROUND, - /* 0x0b4 */ OPT_EPSILON, - /* 0x0b5 */ OPT_DIFF, - /* 0x0b6 */ OPT_NO_ECHO, - /* 0x0b7 */ OPT_UTF_8, - /* 0x0b8 */ OPT_NO_UTF_8, - /* 0x0b9 */ OPT_FORCE, - /* 0x0ba */ OPT_REPAIR_MAGICS, - /* 0x0bb */ OPT_TINY, - /* 0x0bc */ OPT_OLD, - /* 0x0bd */ OPT_STD, - /* 0x0be */ OPT_NEW, - /* 0x0bf */ OPT_EXTRACT, - /* 0x0c0 */ OPT_NUMBER, - /* 0x0c1 */ OPT_SECTIONS, - /* 0x0c2 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0, + /* 0x086 */ OPT_NO_PAGER, + /* 0x087 */ OPT_TIMING, + /* 0x088 */ OPT_DE, + /* 0x089 */ OPT_COLORS, + /* 0x08a */ OPT_NO_COLORS, + /* 0x08b */ OPT_CT_CODE, + /* 0x08c */ OPT_LE_CODE, + /* 0x08d */ OPT_CHDIR, + /* 0x08e */ OPT_SCALE, + /* 0x08f */ OPT_SHIFT, + /* 0x090 */ OPT_XSS, + /* 0x091 */ OPT_YSS, + /* 0x092 */ OPT_ZSS, + /* 0x093 */ OPT_ROT, + /* 0x094 */ OPT_XROT, + /* 0x095 */ OPT_YROT, + /* 0x096 */ OPT_ZROT, + /* 0x097 */ OPT_YPOS, + /* 0x098 */ OPT_TRANSLATE, + /* 0x099 */ OPT_NULL, + /* 0x09a */ OPT_NEXT, + /* 0x09b */ OPT_ASCALE, + /* 0x09c */ OPT_AROT, + /* 0x09d */ OPT_TFORM_SCRIPT, + /* 0x09e */ OPT_RM_GOBJ, + /* 0x09f */ OPT_BATTLE, + /* 0x0a0 */ OPT_EXPORT_FLAGS, + /* 0x0a1 */ OPT_ROUTE_OPTIONS, + /* 0x0a2 */ OPT_WIM0, + /* 0x0a3 */ OPT_SLOT, + /* 0x0a4 */ OPT_POS_MODE, + /* 0x0a5 */ OPT_POS_FILE, + /* 0x0a6 */ OPT_PNG, + /* 0x0a7 */ OPT_LOAD_KCL, + /* 0x0a8 */ OPT_KCL, + /* 0x0a9 */ OPT_KCL_FLAG, + /* 0x0aa */ OPT_KCL_SCRIPT, + /* 0x0ab */ OPT_TRI_AREA, + /* 0x0ac */ OPT_TRI_HEIGHT, + /* 0x0ad */ OPT_FLAG_FILE, + /* 0x0ae */ OPT_XTRIDATA, + /* 0x0af */ OPT_KMP, + /* 0x0b0 */ OPT_SPEED_MOD, + /* 0x0b1 */ OPT_KTPT2, + /* 0x0b2 */ OPT_TFORM_KMP, + /* 0x0b3 */ OPT_REPAIR_XPF, + /* 0x0b4 */ OPT_GAMEMODES, + /* 0x0b5 */ OPT_ROUND, + /* 0x0b6 */ OPT_EPSILON, + /* 0x0b7 */ OPT_DIFF, + /* 0x0b8 */ OPT_NO_ECHO, + /* 0x0b9 */ OPT_UTF_8, + /* 0x0ba */ OPT_NO_UTF_8, + /* 0x0bb */ OPT_FORCE, + /* 0x0bc */ OPT_REPAIR_MAGICS, + /* 0x0bd */ OPT_TINY, + /* 0x0be */ OPT_OLD, + /* 0x0bf */ OPT_STD, + /* 0x0c0 */ OPT_NEW, + /* 0x0c1 */ OPT_EXTRACT, + /* 0x0c2 */ OPT_NUMBER, + /* 0x0c3 */ OPT_SECTIONS, + /* 0x0c4 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, /* 0x0d0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* 0x0e0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* 0x0f0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, @@ -1465,157 +1483,163 @@ static u8 option_allowed_cmd_ARGTEST[49] = // cmd #4 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1 }; -static u8 option_allowed_cmd_TEST[49] = // cmd #5 +static u8 option_allowed_cmd_EXPAND[49] = // cmd #5 { 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1 }; -static u8 option_allowed_cmd_COLORS[49] = // cmd #6 +static u8 option_allowed_cmd_TEST[49] = // cmd #6 +{ + 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, + 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1 +}; + +static u8 option_allowed_cmd_COLORS[49] = // cmd #7 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0 }; -static u8 option_allowed_cmd_ERROR[49] = // cmd #7 +static u8 option_allowed_cmd_ERROR[49] = // cmd #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,1, 1,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1 }; -static u8 option_allowed_cmd_FILETYPE[49] = // cmd #8 +static u8 option_allowed_cmd_FILETYPE[49] = // cmd #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,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0 }; -static u8 option_allowed_cmd_FILEATTRIB[49] = // cmd #9 +static u8 option_allowed_cmd_FILEATTRIB[49] = // cmd #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,0,0,0,0, 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0 }; -static u8 option_allowed_cmd_SYMBOLS[49] = // cmd #10 +static u8 option_allowed_cmd_SYMBOLS[49] = // cmd #11 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0 }; -static u8 option_allowed_cmd_FUNCTIONS[49] = // cmd #11 +static u8 option_allowed_cmd_FUNCTIONS[49] = // cmd #12 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 1,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0 }; -static u8 option_allowed_cmd_CALCULATE[49] = // cmd #12 +static u8 option_allowed_cmd_CALCULATE[49] = // cmd #13 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0 }; -static u8 option_allowed_cmd_MATRIX[49] = // cmd #13 +static u8 option_allowed_cmd_MATRIX[49] = // cmd #14 { 0,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,1,0,0,1, 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0 }; -static u8 option_allowed_cmd_FLOAT[49] = // cmd #14 +static u8 option_allowed_cmd_FLOAT[49] = // cmd #15 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0 }; -static u8 option_allowed_cmd_STARTPOS[49] = // cmd #15 +static u8 option_allowed_cmd_STARTPOS[49] = // cmd #16 { 0,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,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0 }; -static u8 option_allowed_cmd_OBJECTS[49] = // cmd #16 +static u8 option_allowed_cmd_OBJECTS[49] = // cmd #17 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 1,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0 }; -static u8 option_allowed_cmd_EXPORT[49] = // cmd #17 +static u8 option_allowed_cmd_EXPORT[49] = // cmd #18 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0 }; -static u8 option_allowed_cmd_XEXPORT[49] = // cmd #18 +static u8 option_allowed_cmd_XEXPORT[49] = // cmd #19 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0 }; -static u8 option_allowed_cmd_CAT[49] = // cmd #19 +static u8 option_allowed_cmd_CAT[49] = // cmd #20 { 0,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,1,0,0,0, 1,1,1,1,0, 0,1,1,1,0, 0,0,0,0,0, 0,0,1,0 }; -static u8 option_allowed_cmd_DECODE[49] = // cmd #20 +static u8 option_allowed_cmd_DECODE[49] = // cmd #21 { 0,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,1,0,0,0, 1,1,1,1,0, 0,1,1,1,1, 1,1,1,1,1, 1,1,1,0 }; -static u8 option_allowed_cmd_ENCODE[49] = // cmd #21 +static u8 option_allowed_cmd_ENCODE[49] = // cmd #22 { 0,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,1,0,0,0, 0,0,0,0,0, 0,0,1,1,1, 1,1,1,1,1, 1,1,1,0 }; -static u8 option_allowed_cmd_DIFF[49] = // cmd #22 +static u8 option_allowed_cmd_DIFF[49] = // cmd #23 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 1,0,0,0,1, 0,1,0,0,0, 0,0,0,0 }; -static u8 option_allowed_cmd_DRAW[49] = // cmd #23 +static u8 option_allowed_cmd_DRAW[49] = // cmd #24 { 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,0,1, 0,1,0,0,0, 1,1,1,1,0, 0,1,1,1,1, 1,1,1,1,1, 1,1,1,0 }; -static u8 option_allowed_cmd_CHECK[49] = // cmd #24 +static u8 option_allowed_cmd_CHECK[49] = // cmd #25 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 0,1,0,0,0, 0,1,1,1,0, 0,0,0,0,0, 0,0,1,0 }; -static u8 option_allowed_cmd_STGI[49] = // cmd #25 +static u8 option_allowed_cmd_STGI[49] = // cmd #26 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0 }; -static u8 option_allowed_cmd_KTPT[49] = // cmd #26 +static u8 option_allowed_cmd_KTPT[49] = // cmd #27 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0 }; -static u8 option_allowed_cmd_ROUTES[49] = // cmd #27 +static u8 option_allowed_cmd_ROUTES[49] = // cmd #28 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0 }; -static u8 option_allowed_cmd_GOBJ[49] = // cmd #28 +static u8 option_allowed_cmd_GOBJ[49] = // cmd #29 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 1,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0 }; -static u8 option_allowed_cmd_GAMEMODES[49] = // cmd #29 +static u8 option_allowed_cmd_GAMEMODES[49] = // cmd #30 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,1, 1,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0 }; -static u8 option_allowed_cmd_WIM0[49] = // cmd #30 +static u8 option_allowed_cmd_WIM0[49] = // cmd #31 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0 @@ -1637,9 +1661,11 @@ static const InfoOption_t * option_tab_tool[] = OptionInfo + OPT_COMPATIBLE, OptionInfo + OPT_WIDTH, OptionInfo + OPT_MAX_WIDTH, + OptionInfo + OPT_NO_PAGER, OptionInfo + OPT_QUIET, OptionInfo + OPT_VERBOSE, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_WARN, OptionInfo + OPT_DE, OptionInfo + OPT_COLORS, @@ -1704,6 +1730,12 @@ static const InfoOption_t * option_tab_cmd_ARGTEST[] = 0 }; +static const InfoOption_t * option_tab_cmd_EXPAND[] = +{ + + 0 +}; + static const InfoOption_t * option_tab_cmd_TEST[] = { &option_cmd_TEST_VERBOSE, @@ -2196,7 +2228,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "Wiimms KMP Tool : Analyze, modify, export and create (compile) KMP" " files.", 0, - 36, + 38, option_tab_tool, 0 }, @@ -2262,13 +2294,32 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = 0, "wkmpt ARGTEST ...", "This debug command accepts all kinds of parameters and prints one" - " line for each parameter.", + " line for each parameter. All tools know the ARGTEST command.", 0, 0, option_tab_cmd_ARGTEST, option_allowed_cmd_ARGTEST }, + { CMD_EXPAND, + false, + false, + false, + "EXPAND", + 0, + "wkmpt EXPAND ...", + "This debug command accepts (like ARGTEST) all kinds of parameters and" + " prints one line for each parameter. After that, the parameter is" + " treated as a filename with wildcards and all matching files are" + " searched. The special parameters '+h' and '/h' enable or disable the" + " search for hidden directories and files (files beginning with a" + " point). All tools know the EXPAND command.", + 0, + 0, + option_tab_cmd_EXPAND, + option_allowed_cmd_EXPAND + }, + { CMD_TEST, false, false, @@ -2308,7 +2359,8 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "ERR", "wkmpt ERROR [error_code]", "Translate an exit code to a message name. If no exit code is entered," - " print a table with all error messages.", + " print a table with all error messages. All tools know the ERROR" + " command.", 0, 4, option_tab_cmd_ERROR, @@ -2323,7 +2375,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "FT", "wkmpt FILETYPE file...", "Scan the header of the entered files and print file type and path for" - " each file as list.", + " each file as list. All tools know the FILETYPE command.", 0, 2, option_tab_cmd_FILETYPE, @@ -2340,7 +2392,8 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "Print a table with attributes for all known file types. If at least" " one keyword is entered, only matching file types are printed. A" " keyword is either a file type (like 'BRRES' or 'BMG') or one of the" - " printed keywords (like 'ARCHIVE' or 'EXTRACT').", + " printed keywords (like 'ARCHIVE' or 'EXTRACT'). All tools know the" + " FILEATTRIB command.", 0, 1, option_tab_cmd_FILEATTRIB, @@ -2385,7 +2438,8 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "CALCULATE", 0, "wkmpt CALCULATE expression...", - "Calculate each expression and print the result to standard output.", + "Calculate each expression and print the result to standard output." + " Many tools know the CALCULATE command.", 0, 1, option_tab_cmd_CALCULATE, diff --git a/project/src/ui/ui-wkmpt.h b/project/src/ui/ui-wkmpt.h index a40d695..9bef264 100644 --- a/project/src/ui/ui-wkmpt.h +++ b/project/src/ui/ui-wkmpt.h @@ -117,9 +117,11 @@ typedef enum enumOptions OPT_COMPATIBLE, OPT_WIDTH, OPT_MAX_WIDTH, + OPT_NO_PAGER, OPT_QUIET, OPT_VERBOSE, OPT_LOGGING, + OPT_TIMING, OPT_WARN, OPT_DE, OPT_COLORS, @@ -155,7 +157,7 @@ typedef enum enumOptions OPT_NEW, OPT_EXTRACT, - OPT__N_TOTAL // == 94 + OPT__N_TOTAL // == 96 } enumOptions; @@ -267,6 +269,8 @@ typedef enum enumOptions // // OB_CMD_ARGTEST = ~(u64)0, // +// OB_CMD_EXPAND = ~(u64)0, +// // OB_CMD_TEST = ~(u64)0, // // OB_CMD_COLORS = OB_LONG @@ -382,6 +386,7 @@ typedef enum enumCommands CMD_HELP, CMD_CONFIG, CMD_ARGTEST, + CMD_EXPAND, CMD_TEST, CMD_COLORS, CMD_ERROR, @@ -411,7 +416,7 @@ typedef enum enumCommands CMD_WIM0, - CMD__N // == 31 + CMD__N // == 32 } enumCommands; @@ -459,6 +464,8 @@ typedef enum enumGetOpt GO_COMPATIBLE, GO_WIDTH, GO_MAX_WIDTH, + GO_NO_PAGER, + GO_TIMING, GO_DE, GO_COLORS, GO_NO_COLORS, diff --git a/project/src/ui/ui-wlect.c b/project/src/ui/ui-wlect.c index 1c67b0d..720e084 100644 --- a/project/src/ui/ui-wlect.c +++ b/project/src/ui/ui-wlect.c @@ -53,6 +53,20 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = //----- command specific options ----- + { OPT_PLUS, false, false, false, false, false, 0, "plus", + "chars", + "If a name begins with a plus sign, then all characters up to the" + " first space are recognized as a plus prefix. The first part consists" + " of all the plus signs followed by any other characters. The first" + " character of the second part is used to determine the sort value. If" + " the second part is empty, then the last plus sign is used instead.\n" + " The higher sorting value is now calculated from the number of plus" + " signs in the first part, the more plus signs, the smaller the value." + " The first character from the second part determines the lower value." + " If it is in parameter CHARS then the position determines the value," + " otherwise the ASCII value to which 500 is added." + }, + { OPT_ROUND, false, false, false, false, false, 0, "round", 0, "Print additional lines with rounded values (to 3 and 2 bytes for" @@ -110,6 +124,12 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = " values. If needed, LEX section TEST is created or removed if empty." }, + { OPT_CREATE_DISTRIB, false, false, false, false, false, 0, "create-distrib", + "file", + "Create a LE-CODE distribution dump with a track list and more info" + " about the current distribution. Store the dump info a file." + }, + { OPT_LE_DEFINE, false, false, false, false, true, 0, "le-define", "file", "Use this file as definition file to patch LE-CODE. The file format" @@ -230,6 +250,15 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = " --track-dir. If linking fails, the file is copied." }, + { OPT_SZS_MODE, false, false, false, false, false, 0, "szs-mode", + "mode", + "If a track is inserted via the SZS file, then the associated" + " directory is automatically included in the list of search" + " directories for option --track-dir. This option now sets the" + " transfer mode. OFF turns this feature off. The values COPY, MOVE," + " MOVE1 and LINK define one of the 4 modes. Default mode is LINK." + }, + { OPT_COMPLETE, false, false, false, false, true, 'C', "complete", 0, " Append missing sections to the LEX file." @@ -358,7 +387,7 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = "Print in machine readable sections and parameter lines." }, - {0,0,0,0,0,0,0,0,0,0}, // OPT__N_SPECIFIC == 44 + {0,0,0,0,0,0,0,0,0,0}, // OPT__N_SPECIFIC == 47 //----- global options ----- @@ -418,6 +447,11 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = " --width is set." }, + { OPT_NO_PAGER, false, false, false, true, false, 0, "no-pager", + 0, + "Forbid the internal usage of a pager." + }, + { OPT_QUIET, false, false, false, false, false, 'q', "quiet", 0, "Be quiet and print only error messages. Multiple usage is possible." @@ -433,7 +467,14 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = { OPT_LOGGING, false, false, false, false, false, 'L', "logging", 0, - "This debug option enables the logging of internal lists and maps." + "This debug option enables the logging of internal lists and maps. Set" + " it up to three times to be more verbose.\n" + }, + + { OPT_TIMING, false, false, false, false, false, 0, "timing", + 0, + "Activate the timing of some operations. Logging level 3 activates" + " them too.\n" }, { OPT_WARN, false, false, false, false, false, 'W', "warn", @@ -482,6 +523,13 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = " compatibility with the other tools." }, + { OPT_LOAD_PREFIX, false, false, false, false, false, 0, "load-prefix", + "file", + "Read in a PREFIX file and replace the internal prefix database with" + " the content. https://ct.wiimm.de/export/prefix is the authoritative" + " source for this." + }, + { OPT_CHDIR, false, false, false, false, false, 0, "chdir", "dir", "Set a new working directory for all following options, for all" @@ -612,7 +660,7 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = " helper option." }, - {0,0,0,0,0,0,0,0,0,0} // OPT__N_TOTAL == 79 + {0,0,0,0,0,0,0,0,0,0} // OPT__N_TOTAL == 85 }; @@ -742,6 +790,7 @@ static const KeywordTab_t CommandTab[] = { CMD_HELP, "?", 0, 0 }, { CMD_CONFIG, "CONFIG", 0, 0 }, { CMD_ARGTEST, "ARGTEST", 0, 0 }, + { CMD_EXPAND, "EXPAND", 0, 0 }, { CMD_TEST, "TEST", 0, 0 }, { CMD_COLORS, "COLORS", 0, 0 }, { CMD_ERROR, "ERROR", "ERR", 0 }, @@ -761,6 +810,8 @@ static const KeywordTab_t CommandTab[] = { CMD_PATCH, "PATCH", "P", 0 }, { CMD_LPAR, "LPAR", 0, 0 }, { CMD_CREATE, "CREATE", "CR", 0 }, + { CMD_DISTRIBUTION, "DISTRIBUTION", "DIS", 0 }, + { CMD_DISTRIBUTION, "DISTRIB", 0, 0 }, { CMD_CAT, "CAT", 0, 0 }, { CMD_DECODE, "DECODE", "DEC", 0 }, { CMD_ENCODE, "ENCODE", "ENC", 0 }, @@ -787,9 +838,12 @@ static const struct option OptionLong[] = { "width", 1, 0, GO_WIDTH }, { "max-width", 1, 0, GO_MAX_WIDTH }, { "maxwidth", 1, 0, GO_MAX_WIDTH }, + { "no-pager", 0, 0, GO_NO_PAGER }, + { "nopager", 0, 0, GO_NO_PAGER }, { "quiet", 0, 0, 'q' }, { "verbose", 0, 0, 'v' }, { "logging", 0, 0, 'L' }, + { "timing", 0, 0, GO_TIMING }, { "warn", 1, 0, 'W' }, { "de", 0, 0, GO_DE }, { "colors", 2, 0, GO_COLORS }, @@ -799,6 +853,9 @@ static const struct option OptionLong[] = { "ctcode", 0, 0, GO_CT_CODE }, { "le-code", 2, 0, GO_LE_CODE }, { "lecode", 2, 0, GO_LE_CODE }, + { "load-prefix", 1, 0, GO_LOAD_PREFIX }, + { "loadprefix", 1, 0, GO_LOAD_PREFIX }, + { "plus", 1, 0, GO_PLUS }, { "chdir", 1, 0, GO_CHDIR }, { "const", 1, 0, 'c' }, { "round", 0, 0, GO_ROUND }, @@ -845,6 +902,8 @@ static const struct option OptionLong[] = { "force", 0, 0, GO_FORCE }, { "repair-magics", 2, 0, GO_REPAIR_MAGICS }, { "repairmagics", 2, 0, GO_REPAIR_MAGICS }, + { "create-distrib", 1, 0, GO_CREATE_DISTRIB }, + { "createdistrib", 1, 0, GO_CREATE_DISTRIB }, { "OLD", 0, 0, GO_OLD }, { "STD", 0, 0, GO_STD }, { "NEW", 0, 0, GO_NEW }, @@ -874,6 +933,8 @@ static const struct option OptionLong[] = { "move1tracks", 1, 0, GO_MOVE1_TRACKS }, { "link-tracks", 1, 0, GO_LINK_TRACKS }, { "linktracks", 1, 0, GO_LINK_TRACKS }, + { "szs-mode", 1, 0, GO_SZS_MODE }, + { "szsmode", 1, 0, GO_SZS_MODE }, { "complete", 0, 0, 'C' }, { "load-bmg", 1, 0, GO_LOAD_BMG }, { "loadbmg", 1, 0, GO_LOAD_BMG }, @@ -962,56 +1023,62 @@ static const OptionIndex_t OptionIndex[UIOPT_INDEX_SIZE] = /* 0x083 */ OPT_COMPATIBLE, /* 0x084 */ OPT_WIDTH, /* 0x085 */ OPT_MAX_WIDTH, - /* 0x086 */ OPT_DE, - /* 0x087 */ OPT_COLORS, - /* 0x088 */ OPT_NO_COLORS, - /* 0x089 */ OPT_CT_CODE, - /* 0x08a */ OPT_LE_CODE, - /* 0x08b */ OPT_CHDIR, - /* 0x08c */ OPT_ROUND, - /* 0x08d */ OPT_NO_ECHO, - /* 0x08e */ OPT_UTF_8, - /* 0x08f */ OPT_NO_UTF_8, - /* 0x090 */ OPT_LT_CLEAR, - /* 0x091 */ OPT_LT_ONLINE, - /* 0x092 */ OPT_LT_N_PLAYERS, - /* 0x093 */ OPT_LT_COND_BIT, - /* 0x094 */ OPT_LT_GAME_MODE, - /* 0x095 */ OPT_LT_ENGINE, - /* 0x096 */ OPT_LT_RANDOM, - /* 0x097 */ OPT_LEX_PURGE, - /* 0x098 */ OPT_LEX_RM_FEAT, - /* 0x099 */ OPT_FORCE, - /* 0x09a */ OPT_REPAIR_MAGICS, - /* 0x09b */ OPT_OLD, - /* 0x09c */ OPT_STD, - /* 0x09d */ OPT_NEW, - /* 0x09e */ OPT_EXTRACT, - /* 0x09f */ OPT_LE_DEFINE, - /* 0x0a0 */ OPT_LE_ARENA, - /* 0x0a1 */ OPT_LPAR, - /* 0x0a2 */ OPT_ALIAS, - /* 0x0a3 */ OPT_ENGINE, - /* 0x0a4 */ OPT_200CC, - /* 0x0a5 */ OPT_PERFMON, - /* 0x0a6 */ OPT_CUSTOM_TT, - /* 0x0a7 */ OPT_XPFLAGS, - /* 0x0a8 */ OPT_SPEEDOMETER, - /* 0x0a9 */ OPT_DEBUG, - /* 0x0aa */ OPT_TRACK_DIR, - /* 0x0ab */ OPT_COPY_TRACKS, - /* 0x0ac */ OPT_MOVE_TRACKS, - /* 0x0ad */ OPT_MOVE1_TRACKS, - /* 0x0ae */ OPT_LINK_TRACKS, - /* 0x0af */ OPT_LOAD_BMG, - /* 0x0b0 */ OPT_PATCH_BMG, - /* 0x0b1 */ OPT_MACRO_BMG, - /* 0x0b2 */ OPT_PATCH_NAMES, - /* 0x0b3 */ OPT_ORDER_BY, - /* 0x0b4 */ OPT_ORDER_ALL, - /* 0x0b5 */ OPT_NUMBER, - /* 0x0b6 */ OPT_SECTIONS, - /* 0x0b7 */ 0,0,0,0, 0,0,0,0, 0, + /* 0x086 */ OPT_NO_PAGER, + /* 0x087 */ OPT_TIMING, + /* 0x088 */ OPT_DE, + /* 0x089 */ OPT_COLORS, + /* 0x08a */ OPT_NO_COLORS, + /* 0x08b */ OPT_CT_CODE, + /* 0x08c */ OPT_LE_CODE, + /* 0x08d */ OPT_LOAD_PREFIX, + /* 0x08e */ OPT_PLUS, + /* 0x08f */ OPT_CHDIR, + /* 0x090 */ OPT_ROUND, + /* 0x091 */ OPT_NO_ECHO, + /* 0x092 */ OPT_UTF_8, + /* 0x093 */ OPT_NO_UTF_8, + /* 0x094 */ OPT_LT_CLEAR, + /* 0x095 */ OPT_LT_ONLINE, + /* 0x096 */ OPT_LT_N_PLAYERS, + /* 0x097 */ OPT_LT_COND_BIT, + /* 0x098 */ OPT_LT_GAME_MODE, + /* 0x099 */ OPT_LT_ENGINE, + /* 0x09a */ OPT_LT_RANDOM, + /* 0x09b */ OPT_LEX_PURGE, + /* 0x09c */ OPT_LEX_RM_FEAT, + /* 0x09d */ OPT_FORCE, + /* 0x09e */ OPT_REPAIR_MAGICS, + /* 0x09f */ OPT_CREATE_DISTRIB, + /* 0x0a0 */ OPT_OLD, + /* 0x0a1 */ OPT_STD, + /* 0x0a2 */ OPT_NEW, + /* 0x0a3 */ OPT_EXTRACT, + /* 0x0a4 */ OPT_LE_DEFINE, + /* 0x0a5 */ OPT_LE_ARENA, + /* 0x0a6 */ OPT_LPAR, + /* 0x0a7 */ OPT_ALIAS, + /* 0x0a8 */ OPT_ENGINE, + /* 0x0a9 */ OPT_200CC, + /* 0x0aa */ OPT_PERFMON, + /* 0x0ab */ OPT_CUSTOM_TT, + /* 0x0ac */ OPT_XPFLAGS, + /* 0x0ad */ OPT_SPEEDOMETER, + /* 0x0ae */ OPT_DEBUG, + /* 0x0af */ OPT_TRACK_DIR, + /* 0x0b0 */ OPT_COPY_TRACKS, + /* 0x0b1 */ OPT_MOVE_TRACKS, + /* 0x0b2 */ OPT_MOVE1_TRACKS, + /* 0x0b3 */ OPT_LINK_TRACKS, + /* 0x0b4 */ OPT_SZS_MODE, + /* 0x0b5 */ OPT_LOAD_BMG, + /* 0x0b6 */ OPT_PATCH_BMG, + /* 0x0b7 */ OPT_MACRO_BMG, + /* 0x0b8 */ OPT_PATCH_NAMES, + /* 0x0b9 */ OPT_ORDER_BY, + /* 0x0ba */ OPT_ORDER_ALL, + /* 0x0bb */ OPT_NUMBER, + /* 0x0bc */ OPT_SECTIONS, + /* 0x0bd */ 0,0,0, /* 0x0c0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* 0x0d0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* 0x0e0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, @@ -1027,154 +1094,166 @@ static const OptionIndex_t OptionIndex[UIOPT_INDEX_SIZE] = /////////////// opt_allowed_cmd_* /////////////// /////////////////////////////////////////////////////////////////////////////// -static u8 option_allowed_cmd_VERSION[44] = // cmd #1 +static u8 option_allowed_cmd_VERSION[47] = // cmd #1 { - 0,0,1,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1 + 0,0,0,1,0, 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,1 }; -static u8 option_allowed_cmd_HELP[44] = // cmd #2 +static u8 option_allowed_cmd_HELP[47] = // cmd #2 { 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, - 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1 + 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1 }; -static u8 option_allowed_cmd_CONFIG[44] = // cmd #3 +static u8 option_allowed_cmd_CONFIG[47] = // cmd #3 { - 0,0,1,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0 + 0,0,0,1,0, 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0 }; -static u8 option_allowed_cmd_ARGTEST[44] = // cmd #4 +static u8 option_allowed_cmd_ARGTEST[47] = // cmd #4 { 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, - 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1 + 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1 }; -static u8 option_allowed_cmd_TEST[44] = // cmd #5 +static u8 option_allowed_cmd_EXPAND[47] = // cmd #5 { 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, - 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1 + 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1 }; -static u8 option_allowed_cmd_COLORS[44] = // cmd #6 +static u8 option_allowed_cmd_TEST[47] = // cmd #6 { - 0,0,1,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0 + 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, + 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1 }; -static u8 option_allowed_cmd_ERROR[44] = // cmd #7 +static u8 option_allowed_cmd_COLORS[47] = // cmd #7 { - 0,0,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,1 + 0,0,0,1,0, 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0 }; -static u8 option_allowed_cmd_FILETYPE[44] = // cmd #8 +static u8 option_allowed_cmd_ERROR[47] = // cmd #8 { - 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0 + 0,0,0,1,1, 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,1 }; -static u8 option_allowed_cmd_FILEATTRIB[44] = // cmd #9 +static u8 option_allowed_cmd_FILETYPE[47] = // cmd #9 { 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1,0 }; -static u8 option_allowed_cmd_SYMBOLS[44] = // cmd #10 +static u8 option_allowed_cmd_FILEATTRIB[47] = // cmd #10 { - 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0 + 0,0,0,0,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 }; -static u8 option_allowed_cmd_FUNCTIONS[44] = // cmd #11 +static u8 option_allowed_cmd_SYMBOLS[47] = // cmd #11 { - 0,0,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,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 }; -static u8 option_allowed_cmd_CALCULATE[44] = // cmd #12 +static u8 option_allowed_cmd_FUNCTIONS[47] = // cmd #12 +{ + 0,0,0,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 +}; + +static u8 option_allowed_cmd_CALCULATE[47] = // cmd #13 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0 }; -static u8 option_allowed_cmd_FLOAT[44] = // cmd #13 +static u8 option_allowed_cmd_FLOAT[47] = // cmd #14 { - 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0 + 0,0,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 }; -static u8 option_allowed_cmd_EXPORT[44] = // cmd #14 +static u8 option_allowed_cmd_EXPORT[47] = // cmd #15 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0 }; -static u8 option_allowed_cmd_DPAD[44] = // cmd #15 +static u8 option_allowed_cmd_DPAD[47] = // cmd #16 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0 }; -static u8 option_allowed_cmd_DUMP[44] = // cmd #16 +static u8 option_allowed_cmd_DUMP[47] = // cmd #17 { - 0,0,1,0,0, 0,0,0,0,0, 0,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,1,0, 0,0,0,0,0, 0,0,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 }; -static u8 option_allowed_cmd_DL[44] = // cmd #17 +static u8 option_allowed_cmd_DL[47] = // cmd #18 { - 0,0,1,0,0, 0,0,0,0,0, 0,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,1,0, 0,0,0,0,0, 0,0,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 }; -static u8 option_allowed_cmd_DLL[44] = // cmd #18 +static u8 option_allowed_cmd_DLL[47] = // cmd #19 { - 0,0,1,0,0, 0,0,0,0,0, 0,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,1,0, 0,0,0,0,0, 0,0,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 }; -static u8 option_allowed_cmd_BIN_DIFF[44] = // cmd #19 +static u8 option_allowed_cmd_BIN_DIFF[47] = // cmd #20 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0 +}; + +static u8 option_allowed_cmd_PATCH[47] = // cmd #21 +{ + 0,0,0,0,0, 0,0,0,0,0, 0,0,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0, + 0,0,0,0,0, 0,0,1,1,1, 1,1,1,1,1, 1,0 }; -static u8 option_allowed_cmd_PATCH[44] = // cmd #20 +static u8 option_allowed_cmd_LPAR[47] = // cmd #22 { - 0,0,0,0,0, 0,0,0,0,0, 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,0,0,0, - 0,0,0,0,1, 1,1,1,1,1, 1,1,1,0 + 0,0,0,0,1, 1,1,0,0,0, 0,0,0,1,1, 1,1,1,1,1, 1,1,1,1,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,1,1,1, 1,1,1,1,1, 1,0 }; -static u8 option_allowed_cmd_LPAR[44] = // cmd #21 +static u8 option_allowed_cmd_CREATE[47] = // cmd #23 { - 0,0,0,1,1, 1,0,0,0,0, 0,1,1,1,1, 1,1,1,1,1, 1,1,0,0,0, 0,0,0,0,0, - 0,0,0,0,1, 1,1,1,1,1, 1,1,1,0 + 0,0,0,0,1, 1,1,0,1,1, 1,1,0,1,0, 1,0,1,1,1, 1,1,1,1,0, 0,0,0,0,0, + 0,1,0,0,0, 0,0,1,1,1, 1,1,1,1,1, 1,0 }; -static u8 option_allowed_cmd_CREATE[44] = // cmd #22 +static u8 option_allowed_cmd_DISTRIBUTION[47] = // cmd #24 { - 0,0,0,1,1, 1,0,1,1,1, 1,0,0,1,0, 1,1,1,1,1, 1,1,0,0,0, 0,0,0,0,0, - 0,0,0,0,1, 1,1,1,1,1, 1,1,1,0 + 0,1,0,0,1, 1,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 1,1,1,1,1, + 0,0,0,0,0, 0,0,1,1,1, 1,1,1,1,1, 1,0 }; -static u8 option_allowed_cmd_CAT[44] = // cmd #23 +static u8 option_allowed_cmd_CAT[47] = // cmd #25 { - 0,0,0,1,1, 1,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0 + 0,0,0,0,1, 1,1,0,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, + 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1,0 }; -static u8 option_allowed_cmd_DECODE[44] = // cmd #24 +static u8 option_allowed_cmd_DECODE[47] = // cmd #26 { - 0,0,0,1,1, 1,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,0, - 0,0,0,0,1, 1,1,1,1,1, 1,1,1,0 + 0,0,0,0,1, 1,1,0,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, + 1,0,0,0,0, 0,0,1,1,1, 1,1,1,1,1, 1,0 }; -static u8 option_allowed_cmd_ENCODE[44] = // cmd #25 +static u8 option_allowed_cmd_ENCODE[47] = // cmd #27 { - 0,0,0,0,0, 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,0, - 0,0,0,0,1, 1,1,1,1,1, 1,1,1,0 + 0,0,0,0,0, 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, + 1,0,0,0,0, 0,0,1,1,1, 1,1,1,1,1, 1,0 }; @@ -1193,15 +1272,18 @@ static const InfoOption_t * option_tab_tool[] = OptionInfo + OPT_COMPATIBLE, OptionInfo + OPT_WIDTH, OptionInfo + OPT_MAX_WIDTH, + OptionInfo + OPT_NO_PAGER, OptionInfo + OPT_QUIET, OptionInfo + OPT_VERBOSE, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_WARN, OptionInfo + OPT_DE, OptionInfo + OPT_COLORS, OptionInfo + OPT_NO_COLORS, OptionInfo + OPT_CT_CODE, OptionInfo + OPT_LE_CODE, + OptionInfo + OPT_LOAD_PREFIX, OptionInfo + OPT_CHDIR, OptionInfo + OPT_CONST, OptionInfo + OPT_MAX_FILE_SIZE, @@ -1255,6 +1337,12 @@ static const InfoOption_t * option_tab_cmd_ARGTEST[] = 0 }; +static const InfoOption_t * option_tab_cmd_EXPAND[] = +{ + + 0 +}; + static const InfoOption_t * option_tab_cmd_TEST[] = { @@ -1355,6 +1443,7 @@ static const InfoOption_t * option_tab_cmd_DUMP[] = &option_cmd_DUMP_LONG, &option_cmd_DUMP_VERBOSE, + OptionInfo + OPT_CREATE_DISTRIB, 0 }; @@ -1376,6 +1465,7 @@ static const InfoOption_t * option_tab_cmd_DL[] = &option_cmd_DUMP_LONG, &option_cmd_DUMP_VERBOSE, + OptionInfo + OPT_CREATE_DISTRIB, 0 }; @@ -1397,6 +1487,7 @@ static const InfoOption_t * option_tab_cmd_DLL[] = &option_cmd_DUMP_LONG, &option_cmd_DUMP_VERBOSE, + OptionInfo + OPT_CREATE_DISTRIB, 0 }; @@ -1441,6 +1532,7 @@ static const InfoOption_t * option_tab_cmd_PATCH[] = OptionInfo + OPT_UPDATE, OptionInfo + OPT_PRESERVE, OptionInfo + OPT_IGNORE, + OptionInfo + OPT_CREATE_DISTRIB, 0 }; @@ -1512,6 +1604,11 @@ static const InfoOption_t * option_tab_cmd_CREATE[] = OptionInfo + OPT_NONE, // separator + OptionInfo + OPT_LE_DEFINE, + OptionInfo + OPT_LOAD_BMG, + + OptionInfo + OPT_NONE, // separator + OptionInfo + OPT_ENGINE, OptionInfo + OPT_200CC, OptionInfo + OPT_PERFMON, @@ -1523,6 +1620,38 @@ static const InfoOption_t * option_tab_cmd_CREATE[] = 0 }; +static const InfoOption_t * option_tab_cmd_DISTRIBUTION[] = +{ + OptionInfo + OPT_LOAD_PREFIX, + OptionInfo + OPT_PLUS, + OptionInfo + OPT_TRACK_DIR, + OptionInfo + OPT_COPY_TRACKS, + OptionInfo + OPT_MOVE_TRACKS, + OptionInfo + OPT_MOVE1_TRACKS, + OptionInfo + OPT_LINK_TRACKS, + OptionInfo + OPT_SZS_MODE, + + OptionInfo + OPT_NONE, // separator + + OptionInfo + OPT_IGNORE, + &option_grp_TEXTOPT_NO_HEADER, + OptionInfo + OPT_BRIEF, + OptionInfo + OPT_EXPORT, + OptionInfo + OPT_DEST, + OptionInfo + OPT_DEST2, + OptionInfo + OPT_ESC, + + OptionInfo + OPT_NONE, // separator + + OptionInfo + OPT_OVERWRITE, + OptionInfo + OPT_NUMBER, + OptionInfo + OPT_REMOVE_DEST, + OptionInfo + OPT_UPDATE, + OptionInfo + OPT_PRESERVE, + + 0 +}; + static const InfoOption_t * option_tab_cmd_CAT[] = { OptionInfo + OPT_COMPLETE, @@ -1595,7 +1724,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "wlect [option]... command [option|parameter|file]...", "Wiimms LE-CODE Tool : Manage the LE-CODE and LEX extensions.", 0, - 28, + 31, option_tab_tool, 0 }, @@ -1661,13 +1790,32 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = 0, "wlect ARGTEST ...", "This debug command accepts all kinds of parameters and prints one" - " line for each parameter.", + " line for each parameter. All tools know the ARGTEST command.", 0, 0, option_tab_cmd_ARGTEST, option_allowed_cmd_ARGTEST }, + { CMD_EXPAND, + false, + false, + false, + "EXPAND", + 0, + "wlect EXPAND ...", + "This debug command accepts (like ARGTEST) all kinds of parameters and" + " prints one line for each parameter. After that, the parameter is" + " treated as a filename with wildcards and all matching files are" + " searched. The special parameters '+h' and '/h' enable or disable the" + " search for hidden directories and files (files beginning with a" + " point). All tools know the EXPAND command.", + 0, + 0, + option_tab_cmd_EXPAND, + option_allowed_cmd_EXPAND + }, + { CMD_TEST, false, false, @@ -1707,7 +1855,8 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "ERR", "wlect ERROR [error_code]", "Translate an exit code to a message name. If no exit code is entered," - " print a table with all error messages.", + " print a table with all error messages. All tools know the ERROR" + " command.", 0, 4, option_tab_cmd_ERROR, @@ -1722,7 +1871,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "FT", "wlect FILETYPE file...", "Scan the header of the entered files and print file type and path for" - " each file as list.", + " each file as list. All tools know the FILETYPE command.", 0, 2, option_tab_cmd_FILETYPE, @@ -1739,7 +1888,8 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "Print a table with attributes for all known file types. If at least" " one keyword is entered, only matching file types are printed. A" " keyword is either a file type (like 'BRRES' or 'BMG') or one of the" - " printed keywords (like 'ARCHIVE' or 'EXTRACT').", + " printed keywords (like 'ARCHIVE' or 'EXTRACT'). All tools know the" + " FILEATTRIB command.", 0, 1, option_tab_cmd_FILEATTRIB, @@ -1784,7 +1934,8 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "CALCULATE", 0, "wlect CALCULATE expression...", - "Calculate each expression and print the result to standard output.", + "Calculate each expression and print the result to standard output." + " Many tools know the CALCULATE command.", 0, 1, option_tab_cmd_CALCULATE, @@ -1852,7 +2003,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "Print an information dump for each source file. LE-CODE binaries and" " LEX binaries are accepted as input.", 0, - 12, + 13, option_tab_cmd_DUMP, option_allowed_cmd_DUMP }, @@ -1866,7 +2017,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "wlect DL [source]...", "Short cut for 'DUMP --long'.", 0, - 12, + 13, option_tab_cmd_DL, option_allowed_cmd_DL }, @@ -1880,7 +2031,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "wlect DLL [source]...", "Short cut for 'DUMP --long --long'.", 0, - 12, + 13, option_tab_cmd_DLL, option_allowed_cmd_DLL }, @@ -1917,7 +2068,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "Read each LE-BIN file and patch it. Use --le-define to setup cups and" " tracks.", 0, - 24, + 25, option_tab_cmd_PATCH, option_allowed_cmd_PATCH }, @@ -1944,21 +2095,37 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = true, "CREATE", "CR", - "wlect CREATE [keyword]", - "Create a file and print it to standard output. The kind of file is" - " defined by KEYWORD. Use command without keywords to get a list of" - " possible keywords.\n" - " The following keywords are possible: LEX for a LEX text file with" - " all known sections except TEST. LEX+ for a LEX text file with all" - " known sections including TEST. SET1, CANN, HIPT and TEST (section" - " names) for a LEX text file with 1 section only. LPAR for an example" - " LE-CODE parameter file.", + "wlect CREATE [keyword] ...", + "Create a file and print it to standard output. Options --dest and" + " --DEST can forc another destination. The kind of file is defined by" + " KEYWORD. The command can create LEX files, a LPAR file or a track" + " listing.\n" + " Use the command without keyword to get an extended description.", 0, - 29, + 31, option_tab_cmd_CREATE, option_allowed_cmd_CREATE }, + { CMD_DISTRIBUTION, + false, + false, + false, + "DISTRIBUTION", + "DIS", + "wlect DISTRIBUTION [argument]...", + "This command manages data for LE-CODE track distributions. It reads" + " any number of source files with different file types, collects the" + " data and creates any number of files with different file types.\n" + " Use the command without keyword to get an extended description.\n" + " This command is still under development. Its use is therefore" + " EXPERIMENTAL!", + 0, + 20, + option_tab_cmd_DISTRIBUTION, + option_allowed_cmd_DISTRIBUTION + }, + { CMD_CAT, false, false, diff --git a/project/src/ui/ui-wlect.h b/project/src/ui/ui-wlect.h index 4e6198e..854d96a 100644 --- a/project/src/ui/ui-wlect.h +++ b/project/src/ui/ui-wlect.h @@ -56,6 +56,7 @@ typedef enum enumOptions //----- command specific options ----- + OPT_PLUS, OPT_ROUND, OPT_LONG, OPT_NO_HEADER, @@ -66,6 +67,7 @@ typedef enum enumOptions OPT_LT_CLEAR, OPT_LT_ONLINE, OPT_LT_N_PLAYERS, + OPT_CREATE_DISTRIB, OPT_LE_DEFINE, OPT_LE_ARENA, OPT_LPAR, @@ -82,6 +84,7 @@ typedef enum enumOptions OPT_MOVE_TRACKS, OPT_MOVE1_TRACKS, OPT_LINK_TRACKS, + OPT_SZS_MODE, OPT_COMPLETE, OPT_LOAD_BMG, OPT_PATCH_BMG, @@ -100,7 +103,7 @@ typedef enum enumOptions OPT_IGNORE, OPT_SECTIONS, - OPT__N_SPECIFIC, // == 44 + OPT__N_SPECIFIC, // == 47 //----- global options ----- @@ -112,15 +115,18 @@ typedef enum enumOptions OPT_COMPATIBLE, OPT_WIDTH, OPT_MAX_WIDTH, + OPT_NO_PAGER, OPT_QUIET, OPT_VERBOSE, OPT_LOGGING, + OPT_TIMING, OPT_WARN, OPT_DE, OPT_COLORS, OPT_NO_COLORS, OPT_CT_CODE, OPT_LE_CODE, + OPT_LOAD_PREFIX, OPT_CHDIR, OPT_CONST, OPT_MAX_FILE_SIZE, @@ -140,7 +146,7 @@ typedef enum enumOptions OPT_NEW, OPT_EXTRACT, - OPT__N_TOTAL // == 79 + OPT__N_TOTAL // == 85 } enumOptions; @@ -155,6 +161,7 @@ typedef enum enumOptions //{ // //----- command specific options ----- // +// OB_PLUS = 1llu << OPT_PLUS, // OB_ROUND = 1llu << OPT_ROUND, // OB_LONG = 1llu << OPT_LONG, // OB_NO_HEADER = 1llu << OPT_NO_HEADER, @@ -165,6 +172,7 @@ typedef enum enumOptions // OB_LT_CLEAR = 1llu << OPT_LT_CLEAR, // OB_LT_ONLINE = 1llu << OPT_LT_ONLINE, // OB_LT_N_PLAYERS = 1llu << OPT_LT_N_PLAYERS, +// OB_CREATE_DISTRIB = 1llu << OPT_CREATE_DISTRIB, // OB_LE_DEFINE = 1llu << OPT_LE_DEFINE, // OB_LE_ARENA = 1llu << OPT_LE_ARENA, // OB_LPAR = 1llu << OPT_LPAR, @@ -181,6 +189,7 @@ typedef enum enumOptions // OB_MOVE_TRACKS = 1llu << OPT_MOVE_TRACKS, // OB_MOVE1_TRACKS = 1llu << OPT_MOVE1_TRACKS, // OB_LINK_TRACKS = 1llu << OPT_LINK_TRACKS, +// OB_SZS_MODE = 1llu << OPT_SZS_MODE, // OB_COMPLETE = 1llu << OPT_COMPLETE, // OB_LOAD_BMG = 1llu << OPT_LOAD_BMG, // OB_PATCH_BMG = 1llu << OPT_PATCH_BMG, @@ -248,6 +257,8 @@ typedef enum enumOptions // // OB_CMD_ARGTEST = ~(u64)0, // +// OB_CMD_EXPAND = ~(u64)0, +// // OB_CMD_TEST = ~(u64)0, // // OB_CMD_COLORS = OB_LONG @@ -279,7 +290,8 @@ typedef enum enumOptions // // OB_CMD_DUMP = OB_GRP_PATCH // | OB_LONG -// | OB_GRP_PATCH, +// | OB_GRP_PATCH +// | OB_CREATE_DISTRIB, // // OB_CMD_DL = OB_CMD_DUMP, // @@ -290,7 +302,8 @@ typedef enum enumOptions // OB_CMD_PATCH = OB_GRP_PATCH // | OB_GRP_TRACK_COPY // | OB_GRP_DEST -// | OB_IGNORE, +// | OB_IGNORE +// | OB_CREATE_DISTRIB, // // OB_CMD_LPAR = OB_GRP_PATCH // | OB_GRP_DEST @@ -303,8 +316,16 @@ typedef enum enumOptions // | OB_LT_CLEAR // | OB_LT_ONLINE // | OB_LT_N_PLAYERS +// | OB_LE_DEFINE +// | OB_LOAD_BMG // | OB_GRP_PARAM, // +// OB_CMD_DISTRIBUTION = OB_PLUS +// | OB_GRP_TRACK_COPY +// | OB_SZS_MODE +// | OB_GRP_TEXTOUT +// | OB_GRP_DEST, +// // OB_CMD_CAT = OB_COMPLETE // | OB_GRP_TEXTOUT // | OB_NO_ECHO @@ -336,6 +357,7 @@ typedef enum enumCommands CMD_HELP, CMD_CONFIG, CMD_ARGTEST, + CMD_EXPAND, CMD_TEST, CMD_COLORS, CMD_ERROR, @@ -356,12 +378,13 @@ typedef enum enumCommands CMD_LPAR, CMD_CREATE, + CMD_DISTRIBUTION, CMD_CAT, CMD_DECODE, CMD_ENCODE, - CMD__N // == 26 + CMD__N // == 28 } enumCommands; @@ -405,11 +428,15 @@ typedef enum enumGetOpt GO_COMPATIBLE, GO_WIDTH, GO_MAX_WIDTH, + GO_NO_PAGER, + GO_TIMING, GO_DE, GO_COLORS, GO_NO_COLORS, GO_CT_CODE, GO_LE_CODE, + GO_LOAD_PREFIX, + GO_PLUS, GO_CHDIR, GO_ROUND, GO_NO_ECHO, @@ -426,6 +453,7 @@ typedef enum enumGetOpt GO_LEX_RM_FEAT, GO_FORCE, GO_REPAIR_MAGICS, + GO_CREATE_DISTRIB, GO_OLD, GO_STD, GO_NEW, @@ -446,6 +474,7 @@ typedef enum enumGetOpt GO_MOVE_TRACKS, GO_MOVE1_TRACKS, GO_LINK_TRACKS, + GO_SZS_MODE, GO_LOAD_BMG, GO_PATCH_BMG, GO_MACRO_BMG, diff --git a/project/src/ui/ui-wmdlt.c b/project/src/ui/ui-wmdlt.c index 14d0016..0be480c 100644 --- a/project/src/ui/ui-wmdlt.c +++ b/project/src/ui/ui-wmdlt.c @@ -375,6 +375,11 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = " --width is set." }, + { OPT_NO_PAGER, false, false, false, true, false, 0, "no-pager", + 0, + "Forbid the internal usage of a pager." + }, + { OPT_QUIET, false, false, false, false, false, 'q', "quiet", 0, "Be quiet and print only error messages. Multiple usage is possible." @@ -390,7 +395,14 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = { OPT_LOGGING, false, false, false, false, false, 'L', "logging", 0, - "This debug option enables the logging of internal lists and maps." + "This debug option enables the logging of internal lists and maps. Set" + " it up to three times to be more verbose.\n" + }, + + { OPT_TIMING, false, false, false, false, false, 0, "timing", + 0, + "Activate the timing of some operations. Logging level 3 activates" + " them too.\n" }, { OPT_WARN, false, false, false, false, false, 'W', "warn", @@ -572,7 +584,7 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = " helper option." }, - {0,0,0,0,0,0,0,0,0,0} // OPT__N_TOTAL == 66 + {0,0,0,0,0,0,0,0,0,0} // OPT__N_TOTAL == 68 }; @@ -703,6 +715,7 @@ static const KeywordTab_t CommandTab[] = { CMD_HELP, "?", 0, 0 }, { CMD_CONFIG, "CONFIG", 0, 0 }, { CMD_ARGTEST, "ARGTEST", 0, 0 }, + { CMD_EXPAND, "EXPAND", 0, 0 }, { CMD_TEST, "TEST", 0, 0 }, { CMD_COLORS, "COLORS", 0, 0 }, { CMD_ERROR, "ERROR", "ERR", 0 }, @@ -743,9 +756,12 @@ static const struct option OptionLong[] = { "width", 1, 0, GO_WIDTH }, { "max-width", 1, 0, GO_MAX_WIDTH }, { "maxwidth", 1, 0, GO_MAX_WIDTH }, + { "no-pager", 0, 0, GO_NO_PAGER }, + { "nopager", 0, 0, GO_NO_PAGER }, { "quiet", 0, 0, 'q' }, { "verbose", 0, 0, 'v' }, { "logging", 0, 0, 'L' }, + { "timing", 0, 0, GO_TIMING }, { "warn", 1, 0, 'W' }, { "de", 0, 0, GO_DE }, { "colors", 2, 0, GO_COLORS }, @@ -879,42 +895,44 @@ static const OptionIndex_t OptionIndex[UIOPT_INDEX_SIZE] = /* 0x083 */ OPT_COMPATIBLE, /* 0x084 */ OPT_WIDTH, /* 0x085 */ OPT_MAX_WIDTH, - /* 0x086 */ OPT_DE, - /* 0x087 */ OPT_COLORS, - /* 0x088 */ OPT_NO_COLORS, - /* 0x089 */ OPT_CT_CODE, - /* 0x08a */ OPT_LE_CODE, - /* 0x08b */ OPT_CHDIR, - /* 0x08c */ OPT_MDL, - /* 0x08d */ OPT_SCALE, - /* 0x08e */ OPT_SHIFT, - /* 0x08f */ OPT_XSS, - /* 0x090 */ OPT_YSS, - /* 0x091 */ OPT_ZSS, - /* 0x092 */ OPT_ROT, - /* 0x093 */ OPT_XROT, - /* 0x094 */ OPT_YROT, - /* 0x095 */ OPT_ZROT, - /* 0x096 */ OPT_TRANSLATE, - /* 0x097 */ OPT_NULL, - /* 0x098 */ OPT_NEXT, - /* 0x099 */ OPT_ASCALE, - /* 0x09a */ OPT_AROT, - /* 0x09b */ OPT_TFORM_SCRIPT, - /* 0x09c */ OPT_ROUND, - /* 0x09d */ OPT_NO_ECHO, - /* 0x09e */ OPT_UTF_8, - /* 0x09f */ OPT_NO_UTF_8, - /* 0x0a0 */ OPT_FORCE, - /* 0x0a1 */ OPT_REPAIR_MAGICS, - /* 0x0a2 */ OPT_TINY, - /* 0x0a3 */ OPT_OLD, - /* 0x0a4 */ OPT_STD, - /* 0x0a5 */ OPT_NEW, - /* 0x0a6 */ OPT_EXTRACT, - /* 0x0a7 */ OPT_NUMBER, - /* 0x0a8 */ OPT_SECTIONS, - /* 0x0a9 */ 0,0,0,0, 0,0,0, + /* 0x086 */ OPT_NO_PAGER, + /* 0x087 */ OPT_TIMING, + /* 0x088 */ OPT_DE, + /* 0x089 */ OPT_COLORS, + /* 0x08a */ OPT_NO_COLORS, + /* 0x08b */ OPT_CT_CODE, + /* 0x08c */ OPT_LE_CODE, + /* 0x08d */ OPT_CHDIR, + /* 0x08e */ OPT_MDL, + /* 0x08f */ OPT_SCALE, + /* 0x090 */ OPT_SHIFT, + /* 0x091 */ OPT_XSS, + /* 0x092 */ OPT_YSS, + /* 0x093 */ OPT_ZSS, + /* 0x094 */ OPT_ROT, + /* 0x095 */ OPT_XROT, + /* 0x096 */ OPT_YROT, + /* 0x097 */ OPT_ZROT, + /* 0x098 */ OPT_TRANSLATE, + /* 0x099 */ OPT_NULL, + /* 0x09a */ OPT_NEXT, + /* 0x09b */ OPT_ASCALE, + /* 0x09c */ OPT_AROT, + /* 0x09d */ OPT_TFORM_SCRIPT, + /* 0x09e */ OPT_ROUND, + /* 0x09f */ OPT_NO_ECHO, + /* 0x0a0 */ OPT_UTF_8, + /* 0x0a1 */ OPT_NO_UTF_8, + /* 0x0a2 */ OPT_FORCE, + /* 0x0a3 */ OPT_REPAIR_MAGICS, + /* 0x0a4 */ OPT_TINY, + /* 0x0a5 */ OPT_OLD, + /* 0x0a6 */ OPT_STD, + /* 0x0a7 */ OPT_NEW, + /* 0x0a8 */ OPT_EXTRACT, + /* 0x0a9 */ OPT_NUMBER, + /* 0x0aa */ OPT_SECTIONS, + /* 0x0ab */ 0,0,0,0, 0, /* 0x0b0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* 0x0c0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* 0x0d0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, @@ -955,103 +973,109 @@ static u8 option_allowed_cmd_ARGTEST[33] = // cmd #4 1,1,1 }; -static u8 option_allowed_cmd_TEST[33] = // cmd #5 +static u8 option_allowed_cmd_EXPAND[33] = // cmd #5 { 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1 }; -static u8 option_allowed_cmd_COLORS[33] = // cmd #6 +static u8 option_allowed_cmd_TEST[33] = // cmd #6 +{ + 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, + 1,1,1 +}; + +static u8 option_allowed_cmd_COLORS[33] = // cmd #7 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0 }; -static u8 option_allowed_cmd_ERROR[33] = // cmd #7 +static u8 option_allowed_cmd_ERROR[33] = // cmd #8 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,1,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,1 }; -static u8 option_allowed_cmd_FILETYPE[33] = // cmd #8 +static u8 option_allowed_cmd_FILETYPE[33] = // cmd #9 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,1,0 }; -static u8 option_allowed_cmd_FILEATTRIB[33] = // cmd #9 +static u8 option_allowed_cmd_FILEATTRIB[33] = // cmd #10 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0 }; -static u8 option_allowed_cmd_SYMBOLS[33] = // cmd #10 +static u8 option_allowed_cmd_SYMBOLS[33] = // cmd #11 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0 }; -static u8 option_allowed_cmd_FUNCTIONS[33] = // cmd #11 +static u8 option_allowed_cmd_FUNCTIONS[33] = // cmd #12 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,1,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0 }; -static u8 option_allowed_cmd_CALCULATE[33] = // cmd #12 +static u8 option_allowed_cmd_CALCULATE[33] = // cmd #13 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0 }; -static u8 option_allowed_cmd_MATRIX[33] = // cmd #13 +static u8 option_allowed_cmd_MATRIX[33] = // cmd #14 { 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0,1,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0 }; -static u8 option_allowed_cmd_FLOAT[33] = // cmd #14 +static u8 option_allowed_cmd_FLOAT[33] = // cmd #15 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0 }; -static u8 option_allowed_cmd_EXPORT[33] = // cmd #15 +static u8 option_allowed_cmd_EXPORT[33] = // cmd #16 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0 }; -static u8 option_allowed_cmd_CAT[33] = // cmd #16 +static u8 option_allowed_cmd_CAT[33] = // cmd #17 { 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0,0,1,1, 0,1,1,0,0, 0,0,0,0,0, 0,1,0 }; -static u8 option_allowed_cmd_DECODE[33] = // cmd #17 +static u8 option_allowed_cmd_DECODE[33] = // cmd #18 { 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0,0,1,1, 0,1,1,1,1, 1,1,1,1,1, 1,1,0 }; -static u8 option_allowed_cmd_ENCODE[33] = // cmd #18 +static u8 option_allowed_cmd_ENCODE[33] = // cmd #19 { 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0,0,0,0, 0,1,1,1,1, 1,1,1,1,1, 1,1,0 }; -static u8 option_allowed_cmd_STRINGS[33] = // cmd #19 +static u8 option_allowed_cmd_STRINGS[33] = // cmd #20 { 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0,0,1,1, 0,1,1,0,0, 0,0,0,0,0, 0,1,0 }; -static u8 option_allowed_cmd_GEOMETRY[33] = // cmd #20 +static u8 option_allowed_cmd_GEOMETRY[33] = // cmd #21 { 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0,0,1,1, 0,1,1,0,0, 0,0,0,0,0, 0,1,0 }; -static u8 option_allowed_cmd_XTEST[33] = // cmd #21 +static u8 option_allowed_cmd_XTEST[33] = // cmd #22 { 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0,0,1,1, 0,1,1,0,0, 0,0,0,0,0, 0,1,0 @@ -1073,9 +1097,11 @@ static const InfoOption_t * option_tab_tool[] = OptionInfo + OPT_COMPATIBLE, OptionInfo + OPT_WIDTH, OptionInfo + OPT_MAX_WIDTH, + OptionInfo + OPT_NO_PAGER, OptionInfo + OPT_QUIET, OptionInfo + OPT_VERBOSE, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_WARN, OptionInfo + OPT_DE, OptionInfo + OPT_COLORS, @@ -1129,6 +1155,12 @@ static const InfoOption_t * option_tab_cmd_ARGTEST[] = 0 }; +static const InfoOption_t * option_tab_cmd_EXPAND[] = +{ + + 0 +}; + static const InfoOption_t * option_tab_cmd_TEST[] = { &option_cmd_TEST_VERBOSE, @@ -1452,7 +1484,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "wmdlt [option]... command [option|parameter|file]...", "Wiimms MDL Tool : Decode raw MDL and encode text MDL files.", 0, - 25, + 27, option_tab_tool, 0 }, @@ -1518,13 +1550,32 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = 0, "wmdlt ARGTEST ...", "This debug command accepts all kinds of parameters and prints one" - " line for each parameter.", + " line for each parameter. All tools know the ARGTEST command.", 0, 0, option_tab_cmd_ARGTEST, option_allowed_cmd_ARGTEST }, + { CMD_EXPAND, + false, + false, + false, + "EXPAND", + 0, + "wmdlt EXPAND ...", + "This debug command accepts (like ARGTEST) all kinds of parameters and" + " prints one line for each parameter. After that, the parameter is" + " treated as a filename with wildcards and all matching files are" + " searched. The special parameters '+h' and '/h' enable or disable the" + " search for hidden directories and files (files beginning with a" + " point). All tools know the EXPAND command.", + 0, + 0, + option_tab_cmd_EXPAND, + option_allowed_cmd_EXPAND + }, + { CMD_TEST, false, false, @@ -1564,7 +1615,8 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "ERR", "wmdlt ERROR [error_code]", "Translate an exit code to a message name. If no exit code is entered," - " print a table with all error messages.", + " print a table with all error messages. All tools know the ERROR" + " command.", 0, 4, option_tab_cmd_ERROR, @@ -1579,7 +1631,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "FT", "wmdlt FILETYPE file...", "Scan the header of the entered files and print file type and path for" - " each file as list.", + " each file as list. All tools know the FILETYPE command.", 0, 2, option_tab_cmd_FILETYPE, @@ -1596,7 +1648,8 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "Print a table with attributes for all known file types. If at least" " one keyword is entered, only matching file types are printed. A" " keyword is either a file type (like 'BRRES' or 'BMG') or one of the" - " printed keywords (like 'ARCHIVE' or 'EXTRACT').", + " printed keywords (like 'ARCHIVE' or 'EXTRACT'). All tools know the" + " FILEATTRIB command.", 0, 1, option_tab_cmd_FILEATTRIB, @@ -1641,7 +1694,8 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "CALCULATE", 0, "wmdlt CALCULATE expression...", - "Calculate each expression and print the result to standard output.", + "Calculate each expression and print the result to standard output." + " Many tools know the CALCULATE command.", 0, 1, option_tab_cmd_CALCULATE, diff --git a/project/src/ui/ui-wmdlt.h b/project/src/ui/ui-wmdlt.h index 54e94e3..242795b 100644 --- a/project/src/ui/ui-wmdlt.h +++ b/project/src/ui/ui-wmdlt.h @@ -101,9 +101,11 @@ typedef enum enumOptions OPT_COMPATIBLE, OPT_WIDTH, OPT_MAX_WIDTH, + OPT_NO_PAGER, OPT_QUIET, OPT_VERBOSE, OPT_LOGGING, + OPT_TIMING, OPT_WARN, OPT_DE, OPT_COLORS, @@ -127,7 +129,7 @@ typedef enum enumOptions OPT_NEW, OPT_EXTRACT, - OPT__N_TOTAL // == 66 + OPT__N_TOTAL // == 68 } enumOptions; @@ -217,6 +219,8 @@ typedef enum enumOptions // // OB_CMD_ARGTEST = ~(u64)0, // +// OB_CMD_EXPAND = ~(u64)0, +// // OB_CMD_TEST = ~(u64)0, // // OB_CMD_COLORS = OB_LONG @@ -300,6 +304,7 @@ typedef enum enumCommands CMD_HELP, CMD_CONFIG, CMD_ARGTEST, + CMD_EXPAND, CMD_TEST, CMD_COLORS, CMD_ERROR, @@ -320,7 +325,7 @@ typedef enum enumCommands CMD_GEOMETRY, CMD_XTEST, - CMD__N // == 22 + CMD__N // == 23 } enumCommands; @@ -365,6 +370,8 @@ typedef enum enumGetOpt GO_COMPATIBLE, GO_WIDTH, GO_MAX_WIDTH, + GO_NO_PAGER, + GO_TIMING, GO_DE, GO_COLORS, GO_NO_COLORS, diff --git a/project/src/ui/ui-wpatt.c b/project/src/ui/ui-wpatt.c index b0df846..d2b9b3a 100644 --- a/project/src/ui/ui-wpatt.c +++ b/project/src/ui/ui-wpatt.c @@ -217,6 +217,11 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = " --width is set." }, + { OPT_NO_PAGER, false, false, false, true, false, 0, "no-pager", + 0, + "Forbid the internal usage of a pager." + }, + { OPT_QUIET, false, false, false, false, false, 'q', "quiet", 0, "Be quiet and print only error messages. Multiple usage is possible." @@ -232,7 +237,14 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = { OPT_LOGGING, false, false, false, false, false, 'L', "logging", 0, - "This debug option enables the logging of internal lists and maps." + "This debug option enables the logging of internal lists and maps. Set" + " it up to three times to be more verbose.\n" + }, + + { OPT_TIMING, false, false, false, false, false, 0, "timing", + 0, + "Activate the timing of some operations. Logging level 3 activates" + " them too.\n" }, { OPT_WARN, false, false, false, false, false, 'W', "warn", @@ -403,7 +415,7 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = " helper option." }, - {0,0,0,0,0,0,0,0,0,0} // OPT__N_TOTAL == 50 + {0,0,0,0,0,0,0,0,0,0} // OPT__N_TOTAL == 52 }; @@ -504,6 +516,7 @@ static const KeywordTab_t CommandTab[] = { CMD_HELP, "?", 0, 0 }, { CMD_CONFIG, "CONFIG", 0, 0 }, { CMD_ARGTEST, "ARGTEST", 0, 0 }, + { CMD_EXPAND, "EXPAND", 0, 0 }, { CMD_TEST, "TEST", 0, 0 }, { CMD_COLORS, "COLORS", 0, 0 }, { CMD_ERROR, "ERROR", "ERR", 0 }, @@ -540,9 +553,12 @@ static const struct option OptionLong[] = { "width", 1, 0, GO_WIDTH }, { "max-width", 1, 0, GO_MAX_WIDTH }, { "maxwidth", 1, 0, GO_MAX_WIDTH }, + { "no-pager", 0, 0, GO_NO_PAGER }, + { "nopager", 0, 0, GO_NO_PAGER }, { "quiet", 0, 0, 'q' }, { "verbose", 0, 0, 'v' }, { "logging", 0, 0, 'L' }, + { "timing", 0, 0, GO_TIMING }, { "warn", 1, 0, 'W' }, { "de", 0, 0, GO_DE }, { "colors", 2, 0, GO_COLORS }, @@ -658,26 +674,28 @@ static const OptionIndex_t OptionIndex[UIOPT_INDEX_SIZE] = /* 0x083 */ OPT_COMPATIBLE, /* 0x084 */ OPT_WIDTH, /* 0x085 */ OPT_MAX_WIDTH, - /* 0x086 */ OPT_DE, - /* 0x087 */ OPT_COLORS, - /* 0x088 */ OPT_NO_COLORS, - /* 0x089 */ OPT_CT_CODE, - /* 0x08a */ OPT_LE_CODE, - /* 0x08b */ OPT_CHDIR, - /* 0x08c */ OPT_ROUND, - /* 0x08d */ OPT_NO_ECHO, - /* 0x08e */ OPT_PAT, - /* 0x08f */ OPT_UTF_8, - /* 0x090 */ OPT_NO_UTF_8, - /* 0x091 */ OPT_FORCE, - /* 0x092 */ OPT_REPAIR_MAGICS, - /* 0x093 */ OPT_OLD, - /* 0x094 */ OPT_STD, - /* 0x095 */ OPT_NEW, - /* 0x096 */ OPT_EXTRACT, - /* 0x097 */ OPT_NUMBER, - /* 0x098 */ OPT_SECTIONS, - /* 0x099 */ 0,0,0,0, 0,0,0, + /* 0x086 */ OPT_NO_PAGER, + /* 0x087 */ OPT_TIMING, + /* 0x088 */ OPT_DE, + /* 0x089 */ OPT_COLORS, + /* 0x08a */ OPT_NO_COLORS, + /* 0x08b */ OPT_CT_CODE, + /* 0x08c */ OPT_LE_CODE, + /* 0x08d */ OPT_CHDIR, + /* 0x08e */ OPT_ROUND, + /* 0x08f */ OPT_NO_ECHO, + /* 0x090 */ OPT_PAT, + /* 0x091 */ OPT_UTF_8, + /* 0x092 */ OPT_NO_UTF_8, + /* 0x093 */ OPT_FORCE, + /* 0x094 */ OPT_REPAIR_MAGICS, + /* 0x095 */ OPT_OLD, + /* 0x096 */ OPT_STD, + /* 0x097 */ OPT_NEW, + /* 0x098 */ OPT_EXTRACT, + /* 0x099 */ OPT_NUMBER, + /* 0x09a */ OPT_SECTIONS, + /* 0x09b */ 0,0,0,0, 0, /* 0x0a0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* 0x0b0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* 0x0c0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, @@ -715,67 +733,72 @@ static u8 option_allowed_cmd_ARGTEST[18] = // cmd #4 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1 }; -static u8 option_allowed_cmd_TEST[18] = // cmd #5 +static u8 option_allowed_cmd_EXPAND[18] = // cmd #5 { 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1 }; -static u8 option_allowed_cmd_COLORS[18] = // cmd #6 +static u8 option_allowed_cmd_TEST[18] = // cmd #6 +{ + 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1 +}; + +static u8 option_allowed_cmd_COLORS[18] = // cmd #7 { 0,0,1,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0 }; -static u8 option_allowed_cmd_ERROR[18] = // cmd #7 +static u8 option_allowed_cmd_ERROR[18] = // cmd #8 { 0,0,1,1,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,1 }; -static u8 option_allowed_cmd_FILETYPE[18] = // cmd #8 +static u8 option_allowed_cmd_FILETYPE[18] = // cmd #9 { 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,1,0 }; -static u8 option_allowed_cmd_FILEATTRIB[18] = // cmd #9 +static u8 option_allowed_cmd_FILEATTRIB[18] = // cmd #10 { 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0 }; -static u8 option_allowed_cmd_SYMBOLS[18] = // cmd #10 +static u8 option_allowed_cmd_SYMBOLS[18] = // cmd #11 { 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0 }; -static u8 option_allowed_cmd_FUNCTIONS[18] = // cmd #11 +static u8 option_allowed_cmd_FUNCTIONS[18] = // cmd #12 { 0,0,1,1,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0 }; -static u8 option_allowed_cmd_CALCULATE[18] = // cmd #12 +static u8 option_allowed_cmd_CALCULATE[18] = // cmd #13 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0 }; -static u8 option_allowed_cmd_FLOAT[18] = // cmd #13 +static u8 option_allowed_cmd_FLOAT[18] = // cmd #14 { 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0 }; -static u8 option_allowed_cmd_EXPORT[18] = // cmd #14 +static u8 option_allowed_cmd_EXPORT[18] = // cmd #15 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0 }; -static u8 option_allowed_cmd_CAT[18] = // cmd #15 +static u8 option_allowed_cmd_CAT[18] = // cmd #16 { 0,0,0,1,1, 0,1,1,0,0, 0,0,0,0,0, 0,1,0 }; -static u8 option_allowed_cmd_DECODE[18] = // cmd #16 +static u8 option_allowed_cmd_DECODE[18] = // cmd #17 { 0,0,0,1,1, 0,1,1,1,1, 1,1,1,1,1, 1,1,0 }; -static u8 option_allowed_cmd_ENCODE[18] = // cmd #17 +static u8 option_allowed_cmd_ENCODE[18] = // cmd #18 { 0,0,0,0,0, 0,1,1,1,1, 1,1,1,1,1, 1,1,0 }; @@ -796,9 +819,11 @@ static const InfoOption_t * option_tab_tool[] = OptionInfo + OPT_COMPATIBLE, OptionInfo + OPT_WIDTH, OptionInfo + OPT_MAX_WIDTH, + OptionInfo + OPT_NO_PAGER, OptionInfo + OPT_QUIET, OptionInfo + OPT_VERBOSE, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_WARN, OptionInfo + OPT_DE, OptionInfo + OPT_COLORS, @@ -851,6 +876,12 @@ static const InfoOption_t * option_tab_cmd_ARGTEST[] = 0 }; +static const InfoOption_t * option_tab_cmd_EXPAND[] = +{ + + 0 +}; + static const InfoOption_t * option_tab_cmd_TEST[] = { @@ -1000,7 +1031,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "wpatt [option]... command [option|parameter|file]...", "Wiimms PAT Tool : Decode raw PAT and encode text PAT files.", 0, - 24, + 26, option_tab_tool, 0 }, @@ -1066,13 +1097,32 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = 0, "wpatt ARGTEST ...", "This debug command accepts all kinds of parameters and prints one" - " line for each parameter.", + " line for each parameter. All tools know the ARGTEST command.", 0, 0, option_tab_cmd_ARGTEST, option_allowed_cmd_ARGTEST }, + { CMD_EXPAND, + false, + false, + false, + "EXPAND", + 0, + "wpatt EXPAND ...", + "This debug command accepts (like ARGTEST) all kinds of parameters and" + " prints one line for each parameter. After that, the parameter is" + " treated as a filename with wildcards and all matching files are" + " searched. The special parameters '+h' and '/h' enable or disable the" + " search for hidden directories and files (files beginning with a" + " point). All tools know the EXPAND command.", + 0, + 0, + option_tab_cmd_EXPAND, + option_allowed_cmd_EXPAND + }, + { CMD_TEST, false, false, @@ -1112,7 +1162,8 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "ERR", "wpatt ERROR [error_code]", "Translate an exit code to a message name. If no exit code is entered," - " print a table with all error messages.", + " print a table with all error messages. All tools know the ERROR" + " command.", 0, 4, option_tab_cmd_ERROR, @@ -1127,7 +1178,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "FT", "wpatt FILETYPE file...", "Scan the header of the entered files and print file type and path for" - " each file as list.", + " each file as list. All tools know the FILETYPE command.", 0, 2, option_tab_cmd_FILETYPE, @@ -1144,7 +1195,8 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "Print a table with attributes for all known file types. If at least" " one keyword is entered, only matching file types are printed. A" " keyword is either a file type (like 'BRRES' or 'BMG') or one of the" - " printed keywords (like 'ARCHIVE' or 'EXTRACT').", + " printed keywords (like 'ARCHIVE' or 'EXTRACT'). All tools know the" + " FILEATTRIB command.", 0, 1, option_tab_cmd_FILEATTRIB, @@ -1189,7 +1241,8 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "CALCULATE", 0, "wpatt CALCULATE expression...", - "Calculate each expression and print the result to standard output.", + "Calculate each expression and print the result to standard output." + " Many tools know the CALCULATE command.", 0, 1, option_tab_cmd_CALCULATE, diff --git a/project/src/ui/ui-wpatt.h b/project/src/ui/ui-wpatt.h index 414f0a8..81e9549 100644 --- a/project/src/ui/ui-wpatt.h +++ b/project/src/ui/ui-wpatt.h @@ -86,9 +86,11 @@ typedef enum enumOptions OPT_COMPATIBLE, OPT_WIDTH, OPT_MAX_WIDTH, + OPT_NO_PAGER, OPT_QUIET, OPT_VERBOSE, OPT_LOGGING, + OPT_TIMING, OPT_WARN, OPT_DE, OPT_COLORS, @@ -111,7 +113,7 @@ typedef enum enumOptions OPT_NEW, OPT_EXTRACT, - OPT__N_TOTAL // == 50 + OPT__N_TOTAL // == 52 } enumOptions; @@ -170,6 +172,8 @@ typedef enum enumOptions // // OB_CMD_ARGTEST = ~(u64)0, // +// OB_CMD_EXPAND = ~(u64)0, +// // OB_CMD_TEST = ~(u64)0, // // OB_CMD_COLORS = OB_LONG @@ -228,6 +232,7 @@ typedef enum enumCommands CMD_HELP, CMD_CONFIG, CMD_ARGTEST, + CMD_EXPAND, CMD_TEST, CMD_COLORS, CMD_ERROR, @@ -243,7 +248,7 @@ typedef enum enumCommands CMD_DECODE, CMD_ENCODE, - CMD__N // == 18 + CMD__N // == 19 } enumCommands; @@ -288,6 +293,8 @@ typedef enum enumGetOpt GO_COMPATIBLE, GO_WIDTH, GO_MAX_WIDTH, + GO_NO_PAGER, + GO_TIMING, GO_DE, GO_COLORS, GO_NO_COLORS, diff --git a/project/src/ui/ui-wstrt.c b/project/src/ui/ui-wstrt.c index b82ca2a..f3900b7 100644 --- a/project/src/ui/ui-wstrt.c +++ b/project/src/ui/ui-wstrt.c @@ -551,6 +551,11 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = " --width is set." }, + { OPT_NO_PAGER, false, false, false, true, false, 0, "no-pager", + 0, + "Forbid the internal usage of a pager." + }, + { OPT_QUIET, false, false, false, false, false, 'q', "quiet", 0, "Be quiet and print only error messages. Multiple usage is possible." @@ -566,7 +571,14 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = { OPT_LOGGING, false, false, false, false, false, 'L', "logging", 0, - "This debug option enables the logging of internal lists and maps." + "This debug option enables the logging of internal lists and maps. Set" + " it up to three times to be more verbose.\n" + }, + + { OPT_TIMING, false, false, false, false, false, 0, "timing", + 0, + "Activate the timing of some operations. Logging level 3 activates" + " them too.\n" }, { OPT_WARN, false, false, false, false, false, 'W', "warn", @@ -886,7 +898,7 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = " directory." }, - {0,0,0,0,0,0,0,0,0,0} // OPT__N_TOTAL == 118 + {0,0,0,0,0,0,0,0,0,0} // OPT__N_TOTAL == 120 }; @@ -1066,6 +1078,7 @@ static const KeywordTab_t CommandTab[] = { CMD_HELP, "?", 0, 0 }, { CMD_CONFIG, "CONFIG", 0, 0 }, { CMD_ARGTEST, "ARGTEST", 0, 0 }, + { CMD_EXPAND, "EXPAND", 0, 0 }, { CMD_TEST, "TEST", 0, 0 }, { CMD_COLORS, "COLORS", 0, 0 }, { CMD_ERROR, "ERROR", "ERR", 0 }, @@ -1111,9 +1124,12 @@ static const struct option OptionLong[] = { "width", 1, 0, GO_WIDTH }, { "max-width", 1, 0, GO_MAX_WIDTH }, { "maxwidth", 1, 0, GO_MAX_WIDTH }, + { "no-pager", 0, 0, GO_NO_PAGER }, + { "nopager", 0, 0, GO_NO_PAGER }, { "quiet", 0, 0, 'q' }, { "verbose", 0, 0, 'v' }, { "logging", 0, 0, 'L' }, + { "timing", 0, 0, GO_TIMING }, { "warn", 1, 0, 'W' }, { "de", 0, 0, GO_DE }, { "colors", 2, 0, GO_COLORS }, @@ -1327,93 +1343,95 @@ static const OptionIndex_t OptionIndex[UIOPT_INDEX_SIZE] = /* 0x083 */ OPT_COMPATIBLE, /* 0x084 */ OPT_WIDTH, /* 0x085 */ OPT_MAX_WIDTH, - /* 0x086 */ OPT_DE, - /* 0x087 */ OPT_COLORS, - /* 0x088 */ OPT_NO_COLORS, - /* 0x089 */ OPT_CT_CODE, - /* 0x08a */ OPT_LE_CODE, - /* 0x08b */ OPT_CHDIR, - /* 0x08c */ OPT_VS_REGION, - /* 0x08d */ OPT_BT_REGION, - /* 0x08e */ OPT_ALL_RANKS, - /* 0x08f */ OPT_POINTS, - /* 0x090 */ OPT_CHEAT, - /* 0x091 */ OPT_HTTPS, - /* 0x092 */ OPT_DOMAIN, - /* 0x093 */ OPT_WIIMMFI, - /* 0x094 */ OPT_TWIIMMFI, - /* 0x095 */ OPT_WC24, - /* 0x096 */ OPT_WCODE, - /* 0x097 */ OPT_ADD_WCODE, - /* 0x098 */ OPT_PB_MODE, - /* 0x099 */ OPT_PATCHED_BY, - /* 0x09a */ OPT_VS, - /* 0x09b */ OPT_VS2, - /* 0x09c */ OPT_BT, - /* 0x09d */ OPT_BT2, - /* 0x09e */ OPT_CANNON, - /* 0x09f */ OPT_MENO, - /* 0x0a0 */ OPT_UTF_8, - /* 0x0a1 */ OPT_NO_UTF_8, - /* 0x0a2 */ OPT_FORCE, - /* 0x0a3 */ OPT_REPAIR_MAGICS, - /* 0x0a4 */ OPT_OLD, - /* 0x0a5 */ OPT_STD, - /* 0x0a6 */ OPT_NEW, - /* 0x0a7 */ OPT_EXTRACT, - /* 0x0a8 */ OPT_NUMBER, - /* 0x0a9 */ OPT_CLEAN_DOL, - /* 0x0aa */ OPT_ADD_LECODE, - /* 0x0ab */ OPT_ADD_CTCODE, - /* 0x0ac */ OPT_CT_DIR, - /* 0x0ad */ OPT_MOVE_D8, - /* 0x0ae */ OPT_ADD_SECTION, - /* 0x0af */ OPT_FULL_GCH, - /* 0x0b0 */ OPT_GCT_NO_SEP, - /* 0x0b1 */ OPT_GCT_SEP, - /* 0x0b2 */ OPT_GCT_ASM_SEP, - /* 0x0b3 */ OPT_GCT_LIST, - /* 0x0b4 */ OPT_GCT_MOVE, - /* 0x0b5 */ OPT_GCT_ADDR, - /* 0x0b6 */ OPT_GCT_SPACE, - /* 0x0b7 */ OPT_ALLOW_USER_GCH, - /* 0x0b8 */ OPT_CREATE_SECT, - /* 0x0b9 */ OPT_WPF, - /* 0x0ba */ OPT_SECTIONS, - /* 0x0bb */ OPT_PORT_DB, - /* 0x0bc */ OPT_ORDER, - /* 0x0bd */ OPT_VADDR, - /* 0x0be */ OPT_FADDR, - /* 0x0bf */ OPT_SNAME, - /* 0x0c0 */ OPT_INT1, - /* 0x0c1 */ OPT_INT2, - /* 0x0c2 */ OPT_INT3, - /* 0x0c3 */ OPT_INT4, - /* 0x0c4 */ OPT_INT5, - /* 0x0c5 */ OPT_INT6, - /* 0x0c6 */ OPT_INT7, - /* 0x0c7 */ OPT_INT8, - /* 0x0c8 */ OPT_FLOAT, - /* 0x0c9 */ OPT_DOUBLE, - /* 0x0ca */ OPT_LE, - /* 0x0cb */ OPT_BE, - /* 0x0cc */ OPT_ZEROS, - /* 0x0cd */ OPT_HEX, - /* 0x0ce */ OPT_DEC, - /* 0x0cf */ OPT_C_SYNTAX, - /* 0x0d0 */ OPT_ADDR, - /* 0x0d1 */ OPT_ALIGN, - /* 0x0d2 */ OPT_TRIGGER, - /* 0x0d3 */ OPT_NO_ADDR, - /* 0x0d4 */ OPT_NO_NUMBERS, - /* 0x0d5 */ OPT_NO_TEXT, - /* 0x0d6 */ OPT_FORMAT, - /* 0x0d7 */ OPT_NO_NULL, - /* 0x0d8 */ OPT_NARROW, - /* 0x0d9 */ OPT_SMALL, - /* 0x0da */ OPT_WIDE, - /* 0x0db */ OPT_BYTES, - /* 0x0dc */ 0,0,0,0, + /* 0x086 */ OPT_NO_PAGER, + /* 0x087 */ OPT_TIMING, + /* 0x088 */ OPT_DE, + /* 0x089 */ OPT_COLORS, + /* 0x08a */ OPT_NO_COLORS, + /* 0x08b */ OPT_CT_CODE, + /* 0x08c */ OPT_LE_CODE, + /* 0x08d */ OPT_CHDIR, + /* 0x08e */ OPT_VS_REGION, + /* 0x08f */ OPT_BT_REGION, + /* 0x090 */ OPT_ALL_RANKS, + /* 0x091 */ OPT_POINTS, + /* 0x092 */ OPT_CHEAT, + /* 0x093 */ OPT_HTTPS, + /* 0x094 */ OPT_DOMAIN, + /* 0x095 */ OPT_WIIMMFI, + /* 0x096 */ OPT_TWIIMMFI, + /* 0x097 */ OPT_WC24, + /* 0x098 */ OPT_WCODE, + /* 0x099 */ OPT_ADD_WCODE, + /* 0x09a */ OPT_PB_MODE, + /* 0x09b */ OPT_PATCHED_BY, + /* 0x09c */ OPT_VS, + /* 0x09d */ OPT_VS2, + /* 0x09e */ OPT_BT, + /* 0x09f */ OPT_BT2, + /* 0x0a0 */ OPT_CANNON, + /* 0x0a1 */ OPT_MENO, + /* 0x0a2 */ OPT_UTF_8, + /* 0x0a3 */ OPT_NO_UTF_8, + /* 0x0a4 */ OPT_FORCE, + /* 0x0a5 */ OPT_REPAIR_MAGICS, + /* 0x0a6 */ OPT_OLD, + /* 0x0a7 */ OPT_STD, + /* 0x0a8 */ OPT_NEW, + /* 0x0a9 */ OPT_EXTRACT, + /* 0x0aa */ OPT_NUMBER, + /* 0x0ab */ OPT_CLEAN_DOL, + /* 0x0ac */ OPT_ADD_LECODE, + /* 0x0ad */ OPT_ADD_CTCODE, + /* 0x0ae */ OPT_CT_DIR, + /* 0x0af */ OPT_MOVE_D8, + /* 0x0b0 */ OPT_ADD_SECTION, + /* 0x0b1 */ OPT_FULL_GCH, + /* 0x0b2 */ OPT_GCT_NO_SEP, + /* 0x0b3 */ OPT_GCT_SEP, + /* 0x0b4 */ OPT_GCT_ASM_SEP, + /* 0x0b5 */ OPT_GCT_LIST, + /* 0x0b6 */ OPT_GCT_MOVE, + /* 0x0b7 */ OPT_GCT_ADDR, + /* 0x0b8 */ OPT_GCT_SPACE, + /* 0x0b9 */ OPT_ALLOW_USER_GCH, + /* 0x0ba */ OPT_CREATE_SECT, + /* 0x0bb */ OPT_WPF, + /* 0x0bc */ OPT_SECTIONS, + /* 0x0bd */ OPT_PORT_DB, + /* 0x0be */ OPT_ORDER, + /* 0x0bf */ OPT_VADDR, + /* 0x0c0 */ OPT_FADDR, + /* 0x0c1 */ OPT_SNAME, + /* 0x0c2 */ OPT_INT1, + /* 0x0c3 */ OPT_INT2, + /* 0x0c4 */ OPT_INT3, + /* 0x0c5 */ OPT_INT4, + /* 0x0c6 */ OPT_INT5, + /* 0x0c7 */ OPT_INT6, + /* 0x0c8 */ OPT_INT7, + /* 0x0c9 */ OPT_INT8, + /* 0x0ca */ OPT_FLOAT, + /* 0x0cb */ OPT_DOUBLE, + /* 0x0cc */ OPT_LE, + /* 0x0cd */ OPT_BE, + /* 0x0ce */ OPT_ZEROS, + /* 0x0cf */ OPT_HEX, + /* 0x0d0 */ OPT_DEC, + /* 0x0d1 */ OPT_C_SYNTAX, + /* 0x0d2 */ OPT_ADDR, + /* 0x0d3 */ OPT_ALIGN, + /* 0x0d4 */ OPT_TRIGGER, + /* 0x0d5 */ OPT_NO_ADDR, + /* 0x0d6 */ OPT_NO_NUMBERS, + /* 0x0d7 */ OPT_NO_TEXT, + /* 0x0d8 */ OPT_FORMAT, + /* 0x0d9 */ OPT_NO_NULL, + /* 0x0da */ OPT_NARROW, + /* 0x0db */ OPT_SMALL, + /* 0x0dc */ OPT_WIDE, + /* 0x0dd */ OPT_BYTES, + /* 0x0de */ 0,0, /* 0x0e0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* 0x0f0 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, /* 0x100 */ 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, @@ -1455,140 +1473,147 @@ static u8 option_allowed_cmd_ARGTEST[66] = // cmd #4 1,1,1,1,1, 1 }; -static u8 option_allowed_cmd_TEST[66] = // cmd #5 +static u8 option_allowed_cmd_EXPAND[66] = // cmd #5 { 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1 }; -static u8 option_allowed_cmd_COLORS[66] = // cmd #6 +static u8 option_allowed_cmd_TEST[66] = // cmd #6 +{ + 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, + 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, + 1,1,1,1,1, 1 +}; + +static u8 option_allowed_cmd_COLORS[66] = // cmd #7 { 0,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_ERROR[66] = // cmd #7 +static u8 option_allowed_cmd_ERROR[66] = // cmd #8 { 0,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, 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 }; -static u8 option_allowed_cmd_FILETYPE[66] = // cmd #8 +static u8 option_allowed_cmd_FILETYPE[66] = // cmd #9 { 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_FILEATTRIB[66] = // cmd #9 +static u8 option_allowed_cmd_FILEATTRIB[66] = // cmd #10 { 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_RAWDUMP[66] = // cmd #10 +static u8 option_allowed_cmd_RAWDUMP[66] = // cmd #11 { 0,0,0,0,0, 0,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_DUMP[66] = // cmd #11 +static u8 option_allowed_cmd_DUMP[66] = // cmd #12 { 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_CDUMP[66] = // cmd #12 +static u8 option_allowed_cmd_CDUMP[66] = // cmd #13 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_HEXDUMP[66] = // cmd #13 +static u8 option_allowed_cmd_HEXDUMP[66] = // cmd #14 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1 }; -static u8 option_allowed_cmd_PORT[66] = // cmd #14 +static u8 option_allowed_cmd_PORT[66] = // cmd #15 { 0,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,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 }; -static u8 option_allowed_cmd_WHERE[66] = // cmd #15 +static u8 option_allowed_cmd_WHERE[66] = // cmd #16 { 0,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,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 }; -static u8 option_allowed_cmd_HTTPS[66] = // cmd #16 +static u8 option_allowed_cmd_HTTPS[66] = // cmd #17 { 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_EXTRACT[66] = // cmd #17 +static u8 option_allowed_cmd_EXTRACT[66] = // cmd #18 { 0,0,0,0,0, 0,1,1,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_TRACKS[66] = // cmd #18 +static u8 option_allowed_cmd_TRACKS[66] = // cmd #19 { 0,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 }; -static u8 option_allowed_cmd_ARENAS[66] = // cmd #19 +static u8 option_allowed_cmd_ARENAS[66] = // cmd #20 { 0,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 }; -static u8 option_allowed_cmd_FILES[66] = // cmd #20 +static u8 option_allowed_cmd_FILES[66] = // cmd #21 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_FIND[66] = // cmd #21 +static u8 option_allowed_cmd_FIND[66] = // cmd #22 { 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_POINTS[66] = // cmd #22 +static u8 option_allowed_cmd_POINTS[66] = // cmd #23 { 0,1,1,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_ANALYZE[66] = // cmd #23 +static u8 option_allowed_cmd_ANALYZE[66] = // cmd #24 { 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_PATCH[66] = // cmd #24 +static u8 option_allowed_cmd_PATCH[66] = // cmd #25 { 0,0,0,0,0, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, @@ -1611,9 +1636,11 @@ static const InfoOption_t * option_tab_tool[] = OptionInfo + OPT_COMPATIBLE, OptionInfo + OPT_WIDTH, OptionInfo + OPT_MAX_WIDTH, + OptionInfo + OPT_NO_PAGER, OptionInfo + OPT_QUIET, OptionInfo + OPT_VERBOSE, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_WARN, OptionInfo + OPT_DE, OptionInfo + OPT_COLORS, @@ -1685,6 +1712,12 @@ static const InfoOption_t * option_tab_cmd_ARGTEST[] = 0 }; +static const InfoOption_t * option_tab_cmd_EXPAND[] = +{ + + 0 +}; + static const InfoOption_t * option_tab_cmd_TEST[] = { @@ -1753,6 +1786,7 @@ static const InfoOption_t * option_tab_cmd_HEXDUMP[] = OptionInfo + OPT_FADDR, OptionInfo + OPT_SNAME, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_NONE, // separator @@ -2020,7 +2054,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "Wiimms StaticR Tool : Manipulate the 'main.dol' and 'StaticR.rel'" " files of Mario Kart Wii.", 0, - 40, + 42, option_tab_tool, 0 }, @@ -2086,13 +2120,32 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = 0, "wstrt ARGTEST ...", "This debug command accepts all kinds of parameters and prints one" - " line for each parameter.", + " line for each parameter. All tools know the ARGTEST command.", 0, 0, option_tab_cmd_ARGTEST, option_allowed_cmd_ARGTEST }, + { CMD_EXPAND, + false, + false, + false, + "EXPAND", + 0, + "wstrt EXPAND ...", + "This debug command accepts (like ARGTEST) all kinds of parameters and" + " prints one line for each parameter. After that, the parameter is" + " treated as a filename with wildcards and all matching files are" + " searched. The special parameters '+h' and '/h' enable or disable the" + " search for hidden directories and files (files beginning with a" + " point). All tools know the EXPAND command.", + 0, + 0, + option_tab_cmd_EXPAND, + option_allowed_cmd_EXPAND + }, + { CMD_TEST, false, false, @@ -2132,7 +2185,8 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "ERR", "wstrt ERROR [error_code]", "Translate an exit code to a message name. If no exit code is entered," - " print a table with all error messages.", + " print a table with all error messages. All tools know the ERROR" + " command.", 0, 4, option_tab_cmd_ERROR, @@ -2147,7 +2201,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "FT", "wstrt FILETYPE file...", "Scan the header of the entered files and print file type and path for" - " each file as list.", + " each file as list. All tools know the FILETYPE command.", 0, 2, option_tab_cmd_FILETYPE, @@ -2164,7 +2218,8 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "Print a table with attributes for all known file types. If at least" " one keyword is entered, only matching file types are printed. A" " keyword is either a file type (like 'BRRES' or 'BMG') or one of the" - " printed keywords (like 'ARCHIVE' or 'EXTRACT').", + " printed keywords (like 'ARCHIVE' or 'EXTRACT'). All tools know the" + " FILEATTRIB command.", 0, 1, option_tab_cmd_FILEATTRIB, @@ -2226,7 +2281,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = " Select parts by --vaddr, --faddr and --sname. Without selectors, the" " whole file is dumped.", 0, - 32, + 33, option_tab_cmd_HEXDUMP, option_allowed_cmd_HEXDUMP }, diff --git a/project/src/ui/ui-wstrt.h b/project/src/ui/ui-wstrt.h index 31ecfe0..23742b8 100644 --- a/project/src/ui/ui-wstrt.h +++ b/project/src/ui/ui-wstrt.h @@ -135,9 +135,11 @@ typedef enum enumOptions OPT_COMPATIBLE, OPT_WIDTH, OPT_MAX_WIDTH, + OPT_NO_PAGER, OPT_QUIET, OPT_VERBOSE, OPT_LOGGING, + OPT_TIMING, OPT_WARN, OPT_DE, OPT_COLORS, @@ -179,7 +181,7 @@ typedef enum enumOptions OPT_CLEAN_DOL, OPT_CT_DIR, - OPT__N_TOTAL // == 118 + OPT__N_TOTAL // == 120 } enumOptions; @@ -313,6 +315,8 @@ typedef enum enumOptions // // OB_CMD_ARGTEST = ~(u64)0, // +// OB_CMD_EXPAND = ~(u64)0, +// // OB_CMD_TEST = ~(u64)0, // // OB_CMD_COLORS = OB_LONG @@ -415,6 +419,7 @@ typedef enum enumCommands CMD_HELP, CMD_CONFIG, CMD_ARGTEST, + CMD_EXPAND, CMD_TEST, CMD_COLORS, CMD_ERROR, @@ -439,7 +444,7 @@ typedef enum enumCommands CMD_ANALYZE, CMD_PATCH, - CMD__N // == 25 + CMD__N // == 26 } enumCommands; @@ -487,6 +492,8 @@ typedef enum enumGetOpt GO_COMPATIBLE, GO_WIDTH, GO_MAX_WIDTH, + GO_NO_PAGER, + GO_TIMING, GO_DE, GO_COLORS, GO_NO_COLORS, diff --git a/project/src/ui/ui-wszst.c b/project/src/ui/ui-wszst.c index 1d62e8e..7c4445c 100644 --- a/project/src/ui/ui-wszst.c +++ b/project/src/ui/ui-wszst.c @@ -53,6 +53,20 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = //----- command specific options ----- + { OPT_PLUS, false, false, false, false, false, 0, "plus", + "chars", + "If a name begins with a plus sign, then all characters up to the" + " first space are recognized as a plus prefix. The first part consists" + " of all the plus signs followed by any other characters. The first" + " character of the second part is used to determine the sort value. If" + " the second part is empty, then the last plus sign is used instead.\n" + " The higher sorting value is now calculated from the number of plus" + " signs in the first part, the more plus signs, the smaller the value." + " The first character from the second part determines the lower value." + " If it is in parameter CHARS then the position determines the value," + " otherwise the ASCII value to which 500 is added." + }, + { OPT_TOUCH, false, false, false, false, false, 0, "touch", 0, "Mark the minimap as modified to force a new calculation of the" @@ -445,7 +459,7 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = 0, "Print an ID with 8 characters instead of a SHA-1 sum with 40" " characters. The SHA-1 sum is used to calculate the ID. The ID" - " consists of '0'-'9' and 'a'-'w' (32 characters)." + " consists of '0'-'9' and 'a'-'v' (32 different characters)." }, { OPT_BASE64, true, false, false, false, false, 0, "base64", @@ -1132,7 +1146,7 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = "Print in machine readable sections and parameter lines." }, - {0,0,0,0,0,0,0,0,0,0}, // OPT__N_SPECIFIC == 135 + {0,0,0,0,0,0,0,0,0,0}, // OPT__N_SPECIFIC == 136 //----- global options ----- @@ -1192,6 +1206,11 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = " --width is set." }, + { OPT_NO_PAGER, false, false, false, true, false, 0, "no-pager", + 0, + "Forbid the internal usage of a pager." + }, + { OPT_QUIET, false, false, false, false, false, 'q', "quiet", 0, "Be quiet and print only error messages. Multiple usage is possible." @@ -1207,7 +1226,14 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = { OPT_LOGGING, false, false, false, false, false, 'L', "logging", 0, - "This debug option enables the logging of internal lists and maps." + "This debug option enables the logging of internal lists and maps. Set" + " it up to three times to be more verbose.\n" + }, + + { OPT_TIMING, false, false, false, false, false, 0, "timing", + 0, + "Activate the timing of some operations. Logging level 3 activates" + " them too.\n" }, { OPT_WARN, false, false, false, false, false, 'W', "warn", @@ -1257,6 +1283,13 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = " details." }, + { OPT_LOAD_PREFIX, false, false, false, false, false, 0, "load-prefix", + "file", + "Read in a PREFIX file and replace the internal prefix database with" + " the content. https://ct.wiimm.de/export/prefix is the authoritative" + " source for this." + }, + { OPT_CHDIR, false, false, false, false, false, 0, "chdir", "dir", "Set a new working directory for all following options, for all" @@ -1768,7 +1801,7 @@ static const InfoOption_t OptionInfo[OPT__N_TOTAL+1] = " helper option." }, - {0,0,0,0,0,0,0,0,0,0} // OPT__N_TOTAL == 211 + {0,0,0,0,0,0,0,0,0,0} // OPT__N_TOTAL == 215 }; @@ -2274,6 +2307,7 @@ static const KeywordTab_t CommandTab[] = { CMD_CONFIG, "CONFIG", 0, 0 }, { CMD_INSTALL, "INSTALL", 0, 0 }, { CMD_ARGTEST, "ARGTEST", 0, 0 }, + { CMD_EXPAND, "EXPAND", 0, 0 }, { CMD_TEST, "TEST", 0, 0 }, { CMD_COLORS, "COLORS", 0, 0 }, { CMD_ERROR, "ERROR", "ERR", 0 }, @@ -2322,9 +2356,11 @@ static const KeywordTab_t CommandTab[] = { CMD_SHA1, "SHA1", 0, 0 }, { CMD_ANALYZE, "ANALYZE", "ANA", 0 }, { CMD_ANALYZE, "ANALYSE", 0, 0 }, + { CMD_SPLIT, "SPLIT", 0, 0 }, { CMD_IS_TEXTURE, "IS-TEXTURE", "ISTEXTURE", 0 }, { CMD_FEATURES, "FEATURES", 0, 0 }, - { CMD_DISTRIBUTION, "DISTRIBUTION", "DIST", 0 }, + { CMD_DISTRIBUTION, "DISTRIBUTION", "DIS", 0 }, + { CMD_DISTRIBUTION, "DISTRIB", 0, 0 }, { CMD_DIFF, "DIFF", "CMP", 0 }, { CMD_CHECK, "CHECK", 0, 0 }, { CMD_SLOTS, "SLOTS", 0, 0 }, @@ -2379,9 +2415,12 @@ static const struct option OptionLong[] = { "width", 1, 0, GO_WIDTH }, { "max-width", 1, 0, GO_MAX_WIDTH }, { "maxwidth", 1, 0, GO_MAX_WIDTH }, + { "no-pager", 0, 0, GO_NO_PAGER }, + { "nopager", 0, 0, GO_NO_PAGER }, { "quiet", 0, 0, 'q' }, { "verbose", 0, 0, 'v' }, { "logging", 0, 0, 'L' }, + { "timing", 0, 0, GO_TIMING }, { "warn", 1, 0, 'W' }, { "de", 0, 0, GO_DE }, { "colors", 2, 0, GO_COLORS }, @@ -2391,6 +2430,9 @@ static const struct option OptionLong[] = { "ctcode", 0, 0, GO_CT_CODE }, { "le-code", 2, 0, GO_LE_CODE }, { "lecode", 2, 0, GO_LE_CODE }, + { "load-prefix", 1, 0, GO_LOAD_PREFIX }, + { "loadprefix", 1, 0, GO_LOAD_PREFIX }, + { "plus", 1, 0, GO_PLUS }, { "chdir", 1, 0, GO_CHDIR }, { "const", 1, 0, 'c' }, { "touch", 0, 0, GO_TOUCH }, @@ -2791,177 +2833,181 @@ static const OptionIndex_t OptionIndex[UIOPT_INDEX_SIZE] = /* 0x083 */ OPT_COMPATIBLE, /* 0x084 */ OPT_WIDTH, /* 0x085 */ OPT_MAX_WIDTH, - /* 0x086 */ OPT_DE, - /* 0x087 */ OPT_COLORS, - /* 0x088 */ OPT_NO_COLORS, - /* 0x089 */ OPT_CT_CODE, - /* 0x08a */ OPT_LE_CODE, - /* 0x08b */ OPT_CHDIR, - /* 0x08c */ OPT_TOUCH, - /* 0x08d */ OPT_AUTO, - /* 0x08e */ OPT_SET_FLAGS, - /* 0x08f */ OPT_SET_SCALE, - /* 0x090 */ OPT_SET_ROT, - /* 0x091 */ OPT_SET_X, - /* 0x092 */ OPT_SET_Y, - /* 0x093 */ OPT_SET_Z, - /* 0x094 */ OPT_XCENTER, - /* 0x095 */ OPT_YCENTER, - /* 0x096 */ OPT_ZCENTER, - /* 0x097 */ OPT_CENTER, - /* 0x098 */ OPT_SCALE, - /* 0x099 */ OPT_SHIFT, - /* 0x09a */ OPT_XSS, - /* 0x09b */ OPT_YSS, - /* 0x09c */ OPT_ZSS, - /* 0x09d */ OPT_ROT, - /* 0x09e */ OPT_XROT, - /* 0x09f */ OPT_YROT, - /* 0x0a0 */ OPT_ZROT, - /* 0x0a1 */ OPT_YPOS, - /* 0x0a2 */ OPT_TRANSLATE, - /* 0x0a3 */ OPT_NULL, - /* 0x0a4 */ OPT_NEXT, - /* 0x0a5 */ OPT_ASCALE, - /* 0x0a6 */ OPT_AROT, - /* 0x0a7 */ OPT_TFORM_SCRIPT, - /* 0x0a8 */ OPT_MINIMAP, - /* 0x0a9 */ OPT_RM_GOBJ, - /* 0x0aa */ OPT_BATTLE, - /* 0x0ab */ OPT_EXPORT_FLAGS, - /* 0x0ac */ OPT_ROUTE_OPTIONS, - /* 0x0ad */ OPT_WIM0, - /* 0x0ae */ OPT_SLOT, - /* 0x0af */ OPT_LOAD_KCL, - /* 0x0b0 */ OPT_KCL, - /* 0x0b1 */ OPT_KCL_FLAG, - /* 0x0b2 */ OPT_KCL_SCRIPT, - /* 0x0b3 */ OPT_TRI_AREA, - /* 0x0b4 */ OPT_TRI_HEIGHT, - /* 0x0b5 */ OPT_FLAG_FILE, - /* 0x0b6 */ OPT_XTRIDATA, - /* 0x0b7 */ OPT_KMP, - /* 0x0b8 */ OPT_SPEED_MOD, - /* 0x0b9 */ OPT_KTPT2, - /* 0x0ba */ OPT_TFORM_KMP, - /* 0x0bb */ OPT_REPAIR_XPF, - /* 0x0bc */ OPT_GAMEMODES, - /* 0x0bd */ OPT_MDL, - /* 0x0be */ OPT_PAT, - /* 0x0bf */ OPT_PATCH_FILE, - /* 0x0c0 */ OPT_KMG_LIMIT, - /* 0x0c1 */ OPT_KMG_COPY, - /* 0x0c2 */ OPT_LT_CLEAR, - /* 0x0c3 */ OPT_LT_ONLINE, - /* 0x0c4 */ OPT_LT_N_PLAYERS, - /* 0x0c5 */ OPT_LT_COND_BIT, - /* 0x0c6 */ OPT_LT_GAME_MODE, - /* 0x0c7 */ OPT_LT_ENGINE, - /* 0x0c8 */ OPT_LT_RANDOM, - /* 0x0c9 */ OPT_LEX_PURGE, - /* 0x0ca */ OPT_LEX_FEATURES, - /* 0x0cb */ OPT_LEX_RM_FEAT, - /* 0x0cc */ OPT_LOAD_BMG, - /* 0x0cd */ OPT_PATCH_BMG, - /* 0x0ce */ OPT_MACRO_BMG, - /* 0x0cf */ OPT_FILTER_BMG, - /* 0x0d0 */ OPT_CACHE, - /* 0x0d1 */ OPT_CNAME, - /* 0x0d2 */ OPT_ID, - /* 0x0d3 */ OPT_BASE64, - /* 0x0d4 */ OPT_DB64, - /* 0x0d5 */ OPT_CODING, - /* 0x0d6 */ OPT_VERIFY, - /* 0x0d7 */ OPT_ROUND, - /* 0x0d8 */ OPT_PIPE, - /* 0x0d9 */ OPT_DELTA, - /* 0x0da */ OPT_DIFF, - /* 0x0db */ OPT_EPSILON, - /* 0x0dc */ OPT_BMG_ENDIAN, - /* 0x0dd */ OPT_BMG_ENCODING, - /* 0x0de */ OPT_BMG_INF_SIZE, - /* 0x0df */ OPT_BMG_MID, - /* 0x0e0 */ OPT_FORCE_ATTRIB, - /* 0x0e1 */ OPT_DEF_ATTRIB, - /* 0x0e2 */ OPT_NO_ATTRIB, - /* 0x0e3 */ OPT_X_ESCAPES, - /* 0x0e4 */ OPT_OLD_ESCAPES, - /* 0x0e5 */ OPT_NO_BMG_COLORS, - /* 0x0e6 */ OPT_BMG_COLORS, - /* 0x0e7 */ OPT_NO_BMG_INLINE, - /* 0x0e8 */ OPT_AUTOADD_PATH, - /* 0x0e9 */ OPT_STRIP, - /* 0x0ea */ OPT_UTF_8, - /* 0x0eb */ OPT_NO_UTF_8, - /* 0x0ec */ OPT_FORCE, - /* 0x0ed */ OPT_REPAIR_MAGICS, - /* 0x0ee */ OPT_TINY, - /* 0x0ef */ OPT_YAZ0, - /* 0x0f0 */ OPT_YAZ1, - /* 0x0f1 */ OPT_XYZ, - /* 0x0f2 */ OPT_BZ, - /* 0x0f3 */ OPT_SH, - /* 0x0f4 */ OPT_BASH, - /* 0x0f5 */ OPT_JSON, - /* 0x0f6 */ OPT_PHP, - /* 0x0f7 */ OPT_MAKEDOC, - /* 0x0f8 */ OPT_VAR, - /* 0x0f9 */ OPT_ARRAY, - /* 0x0fa */ OPT_AVAR, - /* 0x0fb */ OPT_CASE, - /* 0x0fc */ OPT_PMODES, - /* 0x0fd */ OPT_FMODES, - /* 0x0fe */ OPT_INSTALL, - /* 0x0ff */ OPT_ANALYZE, - /* 0x100 */ OPT_ANALYZE_MODE, - /* 0x101 */ OPT_OLD, - /* 0x102 */ OPT_STD, - /* 0x103 */ OPT_NEW, - /* 0x104 */ OPT_EXTRACT, - /* 0x105 */ OPT_REFERENCE, - /* 0x106 */ OPT_NUMBER, - /* 0x107 */ OPT_REMOVE_SRC, - /* 0x108 */ OPT_IGNORE_SETUP, - /* 0x109 */ OPT_PURGE, - /* 0x10a */ OPT_ALIGN_U8, - /* 0x10b */ OPT_ALIGN_PACK, - /* 0x10c */ OPT_ALIGN_BRRES, - /* 0x10d */ OPT_ALIGN_BREFF, - /* 0x10e */ OPT_ALIGN_BREFT, - /* 0x10f */ OPT_ALIGN, - /* 0x110 */ OPT_ENCODE_ALL, - /* 0x111 */ OPT_ENCODE_IMG, - /* 0x112 */ OPT_NO_ENCODE, - /* 0x113 */ OPT_NO_RECURSE, - /* 0x114 */ OPT_AUTO_ADD, - /* 0x115 */ OPT_NO_ECHO, - /* 0x116 */ OPT_PT_DIR, - /* 0x117 */ OPT_RM_AIPARAM, - /* 0x118 */ OPT_U8, - /* 0x119 */ OPT_SZS, - /* 0x11a */ OPT_WU8, - /* 0x11b */ OPT_XWU8, - /* 0x11c */ OPT_WBZ, - /* 0x11d */ OPT_PACK, - /* 0x11e */ OPT_BRRES, - /* 0x11f */ OPT_BREFF, - /* 0x120 */ OPT_BREFT, - /* 0x121 */ OPT_NO_COMPRESS, - /* 0x122 */ OPT_FAST, - /* 0x123 */ OPT_LINKS, - /* 0x124 */ OPT_BASEDIR, - /* 0x125 */ OPT_DECODE, - /* 0x126 */ OPT_MIPMAPS, - /* 0x127 */ OPT_NO_MIPMAPS, - /* 0x128 */ OPT_N_MIPMAPS, - /* 0x129 */ OPT_MAX_MIPMAPS, - /* 0x12a */ OPT_MIPMAP_SIZE, - /* 0x12b */ OPT_FAST_MIPMAPS, - /* 0x12c */ OPT_CMPR_DEFAULT, - /* 0x12d */ OPT_CUT, - /* 0x12e */ OPT_RAW, - /* 0x12f */ OPT_SECTIONS, - /* 0x130 */ 0,0,0,0, 0,0, + /* 0x086 */ OPT_NO_PAGER, + /* 0x087 */ OPT_TIMING, + /* 0x088 */ OPT_DE, + /* 0x089 */ OPT_COLORS, + /* 0x08a */ OPT_NO_COLORS, + /* 0x08b */ OPT_CT_CODE, + /* 0x08c */ OPT_LE_CODE, + /* 0x08d */ OPT_LOAD_PREFIX, + /* 0x08e */ OPT_PLUS, + /* 0x08f */ OPT_CHDIR, + /* 0x090 */ OPT_TOUCH, + /* 0x091 */ OPT_AUTO, + /* 0x092 */ OPT_SET_FLAGS, + /* 0x093 */ OPT_SET_SCALE, + /* 0x094 */ OPT_SET_ROT, + /* 0x095 */ OPT_SET_X, + /* 0x096 */ OPT_SET_Y, + /* 0x097 */ OPT_SET_Z, + /* 0x098 */ OPT_XCENTER, + /* 0x099 */ OPT_YCENTER, + /* 0x09a */ OPT_ZCENTER, + /* 0x09b */ OPT_CENTER, + /* 0x09c */ OPT_SCALE, + /* 0x09d */ OPT_SHIFT, + /* 0x09e */ OPT_XSS, + /* 0x09f */ OPT_YSS, + /* 0x0a0 */ OPT_ZSS, + /* 0x0a1 */ OPT_ROT, + /* 0x0a2 */ OPT_XROT, + /* 0x0a3 */ OPT_YROT, + /* 0x0a4 */ OPT_ZROT, + /* 0x0a5 */ OPT_YPOS, + /* 0x0a6 */ OPT_TRANSLATE, + /* 0x0a7 */ OPT_NULL, + /* 0x0a8 */ OPT_NEXT, + /* 0x0a9 */ OPT_ASCALE, + /* 0x0aa */ OPT_AROT, + /* 0x0ab */ OPT_TFORM_SCRIPT, + /* 0x0ac */ OPT_MINIMAP, + /* 0x0ad */ OPT_RM_GOBJ, + /* 0x0ae */ OPT_BATTLE, + /* 0x0af */ OPT_EXPORT_FLAGS, + /* 0x0b0 */ OPT_ROUTE_OPTIONS, + /* 0x0b1 */ OPT_WIM0, + /* 0x0b2 */ OPT_SLOT, + /* 0x0b3 */ OPT_LOAD_KCL, + /* 0x0b4 */ OPT_KCL, + /* 0x0b5 */ OPT_KCL_FLAG, + /* 0x0b6 */ OPT_KCL_SCRIPT, + /* 0x0b7 */ OPT_TRI_AREA, + /* 0x0b8 */ OPT_TRI_HEIGHT, + /* 0x0b9 */ OPT_FLAG_FILE, + /* 0x0ba */ OPT_XTRIDATA, + /* 0x0bb */ OPT_KMP, + /* 0x0bc */ OPT_SPEED_MOD, + /* 0x0bd */ OPT_KTPT2, + /* 0x0be */ OPT_TFORM_KMP, + /* 0x0bf */ OPT_REPAIR_XPF, + /* 0x0c0 */ OPT_GAMEMODES, + /* 0x0c1 */ OPT_MDL, + /* 0x0c2 */ OPT_PAT, + /* 0x0c3 */ OPT_PATCH_FILE, + /* 0x0c4 */ OPT_KMG_LIMIT, + /* 0x0c5 */ OPT_KMG_COPY, + /* 0x0c6 */ OPT_LT_CLEAR, + /* 0x0c7 */ OPT_LT_ONLINE, + /* 0x0c8 */ OPT_LT_N_PLAYERS, + /* 0x0c9 */ OPT_LT_COND_BIT, + /* 0x0ca */ OPT_LT_GAME_MODE, + /* 0x0cb */ OPT_LT_ENGINE, + /* 0x0cc */ OPT_LT_RANDOM, + /* 0x0cd */ OPT_LEX_PURGE, + /* 0x0ce */ OPT_LEX_FEATURES, + /* 0x0cf */ OPT_LEX_RM_FEAT, + /* 0x0d0 */ OPT_LOAD_BMG, + /* 0x0d1 */ OPT_PATCH_BMG, + /* 0x0d2 */ OPT_MACRO_BMG, + /* 0x0d3 */ OPT_FILTER_BMG, + /* 0x0d4 */ OPT_CACHE, + /* 0x0d5 */ OPT_CNAME, + /* 0x0d6 */ OPT_ID, + /* 0x0d7 */ OPT_BASE64, + /* 0x0d8 */ OPT_DB64, + /* 0x0d9 */ OPT_CODING, + /* 0x0da */ OPT_VERIFY, + /* 0x0db */ OPT_ROUND, + /* 0x0dc */ OPT_PIPE, + /* 0x0dd */ OPT_DELTA, + /* 0x0de */ OPT_DIFF, + /* 0x0df */ OPT_EPSILON, + /* 0x0e0 */ OPT_BMG_ENDIAN, + /* 0x0e1 */ OPT_BMG_ENCODING, + /* 0x0e2 */ OPT_BMG_INF_SIZE, + /* 0x0e3 */ OPT_BMG_MID, + /* 0x0e4 */ OPT_FORCE_ATTRIB, + /* 0x0e5 */ OPT_DEF_ATTRIB, + /* 0x0e6 */ OPT_NO_ATTRIB, + /* 0x0e7 */ OPT_X_ESCAPES, + /* 0x0e8 */ OPT_OLD_ESCAPES, + /* 0x0e9 */ OPT_NO_BMG_COLORS, + /* 0x0ea */ OPT_BMG_COLORS, + /* 0x0eb */ OPT_NO_BMG_INLINE, + /* 0x0ec */ OPT_AUTOADD_PATH, + /* 0x0ed */ OPT_STRIP, + /* 0x0ee */ OPT_UTF_8, + /* 0x0ef */ OPT_NO_UTF_8, + /* 0x0f0 */ OPT_FORCE, + /* 0x0f1 */ OPT_REPAIR_MAGICS, + /* 0x0f2 */ OPT_TINY, + /* 0x0f3 */ OPT_YAZ0, + /* 0x0f4 */ OPT_YAZ1, + /* 0x0f5 */ OPT_XYZ, + /* 0x0f6 */ OPT_BZ, + /* 0x0f7 */ OPT_SH, + /* 0x0f8 */ OPT_BASH, + /* 0x0f9 */ OPT_JSON, + /* 0x0fa */ OPT_PHP, + /* 0x0fb */ OPT_MAKEDOC, + /* 0x0fc */ OPT_VAR, + /* 0x0fd */ OPT_ARRAY, + /* 0x0fe */ OPT_AVAR, + /* 0x0ff */ OPT_CASE, + /* 0x100 */ OPT_PMODES, + /* 0x101 */ OPT_FMODES, + /* 0x102 */ OPT_INSTALL, + /* 0x103 */ OPT_ANALYZE, + /* 0x104 */ OPT_ANALYZE_MODE, + /* 0x105 */ OPT_OLD, + /* 0x106 */ OPT_STD, + /* 0x107 */ OPT_NEW, + /* 0x108 */ OPT_EXTRACT, + /* 0x109 */ OPT_REFERENCE, + /* 0x10a */ OPT_NUMBER, + /* 0x10b */ OPT_REMOVE_SRC, + /* 0x10c */ OPT_IGNORE_SETUP, + /* 0x10d */ OPT_PURGE, + /* 0x10e */ OPT_ALIGN_U8, + /* 0x10f */ OPT_ALIGN_PACK, + /* 0x110 */ OPT_ALIGN_BRRES, + /* 0x111 */ OPT_ALIGN_BREFF, + /* 0x112 */ OPT_ALIGN_BREFT, + /* 0x113 */ OPT_ALIGN, + /* 0x114 */ OPT_ENCODE_ALL, + /* 0x115 */ OPT_ENCODE_IMG, + /* 0x116 */ OPT_NO_ENCODE, + /* 0x117 */ OPT_NO_RECURSE, + /* 0x118 */ OPT_AUTO_ADD, + /* 0x119 */ OPT_NO_ECHO, + /* 0x11a */ OPT_PT_DIR, + /* 0x11b */ OPT_RM_AIPARAM, + /* 0x11c */ OPT_U8, + /* 0x11d */ OPT_SZS, + /* 0x11e */ OPT_WU8, + /* 0x11f */ OPT_XWU8, + /* 0x120 */ OPT_WBZ, + /* 0x121 */ OPT_PACK, + /* 0x122 */ OPT_BRRES, + /* 0x123 */ OPT_BREFF, + /* 0x124 */ OPT_BREFT, + /* 0x125 */ OPT_NO_COMPRESS, + /* 0x126 */ OPT_FAST, + /* 0x127 */ OPT_LINKS, + /* 0x128 */ OPT_BASEDIR, + /* 0x129 */ OPT_DECODE, + /* 0x12a */ OPT_MIPMAPS, + /* 0x12b */ OPT_NO_MIPMAPS, + /* 0x12c */ OPT_N_MIPMAPS, + /* 0x12d */ OPT_MAX_MIPMAPS, + /* 0x12e */ OPT_MIPMAP_SIZE, + /* 0x12f */ OPT_FAST_MIPMAPS, + /* 0x130 */ OPT_CMPR_DEFAULT, + /* 0x131 */ OPT_CUT, + /* 0x132 */ OPT_RAW, + /* 0x133 */ OPT_SECTIONS, + /* 0x134 */ 0,0, }; // @@ -2969,706 +3015,724 @@ static const OptionIndex_t OptionIndex[UIOPT_INDEX_SIZE] = /////////////// opt_allowed_cmd_* /////////////// /////////////////////////////////////////////////////////////////////////////// -static u8 option_allowed_cmd_VERSION[135] = // cmd #1 +static u8 option_allowed_cmd_VERSION[136] = // cmd #1 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,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,1,0, 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1 }; -static u8 option_allowed_cmd_HELP[135] = // cmd #2 +static u8 option_allowed_cmd_HELP[136] = // cmd #2 { 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, - 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1 + 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1 }; -static u8 option_allowed_cmd_CONFIG[135] = // cmd #3 +static u8 option_allowed_cmd_CONFIG[136] = // cmd #3 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,1, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,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,1,0, 1,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 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,1 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1 }; -static u8 option_allowed_cmd_INSTALL[135] = // cmd #4 +static u8 option_allowed_cmd_INSTALL[136] = // cmd #4 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 +}; + +static u8 option_allowed_cmd_ARGTEST[136] = // cmd #5 +{ + 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, + 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, + 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, + 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, + 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1 }; -static u8 option_allowed_cmd_ARGTEST[135] = // cmd #5 +static u8 option_allowed_cmd_EXPAND[136] = // cmd #6 { 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, - 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1 + 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1 }; -static u8 option_allowed_cmd_TEST[135] = // cmd #6 +static u8 option_allowed_cmd_TEST[136] = // cmd #7 { 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, - 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1 + 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1 }; -static u8 option_allowed_cmd_COLORS[135] = // cmd #7 +static u8 option_allowed_cmd_COLORS[136] = // cmd #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,1,0,1, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_ERROR[135] = // cmd #8 +static u8 option_allowed_cmd_ERROR[136] = // cmd #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,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,1,1, 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1 }; -static u8 option_allowed_cmd_FILETYPE[135] = // cmd #9 +static u8 option_allowed_cmd_FILETYPE[136] = // cmd #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,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,1,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,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 }; -static u8 option_allowed_cmd_FILEATTRIB[135] = // cmd #10 +static u8 option_allowed_cmd_FILEATTRIB[136] = // cmd #11 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_BRSUB[135] = // cmd #11 +static u8 option_allowed_cmd_BRSUB[136] = // cmd #12 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,1,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,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 }; -static u8 option_allowed_cmd_SYMBOLS[135] = // cmd #12 +static u8 option_allowed_cmd_SYMBOLS[136] = // cmd #13 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_FUNCTIONS[135] = // cmd #13 +static u8 option_allowed_cmd_FUNCTIONS[136] = // cmd #14 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,1,1, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_CALCULATE[135] = // cmd #14 +static u8 option_allowed_cmd_CALCULATE[136] = // cmd #15 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_MATRIX[135] = // cmd #15 +static u8 option_allowed_cmd_MATRIX[136] = // cmd #16 { - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,1, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,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,1,0, 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_FLOAT[135] = // cmd #16 +static u8 option_allowed_cmd_FLOAT[136] = // cmd #17 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_VR_CALC[135] = // cmd #17 +static u8 option_allowed_cmd_VR_CALC[136] = // cmd #18 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,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,1, 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_VR_RACE[135] = // cmd #18 +static u8 option_allowed_cmd_VR_RACE[136] = // cmd #19 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_AUTOADD[135] = // cmd #19 +static u8 option_allowed_cmd_AUTOADD[136] = // cmd #20 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 1,0,1,0,0, 1,0,1,1,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1,1,0,1,0, 0,1,0,1,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_TRACKS[135] = // cmd #20 +static u8 option_allowed_cmd_TRACKS[136] = // cmd #21 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,1,0,0, 0,0,0,0,0, 0,0,1,0,0, 1,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,1,0, 0,0,0,0,0, 0,0,0,1,0, 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, 0 }; -static u8 option_allowed_cmd_SCANCACHE[135] = // cmd #21 +static u8 option_allowed_cmd_SCANCACHE[136] = // cmd #22 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_EXPORT[135] = // cmd #22 +static u8 option_allowed_cmd_EXPORT[136] = // cmd #23 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_SIZEOF[135] = // cmd #23 +static u8 option_allowed_cmd_SIZEOF[136] = // cmd #24 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_CODE[135] = // cmd #24 +static u8 option_allowed_cmd_CODE[136] = // cmd #25 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_RECODE[135] = // cmd #25 +static u8 option_allowed_cmd_RECODE[136] = // cmd #26 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_SUBFILE[135] = // cmd #26 +static u8 option_allowed_cmd_SUBFILE[136] = // cmd #27 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 1,1,1,1,0, 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, 1,1,1,1,1, 0,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 }; -static u8 option_allowed_cmd_TESTNORM[135] = // cmd #27 +static u8 option_allowed_cmd_TESTNORM[136] = // cmd #28 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_LIST[135] = // cmd #28 +static u8 option_allowed_cmd_LIST[136] = // cmd #29 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,1,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,1, 1,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, - 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,1,1, - 0,1,1,0,1, 1,1,1,1,1, 1,1,1,0,0 + 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 1,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, + 1,0,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0,0,0,1, + 1,0,1,1,0, 1,1,1,1,1, 1,1,1,1,0, 0 }; -static u8 option_allowed_cmd_LIST_L[135] = // cmd #29 +static u8 option_allowed_cmd_LIST_L[136] = // cmd #30 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,1,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,1, 1,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, - 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,1,1, - 0,1,1,0,1, 1,1,1,1,1, 1,1,1,0,0 + 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 1,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, + 1,0,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0,0,0,1, + 1,0,1,1,0, 1,1,1,1,1, 1,1,1,1,0, 0 }; -static u8 option_allowed_cmd_LIST_LL[135] = // cmd #30 +static u8 option_allowed_cmd_LIST_LL[136] = // cmd #31 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,1,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,1, 1,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, - 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,1,1, - 0,1,1,0,1, 1,1,1,1,1, 1,1,1,0,0 + 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 1,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, + 1,0,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0,0,0,1, + 1,0,1,1,0, 1,1,1,1,1, 1,1,1,1,0, 0 }; -static u8 option_allowed_cmd_LIST_LLL[135] = // cmd #31 +static u8 option_allowed_cmd_LIST_LLL[136] = // cmd #32 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,1,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,1, 1,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, - 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,1,1, - 0,1,1,0,1, 1,1,1,1,1, 1,1,1,0,0 + 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 1,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, + 1,0,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0,0,0,1, + 1,0,1,1,0, 1,1,1,1,1, 1,1,1,1,0, 0 }; -static u8 option_allowed_cmd_LIST_A[135] = // cmd #32 +static u8 option_allowed_cmd_LIST_A[136] = // cmd #33 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,1,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,1, 1,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, - 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,1,1, - 0,1,1,0,1, 1,1,1,1,1, 1,1,1,0,0 + 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 1,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, + 1,0,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0,0,0,1, + 1,0,1,1,0, 1,1,1,1,1, 1,1,1,1,0, 0 }; -static u8 option_allowed_cmd_LIST_LA[135] = // cmd #33 +static u8 option_allowed_cmd_LIST_LA[136] = // cmd #34 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,1,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,1, 1,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, - 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,1,1, - 0,1,1,0,1, 1,1,1,1,1, 1,1,1,0,0 + 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 1,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, + 1,0,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0,0,0,1, + 1,0,1,1,0, 1,1,1,1,1, 1,1,1,1,0, 0 }; -static u8 option_allowed_cmd_NAME_REF[135] = // cmd #34 +static u8 option_allowed_cmd_NAME_REF[136] = // cmd #35 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,1, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, 1,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_ILIST[135] = // cmd #35 +static u8 option_allowed_cmd_ILIST[136] = // cmd #36 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,1,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,1, 1,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, - 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,1,1, - 0,1,0,0,1, 1,1,1,1,1, 1,0,1,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 1,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, + 1,0,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0,0,0,1, + 1,0,1,0,0, 1,1,1,1,1, 1,1,0,1,0, 0 }; -static u8 option_allowed_cmd_ILIST_L[135] = // cmd #36 +static u8 option_allowed_cmd_ILIST_L[136] = // cmd #37 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,1,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,1, 1,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, - 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,1,1, - 0,1,0,0,1, 1,1,1,1,1, 1,0,1,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 1,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, + 1,0,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0,0,0,1, + 1,0,1,0,0, 1,1,1,1,1, 1,1,0,1,0, 0 }; -static u8 option_allowed_cmd_ILIST_LL[135] = // cmd #37 +static u8 option_allowed_cmd_ILIST_LL[136] = // cmd #38 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,1,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,1, 1,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, - 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,1,1, - 0,1,0,0,1, 1,1,1,1,1, 1,0,1,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 1,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, + 1,0,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0,0,0,1, + 1,0,1,0,0, 1,1,1,1,1, 1,1,0,1,0, 0 }; -static u8 option_allowed_cmd_ILIST_A[135] = // cmd #38 +static u8 option_allowed_cmd_ILIST_A[136] = // cmd #39 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,1,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,1, 1,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, - 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,1,1, - 0,1,0,0,1, 1,1,1,1,1, 1,0,1,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 1,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, + 1,0,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0,0,0,1, + 1,0,1,0,0, 1,1,1,1,1, 1,1,0,1,0, 0 }; -static u8 option_allowed_cmd_ILIST_LA[135] = // cmd #39 +static u8 option_allowed_cmd_ILIST_LA[136] = // cmd #40 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,1,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,1, 1,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, - 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,1,1, - 0,1,0,0,1, 1,1,1,1,1, 1,0,1,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 1,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, + 1,0,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0,0,0,1, + 1,0,1,0,0, 1,1,1,1,1, 1,1,0,1,0, 0 }; -static u8 option_allowed_cmd_MEMORY[135] = // cmd #40 +static u8 option_allowed_cmd_MEMORY[136] = // cmd #41 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 1,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, - 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,1,1, - 0,1,1,1,1, 1,1,1,1,1, 1,1,1,0,0 + 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, + 1,0,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0,0,0,1, + 1,0,1,1,1, 1,1,1,1,1, 1,1,1,1,0, 0 }; -static u8 option_allowed_cmd_MEMORY_A[135] = // cmd #41 +static u8 option_allowed_cmd_MEMORY_A[136] = // cmd #42 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 1,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, - 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,1,1, - 0,1,1,1,1, 1,1,1,1,1, 1,1,1,0,0 + 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, + 1,0,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0,0,0,1, + 1,0,1,1,1, 1,1,1,1,1, 1,1,1,1,0, 0 }; -static u8 option_allowed_cmd_DUMP[135] = // cmd #42 +static u8 option_allowed_cmd_DUMP[136] = // cmd #43 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 1,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, - 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,1,1, - 0,0,0,0,1, 1,1,1,1,1, 1,0,1,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, + 1,0,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0,0,0,1, + 1,0,0,0,0, 1,1,1,1,1, 1,1,0,1,0, 0 }; -static u8 option_allowed_cmd_SHA1[135] = // cmd #43 +static u8 option_allowed_cmd_SHA1[136] = // cmd #44 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,1,1,1,1, 1,0,1,0,1, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 1,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, - 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,1,1, - 0,0,0,0,1, 1,1,1,1,1, 1,0,1,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,1,1,1, 1,1,0,1,0, 1,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, + 1,0,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0,0,0,1, + 1,0,0,0,0, 1,1,1,1,1, 1,1,0,1,0, 0 }; -static u8 option_allowed_cmd_ANALYZE[135] = // cmd #44 +static u8 option_allowed_cmd_ANALYZE[136] = // cmd #45 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 1,0,0,0,0, 0,0,0,1,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,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,1, 1,1,0,0,0, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1 }; -static u8 option_allowed_cmd_IS_TEXTURE[135] = // cmd #45 +static u8 option_allowed_cmd_SPLIT[136] = // cmd #46 { + 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,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,1,0, 0,0,0,0,0, 0,0,0,1,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1,1,0,0,0, 0,0,0,0,1, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1 +}; + +static u8 option_allowed_cmd_IS_TEXTURE[136] = // cmd #47 +{ + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_FEATURES[135] = // cmd #46 +static u8 option_allowed_cmd_FEATURES[136] = // cmd #48 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,1, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,1,1,0, 0,0,0,0,1, 1,0,0,0,0, 0,0,0,1,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, 1,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 0,0,0,0,0, 1,1,0,0,0, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1 }; -static u8 option_allowed_cmd_DISTRIBUTION[135] = // cmd #47 +static u8 option_allowed_cmd_DISTRIBUTION[136] = // cmd #49 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,1,1,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 1,1,0,0,0, 0,0,1,0,0, 0,0,0,0,0, 0,0,0,1,1, - 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,1,1, - 0,0,0,0,1, 1,1,1,1,1, 1,0,1,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,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,1,1,0,0, 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,1, + 1,0,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0,0,0,1, + 1,0,0,0,0, 1,1,1,1,1, 1,1,0,1,0, 0 }; -static u8 option_allowed_cmd_DIFF[135] = // cmd #48 +static u8 option_allowed_cmd_DIFF[136] = // cmd #50 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 0,1,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,1,0,0,0, 0,0,0,0,0, 0,1,1,0,0 + 0,0,1,0,0, 0,0,0,0,0, 0,0,1,1,0, 0 }; -static u8 option_allowed_cmd_CHECK[135] = // cmd #49 +static u8 option_allowed_cmd_CHECK[136] = // cmd #51 { - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, - 1,1,1,1,0, 1,0,0,1,1, 1,0,0,0,0, 0,0,1,0,1, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 1,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, - 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,0,1, - 0,0,0,0,1, 1,1,1,1,1, 1,0,1,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, + 1,1,1,1,1, 0,1,0,0,1, 1,1,0,0,0, 0,0,0,1,0, 1,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, + 1,0,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0,0,0,0, + 1,0,0,0,0, 1,1,1,1,1, 1,1,0,1,0, 0 }; -static u8 option_allowed_cmd_SLOTS[135] = // cmd #50 +static u8 option_allowed_cmd_SLOTS[136] = // cmd #52 { - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, - 1,1,1,1,0, 1,0,0,1,1, 1,0,0,0,0, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 1,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, - 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 0,0,0,0,1, - 0,0,0,0,1, 1,1,1,1,1, 1,0,1,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, + 1,1,1,1,1, 0,1,0,0,1, 1,1,0,0,0, 0,0,0,0,0, 1,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, + 1,0,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,0,0,0,0, + 1,0,0,0,0, 1,1,1,1,1, 1,1,0,1,0, 0 }; -static u8 option_allowed_cmd_STGI[135] = // cmd #51 +static u8 option_allowed_cmd_STGI[136] = // cmd #53 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,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 }; -static u8 option_allowed_cmd_ISARENA[135] = // cmd #52 +static u8 option_allowed_cmd_ISARENA[136] = // cmd #54 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 1,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,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 }; -static u8 option_allowed_cmd_NORMALIZE[135] = // cmd #53 +static u8 option_allowed_cmd_NORMALIZE[136] = // cmd #55 { - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, - 1,1,1,1,0, 1,0,0,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,1, 1,1,1,1,1, 1,1,1,1,0, - 0,1,1,1,1, 1,1,0,0,0, 0,1,0,0,1, 1,1,1,1,1, 1,0,0,0,0, 0,0,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,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, + 1,1,1,1,1, 0,1,0,0,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, 1,1,1,1,1, 1,1,1,1,1, + 0,0,1,1,1, 1,1,1,0,0, 0,0,1,0,0, 1,1,1,1,1, 1,1,0,0,0, 0,0,0,1,1, + 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_PATCH[135] = // cmd #54 +static u8 option_allowed_cmd_PATCH[136] = // cmd #56 { - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, - 1,1,1,1,0, 1,0,0,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,1, 1,1,1,1,1, 1,1,1,1,0, - 0,1,1,1,1, 1,1,0,0,0, 0,1,0,0,1, 1,1,1,1,1, 1,0,0,0,0, 0,1,1,1,1, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, + 1,1,1,1,1, 0,1,0,0,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, 1,1,1,1,1, 1,1,1,1,1, + 0,0,1,1,1, 1,1,1,0,0, 0,0,1,0,0, 1,1,1,1,1, 1,1,0,0,0, 0,0,1,1,1, + 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_COPY[135] = // cmd #55 +static u8 option_allowed_cmd_COPY[136] = // cmd #57 { - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, - 1,1,1,1,0, 1,0,0,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,1, 1,1,1,1,1, 1,1,1,1,0, - 0,1,1,1,1, 1,1,0,0,0, 0,1,0,0,1, 1,1,1,1,1, 1,0,0,0,0, 0,1,1,1,1, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, + 1,1,1,1,1, 0,1,0,0,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, 1,1,1,1,1, 1,1,1,1,1, + 0,0,1,1,1, 1,1,1,0,0, 0,0,1,0,0, 1,1,1,1,1, 1,1,0,0,0, 0,0,1,1,1, + 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_DUPLICATE[135] = // cmd #56 +static u8 option_allowed_cmd_DUPLICATE[136] = // cmd #58 { - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, - 1,1,1,1,0, 1,1,0,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,1, 1,1,1,1,1, 1,1,1,1,0, - 0,1,1,1,1, 1,1,0,0,0, 0,1,0,0,1, 1,1,1,1,1, 1,0,0,0,0, 0,1,1,1,1, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, + 1,1,1,1,1, 0,1,1,0,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, 1,1,1,1,1, 1,1,1,1,1, + 0,0,1,1,1, 1,1,1,0,0, 0,0,1,0,0, 1,1,1,1,1, 1,1,0,0,0, 0,0,1,1,1, + 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_MINIMAP[135] = // cmd #57 +static u8 option_allowed_cmd_MINIMAP[136] = // cmd #59 { - 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1,0,1,1,0, - 0,1,1,1,1, 1,1,0,0,0, 0,1,0,0,1, 1,0,0,0,0, 0,0,0,0,0, 0,1,1,1,1, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,1,1,1, 1,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,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,1,0,1,1, + 0,0,1,1,1, 1,1,1,0,0, 0,0,1,0,0, 1,1,0,0,0, 0,0,0,0,0, 0,0,1,1,1, + 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_COMPRESS[135] = // cmd #58 +static u8 option_allowed_cmd_COMPRESS[136] = // cmd #60 { - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, - 1,1,1,1,0, 1,0,0,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,1, 1,1,1,1,1, 1,1,1,1,0, - 0,1,1,1,1, 1,1,0,0,0, 0,1,0,0,1, 1,1,1,1,1, 1,0,0,0,0, 0,1,1,1,1, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, + 1,1,1,1,1, 0,1,0,0,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, 1,1,1,1,1, 1,1,1,1,1, + 0,0,1,1,1, 1,1,1,0,0, 0,0,1,0,0, 1,1,1,1,1, 1,1,0,0,0, 0,0,1,1,1, + 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_DECOMPRESS[135] = // cmd #59 +static u8 option_allowed_cmd_DECOMPRESS[136] = // cmd #61 { - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, - 1,1,1,1,0, 1,0,0,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,1, 1,1,1,1,1, 1,1,1,1,0, - 0,1,1,1,1, 1,1,0,0,0, 0,1,0,0,1, 1,1,0,1,0, 0,0,0,0,0, 0,0,0,1,1, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, + 1,1,1,1,1, 0,1,0,0,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, 1,1,1,1,1, 1,1,1,1,1, + 0,0,1,1,1, 1,1,1,0,0, 0,0,1,0,0, 1,1,1,0,1, 0,0,0,0,0, 0,0,0,0,1, + 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_ENCODE[135] = // cmd #60 +static u8 option_allowed_cmd_ENCODE[136] = // cmd #62 { - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, - 1,1,1,1,0, 1,0,0,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, 1,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, - 0,1,1,1,1, 1,1,1,1,1, 1,0,1,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,1, 1,1,1,1,1, 1,0,1,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, + 1,1,1,1,1, 0,1,0,0,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,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, + 1,0,1,1,1, 1,1,1,1,1, 1,1,0,1,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 1,1,1,1,1, 1,1,0,1,0, 0 }; -static u8 option_allowed_cmd_CREATE[135] = // cmd #61 +static u8 option_allowed_cmd_CREATE[136] = // cmd #63 { - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, - 1,1,1,1,0, 1,0,0,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, 1,1,0,0,0, 0,0,0,0,1, 1,1,1,1,0, 1,1,1,0,1, - 0,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,0,1, - 0,0,0,0,1, 1,1,1,1,1, 1,0,1,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, + 1,1,1,1,1, 0,1,0,0,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,1,1,0,0, 0,0,0,0,0, 1,1,1,1,1, 0,1,1,1,0, + 1,0,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,0, + 1,0,0,0,0, 1,1,1,1,1, 1,1,0,1,0, 0 }; -static u8 option_allowed_cmd_UPDATE[135] = // cmd #62 +static u8 option_allowed_cmd_UPDATE[136] = // cmd #64 { - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, - 1,1,1,1,0, 1,0,0,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, 1,1,0,0,0, 0,0,1,0,1, 1,1,1,1,0, 1,1,1,1,0, - 0,0,0,0,0, 0,0,1,1,1, 1,0,1,1,0, 0,0,0,0,0, 0,0,0,0,0, 1,1,1,0,0, - 0,1,0,0,0, 0,0,0,0,0, 0,0,1,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, + 1,1,1,1,1, 0,1,0,0,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,1,1,0,0, 0,0,0,1,0, 1,1,1,1,1, 0,1,1,1,1, + 0,0,0,0,0, 0,0,0,1,1, 1,1,0,1,1, 0,0,0,0,0, 0,0,0,0,0, 0,1,1,1,0, + 0,0,1,0,0, 0,0,0,0,0, 0,0,0,1,0, 0 }; -static u8 option_allowed_cmd_EXTRACT[135] = // cmd #63 +static u8 option_allowed_cmd_EXTRACT[136] = // cmd #65 { - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, - 1,1,1,1,0, 1,0,0,1,1, 1,0,0,0,0, 0,0,0,1,1, 0,1,1,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,1,1,0, 0,0,0,0,0, 1,1,0,0,1, 1,1,1,1,0, 1,1,1,1,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, - 1,1,1,1,1, 1,0,0,0,1, 1,1,1,1,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, + 1,1,1,1,1, 0,1,0,0,1, 1,1,0,0,0, 0,0,0,0,1, 1,0,1,1,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,1,1, 0,0,0,0,0, 0,1,1,0,0, 1,1,1,1,1, 0,1,1,1,1, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, + 1,1,1,1,1, 1,1,0,0,0, 1,1,1,1,1, 0 }; -static u8 option_allowed_cmd_XDECODE[135] = // cmd #64 +static u8 option_allowed_cmd_XDECODE[136] = // cmd #66 { - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, - 1,1,1,1,0, 1,0,0,1,1, 1,0,0,0,0, 0,0,0,1,1, 0,1,1,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,1,1,0, 0,0,0,0,0, 1,1,0,0,1, 1,1,1,1,0, 1,1,1,1,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, - 1,1,1,1,1, 1,0,0,0,1, 1,1,1,1,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, + 1,1,1,1,1, 0,1,0,0,1, 1,1,0,0,0, 0,0,0,0,1, 1,0,1,1,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,1,1, 0,0,0,0,0, 0,1,1,0,0, 1,1,1,1,1, 0,1,1,1,1, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, + 1,1,1,1,1, 1,1,0,0,0, 1,1,1,1,1, 0 }; -static u8 option_allowed_cmd_XEXPORT[135] = // cmd #65 +static u8 option_allowed_cmd_XEXPORT[136] = // cmd #67 { - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, - 1,1,1,1,0, 1,0,0,1,1, 1,0,0,0,0, 0,0,0,1,1, 0,1,1,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,1,1,0, 0,0,0,0,0, 1,1,0,0,1, 1,1,1,1,0, 1,1,1,1,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, - 1,1,1,1,1, 1,0,0,0,1, 1,1,1,1,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, + 1,1,1,1,1, 0,1,0,0,1, 1,1,0,0,0, 0,0,0,0,1, 1,0,1,1,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,1,1, 0,0,0,0,0, 0,1,1,0,0, 1,1,1,1,1, 0,1,1,1,1, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, + 1,1,1,1,1, 1,1,0,0,0, 1,1,1,1,1, 0 }; -static u8 option_allowed_cmd_XALL[135] = // cmd #66 +static u8 option_allowed_cmd_XALL[136] = // cmd #68 { - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, - 1,1,1,1,0, 1,0,0,1,1, 1,0,0,0,0, 0,0,0,1,1, 0,1,1,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,1,1,0, 0,0,0,0,0, 1,1,0,0,1, 1,1,1,1,0, 1,1,1,1,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, - 1,1,1,1,1, 1,0,0,0,1, 1,1,1,1,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, + 1,1,1,1,1, 0,1,0,0,1, 1,1,0,0,0, 0,0,0,0,1, 1,0,1,1,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,1,1, 0,0,0,0,0, 0,1,1,0,0, 1,1,1,1,1, 0,1,1,1,1, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, + 1,1,1,1,1, 1,1,0,0,0, 1,1,1,1,1, 0 }; -static u8 option_allowed_cmd_XCOMMON[135] = // cmd #67 +static u8 option_allowed_cmd_XCOMMON[136] = // cmd #69 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 1,1,1,1,0, 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, 1,1,1,1,1, 0,1,1,1,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_BINARY[135] = // cmd #68 +static u8 option_allowed_cmd_BINARY[136] = // cmd #70 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 1,1,1,1,0, 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, 1,1,1,1,1, 0,1,1,1,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_TEXT[135] = // cmd #69 +static u8 option_allowed_cmd_TEXT[136] = // cmd #71 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,1,1, 0,1,1,0,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,1, 1,1,1,1,0, 1,1,1,1,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 1,0,1,1,0, 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, 1,1,1,1,1, 0,1,1,1,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_CAT[135] = // cmd #70 +static u8 option_allowed_cmd_CAT[136] = // cmd #72 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,1,1, 0,1,1,0,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,1,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 1,0,1,1,0, 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,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,1,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_BMG[135] = // cmd #71 +static u8 option_allowed_cmd_BMG[136] = // cmd #73 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,1,1, 0,0,0,0,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,1,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 1,0,0,0,0, 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,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 }; -static u8 option_allowed_cmd_KCL[135] = // cmd #72 +static u8 option_allowed_cmd_KCL[136] = // cmd #74 { - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, - 1,1,1,1,0, 1,0,0,1,1, 1,0,0,0,0, 0,0,0,1,1, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,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,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, + 1,1,1,1,1, 0,1,0,0,1, 1,1,0,0,0, 0,0,0,0,1, 1,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,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 }; -static u8 option_allowed_cmd_KMP[135] = // cmd #73 +static u8 option_allowed_cmd_KMP[136] = // cmd #75 { - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, - 1,1,1,1,0, 1,0,0,1,1, 1,0,0,0,0, 0,0,0,1,1, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,1,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,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,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, + 1,1,1,1,1, 0,1,0,0,1, 1,1,0,0,0, 0,0,0,0,1, 1,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,1,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,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 }; -static u8 option_allowed_cmd_LEX[135] = // cmd #74 +static u8 option_allowed_cmd_LEX[136] = // cmd #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,1,1, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,1,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 1,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_INFO[135] = // cmd #75 +static u8 option_allowed_cmd_INFO[136] = // cmd #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,1,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; -static u8 option_allowed_cmd_GHOST[135] = // cmd #76 +static u8 option_allowed_cmd_GHOST[136] = // cmd #78 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 1,0,0,0,0, 0,0,0,1,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,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, 1,1,0,0,0, 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1 }; -static u8 option_allowed_cmd_YAZDUMP[135] = // cmd #77 +static u8 option_allowed_cmd_YAZDUMP[136] = // cmd #79 { 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,1, 1,1,1,1,0, 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, 1,1,1,1,1, 0,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 }; -static u8 option_allowed_cmd_VEHICLE[135] = // cmd #78 +static u8 option_allowed_cmd_VEHICLE[136] = // cmd #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,1, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,1, 1,0,1,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 1,0,0,0,0, 0,0,0,0,0, + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, 1,1,0,1,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, - 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 + 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0 }; @@ -3687,15 +3751,18 @@ static const InfoOption_t * option_tab_tool[] = OptionInfo + OPT_COMPATIBLE, OptionInfo + OPT_WIDTH, OptionInfo + OPT_MAX_WIDTH, + OptionInfo + OPT_NO_PAGER, OptionInfo + OPT_QUIET, OptionInfo + OPT_VERBOSE, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_WARN, OptionInfo + OPT_DE, OptionInfo + OPT_COLORS, OptionInfo + OPT_NO_COLORS, OptionInfo + OPT_CT_CODE, OptionInfo + OPT_LE_CODE, + OptionInfo + OPT_LOAD_PREFIX, OptionInfo + OPT_CHDIR, OptionInfo + OPT_CONST, OptionInfo + OPT_BATTLE, @@ -3809,6 +3876,12 @@ static const InfoOption_t * option_tab_cmd_ARGTEST[] = 0 }; +static const InfoOption_t * option_tab_cmd_EXPAND[] = +{ + + 0 +}; + static const InfoOption_t * option_tab_cmd_TEST[] = { &option_cmd_TEST_VERBOSE, @@ -3979,6 +4052,7 @@ static const InfoOption_t * option_tab_cmd_SIZEOF[] = &option_cmd_SIZEOF_SORT, &option_cmd_SIZEOF_BRIEF, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, 0 }; @@ -4052,6 +4126,7 @@ static const InfoOption_t * option_tab_cmd_LIST[] = OptionInfo + OPT_ALIGN_BREFT, OptionInfo + OPT_ALIGN, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_ENCODE_ALL, OptionInfo + OPT_ENCODE_IMG, OptionInfo + OPT_NO_ENCODE, @@ -4115,6 +4190,7 @@ static const InfoOption_t * option_tab_cmd_LIST_L[] = OptionInfo + OPT_ALIGN_BREFT, OptionInfo + OPT_ALIGN, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_ENCODE_ALL, OptionInfo + OPT_ENCODE_IMG, OptionInfo + OPT_NO_ENCODE, @@ -4178,6 +4254,7 @@ static const InfoOption_t * option_tab_cmd_LIST_LL[] = OptionInfo + OPT_ALIGN_BREFT, OptionInfo + OPT_ALIGN, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_ENCODE_ALL, OptionInfo + OPT_ENCODE_IMG, OptionInfo + OPT_NO_ENCODE, @@ -4241,6 +4318,7 @@ static const InfoOption_t * option_tab_cmd_LIST_LLL[] = OptionInfo + OPT_ALIGN_BREFT, OptionInfo + OPT_ALIGN, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_ENCODE_ALL, OptionInfo + OPT_ENCODE_IMG, OptionInfo + OPT_NO_ENCODE, @@ -4304,6 +4382,7 @@ static const InfoOption_t * option_tab_cmd_LIST_A[] = OptionInfo + OPT_ALIGN_BREFT, OptionInfo + OPT_ALIGN, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_ENCODE_ALL, OptionInfo + OPT_ENCODE_IMG, OptionInfo + OPT_NO_ENCODE, @@ -4367,6 +4446,7 @@ static const InfoOption_t * option_tab_cmd_LIST_LA[] = OptionInfo + OPT_ALIGN_BREFT, OptionInfo + OPT_ALIGN, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_ENCODE_ALL, OptionInfo + OPT_ENCODE_IMG, OptionInfo + OPT_NO_ENCODE, @@ -4437,6 +4517,7 @@ static const InfoOption_t * option_tab_cmd_ILIST[] = OptionInfo + OPT_ALIGN_BREFT, OptionInfo + OPT_ALIGN, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_ENCODE_ALL, OptionInfo + OPT_ENCODE_IMG, OptionInfo + OPT_NO_ENCODE, @@ -4497,6 +4578,7 @@ static const InfoOption_t * option_tab_cmd_ILIST_L[] = OptionInfo + OPT_ALIGN_BREFT, OptionInfo + OPT_ALIGN, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_ENCODE_ALL, OptionInfo + OPT_ENCODE_IMG, OptionInfo + OPT_NO_ENCODE, @@ -4557,6 +4639,7 @@ static const InfoOption_t * option_tab_cmd_ILIST_LL[] = OptionInfo + OPT_ALIGN_BREFT, OptionInfo + OPT_ALIGN, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_ENCODE_ALL, OptionInfo + OPT_ENCODE_IMG, OptionInfo + OPT_NO_ENCODE, @@ -4617,6 +4700,7 @@ static const InfoOption_t * option_tab_cmd_ILIST_A[] = OptionInfo + OPT_ALIGN_BREFT, OptionInfo + OPT_ALIGN, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_ENCODE_ALL, OptionInfo + OPT_ENCODE_IMG, OptionInfo + OPT_NO_ENCODE, @@ -4677,6 +4761,7 @@ static const InfoOption_t * option_tab_cmd_ILIST_LA[] = OptionInfo + OPT_ALIGN_BREFT, OptionInfo + OPT_ALIGN, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_ENCODE_ALL, OptionInfo + OPT_ENCODE_IMG, OptionInfo + OPT_NO_ENCODE, @@ -4742,6 +4827,7 @@ static const InfoOption_t * option_tab_cmd_MEMORY[] = OptionInfo + OPT_ALIGN_BREFT, OptionInfo + OPT_ALIGN, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_ENCODE_ALL, OptionInfo + OPT_ENCODE_IMG, OptionInfo + OPT_NO_ENCODE, @@ -4807,6 +4893,7 @@ static const InfoOption_t * option_tab_cmd_MEMORY_A[] = OptionInfo + OPT_ALIGN_BREFT, OptionInfo + OPT_ALIGN, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_ENCODE_ALL, OptionInfo + OPT_ENCODE_IMG, OptionInfo + OPT_NO_ENCODE, @@ -4862,6 +4949,7 @@ static const InfoOption_t * option_tab_cmd_DUMP[] = OptionInfo + OPT_ALIGN_BREFT, OptionInfo + OPT_ALIGN, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_ENCODE_ALL, OptionInfo + OPT_ENCODE_IMG, &option_grp_ENCODE_ALL, @@ -4920,6 +5008,7 @@ static const InfoOption_t * option_tab_cmd_SHA1[] = OptionInfo + OPT_ALIGN_BREFT, OptionInfo + OPT_ALIGN, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_ENCODE_ALL, OptionInfo + OPT_ENCODE_IMG, &option_grp_ENCODE_ALL, @@ -4982,6 +5071,36 @@ static const InfoOption_t * option_tab_cmd_ANALYZE[] = 0 }; +static const InfoOption_t * option_tab_cmd_SPLIT[] = +{ + OptionInfo + OPT_LOAD_PREFIX, + OptionInfo + OPT_PLUS, + + OptionInfo + OPT_NONE, // separator + + OptionInfo + OPT_IGNORE, + + OptionInfo + OPT_NONE, // separator + + &option_grp_SCRIPT_SECTIONS, + OptionInfo + OPT_SH, + OptionInfo + OPT_BASH, + OptionInfo + OPT_JSON, + OptionInfo + OPT_PHP, + OptionInfo + OPT_MAKEDOC, + OptionInfo + OPT_VAR, + OptionInfo + OPT_ARRAY, + OptionInfo + OPT_AVAR, + OptionInfo + OPT_CASE, + + OptionInfo + OPT_NONE, // separator + + OptionInfo + OPT_DEST, + OptionInfo + OPT_DEST2, + + 0 +}; + static const InfoOption_t * option_tab_cmd_IS_TEXTURE[] = { OptionInfo + OPT_IGNORE, @@ -5051,6 +5170,7 @@ static const InfoOption_t * option_tab_cmd_DISTRIBUTION[] = OptionInfo + OPT_ALIGN_BREFT, OptionInfo + OPT_ALIGN, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_ENCODE_ALL, OptionInfo + OPT_ENCODE_IMG, &option_grp_ENCODE_ALL, @@ -5128,6 +5248,7 @@ static const InfoOption_t * option_tab_cmd_CHECK[] = OptionInfo + OPT_ALIGN_BREFT, OptionInfo + OPT_ALIGN, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_ENCODE_ALL, OptionInfo + OPT_ENCODE_IMG, &option_grp_ENCODE_ALL, @@ -5231,6 +5352,7 @@ static const InfoOption_t * option_tab_cmd_SLOTS[] = OptionInfo + OPT_ALIGN_BREFT, OptionInfo + OPT_ALIGN, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_ENCODE_ALL, OptionInfo + OPT_ENCODE_IMG, &option_grp_ENCODE_ALL, @@ -5941,6 +6063,7 @@ static const InfoOption_t * option_tab_cmd_ENCODE[] = OptionInfo + OPT_ALIGN_BREFT, OptionInfo + OPT_ALIGN, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_ENCODE_ALL, OptionInfo + OPT_ENCODE_IMG, &option_grp_ENCODE_ALL, @@ -6053,6 +6176,7 @@ static const InfoOption_t * option_tab_cmd_CREATE[] = OptionInfo + OPT_ALIGN_BREFT, OptionInfo + OPT_ALIGN, OptionInfo + OPT_LOGGING, + OptionInfo + OPT_TIMING, OptionInfo + OPT_ENCODE_ALL, OptionInfo + OPT_ENCODE_IMG, &option_grp_ENCODE_ALL, @@ -6903,7 +7027,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = " SZS, U8, PACK, BRRES, BREFF and BREFT archives. Additonally, RARC" " archive can be extracted. It is also a wrapper to all other tools.", 0, - 67, + 70, option_tab_tool, 0 }, @@ -6985,13 +7109,32 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = 0, "wszst ARGTEST ...", "This debug command accepts all kinds of parameters and prints one" - " line for each parameter.", + " line for each parameter. All tools know the ARGTEST command.", 0, 0, option_tab_cmd_ARGTEST, option_allowed_cmd_ARGTEST }, + { CMD_EXPAND, + false, + false, + false, + "EXPAND", + 0, + "wszst EXPAND ...", + "This debug command accepts (like ARGTEST) all kinds of parameters and" + " prints one line for each parameter. After that, the parameter is" + " treated as a filename with wildcards and all matching files are" + " searched. The special parameters '+h' and '/h' enable or disable the" + " search for hidden directories and files (files beginning with a" + " point). All tools know the EXPAND command.", + 0, + 0, + option_tab_cmd_EXPAND, + option_allowed_cmd_EXPAND + }, + { CMD_TEST, false, false, @@ -7031,7 +7174,8 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "ERR", "wszst ERROR [error_code]", "Translate an exit code to a message name. If no exit code is entered," - " print a table with all error messages.", + " print a table with all error messages. All tools know the ERROR" + " command.", 0, 4, option_tab_cmd_ERROR, @@ -7046,7 +7190,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "FT", "wszst FILETYPE file...", "Scan the header of the entered files and print file type and path for" - " each file as list.", + " each file as list. All tools know the FILETYPE command.", 0, 3, option_tab_cmd_FILETYPE, @@ -7063,7 +7207,8 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "Print a table with attributes for all known file types. If at least" " one keyword is entered, only matching file types are printed. A" " keyword is either a file type (like 'BRRES' or 'BMG') or one of the" - " printed keywords (like 'ARCHIVE' or 'EXTRACT').", + " printed keywords (like 'ARCHIVE' or 'EXTRACT'). All tools know the" + " FILEATTRIB command.", 0, 1, option_tab_cmd_FILEATTRIB, @@ -7094,7 +7239,8 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "SYMBOLS", 0, "wszst SYMBOLS", - "Print predefined symbols of text parser to standard output.", + "Print predefined symbols of text parser to standard output. Many" + " tools know the SYMBOLS command.", 0, 1, option_tab_cmd_SYMBOLS, @@ -7109,7 +7255,8 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = 0, "wszst FUNCTIONS [key]...", "Print a list with all parser functions. If one or more keys entered," - " then only functions that match at least one key are printed.", + " then only functions that match at least one key are printed. Many" + " tools know the FUNCTIONS command.", 0, 3, option_tab_cmd_FUNCTIONS, @@ -7123,7 +7270,8 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "CALCULATE", 0, "wszst CALCULATE expression...", - "Calculate each expression and print the result to standard output.", + "Calculate each expression and print the result to standard output." + " Many tools know the CALCULATE command.", 0, 1, option_tab_cmd_CALCULATE, @@ -7292,7 +7440,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "This hidden command prints a list with the size of data structures" " and variables.", 0, - 3, + 4, option_tab_cmd_SIZEOF, option_allowed_cmd_SIZEOF }, @@ -7367,7 +7515,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = " archives. If listing a directory, then a virtual SZS file is created" " (like CREATE does it) and listed.", 0, - 48, + 49, option_tab_cmd_LIST, option_allowed_cmd_LIST }, @@ -7382,7 +7530,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "List all sub files with size. 'LIST-L' and 'LL' are short cuts for" " 'LIST --long'.", 0, - 48, + 49, option_tab_cmd_LIST_L, option_allowed_cmd_LIST_L }, @@ -7397,7 +7545,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "List all sub files with offset and size. 'LIST-LL' and 'LLL' are" " short cuts for 'LIST --long --long'.", 0, - 48, + 49, option_tab_cmd_LIST_LL, option_allowed_cmd_LIST_LL }, @@ -7412,7 +7560,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "List all sub files with offset and size in debugging mode. 'LIST-LLL'" " and 'LLLL' are short cuts for 'LIST --long --long --long'.", 0, - 48, + 49, option_tab_cmd_LIST_LLL, option_allowed_cmd_LIST_LLL }, @@ -7427,7 +7575,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "List recursive all sub files with size. 'LIST-A' and 'LA' are short" " cuts for 'LIST --long --all --all'.", 0, - 48, + 49, option_tab_cmd_LIST_A, option_allowed_cmd_LIST_A }, @@ -7442,7 +7590,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "List recursive all sub files with offset and size. 'LIST-LA' and" " 'LLA' are short cuts for 'LIST --long --long --all --all'.", 0, - 48, + 49, option_tab_cmd_LIST_LA, option_allowed_cmd_LIST_LA }, @@ -7476,7 +7624,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = " listing a directory, then a virtual SZS file is created (like CREATE" " does it) and listed.", 0, - 45, + 46, option_tab_cmd_ILIST, option_allowed_cmd_ILIST }, @@ -7491,7 +7639,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "List all image files with geometry data. 'ILIST-L' and 'ILL' are" " short cuts for 'ILIST --long'.", 0, - 45, + 46, option_tab_cmd_ILIST_L, option_allowed_cmd_ILIST_L }, @@ -7506,7 +7654,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "List all sub files with advanced geometry data. 'ILIST-LL' and 'ILLL'" " are short cuts for 'ILIST --long --long'.", 0, - 45, + 46, option_tab_cmd_ILIST_LL, option_allowed_cmd_ILIST_LL }, @@ -7521,7 +7669,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "List recursive all image files. 'ILIST-A' and 'ILA' are short cuts" " for 'ILIST --all'.", 0, - 45, + 46, option_tab_cmd_ILIST_A, option_allowed_cmd_ILIST_A }, @@ -7536,7 +7684,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "List recursive all image files with geometry data. 'ILIST-LA' and" " 'ILLA' are short cuts for 'ILIST --long --all'.", 0, - 45, + 46, option_tab_cmd_ILIST_LA, option_allowed_cmd_ILIST_LA }, @@ -7551,7 +7699,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "Dump a memory map of each source file. Virtual images (extracted" " directories) are also supported.", 0, - 47, + 48, option_tab_cmd_MEMORY, option_allowed_cmd_MEMORY }, @@ -7566,7 +7714,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "Dump recursive a memory map of each source file. 'MEMORY-A' and" " 'MEMA' are short cuts for 'MEMORY --all --all'.", 0, - 47, + 48, option_tab_cmd_MEMORY_A, option_allowed_cmd_MEMORY_A }, @@ -7583,7 +7731,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = " relocation. Virtual images (extracted directories) are also" " supported.", 0, - 41, + 42, option_tab_cmd_DUMP, option_allowed_cmd_DUMP }, @@ -7598,7 +7746,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = "Print a SHA1 checksum for each source. The checksum is calculated by" " using the uncompressed data and after patching.", 0, - 48, + 49, option_tab_cmd_SHA1, option_allowed_cmd_SHA1 }, @@ -7617,6 +7765,21 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = option_allowed_cmd_ANALYZE }, + { CMD_SPLIT, + false, + false, + false, + "SPLIT", + 0, + "wszst SPLIT [source]...", + "Analyse (file) names and split them into the different parts. Print" + " the results in machine readable format.", + 0, + 15, + option_tab_cmd_SPLIT, + option_allowed_cmd_SPLIT + }, + { CMD_IS_TEXTURE, false, false, @@ -7657,7 +7820,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = false, false, "DISTRIBUTION", - "DIST", + "DIS", "wszst DISTRIBUTION result source...\n" "wszst DISTRIBUTION directory [source]...", "Load each SOURCE (SZS, WBZ, U8 or WU8) and calculate a checksum of" @@ -7670,9 +7833,11 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = " directory, it is used as first source too.\n" " If file RESULT exists, it is automatically added as last source to" " the list of option --source, but only if not already added. On" - " scanning of file result, parameters are scanned too.", + " scanning of file result, parameters are scanned too.\n" + " See »welect DISTRIBUTION« for a new and alternative implementation" + " of this.", 0, - 45, + 46, option_tab_cmd_DISTRIBUTION, option_allowed_cmd_DISTRIBUTION }, @@ -7708,7 +7873,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = " internal object and file database. The source can be a SZS, U8, WU8" " or WBZ file, or an U8 like directory.", 0, - 90, + 91, option_tab_cmd_CHECK, option_allowed_cmd_CHECK }, @@ -7726,7 +7891,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = " positive or a negative slot list, whatever is shorter. For battle" " arenas, the keyword ARENA is printed.", 0, - 86, + 87, option_tab_cmd_SLOTS, option_allowed_cmd_SLOTS }, @@ -7910,7 +8075,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = " Create and/or encode sub files if necessary. It works like command" " CREATE, but without creating a new first level archive file.", 0, - 69, + 70, option_tab_cmd_ENCODE, option_allowed_cmd_ENCODE }, @@ -7926,7 +8091,7 @@ static const InfoCommand_t CommandInfo[CMD__N+1] = " not hidden files of the directory structure. Create and/or encode" " sub files if necessary. The default destination is '%P/%N%T'.", 0, - 95, + 96, option_tab_cmd_CREATE, option_allowed_cmd_CREATE }, diff --git a/project/src/ui/ui-wszst.h b/project/src/ui/ui-wszst.h index 161aa7e..cdd1c7a 100644 --- a/project/src/ui/ui-wszst.h +++ b/project/src/ui/ui-wszst.h @@ -56,6 +56,7 @@ typedef enum enumOptions //----- command specific options ----- + OPT_PLUS, OPT_TOUCH, OPT_AUTO, OPT_SET_FLAGS, @@ -191,7 +192,7 @@ typedef enum enumOptions OPT_RAW, OPT_SECTIONS, - OPT__N_SPECIFIC, // == 135 + OPT__N_SPECIFIC, // == 136 //----- global options ----- @@ -203,15 +204,18 @@ typedef enum enumOptions OPT_COMPATIBLE, OPT_WIDTH, OPT_MAX_WIDTH, + OPT_NO_PAGER, OPT_QUIET, OPT_VERBOSE, OPT_LOGGING, + OPT_TIMING, OPT_WARN, OPT_DE, OPT_COLORS, OPT_NO_COLORS, OPT_CT_CODE, OPT_LE_CODE, + OPT_LOAD_PREFIX, OPT_CHDIR, OPT_CONST, OPT_BATTLE, @@ -272,7 +276,7 @@ typedef enum enumOptions OPT_NEW, OPT_EXTRACT, - OPT__N_TOTAL // == 211 + OPT__N_TOTAL // == 215 } enumOptions; @@ -287,6 +291,7 @@ typedef enum enumOptions //{ // //----- command specific options ----- // +// OB_PLUS = 1llu << OPT_PLUS, // OB_TOUCH = 1llu << OPT_TOUCH, // OB_AUTO = 1llu << OPT_AUTO, // OB_SET_FLAGS = 1llu << OPT_SET_FLAGS, @@ -573,6 +578,8 @@ typedef enum enumOptions // // OB_CMD_ARGTEST = ~(u64)0, // +// OB_CMD_EXPAND = ~(u64)0, +// // OB_CMD_TEST = ~(u64)0, // // OB_CMD_COLORS = OB_LONG @@ -723,6 +730,12 @@ typedef enum enumOptions // | OB_DEST // | OB_DEST2, // +// OB_CMD_SPLIT = OB_PLUS +// | OB_IGNORE +// | OB_GRP_SCRIPT +// | OB_DEST +// | OB_DEST2, +// // OB_CMD_IS_TEXTURE = OB_IGNORE // | OB_REFERENCE // | OB_LONG, @@ -949,6 +962,7 @@ typedef enum enumCommands CMD_CONFIG, CMD_INSTALL, CMD_ARGTEST, + CMD_EXPAND, CMD_TEST, CMD_COLORS, CMD_ERROR, @@ -992,6 +1006,7 @@ typedef enum enumCommands CMD_SHA1, CMD_ANALYZE, + CMD_SPLIT, CMD_IS_TEXTURE, CMD_FEATURES, CMD_DISTRIBUTION, @@ -1031,7 +1046,7 @@ typedef enum enumCommands CMD_VEHICLE, - CMD__N // == 79 + CMD__N // == 81 } enumCommands; @@ -1087,11 +1102,15 @@ typedef enum enumGetOpt GO_COMPATIBLE, GO_WIDTH, GO_MAX_WIDTH, + GO_NO_PAGER, + GO_TIMING, GO_DE, GO_COLORS, GO_NO_COLORS, GO_CT_CODE, GO_LE_CODE, + GO_LOAD_PREFIX, + GO_PLUS, GO_CHDIR, GO_TOUCH, GO_AUTO, diff --git a/project/src/ui/ui.def b/project/src/ui/ui.def index 8e47764..ed569a1 100644 --- a/project/src/ui/ui.def +++ b/project/src/ui/ui.def @@ -43,7 +43,16 @@ #:def_cmd( "ARGTEST", "ARGTEST", \ "wszst ARGTEST ...", \ "This debug command accepts all kinds of parameters and prints one" \ - " line for each parameter." ) + " line for each parameter. All tools know the ARGTEST command." ) + +#:def_cmd( "EXPAND", "EXPAND", \ + "wszst EXPAND ...", \ + "This debug command accepts (like ARGTEST) all kinds of parameters and" \ + " prints one line for each parameter. After that, the parameter is" \ + " treated as a filename with wildcards and all matching files are" \ + " searched. The special parameters '+h' and '/h' enable or disable the" \ + " search for hidden directories and files (files beginning with a" \ + " point). All tools know the EXPAND command." ) #:def_cmd( "TEST", "TEST", \ "wszst TEST [options]... [ignored]...", \ @@ -59,19 +68,21 @@ #:def_cmd( "ERROR", "ERROR|ERR", \ "wszst ERROR [error_code]", \ "Translate an exit code to a message name. If no exit code is entered," \ - " print a table with all error messages." ) + " print a table with all error messages. All tools know the ERROR" \ + " command." ) #:def_cmd( "FILETYPE", "FILETYPE|FT", \ "wszst FILETYPE file...", \ "Scan the header of the entered files and print file type and path for" \ - " each file as list." ) + " each file as list. All tools know the FILETYPE command." ) #:def_cmd( "FILEATTRIB", "FILEATTRIB|FA", \ "wszst FILEATTRIB [keyword]...", \ "Print a table with attributes for all known file types. If at least" \ " one keyword is entered, only matching file types are printed. A" \ " keyword is either a file type (like 'BRRES' or 'BMG') or one of the" \ - " printed keywords (like 'ARCHIVE' or 'EXTRACT')." ) + " printed keywords (like 'ARCHIVE' or 'EXTRACT'). All tools know the" \ + " FILEATTRIB command." ) #:def_cmd( "BRSUB", "BRSUB", \ "wszst BRSUB [file]...", \ @@ -82,16 +93,19 @@ #:def_cmd( "SYMBOLS", "SYMBOLS", \ "wszst SYMBOLS", \ - "Print predefined symbols of text parser to standard output." ) + "Print predefined symbols of text parser to standard output. Many" \ + " tools know the SYMBOLS command." ) #:def_cmd( "FUNCTIONS", "FUNCTIONS", \ "wszst FUNCTIONS [key]...", \ "Print a list with all parser functions. If one or more keys entered," \ - " then only functions that match at least one key are printed." ) + " then only functions that match at least one key are printed. Many" \ + " tools know the FUNCTIONS command." ) #:def_cmd( "CALCULATE", "CALCULATE", \ "wszst CALCULATE expression...", \ - "Calculate each expression and print the result to standard output." ) + "Calculate each expression and print the result to standard output." \ + " Many tools know the CALCULATE command." ) #:def_cmd( "MATRIX", "MATRIX", \ "wszst MATRIX [patch-option]... [vector]...", \ @@ -252,6 +266,11 @@ "wszst ANALYZE [source]...", \ "Analyse track files and print results in machine readable format." ) +#:def_cmd( "SPLIT", "SPLIT", \ + "wszst SPLIT [source]...", \ + "Analyse (file) names and split them into the different parts. Print" \ + " the results in machine readable format." ) + #:def_cmd( "IS_TEXTURE", "IS-TEXTURE|ISTEXTURE", \ "wszst IS-TEXTURE --reference reference [source]...", \ "Test each source to see if it's a texture hack versus a reference" \ @@ -262,7 +281,7 @@ " CAME has been intentionally left out. Section ENPT is only checked" \ " if KCL contains a least one face of type force-recalculation." ) -#:def_cmd( "DISTRIBUTION", "DISTRIBUTION|DIST", \ +#:def_cmd( "DISTRIBUTION", "DISTRIBUTION|DIS|DISTRIB", \ "wszst DISTRIBUTION result source...\n" \ "wszst DISTRIBUTION directory [source]...", \ "Load each @SOURCE@ (SZS, WBZ, U8 or WU8) and calculate a checksum of" \ @@ -275,7 +294,9 @@ " directory, it is used as first source too.\n" \ " If file @RESULT@ exists, it is automatically added as last source" \ " to the list of option --source, but only if not already added. On" \ - " scanning of file @result@, parameters are scanned too." ) + " scanning of file @result@, parameters are scanned too.\n" \ + " See »welect DISTRIBUTION« for a new and alternative implementation" \ + " of this." ) #:def_cmd( "DIFF", "DIFF|CMP", \ "wszst DIFF source1 source2\n" \ @@ -537,6 +558,10 @@ " some other messages. The default is 120. This option is ignored if" \ " --width is set." ) +#:def_opt( "NO_PAGER", "no-pager|nopager", "G", \ + "", \ + "Forbid the internal usage of a pager." ) + #:def_opt( "QUIET", "q|quiet", "GM", \ "", \ "Be quiet and print only error messages. Multiple usage is possible." \ @@ -550,7 +575,13 @@ #:def_opt( "LOGGING", "L|logging", "GM", \ "", \ - "This debug option enables the logging of internal lists and maps." ) + "This debug option enables the logging of internal lists and maps. Set" \ + " it up to three times to be more verbose.\n" ) + +#:def_opt( "TIMING", "timing", "GM", \ + "", \ + "Activate the timing of some operations. Logging level 3 activates" \ + " them too.\n" ) #:def_opt( "WARN", "W|warn", "GP", \ "list", \ @@ -592,6 +623,25 @@ "Enable LE-CODE and CT-CODE support. The optional parameter is" \ " deprecated and ignored." ) +#:def_opt( "LOAD_PREFIX", "load-prefix|loadprefix", "GP", \ + "file", \ + "Read in a PREFIX file and replace the internal prefix database with" \ + " the content. https://ct.wiimm.de/export/prefix is the authoritative" \ + " source for this." ) + +#:def_opt( "PLUS", "plus", "CP", \ + "chars", \ + "If a name begins with a plus sign, then all characters up to the" \ + " first space are recognized as a plus prefix. The first part consists" \ + " of all the plus signs followed by any other characters. The first" \ + " character of the second part is used to determine the sort value. If" \ + " the second part is empty, then the last plus sign is used instead.\n" \ + " The higher sorting value is now calculated from the number of plus" \ + " signs in the first part, the more plus signs, the smaller the value." \ + " The first character from the second part determines the lower value." \ + " If it is in parameter CHARS then the position determines the value," \ + " otherwise the ASCII value to which 500 is added." ) + #:def_opt( "CHDIR", "chdir", "GMP", \ "dir", \ "Set a new working directory for all following options, for all" \ @@ -1224,7 +1274,7 @@ "", \ "Print an ID with 8 characters instead of a SHA-1 sum with 40" \ " characters. The SHA-1 sum is used to calculate the ID. The ID" \ - " consists of '0'-'9' and 'a'-'w' (32 characters)." ) + " consists of '0'-'9' and 'a'-'v' (32 different characters)." ) #:def_opt( "BASE64", "base64", "CO", \ "[=mode]", \ @@ -2264,6 +2314,10 @@ "", \ "" ) +#:def_cmd_opt( "SIZEOF", "TIMING", \ + "", \ + "" ) + #:def_cmd_opt( "SUBFILE", "DEST", \ "", \ "" ) @@ -2413,6 +2467,10 @@ "", \ "" ) +#:def_cmd_opt( "LIST", "TIMING", \ + "", \ + "" ) + #:def_cmd_opt( "LIST", "ENCODE_ALL", \ "", \ "" ) @@ -2606,6 +2664,10 @@ "", \ "" ) +#:def_cmd_opt( "LIST_L", "TIMING", \ + "", \ + "" ) + #:def_cmd_opt( "LIST_L", "ENCODE_ALL", \ "", \ "" ) @@ -2799,6 +2861,10 @@ "", \ "" ) +#:def_cmd_opt( "LIST_LL", "TIMING", \ + "", \ + "" ) + #:def_cmd_opt( "LIST_LL", "ENCODE_ALL", \ "", \ "" ) @@ -2992,6 +3058,10 @@ "", \ "" ) +#:def_cmd_opt( "LIST_LLL", "TIMING", \ + "", \ + "" ) + #:def_cmd_opt( "LIST_LLL", "ENCODE_ALL", \ "", \ "" ) @@ -3185,6 +3255,10 @@ "", \ "" ) +#:def_cmd_opt( "LIST_A", "TIMING", \ + "", \ + "" ) + #:def_cmd_opt( "LIST_A", "ENCODE_ALL", \ "", \ "" ) @@ -3378,6 +3452,10 @@ "", \ "" ) +#:def_cmd_opt( "LIST_LA", "TIMING", \ + "", \ + "" ) + #:def_cmd_opt( "LIST_LA", "ENCODE_ALL", \ "", \ "" ) @@ -3582,6 +3660,10 @@ "", \ "" ) +#:def_cmd_opt( "ILIST", "TIMING", \ + "", \ + "" ) + #:def_cmd_opt( "ILIST", "ENCODE_ALL", \ "", \ "" ) @@ -3763,6 +3845,10 @@ "", \ "" ) +#:def_cmd_opt( "ILIST_L", "TIMING", \ + "", \ + "" ) + #:def_cmd_opt( "ILIST_L", "ENCODE_ALL", \ "", \ "" ) @@ -3944,6 +4030,10 @@ "", \ "" ) +#:def_cmd_opt( "ILIST_LL", "TIMING", \ + "", \ + "" ) + #:def_cmd_opt( "ILIST_LL", "ENCODE_ALL", \ "", \ "" ) @@ -4125,6 +4215,10 @@ "", \ "" ) +#:def_cmd_opt( "ILIST_A", "TIMING", \ + "", \ + "" ) + #:def_cmd_opt( "ILIST_A", "ENCODE_ALL", \ "", \ "" ) @@ -4306,6 +4400,10 @@ "", \ "" ) +#:def_cmd_opt( "ILIST_LA", "TIMING", \ + "", \ + "" ) + #:def_cmd_opt( "ILIST_LA", "ENCODE_ALL", \ "", \ "" ) @@ -4495,6 +4593,10 @@ "", \ "" ) +#:def_cmd_opt( "MEMORY", "TIMING", \ + "", \ + "" ) + #:def_cmd_opt( "MEMORY", "ENCODE_ALL", \ "", \ "" ) @@ -4684,6 +4786,10 @@ "", \ "" ) +#:def_cmd_opt( "MEMORY_A", "TIMING", \ + "", \ + "" ) + #:def_cmd_opt( "MEMORY_A", "ENCODE_ALL", \ "", \ "" ) @@ -4844,6 +4950,10 @@ "", \ "" ) +#:def_cmd_opt( "DUMP", "TIMING", \ + "", \ + "" ) + #:def_cmd_opt( "DUMP", "ENCODE_ALL", \ "", \ "" ) @@ -5017,6 +5127,10 @@ "", \ "" ) +#:def_cmd_opt( "SHA1", "TIMING", \ + "", \ + "" ) + #:def_cmd_opt( "SHA1", "ENCODE_ALL", \ "", \ "" ) @@ -5185,6 +5299,67 @@ "", \ "" ) +#:def_cmd_opt( "SPLIT", "LOAD_PREFIX", \ + "", \ + "" ) + +#:def_cmd_opt( "SPLIT", "PLUS", \ + "", \ + "" ) + +#:def_cmd_opt( "SPLIT", "IGNORE", \ + "", \ + "" ) + +#:def_cmd_opt( "SPLIT", "SECTIONS", \ + "", \ + "Dump info using configuration or section syntax. Use {--var name} as" \ + " prefix." ) + +#:def_cmd_opt( "SPLIT", "SH", \ + "", \ + "" ) + +#:def_cmd_opt( "SPLIT", "BASH", \ + "", \ + "" ) + +#:def_cmd_opt( "SPLIT", "JSON", \ + "", \ + "" ) + +#:def_cmd_opt( "SPLIT", "PHP", \ + "", \ + "" ) + +#:def_cmd_opt( "SPLIT", "MAKEDOC", \ + "", \ + "" ) + +#:def_cmd_opt( "SPLIT", "VAR", \ + "", \ + "" ) + +#:def_cmd_opt( "SPLIT", "ARRAY", \ + "", \ + "" ) + +#:def_cmd_opt( "SPLIT", "AVAR", \ + "", \ + "" ) + +#:def_cmd_opt( "SPLIT", "CASE", \ + "", \ + "" ) + +#:def_cmd_opt( "SPLIT", "DEST", \ + "", \ + "" ) + +#:def_cmd_opt( "SPLIT", "DEST2", \ + "", \ + "" ) + #:def_cmd_opt( "IS_TEXTURE", "IGNORE", \ "", \ "" ) @@ -5371,6 +5546,10 @@ "", \ "" ) +#:def_cmd_opt( "DISTRIBUTION", "TIMING", \ + "", \ + "" ) + #:def_cmd_opt( "DISTRIBUTION", "ENCODE_ALL", \ "", \ "" ) @@ -5603,6 +5782,10 @@ "", \ "" ) +#:def_cmd_opt( "CHECK", "TIMING", \ + "", \ + "" ) + #:def_cmd_opt( "CHECK", "ENCODE_ALL", \ "", \ "" ) @@ -5944,6 +6127,10 @@ "", \ "" ) +#:def_cmd_opt( "SLOTS", "TIMING", \ + "", \ + "" ) + #:def_cmd_opt( "SLOTS", "ENCODE_ALL", \ "", \ "" ) @@ -8225,6 +8412,10 @@ "", \ "" ) +#:def_cmd_opt( "ENCODE", "TIMING", \ + "", \ + "" ) + #:def_cmd_opt( "ENCODE", "ENCODE_ALL", \ "", \ "" ) @@ -8590,6 +8781,10 @@ "", \ "" ) +#:def_cmd_opt( "CREATE", "TIMING", \ + "", \ + "" ) + #:def_cmd_opt( "CREATE", "ENCODE_ALL", \ "", \ "" ) @@ -11245,7 +11440,16 @@ #:def_cmd( "ARGTEST", "ARGTEST", \ "wbmgt ARGTEST ...", \ "This debug command accepts all kinds of parameters and prints one" \ - " line for each parameter." ) + " line for each parameter. All tools know the ARGTEST command." ) + +#:def_cmd( "EXPAND", "EXPAND", \ + "wbmgt EXPAND ...", \ + "This debug command accepts (like ARGTEST) all kinds of parameters and" \ + " prints one line for each parameter. After that, the parameter is" \ + " treated as a filename with wildcards and all matching files are" \ + " searched. The special parameters '+h' and '/h' enable or disable the" \ + " search for hidden directories and files (files beginning with a" \ + " point). All tools know the EXPAND command." ) #:def_cmd( "TEST", "TEST", \ "wbmgt TEST [options]... [ignored]...", \ @@ -11261,19 +11465,21 @@ #:def_cmd( "ERROR", "ERROR|ERR", \ "wbmgt ERROR [error_code]", \ "Translate an exit code to a message name. If no exit code is entered," \ - " print a table with all error messages." ) + " print a table with all error messages. All tools know the ERROR" \ + " command." ) #:def_cmd( "FILETYPE", "FILETYPE|FT", \ "wbmgt FILETYPE file...", \ "Scan the header of the entered files and print file type and path for" \ - " each file as list." ) + " each file as list. All tools know the FILETYPE command." ) #:def_cmd( "FILEATTRIB", "FILEATTRIB|FA", \ "wbmgt FILEATTRIB [keyword]...", \ "Print a table with attributes for all known file types. If at least" \ " one keyword is entered, only matching file types are printed. A" \ " keyword is either a file type (like 'BRRES' or 'BMG') or one of the" \ - " printed keywords (like 'ARCHIVE' or 'EXTRACT')." ) + " printed keywords (like 'ARCHIVE' or 'EXTRACT'). All tools know the" \ + " FILEATTRIB command." ) #:def_cmd( "POINTS", "POINTS|PTS", \ "wbmgt POINTS [--points=list]", \ @@ -11407,6 +11613,10 @@ " some other messages. The default is 120. This option is ignored if" \ " --width is set." ) +#:def_opt( "NO_PAGER", "no-pager|nopager", "G", \ + "", \ + "Forbid the internal usage of a pager." ) + #:def_opt( "QUIET", "q|quiet", "GM", \ "", \ "Be quiet and print only error messages. Multiple usage is possible." \ @@ -11420,7 +11630,13 @@ #:def_opt( "LOGGING", "L|logging", "GM", \ "", \ - "This debug option enables the logging of internal lists and maps." ) + "This debug option enables the logging of internal lists and maps. Set" \ + " it up to three times to be more verbose.\n" ) + +#:def_opt( "TIMING", "timing", "GM", \ + "", \ + "Activate the timing of some operations. Logging level 3 activates" \ + " them too.\n" ) #:def_opt( "WARN", "W|warn", "GP", \ "list", \ @@ -12516,7 +12732,16 @@ #:def_cmd( "ARGTEST", "ARGTEST", \ "wctct ARGTEST ...", \ "This debug command accepts all kinds of parameters and prints one" \ - " line for each parameter." ) + " line for each parameter. All tools know the ARGTEST command." ) + +#:def_cmd( "EXPAND", "EXPAND", \ + "wctct EXPAND ...", \ + "This debug command accepts (like ARGTEST) all kinds of parameters and" \ + " prints one line for each parameter. After that, the parameter is" \ + " treated as a filename with wildcards and all matching files are" \ + " searched. The special parameters '+h' and '/h' enable or disable the" \ + " search for hidden directories and files (files beginning with a" \ + " point). All tools know the EXPAND command." ) #:def_cmd( "TEST", "TEST", \ "wctct TEST [options]... [ignored]...", \ @@ -12532,19 +12757,21 @@ #:def_cmd( "ERROR", "ERROR|ERR", \ "wctct ERROR [error_code]", \ "Translate an exit code to a message name. If no exit code is entered," \ - " print a table with all error messages." ) + " print a table with all error messages. All tools know the ERROR" \ + " command." ) #:def_cmd( "FILETYPE", "FILETYPE|FT", \ "wctct FILETYPE file...", \ "Scan the header of the entered files and print file type and path for" \ - " each file as list." ) + " each file as list. All tools know the FILETYPE command." ) #:def_cmd( "FILEATTRIB", "FILEATTRIB|FA", \ "wctct FILEATTRIB [keyword]...", \ "Print a table with attributes for all known file types. If at least" \ " one keyword is entered, only matching file types are printed. A" \ " keyword is either a file type (like 'BRRES' or 'BMG') or one of the" \ - " printed keywords (like 'ARCHIVE' or 'EXTRACT')." ) + " printed keywords (like 'ARCHIVE' or 'EXTRACT'). All tools know the" \ + " FILEATTRIB command." ) #:def_cmd( "SYMBOLS", "SYMBOLS", \ "wctct SYMBOLS", \ @@ -12559,7 +12786,8 @@ #:def_cmd( "CALCULATE", "CALCULATE", \ "wctct CALCULATE expression...", \ - "Calculate each expression and print the result to standard output." ) + "Calculate each expression and print the result to standard output." \ + " Many tools know the CALCULATE command." ) #:def_cmd( "FLOAT", "FLOAT", \ "wctct FLOAT number...", \ @@ -12668,6 +12896,10 @@ " some other messages. The default is 120. This option is ignored if" \ " --width is set." ) +#:def_opt( "NO_PAGER", "no-pager|nopager", "G", \ + "", \ + "Forbid the internal usage of a pager." ) + #:def_opt( "QUIET", "q|quiet", "GM", \ "", \ "Be quiet and print only error messages. Multiple usage is possible." \ @@ -12681,7 +12913,13 @@ #:def_opt( "LOGGING", "L|logging", "GM", \ "", \ - "This debug option enables the logging of internal lists and maps." ) + "This debug option enables the logging of internal lists and maps. Set" \ + " it up to three times to be more verbose.\n" ) + +#:def_opt( "TIMING", "timing", "GM", \ + "", \ + "Activate the timing of some operations. Logging level 3 activates" \ + " them too.\n" ) #:def_opt( "WARN", "W|warn", "GP", \ "list", \ @@ -12900,6 +13138,11 @@ " give filename scanning the highest priority.\n" \ ">>> THE RESULT MAY BE INVALID OUTPUT FILES! <<<" ) +#:def_opt( "CREATE_DISTRIB", "create-distrib|createdistrib", "GP", \ + "file", \ + "Create a LE-CODE distribution dump with a track list and more info" \ + " about the current distribution. Store the dump info a file." ) + #:def_opt( "LIST", "list", "C", \ "", \ "Cancel all previous {--rel} and {--full} and enter LIST mode" \ @@ -13909,7 +14152,16 @@ #:def_cmd( "ARGTEST", "ARGTEST", \ "wimgt ARGTEST ...", \ "This debug command accepts all kinds of parameters and prints one" \ - " line for each parameter." ) + " line for each parameter. All tools know the ARGTEST command." ) + +#:def_cmd( "EXPAND", "EXPAND", \ + "wimgt EXPAND ...", \ + "This debug command accepts (like ARGTEST) all kinds of parameters and" \ + " prints one line for each parameter. After that, the parameter is" \ + " treated as a filename with wildcards and all matching files are" \ + " searched. The special parameters '+h' and '/h' enable or disable the" \ + " search for hidden directories and files (files beginning with a" \ + " point). All tools know the EXPAND command." ) #:def_cmd( "TEST", "TEST", \ "wimgt TEST [options]... [ignored]...", \ @@ -13925,19 +14177,21 @@ #:def_cmd( "ERROR", "ERROR|ERR", \ "wimgt ERROR [error_code]", \ "Translate an exit code to a message name. If no exit code is entered," \ - " print a table with all error messages." ) + " print a table with all error messages. All tools know the ERROR" \ + " command." ) #:def_cmd( "FILETYPE", "FILETYPE|FT", \ "wimgt FILETYPE file...", \ "Scan the header of the entered files and print file type and path for" \ - " each file as list." ) + " each file as list. All tools know the FILETYPE command." ) #:def_cmd( "FILEATTRIB", "FILEATTRIB|FA", \ "wimgt FILEATTRIB [keyword]...", \ "Print a table with attributes for all known file types. If at least" \ " one keyword is entered, only matching file types are printed. A" \ " keyword is either a file type (like 'BRRES' or 'BMG') or one of the" \ - " printed keywords (like 'ARCHIVE' or 'EXTRACT')." ) + " printed keywords (like 'ARCHIVE' or 'EXTRACT'). All tools know the" \ + " FILEATTRIB command." ) #:def_cmd( "LIST", "LIST|LS", \ "wimgt LIST [source]...", \ @@ -14030,6 +14284,10 @@ " some other messages. The default is 120. This option is ignored if" \ " --width is set." ) +#:def_opt( "NO_PAGER", "no-pager|nopager", "G", \ + "", \ + "Forbid the internal usage of a pager." ) + #:def_opt( "QUIET", "q|quiet", "GM", \ "", \ "Be quiet and print only error messages. Multiple usage is possible." \ @@ -14043,7 +14301,13 @@ #:def_opt( "LOGGING", "L|logging", "GM", \ "", \ - "This debug option enables the logging of internal lists and maps." ) + "This debug option enables the logging of internal lists and maps. Set" \ + " it up to three times to be more verbose.\n" ) + +#:def_opt( "TIMING", "timing", "GM", \ + "", \ + "Activate the timing of some operations. Logging level 3 activates" \ + " them too.\n" ) #:def_opt( "WARN", "W|warn", "GP", \ "list", \ @@ -14810,7 +15074,16 @@ #:def_cmd( "ARGTEST", "ARGTEST", \ "wkclt ARGTEST ...", \ "This debug command accepts all kinds of parameters and prints one" \ - " line for each parameter." ) + " line for each parameter. All tools know the ARGTEST command." ) + +#:def_cmd( "EXPAND", "EXPAND", \ + "wkclt EXPAND ...", \ + "This debug command accepts (like ARGTEST) all kinds of parameters and" \ + " prints one line for each parameter. After that, the parameter is" \ + " treated as a filename with wildcards and all matching files are" \ + " searched. The special parameters '+h' and '/h' enable or disable the" \ + " search for hidden directories and files (files beginning with a" \ + " point). All tools know the EXPAND command." ) #:def_cmd( "TEST", "TEST", \ "wkclt TEST [options]... [ignored]...", \ @@ -14826,19 +15099,21 @@ #:def_cmd( "ERROR", "ERROR|ERR", \ "wkclt ERROR [error_code]", \ "Translate an exit code to a message name. If no exit code is entered," \ - " print a table with all error messages." ) + " print a table with all error messages. All tools know the ERROR" \ + " command." ) #:def_cmd( "FILETYPE", "FILETYPE|FT", \ "wkclt FILETYPE file...", \ "Scan the header of the entered files and print file type and path for" \ - " each file as list." ) + " each file as list. All tools know the FILETYPE command." ) #:def_cmd( "FILEATTRIB", "FILEATTRIB|FA", \ "wkclt FILEATTRIB [keyword]...", \ "Print a table with attributes for all known file types. If at least" \ " one keyword is entered, only matching file types are printed. A" \ " keyword is either a file type (like 'BRRES' or 'BMG') or one of the" \ - " printed keywords (like 'ARCHIVE' or 'EXTRACT')." ) + " printed keywords (like 'ARCHIVE' or 'EXTRACT'). All tools know the" \ + " FILEATTRIB command." ) #:def_cmd( "SYMBOLS", "SYMBOLS", \ "wkclt SYMBOLS", \ @@ -14853,7 +15128,8 @@ #:def_cmd( "CALCULATE", "CALCULATE", \ "wkclt CALCULATE expression...", \ - "Calculate each expression and print the result to standard output." ) + "Calculate each expression and print the result to standard output." \ + " Many tools know the CALCULATE command." ) #:def_cmd( "MATRIX", "MATRIX", \ "wkclt MATRIX [patch-option]... [vector]...", \ @@ -15035,6 +15311,10 @@ " some other messages. The default is 120. This option is ignored if" \ " --width is set." ) +#:def_opt( "NO_PAGER", "no-pager|nopager", "G", \ + "", \ + "Forbid the internal usage of a pager." ) + #:def_opt( "QUIET", "q|quiet", "GM", \ "", \ "Be quiet and print only error messages. Multiple usage is possible." \ @@ -15048,7 +15328,13 @@ #:def_opt( "LOGGING", "L|logging", "GM", \ "", \ - "This debug option enables the logging of internal lists and maps." ) + "This debug option enables the logging of internal lists and maps. Set" \ + " it up to three times to be more verbose.\n" ) + +#:def_opt( "TIMING", "timing", "GM", \ + "", \ + "Activate the timing of some operations. Logging level 3 activates" \ + " them too.\n" ) #:def_opt( "WARN", "W|warn", "GP", \ "list", \ @@ -15337,7 +15623,7 @@ "", \ "Print an ID with 8 characters instead of a SHA-1 sum with 40" \ " characters. The SHA-1 sum is used to calculate the ID. The ID" \ - " consists of '0'-'9' and 'a'-'w' (32 characters)." ) + " consists of '0'-'9' and 'a'-'v' (32 different characters)." ) #:def_opt( "BASE64", "base64", "CO", \ "[=mode]", \ @@ -17322,7 +17608,16 @@ #:def_cmd( "ARGTEST", "ARGTEST", \ "wkmpt ARGTEST ...", \ "This debug command accepts all kinds of parameters and prints one" \ - " line for each parameter." ) + " line for each parameter. All tools know the ARGTEST command." ) + +#:def_cmd( "EXPAND", "EXPAND", \ + "wkmpt EXPAND ...", \ + "This debug command accepts (like ARGTEST) all kinds of parameters and" \ + " prints one line for each parameter. After that, the parameter is" \ + " treated as a filename with wildcards and all matching files are" \ + " searched. The special parameters '+h' and '/h' enable or disable the" \ + " search for hidden directories and files (files beginning with a" \ + " point). All tools know the EXPAND command." ) #:def_cmd( "TEST", "TEST", \ "wkmpt TEST [options]... [ignored]...", \ @@ -17338,19 +17633,21 @@ #:def_cmd( "ERROR", "ERROR|ERR", \ "wkmpt ERROR [error_code]", \ "Translate an exit code to a message name. If no exit code is entered," \ - " print a table with all error messages." ) + " print a table with all error messages. All tools know the ERROR" \ + " command." ) #:def_cmd( "FILETYPE", "FILETYPE|FT", \ "wkmpt FILETYPE file...", \ "Scan the header of the entered files and print file type and path for" \ - " each file as list." ) + " each file as list. All tools know the FILETYPE command." ) #:def_cmd( "FILEATTRIB", "FILEATTRIB|FA", \ "wkmpt FILEATTRIB [keyword]...", \ "Print a table with attributes for all known file types. If at least" \ " one keyword is entered, only matching file types are printed. A" \ " keyword is either a file type (like 'BRRES' or 'BMG') or one of the" \ - " printed keywords (like 'ARCHIVE' or 'EXTRACT')." ) + " printed keywords (like 'ARCHIVE' or 'EXTRACT'). All tools know the" \ + " FILEATTRIB command." ) #:def_cmd( "SYMBOLS", "SYMBOLS", \ "wkmpt SYMBOLS", \ @@ -17365,7 +17662,8 @@ #:def_cmd( "CALCULATE", "CALCULATE", \ "wkmpt CALCULATE expression...", \ - "Calculate each expression and print the result to standard output." ) + "Calculate each expression and print the result to standard output." \ + " Many tools know the CALCULATE command." ) #:def_cmd( "MATRIX", "MATRIX", \ "wkmpt MATRIX [patch-option]... [vector]...", \ @@ -17542,6 +17840,10 @@ " some other messages. The default is 120. This option is ignored if" \ " --width is set." ) +#:def_opt( "NO_PAGER", "no-pager|nopager", "G", \ + "", \ + "Forbid the internal usage of a pager." ) + #:def_opt( "QUIET", "q|quiet", "GM", \ "", \ "Be quiet and print only error messages. Multiple usage is possible." \ @@ -17555,7 +17857,13 @@ #:def_opt( "LOGGING", "L|logging", "GM", \ "", \ - "This debug option enables the logging of internal lists and maps." ) + "This debug option enables the logging of internal lists and maps. Set" \ + " it up to three times to be more verbose.\n" ) + +#:def_opt( "TIMING", "timing", "GM", \ + "", \ + "Activate the timing of some operations. Logging level 3 activates" \ + " them too.\n" ) #:def_opt( "WARN", "W|warn", "GP", \ "list", \ @@ -19442,7 +19750,16 @@ #:def_cmd( "ARGTEST", "ARGTEST", \ "wlect ARGTEST ...", \ "This debug command accepts all kinds of parameters and prints one" \ - " line for each parameter." ) + " line for each parameter. All tools know the ARGTEST command." ) + +#:def_cmd( "EXPAND", "EXPAND", \ + "wlect EXPAND ...", \ + "This debug command accepts (like ARGTEST) all kinds of parameters and" \ + " prints one line for each parameter. After that, the parameter is" \ + " treated as a filename with wildcards and all matching files are" \ + " searched. The special parameters '+h' and '/h' enable or disable the" \ + " search for hidden directories and files (files beginning with a" \ + " point). All tools know the EXPAND command." ) #:def_cmd( "TEST", "TEST", \ "wlect TEST [options]... [ignored]...", \ @@ -19458,19 +19775,21 @@ #:def_cmd( "ERROR", "ERROR|ERR", \ "wlect ERROR [error_code]", \ "Translate an exit code to a message name. If no exit code is entered," \ - " print a table with all error messages." ) + " print a table with all error messages. All tools know the ERROR" \ + " command." ) #:def_cmd( "FILETYPE", "FILETYPE|FT", \ "wlect FILETYPE file...", \ "Scan the header of the entered files and print file type and path for" \ - " each file as list." ) + " each file as list. All tools know the FILETYPE command." ) #:def_cmd( "FILEATTRIB", "FILEATTRIB|FA", \ "wlect FILEATTRIB [keyword]...", \ "Print a table with attributes for all known file types. If at least" \ " one keyword is entered, only matching file types are printed. A" \ " keyword is either a file type (like 'BRRES' or 'BMG') or one of the" \ - " printed keywords (like 'ARCHIVE' or 'EXTRACT')." ) + " printed keywords (like 'ARCHIVE' or 'EXTRACT'). All tools know the" \ + " FILEATTRIB command." ) #:def_cmd( "SYMBOLS", "SYMBOLS", \ "wlect SYMBOLS", \ @@ -19485,7 +19804,8 @@ #:def_cmd( "CALCULATE", "CALCULATE", \ "wlect CALCULATE expression...", \ - "Calculate each expression and print the result to standard output." ) + "Calculate each expression and print the result to standard output." \ + " Many tools know the CALCULATE command." ) #:def_cmd( "FLOAT", "FLOAT", \ "wlect FLOAT number...", \ @@ -19536,15 +19856,21 @@ " standard output if no other destination is defined." ) #:def_cmd( "CREATE", "CREATE|CR", \ - "wlect CREATE [keyword]", \ - "Create a file and print it to standard output. The kind of file is" \ - " defined by KEYWORD. Use command without keywords to get a list of" \ - " possible keywords.\n" \ - " The following keywords are possible: @LEX@ for a LEX text file with" \ - " all known sections except @TEST@. @LEX+@ for a LEX text file with" \ - " all known sections including @TEST@. @SET1, CANN, HIPT@ and @TEST@" \ - " (section names) for a LEX text file with 1 section only. @LPAR@ for" \ - " an example LE-CODE parameter file." ) + "wlect CREATE [keyword] ...", \ + "Create a file and print it to standard output. Options {--dest} and" \ + " {--DEST} can forc another destination. The kind of file is defined" \ + " by KEYWORD. The command can create LEX files, a LPAR file or a track" \ + " listing.\n" \ + " Use the command without keyword to get an extended description." ) + +#:def_cmd( "DISTRIBUTION", "DISTRIBUTION|DIS|DISTRIB", \ + "wlect DISTRIBUTION [argument]...", \ + "This command manages data for LE-CODE track distributions. It reads" \ + " any number of source files with different file types, collects the" \ + " data and creates any number of files with different file types.\n" \ + " Use the command without keyword to get an extended description.\n" \ + " This command is still under development. Its use is therefore" \ + " EXPERIMENTAL!" ) #:def_cmd( "CAT", "CAT", \ "wlect CAT [source]...", \ @@ -19611,6 +19937,10 @@ " some other messages. The default is 120. This option is ignored if" \ " --width is set." ) +#:def_opt( "NO_PAGER", "no-pager|nopager", "G", \ + "", \ + "Forbid the internal usage of a pager." ) + #:def_opt( "QUIET", "q|quiet", "GM", \ "", \ "Be quiet and print only error messages. Multiple usage is possible." \ @@ -19624,7 +19954,13 @@ #:def_opt( "LOGGING", "L|logging", "GM", \ "", \ - "This debug option enables the logging of internal lists and maps." ) + "This debug option enables the logging of internal lists and maps. Set" \ + " it up to three times to be more verbose.\n" ) + +#:def_opt( "TIMING", "timing", "GM", \ + "", \ + "Activate the timing of some operations. Logging level 3 activates" \ + " them too.\n" ) #:def_opt( "WARN", "W|warn", "GP", \ "list", \ @@ -19666,6 +20002,25 @@ "This option is completely ignored by wlect. It only exists due to" \ " compatibility with the other tools." ) +#:def_opt( "LOAD_PREFIX", "load-prefix|loadprefix", "GP", \ + "file", \ + "Read in a PREFIX file and replace the internal prefix database with" \ + " the content. https://ct.wiimm.de/export/prefix is the authoritative" \ + " source for this." ) + +#:def_opt( "PLUS", "plus", "CP", \ + "chars", \ + "If a name begins with a plus sign, then all characters up to the" \ + " first space are recognized as a plus prefix. The first part consists" \ + " of all the plus signs followed by any other characters. The first" \ + " character of the second part is used to determine the sort value. If" \ + " the second part is empty, then the last plus sign is used instead.\n" \ + " The higher sorting value is now calculated from the number of plus" \ + " signs in the first part, the more plus signs, the smaller the value." \ + " The first character from the second part determines the lower value." \ + " If it is in parameter CHARS then the position determines the value," \ + " otherwise the ASCII value to which 500 is added." ) + #:def_opt( "CHDIR", "chdir", "GMP", \ "dir", \ "Set a new working directory for all following options, for all" \ @@ -19792,6 +20147,11 @@ " give filename scanning the highest priority.\n" \ ">>> THE RESULT MAY BE INVALID OUTPUT FILES! <<<" ) +#:def_opt( "CREATE_DISTRIB", "create-distrib|createdistrib", "CP", \ + "file", \ + "Create a LE-CODE distribution dump with a track list and more info" \ + " about the current distribution. Store the dump info a file." ) + #:def_opt( "LE_DEFINE", "le-define|ledefine", "CP", \ "file", \ "Use this file as definition file to patch LE-CODE. The file format" \ @@ -19892,6 +20252,15 @@ " this directory are linked to the directory specified by option" \ " {--track-dir}. If linking fails, the file is copied." ) +#:def_opt( "SZS_MODE", "szs-mode|szsmode", "CP", \ + "mode", \ + "If a track is inserted via the SZS file, then the associated" \ + " directory is automatically included in the list of search" \ + " directories for option {--track-dir}. This option now sets the" \ + " transfer mode. @OFF@ turns this feature off. The values @COPY@," \ + " @MOVE@, @MOVE1@ and @LINK@ define one of the 4 modes. Default mode" \ + " is @LINK@." ) + #:def_opt( "COMPLETE", "C|complete", "C", \ "", \ " Append missing sections to the LEX file." ) @@ -20162,6 +20531,10 @@ "", \ "For LE-CODE binaries: If set, print a track slot usage table." ) +#:def_cmd_opt( "DUMP", "CREATE_DISTRIB", \ + "", \ + "" ) + #:def_cmd_opt( "DL", "LE_DEFINE", \ "", \ "" ) @@ -20215,6 +20588,10 @@ "", \ "For LE-CODE binaries: If set, print a track slot usage table." ) +#:def_cmd_opt( "DL", "CREATE_DISTRIB", \ + "", \ + "" ) + #:def_cmd_opt( "DLL", "LE_DEFINE", \ "", \ "" ) @@ -20268,6 +20645,10 @@ "", \ "For LE-CODE binaries: If set, print a track slot usage table." ) +#:def_cmd_opt( "DLL", "CREATE_DISTRIB", \ + "", \ + "" ) + #:def_cmd_opt( "BIN_DIFF", "QUIET", \ "", \ "Suppress all messages and tell result as exit status only." ) @@ -20372,6 +20753,10 @@ "", \ "" ) +#:def_cmd_opt( "PATCH", "CREATE_DISTRIB", \ + "", \ + "" ) + #:def_cmd_opt( "LPAR", "LE_DEFINE", \ "", \ "" ) @@ -20548,6 +20933,14 @@ "", \ "" ) +#:def_cmd_opt( "CREATE", "LE_DEFINE", \ + "", \ + "" ) + +#:def_cmd_opt( "CREATE", "LOAD_BMG", \ + "", \ + "" ) + #:def_cmd_opt( "CREATE", "ENGINE", \ "", \ "" ) @@ -20576,6 +20969,86 @@ "", \ "" ) +#:def_cmd_opt( "DISTRIBUTION", "LOAD_PREFIX", \ + "", \ + "" ) + +#:def_cmd_opt( "DISTRIBUTION", "PLUS", \ + "", \ + "" ) + +#:def_cmd_opt( "DISTRIBUTION", "TRACK_DIR", \ + "", \ + "" ) + +#:def_cmd_opt( "DISTRIBUTION", "COPY_TRACKS", \ + "", \ + "" ) + +#:def_cmd_opt( "DISTRIBUTION", "MOVE_TRACKS", \ + "", \ + "" ) + +#:def_cmd_opt( "DISTRIBUTION", "MOVE1_TRACKS", \ + "", \ + "" ) + +#:def_cmd_opt( "DISTRIBUTION", "LINK_TRACKS", \ + "", \ + "" ) + +#:def_cmd_opt( "DISTRIBUTION", "SZS_MODE", \ + "", \ + "" ) + +#:def_cmd_opt( "DISTRIBUTION", "IGNORE", \ + "", \ + "" ) + +#:def_cmd_opt( "DISTRIBUTION", "NO_HEADER", \ + "", \ + "Suppress the syntax information section in LE text files." ) + +#:def_cmd_opt( "DISTRIBUTION", "BRIEF", \ + "", \ + "" ) + +#:def_cmd_opt( "DISTRIBUTION", "EXPORT", \ + "", \ + "" ) + +#:def_cmd_opt( "DISTRIBUTION", "DEST", \ + "", \ + "" ) + +#:def_cmd_opt( "DISTRIBUTION", "DEST2", \ + "", \ + "" ) + +#:def_cmd_opt( "DISTRIBUTION", "ESC", \ + "", \ + "" ) + +#:def_cmd_opt( "DISTRIBUTION", "OVERWRITE", \ + "", \ + "" ) + +#:def_cmd_opt( "DISTRIBUTION", "NUMBER", \ + "", \ + "" ) + +#:def_cmd_opt( "DISTRIBUTION", "REMOVE_DEST", \ + "", \ + "" ) + +#:def_cmd_opt( "DISTRIBUTION", "UPDATE", \ + "", \ + "" ) + +#:def_cmd_opt( "DISTRIBUTION", "PRESERVE", \ + "", \ + "" ) + #:def_cmd_opt( "CAT", "COMPLETE", \ "", \ "" ) @@ -20737,7 +21210,16 @@ #:def_cmd( "ARGTEST", "ARGTEST", \ "wmdlt ARGTEST ...", \ "This debug command accepts all kinds of parameters and prints one" \ - " line for each parameter." ) + " line for each parameter. All tools know the ARGTEST command." ) + +#:def_cmd( "EXPAND", "EXPAND", \ + "wmdlt EXPAND ...", \ + "This debug command accepts (like ARGTEST) all kinds of parameters and" \ + " prints one line for each parameter. After that, the parameter is" \ + " treated as a filename with wildcards and all matching files are" \ + " searched. The special parameters '+h' and '/h' enable or disable the" \ + " search for hidden directories and files (files beginning with a" \ + " point). All tools know the EXPAND command." ) #:def_cmd( "TEST", "TEST", \ "wmdlt TEST [options]... [ignored]...", \ @@ -20753,19 +21235,21 @@ #:def_cmd( "ERROR", "ERROR|ERR", \ "wmdlt ERROR [error_code]", \ "Translate an exit code to a message name. If no exit code is entered," \ - " print a table with all error messages." ) + " print a table with all error messages. All tools know the ERROR" \ + " command." ) #:def_cmd( "FILETYPE", "FILETYPE|FT", \ "wmdlt FILETYPE file...", \ "Scan the header of the entered files and print file type and path for" \ - " each file as list." ) + " each file as list. All tools know the FILETYPE command." ) #:def_cmd( "FILEATTRIB", "FILEATTRIB|FA", \ "wmdlt FILEATTRIB [keyword]...", \ "Print a table with attributes for all known file types. If at least" \ " one keyword is entered, only matching file types are printed. A" \ " keyword is either a file type (like 'BRRES' or 'BMG') or one of the" \ - " printed keywords (like 'ARCHIVE' or 'EXTRACT')." ) + " printed keywords (like 'ARCHIVE' or 'EXTRACT'). All tools know the" \ + " FILEATTRIB command." ) #:def_cmd( "SYMBOLS", "SYMBOLS", \ "wmdlt SYMBOLS", \ @@ -20780,7 +21264,8 @@ #:def_cmd( "CALCULATE", "CALCULATE", \ "wmdlt CALCULATE expression...", \ - "Calculate each expression and print the result to standard output." ) + "Calculate each expression and print the result to standard output." \ + " Many tools know the CALCULATE command." ) #:def_cmd( "MATRIX", "MATRIX", \ "wmdlt MATRIX [patch-option]... [vector]...", \ @@ -20882,6 +21367,10 @@ " some other messages. The default is 120. This option is ignored if" \ " --width is set." ) +#:def_opt( "NO_PAGER", "no-pager|nopager", "G", \ + "", \ + "Forbid the internal usage of a pager." ) + #:def_opt( "QUIET", "q|quiet", "GM", \ "", \ "Be quiet and print only error messages. Multiple usage is possible." \ @@ -20895,7 +21384,13 @@ #:def_opt( "LOGGING", "L|logging", "GM", \ "", \ - "This debug option enables the logging of internal lists and maps." ) + "This debug option enables the logging of internal lists and maps. Set" \ + " it up to three times to be more verbose.\n" ) + +#:def_opt( "TIMING", "timing", "GM", \ + "", \ + "Activate the timing of some operations. Logging level 3 activates" \ + " them too.\n" ) #:def_opt( "WARN", "W|warn", "GP", \ "list", \ @@ -22025,7 +22520,16 @@ #:def_cmd( "ARGTEST", "ARGTEST", \ "wpatt ARGTEST ...", \ "This debug command accepts all kinds of parameters and prints one" \ - " line for each parameter." ) + " line for each parameter. All tools know the ARGTEST command." ) + +#:def_cmd( "EXPAND", "EXPAND", \ + "wpatt EXPAND ...", \ + "This debug command accepts (like ARGTEST) all kinds of parameters and" \ + " prints one line for each parameter. After that, the parameter is" \ + " treated as a filename with wildcards and all matching files are" \ + " searched. The special parameters '+h' and '/h' enable or disable the" \ + " search for hidden directories and files (files beginning with a" \ + " point). All tools know the EXPAND command." ) #:def_cmd( "TEST", "TEST", \ "wpatt TEST [options]... [ignored]...", \ @@ -22041,19 +22545,21 @@ #:def_cmd( "ERROR", "ERROR|ERR", \ "wpatt ERROR [error_code]", \ "Translate an exit code to a message name. If no exit code is entered," \ - " print a table with all error messages." ) + " print a table with all error messages. All tools know the ERROR" \ + " command." ) #:def_cmd( "FILETYPE", "FILETYPE|FT", \ "wpatt FILETYPE file...", \ "Scan the header of the entered files and print file type and path for" \ - " each file as list." ) + " each file as list. All tools know the FILETYPE command." ) #:def_cmd( "FILEATTRIB", "FILEATTRIB|FA", \ "wpatt FILEATTRIB [keyword]...", \ "Print a table with attributes for all known file types. If at least" \ " one keyword is entered, only matching file types are printed. A" \ " keyword is either a file type (like 'BRRES' or 'BMG') or one of the" \ - " printed keywords (like 'ARCHIVE' or 'EXTRACT')." ) + " printed keywords (like 'ARCHIVE' or 'EXTRACT'). All tools know the" \ + " FILEATTRIB command." ) #:def_cmd( "SYMBOLS", "SYMBOLS", \ "wpatt SYMBOLS", \ @@ -22068,7 +22574,8 @@ #:def_cmd( "CALCULATE", "CALCULATE", \ "wpatt CALCULATE expression...", \ - "Calculate each expression and print the result to standard output." ) + "Calculate each expression and print the result to standard output." \ + " Many tools know the CALCULATE command." ) #:def_cmd( "FLOAT", "FLOAT", \ "wpatt FLOAT number...", \ @@ -22147,6 +22654,10 @@ " some other messages. The default is 120. This option is ignored if" \ " --width is set." ) +#:def_opt( "NO_PAGER", "no-pager|nopager", "G", \ + "", \ + "Forbid the internal usage of a pager." ) + #:def_opt( "QUIET", "q|quiet", "GM", \ "", \ "Be quiet and print only error messages. Multiple usage is possible." \ @@ -22160,7 +22671,13 @@ #:def_opt( "LOGGING", "L|logging", "GM", \ "", \ - "This debug option enables the logging of internal lists and maps." ) + "This debug option enables the logging of internal lists and maps. Set" \ + " it up to three times to be more verbose.\n" ) + +#:def_opt( "TIMING", "timing", "GM", \ + "", \ + "Activate the timing of some operations. Logging level 3 activates" \ + " them too.\n" ) #:def_opt( "WARN", "W|warn", "GP", \ "list", \ @@ -22616,7 +23133,16 @@ #:def_cmd( "ARGTEST", "ARGTEST", \ "wstrt ARGTEST ...", \ "This debug command accepts all kinds of parameters and prints one" \ - " line for each parameter." ) + " line for each parameter. All tools know the ARGTEST command." ) + +#:def_cmd( "EXPAND", "EXPAND", \ + "wstrt EXPAND ...", \ + "This debug command accepts (like ARGTEST) all kinds of parameters and" \ + " prints one line for each parameter. After that, the parameter is" \ + " treated as a filename with wildcards and all matching files are" \ + " searched. The special parameters '+h' and '/h' enable or disable the" \ + " search for hidden directories and files (files beginning with a" \ + " point). All tools know the EXPAND command." ) #:def_cmd( "TEST", "TEST", \ "wstrt TEST [options]... [ignored]...", \ @@ -22632,19 +23158,21 @@ #:def_cmd( "ERROR", "ERROR|ERR", \ "wstrt ERROR [error_code]", \ "Translate an exit code to a message name. If no exit code is entered," \ - " print a table with all error messages." ) + " print a table with all error messages. All tools know the ERROR" \ + " command." ) #:def_cmd( "FILETYPE", "FILETYPE|FT", \ "wstrt FILETYPE file...", \ "Scan the header of the entered files and print file type and path for" \ - " each file as list." ) + " each file as list. All tools know the FILETYPE command." ) #:def_cmd( "FILEATTRIB", "FILEATTRIB|FA", \ "wstrt FILEATTRIB [keyword]...", \ "Print a table with attributes for all known file types. If at least" \ " one keyword is entered, only matching file types are printed. A" \ " keyword is either a file type (like 'BRRES' or 'BMG') or one of the" \ - " printed keywords (like 'ARCHIVE' or 'EXTRACT')." ) + " printed keywords (like 'ARCHIVE' or 'EXTRACT'). All tools know the" \ + " FILEATTRIB command." ) #:def_cmd( "DUMP", "DUMP", \ "wstrt DUMP file...", \ @@ -22772,6 +23300,10 @@ " some other messages. The default is 120. This option is ignored if" \ " --width is set." ) +#:def_opt( "NO_PAGER", "no-pager|nopager", "G", \ + "", \ + "Forbid the internal usage of a pager." ) + #:def_opt( "QUIET", "q|quiet", "GM", \ "", \ "Be quiet and print only error messages. Multiple usage is possible." \ @@ -22785,7 +23317,13 @@ #:def_opt( "LOGGING", "L|logging", "GM", \ "", \ - "This debug option enables the logging of internal lists and maps." ) + "This debug option enables the logging of internal lists and maps. Set" \ + " it up to three times to be more verbose.\n" ) + +#:def_opt( "TIMING", "timing", "GM", \ + "", \ + "Activate the timing of some operations. Logging level 3 activates" \ + " them too.\n" ) #:def_opt( "WARN", "W|warn", "GP", \ "list", \ @@ -23414,6 +23952,10 @@ "", \ "" ) +#:def_cmd_opt( "HEXDUMP", "TIMING", \ + "", \ + "" ) + #:def_cmd_opt( "HEXDUMP", "INT1", \ "", \ "" ) diff --git a/project/src/wbmgt.c b/project/src/wbmgt.c index 58ca368..530c28f 100644 --- a/project/src/wbmgt.c +++ b/project/src/wbmgt.c @@ -771,13 +771,15 @@ static enumError CheckOptions ( int argc, char ** argv, bool is_env ) case GO_COMPATIBLE: err += ScanOptCompatible(optarg); break; case GO_WIDTH: err += ScanOptWidth(optarg); break; case GO_MAX_WIDTH: err += ScanOptMaxWidth(optarg); break; + case GO_NO_PAGER: opt_no_pager = true; break; case GO_QUIET: verbose = verbose > -1 ? -1 : verbose - 1; break; case GO_VERBOSE: verbose = verbose < 0 ? 0 : verbose + 1; break; case GO_LOGGING: logging++; break; + case GO_TIMING: log_timing++; break; case GO_WARN: err += ScanOptWarn(optarg); break; case GO_DE: use_de = true; break; case GO_CT_CODE: ctcode_enabled = true; break; - case GO_LE_CODE: lecode_enabled = true; break; + case GO_LE_CODE: lecode_enabled = true; break; // optional argument ignored case GO_COLORS: err += ScanOptColorize(0,optarg,0); break; case GO_NO_COLORS: opt_colorize = COLMD_OFF; break; @@ -893,6 +895,7 @@ static enumError CheckCommand ( int argc, char ** argv ) case CMD_HELP: PrintHelpColor(&InfoUI_wbmgt); break; case CMD_CONFIG: err = cmd_config(); break; case CMD_ARGTEST: err = cmd_argtest(argc,argv); break; + case CMD_EXPAND: err = cmd_expand(argc,argv); break; case CMD_TEST: err = cmd_test(); break; case CMD_COLORS: err = Command_COLORS(brief_count?-brief_count:long_count,0,0); break; case CMD_ERROR: err = cmd_error(); break; @@ -936,6 +939,15 @@ static enumError CheckCommand ( int argc, char ** argv ) int main ( int argc, char ** argv ) #endif { + #if !SZS_WRAPPER + ArgManager_t am = {0}; + SetupArgManager(&am,LOUP_AUTO,argc,argv,false); + ExpandAtArgManager(&am,AMXM_SHORT,10,false); + argc = am.argc; + argv = am.argv; + #endif + + tool_name = "wbmgt"; print_title_func = print_title; SetupLib(argc,argv,WBMGT_SHORT,VERSION,TITLE); @@ -961,6 +973,7 @@ static enumError CheckCommand ( int argc, char ** argv ) if (SIGINT_level) err = ERROR0(ERR_INTERRUPT,"Program interrupted by user."); + ClosePager(); return err; } diff --git a/project/src/wctct.c b/project/src/wctct.c index 82bd675..73652d9 100644 --- a/project/src/wctct.c +++ b/project/src/wctct.c @@ -36,6 +36,7 @@ ***************************************************************************/ #include "lib-ctcode.h" +#include "lib-ledis.h" #include "lib-szs.h" #include "lib-xbmg.h" #include "lib-bzip2.h" @@ -363,7 +364,7 @@ static enumError cmd_decode() char dest[PATH_MAX]; SubstDest(dest,sizeof(dest),param->arg,opt_dest,def_path, - GetExtFF(FF_CT_TEXT,0),false); + GetExtFF(FF_CTDEF,0),false); if ( verbose >= 0 || testmode ) { @@ -371,7 +372,7 @@ static enumError cmd_decode() verbose > 0 ? "\n" : "", testmode ? "WOULD " : "", GetNameFF(raw.fform,0), raw.fname, - GetNameFF(FF_CT_TEXT,0), dest ); + GetNameFF(FF_CTDEF,0), dest ); fflush(stdlog); } @@ -586,7 +587,7 @@ static enumError cmd_create() case CTS_LIST: case CTS_REF: case CTS_FULL: - dest_ff2 = FF_CT_TEXT; + dest_ff2 = FF_CTDEF; def_path = "\1P/\1F\1?T"; break; } @@ -602,7 +603,7 @@ static enumError cmd_create() for ( ; param; param = param->next ) { NORMALIZE_FILENAME_PARAM(param); - enumError err = LoadRawData(&raw,false,param->arg,0,opt_ignore>0,FF_CT_TEXT); + enumError err = LoadRawData(&raw,false,param->arg,0,opt_ignore>0,FF_CTDEF); if ( err == ERR_NOT_EXISTS || err > ERR_WARNING && opt_ignore ) continue; if ( err > ERR_WARNING ) @@ -748,16 +749,18 @@ static enumError CheckOptions ( int argc, char ** argv, bool is_env ) case GO_COMPATIBLE: err += ScanOptCompatible(optarg); break; case GO_WIDTH: err += ScanOptWidth(optarg); break; case GO_MAX_WIDTH: err += ScanOptMaxWidth(optarg); break; + case GO_NO_PAGER: opt_no_pager = true; break; case GO_QUIET: verbose = verbose > -1 ? -1 : verbose - 1; break; case GO_VERBOSE: verbose = verbose < 0 ? 0 : verbose + 1; break; case GO_LOGGING: logging++; break; + case GO_TIMING: log_timing++; break; case GO_WARN: err += ScanOptWarn(optarg); break; case GO_DE: use_de = true; break; case GO_COLORS: err += ScanOptColorize(0,optarg,0); break; case GO_NO_COLORS: opt_colorize = COLMD_OFF; break; case GO_CT_CODE: ctcode_enabled = true; break; - case GO_LE_CODE: lecode_enabled = true; break; + case GO_LE_CODE: lecode_enabled = true; break; // optional argument ignored case GO_OLD_SPINY: old_spiny = true; break; case GO_CRS1: err += ScanOptCRS1(optarg); break; @@ -770,6 +773,7 @@ static enumError CheckOptions ( int argc, char ** argv, bool is_env ) case GO_TEST: testmode++; break; case GO_FORCE: force_count++; break; case GO_REPAIR_MAGICS: err += ScanOptRepairMagic(optarg); break; + case GO_CREATE_DISTRIB: EnableLDUMP(optarg); break; #if OPT_OLD_NEW case GO_OLD: opt_new = opt_new>0 ? -1 : opt_new-1; break; @@ -898,6 +902,7 @@ static enumError CheckCommand ( int argc, char ** argv ) case CMD_HELP: PrintHelpColor(&InfoUI_wctct); break; case CMD_CONFIG: err = cmd_config(); break; case CMD_ARGTEST: err = cmd_argtest(argc,argv); break; + case CMD_EXPAND: err = cmd_expand(argc,argv); break; case CMD_TEST: err = cmd_test(); break; case CMD_COLORS: err = Command_COLORS(brief_count?-brief_count:long_count,0,0); break; case CMD_ERROR: err = cmd_error(); break; @@ -942,6 +947,15 @@ static enumError CheckCommand ( int argc, char ** argv ) int main ( int argc, char ** argv ) #endif { + #if !SZS_WRAPPER + ArgManager_t am = {0}; + SetupArgManager(&am,LOUP_AUTO,argc,argv,false); + ExpandAtArgManager(&am,AMXM_SHORT,10,false); + argc = am.argc; + argv = am.argv; + #endif + + tool_name = "wctct"; print_title_func = print_title; SetupLib(argc,argv,WCTCT_SHORT,VERSION,TITLE); ctcode_enabled = true; @@ -968,6 +982,7 @@ static enumError CheckCommand ( int argc, char ** argv ) if (SIGINT_level) err = ERROR0(ERR_INTERRUPT,"Program interrupted by user."); + ClosePager(); return err; } diff --git a/project/src/wimgt.c b/project/src/wimgt.c index 835e34e..ce84ef3 100644 --- a/project/src/wimgt.c +++ b/project/src/wimgt.c @@ -584,13 +584,15 @@ static enumError CheckOptions ( int argc, char ** argv, bool is_env ) case GO_COMPATIBLE: err += ScanOptCompatible(optarg); break; case GO_WIDTH: err += ScanOptWidth(optarg); break; case GO_MAX_WIDTH: err += ScanOptMaxWidth(optarg); break; + case GO_NO_PAGER: opt_no_pager = true; break; case GO_QUIET: verbose = verbose > -1 ? -1 : verbose - 1; break; case GO_VERBOSE: verbose = verbose < 0 ? 0 : verbose + 1; break; case GO_LOGGING: logging++; break; + case GO_TIMING: log_timing++; break; case GO_WARN: err += ScanOptWarn(optarg); break; case GO_DE: use_de = true; break; case GO_CT_CODE: ctcode_enabled = true; break; - case GO_LE_CODE: lecode_enabled = true; break; + case GO_LE_CODE: lecode_enabled = true; break; // optional argument ignored case GO_COLORS: err += ScanOptColorize(0,optarg,0); break; case GO_NO_COLORS: opt_colorize = COLMD_OFF; break; @@ -698,6 +700,7 @@ static enumError CheckCommand ( int argc, char ** argv ) case CMD_HELP: PrintHelpColor(&InfoUI_wimgt); break; case CMD_CONFIG: err = cmd_config(); break; case CMD_ARGTEST: err = cmd_argtest(argc,argv); break; + case CMD_EXPAND: err = cmd_expand(argc,argv); break; case CMD_TEST: err = cmd_test(); break; case CMD_COLORS: err = Command_COLORS(brief_count?-brief_count:long_count,0,0); break; case CMD_ERROR: err = cmd_error(); break; @@ -735,6 +738,15 @@ static enumError CheckCommand ( int argc, char ** argv ) int main ( int argc, char ** argv ) #endif { + #if !SZS_WRAPPER + ArgManager_t am = {0}; + SetupArgManager(&am,LOUP_AUTO,argc,argv,false); + ExpandAtArgManager(&am,AMXM_SHORT,10,false); + argc = am.argc; + argv = am.argv; + #endif + + tool_name = "wimgt"; print_title_func = print_title; SetupLib(argc,argv,WIMGT_SHORT,VERSION,TITLE); @@ -760,6 +772,7 @@ static enumError CheckCommand ( int argc, char ** argv ) if (SIGINT_level) err = ERROR0(ERR_INTERRUPT,"Program interrupted by user."); + ClosePager(); return err; } diff --git a/project/src/wkclt.c b/project/src/wkclt.c index 5538ecd..0592df1 100644 --- a/project/src/wkclt.c +++ b/project/src/wkclt.c @@ -1282,13 +1282,15 @@ static enumError CheckOptions ( int argc, char ** argv, bool is_env ) case GO_COMPATIBLE: err += ScanOptCompatible(optarg); break; case GO_WIDTH: err += ScanOptWidth(optarg); break; case GO_MAX_WIDTH: err += ScanOptMaxWidth(optarg); break; + case GO_NO_PAGER: opt_no_pager = true; break; case GO_QUIET: verbose = verbose > -1 ? -1 : verbose - 1; break; case GO_VERBOSE: verbose = verbose < 0 ? 0 : verbose + 1; break; case GO_LOGGING: logging++; break; + case GO_TIMING: log_timing++; break; case GO_WARN: err += ScanOptWarn(optarg); break; case GO_DE: use_de = true; break; case GO_CT_CODE: ctcode_enabled = true; break; - case GO_LE_CODE: lecode_enabled = true; break; + case GO_LE_CODE: lecode_enabled = true; break; // optional argument ignored case GO_COLORS: err += ScanOptColorize(0,optarg,0); break; case GO_NO_COLORS: opt_colorize = COLMD_OFF; break; @@ -1418,6 +1420,7 @@ static enumError CheckCommand ( int argc, char ** argv ) case CMD_HELP: PrintHelpColor(&InfoUI_wkclt); break; case CMD_CONFIG: err = cmd_config(); break; case CMD_ARGTEST: err = cmd_argtest(argc,argv); break; + case CMD_EXPAND: err = cmd_expand(argc,argv); break; case CMD_TEST: err = cmd_test(); break; case CMD_COLORS: err = Command_COLORS(brief_count?-brief_count:long_count,0,0); break; case CMD_ERROR: err = cmd_error(); break; @@ -1471,6 +1474,15 @@ static enumError CheckCommand ( int argc, char ** argv ) int main ( int argc, char ** argv ) #endif { + #if !SZS_WRAPPER + ArgManager_t am = {0}; + SetupArgManager(&am,LOUP_AUTO,argc,argv,false); + ExpandAtArgManager(&am,AMXM_SHORT,10,false); + argc = am.argc; + argv = am.argv; + #endif + + tool_name = "wkclt"; print_title_func = print_title; SetupLib(argc,argv,WKCLT_SHORT,VERSION,TITLE); @@ -1496,6 +1508,7 @@ static enumError CheckCommand ( int argc, char ** argv ) if (SIGINT_level) err = ERROR0(ERR_INTERRUPT,"Program interrupted by user."); + ClosePager(); return err; } diff --git a/project/src/wkmpt.c b/project/src/wkmpt.c index 9c5b341..11eb940 100644 --- a/project/src/wkmpt.c +++ b/project/src/wkmpt.c @@ -1580,13 +1580,15 @@ static enumError CheckOptions ( int argc, char ** argv, bool is_env ) case GO_COMPATIBLE: err += ScanOptCompatible(optarg); break; case GO_WIDTH: err += ScanOptWidth(optarg); break; case GO_MAX_WIDTH: err += ScanOptMaxWidth(optarg); break; + case GO_NO_PAGER: opt_no_pager = true; break; case GO_QUIET: verbose = verbose > -1 ? -1 : verbose - 1; break; case GO_VERBOSE: verbose = verbose < 0 ? 0 : verbose + 1; break; case GO_LOGGING: logging++; break; + case GO_TIMING: log_timing++; break; case GO_WARN: err += ScanOptWarn(optarg); break; case GO_DE: use_de = true; break; case GO_CT_CODE: ctcode_enabled = true; break; - case GO_LE_CODE: lecode_enabled = true; break; + case GO_LE_CODE: lecode_enabled = true; break; // optional argument ignored case GO_COLORS: err += ScanOptColorize(0,optarg,0); break; case GO_NO_COLORS: opt_colorize = COLMD_OFF; break; @@ -1734,6 +1736,7 @@ static enumError CheckCommand ( int argc, char ** argv ) case CMD_HELP: PrintHelpColor(&InfoUI_wkmpt); break; case CMD_CONFIG: err = cmd_config(); break; case CMD_ARGTEST: err = cmd_argtest(argc,argv); break; + case CMD_EXPAND: err = cmd_expand(argc,argv); break; case CMD_TEST: err = cmd_test(); break; case CMD_COLORS: err = Command_COLORS(brief_count?-brief_count:long_count,0,0); break; case CMD_ERROR: err = cmd_error(); break; @@ -1785,6 +1788,15 @@ static enumError CheckCommand ( int argc, char ** argv ) int main ( int argc, char ** argv ) #endif { + #if !SZS_WRAPPER + ArgManager_t am = {0}; + SetupArgManager(&am,LOUP_AUTO,argc,argv,false); + ExpandAtArgManager(&am,AMXM_SHORT,10,false); + argc = am.argc; + argv = am.argv; + #endif + + tool_name = "wkmpt"; print_title_func = print_title; SetupLib(argc,argv,WKMPT_SHORT,VERSION,TITLE); @@ -1810,6 +1822,7 @@ static enumError CheckCommand ( int argc, char ** argv ) if (SIGINT_level) err = ERROR0(ERR_INTERRUPT,"Program interrupted by user."); + ClosePager(); return err; } diff --git a/project/src/wlect.c b/project/src/wlect.c index 3ea7ea5..cf0a9f0 100644 --- a/project/src/wlect.c +++ b/project/src/wlect.c @@ -35,7 +35,7 @@ * * ***************************************************************************/ -#include "lib-lecode.h" +#include "lib-ledis.h" #include "lib-szs.h" #include "lib-xbmg.h" //#include "lib-bzip2.h" @@ -219,8 +219,7 @@ static enumError cmd_test() #elif 0 - ParamList_t *param; - for ( param = first_param; param; param = param->next ) + for ( ParamList_t *param = first_param; param; param = param->next ) { //NORMALIZE_FILENAME_PARAM(param); } @@ -311,6 +310,8 @@ static enumError cmd_dpad() static enumError cmd_dump ( int long_level ) { + SetupPager(); + if ( long_level > 0 ) { RegisterOptionByIndex(&InfoUI_wlect,OPT_LONG,long_level,false); @@ -366,6 +367,7 @@ static enumError cmd_dump ( int long_level ) ResetCTCODE(&ctcode); } fflush(stdout); + CloseLDUMP(); } ResetRawData(&raw); @@ -751,7 +753,9 @@ static enumError cmd_patch() PatchLECODE(&ana); err = SaveFILE( dest, 0, dest_is_source||opt_overwrite, raw.data, raw.data_size, 0 ); + ImportAnaLDUMP(&ana); ResetLEAnalyse(&ana); + CloseLDUMP(); } ResetRawData(&raw); @@ -763,48 +767,148 @@ static enumError cmd_patch() /////////////// command create /////////////// /////////////////////////////////////////////////////////////////////////////// -static enumError cmd_create() +static void help_create ( enumError exit_code ) { - stdlog = stderr; + //SetupTermWidth(); + if ( logging >= 3 ) + printf("# colors: %d %d %d\n",colout->col_mode,colout->colorize,colout->n_colors); - if ( n_param != 1 ) - { - fputs("\n" - "Use command CREATE without exact one keyword.\n" - "\n" - "Possible keywords:\n" - " LEX : Create a with all sections except »TEST«.\n" - " LEX+ : Create a complete LEX text file.\n" - " SET1 : Create a LEX text file with section »SET1« only.\n" - " CANNON : Create a LEX text file with section »CANN« only.\n" - " TEST : Create a LEX text file with section »TEST« only.\n" - " LPAR : Create a LPAR text file as template.\n" - #if HAVE_WIIMM_EXT - "\n" - "Hidden keyword:\n" - " FEATURES : Create a LEX text file with section »FEA0« only.\n" - " DEVELOP : Like LEX+, but include all devoloper sections.\n" + static const char text[] = + "\n" + "{heading|Command »%s CREATE«}\n" + "\n" + " |This command creates text files." + " The optional argument defines the type of output. The general syntax is:\n" + "|[4,25]\n" + "\t|{cmd|%s CREATE}\n" + "\t|{cmd|%s CREATE SUB_COMMAND} {opt|option}...\n" + "\n" + " |This help is printed if no {cmd|SUB_COMMAND} is used or if it is »{name|HELP}«." + " The sub-commands are case sensitive, unique abbreviations are allowed." + " The sub-commands are logically divided into several groups:\n" + "\n" + "\tCreate a LEX file:\t|{name|LEX}, {name|LEX+}, {name|SET1}, {name|CANNONS}, {name|HIPT}, {name|TEST}.\n" + "\tCreate another file:\t|{name|LPAR}, {name|LE-DEF}, {name|PREFIX}.\n" + "\tPrint an information:\t|{name|LE-INFO}.\n" + #if HAVE_WIIMM_EXTxx + "\tHidden sub-commands:\t|{name|DEVELOP}, {name|FEATURES}.\n" #endif - "\n",stderr); + "\n" + " |This help and the generated text files are output via the standard output (stdout)" + " by an internal pager." + " Options {opt|--dest}, {opt|--DEST} and {opt|--overwrite} can change this default.\n" + "\n" - hint_exit(ERR_SYNTAX); - } + //--------------------------------------------------------------------- + + "\n" + "{caption|Create a LEX file:}\n" + #if HAVE_WIIMM_EXTxx + "\n|[4,14]" + #else + "\n|[4,13]" + #endif + " |The following sub-commands create a LEX file with one or all sections:\n" + "\n" + "\t{name|LEX}:\t|" + "Create a LEX file with all known sections except section »TEST«.\n" + "\t{name|LEX+}:\t|" + "Create a complete LEX text file including section »TEST«.\n" + #if HAVE_WIIMM_EXTxx + "\t{info|DEVELOP}:\t|" + "This {warn|hidden sub-command} acts like LEX+," + " but includes all devoloper sections.\n" + #endif + "\n" + #if HAVE_WIIMM_EXTxx + "\t{info|FEATURES}:\t|" + "This {warn|hidden sub-command} create a LEX text file with section »FEA0« only." + " {warn|This section is under development.}\n" + #endif + "\t{name|SET1}:\t|" + "Create a LEX text file with section »SET1« only.\n" + "\t{name|CANNONS}:\t|" + "Create a LEX text file with section »CANN« only.\n" + "\t{name|HIPT}:\t|" + "Create a LEX text file with section »HIPT« only.\n" + "\t{name|TEST}:\t|" + "Create a LEX text file with section »TEST« only.\n" + "\n" + + //--------------------------------------------------------------------- + + "\n" + "{caption|Create other files:}\n" + "\n" + "\t{name|LPAR}:\t|" + "Create a LPAR text file (LE-CODE parameters) as template." + " Option {opt|--lpar} is recognized to change defaults.\n" + "\t{name|LE-DEF}:\t|" + "Create a LE-CODE distribution definition file of type LE-DEF as template.\n" + "\t{name|PREFIX}:\t|" + "Create a machine readable prefix list." + " {file|https://ct.wiimm.de/export/prefix} is the authoritative source for this.\n" + "\n" + + //--------------------------------------------------------------------- + + "\n" + "{caption|Print an information:}\n" + "\n" + "\t{name|LE-INFO}:\t|" + "Print information about built-in LE-CODE binaries.\n" + "\n" + + ; + + int good_width = GetGoodTermWidth(0,false); + PrintColoredLines(stdout,colout,0,good_width-1,0,0,text, + ProgInfo.progname, + ProgInfo.progname, + ProgInfo.progname ); + ClosePager(); + exit(exit_code); +} + +/////////////////////////////////////////////////////////////////////////////// + +static enumError cmd_create() +{ + CheckOptDest("-",false); + if (!strcmp(opt_dest,"-")) + SetupPager(); + + if ( n_param != 1 ) + help_create(ERR_OK); //--- data - enum { C_LEX, C_FEATURES, C_SET1, C_CANNON, C_HIDE_PT, C_TEST, C_LPAR }; + enum { C_HELP, + C_LEX, C_FEATURES, C_SET1, C_CANNON, C_HIDE_PT, C_TEST, + C_LPAR, C_LEDEF, C_PREFIX, + C_LEINFO, + }; + static const KeywordTab_t tab[] = { + { C_HELP, "HELP", "H", 0 }, + { C_LEX, "LEX", 0, 0 }, - { C_LEX, "LEX+", 0, 1 }, - { C_LEX, "DEVELOP", 0, 2 }, + { C_LEX, "LEX+", 0, 1 }, + { C_LEX, "DEVELOP", 0, 2 }, { C_FEATURES, "FEATURES", 0, 0 }, { C_SET1, "SET1", 0, 0 }, - { C_CANNON, "CANNON", 0, 0 }, + { C_CANNON, "CANNONS", 0, 0 }, { C_HIDE_PT, "HIPT", 0, 0 }, { C_TEST, "TEST", 0, 0 }, + { C_LPAR, "LPAR", 0, 0 }, + { C_LEDEF, "LE-DEF", "LEDEF", 0 }, + { C_PREFIX, "PREFIX", 0, 0 }, + + { C_LEINFO, "LE-INFO", "LEINFO", 0 }, + { 0,0,0,0 } }; @@ -825,54 +929,39 @@ static enumError cmd_create() enumError err = ERR_OK; switch (cmd->id) { + case C_HELP: + help_create(ERR_OK); + break; + + //------------------------- + case C_LEX: { lex_t lex; InitializeLEX(&lex); lex.develop = cmd->opt > 1; - UpdateLEX(&lex,true,cmd->opt>0); + UpdateLEX( &lex, true, cmd->opt > 0 ); PatchLEX(&lex,0); - err = SaveTextLEX(&lex,"-",false); + err = SaveTextLEX(&lex,opt_dest,false); ResetLEX(&lex); } break; case C_FEATURES: - { - lex_t lex; - InitializeLEX(&lex); - AppendFea0LEX(&lex,false,0); - err = SaveTextLEX(&lex,"-",false); - ResetLEX(&lex); - } - break; - case C_SET1: - { - lex_t lex; - InitializeLEX(&lex); - AppendSet1LEX(&lex,false); - err = SaveTextLEX(&lex,"-",false); - ResetLEX(&lex); - } - break; - case C_CANNON: - { - lex_t lex; - InitializeLEX(&lex); - AppendCannLEX(&lex,false); - err = SaveTextLEX(&lex,"-",false); - ResetLEX(&lex); - } - break; - case C_HIDE_PT: { lex_t lex; InitializeLEX(&lex); - AppendHiptLEX(&lex,false); - err = SaveTextLEX(&lex,"-",false); + switch (cmd->id) + { + case C_FEATURES: AppendFea0LEX(&lex,false,0); break; + case C_SET1: AppendSet1LEX(&lex,false); break; + case C_CANNON: AppendCannLEX(&lex,false); break; + case C_HIDE_PT: AppendHiptLEX(&lex,false); break; + } + err = SaveTextLEX(&lex,opt_dest,false); ResetLEX(&lex); } break; @@ -883,26 +972,1028 @@ static enumError cmd_create() InitializeLEX(&lex); lex_item_t * li = AppendTestLEX(&lex,false); PatchTestLEX((lex_test_t*)li->elem.data,0); - err = SaveTextLEX(&lex,"-",false); + err = SaveTextLEX(&lex,opt_dest,false); ResetLEX(&lex); } break; + //------------------------- + case C_LPAR: { le_lpar_t lpar; InitializeLPAR(&lpar,true); PatchLPAR(&lpar); lpar.limit_mode = LPM_FORCE_AUTOMATIC; - err = SaveTextLPAR(&lpar,"-",false); + err = SaveTextLPAR(&lpar,opt_dest,false); + } + break; + + case C_LEDEF: + { + File_t F; + enumError err = CreateFileOpt(&F,true,opt_dest,false,0); + if (!err) + { + le_distrib_t ld; + InitializeLD(&ld); + AutoSetupLD(&ld,LAS_DEFAULT|LAS_TEMPLATE); + err = CreateLeDefLD(F.f,&ld); + ResetLD(&ld); + } + CloseFile(&F,0); } break; + + case C_PREFIX: + SavePrefixTableFN(opt_dest,0); + break; + + //------------------------- + + case C_LEINFO: + { + File_t F; + enumError err = CreateFileOpt(&F,true,opt_dest,false,0); + if (!err) + { + fprintf(F.f, + "\n" + "Built-in LE-CODE binaries:\n" + "\n" + " %s\n" + " %s\n" + " %s\n" + " %s\n" + "\n" + ,GetLecodeInfoLEREG(LEREG_PAL) + ,GetLecodeInfoLEREG(LEREG_USA) + ,GetLecodeInfoLEREG(LEREG_JAP) + ,GetLecodeInfoLEREG(LEREG_KOR) + ); + } + CloseFile(&F,0); + } + } + + return err; +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// command distrib /////////////// +/////////////////////////////////////////////////////////////////////////////// + +static void help_distrib ( enumError exit_code ) +{ + if ( logging >= 3 ) + printf("# colors: %d %d %d\n",colout->col_mode,colout->colorize,colout->n_colors); + + static const char text[] = + "\n" + "{heading|Command »%s DISTRIBUTION«}\n" + "\n" + " |This command manages data for LE-CODE track distributions." + " It reads any number of source files with different file types," + " collects the data and creates any number of files with different file types.\n" + "\n" + " |»{cmd|%s DISTRIBUTION}« is a very powerful tool when dealing with distributions." + " Because of the complexity, the input line offers many possibilities." + " First, the default options (arguments beginning with 1 or 2 minus signs" + " like {opt|-B} or {opt|--brief}) are evaluated." + " Then the remaining arguments of the command line are evaluated step by step from left to right." + " There are {name|input files} that change the internal model." + " The {name|instructions} are used to change the data or to write data to files." + " The {name|processing options} affect both reading and writing.\n" + "\n" + " |{warn|This command is still under development." + " Its use is therefore experimental and errors are quite likely!}\n" + "\n" + " {syntax|Syntax:}\n" + "|[4]\n" + "\t|{cmd|%s DISTRIBUTION}\n" + "\t|{cmd|%s DISTRIBUTION} {opt|option}... {par|argument}...\n" + "\n" + " |»{cmd|DIS}« and »{cmd|DISTRIB}« are well defined shortcuts for »{cmd|DISTRIBUTION}«." + " Without arguments, this help is printed.\n" + "\n" + + //------------------------------------------------------------------------- + + "\n" + "{heading|Arguments:}\n" + "\n" + " |Arguments are divided into 3 groups:" + " {name|processing options}, {name|instructions} and {name|filenames}.\n" + "\n" + " |If an argument beginns with a {hl|plus sign} ({hl|+}), then is is scanned as" + " a {name|comma-separated list of processing options}." + " To use a filename that starts with a plus sign (e.g. »{file|+file.txt}«)," + " precede it with »{file|./}« (e.g. »{file|./+file.txt}«).\n" + "\n" + " |Otherwise, if the argument is of the form {hl|COMMAND=PARAMETER}," + " then it is a {name|instruction}." + " COMMAND is a keyword (case-insenitive) and starts with a letter" + " followed by any number of letters, digits and minus signs." + " PARAMETER must consist of at least one character." + " If PARAMETER is empty, then the next argument is used as PARAMETER." + " This also allows the syntax {hl|COMMAND= PARAMETER} (2 arguments)," + " which is helpful for the automatic completion of filenames.\n" + "\n" + " |Otherwise it is a {name|filename of an input file}." + " The file is read and generally overwrites existing content." + " This means that the file last read in has the highest priority." + " However, this can be influenced by the processing options." + " Arguments beginning with »{file|/}« or »{file|./}«" + " are always recognized as filenames.\n" + "\n" + " |All arguments are executed in the order in which they were entered without any logging." + " Only error messages are displayed." + " With option {opt|--verbose} (short: {opt|-v})," + " at least one log line for each argument is printed.\n" + "\n" + " |It is possible to store arguments into a file (e.g. into file »{file|param.txt}«)" + " and to include those file by option {opt|-@FILENAME}" + " (e.g. by »{file|-@param.txt}«). This option can be used multiple times" + " and is evaluated before the actual analysis of the command line." + " Command »{cmd|wlect argtest ...}« is suitable for tests.\n" + "\n" + + //------------------------------------------------------------------------- + + "\n" + "{heading|Input Files:}\n" + "\n" + " |{name|Input files} are processed in the order in which they were entered." + " They supplement or overwrite the internal data structure with its diverse data.\n" + "\n" + " |If a file does not exist but the associated filename contains wildcards" + " (any of »{file|*?[}«), then all matching files are loaded as source." + " So it's possible to keep the command line small if using »{file|'*.szs'}«" + " (with apostrophs) instead of »{file|*.szs}«.\n" + "\n" + " |The following file types are recognized and processed." + " The names used here are the same as those given out" + " by the command {cmd|FILETYPE} for identification:\n" + "|[4,13]\n" + "\t{name|LEDIS}:\t|" + "A distribution dump created by {name|write instruction} »{par|DUMP=…}«." + " Such a dump usually contains all relevant data of the internal model," + " which is restored by reading it in.\n" + "\n" + "\t{name|LEDEF}:\t|" + "A distribution definition file." + " This new format replaces the old {name|CTTEXT} format." + " It supports all LE-CODE properties and will be further developed to match LE-CODE." + " Templates can be created with instruction »{par|LEDEF=…}«" + " or with command »{par|wlect CREATE LEDEF}«.\n" + "\n" + "\t{name|LEREF}:\t|" + "A track reference list created by {name|write instruction} »{par|REF=…}«.\n" + "\n" + "\t{name|SHA1REF}:\t|" + "A SHA1 reference list created by {name|write instruction} »{par|SHA1=…}«." + " Only checksum and track slot are used.\n" + "\n" + "\t{name|LE-BIN}:\t|" + "A LE-CODE binary file (e.g. »{file|lecode-PAL.bin}«)." + " Usually settings and LPAR are imported." + " Option {name|IN-LECODE} decides if the file is used as template" + " for the specifig region if a binary is created.\n" + "\n" + "\t{name|PREFIX}:\t|" + "Replace the internal prefix list by the content of the file." + " {file|https://ct.wiimm.de/export/prefix} is the authoritative source for this.\n" + "\n" + "\t{name|LPAR}:\t|" + "A LE-CODE parameter file (e.g. »{file|lpar.txt}«).\n" + "\n" + "\t{name|BMG} and {name|BMGTXT}:\n\t\t|" + "Any BMG (binary or text)." + " See section »{heading|Processing Options}« for more details.\n" + "\n" + "\t{name|DISTRIB}:\t|" + "A distribution file created by {name|write instruction} »{par|DISTRIB=…}«" + " or by command »{cmd|wszst DISTRIBUTION}«." + " Such files are imported by ct.wiimm.de to display information about distributions.\n" + "\n" + "\t{name|CTTEXT}:\t|" + "A CT-CODE or LE-CODE definition file." + " The file is scanned by the CT-CODE scanner and then imported.\n" + "\n" + " |All file types that are accepted by option {opt|--le-define}" + " ({name|BRRES}, {name|TEX0}, {name|CT-CODE}, ...) are also possible.\n" + "\n" + + //------------------------------------------------------------------------- + + "\n" + "{heading|Instructions:}\n" + "\n" + " |{name|Instructions} are of the form {hl|COMMAND=PARAMETER} (1 argument)" + " or {hl|COMMAND= PARAMETER} (2 arguments). Commands are case-insenitive." + " The use of keywords without the minus sign and unique abbreviations are permitted." + " Any number of write instructions can be used." + " And these can be mixed with input files at will.\n" + "\n" + " |Most commands, but not all, are {name|write instructions}." + " They write the current contents of the internal model to a file." + " In these cases, {hl|PARAMETER} is a filename." + " If a filename is a minus sign only, then {file|stdout} is used." + " Existing files are only overwritten if at least one of the options" + " {opt|--overwrite} (short: {opt|-o}) or {opt|--remove-dest} (short: {opt|-r}) is set.\n" + "\n|[4,14]" + + //------------------------- + " |{heading|Create human readable information files:}\n" + "\n" + + "\t{name|NAMES}:\t|" + "Create a human readable reference file with cup info and track names." + " Only tracks with known name (not empty) are printed." + " The tracks are ordered by cups.\n" + "\t{name|XNAMES}:\t|" + "Same as {name|NAMES}, but use extended names if available.\n" + "\n" + "\t{name|INFO}:\t|" + "Create a human readable reference file with cup info slots and track names." + " Only tracks with known name (not empty) are printed." + " The tracks are ordered by cups.\n" + "\t{name|XINFO}:\t|" + "Same as {name|INFO}, but use extended names if available.\n" + "\n" + "\t{name|LE-INFO}:\t|" + "Print information about current LE-CODE binaries.\n" + "\n" + "\t{name|PREFIX}:\t|" + "Print a machine readable prefix list." + " {file|https://ct.wiimm.de/export/prefix} is the authoritative source for this.\n" + "\n" + "\t{name|DEBUG}:\t|" + "Print some statistics for debugging." + " The current sate is analysed without updating cups.\n" + "\n" + + //------------------------- + " |{heading|Create human and machine readable definition files (usually input files):}\n" + "\n" + + "\t{name|LE-DEF}:\t|" + "Create a LE-CODE definition file of format »{name|#LE-DEF1}«," + " that is usually used to declare tracks for a LE-CODE distributions." + " This new format replaces the old format created by {name|CTDEF=}." + " It supports all LE-CODE properties and will be further developed" + " to match future LE-CODE.\n" + "\n" + "\t{name|CT-DEF}:\t|" + "Create a definition file of format »{name|#CT-CODE}«," + " that is usually used to declare tracks for a CT-CODE or LE-CODE distributions." + " Only simple layouts are supported," + " so that the track arrangement can be distorted when importing again." + " In addition, a file is created" + " that can only be read by the tools since version 2.28a.\n" + "\n" + + + //------------------------- + " {heading|Generate machine-readable files that can also be used as input files:}\n" + "\n" + + "\t{name|SHA1}:\t|" + "Create a SHA1 list file that can be used on Wiimmfi" + " to limit the tracks that can be used in a region." + " Only tracks with known SHA1 are printed." + " The output can be used as input file to restore the checksums.\n" + "\t{name|XSHA1}:\t|" + "Same as {name|SHA1}, but use extended names if available.\n" + "\n" + "\t{name|DISTRIB}:\t|" + "Create a distribution file like command »{cmd|wszst DISTRIBUTION}« does." + " However, this variant only supports tracks with a known track slot." + " The output can be used as input file.\n" + "\t{name|XDISTRIB}:\t|" + "Same as {name|DISTRIB}, but use extended names for the track list if available.\n" + "\n" + "\t{name|LPAR}:\t|" + "Create a LPAR file. Use {opt|--brief} ({opt|-b}) to suppress comments.\n" + "\n" + "\t{name|BMG}:\t|" + "Create a BMG binary file. BMG options are recognized." + " But if the output goes to a terminal, then use {name|BMGTXT} insted.\n" + "\t{name|BMGTXT}:\t|" + "Create a BMG text file. BMG options are recognized.\n" + "\n" + "\t{name|REF}:\t|" + "Create a machine readable track reference (type {name|LEREF})," + " that can be used as input file for other commands." + " One line is printed for each defined track.\n" + "\n" + "\t{name|DUMP}:\t|" + "Create a dump of the complete internal model to a distribution file" + " (type {name|LE-DIS})." + " This file can be used as source to restore the internal model.\n" + "\n" + + //------------------------- + " {heading|Create LE-CODE binary files:}\n" + "\n" + + "\t{name|LECODE}:\t|" + "Create 4 LE-CODE binary files, one for each region." + " The filename must contain at least {hl|one »@« character}." + " The last »@« character is replaced by" + " {name|PAL}, {name|USA}, {name|JAP} and {name|KOR} in sequence." + " The binary data embedded in the SZS tools is usually used as a template." + " At the moment it is {info|build %s}." + " Other templates can be used with the {name|IN-LECODE} processing option.\n" + "\n" + "\t{name|PAL}:\t|" + "Similar to mode {name|LECODE}, but only the PAL version is generated." + " The »@« character has no special meaning here.\n" + "\t{name|USA}:\t|" + "Like {name|PAL}, but the USA version is generated.\n" + "\t{name|JAP}:\t|" + "Like {name|PAL}, but the JAP version is generated.\n" + "\t{name|KOR}:\t|" + "Like {name|PAL}, but the KOR version is generated.\n" + "\n" + + //------------------------- + " {heading|String functions:}\n" + "\n" + + "\t{name|SUBST}:\t|" + "This command searches for text passages using a regular expression" + " and replaces the found passages with another text.\r" + " {heading|Syntax of PARAMETER:} |{syntax|STORAGE ',' SEP REGEXP SEP REPLACEMENT SEP OPTIONS}\n" + "\n\t\t|" + "{syntax|STORAGE} is a storage indicator" + " explained in section »{name|Processing Options: Storage}«." + " {syntax|SEP} is the very first character behind the comma." + " It must occur exactly 3 times and separates the 3 parts from each other." + " {syntax|REGEXP} is the extended regular expression used for searching." + " If successful, replace that portion matched with {syntax|REPLACEMENT}." + " The replacement may contain the special string »{mark|$0}«" + " to refer to that portion of the pattern space which matched," + " and the special string1 »{mark|$1}« through »{mark|$9}«" + " to refer to the corresponding matching sub-expressions in the regexp." + " The two characters »{mark|g}« for global (replace all occurrences)" + " and »{mark|i}« for ignore case are recognized as {syntax|OPTIONS}.\r" + "\r" + "Examples: |{syntax|subst=name,+abc+xyz+}\r" + "{syntax|subst=[key],/search ([0-9])/replace $1/gi}\n" + "\n" + + "\t{name|COPY}:\t|" + "This command copies the texts of 1 or more sources to a destination.\r" + " {heading|Syntax of PARAMETER:} {syntax|DEST '=' SRC [ '+' SRC ]...}\r" + "\r" + "{syntax|DEST} and {syntax|SRC} are storage indicators" + " explained in section »{name|Processing Options: Storage}«." + " The sources are joined textually, with CTRL-A (ASCII 1, '\\1')" + " inserted as a separator between the sources." + " Use instruction {name|SUBST} to change the separators.\r" + "\r" + "Example: |{syntax|copy=[result]=sha1+[size]}\n" + "\n" + + //------------------------- + " {heading|Copy, move or link track files:}\n" + "\n|[4,12,14,22]" + + "\t{name|TRACKS}:\t|" + "Copy, move or links files following the options {opt|--copy-tracks}," + " {opt|--move-tracks}, {opt|--move1-tracks}, {opt|--link-tracks}" + " and {opt|--track-dir}." + " {hl|PARAMETER} is a keyword that specifies the options for execution:\n" + "\n" + + "\t\t\t{name|NO-LOG}:\t|" + "Transfer the tracks without logging.\n" + "\t\t\t{name|LOG}:\t|" + "Transfer the tracks with logging.\n" + "\t\t\t{name|TEST}:\t|" + "Log planned actions only and don't touch any file.\n" + "\n" + + //------------------------------------------------------------------------- + + "\n" + "{heading|Processing Options:}\n" + "\n" + " |{name|Processing Options} are inserted as comma separated list." + " A list always begins with a plus sign to distinguish it from filenames" + " and instructions." + " Option names are case-insenitive. Unique abbreviations are allowed." + " Names with a minus sign in their name can also be specified without the minus sign.\n" + "\n" + " |Most option names can be preeceded by a minus sign or a slash to negate its meaning." + "\n" + " |{name|Processing Options} are only valid for subsequent arguments." + " This makes it possible to use different filters for different input or output files." + " The keywords are divided into several functional groups.\n" + "\n|[4,16]" + + //------------------------- + + " |{heading|Managment Options:}\n" + "\n" + "\t{name|HELP}:\t|" + "Stop execution and print this help.\n" + "\t{name|RESET}:\t|" + "Reset the filter to its default.\n" + "\n" + "\t{name|CUT-STD}:\t|" + "Remove settings and tracks, that are not needed for a standard distribution" + " with 32 tracks and 10 battle arenas.\n" + "\t{name|CUT-CTCODE}:\t|" + "Remove settings and tracks, that are not needed for a CT-CODE distribution." + " Arenas are also removed.\n" + "\n" + + //------------------------- + + " |{heading|BMG source:}\n" + "\n" + "\t|Define which BMG strings are used as input." + " Multiple source can be selected. If none is selected, then all are used." + " {name|MKW1} has the lowest priority and {name|LE-CODE} the highest.\n" + "\n" + + "\t{name|MKW1}:\t|" + "Use the first set of orignal names starting from" + " message id 0x2454 (racing tracks) and 0x2490 (battle arenas).\n" + "\t{name|MKW2}:\t|" + "Use the second set of orignal names starting from" + " message id 0x24b8 (racing tracks) and 0x24cc (battle arenas).\n" + "\t{name|MKW}:\t|" + "Short cut for »{name|+MKW1,MKW2}«.\n" + "\t{name|CT-CODE}:\t|" + "Use the CT-CODE names starting from message id 0x4000.\n" + "\t{name|LE-CODE}:\t|" + "Use the LE-CODE names starting from message id 0x7000.\n" + "\n" + + //------------------------- + + " |{heading|Input filters:}\n" + "\n" + "\t|Define the type of character identifiers accepted as source." + " Empty character strings and character strings" + " that only consist of a minus sign are considered invalid.\n" + "\n" + + "\t{name|IN-EMPTY}:\t|" + "Empty strings are also considered valid." + " {name|IEMPTY} is a short cut for this keyword.\n" + "\t{name|IN-MINUS}:\t|" + "Strings consisting only of a minus sign are also considered valid." + " {name|IMINUS} is a short cut for this keyword.\n" + "\t{name|IN-ALL}:\t|" + "Short cut for »{name|+IN-EMPTY,IN-MINUS}«." + " {name|IALL} is a short cut for this keyword.\n" + "\n" + + //------------------------- + + " |{heading|Input operation:}\n" + "\n" + "\t|Define how already existing strings are overwritten.\n" + "\n" + + "\t{name|OVERWRITE}:\t|" + "Insert all valid BMG strings and overwrite already existing strings." + " This is the default.\n" + "\t{name|INSERT}:\t|" + "Insert only valid BMG strings, that are empty in the track list.\n" + "\t{name|REPLACE}:\t|" + "Replace only valid BMG strings that are already defined in the track list." + " Other strings are ignored.\n" + "\n" + + //------------------------- + + " |{heading|Storage:}\n" + "\n" + "\t|Define the string type being processed. This is used for BMG input and output files only.\n" + "\n" + + "\t{name|IDENT}:\t|" + "Define a new identfication string." + " If it is a valid SHA1 or DB64 string, then update SHA1 too." + " If reading, then get the identfication string.\n" + "\t{name|SHA1}:\t|" + "Same as {name|IDENT} if writing." + " If reading, then get the SHA1 string.\n" + "\t{name|FILE}:\t|" + "Define a new or get the filename.\n" + "\t{name|NAME}:\t|" + "Define a new or get the standard name.\n" + "\t{name|XNAME}:\t|" + "Define a new or get the extended name.\n" + "\t{name|X2NAME}:\t|" + "Define a new standard and a new extended name." + " If reading, then get the extended name, if valid, or the standard name as fallback.\n" + "\n" + "\t{name|[key]}:\t|" + "For each track there is a set of character strings at the user's disposal." + " The character strings are addressed via KEY." + " The KEY itself can consist of any character and are case-sensitive." + " This type of square bracket option can only be used" + " directly after the leading plus sign. More processing options may follow.\n" + "\n" + + //------------------------- + + " |{heading|Output filters:}\n" + "\n" + "\t|Select tracks for the output by their features.\n" + "\n" + + "\t{name|VERSUS}||{name|VS}:\t|" + "Select versus tracks only.\n" + "\t{name|BATTLE}||{name|BT}:\t|" + "Select battle tracks (arenas) only." + " If neither or both of {name|VERSUS} and {name|BATTLE} set, both types are selected.\n" + "\n" + "\t{name|CUSTOM}:\t|" + "Select custom tracks." + " An original track in the wrong slot will also be considered CUSTOM.\n" + "\t{name|ORIGINAL}:\t|" + "Select original tracks at correct track slot only." + " Original tracks are detected by their SHA1." + " If neither or both of {name|CUSTOM} and {name|ORIGINAL} set, both types are selected.\n" + "\n" + "\t{name|NO-D}:\t|" + "This option suppresses information about so-called '_d' files." + " This affects 2 sub-commands:" + " With the {name|REF} sub-command, the data fields relating to '_d' files remain empty," + " and with {name|SHA1}, no lines are output for '_d' tracks.\n" + "\n" + + //------------------------- + + " |{heading|Empty output strings:}\n" + "\n" + "\t|For sub-commands {name|(X)NAMES} and {name|(X)INFO}," + " only tracks that have a valid name are output." + " Empty character strings and character strings" + " that only consist of a minus sign are considered invalid.\n" + "\n" + + "\t{name|OUT-EMPTY}:\t|" + "Empty strings are also considered valid." + " {name|OEMPTY} is a short cut for this keyword.\n" + "\t{name|OUT-MINUS}:\t|" + "Strings consisting only of a minus sign are also considered valid." + " {name|OMINUS} is a short cut for this keyword.\n" + "\t{name|OUT-ALL}:\t|" + "Short cut for »{name|+OUT-EMPTY,OUT-MINUS}«." + " {name|OALL} is a short cut for this keyword.\n" + "\n" + + //------------------------- + + "\n" + " |{heading|More options:}\n" + "\n" + "\t{name|IN-LECODE}:\t|" + "When reading a LE-CODE binaray file (e.g. »{file|lecode-PAL.bin}«)," + " only the settings are imported, but not the binary itself." + " So if writing a LE-CODE binary then the region dependent built-in binary is used." + " If this option set, then binaries are imported to override the built-in versions." + " One reason to activate this option is to use more recent LE-CODE versions." + " {name|ILECODE} is a short cut for this keyword.\n" + "\t{name|/IN-LECODE}:\t|" + "Switch option {name|IN-LECODE} off.\n" + "\n" + "\t{name|BRIEF}:\t|" + "When creating text files, detailed descriptions are suppressed." + " The default is based on the global options {opt|--no-header} and {opt|--brief}.\n" + "\t{name|/BRIEF}:\t|" + "Switch option {name|BRIEF} off.\n" + "\n" + + //------------------------------------------------------------------------- + + "\n" + "{heading|Examples:}\n" + "\n" + " |....\n" + "\n" + + //------------------------------------------------------------------------- + + "\n" + "{heading|Built-in LE-CODE binaries:}\n" + "\n" + " |%s\r%s\r%s\r%s\n" + "\n" + + ; + + #if 0 + char wildcards[] = PATTERN_WILDCARDS; + for ( char *ptr = wildcards; *ptr; ptr++ ) + if ( *ptr == ' ' ) + *ptr = 0xa0; + #endif + + int good_width = GetGoodTermWidth(0,false); + PrintColoredLines(stdout,colout,0,good_width-1,0,0,text + ,ProgInfo.progname + ,ProgInfo.progname + ,ProgInfo.progname + ,ProgInfo.progname + // ,wildcards + ,GetLecodeBuildLEREG(LEREG_PAL) + ,GetLecodeInfoLEREG(LEREG_PAL) + ,GetLecodeInfoLEREG(LEREG_USA) + ,GetLecodeInfoLEREG(LEREG_JAP) + ,GetLecodeInfoLEREG(LEREG_KOR) + ); + ClosePager(); + exit(exit_code); +} + +/////////////////////////////////////////////////////////////////////////////// + +static void PrintHead ( ccp format, ... ) + __attribute__ ((__format__(__printf__,1,2))); + +static void PrintHead ( ccp format, ... ) +{ + if (stdlog) + { + char buf[500]; + va_list arg; + va_start(arg,format); + vsnprintf(buf,sizeof(buf),format,arg); + va_end(arg); + + ASSERT(collog); + fprintf(stdlog,"%s▼ %s%s\n",collog->caption,buf,collog->reset); + fflush(stdlog); + } +} + +/////////////////////////////////////////////////////////////////////////////// + +static enumError cmd_distrib_instruction ( le_distrib_t *ld, ccp mode, char * arg ) +{ + u_nsec_t start_nsec = GetTimerNSec(); + + enum { C_NAMES, C_INFO, C_LEINFO, C_SHA1, C_DISTRIB, + C_CTDEF, C_LEDEF, C_REF, C_STRINGS, C_DUMP, + C_LECODE, C_LECODE4, C_LPAR, + C_BMG, C_SUBST, C_COPY, + C_TRACKS, C_PREFIX, C_RESERVE, C_DEBUG }; + + enum + { + O_PARAM_D = 0x100, // scan storage DEST + O_PARAM_S = 0x200, // scan storage SRC + O_PARAM_SS = 0x600, // scan storage SRC [ + SRC ]... + O_PARAM_A = 0x800, // allow additonal arguments + }; + + static const KeywordTab_t tab[] = + { + { C_NAMES, "NAMES", 0, 0 }, + { C_NAMES, "XNAMES", 0, 1 }, + { C_INFO, "INFO", 0, 0 }, + { C_INFO, "XINFO", 0, 1 }, + { C_LEINFO, "LE-INFO", "LEINFO", 0 }, + + { C_SHA1, "SHA1", 0, 0 }, + { C_SHA1, "XSHA1", 0, 1 }, + { C_DISTRIB, "DISTRIBUTION", 0, 0 }, + { C_DISTRIB, "XDISTRIBUTION", 0, 1 }, + + { C_CTDEF, "CT-DEF", "CTDEF", 0 }, + { C_LEDEF, "LE-DEF", "LEDEF", 0 }, + { C_LEDEF, "DEFINITION", "DEF", 0 }, + { C_REF, "REFERENCE", "REF", 0 }, + { C_STRINGS, "STRINGS", "STR", 0 }, + { C_DUMP, "DUMP", 0, 0 }, + + { C_LECODE, "PAL", 0, LEREG_PAL }, + { C_LECODE, "USA", 0, LEREG_USA }, + { C_LECODE, "JAP", 0, LEREG_JAP }, + { C_LECODE, "KOR", 0, LEREG_KOR }, + { C_LECODE4, "LECODE", 0, 0 }, + + { C_LPAR, "LPAR", 0, 0 }, + + { C_BMG, "BMG", "BMGBIN", 0 }, + { C_BMG, "BMG-TXT", "BMGTXT", 1 }, + + + { C_SUBST, "SUBST", 0, O_PARAM_D|O_PARAM_A }, + { C_COPY, "COPY", 0, O_PARAM_D|O_PARAM_SS }, + + { C_TRACKS, "TRACKS", 0, 0 }, + + { C_PREFIX, "PREFIX", 0, 0 }, + { C_RESERVE, "RESERVE", 0, 0 }, + { C_DEBUG, "DEBUG", 0, 0 }, + + { 0,0,0,0 } + }; + + enum { O_LOG = 1, O_TEST = 2 }; + static const KeywordTab_t tracks_tab[] = + { + { 0, "NO-LOG", "NOLOG", 0 }, + { 0, "LOG", 0, O_LOG }, + { 0, "TEST", 0, O_LOG|O_TEST }, + { 0,0,0,0 } + }; + + if ( !ld || !mode || !arg || !*arg ) + return ERROR0(ERR_MISSING_PARAM,0); + + + //--- scan keyword + + int cmd_stat; + const KeywordTab_t *cmd = ScanKeyword(&cmd_stat,mode,tab); + if (!cmd) + { + PrintHead("Instruction: %s = %s",mode,arg); + PrintKeywordError(tab,mode,cmd_stat,0,"instruction"); + hint_exit(ERR_SYNTAX); + } + + + //--- start + + if ( verbose >= 1 ) + PrintHead("Instruction %s: %s",cmd->name1,arg); + + u_nsec_t temp_nsec = GetTimerNSec(); + if ( CloseArchLD(ld) && verbose >= 2 ) + { + const u_nsec_t dur = GetTimerNSec() - temp_nsec; + fprintf(stdlog,"%s >> SZS archive closed in %s%s\n", + collog->status, PrintTimerNSec6(0,0,dur,0), collog->reset ); + start_nsec += dur; + } + + + //--- text argument only + + const int MAX_PAR_SRC = 20; + int n_par_src = 0; + le_strpar_t par_dest, par_src[MAX_PAR_SRC]; + + enumError err = ERR_OK; + const le_options_t opt = cmd->opt; + if ( opt & (O_PARAM_D|O_PARAM_S) ) + { + if ( opt & O_PARAM_D ) + { + par_dest = ld->spar; + char *end = ScanLSP(&par_dest,arg,&err); + if ( opt & (O_PARAM_S|O_PARAM_A) ) + { + if ( *end != '=' && *end != ',' ) + return ERROR0( ERR_SEMANTIC,"%s: Missing '=' or ',': %s\n",cmd->name1,end); + end++; + } + + if (err) + { + err_param12:; + return ERROR0( ERR_SEMANTIC, + "%s: Invalid string name: %s\n", cmd->name1, arg ); + } + arg = end; + if ( verbose >= 2 ) + fprintf(stdlog," > %s%s %s\n", + cmd->name1, + opt & O_PARAM_S ? " DEST: " : ":", + GetOptionsLSP(&par_dest,LEO__DEST)); + } + + if ( opt & O_PARAM_S ) + { + const int max = opt & O_PARAM_SS ? MAX_PAR_SRC : 1; + le_strpar_t *src = par_src; + while ( n_par_src < max ) + { + *src = ld->spar; + char *end = ScanLSP(src,arg,&err); + if (err) + goto err_param12; + if ( verbose >= 2 ) + fprintf(stdlog," > %s SRC[%02u]: %s\n", + cmd->name1, n_par_src+1, GetOptionsLSP(src,LEO__SRC)); + n_par_src++; + src++ ; + arg = end; + if ( *arg != '+' && *arg != ',' ) + break; + arg++; + } + } + if ( *arg && !(opt&O_PARAM_A) ) + return ERROR0( ERR_SEMANTIC,"%s: Missing end-of-line: %s\n",cmd->name1,arg); + } + + + //--- text argument only + + err = ~0; + switch (cmd->id) + { + case C_LECODE4: err = CreateLecode4LD(arg,ld); break; + case C_SUBST: err = SubstLD(ld,&par_dest,arg); break; + case C_COPY: err = CopyLD(ld,&par_dest,par_src,n_par_src); break; + + case C_TRACKS: + cmd = ScanKeyword(&cmd_stat,arg,tracks_tab); + if (!cmd) + { + PrintHead("Instruction: %s = %s",mode,arg); + PrintKeywordError(tab,arg,cmd_stat,0,"TRACKS keyword"); + hint_exit(ERR_SYNTAX); + } + err = TransferFilesLD(ld,cmd->opt&O_LOG,cmd->opt&O_TEST); + break; + + case C_RESERVE: + { + le_track_type_t ltty = LTTY_TRACK; + char ch = tolower(*arg); + if ( ch == 'a' || ch == 'b' ) + { + ltty = LTTY_ARENA; + arg++; + } + else if ( ch == 't' || ch == 'v' ) + arg++; + + char *end; + int n1 = str2ul(arg,&end,10); + if ( end > arg ) + { + int n2 = 1; + if ( *end == ',' || *end == 'x' ) + n2 = str2ul(end+1,0,10); + ccp ltty_name = ltty==LTTY_TRACK ? "versus track" : "battle arena"; + PRINT1("RESERVE %s %dx%d\n", ltty_name, n1, n2 ); + if ( n2 > 0 ) + { + if ( verbose >= 1 ) + fprintf(stdlog," > Reserve %dx%d %s%s\n", + n1, n2, ltty_name, n1*n2 == 1 ? "" : "s" ); + while ( n1-- > 0 ) + { + le_track_t *lt = ReserveTracksLD(ld,ltty,n2,false); + if (!lt) + break; + if ( verbose >= 1 ) + { + if ( n2 > 1 ) + fprintf(stdlog," > Slots %d to %d reserved for %u %ss.\n", + lt->track_slot, lt->track_slot + n2 -1, n2, ltty_name ); + else + fprintf(stdlog," > Slot %d reserved for a %s.\n", + lt->track_slot, ltty_name ); + } + } + } + } + } + err = ERR_OK; + break; + } + + + //-- with opened file + + if ( err == ~0 ) + { + File_t F; + err = CreateFileOpt(&F,true,arg,false,0); + if (!err) + { + const bool variant = cmd->opt & 1; // use xnames || force text mode + switch (cmd->id) + { + case C_NAMES: err = CreateNamesLD(F.f,ld,variant); break; + case C_INFO: err = CreateInfoLD(F.f,ld,variant); break; + case C_LEINFO: err = CreateLeInfoLD(F.f,ld,false); break; + case C_SHA1: err = CreateSha1LD(F.f,ld,variant,true); break; + case C_DISTRIB: err = CreateDistribLD(F.f,ld,variant); break; + + case C_CTDEF: err = CreateCtDefLD(F.f,ld); break; + case C_LEDEF: err = CreateLeDefLD(F.f,ld); break; + case C_REF: err = CreateRefLD(F.f,ld,true); break; + case C_STRINGS: err = CreateStringsLD(F.f,ld); break; + case C_DUMP: err = CreateDumpLD(F.f,ld); break; + + case C_LECODE: err = CreateLecodeLD(F.f,ld,cmd->opt); break; + case C_LPAR: err = CreateLparLD(F.f,ld,true); break; + case C_BMG: err = CreateBmgLD(F.f,ld,variant||F.is_stdio); break; + case C_PREFIX: err = SavePrefixTable(F.f,0); break; + case C_DEBUG: err = CreateDebugLD(F.f,ld); break; + } + } + CloseFile(&F,0); + } + + if ( verbose >= 2 ) + { + const u_nsec_t dur = GetTimerNSec() - start_nsec; + fprintf(stdlog,"%s >> %s done in %s%s\n", + collog->status, cmd->name1, + PrintTimerNSec6(0,0,dur,0), collog->reset ); } - fflush(stdout); return err; } +/////////////////////////////////////////////////////////////////////////////// + +static enumError cmd_distrib() +{ + stdlog = stderr; + SetupPager(); + if (!n_param) + help_distrib(ERR_OK); + + CheckOptDest("-",false); + + if ( verbose >= 1 ) + fputc('\n',stdlog); + + le_distrib_t ld; + InitializeLD(&ld); + + for ( ParamList_t *param = first_param; param; param = param->next ) + { + NORMALIZE_FILENAME_PARAM(param); + ccp arg = param->arg; + + if ( *arg == '+' ) + { + if ( verbose >= 1 ) + PrintHead("Scan options: %s",arg); + ScanOptionsLSP(&ld.spar,arg+1,"Filter option"); + if ( ld.spar.opt & LEO_HELP ) + help_distrib(ERR_OK); + if ( ld.spar.opt & LEO_M_CUT ) + { + CutLD(&ld,ld.spar.opt); + ld.spar.opt &= ~LEO_M_CUT; + } + if ( verbose >= 2 ) + fprintf(stdlog," > Options: %s\n",GetOptionsLSP(&ld.spar,LEO__ALL)); + continue; + } + + char *fname = strchr(arg,'='); + if ( fname && isalpha((int)*arg) ) + { + ccp p = arg; + while ( isalnum((int)*p) || *p == '-' ) + p++; + if ( p == fname ) + { + *fname++ = 0; + if (!*fname) + { + param = param->next; + if (param) + { + NORMALIZE_FILENAME_PARAM(param); + fname = param->arg; + } + } + cmd_distrib_instruction(&ld,arg,fname); + continue; + } + } + + if ( verbose >= 1 ) + PrintHead("Read file(s): %s",arg); + const u_nsec_t start_nsec = GetTimerNSec(); + NORMALIZE_FILENAME_PARAM(param); + ImportFileLD(&ld,arg,true,false); + if ( verbose >= 2 ) + { + const u_nsec_t dur = GetTimerNSec() - start_nsec; + fprintf(stdlog,"%s >> File(s) read in %s%s\n", + collog->status, PrintTimerNSec6(0,0,dur,0), collog->reset ); + } + } + + ClosePager(); + return ProgInfo.max_error; +} + // /////////////////////////////////////////////////////////////////////////////// /////////////// command cat /////////////// @@ -1125,13 +2216,15 @@ static enumError CheckOptions ( int argc, char ** argv, bool is_env ) case GO_COMPATIBLE: err += ScanOptCompatible(optarg); break; case GO_WIDTH: err += ScanOptWidth(optarg); break; case GO_MAX_WIDTH: err += ScanOptMaxWidth(optarg); break; + case GO_NO_PAGER: opt_no_pager = true; break; case GO_QUIET: verbose = verbose > -1 ? -1 : verbose - 1; break; case GO_VERBOSE: verbose = verbose < 0 ? 0 : verbose + 1; break; case GO_LOGGING: logging++; break; + case GO_TIMING: log_timing++; break; case GO_WARN: err += ScanOptWarn(optarg); break; case GO_DE: use_de = true; break; case GO_CT_CODE: ctcode_enabled = true; break; - case GO_LE_CODE: lecode_enabled = true; break; + case GO_LE_CODE: lecode_enabled = true; break; // optional argument ignored case GO_COLORS: err += ScanOptColorize(0,optarg,0); break; case GO_NO_COLORS: opt_colorize = COLMD_OFF; break; @@ -1144,6 +2237,7 @@ static enumError CheckOptions ( int argc, char ** argv, bool is_env ) case GO_TEST: testmode++; break; case GO_FORCE: force_count++; break; case GO_REPAIR_MAGICS: err += ScanOptRepairMagic(optarg); break; + case GO_CREATE_DISTRIB: EnableLDUMP(optarg); break; #if OPT_OLD_NEW case GO_OLD: opt_new = opt_new>0 ? -1 : opt_new-1; break; @@ -1162,6 +2256,9 @@ static enumError CheckOptions ( int argc, char ** argv, bool is_env ) case GO_PRESERVE: opt_preserve = true; break; case GO_IGNORE: opt_ignore++; break; + case GO_LOAD_PREFIX: err += ScanOptLoadPrefix(optarg); break; + case GO_PLUS: opt_plus = optarg; break; + case GO_LOAD_BMG: err += ScanOptLoadBMG(optarg); break; case GO_PATCH_BMG: err += ScanOptPatchMessage(optarg); break; case GO_MACRO_BMG: err += ScanOptMacroBMG(optarg); break; @@ -1170,7 +2267,7 @@ static enumError CheckOptions ( int argc, char ** argv, bool is_env ) case GO_ORDER_BY: opt_order_by = optarg; break; case GO_ORDER_ALL: opt_order_all = true; break; - case GO_LE_DEFINE: opt_le_define = optarg; break; + case GO_LE_DEFINE: ScanOptLeDefine(optarg); break; case GO_LE_ARENA: opt_le_arena = optarg; break; case GO_LPAR: opt_lpar = optarg; break; case GO_ALIAS: err += ScanOptAlias(optarg); break; @@ -1183,10 +2280,11 @@ static enumError CheckOptions ( int argc, char ** argv, bool is_env ) case GO_DEBUG: err += ScanOptDebug(optarg); break; case GO_TRACK_DIR: opt_track_dest = optarg; break; - case GO_COPY_TRACKS: err += ScanOptTrackSource(optarg,TFMD_COPY); break; - case GO_MOVE_TRACKS: err += ScanOptTrackSource(optarg,TFMD_MOVE); break; - case GO_MOVE1_TRACKS: err += ScanOptTrackSource(optarg,TFMD_MOVE1); break; - case GO_LINK_TRACKS: err += ScanOptTrackSource(optarg,TFMD_LINK); break; + case GO_COPY_TRACKS: err += ScanOptTrackSource(optarg,-1,TFMD_COPY); break; + case GO_MOVE_TRACKS: err += ScanOptTrackSource(optarg,-1,TFMD_MOVE); break; + case GO_MOVE1_TRACKS: err += ScanOptTrackSource(optarg,-1,TFMD_MOVE1); break; + case GO_LINK_TRACKS: err += ScanOptTrackSource(optarg,-1,TFMD_LINK); break; + case GO_SZS_MODE: err += ScanOptSzsMode(optarg); break; case GO_COMPLETE: opt_complete = true; break; @@ -1286,6 +2384,7 @@ static enumError CheckCommand ( int argc, char ** argv ) case CMD_HELP: PrintHelpColor(&InfoUI_wlect); break; case CMD_CONFIG: err = cmd_config(); break; case CMD_ARGTEST: err = cmd_argtest(argc,argv); break; + case CMD_EXPAND: err = cmd_expand(argc,argv); break; case CMD_TEST: err = cmd_test(); break; case CMD_COLORS: err = Command_COLORS(brief_count?-brief_count:long_count,0,0); break; case CMD_ERROR: err = cmd_error(); break; @@ -1306,6 +2405,7 @@ static enumError CheckCommand ( int argc, char ** argv ) case CMD_PATCH: err = cmd_patch(); break; case CMD_CREATE: err = cmd_create(); break; + case CMD_DISTRIBUTION: err = cmd_distrib(); break; case CMD_CAT: err = cmd_cat(); break; case CMD_LPAR: err = cmd_lpar(); break; case CMD_DECODE: err = cmd_convert(cmd_ct->id,"DECODE","\1P/\1N.txt"); break; @@ -1333,11 +2433,21 @@ static enumError CheckCommand ( int argc, char ** argv ) int main ( int argc, char ** argv ) #endif { + #if !SZS_WRAPPER + ArgManager_t am = {0}; + SetupArgManager(&am,LOUP_AUTO,argc,argv,false); + ExpandAtArgManager(&am,AMXM_SHORT,10,false); + argc = am.argc; + argv = am.argv; + #endif + + tool_name = "wlect"; print_title_func = print_title; SetupLib(argc,argv,WLECT_SHORT,VERSION,TITLE); ctcode_enabled = true; lecode_enabled = true; + //----- process arguments if ( argc < 2 ) @@ -1360,6 +2470,7 @@ static enumError CheckCommand ( int argc, char ** argv ) if (SIGINT_level) err = ERROR0(ERR_INTERRUPT,"Program interrupted by user."); + ClosePager(); return err; } diff --git a/project/src/wmdlt.c b/project/src/wmdlt.c index b78ea83..133e53e 100644 --- a/project/src/wmdlt.c +++ b/project/src/wmdlt.c @@ -541,13 +541,15 @@ static enumError CheckOptions ( int argc, char ** argv, bool is_env ) case GO_COMPATIBLE: err += ScanOptCompatible(optarg); break; case GO_WIDTH: err += ScanOptWidth(optarg); break; case GO_MAX_WIDTH: err += ScanOptMaxWidth(optarg); break; + case GO_NO_PAGER: opt_no_pager = true; break; case GO_QUIET: verbose = verbose > -1 ? -1 : verbose - 1; break; case GO_VERBOSE: verbose = verbose < 0 ? 0 : verbose + 1; break; case GO_LOGGING: logging++; break; + case GO_TIMING: log_timing++; break; case GO_WARN: err += ScanOptWarn(optarg); break; case GO_DE: use_de = true; break; case GO_CT_CODE: ctcode_enabled = true; break; - case GO_LE_CODE: lecode_enabled = true; break; + case GO_LE_CODE: lecode_enabled = true; break; // optional argument ignored case GO_COLORS: err += ScanOptColorize(0,optarg,0); break; case GO_NO_COLORS: opt_colorize = COLMD_OFF; break; @@ -665,6 +667,7 @@ static enumError CheckCommand ( int argc, char ** argv ) case CMD_HELP: PrintHelpColor(&InfoUI_wmdlt); break; case CMD_CONFIG: err = cmd_config(); break; case CMD_ARGTEST: err = cmd_argtest(argc,argv); break; + case CMD_EXPAND: err = cmd_expand(argc,argv); break; case CMD_TEST: err = cmd_test(); break; case CMD_COLORS: err = Command_COLORS(brief_count?-brief_count:long_count,0,0); break; case CMD_ERROR: err = cmd_error(); break; @@ -707,6 +710,15 @@ static enumError CheckCommand ( int argc, char ** argv ) int main ( int argc, char ** argv ) #endif { + #if !SZS_WRAPPER + ArgManager_t am = {0}; + SetupArgManager(&am,LOUP_AUTO,argc,argv,false); + ExpandAtArgManager(&am,AMXM_SHORT,10,false); + argc = am.argc; + argv = am.argv; + #endif + + tool_name = "wmdlt"; print_title_func = print_title; SetupLib(argc,argv,WMDLT_SHORT,VERSION,TITLE); @@ -732,6 +744,7 @@ static enumError CheckCommand ( int argc, char ** argv ) if (SIGINT_level) err = ERROR0(ERR_INTERRUPT,"Program interrupted by user."); + ClosePager(); return err; } diff --git a/project/src/wpatt.c b/project/src/wpatt.c index 47107a5..e383ab0 100644 --- a/project/src/wpatt.c +++ b/project/src/wpatt.c @@ -350,13 +350,15 @@ static enumError CheckOptions ( int argc, char ** argv, bool is_env ) case GO_COMPATIBLE: err += ScanOptCompatible(optarg); break; case GO_WIDTH: err += ScanOptWidth(optarg); break; case GO_MAX_WIDTH: err += ScanOptMaxWidth(optarg); break; + case GO_NO_PAGER: opt_no_pager = true; break; case GO_QUIET: verbose = verbose > -1 ? -1 : verbose - 1; break; case GO_VERBOSE: verbose = verbose < 0 ? 0 : verbose + 1; break; case GO_LOGGING: logging++; break; + case GO_TIMING: log_timing++; break; case GO_WARN: err += ScanOptWarn(optarg); break; case GO_DE: use_de = true; break; case GO_CT_CODE: ctcode_enabled = true; break; - case GO_LE_CODE: lecode_enabled = true; break; + case GO_LE_CODE: lecode_enabled = true; break; // optional argument ignored case GO_COLORS: err += ScanOptColorize(0,optarg,0); break; case GO_NO_COLORS: opt_colorize = COLMD_OFF; break; @@ -459,6 +461,7 @@ static enumError CheckCommand ( int argc, char ** argv ) case CMD_HELP: PrintHelpColor(&InfoUI_wpatt); break; case CMD_CONFIG: err = cmd_config(); break; case CMD_ARGTEST: err = cmd_argtest(argc,argv); break; + case CMD_EXPAND: err = cmd_expand(argc,argv); break; case CMD_TEST: err = cmd_test(); break; case CMD_COLORS: err = Command_COLORS(brief_count?-brief_count:long_count,0,0); break; case CMD_ERROR: err = cmd_error(); break; @@ -497,6 +500,15 @@ static enumError CheckCommand ( int argc, char ** argv ) int main ( int argc, char ** argv ) #endif { + #if !SZS_WRAPPER + ArgManager_t am = {0}; + SetupArgManager(&am,LOUP_AUTO,argc,argv,false); + ExpandAtArgManager(&am,AMXM_SHORT,10,false); + argc = am.argc; + argv = am.argv; + #endif + + tool_name = "wpatt"; print_title_func = print_title; SetupLib(argc,argv,WPATT_SHORT,VERSION,TITLE); @@ -522,6 +534,7 @@ static enumError CheckCommand ( int argc, char ** argv ) if (SIGINT_level) err = ERROR0(ERR_INTERRUPT,"Program interrupted by user."); + ClosePager(); return err; } diff --git a/project/src/wstrt.c b/project/src/wstrt.c index 7708f78..81ee94d 100644 --- a/project/src/wstrt.c +++ b/project/src/wstrt.c @@ -311,7 +311,7 @@ static enumError cmd_hexdump() { //--- list addresses of option --vaddr and --faddr - if ( logging > 1 ) + if ( logging >= 2 ) { if (dol_sections) fprintf(stdlog,"\nSections: %s\n", @@ -363,7 +363,7 @@ static enumError cmd_hexdump() else TranslateAllDolOffsets(dol,&mm,true); - if ( logging > 1 ) + if ( logging >= 2 ) { fputs("\nList of virtual addresses to dump:\n\n",stdlog); PrintMemMap(&mm,stdlog,5,0); @@ -1583,13 +1583,15 @@ static enumError CheckOptions ( int argc, char ** argv, bool is_env ) case GO_COMPATIBLE: err += ScanOptCompatible(optarg); break; case GO_WIDTH: err += ScanOptWidth(optarg); break; case GO_MAX_WIDTH: err += ScanOptMaxWidth(optarg); break; + case GO_NO_PAGER: opt_no_pager = true; break; case GO_QUIET: verbose = verbose > -1 ? -1 : verbose - 1; break; case GO_VERBOSE: verbose = verbose < 0 ? 0 : verbose + 1; break; case GO_LOGGING: logging++; break; + case GO_TIMING: log_timing++; break; case GO_WARN: err += ScanOptWarn(optarg); break; case GO_DE: use_de = true; break; case GO_CT_CODE: ctcode_enabled = true; break; - case GO_LE_CODE: lecode_enabled = true; break; + case GO_LE_CODE: lecode_enabled = true; break; // optional argument ignored case GO_COLORS: err += ScanOptColorize(0,optarg,0); break; case GO_NO_COLORS: opt_colorize = COLMD_OFF; break; @@ -1788,6 +1790,7 @@ static enumError CheckCommand ( int argc, char ** argv ) case CMD_HELP: PrintHelpColor(&InfoUI_wstrt); break; case CMD_CONFIG: err = cmd_config(); break; case CMD_ARGTEST: err = cmd_argtest(argc,argv); break; + case CMD_EXPAND: err = cmd_expand(argc,argv); break; case CMD_TEST: err = cmd_test(); break; case CMD_COLORS: err = Command_COLORS(brief_count?-brief_count:long_count,0,0); break; @@ -1835,6 +1838,15 @@ static enumError CheckCommand ( int argc, char ** argv ) int main ( int argc, char ** argv ) #endif { + #if !SZS_WRAPPER + ArgManager_t am = {0}; + SetupArgManager(&am,LOUP_AUTO,argc,argv,false); + ExpandAtArgManager(&am,AMXM_SHORT,10,false); + argc = am.argc; + argv = am.argv; + #endif + + tool_name = "wstrt"; print_title_func = print_title; SetupLib(argc,argv,WSTRT_SHORT,VERSION,TITLE); @@ -1868,6 +1880,7 @@ static enumError CheckCommand ( int argc, char ** argv ) if (SIGINT_level) err = ERROR0(ERR_INTERRUPT,"Program interrupted by user."); + ClosePager(); return err; } diff --git a/project/src/wszst.c b/project/src/wszst.c index f39bd59..7d8d475 100644 --- a/project/src/wszst.c +++ b/project/src/wszst.c @@ -44,7 +44,7 @@ #include "lib-xbmg.h" #include "lib-kcl.h" #include "lib-kmp.h" -#include "lib-lecode.h" +#include "lib-ledis.h" #include "lib-mdl.h" #include "lib-pat.h" #include "lib-breff.h" @@ -69,8 +69,6 @@ #include "wcommand.h" #endif -#include "distrib.inc" - // /////////////////////////////////////////////////////////////////////////////// /////////////// definitions /////////////// @@ -451,7 +449,7 @@ static const sizeof_info_t sizeof_info_szs_list[] = SIZEOF_INFO_ENTRY(kmp_ana_pflag_res_t) SIZEOF_INFO_ENTRY(kmp_ana_pflag_t) - SIZEOF_INFO_TITLE("LE-CODE") + SIZEOF_INFO_TITLE("LE-CODE basics") SIZEOF_INFO_ENTRY(lecode_debug_info_t) SIZEOF_INFO_ENTRY(lecode_debug_ex_t) SIZEOF_INFO_ENTRY(le_lpar_t) @@ -469,6 +467,30 @@ static const sizeof_info_t sizeof_info_szs_list[] = SIZEOF_INFO_ENTRY(le_cup_par_t) SIZEOF_INFO_ENTRY(le_course_par_t) SIZEOF_INFO_ENTRY(le_analyse_t) + SIZEOF_INFO_ENTRY(le_region_t) + SIZEOF_INFO_ENTRY(le_cup_track_t) + SIZEOF_INFO_ENTRY(le_property_t) + SIZEOF_INFO_ENTRY(le_music_t) + SIZEOF_INFO_ENTRY(le_flags_t) + + SIZEOF_INFO_TITLE("LE-CODE distribution") + SIZEOF_INFO_ENTRY(le_group_t) + SIZEOF_INFO_ENTRY(le_track_type_t) + SIZEOF_INFO_ENTRY(le_track_status_t) + SIZEOF_INFO_ENTRY(le_track_text_t) + SIZEOF_INFO_ENTRY(le_options_t) + SIZEOF_INFO_ENTRY(le_cup_ref_t) + SIZEOF_INFO_ENTRY(le_cup_t) + SIZEOF_INFO_ENTRY(le_strpar_t) + SIZEOF_INFO_ENTRY(le_track_id_t) + SIZEOF_INFO_ENTRY(le_track_t) + SIZEOF_INFO_ENTRY(le_track_arch_t) + SIZEOF_INFO_ENTRY(le_auto_setup_t) + SIZEOF_INFO_ENTRY(le_type_settings_t) + SIZEOF_INFO_ENTRY(le_settings_t) + SIZEOF_INFO_ENTRY(le_group_info_t) + SIZEOF_INFO_ENTRY(le_distrib_t) + SIZEOF_INFO_ENTRY(DistributionInfo_t) SIZEOF_INFO_TITLE("LEX") SIZEOF_INFO_ENTRY(features_szs_t) @@ -577,6 +599,8 @@ static const sizeof_info_t sizeof_info_szs_list[] = SIZEOF_INFO_ENTRY(wbz_header_t) SIZEOF_INFO_ENTRY(analyse_szs_t) SIZEOF_INFO_ENTRY(file_type_t) + SIZEOF_INFO_ENTRY(mkw_prefix_t) + SIZEOF_INFO_ENTRY(split_filename_t) SIZEOF_INFO_TERM() }; @@ -2541,6 +2565,118 @@ static enumError cmd_analyze() // /////////////////////////////////////////////////////////////////////////////// +/////////////// command split /////////////// +/////////////////////////////////////////////////////////////////////////////// + +static void print_split_val ( PrintScript_t *ps, ccp name, mem_t val ) +{ + DASSERT(ps); + DASSERT(name); + + + if ( val.ptr && val.len ) + { + char buf[1000]; + PrintEscapedString(buf,sizeof(buf),val.ptr,val.len,CHMD_UTF8,'"',0); + PrintScriptVars(ps,0,"%s=\"%s\"\n",name,buf); + } + else + PrintScriptVars(ps,0,"%s=\"\"\n",name); +} + +//----------------------------------------------------------------------------- + +static enumError cmd_split() +{ + static ccp def_path = "\1P/\1F\1?T"; + CheckOptDest("-",false); + char dest[PATH_MAX]; + enumError max_err = ERR_OK; + if (!strcmp(opt_dest,"-")) + fputc('\n',stdout); + + split_filename_t spf; + InitializeSPF(&spf); + + File_t fo; + InitializeFile(&fo); + + PrintScript_t ps; + SetupPrintScriptByOptions(&ps); + + ParamList_t *param; + for ( param = first_param; param; param = param->next ) + { + NORMALIZE_FILENAME_PARAM(param); + + if (!fo.f) + SubstDest(dest,sizeof(dest),param->arg,opt_dest,def_path, + GetExtFF(script_fform,0),false); + + if (!fo.f) + { + enumError err = CreateFile(&fo,false,dest,FM_STDIO|FM_OVERWRITE); + if (err) + { + max_err = err; + break; + } + ps.f = fo.f; + PrintScriptHeader(&ps); + } + + const u_nsec_t start_nsec = GetTimerNSec(); + AnalyseSPF(&spf,false,param->arg,0,CPM_LINK,opt_plus); + const u_nsec_t duration_nsec = GetTimerNSec() - start_nsec; + + PutScriptVars(&ps,1,0); + + print_split_val(&ps,"source",spf.source); + + print_split_val(&ps,"file_name",spf.f_name); + print_split_val(&ps,"file_d",spf.f_d); + print_split_val(&ps,"file_ext",spf.f_ext); + + print_split_val(&ps,"normed",spf.norm); + print_split_val(&ps,"plus",spf.plus); + PrintScriptVars(&ps,0,"plus_order=%d\n",spf.plus_order); + + #if SUPPORT_SPLIT_SIGN + print_split_val(&ps,"sign",spf.sign); + #endif + print_split_val(&ps,"boost",spf.boost); + + print_split_val(&ps,"game1",spf.game1); + print_split_val(&ps,"game2",spf.game2); + print_split_val(&ps,"game",spf.game); + PrintScriptVars(&ps,0,"game_order=%d\ngame_color=%d\n", + spf.game_order, spf.game_color ); + + print_split_val(&ps,"name",spf.name); + print_split_val(&ps,"extra",spf.extra); + print_split_val(&ps,"version",spf.version); + print_split_val(&ps,"authors",spf.authors); + print_split_val(&ps,"attribs",spf.attribs); + + PrintScriptVars(&ps,2,"duration_nsec=%llu\n",duration_nsec); + + if (!script_array) + { + PrintScriptFooter(&ps); + ps.f = 0; + ResetFile(&fo,0); + } + } + + PrintScriptFooter(&ps); + ResetPrintScript(&ps); + ResetFile(&fo,0); + ResetSPF(&spf); + return max_err; +} + +// +/////////////////////////////////////////////////////////////////////////////// /////////////// command is-texture /////////////// /////////////////////////////////////////////////////////////////////////////// @@ -2841,61 +2977,6 @@ enumError ScanDistribFile /////////////////////////////////////////////////////////////////////////////// -static ccp GetDistribParamByNameS ( DistributionInfo_t *dinf, ccp name, ccp def ) -{ - DASSERT(dinf); - DASSERT(name); - ParamFieldItem_t *it = FindParamField(&dinf->param,name); - if ( it && it->data ) - { - it->num = 1; - return (ccp)it->data; - } - return def; -} - -/////////////////////////////////////////////////////////////////////////////// -// for name changes - -#if 0 - -static ccp GetDistribParamByNameS2 - ( DistributionInfo_t *dinf, ccp name1, ccp name2, ccp def ) -{ - DASSERT(dinf); - DASSERT(name); - ParamFieldItem_t *it = FindParamField(&dinf->param,name1); - if (!it) - it = FindParamField(&dinf->param,name2); - if ( it && it->data ) - { - it->num = 1; - return (ccp)it->data; - } - return def; -} - -#endif - -/////////////////////////////////////////////////////////////////////////////// - -static int GetDistribParamByNameIMM - ( DistributionInfo_t *dinf, ccp name, int def, int min, int max ) -{ - DASSERT(dinf); - DASSERT(name); - ParamFieldItem_t *it = FindParamField(&dinf->param,name); - if (!it) - return def; - it->num = 1; - - char *end; - int val = str2l((ccp)it->data,&end,10); - return *end || val < min || val > max ? def : val; -} - -/////////////////////////////////////////////////////////////////////////////// - static enumError cmd_distribution() { SetPatchFileModeReadonly(); @@ -2958,21 +3039,21 @@ static enumError cmd_distribution() else if ( !result_found && !strcmp(result,arg) ) { result_found = true; - ScanSlotTranslation(&dinf.translate,&dinf.param,arg,false); + ScanSlotTranslation(&dinf.translate,&dinf.ld,arg,false); } else ScanSlotTranslation(&dinf.translate,0,arg,false); } if (!result_found) - ScanSlotTranslation(&dinf.translate,&dinf.param,result,true); + ScanSlotTranslation(&dinf.translate,&dinf.ld,result,true); AddParamDistributionInfo(&dinf,false); //--- logging - if ( logging > 0 ) + if ( logging >= 1 ) { fputs("--------------- translation ---------------\n",stdlog); @@ -3007,8 +3088,8 @@ static enumError cmd_distribution() fputs("---------------- parameter ----------------\n",stdlog); uint i; - const ParamFieldItem_t *it = dinf.param.field; - for ( i = 0; i < dinf.param.used; i++, it++ ) + const ParamFieldItem_t *it = dinf.ld.dis_param.field; + for ( i = 0; i < dinf.ld.dis_param.used; i++, it++ ) fprintf(stdlog,"%4u. %-20s = %s\n", i+1, it->key, (ccp)it->data ); @@ -3089,84 +3170,11 @@ static enumError cmd_distribution() if (!f) ERROR1(ERR_CANT_CREATE,"Can't create file: %s\n",result); - ccp uuid = GetDistribParamByNameS(&dinf,"UUID",""); - fprintf(f,text_distrib_head_cr - - ,GetDistribParamByNameS(&dinf,"COMMENT1","") - ,GetDistribParamByNameS(&dinf,"COMMENT2","") - ,GetDistribParamByNameS(&dinf,"COMMENT3","") - ,GetDistribParamByNameS(&dinf,"COMMENT4","") - ,GetDistribParamByNameS(&dinf,"COMMENT5","") - - ,GetDistribParamByNameS(&dinf,"USER-CT-WIIMM","") - ,GetDistribParamByNameS(&dinf,"USER-WIIMMFI","") - ,GetDistribParamByNameS(&dinf,"USER-CT-WIIKI","") - ,GetDistribParamByNameS(&dinf,"USER-MISC","") - ,GetDistribParamByNameS(&dinf,"MAIL","") - ,GetDistribParamByNameS(&dinf,"NOTE-FOR-WIMMM","") - - ,GetDistribParamByNameS(&dinf,"NAME","?") - ,GetDistribParamByNameS(&dinf,"VERSION","?") - ,GetDistribParamByNameS(&dinf,"AUTHORS","?") - ,GetDistribParamByNameS(&dinf,"RELEASE-DATE","") - ,GetDistribParamByNameS(&dinf,"KEYWORDS","") - ,GetDistribParamByNameS(&dinf,"PREDECESSOR","") - - ,GetDistribParamByNameS(&dinf,"WIIMMFI-REGION","") - ,GetDistribParamByNameS(&dinf,"INFO-TEXT","") - ,GetDistribParamByNameS(&dinf,"INFO-URL","") - - ,uuid - ,GetDistribParamByNameIMM(&dinf,"DISPLAY-MODE",3,0,3) - ,GetDistribParamByNameIMM(&dinf,"DATABASE-NAME",1,0,1) - ,GetDistribParamByNameIMM(&dinf,"VIEW-COMMENT",0,0,1) - ,GetDistribParamByNameIMM(&dinf,"ENABLE-NEW",0,0,1) - ,GetDistribParamByNameIMM(&dinf,"ENABLE-AGAIN",0,0,1) - ,GetDistribParamByNameIMM(&dinf,"ENABLE-FILL",0,0,1) - ,GetDistribParamByNameIMM(&dinf,"ENABLE-UPDATE",0,0,1) - ,GetDistribParamByNameIMM(&dinf,"ENABLE-BOOST",0,0,1) - - ,uuid - ,VERSION - ,REVISION_NUM - ,GetDistribParamByNameS(&dinf,"FIRST-CREATION","") - ,GetDistribParamByNameS(&dinf,"LAST-UPDATE","") - ); - - - - //--- mark some more params as 'used' - - GetDistribParamByNameS(&dinf,"WSZST-VERSION",""); - GetDistribParamByNameS(&dinf,"WSZST-REVISION",""); - - - //--- additional parameters - - ccp info = text_distrib_param_cr; - - const ParamFieldItem_t *it = dinf.param.field; - for ( i = 0; i < dinf.param.used; i++, it++ ) - if (!it->num) - { - int len = strlen(it->key); - ccp sep; - if ( len > 14 ) - sep = " "; - else if ( len > 6 ) - sep = "\t"; - else - sep = "\t\t"; - - fprintf(f,"%s@%s%s= %s\r\n", info, it->key, sep, (ccp)it->data ); - info = ""; - } + CreateDistribLD(f,&dinf.ld,true); //--- battle arenas - fputs(text_distrib_tracks_cr,f); - int slot, slot10 = -1, count = 0; for ( slot = 0; slot < MAX_DISTRIBUTION_ARENA; slot++ ) { @@ -5584,13 +5592,15 @@ static enumError CheckOptions ( int argc, char ** argv, bool is_env ) case GO_COMPATIBLE: err += ScanOptCompatible(optarg); break; case GO_WIDTH: err += ScanOptWidth(optarg); break; case GO_MAX_WIDTH: err += ScanOptMaxWidth(optarg); break; + case GO_NO_PAGER: opt_no_pager = true; break; case GO_QUIET: verbose = verbose > -1 ? -1 : verbose - 1; break; case GO_VERBOSE: verbose = verbose < 0 ? 0 : verbose + 1; break; case GO_LOGGING: logging++; break; + case GO_TIMING: log_timing++; break; case GO_WARN: err += ScanOptWarn(optarg); break; case GO_DE: use_de = true; break; case GO_CT_CODE: ctcode_enabled = true; break; - case GO_LE_CODE: lecode_enabled = true; break; + case GO_LE_CODE: lecode_enabled = true; break; // optional argument ignored case GO_COLORS: err += ScanOptColorize(0,optarg,0); break; case GO_NO_COLORS: opt_colorize = COLMD_OFF; break; @@ -5598,6 +5608,8 @@ static enumError CheckOptions ( int argc, char ** argv, bool is_env ) case GO_CONST: err += ScanOptConst(optarg); break; case GO_TOUCH: break; case GO_AUTO: break; + case GO_LOAD_PREFIX: err += ScanOptLoadPrefix(optarg); break; + case GO_PLUS: opt_plus = optarg; break; case GO_SET_FLAGS: err += ScanOptSetFlags(optarg); break; case GO_SET_SCALE: err += ScanOptSetScale(optarg); break; case GO_SET_ROT: err += ScanOptSetRot(optarg); break; @@ -5887,6 +5899,7 @@ static enumError CheckCommand ( int argc, char ** argv ) case CMD_CONFIG: err = cmd_config(); break; case CMD_INSTALL: err = cmd_install(); break; case CMD_ARGTEST: err = cmd_argtest(argc,argv); break; + case CMD_EXPAND: err = cmd_expand(argc,argv); break; case CMD_TEST: err = cmd_test(); break; case CMD_COLORS: err = Command_COLORS(brief_count?-brief_count:long_count,0,0); break; case CMD_ERROR: err = cmd_error(); break; @@ -5932,6 +5945,7 @@ static enumError CheckCommand ( int argc, char ** argv ) case CMD_MEMORY_A: set_all(1); err = cmd_memory(); break; case CMD_SHA1: err = cmd_sha1(); break; case CMD_ANALYZE: err = cmd_analyze(); break; + case CMD_SPLIT: err = cmd_split(); break; case CMD_IS_TEXTURE: err = cmd_is_texture(); break; case CMD_FEATURES: err = cmd_features(); break; case CMD_DISTRIBUTION: err = cmd_distribution(); break; @@ -5989,6 +6003,7 @@ static enumError CheckCommand ( int argc, char ** argv ) int main_wszst ( int argc, char ** argv ) { + tool_name = "wszst"; print_title_func = print_title; SetupLib(argc,argv,WSZST_SHORT,VERSION,TITLE); SetupExtendedSZS(); @@ -6307,6 +6322,12 @@ int main_wrapper ( int argc, char ** argv ) int main ( int argc, char ** argv ) { + ArgManager_t am = {0}; + SetupArgManager(&am,LOUP_AUTO,argc,argv,false); + ExpandAtArgManager(&am,AMXM_SHORT,10,false); + argc = am.argc; + argv = am.argv; + //PRINT("ERR__N=%u\n",ERR__N); if ( argc > 1 ) { @@ -6321,7 +6342,9 @@ int main ( int argc, char ** argv ) const wrapper_t *w = FindWrapper(argc,argv); DASSERT(w); - return w->func(argc,argv); + const int err = w->func(argc,argv); + ClosePager(); + return err; } // diff --git a/project/src/wtest.c b/project/src/wtest.c index 2283dd8..10e7814 100644 --- a/project/src/wtest.c +++ b/project/src/wtest.c @@ -4050,6 +4050,98 @@ static enumError test_arg_manager ( int argc, char ** argv ) // /////////////////////////////////////////////////////////////////////////////// +/////////////// test_xcode_hex() /////////////// +/////////////////////////////////////////////////////////////////////////////// + +static enumError test_xcode_hex ( int argc, char ** argv ) +{ + putchar('\n'); + char buf1[50], buf2[20]; + for ( int i = 1; i < argc; i++ ) + { + ccp arg = argv[i]; + int elen = EncodeHex(buf1,sizeof(buf1),arg,-1,0); + int dlen = DecodeHex(buf2,sizeof(buf2),buf1,-1,-1,0); + printf("\n| %s | %s | %s | %d,%d\n",arg,buf1,buf2,elen,dlen); + + elen = EncodeHex(buf1+1,sizeof(buf1)-2,arg,-1,0); + char *ptr = buf1 + elen + 1; + *buf1 = *ptr++ = '"'; + *ptr = 0; + dlen = DecodeHex(buf2,sizeof(buf2),buf1,-1,-1,0); + printf("| %s | %s | %s | %d,%d\n",arg,buf1,buf2,elen,dlen); + } + putchar('\n'); + return 0; +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// test_is_checksum() /////////////// +/////////////////////////////////////////////////////////////////////////////// + +static enumError test_is_checksum ( int argc, char ** argv ) +{ + putchar('\n'); + sha1_size_t res; + sha1_hex_t hex; + + for ( int i = 1; i < argc; i++ ) + { + ccp arg = argv[i]; + int stat = IsSSChecksum(&res,arg,-1); + Sha1Bin2Hex(hex,res.hash); + printf(" %d %s : %s\n",stat,hex,arg); + } + putchar('\n'); + return 0; +} + +// +/////////////////////////////////////////////////////////////////////////////// +/////////////// test_test_prefix() /////////////// +/////////////////////////////////////////////////////////////////////////////// + +static enumError test_test_prefix ( int argc, char ** argv ) +{ + putchar('\n'); + + for ( int i = 1; i < argc; i++ ) + { + ccp arg = argv[i]; + if (!strcmp(arg,"-l")) + { + const mkw_prefix_t *tab = GetPrefixTable(); + if (tab) + { + putchar('\n'); + for ( ; tab->info; tab++ ) + printf(" %-8s %s\n",tab->prefix,tab->info); + putchar('\n'); + } + continue; + } + if (!strcmp(arg,"-x")) + { + SavePrefixTableFN("-",0); + continue; + } + + const mkw_prefix_t *key0 = FindPrefix(arg,-1,false); + const mkw_prefix_t *key1 = FindPrefix(arg,-1,true); + printf(" %d %d : %10.10s",key0!=0,key1!=0,arg); + if (key0) + printf(" => %-8s %s\n",key0->prefix,key0->info); + else + putchar('\n'); + } + + putchar('\n'); + return 0; +} + +// +/////////////////////////////////////////////////////////////////////////////// /////////////// develop() /////////////// /////////////////////////////////////////////////////////////////////////////// @@ -4329,6 +4421,9 @@ enum CMD_UTF8, // test_utf8(argc,argv) CMD_NICE, // test_nice(argc,argv) CMD_ARG_MANAGER, // test_arg_manager(argc,argv) + CMD_XCODE_HEX, // test_xcode_hex(argc,argv) + CMD_IS_CHECKSUM, // test_is_checksum(argc,argv) + CMD_TEST_PREFIX, // test_test_prefix(argc,argv) #ifdef HAVE_WIIMM_EXT CMD_WIIMM, // test_wiimm(argc,argv) @@ -4401,6 +4496,9 @@ static const KeywordTab_t CommandTab[] = { CMD_UTF8, "UTF8", 0, 0 }, { CMD_NICE, "NICE", 0, 0 }, { CMD_ARG_MANAGER, "ARG-MANAGER", "AM", 0 }, + { CMD_XCODE_HEX, "XCODE-HEX", "XH", 0 }, + { CMD_IS_CHECKSUM, "IS-CHECKSUM", "ICSUM", 0 }, + { CMD_TEST_PREFIX, "TEST-PREFIX", "TP", 0 }, #ifdef HAVE_WIIMM_EXT { CMD_WIIMM, "WIIMM", "W", 0 }, @@ -4456,6 +4554,12 @@ void AddOne ( double m[3][4] ) int main ( int argc, char ** argv ) { + ArgManager_t am = {0}; + SetupArgManager(&am,LOUP_AUTO,argc,argv,false); + ExpandAtArgManager(&am,AMXM_SHORT,10,false); + argc = am.argc; + argv = am.argv; + print_title_func = print_title; SetupLib(argc,argv,NAME,VERSION,TITLE); @@ -4564,6 +4668,9 @@ int main ( int argc, char ** argv ) case CMD_UTF8: test_utf8(argc,argv); break; case CMD_NICE: test_nice(argc,argv); break; case CMD_ARG_MANAGER: test_arg_manager(argc,argv); break; + case CMD_XCODE_HEX: test_xcode_hex(argc,argv); break; + case CMD_IS_CHECKSUM: test_is_checksum(argc,argv); break; + case CMD_TEST_PREFIX: test_test_prefix(argc,argv); break; #ifdef HAVE_WIIMM_EXT case CMD_WIIMM: test_wiimm(argc,argv); break; @@ -4580,6 +4687,7 @@ int main ( int argc, char ** argv ) if (SIGINT_level) ERROR0(ERR_INTERRUPT,"Program interrupted by user."); + ClosePager(); return ProgInfo.max_error; } diff --git a/project/templates/HISTORY.txt b/project/templates/HISTORY.txt index 4221a31..d88e245 100644 --- a/project/templates/HISTORY.txt +++ b/project/templates/HISTORY.txt @@ -549,6 +549,12 @@ szs v2.27a r8529 - 2022-05-13 - wszst ANALYZE: Detect goombas with scale other than 1.00. +szs v2.27b r8534 - 2022-05-22 + + - Bug fix for scanning DEBUG-* sections of LPAR.txt: Parameters ITEM-POINT and + KCL-TYPE were not recognized. + + @@MODULE(last-history.txt)@@ diff --git a/project/templates/MILESTONES.txt b/project/templates/MILESTONES.txt index 273855f..c6d4f8e 100644 --- a/project/templates/MILESTONES.txt +++ b/project/templates/MILESTONES.txt @@ -141,13 +141,19 @@ szs v1.60a r7578 - 2018-08-21 - Advanced support of battle arenas. - Support of dispatch points (enemy routes) -szs v2.00a +szs v2.00a r7754 - 2019-02-22 - Support of LE-CODE (Leserattes CT-CODE). - VR calculations. -szs v2.01a +szs v2.01a r7798 - 2019-03-16 - First LEX support. -szs v2.08a +szs v2.08a r7979 - 2019-09-05 - Support of all known BMG encodings (CP-1252, UTF-16, SHIFT-JIS and UTF-8). +szs v2.15a r8176 - 2020-04-03 + - Support of file format LPAR to manage LE-CODE parameters by a text file. + +szs v2.28a + - wlect distribution and new self defined file formats. + diff --git a/project/templates/module/last-history.txt b/project/templates/module/last-history.txt index b16592c..5c5c501 100644 --- a/project/templates/module/last-history.txt +++ b/project/templates/module/last-history.txt @@ -1,7 +1,21 @@ szs v@@VERSION@@ r@@REV-NEXT@@ - @@@@-@@-@@ - - Bug fix for scanning DEBUG-* sections of LPAR.txt: Parameters ITEM-POINT and - KCL-TYPE were not recognized. + - There is a new property for parsing the command line. In a preliminary + step, the options "-@FILENAME" (1 argument) and "-@ FILENAME" (2 arguments) + are searched. Each occurrence is replaced by the contents of file FILENAME, + which again may contain "-@...". The maximum recursion depth is 10. + Wildcard patterns are not resolved. + - New command for all tools: EXPAND: All parameters are treated as a filename + with wildcards and all matching files are searched. + - New command: wszst SPLIT: Analyse (file) names and split them into the + different parts. Print the results in machine readable format. + - Command wlect CREATE re-implemented. Type 'wlect create help' for details. + - New command: wlect DISTRIBUTION: The command manages data for LE-CODE track + distributions. It reads any number of source files with different file + types, collects the data and creates any number of files with different + file types. Type 'wlect distribution' without arguments to get details. + - New file formats to support wlect DISTRIBUTION: LE-DEF, LE-DIS, LE-REF, + LE-STR, SHA1REF and PREFIX. ~ - MDL support: Scanning a MDL file and transferring the data into an internal ~ format was already implemented, but only used for analysis purposes. Now it diff --git a/project/text-files/ctcode.inc/ctcode-list-syntax-full-cr.inc b/project/text-files/ctcode.inc/ctcode-list-syntax-full-cr.inc index e1e4fb2..34d3158 100644 --- a/project/text-files/ctcode.inc/ctcode-list-syntax-full-cr.inc +++ b/project/text-files/ctcode.inc/ctcode-list-syntax-full-cr.inc @@ -7,13 +7,18 @@ # # * Option: '%' name = value # -# Set option NAME to VAULE. The follwing options are supported: +# Set option NAME to VAULE. The following options are supported: # # LE-FLAGS = 0 | 1 # Enable or disable support of LE-FLAGS member. At section start # it is disabled. If enabled, the Track definition expects an # additional parameter between 'property_id' and 'file_name'. # +# N-STRINGS = 4..255 +# Define the number of strings beginning with string FILE_NAME. +# Use this setting to allow more than 4 strings without running +# into a syntax error. +# # * Nintendo track mode: 'N' mode # # This command can only be used once and only before the first track @@ -124,6 +129,11 @@ # that tracks with equal identifiers are equal. Empty strings # and a single "-" means: no identifier available. # +# * xname +# Optional string, tha can be used by e.g. »wlect CREATE XNAMES« +# or »wlect CREATE XINFO« to create listings with this extended +# names. This string is supported since v2.29. +# # * Hidden track definition: # 'H' music_id ';' property_id ';' file_name ';' info ';' id # 'H' music_id ';' property_id ';' le_flags ';' file_name ';' info ';' id diff --git a/project/text-files/distrib.inc/distrib-tracks-cr.inc b/project/text-files/distrib.inc/distrib-tracks-cr.inc index 47c0e71..21c6935 100644 --- a/project/text-files/distrib.inc/distrib-tracks-cr.inc +++ b/project/text-files/distrib.inc/distrib-tracks-cr.inc @@ -1,9 +1,28 @@ #FF# +[TRACK-LIST] #------------------------------------------------------------------------------ -# Track listing of format: SHA1 SLOT NAME +# Track listing #------------------------------------------------------------------------------ -# Please edit the slot column. Use »CUP.INDEX« (e.g. »1.2« or »20.4«) for -# racing tracks and »'A' CUP.INDEX« (e.g. »A1.1« or »A2.5«) for battle arenas. +# This is the track listing. 2 formats are supported: +# old: SHA1 CUP NAME +# new: TYPE FLAGS SHA1 TRACK_SLOT CUP NAME +# +# TYPE is either 'vs' or 'bt'. When TYPE is present, then TRACK_SLOT is +# expected. SHA1 is the SHA1 checksunm of the track. +# FLAGS information about features: +# d:is _d file / t:title only / h:hidden / o:original track +# SHA1 is the sha1 of the track. +# TRACK_SLOT is a number between 0 and 4095 to define the slot number of the +# track. If <0 or not a number, the slot is undefined. +# CUP is of format "cup.index". An optional 'A' can be used as the first +# character to indicate an arena. However, this indicator is ignored if +# TYPE is present. Set it to "-" if the cup is unknown. +# All other characters are read in as the NAME of the track. +# +# The new format is compatible with Wiimmfi.de for region limits. + +# Please edit the CUP column if missed. Use »CUP.INDEX« (e.g. »1.2« or »20.4«) +# for racing tracks and »'A' CUP.INDEX« (e.g. »A2.5«) for battle arenas. diff --git a/project/text-files/ledis.inc/ledis-ctdef-header-cr.inc b/project/text-files/ledis.inc/ledis-ctdef-header-cr.inc new file mode 100644 index 0000000..98415f0 --- /dev/null +++ b/project/text-files/ledis.inc/ledis-ctdef-header-cr.inc @@ -0,0 +1,30 @@ +%s + +#------------------------------------------------------------------------------ +# +# This file was created by »wlect distrib ... CTDEF=...«. It is not guaranteed +# to correctly represent all features of the distribution. This applies in +# particular to the slot arrangement. In addition, only the property slots can +# be defined for the battle arenas. +# +# As an alternative, the use of LEDEF= instead of CTDEF= is recommended. +# +# Due to some new parameters, this file can only be read with the tools since +# version 2.28a. +# +#------------------------------------------------------------------------------ + +[RACING-TRACK-LIST] + +# Define the maximum number of strings of track definition: +%%N-STRINGS = 4 + +# Enable support for LE-CODE flags (0=no, 1=yes): +%%LE-FLAGS = 1 + +# Auto insert a Wiimm cup with 4 special random slots (0=no, 1=yes): +%%WIIMM-CUP = %d + +# Standard setup +N N$SWAP | N$F_WII + diff --git a/project/text-files/ledis.inc/ledis-ledef-cup-list-cr.inc b/project/text-files/ledis.inc/ledis-ledef-cup-list-cr.inc new file mode 100644 index 0000000..233ba62 --- /dev/null +++ b/project/text-files/ledis.inc/ledis-ledef-cup-list-cr.inc @@ -0,0 +1,67 @@ + +# +################ + [CUP-LIST] +################ + +# It makes no sense not to fill cups with tracks. Therefore, cups are simply +# filled with tracks in order of definition and new cups are created as +# needed. This is usually done with the command APPEND. Battle arenas and +# versus tracks are considered separately and the tracks are assigned +# accordingly. +# +# Battle and versus cup definitions can be done in any order. Only the +# sequences within battle cups and within versus cups are important. +# +# The command NEW-CUP creates a new battle or versus (vs) cup. Any +# unoccupied places in the current cup remain empty at the moment. +# +# At the end, when all commands have been processed, more cups may be added to +# get an even number of battle cups and of versus cups. Then all cups are +# filled with arenas and tracks. This happens first with tracks not yet used +# (if the related option is activated), and then with tracks already used. +# +# Hidden tracks can't be added to a cup. +# +# Syntax: +# +# APPEND track... +# Add each valid track reference to the current cup of correct type. +# If a cup is full, create a new before adding the track. +# +# NEW-CUP bt|vs [bt|vs] +# Close the current battle cup (bt) or versus cup (vs). Use both 'bt' +# and 'vs' to close the cups of both types. + +# There are 4 more commands to insert cups at the current position. They are +# usually used before any other cup definition: +# +# STANDARD-BATTLE-CUPS +# Append 10 tracks (slots 32 to 41) to the correct cup type. Usually +# all tracks are of type battle. +# +# STANDARD-VERSUS-CUPS +# Append 10 tracks (slots 0 to 31) to the correct cup type. Usually +# all tracks are of type versus. +# +# STANDARD-CUPS +# Short cut for STANDARD-BATTLE-CUPS and STANDARD-VERSUS-CUPS. +# +# MKWFUN-RANDOM-CUP +# Append 4 random slots (slots 62 to 65, like MKW-Fun, always versus) +# to the versus cups. +# +# If no cup was finally defined, then STANDARD-BATTLE-CUPS and/or +# STANDARD-VERSUS-CUPS will be executed automatically. + +# There are 3 options to add cups at the end. Set it to NO (=0) or YES (=1) +# at any place in the section: +# +# ADD-UNUSED-ARENAS = no/yes +# ADD-UNUSED-TRACKS = no/yes +# ADD-UNUSED = no/yes +# If defined arenas or tracks except hidden tracks were not used in at +# least one cup, then add cups with references to these missed tracks. +# CUPS-FOR-MISSED set both other settings in one step. +# + diff --git a/project/text-files/ledis.inc/ledis-ledef-header-cr.inc b/project/text-files/ledis.inc/ledis-ledef-header-cr.inc new file mode 100644 index 0000000..fd01d60 --- /dev/null +++ b/project/text-files/ledis.inc/ledis-ledef-header-cr.inc @@ -0,0 +1,11 @@ +%s + +#------------------------------------------------------------------------------ +# +# This file was created either by command »wlect distrib ... LE-DEF=...« or by +# command »wlect create LE-DEF«. +# +# This file can only be read by the tools since version 2.28a. +# +#------------------------------------------------------------------------------ + diff --git a/project/text-files/ledis.inc/ledis-ledef-setup-cr.inc b/project/text-files/ledis.inc/ledis-ledef-setup-cr.inc new file mode 100644 index 0000000..4b43c3f --- /dev/null +++ b/project/text-files/ledis.inc/ledis-ledef-setup-cr.inc @@ -0,0 +1,16 @@ + +# +############# + [SETUP] +############# + +# General setup. +# With the exception of section [TOOL], this must always be the first section. + +#------------------------------------------------------------------------------ + +# Should the 10 battle arenas (slots 32-41) and 32 versus tracks (slots 0-31) +# be automatically defined with the original tracks? (0=NO/1=YES): +ORIG-BATTLE-ARENAS = %s +ORIG-VERSUS-TRACKS = %s + diff --git a/project/text-files/ledis.inc/ledis-ledef-track-list-cr.inc b/project/text-files/ledis.inc/ledis-ledef-track-list-cr.inc new file mode 100644 index 0000000..f5c82f4 --- /dev/null +++ b/project/text-files/ledis.inc/ledis-ledef-track-list-cr.inc @@ -0,0 +1,54 @@ + +# +################## + [TRACK-LIST] +################## + +# A track definition consists of a basic definition (keyword TRACK) and any +# number of additional definitions (keywords FILE, IDENT, NAME and XNAME). + +# Normally the first free slot intended for the track type is used. The slot +# for the directly following TRACK definition can be set by the command: +# SLOT index + +# Keyword TRACK introduces a track definition. The syntax is as follows: +# 'TRACK' VARNAME TYPE PROPERTY MUSIC FLAGS +# +# If VARNAME is not '0' then the corresponding variable is assigned the +# current slot number. Variables are needed for cup references in section +# [CUP-LIST]. If cups are created exclusively automatically, then the value +# '0' is a good choice. The exporter uses 'bt' for battle or 'vs' for versus +# followed by the decimal slot number as variable name. +# +# TYPE is either 'vs' (versus) or 'bt' (battle). Both names are defined as +# constants. +# +# PROPERTY is the property slot to use. It is either a number (0-31 for 'vs' +# or 32-41 for 'bt'), or a symbolic name (like A25, T12 or MMM) of a track. +# +# MUSIC is the music-id to use. It is either a property slot number number +# (0-41) or a music id (117-199) or a symbolic name of a track. +# +# FLAGS is either a number or a string. A string is scanned for letters +# (case insensitive) to build a number: +# 'N' : LE$F_NEW : Track is marked as "new track". +# 'H' : LE$F_HEAD : Track is marked as "head of a group". +# 'G' : LE$F_GROUP : Track is marked as "group member". +# A track is considered hidden if the group flag (G) is set but the head flag +# (H) is not. + +# The keywords FILE, IDENT, NAME and XNAME define strings for the last defined +# track. Syntax: +# KEYWORD "TEXT" +# The TEXT is assigned to the track. The indention of the exporter is only +# used for clarity. + +# There are 2 more commands to define standard arenas or tracks at the current +# position. Best is to use these commands at top of the section: +# +# STANDARD-BATTLE-ARENAS +# Define 10 standard battle arenas. +# +# STANDARD-VERSUS-TRACKS +# Define 32 standard versus tracks. + diff --git a/project/text-files/ledis.inc/ledis-tool-cr.inc b/project/text-files/ledis.inc/ledis-tool-cr.inc new file mode 100644 index 0000000..bf8348d --- /dev/null +++ b/project/text-files/ledis.inc/ledis-tool-cr.inc @@ -0,0 +1,15 @@ + +# +############ + [TOOL] +############ + +# Information about the tool that created this file. +# This section is optional. If present, it must be the first section. + +TOOL = %s +SYSTEM = %s +VERSION = %s +REVISION = %u +DATE = %s + |
