Fix some memmory leaks
authoretxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7>
Mon, 22 Nov 2004 22:18:18 +0000 (22:18 +0000)
committeretxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7>
Mon, 22 Nov 2004 22:18:18 +0000 (22:18 +0000)
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@12579 f5534014-38df-0310-8fa8-9805f1628bb7

epan/sigcomp-udvm.c
epan/sigcomp-udvm.h
epan/sigcomp_state_hdlr.c
epan/sigcomp_state_hdlr.h

index bdabb3ace749f89132649faffb07fd36245fc106..06714a3061a7e9330953108e0e3a219e4fe51ff6 100644 (file)
-/* sigcomp-udvm.c
- * Routines making up the Universal Decompressor Virtual Machine (UDVM) used for
- * Signaling Compression (SigComp) dissection.
- * Copyright 2004, Anders Broman <anders.broman@ericsson.com>
- *
- * $Id: udvm.c 11445 2004-07-20 19:04:48Z etxrab $
- *
- * Ethereal - Network traffic analyzer
- * By Gerald Combs <gerald@ethereal.com>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- * 
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * References:
- * http://www.ietf.org/rfc/rfc3320.txt?number=3320
- * http://www.ietf.org/rfc/rfc3321.txt?number=3321
- * Useful links :
- * http://www.ietf.org/internet-drafts/draft-ietf-rohc-sigcomp-impl-guide-03.txt
- * http://www.ietf.org/internet-drafts/draft-ietf-rohc-sigcomp-sip-01.txt
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-#include <glib.h>
-
-#ifdef NEED_SNPRINTF_H
-# include "snprintf.h"
-#endif
-
+/* sigcomp-udvm.c\r
+ * Routines making up the Universal Decompressor Virtual Machine (UDVM) used for\r
+ * Signaling Compression (SigComp) dissection.\r
+ * Copyright 2004, Anders Broman <anders.broman@ericsson.com>\r
+ *\r
+ * $Id: udvm.c 11445 2004-07-20 19:04:48Z etxrab $\r
+ *\r
+ * Ethereal - Network traffic analyzer\r
+ * By Gerald Combs <gerald@ethereal.com>\r
+ * Copyright 1998 Gerald Combs\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License\r
+ * as published by the Free Software Foundation; either version 2\r
+ * of the License, or (at your option) any later version.\r
+ * \r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ * \r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+ * References:\r
+ * http://www.ietf.org/rfc/rfc3320.txt?number=3320\r
+ * http://www.ietf.org/rfc/rfc3321.txt?number=3321\r
+ * Useful links :\r
+ * http://www.ietf.org/internet-drafts/draft-ietf-rohc-sigcomp-impl-guide-03.txt\r
+ * http://www.ietf.org/internet-drafts/draft-ietf-rohc-sigcomp-sip-01.txt\r
+ */\r
+\r
+#ifdef HAVE_CONFIG_H\r
+# include "config.h"\r
+#endif\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <math.h>\r
+#include <glib.h>\r
+\r
+#ifdef NEED_SNPRINTF_H\r
+# include "snprintf.h"\r
+#endif\r
+\r
 #include "packet.h"\r
-#include "strutil.h"
-#include "sigcomp-udvm.h"
-#include "sigcomp_state_hdlr.h"
-#include "sha1.h"
-
-#define        SIGCOMP_INSTR_DECOMPRESSION_FAILURE     0
-#define SIGCOMP_INSTR_AND                       1
-#define SIGCOMP_INSTR_OR                        2
-#define SIGCOMP_INSTR_NOT                       3
-#define SIGCOMP_INSTR_LSHIFT                    4
-#define SIGCOMP_INSTR_RSHIFT                    5
-#define SIGCOMP_INSTR_ADD                       6
-#define SIGCOMP_INSTR_SUBTRACT                  7
-#define SIGCOMP_INSTR_MULTIPLY                  8
-#define SIGCOMP_INSTR_DIVIDE                    9
-#define SIGCOMP_INSTR_REMAINDER                 10
-#define SIGCOMP_INSTR_SORT_ASCENDING            11
-#define SIGCOMP_INSTR_SORT_DESCENDING           12
-#define SIGCOMP_INSTR_SHA_1                     13
-#define SIGCOMP_INSTR_LOAD                      14
-#define SIGCOMP_INSTR_MULTILOAD                 15
-#define SIGCOMP_INSTR_PUSH                      16
-#define SIGCOMP_INSTR_POP                       17
-#define SIGCOMP_INSTR_COPY                      18
-#define SIGCOMP_INSTR_COPY_LITERAL              19
-#define SIGCOMP_INSTR_COPY_OFFSET               20
-#define SIGCOMP_INSTR_MEMSET                    21
-#define SIGCOMP_INSTR_JUMP                      22
-#define SIGCOMP_INSTR_COMPARE                   23
-#define SIGCOMP_INSTR_CALL                      24
-#define SIGCOMP_INSTR_RETURN                    25
-#define SIGCOMP_INSTR_SWITCH                    26
-#define SIGCOMP_INSTR_CRC                       27
-#define SIGCOMP_INSTR_INPUT_BYTES               28
-#define SIGCOMP_INSTR_INPUT_BITS                29
-#define SIGCOMP_INSTR_INPUT_HUFFMAN             30
-#define SIGCOMP_INSTR_STATE_ACCESS              31
-#define SIGCOMP_INSTR_STATE_CREATE              32
-#define SIGCOMP_INSTR_STATE_FREE                33
-#define SIGCOMP_INSTR_OUTPUT                    34
-#define SIGCOMP_INSTR_END_MESSAGE               35
-
-#define UDVM_MEMORY_SIZE                                               65536
-
-static gboolean print_level_1;
-static gboolean print_level_2;
-static gboolean print_level_3;
-
-/* Internal result code values of decompression failures */
-const value_string result_code_vals[] = {
-       { 0,    "No decomprssion failure" },
-       { 1,    "Partial state length less than 6 or greater than 20 bytes long" },
-       { 2,    "No state match" },
-       { 3,    "state_begin + state_length > size of state" },
-       { 4,    "Operand_2 is Zero" },
-       { 5,    "Switch statement failed j >= n" },
-       { 6,    "Atempt to jump outside of UDVM memory" },
-       { 7,    "L in input-bits > 16" },
-       { 8,    "input_bit_order > 7" },
-       { 9,    "Instruction Decompression failure encounterd" },
-       {10,    "Input huffman failed j > n" },
-       {11,    "Input bits requested beond end of message" },
-       {12,    "more than four state creation requests are made before the END-MESSAGE instruction" },
-       {13,    "state_retention_priority is 65535" },
-       {14,    "Input bytes requested beond end of message" },
-       {15,    "Maximum number of UDVM cycles reached" },
-       { 255,  "This branch isn't coded yet" },
-       { 0,    NULL }
-};
-
-static int decode_udvm_literal_operand(guint8 buff[],guint operand_address, guint16 *value);
-static int dissect_udvm_reference_operand(guint8 buff[],guint operand_address, guint16 *value, guint *result_dest);
-static int decode_udvm_multitype_operand(guint8 buff[],guint operand_address,guint16 *value);
-static int decode_udvm_address_operand(guint8 buff[],guint operand_address, guint16 *value,guint current_address);
-static int decomp_dispatch_get_bits(tvbuff_t *message_tvb,proto_tree *udvm_tree,guint8 bit_order, 
-                       guint8 buff[],guint16 *old_input_bit_order, guint16 *remaining_bits,
-                       guint16 *input_bits, guint *input_address, guint16 length, guint16 *result_code,guint msg_end);
-
-
-tvbuff_t*
-decompress_sigcomp_message(tvbuff_t *bytecode_tvb, tvbuff_t *message_tvb, packet_info *pinfo,
-                                                  proto_tree *udvm_tree, gint udvm_mem_dest, gint print_flags)
-{
-       tvbuff_t        *decomp_tvb;
-       guint8          buff[UDVM_MEMORY_SIZE];
-       char            string[2];
-       guint8          out_buff[65536];                /* Largest allowed size for a message is 65535  */
-       guint32         i = 0;
-       guint16         n = 0;
-       guint16         m = 0;
-       guint16         x;
-       guint           k = 0;
-       guint16         H;
-       guint16         oldH;
-       guint           offset = 0;
-       guint           result_dest;
-       guint           code_length =0;
-       guint8          current_instruction;
-       guint           current_address;
-       guint           operand_address;
-       guint           input_address;
-       guint16         output_address = 0;
-       guint           next_operand_address;
-       guint8          octet;
-       guint8          msb;
-       guint8          lsb;
-       guint16         byte_copy_right;
-       guint16         byte_copy_left;
-       guint16         input_bit_order;
-       guint16         result;
-       guint           msg_end = tvb_reported_length_remaining(message_tvb, 0);
-       guint16         result_code;
-       guint16         old_input_bit_order = 0;
-       guint16         remaining_bits = 0;
-       guint16         input_bits = 0;
-       guint8          bit_order = 0;
-       gboolean        outside_huffman_boundaries = TRUE;
-       gboolean        print_in_loop = FALSE;
-       guint16         instruction_address;
-       guint8          no_of_state_create = 0;
-       guint16         state_length_buff[5];
-       guint16         state_address_buff[5];
-       guint16         state_instruction_buff[5];
-       guint16         state_minimum_access_length_buff[5];
-       guint16         state_state_retention_priority_buff[5];
-       guint32         used_udvm_cycles = 0;
-       guint           cycles_per_bit;
-       guint           maximum_UDVM_cycles;
-       guint8          *sha1buff;
-       unsigned char sha1_digest_buf[20];
-       sha1_context ctx;
-
-
-       /* UDVM operand variables */
-       guint16 length;
-       guint16 at_address;
-       guint16 destination;
-       guint16 address;
-       guint16 value;
-       guint16 p_id_start;
-       guint16 p_id_length;
-       guint16 state_begin;
-       guint16 state_length;
-       guint16 state_address;
-       guint16 state_instruction;
-       guint16 operand_1;
-       guint16 operand_2;
-       guint16 value_1;
-       guint16 value_2;
-       guint16 at_address_1;
-       guint16 at_address_2;
-       guint16 at_address_3;
-       guint16 j;
-       guint16 bits_n;
-       guint16 lower_bound_n;
-       guint16 upper_bound_n;
-       guint16 uncompressed_n;
-       guint16 position;
-       guint16 ref_destination; /* could I have used $destination ? */
-       guint16 multy_offset;
-       guint16 output_start;
-       guint16 output_length;
-       guint16 minimum_access_length;
-       guint16 state_retention_priority;
-       guint16 requested_feedback_location;
-       guint16 returned_parameters_location;
-       guint16 start_value;
-
-       /* Set print parameters */
-       print_level_1 = FALSE;
-       print_level_2 = FALSE;
-       print_level_3 = FALSE;
-
-
-       switch( print_flags ) {
-               case 0:
-                       break;
-
-               case 1:
-                       print_level_1 = TRUE;
-                       break;
-               case 2:
-                       print_level_1 = TRUE;
-                       print_level_2 = TRUE;
-                       break;
-               case 3:
-                       print_level_1 = TRUE;
-                       print_level_2 = TRUE;
-                       print_level_3 = TRUE;
-                       break;
-               default:
-                       print_level_1 = TRUE;
-                       break;
-       }
-
-
-
-
-
-
-       /* UDVM memory must be initialised to zero */
-       while ( i < UDVM_MEMORY_SIZE ) {
-               buff[i] = 0;
-               i++;
-       }
-       /* Set initial UDVM data 
-        *  The first 32 bytes of UDVM memory are then initialized to special
-        *  values as illustrated in Figure 5.
-        *
-        *                      0             7 8            15
-        *                     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-        *                     |       UDVM_memory_size        |  0 - 1
-        *                     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-        *                     |        cycles_per_bit         |  2 - 3
-        *                     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-        *                     |        SigComp_version        |  4 - 5
-        *                     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-        *                     |    partial_state_ID_length    |  6 - 7
-        *                     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-        *                     |         state_length          |  8 - 9
-        *                     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-        *                     |                               |
-        *                     :           reserved            :  10 - 31
-        *                     |                               |
-        *                     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-        *
-        *            Figure 5: Initializing Useful Values in UDVM memory
-        */
-       /* UDVM_memory_size  */
-       buff[0] = 0;
-       buff[1] = 0;
-       /* cycles_per_bit */
-       buff[2] = 0;
-       buff[3] = 16;
-       /* SigComp_version */
-       buff[4] = 0;
-       buff[5] = 1;
-       /* partial_state_ID_length */
-       buff[6] = 0;
-       buff[7] = 0;
-       /* state_length  */
-       buff[8] = 0;
-       buff[9] = 0;
+#include "strutil.h"\r
+#include "sigcomp-udvm.h"\r
+#include "sigcomp_state_hdlr.h"\r
+#include "sha1.h"\r
+\r
+#define        SIGCOMP_INSTR_DECOMPRESSION_FAILURE     0\r
+#define SIGCOMP_INSTR_AND                       1\r
+#define SIGCOMP_INSTR_OR                        2\r
+#define SIGCOMP_INSTR_NOT                       3\r
+#define SIGCOMP_INSTR_LSHIFT                    4\r
+#define SIGCOMP_INSTR_RSHIFT                    5\r
+#define SIGCOMP_INSTR_ADD                       6\r
+#define SIGCOMP_INSTR_SUBTRACT                  7\r
+#define SIGCOMP_INSTR_MULTIPLY                  8\r
+#define SIGCOMP_INSTR_DIVIDE                    9\r
+#define SIGCOMP_INSTR_REMAINDER                 10\r
+#define SIGCOMP_INSTR_SORT_ASCENDING            11\r
+#define SIGCOMP_INSTR_SORT_DESCENDING           12\r
+#define SIGCOMP_INSTR_SHA_1                     13\r
+#define SIGCOMP_INSTR_LOAD                      14\r
+#define SIGCOMP_INSTR_MULTILOAD                 15\r
+#define SIGCOMP_INSTR_PUSH                      16\r
+#define SIGCOMP_INSTR_POP                       17\r
+#define SIGCOMP_INSTR_COPY                      18\r
+#define SIGCOMP_INSTR_COPY_LITERAL              19\r
+#define SIGCOMP_INSTR_COPY_OFFSET               20\r
+#define SIGCOMP_INSTR_MEMSET                    21\r
+#define SIGCOMP_INSTR_JUMP                      22\r
+#define SIGCOMP_INSTR_COMPARE                   23\r
+#define SIGCOMP_INSTR_CALL                      24\r
+#define SIGCOMP_INSTR_RETURN                    25\r
+#define SIGCOMP_INSTR_SWITCH                    26\r
+#define SIGCOMP_INSTR_CRC                       27\r
+#define SIGCOMP_INSTR_INPUT_BYTES               28\r
+#define SIGCOMP_INSTR_INPUT_BITS                29\r
+#define SIGCOMP_INSTR_INPUT_HUFFMAN             30\r
+#define SIGCOMP_INSTR_STATE_ACCESS              31\r
+#define SIGCOMP_INSTR_STATE_CREATE              32\r
+#define SIGCOMP_INSTR_STATE_FREE                33\r
+#define SIGCOMP_INSTR_OUTPUT                    34\r
+#define SIGCOMP_INSTR_END_MESSAGE               35\r
+\r
+\r
+static gboolean print_level_1;\r
+static gboolean print_level_2;\r
+static gboolean print_level_3;\r
+\r
+/* Internal result code values of decompression failures */\r
+const value_string result_code_vals[] = {\r
+       { 0,    "No decomprssion failure" },\r
+       { 1,    "Partial state length less than 6 or greater than 20 bytes long" },\r
+       { 2,    "No state match" },\r
+       { 3,    "state_begin + state_length > size of state" },\r
+       { 4,    "Operand_2 is Zero" },\r
+       { 5,    "Switch statement failed j >= n" },\r
+       { 6,    "Atempt to jump outside of UDVM memory" },\r
+       { 7,    "L in input-bits > 16" },\r
+       { 8,    "input_bit_order > 7" },\r
+       { 9,    "Instruction Decompression failure encounterd" },\r
+       {10,    "Input huffman failed j > n" },\r
+       {11,    "Input bits requested beond end of message" },\r
+       {12,    "more than four state creation requests are made before the END-MESSAGE instruction" },\r
+       {13,    "state_retention_priority is 65535" },\r
+       {14,    "Input bytes requested beond end of message" },\r
+       {15,    "Maximum number of UDVM cycles reached" },\r
+       { 255,  "This branch isn't coded yet" },\r
+       { 0,    NULL }\r
+};\r
+\r
+static int decode_udvm_literal_operand(guint8 *buff,guint operand_address, guint16 *value);\r
+static int dissect_udvm_reference_operand(guint8 *buff,guint operand_address, guint16 *value, guint *result_dest);\r
+static int decode_udvm_multitype_operand(guint8 *buff,guint operand_address,guint16 *value);\r
+static int decode_udvm_address_operand(guint8 *buff,guint operand_address, guint16 *value,guint current_address);\r
+static int decomp_dispatch_get_bits(tvbuff_t *message_tvb,proto_tree *udvm_tree,guint8 bit_order, \r
+                       guint8 *buff,guint16 *old_input_bit_order, guint16 *remaining_bits,\r
+                       guint16 *input_bits, guint *input_address, guint16 length, guint16 *result_code,guint msg_end);\r
+\r
+\r
+tvbuff_t*\r
+decompress_sigcomp_message(tvbuff_t *bytecode_tvb, tvbuff_t *message_tvb, packet_info *pinfo,\r
+                                                  proto_tree *udvm_tree, gint udvm_mem_dest, gint print_flags)\r
+{\r
+       tvbuff_t        *decomp_tvb;\r
+       guint8          buff[UDVM_MEMORY_SIZE];\r
+       char            string[2];\r
+       guint8          *out_buff;              /* Largest allowed size for a message is 65535  */\r
+       guint32         i = 0;\r
+       guint16         n = 0;\r
+       guint16         m = 0;\r
+       guint16         x;\r
+       guint           k = 0;\r
+       guint16         H;\r
+       guint16         oldH;\r
+       guint           offset = 0;\r
+       guint           result_dest;\r
+       guint           code_length =0;\r
+       guint8          current_instruction;\r
+       guint           current_address;\r
+       guint           operand_address;\r
+       guint           input_address;\r
+       guint16         output_address = 0;\r
+       guint           next_operand_address;\r
+       guint8          octet;\r
+       guint8          msb;\r
+       guint8          lsb;\r
+       guint16         byte_copy_right;\r
+       guint16         byte_copy_left;\r
+       guint16         input_bit_order;\r
+       guint16         result;\r
+       guint           msg_end = tvb_reported_length_remaining(message_tvb, 0);\r
+       guint16         result_code;\r
+       guint16         old_input_bit_order = 0;\r
+       guint16         remaining_bits = 0;\r
+       guint16         input_bits = 0;\r
+       guint8          bit_order = 0;\r
+       gboolean        outside_huffman_boundaries = TRUE;\r
+       gboolean        print_in_loop = FALSE;\r
+       guint16         instruction_address;\r
+       guint8          no_of_state_create = 0;\r
+       guint16         state_length_buff[5];\r
+       guint16         state_address_buff[5];\r
+       guint16         state_instruction_buff[5];\r
+       guint16         state_minimum_access_length_buff[5];\r
+       guint16         state_state_retention_priority_buff[5];\r
+       guint32         used_udvm_cycles = 0;\r
+       guint           cycles_per_bit;\r
+       guint           maximum_UDVM_cycles;\r
+       guint8          *sha1buff;\r
+       unsigned char sha1_digest_buf[20];\r
+       sha1_context ctx;\r
+\r
+\r
+       /* UDVM operand variables */\r
+       guint16 length;\r
+       guint16 at_address;\r
+       guint16 destination;\r
+       guint16 address;\r
+       guint16 value;\r
+       guint16 p_id_start;\r
+       guint16 p_id_length;\r
+       guint16 state_begin;\r
+       guint16 state_length;\r
+       guint16 state_address;\r
+       guint16 state_instruction;\r
+       guint16 operand_1;\r
+       guint16 operand_2;\r
+       guint16 value_1;\r
+       guint16 value_2;\r
+       guint16 at_address_1;\r
+       guint16 at_address_2;\r
+       guint16 at_address_3;\r
+       guint16 j;\r
+       guint16 bits_n;\r
+       guint16 lower_bound_n;\r
+       guint16 upper_bound_n;\r
+       guint16 uncompressed_n;\r
+       guint16 position;\r
+       guint16 ref_destination; /* could I have used $destination ? */\r
+       guint16 multy_offset;\r
+       guint16 output_start;\r
+       guint16 output_length;\r
+       guint16 minimum_access_length;\r
+       guint16 state_retention_priority;\r
+       guint16 requested_feedback_location;\r
+       guint16 returned_parameters_location;\r
+       guint16 start_value;\r
+\r
+       /* Set print parameters */\r
+       print_level_1 = FALSE;\r
+       print_level_2 = FALSE;\r
+       print_level_3 = FALSE;\r
+\r
+\r
+       switch( print_flags ) {\r
+               case 0:\r
+                       break;\r
+\r
+               case 1:\r
+                       print_level_1 = TRUE;\r
+                       break;\r
+               case 2:\r
+                       print_level_1 = TRUE;\r
+                       print_level_2 = TRUE;\r
+                       break;\r
+               case 3:\r
+                       print_level_1 = TRUE;\r
+                       print_level_2 = TRUE;\r
+                       print_level_3 = TRUE;\r
+                       break;\r
+               default:\r
+                       print_level_1 = TRUE;\r
+                       break;\r
+       }\r
+\r
+\r
+\r
+\r
+\r
+\r
+       /* UDVM memory must be initialised to zero */\r
+       while ( i < UDVM_MEMORY_SIZE ) {\r
+               buff[i] = 0;\r
+               i++;\r
+       }\r
+       /* Set initial UDVM data \r
+        *  The first 32 bytes of UDVM memory are then initialized to special\r
+        *  values as illustrated in Figure 5.\r
+        *\r
+        *                      0             7 8            15\r
+        *                     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+        *                     |       UDVM_memory_size        |  0 - 1\r
+        *                     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+        *                     |        cycles_per_bit         |  2 - 3\r
+        *                     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+        *                     |        SigComp_version        |  4 - 5\r
+        *                     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+        *                     |    partial_state_ID_length    |  6 - 7\r
+        *                     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+        *                     |         state_length          |  8 - 9\r
+        *                     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+        *                     |                               |\r
+        *                     :           reserved            :  10 - 31\r
+        *                     |                               |\r
+        *                     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+        *\r
+        *            Figure 5: Initializing Useful Values in UDVM memory\r
+        */\r
+       /* UDVM_memory_size  */\r
+       buff[0] = 0;\r
+       buff[1] = 0;\r
+       /* cycles_per_bit */\r
+       buff[2] = 0;\r
+       buff[3] = 16;\r
+       /* SigComp_version */\r
+       buff[4] = 0;\r
+       buff[5] = 1;\r
+       /* partial_state_ID_length */\r
+       buff[6] = 0;\r
+       buff[7] = 0;\r
+       /* state_length  */\r
+       buff[8] = 0;\r
+       buff[9] = 0;\r
        code_length = tvb_reported_length_remaining(bytecode_tvb, 0);\r
 \r
        cycles_per_bit = buff[2] << 8;\r
@@ -298,2665 +297,2680 @@ decompress_sigcomp_message(tvbuff_t *bytecode_tvb, tvbuff_t *message_tvb, packet
        maximum_UDVM_cycles = (( 8 * msg_end ) + 1000) * cycles_per_bit;\r
 \r
        proto_tree_add_text(udvm_tree, bytecode_tvb, offset, 1,"maximum_UDVM_cycles(%u) = (( 8 * msg_end(%u) ) + 1000) * cycles_per_bit(%u)",maximum_UDVM_cycles,msg_end,cycles_per_bit);\r
-       proto_tree_add_text(udvm_tree, bytecode_tvb, offset, 1,"Message Length: %u,Byte code length: %u, Maximum UDVM cycles: %u",msg_end,code_length,maximum_UDVM_cycles);
-
-       /* Load bytecode into UDVM starting at "udvm_mem_dest" */
+       proto_tree_add_text(udvm_tree, bytecode_tvb, offset, 1,"Message Length: %u,Byte code length: %u, Maximum UDVM cycles: %u",msg_end,code_length,maximum_UDVM_cycles);\r
+\r
+       /* Load bytecode into UDVM starting at "udvm_mem_dest" */\r
        i = udvm_mem_dest;\r
        if ( print_level_3 )\r
-               proto_tree_add_text(udvm_tree, bytecode_tvb, offset, 1,"Load bytecode into UDVM starting at %u",i);
-       while ( code_length > offset ) {
+               proto_tree_add_text(udvm_tree, bytecode_tvb, offset, 1,"Load bytecode into UDVM starting at %u",i);\r
+       while ( code_length > offset ) {\r
                buff[i] = tvb_get_guint8(bytecode_tvb, offset);\r
-               if ( print_level_3 )
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, offset, 1,
-                                               "              Addr: %u Instruction code(0x%0x) ", i, buff[i]);
-
-               i++;
-               offset++;
-
-       }
-       /* Start executing code */
-       current_address = udvm_mem_dest;
-       input_address = 0;
-       operand_address = 0;
-       
-       proto_tree_add_text(udvm_tree, bytecode_tvb, offset, 1,"UDVM EXECUTION STARTED at Address: %u Message size %u",
-               udvm_mem_dest,msg_end);
-
-execute_next_instruction:
-
-       if ( used_udvm_cycles > maximum_UDVM_cycles ){
-               result_code = 15;
-               goto decompression_failure;
-       }
-       current_instruction = buff[current_address];
-
-       switch ( current_instruction ) {
-       case SIGCOMP_INSTR_DECOMPRESSION_FAILURE:
-               used_udvm_cycles++;
-               if ( result_code == 0 )
-                       result_code = 9;
-               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                       "Addr: %u ## DECOMPRESSION-FAILURE(0)",
-                       current_address);
-               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Ethereal UDVM diagnostic: %s.",
-                                   val_to_str(result_code, result_code_vals,"Unknown (%u)"));
-               if ( output_address > 0 ){
-                       /* At least something got decompressed, show it */
-                       decomp_tvb = tvb_new_real_data(out_buff,output_address,output_address);
-                       tvb_set_child_real_data_tvbuff(message_tvb,decomp_tvb);
-                       add_new_data_source(pinfo, decomp_tvb, "Decompressed SigComp message(Incomplete)");
-                       proto_tree_add_text(udvm_tree, decomp_tvb, 0, -1,"SigComp message Decompression failure");
-               return decomp_tvb;
-               }
-
-               return NULL;
-               break;
-
-       case SIGCOMP_INSTR_AND: /* 1 AND ($operand_1, %operand_2) */
-               used_udvm_cycles++;
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## AND(1) (operand_1, operand_2)",
-                               current_address);
-               }
-               /* $operand_1*/
-               operand_address = current_address + 1;
-               next_operand_address = dissect_udvm_reference_operand(buff, operand_address, &operand_1, &result_dest);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_1 %u",
-                               operand_address, operand_1);
-               }
-               operand_address = next_operand_address; 
-               /* %operand_2*/
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &operand_2);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_2 %u",
-                               operand_address, operand_2);
-               }
-               /* execute the instruction */
-               result = operand_1 & operand_2;
-               lsb = result & 0xff;
-               msb = result >> 8;              
-               buff[result_dest] = msb;
-               buff[result_dest+1] = lsb;
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"     Loading result %u at %u",
-                               result, result_dest);
-               }
-               current_address = next_operand_address; 
-               goto execute_next_instruction;
-
-               break;
-
-       case SIGCOMP_INSTR_OR: /* 2 OR ($operand_1, %operand_2) */
-               used_udvm_cycles++;
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## OR(2) (operand_1, operand_2)",
-                               current_address);
-               }
-               /* $operand_1*/
-               operand_address = current_address + 1;
-               next_operand_address = dissect_udvm_reference_operand(buff, operand_address, &operand_1, &result_dest);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_1 %u",
-                               operand_address, operand_1);
-               }
-               operand_address = next_operand_address; 
-               /* %operand_2*/
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &operand_2);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_2 %u",
-                               operand_address, operand_2);
-               }
-               /* execute the instruction */
-               result = operand_1 | operand_2;
-               lsb = result & 0xff;
-               msb = result >> 8;              
-               buff[result_dest] = msb;
-               buff[result_dest+1] = lsb;
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"     Loading result %u at %u",
-                               result, result_dest);
-               }
-               current_address = next_operand_address; 
-               goto execute_next_instruction;
-
-               break;
-
-       case SIGCOMP_INSTR_NOT: /* 3 NOT ($operand_1) */
-               used_udvm_cycles++;
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## NOT(3) ($operand_1)",
-                               current_address);
-               }
-               /* $operand_1*/
-               operand_address = current_address + 1;
-               next_operand_address = dissect_udvm_reference_operand(buff, operand_address, &operand_1, &result_dest);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_1 %u",
-                               operand_address, operand_1);
-               }
-               /* execute the instruction */
-               result = operand_1 ^ 0xffff;
-               lsb = result & 0xff;
-               msb = result >> 8;              
-               buff[result_dest] = msb;
-               buff[result_dest+1] = lsb;
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"     Loading result %u at %u",
-                               result, result_dest);
-               }
-               current_address = next_operand_address; 
-               goto execute_next_instruction;
-               break;
-
-       case SIGCOMP_INSTR_LSHIFT: /* 4 LSHIFT ($operand_1, %operand_2) */
-               used_udvm_cycles++;
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## LSHIFT(4) ($operand_1, operand_2)",
-                               current_address);
-               }
-               /* $operand_1*/
-               operand_address = current_address + 1;
-               next_operand_address = dissect_udvm_reference_operand(buff, operand_address, &operand_1, &result_dest);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_1 %u",
-                               operand_address, operand_1);
-               }
-               operand_address = next_operand_address; 
-               /* %operand_2*/
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &operand_2);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_2 %u",
-                               operand_address, operand_2);
-               }
-               /* execute the instruction */
-               result = operand_1 << operand_2;
-               lsb = result & 0xff;
-               msb = result >> 8;              
-               buff[result_dest] = msb;
-               buff[result_dest+1] = lsb;
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"     Loading result %u at %u",
-                               result, result_dest);
-               }
-               current_address = next_operand_address; 
-               goto execute_next_instruction;
-
-               break;
-               case SIGCOMP_INSTR_RSHIFT: /* 5 RSHIFT ($operand_1, %operand_2) */
-               used_udvm_cycles++;
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## RSHIFT(5) (operand_1, operand_2)",
-                               current_address);
-               }
-               /* $operand_1*/
-               operand_address = current_address + 1;
-               next_operand_address = dissect_udvm_reference_operand(buff, operand_address, &operand_1, &result_dest);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_1 %u",
-                               operand_address, operand_1);
-               }
-               operand_address = next_operand_address; 
-               /* %operand_2*/
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &operand_2);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_2 %u",
-                               operand_address, operand_2);
-               }
-               /* execute the instruction */
-               result = operand_1 >> operand_2;
-               lsb = result & 0xff;
-               msb = result >> 8;              
-               buff[result_dest] = msb;
-               buff[result_dest+1] = lsb;
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"     Loading result %u at %u",
-                               result, result_dest);
-               }
-               current_address = next_operand_address; 
-               goto execute_next_instruction;
-               break;
-               case SIGCOMP_INSTR_ADD: /* 6 ADD ($operand_1, %operand_2) */
-               used_udvm_cycles++;
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## ADD(6) (operand_1, operand_2)",
-                               current_address);
-               }
-               /* $operand_1*/
-               operand_address = current_address + 1;
-               next_operand_address = dissect_udvm_reference_operand(buff, operand_address, &operand_1, &result_dest);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_1 %u",
-                               operand_address, operand_1);
-               }
-               operand_address = next_operand_address; 
-               /* %operand_2*/
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &operand_2);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_2 %u",
-                               operand_address, operand_2);
-               }
-               /* execute the instruction */
-               result = operand_1 + operand_2;
-               lsb = result & 0xff;
-               msb = result >> 8;              
-               buff[result_dest] = msb;
-               buff[result_dest+1] = lsb;
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"               Loading result %u at %u",
-                               result, result_dest);
-               }
-               current_address = next_operand_address; 
-               goto execute_next_instruction;
-
-               case SIGCOMP_INSTR_SUBTRACT: /* 7 SUBTRACT ($operand_1, %operand_2) */
-               used_udvm_cycles++;
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## SUBTRACT(7) (operand_1, operand_2)",
-                               current_address);
-               }
-               /* $operand_1*/
-               operand_address = current_address + 1;
-               next_operand_address = dissect_udvm_reference_operand(buff, operand_address, &operand_1, &result_dest);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_1 %u",
-                               operand_address, operand_1);
-               }
-               operand_address = next_operand_address; 
-               /* %operand_2*/
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &operand_2);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_2 %u",
-                               operand_address, operand_2);
-               }
-               /* execute the instruction */
-               result = operand_1 - operand_2;
-               lsb = result & 0xff;
-               msb = result >> 8;              
-               buff[result_dest] = msb;
-               buff[result_dest+1] = lsb;
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"               Loading result %u at %u",
-                               result, result_dest);
-               }
-               current_address = next_operand_address; 
-               goto execute_next_instruction;
-               break;
-
-       case SIGCOMP_INSTR_MULTIPLY: /* 8 MULTIPLY ($operand_1, %operand_2) */
-               used_udvm_cycles++;
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ##MULTIPLY(8) (operand_1, operand_2)",
-                               current_address);
-               }
-               /* $operand_1*/
-               operand_address = current_address + 1;
-               next_operand_address = dissect_udvm_reference_operand(buff, operand_address, &operand_1, &result_dest);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_1 %u",
-                               operand_address, operand_1);
-               }
-               operand_address = next_operand_address; 
-               /* %operand_2*/
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &operand_2);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_2 %u",
-                               operand_address, operand_2);
-               }
-               /* 
-                * execute the instruction
-                * MULTIPLY (m, n)  := m * n (modulo 2^16)
-                */
-               if ( operand_2 == 0){
-                       result_code = 4;
-                       goto decompression_failure;
-               }
-               result = operand_1 * operand_2;
-               lsb = result & 0xff;
-               msb = result >> 8;              
-               buff[result_dest] = msb;
-               buff[result_dest+1] = lsb;
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"     Loading result %u at %u",
-                               result, result_dest);
-               }
-               current_address = next_operand_address; 
-               goto execute_next_instruction;
-               break;
-
-       case SIGCOMP_INSTR_DIVIDE: /* 9 DIVIDE ($operand_1, %operand_2) */
-               used_udvm_cycles++;
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## DIVIDE(9) (operand_1, operand_2)",
-                               current_address);
-               }
-               /* $operand_1*/
-               operand_address = current_address + 1;
-               next_operand_address = dissect_udvm_reference_operand(buff, operand_address, &operand_1, &result_dest);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_1 %u",
-                               operand_address, operand_1);
-               }
-               operand_address = next_operand_address; 
-               /* %operand_2*/
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &operand_2);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_2 %u",
-                               operand_address, operand_2);
-               }
-               /* 
-                * execute the instruction
-                * DIVIDE (m, n)    := floor(m / n)
-                * Decompression failure occurs if a DIVIDE or REMAINDER instruction
-                * encounters an operand_2 that is zero.
-                */
-               if ( operand_2 == 0){
-                       result_code = 4;
-                       goto decompression_failure;
-               }
-               result = (guint16)floor(operand_1/operand_2);
-               lsb = result & 0xff;
-               msb = result >> 8;              
-               buff[result_dest] = msb;
-               buff[result_dest+1] = lsb;
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"     Loading result %u at %u",
-                               result, result_dest);
-               }
-               current_address = next_operand_address; 
-               goto execute_next_instruction;
-               break;
-
-       case SIGCOMP_INSTR_REMAINDER: /* 10 REMAINDER ($operand_1, %operand_2) */
-               used_udvm_cycles++;
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## REMAINDER(10) (operand_1, operand_2)",
-                               current_address);
-               }
-               /* $operand_1*/
-               operand_address = current_address + 1;
-               next_operand_address = dissect_udvm_reference_operand(buff, operand_address, &operand_1, &result_dest);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_1 %u",
-                               operand_address, operand_1);
-               }
-               operand_address = next_operand_address; 
-               /* %operand_2*/
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &operand_2);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_2 %u",
-                               operand_address, operand_2);
-               }
-               /* 
-                * execute the instruction
-                * REMAINDER (m, n) := m - n * floor(m / n)
-                * Decompression failure occurs if a DIVIDE or REMAINDER instruction
-                * encounters an operand_2 that is zero.
-                */
-               if ( operand_2 == 0){
-                       result_code = 4;
-                       goto decompression_failure;
-               }
-               result = operand_1 - operand_2 * (guint16)floor(operand_1/operand_2);
-               lsb = result & 0xff;
-               msb = result >> 8;              
-               buff[result_dest] = msb;
-               buff[result_dest+1] = lsb;
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"     Loading result %u at %u",
-                               result, result_dest);
-               }
-               current_address = next_operand_address; 
-               goto execute_next_instruction;
-               break;
-       case SIGCOMP_INSTR_SORT_ASCENDING: /* 11 SORT-ASCENDING (%start, %n, %k) */
-               /*
-                *      used_udvm_cycles =  1 + k * (ceiling(log2(k)) + n)
-                */
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## SORT-ASCENDING(11) (start, n, k))",
-                               current_address);
-               }
-               operand_address = current_address + 1;
-               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Execution of this instruction is NOT implemented");
-               /*
-                *      used_udvm_cycles =  1 + k * (ceiling(log2(k)) + n)
-                */
-               break;
-
-       case SIGCOMP_INSTR_SORT_DESCENDING: /* 12 SORT-DESCENDING (%start, %n, %k) */
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## SORT-DESCENDING(12) (start, n, k))",
-                               current_address);
-               }
-               operand_address = current_address + 1;
-               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Execution of this instruction is NOT implemented");
-               /*
-                *      used_udvm_cycles =  1 + k * (ceiling(log2(k)) + n)
-                */
-               break;
-       case SIGCOMP_INSTR_SHA_1: /* 13 SHA-1 (%position, %length, %destination) */
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## SHA-1(13) (position, length, destination)",
-                               current_address);
-               }
-               operand_address = current_address + 1;
-               /* %position */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &position);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      position %u",
-                               operand_address, position);
-               }
-               operand_address = next_operand_address; 
-
-               /* %length */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &length);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Length %u",
-                               operand_address, length);
-               }
-               operand_address = next_operand_address;
-
-               /* $destination */
-               next_operand_address = dissect_udvm_reference_operand(buff, operand_address, &ref_destination, &result_dest);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      $destination %u",
-                               operand_address, ref_destination);
-               }
-               current_address = next_operand_address; 
-               used_udvm_cycles = used_udvm_cycles + 1 + length;
-               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Execution of this instruction is NOT implemented");
-               break;
-
-       case SIGCOMP_INSTR_LOAD: /* 14 LOAD (%address, %value) */
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## LOAD(14) (%%address, %%value)",
-                               current_address);
-               }
-               operand_address = current_address + 1;
-               /* %address */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &address);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Address %u",
-                               operand_address, address);
-               }
-               operand_address = next_operand_address; 
-               /* %value */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &value);
-               lsb = value & 0xff;
-               msb = value >> 8;
-
-               buff[address] = msb;
-               buff[address + 1] = lsb;
-
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Value %u",
-                               operand_address, value);
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"     Loading bytes at %u Value %u 0x%x",
-                                       address, value, value);
-               }
-               used_udvm_cycles++;
-               current_address = next_operand_address;
-               goto execute_next_instruction;
-               break;
-
-       case SIGCOMP_INSTR_MULTILOAD: /* 15 MULTILOAD (%address, #n, %value_0, ..., %value_n-1) */
-               /* RFC 3320:
-                * The MULTILOAD instruction sets a contiguous block of 2-byte words in
-                * the UDVM memory to specified values.
-                * Hmm what if the value to load only takes one byte ? Chose to always load two bytes.
-                */
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## MULTILOAD(15) (%%address, #n, value_0, ..., value_n-1)",
-                               current_address);
-               }
-               operand_address = current_address + 1;
-               /* %address */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &address);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Address %u",
-                               operand_address, address);
-               }
-               operand_address = next_operand_address; 
-
-               /* #n */
-               next_operand_address = decode_udvm_literal_operand(buff,operand_address, &n);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      n %u",
-                               operand_address, n);
-               }
-               operand_address = next_operand_address; 
-               used_udvm_cycles = used_udvm_cycles + n;
-               while ( n > 0) {
-                       n = n - 1;
-                       /* %value */
-                       next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &value);
-                       lsb = value & 0xff;
-                       msb = value >> 8;
-
-                       buff[address] = msb;
-                       buff[address + 1] = lsb;
-                       /* debug
-                       */
-                       length = next_operand_address - operand_address;
-
-                       if (print_level_1 ){
-                               proto_tree_add_text(udvm_tree, bytecode_tvb, operand_address - 128, length,"Addr: %u      Value %5u      - Loading bytes at %5u Value %5u 0x%x",
-                                       operand_address, value, address, value, value);
-                       }
-                       address = address + 2;
-                       operand_address = next_operand_address; 
-               }
-               current_address = next_operand_address;
-               goto execute_next_instruction;
-
-               break;
-                        
-       case SIGCOMP_INSTR_PUSH: /* 16 PUSH (%value) */
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## PUSH(16) (value)",
-                               current_address);
-               }
-               operand_address = current_address + 1;
-               /* %value */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &value);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Value %u",
-                               operand_address, value);
-               }
-               used_udvm_cycles++;
-               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Execution of this instruction is NOT implemented");
-               break;
-
-       case SIGCOMP_INSTR_POP: /* 17 POP (%address) */
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## POP(17) (address)",
-                               current_address);
-               }
-               operand_address = current_address + 1;
-               /* %address */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &address);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Address %u",
-                               operand_address, address);
-               }
-               operand_address = next_operand_address; 
-               used_udvm_cycles++;
-               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Execution of this instruction is NOT implemented");
-               break;
-
-       case SIGCOMP_INSTR_COPY: /* 18 COPY (%position, %length, %destination) */
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## COPY(18) (position, length, destination)",
-                               current_address);
-               }
-               operand_address = current_address + 1;
-               /* %position */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &position);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      position %u",
-                               operand_address, position);
-               }
-               operand_address = next_operand_address; 
-
-               /* %length */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &length);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Length %u",
-                               operand_address, length);
-               }
-               operand_address = next_operand_address;
-
-               /* %destination */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &destination);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Destination %u",
-                               operand_address, destination);
-               }
-               current_address = next_operand_address;
-               /*
-                * 8.4.  Byte copying
-                * :
-                * The string of bytes is copied in ascending order of memory address,
-                * respecting the bounds set by byte_copy_left and byte_copy_right.
-                * More precisely, if a byte is copied from/to Address m then the next
-                * byte is copied from/to Address n where n is calculated as follows:
-                *
-                * Set k := m + 1 (modulo 2^16)
-                * If k = byte_copy_right then set n := byte_copy_left, else set n := k
-                *
-                */ 
-
-               n = 0;
-               k = destination; 
-               byte_copy_right = buff[66] << 8;
-               byte_copy_right = byte_copy_right | buff[67];
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,
-                                               "               byte_copy_right = %u", byte_copy_right);
-               }
-
-               while ( n < length ){
-
-                       if (print_level_1 ){
-                               proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,
-                                               "               byte_copy_right = %u", byte_copy_right);
-                       }
-                       if ( k == byte_copy_right ){
-                               byte_copy_left = buff[64] << 8;
-                               byte_copy_left = byte_copy_left | buff[65];
-                               k = byte_copy_left;
-                       }
-                       buff[k] = buff[position + n];
-                       if (print_level_1 ){
-                               proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,
-                                       "               Copying value: %u (0x%x) to Addr: %u", buff[position + n], buff[position + n], k);
-                       }
-                       k = ( k + 1 ) & 0xffff;
-                       n++;
-               }
-               used_udvm_cycles = used_udvm_cycles + 1 + length;
-               goto execute_next_instruction;
-               break;
-
-       case SIGCOMP_INSTR_COPY_LITERAL: /* 19 COPY-LITERAL (%position, %length, $destination) */
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## COPY-LITERAL(19) (position, length, $destination)",
-                               current_address);
-               }
-               operand_address = current_address + 1;
-               /* %position */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &position);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      position %u",
-                               operand_address, address);
-               }
-               operand_address = next_operand_address; 
-
-               /* %length */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &length);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Length %u",
-                               operand_address, length);
-               }
-               operand_address = next_operand_address;
-
-
-               /* $destination */
-               next_operand_address = dissect_udvm_reference_operand(buff, operand_address, &ref_destination, &result_dest);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      destination %u",
-                               operand_address, ref_destination);
-               }
-               current_address = next_operand_address; 
-
-
-               /*
-                * 8.4.  Byte copying
-                * :
-                * The string of bytes is copied in ascending order of memory address,
-                * respecting the bounds set by byte_copy_left and byte_copy_right.
-                * More precisely, if a byte is copied from/to Address m then the next
-                * byte is copied from/to Address n where n is calculated as follows:
-                *
-                * Set k := m + 1 (modulo 2^16)
-                * If k = byte_copy_right then set n := byte_copy_left, else set n := k
-                *
-                */ 
-
-               n = 0;
-               k = ref_destination; 
-               byte_copy_right = buff[66] << 8;
-               byte_copy_right = byte_copy_right | buff[67];
-               while ( n < length ){
-
-                       if (print_level_1 ){
-                               proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,
-                                               "               byte_copy_right = %u", byte_copy_right);
-                       }
-                       if ( k == byte_copy_right ){
-                               byte_copy_left = buff[64] << 8;
-                               byte_copy_left = byte_copy_left | buff[65];
-                               k = byte_copy_left;
-                       }
-                       buff[k] = buff[position + n];
-                       if (print_level_1 ){
-                               proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,
-                                       "               Copying value: %u (0x%x) to Addr: %u", buff[position + n], buff[position + n], k);
-                       }
-                       k = ( k + 1 ) & 0xffff;
-                       n++;
-               }
-               buff[result_dest] = k >> 8;
-               buff[result_dest + 1] = k & 0x00ff;
-
-               used_udvm_cycles = used_udvm_cycles + 1 + length;
-               goto execute_next_instruction;
-               break;
-       case SIGCOMP_INSTR_COPY_OFFSET: /* 20 COPY-OFFSET (%offset, %length, $destination) */
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## COPY-OFFSET(20) (offset, length, $destination)",
-                               current_address);
-               }
-               operand_address = current_address + 1;
-               /* %offset */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &multy_offset);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      offset %u",
-                               operand_address, multy_offset);
-               }
-               operand_address = next_operand_address; 
-
-               /* %length */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &length);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Length %u",
-                               operand_address, length);
-               }
-               operand_address = next_operand_address;
-
-
-               /* $destination */
-               next_operand_address = dissect_udvm_reference_operand(buff, operand_address, &ref_destination, &result_dest);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      $destination %u",
-                               operand_address, ref_destination);
-               }
-               current_address = next_operand_address; 
-
-               /* Execute the instruction:
-                * To derive the value of the position operand, starting at the memory
-                * address specified by destination, the UDVM counts backwards a total
-                * of offset memory addresses.
-                * 
-                * If the memory address specified in byte_copy_left is reached, the
-                * next memory address is taken to be (byte_copy_right - 1) modulo 2^16.
-                */
-               byte_copy_left = buff[64] << 8;
-               byte_copy_left = byte_copy_left | buff[65];
-               byte_copy_right = buff[66] << 8;
-               byte_copy_right = byte_copy_right | buff[67];
-
-               if ( (byte_copy_left + multy_offset) > ( ref_destination )){
-                       /* wrap around */
-                       position = byte_copy_right - ( multy_offset - ( ref_destination - byte_copy_left )); 
-               }else{
-                       position = ref_destination - multy_offset;
-               }
-
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,
-                                       "               byte_copy_left = %u byte_copy_right = %u position= %u",
-                                       byte_copy_left, byte_copy_right, position);
-                       }
-               /* The COPY-OFFSET instruction then behaves as a COPY-LITERAL
-                * instruction, taking the value of the position operand to be the last
-                * memory address reached in the above step.
-                */
-
-               /*
-                * 8.4.  Byte copying
-                * :
-                * The string of bytes is copied in ascending order of memory address,
-                * respecting the bounds set by byte_copy_left and byte_copy_right.
-                * More precisely, if a byte is copied from/to Address m then the next
-                * byte is copied from/to Address n where n is calculated as follows:
-                *
-                * Set k := m + 1 (modulo 2^16)
-                * If k = byte_copy_right then set n := byte_copy_left, else set n := k
-                *
-                */ 
-
-               n = 0;
-               k = ref_destination; 
-               byte_copy_right = buff[66] << 8;
-               byte_copy_right = byte_copy_right | buff[67];
-               while ( n < length ){
-                       if ( k == byte_copy_right ){
-                               byte_copy_left = buff[64] << 8;
-                               byte_copy_left = byte_copy_left | buff[65];
-                               k = byte_copy_left;
-                               if (print_level_2 ){
-                                       proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,
-                                                       "               byte_copy_left = %u byte_copy_right = %u", byte_copy_left, byte_copy_right);
-                               }
-                       }
-                       if ( position == byte_copy_right ){
-                               byte_copy_left = buff[64] << 8;
-                               byte_copy_left = byte_copy_left | buff[65];
-                               position = byte_copy_left;
-                               if (print_level_2 ){
-                                       proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,
-                                                       "               byte_copy_left = %u byte_copy_right = %u", byte_copy_left, byte_copy_right);
-                               }
-                       }
-                       buff[k] = buff[position];
-                       if (print_level_1 ){
-                               proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,
-                                       "               Copying value: %5u (0x%x) from Addr: %u to Addr: %u",
-                                       buff[position + n], buff[position + n],(position + n), k);
-                       }
-                       k = ( k + 1 ) & 0xffff;
-                       n++;
-                       position++;
-               }
-               buff[result_dest] = k >> 8;
-               buff[result_dest + 1] = k & 0x00ff;
-               used_udvm_cycles = used_udvm_cycles + 1 + length;
-               goto execute_next_instruction;
-
-               break;
-       case SIGCOMP_INSTR_MEMSET: /* 21 MEMSET (%address, %length, %start_value, %offset) */
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## MEMSET(21) (address, length, start_value, offset)",
-                               current_address);
-               }
-               operand_address = current_address + 1;
-
-               /* %address */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &address);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Address %u",
-                               operand_address, address);
-               }
-               operand_address = next_operand_address; 
-
-               /*  %length, */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &length);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Length %u",
-                               operand_address, length);
-               }
-               operand_address = next_operand_address;
-               /* %start_value */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &start_value);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      start_value %u",
-                               operand_address, start_value);
-               }
-               operand_address = next_operand_address; 
-
-               /* %offset */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &multy_offset);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      offset %u",
-                               operand_address, multy_offset);
-               }
-               current_address = next_operand_address; 
-               /* exetute the instruction
-                * The sequence of values used by the MEMSET instruction is specified by
-                * the following formula:
-                * 
-                * Seq[n] := (start_value + n * offset) modulo 256
-                */
-               n = 0;
-               k = address; 
-               byte_copy_right = buff[66] << 8;
-               byte_copy_right = byte_copy_right | buff[67];
-               while ( n < length ){
-                       if ( k == byte_copy_right ){
-                               byte_copy_left = buff[64] << 8;
-                               byte_copy_left = byte_copy_left | buff[65];
-                               k = byte_copy_left;
-                               if (print_level_2 ){
-                                       proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,
-                                                       "               byte_copy_left = %u byte_copy_right = %u", byte_copy_left, byte_copy_right);
-                               }
-                       }
-                       buff[k] = (start_value + ( n * multy_offset)) & 0xff;
-                       if (print_level_2 ){
-                               proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,
-                                       "     Storing value: %u (0x%x) at Addr: %u",
-                                       buff[k], buff[k], k);
-                       }
-                       k = ( k + 1 ) & 0xffff;
-                       n++;
-               }/* end while */
-               used_udvm_cycles = used_udvm_cycles + 1 + length;
-               goto execute_next_instruction;
-               break;
-
-
-       case SIGCOMP_INSTR_JUMP: /* 22 JUMP (@address) */
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## JUMP(22) (@address)",
-                               current_address);
-               }
-               operand_address = current_address + 1;
-               /* @address */
-                /* operand_value = (memory_address_of_instruction + D) modulo 2^16 */
-               next_operand_address = decode_udvm_address_operand(buff,operand_address, &at_address, current_address);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      @Address %u",
-                               operand_address, at_address);
-               }
-               current_address = at_address;
-               used_udvm_cycles++;
-               goto execute_next_instruction;
-               break;
-
-       case SIGCOMP_INSTR_COMPARE: /* 23 */
-               /* COMPARE (%value_1, %value_2, @address_1, @address_2, @address_3)
-                */
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## COMPARE(23) (value_1, value_2, @address_1, @address_2, @address_3)",
-                               current_address);
-               }
-               operand_address = current_address + 1;
-
-               /* %value_1 */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &value_1);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Value %u",
-                                       operand_address, value_1);
-               }
-               operand_address = next_operand_address;
-
-               /* %value_2 */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &value_2);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Value %u",
-                                       operand_address, value_2);
-               }
-               operand_address = next_operand_address;
-
-               /* @address_1 */
-                /* operand_value = (memory_address_of_instruction + D) modulo 2^16 */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &at_address_1);
-               at_address_1 = ( current_address + at_address_1) & 0xffff;
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      @Address %u",
-                               operand_address, at_address_1);
-               }
-               operand_address = next_operand_address;
-
-
-               /* @address_2 */
-                /* operand_value = (memory_address_of_instruction + D) modulo 2^16 */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &at_address_2);
-               at_address_2 = ( current_address + at_address_2) & 0xffff;
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      @Address %u",
-                               operand_address, at_address_2);
-               }
-               operand_address = next_operand_address;
-
-               /* @address_3 */
-                /* operand_value = (memory_address_of_instruction + D) modulo 2^16 */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &at_address_3);
-               at_address_3 = ( current_address + at_address_3) & 0xffff;
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      @Address %u",
-                               operand_address, at_address_3);
-               }
-               /* execute the instruction
-                * If value_1 < value_2 then the UDVM continues instruction execution at
-                * the memory address specified by address 1. If value_1 = value_2 then
-                * it jumps to the address specified by address_2. If value_1 > value_2
-                * then it jumps to the address specified by address_3.
-                */
-               if ( value_1 < value_2 )
-                       current_address = at_address_1;
-               if ( value_1 == value_2 )
-                       current_address = at_address_2;
-               if ( value_1 > value_2 )
-                       current_address = at_address_3;
-               used_udvm_cycles++;
-               goto execute_next_instruction;
-               break;
-
-       case SIGCOMP_INSTR_CALL: /* 24 CALL (@address) (PUSH addr )*/
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## CALL(24) (@address) (PUSH addr )",
-                               current_address);
-               }
-               operand_address = current_address + 1;
-               /* @address */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &at_address);
-               at_address = ( current_address + at_address) & 0xffff;
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      @Address %u",
-                               operand_address, at_address);
-                /* operand_value = (memory_address_of_instruction + D) modulo 2^16 */
-               }
-               used_udvm_cycles++;
-               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Execution of this instruction is NOT implemented");
-               break;
-
-       case SIGCOMP_INSTR_RETURN: /* 25 POP and return */
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## POP(25) and return",
-                               current_address);
-               }
-               operand_address = current_address + 1;
-               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Execution of this instruction is NOT implemented");
-               used_udvm_cycles++;
-               break;
-
-       case SIGCOMP_INSTR_SWITCH: /* 26 SWITCH (#n, %j, @address_0, @address_1, ... , @address_n-1) */
-               /*
-                * When a SWITCH instruction is encountered the UDVM reads the value of
-                * j. It then continues instruction execution at the address specified
-                * by address j.
-                * 
-                * Decompression failure occurs if j specifies a value of n or more, or
-                * if the address lies beyond the overall UDVM memory size.
-                */
-               instruction_address = current_address;
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## SWITCH (#n, j, @address_0, @address_1, ... , @address_n-1))",
-                               current_address);
-               }
-               operand_address = current_address + 1;
-               /* #n 
-                * Number of addresses in the instruction
-                */
-               next_operand_address = decode_udvm_literal_operand(buff,operand_address, &n);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      n %u",
-                               operand_address, n);
-               }
-               operand_address = next_operand_address; 
-               /* %j */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &j);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      j %u",
-                                       operand_address, j);
-               }
-               operand_address = next_operand_address;
-               m = 0;
-               while ( m < n ){
-                       /* @address_n-1 */
-                       /* operand_value = (memory_address_of_instruction + D) modulo 2^16 */
-                       next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &at_address_1);
-                       at_address_1 = ( instruction_address + at_address_1) & 0xffff;
-                       if (print_level_1 ){
-                               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      @Address %u",
-                                       operand_address, at_address_1);
-                       }
-                       if ( j == m ){
-                               current_address = at_address_1;
-                       }
-                       operand_address = next_operand_address;
-                       m++;
-               }
-               /* Check decompression failure */
-               if ( ( j == n ) || ( j > n )){
-                       result_code = 5;
-                       goto decompression_failure;
-               }
-               if ( current_address > UDVM_MEMORY_SIZE ){
-                       result_code = 6;
-                       goto decompression_failure;
-               }
-               used_udvm_cycles = used_udvm_cycles + 1 + n;
-;
-               goto execute_next_instruction;
-
-               break;
-       case SIGCOMP_INSTR_CRC: /* 27 CRC (%value, %position, %length, @address) */
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## CRC (value, position, length, @address)",
-                               current_address);
-               }
-               /* %value */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &value);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Value %u",
-                               operand_address, value);
-               }
-               /* %position */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &position);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      position %u",
-                               operand_address, position);
-               }
-               operand_address = next_operand_address; 
-
-               /* %length */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &length);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Length %u",
-                               operand_address, length);
-               }
-               operand_address = next_operand_address;
-
-               /* @address */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &at_address);
-               at_address = ( current_address + at_address) & 0xffff;
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      @Address %u",
-                               operand_address, at_address);
-               }
-                /* operand_value = (memory_address_of_instruction + D) modulo 2^16 */
-               used_udvm_cycles = used_udvm_cycles + 1 + length;
-
-               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Execution of this instruction is NOT implemented");
-               break;
-
-
-       case SIGCOMP_INSTR_INPUT_BYTES: /* 28 INPUT-BYTES (%length, %destination, @address) */
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u ## INPUT-BYTES(28) length, destination, @address)",
-                               current_address);
-               }
-               operand_address = current_address + 1;
-               /* %length */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &length);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Length %u",
-                               operand_address, length);
-               }
-               operand_address = next_operand_address;
-
-               /* %destination */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &destination);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Destination %u",
-                               operand_address, destination);
-               }
-               operand_address = next_operand_address;
-
-               /* @address */
-                /* operand_value = (memory_address_of_instruction + D) modulo 2^16 */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &at_address);
-               at_address = ( current_address + at_address) & 0xffff;
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      @Address %u",
-                               operand_address, at_address);
-               }
-               /* execute the instruction TODO insert checks 
-                * RFC 3320 :
-                *
-         *    0             7 8            15
-         *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-         *   |        byte_copy_left         |  64 - 65
-         *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-         *   |        byte_copy_right        |  66 - 67
-         *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-         *   |        input_bit_order        |  68 - 69
-         *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-         *   |        stack_location         |  70 - 71
-         *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-                * 
-                * Figure 7: Memory addresses of the UDVM registers
-                * :
-                * 8.4.  Byte copying
-                * :
-                * The string of bytes is copied in ascending order of memory address,
-                * respecting the bounds set by byte_copy_left and byte_copy_right.
-                * More precisely, if a byte is copied from/to Address m then the next
-                * byte is copied from/to Address n where n is calculated as follows:
-                *
-                * Set k := m + 1 (modulo 2^16)
-                * If k = byte_copy_right then set n := byte_copy_left, else set n := k
-                *
-                */ 
-
-               n = 0;
-               k = destination; 
-               byte_copy_right = buff[66] << 8;
-               byte_copy_right = byte_copy_right | buff[67];
-               /* clear out remaining bits if any */
-               remaining_bits = 0;
-               input_bits=0;
-               /* operand_address used as dummy */
-               while ( n < length ){
-                       if (input_address > ( msg_end - 1)){
-                               current_address = at_address;
-                               result_code = 14;
-                               goto execute_next_instruction;
-                       }
-
-                       if (print_level_1 ){
-                               proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,
-                                               "               byte_copy_right = %u", byte_copy_right);
-                       }
-                       if ( k == byte_copy_right ){
-                               byte_copy_left = buff[64] << 8;
-                               byte_copy_left = byte_copy_left | buff[65];
-                               k = byte_copy_left;
-                       }
-                       octet = tvb_get_guint8(message_tvb, input_address);
-                       buff[k] = octet;
-                       if (print_level_1 ){
-                               proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,
-                                       "               Loading value: %u (0x%x) at Addr: %u", octet, octet, k);
-                       }
-                       input_address++;
-                       /*
-                        * If the instruction requests data that lies beyond the end of the
-                        * SigComp message, no data is returned.  Instead the UDVM moves program
-                        * execution to the address specified by the address operand.
-                        */
-
-                       
-                       k = ( k + 1 ) & 0xffff;
-                       n++;
-               }
-               used_udvm_cycles = used_udvm_cycles + 1 + length;
-               current_address = next_operand_address;
-               goto execute_next_instruction;
-               break;
-       case SIGCOMP_INSTR_INPUT_BITS:/* 29   INPUT-BITS (%length, %destination, @address) */
-               /*
-                * The length operand indicates the requested number of bits.
-                * Decompression failure occurs if this operand does not lie between 0
-                * and 16 inclusive.
-                * 
-                * The destination operand specifies the memory address to which the
-                * compressed data should be copied.  Note that the requested bits are
-                * interpreted as a 2-byte integer ranging from 0 to 2^length - 1, as
-                * explained in Section 8.2.
-                *
-                * If the instruction requests data that lies beyond the end of the
-                * SigComp message, no data is returned.  Instead the UDVM moves program
-                * execution to the address specified by the address operand.
-                */
-
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## INPUT-BITS(29) (length, destination, @address)",
-                               current_address);
-               }
-               operand_address = current_address + 1;
-
-               /* %length */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &length);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      length %u",
-                               operand_address, length);
-               }
-               operand_address = next_operand_address;
-               /* %destination */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &destination);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Destination %u",
-                               operand_address, destination);
-               }
-               operand_address = next_operand_address;
-
-               /* @address */
-                /* operand_value = (memory_address_of_instruction + D) modulo 2^16 */
-               next_operand_address = decode_udvm_address_operand(buff,operand_address, &at_address, current_address);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      @Address %u",
-                               operand_address, at_address);
-               }
-               current_address = next_operand_address;
-
-               /*
-                * Execute actual instr.
-                * The input_bit_order register contains the following three flags:
-                * 
-                *            0             7 8            15
-                *           +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-                *           |         reserved        |F|H|P|  68 - 69
-                *           +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-                */
-               input_bit_order = buff[68] << 8;
-               input_bit_order = input_bit_order | buff[69];
-               /*
-                * If the instruction requests data that lies beyond the end of the
-                * SigComp message, no data is returned.  Instead the UDVM moves program
-                * execution to the address specified by the address operand.
-                */
-
-               if ((input_address > ( msg_end -1)) && (remaining_bits == 0 )){
-                       result_code = 11;
-                       current_address = at_address;
-                       goto execute_next_instruction;
-               }
-
-               if ( length > 16 ){
-                       result_code = 7;
-                       goto decompression_failure;
-               }
-               if ( input_bit_order > 7 ){
-                       result_code = 8;
-                       goto decompression_failure;
-               }
-               /* Transfer F bit to bit_order to tell decomp dispatcher which bit order to use */
-               bit_order = ( input_bit_order & 0x0004 ) >> 2;
-               value = decomp_dispatch_get_bits( message_tvb, udvm_tree, bit_order, 
-                               buff, &old_input_bit_order, &remaining_bits,
-                               &input_bits, &input_address, length, &result_code, msg_end);
-               if ( result_code == 11 ){
-                       current_address = at_address;
-                       goto execute_next_instruction;
-               }
-               msb = value >> 8;
-               lsb = value & 0x00ff;
-               buff[destination] = msb;
-               buff[destination + 1]=lsb;
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,
-                       "               Loading value: %u (0x%x) at Addr: %u, remaining_bits: %u", value, value, destination, remaining_bits);
-               }
-
-               used_udvm_cycles = used_udvm_cycles + 1 + length;
-               goto execute_next_instruction;
-               break;
-       case SIGCOMP_INSTR_INPUT_HUFFMAN: /* 30 */
-               /*
-                * INPUT-HUFFMAN (%destination, @address, #n, %bits_1, %lower_bound_1,
-                *  %upper_bound_1, %uncompressed_1, ... , %bits_n, %lower_bound_n,
-                *  %upper_bound_n, %uncompressed_n)
-                */
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## INPUT-HUFFMAN (destination, @address, #n, bits_1, lower_bound_1,upper_bound_1, uncompressed_1, ... , bits_n, lower_bound_n,upper_bound_n, uncompressed_n)",
-                               current_address);
-               }
-               operand_address = current_address + 1;
-
-               /* %destination */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &destination);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Destination %u",
-                               operand_address, destination);
-               }
-               operand_address = next_operand_address;
-
-               /* @address */
-                /* operand_value = (memory_address_of_instruction + D) modulo 2^16 */
-               next_operand_address = decode_udvm_address_operand(buff,operand_address, &at_address, current_address);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      @Address %u",
-                               operand_address, at_address);
-               }
-               operand_address = next_operand_address;
-
-               /* #n */
-               next_operand_address = decode_udvm_literal_operand(buff,operand_address, &n);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      n %u",
-                               operand_address, n);
-               }
-               operand_address = next_operand_address; 
-               /*
-                * Note that if n = 0 then the INPUT-HUFFMAN instruction is ignored and
-                * program execution resumes at the following instruction.
-                * Decompression failure occurs if (bits_1 + ... + bits_n) > 16.
-                * 
-                * In all other cases, the behavior of the INPUT-HUFFMAN instruction is
-                * defined below:
-                * 
-                * 1. Set j := 1 and set H := 0.
-                * 
-                * 2. Request bits_j compressed bits.  Interpret the returned bits as an
-                * integer k from 0 to 2^bits_j - 1, as explained in Section 8.2.
-                * 
-                * 3. Set H := H * 2^bits_j + k.
-                * 
-                * 4. If data is requested that lies beyond the end of the SigComp
-                * message, terminate the INPUT-HUFFMAN instruction and move program
-                * execution to the memory address specified by the address operand.
-                * 
-                * 5. If (H < lower_bound_j) or (H > upper_bound_j) then set j := j + 1.
-                * Then go back to Step 2, unless j > n in which case decompression
-                * failure occurs.
-                * 
-                * 6. Copy (H + uncompressed_j - lower_bound_j) modulo 2^16 to the
-                * memory address specified by the destination operand.
-                * 
-                */
-               /*
-                * The input_bit_order register contains the following three flags:
-                * 
-                *            0             7 8            15
-                *           +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-                *           |         reserved        |F|H|P|  68 - 69
-                *           +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-                *
-                * Transfer H bit to bit_order to tell decomp dispatcher which bit order to use 
-                */
-               input_bit_order = buff[68] << 8;
-               input_bit_order = input_bit_order | buff[69];
-               bit_order = ( input_bit_order & 0x0002 ) >> 1;
-
-               j = 1;
-               H = 0;
-               m = n;
-               outside_huffman_boundaries = TRUE;
-               print_in_loop = print_level_1;
-               while ( m > 0 ){
-                       /* %bits_n */
-                       next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &bits_n);
-                       if (print_in_loop ){
-                               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      bits_n %u",
-                                       operand_address, bits_n);
-                       }
-                       operand_address = next_operand_address; 
-
-                       /* %lower_bound_n */
-                       next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &lower_bound_n);
-                       if (print_in_loop ){
-                               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      lower_bound_n %u",
-                                       operand_address, lower_bound_n);
-                       }
-                       operand_address = next_operand_address; 
-                       /* %upper_bound_n */
-                       next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &upper_bound_n);
-                       if (print_in_loop ){
-                               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      upper_bound_n %u",
-                                       operand_address, upper_bound_n);
-                       }
-                       operand_address = next_operand_address; 
-                       /* %uncompressed_n */
-                       next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &uncompressed_n);
-                       if (print_in_loop ){
-                               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      uncompressed_n %u",
-                                       operand_address, uncompressed_n);
-                       }
-                       operand_address = next_operand_address;
-                       /* execute instruction */
-                       if ( outside_huffman_boundaries ) {
-                               /*
-                                * 3. Set H := H * 2^bits_j + k.
-                                */
-                               k = decomp_dispatch_get_bits( message_tvb, udvm_tree, bit_order, 
-                                               buff, &old_input_bit_order, &remaining_bits,
-                                               &input_bits, &input_address, bits_n, &result_code, msg_end);
-                               if ( result_code == 11 ){
-                                       current_address = at_address;
-                                       goto execute_next_instruction;
-                               }
-                               /* ldexp Returns x multiplied by 2 raised to the power of exponent.
-                                * x*2^exponent
-                                */
-                               oldH = H;
-                               H = ( (guint16)ldexp( H, bits_n) + k );
-                               if (print_level_3 ){
-                                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"               Set H(%u) := H(%u) * 2^bits_j(%u) + k(%u)",
-                                                H ,oldH,((guint16)pow(2,bits_n)),k);
-                               }
-
-                               /*
-                                * 4. If data is requested that lies beyond the end of the SigComp
-                                * message, terminate the INPUT-HUFFMAN instruction and move program
-                                * execution to the memory address specified by the address operand.
-                                */
-                               if ( input_address > msg_end ){
-                                       current_address = at_address;
-                                       goto execute_next_instruction;
-                               }
-                               /*
-                                * 5. If (H < lower_bound_j) or (H > upper_bound_j) then set j := j + 1.
-                                * Then go back to Step 2, unless j > n in which case decompression
-                                * failure occurs.
-                                */
-                               if ((H < lower_bound_n) || (H > upper_bound_n)){
-                                       outside_huffman_boundaries = TRUE;
-                               }else{
-                                       outside_huffman_boundaries = FALSE;
-                                       print_in_loop = FALSE;
-                                       /*
-                                        * 6. Copy (H + uncompressed_j - lower_bound_j) modulo 2^16 to the
-                                        * memory address specified by the destination operand.
-                                        */
-                                       if (print_level_2 ){
-                                               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                                                       "               H(%u) = H(%u) + uncompressed_n(%u) - lower_bound_n(%u)",
-                                               (H + uncompressed_n - lower_bound_n ),H, uncompressed_n, lower_bound_n);
-                                       }
-                                       H = H + uncompressed_n - lower_bound_n;
-                                       msb = H >> 8;
-                                       lsb = H & 0x00ff;
-                                       buff[destination] = msb;
-                                       buff[destination + 1]=lsb;
-                                       if (print_level_1 ){
-                                               proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,
-                                       "               Loading H: %u (0x%x) at Addr: %u,j = %u remaining_bits: %u", 
-                                               H, H, destination,( n - m + 1 ), remaining_bits);
-                                       }
-                                       
-                               }
-
-
-                       }
-                       m = m - 1;
-               }
-               if ( outside_huffman_boundaries ) {
-                       result_code = 10;
-                       goto decompression_failure;
-               }
-
-               current_address = next_operand_address;
-               used_udvm_cycles = used_udvm_cycles + 1 + n;
-               goto execute_next_instruction;
-               break;
-
-       case SIGCOMP_INSTR_STATE_ACCESS: /* 31 */
-               /*   STATE-ACCESS (%partial_identifier_start, %partial_identifier_length,
-                * %state_begin, %state_length, %state_address, %state_instruction)
-                */
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## STATE-ACCESS(31) (partial_identifier_start, partial_identifier_length,state_begin, state_length, state_address, state_instruction)",
-                               current_address);
-               }
-               operand_address = current_address + 1;
-
-               /* 
-                * %partial_identifier_start
-                */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &p_id_start);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u       partial_identifier_start %u",
-                               operand_address, p_id_start);
-               }
-               operand_address = next_operand_address;
-
-               /*
-                * %partial_identifier_length
-                */
-               operand_address = next_operand_address;
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &p_id_length);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u       partial_identifier_length %u",
-                               operand_address, p_id_length);
-               }
-               /*
-                * %state_begin
-                */
-               operand_address = next_operand_address;
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &state_begin);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u       state_begin %u",
-                               operand_address, state_begin);
-               }
-               /*
-                * %state_length
-                */
-               operand_address = next_operand_address;
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &state_length);             if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u       state_length %u",
-                               operand_address, state_length);
-               }
-               /*
-                * %state_address
-                */
-               operand_address = next_operand_address;
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &state_address);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u       state_address %u",
-                               operand_address, state_address);
-               }
-               /*
-                * %state_instruction
-                */
-               operand_address = next_operand_address;
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &state_instruction);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u       state_instruction %u",
-                               operand_address, state_instruction);
-               }
-               current_address = next_operand_address;
-               byte_copy_right = buff[66] << 8;
-               byte_copy_right = byte_copy_right | buff[67];
-               byte_copy_left = buff[64] << 8;
-               byte_copy_left = byte_copy_left | buff[65];
-               if (print_level_2 ){
-                       proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,
-                                       "               byte_copy_right = %u, byte_copy_left = %u", byte_copy_right,byte_copy_left);
-               }
-
-               result_code = udvm_state_access(message_tvb, udvm_tree, buff, p_id_start, p_id_length, state_begin, &state_length, 
-                       &state_address, state_instruction, TRUE);
-               if ( result_code != 0 ){
-                       goto decompression_failure; 
-               }
-               used_udvm_cycles = used_udvm_cycles + 1 + state_length;
-               goto execute_next_instruction;
-               break;
-       case SIGCOMP_INSTR_STATE_CREATE: /* 32 */
-               /*
-                * STATE-CREATE (%state_length, %state_address, %state_instruction,
-                * %minimum_access_length, %state_retention_priority)
-                */
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## STATE-CREATE(32) (state_length, state_address, state_instruction,minimum_access_length, state_retention_priority)",
-                               current_address);
-               }
-               operand_address = current_address + 1;
-
-               /*
-                * %state_length
-                */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &state_length);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u       state_length %u",
-                               operand_address, state_length);
-               }
-               /*
-                * %state_address
-                */
-               operand_address = next_operand_address;
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &state_address);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u       state_address %u",
-                               operand_address, state_address);
-               }
-               /*
-                * %state_instruction
-                */
-               operand_address = next_operand_address;
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &state_instruction);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u       state_instruction %u",
-                               operand_address, state_instruction);
-               }
-               operand_address = next_operand_address;
-               /*
-                * %minimum_access_length
-                */
-               operand_address = next_operand_address;
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &minimum_access_length);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u       minimum_access_length %u",
-                               operand_address, minimum_access_length);
-               }
-               operand_address = next_operand_address;
-               /*
-                * %state_retention_priority
-                */
-               operand_address = next_operand_address;
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &state_retention_priority);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u       state_retention_priority %u",
-                               operand_address, state_retention_priority);
-               }
-               current_address = next_operand_address;
-               /* Execute the instruction
-                * TODO Implement the instruction
-                * RFC3320:
-                *    Note that the new state item cannot be created until a valid
-                *    compartment identifier has been returned by the application.
-                *    Consequently, when a STATE-CREATE instruction is encountered the UDVM
-                *    simply buffers the five supplied operands until the END-MESSAGE
-                *    instruction is reached.  The steps taken at this point are described
-                *    in Section 9.4.9.
-                *
-                *   Decompression failure MUST occur if more than four state creation
-                *   requests are made before the END-MESSAGE instruction is encountered.
-                *   Decompression failure also occurs if the minimum_access_length does
-                *   not lie between 6 and 20 inclusive, or if the
-                *   state_retention_priority is 65535.
-                */
-               no_of_state_create++;
-               if ( no_of_state_create > 4 ){
-                       result_code = 12;
-                       goto decompression_failure; 
-               }
-               if (( minimum_access_length < 6 ) || ( minimum_access_length > 20 )){
-                       result_code = 1;
-                       goto decompression_failure; 
-               }
-               if ( state_retention_priority == 65535 ){
-                       result_code = 13;
-                       goto decompression_failure; 
-               }
-               state_length_buff[no_of_state_create] = state_length;
-               state_address_buff[no_of_state_create] = state_address;
-               state_instruction_buff[no_of_state_create] = state_instruction;
-               state_minimum_access_length_buff[no_of_state_create] = minimum_access_length;
-               state_state_retention_priority_buff[no_of_state_create] = state_retention_priority;
-               used_udvm_cycles = used_udvm_cycles + 1 + state_length;
-               /* Debug */
-               byte_copy_right = buff[66] << 8;
-               byte_copy_right = byte_copy_right | buff[67];
-               n = 0;
-               k = state_address;
-               while ( n < state_length ){
-                       if ( k == byte_copy_right ){
-                               byte_copy_left = buff[64] << 8;
-                               byte_copy_left = byte_copy_left | buff[65];
-                               k = byte_copy_left;
-                       }
-                       string[0]= buff[k];
-                       string[1]= '\0';
-                       if (print_level_3 ){
-                               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                                       "               Addr: %5u State value: %u (0x%x) ASCII(%s)",
-                                       k,buff[k],buff[k],string);
-                       }
-                       k = ( k + 1 ) & 0xffff;
-                       n++;
-               }
-               /* End debug */
-
-               goto execute_next_instruction;
-               break;
-       case SIGCOMP_INSTR_STATE_FREE: /* 33 */
-               /*
-                * STATE-FREE (%partial_identifier_start, %partial_identifier_length)
-                */
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## STATE-FREE (partial_identifier_start, partial_identifier_length)",
-                               current_address);
-               }
-               operand_address = current_address + 1;
-               /* 
-                * %partial_identifier_start
-                */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &p_id_start);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u       partial_identifier_start %u",
-                               operand_address, p_id_start);
-               }
-               operand_address = next_operand_address;
-
-               /*
-                * %partial_identifier_length
-                */
-               operand_address = next_operand_address;
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &p_id_length);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u       partial_identifier_length %u",
-                               operand_address, p_id_length);
+               if ( print_level_3 )\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, offset, 1,\r
+                                               "              Addr: %u Instruction code(0x%0x) ", i, buff[i]);\r
+\r
+               i++;\r
+               offset++;\r
+\r
+       }\r
+       /* Largest allowed size for a message is 65535  */\r
+       out_buff = g_malloc(65535);\r
+       /* Start executing code */\r
+       current_address = udvm_mem_dest;\r
+       input_address = 0;\r
+       operand_address = 0;\r
+       \r
+       proto_tree_add_text(udvm_tree, bytecode_tvb, offset, 1,"UDVM EXECUTION STARTED at Address: %u Message size %u",\r
+               udvm_mem_dest,msg_end);\r
+\r
+execute_next_instruction:\r
+\r
+       if ( used_udvm_cycles > maximum_UDVM_cycles ){\r
+               result_code = 15;\r
+               goto decompression_failure;\r
+       }\r
+       current_instruction = buff[current_address];\r
+\r
+       switch ( current_instruction ) {\r
+       case SIGCOMP_INSTR_DECOMPRESSION_FAILURE:\r
+               used_udvm_cycles++;\r
+               if ( result_code == 0 )\r
+                       result_code = 9;\r
+               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                       "Addr: %u ## DECOMPRESSION-FAILURE(0)",\r
+                       current_address);\r
+               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Ethereal UDVM diagnostic: %s.",\r
+                                   val_to_str(result_code, result_code_vals,"Unknown (%u)"));\r
+               if ( output_address > 0 ){\r
+                       /* At least something got decompressed, show it */\r
+                       decomp_tvb = tvb_new_real_data(out_buff,output_address,output_address);\r
+                       /* Arrange that the allocated packet data copy be freed when the\r
+                        * tvbuff is freed. \r
+                        */\r
+                       tvb_set_free_cb( decomp_tvb, g_free );\r
+                       /* Add the tvbuff to the list of tvbuffs to which the tvbuff we\r
+                        * were handed refers, so it'll get cleaned up when that tvbuff\r
+                        * is cleaned up. \r
+                        */\r
+                       tvb_set_child_real_data_tvbuff(message_tvb,decomp_tvb);\r
+                       add_new_data_source(pinfo, decomp_tvb, "Decompressed SigComp message(Incomplete)");\r
+                       proto_tree_add_text(udvm_tree, decomp_tvb, 0, -1,"SigComp message Decompression failure");\r
+               return decomp_tvb;\r
+               }\r
+               g_free(out_buff);\r
+               return NULL;\r
+               break;\r
+\r
+       case SIGCOMP_INSTR_AND: /* 1 AND ($operand_1, %operand_2) */\r
+               used_udvm_cycles++;\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## AND(1) (operand_1, operand_2)",\r
+                               current_address);\r
+               }\r
+               /* $operand_1*/\r
+               operand_address = current_address + 1;\r
+               next_operand_address = dissect_udvm_reference_operand(buff, operand_address, &operand_1, &result_dest);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_1 %u",\r
+                               operand_address, operand_1);\r
+               }\r
+               operand_address = next_operand_address; \r
+               /* %operand_2*/\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &operand_2);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_2 %u",\r
+                               operand_address, operand_2);\r
+               }\r
+               /* execute the instruction */\r
+               result = operand_1 & operand_2;\r
+               lsb = result & 0xff;\r
+               msb = result >> 8;              \r
+               buff[result_dest] = msb;\r
+               buff[result_dest+1] = lsb;\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"     Loading result %u at %u",\r
+                               result, result_dest);\r
+               }\r
+               current_address = next_operand_address; \r
+               goto execute_next_instruction;\r
+\r
+               break;\r
+\r
+       case SIGCOMP_INSTR_OR: /* 2 OR ($operand_1, %operand_2) */\r
+               used_udvm_cycles++;\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## OR(2) (operand_1, operand_2)",\r
+                               current_address);\r
+               }\r
+               /* $operand_1*/\r
+               operand_address = current_address + 1;\r
+               next_operand_address = dissect_udvm_reference_operand(buff, operand_address, &operand_1, &result_dest);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_1 %u",\r
+                               operand_address, operand_1);\r
+               }\r
+               operand_address = next_operand_address; \r
+               /* %operand_2*/\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &operand_2);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_2 %u",\r
+                               operand_address, operand_2);\r
+               }\r
+               /* execute the instruction */\r
+               result = operand_1 | operand_2;\r
+               lsb = result & 0xff;\r
+               msb = result >> 8;              \r
+               buff[result_dest] = msb;\r
+               buff[result_dest+1] = lsb;\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"     Loading result %u at %u",\r
+                               result, result_dest);\r
+               }\r
+               current_address = next_operand_address; \r
+               goto execute_next_instruction;\r
+\r
+               break;\r
+\r
+       case SIGCOMP_INSTR_NOT: /* 3 NOT ($operand_1) */\r
+               used_udvm_cycles++;\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## NOT(3) ($operand_1)",\r
+                               current_address);\r
+               }\r
+               /* $operand_1*/\r
+               operand_address = current_address + 1;\r
+               next_operand_address = dissect_udvm_reference_operand(buff, operand_address, &operand_1, &result_dest);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_1 %u",\r
+                               operand_address, operand_1);\r
+               }\r
+               /* execute the instruction */\r
+               result = operand_1 ^ 0xffff;\r
+               lsb = result & 0xff;\r
+               msb = result >> 8;              \r
+               buff[result_dest] = msb;\r
+               buff[result_dest+1] = lsb;\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"     Loading result %u at %u",\r
+                               result, result_dest);\r
+               }\r
+               current_address = next_operand_address; \r
+               goto execute_next_instruction;\r
+               break;\r
+\r
+       case SIGCOMP_INSTR_LSHIFT: /* 4 LSHIFT ($operand_1, %operand_2) */\r
+               used_udvm_cycles++;\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## LSHIFT(4) ($operand_1, operand_2)",\r
+                               current_address);\r
+               }\r
+               /* $operand_1*/\r
+               operand_address = current_address + 1;\r
+               next_operand_address = dissect_udvm_reference_operand(buff, operand_address, &operand_1, &result_dest);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_1 %u",\r
+                               operand_address, operand_1);\r
+               }\r
+               operand_address = next_operand_address; \r
+               /* %operand_2*/\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &operand_2);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_2 %u",\r
+                               operand_address, operand_2);\r
+               }\r
+               /* execute the instruction */\r
+               result = operand_1 << operand_2;\r
+               lsb = result & 0xff;\r
+               msb = result >> 8;              \r
+               buff[result_dest] = msb;\r
+               buff[result_dest+1] = lsb;\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"     Loading result %u at %u",\r
+                               result, result_dest);\r
+               }\r
+               current_address = next_operand_address; \r
+               goto execute_next_instruction;\r
+\r
+               break;\r
+               case SIGCOMP_INSTR_RSHIFT: /* 5 RSHIFT ($operand_1, %operand_2) */\r
+               used_udvm_cycles++;\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## RSHIFT(5) (operand_1, operand_2)",\r
+                               current_address);\r
+               }\r
+               /* $operand_1*/\r
+               operand_address = current_address + 1;\r
+               next_operand_address = dissect_udvm_reference_operand(buff, operand_address, &operand_1, &result_dest);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_1 %u",\r
+                               operand_address, operand_1);\r
+               }\r
+               operand_address = next_operand_address; \r
+               /* %operand_2*/\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &operand_2);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_2 %u",\r
+                               operand_address, operand_2);\r
+               }\r
+               /* execute the instruction */\r
+               result = operand_1 >> operand_2;\r
+               lsb = result & 0xff;\r
+               msb = result >> 8;              \r
+               buff[result_dest] = msb;\r
+               buff[result_dest+1] = lsb;\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"     Loading result %u at %u",\r
+                               result, result_dest);\r
+               }\r
+               current_address = next_operand_address; \r
+               goto execute_next_instruction;\r
+               break;\r
+               case SIGCOMP_INSTR_ADD: /* 6 ADD ($operand_1, %operand_2) */\r
+               used_udvm_cycles++;\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## ADD(6) (operand_1, operand_2)",\r
+                               current_address);\r
+               }\r
+               /* $operand_1*/\r
+               operand_address = current_address + 1;\r
+               next_operand_address = dissect_udvm_reference_operand(buff, operand_address, &operand_1, &result_dest);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_1 %u",\r
+                               operand_address, operand_1);\r
+               }\r
+               operand_address = next_operand_address; \r
+               /* %operand_2*/\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &operand_2);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_2 %u",\r
+                               operand_address, operand_2);\r
+               }\r
+               /* execute the instruction */\r
+               result = operand_1 + operand_2;\r
+               lsb = result & 0xff;\r
+               msb = result >> 8;              \r
+               buff[result_dest] = msb;\r
+               buff[result_dest+1] = lsb;\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"               Loading result %u at %u",\r
+                               result, result_dest);\r
+               }\r
+               current_address = next_operand_address; \r
+               goto execute_next_instruction;\r
+\r
+               case SIGCOMP_INSTR_SUBTRACT: /* 7 SUBTRACT ($operand_1, %operand_2) */\r
+               used_udvm_cycles++;\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## SUBTRACT(7) (operand_1, operand_2)",\r
+                               current_address);\r
+               }\r
+               /* $operand_1*/\r
+               operand_address = current_address + 1;\r
+               next_operand_address = dissect_udvm_reference_operand(buff, operand_address, &operand_1, &result_dest);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_1 %u",\r
+                               operand_address, operand_1);\r
+               }\r
+               operand_address = next_operand_address; \r
+               /* %operand_2*/\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &operand_2);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_2 %u",\r
+                               operand_address, operand_2);\r
+               }\r
+               /* execute the instruction */\r
+               result = operand_1 - operand_2;\r
+               lsb = result & 0xff;\r
+               msb = result >> 8;              \r
+               buff[result_dest] = msb;\r
+               buff[result_dest+1] = lsb;\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"               Loading result %u at %u",\r
+                               result, result_dest);\r
+               }\r
+               current_address = next_operand_address; \r
+               goto execute_next_instruction;\r
+               break;\r
+\r
+       case SIGCOMP_INSTR_MULTIPLY: /* 8 MULTIPLY ($operand_1, %operand_2) */\r
+               used_udvm_cycles++;\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ##MULTIPLY(8) (operand_1, operand_2)",\r
+                               current_address);\r
+               }\r
+               /* $operand_1*/\r
+               operand_address = current_address + 1;\r
+               next_operand_address = dissect_udvm_reference_operand(buff, operand_address, &operand_1, &result_dest);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_1 %u",\r
+                               operand_address, operand_1);\r
+               }\r
+               operand_address = next_operand_address; \r
+               /* %operand_2*/\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &operand_2);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_2 %u",\r
+                               operand_address, operand_2);\r
+               }\r
+               /* \r
+                * execute the instruction\r
+                * MULTIPLY (m, n)  := m * n (modulo 2^16)\r
+                */\r
+               if ( operand_2 == 0){\r
+                       result_code = 4;\r
+                       goto decompression_failure;\r
+               }\r
+               result = operand_1 * operand_2;\r
+               lsb = result & 0xff;\r
+               msb = result >> 8;              \r
+               buff[result_dest] = msb;\r
+               buff[result_dest+1] = lsb;\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"     Loading result %u at %u",\r
+                               result, result_dest);\r
+               }\r
+               current_address = next_operand_address; \r
+               goto execute_next_instruction;\r
+               break;\r
+\r
+       case SIGCOMP_INSTR_DIVIDE: /* 9 DIVIDE ($operand_1, %operand_2) */\r
+               used_udvm_cycles++;\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## DIVIDE(9) (operand_1, operand_2)",\r
+                               current_address);\r
+               }\r
+               /* $operand_1*/\r
+               operand_address = current_address + 1;\r
+               next_operand_address = dissect_udvm_reference_operand(buff, operand_address, &operand_1, &result_dest);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_1 %u",\r
+                               operand_address, operand_1);\r
+               }\r
+               operand_address = next_operand_address; \r
+               /* %operand_2*/\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &operand_2);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_2 %u",\r
+                               operand_address, operand_2);\r
+               }\r
+               /* \r
+                * execute the instruction\r
+                * DIVIDE (m, n)    := floor(m / n)\r
+                * Decompression failure occurs if a DIVIDE or REMAINDER instruction\r
+                * encounters an operand_2 that is zero.\r
+                */\r
+               if ( operand_2 == 0){\r
+                       result_code = 4;\r
+                       goto decompression_failure;\r
+               }\r
+               result = (guint16)floor(operand_1/operand_2);\r
+               lsb = result & 0xff;\r
+               msb = result >> 8;              \r
+               buff[result_dest] = msb;\r
+               buff[result_dest+1] = lsb;\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"     Loading result %u at %u",\r
+                               result, result_dest);\r
+               }\r
+               current_address = next_operand_address; \r
+               goto execute_next_instruction;\r
+               break;\r
+\r
+       case SIGCOMP_INSTR_REMAINDER: /* 10 REMAINDER ($operand_1, %operand_2) */\r
+               used_udvm_cycles++;\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## REMAINDER(10) (operand_1, operand_2)",\r
+                               current_address);\r
+               }\r
+               /* $operand_1*/\r
+               operand_address = current_address + 1;\r
+               next_operand_address = dissect_udvm_reference_operand(buff, operand_address, &operand_1, &result_dest);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_1 %u",\r
+                               operand_address, operand_1);\r
+               }\r
+               operand_address = next_operand_address; \r
+               /* %operand_2*/\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &operand_2);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      operand_2 %u",\r
+                               operand_address, operand_2);\r
+               }\r
+               /* \r
+                * execute the instruction\r
+                * REMAINDER (m, n) := m - n * floor(m / n)\r
+                * Decompression failure occurs if a DIVIDE or REMAINDER instruction\r
+                * encounters an operand_2 that is zero.\r
+                */\r
+               if ( operand_2 == 0){\r
+                       result_code = 4;\r
+                       goto decompression_failure;\r
+               }\r
+               result = operand_1 - operand_2 * (guint16)floor(operand_1/operand_2);\r
+               lsb = result & 0xff;\r
+               msb = result >> 8;              \r
+               buff[result_dest] = msb;\r
+               buff[result_dest+1] = lsb;\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"     Loading result %u at %u",\r
+                               result, result_dest);\r
+               }\r
+               current_address = next_operand_address; \r
+               goto execute_next_instruction;\r
+               break;\r
+       case SIGCOMP_INSTR_SORT_ASCENDING: /* 11 SORT-ASCENDING (%start, %n, %k) */\r
+               /*\r
+                *      used_udvm_cycles =  1 + k * (ceiling(log2(k)) + n)\r
+                */\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## SORT-ASCENDING(11) (start, n, k))",\r
+                               current_address);\r
+               }\r
+               operand_address = current_address + 1;\r
+               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Execution of this instruction is NOT implemented");\r
+               /*\r
+                *      used_udvm_cycles =  1 + k * (ceiling(log2(k)) + n)\r
+                */\r
+               break;\r
+\r
+       case SIGCOMP_INSTR_SORT_DESCENDING: /* 12 SORT-DESCENDING (%start, %n, %k) */\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## SORT-DESCENDING(12) (start, n, k))",\r
+                               current_address);\r
+               }\r
+               operand_address = current_address + 1;\r
+               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Execution of this instruction is NOT implemented");\r
+               /*\r
+                *      used_udvm_cycles =  1 + k * (ceiling(log2(k)) + n)\r
+                */\r
+               break;\r
+       case SIGCOMP_INSTR_SHA_1: /* 13 SHA-1 (%position, %length, %destination) */\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## SHA-1(13) (position, length, destination)",\r
+                               current_address);\r
+               }\r
+               operand_address = current_address + 1;\r
+               /* %position */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &position);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      position %u",\r
+                               operand_address, position);\r
+               }\r
+               operand_address = next_operand_address; \r
+\r
+               /* %length */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &length);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Length %u",\r
+                               operand_address, length);\r
+               }\r
+               operand_address = next_operand_address;\r
+\r
+               /* $destination */\r
+               next_operand_address = dissect_udvm_reference_operand(buff, operand_address, &ref_destination, &result_dest);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      $destination %u",\r
+                               operand_address, ref_destination);\r
+               }\r
+               current_address = next_operand_address; \r
+               used_udvm_cycles = used_udvm_cycles + 1 + length;\r
+               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Execution of this instruction is NOT implemented");\r
+               break;\r
+\r
+       case SIGCOMP_INSTR_LOAD: /* 14 LOAD (%address, %value) */\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## LOAD(14) (%%address, %%value)",\r
+                               current_address);\r
+               }\r
+               operand_address = current_address + 1;\r
+               /* %address */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &address);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Address %u",\r
+                               operand_address, address);\r
+               }\r
+               operand_address = next_operand_address; \r
+               /* %value */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &value);\r
+               lsb = value & 0xff;\r
+               msb = value >> 8;\r
+\r
+               buff[address] = msb;\r
+               buff[address + 1] = lsb;\r
+\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Value %u",\r
+                               operand_address, value);\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"     Loading bytes at %u Value %u 0x%x",\r
+                                       address, value, value);\r
+               }\r
+               used_udvm_cycles++;\r
+               current_address = next_operand_address;\r
+               goto execute_next_instruction;\r
+               break;\r
+\r
+       case SIGCOMP_INSTR_MULTILOAD: /* 15 MULTILOAD (%address, #n, %value_0, ..., %value_n-1) */\r
+               /* RFC 3320:\r
+                * The MULTILOAD instruction sets a contiguous block of 2-byte words in\r
+                * the UDVM memory to specified values.\r
+                * Hmm what if the value to load only takes one byte ? Chose to always load two bytes.\r
+                */\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## MULTILOAD(15) (%%address, #n, value_0, ..., value_n-1)",\r
+                               current_address);\r
+               }\r
+               operand_address = current_address + 1;\r
+               /* %address */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &address);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Address %u",\r
+                               operand_address, address);\r
+               }\r
+               operand_address = next_operand_address; \r
+\r
+               /* #n */\r
+               next_operand_address = decode_udvm_literal_operand(buff,operand_address, &n);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      n %u",\r
+                               operand_address, n);\r
+               }\r
+               operand_address = next_operand_address; \r
+               used_udvm_cycles = used_udvm_cycles + n;\r
+               while ( n > 0) {\r
+                       n = n - 1;\r
+                       /* %value */\r
+                       next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &value);\r
+                       lsb = value & 0xff;\r
+                       msb = value >> 8;\r
+\r
+                       buff[address] = msb;\r
+                       buff[address + 1] = lsb;\r
+                       /* debug\r
+                       */\r
+                       length = next_operand_address - operand_address;\r
+\r
+                       if (print_level_1 ){\r
+                               proto_tree_add_text(udvm_tree, bytecode_tvb, operand_address - 128, length,"Addr: %u      Value %5u      - Loading bytes at %5u Value %5u 0x%x",\r
+                                       operand_address, value, address, value, value);\r
+                       }\r
+                       address = address + 2;\r
+                       operand_address = next_operand_address; \r
                }\r
                current_address = next_operand_address;\r
-
-               /* Execute the instruction:
-                * TODO implement it
+               goto execute_next_instruction;\r
+\r
+               break;\r
+                        \r
+       case SIGCOMP_INSTR_PUSH: /* 16 PUSH (%value) */\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## PUSH(16) (value)",\r
+                               current_address);\r
+               }\r
+               operand_address = current_address + 1;\r
+               /* %value */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &value);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Value %u",\r
+                               operand_address, value);\r
+               }\r
+               used_udvm_cycles++;\r
+               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Execution of this instruction is NOT implemented");\r
+               break;\r
+\r
+       case SIGCOMP_INSTR_POP: /* 17 POP (%address) */\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## POP(17) (address)",\r
+                               current_address);\r
+               }\r
+               operand_address = current_address + 1;\r
+               /* %address */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &address);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Address %u",\r
+                               operand_address, address);\r
+               }\r
+               operand_address = next_operand_address; \r
+               used_udvm_cycles++;\r
+               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Execution of this instruction is NOT implemented");\r
+               break;\r
+\r
+       case SIGCOMP_INSTR_COPY: /* 18 COPY (%position, %length, %destination) */\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## COPY(18) (position, length, destination)",\r
+                               current_address);\r
+               }\r
+               operand_address = current_address + 1;\r
+               /* %position */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &position);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      position %u",\r
+                               operand_address, position);\r
+               }\r
+               operand_address = next_operand_address; \r
+\r
+               /* %length */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &length);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Length %u",\r
+                               operand_address, length);\r
+               }\r
+               operand_address = next_operand_address;\r
+\r
+               /* %destination */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &destination);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Destination %u",\r
+                               operand_address, destination);\r
+               }\r
+               current_address = next_operand_address;\r
+               /*\r
+                * 8.4.  Byte copying\r
+                * :\r
+                * The string of bytes is copied in ascending order of memory address,\r
+                * respecting the bounds set by byte_copy_left and byte_copy_right.\r
+                * More precisely, if a byte is copied from/to Address m then the next\r
+                * byte is copied from/to Address n where n is calculated as follows:\r
+                *\r
+                * Set k := m + 1 (modulo 2^16)\r
+                * If k = byte_copy_right then set n := byte_copy_left, else set n := k\r
+                *\r
+                */ \r
+\r
+               n = 0;\r
+               k = destination; \r
+               byte_copy_right = buff[66] << 8;\r
+               byte_copy_right = byte_copy_right | buff[67];\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,\r
+                                               "               byte_copy_right = %u", byte_copy_right);\r
+               }\r
+\r
+               while ( n < length ){\r
+\r
+                       if (print_level_1 ){\r
+                               proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,\r
+                                               "               byte_copy_right = %u", byte_copy_right);\r
+                       }\r
+                       if ( k == byte_copy_right ){\r
+                               byte_copy_left = buff[64] << 8;\r
+                               byte_copy_left = byte_copy_left | buff[65];\r
+                               k = byte_copy_left;\r
+                       }\r
+                       buff[k] = buff[position + n];\r
+                       if (print_level_1 ){\r
+                               proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,\r
+                                       "               Copying value: %u (0x%x) to Addr: %u", buff[position + n], buff[position + n], k);\r
+                       }\r
+                       k = ( k + 1 ) & 0xffff;\r
+                       n++;\r
+               }\r
+               used_udvm_cycles = used_udvm_cycles + 1 + length;\r
+               goto execute_next_instruction;\r
+               break;\r
+\r
+       case SIGCOMP_INSTR_COPY_LITERAL: /* 19 COPY-LITERAL (%position, %length, $destination) */\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## COPY-LITERAL(19) (position, length, $destination)",\r
+                               current_address);\r
+               }\r
+               operand_address = current_address + 1;\r
+               /* %position */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &position);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      position %u",\r
+                               operand_address, address);\r
+               }\r
+               operand_address = next_operand_address; \r
+\r
+               /* %length */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &length);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Length %u",\r
+                               operand_address, length);\r
+               }\r
+               operand_address = next_operand_address;\r
+\r
+\r
+               /* $destination */\r
+               next_operand_address = dissect_udvm_reference_operand(buff, operand_address, &ref_destination, &result_dest);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      destination %u",\r
+                               operand_address, ref_destination);\r
+               }\r
+               current_address = next_operand_address; \r
+\r
+\r
+               /*\r
+                * 8.4.  Byte copying\r
+                * :\r
+                * The string of bytes is copied in ascending order of memory address,\r
+                * respecting the bounds set by byte_copy_left and byte_copy_right.\r
+                * More precisely, if a byte is copied from/to Address m then the next\r
+                * byte is copied from/to Address n where n is calculated as follows:\r
+                *\r
+                * Set k := m + 1 (modulo 2^16)\r
+                * If k = byte_copy_right then set n := byte_copy_left, else set n := k\r
+                *\r
+                */ \r
+\r
+               n = 0;\r
+               k = ref_destination; \r
+               byte_copy_right = buff[66] << 8;\r
+               byte_copy_right = byte_copy_right | buff[67];\r
+               while ( n < length ){\r
+\r
+                       if (print_level_1 ){\r
+                               proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,\r
+                                               "               byte_copy_right = %u", byte_copy_right);\r
+                       }\r
+                       if ( k == byte_copy_right ){\r
+                               byte_copy_left = buff[64] << 8;\r
+                               byte_copy_left = byte_copy_left | buff[65];\r
+                               k = byte_copy_left;\r
+                       }\r
+                       buff[k] = buff[position + n];\r
+                       if (print_level_1 ){\r
+                               proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,\r
+                                       "               Copying value: %u (0x%x) to Addr: %u", buff[position + n], buff[position + n], k);\r
+                       }\r
+                       k = ( k + 1 ) & 0xffff;\r
+                       n++;\r
+               }\r
+               buff[result_dest] = k >> 8;\r
+               buff[result_dest + 1] = k & 0x00ff;\r
+\r
+               used_udvm_cycles = used_udvm_cycles + 1 + length;\r
+               goto execute_next_instruction;\r
+               break;\r
\r
+       case SIGCOMP_INSTR_COPY_OFFSET: /* 20 COPY-OFFSET (%offset, %length, $destination) */\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## COPY-OFFSET(20) (offset, length, $destination)",\r
+                               current_address);\r
+               }\r
+               operand_address = current_address + 1;\r
+               /* %offset */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &multy_offset);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      offset %u",\r
+                               operand_address, multy_offset);\r
+               }\r
+               operand_address = next_operand_address; \r
+\r
+               /* %length */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &length);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Length %u",\r
+                               operand_address, length);\r
+               }\r
+               operand_address = next_operand_address;\r
+\r
+\r
+               /* $destination */\r
+               next_operand_address = dissect_udvm_reference_operand(buff, operand_address, &ref_destination, &result_dest);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      $destination %u",\r
+                               operand_address, ref_destination);\r
+               }\r
+               current_address = next_operand_address; \r
+\r
+               /* Execute the instruction:\r
+                * To derive the value of the position operand, starting at the memory\r
+                * address specified by destination, the UDVM counts backwards a total\r
+                * of offset memory addresses.\r
+                * \r
+                * If the memory address specified in byte_copy_left is reached, the\r
+                * next memory address is taken to be (byte_copy_right - 1) modulo 2^16.\r
+                */\r
+               byte_copy_left = buff[64] << 8;\r
+               byte_copy_left = byte_copy_left | buff[65];\r
+               byte_copy_right = buff[66] << 8;\r
+               byte_copy_right = byte_copy_right | buff[67];\r
+\r
+               if ( (byte_copy_left + multy_offset) > ( ref_destination )){\r
+                       /* wrap around */\r
+                       position = byte_copy_right - ( multy_offset - ( ref_destination - byte_copy_left )); \r
+               }else{\r
+                       position = ref_destination - multy_offset;\r
+               }\r
+\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,\r
+                                       "               byte_copy_left = %u byte_copy_right = %u position= %u",\r
+                                       byte_copy_left, byte_copy_right, position);\r
+                       }\r
+               /* The COPY-OFFSET instruction then behaves as a COPY-LITERAL\r
+                * instruction, taking the value of the position operand to be the last\r
+                * memory address reached in the above step.\r
+                */\r
+\r
+               /*\r
+                * 8.4.  Byte copying\r
+                * :\r
+                * The string of bytes is copied in ascending order of memory address,\r
+                * respecting the bounds set by byte_copy_left and byte_copy_right.\r
+                * More precisely, if a byte is copied from/to Address m then the next\r
+                * byte is copied from/to Address n where n is calculated as follows:\r
+                *\r
+                * Set k := m + 1 (modulo 2^16)\r
+                * If k = byte_copy_right then set n := byte_copy_left, else set n := k\r
+                *\r
+                */ \r
+\r
+               n = 0;\r
+               k = ref_destination; \r
+               byte_copy_right = buff[66] << 8;\r
+               byte_copy_right = byte_copy_right | buff[67];\r
+               while ( n < length ){\r
+                       if ( k == byte_copy_right ){\r
+                               byte_copy_left = buff[64] << 8;\r
+                               byte_copy_left = byte_copy_left | buff[65];\r
+                               k = byte_copy_left;\r
+                               if (print_level_2 ){\r
+                                       proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,\r
+                                                       "               byte_copy_left = %u byte_copy_right = %u", byte_copy_left, byte_copy_right);\r
+                               }\r
+                       }\r
+                       if ( position == byte_copy_right ){\r
+                               byte_copy_left = buff[64] << 8;\r
+                               byte_copy_left = byte_copy_left | buff[65];\r
+                               position = byte_copy_left;\r
+                               if (print_level_2 ){\r
+                                       proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,\r
+                                                       "               byte_copy_left = %u byte_copy_right = %u", byte_copy_left, byte_copy_right);\r
+                               }\r
+                       }\r
+                       buff[k] = buff[position];\r
+                       if (print_level_1 ){\r
+                               proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,\r
+                                       "               Copying value: %5u (0x%x) from Addr: %u to Addr: %u",\r
+                                       buff[position + n], buff[position + n],(position + n), k);\r
+                       }\r
+                       k = ( k + 1 ) & 0xffff;\r
+                       n++;\r
+                       position++;\r
+               }\r
+               buff[result_dest] = k >> 8;\r
+               buff[result_dest + 1] = k & 0x00ff;\r
+               used_udvm_cycles = used_udvm_cycles + 1 + length;\r
+               goto execute_next_instruction;\r
+\r
+               break;\r
+       case SIGCOMP_INSTR_MEMSET: /* 21 MEMSET (%address, %length, %start_value, %offset) */\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## MEMSET(21) (address, length, start_value, offset)",\r
+                               current_address);\r
+               }\r
+               operand_address = current_address + 1;\r
+\r
+               /* %address */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &address);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Address %u",\r
+                               operand_address, address);\r
+               }\r
+               operand_address = next_operand_address; \r
+\r
+               /*  %length, */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &length);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Length %u",\r
+                               operand_address, length);\r
+               }\r
+               operand_address = next_operand_address;\r
+               /* %start_value */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &start_value);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      start_value %u",\r
+                               operand_address, start_value);\r
+               }\r
+               operand_address = next_operand_address; \r
+\r
+               /* %offset */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &multy_offset);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      offset %u",\r
+                               operand_address, multy_offset);\r
+               }\r
+               current_address = next_operand_address; \r
+               /* exetute the instruction\r
+                * The sequence of values used by the MEMSET instruction is specified by\r
+                * the following formula:\r
+                * \r
+                * Seq[n] := (start_value + n * offset) modulo 256\r
+                */\r
+               n = 0;\r
+               k = address; \r
+               byte_copy_right = buff[66] << 8;\r
+               byte_copy_right = byte_copy_right | buff[67];\r
+               while ( n < length ){\r
+                       if ( k == byte_copy_right ){\r
+                               byte_copy_left = buff[64] << 8;\r
+                               byte_copy_left = byte_copy_left | buff[65];\r
+                               k = byte_copy_left;\r
+                               if (print_level_2 ){\r
+                                       proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,\r
+                                                       "               byte_copy_left = %u byte_copy_right = %u", byte_copy_left, byte_copy_right);\r
+                               }\r
+                       }\r
+                       buff[k] = (start_value + ( n * multy_offset)) & 0xff;\r
+                       if (print_level_2 ){\r
+                               proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,\r
+                                       "     Storing value: %u (0x%x) at Addr: %u",\r
+                                       buff[k], buff[k], k);\r
+                       }\r
+                       k = ( k + 1 ) & 0xffff;\r
+                       n++;\r
+               }/* end while */\r
+               used_udvm_cycles = used_udvm_cycles + 1 + length;\r
+               goto execute_next_instruction;\r
+               break;\r
+\r
+\r
+       case SIGCOMP_INSTR_JUMP: /* 22 JUMP (@address) */\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## JUMP(22) (@address)",\r
+                               current_address);\r
+               }\r
+               operand_address = current_address + 1;\r
+               /* @address */\r
+                /* operand_value = (memory_address_of_instruction + D) modulo 2^16 */\r
+               next_operand_address = decode_udvm_address_operand(buff,operand_address, &at_address, current_address);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      @Address %u",\r
+                               operand_address, at_address);\r
+               }\r
+               current_address = at_address;\r
+               used_udvm_cycles++;\r
+               goto execute_next_instruction;\r
+               break;\r
+\r
+       case SIGCOMP_INSTR_COMPARE: /* 23 */\r
+               /* COMPARE (%value_1, %value_2, @address_1, @address_2, @address_3)\r
+                */\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## COMPARE(23) (value_1, value_2, @address_1, @address_2, @address_3)",\r
+                               current_address);\r
+               }\r
+               operand_address = current_address + 1;\r
+\r
+               /* %value_1 */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &value_1);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Value %u",\r
+                                       operand_address, value_1);\r
+               }\r
+               operand_address = next_operand_address;\r
+\r
+               /* %value_2 */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &value_2);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Value %u",\r
+                                       operand_address, value_2);\r
+               }\r
+               operand_address = next_operand_address;\r
+\r
+               /* @address_1 */\r
+                /* operand_value = (memory_address_of_instruction + D) modulo 2^16 */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &at_address_1);\r
+               at_address_1 = ( current_address + at_address_1) & 0xffff;\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      @Address %u",\r
+                               operand_address, at_address_1);\r
+               }\r
+               operand_address = next_operand_address;\r
+\r
+\r
+               /* @address_2 */\r
+                /* operand_value = (memory_address_of_instruction + D) modulo 2^16 */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &at_address_2);\r
+               at_address_2 = ( current_address + at_address_2) & 0xffff;\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      @Address %u",\r
+                               operand_address, at_address_2);\r
+               }\r
+               operand_address = next_operand_address;\r
+\r
+               /* @address_3 */\r
+                /* operand_value = (memory_address_of_instruction + D) modulo 2^16 */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &at_address_3);\r
+               at_address_3 = ( current_address + at_address_3) & 0xffff;\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      @Address %u",\r
+                               operand_address, at_address_3);\r
+               }\r
+               /* execute the instruction\r
+                * If value_1 < value_2 then the UDVM continues instruction execution at\r
+                * the memory address specified by address 1. If value_1 = value_2 then\r
+                * it jumps to the address specified by address_2. If value_1 > value_2\r
+                * then it jumps to the address specified by address_3.\r
+                */\r
+               if ( value_1 < value_2 )\r
+                       current_address = at_address_1;\r
+               if ( value_1 == value_2 )\r
+                       current_address = at_address_2;\r
+               if ( value_1 > value_2 )\r
+                       current_address = at_address_3;\r
+               used_udvm_cycles++;\r
+               goto execute_next_instruction;\r
+               break;\r
+\r
+       case SIGCOMP_INSTR_CALL: /* 24 CALL (@address) (PUSH addr )*/\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## CALL(24) (@address) (PUSH addr )",\r
+                               current_address);\r
+               }\r
+               operand_address = current_address + 1;\r
+               /* @address */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &at_address);\r
+               at_address = ( current_address + at_address) & 0xffff;\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      @Address %u",\r
+                               operand_address, at_address);\r
+                /* operand_value = (memory_address_of_instruction + D) modulo 2^16 */\r
+               }\r
+               used_udvm_cycles++;\r
+               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Execution of this instruction is NOT implemented");\r
+               break;\r
+\r
+       case SIGCOMP_INSTR_RETURN: /* 25 POP and return */\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## POP(25) and return",\r
+                               current_address);\r
+               }\r
+               operand_address = current_address + 1;\r
+               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Execution of this instruction is NOT implemented");\r
+               used_udvm_cycles++;\r
+               break;\r
+\r
+       case SIGCOMP_INSTR_SWITCH: /* 26 SWITCH (#n, %j, @address_0, @address_1, ... , @address_n-1) */\r
+               /*\r
+                * When a SWITCH instruction is encountered the UDVM reads the value of\r
+                * j. It then continues instruction execution at the address specified\r
+                * by address j.\r
+                * \r
+                * Decompression failure occurs if j specifies a value of n or more, or\r
+                * if the address lies beyond the overall UDVM memory size.\r
+                */\r
+               instruction_address = current_address;\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## SWITCH (#n, j, @address_0, @address_1, ... , @address_n-1))",\r
+                               current_address);\r
+               }\r
+               operand_address = current_address + 1;\r
+               /* #n \r
+                * Number of addresses in the instruction\r
+                */\r
+               next_operand_address = decode_udvm_literal_operand(buff,operand_address, &n);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      n %u",\r
+                               operand_address, n);\r
+               }\r
+               operand_address = next_operand_address; \r
+               /* %j */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &j);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      j %u",\r
+                                       operand_address, j);\r
+               }\r
+               operand_address = next_operand_address;\r
+               m = 0;\r
+               while ( m < n ){\r
+                       /* @address_n-1 */\r
+                       /* operand_value = (memory_address_of_instruction + D) modulo 2^16 */\r
+                       next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &at_address_1);\r
+                       at_address_1 = ( instruction_address + at_address_1) & 0xffff;\r
+                       if (print_level_1 ){\r
+                               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      @Address %u",\r
+                                       operand_address, at_address_1);\r
+                       }\r
+                       if ( j == m ){\r
+                               current_address = at_address_1;\r
+                       }\r
+                       operand_address = next_operand_address;\r
+                       m++;\r
+               }\r
+               /* Check decompression failure */\r
+               if ( ( j == n ) || ( j > n )){\r
+                       result_code = 5;\r
+                       goto decompression_failure;\r
+               }\r
+               if ( current_address > UDVM_MEMORY_SIZE ){\r
+                       result_code = 6;\r
+                       goto decompression_failure;\r
+               }\r
+               used_udvm_cycles = used_udvm_cycles + 1 + n;\r
+;\r
+               goto execute_next_instruction;\r
+\r
+               break;\r
+       case SIGCOMP_INSTR_CRC: /* 27 CRC (%value, %position, %length, @address) */\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## CRC (value, position, length, @address)",\r
+                               current_address);\r
+               }\r
+               /* %value */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &value);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Value %u",\r
+                               operand_address, value);\r
+               }\r
+               /* %position */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &position);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      position %u",\r
+                               operand_address, position);\r
+               }\r
+               operand_address = next_operand_address; \r
+\r
+               /* %length */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &length);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Length %u",\r
+                               operand_address, length);\r
+               }\r
+               operand_address = next_operand_address;\r
+\r
+               /* @address */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &at_address);\r
+               at_address = ( current_address + at_address) & 0xffff;\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      @Address %u",\r
+                               operand_address, at_address);\r
+               }\r
+                /* operand_value = (memory_address_of_instruction + D) modulo 2^16 */\r
+               used_udvm_cycles = used_udvm_cycles + 1 + length;\r
+\r
+               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Execution of this instruction is NOT implemented");\r
+               break;\r
+\r
+\r
+       case SIGCOMP_INSTR_INPUT_BYTES: /* 28 INPUT-BYTES (%length, %destination, @address) */\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u ## INPUT-BYTES(28) length, destination, @address)",\r
+                               current_address);\r
+               }\r
+               operand_address = current_address + 1;\r
+               /* %length */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &length);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Length %u",\r
+                               operand_address, length);\r
+               }\r
+               operand_address = next_operand_address;\r
+\r
+               /* %destination */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &destination);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Destination %u",\r
+                               operand_address, destination);\r
+               }\r
+               operand_address = next_operand_address;\r
+\r
+               /* @address */\r
+                /* operand_value = (memory_address_of_instruction + D) modulo 2^16 */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &at_address);\r
+               at_address = ( current_address + at_address) & 0xffff;\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      @Address %u",\r
+                               operand_address, at_address);\r
+               }\r
+               /* execute the instruction TODO insert checks \r
+                * RFC 3320 :\r
+                *\r
+         *    0             7 8            15\r
+         *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+         *   |        byte_copy_left         |  64 - 65\r
+         *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+         *   |        byte_copy_right        |  66 - 67\r
+         *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+         *   |        input_bit_order        |  68 - 69\r
+         *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+         *   |        stack_location         |  70 - 71\r
+         *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+                * \r
+                * Figure 7: Memory addresses of the UDVM registers\r
+                * :\r
+                * 8.4.  Byte copying\r
+                * :\r
+                * The string of bytes is copied in ascending order of memory address,\r
+                * respecting the bounds set by byte_copy_left and byte_copy_right.\r
+                * More precisely, if a byte is copied from/to Address m then the next\r
+                * byte is copied from/to Address n where n is calculated as follows:\r
+                *\r
+                * Set k := m + 1 (modulo 2^16)\r
+                * If k = byte_copy_right then set n := byte_copy_left, else set n := k\r
+                *\r
+                */ \r
+\r
+               n = 0;\r
+               k = destination; \r
+               byte_copy_right = buff[66] << 8;\r
+               byte_copy_right = byte_copy_right | buff[67];\r
+               /* clear out remaining bits if any */\r
+               remaining_bits = 0;\r
+               input_bits=0;\r
+               /* operand_address used as dummy */\r
+               while ( n < length ){\r
+                       if (input_address > ( msg_end - 1)){\r
+                               current_address = at_address;\r
+                               result_code = 14;\r
+                               goto execute_next_instruction;\r
+                       }\r
+\r
+                       if (print_level_1 ){\r
+                               proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,\r
+                                               "               byte_copy_right = %u", byte_copy_right);\r
+                       }\r
+                       if ( k == byte_copy_right ){\r
+                               byte_copy_left = buff[64] << 8;\r
+                               byte_copy_left = byte_copy_left | buff[65];\r
+                               k = byte_copy_left;\r
+                       }\r
+                       octet = tvb_get_guint8(message_tvb, input_address);\r
+                       buff[k] = octet;\r
+                       if (print_level_1 ){\r
+                               proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,\r
+                                       "               Loading value: %u (0x%x) at Addr: %u", octet, octet, k);\r
+                       }\r
+                       input_address++;\r
+                       /*\r
+                        * If the instruction requests data that lies beyond the end of the\r
+                        * SigComp message, no data is returned.  Instead the UDVM moves program\r
+                        * execution to the address specified by the address operand.\r
+                        */\r
+\r
+                       \r
+                       k = ( k + 1 ) & 0xffff;\r
+                       n++;\r
+               }\r
+               used_udvm_cycles = used_udvm_cycles + 1 + length;\r
+               current_address = next_operand_address;\r
+               goto execute_next_instruction;\r
+               break;\r
+       case SIGCOMP_INSTR_INPUT_BITS:/* 29   INPUT-BITS (%length, %destination, @address) */\r
+               /*\r
+                * The length operand indicates the requested number of bits.\r
+                * Decompression failure occurs if this operand does not lie between 0\r
+                * and 16 inclusive.\r
+                * \r
+                * The destination operand specifies the memory address to which the\r
+                * compressed data should be copied.  Note that the requested bits are\r
+                * interpreted as a 2-byte integer ranging from 0 to 2^length - 1, as\r
+                * explained in Section 8.2.\r
+                *\r
+                * If the instruction requests data that lies beyond the end of the\r
+                * SigComp message, no data is returned.  Instead the UDVM moves program\r
+                * execution to the address specified by the address operand.\r
+                */\r
+\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## INPUT-BITS(29) (length, destination, @address)",\r
+                               current_address);\r
+               }\r
+               operand_address = current_address + 1;\r
+\r
+               /* %length */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &length);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      length %u",\r
+                               operand_address, length);\r
+               }\r
+               operand_address = next_operand_address;\r
+               /* %destination */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &destination);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Destination %u",\r
+                               operand_address, destination);\r
+               }\r
+               operand_address = next_operand_address;\r
+\r
+               /* @address */\r
+                /* operand_value = (memory_address_of_instruction + D) modulo 2^16 */\r
+               next_operand_address = decode_udvm_address_operand(buff,operand_address, &at_address, current_address);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      @Address %u",\r
+                               operand_address, at_address);\r
+               }\r
+               current_address = next_operand_address;\r
+\r
+               /*\r
+                * Execute actual instr.\r
+                * The input_bit_order register contains the following three flags:\r
+                * \r
+                *            0             7 8            15\r
+                *           +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+                *           |         reserved        |F|H|P|  68 - 69\r
+                *           +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+                */\r
+               input_bit_order = buff[68] << 8;\r
+               input_bit_order = input_bit_order | buff[69];\r
+               /*\r
+                * If the instruction requests data that lies beyond the end of the\r
+                * SigComp message, no data is returned.  Instead the UDVM moves program\r
+                * execution to the address specified by the address operand.\r
+                */\r
+\r
+               if ((input_address > ( msg_end -1)) && (remaining_bits == 0 )){\r
+                       result_code = 11;\r
+                       current_address = at_address;\r
+                       goto execute_next_instruction;\r
+               }\r
+\r
+               if ( length > 16 ){\r
+                       result_code = 7;\r
+                       goto decompression_failure;\r
+               }\r
+               if ( input_bit_order > 7 ){\r
+                       result_code = 8;\r
+                       goto decompression_failure;\r
+               }\r
+               /* Transfer F bit to bit_order to tell decomp dispatcher which bit order to use */\r
+               bit_order = ( input_bit_order & 0x0004 ) >> 2;\r
+               value = decomp_dispatch_get_bits( message_tvb, udvm_tree, bit_order, \r
+                               buff, &old_input_bit_order, &remaining_bits,\r
+                               &input_bits, &input_address, length, &result_code, msg_end);\r
+               if ( result_code == 11 ){\r
+                       current_address = at_address;\r
+                       goto execute_next_instruction;\r
+               }\r
+               msb = value >> 8;\r
+               lsb = value & 0x00ff;\r
+               buff[destination] = msb;\r
+               buff[destination + 1]=lsb;\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,\r
+                       "               Loading value: %u (0x%x) at Addr: %u, remaining_bits: %u", value, value, destination, remaining_bits);\r
+               }\r
+\r
+               used_udvm_cycles = used_udvm_cycles + 1 + length;\r
+               goto execute_next_instruction;\r
+               break;\r
+       case SIGCOMP_INSTR_INPUT_HUFFMAN: /* 30 */\r
+               /*\r
+                * INPUT-HUFFMAN (%destination, @address, #n, %bits_1, %lower_bound_1,\r
+                *  %upper_bound_1, %uncompressed_1, ... , %bits_n, %lower_bound_n,\r
+                *  %upper_bound_n, %uncompressed_n)\r
+                */\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## INPUT-HUFFMAN (destination, @address, #n, bits_1, lower_bound_1,upper_bound_1, uncompressed_1, ... , bits_n, lower_bound_n,upper_bound_n, uncompressed_n)",\r
+                               current_address);\r
+               }\r
+               operand_address = current_address + 1;\r
+\r
+               /* %destination */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &destination);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      Destination %u",\r
+                               operand_address, destination);\r
+               }\r
+               operand_address = next_operand_address;\r
+\r
+               /* @address */\r
+                /* operand_value = (memory_address_of_instruction + D) modulo 2^16 */\r
+               next_operand_address = decode_udvm_address_operand(buff,operand_address, &at_address, current_address);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      @Address %u",\r
+                               operand_address, at_address);\r
+               }\r
+               operand_address = next_operand_address;\r
+\r
+               /* #n */\r
+               next_operand_address = decode_udvm_literal_operand(buff,operand_address, &n);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      n %u",\r
+                               operand_address, n);\r
+               }\r
+               operand_address = next_operand_address; \r
+               /*\r
+                * Note that if n = 0 then the INPUT-HUFFMAN instruction is ignored and\r
+                * program execution resumes at the following instruction.\r
+                * Decompression failure occurs if (bits_1 + ... + bits_n) > 16.\r
+                * \r
+                * In all other cases, the behavior of the INPUT-HUFFMAN instruction is\r
+                * defined below:\r
+                * \r
+                * 1. Set j := 1 and set H := 0.\r
+                * \r
+                * 2. Request bits_j compressed bits.  Interpret the returned bits as an\r
+                * integer k from 0 to 2^bits_j - 1, as explained in Section 8.2.\r
+                * \r
+                * 3. Set H := H * 2^bits_j + k.\r
+                * \r
+                * 4. If data is requested that lies beyond the end of the SigComp\r
+                * message, terminate the INPUT-HUFFMAN instruction and move program\r
+                * execution to the memory address specified by the address operand.\r
+                * \r
+                * 5. If (H < lower_bound_j) or (H > upper_bound_j) then set j := j + 1.\r
+                * Then go back to Step 2, unless j > n in which case decompression\r
+                * failure occurs.\r
+                * \r
+                * 6. Copy (H + uncompressed_j - lower_bound_j) modulo 2^16 to the\r
+                * memory address specified by the destination operand.\r
+                * \r
+                */\r
+               /*\r
+                * The input_bit_order register contains the following three flags:\r
+                * \r
+                *            0             7 8            15\r
+                *           +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+                *           |         reserved        |F|H|P|  68 - 69\r
+                *           +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\r
+                *\r
+                * Transfer H bit to bit_order to tell decomp dispatcher which bit order to use \r
+                */\r
+               input_bit_order = buff[68] << 8;\r
+               input_bit_order = input_bit_order | buff[69];\r
+               bit_order = ( input_bit_order & 0x0002 ) >> 1;\r
+\r
+               j = 1;\r
+               H = 0;\r
+               m = n;\r
+               outside_huffman_boundaries = TRUE;\r
+               print_in_loop = print_level_1;\r
+               while ( m > 0 ){\r
+                       /* %bits_n */\r
+                       next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &bits_n);\r
+                       if (print_in_loop ){\r
+                               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      bits_n %u",\r
+                                       operand_address, bits_n);\r
+                       }\r
+                       operand_address = next_operand_address; \r
+\r
+                       /* %lower_bound_n */\r
+                       next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &lower_bound_n);\r
+                       if (print_in_loop ){\r
+                               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      lower_bound_n %u",\r
+                                       operand_address, lower_bound_n);\r
+                       }\r
+                       operand_address = next_operand_address; \r
+                       /* %upper_bound_n */\r
+                       next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &upper_bound_n);\r
+                       if (print_in_loop ){\r
+                               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      upper_bound_n %u",\r
+                                       operand_address, upper_bound_n);\r
+                       }\r
+                       operand_address = next_operand_address; \r
+                       /* %uncompressed_n */\r
+                       next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &uncompressed_n);\r
+                       if (print_in_loop ){\r
+                               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      uncompressed_n %u",\r
+                                       operand_address, uncompressed_n);\r
+                       }\r
+                       operand_address = next_operand_address;\r
+                       /* execute instruction */\r
+                       if ( outside_huffman_boundaries ) {\r
+                               /*\r
+                                * 3. Set H := H * 2^bits_j + k.\r
+                                */\r
+                               k = decomp_dispatch_get_bits( message_tvb, udvm_tree, bit_order, \r
+                                               buff, &old_input_bit_order, &remaining_bits,\r
+                                               &input_bits, &input_address, bits_n, &result_code, msg_end);\r
+                               if ( result_code == 11 ){\r
+                                       current_address = at_address;\r
+                                       goto execute_next_instruction;\r
+                               }\r
+                               /* ldexp Returns x multiplied by 2 raised to the power of exponent.\r
+                                * x*2^exponent\r
+                                */\r
+                               oldH = H;\r
+                               H = ( (guint16)ldexp( H, bits_n) + k );\r
+                               if (print_level_3 ){\r
+                                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"               Set H(%u) := H(%u) * 2^bits_j(%u) + k(%u)",\r
+                                                H ,oldH,((guint16)pow(2,bits_n)),k);\r
+                               }\r
+\r
+                               /*\r
+                                * 4. If data is requested that lies beyond the end of the SigComp\r
+                                * message, terminate the INPUT-HUFFMAN instruction and move program\r
+                                * execution to the memory address specified by the address operand.\r
+                                */\r
+                               if ( input_address > msg_end ){\r
+                                       current_address = at_address;\r
+                                       goto execute_next_instruction;\r
+                               }\r
+                               /*\r
+                                * 5. If (H < lower_bound_j) or (H > upper_bound_j) then set j := j + 1.\r
+                                * Then go back to Step 2, unless j > n in which case decompression\r
+                                * failure occurs.\r
+                                */\r
+                               if ((H < lower_bound_n) || (H > upper_bound_n)){\r
+                                       outside_huffman_boundaries = TRUE;\r
+                               }else{\r
+                                       outside_huffman_boundaries = FALSE;\r
+                                       print_in_loop = FALSE;\r
+                                       /*\r
+                                        * 6. Copy (H + uncompressed_j - lower_bound_j) modulo 2^16 to the\r
+                                        * memory address specified by the destination operand.\r
+                                        */\r
+                                       if (print_level_2 ){\r
+                                               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                                                       "               H(%u) = H(%u) + uncompressed_n(%u) - lower_bound_n(%u)",\r
+                                               (H + uncompressed_n - lower_bound_n ),H, uncompressed_n, lower_bound_n);\r
+                                       }\r
+                                       H = H + uncompressed_n - lower_bound_n;\r
+                                       msb = H >> 8;\r
+                                       lsb = H & 0x00ff;\r
+                                       buff[destination] = msb;\r
+                                       buff[destination + 1]=lsb;\r
+                                       if (print_level_1 ){\r
+                                               proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,\r
+                                       "               Loading H: %u (0x%x) at Addr: %u,j = %u remaining_bits: %u", \r
+                                               H, H, destination,( n - m + 1 ), remaining_bits);\r
+                                       }\r
+                                       \r
+                               }\r
+\r
+\r
+                       }\r
+                       m = m - 1;\r
+               }\r
+               if ( outside_huffman_boundaries ) {\r
+                       result_code = 10;\r
+                       goto decompression_failure;\r
+               }\r
+\r
+               current_address = next_operand_address;\r
+               used_udvm_cycles = used_udvm_cycles + 1 + n;\r
+               goto execute_next_instruction;\r
+               break;\r
+\r
+       case SIGCOMP_INSTR_STATE_ACCESS: /* 31 */\r
+               /*   STATE-ACCESS (%partial_identifier_start, %partial_identifier_length,\r
+                * %state_begin, %state_length, %state_address, %state_instruction)\r
+                */\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## STATE-ACCESS(31) (partial_identifier_start, partial_identifier_length,state_begin, state_length, state_address, state_instruction)",\r
+                               current_address);\r
+               }\r
+               operand_address = current_address + 1;\r
+\r
+               /* \r
+                * %partial_identifier_start\r
+                */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &p_id_start);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u       partial_identifier_start %u",\r
+                               operand_address, p_id_start);\r
+               }\r
+               operand_address = next_operand_address;\r
+\r
+               /*\r
+                * %partial_identifier_length\r
+                */\r
+               operand_address = next_operand_address;\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &p_id_length);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u       partial_identifier_length %u",\r
+                               operand_address, p_id_length);\r
+               }\r
+               /*\r
+                * %state_begin\r
+                */\r
+               operand_address = next_operand_address;\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &state_begin);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u       state_begin %u",\r
+                               operand_address, state_begin);\r
+               }\r
+               /*\r
+                * %state_length\r
+                */\r
+               operand_address = next_operand_address;\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &state_length);             if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u       state_length %u",\r
+                               operand_address, state_length);\r
+               }\r
+               /*\r
+                * %state_address\r
+                */\r
+               operand_address = next_operand_address;\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &state_address);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u       state_address %u",\r
+                               operand_address, state_address);\r
+               }\r
+               /*\r
+                * %state_instruction\r
+                */\r
+               operand_address = next_operand_address;\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &state_instruction);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u       state_instruction %u",\r
+                               operand_address, state_instruction);\r
+               }\r
+               current_address = next_operand_address;\r
+               byte_copy_right = buff[66] << 8;\r
+               byte_copy_right = byte_copy_right | buff[67];\r
+               byte_copy_left = buff[64] << 8;\r
+               byte_copy_left = byte_copy_left | buff[65];\r
+               if (print_level_2 ){\r
+                       proto_tree_add_text(udvm_tree, message_tvb, input_address, 1,\r
+                                       "               byte_copy_right = %u, byte_copy_left = %u", byte_copy_right,byte_copy_left);\r
+               }\r
+\r
+               result_code = udvm_state_access(message_tvb, udvm_tree, buff, p_id_start, p_id_length, state_begin, &state_length, \r
+                       &state_address, state_instruction, TRUE);\r
+               if ( result_code != 0 ){\r
+                       goto decompression_failure; \r
+               }\r
+               used_udvm_cycles = used_udvm_cycles + 1 + state_length;\r
+               goto execute_next_instruction;\r
+               break;\r
+       case SIGCOMP_INSTR_STATE_CREATE: /* 32 */\r
+               /*\r
+                * STATE-CREATE (%state_length, %state_address, %state_instruction,\r
+                * %minimum_access_length, %state_retention_priority)\r
+                */\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## STATE-CREATE(32) (state_length, state_address, state_instruction,minimum_access_length, state_retention_priority)",\r
+                               current_address);\r
+               }\r
+               operand_address = current_address + 1;\r
+\r
+               /*\r
+                * %state_length\r
+                */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &state_length);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u       state_length %u",\r
+                               operand_address, state_length);\r
+               }\r
+               /*\r
+                * %state_address\r
+                */\r
+               operand_address = next_operand_address;\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &state_address);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u       state_address %u",\r
+                               operand_address, state_address);\r
+               }\r
+               /*\r
+                * %state_instruction\r
+                */\r
+               operand_address = next_operand_address;\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &state_instruction);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u       state_instruction %u",\r
+                               operand_address, state_instruction);\r
+               }\r
+               operand_address = next_operand_address;\r
+               /*\r
+                * %minimum_access_length\r
+                */\r
+               operand_address = next_operand_address;\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &minimum_access_length);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u       minimum_access_length %u",\r
+                               operand_address, minimum_access_length);\r
+               }\r
+               operand_address = next_operand_address;\r
+               /*\r
+                * %state_retention_priority\r
+                */\r
+               operand_address = next_operand_address;\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &state_retention_priority);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u       state_retention_priority %u",\r
+                               operand_address, state_retention_priority);\r
+               }\r
+               current_address = next_operand_address;\r
+               /* Execute the instruction\r
+                * TODO Implement the instruction\r
+                * RFC3320:\r
+                *    Note that the new state item cannot be created until a valid\r
+                *    compartment identifier has been returned by the application.\r
+                *    Consequently, when a STATE-CREATE instruction is encountered the UDVM\r
+                *    simply buffers the five supplied operands until the END-MESSAGE\r
+                *    instruction is reached.  The steps taken at this point are described\r
+                *    in Section 9.4.9.\r
+                *\r
+                *   Decompression failure MUST occur if more than four state creation\r
+                *   requests are made before the END-MESSAGE instruction is encountered.\r
+                *   Decompression failure also occurs if the minimum_access_length does\r
+                *   not lie between 6 and 20 inclusive, or if the\r
+                *   state_retention_priority is 65535.\r
+                */\r
+               no_of_state_create++;\r
+               if ( no_of_state_create > 4 ){\r
+                       result_code = 12;\r
+                       goto decompression_failure; \r
+               }\r
+               if (( minimum_access_length < 6 ) || ( minimum_access_length > 20 )){\r
+                       result_code = 1;\r
+                       goto decompression_failure; \r
+               }\r
+               if ( state_retention_priority == 65535 ){\r
+                       result_code = 13;\r
+                       goto decompression_failure; \r
+               }\r
+               state_length_buff[no_of_state_create] = state_length;\r
+               state_address_buff[no_of_state_create] = state_address;\r
+               state_instruction_buff[no_of_state_create] = state_instruction;\r
+               state_minimum_access_length_buff[no_of_state_create] = minimum_access_length;\r
+               state_state_retention_priority_buff[no_of_state_create] = state_retention_priority;\r
+               used_udvm_cycles = used_udvm_cycles + 1 + state_length;\r
+               /* Debug */\r
+               byte_copy_right = buff[66] << 8;\r
+               byte_copy_right = byte_copy_right | buff[67];\r
+               n = 0;\r
+               k = state_address;\r
+               while ( n < state_length ){\r
+                       if ( k == byte_copy_right ){\r
+                               byte_copy_left = buff[64] << 8;\r
+                               byte_copy_left = byte_copy_left | buff[65];\r
+                               k = byte_copy_left;\r
+                       }\r
+                       string[0]= buff[k];\r
+                       string[1]= '\0';\r
+                       if (print_level_3 ){\r
+                               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                                       "               Addr: %5u State value: %u (0x%x) ASCII(%s)",\r
+                                       k,buff[k],buff[k],string);\r
+                       }\r
+                       k = ( k + 1 ) & 0xffff;\r
+                       n++;\r
+               }\r
+               /* End debug */\r
+\r
+               goto execute_next_instruction;\r
+               break;\r
+       case SIGCOMP_INSTR_STATE_FREE: /* 33 */\r
+               /*\r
+                * STATE-FREE (%partial_identifier_start, %partial_identifier_length)\r
+                */\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## STATE-FREE (partial_identifier_start, partial_identifier_length)",\r
+                               current_address);\r
+               }\r
+               operand_address = current_address + 1;\r
+               /* \r
+                * %partial_identifier_start\r
+                */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &p_id_start);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u       partial_identifier_start %u",\r
+                               operand_address, p_id_start);\r
+               }\r
+               operand_address = next_operand_address;\r
+\r
+               /*\r
+                * %partial_identifier_length\r
+                */\r
+               operand_address = next_operand_address;\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &p_id_length);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u       partial_identifier_length %u",\r
+                               operand_address, p_id_length);\r
+               }\r
+               current_address = next_operand_address;\r
+\r
+               /* Execute the instruction:\r
+                * TODO implement it\r
                 */\r
                udvm_state_free(buff,p_id_start,p_id_length);\r
                used_udvm_cycles++;\r
-
+\r
+               goto execute_next_instruction;\r
+               break;\r
+       case SIGCOMP_INSTR_OUTPUT: /* 34 OUTPUT (%output_start, %output_length) */\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## OUTPUT(34) (output_start, output_length)",\r
+                               current_address);\r
+               }\r
+               operand_address = current_address + 1;\r
+               /* \r
+                * %output_start\r
+                */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &output_start);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      output_start %u",\r
+                               operand_address, output_start);\r
+               }\r
+               operand_address = next_operand_address;\r
+               /* \r
+                * %output_length\r
+                */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &output_length);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      output_length %u",\r
+                               operand_address, output_length);\r
+               }\r
+               current_address = next_operand_address;\r
+\r
+               /* \r
+                * Execute instruction \r
+                * 8.4.  Byte copying\r
+                * :\r
+                * The string of bytes is copied in ascending order of memory address,\r
+                * respecting the bounds set by byte_copy_left and byte_copy_right.\r
+                * More precisely, if a byte is copied from/to Address m then the next\r
+                * byte is copied from/to Address n where n is calculated as follows:\r
+                *\r
+                * Set k := m + 1 (modulo 2^16)\r
+                * If k = byte_copy_right then set n := byte_copy_left, else set n := k\r
+                *\r
+                */ \r
+\r
+               n = 0;\r
+               k = output_start; \r
+               byte_copy_right = buff[66] << 8;\r
+               byte_copy_right = byte_copy_right | buff[67];\r
+               if (print_level_3 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                                       "               byte_copy_right = %u", byte_copy_right);\r
+               }\r
+               while ( n < output_length ){\r
+\r
+                       if ( k == byte_copy_right ){\r
+                               byte_copy_left = buff[64] << 8;\r
+                               byte_copy_left = byte_copy_left | buff[65];\r
+                               k = byte_copy_left;\r
+                               if (print_level_3 ){\r
+                                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                                                       "               byte_copy_right = %u", byte_copy_right);\r
+                               }\r
+                       }\r
+                       out_buff[output_address] = buff[k];\r
+                       string[0]= buff[k];\r
+                       string[1]= '\0';\r
+                       if (print_level_3 ){\r
+                               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                                       "               Output value: %u (0x%x) ASCII(%s) from Addr: %u ,output to dispatcher position %u",\r
+                                       buff[k],buff[k],string, k,output_address);\r
+                       }\r
+                       k = ( k + 1 ) & 0xffff;\r
+                       output_address ++;\r
+                       n++;\r
+               }\r
+               used_udvm_cycles = used_udvm_cycles + 1 + output_length;\r
                goto execute_next_instruction;\r
-               break;
-       case SIGCOMP_INSTR_OUTPUT: /* 34 OUTPUT (%output_start, %output_length) */
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## OUTPUT(34) (output_start, output_length)",
-                               current_address);
-               }
-               operand_address = current_address + 1;
-               /* 
-                * %output_start
-                */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &output_start);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      output_start %u",
-                               operand_address, output_start);
-               }
-               operand_address = next_operand_address;
-               /* 
-                * %output_length
-                */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &output_length);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      output_length %u",
-                               operand_address, output_length);
-               }
-               current_address = next_operand_address;
-
-               /* 
-                * Execute instruction 
-                * 8.4.  Byte copying
-                * :
-                * The string of bytes is copied in ascending order of memory address,
-                * respecting the bounds set by byte_copy_left and byte_copy_right.
-                * More precisely, if a byte is copied from/to Address m then the next
-                * byte is copied from/to Address n where n is calculated as follows:
-                *
-                * Set k := m + 1 (modulo 2^16)
-                * If k = byte_copy_right then set n := byte_copy_left, else set n := k
-                *
-                */ 
-
-               n = 0;
-               k = output_start; 
-               byte_copy_right = buff[66] << 8;
-               byte_copy_right = byte_copy_right | buff[67];
-               if (print_level_3 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                                       "               byte_copy_right = %u", byte_copy_right);
-               }
-               while ( n < output_length ){
-
-                       if ( k == byte_copy_right ){
-                               byte_copy_left = buff[64] << 8;
-                               byte_copy_left = byte_copy_left | buff[65];
-                               k = byte_copy_left;
-                               if (print_level_3 ){
-                                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                                                       "               byte_copy_right = %u", byte_copy_right);
-                               }
-                       }
-                       out_buff[output_address] = buff[k];
-                       string[0]= buff[k];
-                       string[1]= '\0';
-                       if (print_level_3 ){
-                               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                                       "               Output value: %u (0x%x) ASCII(%s) from Addr: %u ,output to dispatcher position %u",
-                                       buff[k],buff[k],string, k,output_address);
-                       }
-                       k = ( k + 1 ) & 0xffff;
-                       output_address ++;
-                       n++;
-               }
-               used_udvm_cycles = used_udvm_cycles + 1 + output_length;
-               goto execute_next_instruction;
-               break;
-       case SIGCOMP_INSTR_END_MESSAGE: /* 35 */
-               /*
-                * END-MESSAGE (%requested_feedback_location,
-                * %returned_parameters_location, %state_length, %state_address,
-                * %state_instruction, %minimum_access_length,
-                * %state_retention_priority)
-                */
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,
-                               "Addr: %u ## END-MESSAGE (requested_feedback_location,state_instruction, minimum_access_length,state_retention_priority)",
-                               current_address);
-               }
-               operand_address = current_address + 1;
-
-               /* %requested_feedback_location */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &requested_feedback_location);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      requested_feedback_location %u",
-                               operand_address, requested_feedback_location);
-               }
-               operand_address = next_operand_address;
-               /* returned_parameters_location */
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &returned_parameters_location);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      returned_parameters_location %u",
-                               operand_address, returned_parameters_location);
-               }
-               operand_address = next_operand_address;
-               /*
-                * %state_length
-                */
-               operand_address = next_operand_address;
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &state_length);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      state_length %u",
-                               operand_address, state_length);
-               }
-               /*
-                * %state_address
-                */
-               operand_address = next_operand_address;
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &state_address);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      state_address %u",
-                               operand_address, state_address);
-               }
-               /*
-                * %state_instruction
-                */
-               operand_address = next_operand_address;
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &state_instruction);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      state_instruction %u",
-                               operand_address, state_instruction);
-               }
-               operand_address = next_operand_address;
-               /*
-                * %minimum_access_length
-                */
-               operand_address = next_operand_address;
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &minimum_access_length);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      minimum_access_length %u",
-                               operand_address, minimum_access_length);
-               }
-               operand_address = next_operand_address;
-
-               /*
-                * %state_retention_priority
-                */
-               operand_address = next_operand_address;
-               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &state_retention_priority);
-               if (print_level_1 ){
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      state_retention_priority %u",
-                               operand_address, state_retention_priority);
-               }
-               current_address = next_operand_address;
-               /* TODO: This isn't currently totaly correct as END_INSTRUCTION might not create state */
-               no_of_state_create++;
-               if ( no_of_state_create > 4 ){
-                       result_code = 12;
-                       goto decompression_failure; 
-               }
-               state_length_buff[no_of_state_create] = state_length;
-               state_address_buff[no_of_state_create] = state_address;
-               state_instruction_buff[no_of_state_create] = state_instruction;
-               /* Not used ? */
-               state_minimum_access_length_buff[no_of_state_create] = minimum_access_length;
-               state_state_retention_priority_buff[no_of_state_create] = state_retention_priority;
-               
-               /* Execute the instruction
-                */
-               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"no_of_state_create %u",no_of_state_create);
-               if ( no_of_state_create != 0 ){
-                       for( x=0; x < 20; x++){
-                               sha1_digest_buf[x]=0;
-                       }
-                       n = 1;
-                       byte_copy_right = buff[66] << 8;
-                       byte_copy_right = byte_copy_right | buff[67];
-                       while ( n < no_of_state_create + 1 ){
-                               sha1buff = g_malloc(state_length_buff[n]+8);
-                               sha1buff[0] = state_length_buff[n] >> 8;
-                               sha1buff[1] = state_length_buff[n] & 0xff;
-                               sha1buff[2] = state_address_buff[n] >> 8;
-                               sha1buff[3] = state_address_buff[n] & 0xff;
-                               sha1buff[4] = state_instruction_buff[n] >> 8;
-                               sha1buff[5] = state_instruction_buff[n] & 0xff; 
-                               sha1buff[6] = state_minimum_access_length_buff[n] >> 8;
-                               sha1buff[7] = state_minimum_access_length_buff[n] & 0xff;
-                               if (print_level_3 ){
-                                       for( x=0; x < 8; x++){
-                                               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"sha1buff %u 0x%x",
-                                                       x,sha1buff[x]);
-                                       }
-                               }
-                               k = state_address_buff[n];
-                               for( x=0; x < state_length_buff[n]; x++)
-                                       {
-                                       if ( k == byte_copy_right ){
-                                               byte_copy_left = buff[64] << 8;
-                                               byte_copy_left = byte_copy_left | buff[65];
-                                               k = byte_copy_left;
-                                       }
-                                       sha1buff[8+x] = buff[k];
-                                       k = ( k + 1 ) & 0xffff;
-                                       }
-
-                               sha1_starts( &ctx );
-                               sha1_update( &ctx, (guint8 *) sha1buff, state_length_buff[n] + 8);
-                               sha1_finish( &ctx, sha1_digest_buf );
-                               if (print_level_3 ){
-                               for( x=0; x < 20; x++){
-                                               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"SHA1 digest byte %u 0x%x",
-                                                       x,sha1_digest_buf[x]);
-                                       }
-                               }
-                               udvm_state_create(sha1buff, sha1_digest_buf, state_minimum_access_length_buff[n]);
-                               n++;
-
-                       }
-               }
-
-
-
-               /* At least something got decompressed, show it */
-               decomp_tvb = tvb_new_real_data(out_buff,output_address,output_address);
-               tvb_set_child_real_data_tvbuff(message_tvb,decomp_tvb);
-               add_new_data_source(pinfo, decomp_tvb, "Decompressed SigComp message");
-               /*
-               proto_tree_add_text(udvm_tree, decomp_tvb, 0, -1,"SigComp message Decompressed");
-               */      
-               used_udvm_cycles = used_udvm_cycles + 1 + state_length;
-               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"maximum_UDVM_cycles %u used_udvm_cycles %u",
-                       maximum_UDVM_cycles, used_udvm_cycles);
-               return decomp_tvb;
-               break;
-
-       default:
-           proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1," ### Addr %u Invalid instruction: %u (0x%x)",
-                       current_address,current_instruction,current_instruction);
-               break;
-               }
-       return NULL;
-decompression_failure:
-               
-                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"DECOMPRESSION FAILURE: %s",
-                                           val_to_str(result_code, result_code_vals,"Unknown (%u)"));
-       return NULL;
-
-
-
-}
-       
- /*  The simplest operand type is the literal (#), which encodes a
-  * constant integer from 0 to 65535 inclusive.  A literal operand may
-  * require between 1 and 3 bytes depending on its value.
-  * Bytecode:                       Operand value:      Range:
-  * 0nnnnnnn                        N                   0 - 127
-  * 10nnnnnn nnnnnnnn               N                   0 - 16383
-  * 11000000 nnnnnnnn nnnnnnnn      N                   0 - 65535
-  *
-  *            Figure 8: Bytecode for a literal (#) operand
-  *
-  */
-static int
-decode_udvm_literal_operand(guint8 buff[],guint operand_address, guint16 *value) 
-{
-       guint   bytecode;
-       guint16 operand;
-       guint   test_bits;
-       guint   offset = operand_address;
-       guint8  temp_data;
-
-       bytecode = buff[operand_address];
-       test_bits = bytecode >> 7;
-       if (test_bits == 1){
-               test_bits = bytecode >> 6;
-               if (test_bits == 2){
-                       /*
-                        * 10nnnnnn nnnnnnnn               N                   0 - 16383
-                        */
-                       temp_data = buff[operand_address] & 0x1f;
-                       operand = temp_data << 8;
-                       temp_data = buff[operand_address + 1];
-                       operand = operand | temp_data;
-                       *value = operand;
-                       offset = offset + 2;
-
-               }else{
-                       /*
-                        * 111000000 nnnnnnnn nnnnnnnn      N                   0 - 65535
-                        */
-                       offset ++;
-                       temp_data = buff[operand_address] & 0x1f;
-                       operand = temp_data << 8;
-                       temp_data = buff[operand_address + 1];
-                       operand = operand | temp_data;
-                       *value = operand;
-                       offset = offset + 2;
-
-               }
-       }else{
-               /*
-                * 0nnnnnnn                        N                   0 - 127
-                */
-               operand = ( bytecode & 0x7f);
-               *value = operand;
-               offset ++;
-       }
-
-       return offset;
-
-}
-
-/*
- * The second operand type is the reference ($), which is always used to
- * access a 2-byte value located elsewhere in the UDVM memory.  The
- * bytecode for a reference operand is decoded to be a constant integer
- * from 0 to 65535 inclusive, which is interpreted as the memory address
- * containing the actual value of the operand.
- * Bytecode:                       Operand value:      Range:
- *
- * 0nnnnnnn                        memory[2 * N]       0 - 65535
- * 10nnnnnn nnnnnnnn               memory[2 * N]       0 - 65535
- * 11000000 nnnnnnnn nnnnnnnn      memory[N]           0 - 65535
- *
- *            Figure 9: Bytecode for a reference ($) operand
- */
-static int
-dissect_udvm_reference_operand(guint8 buff[],guint operand_address, guint16 *value,guint *result_dest) 
-{
-       guint bytecode;
-       guint16 operand;
-       guint   offset = operand_address;
-       guint test_bits;
-       guint8  temp_data;
-       guint16 temp_data16;
-
-       bytecode = buff[operand_address];
-       test_bits = bytecode >> 7;
-       if (test_bits == 1){
-               test_bits = bytecode >> 6;
-               if (test_bits == 2){
-                       /*
-                        * 10nnnnnn nnnnnnnn               memory[2 * N]       0 - 65535
-                        */
-                       temp_data = buff[operand_address] & 0x3f;
-                       operand = temp_data << 8;
-                       temp_data = buff[operand_address + 1];
-                       operand = operand | temp_data;
-                       operand = (operand * 2);
-                       *result_dest = operand;
-                       temp_data16 = buff[operand] << 8;
-                       temp_data16 = temp_data16 | buff[operand+1];
-                       *value = temp_data16;
-                       offset = offset + 2;
-
-               }else{
-                       /*
-                        * 11000000 nnnnnnnn nnnnnnnn      memory[N]           0 - 65535
-                        */
-                       operand_address++;
-                       operand = buff[operand_address] << 8;
-                       operand = operand | buff[operand_address + 1];
-                       *result_dest = operand;
-                       temp_data16 = buff[operand] << 8;
-                       temp_data16 = temp_data16 | buff[operand+1];
-                       *value = temp_data16;
-                       offset = offset + 3;
-
-               }
-       }else{
-               /*
-                * 0nnnnnnn                        memory[2 * N]       0 - 65535
-                */
-               operand = ( bytecode & 0x7f);
-               operand = (operand * 2);
-               *result_dest = operand;
-               temp_data16 = buff[operand] << 8;
-               temp_data16 = temp_data16 | buff[operand+1];
-               *value = temp_data16;
-               offset ++;
-       }
-
-       return offset;
-}
-
-       /* RFC3320
-        * Figure 10: Bytecode for a multitype (%) operand
-        * Bytecode:                       Operand value:      Range:               HEX val
-        * 00nnnnnn                        N                   0 - 63                           0x00
-        * 01nnnnnn                        memory[2 * N]       0 - 65535                        0x40
-        * 1000011n                        2 ^ (N + 6)        64 , 128                          0x86    
-        * 10001nnn                        2 ^ (N + 8)    256 , ... , 32768                     0x88
-        * 111nnnnn                        N + 65504       65504 - 65535                        0xe0
-        * 1001nnnn nnnnnnnn               N + 61440       61440 - 65535                        0x90
-        * 101nnnnn nnnnnnnn               N                   0 - 8191                         0xa0
-        * 110nnnnn nnnnnnnn               memory[N]           0 - 65535                        0xc0
-        * 10000000 nnnnnnnn nnnnnnnn      N                   0 - 65535                        0x80
-        * 10000001 nnnnnnnn nnnnnnnn      memory[N]           0 - 65535                        0x81
-        */
-static int
-decode_udvm_multitype_operand(guint8 buff[],guint operand_address, guint16 *value)
-{
-       guint test_bits;
-       guint bytecode;
-       guint offset = operand_address;
-       guint16 operand;
-       guint32 result;
-       guint8 temp_data;
-       guint16 temp_data16;
-       guint16 memmory_addr = 0;
-
-       bytecode = buff[operand_address];
-       test_bits = ( bytecode & 0xc0 ) >> 6;
-       switch (test_bits ){
-       case 0:
-               /*  
-                * 00nnnnnn                        N                   0 - 63
-                */
-               operand =  buff[operand_address];
-               /* debug
-                *g_warning("Reading 0x%x From address %u",operand,offset);
-                */
-               *value = operand;
-               offset ++;
-               break;
-       case 1:
-               /*  
-                * 01nnnnnn                        memory[2 * N]       0 - 65535
-                */
-               memmory_addr = ( bytecode & 0x3f) * 2;
-               temp_data16 = buff[memmory_addr] << 8;
-               temp_data16 = temp_data16 | buff[memmory_addr+1];
-               *value = temp_data16;
-               offset ++;
-               break;
-       case 2:
-               /* Check tree most significant bits */
-               test_bits = ( bytecode & 0xe0 ) >> 5;
-               if ( test_bits == 5 ){
-               /*
-                * 101nnnnn nnnnnnnn               N                   0 - 8191
-                */
-                       temp_data = buff[operand_address] & 0x1f;
-                       operand = temp_data << 8;
-                       temp_data = buff[operand_address + 1];
-                       operand = operand | temp_data;
-                       *value = operand;
-                       offset = offset + 2;
-               }else{
-                       test_bits = ( bytecode & 0xf0 ) >> 4;
-                       if ( test_bits == 9 ){
-               /*
-                * 1001nnnn nnnnnnnn               N + 61440       61440 - 65535
-                */
-                               temp_data = buff[operand_address] & 0x0f;
-                               operand = temp_data << 8;
-                               temp_data = buff[operand_address + 1];
-                               operand = operand | temp_data;
-                               operand = operand + 61440;
-                               *value = operand;
-                               offset = offset + 2;
-                       }else{
-                               test_bits = ( bytecode & 0x08 ) >> 3;
-                               if ( test_bits == 1){
-               /*
-                * 10001nnn                        2 ^ (N + 8)    256 , ... , 32768
-                */
-
-                                       result = (guint32)pow(2,( buff[operand_address] & 0x07) + 8);
-                                       operand = result & 0xffff;
-                                       *value = operand;
-                                       offset ++;
-                               }else{
-                                       test_bits = ( bytecode & 0x0e ) >> 1;
-                                       if ( test_bits == 3 ){
-                                               /*
-                                                * 1000 011n                        2 ^ (N + 6)        64 , 128
-                                                */
-                                               result = (guint32)pow(2,( buff[operand_address] & 0x01) + 6);
-                                               operand = result & 0xffff;
-                                               *value = operand;
-                                               offset ++;
-                                       }else{
-                                       /*
-                                        * 1000 0000 nnnnnnnn nnnnnnnn      N                   0 - 65535
-                                        * 1000 0001 nnnnnnnn nnnnnnnn      memory[N]           0 - 65535
-                                        */
-                                               offset ++;
-                                               temp_data16 = buff[operand_address + 1] << 8;
-                                               temp_data16 = temp_data16 | buff[operand_address + 2];
-                                               /*  debug
-                                                * g_warning("Reading 0x%x From address %u",temp_data16,operand_address);
-                                                */
-                                               if ( (bytecode & 0x01) == 1 ){
-                                                       memmory_addr = temp_data16;
-                                                       temp_data16 = buff[memmory_addr] << 8;
-                                                       temp_data16 = temp_data16 | buff[memmory_addr+1];
-                                               }
-                                               *value = temp_data16;
-                                               offset = offset +2;
-                                       }
-
-
-                               }
-                       }
-               }
-               break;
-
-       case 3:
-               test_bits = ( bytecode & 0x20 ) >> 5;
-               if ( test_bits == 1 ){
-               /*
-                * 111nnnnn                        N + 65504       65504 - 65535
-                */
-                       operand = ( buff[operand_address] & 0x1f) + 65504;
-                       *value = operand;
-                       offset ++;
-               }else{
-               /*
-                * 110nnnnn nnnnnnnn               memory[N]           0 - 65535
-                */
-                       memmory_addr = buff[operand_address] & 0x1f;
-                       memmory_addr = memmory_addr << 8;
-                       memmory_addr = memmory_addr | buff[operand_address + 1];
-                       temp_data16 = buff[memmory_addr] << 8;
-                       temp_data16 = temp_data16 | buff[memmory_addr+1];
-                       *value = temp_data16;
-                       /*  debug 
-                        * g_warning("Reading 0x%x From address %u",temp_data16,memmory_addr);
-                        */
-                       offset = offset +2;
-               }
-                       
-       default :
-               break;
-       }
-       return offset;
-}
-       /*
-        *
-        * The fourth operand type is the address (@).  This operand is decoded
-        * as a multitype operand followed by a further step: the memory address
-        * of the UDVM instruction containing the address operand is added to
-        * obtain the correct operand value.  So if the operand value from
-        * Figure 10 is D then the actual operand value of an address is
-        * calculated as follows:
-        *
-        * operand_value = (memory_address_of_instruction + D) modulo 2^16
-        *
-        * Address operands are always used in instructions that control program
-        * flow, because they ensure that the UDVM bytecode is position-
-        * independent code (i.e., it will run independently of where it is
-        * placed in the UDVM memory).
-        */
-static int
-decode_udvm_address_operand(guint8 buff[],guint operand_address, guint16 *value,guint current_address)
-{
-       guint32 result;
-       guint16 value1;
-       guint next_opreand_address;
-
-       next_opreand_address = decode_udvm_multitype_operand(buff, operand_address, &value1);
-       result = value1 & 0xffff;
-       result = result + current_address;
-       *value = result & 0xffff;
-       return next_opreand_address;
-}
-
-static int
-decomp_dispatch_get_bits(tvbuff_t *message_tvb,proto_tree *udvm_tree,guint8 bit_order, 
-                       guint8 buff[],guint16 *old_input_bit_order, guint16 *remaining_bits,
-                       guint16 *input_bits, guint *input_address, guint16 length, 
-                       guint16 *result_code,guint msg_end){
-
-guint16 input_bit_order;
-guint16 value;
-guint16 mask;
-guint8 octet;
-guint8 n;
-guint8 i;
-
-
-
-               input_bit_order = buff[68] << 8;
-               input_bit_order = input_bit_order | buff[69];
-               *result_code = 0;
-
-               /*
-                * Note that after one or more INPUT instructions the dispatcher may
-                * hold a fraction of a byte (what used to be the LSBs if P = 0, or, the
-                * MSBs, if P = 1).  If an INPUT instruction is encountered and the P-
-                * bit has changed since the last INPUT instruction, any fraction of a
-                * byte still held by the dispatcher MUST be discarded (even if the
-                * INPUT instruction requests zero bits).  The first bit passed to the
-                * INPUT instruction is taken from the subsequent byte.
-                */
-               if (print_level_1 ){
-                       if ( *input_address > ( msg_end - 1)){
-                               proto_tree_add_text(udvm_tree, message_tvb, (msg_end - 1), 1,
-                                       "               input_bit_order = 0x%x, old_input_bit_order = 0x%x MSG BUFFER END", input_bit_order, *old_input_bit_order);
-                       }else{
-                               proto_tree_add_text(udvm_tree, message_tvb, *input_address, 1,
-                                       "               input_bit_order = 0x%x, old_input_bit_order = 0x%x", input_bit_order,*old_input_bit_order);
-                       }
-               }
-
-               if ( (*old_input_bit_order & 0x0001 ) != ( input_bit_order & 0x0001 )){
-                       /* clear out remaining bits TODO check this further */
-                       *remaining_bits = 0;
-                       *old_input_bit_order = input_bit_order;
-               }
-
-               /*
-                * Do we hold a fraction of a byte ?
-                */
-               if ( *remaining_bits != 0 ){
-                       if ( *remaining_bits < length ){
-                               if (*remaining_bits > 8 ){
-                                       proto_tree_add_text(udvm_tree, message_tvb, *input_address, 1,
-                                       "               Yikes!! haven't coded this case yet!!remaining_bits %u > 8 ", *remaining_bits);
-                                       return 0xfbad;
-                               }
-                               if ( *input_address > ( msg_end -1 ) ){
-                                       *result_code = 11;
-                                       return 0xfbad;
-                               }
-
-                               octet = tvb_get_guint8(message_tvb, *input_address);
-                               if (print_level_1 ){
-                                       proto_tree_add_text(udvm_tree, message_tvb, *input_address , 1,
-                                       "               Geting value: %u (0x%x) From Addr: %u", octet, octet, *input_address);
-                               }
-                               *input_address = *input_address + 1;
-
-                               if ( ( bit_order ) == 0 ){
-                                       /* 
-                                        * F/H bit = 0
-                                        */
-                                       /* borrow value */
-                                       value = octet & 0x00ff;
-                                       value = value << ( 8 - (*remaining_bits));
-                                       *remaining_bits = *remaining_bits + 8;
-                               }else{
-                                       /*
-                                        * F/H bit = 1
-                                        */
-                                       /* borrow value */
-                                       value =  ( octet << 7) & 0x80;
-                                       value = value | (( octet << 5) & 0x40 ); 
-                                       value = value | (( octet << 3) & 0x20 ); 
-                                       value = value | (( octet << 1) & 0x10 ); 
-
-                                       value = value | (( octet >> 1) & 0x08 ); 
-                                       value = value | (( octet >> 3) & 0x04 ); 
-                                       value = value | (( octet >> 5) & 0x02 ); 
-                                       value = value | (( octet >> 7) & 0x01 );
-
-                                       value = value << ( 8 - (*remaining_bits));
-                                       *remaining_bits = *remaining_bits + 8;
-                               }
-
-                               if (print_level_1 ){
-                                       proto_tree_add_text(udvm_tree, message_tvb, *input_address - 1 , 1,
-                                       "               Or value 0x%x with 0x%x remaining bits %u, Result 0x%x",
-                                       value, *input_bits, *remaining_bits, (*input_bits | value));
-                               }
-                               *input_bits = *input_bits | value;
-                       }/* Bits remain */
-                       if ( ( bit_order ) == 0 ){
-                               /* 
-                                * F/H bit = 0
-                                */
-                               mask = (0xffff >> length)^0xffff;
-                               value = *input_bits & mask;
-                               value = value >> ( 16 - length);
-                               *input_bits = *input_bits << length;
-                               *remaining_bits = *remaining_bits - length;
-                               if (print_level_1 ){
-                                       proto_tree_add_text(udvm_tree, message_tvb, *input_address, 1,
-                                       "               Remaining input_bits 0x%x remaining_bits %u", *input_bits, *remaining_bits);
-                               }
-                               return value;
-                       }
-                       else{
-                               /* 
-                                * F/H bit = 1
-                                */
-                               n = 15;
-                               i = 0;
-                               value = 0;
-                               while ( i < length ){
-                                       value =  value | (( *input_bits & 0x8000 ) >> n) ;
-                                       *input_bits = *input_bits << 1;
-                                       n--;
-                                       i++;
-                               }
-                               *remaining_bits = *remaining_bits - length;
-                               if (print_level_1 ){
-                                       proto_tree_add_text(udvm_tree, message_tvb, *input_address, 1,
-                                       "               Remaining input_bits 0x%x", *input_bits);
-                               }
-                               return value;
-                       }
-
-               }
-               else
-               {
-                       /*
-                        * Do we need one or two bytes ?
-                        */
-                       if ( *input_address > ( msg_end -1 ) ){
-                               *result_code = 11;
-                               return 0xfbad;
-                       }
-
-                       if ( length < 9 ){
-                               octet = tvb_get_guint8(message_tvb, *input_address);
-                               if (print_level_1 ){
-                                       proto_tree_add_text(udvm_tree, message_tvb, *input_address , 1,
-                                       "               Geting value: %u (0x%x) From Addr: %u", octet, octet, *input_address);
-                               }
-                               *input_address = *input_address + 1;
-                               if (print_level_1 ){
-                                       proto_tree_add_text(udvm_tree, message_tvb, *input_address , 1,
-                                       "               Next input from Addr: %u", *input_address);
-                               }
-
-                               if ( ( input_bit_order & 0x0001 ) == 0 ){
-                                       /*
-                                        * P bit = Zero
-                                        */
-                                       *input_bits = octet & 0xff;
-                                       *input_bits = *input_bits << 8;
-                                       *remaining_bits = 8;
-                               }else{
-                                       /*
-                                        * P bit = One
-                                        */
-                                       *input_bits =  ( octet << 7) & 0x80;
-                                       *input_bits = *input_bits | (( octet << 5) & 0x40 ); 
-                                       *input_bits = *input_bits | (( octet << 3) & 0x20 ); 
-                                       *input_bits = *input_bits | (( octet << 1) & 0x10 ); 
-
-                                       *input_bits = *input_bits | (( octet >> 1) & 0x08 ); 
-                                       *input_bits = *input_bits | (( octet >> 3) & 0x04 ); 
-                                       *input_bits = *input_bits | (( octet >> 5) & 0x02 ); 
-                                       *input_bits = *input_bits | (( octet >> 7) & 0x01 ); 
-
-                                       *input_bits = *input_bits << 8;
-                                       *remaining_bits = 8;
-                                       proto_tree_add_text(udvm_tree, message_tvb, *input_address -1, 1,
-                                       "               P bit = 1, input_bits = 0x%x",*input_bits);
-
-                               }
-
-                       }
-                       else{
-                               /* Length > 9, we need two bytes */
-                               octet = tvb_get_guint8(message_tvb, *input_address);
-                               if (print_level_1 ){
-                                       proto_tree_add_text(udvm_tree, message_tvb, *input_address, 1,
-                                       "              Geting first value: %u (0x%x) From Addr: %u", octet, octet, *input_address);
-                               }
-                               if ( ( input_bit_order & 0x0001 ) == 0 ){
-                                       *input_bits = octet & 0xff;
-                                       *input_bits = *input_bits << 8;
-                                       *input_address = *input_address + 1;
-                               }else{
-                                       /*
-                                        * P bit = One
-                                        */
-                                       *input_bits =  ( octet << 7) & 0x80;
-                                       *input_bits = *input_bits | (( octet << 5) & 0x40 ); 
-                                       *input_bits = *input_bits | (( octet << 3) & 0x20 ); 
-                                       *input_bits = *input_bits | (( octet << 1) & 0x10 ); 
-
-                                       *input_bits = *input_bits | (( octet >> 1) & 0x08 ); 
-                                       *input_bits = *input_bits | (( octet >> 3) & 0x04 ); 
-                                       *input_bits = *input_bits | (( octet >> 5) & 0x02 ); 
-                                       *input_bits = *input_bits | (( octet >> 7) & 0x01 ); 
-
-                                       *input_bits = *input_bits << 8;
-                                       *input_address = *input_address + 1;
-                                       proto_tree_add_text(udvm_tree, message_tvb, *input_address -1, 1,
-                                       "               P bit = 1, input_bits = 0x%x",*input_bits);
-
-                               }
-
-                               if ( *input_address > ( msg_end - 1)){
-                                       *result_code = 11;
-                                       return 0xfbad;
-                               }
-
-                               octet = tvb_get_guint8(message_tvb, *input_address);
-                               *input_address = *input_address + 1;
-                               if (print_level_1 ){
-                                       proto_tree_add_text(udvm_tree, message_tvb, *input_address - 2, 2,
-                                       "               Geting second value: %u (0x%x) From Addr: %u", octet, octet, *input_address);
-                               }
-                               if ( ( input_bit_order & 0x0001 ) == 0 ){
-                               /*
-                                * P bit = zero
-                                */
-                               *input_bits = *input_bits | octet;
-                               *remaining_bits = 16;
-                               }else{
-                                       /*
-                                        * P bit = One
-                                        */
-                                       *input_bits =  ( octet << 7) & 0x80;
-                                       *input_bits = *input_bits | (( octet << 5) & 0x40 ); 
-                                       *input_bits = *input_bits | (( octet << 3) & 0x20 ); 
-                                       *input_bits = *input_bits | (( octet << 1) & 0x10 ); 
-
-                                       *input_bits = *input_bits | (( octet >> 1) & 0x08 ); 
-                                       *input_bits = *input_bits | (( octet >> 3) & 0x04 ); 
-                                       *input_bits = *input_bits | (( octet >> 5) & 0x02 ); 
-                                       *input_bits = *input_bits | (( octet >> 7) & 0x01 ); 
-
-                                       *input_bits = *input_bits << 8;
-                                       *input_address = *input_address + 1;
-                                       proto_tree_add_text(udvm_tree, message_tvb, *input_address -1, 1,
-                                       "               P bit = 1, input_bits = 0x%x",*input_bits);
-
-                               *remaining_bits = 16;
-                               }
-
-                       }
-                       if ( ( bit_order ) == 0 ){
-                               /* 
-                                * F/H bit = 0
-                                */
-                               mask = (0xffff >> length)^0xffff;
-                               value = *input_bits & mask;
-                               value = value >> ( 16 - length);
-                               *input_bits = *input_bits << length;
-                               *remaining_bits = *remaining_bits - length;
-                               if (print_level_1 ){
-                                       proto_tree_add_text(udvm_tree, message_tvb, *input_address, 1,
-                                       "               Remaining input_bits 0x%x", *input_bits);
-                               }
-                               return value;
-                       }
-                       else{
-                               /* 
-                                * F/H bit = 1
-                                */
-                               n = 15;
-                               i = 0;
-                               value = 0;
-                               while ( i < length ){
-                                       value =  value | ( *input_bits & 0x8000 ) >> n ;
-                                       *input_bits = *input_bits << 1;
-                                       n--;
-                                       i++;
-                               }
-                               *remaining_bits = *remaining_bits - length;
-                               if (print_level_1 ){
-                                       proto_tree_add_text(udvm_tree, message_tvb, *input_address, 1,
-                                       "               Remaining input_bits 0x%x", *input_bits);
-                               }
-                               return value;
-                       }
-
-               }
-}
-/* end udvm */
+               break;\r
+       case SIGCOMP_INSTR_END_MESSAGE: /* 35 */\r
+               /*\r
+                * END-MESSAGE (%requested_feedback_location,\r
+                * %returned_parameters_location, %state_length, %state_address,\r
+                * %state_instruction, %minimum_access_length,\r
+                * %state_retention_priority)\r
+                */\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,\r
+                               "Addr: %u ## END-MESSAGE (requested_feedback_location,state_instruction, minimum_access_length,state_retention_priority)",\r
+                               current_address);\r
+               }\r
+               operand_address = current_address + 1;\r
+\r
+               /* %requested_feedback_location */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &requested_feedback_location);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      requested_feedback_location %u",\r
+                               operand_address, requested_feedback_location);\r
+               }\r
+               operand_address = next_operand_address;\r
+               /* returned_parameters_location */\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &returned_parameters_location);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      returned_parameters_location %u",\r
+                               operand_address, returned_parameters_location);\r
+               }\r
+               operand_address = next_operand_address;\r
+               /*\r
+                * %state_length\r
+                */\r
+               operand_address = next_operand_address;\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &state_length);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      state_length %u",\r
+                               operand_address, state_length);\r
+               }\r
+               /*\r
+                * %state_address\r
+                */\r
+               operand_address = next_operand_address;\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &state_address);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      state_address %u",\r
+                               operand_address, state_address);\r
+               }\r
+               /*\r
+                * %state_instruction\r
+                */\r
+               operand_address = next_operand_address;\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &state_instruction);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      state_instruction %u",\r
+                               operand_address, state_instruction);\r
+               }\r
+               operand_address = next_operand_address;\r
+               /*\r
+                * %minimum_access_length\r
+                */\r
+               operand_address = next_operand_address;\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &minimum_access_length);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      minimum_access_length %u",\r
+                               operand_address, minimum_access_length);\r
+               }\r
+               operand_address = next_operand_address;\r
+\r
+               /*\r
+                * %state_retention_priority\r
+                */\r
+               operand_address = next_operand_address;\r
+               next_operand_address = decode_udvm_multitype_operand(buff, operand_address, &state_retention_priority);\r
+               if (print_level_1 ){\r
+                       proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"Addr: %u      state_retention_priority %u",\r
+                               operand_address, state_retention_priority);\r
+               }\r
+               current_address = next_operand_address;\r
+               /* TODO: This isn't currently totaly correct as END_INSTRUCTION might not create state */\r
+               no_of_state_create++;\r
+               if ( no_of_state_create > 4 ){\r
+                       result_code = 12;\r
+                       goto decompression_failure; \r
+               }\r
+               state_length_buff[no_of_state_create] = state_length;\r
+               state_address_buff[no_of_state_create] = state_address;\r
+               state_instruction_buff[no_of_state_create] = state_instruction;\r
+               /* Not used ? */\r
+               state_minimum_access_length_buff[no_of_state_create] = minimum_access_length;\r
+               state_state_retention_priority_buff[no_of_state_create] = state_retention_priority;\r
+               \r
+               /* Execute the instruction\r
+                */\r
+               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"no_of_state_create %u",no_of_state_create);\r
+               if ( no_of_state_create != 0 ){\r
+                       for( x=0; x < 20; x++){\r
+                               sha1_digest_buf[x]=0;\r
+                       }\r
+                       n = 1;\r
+                       byte_copy_right = buff[66] << 8;\r
+                       byte_copy_right = byte_copy_right | buff[67];\r
+                       while ( n < no_of_state_create + 1 ){\r
+                               sha1buff = g_malloc(state_length_buff[n]+8);\r
+                               sha1buff[0] = state_length_buff[n] >> 8;\r
+                               sha1buff[1] = state_length_buff[n] & 0xff;\r
+                               sha1buff[2] = state_address_buff[n] >> 8;\r
+                               sha1buff[3] = state_address_buff[n] & 0xff;\r
+                               sha1buff[4] = state_instruction_buff[n] >> 8;\r
+                               sha1buff[5] = state_instruction_buff[n] & 0xff; \r
+                               sha1buff[6] = state_minimum_access_length_buff[n] >> 8;\r
+                               sha1buff[7] = state_minimum_access_length_buff[n] & 0xff;\r
+                               if (print_level_3 ){\r
+                                       for( x=0; x < 8; x++){\r
+                                               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"sha1buff %u 0x%x",\r
+                                                       x,sha1buff[x]);\r
+                                       }\r
+                               }\r
+                               k = state_address_buff[n];\r
+                               for( x=0; x < state_length_buff[n]; x++)\r
+                                       {\r
+                                       if ( k == byte_copy_right ){\r
+                                               byte_copy_left = buff[64] << 8;\r
+                                               byte_copy_left = byte_copy_left | buff[65];\r
+                                               k = byte_copy_left;\r
+                                       }\r
+                                       sha1buff[8+x] = buff[k];\r
+                                       k = ( k + 1 ) & 0xffff;\r
+                                       }\r
+\r
+                               sha1_starts( &ctx );\r
+                               sha1_update( &ctx, (guint8 *) sha1buff, state_length_buff[n] + 8);\r
+                               sha1_finish( &ctx, sha1_digest_buf );\r
+                               if (print_level_3 ){\r
+                               for( x=0; x < 20; x++){\r
+                                               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"SHA1 digest byte %u 0x%x",\r
+                                                       x,sha1_digest_buf[x]);\r
+                                       }\r
+                               }\r
+                               udvm_state_create(sha1buff, sha1_digest_buf, state_minimum_access_length_buff[n]);\r
+                               n++;\r
+\r
+                       }\r
+               }\r
+\r
+\r
+\r
+               /* At least something got decompressed, show it */\r
+               decomp_tvb = tvb_new_real_data(out_buff,output_address,output_address);\r
+               /* Arrange that the allocated packet data copy be freed when the\r
+                * tvbuff is freed. \r
+                */\r
+               tvb_set_free_cb( decomp_tvb, g_free );\r
+\r
+               tvb_set_child_real_data_tvbuff(message_tvb,decomp_tvb);\r
+               add_new_data_source(pinfo, decomp_tvb, "Decompressed SigComp message");\r
+               /*\r
+               proto_tree_add_text(udvm_tree, decomp_tvb, 0, -1,"SigComp message Decompressed");\r
+               */      \r
+               used_udvm_cycles = used_udvm_cycles + 1 + state_length;\r
+               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"maximum_UDVM_cycles %u used_udvm_cycles %u",\r
+                       maximum_UDVM_cycles, used_udvm_cycles);\r
+               return decomp_tvb;\r
+               break;\r
+\r
+       default:\r
+           proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1," ### Addr %u Invalid instruction: %u (0x%x)",\r
+                       current_address,current_instruction,current_instruction);\r
+               break;\r
+               }\r
+               g_free(out_buff);\r
+               return NULL;\r
+decompression_failure:\r
+               \r
+               proto_tree_add_text(udvm_tree, bytecode_tvb, 0, -1,"DECOMPRESSION FAILURE: %s",\r
+                                   val_to_str(result_code, result_code_vals,"Unknown (%u)"));\r
+               g_free(out_buff);\r
+               return NULL;\r
+\r
+}\r
+       \r
+ /*  The simplest operand type is the literal (#), which encodes a\r
+  * constant integer from 0 to 65535 inclusive.  A literal operand may\r
+  * require between 1 and 3 bytes depending on its value.\r
+  * Bytecode:                       Operand value:      Range:\r
+  * 0nnnnnnn                        N                   0 - 127\r
+  * 10nnnnnn nnnnnnnn               N                   0 - 16383\r
+  * 11000000 nnnnnnnn nnnnnnnn      N                   0 - 65535\r
+  *\r
+  *            Figure 8: Bytecode for a literal (#) operand\r
+  *\r
+  */\r
+static int\r
+decode_udvm_literal_operand(guint8 *buff,guint operand_address, guint16 *value) \r
+{\r
+       guint   bytecode;\r
+       guint16 operand;\r
+       guint   test_bits;\r
+       guint   offset = operand_address;\r
+       guint8  temp_data;\r
+\r
+       bytecode = buff[operand_address];\r
+       test_bits = bytecode >> 7;\r
+       if (test_bits == 1){\r
+               test_bits = bytecode >> 6;\r
+               if (test_bits == 2){\r
+                       /*\r
+                        * 10nnnnnn nnnnnnnn               N                   0 - 16383\r
+                        */\r
+                       temp_data = buff[operand_address] & 0x1f;\r
+                       operand = temp_data << 8;\r
+                       temp_data = buff[operand_address + 1];\r
+                       operand = operand | temp_data;\r
+                       *value = operand;\r
+                       offset = offset + 2;\r
+\r
+               }else{\r
+                       /*\r
+                        * 111000000 nnnnnnnn nnnnnnnn      N                   0 - 65535\r
+                        */\r
+                       offset ++;\r
+                       temp_data = buff[operand_address] & 0x1f;\r
+                       operand = temp_data << 8;\r
+                       temp_data = buff[operand_address + 1];\r
+                       operand = operand | temp_data;\r
+                       *value = operand;\r
+                       offset = offset + 2;\r
+\r
+               }\r
+       }else{\r
+               /*\r
+                * 0nnnnnnn                        N                   0 - 127\r
+                */\r
+               operand = ( bytecode & 0x7f);\r
+               *value = operand;\r
+               offset ++;\r
+       }\r
+\r
+       return offset;\r
+\r
+}\r
+\r
+/*\r
+ * The second operand type is the reference ($), which is always used to\r
+ * access a 2-byte value located elsewhere in the UDVM memory.  The\r
+ * bytecode for a reference operand is decoded to be a constant integer\r
+ * from 0 to 65535 inclusive, which is interpreted as the memory address\r
+ * containing the actual value of the operand.\r
+ * Bytecode:                       Operand value:      Range:\r
+ *\r
+ * 0nnnnnnn                        memory[2 * N]       0 - 65535\r
+ * 10nnnnnn nnnnnnnn               memory[2 * N]       0 - 65535\r
+ * 11000000 nnnnnnnn nnnnnnnn      memory[N]           0 - 65535\r
+ *\r
+ *            Figure 9: Bytecode for a reference ($) operand\r
+ */\r
+static int\r
+dissect_udvm_reference_operand(guint8 *buff,guint operand_address, guint16 *value,guint *result_dest) \r
+{\r
+       guint bytecode;\r
+       guint16 operand;\r
+       guint   offset = operand_address;\r
+       guint test_bits;\r
+       guint8  temp_data;\r
+       guint16 temp_data16;\r
+\r
+       bytecode = buff[operand_address];\r
+       test_bits = bytecode >> 7;\r
+       if (test_bits == 1){\r
+               test_bits = bytecode >> 6;\r
+               if (test_bits == 2){\r
+                       /*\r
+                        * 10nnnnnn nnnnnnnn               memory[2 * N]       0 - 65535\r
+                        */\r
+                       temp_data = buff[operand_address] & 0x3f;\r
+                       operand = temp_data << 8;\r
+                       temp_data = buff[operand_address + 1];\r
+                       operand = operand | temp_data;\r
+                       operand = (operand * 2);\r
+                       *result_dest = operand;\r
+                       temp_data16 = buff[operand] << 8;\r
+                       temp_data16 = temp_data16 | buff[operand+1];\r
+                       *value = temp_data16;\r
+                       offset = offset + 2;\r
+\r
+               }else{\r
+                       /*\r
+                        * 11000000 nnnnnnnn nnnnnnnn      memory[N]           0 - 65535\r
+                        */\r
+                       operand_address++;\r
+                       operand = buff[operand_address] << 8;\r
+                       operand = operand | buff[operand_address + 1];\r
+                       *result_dest = operand;\r
+                       temp_data16 = buff[operand] << 8;\r
+                       temp_data16 = temp_data16 | buff[operand+1];\r
+                       *value = temp_data16;\r
+                       offset = offset + 3;\r
+\r
+               }\r
+       }else{\r
+               /*\r
+                * 0nnnnnnn                        memory[2 * N]       0 - 65535\r
+                */\r
+               operand = ( bytecode & 0x7f);\r
+               operand = (operand * 2);\r
+               *result_dest = operand;\r
+               temp_data16 = buff[operand] << 8;\r
+               temp_data16 = temp_data16 | buff[operand+1];\r
+               *value = temp_data16;\r
+               offset ++;\r
+       }\r
+\r
+       return offset;\r
+}\r
+\r
+       /* RFC3320\r
+        * Figure 10: Bytecode for a multitype (%) operand\r
+        * Bytecode:                       Operand value:      Range:               HEX val\r
+        * 00nnnnnn                        N                   0 - 63                           0x00\r
+        * 01nnnnnn                        memory[2 * N]       0 - 65535                        0x40\r
+        * 1000011n                        2 ^ (N + 6)        64 , 128                          0x86    \r
+        * 10001nnn                        2 ^ (N + 8)    256 , ... , 32768                     0x88\r
+        * 111nnnnn                        N + 65504       65504 - 65535                        0xe0\r
+        * 1001nnnn nnnnnnnn               N + 61440       61440 - 65535                        0x90\r
+        * 101nnnnn nnnnnnnn               N                   0 - 8191                         0xa0\r
+        * 110nnnnn nnnnnnnn               memory[N]           0 - 65535                        0xc0\r
+        * 10000000 nnnnnnnn nnnnnnnn      N                   0 - 65535                        0x80\r
+        * 10000001 nnnnnnnn nnnnnnnn      memory[N]           0 - 65535                        0x81\r
+        */\r
+static int\r
+decode_udvm_multitype_operand(guint8 *buff,guint operand_address, guint16 *value)\r
+{\r
+       guint test_bits;\r
+       guint bytecode;\r
+       guint offset = operand_address;\r
+       guint16 operand;\r
+       guint32 result;\r
+       guint8 temp_data;\r
+       guint16 temp_data16;\r
+       guint16 memmory_addr = 0;\r
+\r
+       bytecode = buff[operand_address];\r
+       test_bits = ( bytecode & 0xc0 ) >> 6;\r
+       switch (test_bits ){\r
+       case 0:\r
+               /*  \r
+                * 00nnnnnn                        N                   0 - 63\r
+                */\r
+               operand =  buff[operand_address];\r
+               /* debug\r
+                *g_warning("Reading 0x%x From address %u",operand,offset);\r
+                */\r
+               *value = operand;\r
+               offset ++;\r
+               break;\r
+       case 1:\r
+               /*  \r
+                * 01nnnnnn                        memory[2 * N]       0 - 65535\r
+                */\r
+               memmory_addr = ( bytecode & 0x3f) * 2;\r
+               temp_data16 = buff[memmory_addr] << 8;\r
+               temp_data16 = temp_data16 | buff[memmory_addr+1];\r
+               *value = temp_data16;\r
+               offset ++;\r
+               break;\r
+       case 2:\r
+               /* Check tree most significant bits */\r
+               test_bits = ( bytecode & 0xe0 ) >> 5;\r
+               if ( test_bits == 5 ){\r
+               /*\r
+                * 101nnnnn nnnnnnnn               N                   0 - 8191\r
+                */\r
+                       temp_data = buff[operand_address] & 0x1f;\r
+                       operand = temp_data << 8;\r
+                       temp_data = buff[operand_address + 1];\r
+                       operand = operand | temp_data;\r
+                       *value = operand;\r
+                       offset = offset + 2;\r
+               }else{\r
+                       test_bits = ( bytecode & 0xf0 ) >> 4;\r
+                       if ( test_bits == 9 ){\r
+               /*\r
+                * 1001nnnn nnnnnnnn               N + 61440       61440 - 65535\r
+                */\r
+                               temp_data = buff[operand_address] & 0x0f;\r
+                               operand = temp_data << 8;\r
+                               temp_data = buff[operand_address + 1];\r
+                               operand = operand | temp_data;\r
+                               operand = operand + 61440;\r
+                               *value = operand;\r
+                               offset = offset + 2;\r
+                       }else{\r
+                               test_bits = ( bytecode & 0x08 ) >> 3;\r
+                               if ( test_bits == 1){\r
+               /*\r
+                * 10001nnn                        2 ^ (N + 8)    256 , ... , 32768\r
+                */\r
+\r
+                                       result = (guint32)pow(2,( buff[operand_address] & 0x07) + 8);\r
+                                       operand = result & 0xffff;\r
+                                       *value = operand;\r
+                                       offset ++;\r
+                               }else{\r
+                                       test_bits = ( bytecode & 0x0e ) >> 1;\r
+                                       if ( test_bits == 3 ){\r
+                                               /*\r
+                                                * 1000 011n                        2 ^ (N + 6)        64 , 128\r
+                                                */\r
+                                               result = (guint32)pow(2,( buff[operand_address] & 0x01) + 6);\r
+                                               operand = result & 0xffff;\r
+                                               *value = operand;\r
+                                               offset ++;\r
+                                       }else{\r
+                                       /*\r
+                                        * 1000 0000 nnnnnnnn nnnnnnnn      N                   0 - 65535\r
+                                        * 1000 0001 nnnnnnnn nnnnnnnn      memory[N]           0 - 65535\r
+                                        */\r
+                                               offset ++;\r
+                                               temp_data16 = buff[operand_address + 1] << 8;\r
+                                               temp_data16 = temp_data16 | buff[operand_address + 2];\r
+                                               /*  debug\r
+                                                * g_warning("Reading 0x%x From address %u",temp_data16,operand_address);\r
+                                                */\r
+                                               if ( (bytecode & 0x01) == 1 ){\r
+                                                       memmory_addr = temp_data16;\r
+                                                       temp_data16 = buff[memmory_addr] << 8;\r
+                                                       temp_data16 = temp_data16 | buff[memmory_addr+1];\r
+                                               }\r
+                                               *value = temp_data16;\r
+                                               offset = offset +2;\r
+                                       }\r
+\r
+\r
+                               }\r
+                       }\r
+               }\r
+               break;\r
+\r
+       case 3:\r
+               test_bits = ( bytecode & 0x20 ) >> 5;\r
+               if ( test_bits == 1 ){\r
+               /*\r
+                * 111nnnnn                        N + 65504       65504 - 65535\r
+                */\r
+                       operand = ( buff[operand_address] & 0x1f) + 65504;\r
+                       *value = operand;\r
+                       offset ++;\r
+               }else{\r
+               /*\r
+                * 110nnnnn nnnnnnnn               memory[N]           0 - 65535\r
+                */\r
+                       memmory_addr = buff[operand_address] & 0x1f;\r
+                       memmory_addr = memmory_addr << 8;\r
+                       memmory_addr = memmory_addr | buff[operand_address + 1];\r
+                       temp_data16 = buff[memmory_addr] << 8;\r
+                       temp_data16 = temp_data16 | buff[memmory_addr+1];\r
+                       *value = temp_data16;\r
+                       /*  debug \r
+                        * g_warning("Reading 0x%x From address %u",temp_data16,memmory_addr);\r
+                        */\r
+                       offset = offset +2;\r
+               }\r
+                       \r
+       default :\r
+               break;\r
+       }\r
+       return offset;\r
+}\r
+       /*\r
+        *\r
+        * The fourth operand type is the address (@).  This operand is decoded\r
+        * as a multitype operand followed by a further step: the memory address\r
+        * of the UDVM instruction containing the address operand is added to\r
+        * obtain the correct operand value.  So if the operand value from\r
+        * Figure 10 is D then the actual operand value of an address is\r
+        * calculated as follows:\r
+        *\r
+        * operand_value = (memory_address_of_instruction + D) modulo 2^16\r
+        *\r
+        * Address operands are always used in instructions that control program\r
+        * flow, because they ensure that the UDVM bytecode is position-\r
+        * independent code (i.e., it will run independently of where it is\r
+        * placed in the UDVM memory).\r
+        */\r
+static int\r
+decode_udvm_address_operand(guint8 *buff,guint operand_address, guint16 *value,guint current_address)\r
+{\r
+       guint32 result;\r
+       guint16 value1;\r
+       guint next_opreand_address;\r
+\r
+       next_opreand_address = decode_udvm_multitype_operand(buff, operand_address, &value1);\r
+       result = value1 & 0xffff;\r
+       result = result + current_address;\r
+       *value = result & 0xffff;\r
+       return next_opreand_address;\r
+}\r
+\r
+static int\r
+decomp_dispatch_get_bits(tvbuff_t *message_tvb,proto_tree *udvm_tree,guint8 bit_order, \r
+                       guint8 *buff,guint16 *old_input_bit_order, guint16 *remaining_bits,\r
+                       guint16 *input_bits, guint *input_address, guint16 length, \r
+                       guint16 *result_code,guint msg_end){\r
+\r
+guint16 input_bit_order;\r
+guint16 value;\r
+guint16 mask;\r
+guint8 octet;\r
+guint8 n;\r
+guint8 i;\r
+\r
+\r
+\r
+               input_bit_order = buff[68] << 8;\r
+               input_bit_order = input_bit_order | buff[69];\r
+               *result_code = 0;\r
+\r
+               /*\r
+                * Note that after one or more INPUT instructions the dispatcher may\r
+                * hold a fraction of a byte (what used to be the LSBs if P = 0, or, the\r
+                * MSBs, if P = 1).  If an INPUT instruction is encountered and the P-\r
+                * bit has changed since the last INPUT instruction, any fraction of a\r
+                * byte still held by the dispatcher MUST be discarded (even if the\r
+                * INPUT instruction requests zero bits).  The first bit passed to the\r
+                * INPUT instruction is taken from the subsequent byte.\r
+                */\r
+               if (print_level_1 ){\r
+                       if ( *input_address > ( msg_end - 1)){\r
+                               proto_tree_add_text(udvm_tree, message_tvb, (msg_end - 1), 1,\r
+                                       "               input_bit_order = 0x%x, old_input_bit_order = 0x%x MSG BUFFER END", input_bit_order, *old_input_bit_order);\r
+                       }else{\r
+                               proto_tree_add_text(udvm_tree, message_tvb, *input_address, 1,\r
+                                       "               input_bit_order = 0x%x, old_input_bit_order = 0x%x", input_bit_order,*old_input_bit_order);\r
+                       }\r
+               }\r
+\r
+               if ( (*old_input_bit_order & 0x0001 ) != ( input_bit_order & 0x0001 )){\r
+                       /* clear out remaining bits TODO check this further */\r
+                       *remaining_bits = 0;\r
+                       *old_input_bit_order = input_bit_order;\r
+               }\r
+\r
+               /*\r
+                * Do we hold a fraction of a byte ?\r
+                */\r
+               if ( *remaining_bits != 0 ){\r
+                       if ( *remaining_bits < length ){\r
+                               if (*remaining_bits > 8 ){\r
+                                       proto_tree_add_text(udvm_tree, message_tvb, *input_address, 1,\r
+                                       "               Yikes!! haven't coded this case yet!!remaining_bits %u > 8 ", *remaining_bits);\r
+                                       return 0xfbad;\r
+                               }\r
+                               if ( *input_address > ( msg_end -1 ) ){\r
+                                       *result_code = 11;\r
+                                       return 0xfbad;\r
+                               }\r
+\r
+                               octet = tvb_get_guint8(message_tvb, *input_address);\r
+                               if (print_level_1 ){\r
+                                       proto_tree_add_text(udvm_tree, message_tvb, *input_address , 1,\r
+                                       "               Geting value: %u (0x%x) From Addr: %u", octet, octet, *input_address);\r
+                               }\r
+                               *input_address = *input_address + 1;\r
+\r
+                               if ( ( bit_order ) == 0 ){\r
+                                       /* \r
+                                        * F/H bit = 0\r
+                                        */\r
+                                       /* borrow value */\r
+                                       value = octet & 0x00ff;\r
+                                       value = value << ( 8 - (*remaining_bits));\r
+                                       *remaining_bits = *remaining_bits + 8;\r
+                               }else{\r
+                                       /*\r
+                                        * F/H bit = 1\r
+                                        */\r
+                                       /* borrow value */\r
+                                       value =  ( octet << 7) & 0x80;\r
+                                       value = value | (( octet << 5) & 0x40 ); \r
+                                       value = value | (( octet << 3) & 0x20 ); \r
+                                       value = value | (( octet << 1) & 0x10 ); \r
+\r
+                                       value = value | (( octet >> 1) & 0x08 ); \r
+                                       value = value | (( octet >> 3) & 0x04 ); \r
+                                       value = value | (( octet >> 5) & 0x02 ); \r
+                                       value = value | (( octet >> 7) & 0x01 );\r
+\r
+                                       value = value << ( 8 - (*remaining_bits));\r
+                                       *remaining_bits = *remaining_bits + 8;\r
+                               }\r
+\r
+                               if (print_level_1 ){\r
+                                       proto_tree_add_text(udvm_tree, message_tvb, *input_address - 1 , 1,\r
+                                       "               Or value 0x%x with 0x%x remaining bits %u, Result 0x%x",\r
+                                       value, *input_bits, *remaining_bits, (*input_bits | value));\r
+                               }\r
+                               *input_bits = *input_bits | value;\r
+                       }/* Bits remain */\r
+                       if ( ( bit_order ) == 0 ){\r
+                               /* \r
+                                * F/H bit = 0\r
+                                */\r
+                               mask = (0xffff >> length)^0xffff;\r
+                               value = *input_bits & mask;\r
+                               value = value >> ( 16 - length);\r
+                               *input_bits = *input_bits << length;\r
+                               *remaining_bits = *remaining_bits - length;\r
+                               if (print_level_1 ){\r
+                                       proto_tree_add_text(udvm_tree, message_tvb, *input_address, 1,\r
+                                       "               Remaining input_bits 0x%x remaining_bits %u", *input_bits, *remaining_bits);\r
+                               }\r
+                               return value;\r
+                       }\r
+                       else{\r
+                               /* \r
+                                * F/H bit = 1\r
+                                */\r
+                               n = 15;\r
+                               i = 0;\r
+                               value = 0;\r
+                               while ( i < length ){\r
+                                       value =  value | (( *input_bits & 0x8000 ) >> n) ;\r
+                                       *input_bits = *input_bits << 1;\r
+                                       n--;\r
+                                       i++;\r
+                               }\r
+                               *remaining_bits = *remaining_bits - length;\r
+                               if (print_level_1 ){\r
+                                       proto_tree_add_text(udvm_tree, message_tvb, *input_address, 1,\r
+                                       "               Remaining input_bits 0x%x", *input_bits);\r
+                               }\r
+                               return value;\r
+                       }\r
+\r
+               }\r
+               else\r
+               {\r
+                       /*\r
+                        * Do we need one or two bytes ?\r
+                        */\r
+                       if ( *input_address > ( msg_end -1 ) ){\r
+                               *result_code = 11;\r
+                               return 0xfbad;\r
+                       }\r
+\r
+                       if ( length < 9 ){\r
+                               octet = tvb_get_guint8(message_tvb, *input_address);\r
+                               if (print_level_1 ){\r
+                                       proto_tree_add_text(udvm_tree, message_tvb, *input_address , 1,\r
+                                       "               Geting value: %u (0x%x) From Addr: %u", octet, octet, *input_address);\r
+                               }\r
+                               *input_address = *input_address + 1;\r
+                               if (print_level_1 ){\r
+                                       proto_tree_add_text(udvm_tree, message_tvb, *input_address , 1,\r
+                                       "               Next input from Addr: %u", *input_address);\r
+                               }\r
+\r
+                               if ( ( input_bit_order & 0x0001 ) == 0 ){\r
+                                       /*\r
+                                        * P bit = Zero\r
+                                        */\r
+                                       *input_bits = octet & 0xff;\r
+                                       *input_bits = *input_bits << 8;\r
+                                       *remaining_bits = 8;\r
+                               }else{\r
+                                       /*\r
+                                        * P bit = One\r
+                                        */\r
+                                       *input_bits =  ( octet << 7) & 0x80;\r
+                                       *input_bits = *input_bits | (( octet << 5) & 0x40 ); \r
+                                       *input_bits = *input_bits | (( octet << 3) & 0x20 ); \r
+                                       *input_bits = *input_bits | (( octet << 1) & 0x10 ); \r
+\r
+                                       *input_bits = *input_bits | (( octet >> 1) & 0x08 ); \r
+                                       *input_bits = *input_bits | (( octet >> 3) & 0x04 ); \r
+                                       *input_bits = *input_bits | (( octet >> 5) & 0x02 ); \r
+                                       *input_bits = *input_bits | (( octet >> 7) & 0x01 ); \r
+\r
+                                       *input_bits = *input_bits << 8;\r
+                                       *remaining_bits = 8;\r
+                                       proto_tree_add_text(udvm_tree, message_tvb, *input_address -1, 1,\r
+                                       "               P bit = 1, input_bits = 0x%x",*input_bits);\r
+\r
+                               }\r
+\r
+                       }\r
+                       else{\r
+                               /* Length > 9, we need two bytes */\r
+                               octet = tvb_get_guint8(message_tvb, *input_address);\r
+                               if (print_level_1 ){\r
+                                       proto_tree_add_text(udvm_tree, message_tvb, *input_address, 1,\r
+                                       "              Geting first value: %u (0x%x) From Addr: %u", octet, octet, *input_address);\r
+                               }\r
+                               if ( ( input_bit_order & 0x0001 ) == 0 ){\r
+                                       *input_bits = octet & 0xff;\r
+                                       *input_bits = *input_bits << 8;\r
+                                       *input_address = *input_address + 1;\r
+                               }else{\r
+                                       /*\r
+                                        * P bit = One\r
+                                        */\r
+                                       *input_bits =  ( octet << 7) & 0x80;\r
+                                       *input_bits = *input_bits | (( octet << 5) & 0x40 ); \r
+                                       *input_bits = *input_bits | (( octet << 3) & 0x20 ); \r
+                                       *input_bits = *input_bits | (( octet << 1) & 0x10 ); \r
+\r
+                                       *input_bits = *input_bits | (( octet >> 1) & 0x08 ); \r
+                                       *input_bits = *input_bits | (( octet >> 3) & 0x04 ); \r
+                                       *input_bits = *input_bits | (( octet >> 5) & 0x02 ); \r
+                                       *input_bits = *input_bits | (( octet >> 7) & 0x01 ); \r
+\r
+                                       *input_bits = *input_bits << 8;\r
+                                       *input_address = *input_address + 1;\r
+                                       proto_tree_add_text(udvm_tree, message_tvb, *input_address -1, 1,\r
+                                       "               P bit = 1, input_bits = 0x%x",*input_bits);\r
+\r
+                               }\r
+\r
+                               if ( *input_address > ( msg_end - 1)){\r
+                                       *result_code = 11;\r
+                                       return 0xfbad;\r
+                               }\r
+\r
+                               octet = tvb_get_guint8(message_tvb, *input_address);\r
+                               *input_address = *input_address + 1;\r
+                               if (print_level_1 ){\r
+                                       proto_tree_add_text(udvm_tree, message_tvb, *input_address - 2, 2,\r
+                                       "               Geting second value: %u (0x%x) From Addr: %u", octet, octet, *input_address);\r
+                               }\r
+                               if ( ( input_bit_order & 0x0001 ) == 0 ){\r
+                               /*\r
+                                * P bit = zero\r
+                                */\r
+                               *input_bits = *input_bits | octet;\r
+                               *remaining_bits = 16;\r
+                               }else{\r
+                                       /*\r
+                                        * P bit = One\r
+                                        */\r
+                                       *input_bits =  ( octet << 7) & 0x80;\r
+                                       *input_bits = *input_bits | (( octet << 5) & 0x40 ); \r
+                                       *input_bits = *input_bits | (( octet << 3) & 0x20 ); \r
+                                       *input_bits = *input_bits | (( octet << 1) & 0x10 ); \r
+\r
+                                       *input_bits = *input_bits | (( octet >> 1) & 0x08 ); \r
+                                       *input_bits = *input_bits | (( octet >> 3) & 0x04 ); \r
+                                       *input_bits = *input_bits | (( octet >> 5) & 0x02 ); \r
+                                       *input_bits = *input_bits | (( octet >> 7) & 0x01 ); \r
+\r
+                                       *input_bits = *input_bits << 8;\r
+                                       *input_address = *input_address + 1;\r
+                                       proto_tree_add_text(udvm_tree, message_tvb, *input_address -1, 1,\r
+                                       "               P bit = 1, input_bits = 0x%x",*input_bits);\r
+\r
+                               *remaining_bits = 16;\r
+                               }\r
+\r
+                       }\r
+                       if ( ( bit_order ) == 0 ){\r
+                               /* \r
+                                * F/H bit = 0\r
+                                */\r
+                               mask = (0xffff >> length)^0xffff;\r
+                               value = *input_bits & mask;\r
+                               value = value >> ( 16 - length);\r
+                               *input_bits = *input_bits << length;\r
+                               *remaining_bits = *remaining_bits - length;\r
+                               if (print_level_1 ){\r
+                                       proto_tree_add_text(udvm_tree, message_tvb, *input_address, 1,\r
+                                       "               Remaining input_bits 0x%x", *input_bits);\r
+                               }\r
+                               return value;\r
+                       }\r
+                       else{\r
+                               /* \r
+                                * F/H bit = 1\r
+                                */\r
+                               n = 15;\r
+                               i = 0;\r
+                               value = 0;\r
+                               while ( i < length ){\r
+                                       value =  value | ( *input_bits & 0x8000 ) >> n ;\r
+                                       *input_bits = *input_bits << 1;\r
+                                       n--;\r
+                                       i++;\r
+                               }\r
+                               *remaining_bits = *remaining_bits - length;\r
+                               if (print_level_1 ){\r
+                                       proto_tree_add_text(udvm_tree, message_tvb, *input_address, 1,\r
+                                       "               Remaining input_bits 0x%x", *input_bits);\r
+                               }\r
+                               return value;\r
+                       }\r
+\r
+               }\r
+}\r
+/* end udvm */\r
index 7527db1a29ed3cd63a2d7205d870db754e36a1b0..5f108d554f6f9fc4557b6803a9b3df7c80a1fce2 100644 (file)
@@ -33,6 +33,8 @@
 #ifndef SIGCOMP_UDVM_H\r
 #define SIGCOMP_UDVM_H\r
 \r
+#define UDVM_MEMORY_SIZE                                               65536\r
+\r
 extern tvbuff_t* decompress_sigcomp_message(tvbuff_t *bytecode_tvb, tvbuff_t *message_tvb, packet_info *pinfo,\r
                                                   proto_tree *tree, gint destination, gint print_flags);\r
 \r
index 4b97411a37206c1340491ec9c4985f4911d58ded..f50f863b8b54b71fe4e3cd414be0cad61a72a8b0 100644 (file)
-/* sigcomp_state_hdlr.c
- * Routines making up the State handler of the Univerasl Decompressor Virtual Machine (UDVM) 
- * used for Signaling Compression (SigComp) dissection.
- * Copyright 2004, Anders Broman <anders.broman@ericsson.com>
- *
- * $Id: udvm.c 11445 2004-07-20 19:04:48Z etxrab $
- *
- * Ethereal - Network traffic analyzer
- * By Gerald Combs <gerald@ethereal.com>
- * Copyright 1998 Gerald Combs
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- * 
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * References:
- * The Session Initiation Protocol (SIP) and Session Description Protocol
- *    (SDP) Static Dictionary for Signaling Compression (SigComp)
- * http://www.ietf.org/rfc/rfc3485.txt?number=3485 
- *
- * http://www.ietf.org/rfc/rfc3320.txt?number=3320
- * http://www.ietf.org/rfc/rfc3321.txt?number=3321
- * Useful links :
- * http://www.ietf.org/internet-drafts/draft-ietf-rohc-sigcomp-impl-guide-03.txt
- * http://www.ietf.org/internet-drafts/draft-ietf-rohc-sigcomp-sip-01.txt
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-#include <glib.h>
-#include "strutil.h"
-
-#ifdef NEED_SNPRINTF_H
-# include "snprintf.h"
-#endif
-
-#include "packet.h"
-#include "sigcomp_state_hdlr.h"
-/*
- * Defenitions for:
- * The Session Initiation Protocol (SIP) and Session Description Protocol
- *    (SDP) Static Dictionary for Signaling Compression (SigComp)
- * http://www.ietf.org/rfc/rfc3485.txt?number=3485 
- */
+/* sigcomp_state_hdlr.c\r
+ * Routines making up the State handler of the Univerasl Decompressor Virtual Machine (UDVM) \r
+ * used for Signaling Compression (SigComp) dissection.\r
+ * Copyright 2004, Anders Broman <anders.broman@ericsson.com>\r
+ *\r
+ * $Id: udvm.c 11445 2004-07-20 19:04:48Z etxrab $\r
+ *\r
+ * Ethereal - Network traffic analyzer\r
+ * By Gerald Combs <gerald@ethereal.com>\r
+ * Copyright 1998 Gerald Combs\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License\r
+ * as published by the Free Software Foundation; either version 2\r
+ * of the License, or (at your option) any later version.\r
+ * \r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ * \r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+ * References:\r
+ * The Session Initiation Protocol (SIP) and Session Description Protocol\r
+ *    (SDP) Static Dictionary for Signaling Compression (SigComp)\r
+ * http://www.ietf.org/rfc/rfc3485.txt?number=3485 \r
+ *\r
+ * http://www.ietf.org/rfc/rfc3320.txt?number=3320\r
+ * http://www.ietf.org/rfc/rfc3321.txt?number=3321\r
+ * Useful links :\r
+ * http://www.ietf.org/internet-drafts/draft-ietf-rohc-sigcomp-impl-guide-03.txt\r
+ * http://www.ietf.org/internet-drafts/draft-ietf-rohc-sigcomp-sip-01.txt\r
+ */\r
+\r
+#ifdef HAVE_CONFIG_H\r
+# include "config.h"\r
+#endif\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <math.h>\r
+#include <glib.h>\r
+#include "strutil.h"\r
+\r
+#ifdef NEED_SNPRINTF_H\r
+# include "snprintf.h"\r
+#endif\r
+\r
+#include "packet.h"\r
+#include "sigcomp_state_hdlr.h"\r
+/*\r
+ * Defenitions for:\r
+ * The Session Initiation Protocol (SIP) and Session Description Protocol\r
+ *    (SDP) Static Dictionary for Signaling Compression (SigComp)\r
+ * http://www.ietf.org/rfc/rfc3485.txt?number=3485 \r
+ */\r
 guint16 sip_sdp_state_length = 0x12e4;\r
-
-static const guint8 sip_sdp_state_identifier[20] =
-{
-   /* -0000, */  0xfb, 0xe5, 0x07, 0xdf, 0xe5, 0xe6, 0xaa, 0x5a, 0xf2, 0xab, 0xb9, 0x14, 0xce, 0xaa, 0x05, 0xf9,
-   /* -0010, */  0x9c, 0xe6, 0x1b, 0xa5
-};
-
-static const guint8 sip_sdp_static_dictionaty_for_sigcomp[0x12e4] =
-{
-                                
-   /* -0000, */  0x0d, 0x0a, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x2d, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 
-   /* -0010, */  0x3a, 0x20, 0x0d, 0x0a, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2d, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x20,        
-   /* -0020, */  0x0d, 0x0a, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x3a, 0x20, 0x0d, 0x0a, 0x43, 
-   /* -0030, */  0x61, 0x6c, 0x6c, 0x2d, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x20, 0x0d, 0x0a, 0x52, 0x65, 0x70, 0x6c, 
-   /* -0040, */  0x79, 0x2d, 0x54, 0x6f, 0x3a, 0x20, 0x0d, 0x0a, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x3a, 
-   /* -0050, */  0x20, 0x0d, 0x0a, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3a, 0x20, 0x3b, 0x68, 0x61, 0x6e,
-   /* -0060, */  0x64, 0x6c, 0x69, 0x6e, 0x67, 0x3d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3b, 0x70, 0x75, 0x72, 0x70,        
-   /* -0070, */  0x6f, 0x73, 0x65, 0x3d, 0x3b, 0x63, 0x61, 0x75, 0x73, 0x65, 0x3d, 0x3b, 0x74, 0x65, 0x78, 0x74, 
-   /* -0080, */  0x3d, 0x63, 0x61, 0x72, 0x64, 0x33, 0x30, 0x30, 0x20, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 
-   /* -0090, */  0x65, 0x20, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x6d, 0x69, 0x6d, 0x65, 0x73, 0x73, 0x61, 
-   /* -00A0, */  0x67, 0x65, 0x2f, 0x73, 0x69, 0x70, 0x66, 0x72, 0x61, 0x67, 0x34, 0x30, 0x37, 0x20, 0x50, 0x72, 
-   /* -00B0, */  0x6f, 0x78, 0x79, 0x20, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 
-   /* -00C0, */  0x6f, 0x6e, 0x20, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 
-   /* -00D0, */  0x2d, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x34, 0x38, 0x34, 0x20, 0x41, 0x64, 
-   /* -00E0, */  0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x49, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 
-   /* -00F0, */  0x6c, 0x65, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x2d, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x34, 0x39, 
-   /* -0100, */  0x34, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x41, 0x67, 0x72, 0x65, 0x65, 
-   /* -0110, */  0x6d, 0x65, 0x6e, 0x74, 0x20, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x65, 0x61, 0x63, 
-   /* -0120, */  0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x64, 0x34, 0x38, 0x31, 0x20, 0x43, 0x61, 0x6c, 0x6c, 0x2f, 
-   /* -0130, */  0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x44, 0x6f, 0x65, 0x73, 
-   /* -0140, */  0x20, 0x4e, 0x6f, 0x74, 0x20, 0x45, 0x78, 0x69, 0x73, 0x74, 0x61, 0x6c, 0x65, 0x3d, 0x35, 0x30,       
-   /* -0150, */  0x30, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61,
-   /* -0160, */  0x6c, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x6f, 0x62, 0x75, 0x73, 0x74, 0x2d, 0x73, 0x6f, 0x72, 
-   /* -0170, */  0x74, 0x69, 0x6e, 0x67, 0x3d, 0x34, 0x31, 0x36, 0x20, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f,
-   /* -0180, */  0x72, 0x74, 0x65, 0x64, 0x20, 0x55, 0x52, 0x49, 0x20, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x72,
-   /* -0190, */  0x67, 0x65, 0x6e, 0x63, 0x79, 0x34, 0x31, 0x35, 0x20, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 
-   /* -01A0, */  0x72, 0x74, 0x65, 0x64, 0x20, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x54, 0x79, 0x70, 0x65, 0x6e, 
-   /* -01B0, */  0x64, 0x69, 0x6e, 0x67, 0x34, 0x38, 0x38, 0x20, 0x4e, 0x6f, 0x74, 0x20, 0x41, 0x63, 0x63, 0x65, 
-   /* -01C0, */  0x70, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x48, 0x65, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 
-   /* -01D0, */  0x64, 0x34, 0x32, 0x33, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x20, 0x54, 0x6f, 
-   /* -01E0, */  0x6f, 0x20, 0x42, 0x72, 0x69, 0x65, 0x66, 0x72, 0x6f, 0x6d, 0x2d, 0x74, 0x61, 0x67, 0x51, 0x2e, 
-   /* -01F0, */  0x38, 0x35, 0x30, 0x35, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x4e, 0x6f, 0x74, 
-   /* -0200, */  0x20, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x34, 0x30, 0x33, 0x20, 0x46, 0x6f,
-   /* -0210, */  0x72, 0x62, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x6f, 0x6e, 0x2d, 0x75, 0x72, 0x67, 0x65, 0x6e, 0x74, 
-   /* -0220, */  0x34, 0x32, 0x39, 0x20, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20, 0x52, 0x65, 0x66, 0x65, 
-   /* -0230, */  0x72, 0x72, 0x6f, 0x72, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x34, 0x32, 0x30,         
-   /* -0240, */  0x20, 0x42, 0x61, 0x64, 0x20, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x6f, 0x72,
-   /* -0250, */  0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x0d, 0x0a, 0x61, 0x3d, 0x6b, 0x65, 0x79, 0x2d, 0x6d, 
-   /* -0260, */  0x67, 0x6d, 0x74, 0x3a, 0x6d, 0x69, 0x6b, 0x65, 0x79, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x53, 
-   /* -0270, */  0x20, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x35, 0x30, 0x34, 0x20, 0x53,
-   /* -0280, */  0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x2d, 0x6f, 0x75, 0x74, 0x6f, 0x2d, 
-   /* -0290, */  0x74, 0x61, 0x67, 0x0d, 0x0a, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 
-   /* -02A0, */  0x69, 0x6f, 0x6e, 0x2d, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x20, 0x44, 0x65, 0x63, 0x20, 0x33, 0x38, 
-   /* -02B0, */  0x30, 0x20, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x53, 0x65, 
-   /* -02C0, */  0x72, 0x76, 0x69, 0x63, 0x65, 0x35, 0x30, 0x33, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 
-   /* -02D0, */  0x20, 0x55, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x34, 0x32, 0x31, 0x20,       
-   /* -02E0, */  0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 
-   /* -02F0, */  0x65, 0x64, 0x34, 0x30, 0x35, 0x20, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x4e, 0x6f, 0x74, 
-   /* -0300, */  0x20, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x34, 0x38, 0x37, 0x20, 0x52, 0x65, 0x71, 0x75,
-   /* -0310, */  0x65, 0x73, 0x74, 0x20, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x61, 0x75, 
-   /* -0320, */  0x74, 0x68, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6c, 0x65, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x3d, 
-   /* -0330, */  0x0d, 0x0a, 0x6d, 0x3d, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,        
-   /* -0340, */  0x41, 0x75, 0x67, 0x20, 0x35, 0x31, 0x33, 0x20, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20,        
-   /* -0350, */  0x54, 0x6f, 0x6f, 0x20, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x36, 0x38, 0x37, 0x20, 0x44, 0x69, 0x61, 
-   /* -0360, */  0x6c, 0x6f, 0x67, 0x20, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x33, 0x30,         
-   /* -0370, */  0x32, 0x20, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x54, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72,
-   /* -0380, */  0x69, 0x6c, 0x79, 0x33, 0x30, 0x31, 0x20, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x50, 0x65, 0x72, 
-   /* -0390, */  0x6d, 0x61, 0x6e, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 
-   /* -03A0, */  0x74, 0x2f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x0d, 0x0a, 0x52, 0x65, 0x74, 0x72, 0x79, 0x2d, 
-   /* -03B0, */  0x41, 0x66, 0x74, 0x65, 0x72, 0x3a, 0x20, 0x47, 0x4d, 0x54, 0x68, 0x75, 0x2c, 0x20, 0x34, 0x30,        
-   /* -03C0, */  0x32, 0x20, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 
-   /* -03D0, */  0x65, 0x64, 0x0d, 0x0a, 0x61, 0x3d, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x3a, 0x6c, 0x61, 0x6e, 
-   /* -03E0, */  0x64, 0x73, 0x63, 0x61, 0x70, 0x65, 0x34, 0x30, 0x30, 0x20, 0x42, 0x61, 0x64, 0x20, 0x52, 0x65, 
-   /* -03F0, */  0x71, 0x75, 0x65, 0x73, 0x74, 0x72, 0x75, 0x65, 0x34, 0x39, 0x31, 0x20, 0x52, 0x65, 0x71, 0x75, 
-   /* -0400, */  0x65, 0x73, 0x74, 0x20, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x35, 0x30, 0x31, 0x20, 0x4e, 
-   /* -0410, */  0x6f, 0x74, 0x20, 0x49, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x34, 0x30,        
-   /* -0420, */  0x36, 0x20, 0x4e, 0x6f, 0x74, 0x20, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x61, 0x62, 0x6c, 0x65, 
-   /* -0430, */  0x36, 0x30, 0x36, 0x20, 0x4e, 0x6f, 0x74, 0x20, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x61, 0x62, 
-   /* -0440, */  0x6c, 0x65, 0x0d, 0x0a, 0x61, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x62, 0x72, 0x6f, 0x61, 0x64, 
-   /* -0450, */  0x63, 0x61, 0x73, 0x74, 0x6f, 0x6e, 0x65, 0x34, 0x39, 0x33, 0x20, 0x55, 0x6e, 0x64, 0x65, 0x63, 
-   /* -0460, */  0x69, 0x70, 0x68, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x0d, 0x0a, 0x4d, 0x49, 0x4d, 0x45, 0x2d, 
-   /* -0470, */  0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x4d, 0x61, 0x79, 0x20, 0x34, 0x38, 0x32, 
-   /* -0480, */  0x20, 0x4c, 0x6f, 0x6f, 0x70, 0x20, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x0d, 0x0a,
-   /* -0490, */  0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x4a, 0x75, 
-   /* -04A0, */  0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x2d, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2d, 0x6e, 0x65, 
-   /* -04B0, */  0x69, 0x67, 0x68, 0x62, 0x6f, 0x72, 0x3d, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x65, 
-   /* -04C0, */  0x72, 0x74, 0x63, 0x70, 0x2d, 0x66, 0x62, 0x34, 0x38, 0x39, 0x20, 0x42, 0x61, 0x64, 0x20, 0x45, 
-   /* -04D0, */  0x76, 0x65, 0x6e, 0x74, 0x6c, 0x73, 0x0d, 0x0a, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 
-   /* -04E0, */  0x74, 0x65, 0x64, 0x3a, 0x20, 0x4a, 0x61, 0x6e, 0x20, 0x35, 0x30, 0x32, 0x20, 0x42, 0x61, 0x64, 
-   /* -04F0, */  0x20, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x6d, 0x6f, 0x64, 0x65, 0x2d, 0x63, 0x68, 0x61, 
-   /* -0500, */  0x6e, 0x67, 0x65, 0x2d, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x3d, 0x0d, 0x0a, 0x61, 0x3d, 0x6f, 
-   /* -0510, */  0x72, 0x69, 0x65, 0x6e, 0x74, 0x3a, 0x73, 0x65, 0x61, 0x73, 0x63, 0x61, 0x70, 0x65, 0x0d, 0x0a, 
-   /* -0520, */  0x61, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x6d, 0x6f, 0x64, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 
-   /* -0530, */  0x34, 0x30, 0x34, 0x20, 0x4e, 0x6f, 0x74, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x33, 0x30, 0x35, 
-   /* -0540, */  0x20, 0x55, 0x73, 0x65, 0x20, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x0d, 0x0a, 0x61, 0x3d, 0x74, 0x79,
-   /* -0550, */  0x70, 0x65, 0x3a, 0x72, 0x65, 0x63, 0x76, 0x6f, 0x6e, 0x6c, 0x79, 0x0d, 0x0a, 0x61, 0x3d, 0x74, 
-   /* -0560, */  0x79, 0x70, 0x65, 0x3a, 0x6d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x0d, 0x0a, 0x6b, 0x3d, 0x70,       
-   /* -0570, */  0x72, 0x6f, 0x6d, 0x70, 0x74, 0x3a, 0x0d, 0x0a, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 
-   /* -0580, */  0x2d, 0x42, 0x79, 0x3a, 0x20, 0x0d, 0x0a, 0x49, 0x6e, 0x2d, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2d, 
-   /* -0590, */  0x54, 0x6f, 0x3a, 0x20, 0x54, 0x52, 0x55, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x3a, 
-   /* -05A0, */  0x20, 0x31, 0x38, 0x32, 0x20, 0x51, 0x75, 0x65, 0x75, 0x65, 0x64, 0x41, 0x75, 0x74, 0x68, 0x65, 
-   /* -05B0, */  0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x3a, 0x20, 0x0d, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x2d, 
-   /* -05C0, */  0x41, 0x67, 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x0d, 0x0a, 0x61, 0x3d, 0x66, 0x72, 0x61, 0x6d, 0x65, 
-   /* -05D0, */  0x72, 0x61, 0x74, 0x65, 0x3a, 0x0d, 0x0a, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x2d, 0x49, 0x6e, 0x66, 
-   /* -05E0, */  0x6f, 0x3a, 0x20, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x20, 0x0d, 0x0a, 0x61, 0x3d, 0x6d, 0x61, 
-   /* -05F0, */  0x78, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x3a, 0x3b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x2d, 0x61, 0x66, 
-   /* -0600, */  0x74, 0x65, 0x72, 0x3d, 0x75, 0x61, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x3d, 0x34, 
-   /* -0610, */  0x31, 0x30, 0x20, 0x47, 0x6f, 0x6e, 0x65, 0x0d, 0x0a, 0x52, 0x65, 0x66, 0x65, 0x72, 0x2d, 0x54, 
-   /* -0620, */  0x6f, 0x3a, 0x20, 0x0d, 0x0a, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x3a, 0x20, 0x0d, 
-   /* -0630, */  0x0a, 0x6d, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x20, 0x0d, 0x0a, 0x61, 0x3d, 0x71, 
-   /* -0640, */  0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x3a, 0x0d, 0x0a, 0x61, 0x3d, 0x73, 0x64, 0x70, 0x6c, 0x61, 
-   /* -0650, */  0x6e, 0x67, 0x3a, 0x0d, 0x0a, 0x61, 0x3d, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3a, 0x0d, 
-   /* -0660, */  0x0a, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x3a, 0x20, 0x52, 0x45, 0x46, 0x45, 0x52, 
-   /* -0670, */  0x20, 0x69, 0x70, 0x73, 0x65, 0x63, 0x2d, 0x69, 0x6b, 0x65, 0x3b, 0x74, 0x72, 0x61, 0x6e, 0x73,
-   /* -0680, */  0x70, 0x6f, 0x72, 0x74, 0x3d, 0x0d, 0x0a, 0x61, 0x3d, 0x6b, 0x65, 0x79, 0x77, 0x64, 0x73, 0x3a, 
-   /* -0690, */  0x0d, 0x0a, 0x6b, 0x3d, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x3a, 0x3b, 0x72, 0x65, 0x66, 0x72, 
-   /* -06A0, */  0x65, 0x73, 0x68, 0x65, 0x72, 0x3d, 0x0d, 0x0a, 0x61, 0x3d, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x3a, 
-   /* -06B0, */  0x0d, 0x0a, 0x6b, 0x3d, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x3a, 0x3b, 0x72, 0x65, 0x63, 0x65, 0x69, 
-   /* -06C0, */  0x76, 0x65, 0x64, 0x3d, 0x3b, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x0d, 0x0a, 
-   /* -06D0, */  0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x3a, 0x20, 0x0d, 0x0a, 0x61, 0x3d, 0x67, 0x72, 0x6f, 0x75, 
-   /* -06E0, */  0x70, 0x3a, 0x46, 0x41, 0x4c, 0x53, 0x45, 0x3a, 0x20, 0x49, 0x4e, 0x46, 0x4f, 0x20, 0x0d, 0x0a, 
-   /* -06F0, */  0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x0d, 0x0a, 0x61, 0x3d, 0x6c, 0x61, 0x6e, 0x67, 0x3a, 
-   /* -0700, */  0x0d, 0x0a, 0x6d, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x2d, 0x73, 0x65, 
-   /* -0710, */  0x74, 0x3d, 0x0d, 0x0a, 0x61, 0x3d, 0x74, 0x6f, 0x6f, 0x6c, 0x3a, 0x54, 0x4c, 0x53, 0x75, 0x6e, 
-   /* -0720, */  0x2c, 0x20, 0x0d, 0x0a, 0x44, 0x61, 0x74, 0x65, 0x3a, 0x20, 0x0d, 0x0a, 0x61, 0x3d, 0x63, 0x61, 
-   /* -0730, */  0x74, 0x3a, 0x0d, 0x0a, 0x6b, 0x3d, 0x75, 0x72, 0x69, 0x3a, 0x0d, 0x0a, 0x50, 0x72, 0x6f, 0x78, 
-   /* -0740, */  0x79, 0x2d, 0x3b, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x3d, 0x3b, 0x6d, 0x65, 0x74, 0x68, 0x6f, 
-   /* -0750, */  0x64, 0x3d, 0x0d, 0x0a, 0x61, 0x3d, 0x6d, 0x69, 0x64, 0x3a, 0x3b, 0x6d, 0x61, 0x64, 0x64, 0x72, 
-   /* -0760, */  0x3d, 0x6f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x3d, 0x0d, 0x0a, 0x4d, 0x69, 0x6e, 0x2d, 0x3b, 0x61, 
-   /* -0770, */  0x6c, 0x67, 0x3d, 0x4d, 0x6f, 0x6e, 0x2c, 0x20, 0x54, 0x75, 0x65, 0x2c, 0x20, 0x57, 0x65, 0x64, 
-   /* -0780, */  0x2c, 0x20, 0x46, 0x72, 0x69, 0x2c, 0x20, 0x53, 0x61, 0x74, 0x2c, 0x20, 0x3b, 0x74, 0x74, 0x6c, 
-   /* -0790, */  0x3d, 0x61, 0x75, 0x74, 0x73, 0x3d, 0x0d, 0x0a, 0x72, 0x3d, 0x0d, 0x0a, 0x7a, 0x3d, 0x0d, 0x0a, 
-   /* -07A0, */  0x65, 0x3d, 0x3b, 0x69, 0x64, 0x3d, 0x0d, 0x0a, 0x69, 0x3d, 0x63, 0x72, 0x63, 0x3d, 0x0d, 0x0a, 
-   /* -07B0, */  0x75, 0x3d, 0x3b, 0x71, 0x3d, 0x75, 0x61, 0x73, 0x34, 0x31, 0x34, 0x20, 0x52, 0x65, 0x71, 0x75, 
-   /* -07C0, */  0x65, 0x73, 0x74, 0x2d, 0x55, 0x52, 0x49, 0x20, 0x54, 0x6f, 0x6f, 0x20, 0x4c, 0x6f, 0x6e, 0x67, 
-   /* -07D0, */  0x69, 0x76, 0x65, 0x75, 0x70, 0x72, 0x69, 0x76, 0x61, 0x63, 0x79, 0x75, 0x64, 0x70, 0x72, 0x65, 
-   /* -07E0, */  0x66, 0x65, 0x72, 0x36, 0x30, 0x30, 0x20, 0x42, 0x75, 0x73, 0x79, 0x20, 0x45, 0x76, 0x65, 0x72, 
-   /* -07F0, */  0x79, 0x77, 0x68, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x34, 0x38, 0x30, 0x20,       
-   /* -0800, */  0x54, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x69, 0x6c, 0x79, 0x20, 0x55, 0x6e, 0x61, 0x76, 
-   /* -0810, */  0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x0d, 0x0a, 0x61, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x3a, 
-   /* -0820, */  0x48, 0x2e, 0x33, 0x33, 0x32, 0x30, 0x32, 0x20, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 
-   /* -0830, */  0x0d, 0x0a, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2d, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 
-   /* -0840, */  0x73, 0x3a, 0x20, 0x0d, 0x0a, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 
-   /* -0850, */  0x6e, 0x2d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x3a, 0x20, 0x4e, 0x6f, 0x76, 0x20, 0x0d, 0x0a, 0x53, 
-   /* -0860, */  0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x3a, 0x20, 0x53, 0x65, 
-   /* -0870, */  0x70, 0x20, 0x0d, 0x0a, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x2d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 
-   /* -0880, */  0x3a, 0x20, 0x46, 0x65, 0x62, 0x20, 0x0d, 0x0a, 0x61, 0x3d, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 
-   /* -0890, */  0x76, 0x65, 0x52, 0x54, 0x50, 0x2f, 0x53, 0x41, 0x56, 0x50, 0x20, 0x52, 0x54, 0x50, 0x2f, 0x41, 
-   /* -08A0, */  0x56, 0x50, 0x46, 0x20, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x69, 0x70, 0x73, 
-   /* -08B0, */  0x3a, 0x0d, 0x0a, 0x61, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x74, 0x65, 0x73, 0x74, 0x65, 0x6c, 
-   /* -08C0, */  0x3a, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x20, 0x0d, 0x0a, 0x61, 0x3d, 0x72, 0x65, 0x63, 
-   /* -08D0, */  0x76, 0x6f, 0x6e, 0x6c, 0x79, 0x0d, 0x0a, 0x61, 0x3d, 0x73, 0x65, 0x6e, 0x64, 0x6f, 0x6e, 0x6c, 
-   /* -08E0, */  0x79, 0x0d, 0x0a, 0x63, 0x3d, 0x49, 0x4e, 0x20, 0x49, 0x50, 0x34, 0x20, 0x0d, 0x0a, 0x52, 0x65, 
-   /* -08F0, */  0x61, 0x73, 0x6f, 0x6e, 0x3a, 0x20, 0x0d, 0x0a, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x3a, 0x20, 0x0d, 
-   /* -0900, */  0x0a, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x0d, 0x0a, 0x50, 0x61, 0x74, 0x68, 0x3a, 0x20,        
-   /* -0910, */  0x3b, 0x75, 0x73, 0x65, 0x72, 0x3d, 0x0d, 0x0a, 0x62, 0x3d, 0x41, 0x53, 0x20, 0x43, 0x54, 0x20,       
-   /* -0920, */  0x0d, 0x0a, 0x57, 0x57, 0x57, 0x2d, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 
-   /* -0930, */  0x74, 0x65, 0x3a, 0x20, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x20, 0x0d, 0x0a, 0x61, 0x3d, 0x73, 
-   /* -0940, */  0x65, 0x6e, 0x64, 0x72, 0x65, 0x63, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x2d, 
-   /* -0950, */  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 
-   /* -0960, */  0x6e, 0x2f, 0x73, 0x64, 0x70, 0x61, 0x74, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x70, 0x61, 
-   /* -0970, */  0x75, 0x74, 0x68, 0x3d, 0x0d, 0x0a, 0x61, 0x3d, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x3a, 0x70,        
-   /* -0980, */  0x6f, 0x72, 0x74, 0x72, 0x61, 0x69, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x74, 0x72, 0x2d, 
-   /* -0990, */  0x69, 0x6e, 0x74, 0x69, 0x63, 0x6f, 0x6e, 0x63, 0x3d, 0x34, 0x38, 0x33, 0x20, 0x54, 0x6f, 0x6f, 
-   /* -09A0, */  0x20, 0x4d, 0x61, 0x6e, 0x79, 0x20, 0x48, 0x6f, 0x70, 0x73, 0x6c, 0x69, 0x6e, 0x66, 0x6f, 0x70,         
-   /* -09B0, */  0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x3d, 0x36, 0x30,        
-   /* -09C0, */  0x34, 0x20, 0x44, 0x6f, 0x65, 0x73, 0x20, 0x4e, 0x6f, 0x74, 0x20, 0x45, 0x78, 0x69, 0x73, 0x74, 
-   /* -09D0, */  0x20, 0x41, 0x6e, 0x79, 0x77, 0x68, 0x65, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3d, 
-   /* -09E0, */  0x0d, 0x0a, 0x0d, 0x0a, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2d, 0x44, 0x69, 0x73, 0x70,       
-   /* -09F0, */  0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x4d, 0x44, 0x35, 0x38, 0x30, 0x20, 0x50,         
-   /* -0A00, */  0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x46, 0x61, 0x69, 0x6c, 
-   /* -0A10, */  0x75, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x34, 0x32, 0x32, 0x20, 0x53, 0x65, 0x73, 
-   /* -0A20, */  0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x20, 0x54, 0x6f, 
-   /* -0A30, */  0x6f, 0x20, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x31, 0x38, 0x31, 0x20, 0x43, 
-   /* -0A40, */  0x61, 0x6c, 0x6c, 0x20, 0x49, 0x73, 0x20, 0x42, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x46, 0x6f, 0x72, 
-   /* -0A50, */  0x77, 0x61, 0x72, 0x64, 0x65, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x3d, 0x66, 0x61, 0x69, 0x6c, 
-   /* -0A60, */  0x75, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x61, 0x6c, 0x6d, 0x3d, 0x53, 0x55, 0x42, 0x53, 
-   /* -0A70, */  0x43, 0x52, 0x49, 0x42, 0x45, 0x20, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 
-   /* -0A80, */  0x6f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x70, 0x73, 0x65, 0x63, 0x2d, 0x6d, 0x61, 0x6e, 
-   /* -0A90, */  0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x34, 0x31, 0x33, 0x20, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 
-   /* -0AA0, */  0x74, 0x20, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x54, 0x6f, 0x6f, 0x20, 0x4c, 0x61, 0x72, 
-   /* -0AB0, */  0x67, 0x65, 0x32, 0x65, 0x31, 0x38, 0x33, 0x20, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20,        
-   /* -0AC0, */  0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x63, 0x74, 0x70, 0x34, 0x38, 0x36, 0x20, 0x42, 
-   /* -0AD0, */  0x75, 0x73, 0x79, 0x20, 0x48, 0x65, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 
-   /* -0AE0, */  0x61, 0x74, 0x65, 0x64, 0x41, 0x4b, 0x41, 0x76, 0x31, 0x2d, 0x4d, 0x44, 0x35, 0x2d, 0x73, 0x65, 
-   /* -0AF0, */  0x73, 0x73, 0x69, 0x6f, 0x6e, 0x6f, 0x6e, 0x65, 0x0d, 0x0a, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 
-   /* -0B00, */  0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x36, 0x30, 0x33, 0x20, 0x44, 0x65, 0x63, 
-   /* -0B10, */  0x6c, 0x69, 0x6e, 0x65, 0x78, 0x74, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x3d, 0x34, 0x38, 0x35, 0x20,         
-   /* -0B20, */  0x41, 0x6d, 0x62, 0x69, 0x67, 0x75, 0x6f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 
-   /* -0B30, */  0x61, 0x75, 0x64, 0x69, 0x6f, 0x0d, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x54, 
-   /* -0B40, */  0x79, 0x70, 0x65, 0x3a, 0x20, 0x4d, 0x61, 0x72, 0x20, 0x0d, 0x0a, 0x52, 0x65, 0x63, 0x6f, 0x72, 
-   /* -0B50, */  0x64, 0x2d, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x3a, 0x20, 0x4a, 0x75, 0x6c, 0x20, 0x34, 0x30, 0x31,
-   /* -0B60, */  0x20, 0x55, 0x6e, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x0d, 0x0a, 0x52,
-   /* -0B70, */  0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x3a, 0x20, 0x0d, 0x0a, 0x74, 0x3d, 0x30, 0x20, 0x30, 0x2e, 
-   /* -0B80, */  0x30, 0x2e, 0x30, 0x2e, 0x30, 0x0d, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x52, 
-   /* -0B90, */  0x45, 0x47, 0x49, 0x53, 0x54, 0x45, 0x52, 0x20, 0x0d, 0x0a, 0x63, 0x3d, 0x49, 0x4e, 0x20, 0x49, 
-   /* -0BA0, */  0x50, 0x36, 0x20, 0x31, 0x38, 0x30, 0x20, 0x52, 0x69, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x31, 0x30,    
-   /* -0BB0, */  0x30, 0x20, 0x54, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x76, 0x3d, 0x30, 0x0d, 0x0a, 0x6f, 0x3d, 0x55, 
-   /* -0BC0, */  0x50, 0x44, 0x41, 0x54, 0x45, 0x20, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x59, 0x20, 0x0d, 0x0a, 0x53, 
-   /* -0BD0, */  0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x3a, 0x20, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 
-   /* -0BE0, */  0x6e, 0x41, 0x4d, 0x52, 0x54, 0x50, 0x2f, 0x41, 0x56, 0x50, 0x20, 0x0d, 0x0a, 0x50, 0x72, 0x69, 
-   /* -0BF0, */  0x76, 0x61, 0x63, 0x79, 0x3a, 0x20, 0x0d, 0x0a, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 
-   /* -0C00, */  0x2d, 0x0d, 0x0a, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x3a, 0x20, 0x0d, 0x0a, 0x61, 0x3d, 
-   /* -0C10, */  0x72, 0x74, 0x70, 0x6d, 0x61, 0x70, 0x3a, 0x0d, 0x0a, 0x6d, 0x3d, 0x76, 0x69, 0x64, 0x65, 0x6f, 
-   /* -0C20, */  0x20, 0x0d, 0x0a, 0x6d, 0x3d, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x20, 0x0d, 0x0a, 0x73, 0x3d, 0x20,         
-   /* -0C30, */  0x66, 0x61, 0x6c, 0x73, 0x65, 0x0d, 0x0a, 0x61, 0x3d, 0x63, 0x6f, 0x6e, 0x66, 0x3a, 0x3b, 0x65, 
-   /* -0C40, */  0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x3d, 0x0d, 0x0a, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x3a, 0x20,
-   /* -0C50, */  0x0d, 0x0a, 0x61, 0x3d, 0x66, 0x6d, 0x74, 0x70, 0x3a, 0x0d, 0x0a, 0x61, 0x3d, 0x63, 0x75, 0x72, 
-   /* -0C60, */  0x72, 0x3a, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 
-   /* -0C70, */  0x3a, 0x20, 0x0d, 0x0a, 0x61, 0x3d, 0x64, 0x65, 0x73, 0x3a, 0x0d, 0x0a, 0x52, 0x41, 0x63, 0x6b, 
-   /* -0C80, */  0x3a, 0x20, 0x0d, 0x0a, 0x52, 0x53, 0x65, 0x71, 0x3a, 0x20, 0x42, 0x59, 0x45, 0x20, 0x63, 0x6e, 
-   /* -0C90, */  0x6f, 0x6e, 0x63, 0x65, 0x3d, 0x31, 0x30, 0x30, 0x72, 0x65, 0x6c, 0x75, 0x72, 0x69, 0x3d, 0x71, 
-   /* -0CA0, */  0x6f, 0x70, 0x3d, 0x54, 0x43, 0x50, 0x55, 0x44, 0x50, 0x71, 0x6f, 0x73, 0x78, 0x6d, 0x6c, 0x3b, 
-   /* -0CB0, */  0x6c, 0x72, 0x0d, 0x0a, 0x56, 0x69, 0x61, 0x3a, 0x20, 0x53, 0x49, 0x50, 0x2f, 0x32, 0x2e, 0x30,      
-   /* -0CC0, */  0x2f, 0x54, 0x43, 0x50, 0x20, 0x34, 0x30, 0x38, 0x20, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 
-   /* -0CD0, */  0x20, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x70, 0x73, 0x69, 0x70,        
-   /* -0CE0, */  0x3a, 0x0d, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x4c, 0x65, 0x6e, 0x67, 0x74,
-   /* -0CF0, */  0x68, 0x3a, 0x20, 0x4f, 0x63, 0x74, 0x20, 0x0d, 0x0a, 0x56, 0x69, 0x61, 0x3a, 0x20, 0x53, 0x49, 
-   /* -0D00, */  0x50, 0x2f, 0x32, 0x2e, 0x30, 0x2f, 0x55, 0x44, 0x50, 0x20, 0x3b, 0x63, 0x6f, 0x6d, 0x70, 0x3d, 
-   /* -0D10, */  0x73, 0x69, 0x67, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x6f, 0x62, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 
-   /* -0D20, */  0x63, 0x6b, 0x3b, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x3d, 0x7a, 0x39, 0x68, 0x47, 0x34, 0x62, 
-   /* -0D30, */  0x4b, 0x0d, 0x0a, 0x4d, 0x61, 0x78, 0x2d, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x73, 0x3a, 
-   /* -0D40, */  0x20, 0x41, 0x70, 0x72, 0x20, 0x53, 0x43, 0x54, 0x50, 0x52, 0x41, 0x43, 0x4b, 0x20, 0x49, 0x4e, 
-   /* -0D50, */  0x56, 0x49, 0x54, 0x45, 0x20, 0x0d, 0x0a, 0x43, 0x61, 0x6c, 0x6c, 0x2d, 0x49, 0x44, 0x3a, 0x20,         
-   /* -0D60, */  0x0d, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x3a, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4f, 
-   /* -0D70, */  0x4b, 0x0d, 0x0a, 0x46, 0x72, 0x6f, 0x6d, 0x3a, 0x20, 0x0d, 0x0a, 0x43, 0x53, 0x65, 0x71, 0x3a, 
-   /* -0D80, */  0x20, 0x0d, 0x0a, 0x54, 0x6f, 0x3a, 0x20, 0x3b, 0x74, 0x61, 0x67, 0x3d, 0x04, 0x10, 0xdd, 0x10,        
-   /* -0D90, */  0x11, 0x31, 0x0d, 0x11, 0x0a, 0x07, 0x10, 0xb9, 0x0c, 0x10, 0xfe, 0x12, 0x10, 0xe1, 0x06, 0x11,
-   /* -0DA0, */  0x4e, 0x07, 0x11, 0x4e, 0x03, 0x11, 0x4a, 0x04, 0x11, 0x4a, 0x07, 0x10, 0xb2, 0x08, 0x11, 0x79, 
-   /* -0DB0, */  0x06, 0x11, 0x81, 0x0f, 0x11, 0x22, 0x0b, 0x11, 0x55, 0x06, 0x11, 0x6b, 0x0b, 0x11, 0x60, 0x13, 
-   /* -0DC0, */  0x10, 0xb2, 0x08, 0x11, 0x71, 0x05, 0x11, 0x87, 0x13, 0x10, 0xf7, 0x09, 0x0e, 0x8d, 0x08, 0x0d, 
-   /* -0DD0, */  0xae, 0x0c, 0x10, 0xb9, 0x07, 0x10, 0x8e, 0x03, 0x0d, 0x96, 0x03, 0x10, 0x8a, 0x04, 0x10, 0x8a, 
-   /* -0DE0, */  0x09, 0x0d, 0xd7, 0x0a, 0x0f, 0x12, 0x08, 0x0f, 0x8f, 0x09, 0x0f, 0x8f, 0x08, 0x0d, 0x6c, 0x06, 
-   /* -0DF0, */  0x0e, 0x66, 0x09, 0x0e, 0x6c, 0x0a, 0x0e, 0x6c, 0x06, 0x0f, 0xc6, 0x07, 0x0f, 0xc6, 0x05, 0x11, 
-   /* -0E00, */  0x48, 0x06, 0x11, 0x48, 0x06, 0x0f, 0xbf, 0x07, 0x0f, 0xbf, 0x07, 0x0e, 0x55, 0x06, 0x0f, 0x16, 
-   /* -0E10, */  0x04, 0x0e, 0xf4, 0x03, 0x0e, 0xb1, 0x03, 0x10, 0xa6, 0x09, 0x10, 0x50, 0x03, 0x10, 0xa3, 0x0a, 
-   /* -0E20, */  0x0d, 0xb4, 0x05, 0x0e, 0x36, 0x06, 0x0e, 0xd6, 0x03, 0x0d, 0xf9, 0x11, 0x0e, 0xf8, 0x04, 0x0c,
-   /* -0E30, */  0xd9, 0x08, 0x0e, 0xea, 0x04, 0x09, 0x53, 0x03, 0x0a, 0x4b, 0x04, 0x0e, 0xe4, 0x10, 0x0f, 0x35, 
-   /* -0E40, */  0x09, 0x0e, 0xe4, 0x08, 0x0d, 0x3f, 0x03, 0x0f, 0xe1, 0x0b, 0x10, 0x01, 0x03, 0x10, 0xac, 0x06,
-   /* -0E50, */  0x10, 0x95, 0x0c, 0x0e, 0x76, 0x0b, 0x0f, 0xeb, 0x0a, 0x0f, 0xae, 0x05, 0x10, 0x2b, 0x04, 0x10, 
-   /* -0E60, */  0x2b, 0x08, 0x10, 0x7a, 0x10, 0x0f, 0x49, 0x07, 0x0f, 0xb8, 0x09, 0x10, 0x3e, 0x0b, 0x10, 0x0c, 
-   /* -0E70, */  0x07, 0x0f, 0x78, 0x0b, 0x0f, 0x6d, 0x09, 0x10, 0x47, 0x08, 0x10, 0x82, 0x0b, 0x0f, 0xf6, 0x08, 
-   /* -0E80, */  0x10, 0x62, 0x08, 0x0f, 0x87, 0x08, 0x10, 0x6a, 0x04, 0x0f, 0x78, 0x0d, 0x0f, 0xcd, 0x08, 0x0d, 
-   /* -0E90, */  0xae, 0x10, 0x0f, 0x5d, 0x0b, 0x0f, 0x98, 0x14, 0x0d, 0x20, 0x1b, 0x0d, 0x20, 0x04, 0x0d, 0xe0,        
-   /* -0EA0, */  0x14, 0x0e, 0xb4, 0x0b, 0x0f, 0xa3, 0x0b, 0x07, 0x34, 0x0f, 0x0d, 0x56, 0x04, 0x0e, 0xf4, 0x03, 
-   /* -0EB0, */  0x10, 0xaf, 0x07, 0x0d, 0x34, 0x09, 0x0f, 0x27, 0x04, 0x10, 0x9b, 0x04, 0x10, 0x9f, 0x09, 0x10,       
-   /* -0EC0, */  0x59, 0x08, 0x10, 0x72, 0x09, 0x10, 0x35, 0x0a, 0x10, 0x21, 0x0a, 0x10, 0x17, 0x08, 0x0f, 0xe3, 
-   /* -0ED0, */  0x03, 0x10, 0xa9, 0x05, 0x0c, 0xac, 0x04, 0x0c, 0xbd, 0x07, 0x0c, 0xc1, 0x08, 0x0c, 0xc1, 0x09, 
-   /* -0EE0, */  0x0c, 0xf6, 0x10, 0x0c, 0x72, 0x0c, 0x0c, 0x86, 0x04, 0x0d, 0x64, 0x0c, 0x0c, 0xd5, 0x09, 0x0c, 
-   /* -0EF0, */  0xff, 0x1b, 0x0b, 0xfc, 0x11, 0x0c, 0x5d, 0x13, 0x0c, 0x30, 0x09, 0x0c, 0xa4, 0x0c, 0x0c, 0x24, 
-   /* -0F00, */  0x0c, 0x0d, 0x3b, 0x03, 0x0d, 0x1a, 0x03, 0x0d, 0x1d, 0x16, 0x0c, 0x43, 0x09, 0x0c, 0x92, 0x09, 
-   /* -0F10, */  0x0c, 0x9b, 0x0d, 0x0e, 0xcb, 0x04, 0x0d, 0x16, 0x06, 0x0d, 0x10, 0x05, 0x04, 0xf2, 0x0b, 0x0c, 
-   /* -0F20, */  0xe1, 0x05, 0x0b, 0xde, 0x0a, 0x0c, 0xec, 0x13, 0x0b, 0xe3, 0x07, 0x0b, 0xd4, 0x08, 0x0d, 0x08, 
-   /* -0F30, */  0x0c, 0x0c, 0xc9, 0x09, 0x0c, 0x3a, 0x04, 0x0a, 0xe5, 0x0c, 0x0a, 0x23, 0x08, 0x0b, 0x3a, 0x0e, 
-   /* -0F40, */  0x09, 0xab, 0x0f, 0x0e, 0xfa, 0x09, 0x0f, 0x6f, 0x0c, 0x0a, 0x17, 0x0f, 0x09, 0x76, 0x0c, 0x0a, 
-   /* -0F50, */  0x5f, 0x17, 0x0d, 0xe2, 0x0f, 0x07, 0xa8, 0x0a, 0x0f, 0x85, 0x0f, 0x08, 0xd6, 0x0e, 0x09, 0xb9, 
-   /* -0F60, */  0x0b, 0x0a, 0x7a, 0x03, 0x0b, 0xdb, 0x03, 0x08, 0xc1, 0x04, 0x0e, 0xc7, 0x03, 0x08, 0xd3, 0x02, 
-   /* -0F70, */  0x04, 0x8d, 0x08, 0x0b, 0x4a, 0x05, 0x0b, 0x8c, 0x07, 0x0b, 0x61, 0x06, 0x05, 0x48, 0x04, 0x07, 
-   /* -0F80, */  0xf4, 0x05, 0x10, 0x30, 0x04, 0x07, 0x1e, 0x08, 0x07, 0x1e, 0x05, 0x0b, 0x91, 0x10, 0x04, 0xca, 
-   /* -0F90, */  0x09, 0x0a, 0x71, 0x09, 0x0e, 0x87, 0x05, 0x04, 0x98, 0x05, 0x0b, 0x6e, 0x0b, 0x04, 0x9b, 0x0f, 
-   /* -0FA0, */  0x04, 0x9b, 0x07, 0x04, 0x9b, 0x03, 0x04, 0xa3, 0x07, 0x04, 0xa3, 0x10, 0x07, 0x98, 0x09, 0x07, 
-   /* -0FB0, */  0x98, 0x05, 0x0b, 0x73, 0x05, 0x0b, 0x78, 0x05, 0x0b, 0x7d, 0x05, 0x07, 0xb9, 0x05, 0x0b, 0x82, 
-   /* -0FC0, */  0x05, 0x0b, 0x87, 0x05, 0x0b, 0x1d, 0x05, 0x08, 0xe4, 0x05, 0x0c, 0x81, 0x05, 0x0f, 0x44, 0x05, 
-   /* -0FD0, */  0x11, 0x40, 0x05, 0x08, 0x78, 0x05, 0x08, 0x9d, 0x05, 0x0f, 0x58, 0x05, 0x07, 0x3f, 0x05, 0x0c, 
-   /* -0FE0, */  0x6d, 0x05, 0x10, 0xf2, 0x05, 0x0c, 0x58, 0x05, 0x06, 0xa9, 0x04, 0x07, 0xb6, 0x09, 0x05, 0x8c, 
-   /* -0FF0, */  0x06, 0x06, 0x1a, 0x06, 0x0e, 0x81, 0x0a, 0x06, 0x16, 0x0a, 0x0a, 0xc4, 0x07, 0x0b, 0x5a, 0x0a, 
-   /* -1000, */  0x0a, 0xba, 0x03, 0x0b, 0x1b, 0x04, 0x11, 0x45, 0x06, 0x0c, 0x8c, 0x07, 0x05, 0xad, 0x0a, 0x0e, 
-   /* -1010, */  0xda, 0x08, 0x0b, 0x42, 0x0d, 0x09, 0xf7, 0x0b, 0x05, 0x1c, 0x09, 0x11, 0x16, 0x08, 0x05, 0xc9, 
-   /* -1020, */  0x07, 0x0d, 0x86, 0x06, 0x0b, 0xcf, 0x0a, 0x06, 0x4d, 0x04, 0x0b, 0xa2, 0x06, 0x06, 0x8d, 0x08, 
-   /* -1030, */  0x05, 0xe6, 0x08, 0x0e, 0x11, 0x0b, 0x0a, 0x9b, 0x03, 0x0a, 0x04, 0x03, 0x0b, 0xb5, 0x05, 0x10,      
-   /* -1040, */  0xd7, 0x04, 0x09, 0x94, 0x05, 0x0a, 0xe2, 0x03, 0x0b, 0xb2, 0x06, 0x0d, 0x67, 0x04, 0x0d, 0x11, 
-   /* -1050, */  0x08, 0x08, 0xb7, 0x1b, 0x0e, 0x3b, 0x0a, 0x09, 0xa1, 0x14, 0x04, 0x85, 0x15, 0x07, 0x83, 0x15, 
-   /* -1060, */  0x07, 0x6e, 0x0d, 0x09, 0x3d, 0x17, 0x06, 0xae, 0x0f, 0x07, 0xe6, 0x14, 0x07, 0xbe, 0x0d, 0x06, 
-   /* -1070, */  0x0a, 0x0d, 0x09, 0x30, 0x16, 0x06, 0xf2, 0x12, 0x08, 0x1e, 0x21, 0x04, 0xaa, 0x13, 0x10, 0xc5, 
-   /* -1080, */  0x08, 0x0a, 0x0f, 0x1c, 0x0e, 0x96, 0x18, 0x0b, 0xb8, 0x1a, 0x05, 0x95, 0x1a, 0x05, 0x75, 0x11, 
-   /* -1090, */  0x06, 0x3d, 0x16, 0x06, 0xdc, 0x1e, 0x0e, 0x19, 0x16, 0x05, 0xd1, 0x1d, 0x06, 0x20, 0x23, 0x05, 
-   /* -10A0, */  0x27, 0x11, 0x08, 0x7d, 0x11, 0x0d, 0x99, 0x16, 0x04, 0xda, 0x0d, 0x0f, 0x1c, 0x16, 0x07, 0x08, 
-   /* -10B0, */  0x17, 0x05, 0xb4, 0x0d, 0x08, 0xc7, 0x13, 0x07, 0xf8, 0x12, 0x08, 0x57, 0x1f, 0x04, 0xfe, 0x19, 
-   /* -10C0, */  0x05, 0x4e, 0x13, 0x08, 0x0b, 0x0f, 0x08, 0xe9, 0x17, 0x06, 0xc5, 0x13, 0x06, 0x7b, 0x19, 0x05, 
-   /* -10D0, */  0xf1, 0x15, 0x07, 0x44, 0x18, 0x0d, 0xfb, 0x0b, 0x0f, 0x09, 0x1b, 0x0d, 0xbe, 0x12, 0x08, 0x30,        
-   /* -10E0, */  0x15, 0x07, 0x59, 0x04, 0x0b, 0xa6, 0x04, 0x0b, 0xae, 0x04, 0x0b, 0x9e, 0x04, 0x0b, 0x96, 0x04, 
-   /* -10F0, */  0x0b, 0x9a, 0x0a, 0x0a, 0xb0, 0x0b, 0x0a, 0x90, 0x08, 0x0b, 0x32, 0x0b, 0x09, 0x6b, 0x08, 0x0b, 
-   /* -1100, */  0x2a, 0x0b, 0x0a, 0x85, 0x09, 0x0b, 0x12, 0x0a, 0x0a, 0xa6, 0x0d, 0x09, 0xea, 0x13, 0x0d, 0x74, 
-   /* -1110, */  0x14, 0x07, 0xd2, 0x13, 0x09, 0x0b, 0x12, 0x08, 0x42, 0x10, 0x09, 0x5b, 0x12, 0x09, 0x1e, 0x0d, 
-   /* -1120, */  0x0c, 0xb1, 0x0e, 0x0c, 0x17, 0x11, 0x09, 0x4a, 0x0c, 0x0a, 0x53, 0x0c, 0x0a, 0x47, 0x09, 0x0a, 
-   /* -1130, */  0xf7, 0x0e, 0x09, 0xc7, 0x0c, 0x0a, 0x3b, 0x07, 0x06, 0x69, 0x08, 0x06, 0x69, 0x06, 0x09, 0xe3, 
-   /* -1140, */  0x08, 0x0b, 0x52, 0x0a, 0x0a, 0xd8, 0x12, 0x06, 0x57, 0x0d, 0x06, 0x57, 0x07, 0x09, 0xe3, 0x04, 
-   /* -1150, */  0x0a, 0xe9, 0x10, 0x07, 0x30, 0x09, 0x0b, 0x00, 0x0c, 0x0a, 0x2f, 0x05, 0x0a, 0xe9, 0x05, 0x0a, 
-   /* -1160, */  0x6b, 0x06, 0x0a, 0x6b, 0x0a, 0x0a, 0xce, 0x09, 0x0a, 0xee, 0x03, 0x0b, 0xdb, 0x07, 0x0f, 0x7e, 
-   /* -1170, */  0x0a, 0x09, 0x97, 0x0a, 0x06, 0x71, 0x0e, 0x09, 0xd5, 0x17, 0x06, 0x93, 0x07, 0x0e, 0x5c, 0x07, 
-   /* -1180, */  0x0f, 0xda, 0x0a, 0x0f, 0x35, 0x0d, 0x0d, 0xec, 0x0a, 0x09, 0x97, 0x0a, 0x06, 0x71, 0x08, 0x0b, 
-   /* -1190, */  0x22, 0x0f, 0x09, 0x85, 0x06, 0x0b, 0x68, 0x0c, 0x0d, 0x4a, 0x09, 0x0b, 0x09, 0x13, 0x08, 0xf8, 
-   /* -11A0, */  0x15, 0x08, 0xa2, 0x04, 0x0b, 0xaa, 0x0f, 0x05, 0x66, 0x0d, 0x07, 0x23, 0x09, 0x0a, 0x06, 0x0b, 
-   /* -11B0, */  0x0d, 0x4a, 0x0f, 0x04, 0xee, 0x06, 0x04, 0xf8, 0x04, 0x09, 0x2b, 0x04, 0x08, 0x53, 0x07, 0x08, 
-   /* -11C0, */  0xc0, 0x03, 0x11, 0x1f, 0x04, 0x11, 0x1e, 0x07, 0x0d, 0x8c, 0x03, 0x07, 0x34, 0x04, 0x10, 0xdb, 
-   /* -11D0, */  0x03, 0x07, 0x36, 0x03, 0x0d, 0xa9, 0x0d, 0x04, 0x20, 0x0b, 0x04, 0x51, 0x0c, 0x04, 0x3a, 0x04, 
-   /* -11E0, */  0x0b, 0xb8, 0x04, 0x0c, 0x24, 0x04, 0x05, 0x95, 0x04, 0x04, 0x7c, 0x04, 0x05, 0x75, 0x04, 0x04, 
-   /* -11F0, */  0x85, 0x04, 0x09, 0x6b, 0x04, 0x06, 0x3d, 0x06, 0x04, 0x7b, 0x04, 0x06, 0xdc, 0x04, 0x07, 0x83,
-   /* -1200, */  0x04, 0x0e, 0x19, 0x12, 0x04, 0x00, 0x10, 0x08, 0x8e, 0x10, 0x08, 0x69, 0x0e, 0x04, 0x12, 0x0d,
-   /* -1210, */  0x04, 0x2d, 0x03, 0x10, 0xb9, 0x04, 0x05, 0xd1, 0x04, 0x07, 0x6e, 0x04, 0x06, 0x20, 0x07, 0x04, 
-   /* -1220, */  0x74, 0x04, 0x0b, 0xfc, 0x0a, 0x04, 0x5c, 0x04, 0x05, 0x27, 0x04, 0x09, 0x3d, 0x04, 0x08, 0x7d, 
-   /* -1230, */  0x04, 0x0f, 0xae, 0x04, 0x0d, 0x99, 0x04, 0x06, 0xae, 0x04, 0x04, 0xda, 0x09, 0x04, 0x09, 0x08, 
-   /* -1240, */  0x11, 0x22, 0x04, 0x0f, 0x1c, 0x04, 0x07, 0xe6, 0x04, 0x0e, 0xcb, 0x05, 0x08, 0xbd, 0x04, 0x07,
-   /* -1250, */  0x08, 0x04, 0x0f, 0xa3, 0x04, 0x06, 0x57, 0x04, 0x05, 0xb4, 0x04, 0x0f, 0x5d, 0x04, 0x08, 0xc7,
-   /* -1260, */  0x08, 0x0b, 0xf4, 0x04, 0x07, 0xf8, 0x04, 0x07, 0x30, 0x04, 0x07, 0xbe, 0x04, 0x08, 0x57, 0x05, 
-   /* -1270, */  0x0d, 0x46, 0x04, 0x04, 0xfe, 0x04, 0x06, 0x0a, 0x04, 0x05, 0x4e, 0x04, 0x0e, 0x3b, 0x04, 0x08,
-   /* -1280, */  0x0b, 0x04, 0x09, 0x30, 0x04, 0x08, 0xe9, 0x05, 0x05, 0xee, 0x04, 0x06, 0xc5, 0x04, 0x06, 0xf2, 
-   /* -1290, */  0x04, 0x06, 0x7b, 0x04, 0x09, 0xa1, 0x04, 0x05, 0xf1, 0x04, 0x08, 0x1e, 0x04, 0x07, 0x44, 0x04, 
-   /* -12A0, */  0x0b, 0xdd, 0x04, 0x0d, 0xfb, 0x04, 0x04, 0xaa, 0x04, 0x0b, 0xe3, 0x07, 0x0e, 0xee, 0x04, 0x0f, 
-   /* -12B0, */  0x09, 0x04, 0x0e, 0xb4, 0x04, 0x0d, 0xbe, 0x04, 0x10, 0xc5, 0x04, 0x08, 0x30, 0x05, 0x0f, 0x30,     
-   /* -12C0, */  0x04, 0x07, 0x59, 0x04, 0x0a, 0x0f, 0x06, 0x0e, 0x61, 0x04, 0x04, 0x81, 0x04, 0x0d, 0xab, 0x04, 
-   /* -12D0, */  0x0d, 0x93, 0x04, 0x11, 0x6b, 0x04, 0x0e, 0x96, 0x05, 0x04, 0x66, 0x09, 0x04, 0x6b, 0x0b, 0x04,
-   /* -12E0, */  0x46, 0x04, 0x0c, 0xe1
-
-}; 
-static GHashTable *state_buffer_table=NULL;
+\r
+static const guint8 sip_sdp_state_identifier[20] =\r
+{\r
+   /* -0000, */  0xfb, 0xe5, 0x07, 0xdf, 0xe5, 0xe6, 0xaa, 0x5a, 0xf2, 0xab, 0xb9, 0x14, 0xce, 0xaa, 0x05, 0xf9,\r
+   /* -0010, */  0x9c, 0xe6, 0x1b, 0xa5\r
+};\r
+\r
+static const guint8 sip_sdp_static_dictionaty_for_sigcomp[0x12e4] =\r
+{\r
+                                \r
+   /* -0000, */  0x0d, 0x0a, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x2d, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, \r
+   /* -0010, */  0x3a, 0x20, 0x0d, 0x0a, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2d, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x20,        \r
+   /* -0020, */  0x0d, 0x0a, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x3a, 0x20, 0x0d, 0x0a, 0x43, \r
+   /* -0030, */  0x61, 0x6c, 0x6c, 0x2d, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x20, 0x0d, 0x0a, 0x52, 0x65, 0x70, 0x6c, \r
+   /* -0040, */  0x79, 0x2d, 0x54, 0x6f, 0x3a, 0x20, 0x0d, 0x0a, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x3a, \r
+   /* -0050, */  0x20, 0x0d, 0x0a, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3a, 0x20, 0x3b, 0x68, 0x61, 0x6e,\r
+   /* -0060, */  0x64, 0x6c, 0x69, 0x6e, 0x67, 0x3d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3b, 0x70, 0x75, 0x72, 0x70,        \r
+   /* -0070, */  0x6f, 0x73, 0x65, 0x3d, 0x3b, 0x63, 0x61, 0x75, 0x73, 0x65, 0x3d, 0x3b, 0x74, 0x65, 0x78, 0x74, \r
+   /* -0080, */  0x3d, 0x63, 0x61, 0x72, 0x64, 0x33, 0x30, 0x30, 0x20, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, \r
+   /* -0090, */  0x65, 0x20, 0x43, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x6d, 0x69, 0x6d, 0x65, 0x73, 0x73, 0x61, \r
+   /* -00A0, */  0x67, 0x65, 0x2f, 0x73, 0x69, 0x70, 0x66, 0x72, 0x61, 0x67, 0x34, 0x30, 0x37, 0x20, 0x50, 0x72, \r
+   /* -00B0, */  0x6f, 0x78, 0x79, 0x20, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, \r
+   /* -00C0, */  0x6f, 0x6e, 0x20, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, \r
+   /* -00D0, */  0x2d, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x34, 0x38, 0x34, 0x20, 0x41, 0x64, \r
+   /* -00E0, */  0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x49, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, \r
+   /* -00F0, */  0x6c, 0x65, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x2d, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x34, 0x39, \r
+   /* -0100, */  0x34, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x41, 0x67, 0x72, 0x65, 0x65, \r
+   /* -0110, */  0x6d, 0x65, 0x6e, 0x74, 0x20, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x65, 0x61, 0x63, \r
+   /* -0120, */  0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x64, 0x34, 0x38, 0x31, 0x20, 0x43, 0x61, 0x6c, 0x6c, 0x2f, \r
+   /* -0130, */  0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x44, 0x6f, 0x65, 0x73, \r
+   /* -0140, */  0x20, 0x4e, 0x6f, 0x74, 0x20, 0x45, 0x78, 0x69, 0x73, 0x74, 0x61, 0x6c, 0x65, 0x3d, 0x35, 0x30,       \r
+   /* -0150, */  0x30, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61,\r
+   /* -0160, */  0x6c, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x6f, 0x62, 0x75, 0x73, 0x74, 0x2d, 0x73, 0x6f, 0x72, \r
+   /* -0170, */  0x74, 0x69, 0x6e, 0x67, 0x3d, 0x34, 0x31, 0x36, 0x20, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f,\r
+   /* -0180, */  0x72, 0x74, 0x65, 0x64, 0x20, 0x55, 0x52, 0x49, 0x20, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x72,\r
+   /* -0190, */  0x67, 0x65, 0x6e, 0x63, 0x79, 0x34, 0x31, 0x35, 0x20, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, \r
+   /* -01A0, */  0x72, 0x74, 0x65, 0x64, 0x20, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x54, 0x79, 0x70, 0x65, 0x6e, \r
+   /* -01B0, */  0x64, 0x69, 0x6e, 0x67, 0x34, 0x38, 0x38, 0x20, 0x4e, 0x6f, 0x74, 0x20, 0x41, 0x63, 0x63, 0x65, \r
+   /* -01C0, */  0x70, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x48, 0x65, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, \r
+   /* -01D0, */  0x64, 0x34, 0x32, 0x33, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x20, 0x54, 0x6f, \r
+   /* -01E0, */  0x6f, 0x20, 0x42, 0x72, 0x69, 0x65, 0x66, 0x72, 0x6f, 0x6d, 0x2d, 0x74, 0x61, 0x67, 0x51, 0x2e, \r
+   /* -01F0, */  0x38, 0x35, 0x30, 0x35, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x4e, 0x6f, 0x74, \r
+   /* -0200, */  0x20, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x34, 0x30, 0x33, 0x20, 0x46, 0x6f,\r
+   /* -0210, */  0x72, 0x62, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x6f, 0x6e, 0x2d, 0x75, 0x72, 0x67, 0x65, 0x6e, 0x74, \r
+   /* -0220, */  0x34, 0x32, 0x39, 0x20, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20, 0x52, 0x65, 0x66, 0x65, \r
+   /* -0230, */  0x72, 0x72, 0x6f, 0x72, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x34, 0x32, 0x30,         \r
+   /* -0240, */  0x20, 0x42, 0x61, 0x64, 0x20, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x6f, 0x72,\r
+   /* -0250, */  0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x0d, 0x0a, 0x61, 0x3d, 0x6b, 0x65, 0x79, 0x2d, 0x6d, \r
+   /* -0260, */  0x67, 0x6d, 0x74, 0x3a, 0x6d, 0x69, 0x6b, 0x65, 0x79, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x53, \r
+   /* -0270, */  0x20, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x35, 0x30, 0x34, 0x20, 0x53,\r
+   /* -0280, */  0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x2d, 0x6f, 0x75, 0x74, 0x6f, 0x2d, \r
+   /* -0290, */  0x74, 0x61, 0x67, 0x0d, 0x0a, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, \r
+   /* -02A0, */  0x69, 0x6f, 0x6e, 0x2d, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x20, 0x44, 0x65, 0x63, 0x20, 0x33, 0x38, \r
+   /* -02B0, */  0x30, 0x20, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x53, 0x65, \r
+   /* -02C0, */  0x72, 0x76, 0x69, 0x63, 0x65, 0x35, 0x30, 0x33, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, \r
+   /* -02D0, */  0x20, 0x55, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x34, 0x32, 0x31, 0x20,       \r
+   /* -02E0, */  0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, \r
+   /* -02F0, */  0x65, 0x64, 0x34, 0x30, 0x35, 0x20, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x4e, 0x6f, 0x74, \r
+   /* -0300, */  0x20, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x34, 0x38, 0x37, 0x20, 0x52, 0x65, 0x71, 0x75,\r
+   /* -0310, */  0x65, 0x73, 0x74, 0x20, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x61, 0x75, \r
+   /* -0320, */  0x74, 0x68, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6c, 0x65, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x3d, \r
+   /* -0330, */  0x0d, 0x0a, 0x6d, 0x3d, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20,        \r
+   /* -0340, */  0x41, 0x75, 0x67, 0x20, 0x35, 0x31, 0x33, 0x20, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20,        \r
+   /* -0350, */  0x54, 0x6f, 0x6f, 0x20, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x36, 0x38, 0x37, 0x20, 0x44, 0x69, 0x61, \r
+   /* -0360, */  0x6c, 0x6f, 0x67, 0x20, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x33, 0x30,         \r
+   /* -0370, */  0x32, 0x20, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x54, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72,\r
+   /* -0380, */  0x69, 0x6c, 0x79, 0x33, 0x30, 0x31, 0x20, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x50, 0x65, 0x72, \r
+   /* -0390, */  0x6d, 0x61, 0x6e, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, \r
+   /* -03A0, */  0x74, 0x2f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x0d, 0x0a, 0x52, 0x65, 0x74, 0x72, 0x79, 0x2d, \r
+   /* -03B0, */  0x41, 0x66, 0x74, 0x65, 0x72, 0x3a, 0x20, 0x47, 0x4d, 0x54, 0x68, 0x75, 0x2c, 0x20, 0x34, 0x30,        \r
+   /* -03C0, */  0x32, 0x20, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, \r
+   /* -03D0, */  0x65, 0x64, 0x0d, 0x0a, 0x61, 0x3d, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x3a, 0x6c, 0x61, 0x6e, \r
+   /* -03E0, */  0x64, 0x73, 0x63, 0x61, 0x70, 0x65, 0x34, 0x30, 0x30, 0x20, 0x42, 0x61, 0x64, 0x20, 0x52, 0x65, \r
+   /* -03F0, */  0x71, 0x75, 0x65, 0x73, 0x74, 0x72, 0x75, 0x65, 0x34, 0x39, 0x31, 0x20, 0x52, 0x65, 0x71, 0x75, \r
+   /* -0400, */  0x65, 0x73, 0x74, 0x20, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x35, 0x30, 0x31, 0x20, 0x4e, \r
+   /* -0410, */  0x6f, 0x74, 0x20, 0x49, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x34, 0x30,        \r
+   /* -0420, */  0x36, 0x20, 0x4e, 0x6f, 0x74, 0x20, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x61, 0x62, 0x6c, 0x65, \r
+   /* -0430, */  0x36, 0x30, 0x36, 0x20, 0x4e, 0x6f, 0x74, 0x20, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x61, 0x62, \r
+   /* -0440, */  0x6c, 0x65, 0x0d, 0x0a, 0x61, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x62, 0x72, 0x6f, 0x61, 0x64, \r
+   /* -0450, */  0x63, 0x61, 0x73, 0x74, 0x6f, 0x6e, 0x65, 0x34, 0x39, 0x33, 0x20, 0x55, 0x6e, 0x64, 0x65, 0x63, \r
+   /* -0460, */  0x69, 0x70, 0x68, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x0d, 0x0a, 0x4d, 0x49, 0x4d, 0x45, 0x2d, \r
+   /* -0470, */  0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x4d, 0x61, 0x79, 0x20, 0x34, 0x38, 0x32, \r
+   /* -0480, */  0x20, 0x4c, 0x6f, 0x6f, 0x70, 0x20, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x0d, 0x0a,\r
+   /* -0490, */  0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x4a, 0x75, \r
+   /* -04A0, */  0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x2d, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2d, 0x6e, 0x65, \r
+   /* -04B0, */  0x69, 0x67, 0x68, 0x62, 0x6f, 0x72, 0x3d, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x65, \r
+   /* -04C0, */  0x72, 0x74, 0x63, 0x70, 0x2d, 0x66, 0x62, 0x34, 0x38, 0x39, 0x20, 0x42, 0x61, 0x64, 0x20, 0x45, \r
+   /* -04D0, */  0x76, 0x65, 0x6e, 0x74, 0x6c, 0x73, 0x0d, 0x0a, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, \r
+   /* -04E0, */  0x74, 0x65, 0x64, 0x3a, 0x20, 0x4a, 0x61, 0x6e, 0x20, 0x35, 0x30, 0x32, 0x20, 0x42, 0x61, 0x64, \r
+   /* -04F0, */  0x20, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x6d, 0x6f, 0x64, 0x65, 0x2d, 0x63, 0x68, 0x61, \r
+   /* -0500, */  0x6e, 0x67, 0x65, 0x2d, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x3d, 0x0d, 0x0a, 0x61, 0x3d, 0x6f, \r
+   /* -0510, */  0x72, 0x69, 0x65, 0x6e, 0x74, 0x3a, 0x73, 0x65, 0x61, 0x73, 0x63, 0x61, 0x70, 0x65, 0x0d, 0x0a, \r
+   /* -0520, */  0x61, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x6d, 0x6f, 0x64, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, \r
+   /* -0530, */  0x34, 0x30, 0x34, 0x20, 0x4e, 0x6f, 0x74, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x33, 0x30, 0x35, \r
+   /* -0540, */  0x20, 0x55, 0x73, 0x65, 0x20, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x0d, 0x0a, 0x61, 0x3d, 0x74, 0x79,\r
+   /* -0550, */  0x70, 0x65, 0x3a, 0x72, 0x65, 0x63, 0x76, 0x6f, 0x6e, 0x6c, 0x79, 0x0d, 0x0a, 0x61, 0x3d, 0x74, \r
+   /* -0560, */  0x79, 0x70, 0x65, 0x3a, 0x6d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x0d, 0x0a, 0x6b, 0x3d, 0x70,       \r
+   /* -0570, */  0x72, 0x6f, 0x6d, 0x70, 0x74, 0x3a, 0x0d, 0x0a, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, \r
+   /* -0580, */  0x2d, 0x42, 0x79, 0x3a, 0x20, 0x0d, 0x0a, 0x49, 0x6e, 0x2d, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2d, \r
+   /* -0590, */  0x54, 0x6f, 0x3a, 0x20, 0x54, 0x52, 0x55, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x3a, \r
+   /* -05A0, */  0x20, 0x31, 0x38, 0x32, 0x20, 0x51, 0x75, 0x65, 0x75, 0x65, 0x64, 0x41, 0x75, 0x74, 0x68, 0x65, \r
+   /* -05B0, */  0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x3a, 0x20, 0x0d, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x2d, \r
+   /* -05C0, */  0x41, 0x67, 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x0d, 0x0a, 0x61, 0x3d, 0x66, 0x72, 0x61, 0x6d, 0x65, \r
+   /* -05D0, */  0x72, 0x61, 0x74, 0x65, 0x3a, 0x0d, 0x0a, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x2d, 0x49, 0x6e, 0x66, \r
+   /* -05E0, */  0x6f, 0x3a, 0x20, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x20, 0x0d, 0x0a, 0x61, 0x3d, 0x6d, 0x61, \r
+   /* -05F0, */  0x78, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x3a, 0x3b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x2d, 0x61, 0x66, \r
+   /* -0600, */  0x74, 0x65, 0x72, 0x3d, 0x75, 0x61, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x3d, 0x34, \r
+   /* -0610, */  0x31, 0x30, 0x20, 0x47, 0x6f, 0x6e, 0x65, 0x0d, 0x0a, 0x52, 0x65, 0x66, 0x65, 0x72, 0x2d, 0x54, \r
+   /* -0620, */  0x6f, 0x3a, 0x20, 0x0d, 0x0a, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x3a, 0x20, 0x0d, \r
+   /* -0630, */  0x0a, 0x6d, 0x3d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x20, 0x0d, 0x0a, 0x61, 0x3d, 0x71, \r
+   /* -0640, */  0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x3a, 0x0d, 0x0a, 0x61, 0x3d, 0x73, 0x64, 0x70, 0x6c, 0x61, \r
+   /* -0650, */  0x6e, 0x67, 0x3a, 0x0d, 0x0a, 0x61, 0x3d, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3a, 0x0d, \r
+   /* -0660, */  0x0a, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x3a, 0x20, 0x52, 0x45, 0x46, 0x45, 0x52, \r
+   /* -0670, */  0x20, 0x69, 0x70, 0x73, 0x65, 0x63, 0x2d, 0x69, 0x6b, 0x65, 0x3b, 0x74, 0x72, 0x61, 0x6e, 0x73,\r
+   /* -0680, */  0x70, 0x6f, 0x72, 0x74, 0x3d, 0x0d, 0x0a, 0x61, 0x3d, 0x6b, 0x65, 0x79, 0x77, 0x64, 0x73, 0x3a, \r
+   /* -0690, */  0x0d, 0x0a, 0x6b, 0x3d, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x3a, 0x3b, 0x72, 0x65, 0x66, 0x72, \r
+   /* -06A0, */  0x65, 0x73, 0x68, 0x65, 0x72, 0x3d, 0x0d, 0x0a, 0x61, 0x3d, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x3a, \r
+   /* -06B0, */  0x0d, 0x0a, 0x6b, 0x3d, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x3a, 0x3b, 0x72, 0x65, 0x63, 0x65, 0x69, \r
+   /* -06C0, */  0x76, 0x65, 0x64, 0x3d, 0x3b, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x0d, 0x0a, \r
+   /* -06D0, */  0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x3a, 0x20, 0x0d, 0x0a, 0x61, 0x3d, 0x67, 0x72, 0x6f, 0x75, \r
+   /* -06E0, */  0x70, 0x3a, 0x46, 0x41, 0x4c, 0x53, 0x45, 0x3a, 0x20, 0x49, 0x4e, 0x46, 0x4f, 0x20, 0x0d, 0x0a, \r
+   /* -06F0, */  0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x0d, 0x0a, 0x61, 0x3d, 0x6c, 0x61, 0x6e, 0x67, 0x3a, \r
+   /* -0700, */  0x0d, 0x0a, 0x6d, 0x3d, 0x64, 0x61, 0x74, 0x61, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x2d, 0x73, 0x65, \r
+   /* -0710, */  0x74, 0x3d, 0x0d, 0x0a, 0x61, 0x3d, 0x74, 0x6f, 0x6f, 0x6c, 0x3a, 0x54, 0x4c, 0x53, 0x75, 0x6e, \r
+   /* -0720, */  0x2c, 0x20, 0x0d, 0x0a, 0x44, 0x61, 0x74, 0x65, 0x3a, 0x20, 0x0d, 0x0a, 0x61, 0x3d, 0x63, 0x61, \r
+   /* -0730, */  0x74, 0x3a, 0x0d, 0x0a, 0x6b, 0x3d, 0x75, 0x72, 0x69, 0x3a, 0x0d, 0x0a, 0x50, 0x72, 0x6f, 0x78, \r
+   /* -0740, */  0x79, 0x2d, 0x3b, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x3d, 0x3b, 0x6d, 0x65, 0x74, 0x68, 0x6f, \r
+   /* -0750, */  0x64, 0x3d, 0x0d, 0x0a, 0x61, 0x3d, 0x6d, 0x69, 0x64, 0x3a, 0x3b, 0x6d, 0x61, 0x64, 0x64, 0x72, \r
+   /* -0760, */  0x3d, 0x6f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x3d, 0x0d, 0x0a, 0x4d, 0x69, 0x6e, 0x2d, 0x3b, 0x61, \r
+   /* -0770, */  0x6c, 0x67, 0x3d, 0x4d, 0x6f, 0x6e, 0x2c, 0x20, 0x54, 0x75, 0x65, 0x2c, 0x20, 0x57, 0x65, 0x64, \r
+   /* -0780, */  0x2c, 0x20, 0x46, 0x72, 0x69, 0x2c, 0x20, 0x53, 0x61, 0x74, 0x2c, 0x20, 0x3b, 0x74, 0x74, 0x6c, \r
+   /* -0790, */  0x3d, 0x61, 0x75, 0x74, 0x73, 0x3d, 0x0d, 0x0a, 0x72, 0x3d, 0x0d, 0x0a, 0x7a, 0x3d, 0x0d, 0x0a, \r
+   /* -07A0, */  0x65, 0x3d, 0x3b, 0x69, 0x64, 0x3d, 0x0d, 0x0a, 0x69, 0x3d, 0x63, 0x72, 0x63, 0x3d, 0x0d, 0x0a, \r
+   /* -07B0, */  0x75, 0x3d, 0x3b, 0x71, 0x3d, 0x75, 0x61, 0x73, 0x34, 0x31, 0x34, 0x20, 0x52, 0x65, 0x71, 0x75, \r
+   /* -07C0, */  0x65, 0x73, 0x74, 0x2d, 0x55, 0x52, 0x49, 0x20, 0x54, 0x6f, 0x6f, 0x20, 0x4c, 0x6f, 0x6e, 0x67, \r
+   /* -07D0, */  0x69, 0x76, 0x65, 0x75, 0x70, 0x72, 0x69, 0x76, 0x61, 0x63, 0x79, 0x75, 0x64, 0x70, 0x72, 0x65, \r
+   /* -07E0, */  0x66, 0x65, 0x72, 0x36, 0x30, 0x30, 0x20, 0x42, 0x75, 0x73, 0x79, 0x20, 0x45, 0x76, 0x65, 0x72, \r
+   /* -07F0, */  0x79, 0x77, 0x68, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x34, 0x38, 0x30, 0x20,       \r
+   /* -0800, */  0x54, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x69, 0x6c, 0x79, 0x20, 0x55, 0x6e, 0x61, 0x76, \r
+   /* -0810, */  0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x0d, 0x0a, 0x61, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x3a, \r
+   /* -0820, */  0x48, 0x2e, 0x33, 0x33, 0x32, 0x30, 0x32, 0x20, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, \r
+   /* -0830, */  0x0d, 0x0a, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2d, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, \r
+   /* -0840, */  0x73, 0x3a, 0x20, 0x0d, 0x0a, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, \r
+   /* -0850, */  0x6e, 0x2d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x3a, 0x20, 0x4e, 0x6f, 0x76, 0x20, 0x0d, 0x0a, 0x53, \r
+   /* -0860, */  0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x3a, 0x20, 0x53, 0x65, \r
+   /* -0870, */  0x70, 0x20, 0x0d, 0x0a, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x2d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, \r
+   /* -0880, */  0x3a, 0x20, 0x46, 0x65, 0x62, 0x20, 0x0d, 0x0a, 0x61, 0x3d, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, \r
+   /* -0890, */  0x76, 0x65, 0x52, 0x54, 0x50, 0x2f, 0x53, 0x41, 0x56, 0x50, 0x20, 0x52, 0x54, 0x50, 0x2f, 0x41, \r
+   /* -08A0, */  0x56, 0x50, 0x46, 0x20, 0x41, 0x6e, 0x6f, 0x6e, 0x79, 0x6d, 0x6f, 0x75, 0x73, 0x69, 0x70, 0x73, \r
+   /* -08B0, */  0x3a, 0x0d, 0x0a, 0x61, 0x3d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x74, 0x65, 0x73, 0x74, 0x65, 0x6c, \r
+   /* -08C0, */  0x3a, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x20, 0x0d, 0x0a, 0x61, 0x3d, 0x72, 0x65, 0x63, \r
+   /* -08D0, */  0x76, 0x6f, 0x6e, 0x6c, 0x79, 0x0d, 0x0a, 0x61, 0x3d, 0x73, 0x65, 0x6e, 0x64, 0x6f, 0x6e, 0x6c, \r
+   /* -08E0, */  0x79, 0x0d, 0x0a, 0x63, 0x3d, 0x49, 0x4e, 0x20, 0x49, 0x50, 0x34, 0x20, 0x0d, 0x0a, 0x52, 0x65, \r
+   /* -08F0, */  0x61, 0x73, 0x6f, 0x6e, 0x3a, 0x20, 0x0d, 0x0a, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x3a, 0x20, 0x0d, \r
+   /* -0900, */  0x0a, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x0d, 0x0a, 0x50, 0x61, 0x74, 0x68, 0x3a, 0x20,        \r
+   /* -0910, */  0x3b, 0x75, 0x73, 0x65, 0x72, 0x3d, 0x0d, 0x0a, 0x62, 0x3d, 0x41, 0x53, 0x20, 0x43, 0x54, 0x20,       \r
+   /* -0920, */  0x0d, 0x0a, 0x57, 0x57, 0x57, 0x2d, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, \r
+   /* -0930, */  0x74, 0x65, 0x3a, 0x20, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x20, 0x0d, 0x0a, 0x61, 0x3d, 0x73, \r
+   /* -0940, */  0x65, 0x6e, 0x64, 0x72, 0x65, 0x63, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x2d, \r
+   /* -0950, */  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, \r
+   /* -0960, */  0x6e, 0x2f, 0x73, 0x64, 0x70, 0x61, 0x74, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x70, 0x61, \r
+   /* -0970, */  0x75, 0x74, 0x68, 0x3d, 0x0d, 0x0a, 0x61, 0x3d, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x3a, 0x70,        \r
+   /* -0980, */  0x6f, 0x72, 0x74, 0x72, 0x61, 0x69, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x74, 0x72, 0x2d, \r
+   /* -0990, */  0x69, 0x6e, 0x74, 0x69, 0x63, 0x6f, 0x6e, 0x63, 0x3d, 0x34, 0x38, 0x33, 0x20, 0x54, 0x6f, 0x6f, \r
+   /* -09A0, */  0x20, 0x4d, 0x61, 0x6e, 0x79, 0x20, 0x48, 0x6f, 0x70, 0x73, 0x6c, 0x69, 0x6e, 0x66, 0x6f, 0x70,         \r
+   /* -09B0, */  0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x3d, 0x36, 0x30,        \r
+   /* -09C0, */  0x34, 0x20, 0x44, 0x6f, 0x65, 0x73, 0x20, 0x4e, 0x6f, 0x74, 0x20, 0x45, 0x78, 0x69, 0x73, 0x74, \r
+   /* -09D0, */  0x20, 0x41, 0x6e, 0x79, 0x77, 0x68, 0x65, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3d, \r
+   /* -09E0, */  0x0d, 0x0a, 0x0d, 0x0a, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2d, 0x44, 0x69, 0x73, 0x70,       \r
+   /* -09F0, */  0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x4d, 0x44, 0x35, 0x38, 0x30, 0x20, 0x50,         \r
+   /* -0A00, */  0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x46, 0x61, 0x69, 0x6c, \r
+   /* -0A10, */  0x75, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x34, 0x32, 0x32, 0x20, 0x53, 0x65, 0x73, \r
+   /* -0A20, */  0x73, 0x69, 0x6f, 0x6e, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x20, 0x54, 0x6f, \r
+   /* -0A30, */  0x6f, 0x20, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x31, 0x38, 0x31, 0x20, 0x43, \r
+   /* -0A40, */  0x61, 0x6c, 0x6c, 0x20, 0x49, 0x73, 0x20, 0x42, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x46, 0x6f, 0x72, \r
+   /* -0A50, */  0x77, 0x61, 0x72, 0x64, 0x65, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x3d, 0x66, 0x61, 0x69, 0x6c, \r
+   /* -0A60, */  0x75, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x61, 0x6c, 0x6d, 0x3d, 0x53, 0x55, 0x42, 0x53, \r
+   /* -0A70, */  0x43, 0x52, 0x49, 0x42, 0x45, 0x20, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, \r
+   /* -0A80, */  0x6f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x70, 0x73, 0x65, 0x63, 0x2d, 0x6d, 0x61, 0x6e, \r
+   /* -0A90, */  0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x34, 0x31, 0x33, 0x20, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, \r
+   /* -0AA0, */  0x74, 0x20, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x54, 0x6f, 0x6f, 0x20, 0x4c, 0x61, 0x72, \r
+   /* -0AB0, */  0x67, 0x65, 0x32, 0x65, 0x31, 0x38, 0x33, 0x20, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20,        \r
+   /* -0AC0, */  0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x63, 0x74, 0x70, 0x34, 0x38, 0x36, 0x20, 0x42, \r
+   /* -0AD0, */  0x75, 0x73, 0x79, 0x20, 0x48, 0x65, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, \r
+   /* -0AE0, */  0x61, 0x74, 0x65, 0x64, 0x41, 0x4b, 0x41, 0x76, 0x31, 0x2d, 0x4d, 0x44, 0x35, 0x2d, 0x73, 0x65, \r
+   /* -0AF0, */  0x73, 0x73, 0x69, 0x6f, 0x6e, 0x6f, 0x6e, 0x65, 0x0d, 0x0a, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, \r
+   /* -0B00, */  0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x36, 0x30, 0x33, 0x20, 0x44, 0x65, 0x63, \r
+   /* -0B10, */  0x6c, 0x69, 0x6e, 0x65, 0x78, 0x74, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x3d, 0x34, 0x38, 0x35, 0x20,         \r
+   /* -0B20, */  0x41, 0x6d, 0x62, 0x69, 0x67, 0x75, 0x6f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x3d, \r
+   /* -0B30, */  0x61, 0x75, 0x64, 0x69, 0x6f, 0x0d, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x54, \r
+   /* -0B40, */  0x79, 0x70, 0x65, 0x3a, 0x20, 0x4d, 0x61, 0x72, 0x20, 0x0d, 0x0a, 0x52, 0x65, 0x63, 0x6f, 0x72, \r
+   /* -0B50, */  0x64, 0x2d, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x3a, 0x20, 0x4a, 0x75, 0x6c, 0x20, 0x34, 0x30, 0x31,\r
+   /* -0B60, */  0x20, 0x55, 0x6e, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x0d, 0x0a, 0x52,\r
+   /* -0B70, */  0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x3a, 0x20, 0x0d, 0x0a, 0x74, 0x3d, 0x30, 0x20, 0x30, 0x2e, \r
+   /* -0B80, */  0x30, 0x2e, 0x30, 0x2e, 0x30, 0x0d, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x52, \r
+   /* -0B90, */  0x45, 0x47, 0x49, 0x53, 0x54, 0x45, 0x52, 0x20, 0x0d, 0x0a, 0x63, 0x3d, 0x49, 0x4e, 0x20, 0x49, \r
+   /* -0BA0, */  0x50, 0x36, 0x20, 0x31, 0x38, 0x30, 0x20, 0x52, 0x69, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x31, 0x30,    \r
+   /* -0BB0, */  0x30, 0x20, 0x54, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x76, 0x3d, 0x30, 0x0d, 0x0a, 0x6f, 0x3d, 0x55, \r
+   /* -0BC0, */  0x50, 0x44, 0x41, 0x54, 0x45, 0x20, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x59, 0x20, 0x0d, 0x0a, 0x53, \r
+   /* -0BD0, */  0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x3a, 0x20, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, \r
+   /* -0BE0, */  0x6e, 0x41, 0x4d, 0x52, 0x54, 0x50, 0x2f, 0x41, 0x56, 0x50, 0x20, 0x0d, 0x0a, 0x50, 0x72, 0x69, \r
+   /* -0BF0, */  0x76, 0x61, 0x63, 0x79, 0x3a, 0x20, 0x0d, 0x0a, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, \r
+   /* -0C00, */  0x2d, 0x0d, 0x0a, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x3a, 0x20, 0x0d, 0x0a, 0x61, 0x3d, \r
+   /* -0C10, */  0x72, 0x74, 0x70, 0x6d, 0x61, 0x70, 0x3a, 0x0d, 0x0a, 0x6d, 0x3d, 0x76, 0x69, 0x64, 0x65, 0x6f, \r
+   /* -0C20, */  0x20, 0x0d, 0x0a, 0x6d, 0x3d, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x20, 0x0d, 0x0a, 0x73, 0x3d, 0x20,         \r
+   /* -0C30, */  0x66, 0x61, 0x6c, 0x73, 0x65, 0x0d, 0x0a, 0x61, 0x3d, 0x63, 0x6f, 0x6e, 0x66, 0x3a, 0x3b, 0x65, \r
+   /* -0C40, */  0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x3d, 0x0d, 0x0a, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x3a, 0x20,\r
+   /* -0C50, */  0x0d, 0x0a, 0x61, 0x3d, 0x66, 0x6d, 0x74, 0x70, 0x3a, 0x0d, 0x0a, 0x61, 0x3d, 0x63, 0x75, 0x72, \r
+   /* -0C60, */  0x72, 0x3a, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, \r
+   /* -0C70, */  0x3a, 0x20, 0x0d, 0x0a, 0x61, 0x3d, 0x64, 0x65, 0x73, 0x3a, 0x0d, 0x0a, 0x52, 0x41, 0x63, 0x6b, \r
+   /* -0C80, */  0x3a, 0x20, 0x0d, 0x0a, 0x52, 0x53, 0x65, 0x71, 0x3a, 0x20, 0x42, 0x59, 0x45, 0x20, 0x63, 0x6e, \r
+   /* -0C90, */  0x6f, 0x6e, 0x63, 0x65, 0x3d, 0x31, 0x30, 0x30, 0x72, 0x65, 0x6c, 0x75, 0x72, 0x69, 0x3d, 0x71, \r
+   /* -0CA0, */  0x6f, 0x70, 0x3d, 0x54, 0x43, 0x50, 0x55, 0x44, 0x50, 0x71, 0x6f, 0x73, 0x78, 0x6d, 0x6c, 0x3b, \r
+   /* -0CB0, */  0x6c, 0x72, 0x0d, 0x0a, 0x56, 0x69, 0x61, 0x3a, 0x20, 0x53, 0x49, 0x50, 0x2f, 0x32, 0x2e, 0x30,      \r
+   /* -0CC0, */  0x2f, 0x54, 0x43, 0x50, 0x20, 0x34, 0x30, 0x38, 0x20, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, \r
+   /* -0CD0, */  0x20, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x70, 0x73, 0x69, 0x70,        \r
+   /* -0CE0, */  0x3a, 0x0d, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x4c, 0x65, 0x6e, 0x67, 0x74,\r
+   /* -0CF0, */  0x68, 0x3a, 0x20, 0x4f, 0x63, 0x74, 0x20, 0x0d, 0x0a, 0x56, 0x69, 0x61, 0x3a, 0x20, 0x53, 0x49, \r
+   /* -0D00, */  0x50, 0x2f, 0x32, 0x2e, 0x30, 0x2f, 0x55, 0x44, 0x50, 0x20, 0x3b, 0x63, 0x6f, 0x6d, 0x70, 0x3d, \r
+   /* -0D10, */  0x73, 0x69, 0x67, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x6f, 0x62, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, \r
+   /* -0D20, */  0x63, 0x6b, 0x3b, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x3d, 0x7a, 0x39, 0x68, 0x47, 0x34, 0x62, \r
+   /* -0D30, */  0x4b, 0x0d, 0x0a, 0x4d, 0x61, 0x78, 0x2d, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x73, 0x3a, \r
+   /* -0D40, */  0x20, 0x41, 0x70, 0x72, 0x20, 0x53, 0x43, 0x54, 0x50, 0x52, 0x41, 0x43, 0x4b, 0x20, 0x49, 0x4e, \r
+   /* -0D50, */  0x56, 0x49, 0x54, 0x45, 0x20, 0x0d, 0x0a, 0x43, 0x61, 0x6c, 0x6c, 0x2d, 0x49, 0x44, 0x3a, 0x20,         \r
+   /* -0D60, */  0x0d, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x3a, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4f, \r
+   /* -0D70, */  0x4b, 0x0d, 0x0a, 0x46, 0x72, 0x6f, 0x6d, 0x3a, 0x20, 0x0d, 0x0a, 0x43, 0x53, 0x65, 0x71, 0x3a, \r
+   /* -0D80, */  0x20, 0x0d, 0x0a, 0x54, 0x6f, 0x3a, 0x20, 0x3b, 0x74, 0x61, 0x67, 0x3d, 0x04, 0x10, 0xdd, 0x10,        \r
+   /* -0D90, */  0x11, 0x31, 0x0d, 0x11, 0x0a, 0x07, 0x10, 0xb9, 0x0c, 0x10, 0xfe, 0x12, 0x10, 0xe1, 0x06, 0x11,\r
+   /* -0DA0, */  0x4e, 0x07, 0x11, 0x4e, 0x03, 0x11, 0x4a, 0x04, 0x11, 0x4a, 0x07, 0x10, 0xb2, 0x08, 0x11, 0x79, \r
+   /* -0DB0, */  0x06, 0x11, 0x81, 0x0f, 0x11, 0x22, 0x0b, 0x11, 0x55, 0x06, 0x11, 0x6b, 0x0b, 0x11, 0x60, 0x13, \r
+   /* -0DC0, */  0x10, 0xb2, 0x08, 0x11, 0x71, 0x05, 0x11, 0x87, 0x13, 0x10, 0xf7, 0x09, 0x0e, 0x8d, 0x08, 0x0d, \r
+   /* -0DD0, */  0xae, 0x0c, 0x10, 0xb9, 0x07, 0x10, 0x8e, 0x03, 0x0d, 0x96, 0x03, 0x10, 0x8a, 0x04, 0x10, 0x8a, \r
+   /* -0DE0, */  0x09, 0x0d, 0xd7, 0x0a, 0x0f, 0x12, 0x08, 0x0f, 0x8f, 0x09, 0x0f, 0x8f, 0x08, 0x0d, 0x6c, 0x06, \r
+   /* -0DF0, */  0x0e, 0x66, 0x09, 0x0e, 0x6c, 0x0a, 0x0e, 0x6c, 0x06, 0x0f, 0xc6, 0x07, 0x0f, 0xc6, 0x05, 0x11, \r
+   /* -0E00, */  0x48, 0x06, 0x11, 0x48, 0x06, 0x0f, 0xbf, 0x07, 0x0f, 0xbf, 0x07, 0x0e, 0x55, 0x06, 0x0f, 0x16, \r
+   /* -0E10, */  0x04, 0x0e, 0xf4, 0x03, 0x0e, 0xb1, 0x03, 0x10, 0xa6, 0x09, 0x10, 0x50, 0x03, 0x10, 0xa3, 0x0a, \r
+   /* -0E20, */  0x0d, 0xb4, 0x05, 0x0e, 0x36, 0x06, 0x0e, 0xd6, 0x03, 0x0d, 0xf9, 0x11, 0x0e, 0xf8, 0x04, 0x0c,\r
+   /* -0E30, */  0xd9, 0x08, 0x0e, 0xea, 0x04, 0x09, 0x53, 0x03, 0x0a, 0x4b, 0x04, 0x0e, 0xe4, 0x10, 0x0f, 0x35, \r
+   /* -0E40, */  0x09, 0x0e, 0xe4, 0x08, 0x0d, 0x3f, 0x03, 0x0f, 0xe1, 0x0b, 0x10, 0x01, 0x03, 0x10, 0xac, 0x06,\r
+   /* -0E50, */  0x10, 0x95, 0x0c, 0x0e, 0x76, 0x0b, 0x0f, 0xeb, 0x0a, 0x0f, 0xae, 0x05, 0x10, 0x2b, 0x04, 0x10, \r
+   /* -0E60, */  0x2b, 0x08, 0x10, 0x7a, 0x10, 0x0f, 0x49, 0x07, 0x0f, 0xb8, 0x09, 0x10, 0x3e, 0x0b, 0x10, 0x0c, \r
+   /* -0E70, */  0x07, 0x0f, 0x78, 0x0b, 0x0f, 0x6d, 0x09, 0x10, 0x47, 0x08, 0x10, 0x82, 0x0b, 0x0f, 0xf6, 0x08, \r
+   /* -0E80, */  0x10, 0x62, 0x08, 0x0f, 0x87, 0x08, 0x10, 0x6a, 0x04, 0x0f, 0x78, 0x0d, 0x0f, 0xcd, 0x08, 0x0d, \r
+   /* -0E90, */  0xae, 0x10, 0x0f, 0x5d, 0x0b, 0x0f, 0x98, 0x14, 0x0d, 0x20, 0x1b, 0x0d, 0x20, 0x04, 0x0d, 0xe0,        \r
+   /* -0EA0, */  0x14, 0x0e, 0xb4, 0x0b, 0x0f, 0xa3, 0x0b, 0x07, 0x34, 0x0f, 0x0d, 0x56, 0x04, 0x0e, 0xf4, 0x03, \r
+   /* -0EB0, */  0x10, 0xaf, 0x07, 0x0d, 0x34, 0x09, 0x0f, 0x27, 0x04, 0x10, 0x9b, 0x04, 0x10, 0x9f, 0x09, 0x10,       \r
+   /* -0EC0, */  0x59, 0x08, 0x10, 0x72, 0x09, 0x10, 0x35, 0x0a, 0x10, 0x21, 0x0a, 0x10, 0x17, 0x08, 0x0f, 0xe3, \r
+   /* -0ED0, */  0x03, 0x10, 0xa9, 0x05, 0x0c, 0xac, 0x04, 0x0c, 0xbd, 0x07, 0x0c, 0xc1, 0x08, 0x0c, 0xc1, 0x09, \r
+   /* -0EE0, */  0x0c, 0xf6, 0x10, 0x0c, 0x72, 0x0c, 0x0c, 0x86, 0x04, 0x0d, 0x64, 0x0c, 0x0c, 0xd5, 0x09, 0x0c, \r
+   /* -0EF0, */  0xff, 0x1b, 0x0b, 0xfc, 0x11, 0x0c, 0x5d, 0x13, 0x0c, 0x30, 0x09, 0x0c, 0xa4, 0x0c, 0x0c, 0x24, \r
+   /* -0F00, */  0x0c, 0x0d, 0x3b, 0x03, 0x0d, 0x1a, 0x03, 0x0d, 0x1d, 0x16, 0x0c, 0x43, 0x09, 0x0c, 0x92, 0x09, \r
+   /* -0F10, */  0x0c, 0x9b, 0x0d, 0x0e, 0xcb, 0x04, 0x0d, 0x16, 0x06, 0x0d, 0x10, 0x05, 0x04, 0xf2, 0x0b, 0x0c, \r
+   /* -0F20, */  0xe1, 0x05, 0x0b, 0xde, 0x0a, 0x0c, 0xec, 0x13, 0x0b, 0xe3, 0x07, 0x0b, 0xd4, 0x08, 0x0d, 0x08, \r
+   /* -0F30, */  0x0c, 0x0c, 0xc9, 0x09, 0x0c, 0x3a, 0x04, 0x0a, 0xe5, 0x0c, 0x0a, 0x23, 0x08, 0x0b, 0x3a, 0x0e, \r
+   /* -0F40, */  0x09, 0xab, 0x0f, 0x0e, 0xfa, 0x09, 0x0f, 0x6f, 0x0c, 0x0a, 0x17, 0x0f, 0x09, 0x76, 0x0c, 0x0a, \r
+   /* -0F50, */  0x5f, 0x17, 0x0d, 0xe2, 0x0f, 0x07, 0xa8, 0x0a, 0x0f, 0x85, 0x0f, 0x08, 0xd6, 0x0e, 0x09, 0xb9, \r
+   /* -0F60, */  0x0b, 0x0a, 0x7a, 0x03, 0x0b, 0xdb, 0x03, 0x08, 0xc1, 0x04, 0x0e, 0xc7, 0x03, 0x08, 0xd3, 0x02, \r
+   /* -0F70, */  0x04, 0x8d, 0x08, 0x0b, 0x4a, 0x05, 0x0b, 0x8c, 0x07, 0x0b, 0x61, 0x06, 0x05, 0x48, 0x04, 0x07, \r
+   /* -0F80, */  0xf4, 0x05, 0x10, 0x30, 0x04, 0x07, 0x1e, 0x08, 0x07, 0x1e, 0x05, 0x0b, 0x91, 0x10, 0x04, 0xca, \r
+   /* -0F90, */  0x09, 0x0a, 0x71, 0x09, 0x0e, 0x87, 0x05, 0x04, 0x98, 0x05, 0x0b, 0x6e, 0x0b, 0x04, 0x9b, 0x0f, \r
+   /* -0FA0, */  0x04, 0x9b, 0x07, 0x04, 0x9b, 0x03, 0x04, 0xa3, 0x07, 0x04, 0xa3, 0x10, 0x07, 0x98, 0x09, 0x07, \r
+   /* -0FB0, */  0x98, 0x05, 0x0b, 0x73, 0x05, 0x0b, 0x78, 0x05, 0x0b, 0x7d, 0x05, 0x07, 0xb9, 0x05, 0x0b, 0x82, \r
+   /* -0FC0, */  0x05, 0x0b, 0x87, 0x05, 0x0b, 0x1d, 0x05, 0x08, 0xe4, 0x05, 0x0c, 0x81, 0x05, 0x0f, 0x44, 0x05, \r
+   /* -0FD0, */  0x11, 0x40, 0x05, 0x08, 0x78, 0x05, 0x08, 0x9d, 0x05, 0x0f, 0x58, 0x05, 0x07, 0x3f, 0x05, 0x0c, \r
+   /* -0FE0, */  0x6d, 0x05, 0x10, 0xf2, 0x05, 0x0c, 0x58, 0x05, 0x06, 0xa9, 0x04, 0x07, 0xb6, 0x09, 0x05, 0x8c, \r
+   /* -0FF0, */  0x06, 0x06, 0x1a, 0x06, 0x0e, 0x81, 0x0a, 0x06, 0x16, 0x0a, 0x0a, 0xc4, 0x07, 0x0b, 0x5a, 0x0a, \r
+   /* -1000, */  0x0a, 0xba, 0x03, 0x0b, 0x1b, 0x04, 0x11, 0x45, 0x06, 0x0c, 0x8c, 0x07, 0x05, 0xad, 0x0a, 0x0e, \r
+   /* -1010, */  0xda, 0x08, 0x0b, 0x42, 0x0d, 0x09, 0xf7, 0x0b, 0x05, 0x1c, 0x09, 0x11, 0x16, 0x08, 0x05, 0xc9, \r
+   /* -1020, */  0x07, 0x0d, 0x86, 0x06, 0x0b, 0xcf, 0x0a, 0x06, 0x4d, 0x04, 0x0b, 0xa2, 0x06, 0x06, 0x8d, 0x08, \r
+   /* -1030, */  0x05, 0xe6, 0x08, 0x0e, 0x11, 0x0b, 0x0a, 0x9b, 0x03, 0x0a, 0x04, 0x03, 0x0b, 0xb5, 0x05, 0x10,      \r
+   /* -1040, */  0xd7, 0x04, 0x09, 0x94, 0x05, 0x0a, 0xe2, 0x03, 0x0b, 0xb2, 0x06, 0x0d, 0x67, 0x04, 0x0d, 0x11, \r
+   /* -1050, */  0x08, 0x08, 0xb7, 0x1b, 0x0e, 0x3b, 0x0a, 0x09, 0xa1, 0x14, 0x04, 0x85, 0x15, 0x07, 0x83, 0x15, \r
+   /* -1060, */  0x07, 0x6e, 0x0d, 0x09, 0x3d, 0x17, 0x06, 0xae, 0x0f, 0x07, 0xe6, 0x14, 0x07, 0xbe, 0x0d, 0x06, \r
+   /* -1070, */  0x0a, 0x0d, 0x09, 0x30, 0x16, 0x06, 0xf2, 0x12, 0x08, 0x1e, 0x21, 0x04, 0xaa, 0x13, 0x10, 0xc5, \r
+   /* -1080, */  0x08, 0x0a, 0x0f, 0x1c, 0x0e, 0x96, 0x18, 0x0b, 0xb8, 0x1a, 0x05, 0x95, 0x1a, 0x05, 0x75, 0x11, \r
+   /* -1090, */  0x06, 0x3d, 0x16, 0x06, 0xdc, 0x1e, 0x0e, 0x19, 0x16, 0x05, 0xd1, 0x1d, 0x06, 0x20, 0x23, 0x05, \r
+   /* -10A0, */  0x27, 0x11, 0x08, 0x7d, 0x11, 0x0d, 0x99, 0x16, 0x04, 0xda, 0x0d, 0x0f, 0x1c, 0x16, 0x07, 0x08, \r
+   /* -10B0, */  0x17, 0x05, 0xb4, 0x0d, 0x08, 0xc7, 0x13, 0x07, 0xf8, 0x12, 0x08, 0x57, 0x1f, 0x04, 0xfe, 0x19, \r
+   /* -10C0, */  0x05, 0x4e, 0x13, 0x08, 0x0b, 0x0f, 0x08, 0xe9, 0x17, 0x06, 0xc5, 0x13, 0x06, 0x7b, 0x19, 0x05, \r
+   /* -10D0, */  0xf1, 0x15, 0x07, 0x44, 0x18, 0x0d, 0xfb, 0x0b, 0x0f, 0x09, 0x1b, 0x0d, 0xbe, 0x12, 0x08, 0x30,        \r
+   /* -10E0, */  0x15, 0x07, 0x59, 0x04, 0x0b, 0xa6, 0x04, 0x0b, 0xae, 0x04, 0x0b, 0x9e, 0x04, 0x0b, 0x96, 0x04, \r
+   /* -10F0, */  0x0b, 0x9a, 0x0a, 0x0a, 0xb0, 0x0b, 0x0a, 0x90, 0x08, 0x0b, 0x32, 0x0b, 0x09, 0x6b, 0x08, 0x0b, \r
+   /* -1100, */  0x2a, 0x0b, 0x0a, 0x85, 0x09, 0x0b, 0x12, 0x0a, 0x0a, 0xa6, 0x0d, 0x09, 0xea, 0x13, 0x0d, 0x74, \r
+   /* -1110, */  0x14, 0x07, 0xd2, 0x13, 0x09, 0x0b, 0x12, 0x08, 0x42, 0x10, 0x09, 0x5b, 0x12, 0x09, 0x1e, 0x0d, \r
+   /* -1120, */  0x0c, 0xb1, 0x0e, 0x0c, 0x17, 0x11, 0x09, 0x4a, 0x0c, 0x0a, 0x53, 0x0c, 0x0a, 0x47, 0x09, 0x0a, \r
+   /* -1130, */  0xf7, 0x0e, 0x09, 0xc7, 0x0c, 0x0a, 0x3b, 0x07, 0x06, 0x69, 0x08, 0x06, 0x69, 0x06, 0x09, 0xe3, \r
+   /* -1140, */  0x08, 0x0b, 0x52, 0x0a, 0x0a, 0xd8, 0x12, 0x06, 0x57, 0x0d, 0x06, 0x57, 0x07, 0x09, 0xe3, 0x04, \r
+   /* -1150, */  0x0a, 0xe9, 0x10, 0x07, 0x30, 0x09, 0x0b, 0x00, 0x0c, 0x0a, 0x2f, 0x05, 0x0a, 0xe9, 0x05, 0x0a, \r
+   /* -1160, */  0x6b, 0x06, 0x0a, 0x6b, 0x0a, 0x0a, 0xce, 0x09, 0x0a, 0xee, 0x03, 0x0b, 0xdb, 0x07, 0x0f, 0x7e, \r
+   /* -1170, */  0x0a, 0x09, 0x97, 0x0a, 0x06, 0x71, 0x0e, 0x09, 0xd5, 0x17, 0x06, 0x93, 0x07, 0x0e, 0x5c, 0x07, \r
+   /* -1180, */  0x0f, 0xda, 0x0a, 0x0f, 0x35, 0x0d, 0x0d, 0xec, 0x0a, 0x09, 0x97, 0x0a, 0x06, 0x71, 0x08, 0x0b, \r
+   /* -1190, */  0x22, 0x0f, 0x09, 0x85, 0x06, 0x0b, 0x68, 0x0c, 0x0d, 0x4a, 0x09, 0x0b, 0x09, 0x13, 0x08, 0xf8, \r
+   /* -11A0, */  0x15, 0x08, 0xa2, 0x04, 0x0b, 0xaa, 0x0f, 0x05, 0x66, 0x0d, 0x07, 0x23, 0x09, 0x0a, 0x06, 0x0b, \r
+   /* -11B0, */  0x0d, 0x4a, 0x0f, 0x04, 0xee, 0x06, 0x04, 0xf8, 0x04, 0x09, 0x2b, 0x04, 0x08, 0x53, 0x07, 0x08, \r
+   /* -11C0, */  0xc0, 0x03, 0x11, 0x1f, 0x04, 0x11, 0x1e, 0x07, 0x0d, 0x8c, 0x03, 0x07, 0x34, 0x04, 0x10, 0xdb, \r
+   /* -11D0, */  0x03, 0x07, 0x36, 0x03, 0x0d, 0xa9, 0x0d, 0x04, 0x20, 0x0b, 0x04, 0x51, 0x0c, 0x04, 0x3a, 0x04, \r
+   /* -11E0, */  0x0b, 0xb8, 0x04, 0x0c, 0x24, 0x04, 0x05, 0x95, 0x04, 0x04, 0x7c, 0x04, 0x05, 0x75, 0x04, 0x04, \r
+   /* -11F0, */  0x85, 0x04, 0x09, 0x6b, 0x04, 0x06, 0x3d, 0x06, 0x04, 0x7b, 0x04, 0x06, 0xdc, 0x04, 0x07, 0x83,\r
+   /* -1200, */  0x04, 0x0e, 0x19, 0x12, 0x04, 0x00, 0x10, 0x08, 0x8e, 0x10, 0x08, 0x69, 0x0e, 0x04, 0x12, 0x0d,\r
+   /* -1210, */  0x04, 0x2d, 0x03, 0x10, 0xb9, 0x04, 0x05, 0xd1, 0x04, 0x07, 0x6e, 0x04, 0x06, 0x20, 0x07, 0x04, \r
+   /* -1220, */  0x74, 0x04, 0x0b, 0xfc, 0x0a, 0x04, 0x5c, 0x04, 0x05, 0x27, 0x04, 0x09, 0x3d, 0x04, 0x08, 0x7d, \r
+   /* -1230, */  0x04, 0x0f, 0xae, 0x04, 0x0d, 0x99, 0x04, 0x06, 0xae, 0x04, 0x04, 0xda, 0x09, 0x04, 0x09, 0x08, \r
+   /* -1240, */  0x11, 0x22, 0x04, 0x0f, 0x1c, 0x04, 0x07, 0xe6, 0x04, 0x0e, 0xcb, 0x05, 0x08, 0xbd, 0x04, 0x07,\r
+   /* -1250, */  0x08, 0x04, 0x0f, 0xa3, 0x04, 0x06, 0x57, 0x04, 0x05, 0xb4, 0x04, 0x0f, 0x5d, 0x04, 0x08, 0xc7,\r
+   /* -1260, */  0x08, 0x0b, 0xf4, 0x04, 0x07, 0xf8, 0x04, 0x07, 0x30, 0x04, 0x07, 0xbe, 0x04, 0x08, 0x57, 0x05, \r
+   /* -1270, */  0x0d, 0x46, 0x04, 0x04, 0xfe, 0x04, 0x06, 0x0a, 0x04, 0x05, 0x4e, 0x04, 0x0e, 0x3b, 0x04, 0x08,\r
+   /* -1280, */  0x0b, 0x04, 0x09, 0x30, 0x04, 0x08, 0xe9, 0x05, 0x05, 0xee, 0x04, 0x06, 0xc5, 0x04, 0x06, 0xf2, \r
+   /* -1290, */  0x04, 0x06, 0x7b, 0x04, 0x09, 0xa1, 0x04, 0x05, 0xf1, 0x04, 0x08, 0x1e, 0x04, 0x07, 0x44, 0x04, \r
+   /* -12A0, */  0x0b, 0xdd, 0x04, 0x0d, 0xfb, 0x04, 0x04, 0xaa, 0x04, 0x0b, 0xe3, 0x07, 0x0e, 0xee, 0x04, 0x0f, \r
+   /* -12B0, */  0x09, 0x04, 0x0e, 0xb4, 0x04, 0x0d, 0xbe, 0x04, 0x10, 0xc5, 0x04, 0x08, 0x30, 0x05, 0x0f, 0x30,     \r
+   /* -12C0, */  0x04, 0x07, 0x59, 0x04, 0x0a, 0x0f, 0x06, 0x0e, 0x61, 0x04, 0x04, 0x81, 0x04, 0x0d, 0xab, 0x04, \r
+   /* -12D0, */  0x0d, 0x93, 0x04, 0x11, 0x6b, 0x04, 0x0e, 0x96, 0x05, 0x04, 0x66, 0x09, 0x04, 0x6b, 0x0b, 0x04,\r
+   /* -12E0, */  0x46, 0x04, 0x0c, 0xe1\r
+\r
+}; \r
+static GHashTable *state_buffer_table=NULL;\r
 \r
 static void\r
-state_buffer_table_cleanup(gpointer key _U_, gpointer value, gpointer user_data _U_){\r
+state_buffer_table_cleanup(gpointer key , gpointer value, gpointer user_data _U_){\r
 \r
        guint8 *state_buff = value;\r
+       gchar *partial_state_str = key;\r
 \r
-       if ( state_buff )\r
+       if ( state_buff ){\r
                g_free(state_buff);\r
+               g_free(partial_state_str);\r
+       }\r
+\r
 }\r
-
-void
-sigcomp_init_udvm(void){
-
-       gchar *partial_state_str;
-       guint i;
-       guint8 *sip_sdp_buff;
+\r
+void\r
+sigcomp_init_udvm(void){\r
+\r
+       gchar *partial_state_str;\r
+       guint i;\r
+       guint8 *sip_sdp_buff;\r
 \r
        /* Destroy any existing memory chunks / hashes. */\r
-       if (state_buffer_table)\r
+       if (state_buffer_table){\r
                g_hash_table_foreach(state_buffer_table, state_buffer_table_cleanup, NULL);\r
-       
-
-       state_buffer_table = g_hash_table_new(g_str_hash, g_str_equal);
-       /*
-        * Store static dictionaries in hash table
-        */
-       sip_sdp_buff = g_malloc(0x12e4+8);
-
-       partial_state_str = bytes_to_str(sip_sdp_state_identifier, 6);
-       
-       /*
-        * Debug        g_warning("Sigcomp init: Storing partial state =%s",partial_state_str);
-        */
-       i = 0;
-       while ( i < sip_sdp_state_length ){
-               sip_sdp_buff[i+8] = sip_sdp_static_dictionaty_for_sigcomp[i];
-               /* Debug
-                * g_warning(" Loading 0x%x at address %u",sip_sdp_buff[i] , i);
-                */
-               i++;
-
-       }
-
-       g_hash_table_insert(state_buffer_table, g_strdup(partial_state_str), sip_sdp_buff);
-       /*      Debug
+               g_hash_table_destroy(state_buffer_table);\r
+       }\r
+       \r
+\r
+       state_buffer_table = g_hash_table_new(g_str_hash, g_str_equal);\r
+       /*\r
+        * Store static dictionaries in hash table\r
+        */\r
+       sip_sdp_buff = g_malloc(0x12e4+8);\r
+\r
+       partial_state_str = bytes_to_str(sip_sdp_state_identifier, 6);\r
+       \r
+       /*\r
+        * Debug        g_warning("Sigcomp init: Storing partial state =%s",partial_state_str);\r
+        */\r
+       i = 0;\r
+       while ( i < sip_sdp_state_length ){\r
+               sip_sdp_buff[i+8] = sip_sdp_static_dictionaty_for_sigcomp[i];\r
+               /* Debug\r
+                * g_warning(" Loading 0x%x at address %u",sip_sdp_buff[i] , i);\r
+                */\r
+               i++;\r
+\r
+       }\r
+\r
+       g_hash_table_insert(state_buffer_table, g_strdup(partial_state_str), sip_sdp_buff);\r
+       /*      Debug\r
         *      g_warning("g_hash_table_insert = 0x%x",sip_sdp_buff);\r
-        *  g_warning("g_hash_table_insert = 0x%x",sip_sdp_buff);
-        */
-
-}
-
-                          
-int udvm_state_access(tvbuff_t *tvb, proto_tree *tree,guint8 buff[],guint16 p_id_start, guint16 p_id_length, guint16 state_begin, guint16 *state_length, 
-                                          guint16 *state_address, guint16 state_instruction, gboolean state_vars_valid)
-{
-       int                     result_code = 0;
-       guint16         n;
-       guint16         k;
-       guint16         byte_copy_right;
-       guint16         byte_copy_left;
-       char            partial_state[20]; /* Size is 6 - 20 */
-       guint8          *state_buff;
-       gchar           *partial_state_str;
-
-       /* 
-        * Perform initial checks on validity of data
-        * RFC 3320 :
-        * 9.4.5.  STATE-ACCESS
-        * :
-        * Decompression failure occurs if partial_identifier_length does not
-        * lie between 6 and 20 inclusive.  Decompression failure also occurs if
-        * no state item matching the partial state identifier can be found, if
-        * more than one state item matches the partial identifier, or if
-        * partial_identifier_length is less than the minimum_access_length of
-        * the matched state item. Otherwise, a state item is returned from the
-        * state handler.
-        */
-
-       if (( p_id_length < 6 ) || ( p_id_length > 20 )){
-               result_code = 1;
-               return result_code;
-       }
-\r
-       n = 0;
-       while ( n < p_id_length ){
-               partial_state[n] = buff[p_id_start + n];
-               n++;
-       }
+        *  g_warning("g_hash_table_insert = 0x%x",sip_sdp_buff);\r
+        */\r
+       g_free(partial_state_str);\r
+\r
+}\r
+\r
+                          \r
+int udvm_state_access(tvbuff_t *tvb, proto_tree *tree,guint8 *buff,guint16 p_id_start, guint16 p_id_length, guint16 state_begin, guint16 *state_length, \r
+                                          guint16 *state_address, guint16 state_instruction, gboolean state_vars_valid)\r
+{\r
+       int                     result_code = 0;\r
+       guint16         n;\r
+       guint16         k;\r
+       guint16         byte_copy_right;\r
+       guint16         byte_copy_left;\r
+       char            partial_state[20]; /* Size is 6 - 20 */\r
+       guint8          *state_buff;\r
+       gchar           *partial_state_str;\r
+\r
+       /* \r
+        * Perform initial checks on validity of data\r
+        * RFC 3320 :\r
+        * 9.4.5.  STATE-ACCESS\r
+        * :\r
+        * Decompression failure occurs if partial_identifier_length does not\r
+        * lie between 6 and 20 inclusive.  Decompression failure also occurs if\r
+        * no state item matching the partial state identifier can be found, if\r
+        * more than one state item matches the partial identifier, or if\r
+        * partial_identifier_length is less than the minimum_access_length of\r
+        * the matched state item. Otherwise, a state item is returned from the\r
+        * state handler.\r
+        */\r
+\r
+       if (( p_id_length < 6 ) || ( p_id_length > 20 )){\r
+               result_code = 1;\r
+               return result_code;\r
+       }\r
+\r
+       n = 0;\r
+       while ( n < p_id_length ){\r
+               partial_state[n] = buff[p_id_start + n];\r
+               n++;\r
+       }\r
        partial_state_str = bytes_to_str(partial_state, p_id_length);\r
-       proto_tree_add_text(tree,tvb, 0, -1,"Accessing state: %s",partial_state_str);
-       /*  Debug
-        *      g_warning("State Access: partial state =%s",partial_state_str);
-        *      g_warning("g_hash_table_lookup = 0x%x",state_buff);
-        * g_warning("State Access: partial state =%s",partial_state_str);
+       proto_tree_add_text(tree,tvb, 0, -1,"Accessing state: %s",partial_state_str);\r
+       /*  Debug\r
+        *      g_warning("State Access: partial state =%s",partial_state_str);\r
+        *      g_warning("g_hash_table_lookup = 0x%x",state_buff);\r
+        * g_warning("State Access: partial state =%s",partial_state_str);\r
+        */\r
+       state_buff = g_hash_table_lookup(state_buffer_table, partial_state_str);\r
+       if ( state_buff == NULL ){\r
+               result_code = 2; /* No state match */\r
+               g_free(partial_state_str);\r
+               return result_code;\r
+       }\r
+       /* \r
+        * sip_sdp_static_dictionaty\r
+        *\r
+        * 8.4.  Byte copying\r
+        * :\r
+        * The string of bytes is copied in ascending order of memory address,\r
+        * respecting the bounds set by byte_copy_left and byte_copy_right.\r
+        * More precisely, if a byte is copied from/to Address m then the next\r
+        * byte is copied from/to Address n where n is calculated as follows:\r
+        *\r
+        * Set k := m + 1 (modulo 2^16)\r
+        * If k = byte_copy_right then set n := byte_copy_left, else set n := k\r
+        *\r
+        */ \r
+       /*\r
+       if ( ( state_begin + state_length ) > sip_sdp_state_length )\r
+               return 3;\r
+               */\r
+       /*\r
+        * buff                                 = Where "state" will be stored\r
+        * p_id_start                   = Partial state identifier start pos in the buffer(buff)\r
+        * p-id_length                  = Partial state identifier length\r
+        * state_begin                  = Where to start to read state from\r
+        * state_length                 = Lenght of state\r
+        * state_adress                 = Address where to store the state in the buffer(buff)\r
+        * state_instruction    =\r
+        * FALSE                                = Indicates that state_* is in the stored state \r
         */\r
-       state_buff = g_hash_table_lookup(state_buffer_table, g_strdup(partial_state_str));
-       if ( state_buff == NULL ){
-               result_code = 2; /* No state match */
-               return result_code;
-       }
-       /* 
-        * sip_sdp_static_dictionaty
-        *
-        * 8.4.  Byte copying
-        * :
-        * The string of bytes is copied in ascending order of memory address,
-        * respecting the bounds set by byte_copy_left and byte_copy_right.
-        * More precisely, if a byte is copied from/to Address m then the next
-        * byte is copied from/to Address n where n is calculated as follows:
-        *
-        * Set k := m + 1 (modulo 2^16)
-        * If k = byte_copy_right then set n := byte_copy_left, else set n := k
-        *
-        */ 
-       /*
-       if ( ( state_begin + state_length ) > sip_sdp_state_length )
-               return 3;
-               */
-       /*
-        * buff                                 = Where "state" will be stored
-        * p_id_start                   = Partial state identifier start pos in the buffer(buff)
-        * p-id_length                  = Partial state identifier length
-        * state_begin                  = Where to start to read state from
-        * state_length                 = Lenght of state
-        * state_adress                 = Address where to store the state in the buffer(buff)
-        * state_instruction    =
-        * FALSE                                = Indicates that state_* is in the stored state 
-        */
-
+\r
        /*\r
         * The value of\r
         * state_length MUST be taken from the returned item of state in the\r
         * case that the state_length operand is set to 0.\r
-        */
+        */\r
        if ( *state_length == 0 ){\r
                *state_length = state_buff[0] << 8;\r
                *state_length = *state_length ^ state_buff[1];\r
-       }
-       if ( state_vars_valid == FALSE ){
-               *state_length = state_buff[0] << 8;
-               *state_length = *state_length ^ state_buff[1];
-
-               *state_address = state_buff[2] << 8;
-               *state_address = *state_address ^ state_buff[3];
-
-               state_instruction = state_buff[4] << 8;
-               state_instruction = state_instruction ^ state_buff[5];
        }\r
-
-       n = state_begin + 8;
-       k = *state_address; 
-       byte_copy_right = buff[66] << 8;
-       byte_copy_right = byte_copy_right ^ buff[67];
-       byte_copy_left = buff[64] << 8;
-       byte_copy_left = byte_copy_left ^ buff[65];
-       /* debug 
-        *g_warning(" state_begin %u state_address %u",state_begin , *state_address);
-        */
-       while ( n < (*state_length + 8)){
-               buff[k] = state_buff[n];
-               /*  debug 
-                *      g_warning(" Loading 0x%x at address %u",buff[k] , k);
-                */
-               k = ( k + 1 ) & 0xffff;
-               if ( k == byte_copy_right ){
-                       byte_copy_left = buff[64] << 8;
-                       byte_copy_left = byte_copy_left ^ buff[65];
-                       k = byte_copy_left;
-               }
-               n++;
+       if ( state_vars_valid == FALSE ){\r
+               *state_length = state_buff[0] << 8;\r
+               *state_length = *state_length ^ state_buff[1];\r
+\r
+               *state_address = state_buff[2] << 8;\r
+               *state_address = *state_address ^ state_buff[3];\r
+\r
+               state_instruction = state_buff[4] << 8;\r
+               state_instruction = state_instruction ^ state_buff[5];\r
+       }\r
+\r
+       n = state_begin + 8;\r
+       k = *state_address; \r
+       byte_copy_right = buff[66] << 8;\r
+       byte_copy_right = byte_copy_right ^ buff[67];\r
+       byte_copy_left = buff[64] << 8;\r
+       byte_copy_left = byte_copy_left ^ buff[65];\r
+       /* debug \r
+        *g_warning(" state_begin %u state_address %u",state_begin , *state_address);\r
+        */\r
+       while ( n < (*state_length + 8)){\r
+               buff[k] = state_buff[n];\r
+               /*  debug \r
+                *      g_warning(" Loading 0x%x at address %u",buff[k] , k);\r
+                */\r
+               k = ( k + 1 ) & 0xffff;\r
+               if ( k == byte_copy_right ){\r
+                       byte_copy_left = buff[64] << 8;\r
+                       byte_copy_left = byte_copy_left ^ buff[65];\r
+                       k = byte_copy_left;\r
+               }\r
+               n++;\r
        }\r
-       /* 
+       /* \r
         * If a state item is successfully accessed then the state_value byte\r
         * string is copied into the UDVM memory beginning at state_address.\r
         * \r
@@ -593,46 +601,46 @@ int udvm_state_access(tvbuff_t *tvb, proto_tree *tree,guint8 buff[],guint16 p_id
        /* partial_state_ID_length */\r
        buff[6] = p_id_length >> 8;\r
        buff[7] = p_id_length & 0xff;\r
-
-       return 0;
-       /*
-        * End SIP
-        */
-
-}
-
-void udvm_state_create(guint8 *state_buff,guint8 *state_identifier,guint16 p_id_length){
-
-       char partial_state[20];
-       guint8 i;
-       gchar *partial_state_str;
-       gchar *dummy_buff;
-       /*
-        * Debug
-       g_warning("Received items of state,state_length_buff[0]= %u, state_length_buff[1]= %u",
-               state_length_buff[0],state_length_buff[1]);
-
-        */
-       i = 0;
-       while ( i < p_id_length ){
-               partial_state[i] = state_identifier[i];
-               i++;
-       }
-       partial_state_str = bytes_to_str(partial_state, p_id_length);
-\r
-       dummy_buff = g_hash_table_lookup(state_buffer_table, partial_state_str);
-       if ( dummy_buff == NULL ){
-               g_hash_table_insert(state_buffer_table, g_strdup(partial_state_str), state_buff);
+       g_free(partial_state_str);\r
+       return 0;\r
+       /*\r
+        * End SIP\r
+        */\r
+\r
+}\r
+\r
+void udvm_state_create(guint8 *state_buff,guint8 *state_identifier,guint16 p_id_length){\r
+\r
+       char partial_state[20];\r
+       guint8 i;\r
+       gchar *partial_state_str;\r
+       gchar *dummy_buff;\r
+       /*\r
+        * Debug\r
+       g_warning("Received items of state,state_length_buff[0]= %u, state_length_buff[1]= %u",\r
+               state_length_buff[0],state_length_buff[1]);\r
+\r
+        */\r
+       i = 0;\r
+       while ( i < p_id_length ){\r
+               partial_state[i] = state_identifier[i];\r
+               i++;\r
+       }\r
+       partial_state_str = bytes_to_str(partial_state, p_id_length);\r
+\r
+       dummy_buff = g_hash_table_lookup(state_buffer_table, partial_state_str);\r
+       if ( dummy_buff == NULL ){\r
+               g_hash_table_insert(state_buffer_table, g_strdup(partial_state_str), state_buff);\r
        }else{\r
                /* The buffer allocated by sigcomp-udvm.c wasen't needed so free it\r
                 */\r
                g_free(state_buff);\r
 \r
-       }
+       }\r
        g_free(partial_state_str);\r
-
-}
-
+\r
+}\r
+\r
 void udvm_state_free(guint8 buff[],guint16 p_id_start,guint16 p_id_length){\r
 \r
        char partial_state[20];\r
@@ -648,6 +656,7 @@ void udvm_state_free(guint8 buff[],guint16 p_id_start,guint16 p_id_length){
                i++;\r
        }\r
        partial_state_str = bytes_to_str(partial_state, p_id_length);\r
+       g_free(partial_state_str);\r
        /* TODO Implement a state create counter before actually freeing states \r
         * Hmm is it a good idea to free the buffer at all?\r
        g_warning("State-free on  %s ",partial_state_str);\r
index b77c4cc7b487a76acfe4dbc626d7001664d2ebf2..732b6f2fb40c6ff470b3d6cea3b6196ef55603c8 100644 (file)
@@ -34,7 +34,7 @@
 #define SIGCOMP_STATE_HDLR_H\r
 \r
 extern const value_string result_code_vals[];\r
-extern int udvm_state_access(tvbuff_t *tvb, proto_tree *tree,guint8 buff[],guint16 p_id_start, guint16 p_id_length, guint16 state_begin, guint16 *state_length, \r
+extern int udvm_state_access(tvbuff_t *tvb, proto_tree *tree,guint8 *buff,guint16 p_id_start, guint16 p_id_length, guint16 state_begin, guint16 *state_length, \r
                                                                guint16 *state_address, guint16 state_instruction, gboolean state_vars_valid);\r
 \r
 extern void udvm_state_create(guint8 *state_buff,guint8 *state_identifier_buff,guint16 p_id_length);\r