https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=2a35e0ca14e8cd9b1bc5a79ee341d10720269103
commit 2a35e0ca14e8cd9b1bc5a79ee341d10720269103 Author: Jeremy Drake <cyg...@jdrake.com> Date: Wed Mar 26 12:48:04 2025 -0700 Cygwin: vendor libudis86 1.7.2/libudis86 This does not include the source files responsible for generating AT&T- or Intel-syntax assembly output, or upstream's Makefile.{am,in}. Signed-off-by: Jeremy Drake <cyg...@jdrake.com> Diff: --- winsup/cygwin/udis86/decode.c | 1112 ++++++ winsup/cygwin/udis86/decode.h | 195 + winsup/cygwin/udis86/extern.h | 105 + winsup/cygwin/udis86/itab.c | 8401 +++++++++++++++++++++++++++++++++++++++++ winsup/cygwin/udis86/itab.h | 678 ++++ winsup/cygwin/udis86/types.h | 250 ++ winsup/cygwin/udis86/udint.h | 89 + winsup/cygwin/udis86/udis86.c | 457 +++ 8 files changed, 11287 insertions(+) diff --git a/winsup/cygwin/udis86/decode.c b/winsup/cygwin/udis86/decode.c new file mode 100644 index 000000000..b4efa778c --- /dev/null +++ b/winsup/cygwin/udis86/decode.c @@ -0,0 +1,1112 @@ +/* udis86 - libudis86/decode.c + * + * Copyright (c) 2002-2009 Vivek Thampi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "udint.h" +#include "types.h" +#include "decode.h" + +#ifndef __UD_STANDALONE__ +# include <string.h> +#endif /* __UD_STANDALONE__ */ + +/* The max number of prefixes to an instruction */ +#define MAX_PREFIXES 15 + +/* rex prefix bits */ +#define REX_W(r) ( ( 0xF & ( r ) ) >> 3 ) +#define REX_R(r) ( ( 0x7 & ( r ) ) >> 2 ) +#define REX_X(r) ( ( 0x3 & ( r ) ) >> 1 ) +#define REX_B(r) ( ( 0x1 & ( r ) ) >> 0 ) +#define REX_PFX_MASK(n) ( ( P_REXW(n) << 3 ) | \ + ( P_REXR(n) << 2 ) | \ + ( P_REXX(n) << 1 ) | \ + ( P_REXB(n) << 0 ) ) + +/* scable-index-base bits */ +#define SIB_S(b) ( ( b ) >> 6 ) +#define SIB_I(b) ( ( ( b ) >> 3 ) & 7 ) +#define SIB_B(b) ( ( b ) & 7 ) + +/* modrm bits */ +#define MODRM_REG(b) ( ( ( b ) >> 3 ) & 7 ) +#define MODRM_NNN(b) ( ( ( b ) >> 3 ) & 7 ) +#define MODRM_MOD(b) ( ( ( b ) >> 6 ) & 3 ) +#define MODRM_RM(b) ( ( b ) & 7 ) + +static int decode_ext(struct ud *u, uint16_t ptr); + +enum reg_class { /* register classes */ + REGCLASS_GPR, + REGCLASS_MMX, + REGCLASS_CR, + REGCLASS_DB, + REGCLASS_SEG, + REGCLASS_XMM +}; + + /* + * inp_start + * Should be called before each de-code operation. + */ +static void +inp_start(struct ud *u) +{ + u->inp_ctr = 0; +} + + +static uint8_t +inp_next(struct ud *u) +{ + if (u->inp_end == 0) { + if (u->inp_buf != NULL) { + if (u->inp_buf_index < u->inp_buf_size) { + u->inp_ctr++; + return (u->inp_curr = u->inp_buf[u->inp_buf_index++]); + } + } else { + int c; + if ((c = u->inp_hook(u)) != UD_EOI) { + u->inp_curr = c; + u->inp_sess[u->inp_ctr++] = u->inp_curr; + return u->inp_curr; + } + } + } + u->inp_end = 1; + UDERR(u, "byte expected, eoi received\n"); + return 0; +} + +static uint8_t +inp_curr(struct ud *u) +{ + return u->inp_curr; +} + + +/* + * inp_uint8 + * int_uint16 + * int_uint32 + * int_uint64 + * Load little-endian values from input + */ +static uint8_t +inp_uint8(struct ud* u) +{ + return inp_next(u); +} + +static uint16_t +inp_uint16(struct ud* u) +{ + uint16_t r, ret; + + ret = inp_next(u); + r = inp_next(u); + return ret | (r << 8); +} + +static uint32_t +inp_uint32(struct ud* u) +{ + uint32_t r, ret; + + ret = inp_next(u); + r = inp_next(u); + ret = ret | (r << 8); + r = inp_next(u); + ret = ret | (r << 16); + r = inp_next(u); + return ret | (r << 24); +} + +static uint64_t +inp_uint64(struct ud* u) +{ + uint64_t r, ret; + + ret = inp_next(u); + r = inp_next(u); + ret = ret | (r << 8); + r = inp_next(u); + ret = ret | (r << 16); + r = inp_next(u); + ret = ret | (r << 24); + r = inp_next(u); + ret = ret | (r << 32); + r = inp_next(u); + ret = ret | (r << 40); + r = inp_next(u); + ret = ret | (r << 48); + r = inp_next(u); + return ret | (r << 56); +} + + +static inline int +eff_opr_mode(int dis_mode, int rex_w, int pfx_opr) +{ + if (dis_mode == 64) { + return rex_w ? 64 : (pfx_opr ? 16 : 32); + } else if (dis_mode == 32) { + return pfx_opr ? 16 : 32; + } else { + UD_ASSERT(dis_mode == 16); + return pfx_opr ? 32 : 16; + } +} + + +static inline int +eff_adr_mode(int dis_mode, int pfx_adr) +{ + if (dis_mode == 64) { + return pfx_adr ? 32 : 64; + } else if (dis_mode == 32) { + return pfx_adr ? 16 : 32; + } else { + UD_ASSERT(dis_mode == 16); + return pfx_adr ? 32 : 16; + } +} + + +/* + * decode_prefixes + * + * Extracts instruction prefixes. + */ +static int +decode_prefixes(struct ud *u) +{ + int done = 0; + uint8_t curr, last = 0; + UD_RETURN_ON_ERROR(u); + + do { + last = curr; + curr = inp_next(u); + UD_RETURN_ON_ERROR(u); + if (u->inp_ctr == MAX_INSN_LENGTH) { + UD_RETURN_WITH_ERROR(u, "max instruction length"); + } + + switch (curr) + { + case 0x2E: + u->pfx_seg = UD_R_CS; + break; + case 0x36: + u->pfx_seg = UD_R_SS; + break; + case 0x3E: + u->pfx_seg = UD_R_DS; + break; + case 0x26: + u->pfx_seg = UD_R_ES; + break; + case 0x64: + u->pfx_seg = UD_R_FS; + break; + case 0x65: + u->pfx_seg = UD_R_GS; + break; + case 0x67: /* adress-size override prefix */ + u->pfx_adr = 0x67; + break; + case 0xF0: + u->pfx_lock = 0xF0; + break; + case 0x66: + u->pfx_opr = 0x66; + break; + case 0xF2: + u->pfx_str = 0xf2; + break; + case 0xF3: + u->pfx_str = 0xf3; + break; + default: + /* consume if rex */ + done = (u->dis_mode == 64 && (curr & 0xF0) == 0x40) ? 0 : 1; + break; + } + } while (!done); + /* rex prefixes in 64bit mode, must be the last prefix */ + if (u->dis_mode == 64 && (last & 0xF0) == 0x40) { + u->pfx_rex = last; + } + return 0; +} + + +static inline unsigned int modrm( struct ud * u ) +{ + if ( !u->have_modrm ) { + u->modrm = inp_next( u ); + u->have_modrm = 1; + } + return u->modrm; +} + + +static unsigned int +resolve_operand_size( const struct ud * u, unsigned int s ) +{ + switch ( s ) + { + case SZ_V: + return ( u->opr_mode ); + case SZ_Z: + return ( u->opr_mode == 16 ) ? 16 : 32; + case SZ_Y: + return ( u->opr_mode == 16 ) ? 32 : u->opr_mode; + case SZ_RDQ: + return ( u->dis_mode == 64 ) ? 64 : 32; + default: + return s; + } +} + + +static int resolve_mnemonic( struct ud* u ) +{ + /* resolve 3dnow weirdness. */ + if ( u->mnemonic == UD_I3dnow ) { + u->mnemonic = ud_itab[ u->le->table[ inp_curr( u ) ] ].mnemonic; + } + /* SWAPGS is only valid in 64bits mode */ + if ( u->mnemonic == UD_Iswapgs && u->dis_mode != 64 ) { + UDERR(u, "swapgs invalid in 64bits mode\n"); + return -1; + } + + if (u->mnemonic == UD_Ixchg) { + if ((u->operand[0].type == UD_OP_REG && u->operand[0].base == UD_R_AX && + u->operand[1].type == UD_OP_REG && u->operand[1].base == UD_R_AX) || + (u->operand[0].type == UD_OP_REG && u->operand[0].base == UD_R_EAX && + u->operand[1].type == UD_OP_REG && u->operand[1].base == UD_R_EAX)) { + u->operand[0].type = UD_NONE; + u->operand[1].type = UD_NONE; + u->mnemonic = UD_Inop; + } + } + + if (u->mnemonic == UD_Inop && u->pfx_repe) { + u->pfx_repe = 0; + u->mnemonic = UD_Ipause; + } + return 0; +} + + +/* ----------------------------------------------------------------------------- + * decode_a()- Decodes operands of the type seg:offset + * ----------------------------------------------------------------------------- + */ +static void +decode_a(struct ud* u, struct ud_operand *op) +{ + if (u->opr_mode == 16) { + /* seg16:off16 */ + op->type = UD_OP_PTR; + op->size = 32; + op->lval.ptr.off = inp_uint16(u); + op->lval.ptr.seg = inp_uint16(u); + } else { + /* seg16:off32 */ + op->type = UD_OP_PTR; + op->size = 48; + op->lval.ptr.off = inp_uint32(u); + op->lval.ptr.seg = inp_uint16(u); + } +} + +/* ----------------------------------------------------------------------------- + * decode_gpr() - Returns decoded General Purpose Register + * ----------------------------------------------------------------------------- + */ +static enum ud_type +decode_gpr(register struct ud* u, unsigned int s, unsigned char rm) +{ + switch (s) { + case 64: + return UD_R_RAX + rm; + case 32: + return UD_R_EAX + rm; + case 16: + return UD_R_AX + rm; + case 8: + if (u->dis_mode == 64 && u->pfx_rex) { + if (rm >= 4) + return UD_R_SPL + (rm-4); + return UD_R_AL + rm; + } else return UD_R_AL + rm; + case 0: + /* invalid size in case of a decode error */ + UD_ASSERT(u->error); + return UD_NONE; + default: + UD_ASSERT(!"invalid operand size"); + return UD_NONE; + } +} + +static void +decode_reg(struct ud *u, + struct ud_operand *opr, + int type, + int num, + int size) +{ + int reg; + size = resolve_operand_size(u, size); + switch (type) { + case REGCLASS_GPR : reg = decode_gpr(u, size, num); break; + case REGCLASS_MMX : reg = UD_R_MM0 + (num & 7); break; + case REGCLASS_XMM : reg = UD_R_XMM0 + num; break; + case REGCLASS_CR : reg = UD_R_CR0 + num; break; + case REGCLASS_DB : reg = UD_R_DR0 + num; break; + case REGCLASS_SEG : { + /* + * Only 6 segment registers, anything else is an error. + */ + if ((num & 7) > 5) { + UDERR(u, "invalid segment register value\n"); + return; + } else { + reg = UD_R_ES + (num & 7); + } + break; + } + default: + UD_ASSERT(!"invalid register type"); + return; + } + opr->type = UD_OP_REG; + opr->base = reg; + opr->size = size; +} + + +/* + * decode_imm + * + * Decode Immediate values. + */ +static void +decode_imm(struct ud* u, unsigned int size, struct ud_operand *op) +{ + op->size = resolve_operand_size(u, size); + op->type = UD_OP_IMM; + + switch (op->size) { + case 8: op->lval.sbyte = inp_uint8(u); break; + case 16: op->lval.uword = inp_uint16(u); break; + case 32: op->lval.udword = inp_uint32(u); break; + case 64: op->lval.uqword = inp_uint64(u); break; + default: return; + } +} + + +/* + * decode_mem_disp + * + * Decode mem address displacement. + */ +static void +decode_mem_disp(struct ud* u, unsigned int size, struct ud_operand *op) +{ + switch (size) { + case 8: + op->offset = 8; + op->lval.ubyte = inp_uint8(u); + break; + case 16: + op->offset = 16; + op->lval.uword = inp_uint16(u); + break; + case 32: + op->offset = 32; + op->lval.udword = inp_uint32(u); + break; + case 64: + op->offset = 64; + op->lval.uqword = inp_uint64(u); + break; + default: + return; + } +} + + +/* + * decode_modrm_reg + * + * Decodes reg field of mod/rm byte + * + */ +static inline void +decode_modrm_reg(struct ud *u, + struct ud_operand *operand, + unsigned int type, + unsigned int size) +{ + uint8_t reg = (REX_R(u->pfx_rex) << 3) | MODRM_REG(modrm(u)); + decode_reg(u, operand, type, reg, size); +} + + +/* + * decode_modrm_rm + * + * Decodes rm field of mod/rm byte + * + */ +static void +decode_modrm_rm(struct ud *u, + struct ud_operand *op, + unsigned char type, /* register type */ + unsigned int size) /* operand size */ + +{ + size_t offset = 0; + unsigned char mod, rm; + + /* get mod, r/m and reg fields */ + mod = MODRM_MOD(modrm(u)); + rm = (REX_B(u->pfx_rex) << 3) | MODRM_RM(modrm(u)); + + /* + * If mod is 11b, then the modrm.rm specifies a register. + * + */ + if (mod == 3) { + decode_reg(u, op, type, rm, size); + return; + } + + /* + * !11b => Memory Address + */ + op->type = UD_OP_MEM; + op->size = resolve_operand_size(u, size); + + if (u->adr_mode == 64) { + op->base = UD_R_RAX + rm; + if (mod == 1) { + offset = 8; + } else if (mod == 2) { + offset = 32; + } else if (mod == 0 && (rm & 7) == 5) { + op->base = UD_R_RIP; + offset = 32; + } else { + offset = 0; + } + /* + * Scale-Index-Base (SIB) + */ + if ((rm & 7) == 4) { + inp_next(u); + + op->scale = (1 << SIB_S(inp_curr(u))) & ~1; + op->index = UD_R_RAX + (SIB_I(inp_curr(u)) | (REX_X(u->pfx_rex) << 3)); + op->base = UD_R_RAX + (SIB_B(inp_curr(u)) | (REX_B(u->pfx_rex) << 3)); + + /* special conditions for base reference */ + if (op->index == UD_R_RSP) { + op->index = UD_NONE; + op->scale = UD_NONE; + } + + if (op->base == UD_R_RBP || op->base == UD_R_R13) { + if (mod == 0) { + op->base = UD_NONE; + } + if (mod == 1) { + offset = 8; + } else { + offset = 32; + } + } + } + } else if (u->adr_mode == 32) { + op->base = UD_R_EAX + rm; + if (mod == 1) { + offset = 8; + } else if (mod == 2) { + offset = 32; + } else if (mod == 0 && rm == 5) { + op->base = UD_NONE; + offset = 32; + } else { + offset = 0; + } + + /* Scale-Index-Base (SIB) */ + if ((rm & 7) == 4) { + inp_next(u); + + op->scale = (1 << SIB_S(inp_curr(u))) & ~1; + op->index = UD_R_EAX + (SIB_I(inp_curr(u)) | (REX_X(u->pfx_rex) << 3)); + op->base = UD_R_EAX + (SIB_B(inp_curr(u)) | (REX_B(u->pfx_rex) << 3)); + + if (op->index == UD_R_ESP) { + op->index = UD_NONE; + op->scale = UD_NONE; + } + + /* special condition for base reference */ + if (op->base == UD_R_EBP) { + if (mod == 0) { + op->base = UD_NONE; + } + if (mod == 1) { + offset = 8; + } else { + offset = 32; + } + } + } + } else { + const unsigned int bases[] = { UD_R_BX, UD_R_BX, UD_R_BP, UD_R_BP, + UD_R_SI, UD_R_DI, UD_R_BP, UD_R_BX }; + const unsigned int indices[] = { UD_R_SI, UD_R_DI, UD_R_SI, UD_R_DI, + UD_NONE, UD_NONE, UD_NONE, UD_NONE }; + op->base = bases[rm & 7]; + op->index = indices[rm & 7]; + if (mod == 0 && rm == 6) { + offset = 16; + op->base = UD_NONE; + } else if (mod == 1) { + offset = 8; + } else if (mod == 2) { + offset = 16; + } + } + + if (offset) { + decode_mem_disp(u, offset, op); + } +} + + +/* + * decode_moffset + * Decode offset-only memory operand + */ +static void +decode_moffset(struct ud *u, unsigned int size, struct ud_operand *opr) +{ + opr->type = UD_OP_MEM; + opr->size = resolve_operand_size(u, size); + decode_mem_disp(u, u->adr_mode, opr); +} + + +/* ----------------------------------------------------------------------------- + * decode_operands() - Disassembles Operands. + * ----------------------------------------------------------------------------- + */ +static int +decode_operand(struct ud *u, + struct ud_operand *operand, + enum ud_operand_code type, + unsigned int size) +{ + operand->_oprcode = type; + + switch (type) { + case OP_A : + decode_a(u, operand); + break; + case OP_MR: + decode_modrm_rm(u, operand, REGCLASS_GPR, + MODRM_MOD(modrm(u)) == 3 ? + Mx_reg_size(size) : Mx_mem_size(size)); + break; + case OP_F: + u->br_far = 1; + /* intended fall through */ + case OP_M: + if (MODRM_MOD(modrm(u)) == 3) { + UDERR(u, "expected modrm.mod != 3\n"); + } + /* intended fall through */ + case OP_E: + decode_modrm_rm(u, operand, REGCLASS_GPR, size); + break; + case OP_G: + decode_modrm_reg(u, operand, REGCLASS_GPR, size); + break; + case OP_sI: + case OP_I: + decode_imm(u, size, operand); + break; + case OP_I1: + operand->type = UD_OP_CONST; + operand->lval.udword = 1; + break; + case OP_N: + if (MODRM_MOD(modrm(u)) != 3) { + UDERR(u, "expected modrm.mod == 3\n"); + } + /* intended fall through */ + case OP_Q: + decode_modrm_rm(u, operand, REGCLASS_MMX, size); + break; + case OP_P: + decode_modrm_reg(u, operand, REGCLASS_MMX, size); + break; + case OP_U: + if (MODRM_MOD(modrm(u)) != 3) { + UDERR(u, "expected modrm.mod == 3\n"); + } + /* intended fall through */ + case OP_W: + decode_modrm_rm(u, operand, REGCLASS_XMM, size); + break; + case OP_V: + decode_modrm_reg(u, operand, REGCLASS_XMM, size); + break; + case OP_MU: + decode_modrm_rm(u, operand, REGCLASS_XMM, + MODRM_MOD(modrm(u)) == 3 ? + Mx_reg_size(size) : Mx_mem_size(size)); + break; + case OP_S: + decode_modrm_reg(u, operand, REGCLASS_SEG, size); + break; + case OP_O: + decode_moffset(u, size, operand); + break; + case OP_R0: + case OP_R1: + case OP_R2: + case OP_R3: + case OP_R4: + case OP_R5: + case OP_R6: + case OP_R7: + decode_reg(u, operand, REGCLASS_GPR, + (REX_B(u->pfx_rex) << 3) | (type - OP_R0), size); + break; + case OP_AL: + case OP_AX: + case OP_eAX: + case OP_rAX: + decode_reg(u, operand, REGCLASS_GPR, 0, size); + break; + case OP_CL: + case OP_CX: + case OP_eCX: + decode_reg(u, operand, REGCLASS_GPR, 1, size); + break; + case OP_DL: + case OP_DX: + case OP_eDX: + decode_reg(u, operand, REGCLASS_GPR, 2, size); + break; + case OP_ES: + case OP_CS: + case OP_DS: + case OP_SS: + case OP_FS: + case OP_GS: + /* in 64bits mode, only fs and gs are allowed */ + if (u->dis_mode == 64) { + if (type != OP_FS && type != OP_GS) { + UDERR(u, "invalid segment register in 64bits\n"); + } + } + operand->type = UD_OP_REG; + operand->base = (type - OP_ES) + UD_R_ES; + operand->size = 16; + break; + case OP_J : + decode_imm(u, size, operand); + operand->type = UD_OP_JIMM; + break ; + case OP_R : + if (MODRM_MOD(modrm(u)) != 3) { + UDERR(u, "expected modrm.mod == 3\n"); + } + decode_modrm_rm(u, operand, REGCLASS_GPR, size); + break; + case OP_C: + decode_modrm_reg(u, operand, REGCLASS_CR, size); + break; + case OP_D: + decode_modrm_reg(u, operand, REGCLASS_DB, size); + break; + case OP_I3 : + operand->type = UD_OP_CONST; + operand->lval.sbyte = 3; + break; + case OP_ST0: + case OP_ST1: + case OP_ST2: + case OP_ST3: + case OP_ST4: + case OP_ST5: + case OP_ST6: + case OP_ST7: + operand->type = UD_OP_REG; + operand->base = (type - OP_ST0) + UD_R_ST0; + operand->size = 80; + break; + default : + break; + } + return 0; +} + + +/* + * decode_operands + * + * Disassemble upto 3 operands of the current instruction being + * disassembled. By the end of the function, the operand fields + * of the ud structure will have been filled. + */ +static int +decode_operands(struct ud* u) +{ + decode_operand(u, &u->operand[0], + u->itab_entry->operand1.type, + u->itab_entry->operand1.size); + decode_operand(u, &u->operand[1], + u->itab_entry->operand2.type, + u->itab_entry->operand2.size); + decode_operand(u, &u->operand[2], + u->itab_entry->operand3.type, + u->itab_entry->operand3.size); + return 0; +} + +/* ----------------------------------------------------------------------------- + * clear_insn() - clear instruction structure + * ----------------------------------------------------------------------------- + */ +static void +clear_insn(register struct ud* u) +{ + u->error = 0; + u->pfx_seg = 0; + u->pfx_opr = 0; + u->pfx_adr = 0; + u->pfx_lock = 0; + u->pfx_repne = 0; + u->pfx_rep = 0; + u->pfx_repe = 0; + u->pfx_rex = 0; + u->pfx_str = 0; + u->mnemonic = UD_Inone; + u->itab_entry = NULL; + u->have_modrm = 0; + u->br_far = 0; + + memset( &u->operand[ 0 ], 0, sizeof( struct ud_operand ) ); + memset( &u->operand[ 1 ], 0, sizeof( struct ud_operand ) ); + memset( &u->operand[ 2 ], 0, sizeof( struct ud_operand ) ); +} + + +static inline int +resolve_pfx_str(struct ud* u) +{ + if (u->pfx_str == 0xf3) { + if (P_STR(u->itab_entry->prefix)) { + u->pfx_rep = 0xf3; + } else { + u->pfx_repe = 0xf3; + } + } else if (u->pfx_str == 0xf2) { + u->pfx_repne = 0xf3; + } + return 0; +} + + +static int +resolve_mode( struct ud* u ) +{ + int default64; + /* if in error state, bail out */ + if ( u->error ) return -1; + + /* propagate prefix effects */ + if ( u->dis_mode == 64 ) { /* set 64bit-mode flags */ + + /* Check validity of instruction m64 */ + if ( P_INV64( u->itab_entry->prefix ) ) { + UDERR(u, "instruction invalid in 64bits\n"); + return -1; + } + + /* effective rex prefix is the effective mask for the + * instruction hard-coded in the opcode map. + */ + u->pfx_rex = ( u->pfx_rex & 0x40 ) | + ( u->pfx_rex & REX_PFX_MASK( u->itab_entry->prefix ) ); + + /* whether this instruction has a default operand size of + * 64bit, also hardcoded into the opcode map. + */ + default64 = P_DEF64( u->itab_entry->prefix ); + /* calculate effective operand size */ + if ( REX_W( u->pfx_rex ) ) { + u->opr_mode = 64; + } else if ( u->pfx_opr ) { + u->opr_mode = 16; + } else { + /* unless the default opr size of instruction is 64, + * the effective operand size in the absence of rex.w + * prefix is 32. + */ + u->opr_mode = default64 ? 64 : 32; + } + + /* calculate effective address size */ + u->adr_mode = (u->pfx_adr) ? 32 : 64; + } else if ( u->dis_mode == 32 ) { /* set 32bit-mode flags */ + u->opr_mode = ( u->pfx_opr ) ? 16 : 32; + u->adr_mode = ( u->pfx_adr ) ? 16 : 32; + } else if ( u->dis_mode == 16 ) { /* set 16bit-mode flags */ + u->opr_mode = ( u->pfx_opr ) ? 32 : 16; + u->adr_mode = ( u->pfx_adr ) ? 32 : 16; + } + + return 0; +} + + +static inline int +decode_insn(struct ud *u, uint16_t ptr) +{ + UD_ASSERT((ptr & 0x8000) == 0); + u->itab_entry = &ud_itab[ ptr ]; + u->mnemonic = u->itab_entry->mnemonic; + return (resolve_pfx_str(u) == 0 && + resolve_mode(u) == 0 && + decode_operands(u) == 0 && + resolve_mnemonic(u) == 0) ? 0 : -1; +} + + +/* + * decode_3dnow() + * + * Decoding 3dnow is a little tricky because of its strange opcode + * structure. The final opcode disambiguation depends on the last + * byte that comes after the operands have been decoded. Fortunately, + * all 3dnow instructions have the same set of operand types. So we + * go ahead and decode the instruction by picking an arbitrarily chosen + * valid entry in the table, decode the operands, and read the final + * byte to resolve the menmonic. + */ +static inline int +decode_3dnow(struct ud* u) +{ + uint16_t ptr; + UD_ASSERT(u->le->type == UD_TAB__OPC_3DNOW); + UD_ASSERT(u->le->table[0xc] != 0); + decode_insn(u, u->le->table[0xc]); + inp_next(u); + if (u->error) { + return -1; + } + ptr = u->le->table[inp_curr(u)]; + UD_ASSERT((ptr & 0x8000) == 0); + u->mnemonic = ud_itab[ptr].mnemonic; + return 0; +} + + +static int +decode_ssepfx(struct ud *u) +{ + uint8_t idx; + uint8_t pfx; + + /* + * String prefixes (f2, f3) take precedence over operand + * size prefix (66). + */ + pfx = u->pfx_str; + if (pfx == 0) { + pfx = u->pfx_opr; + } + idx = ((pfx & 0xf) + 1) / 2; + if (u->le->table[idx] == 0) { + idx = 0; + } + if (idx && u->le->table[idx] != 0) { + /* + * "Consume" the prefix as a part of the opcode, so it is no + * longer exported as an instruction prefix. + */ + u->pfx_str = 0; + if (pfx == 0x66) { + /* + * consume "66" only if it was used for decoding, leaving + * it to be used as an operands size override for some + * simd instructions. + */ + u->pfx_opr = 0; + } + } + return decode_ext(u, u->le->table[idx]); +} + + +/* + * decode_ext() + * + * Decode opcode extensions (if any) + */ +static int +decode_ext(struct ud *u, uint16_t ptr) +{ + uint8_t idx = 0; + if ((ptr & 0x8000) == 0) { + return decode_insn(u, ptr); + } + u->le = &ud_lookup_table_list[(~0x8000 & ptr)]; + if (u->le->type == UD_TAB__OPC_3DNOW) { + return decode_3dnow(u); + } + + switch (u->le->type) { + case UD_TAB__OPC_MOD: + /* !11 = 0, 11 = 1 */ + idx = (MODRM_MOD(modrm(u)) + 1) / 4; + break; + /* disassembly mode/operand size/address size based tables. + * 16 = 0,, 32 = 1, 64 = 2 + */ + case UD_TAB__OPC_MODE: + idx = u->dis_mode != 64 ? 0 : 1; + break; + case UD_TAB__OPC_OSIZE: + idx = eff_opr_mode(u->dis_mode, REX_W(u->pfx_rex), u->pfx_opr) / 32; + break; + case UD_TAB__OPC_ASIZE: + idx = eff_adr_mode(u->dis_mode, u->pfx_adr) / 32; + break; + case UD_TAB__OPC_X87: + idx = modrm(u) - 0xC0; + break; + case UD_TAB__OPC_VENDOR: + if (u->vendor == UD_VENDOR_ANY) { + /* choose a valid entry */ + idx = (u->le->table[idx] != 0) ? 0 : 1; + } else if (u->vendor == UD_VENDOR_AMD) { + idx = 0; + } else { + idx = 1; + } + break; + case UD_TAB__OPC_RM: + idx = MODRM_RM(modrm(u)); + break; + case UD_TAB__OPC_REG: + idx = MODRM_REG(modrm(u)); + break; + case UD_TAB__OPC_SSE: + return decode_ssepfx(u); + default: + UD_ASSERT(!"not reached"); + break; + } + + return decode_ext(u, u->le->table[idx]); +} + + +static int +decode_opcode(struct ud *u) +{ + uint16_t ptr; + UD_ASSERT(u->le->type == UD_TAB__OPC_TABLE); + UD_RETURN_ON_ERROR(u); + u->primary_opcode = inp_curr(u); + ptr = u->le->table[inp_curr(u)]; + if (ptr & 0x8000) { + u->le = &ud_lookup_table_list[ptr & ~0x8000]; + if (u->le->type == UD_TAB__OPC_TABLE) { + inp_next(u); + return decode_opcode(u); + } + } + return decode_ext(u, ptr); +} + + +/* ============================================================================= + * ud_decode() - Instruction decoder. Returns the number of bytes decoded. + * ============================================================================= + */ +unsigned int +ud_decode(struct ud *u) +{ + inp_start(u); + clear_insn(u); + u->le = &ud_lookup_table_list[0]; + u->error = decode_prefixes(u) == -1 || + decode_opcode(u) == -1 || + u->error; + /* Handle decode error. */ + if (u->error) { + /* clear out the decode data. */ + clear_insn(u); + /* mark the sequence of bytes as invalid. */ + u->itab_entry = &ud_itab[0]; /* entry 0 is invalid */ + u->mnemonic = u->itab_entry->mnemonic; + } + + /* maybe this stray segment override byte + * should be spewed out? + */ + if ( !P_SEG( u->itab_entry->prefix ) && + u->operand[0].type != UD_OP_MEM && + u->operand[1].type != UD_OP_MEM ) + u->pfx_seg = 0; + + u->insn_offset = u->pc; /* set offset of instruction */ + u->asm_buf_fill = 0; /* set translation buffer index to 0 */ + u->pc += u->inp_ctr; /* move program counter by bytes decoded */ + + /* return number of bytes disassembled. */ + return u->inp_ctr; +} + +/* +vim: set ts=2 sw=2 expandtab +*/ diff --git a/winsup/cygwin/udis86/decode.h b/winsup/cygwin/udis86/decode.h new file mode 100644 index 000000000..a7362c84a --- /dev/null +++ b/winsup/cygwin/udis86/decode.h @@ -0,0 +1,195 @@ +/* udis86 - libudis86/decode.h + * + * Copyright (c) 2002-2009 Vivek Thampi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef UD_DECODE_H +#define UD_DECODE_H + +#include "types.h" +#include "itab.h" + +#define MAX_INSN_LENGTH 15 + +/* itab prefix bits */ +#define P_none ( 0 ) +#define P_cast ( 1 << 0 ) +#define P_CAST(n) ( ( n >> 0 ) & 1 ) +#define P_rexb ( 1 << 1 ) +#define P_REXB(n) ( ( n >> 1 ) & 1 ) +#define P_inv64 ( 1 << 4 ) +#define P_INV64(n) ( ( n >> 4 ) & 1 ) +#define P_rexw ( 1 << 5 ) +#define P_REXW(n) ( ( n >> 5 ) & 1 ) +#define P_def64 ( 1 << 7 ) +#define P_DEF64(n) ( ( n >> 7 ) & 1 ) +#define P_rexr ( 1 << 8 ) +#define P_REXR(n) ( ( n >> 8 ) & 1 ) +#define P_oso ( 1 << 9 ) +#define P_OSO(n) ( ( n >> 9 ) & 1 ) +#define P_aso ( 1 << 10 ) +#define P_ASO(n) ( ( n >> 10 ) & 1 ) +#define P_rexx ( 1 << 11 ) +#define P_REXX(n) ( ( n >> 11 ) & 1 ) +#define P_ImpAddr ( 1 << 12 ) +#define P_IMPADDR(n) ( ( n >> 12 ) & 1 ) +#define P_seg ( 1 << 13 ) +#define P_SEG(n) ( ( n >> 13 ) & 1 ) +#define P_str ( 1 << 14 ) +#define P_STR(n) ( ( n >> 14 ) & 1 ) +#define P_strz ( 1 << 15 ) +#define P_STR_ZF(n) ( ( n >> 15 ) & 1 ) + +/* operand type constants -- order is important! */ + +enum ud_operand_code { + OP_NONE, + + OP_A, OP_E, OP_M, OP_G, + OP_I, OP_F, + + OP_R0, OP_R1, OP_R2, OP_R3, + OP_R4, OP_R5, OP_R6, OP_R7, + + OP_AL, OP_CL, OP_DL, + OP_AX, OP_CX, OP_DX, + OP_eAX, OP_eCX, OP_eDX, + OP_rAX, OP_rCX, OP_rDX, + + OP_ES, OP_CS, OP_SS, OP_DS, + OP_FS, OP_GS, + + OP_ST0, OP_ST1, OP_ST2, OP_ST3, + OP_ST4, OP_ST5, OP_ST6, OP_ST7, + + OP_J, OP_S, OP_O, + OP_I1, OP_I3, OP_sI, + + OP_V, OP_W, OP_Q, OP_P, + OP_U, OP_N, OP_MU, + + OP_R, OP_C, OP_D, + + OP_MR +} UD_ATTR_PACKED; + + +/* operand size constants */ + +enum ud_operand_size { + SZ_NA = 0, + SZ_Z = 1, + SZ_V = 2, + SZ_RDQ = 7, + + /* the following values are used as is, + * and thus hard-coded. changing them + * will break internals + */ + SZ_B = 8, + SZ_W = 16, + SZ_D = 32, + SZ_Q = 64, + SZ_T = 80, + SZ_O = 128, + + SZ_Y = 17, + + /* + * complex size types, that encode sizes for operands + * of type MR (memory or register), for internal use + * only. Id space 256 and above. + */ + SZ_BD = (SZ_B << 8) | SZ_D, + SZ_BV = (SZ_B << 8) | SZ_V, + SZ_WD = (SZ_W << 8) | SZ_D, + SZ_WV = (SZ_W << 8) | SZ_V, + SZ_WY = (SZ_W << 8) | SZ_Y, + SZ_DY = (SZ_D << 8) | SZ_Y, + SZ_WO = (SZ_W << 8) | SZ_O, + SZ_DO = (SZ_D << 8) | SZ_O, + SZ_QO = (SZ_Q << 8) | SZ_O, + +} UD_ATTR_PACKED; + + +/* resolve complex size type. + */ +static inline enum ud_operand_size +Mx_mem_size(enum ud_operand_size size) +{ + return (size >> 8) & 0xff; +} + +static inline enum ud_operand_size +Mx_reg_size(enum ud_operand_size size) +{ + return size & 0xff; +} + +/* A single operand of an entry in the instruction table. + * (internal use only) + */ +struct ud_itab_entry_operand +{ + enum ud_operand_code type; + enum ud_operand_size size; +}; + + +/* A single entry in an instruction table. + *(internal use only) + */ +struct ud_itab_entry +{ + enum ud_mnemonic_code mnemonic; + struct ud_itab_entry_operand operand1; + struct ud_itab_entry_operand operand2; + struct ud_itab_entry_operand operand3; + uint32_t prefix; +}; + +struct ud_lookup_table_list_entry { + const uint16_t *table; + enum ud_table_type type; + const char *meta; +}; + + + +static inline int +ud_opcode_field_sext(uint8_t primary_opcode) +{ + return (primary_opcode & 0x02) != 0; +} + +extern struct ud_itab_entry ud_itab[]; +extern struct ud_lookup_table_list_entry ud_lookup_table_list[]; + +#endif /* UD_DECODE_H */ + +/* vim:cindent + * vim:expandtab + * vim:ts=4 + * vim:sw=4 + */ diff --git a/winsup/cygwin/udis86/extern.h b/winsup/cygwin/udis86/extern.h new file mode 100644 index 000000000..ae9f82f22 --- /dev/null +++ b/winsup/cygwin/udis86/extern.h @@ -0,0 +1,105 @@ +/* udis86 - libudis86/extern.h + * + * Copyright (c) 2002-2009, 2013 Vivek Thampi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef UD_EXTERN_H +#define UD_EXTERN_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "types.h" + +/* ============================= PUBLIC API ================================= */ + +extern void ud_init(struct ud*); + +extern void ud_set_mode(struct ud*, uint8_t); + +extern void ud_set_pc(struct ud*, uint64_t); + +extern void ud_set_input_hook(struct ud*, int (*)(struct ud*)); + +extern void ud_set_input_buffer(struct ud*, const uint8_t*, size_t); + +#ifndef __UD_STANDALONE__ +extern void ud_set_input_file(struct ud*, FILE*); +#endif /* __UD_STANDALONE__ */ + +extern void ud_set_vendor(struct ud*, unsigned); + +extern void ud_set_syntax(struct ud*, void (*)(struct ud*)); + +extern void ud_input_skip(struct ud*, size_t); + +extern int ud_input_end(const struct ud*); + +extern unsigned int ud_decode(struct ud*); + +extern unsigned int ud_disassemble(struct ud*); + +extern void ud_translate_intel(struct ud*); + +extern void ud_translate_att(struct ud*); + +extern const char* ud_insn_asm(const struct ud* u); + +extern const uint8_t* ud_insn_ptr(const struct ud* u); + +extern uint64_t ud_insn_off(const struct ud*); + +extern const char* ud_insn_hex(struct ud*); + +extern unsigned int ud_insn_len(const struct ud* u); + +extern const struct ud_operand* ud_insn_opr(const struct ud *u, unsigned int n); + +extern int ud_opr_is_sreg(const struct ud_operand *opr); + +extern int ud_opr_is_gpr(const struct ud_operand *opr); + +extern enum ud_mnemonic_code ud_insn_mnemonic(const struct ud *u); + +extern const char* ud_lookup_mnemonic(enum ud_mnemonic_code c); + +extern void ud_set_user_opaque_data(struct ud*, void*); + +extern void* ud_get_user_opaque_data(const struct ud*); + +extern uint64_t ud_insn_sext_imm(const struct ud*, const struct ud_operand*); + +extern void ud_set_asm_buffer(struct ud *u, char *buf, size_t size); + +extern void ud_set_sym_resolver(struct ud *u, + const char* (*resolver)(struct ud*, + uint64_t addr, + int64_t *offset)); + +/* ========================================================================== */ + +#ifdef __cplusplus +} +#endif +#endif /* UD_EXTERN_H */ diff --git a/winsup/cygwin/udis86/itab.c b/winsup/cygwin/udis86/itab.c new file mode 100644 index 000000000..a3d0634b8 --- /dev/null +++ b/winsup/cygwin/udis86/itab.c @@ -0,0 +1,8401 @@ +/* itab.c -- generated by udis86:scripts/ud_itab.py, do no edit */ +#include "decode.h" + +#define GROUP(n) (0x8000 | (n)) + + +static const uint16_t ud_itab__1[] = { + /* 0 */ 7, 0, +}; + +static const uint16_t ud_itab__2[] = { + /* 0 */ 8, 0, +}; + +static const uint16_t ud_itab__3[] = { + /* 0 */ 15, 0, +}; + +static const uint16_t ud_itab__6[] = { + /* 0 */ 16, 0, 0, 0, +}; + +static const uint16_t ud_itab__7[] = { + /* 0 */ 17, 0, 0, 0, +}; + +static const uint16_t ud_itab__8[] = { + /* 0 */ 18, 0, 0, 0, +}; + +static const uint16_t ud_itab__9[] = { + /* 0 */ 19, 0, 0, 0, +}; + +static const uint16_t ud_itab__10[] = { + /* 0 */ 20, 0, 0, 0, +}; + +static const uint16_t ud_itab__11[] = { + /* 0 */ 21, 0, 0, 0, +}; + +static const uint16_t ud_itab__5[] = { + /* 0 */ GROUP(6), GROUP(7), GROUP(8), GROUP(9), + /* 4 */ GROUP(10), GROUP(11), 0, 0, +}; + +static const uint16_t ud_itab__15[] = { + /* 0 */ 22, 0, +}; + +static const uint16_t ud_itab__14[] = { + /* 0 */ GROUP(15), 0, 0, 0, +}; + +static const uint16_t ud_itab__17[] = { + /* 0 */ 23, 0, +}; + +static const uint16_t ud_itab__16[] = { + /* 0 */ GROUP(17), 0, 0, 0, +}; + +static const uint16_t ud_itab__19[] = { + /* 0 */ 24, 0, +}; + +static const uint16_t ud_itab__18[] = { + /* 0 */ GROUP(19), 0, 0, 0, +}; + +static const uint16_t ud_itab__21[] = { + /* 0 */ 25, 0, +}; + +static const uint16_t ud_itab__20[] = { + /* 0 */ GROUP(21), 0, 0, 0, +}; + +static const uint16_t ud_itab__23[] = { + /* 0 */ 26, 0, +}; + +static const uint16_t ud_itab__22[] = { + /* 0 */ GROUP(23), 0, 0, 0, +}; + +static const uint16_t ud_itab__25[] = { + /* 0 */ 27, 0, +}; + +static const uint16_t ud_itab__24[] = { + /* 0 */ GROUP(25), 0, 0, 0, +}; + +static const uint16_t ud_itab__27[] = { + /* 0 */ 28, 0, +}; + +static const uint16_t ud_itab__26[] = { + /* 0 */ GROUP(27), 0, 0, 0, +}; + +static const uint16_t ud_itab__13[] = { + /* 0 */ GROUP(14), GROUP(16), GROUP(18), GROUP(20), + /* 4 */ GROUP(22), 0, GROUP(24), GROUP(26), +}; + +static const uint16_t ud_itab__32[] = { + /* 0 */ 0, 29, 0, +}; + +static const uint16_t ud_itab__31[] = { + /* 0 */ 0, GROUP(32), +}; + +static const uint16_t ud_itab__30[] = { + /* 0 */ GROUP(31), 0, 0, 0, +}; + +static const uint16_t ud_itab__35[] = { + /* 0 */ 0, 30, 0, +}; + +static const uint16_t ud_itab__34[] = { + /* 0 */ 0, GROUP(35), +}; + +static const uint16_t ud_itab__33[] = { + /* 0 */ GROUP(34), 0, 0, 0, +}; + +static const uint16_t ud_itab__38[] = { + /* 0 */ 0, 31, 0, +}; + +static const uint16_t ud_itab__37[] = { + /* 0 */ 0, GROUP(38), +}; + +static const uint16_t ud_itab__36[] = { + /* 0 */ GROUP(37), 0, 0, 0, +}; + +static const uint16_t ud_itab__41[] = { + /* 0 */ 0, 32, 0, +}; + +static const uint16_t ud_itab__40[] = { + /* 0 */ 0, GROUP(41), +}; + +static const uint16_t ud_itab__39[] = { + /* 0 */ GROUP(40), 0, 0, 0, +}; + +static const uint16_t ud_itab__29[] = { + /* 0 */ 0, GROUP(30), GROUP(33), GROUP(36), + /* 4 */ GROUP(39), 0, 0, 0, +}; + +static const uint16_t ud_itab__44[] = { + /* 0 */ 0, 33, +}; + +static const uint16_t ud_itab__43[] = { + /* 0 */ GROUP(44), 0, 0, 0, +}; + +static const uint16_t ud_itab__46[] = { + /* 0 */ 0, 34, +}; + +static const uint16_t ud_itab__45[] = { + /* 0 */ GROUP(46), 0, 0, 0, +}; + +static const uint16_t ud_itab__42[] = { + /* 0 */ GROUP(43), GROUP(45), 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__49[] = { + /* 0 */ 0, 35, +}; + +static const uint16_t ud_itab__48[] = { + /* 0 */ GROUP(49), 0, 0, 0, +}; + +static const uint16_t ud_itab__51[] = { + /* 0 */ 0, 36, +}; + +static const uint16_t ud_itab__50[] = { + /* 0 */ GROUP(51), 0, 0, 0, +}; + +static const uint16_t ud_itab__47[] = { + /* 0 */ GROUP(48), GROUP(50), 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__55[] = { + /* 0 */ 37, 0, 0, +}; + +static const uint16_t ud_itab__54[] = { + /* 0 */ 0, GROUP(55), +}; + +static const uint16_t ud_itab__53[] = { + /* 0 */ GROUP(54), 0, 0, 0, +}; + +static const uint16_t ud_itab__58[] = { + /* 0 */ 38, 0, 0, +}; + +static const uint16_t ud_itab__57[] = { + /* 0 */ 0, GROUP(58), +}; + +static const uint16_t ud_itab__56[] = { + /* 0 */ GROUP(57), 0, 0, 0, +}; + +static const uint16_t ud_itab__61[] = { + /* 0 */ 39, 0, 0, +}; + +static const uint16_t ud_itab__60[] = { + /* 0 */ 0, GROUP(61), +}; + +static const uint16_t ud_itab__59[] = { + /* 0 */ GROUP(60), 0, 0, 0, +}; + +static const uint16_t ud_itab__64[] = { + /* 0 */ 40, 0, 0, +}; + +static const uint16_t ud_itab__63[] = { + /* 0 */ 0, GROUP(64), +}; + +static const uint16_t ud_itab__62[] = { + /* 0 */ GROUP(63), 0, 0, 0, +}; + +static const uint16_t ud_itab__67[] = { + /* 0 */ 41, 0, 0, +}; + +static const uint16_t ud_itab__66[] = { + /* 0 */ 0, GROUP(67), +}; + +static const uint16_t ud_itab__65[] = { + /* 0 */ GROUP(66), 0, 0, 0, +}; + +static const uint16_t ud_itab__70[] = { + /* 0 */ 42, 0, 0, +}; + +static const uint16_t ud_itab__69[] = { + /* 0 */ 0, GROUP(70), +}; + +static const uint16_t ud_itab__68[] = { + /* 0 */ GROUP(69), 0, 0, 0, +}; + +static const uint16_t ud_itab__73[] = { + /* 0 */ 43, 0, 0, +}; + +static const uint16_t ud_itab__72[] = { + /* 0 */ 0, GROUP(73), +}; + +static const uint16_t ud_itab__71[] = { + /* 0 */ GROUP(72), 0, 0, 0, +}; + +static const uint16_t ud_itab__76[] = { + /* 0 */ 44, 0, 0, +}; + +static const uint16_t ud_itab__75[] = { + /* 0 */ 0, GROUP(76), +}; + +static const uint16_t ud_itab__74[] = { + /* 0 */ GROUP(75), 0, 0, 0, +}; + +static const uint16_t ud_itab__52[] = { + /* 0 */ GROUP(53), GROUP(56), GROUP(59), GROUP(62), + /* 4 */ GROUP(65), GROUP(68), GROUP(71), GROUP(74), +}; + +static const uint16_t ud_itab__78[] = { + /* 0 */ 0, 45, +}; + +static const uint16_t ud_itab__77[] = { + /* 0 */ GROUP(78), 0, 0, 0, +}; + +static const uint16_t ud_itab__80[] = { + /* 0 */ 0, 46, +}; + +static const uint16_t ud_itab__79[] = { + /* 0 */ GROUP(80), 0, 0, 0, +}; + +static const uint16_t ud_itab__83[] = { + /* 0 */ 0, 47, +}; + +static const uint16_t ud_itab__82[] = { + /* 0 */ GROUP(83), 0, 0, 0, +}; + +static const uint16_t ud_itab__86[] = { + /* 0 */ 48, 0, 0, +}; + +static const uint16_t ud_itab__85[] = { + /* 0 */ 0, GROUP(86), +}; + +static const uint16_t ud_itab__84[] = { + /* 0 */ GROUP(85), 0, 0, 0, +}; + +static const uint16_t ud_itab__81[] = { + /* 0 */ GROUP(82), GROUP(84), 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__28[] = { + /* 0 */ GROUP(29), GROUP(42), GROUP(47), GROUP(52), + /* 4 */ GROUP(77), 0, GROUP(79), GROUP(81), +}; + +static const uint16_t ud_itab__12[] = { + /* 0 */ GROUP(13), GROUP(28), +}; + +static const uint16_t ud_itab__87[] = { + /* 0 */ 49, 0, 0, 0, +}; + +static const uint16_t ud_itab__88[] = { + /* 0 */ 50, 0, 0, 0, +}; + +static const uint16_t ud_itab__89[] = { + /* 0 */ 51, 0, 0, 0, +}; + +static const uint16_t ud_itab__90[] = { + /* 0 */ 52, 0, 0, 0, +}; + +static const uint16_t ud_itab__91[] = { + /* 0 */ 53, 0, 0, 0, +}; + +static const uint16_t ud_itab__92[] = { + /* 0 */ 54, 0, 0, 0, +}; + +static const uint16_t ud_itab__93[] = { + /* 0 */ 55, 0, 0, 0, +}; + +static const uint16_t ud_itab__94[] = { + /* 0 */ 56, 0, 0, 0, +}; + +static const uint16_t ud_itab__96[] = { + /* 0 */ 57, 0, 0, 0, +}; + +static const uint16_t ud_itab__97[] = { + /* 0 */ 58, 0, 0, 0, +}; + +static const uint16_t ud_itab__98[] = { + /* 0 */ 59, 0, 0, 0, +}; + +static const uint16_t ud_itab__99[] = { + /* 0 */ 60, 0, 0, 0, +}; + +static const uint16_t ud_itab__100[] = { + /* 0 */ 61, 0, 0, 0, +}; + +static const uint16_t ud_itab__101[] = { + /* 0 */ 62, 0, 0, 0, +}; + +static const uint16_t ud_itab__102[] = { + /* 0 */ 63, 0, 0, 0, +}; + +static const uint16_t ud_itab__103[] = { + /* 0 */ 64, 0, 0, 0, +}; + +static const uint16_t ud_itab__95[] = { + /* 0 */ GROUP(96), GROUP(97), GROUP(98), GROUP(99), + /* 4 */ GROUP(100), GROUP(101), GROUP(102), GROUP(103), +}; + +static const uint16_t ud_itab__104[] = { + /* 0 */ 65, 0, 0, 0, +}; + +static const uint16_t ud_itab__105[] = { + /* 0 */ 0, 0, 0, 0, + /* 4 */ 0, 0, 0, 0, + /* 8 */ 0, 0, 0, 0, + /* c */ 66, 67, 0, 0, + /* 10 */ 0, 0, 0, 0, + /* 14 */ 0, 0, 0, 0, + /* 18 */ 0, 0, 0, 0, + /* 1c */ 68, 69, 0, 0, + /* 20 */ 0, 0, 0, 0, + /* 24 */ 0, 0, 0, 0, + /* 28 */ 0, 0, 0, 0, + /* 2c */ 0, 0, 0, 0, + /* 30 */ 0, 0, 0, 0, + /* 34 */ 0, 0, 0, 0, + /* 38 */ 0, 0, 0, 0, + /* 3c */ 0, 0, 0, 0, + /* 40 */ 0, 0, 0, 0, + /* 44 */ 0, 0, 0, 0, + /* 48 */ 0, 0, 0, 0, + /* 4c */ 0, 0, 0, 0, + /* 50 */ 0, 0, 0, 0, + /* 54 */ 0, 0, 0, 0, + /* 58 */ 0, 0, 0, 0, + /* 5c */ 0, 0, 0, 0, + /* 60 */ 0, 0, 0, 0, + /* 64 */ 0, 0, 0, 0, + /* 68 */ 0, 0, 0, 0, + /* 6c */ 0, 0, 0, 0, + /* 70 */ 0, 0, 0, 0, + /* 74 */ 0, 0, 0, 0, + /* 78 */ 0, 0, 0, 0, + /* 7c */ 0, 0, 0, 0, + /* 80 */ 0, 0, 0, 0, + /* 84 */ 0, 0, 0, 0, + /* 88 */ 0, 0, 70, 0, + /* 8c */ 0, 0, 71, 0, + /* 90 */ 72, 0, 0, 0, + /* 94 */ 73, 0, 74, 75, + /* 98 */ 0, 0, 76, 0, + /* 9c */ 0, 0, 77, 0, + /* a0 */ 78, 0, 0, 0, + /* a4 */ 79, 0, 80, 81, + /* a8 */ 0, 0, 82, 0, + /* ac */ 0, 0, 83, 0, + /* b0 */ 84, 0, 0, 0, + /* b4 */ 85, 0, 86, 87, + /* b8 */ 0, 0, 0, 88, + /* bc */ 0, 0, 0, 89, + /* c0 */ 0, 0, 0, 0, + /* c4 */ 0, 0, 0, 0, + /* c8 */ 0, 0, 0, 0, + /* cc */ 0, 0, 0, 0, + /* d0 */ 0, 0, 0, 0, + /* d4 */ 0, 0, 0, 0, + /* d8 */ 0, 0, 0, 0, + /* dc */ 0, 0, 0, 0, + /* e0 */ 0, 0, 0, 0, + /* e4 */ 0, 0, 0, 0, + /* e8 */ 0, 0, 0, 0, + /* ec */ 0, 0, 0, 0, + /* f0 */ 0, 0, 0, 0, + /* f4 */ 0, 0, 0, 0, + /* f8 */ 0, 0, 0, 0, + /* fc */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__106[] = { + /* 0 */ 90, 91, 92, 93, +}; + +static const uint16_t ud_itab__107[] = { + /* 0 */ 94, 95, 96, 97, +}; + +static const uint16_t ud_itab__110[] = { + /* 0 */ 98, 0, +}; + +static const uint16_t ud_itab__111[] = { + /* 0 */ 99, 0, +}; + +static const uint16_t ud_itab__112[] = { + /* 0 */ 100, 0, +}; + +static const uint16_t ud_itab__113[] = { + /* 0 */ 101, 0, +}; + +static const uint16_t ud_itab__109[] = { + /* 0 */ GROUP(110), GROUP(111), GROUP(112), GROUP(113), +}; + +static const uint16_t ud_itab__115[] = { + /* 0 */ 0, 102, +}; + +static const uint16_t ud_itab__116[] = { + /* 0 */ 0, 103, +}; + +static const uint16_t ud_itab__117[] = { + /* 0 */ 0, 104, +}; + +static const uint16_t ud_itab__114[] = { + /* 0 */ GROUP(115), GROUP(116), GROUP(117), 0, +}; + +static const uint16_t ud_itab__108[] = { + /* 0 */ GROUP(109), GROUP(114), +}; + +static const uint16_t ud_itab__118[] = { + /* 0 */ 105, 0, 0, 106, +}; + +static const uint16_t ud_itab__119[] = { + /* 0 */ 107, 0, 0, 108, +}; + +static const uint16_t ud_itab__120[] = { + /* 0 */ 109, 0, 0, 110, +}; + +static const uint16_t ud_itab__123[] = { + /* 0 */ 111, 0, +}; + +static const uint16_t ud_itab__124[] = { + /* 0 */ 112, 0, +}; + +static const uint16_t ud_itab__125[] = { + /* 0 */ 113, 0, +}; + +static const uint16_t ud_itab__122[] = { + /* 0 */ GROUP(123), 0, GROUP(124), GROUP(125), +}; + +static const uint16_t ud_itab__127[] = { + /* 0 */ 0, 114, +}; + +static const uint16_t ud_itab__128[] = { + /* 0 */ 0, 115, +}; + +static const uint16_t ud_itab__126[] = { + /* 0 */ GROUP(127), 0, GROUP(128), 0, +}; + +static const uint16_t ud_itab__121[] = { + /* 0 */ GROUP(122), GROUP(126), +}; + +static const uint16_t ud_itab__129[] = { + /* 0 */ 116, 0, 0, 117, +}; + +static const uint16_t ud_itab__131[] = { + /* 0 */ 118, 0, 0, 0, +}; + +static const uint16_t ud_itab__132[] = { + /* 0 */ 119, 0, 0, 0, +}; + +static const uint16_t ud_itab__133[] = { + /* 0 */ 120, 0, 0, 0, +}; + +static const uint16_t ud_itab__134[] = { + /* 0 */ 121, 0, 0, 0, +}; + +static const uint16_t ud_itab__130[] = { + /* 0 */ GROUP(131), GROUP(132), GROUP(133), GROUP(134), + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__135[] = { + /* 0 */ 122, 0, 0, 0, +}; + +static const uint16_t ud_itab__136[] = { + /* 0 */ 123, 0, 0, 0, +}; + +static const uint16_t ud_itab__137[] = { + /* 0 */ 124, 0, 0, 0, +}; + +static const uint16_t ud_itab__138[] = { + /* 0 */ 125, 0, 0, 0, +}; + +static const uint16_t ud_itab__139[] = { + /* 0 */ 126, 0, 0, 0, +}; + +static const uint16_t ud_itab__140[] = { + /* 0 */ 127, 0, 0, 0, +}; + +static const uint16_t ud_itab__141[] = { + /* 0 */ 128, 0, 0, 0, +}; + +static const uint16_t ud_itab__142[] = { + /* 0 */ 129, 0, 0, 0, +}; + +static const uint16_t ud_itab__143[] = { + /* 0 */ 130, 0, 0, 0, +}; + +static const uint16_t ud_itab__144[] = { + /* 0 */ 131, 0, 0, 0, +}; + +static const uint16_t ud_itab__145[] = { + /* 0 */ 132, 0, 0, 0, +}; + +static const uint16_t ud_itab__146[] = { + /* 0 */ 133, 0, 0, 134, +}; + +static const uint16_t ud_itab__147[] = { + /* 0 */ 135, 0, 0, 136, +}; + +static const uint16_t ud_itab__148[] = { + /* 0 */ 137, 138, 139, 140, +}; + +static const uint16_t ud_itab__149[] = { + /* 0 */ 141, 0, 0, 142, +}; + +static const uint16_t ud_itab__150[] = { + /* 0 */ 143, 144, 145, 146, +}; + +static const uint16_t ud_itab__151[] = { + /* 0 */ 147, 148, 149, 150, +}; + +static const uint16_t ud_itab__152[] = { + /* 0 */ 151, 0, 0, 152, +}; + +static const uint16_t ud_itab__153[] = { + /* 0 */ 153, 0, 0, 154, +}; + +static const uint16_t ud_itab__154[] = { + /* 0 */ 155, 0, 0, 0, +}; + +static const uint16_t ud_itab__155[] = { + /* 0 */ 156, 0, 0, 0, +}; + +static const uint16_t ud_itab__156[] = { + /* 0 */ 157, 0, 0, 0, +}; + +static const uint16_t ud_itab__157[] = { + /* 0 */ 158, 0, 0, 0, +}; + +static const uint16_t ud_itab__160[] = { + /* 0 */ 0, 160, 0, +}; + +static const uint16_t ud_itab__159[] = { + /* 0 */ 159, GROUP(160), +}; + +static const uint16_t ud_itab__158[] = { + /* 0 */ GROUP(159), 0, 0, 0, +}; + +static const uint16_t ud_itab__163[] = { + /* 0 */ 0, 162, 0, +}; + +static const uint16_t ud_itab__162[] = { + /* 0 */ 161, GROUP(163), +}; + +static const uint16_t ud_itab__161[] = { + /* 0 */ GROUP(162), 0, 0, 0, +}; + +static const uint16_t ud_itab__164[] = { + /* 0 */ 163, 0, 0, 0, +}; + +static const uint16_t ud_itab__166[] = { + /* 0 */ 164, 0, 0, 165, +}; + +static const uint16_t ud_itab__167[] = { + /* 0 */ 166, 0, 0, 167, +}; + +static const uint16_t ud_itab__168[] = { + /* 0 */ 168, 0, 0, 169, +}; + +static const uint16_t ud_itab__169[] = { + /* 0 */ 170, 0, 0, 171, +}; + +static const uint16_t ud_itab__170[] = { + /* 0 */ 172, 0, 0, 173, +}; + +static const uint16_t ud_itab__171[] = { + /* 0 */ 174, 0, 0, 175, +}; + +static const uint16_t ud_itab__172[] = { + /* 0 */ 176, 0, 0, 177, +}; + +static const uint16_t ud_itab__173[] = { + /* 0 */ 178, 0, 0, 179, +}; + +static const uint16_t ud_itab__174[] = { + /* 0 */ 180, 0, 0, 181, +}; + +static const uint16_t ud_itab__175[] = { + /* 0 */ 182, 0, 0, 183, +}; + +static const uint16_t ud_itab__176[] = { + /* 0 */ 184, 0, 0, 185, +}; + +static const uint16_t ud_itab__177[] = { + /* 0 */ 186, 0, 0, 187, +}; + +static const uint16_t ud_itab__178[] = { + /* 0 */ 0, 0, 0, 188, +}; + +static const uint16_t ud_itab__179[] = { + /* 0 */ 0, 0, 0, 189, +}; + +static const uint16_t ud_itab__180[] = { + /* 0 */ 0, 0, 0, 190, +}; + +static const uint16_t ud_itab__181[] = { + /* 0 */ 0, 0, 0, 191, +}; + +static const uint16_t ud_itab__182[] = { + /* 0 */ 192, 0, 0, 193, +}; + +static const uint16_t ud_itab__183[] = { + /* 0 */ 194, 0, 0, 195, +}; + +static const uint16_t ud_itab__184[] = { + /* 0 */ 196, 0, 0, 197, +}; + +static const uint16_t ud_itab__185[] = { + /* 0 */ 0, 0, 0, 198, +}; + +static const uint16_t ud_itab__186[] = { + /* 0 */ 0, 0, 0, 199, +}; + +static const uint16_t ud_itab__187[] = { + /* 0 */ 0, 0, 0, 200, +}; + +static const uint16_t ud_itab__188[] = { + /* 0 */ 0, 0, 0, 201, +}; + +static const uint16_t ud_itab__189[] = { + /* 0 */ 0, 0, 0, 202, +}; + +static const uint16_t ud_itab__190[] = { + /* 0 */ 0, 0, 0, 203, +}; + +static const uint16_t ud_itab__191[] = { + /* 0 */ 0, 0, 0, 204, +}; + +static const uint16_t ud_itab__192[] = { + /* 0 */ 0, 0, 0, 205, +}; + +static const uint16_t ud_itab__193[] = { + /* 0 */ 0, 0, 0, 206, +}; + +static const uint16_t ud_itab__194[] = { + /* 0 */ 0, 0, 0, 207, +}; + +static const uint16_t ud_itab__195[] = { + /* 0 */ 0, 0, 0, 208, +}; + +static const uint16_t ud_itab__196[] = { + /* 0 */ 0, 0, 0, 209, +}; + +static const uint16_t ud_itab__197[] = { + /* 0 */ 0, 0, 0, 210, +}; + +static const uint16_t ud_itab__198[] = { + /* 0 */ 0, 0, 0, 211, +}; + +static const uint16_t ud_itab__199[] = { + /* 0 */ 0, 0, 0, 212, +}; + +static const uint16_t ud_itab__200[] = { + /* 0 */ 0, 0, 0, 213, +}; + +static const uint16_t ud_itab__201[] = { + /* 0 */ 0, 0, 0, 214, +}; + +static const uint16_t ud_itab__202[] = { + /* 0 */ 0, 0, 0, 215, +}; + +static const uint16_t ud_itab__203[] = { + /* 0 */ 0, 0, 0, 216, +}; + +static const uint16_t ud_itab__204[] = { + /* 0 */ 0, 0, 0, 217, +}; + +static const uint16_t ud_itab__205[] = { + /* 0 */ 0, 0, 0, 218, +}; + +static const uint16_t ud_itab__206[] = { + /* 0 */ 0, 0, 0, 219, +}; + +static const uint16_t ud_itab__207[] = { + /* 0 */ 0, 0, 0, 220, +}; + +static const uint16_t ud_itab__208[] = { + /* 0 */ 0, 0, 0, 221, +}; + +static const uint16_t ud_itab__209[] = { + /* 0 */ 0, 0, 0, 222, +}; + +static const uint16_t ud_itab__210[] = { + /* 0 */ 0, 0, 0, 223, +}; + +static const uint16_t ud_itab__211[] = { + /* 0 */ 0, 0, 0, 224, +}; + +static const uint16_t ud_itab__214[] = { + /* 0 */ 0, 225, 0, +}; + +static const uint16_t ud_itab__213[] = { + /* 0 */ 0, GROUP(214), +}; + +static const uint16_t ud_itab__212[] = { + /* 0 */ 0, 0, 0, GROUP(213), +}; + +static const uint16_t ud_itab__217[] = { + /* 0 */ 0, 226, 0, +}; + +static const uint16_t ud_itab__216[] = { + /* 0 */ 0, GROUP(217), +}; + +static const uint16_t ud_itab__215[] = { + /* 0 */ 0, 0, 0, GROUP(216), +}; + +static const uint16_t ud_itab__218[] = { + /* 0 */ 0, 0, 0, 227, +}; + +static const uint16_t ud_itab__219[] = { + /* 0 */ 0, 0, 0, 228, +}; + +static const uint16_t ud_itab__220[] = { + /* 0 */ 0, 0, 0, 229, +}; + +static const uint16_t ud_itab__221[] = { + /* 0 */ 0, 0, 0, 230, +}; + +static const uint16_t ud_itab__222[] = { + /* 0 */ 0, 0, 0, 231, +}; + +static const uint16_t ud_itab__223[] = { + /* 0 */ 232, 233, 0, 0, +}; + +static const uint16_t ud_itab__224[] = { + /* 0 */ 234, 235, 0, 0, +}; + +static const uint16_t ud_itab__165[] = { + /* 0 */ GROUP(166), GROUP(167), GROUP(168), GROUP(169), + /* 4 */ GROUP(170), GROUP(171), GROUP(172), GROUP(173), + /* 8 */ GROUP(174), GROUP(175), GROUP(176), GROUP(177), + /* c */ 0, 0, 0, 0, + /* 10 */ GROUP(178), 0, 0, 0, + /* 14 */ GROUP(179), GROUP(180), 0, GROUP(181), + /* 18 */ 0, 0, 0, 0, + /* 1c */ GROUP(182), GROUP(183), GROUP(184), 0, + /* 20 */ GROUP(185), GROUP(186), GROUP(187), GROUP(188), + /* 24 */ GROUP(189), GROUP(190), 0, 0, + /* 28 */ GROUP(191), GROUP(192), GROUP(193), GROUP(194), + /* 2c */ 0, 0, 0, 0, + /* 30 */ GROUP(195), GROUP(196), GROUP(197), GROUP(198), + /* 34 */ GROUP(199), GROUP(200), 0, GROUP(201), + /* 38 */ GROUP(202), GROUP(203), GROUP(204), GROUP(205), + /* 3c */ GROUP(206), GROUP(207), GROUP(208), GROUP(209), + /* 40 */ GROUP(210), GROUP(211), 0, 0, + /* 44 */ 0, 0, 0, 0, + /* 48 */ 0, 0, 0, 0, + /* 4c */ 0, 0, 0, 0, + /* 50 */ 0, 0, 0, 0, + /* 54 */ 0, 0, 0, 0, + /* 58 */ 0, 0, 0, 0, + /* 5c */ 0, 0, 0, 0, + /* 60 */ 0, 0, 0, 0, + /* 64 */ 0, 0, 0, 0, + /* 68 */ 0, 0, 0, 0, + /* 6c */ 0, 0, 0, 0, + /* 70 */ 0, 0, 0, 0, + /* 74 */ 0, 0, 0, 0, + /* 78 */ 0, 0, 0, 0, + /* 7c */ 0, 0, 0, 0, + /* 80 */ GROUP(212), GROUP(215), 0, 0, + /* 84 */ 0, 0, 0, 0, + /* 88 */ 0, 0, 0, 0, + /* 8c */ 0, 0, 0, 0, + /* 90 */ 0, 0, 0, 0, + /* 94 */ 0, 0, 0, 0, + /* 98 */ 0, 0, 0, 0, + /* 9c */ 0, 0, 0, 0, + /* a0 */ 0, 0, 0, 0, + /* a4 */ 0, 0, 0, 0, + /* a8 */ 0, 0, 0, 0, + /* ac */ 0, 0, 0, 0, + /* b0 */ 0, 0, 0, 0, + /* b4 */ 0, 0, 0, 0, + /* b8 */ 0, 0, 0, 0, + /* bc */ 0, 0, 0, 0, + /* c0 */ 0, 0, 0, 0, + /* c4 */ 0, 0, 0, 0, + /* c8 */ 0, 0, 0, 0, + /* cc */ 0, 0, 0, 0, + /* d0 */ 0, 0, 0, 0, + /* d4 */ 0, 0, 0, 0, + /* d8 */ 0, 0, 0, GROUP(218), + /* dc */ GROUP(219), GROUP(220), GROUP(221), GROUP(222), + /* e0 */ 0, 0, 0, 0, + /* e4 */ 0, 0, 0, 0, + /* e8 */ 0, 0, 0, 0, + /* ec */ 0, 0, 0, 0, + /* f0 */ GROUP(223), GROUP(224), 0, 0, + /* f4 */ 0, 0, 0, 0, + /* f8 */ 0, 0, 0, 0, + /* fc */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__226[] = { + /* 0 */ 0, 0, 0, 236, +}; + +static const uint16_t ud_itab__227[] = { + /* 0 */ 0, 0, 0, 237, +}; + +static const uint16_t ud_itab__228[] = { + /* 0 */ 0, 0, 0, 238, +}; + +static const uint16_t ud_itab__229[] = { + /* 0 */ 0, 0, 0, 239, +}; + +static const uint16_t ud_itab__230[] = { + /* 0 */ 0, 0, 0, 240, +}; + +static const uint16_t ud_itab__231[] = { + /* 0 */ 0, 0, 0, 241, +}; + +static const uint16_t ud_itab__232[] = { + /* 0 */ 0, 0, 0, 242, +}; + +static const uint16_t ud_itab__233[] = { + /* 0 */ 243, 0, 0, 244, +}; + +static const uint16_t ud_itab__234[] = { + /* 0 */ 0, 0, 0, 245, +}; + +static const uint16_t ud_itab__235[] = { + /* 0 */ 0, 0, 0, 246, +}; + +static const uint16_t ud_itab__237[] = { + /* 0 */ 247, 248, 249, +}; + +static const uint16_t ud_itab__236[] = { + /* 0 */ 0, 0, 0, GROUP(237), +}; + +static const uint16_t ud_itab__238[] = { + /* 0 */ 0, 0, 0, 250, +}; + +static const uint16_t ud_itab__239[] = { + /* 0 */ 0, 0, 0, 251, +}; + +static const uint16_t ud_itab__240[] = { + /* 0 */ 0, 0, 0, 252, +}; + +static const uint16_t ud_itab__242[] = { + /* 0 */ 253, 254, 255, +}; + +static const uint16_t ud_itab__241[] = { + /* 0 */ 0, 0, 0, GROUP(242), +}; + +static const uint16_t ud_itab__243[] = { + /* 0 */ 0, 0, 0, 256, +}; + +static const uint16_t ud_itab__244[] = { + /* 0 */ 0, 0, 0, 257, +}; + +static const uint16_t ud_itab__245[] = { + /* 0 */ 0, 0, 0, 258, +}; + +static const uint16_t ud_itab__246[] = { + /* 0 */ 0, 0, 0, 259, +}; + +static const uint16_t ud_itab__247[] = { + /* 0 */ 0, 0, 0, 260, +}; + +static const uint16_t ud_itab__248[] = { + /* 0 */ 0, 0, 0, 261, +}; + +static const uint16_t ud_itab__249[] = { + /* 0 */ 0, 0, 0, 262, +}; + +static const uint16_t ud_itab__250[] = { + /* 0 */ 0, 0, 0, 263, +}; + +static const uint16_t ud_itab__251[] = { + /* 0 */ 0, 0, 0, 264, +}; + +static const uint16_t ud_itab__225[] = { + /* 0 */ 0, 0, 0, 0, + /* 4 */ 0, 0, 0, 0, + /* 8 */ GROUP(226), GROUP(227), GROUP(228), GROUP(229), + /* c */ GROUP(230), GROUP(231), GROUP(232), GROUP(233), + /* 10 */ 0, 0, 0, 0, + /* 14 */ GROUP(234), GROUP(235), GROUP(236), GROUP(238), + /* 18 */ 0, 0, 0, 0, + /* 1c */ 0, 0, 0, 0, + /* 20 */ GROUP(239), GROUP(240), GROUP(241), 0, + /* 24 */ 0, 0, 0, 0, + /* 28 */ 0, 0, 0, 0, + /* 2c */ 0, 0, 0, 0, + /* 30 */ 0, 0, 0, 0, + /* 34 */ 0, 0, 0, 0, + /* 38 */ 0, 0, 0, 0, + /* 3c */ 0, 0, 0, 0, + /* 40 */ GROUP(243), GROUP(244), GROUP(245), 0, + /* 44 */ GROUP(246), 0, 0, 0, + /* 48 */ 0, 0, 0, 0, + /* 4c */ 0, 0, 0, 0, + /* 50 */ 0, 0, 0, 0, + /* 54 */ 0, 0, 0, 0, + /* 58 */ 0, 0, 0, 0, + /* 5c */ 0, 0, 0, 0, + /* 60 */ GROUP(247), GROUP(248), GROUP(249), GROUP(250), + /* 64 */ 0, 0, 0, 0, + /* 68 */ 0, 0, 0, 0, + /* 6c */ 0, 0, 0, 0, + /* 70 */ 0, 0, 0, 0, + /* 74 */ 0, 0, 0, 0, + /* 78 */ 0, 0, 0, 0, + /* 7c */ 0, 0, 0, 0, + /* 80 */ 0, 0, 0, 0, + /* 84 */ 0, 0, 0, 0, + /* 88 */ 0, 0, 0, 0, + /* 8c */ 0, 0, 0, 0, + /* 90 */ 0, 0, 0, 0, + /* 94 */ 0, 0, 0, 0, + /* 98 */ 0, 0, 0, 0, + /* 9c */ 0, 0, 0, 0, + /* a0 */ 0, 0, 0, 0, + /* a4 */ 0, 0, 0, 0, + /* a8 */ 0, 0, 0, 0, + /* ac */ 0, 0, 0, 0, + /* b0 */ 0, 0, 0, 0, + /* b4 */ 0, 0, 0, 0, + /* b8 */ 0, 0, 0, 0, + /* bc */ 0, 0, 0, 0, + /* c0 */ 0, 0, 0, 0, + /* c4 */ 0, 0, 0, 0, + /* c8 */ 0, 0, 0, 0, + /* cc */ 0, 0, 0, 0, + /* d0 */ 0, 0, 0, 0, + /* d4 */ 0, 0, 0, 0, + /* d8 */ 0, 0, 0, 0, + /* dc */ 0, 0, 0, GROUP(251), + /* e0 */ 0, 0, 0, 0, + /* e4 */ 0, 0, 0, 0, + /* e8 */ 0, 0, 0, 0, + /* ec */ 0, 0, 0, 0, + /* f0 */ 0, 0, 0, 0, + /* f4 */ 0, 0, 0, 0, + /* f8 */ 0, 0, 0, 0, + /* fc */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__252[] = { + /* 0 */ 265, 0, 0, 0, +}; + +static const uint16_t ud_itab__253[] = { + /* 0 */ 266, 0, 0, 0, +}; + +static const uint16_t ud_itab__254[] = { + /* 0 */ 267, 0, 0, 0, +}; + +static const uint16_t ud_itab__255[] = { + /* 0 */ 268, 0, 0, 0, +}; + +static const uint16_t ud_itab__256[] = { + /* 0 */ 269, 0, 0, 0, +}; + +static const uint16_t ud_itab__257[] = { + /* 0 */ 270, 0, 0, 0, +}; + +static const uint16_t ud_itab__258[] = { + /* 0 */ 271, 0, 0, 0, +}; + +static const uint16_t ud_itab__259[] = { + /* 0 */ 272, 0, 0, 0, +}; + +static const uint16_t ud_itab__260[] = { + /* 0 */ 273, 0, 0, 0, +}; + +static const uint16_t ud_itab__261[] = { + /* 0 */ 274, 0, 0, 0, +}; + +static const uint16_t ud_itab__262[] = { + /* 0 */ 275, 0, 0, 0, +}; + +static const uint16_t ud_itab__263[] = { + /* 0 */ 276, 0, 0, 0, +}; + +static const uint16_t ud_itab__264[] = { + /* 0 */ 277, 0, 0, 0, +}; + +static const uint16_t ud_itab__265[] = { + /* 0 */ 278, 0, 0, 0, +}; + +static const uint16_t ud_itab__266[] = { + /* 0 */ 279, 0, 0, 0, +}; + +static const uint16_t ud_itab__267[] = { + /* 0 */ 280, 0, 0, 0, +}; + +static const uint16_t ud_itab__268[] = { + /* 0 */ 281, 0, 0, 282, +}; + +static const uint16_t ud_itab__269[] = { + /* 0 */ 283, 284, 285, 286, +}; + +static const uint16_t ud_itab__270[] = { + /* 0 */ 287, 0, 288, 0, +}; + +static const uint16_t ud_itab__271[] = { + /* 0 */ 289, 0, 290, 0, +}; + +static const uint16_t ud_itab__272[] = { + /* 0 */ 291, 0, 0, 292, +}; + +static const uint16_t ud_itab__273[] = { + /* 0 */ 293, 0, 0, 294, +}; + +static const uint16_t ud_itab__274[] = { + /* 0 */ 295, 0, 0, 296, +}; + +static const uint16_t ud_itab__275[] = { + /* 0 */ 297, 0, 0, 298, +}; + +static const uint16_t ud_itab__276[] = { + /* 0 */ 299, 300, 301, 302, +}; + +static const uint16_t ud_itab__277[] = { + /* 0 */ 303, 304, 305, 306, +}; + +static const uint16_t ud_itab__278[] = { + /* 0 */ 307, 308, 309, 310, +}; + +static const uint16_t ud_itab__279[] = { + /* 0 */ 311, 0, 312, 313, +}; + +static const uint16_t ud_itab__280[] = { + /* 0 */ 314, 315, 316, 317, +}; + +static const uint16_t ud_itab__281[] = { + /* 0 */ 318, 319, 320, 321, +}; + +static const uint16_t ud_itab__282[] = { + /* 0 */ 322, 323, 324, 325, +}; + +static const uint16_t ud_itab__283[] = { + /* 0 */ 326, 327, 328, 329, +}; + +static const uint16_t ud_itab__284[] = { + /* 0 */ 330, 0, 0, 331, +}; + +static const uint16_t ud_itab__285[] = { + /* 0 */ 332, 0, 0, 333, +}; + +static const uint16_t ud_itab__286[] = { + /* 0 */ 334, 0, 0, 335, +}; + +static const uint16_t ud_itab__287[] = { + /* 0 */ 336, 0, 0, 337, +}; + +static const uint16_t ud_itab__288[] = { + /* 0 */ 338, 0, 0, 339, +}; + +static const uint16_t ud_itab__289[] = { + /* 0 */ 340, 0, 0, 341, +}; + +static const uint16_t ud_itab__290[] = { + /* 0 */ 342, 0, 0, 343, +}; + +static const uint16_t ud_itab__291[] = { + /* 0 */ 344, 0, 0, 345, +}; + +static const uint16_t ud_itab__292[] = { + /* 0 */ 346, 0, 0, 347, +}; + +static const uint16_t ud_itab__293[] = { + /* 0 */ 348, 0, 0, 349, +}; + +static const uint16_t ud_itab__294[] = { + /* 0 */ 350, 0, 0, 351, +}; + +static const uint16_t ud_itab__295[] = { + /* 0 */ 352, 0, 0, 353, +}; + +static const uint16_t ud_itab__296[] = { + /* 0 */ 0, 0, 0, 354, +}; + +static const uint16_t ud_itab__297[] = { + /* 0 */ 0, 0, 0, 355, +}; + +static const uint16_t ud_itab__298[] = { + /* 0 */ 356, 0, 0, 357, +}; + +static const uint16_t ud_itab__299[] = { + /* 0 */ 358, 0, 359, 360, +}; + +static const uint16_t ud_itab__300[] = { + /* 0 */ 361, 362, 363, 364, +}; + +static const uint16_t ud_itab__302[] = { + /* 0 */ 365, 0, 0, 366, +}; + +static const uint16_t ud_itab__303[] = { + /* 0 */ 367, 0, 0, 368, +}; + +static const uint16_t ud_itab__304[] = { + /* 0 */ 369, 0, 0, 370, +}; + +static const uint16_t ud_itab__301[] = { + /* 0 */ 0, 0, GROUP(302), 0, + /* 4 */ GROUP(303), 0, GROUP(304), 0, +}; + +static const uint16_t ud_itab__306[] = { + /* 0 */ 371, 0, 0, 372, +}; + +static const uint16_t ud_itab__307[] = { + /* 0 */ 373, 0, 0, 374, +}; + +static const uint16_t ud_itab__308[] = { + /* 0 */ 375, 0, 0, 376, +}; + +static const uint16_t ud_itab__305[] = { + /* 0 */ 0, 0, GROUP(306), 0, + /* 4 */ GROUP(307), 0, GROUP(308), 0, +}; + +static const uint16_t ud_itab__310[] = { + /* 0 */ 377, 0, 0, 378, +}; + +static const uint16_t ud_itab__311[] = { + /* 0 */ 0, 0, 0, 379, +}; + +static const uint16_t ud_itab__312[] = { + /* 0 */ 380, 0, 0, 381, +}; + +static const uint16_t ud_itab__313[] = { + /* 0 */ 0, 0, 0, 382, +}; + +static const uint16_t ud_itab__309[] = { + /* 0 */ 0, 0, GROUP(310), GROUP(311), + /* 4 */ 0, 0, GROUP(312), GROUP(313), +}; + +static const uint16_t ud_itab__314[] = { + /* 0 */ 383, 0, 0, 384, +}; + +static const uint16_t ud_itab__315[] = { + /* 0 */ 385, 0, 0, 386, +}; + +static const uint16_t ud_itab__316[] = { + /* 0 */ 387, 0, 0, 388, +}; + +static const uint16_t ud_itab__317[] = { + /* 0 */ 389, 0, 0, 0, +}; + +static const uint16_t ud_itab__319[] = { + /* 0 */ 0, 390, 0, +}; + +static const uint16_t ud_itab__318[] = { + /* 0 */ GROUP(319), 0, 0, 0, +}; + +static const uint16_t ud_itab__321[] = { + /* 0 */ 0, 391, 0, +}; + +static const uint16_t ud_itab__320[] = { + /* 0 */ GROUP(321), 0, 0, 0, +}; + +static const uint16_t ud_itab__322[] = { + /* 0 */ 0, 392, 0, 393, +}; + +static const uint16_t ud_itab__323[] = { + /* 0 */ 0, 394, 0, 395, +}; + +static const uint16_t ud_itab__324[] = { + /* 0 */ 396, 0, 397, 398, +}; + +static const uint16_t ud_itab__325[] = { + /* 0 */ 399, 0, 400, 401, +}; + +static const uint16_t ud_itab__326[] = { + /* 0 */ 402, 0, 0, 0, +}; + +static const uint16_t ud_itab__327[] = { + /* 0 */ 403, 0, 0, 0, +}; + +static const uint16_t ud_itab__328[] = { + /* 0 */ 404, 0, 0, 0, +}; + +static const uint16_t ud_itab__329[] = { + /* 0 */ 405, 0, 0, 0, +}; + +static const uint16_t ud_itab__330[] = { + /* 0 */ 406, 0, 0, 0, +}; + +static const uint16_t ud_itab__331[] = { + /* 0 */ 407, 0, 0, 0, +}; + +static const uint16_t ud_itab__332[] = { + /* 0 */ 408, 0, 0, 0, +}; + +static const uint16_t ud_itab__333[] = { + /* 0 */ 409, 0, 0, 0, +}; + +static const uint16_t ud_itab__334[] = { + /* 0 */ 410, 0, 0, 0, +}; + +static const uint16_t ud_itab__335[] = { + /* 0 */ 411, 0, 0, 0, +}; + +static const uint16_t ud_itab__336[] = { + /* 0 */ 412, 0, 0, 0, +}; + +static const uint16_t ud_itab__337[] = { + /* 0 */ 413, 0, 0, 0, +}; + +static const uint16_t ud_itab__338[] = { + /* 0 */ 414, 0, 0, 0, +}; + +static const uint16_t ud_itab__339[] = { + /* 0 */ 415, 0, 0, 0, +}; + +static const uint16_t ud_itab__340[] = { + /* 0 */ 416, 0, 0, 0, +}; + +static const uint16_t ud_itab__341[] = { + /* 0 */ 417, 0, 0, 0, +}; + +static const uint16_t ud_itab__342[] = { + /* 0 */ 418, 0, 0, 0, +}; + +static const uint16_t ud_itab__343[] = { + /* 0 */ 419, 0, 0, 0, +}; + +static const uint16_t ud_itab__344[] = { + /* 0 */ 420, 0, 0, 0, +}; + +static const uint16_t ud_itab__345[] = { + /* 0 */ 421, 0, 0, 0, +}; + +static const uint16_t ud_itab__346[] = { + /* 0 */ 422, 0, 0, 0, +}; + +static const uint16_t ud_itab__347[] = { + /* 0 */ 423, 0, 0, 0, +}; + +static const uint16_t ud_itab__348[] = { + /* 0 */ 424, 0, 0, 0, +}; + +static const uint16_t ud_itab__349[] = { + /* 0 */ 425, 0, 0, 0, +}; + +static const uint16_t ud_itab__350[] = { + /* 0 */ 426, 0, 0, 0, +}; + +static const uint16_t ud_itab__351[] = { + /* 0 */ 427, 0, 0, 0, +}; + +static const uint16_t ud_itab__352[] = { + /* 0 */ 428, 0, 0, 0, +}; + +static const uint16_t ud_itab__353[] = { + /* 0 */ 429, 0, 0, 0, +}; + +static const uint16_t ud_itab__354[] = { + /* 0 */ 430, 0, 0, 0, +}; + +static const uint16_t ud_itab__355[] = { + /* 0 */ 431, 0, 0, 0, +}; + +static const uint16_t ud_itab__356[] = { + /* 0 */ 432, 0, 0, 0, +}; + +static const uint16_t ud_itab__357[] = { + /* 0 */ 433, 0, 0, 0, +}; + +static const uint16_t ud_itab__358[] = { + /* 0 */ 434, 0, 0, 0, +}; + +static const uint16_t ud_itab__359[] = { + /* 0 */ 435, 0, 0, 0, +}; + +static const uint16_t ud_itab__360[] = { + /* 0 */ 436, 0, 0, 0, +}; + +static const uint16_t ud_itab__361[] = { + /* 0 */ 437, 0, 0, 0, +}; + +static const uint16_t ud_itab__362[] = { + /* 0 */ 438, 0, 0, 0, +}; + +static const uint16_t ud_itab__363[] = { + /* 0 */ 439, 0, 0, 0, +}; + +static const uint16_t ud_itab__368[] = { + /* 0 */ 0, 440, +}; + +static const uint16_t ud_itab__367[] = { + /* 0 */ GROUP(368), 0, 0, 0, +}; + +static const uint16_t ud_itab__366[] = { + /* 0 */ GROUP(367), 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__371[] = { + /* 0 */ 0, 441, +}; + +static const uint16_t ud_itab__370[] = { + /* 0 */ GROUP(371), 0, 0, 0, +}; + +static const uint16_t ud_itab__369[] = { + /* 0 */ GROUP(370), 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__374[] = { + /* 0 */ 0, 442, +}; + +static const uint16_t ud_itab__373[] = { + /* 0 */ GROUP(374), 0, 0, 0, +}; + +static const uint16_t ud_itab__372[] = { + /* 0 */ GROUP(373), 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__365[] = { + /* 0 */ GROUP(366), GROUP(369), GROUP(372), 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__364[] = { + /* 0 */ 0, GROUP(365), +}; + +static const uint16_t ud_itab__379[] = { + /* 0 */ 0, 443, +}; + +static const uint16_t ud_itab__378[] = { + /* 0 */ GROUP(379), 0, 0, 0, +}; + +static const uint16_t ud_itab__377[] = { + /* 0 */ GROUP(378), 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__382[] = { + /* 0 */ 0, 444, +}; + +static const uint16_t ud_itab__381[] = { + /* 0 */ GROUP(382), 0, 0, 0, +}; + +static const uint16_t ud_itab__380[] = { + /* 0 */ GROUP(381), 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__385[] = { + /* 0 */ 0, 445, +}; + +static const uint16_t ud_itab__384[] = { + /* 0 */ GROUP(385), 0, 0, 0, +}; + +static const uint16_t ud_itab__383[] = { + /* 0 */ GROUP(384), 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__388[] = { + /* 0 */ 0, 446, +}; + +static const uint16_t ud_itab__387[] = { + /* 0 */ GROUP(388), 0, 0, 0, +}; + +static const uint16_t ud_itab__386[] = { + /* 0 */ GROUP(387), 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__391[] = { + /* 0 */ 0, 447, +}; + +static const uint16_t ud_itab__390[] = { + /* 0 */ GROUP(391), 0, 0, 0, +}; + +static const uint16_t ud_itab__389[] = { + /* 0 */ GROUP(390), 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__394[] = { + /* 0 */ 0, 448, +}; + +static const uint16_t ud_itab__393[] = { + /* 0 */ GROUP(394), 0, 0, 0, +}; + +static const uint16_t ud_itab__392[] = { + /* 0 */ GROUP(393), 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__376[] = { + /* 0 */ GROUP(377), GROUP(380), GROUP(383), GROUP(386), + /* 4 */ GROUP(389), GROUP(392), 0, 0, +}; + +static const uint16_t ud_itab__375[] = { + /* 0 */ 0, GROUP(376), +}; + +static const uint16_t ud_itab__395[] = { + /* 0 */ 449, 0, 0, 0, +}; + +static const uint16_t ud_itab__396[] = { + /* 0 */ 450, 0, 0, 0, +}; + +static const uint16_t ud_itab__397[] = { + /* 0 */ 451, 0, 0, 0, +}; + +static const uint16_t ud_itab__398[] = { + /* 0 */ 452, 0, 0, 0, +}; + +static const uint16_t ud_itab__399[] = { + /* 0 */ 453, 0, 0, 0, +}; + +static const uint16_t ud_itab__400[] = { + /* 0 */ 454, 0, 0, 0, +}; + +static const uint16_t ud_itab__404[] = { + /* 0 */ 455, 0, +}; + +static const uint16_t ud_itab__403[] = { + /* 0 */ GROUP(404), 0, 0, 0, +}; + +static const uint16_t ud_itab__406[] = { + /* 0 */ 456, 0, +}; + +static const uint16_t ud_itab__405[] = { + /* 0 */ GROUP(406), 0, 0, 0, +}; + +static const uint16_t ud_itab__408[] = { + /* 0 */ 457, 0, +}; + +static const uint16_t ud_itab__407[] = { + /* 0 */ GROUP(408), 0, 0, 0, +}; + +static const uint16_t ud_itab__410[] = { + /* 0 */ 458, 0, +}; + +static const uint16_t ud_itab__409[] = { + /* 0 */ GROUP(410), 0, 0, 0, +}; + +static const uint16_t ud_itab__412[] = { + /* 0 */ 459, 0, +}; + +static const uint16_t ud_itab__411[] = { + /* 0 */ GROUP(412), 0, 0, 0, +}; + +static const uint16_t ud_itab__414[] = { + /* 0 */ 460, 0, +}; + +static const uint16_t ud_itab__413[] = { + /* 0 */ GROUP(414), 0, 0, 0, +}; + +static const uint16_t ud_itab__416[] = { + /* 0 */ 461, 0, +}; + +static const uint16_t ud_itab__415[] = { + /* 0 */ GROUP(416), 0, 0, 0, +}; + +static const uint16_t ud_itab__402[] = { + /* 0 */ GROUP(403), GROUP(405), GROUP(407), GROUP(409), + /* 4 */ GROUP(411), GROUP(413), 0, GROUP(415), +}; + +static const uint16_t ud_itab__420[] = { + /* 0 */ 0, 462, +}; + +static const uint16_t ud_itab__419[] = { + /* 0 */ GROUP(420), 0, 0, 0, +}; + +static const uint16_t ud_itab__422[] = { + /* 0 */ 0, 463, +}; + +static const uint16_t ud_itab__421[] = { + /* 0 */ GROUP(422), 0, 0, 0, +}; + +static const uint16_t ud_itab__424[] = { + /* 0 */ 0, 464, +}; + +static const uint16_t ud_itab__423[] = { + /* 0 */ GROUP(424), 0, 0, 0, +}; + +static const uint16_t ud_itab__426[] = { + /* 0 */ 0, 465, +}; + +static const uint16_t ud_itab__425[] = { + /* 0 */ GROUP(426), 0, 0, 0, +}; + +static const uint16_t ud_itab__428[] = { + /* 0 */ 0, 466, +}; + +static const uint16_t ud_itab__427[] = { + /* 0 */ GROUP(428), 0, 0, 0, +}; + +static const uint16_t ud_itab__430[] = { + /* 0 */ 0, 467, +}; + +static const uint16_t ud_itab__429[] = { + /* 0 */ GROUP(430), 0, 0, 0, +}; + +static const uint16_t ud_itab__432[] = { + /* 0 */ 0, 468, +}; + +static const uint16_t ud_itab__431[] = { + /* 0 */ GROUP(432), 0, 0, 0, +}; + +static const uint16_t ud_itab__434[] = { + /* 0 */ 0, 469, +}; + +static const uint16_t ud_itab__433[] = { + /* 0 */ GROUP(434), 0, 0, 0, +}; + +static const uint16_t ud_itab__418[] = { + /* 0 */ GROUP(419), GROUP(421), GROUP(423), GROUP(425), + /* 4 */ GROUP(427), GROUP(429), GROUP(431), GROUP(433), +}; + +static const uint16_t ud_itab__437[] = { + /* 0 */ 0, 470, +}; + +static const uint16_t ud_itab__436[] = { + /* 0 */ GROUP(437), 0, 0, 0, +}; + +static const uint16_t ud_itab__439[] = { + /* 0 */ 0, 471, +}; + +static const uint16_t ud_itab__438[] = { + /* 0 */ GROUP(439), 0, 0, 0, +}; + +static const uint16_t ud_itab__441[] = { + /* 0 */ 0, 472, +}; + +static const uint16_t ud_itab__440[] = { + /* 0 */ GROUP(441), 0, 0, 0, +}; + +static const uint16_t ud_itab__443[] = { + /* 0 */ 0, 473, +}; + +static const uint16_t ud_itab__442[] = { + /* 0 */ GROUP(443), 0, 0, 0, +}; + +static const uint16_t ud_itab__445[] = { + /* 0 */ 0, 474, +}; + +static const uint16_t ud_itab__444[] = { + /* 0 */ GROUP(445), 0, 0, 0, +}; + +static const uint16_t ud_itab__447[] = { + /* 0 */ 0, 475, +}; + +static const uint16_t ud_itab__446[] = { + /* 0 */ GROUP(447), 0,[...] [diff truncated at 100000 bytes]