mbed I/F binding for mruby

Dependents:   mruby_mbed_web mirb_mbed

mbed-mruby

How to use

Class

Files at this revision

API Documentation at this revision

Comitter:
mzta
Date:
Wed Mar 25 17:36:16 2015 +0000
Child:
1:8ccd1d494a4b
Commit message:
mirb_mbed initial commit;

Changed in this revision

include/mrbconf.h Show annotated file Show diff for this revision Revisions of this file
include/mruby.h Show annotated file Show diff for this revision Revisions of this file
include/mruby/array.h Show annotated file Show diff for this revision Revisions of this file
include/mruby/boxing_nan.h Show annotated file Show diff for this revision Revisions of this file
include/mruby/boxing_no.h Show annotated file Show diff for this revision Revisions of this file
include/mruby/boxing_word.h Show annotated file Show diff for this revision Revisions of this file
include/mruby/class.h Show annotated file Show diff for this revision Revisions of this file
include/mruby/compile.h Show annotated file Show diff for this revision Revisions of this file
include/mruby/data.h Show annotated file Show diff for this revision Revisions of this file
include/mruby/debug.h Show annotated file Show diff for this revision Revisions of this file
include/mruby/dump.h Show annotated file Show diff for this revision Revisions of this file
include/mruby/error.h Show annotated file Show diff for this revision Revisions of this file
include/mruby/gc.h Show annotated file Show diff for this revision Revisions of this file
include/mruby/hash.h Show annotated file Show diff for this revision Revisions of this file
include/mruby/irep.h Show annotated file Show diff for this revision Revisions of this file
include/mruby/khash.h Show annotated file Show diff for this revision Revisions of this file
include/mruby/numeric.h Show annotated file Show diff for this revision Revisions of this file
include/mruby/object.h Show annotated file Show diff for this revision Revisions of this file
include/mruby/opcode.h Show annotated file Show diff for this revision Revisions of this file
include/mruby/proc.h Show annotated file Show diff for this revision Revisions of this file
include/mruby/range.h Show annotated file Show diff for this revision Revisions of this file
include/mruby/re.h Show annotated file Show diff for this revision Revisions of this file
include/mruby/string.h Show annotated file Show diff for this revision Revisions of this file
include/mruby/value.h Show annotated file Show diff for this revision Revisions of this file
include/mruby/variable.h Show annotated file Show diff for this revision Revisions of this file
include/mruby/version.h Show annotated file Show diff for this revision Revisions of this file
mrbgems/gem_init.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-array-ext/array.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-array-ext/gem_init.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-enum-ext/gem_init.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-enum-lazy/gem_init.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-enumerator/gem_init.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-eval/eval.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-eval/gem_init.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-fiber/fiber.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-fiber/gem_init.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-hash-ext/gem_init.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-hash-ext/hash-ext.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-kernel-ext/gem_init.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-kernel-ext/kernel.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-math/gem_init.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-math/math.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-mbed/gem_init.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-mbed/mbed.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-mbed/mrbDigitalOut.cpp Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-mbed/mrbDigitalOut.h Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-mbed/mrbMbedFunc.cpp Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-mbed/mrbMbedFunc.h Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-mbed/mrbPinName.h Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-mbed/mrbTimer.cpp Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-mbed/mrbTimer.h Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-numeric-ext/gem_init.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-numeric-ext/numeric_ext.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-object-ext/gem_init.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-object-ext/object.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-objectspace/gem_init.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-objectspace/mruby_objectspace.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-print/gem_init.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-print/print.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-proc-ext/gem_init.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-proc-ext/proc.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-random/gem_init.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-random/mt19937ar.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-random/mt19937ar.h Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-random/random.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-random/random.h Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-range-ext/gem_init.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-range-ext/range.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-sprintf/gem_init.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-sprintf/kernel.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-sprintf/sprintf.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-string-ext/gem_init.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-string-ext/string.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-struct/gem_init.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-struct/struct.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-symbol-ext/gem_init.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-symbol-ext/symbol.c Show annotated file Show diff for this revision Revisions of this file
mrbgems/mruby-toplevel-ext/gem_init.c Show annotated file Show diff for this revision Revisions of this file
mrblib/mrblib.c Show annotated file Show diff for this revision Revisions of this file
src/array.c Show annotated file Show diff for this revision Revisions of this file
src/backtrace.c Show annotated file Show diff for this revision Revisions of this file
src/class.c Show annotated file Show diff for this revision Revisions of this file
src/codegen.c Show annotated file Show diff for this revision Revisions of this file
src/compar.c Show annotated file Show diff for this revision Revisions of this file
src/crc.c Show annotated file Show diff for this revision Revisions of this file
src/debug.c Show annotated file Show diff for this revision Revisions of this file
src/dump.c Show annotated file Show diff for this revision Revisions of this file
src/enum.c Show annotated file Show diff for this revision Revisions of this file
src/error.c Show annotated file Show diff for this revision Revisions of this file
src/error.h Show annotated file Show diff for this revision Revisions of this file
src/etc.c Show annotated file Show diff for this revision Revisions of this file
src/gc.c Show annotated file Show diff for this revision Revisions of this file
src/hash.c Show annotated file Show diff for this revision Revisions of this file
src/init.c Show annotated file Show diff for this revision Revisions of this file
src/kernel.c Show annotated file Show diff for this revision Revisions of this file
src/lex.def Show annotated file Show diff for this revision Revisions of this file
src/load.c Show annotated file Show diff for this revision Revisions of this file
src/mrb_throw.h Show annotated file Show diff for this revision Revisions of this file
src/node.h Show annotated file Show diff for this revision Revisions of this file
src/numeric.c Show annotated file Show diff for this revision Revisions of this file
src/object.c Show annotated file Show diff for this revision Revisions of this file
src/opcode.h Show annotated file Show diff for this revision Revisions of this file
src/parse.c Show annotated file Show diff for this revision Revisions of this file
src/pool.c Show annotated file Show diff for this revision Revisions of this file
src/print.c Show annotated file Show diff for this revision Revisions of this file
src/proc.c Show annotated file Show diff for this revision Revisions of this file
src/range.c Show annotated file Show diff for this revision Revisions of this file
src/state.c Show annotated file Show diff for this revision Revisions of this file
src/string.c Show annotated file Show diff for this revision Revisions of this file
src/symbol.c Show annotated file Show diff for this revision Revisions of this file
src/value_array.h Show annotated file Show diff for this revision Revisions of this file
src/variable.c Show annotated file Show diff for this revision Revisions of this file
src/version.c Show annotated file Show diff for this revision Revisions of this file
src/vm.c Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mrbconf.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,115 @@
+/*
+** mrbconf.h - mruby core configuration
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBYCONF_H
+#define MRUBYCONF_H
+
+/* configuration options: */
+/* add -DMRB_USE_FLOAT to use float instead of double for floating point numbers */
+//#define MRB_USE_FLOAT
+
+/* add -DMRB_INT16 to use 16bit integer for mrb_int; conflict with MRB_INT64 */
+//#define MRB_INT16
+
+/* add -DMRB_INT64 to use 64bit integer for mrb_int; conflict with MRB_INT16 */
+//#define MRB_INT64
+
+/* represent mrb_value in boxed double; conflict with MRB_USE_FLOAT */
+//#define MRB_NAN_BOXING
+
+/* define on big endian machines; used by MRB_NAN_BOXING */
+//#define MRB_ENDIAN_BIG
+
+/* represent mrb_value as a word (natural unit of data for the processor) */
+//#define MRB_WORD_BOXING
+
+/* argv max size in mrb_funcall */
+//#define MRB_FUNCALL_ARGC_MAX 16
+
+/* number of object per heap page */
+//#define MRB_HEAP_PAGE_SIZE 1024
+
+/* use segmented list for IV table */
+//#define MRB_USE_IV_SEGLIST
+
+/* initial size for IV khash; ignored when MRB_USE_IV_SEGLIST is set */
+//#define MRB_IVHASH_INIT_SIZE 8
+
+/* if _etext and _edata available, mruby can reduce memory used by symbols */
+//#define MRB_USE_ETEXT_EDATA
+
+/* do not use __init_array_start to determine readonly data section;
+   effective only when MRB_USE_ETEXT_EDATA is defined */
+//#define MRB_NO_INIT_ARRAY_START
+
+/* turn off generational GC by default */
+//#define MRB_GC_TURN_OFF_GENERATIONAL
+
+/* default size of khash table bucket */
+//#define KHASH_DEFAULT_SIZE 32
+
+/* allocated memory address alignment */
+//#define POOL_ALIGNMENT 4
+
+/* page size of memory pool */
+//#define POOL_PAGE_SIZE 16000
+
+/* initial minimum size for string buffer */
+//#define MRB_STR_BUF_MIN_SIZE 128
+
+/* arena size */
+//#define MRB_GC_ARENA_SIZE 100
+
+/* fixed size GC arena */
+//#define MRB_GC_FIXED_ARENA
+
+/* state atexit stack size */
+//#define MRB_FIXED_STATE_ATEXIT_STACK_SIZE 5
+
+/* fixed size state atexit stack */
+//#define MRB_FIXED_STATE_ATEXIT_STACK
+
+/* -DDISABLE_XXXX to drop following features */
+//#define DISABLE_STDIO		/* use of stdio */
+
+/* -DENABLE_XXXX to enable following features */
+//#define ENABLE_DEBUG		/* hooks for debugger */
+
+/* end of configuration */
+
+/* define ENABLE_XXXX from DISABLE_XXX */
+#ifndef DISABLE_STDIO
+#define ENABLE_STDIO
+#endif
+#ifndef ENABLE_DEBUG
+#define DISABLE_DEBUG
+#endif
+
+#ifdef ENABLE_STDIO
+# include <stdio.h>
+#endif
+
+#ifndef FALSE
+# define FALSE 0
+#endif
+
+#ifndef TRUE
+# define TRUE 1
+#endif
+
+#if defined(MRB_BUILD_AS_DLL)
+
+#if defined(MRB_CORE) || defined(MRB_LIB)
+#define MRB_API __declspec(dllexport)
+#else
+#define MRB_API __declspec(dllimport)
+#endif
+#else
+#define MRB_API extern
+#endif
+
+#endif  /* MRUBYCONF_H */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,464 @@
+/*
+** mruby - An embeddable Ruby implementation
+**
+** Copyright (c) mruby developers 2010-2014
+**
+** Permission is hereby granted, free of charge, to any person obtaining
+** a copy of this software and associated documentation files (the
+** "Software"), to deal in the Software without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Software, and to
+** permit persons to whom the Software is furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be
+** included in all copies or substantial portions of the Software.
+**
+** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+**
+** [ MIT license: http://www.opensource.org/licenses/mit-license.php ]
+*/
+
+#ifndef MRUBY_H
+#define MRUBY_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+#include <stdint.h>
+#include <stddef.h>
+#include <limits.h>
+
+#include "mrbconf.h"
+#include "mruby/value.h"
+#include "mruby/version.h"
+
+typedef uint32_t mrb_code;
+typedef uint32_t mrb_aspec;
+
+struct mrb_irep;
+struct mrb_state;
+
+typedef void* (*mrb_allocf) (struct mrb_state *mrb, void*, size_t, void *ud);
+
+#ifndef MRB_GC_ARENA_SIZE
+#define MRB_GC_ARENA_SIZE 100
+#endif
+
+#ifndef MRB_FIXED_STATE_ATEXIT_STACK_SIZE
+#define MRB_FIXED_STATE_ATEXIT_STACK_SIZE 5
+#endif
+
+typedef struct {
+  mrb_sym mid;
+  struct RProc *proc;
+  mrb_value *stackent;
+  int nregs;
+  int ridx;
+  int eidx;
+  struct REnv *env;
+  mrb_code *pc;                 /* return address */
+  mrb_code *err;                /* error position */
+  int argc;
+  int acc;
+  struct RClass *target_class;
+} mrb_callinfo;
+
+enum mrb_fiber_state {
+  MRB_FIBER_CREATED = 0,
+  MRB_FIBER_RUNNING,
+  MRB_FIBER_RESUMING,
+  MRB_FIBER_SUSPENDED,
+  MRB_FIBER_TRANSFERRED,
+  MRB_FIBER_TERMINATED,
+};
+
+struct mrb_context {
+  struct mrb_context *prev;
+
+  mrb_value *stack;                       /* stack of virtual machine */
+  mrb_value *stbase, *stend;
+
+  mrb_callinfo *ci;
+  mrb_callinfo *cibase, *ciend;
+
+  mrb_code **rescue;                      /* exception handler stack */
+  int rsize;
+  struct RProc **ensure;                  /* ensure handler stack */
+  int esize;
+
+  enum mrb_fiber_state status;
+  struct RFiber *fib;
+};
+
+enum gc_state {
+  GC_STATE_ROOT = 0,
+  GC_STATE_MARK,
+  GC_STATE_SWEEP
+};
+
+struct mrb_jmpbuf;
+
+typedef void (*mrb_atexit_func)(struct mrb_state*);
+
+typedef struct mrb_state {
+  struct mrb_jmpbuf *jmp;
+
+  mrb_allocf allocf;                      /* memory allocation function */
+  void *allocf_ud;                        /* auxiliary data of allocf */
+
+  struct mrb_context *c;
+  struct mrb_context *root_c;
+
+  struct RObject *exc;                    /* exception */
+  struct iv_tbl *globals;                 /* global variable table */
+
+  struct RObject *top_self;
+  struct RClass *object_class;            /* Object class */
+  struct RClass *class_class;
+  struct RClass *module_class;
+  struct RClass *proc_class;
+  struct RClass *string_class;
+  struct RClass *array_class;
+  struct RClass *hash_class;
+
+  struct RClass *float_class;
+  struct RClass *fixnum_class;
+  struct RClass *true_class;
+  struct RClass *false_class;
+  struct RClass *nil_class;
+  struct RClass *symbol_class;
+  struct RClass *kernel_module;
+
+  struct heap_page *heaps;                /* heaps for GC */
+  struct heap_page *sweeps;
+  struct heap_page *free_heaps;
+  size_t live; /* count of live objects */
+#ifdef MRB_GC_FIXED_ARENA
+  struct RBasic *arena[MRB_GC_ARENA_SIZE]; /* GC protection array */
+#else
+  struct RBasic **arena;                   /* GC protection array */
+  int arena_capa;
+#endif
+  int arena_idx;
+
+  enum gc_state gc_state; /* state of gc */
+  int current_white_part; /* make white object by white_part */
+  struct RBasic *gray_list; /* list of gray objects to be traversed incrementally */
+  struct RBasic *atomic_gray_list; /* list of objects to be traversed atomically */
+  size_t gc_live_after_mark;
+  size_t gc_threshold;
+  int gc_interval_ratio;
+  int gc_step_ratio;
+  mrb_bool gc_disabled:1;
+  mrb_bool gc_full:1;
+  mrb_bool is_generational_gc_mode:1;
+  mrb_bool out_of_memory:1;
+  size_t majorgc_old_threshold;
+  struct alloca_header *mems;
+
+  mrb_sym symidx;
+  struct kh_n2s *name2sym;      /* symbol hash */
+  struct symbol_name *symtbl;   /* symbol table */
+  size_t symcapa;
+
+#ifdef ENABLE_DEBUG
+  void (*code_fetch_hook)(struct mrb_state* mrb, struct mrb_irep *irep, mrb_code *pc, mrb_value *regs);
+  void (*debug_op_hook)(struct mrb_state* mrb, struct mrb_irep *irep, mrb_code *pc, mrb_value *regs);
+#endif
+
+  struct RClass *eException_class;
+  struct RClass *eStandardError_class;
+  struct RObject *nomem_err;              /* pre-allocated NoMemoryError */
+
+  void *ud; /* auxiliary data */
+
+#ifdef MRB_FIXED_STATE_ATEXIT_STACK
+  mrb_atexit_func atexit_stack[MRB_FIXED_STATE_ATEXIT_STACK_SIZE];
+#else
+  mrb_atexit_func *atexit_stack;
+#endif
+  mrb_int atexit_stack_len;
+} mrb_state;
+
+#if __STDC_VERSION__ >= 201112L
+# define mrb_noreturn _Noreturn
+#elif defined __GNUC__ && !defined __STRICT_ANSI__
+# define mrb_noreturn __attribute__((noreturn))
+#elif defined _MSC_VER
+# define mrb_noreturn __declspec(noreturn)
+#else
+# define mrb_noreturn
+#endif
+
+typedef mrb_value (*mrb_func_t)(mrb_state *mrb, mrb_value);
+MRB_API struct RClass *mrb_define_class(mrb_state *, const char*, struct RClass*);
+MRB_API struct RClass *mrb_define_module(mrb_state *, const char*);
+MRB_API mrb_value mrb_singleton_class(mrb_state*, mrb_value);
+MRB_API void mrb_include_module(mrb_state*, struct RClass*, struct RClass*);
+
+MRB_API void mrb_define_method(mrb_state*, struct RClass*, const char*, mrb_func_t, mrb_aspec);
+MRB_API void mrb_define_class_method(mrb_state *, struct RClass *, const char *, mrb_func_t, mrb_aspec);
+MRB_API void mrb_define_singleton_method(mrb_state*, struct RObject*, const char*, mrb_func_t, mrb_aspec);
+MRB_API void mrb_define_module_function(mrb_state*, struct RClass*, const char*, mrb_func_t, mrb_aspec);
+MRB_API void mrb_define_const(mrb_state*, struct RClass*, const char *name, mrb_value);
+MRB_API void mrb_undef_method(mrb_state*, struct RClass*, const char*);
+MRB_API void mrb_undef_class_method(mrb_state*, struct RClass*, const char*);
+MRB_API mrb_value mrb_obj_new(mrb_state *mrb, struct RClass *c, mrb_int argc, const mrb_value *argv);
+#define mrb_class_new_instance(mrb,argc,argv,c) mrb_obj_new(mrb,c,argc,argv)
+MRB_API mrb_value mrb_instance_new(mrb_state *mrb, mrb_value cv);
+MRB_API struct RClass * mrb_class_new(mrb_state *mrb, struct RClass *super);
+MRB_API struct RClass * mrb_module_new(mrb_state *mrb);
+MRB_API mrb_bool mrb_class_defined(mrb_state *mrb, const char *name);
+MRB_API struct RClass * mrb_class_get(mrb_state *mrb, const char *name);
+MRB_API struct RClass * mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name);
+MRB_API struct RClass * mrb_module_get(mrb_state *mrb, const char *name);
+MRB_API struct RClass * mrb_module_get_under(mrb_state *mrb, struct RClass *outer, const char *name);
+MRB_API mrb_value mrb_notimplement_m(mrb_state*, mrb_value);
+
+MRB_API mrb_value mrb_obj_dup(mrb_state *mrb, mrb_value obj);
+MRB_API mrb_value mrb_check_to_integer(mrb_state *mrb, mrb_value val, const char *method);
+MRB_API mrb_bool mrb_obj_respond_to(mrb_state *mrb, struct RClass* c, mrb_sym mid);
+MRB_API struct RClass * mrb_define_class_under(mrb_state *mrb, struct RClass *outer, const char *name, struct RClass *super);
+MRB_API struct RClass * mrb_define_module_under(mrb_state *mrb, struct RClass *outer, const char *name);
+
+/* required arguments */
+#define MRB_ARGS_REQ(n)     ((mrb_aspec)((n)&0x1f) << 18)
+/* optional arguments */
+#define MRB_ARGS_OPT(n)     ((mrb_aspec)((n)&0x1f) << 13)
+/* mandatory and optinal arguments */
+#define MRB_ARGS_ARG(n1,n2)   (MRB_ARGS_REQ(n1)|MRB_ARGS_OPT(n2))
+
+/* rest argument */
+#define MRB_ARGS_REST()     ((mrb_aspec)(1 << 12))
+/* required arguments after rest */
+#define MRB_ARGS_POST(n)    ((mrb_aspec)((n)&0x1f) << 7)
+/* keyword arguments (n of keys, kdict) */
+#define MRB_ARGS_KEY(n1,n2) ((mrb_aspec)((((n1)&0x1f) << 2) | ((n2)?(1<<1):0)))
+/* block argument */
+#define MRB_ARGS_BLOCK()    ((mrb_aspec)1)
+
+/* accept any number of arguments */
+#define MRB_ARGS_ANY()      MRB_ARGS_REST()
+/* accept no arguments */
+#define MRB_ARGS_NONE()     ((mrb_aspec)0)
+
+/* compatibility macros; will be removed */
+#define ARGS_REQ(n)         MRB_ARGS_REQ(n)
+#define ARGS_OPT(n)         MRB_ARGS_OPT(n)
+#define ARGS_REST()         MRB_ARGS_REST()
+#define ARGS_POST(n)        MRB_ARGS_POST()
+#define ARGS_KEY(n1,n2)     MRB_ARGS_KEY(n1,n2)
+#define ARGS_BLOCK()        MRB_ARGS_BLOCK()
+#define ARGS_ANY()          MRB_ARGS_ANY()
+#define ARGS_NONE()         MRB_ARGS_NONE()
+
+MRB_API mrb_int mrb_get_args(mrb_state *mrb, const char *format, ...);
+
+/* `strlen` for character string literals (use with caution or `strlen` instead)
+    Adjacent string literals are concatenated in C/C++ in translation phase 6.
+    If `lit` is not one, the compiler will report a syntax error:
+     MSVC: "error C2143: syntax error : missing ')' before 'string'"
+     GCC:  "error: expected ')' before string constant"
+*/
+#define mrb_strlen_lit(lit) (sizeof(lit "") - 1)
+
+MRB_API mrb_value mrb_funcall(mrb_state*, mrb_value, const char*, mrb_int,...);
+MRB_API mrb_value mrb_funcall_argv(mrb_state*, mrb_value, mrb_sym, mrb_int, const mrb_value*);
+MRB_API mrb_value mrb_funcall_with_block(mrb_state*, mrb_value, mrb_sym, mrb_int, const mrb_value*, mrb_value);
+MRB_API mrb_sym mrb_intern_cstr(mrb_state*,const char*);
+MRB_API mrb_sym mrb_intern(mrb_state*,const char*,size_t);
+MRB_API mrb_sym mrb_intern_static(mrb_state*,const char*,size_t);
+#define mrb_intern_lit(mrb, lit) mrb_intern_static(mrb, lit, mrb_strlen_lit(lit))
+MRB_API mrb_sym mrb_intern_str(mrb_state*,mrb_value);
+MRB_API mrb_value mrb_check_intern_cstr(mrb_state*,const char*);
+MRB_API mrb_value mrb_check_intern(mrb_state*,const char*,size_t);
+MRB_API mrb_value mrb_check_intern_str(mrb_state*,mrb_value);
+MRB_API const char *mrb_sym2name(mrb_state*,mrb_sym);
+MRB_API const char *mrb_sym2name_len(mrb_state*,mrb_sym,mrb_int*);
+MRB_API mrb_value mrb_sym2str(mrb_state*,mrb_sym);
+
+MRB_API void *mrb_malloc(mrb_state*, size_t);         /* raise RuntimeError if no mem */
+MRB_API void *mrb_calloc(mrb_state*, size_t, size_t); /* ditto */
+MRB_API void *mrb_realloc(mrb_state*, void*, size_t); /* ditto */
+MRB_API void *mrb_realloc_simple(mrb_state*, void*, size_t); /* return NULL if no memory available */
+MRB_API void *mrb_malloc_simple(mrb_state*, size_t);  /* return NULL if no memory available */
+MRB_API struct RBasic *mrb_obj_alloc(mrb_state*, enum mrb_vtype, struct RClass*);
+MRB_API void mrb_free(mrb_state*, void*);
+
+MRB_API mrb_value mrb_str_new(mrb_state *mrb, const char *p, size_t len);
+MRB_API mrb_value mrb_str_new_cstr(mrb_state*, const char*);
+MRB_API mrb_value mrb_str_new_static(mrb_state *mrb, const char *p, size_t len);
+#define mrb_str_new_lit(mrb, lit) mrb_str_new_static(mrb, (lit), mrb_strlen_lit(lit))
+
+MRB_API mrb_state* mrb_open(void);
+MRB_API mrb_state* mrb_open_allocf(mrb_allocf, void *ud);
+MRB_API mrb_state* mrb_open_core(mrb_allocf, void *ud);
+MRB_API void mrb_close(mrb_state*);
+
+MRB_API void* mrb_default_allocf(mrb_state*, void*, size_t, void*);
+
+MRB_API mrb_value mrb_top_self(mrb_state *);
+MRB_API mrb_value mrb_run(mrb_state*, struct RProc*, mrb_value);
+MRB_API mrb_value mrb_toplevel_run(mrb_state*, struct RProc*);
+MRB_API mrb_value mrb_context_run(mrb_state*, struct RProc*, mrb_value, unsigned int);
+
+MRB_API void mrb_p(mrb_state*, mrb_value);
+MRB_API mrb_int mrb_obj_id(mrb_value obj);
+MRB_API mrb_sym mrb_obj_to_sym(mrb_state *mrb, mrb_value name);
+
+MRB_API mrb_bool mrb_obj_eq(mrb_state*, mrb_value, mrb_value);
+MRB_API mrb_bool mrb_obj_equal(mrb_state*, mrb_value, mrb_value);
+MRB_API mrb_bool mrb_equal(mrb_state *mrb, mrb_value obj1, mrb_value obj2);
+MRB_API mrb_value mrb_convert_to_integer(mrb_state *mrb, mrb_value val, int base);
+MRB_API mrb_value mrb_Integer(mrb_state *mrb, mrb_value val);
+MRB_API mrb_value mrb_Float(mrb_state *mrb, mrb_value val);
+MRB_API mrb_value mrb_inspect(mrb_state *mrb, mrb_value obj);
+MRB_API mrb_bool mrb_eql(mrb_state *mrb, mrb_value obj1, mrb_value obj2);
+
+MRB_API void mrb_garbage_collect(mrb_state*);
+MRB_API void mrb_full_gc(mrb_state*);
+MRB_API void mrb_incremental_gc(mrb_state *);
+MRB_API int mrb_gc_arena_save(mrb_state*);
+MRB_API void mrb_gc_arena_restore(mrb_state*,int);
+MRB_API void mrb_gc_mark(mrb_state*,struct RBasic*);
+#define mrb_gc_mark_value(mrb,val) do {\
+  if (!mrb_immediate_p(val)) mrb_gc_mark((mrb), mrb_basic_ptr(val)); \
+} while (0)
+MRB_API void mrb_field_write_barrier(mrb_state *, struct RBasic*, struct RBasic*);
+#define mrb_field_write_barrier_value(mrb, obj, val) do{\
+  if (!mrb_immediate_p(val)) mrb_field_write_barrier((mrb), (obj), mrb_basic_ptr(val)); \
+} while (0)
+MRB_API void mrb_write_barrier(mrb_state *, struct RBasic*);
+
+MRB_API mrb_value mrb_check_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, const char *tname, const char *method);
+MRB_API mrb_value mrb_any_to_s(mrb_state *mrb, mrb_value obj);
+MRB_API const char * mrb_obj_classname(mrb_state *mrb, mrb_value obj);
+MRB_API struct RClass* mrb_obj_class(mrb_state *mrb, mrb_value obj);
+MRB_API mrb_value mrb_class_path(mrb_state *mrb, struct RClass *c);
+MRB_API mrb_value mrb_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, const char *tname, const char *method);
+MRB_API mrb_bool mrb_obj_is_kind_of(mrb_state *mrb, mrb_value obj, struct RClass *c);
+MRB_API mrb_value mrb_obj_inspect(mrb_state *mrb, mrb_value self);
+MRB_API mrb_value mrb_obj_clone(mrb_state *mrb, mrb_value self);
+
+/* need to include <ctype.h> to use these macros */
+#ifndef ISPRINT
+#define ISASCII(c) (!(((int)(unsigned char)(c)) & ~0x7f))
+#define ISPRINT(c) (ISASCII(c) && isprint((int)(unsigned char)(c)))
+#define ISSPACE(c) (ISASCII(c) && isspace((int)(unsigned char)(c)))
+#define ISUPPER(c) (ISASCII(c) && isupper((int)(unsigned char)(c)))
+#define ISLOWER(c) (ISASCII(c) && islower((int)(unsigned char)(c)))
+#define ISALNUM(c) (ISASCII(c) && isalnum((int)(unsigned char)(c)))
+#define ISALPHA(c) (ISASCII(c) && isalpha((int)(unsigned char)(c)))
+#define ISDIGIT(c) (ISASCII(c) && isdigit((int)(unsigned char)(c)))
+#define ISXDIGIT(c) (ISASCII(c) && isxdigit((int)(unsigned char)(c)))
+#define ISBLANK(c) (ISASCII(c) && isblank((int)(unsigned char)(c)))
+#define ISCNTRL(c) (ISASCII(c) && iscntrl((int)(unsigned char)(c)))
+#define TOUPPER(c) (ISASCII(c) ? toupper((int)(unsigned char)(c)) : (c))
+#define TOLOWER(c) (ISASCII(c) ? tolower((int)(unsigned char)(c)) : (c))
+#endif
+
+MRB_API mrb_value mrb_exc_new(mrb_state *mrb, struct RClass *c, const char *ptr, long len);
+MRB_API mrb_noreturn void mrb_exc_raise(mrb_state *mrb, mrb_value exc);
+
+MRB_API mrb_noreturn void mrb_raise(mrb_state *mrb, struct RClass *c, const char *msg);
+MRB_API mrb_noreturn void mrb_raisef(mrb_state *mrb, struct RClass *c, const char *fmt, ...);
+MRB_API mrb_noreturn void mrb_name_error(mrb_state *mrb, mrb_sym id, const char *fmt, ...);
+MRB_API void mrb_warn(mrb_state *mrb, const char *fmt, ...);
+MRB_API mrb_noreturn void mrb_bug(mrb_state *mrb, const char *fmt, ...);
+MRB_API void mrb_print_backtrace(mrb_state *mrb);
+MRB_API void mrb_print_error(mrb_state *mrb);
+
+/* macros to get typical exception objects
+   note:
+   + those E_* macros requires mrb_state* variable named mrb.
+   + exception objects obtained from those macros are local to mrb
+*/
+#define E_RUNTIME_ERROR             (mrb_class_get(mrb, "RuntimeError"))
+#define E_TYPE_ERROR                (mrb_class_get(mrb, "TypeError"))
+#define E_ARGUMENT_ERROR            (mrb_class_get(mrb, "ArgumentError"))
+#define E_INDEX_ERROR               (mrb_class_get(mrb, "IndexError"))
+#define E_RANGE_ERROR               (mrb_class_get(mrb, "RangeError"))
+#define E_NAME_ERROR                (mrb_class_get(mrb, "NameError"))
+#define E_NOMETHOD_ERROR            (mrb_class_get(mrb, "NoMethodError"))
+#define E_SCRIPT_ERROR              (mrb_class_get(mrb, "ScriptError"))
+#define E_SYNTAX_ERROR              (mrb_class_get(mrb, "SyntaxError"))
+#define E_LOCALJUMP_ERROR           (mrb_class_get(mrb, "LocalJumpError"))
+#define E_REGEXP_ERROR              (mrb_class_get(mrb, "RegexpError"))
+#define E_SYSSTACK_ERROR            (mrb_class_get(mrb, "SystemStackError"))
+
+#define E_NOTIMP_ERROR              (mrb_class_get(mrb, "NotImplementedError"))
+#define E_FLOATDOMAIN_ERROR         (mrb_class_get(mrb, "FloatDomainError"))
+
+#define E_KEY_ERROR                 (mrb_class_get(mrb, "KeyError"))
+
+MRB_API mrb_value mrb_yield(mrb_state *mrb, mrb_value b, mrb_value arg);
+MRB_API mrb_value mrb_yield_argv(mrb_state *mrb, mrb_value b, mrb_int argc, const mrb_value *argv);
+MRB_API mrb_value mrb_yield_with_class(mrb_state *mrb, mrb_value b, mrb_int argc, const mrb_value *argv, mrb_value self, struct RClass *c);
+
+MRB_API void mrb_gc_protect(mrb_state *mrb, mrb_value obj);
+MRB_API mrb_value mrb_to_int(mrb_state *mrb, mrb_value val);
+#define mrb_int(mrb, val) mrb_fixnum(mrb_to_int(mrb, val))
+MRB_API void mrb_check_type(mrb_state *mrb, mrb_value x, enum mrb_vtype t);
+
+typedef enum call_type {
+  CALL_PUBLIC,
+  CALL_FCALL,
+  CALL_VCALL,
+  CALL_TYPE_MAX
+} call_type;
+
+MRB_API void mrb_define_alias(mrb_state *mrb, struct RClass *klass, const char *name1, const char *name2);
+MRB_API const char *mrb_class_name(mrb_state *mrb, struct RClass* klass);
+MRB_API void mrb_define_global_const(mrb_state *mrb, const char *name, mrb_value val);
+
+MRB_API mrb_value mrb_attr_get(mrb_state *mrb, mrb_value obj, mrb_sym id);
+
+MRB_API mrb_bool mrb_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym mid);
+MRB_API mrb_bool mrb_obj_is_instance_of(mrb_state *mrb, mrb_value obj, struct RClass* c);
+
+/* fiber functions (you need to link mruby-fiber mrbgem to use) */
+MRB_API mrb_value mrb_fiber_yield(mrb_state *mrb, mrb_int argc, const mrb_value *argv);
+#define E_FIBER_ERROR (mrb_class_get(mrb, "FiberError"))
+
+/* memory pool implementation */
+typedef struct mrb_pool mrb_pool;
+MRB_API struct mrb_pool* mrb_pool_open(mrb_state*);
+MRB_API void mrb_pool_close(struct mrb_pool*);
+MRB_API void* mrb_pool_alloc(struct mrb_pool*, size_t);
+MRB_API void* mrb_pool_realloc(struct mrb_pool*, void*, size_t oldlen, size_t newlen);
+MRB_API mrb_bool mrb_pool_can_realloc(struct mrb_pool*, void*, size_t);
+MRB_API void* mrb_alloca(mrb_state *mrb, size_t);
+
+MRB_API void mrb_state_atexit(mrb_state *mrb, mrb_atexit_func func);
+
+#ifdef MRB_DEBUG
+#include <assert.h>
+#define mrb_assert(p) assert(p)
+#define mrb_assert_int_fit(t1,n,t2,max) assert((n)>=0 && ((sizeof(n)<=sizeof(t2))||(n<=(t1)(max))))
+#else
+#define mrb_assert(p) ((void)0)
+#define mrb_assert_int_fit(t1,n,t2,max) ((void)0)
+#endif
+
+#if __STDC_VERSION__ >= 201112L
+#define mrb_static_assert(exp, str) _Static_assert(exp, str)
+#else
+#define mrb_static_assert(exp, str) mrb_assert(exp)
+#endif
+
+MRB_API mrb_value mrb_format(mrb_state *mrb, const char *format, ...);
+
+#if defined(__cplusplus)
+}  /* extern "C" { */
+#endif
+
+#endif  /* MRUBY_H */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/array.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,75 @@
+/*
+** mruby/array.h - Array class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_ARRAY_H
+#define MRUBY_ARRAY_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+typedef struct mrb_shared_array {
+  int refcnt;
+  mrb_int len;
+  mrb_value *ptr;
+} mrb_shared_array;
+
+struct RArray {
+  MRB_OBJECT_HEADER;
+  mrb_int len;
+  union {
+    mrb_int capa;
+    mrb_shared_array *shared;
+  } aux;
+  mrb_value *ptr;
+};
+
+#define mrb_ary_ptr(v)    ((struct RArray*)(mrb_ptr(v)))
+#define mrb_ary_value(p)  mrb_obj_value((void*)(p))
+#define RARRAY(v)  ((struct RArray*)(mrb_ptr(v)))
+
+#define RARRAY_LEN(a) (RARRAY(a)->len)
+#define RARRAY_PTR(a) ((const mrb_value*)RARRAY(a)->ptr)
+#define MRB_ARY_SHARED      256
+#define ARY_SHARED_P(a) ((a)->flags & MRB_ARY_SHARED)
+#define ARY_SET_SHARED_FLAG(a) ((a)->flags |= MRB_ARY_SHARED)
+#define ARY_UNSET_SHARED_FLAG(a) ((a)->flags &= ~MRB_ARY_SHARED)
+
+void mrb_ary_decref(mrb_state*, mrb_shared_array*);
+MRB_API void mrb_ary_modify(mrb_state*, struct RArray*);
+MRB_API mrb_value mrb_ary_new_capa(mrb_state*, mrb_int);
+MRB_API mrb_value mrb_ary_new(mrb_state *mrb);
+MRB_API mrb_value mrb_ary_new_from_values(mrb_state *mrb, mrb_int size, const mrb_value *vals);
+MRB_API mrb_value mrb_assoc_new(mrb_state *mrb, mrb_value car, mrb_value cdr);
+MRB_API void mrb_ary_concat(mrb_state*, mrb_value, mrb_value);
+MRB_API mrb_value mrb_ary_splat(mrb_state*, mrb_value);
+MRB_API void mrb_ary_push(mrb_state*, mrb_value, mrb_value);
+MRB_API mrb_value mrb_ary_pop(mrb_state *mrb, mrb_value ary);
+MRB_API mrb_value mrb_ary_ref(mrb_state *mrb, mrb_value ary, mrb_int n);
+MRB_API void mrb_ary_set(mrb_state *mrb, mrb_value ary, mrb_int n, mrb_value val);
+MRB_API void mrb_ary_replace(mrb_state *mrb, mrb_value a, mrb_value b);
+MRB_API mrb_value mrb_check_array_type(mrb_state *mrb, mrb_value self);
+MRB_API mrb_value mrb_ary_unshift(mrb_state *mrb, mrb_value self, mrb_value item);
+MRB_API mrb_value mrb_ary_entry(mrb_value ary, mrb_int offset);
+MRB_API mrb_value mrb_ary_shift(mrb_state *mrb, mrb_value self);
+MRB_API mrb_value mrb_ary_clear(mrb_state *mrb, mrb_value self);
+MRB_API mrb_value mrb_ary_join(mrb_state *mrb, mrb_value ary, mrb_value sep);
+MRB_API mrb_value mrb_ary_resize(mrb_state *mrb, mrb_value ary, mrb_int len);
+
+static inline mrb_int
+mrb_ary_len(mrb_state *mrb, mrb_value ary)
+{
+  (void)mrb;
+  mrb_assert(mrb_array_p(ary));
+  return RARRAY_LEN(ary);
+}
+
+#if defined(__cplusplus)
+}  /* extern "C" { */
+#endif
+
+#endif  /* MRUBY_ARRAY_H */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/boxing_nan.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,95 @@
+/*
+** mruby/boxing_nan.h - nan boxing mrb_value definition
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_BOXING_NAN_H
+#define MRUBY_BOXING_NAN_H
+
+#ifdef MRB_USE_FLOAT
+# error ---->> MRB_NAN_BOXING and MRB_USE_FLOAT conflict <<----
+#endif
+
+#ifdef MRB_INT64
+# error ---->> MRB_NAN_BOXING and MRB_INT64 conflict <<----
+#endif
+
+#define MRB_FIXNUM_SHIFT 0
+#define MRB_TT_HAS_BASIC MRB_TT_OBJECT
+
+#ifdef MRB_ENDIAN_BIG
+#define MRB_ENDIAN_LOHI(a,b) a b
+#else
+#define MRB_ENDIAN_LOHI(a,b) b a
+#endif
+
+/* value representation by nan-boxing:
+ *   float : FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF
+ *   object: 111111111111TTTT TTPPPPPPPPPPPPPP PPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPP
+ *   int   : 1111111111110001 0000000000000000 IIIIIIIIIIIIIIII IIIIIIIIIIIIIIII
+ *   sym   : 1111111111110001 0100000000000000 SSSSSSSSSSSSSSSS SSSSSSSSSSSSSSSS
+ * In order to get enough bit size to save TT, all pointers are shifted 2 bits
+ * in the right direction. Also, TTTTTT is the mrb_vtype + 1;
+ */
+typedef struct mrb_value {
+  union {
+    mrb_float f;
+    union {
+      void *p;
+      struct {
+        MRB_ENDIAN_LOHI(
+          uint32_t ttt;
+          ,union {
+            mrb_int i;
+            mrb_sym sym;
+          };
+        )
+      };
+    } value;
+  };
+} mrb_value;
+
+#define mrb_float_pool(mrb,f) mrb_float_value(mrb,f)
+
+#define mrb_tt(o)       ((enum mrb_vtype)(((o).value.ttt & 0xfc000)>>14)-1)
+#define mrb_type(o)     ((uint32_t)0xfff00000 < (o).value.ttt ? mrb_tt(o) : MRB_TT_FLOAT)
+#define mrb_ptr(o)      ((void*)((((uintptr_t)0x3fffffffffff)&((uintptr_t)((o).value.p)))<<2))
+#define mrb_float(o)    (o).f
+#define mrb_cptr(o)     mrb_ptr(o)
+#define mrb_fixnum(o)   (o).value.i
+#define mrb_symbol(o)   (o).value.sym
+
+#define BOXNAN_SET_VALUE(o, tt, attr, v) do {\
+  (o).value.ttt = (0xfff00000|(((tt)+1)<<14));\
+  switch (tt) {\
+  case MRB_TT_FALSE:\
+  case MRB_TT_TRUE:\
+  case MRB_TT_UNDEF:\
+  case MRB_TT_FIXNUM:\
+  case MRB_TT_SYMBOL: (o).attr = (v); break;\
+  default: (o).value.i = 0; (o).value.p = (void*)((uintptr_t)(o).value.p | (((uintptr_t)(v))>>2)); break;\
+  }\
+} while (0)
+
+#define SET_FLOAT_VALUE(mrb,r,v) do { \
+  if (v != v) { \
+    (r).value.ttt = 0x7ff80000; \
+    (r).value.i = 0; \
+  } else { \
+    (r).f = v; \
+  }} while(0)
+
+#define SET_NIL_VALUE(r) BOXNAN_SET_VALUE(r, MRB_TT_FALSE, value.i, 0)
+#define SET_FALSE_VALUE(r) BOXNAN_SET_VALUE(r, MRB_TT_FALSE, value.i, 1)
+#define SET_TRUE_VALUE(r) BOXNAN_SET_VALUE(r, MRB_TT_TRUE, value.i, 1)
+#define SET_BOOL_VALUE(r,b) BOXNAN_SET_VALUE(r, b ? MRB_TT_TRUE : MRB_TT_FALSE, value.i, 1)
+#define SET_INT_VALUE(r,n) BOXNAN_SET_VALUE(r, MRB_TT_FIXNUM, value.i, (n))
+#define SET_SYM_VALUE(r,v) BOXNAN_SET_VALUE(r, MRB_TT_SYMBOL, value.sym, (v))
+#define SET_OBJ_VALUE(r,v) BOXNAN_SET_VALUE(r, (((struct RObject*)(v))->tt), value.p, (v))
+#define SET_PROC_VALUE(r,v) BOXNAN_SET_VALUE(r, MRB_TT_PROC, value.p, v)
+#define SET_CPTR_VALUE(mrb,r,v) BOXNAN_SET_VALUE(r, MRB_TT_CPTR, value.p, v)
+#define SET_UNDEF_VALUE(r) BOXNAN_SET_VALUE(r, MRB_TT_UNDEF, value.i, 0)
+
+#endif  /* MRUBY_BOXING_NAN_H */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/boxing_no.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,50 @@
+/*
+** mruby/boxing_no.h - unboxed mrb_value definition
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_BOXING_NO_H
+#define MRUBY_BOXING_NO_H
+
+#define MRB_FIXNUM_SHIFT 0
+#define MRB_TT_HAS_BASIC MRB_TT_OBJECT
+
+typedef struct mrb_value {
+  union {
+    mrb_float f;
+    void *p;
+    mrb_int i;
+    mrb_sym sym;
+  } value;
+  enum mrb_vtype tt;
+} mrb_value;
+
+#define mrb_float_pool(mrb,f) mrb_float_value(mrb,f)
+
+#define mrb_ptr(o)      (o).value.p
+#define mrb_cptr(o)     mrb_ptr(o)
+#define mrb_float(o)    (o).value.f
+#define mrb_fixnum(o)   (o).value.i
+#define mrb_symbol(o)   (o).value.sym
+#define mrb_type(o)     (o).tt
+
+#define BOXNIX_SET_VALUE(o, ttt, attr, v) do {\
+  (o).tt = ttt;\
+  (o).attr = v;\
+} while (0)
+
+#define SET_NIL_VALUE(r) BOXNIX_SET_VALUE(r, MRB_TT_FALSE, value.i, 0)
+#define SET_FALSE_VALUE(r) BOXNIX_SET_VALUE(r, MRB_TT_FALSE, value.i, 1)
+#define SET_TRUE_VALUE(r) BOXNIX_SET_VALUE(r, MRB_TT_TRUE, value.i, 1)
+#define SET_BOOL_VALUE(r,b) BOXNIX_SET_VALUE(r, b ? MRB_TT_TRUE : MRB_TT_FALSE, value.i, 1)
+#define SET_INT_VALUE(r,n) BOXNIX_SET_VALUE(r, MRB_TT_FIXNUM, value.i, (n))
+#define SET_FLOAT_VALUE(mrb,r,v) BOXNIX_SET_VALUE(r, MRB_TT_FLOAT, value.f, (v))
+#define SET_SYM_VALUE(r,v) BOXNIX_SET_VALUE(r, MRB_TT_SYMBOL, value.sym, (v))
+#define SET_OBJ_VALUE(r,v) BOXNIX_SET_VALUE(r, (((struct RObject*)(v))->tt), value.p, (v))
+#define SET_PROC_VALUE(r,v) BOXNIX_SET_VALUE(r, MRB_TT_PROC, value.p, v)
+#define SET_CPTR_VALUE(mrb,r,v) BOXNIX_SET_VALUE(r, MRB_TT_CPTR, value.p, v)
+#define SET_UNDEF_VALUE(r) BOXNIX_SET_VALUE(r, MRB_TT_UNDEF, value.i, 0)
+
+#endif  /* MRUBY_BOXING_NO_H */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/boxing_word.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,120 @@
+/*
+** mruby/boxing_word.h - word boxing mrb_value definition
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_BOXING_WORD_H
+#define MRUBY_BOXING_WORD_H
+
+#if defined(MRB_INT16)
+# error MRB_INT16 is too small for MRB_WORD_BOXING.
+#endif
+
+struct RFloat {
+  MRB_OBJECT_HEADER;
+  mrb_float f;
+};
+
+struct RCptr {
+  MRB_OBJECT_HEADER;
+  void *p;
+};
+
+#define MRB_FIXNUM_SHIFT 1
+#define MRB_TT_HAS_BASIC MRB_TT_FLOAT
+
+enum mrb_special_consts {
+  MRB_Qnil    = 0,
+  MRB_Qfalse  = 2,
+  MRB_Qtrue   = 4,
+  MRB_Qundef  = 6,
+};
+
+#define MRB_FIXNUM_FLAG   0x01
+#define MRB_SYMBOL_FLAG   0x0e
+#define MRB_SPECIAL_SHIFT 8
+
+typedef union mrb_value {
+  union {
+    void *p;
+    struct {
+      unsigned int i_flag : MRB_FIXNUM_SHIFT;
+      mrb_int i : (MRB_INT_BIT - MRB_FIXNUM_SHIFT);
+    };
+    struct {
+      unsigned int sym_flag : MRB_SPECIAL_SHIFT;
+      mrb_sym sym : (sizeof(mrb_sym) * CHAR_BIT);
+    };
+    struct RBasic *bp;
+    struct RFloat *fp;
+    struct RCptr *vp;
+  } value;
+  unsigned long w;
+} mrb_value;
+
+MRB_API mrb_value mrb_word_boxing_cptr_value(struct mrb_state*, void*);
+MRB_API mrb_value mrb_word_boxing_float_value(struct mrb_state*, mrb_float);
+MRB_API mrb_value mrb_word_boxing_float_pool(struct mrb_state*, mrb_float);
+
+#define mrb_float_pool(mrb,f) mrb_word_boxing_float_pool(mrb,f)
+
+#define mrb_ptr(o)     (o).value.p
+#define mrb_cptr(o)    (o).value.vp->p
+#define mrb_float(o)   (o).value.fp->f
+#define mrb_fixnum(o)  (o).value.i
+#define mrb_symbol(o)  (o).value.sym
+
+static inline enum mrb_vtype
+mrb_type(mrb_value o)
+{
+  switch (o.w) {
+  case MRB_Qfalse:
+  case MRB_Qnil:
+    return MRB_TT_FALSE;
+  case MRB_Qtrue:
+    return MRB_TT_TRUE;
+  case MRB_Qundef:
+    return MRB_TT_UNDEF;
+  }
+  if (o.value.i_flag == MRB_FIXNUM_FLAG) {
+    return MRB_TT_FIXNUM;
+  }
+  if (o.value.sym_flag == MRB_SYMBOL_FLAG) {
+    return MRB_TT_SYMBOL;
+  }
+  return o.value.bp->tt;
+}
+
+#define mrb_bool(o)    ((o).w != MRB_Qnil && (o).w != MRB_Qfalse)
+#define mrb_fixnum_p(o) ((o).value.i_flag == MRB_FIXNUM_FLAG)
+#define mrb_undef_p(o) ((o).w == MRB_Qundef)
+#define mrb_nil_p(o)  ((o).w == MRB_Qnil)
+
+#define BOXWORD_SET_VALUE(o, ttt, attr, v) do {\
+  (o).w = 0;\
+  (o).attr = (v);\
+  switch (ttt) {\
+  case MRB_TT_FALSE:  (o).w = (v) ? MRB_Qfalse : MRB_Qnil; break;\
+  case MRB_TT_TRUE:   (o).w = MRB_Qtrue; break;\
+  case MRB_TT_UNDEF:  (o).w = MRB_Qundef; break;\
+  case MRB_TT_FIXNUM: (o).value.i_flag = MRB_FIXNUM_FLAG; break;\
+  case MRB_TT_SYMBOL: (o).value.sym_flag = MRB_SYMBOL_FLAG; break;\
+  default:            if ((o).value.bp) (o).value.bp->tt = ttt; break;\
+  }\
+} while (0)
+
+#define SET_FLOAT_VALUE(mrb,r,v) r = mrb_word_boxing_float_value(mrb, v)
+#define SET_CPTR_VALUE(mrb,r,v) r = mrb_word_boxing_cptr_value(mrb, v)
+#define SET_NIL_VALUE(r) BOXWORD_SET_VALUE(r, MRB_TT_FALSE, value.i, 0)
+#define SET_FALSE_VALUE(r) BOXWORD_SET_VALUE(r, MRB_TT_FALSE, value.i, 1)
+#define SET_TRUE_VALUE(r) BOXWORD_SET_VALUE(r, MRB_TT_TRUE, value.i, 1)
+#define SET_BOOL_VALUE(r,b) BOXWORD_SET_VALUE(r, b ? MRB_TT_TRUE : MRB_TT_FALSE, value.i, 1)
+#define SET_INT_VALUE(r,n) BOXWORD_SET_VALUE(r, MRB_TT_FIXNUM, value.i, (n))
+#define SET_SYM_VALUE(r,v) BOXWORD_SET_VALUE(r, MRB_TT_SYMBOL, value.sym, (v))
+#define SET_OBJ_VALUE(r,v) BOXWORD_SET_VALUE(r, (((struct RObject*)(v))->tt), value.p, (v))
+#define SET_PROC_VALUE(r,v) BOXWORD_SET_VALUE(r, MRB_TT_PROC, value.p, v)
+#define SET_UNDEF_VALUE(r) BOXWORD_SET_VALUE(r, MRB_TT_UNDEF, value.i, 0)
+
+#endif  /* MRUBY_BOXING_WORD_H */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/class.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,78 @@
+/*
+** mruby/class.h - Class class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_CLASS_H
+#define MRUBY_CLASS_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+struct RClass {
+  MRB_OBJECT_HEADER;
+  struct iv_tbl *iv;
+  struct kh_mt *mt;
+  struct RClass *super;
+};
+
+#define mrb_class_ptr(v)    ((struct RClass*)(mrb_ptr(v)))
+#define RCLASS_SUPER(v)     (((struct RClass*)(mrb_ptr(v)))->super)
+#define RCLASS_IV_TBL(v)    (((struct RClass*)(mrb_ptr(v)))->iv)
+#define RCLASS_M_TBL(v)     (((struct RClass*)(mrb_ptr(v)))->mt)
+
+static inline struct RClass*
+mrb_class(mrb_state *mrb, mrb_value v)
+{
+  switch (mrb_type(v)) {
+  case MRB_TT_FALSE:
+    if (mrb_fixnum(v))
+      return mrb->false_class;
+    return mrb->nil_class;
+  case MRB_TT_TRUE:
+    return mrb->true_class;
+  case MRB_TT_SYMBOL:
+    return mrb->symbol_class;
+  case MRB_TT_FIXNUM:
+    return mrb->fixnum_class;
+  case MRB_TT_FLOAT:
+    return mrb->float_class;
+  case MRB_TT_CPTR:
+    return mrb->object_class;
+  case MRB_TT_ENV:
+    return NULL;
+  default:
+    return mrb_obj_ptr(v)->c;
+  }
+}
+
+#define MRB_SET_INSTANCE_TT(c, tt) c->flags = ((c->flags & ~0xff) | (char)tt)
+#define MRB_INSTANCE_TT(c) (enum mrb_vtype)(c->flags & 0xff)
+
+MRB_API struct RClass* mrb_define_class_id(mrb_state*, mrb_sym, struct RClass*);
+MRB_API struct RClass* mrb_define_module_id(mrb_state*, mrb_sym);
+MRB_API struct RClass *mrb_vm_define_class(mrb_state*, mrb_value, mrb_value, mrb_sym);
+MRB_API struct RClass *mrb_vm_define_module(mrb_state*, mrb_value, mrb_sym);
+MRB_API void mrb_define_method_vm(mrb_state*, struct RClass*, mrb_sym, mrb_value);
+MRB_API void mrb_define_method_raw(mrb_state*, struct RClass*, mrb_sym, struct RProc *);
+MRB_API void mrb_define_method_id(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_func_t func, mrb_aspec aspec);
+MRB_API void mrb_alias_method(mrb_state *mrb, struct RClass *c, mrb_sym a, mrb_sym b);
+
+MRB_API struct RClass *mrb_class_outer_module(mrb_state*, struct RClass *);
+MRB_API struct RProc *mrb_method_search_vm(mrb_state*, struct RClass**, mrb_sym);
+MRB_API struct RProc *mrb_method_search(mrb_state*, struct RClass*, mrb_sym);
+
+MRB_API struct RClass* mrb_class_real(struct RClass* cl);
+
+void mrb_gc_mark_mt(mrb_state*, struct RClass*);
+size_t mrb_gc_mark_mt_size(mrb_state*, struct RClass*);
+void mrb_gc_free_mt(mrb_state*, struct RClass*);
+
+#if defined(__cplusplus)
+}  /* extern "C" { */
+#endif
+
+#endif  /* MRUBY_CLASS_H */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/compile.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,191 @@
+/*
+** mruby/compile.h - mruby parser
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_COMPILE_H
+#define MRUBY_COMPILE_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+#include "mruby.h"
+
+struct mrb_jmpbuf;
+
+struct mrb_parser_state;
+/* load context */
+typedef struct mrbc_context {
+  mrb_sym *syms;
+  int slen;
+  char *filename;
+  short lineno;
+  int (*partial_hook)(struct mrb_parser_state*);
+  void *partial_data;
+  struct RClass *target_class;
+  mrb_bool capture_errors:1;
+  mrb_bool dump_result:1;
+  mrb_bool no_exec:1;
+  mrb_bool keep_lv:1;
+  mrb_bool no_optimize:1;
+} mrbc_context;
+
+MRB_API mrbc_context* mrbc_context_new(mrb_state *mrb);
+MRB_API void mrbc_context_free(mrb_state *mrb, mrbc_context *cxt);
+MRB_API const char *mrbc_filename(mrb_state *mrb, mrbc_context *c, const char *s);
+MRB_API void mrbc_partial_hook(mrb_state *mrb, mrbc_context *c, int (*partial_hook)(struct mrb_parser_state*), void*data);
+
+MRB_API mrb_value mrb_toplevel_run_keep(mrb_state*, struct RProc*, unsigned int);
+
+/* AST node structure */
+typedef struct mrb_ast_node {
+  struct mrb_ast_node *car, *cdr;
+  uint16_t lineno, filename_index;
+} mrb_ast_node;
+
+/* lexer states */
+enum mrb_lex_state_enum {
+  EXPR_BEG,                   /* ignore newline, +/- is a sign. */
+  EXPR_END,                   /* newline significant, +/- is an operator. */
+  EXPR_ENDARG,                /* ditto, and unbound braces. */
+  EXPR_ENDFN,                 /* ditto, and unbound braces. */
+  EXPR_ARG,                   /* newline significant, +/- is an operator. */
+  EXPR_CMDARG,                /* newline significant, +/- is an operator. */
+  EXPR_MID,                   /* newline significant, +/- is an operator. */
+  EXPR_FNAME,                 /* ignore newline, no reserved words. */
+  EXPR_DOT,                   /* right after `.' or `::', no reserved words. */
+  EXPR_CLASS,                 /* immediate after `class', no here document. */
+  EXPR_VALUE,                 /* alike EXPR_BEG but label is disallowed. */
+  EXPR_MAX_STATE
+};
+
+/* saved error message */
+struct mrb_parser_message {
+  int lineno;
+  int column;
+  char* message;
+};
+
+#define STR_FUNC_PARSING 0x01
+#define STR_FUNC_EXPAND  0x02
+#define STR_FUNC_REGEXP  0x04
+#define STR_FUNC_WORD    0x08
+#define STR_FUNC_SYMBOL  0x10
+#define STR_FUNC_ARRAY   0x20
+#define STR_FUNC_HEREDOC 0x40
+#define STR_FUNC_XQUOTE  0x80
+
+enum mrb_string_type {
+  str_not_parsing  = (0),
+  str_squote   = (STR_FUNC_PARSING),
+  str_dquote   = (STR_FUNC_PARSING|STR_FUNC_EXPAND),
+  str_regexp   = (STR_FUNC_PARSING|STR_FUNC_REGEXP|STR_FUNC_EXPAND),
+  str_sword    = (STR_FUNC_PARSING|STR_FUNC_WORD|STR_FUNC_ARRAY),
+  str_dword    = (STR_FUNC_PARSING|STR_FUNC_WORD|STR_FUNC_ARRAY|STR_FUNC_EXPAND),
+  str_ssym     = (STR_FUNC_PARSING|STR_FUNC_SYMBOL),
+  str_ssymbols = (STR_FUNC_PARSING|STR_FUNC_SYMBOL|STR_FUNC_ARRAY),
+  str_dsymbols = (STR_FUNC_PARSING|STR_FUNC_SYMBOL|STR_FUNC_ARRAY|STR_FUNC_EXPAND),
+  str_heredoc  = (STR_FUNC_PARSING|STR_FUNC_HEREDOC),
+  str_xquote   = (STR_FUNC_PARSING|STR_FUNC_XQUOTE|STR_FUNC_EXPAND),
+};
+
+/* heredoc structure */
+struct mrb_parser_heredoc_info {
+  mrb_bool allow_indent:1;
+  mrb_bool line_head:1;
+  enum mrb_string_type type;
+  const char *term;
+  int term_len;
+  mrb_ast_node *doc;
+};
+
+#define MRB_PARSER_BUF_SIZE 1024
+
+/* parser structure */
+struct mrb_parser_state {
+  mrb_state *mrb;
+  struct mrb_pool *pool;
+  mrb_ast_node *cells;
+  const char *s, *send;
+#ifdef ENABLE_STDIO
+  FILE *f;
+#endif
+  mrbc_context *cxt;
+  char const *filename;
+  int lineno;
+  int column;
+
+  enum mrb_lex_state_enum lstate;
+  mrb_ast_node *lex_strterm; /* (type nest_level beg . end) */
+
+  unsigned int cond_stack;
+  unsigned int cmdarg_stack;
+  int paren_nest;
+  int lpar_beg;
+  int in_def, in_single;
+  mrb_bool cmd_start:1;
+  mrb_ast_node *locals;
+
+  mrb_ast_node *pb;
+  char buf[MRB_PARSER_BUF_SIZE];
+  int bidx;
+
+  mrb_ast_node *all_heredocs;	/* list of mrb_parser_heredoc_info* */
+  mrb_ast_node *heredocs_from_nextline;
+  mrb_ast_node *parsing_heredoc;
+  mrb_ast_node *lex_strterm_before_heredoc;
+  mrb_bool heredoc_end_now:1; /* for mirb */
+
+  void *ylval;
+
+  size_t nerr;
+  size_t nwarn;
+  mrb_ast_node *tree;
+
+  mrb_bool no_optimize:1;
+  mrb_bool capture_errors:1;
+  struct mrb_parser_message error_buffer[10];
+  struct mrb_parser_message warn_buffer[10];
+
+  mrb_sym* filename_table;
+  size_t filename_table_length;
+  int current_filename_index;
+
+  struct mrb_jmpbuf* jmp;
+};
+
+MRB_API struct mrb_parser_state* mrb_parser_new(mrb_state*);
+MRB_API void mrb_parser_free(struct mrb_parser_state*);
+MRB_API void mrb_parser_parse(struct mrb_parser_state*,mrbc_context*);
+
+MRB_API void mrb_parser_set_filename(struct mrb_parser_state*, char const*);
+MRB_API char const* mrb_parser_get_filename(struct mrb_parser_state*, uint16_t idx);
+
+/* utility functions */
+#ifdef ENABLE_STDIO
+MRB_API struct mrb_parser_state* mrb_parse_file(mrb_state*,FILE*,mrbc_context*);
+#endif
+MRB_API struct mrb_parser_state* mrb_parse_string(mrb_state*,const char*,mrbc_context*);
+MRB_API struct mrb_parser_state* mrb_parse_nstring(mrb_state*,const char*,int,mrbc_context*);
+MRB_API struct RProc* mrb_generate_code(mrb_state*, struct mrb_parser_state*);
+
+/* program load functions */
+#ifdef ENABLE_STDIO
+MRB_API mrb_value mrb_load_file(mrb_state*,FILE*);
+#endif
+MRB_API mrb_value mrb_load_string(mrb_state *mrb, const char *s);
+MRB_API mrb_value mrb_load_nstring(mrb_state *mrb, const char *s, int len);
+#ifdef ENABLE_STDIO
+MRB_API mrb_value mrb_load_file_cxt(mrb_state*,FILE*, mrbc_context *cxt);
+#endif
+MRB_API mrb_value mrb_load_string_cxt(mrb_state *mrb, const char *s, mrbc_context *cxt);
+MRB_API mrb_value mrb_load_nstring_cxt(mrb_state *mrb, const char *s, int len, mrbc_context *cxt);
+
+#if defined(__cplusplus)
+}  /* extern "C" { */
+#endif
+
+#endif /* MRUBY_COMPILE_H */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/data.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,67 @@
+/*
+** mruby/data.h - Data class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_DATA_H
+#define MRUBY_DATA_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+typedef struct mrb_data_type {
+  const char *struct_name;
+  void (*dfree)(mrb_state *mrb, void*);
+} mrb_data_type;
+
+struct RData {
+  MRB_OBJECT_HEADER;
+  struct iv_tbl *iv;
+  const mrb_data_type *type;
+  void *data;
+};
+
+MRB_API struct RData *mrb_data_object_alloc(mrb_state *mrb, struct RClass* klass, void *datap, const mrb_data_type *type);
+
+#define Data_Wrap_Struct(mrb,klass,type,ptr)\
+  mrb_data_object_alloc(mrb,klass,ptr,type)
+
+#define Data_Make_Struct(mrb,klass,strct,type,sval,data) do { \
+  sval = mrb_malloc(mrb, sizeof(strct));                     \
+  { static const strct zero = { 0 }; *sval = zero; };\
+  data = Data_Wrap_Struct(mrb,klass,type,sval);\
+} while (0)
+
+#define RDATA(obj)         ((struct RData *)(mrb_ptr(obj)))
+#define DATA_PTR(d)        (RDATA(d)->data)
+#define DATA_TYPE(d)       (RDATA(d)->type)
+MRB_API void mrb_data_check_type(mrb_state *mrb, mrb_value, const mrb_data_type*);
+MRB_API void *mrb_data_get_ptr(mrb_state *mrb, mrb_value, const mrb_data_type*);
+#define DATA_GET_PTR(mrb,obj,dtype,type) (type*)mrb_data_get_ptr(mrb,obj,dtype)
+MRB_API void *mrb_data_check_get_ptr(mrb_state *mrb, mrb_value, const mrb_data_type*);
+#define DATA_CHECK_GET_PTR(mrb,obj,dtype,type) (type*)mrb_data_check_get_ptr(mrb,obj,dtype)
+
+/* obsolete functions and macros */
+#define mrb_data_check_and_get(mrb,obj,dtype) mrb_data_get_ptr(mrb,obj,dtype)
+#define mrb_get_datatype(mrb,val,type) mrb_data_get_ptr(mrb, val, type)
+#define mrb_check_datatype(mrb,val,type) mrb_data_get_ptr(mrb, val, type)
+#define Data_Get_Struct(mrb,obj,type,sval) do {\
+  *(void**)&sval = mrb_data_get_ptr(mrb, obj, type); \
+} while (0)
+
+static inline void
+mrb_data_init(mrb_value v, void *ptr, const mrb_data_type *type)
+{
+  mrb_assert(mrb_type(v) == MRB_TT_DATA);
+  DATA_PTR(v) = ptr;
+  DATA_TYPE(v) = type;
+}
+
+#if defined(__cplusplus)
+}  /* extern "C" { */
+#endif
+
+#endif /* MRUBY_DATA_H */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/debug.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,66 @@
+/*
+** mruby/debug.h - mruby debug info
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_DEBUG_H
+#define MRUBY_DEBUG_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+typedef enum mrb_debug_line_type {
+  mrb_debug_line_ary = 0,
+  mrb_debug_line_flat_map = 1
+} mrb_debug_line_type;
+
+typedef struct mrb_irep_debug_info_line {
+  uint32_t start_pos;
+  uint16_t line;
+} mrb_irep_debug_info_line;
+
+typedef struct mrb_irep_debug_info_file {
+  uint32_t start_pos;
+  const char *filename;
+  mrb_sym filename_sym;
+  uint32_t line_entry_count;
+  mrb_debug_line_type line_type;
+  union {
+    void *ptr;
+    mrb_irep_debug_info_line *flat_map;
+    uint16_t *ary;
+  } lines;
+} mrb_irep_debug_info_file;
+
+typedef struct mrb_irep_debug_info {
+  uint32_t pc_count;
+  uint16_t flen;
+  mrb_irep_debug_info_file **files;
+} mrb_irep_debug_info;
+
+/*
+ * get line from irep's debug info and program counter
+ * @return returns NULL if not found
+ */
+MRB_API const char *mrb_debug_get_filename(mrb_irep *irep, uint32_t pc);
+
+/*
+ * get line from irep's debug info and program counter
+ * @return returns -1 if not found
+ */
+MRB_API int32_t mrb_debug_get_line(mrb_irep *irep, uint32_t pc);
+
+MRB_API mrb_irep_debug_info_file *mrb_debug_info_append_file(
+    mrb_state *mrb, mrb_irep *irep,
+    uint32_t start_pos, uint32_t end_pos);
+MRB_API mrb_irep_debug_info *mrb_debug_info_alloc(mrb_state *mrb, mrb_irep *irep);
+MRB_API void mrb_debug_info_free(mrb_state *mrb, mrb_irep_debug_info *d);
+
+#if defined(__cplusplus)
+}  /* extern "C" { */
+#endif
+
+#endif /* MRUBY_DEBUG_H */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/dump.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,160 @@
+/*
+** mruby/dump.h - mruby binary dumper (mrbc binary format)
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_DUMP_H
+#define MRUBY_DUMP_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+#include "mruby.h"
+#include "mruby/irep.h"
+
+int mrb_dump_irep(mrb_state *mrb, mrb_irep *irep, int debug_info, uint8_t **bin, size_t *bin_size);
+#ifdef ENABLE_STDIO
+int mrb_dump_irep_binary(mrb_state*, mrb_irep*, int, FILE*);
+int mrb_dump_irep_cfunc(mrb_state *mrb, mrb_irep*, int, FILE *f, const char *initname);
+mrb_irep *mrb_read_irep_file(mrb_state*, FILE*);
+MRB_API mrb_value mrb_load_irep_file(mrb_state*,FILE*);
+MRB_API mrb_value mrb_load_irep_file_cxt(mrb_state*, FILE*, mrbc_context*);
+#endif
+MRB_API mrb_irep *mrb_read_irep(mrb_state*, const uint8_t*);
+
+/* dump/load error code
+ *
+ * NOTE: MRB_DUMP_GENERAL_FAILURE is caused by
+ * unspecified issues like malloc failed.
+ */
+#define MRB_DUMP_OK                     0
+#define MRB_DUMP_GENERAL_FAILURE      (-1)
+#define MRB_DUMP_WRITE_FAULT          (-2)
+#define MRB_DUMP_READ_FAULT           (-3)
+#define MRB_DUMP_CRC_ERROR            (-4)
+#define MRB_DUMP_INVALID_FILE_HEADER  (-5)
+#define MRB_DUMP_INVALID_IREP         (-6)
+#define MRB_DUMP_INVALID_ARGUMENT     (-7)
+
+/* null symbol length */
+#define MRB_DUMP_NULL_SYM_LEN         0xFFFF
+
+/* Rite Binary File header */
+#define RITE_BINARY_IDENTIFIER         "RITE"
+#define RITE_BINARY_FORMAT_VER         "0003"
+#define RITE_COMPILER_NAME             "MATZ"
+#define RITE_COMPILER_VERSION          "0000"
+
+#define RITE_VM_VER                    "0000"
+
+#define RITE_BINARY_EOF                "END\0"
+#define RITE_SECTION_IREP_IDENTIFIER   "IREP"
+#define RITE_SECTION_LINENO_IDENTIFIER "LINE"
+#define RITE_SECTION_DEBUG_IDENTIFIER  "DBG\0"
+#define RITE_SECTION_LV_IDENTIFIER     "LVAR"
+
+#define MRB_DUMP_DEFAULT_STR_LEN      128
+#define MRB_DUMP_ALIGNMENT            sizeof(uint32_t)
+
+/* binary header */
+struct rite_binary_header {
+  uint8_t binary_identify[4]; /* Binary Identifier */
+  uint8_t binary_version[4];  /* Binary Format Version */
+  uint8_t binary_crc[2];      /* Binary CRC */
+  uint8_t binary_size[4];     /* Binary Size */
+  uint8_t compiler_name[4];   /* Compiler name */
+  uint8_t compiler_version[4];
+};
+
+/* section header */
+#define RITE_SECTION_HEADER \
+  uint8_t section_identify[4]; \
+  uint8_t section_size[4]
+
+struct rite_section_header {
+  RITE_SECTION_HEADER;
+};
+
+struct rite_section_irep_header {
+  RITE_SECTION_HEADER;
+
+  uint8_t rite_version[4];    /* Rite Instruction Specification Version */
+};
+
+struct rite_section_lineno_header {
+  RITE_SECTION_HEADER;
+};
+
+struct rite_section_debug_header {
+  RITE_SECTION_HEADER;
+};
+
+struct rite_section_lv_header {
+  RITE_SECTION_HEADER;
+};
+
+#define RITE_LV_NULL_MARK              UINT16_MAX
+
+struct rite_binary_footer {
+  RITE_SECTION_HEADER;
+};
+
+static inline size_t
+uint8_to_bin(uint8_t s, uint8_t *bin)
+{
+  *bin = s;
+  return sizeof(uint8_t);
+}
+
+static inline size_t
+uint16_to_bin(uint16_t s, uint8_t *bin)
+{
+  *bin++ = (s >> 8) & 0xff;
+  *bin   = s & 0xff;
+  return sizeof(uint16_t);
+}
+
+static inline size_t
+uint32_to_bin(uint32_t l, uint8_t *bin)
+{
+  *bin++ = (l >> 24) & 0xff;
+  *bin++ = (l >> 16) & 0xff;
+  *bin++ = (l >> 8) & 0xff;
+  *bin   = l & 0xff;
+  return sizeof(uint32_t);
+}
+
+static inline uint32_t
+bin_to_uint32(const uint8_t *bin)
+{
+  return (uint32_t)bin[0] << 24 |
+         (uint32_t)bin[1] << 16 |
+         (uint32_t)bin[2] << 8  |
+         (uint32_t)bin[3];
+}
+
+static inline uint16_t
+bin_to_uint16(const uint8_t *bin)
+{
+  return (uint16_t)bin[0] << 8 |
+         (uint16_t)bin[1];
+}
+
+static inline uint8_t
+bin_to_uint8(const uint8_t *bin)
+{
+  return (uint8_t)bin[0];
+}
+
+#if defined(__cplusplus)
+}  /* extern "C" { */
+#endif
+
+/* crc.c */
+uint16_t
+calc_crc_16_ccitt(const uint8_t *src, size_t nbytes, uint16_t crc);
+
+#endif  /* MRUBY_DUMP_H */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/error.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,37 @@
+/*
+** mruby/error.h - Exception class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_ERROR_H
+#define MRUBY_ERROR_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+struct RException {
+  MRB_OBJECT_HEADER;
+  struct iv_tbl *iv;
+};
+
+#define mrb_exc_ptr(v) ((struct RException*)mrb_ptr(v))
+
+MRB_API void mrb_sys_fail(mrb_state *mrb, const char *mesg);
+MRB_API mrb_value mrb_exc_new_str(mrb_state *mrb, struct RClass* c, mrb_value str);
+#define mrb_exc_new_str_lit(mrb, c, lit) mrb_exc_new_str(mrb, c, mrb_str_new_lit(mrb, lit))
+MRB_API mrb_value mrb_make_exception(mrb_state *mrb, int argc, const mrb_value *argv);
+MRB_API mrb_value mrb_exc_backtrace(mrb_state *mrb, mrb_value exc);
+MRB_API mrb_value mrb_get_backtrace(mrb_state *mrb);
+MRB_API mrb_noreturn void mrb_no_method_error(mrb_state *mrb, mrb_sym id, mrb_int argc, const mrb_value *argv, const char *fmt, ...);
+
+/* declaration for fail method */
+MRB_API mrb_value mrb_f_raise(mrb_state*, mrb_value);
+
+#if defined(__cplusplus)
+}  /* extern "C" { */
+#endif
+
+#endif  /* MRUBY_ERROR_H */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/gc.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,23 @@
+/*
+** mruby/gc.h - garbage collector for mruby
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_GC_H
+#define MRUBY_GC_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+typedef void (mrb_each_object_callback)(mrb_state *mrb, struct RBasic *obj, void *data);
+void mrb_objspace_each_objects(mrb_state *mrb, mrb_each_object_callback *callback, void *data);
+MRB_API void mrb_free_context(mrb_state *mrb, struct mrb_context *c);
+
+#if defined(__cplusplus)
+}  /* extern "C" { */
+#endif
+
+#endif  /* MRUBY_GC_H */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/hash.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,55 @@
+/*
+** mruby/hash.h - Hash class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_HASH_H
+#define MRUBY_HASH_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+struct RHash {
+  MRB_OBJECT_HEADER;
+  struct iv_tbl *iv;
+  struct kh_ht *ht;
+};
+
+#define mrb_hash_ptr(v)    ((struct RHash*)(mrb_ptr(v)))
+#define mrb_hash_value(p)  mrb_obj_value((void*)(p))
+
+MRB_API mrb_value mrb_hash_new_capa(mrb_state*, int);
+MRB_API mrb_value mrb_hash_new(mrb_state *mrb);
+
+MRB_API void mrb_hash_set(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value val);
+MRB_API mrb_value mrb_hash_get(mrb_state *mrb, mrb_value hash, mrb_value key);
+MRB_API mrb_value mrb_hash_fetch(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value def);
+MRB_API mrb_value mrb_hash_delete_key(mrb_state *mrb, mrb_value hash, mrb_value key);
+MRB_API mrb_value mrb_hash_keys(mrb_state *mrb, mrb_value hash);
+MRB_API mrb_value mrb_check_hash_type(mrb_state *mrb, mrb_value hash);
+MRB_API mrb_value mrb_hash_empty_p(mrb_state *mrb, mrb_value self);
+MRB_API mrb_value mrb_hash_clear(mrb_state *mrb, mrb_value hash);
+
+/* RHASH_TBL allocates st_table if not available. */
+#define RHASH(obj)   ((struct RHash*)(mrb_ptr(obj)))
+#define RHASH_TBL(h)          (RHASH(h)->ht)
+#define RHASH_IFNONE(h)       mrb_iv_get(mrb, (h), mrb_intern_lit(mrb, "ifnone"))
+#define RHASH_PROCDEFAULT(h)  RHASH_IFNONE(h)
+MRB_API struct kh_ht * mrb_hash_tbl(mrb_state *mrb, mrb_value hash);
+
+#define MRB_HASH_PROC_DEFAULT 256
+#define MRB_RHASH_PROCDEFAULT_P(h) (RHASH(h)->flags & MRB_HASH_PROC_DEFAULT)
+
+/* GC functions */
+void mrb_gc_mark_hash(mrb_state*, struct RHash*);
+size_t mrb_gc_mark_hash_size(mrb_state*, struct RHash*);
+void mrb_gc_free_hash(mrb_state*, struct RHash*);
+
+#if defined(__cplusplus)
+}  /* extern "C" { */
+#endif
+
+#endif  /* MRUBY_HASH_H */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/irep.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,61 @@
+/*
+** mruby/irep.h - mrb_irep structure
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_IREP_H
+#define MRUBY_IREP_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+#include "mruby/compile.h"
+
+enum irep_pool_type {
+  IREP_TT_STRING,
+  IREP_TT_FIXNUM,
+  IREP_TT_FLOAT,
+};
+
+struct mrb_locals {
+  mrb_sym name;
+  uint16_t r;
+};
+
+/* Program data array struct */
+typedef struct mrb_irep {
+  uint16_t nlocals;        /* Number of local variables */
+  uint16_t nregs;          /* Number of register variables */
+  uint8_t flags;
+
+  mrb_code *iseq;
+  mrb_value *pool;
+  mrb_sym *syms;
+  struct mrb_irep **reps;
+
+  struct mrb_locals *lv;
+  /* debug info */
+  const char *filename;
+  uint16_t *lines;
+  struct mrb_irep_debug_info* debug_info;
+
+  size_t ilen, plen, slen, rlen, refcnt;
+} mrb_irep;
+
+#define MRB_ISEQ_NO_FREE 1
+
+MRB_API mrb_irep *mrb_add_irep(mrb_state *mrb);
+MRB_API mrb_value mrb_load_irep(mrb_state*, const uint8_t*);
+MRB_API mrb_value mrb_load_irep_cxt(mrb_state*, const uint8_t*, mrbc_context*);
+void mrb_irep_free(mrb_state*, struct mrb_irep*);
+void mrb_irep_incref(mrb_state*, struct mrb_irep*);
+void mrb_irep_decref(mrb_state*, struct mrb_irep*);
+
+#if defined(__cplusplus)
+}  /* extern "C" { */
+#endif
+
+#endif  /* MRUBY_IREP_H */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/khash.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,271 @@
+/*
+** mruby/khash.c - Hash for mruby
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_KHASH_H
+#define MRUBY_KHASH_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+#include "mruby.h"
+#include <string.h>
+
+typedef uint32_t khint_t;
+typedef khint_t khiter_t;
+
+#ifndef KHASH_DEFAULT_SIZE
+# define KHASH_DEFAULT_SIZE 32
+#endif
+#define KHASH_MIN_SIZE 8
+
+#define UPPER_BOUND(x) ((x)>>2|(x)>>1)
+
+/* extern uint8_t __m[]; */
+
+/* mask for flags */
+static const uint8_t __m_empty[]  = {0x02, 0x08, 0x20, 0x80};
+static const uint8_t __m_del[]    = {0x01, 0x04, 0x10, 0x40};
+static const uint8_t __m_either[] = {0x03, 0x0c, 0x30, 0xc0};
+
+
+#define __ac_isempty(ed_flag, i) (ed_flag[(i)/4]&__m_empty[(i)%4])
+#define __ac_isdel(ed_flag, i) (ed_flag[(i)/4]&__m_del[(i)%4])
+#define __ac_iseither(ed_flag, i) (ed_flag[(i)/4]&__m_either[(i)%4])
+#define khash_power2(v) do { \
+  v--;\
+  v |= v >> 1;\
+  v |= v >> 2;\
+  v |= v >> 4;\
+  v |= v >> 8;\
+  v |= v >> 16;\
+  v++;\
+} while (0)
+#define khash_mask(h) ((h)->n_buckets-1)
+#define khash_upper_bound(h) (UPPER_BOUND((h)->n_buckets))
+
+/* declare struct kh_xxx and kh_xxx_funcs
+
+   name: hash name
+   khkey_t: key data type
+   khval_t: value data type
+   kh_is_map: (0: hash set / 1: hash map)
+*/
+#define KHASH_DECLARE(name, khkey_t, khval_t, kh_is_map)                \
+  typedef struct kh_##name {                                            \
+    khint_t n_buckets;                                                  \
+    khint_t size;                                                       \
+    khint_t n_occupied;                                                 \
+    uint8_t *ed_flags;                                                  \
+    khkey_t *keys;                                                      \
+    khval_t *vals;                                                      \
+  } kh_##name##_t;                                                      \
+  void kh_alloc_##name(mrb_state *mrb, kh_##name##_t *h);               \
+  kh_##name##_t *kh_init_##name##_size(mrb_state *mrb, khint_t size);   \
+  kh_##name##_t *kh_init_##name(mrb_state *mrb);                        \
+  void kh_destroy_##name(mrb_state *mrb, kh_##name##_t *h);             \
+  void kh_clear_##name(mrb_state *mrb, kh_##name##_t *h);               \
+  khint_t kh_get_##name(mrb_state *mrb, kh_##name##_t *h, khkey_t key);           \
+  khint_t kh_put_##name(mrb_state *mrb, kh_##name##_t *h, khkey_t key, int *ret); \
+  void kh_resize_##name(mrb_state *mrb, kh_##name##_t *h, khint_t new_n_buckets); \
+  void kh_del_##name(mrb_state *mrb, kh_##name##_t *h, khint_t x);                \
+  kh_##name##_t *kh_copy_##name(mrb_state *mrb, kh_##name##_t *h);
+
+static inline void
+kh_fill_flags(uint8_t *p, uint8_t c, size_t len)
+{
+  while (len-- > 0) {
+    *p++ = c;
+  }
+}
+
+/* define kh_xxx_funcs
+
+   name: hash name
+   khkey_t: key data type
+   khval_t: value data type
+   kh_is_map: (0: hash set / 1: hash map)
+   __hash_func: hash function
+   __hash_equal: hash comparation function
+*/
+#define KHASH_DEFINE(name, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \
+  void kh_alloc_##name(mrb_state *mrb, kh_##name##_t *h)                \
+  {                                                                     \
+    khint_t sz = h->n_buckets;                                          \
+    size_t len = sizeof(khkey_t) + (kh_is_map ? sizeof(khval_t) : 0);   \
+    uint8_t *p = (uint8_t*)mrb_malloc(mrb, sizeof(uint8_t)*sz/4+len*sz); \
+    h->size = h->n_occupied = 0;                                        \
+    h->keys = (khkey_t *)p;                                             \
+    h->vals = kh_is_map ? (khval_t *)(p+sizeof(khkey_t)*sz) : NULL;     \
+    h->ed_flags = p+len*sz;                                             \
+    kh_fill_flags(h->ed_flags, 0xaa, sz/4);                             \
+  }                                                                     \
+  kh_##name##_t *kh_init_##name##_size(mrb_state *mrb, khint_t size) {  \
+    kh_##name##_t *h = (kh_##name##_t*)mrb_calloc(mrb, 1, sizeof(kh_##name##_t)); \
+    if (size < KHASH_MIN_SIZE)                                          \
+      size = KHASH_MIN_SIZE;                                            \
+    khash_power2(size);                                                 \
+    h->n_buckets = size;                                                \
+    kh_alloc_##name(mrb, h);                                            \
+    return h;                                                           \
+  }                                                                     \
+  kh_##name##_t *kh_init_##name(mrb_state *mrb) {                       \
+    return kh_init_##name##_size(mrb, KHASH_DEFAULT_SIZE);              \
+  }                                                                     \
+  void kh_destroy_##name(mrb_state *mrb, kh_##name##_t *h)              \
+  {                                                                     \
+    if (h) {                                                            \
+      mrb_free(mrb, h->keys);                                           \
+      mrb_free(mrb, h);                                                 \
+    }                                                                   \
+  }                                                                     \
+  void kh_clear_##name(mrb_state *mrb, kh_##name##_t *h)                \
+  {                                                                     \
+    (void)mrb;                                                          \
+    if (h && h->ed_flags) {                                             \
+      kh_fill_flags(h->ed_flags, 0xaa, h->n_buckets/4);                 \
+      h->size = h->n_occupied = 0;                                      \
+    }                                                                   \
+  }                                                                     \
+  khint_t kh_get_##name(mrb_state *mrb, kh_##name##_t *h, khkey_t key)  \
+  {                                                                     \
+    khint_t k = __hash_func(mrb,key) & khash_mask(h), step = 0;         \
+    (void)mrb;                                                          \
+    while (!__ac_isempty(h->ed_flags, k)) {                             \
+      if (!__ac_isdel(h->ed_flags, k)) {                                \
+        if (__hash_equal(mrb,h->keys[k], key)) return k;                \
+      }                                                                 \
+      k = (k+(++step)) & khash_mask(h);                                 \
+    }                                                                   \
+    return kh_end(h);                                                   \
+  }                                                                     \
+  void kh_resize_##name(mrb_state *mrb, kh_##name##_t *h, khint_t new_n_buckets) \
+  {                                                                     \
+    if (new_n_buckets < KHASH_MIN_SIZE)                                 \
+      new_n_buckets = KHASH_MIN_SIZE;                                   \
+    khash_power2(new_n_buckets);                                        \
+    {                                                                   \
+      uint8_t *old_ed_flags = h->ed_flags;                              \
+      khkey_t *old_keys = h->keys;                                      \
+      khval_t *old_vals = h->vals;                                      \
+      khint_t old_n_buckets = h->n_buckets;                             \
+      khint_t i;                                                        \
+      h->n_buckets = new_n_buckets;                                     \
+      kh_alloc_##name(mrb, h);                                          \
+      /* relocate */                                                    \
+      for (i=0 ; i<old_n_buckets ; i++) {                               \
+        if (!__ac_iseither(old_ed_flags, i)) {                          \
+          khint_t k = kh_put_##name(mrb, h, old_keys[i], NULL);         \
+          if (kh_is_map) kh_value(h,k) = old_vals[i];                   \
+        }                                                               \
+      }                                                                 \
+      mrb_free(mrb, old_keys);                                          \
+    }                                                                   \
+  }                                                                     \
+  khint_t kh_put_##name(mrb_state *mrb, kh_##name##_t *h, khkey_t key, int *ret) \
+  {                                                                     \
+    khint_t k, del_k, step = 0;                                         \
+    if (h->n_occupied >= khash_upper_bound(h)) {                        \
+      kh_resize_##name(mrb, h, h->n_buckets*2);                         \
+    }                                                                   \
+    k = __hash_func(mrb,key) & khash_mask(h);                           \
+    del_k = kh_end(h);                                                  \
+    while (!__ac_isempty(h->ed_flags, k)) {                             \
+      if (!__ac_isdel(h->ed_flags, k)) {                                \
+        if (__hash_equal(mrb,h->keys[k], key)) {                        \
+          if (ret) *ret = 0;                                            \
+          return k;                                                     \
+        }                                                               \
+      }                                                                 \
+      else if (del_k == kh_end(h)) {                                    \
+        del_k = k;                                                      \
+      }                                                                 \
+      k = (k+(++step)) & khash_mask(h);                                 \
+    }                                                                   \
+    if (del_k != kh_end(h)) {                                           \
+      /* put at del */                                                  \
+      h->keys[del_k] = key;                                             \
+      h->ed_flags[del_k/4] &= ~__m_del[del_k%4];                        \
+      h->size++;                                                        \
+      if (ret) *ret = 2;                                                \
+      return del_k;                                                     \
+    }                                                                   \
+    else {                                                              \
+      /* put at empty */                                                \
+      h->keys[k] = key;                                                 \
+      h->ed_flags[k/4] &= ~__m_empty[k%4];                              \
+      h->size++;                                                        \
+      h->n_occupied++;                                                  \
+      if (ret) *ret = 1;                                                \
+      return k;                                                         \
+    }                                                                   \
+  }                                                                     \
+  void kh_del_##name(mrb_state *mrb, kh_##name##_t *h, khint_t x)       \
+  {                                                                     \
+    (void)mrb;                                                          \
+    mrb_assert(x != h->n_buckets && !__ac_iseither(h->ed_flags, x));    \
+    h->ed_flags[x/4] |= __m_del[x%4];                                   \
+    h->size--;                                                          \
+  }                                                                     \
+  kh_##name##_t *kh_copy_##name(mrb_state *mrb, kh_##name##_t *h)       \
+  {                                                                     \
+    kh_##name##_t *h2;                                                  \
+    khiter_t k, k2;                                                     \
+                                                                        \
+    h2 = kh_init_##name(mrb);                                           \
+    for (k = kh_begin(h); k != kh_end(h); k++) {                        \
+      if (kh_exist(h, k)) {                                             \
+        k2 = kh_put_##name(mrb, h2, kh_key(h, k), NULL);                \
+        if (kh_is_map) kh_value(h2, k2) = kh_value(h, k);               \
+      }                                                                 \
+    }                                                                   \
+    return h2;                                                          \
+  }
+
+
+#define khash_t(name) kh_##name##_t
+
+#define kh_init_size(name,mrb,size) kh_init_##name##_size(mrb,size)
+#define kh_init(name,mrb) kh_init_##name(mrb)
+#define kh_destroy(name, mrb, h) kh_destroy_##name(mrb, h)
+#define kh_clear(name, mrb, h) kh_clear_##name(mrb, h)
+#define kh_resize(name, mrb, h, s) kh_resize_##name(mrb, h, s)
+#define kh_put(name, mrb, h, k) kh_put_##name(mrb, h, k, NULL)
+#define kh_put2(name, mrb, h, k, r) kh_put_##name(mrb, h, k, r)
+#define kh_get(name, mrb, h, k) kh_get_##name(mrb, h, k)
+#define kh_del(name, mrb, h, k) kh_del_##name(mrb, h, k)
+#define kh_copy(name, mrb, h) kh_copy_##name(mrb, h)
+
+#define kh_exist(h, x) (!__ac_iseither((h)->ed_flags, (x)))
+#define kh_key(h, x) ((h)->keys[x])
+#define kh_val(h, x) ((h)->vals[x])
+#define kh_value(h, x) ((h)->vals[x])
+#define kh_begin(h) (khint_t)(0)
+#define kh_end(h) ((h)->n_buckets)
+#define kh_size(h) ((h)->size)
+#define kh_n_buckets(h) ((h)->n_buckets)
+
+#define kh_int_hash_func(mrb,key) (khint_t)((key)^((key)<<2)^((key)>>2))
+#define kh_int_hash_equal(mrb,a, b) (a == b)
+#define kh_int64_hash_func(mrb,key) (khint_t)((key)>>33^(key)^(key)<<11)
+#define kh_int64_hash_equal(mrb,a, b) (a == b)
+static inline khint_t __ac_X31_hash_string(const char *s)
+{
+    khint_t h = *s;
+    if (h) for (++s ; *s; ++s) h = (h << 5) - h + *s;
+    return h;
+}
+#define kh_str_hash_func(mrb,key) __ac_X31_hash_string(key)
+#define kh_str_hash_equal(mrb,a, b) (strcmp(a, b) == 0)
+
+typedef const char *kh_cstr_t;
+
+#if defined(__cplusplus)
+}  /* extern "C" { */
+#endif
+
+#endif  /* MRUBY_KHASH_H */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/numeric.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,67 @@
+/*
+** mruby/numeric.h - Numeric, Integer, Float, Fixnum class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_NUMERIC_H
+#define MRUBY_NUMERIC_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+#define POSFIXABLE(f) ((f) <= MRB_INT_MAX)
+#define NEGFIXABLE(f) ((f) >= MRB_INT_MIN)
+#define FIXABLE(f) (POSFIXABLE(f) && NEGFIXABLE(f))
+
+MRB_API mrb_value mrb_flo_to_fixnum(mrb_state *mrb, mrb_value val);
+MRB_API mrb_value mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, int base);
+MRB_API mrb_float mrb_to_flo(mrb_state *mrb, mrb_value x);
+
+mrb_value mrb_fixnum_plus(mrb_state *mrb, mrb_value x, mrb_value y);
+mrb_value mrb_fixnum_minus(mrb_state *mrb, mrb_value x, mrb_value y);
+mrb_value mrb_fixnum_mul(mrb_state *mrb, mrb_value x, mrb_value y);
+mrb_value mrb_num_div(mrb_state *mrb, mrb_value x, mrb_value y);
+
+#define MRB_UINT_MAKE2(n) uint ## n ## _t
+#define MRB_UINT_MAKE(n) MRB_UINT_MAKE2(n)
+#define mrb_uint MRB_UINT_MAKE(MRB_INT_BIT)
+
+#ifdef MRB_WORD_BOXING
+# define MRB_INT_OVERFLOW_MASK ((mrb_uint)1 << (MRB_INT_BIT - 1 - MRB_FIXNUM_SHIFT))
+#else
+# define MRB_INT_OVERFLOW_MASK ((mrb_uint)1 << (MRB_INT_BIT - 1))
+#endif
+
+static inline mrb_bool
+mrb_int_add_overflow(mrb_int augend, mrb_int addend, mrb_int *sum)
+{
+  mrb_uint x = (mrb_uint)augend;
+  mrb_uint y = (mrb_uint)addend;
+  mrb_uint z = (mrb_uint)(x + y);
+  *sum = (mrb_int)z;
+  return !!(((x ^ z) & (y ^ z)) & MRB_INT_OVERFLOW_MASK);
+}
+
+static inline mrb_bool
+mrb_int_sub_overflow(mrb_int minuend, mrb_int subtrahend, mrb_int *difference)
+{
+  mrb_uint x = (mrb_uint)minuend;
+  mrb_uint y = (mrb_uint)subtrahend;
+  mrb_uint z = (mrb_uint)(x - y);
+  *difference = (mrb_int)z;
+  return !!(((x ^ z) & (~y ^ z)) & MRB_INT_OVERFLOW_MASK);
+}
+
+#undef MRB_INT_OVERFLOW_MASK
+#undef mrb_uint
+#undef MRB_UINT_MAKE
+#undef MRB_UINT_MAKE2
+
+#if defined(__cplusplus)
+}  /* extern "C" { */
+#endif
+
+#endif  /* MRUBY_NUMERIC_H */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/object.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,56 @@
+/*
+** mruby/object.h - mruby object definition
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_OBJECT_H
+#define MRUBY_OBJECT_H
+
+#define MRB_OBJECT_HEADER \
+  enum mrb_vtype tt:8;\
+  uint32_t color:3;\
+  uint32_t flags:21;\
+  struct RClass *c;\
+  struct RBasic *gcnext
+
+/* white: 011, black: 100, gray: 000 */
+#define MRB_GC_GRAY 0
+#define MRB_GC_WHITE_A 1
+#define MRB_GC_WHITE_B (1 << 1)
+#define MRB_GC_BLACK (1 << 2)
+#define MRB_GC_WHITES (MRB_GC_WHITE_A | MRB_GC_WHITE_B)
+#define MRB_GC_COLOR_MASK 7
+
+#define paint_gray(o) ((o)->color = MRB_GC_GRAY)
+#define paint_black(o) ((o)->color = MRB_GC_BLACK)
+#define paint_white(o) ((o)->color = MRB_GC_WHITES)
+#define paint_partial_white(s, o) ((o)->color = (s)->current_white_part)
+#define is_gray(o) ((o)->color == MRB_GC_GRAY)
+#define is_white(o) ((o)->color & MRB_GC_WHITES)
+#define is_black(o) ((o)->color & MRB_GC_BLACK)
+#define is_dead(s, o) (((o)->color & other_white_part(s) & MRB_GC_WHITES) || (o)->tt == MRB_TT_FREE)
+#define flip_white_part(s) ((s)->current_white_part = other_white_part(s))
+#define other_white_part(s) ((s)->current_white_part ^ MRB_GC_WHITES)
+
+struct RBasic {
+  MRB_OBJECT_HEADER;
+};
+#define mrb_basic_ptr(v) ((struct RBasic*)(mrb_ptr(v)))
+
+struct RObject {
+  MRB_OBJECT_HEADER;
+  struct iv_tbl *iv;
+};
+#define mrb_obj_ptr(v)   ((struct RObject*)(mrb_ptr(v)))
+
+#define mrb_immediate_p(x) (mrb_type(x) < MRB_TT_HAS_BASIC)
+#define mrb_special_const_p(x) mrb_immediate_p(x)
+
+struct RFiber {
+  MRB_OBJECT_HEADER;
+  struct mrb_context *cxt;
+};
+
+#endif  /* MRUBY_OBJECT_H */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/opcode.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,161 @@
+/*
+** mruby/opcode.h - RiteVM operation codes
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_OPCODE_H
+#define MRUBY_OPCODE_H
+
+#define MAXARG_Bx        (0xffff)
+#define MAXARG_sBx       (MAXARG_Bx>>1)         /* `sBx' is signed */
+
+/* instructions: packed 32 bit      */
+/* -------------------------------  */
+/*     A:B:C:OP = 9: 9: 7: 7        */
+/*      A:Bx:OP =    9:16: 7        */
+/*        Ax:OP =      25: 7        */
+/*   A:Bz:Cz:OP = 9:14: 2: 7        */
+
+#define GET_OPCODE(i)            ((int)(((mrb_code)(i)) & 0x7f))
+#define GETARG_A(i)              ((int)((((mrb_code)(i)) >> 23) & 0x1ff))
+#define GETARG_B(i)              ((int)((((mrb_code)(i)) >> 14) & 0x1ff))
+#define GETARG_C(i)              ((int)((((mrb_code)(i)) >>  7) & 0x7f))
+#define GETARG_Bx(i)             ((int)((((mrb_code)(i)) >>  7) & 0xffff))
+#define GETARG_sBx(i)            ((int)(GETARG_Bx(i)-MAXARG_sBx))
+#define GETARG_Ax(i)             ((int32_t)((((mrb_code)(i)) >>  7) & 0x1ffffff))
+#define GETARG_UNPACK_b(i,n1,n2) ((int)((((mrb_code)(i)) >> (7+(n2))) & (((1<<(n1))-1))))
+#define GETARG_UNPACK_c(i,n1,n2) ((int)((((mrb_code)(i)) >> 7) & (((1<<(n2))-1))))
+#define GETARG_b(i)              GETARG_UNPACK_b(i,14,2)
+#define GETARG_c(i)              GETARG_UNPACK_c(i,14,2)
+
+#define MKOPCODE(op)          ((op) & 0x7f)
+#define MKARG_A(c)            ((mrb_code)((c) & 0x1ff) << 23)
+#define MKARG_B(c)            ((mrb_code)((c) & 0x1ff) << 14)
+#define MKARG_C(c)            (((c) & 0x7f) <<  7)
+#define MKARG_Bx(v)           ((mrb_code)((v) & 0xffff) << 7)
+#define MKARG_sBx(v)          MKARG_Bx((v)+MAXARG_sBx)
+#define MKARG_Ax(v)           ((mrb_code)((v) & 0x1ffffff) << 7)
+#define MKARG_PACK(b,n1,c,n2) ((((b) & ((1<<n1)-1)) << (7+n2))|(((c) & ((1<<n2)-1)) << 7))
+#define MKARG_bc(b,c)         MKARG_PACK(b,14,c,2)
+
+#define MKOP_A(op,a)        (MKOPCODE(op)|MKARG_A(a))
+#define MKOP_AB(op,a,b)     (MKOP_A(op,a)|MKARG_B(b))
+#define MKOP_ABC(op,a,b,c)  (MKOP_AB(op,a,b)|MKARG_C(c))
+#define MKOP_ABx(op,a,bx)   (MKOP_A(op,a)|MKARG_Bx(bx))
+#define MKOP_Bx(op,bx)      (MKOPCODE(op)|MKARG_Bx(bx))
+#define MKOP_sBx(op,sbx)    (MKOPCODE(op)|MKARG_sBx(sbx))
+#define MKOP_AsBx(op,a,sbx) (MKOP_A(op,a)|MKARG_sBx(sbx))
+#define MKOP_Ax(op,ax)      (MKOPCODE(op)|MKARG_Ax(ax))
+#define MKOP_Abc(op,a,b,c)  (MKOP_A(op,a)|MKARG_bc(b,c))
+
+enum {
+  /*-----------------------------------------------------------------------
+  operation code  operand description
+  ------------------------------------------------------------------------*/
+  OP_NOP=0,/*                                                             */
+  OP_MOVE,/*      A B     R(A) := R(B)                                    */
+  OP_LOADL,/*     A Bx    R(A) := Pool(Bx)                                */
+  OP_LOADI,/*     A sBx   R(A) := sBx                                     */
+  OP_LOADSYM,/*   A Bx    R(A) := Syms(Bx)                                */
+  OP_LOADNIL,/*   A       R(A) := nil                                     */
+  OP_LOADSELF,/*  A       R(A) := self                                    */
+  OP_LOADT,/*     A       R(A) := true                                    */
+  OP_LOADF,/*     A       R(A) := false                                   */
+
+  OP_GETGLOBAL,/* A Bx    R(A) := getglobal(Syms(Bx))                     */
+  OP_SETGLOBAL,/* A Bx    setglobal(Syms(Bx), R(A))                       */
+  OP_GETSPECIAL,/*A Bx    R(A) := Special[Bx]                             */
+  OP_SETSPECIAL,/*A Bx    Special[Bx] := R(A)                             */
+  OP_GETIV,/*     A Bx    R(A) := ivget(Syms(Bx))                         */
+  OP_SETIV,/*     A Bx    ivset(Syms(Bx),R(A))                            */
+  OP_GETCV,/*     A Bx    R(A) := cvget(Syms(Bx))                         */
+  OP_SETCV,/*     A Bx    cvset(Syms(Bx),R(A))                            */
+  OP_GETCONST,/*  A Bx    R(A) := constget(Syms(Bx))                      */
+  OP_SETCONST,/*  A Bx    constset(Syms(Bx),R(A))                         */
+  OP_GETMCNST,/*  A Bx    R(A) := R(A)::Syms(Bx)                          */
+  OP_SETMCNST,/*  A Bx    R(A+1)::Syms(Bx) := R(A)                        */
+  OP_GETUPVAR,/*  A B C   R(A) := uvget(B,C)                              */
+  OP_SETUPVAR,/*  A B C   uvset(B,C,R(A))                                 */
+
+  OP_JMP,/*       sBx     pc+=sBx                                         */
+  OP_JMPIF,/*     A sBx   if R(A) pc+=sBx                                 */
+  OP_JMPNOT,/*    A sBx   if !R(A) pc+=sBx                                */
+  OP_ONERR,/*     sBx     rescue_push(pc+sBx)                             */
+  OP_RESCUE,/*    A       clear(exc); R(A) := exception (ignore when A=0) */
+  OP_POPERR,/*    A       A.times{rescue_pop()}                           */
+  OP_RAISE,/*     A       raise(R(A))                                     */
+  OP_EPUSH,/*     Bx      ensure_push(SEQ[Bx])                            */
+  OP_EPOP,/*      A       A.times{ensure_pop().call}                      */
+
+  OP_SEND,/*      A B C   R(A) := call(R(A),Syms(B),R(A+1),...,R(A+C))    */
+  OP_SENDB,/*     A B C   R(A) := call(R(A),Syms(B),R(A+1),...,R(A+C),&R(A+C+1))*/
+  OP_FSEND,/*     A B C   R(A) := fcall(R(A),Syms(B),R(A+1),...,R(A+C-1)) */
+  OP_CALL,/*      A       R(A) := self.call(frame.argc, frame.argv)       */
+  OP_SUPER,/*     A C     R(A) := super(R(A+1),... ,R(A+C+1))             */
+  OP_ARGARY,/*    A Bx    R(A) := argument array (16=6:1:5:4)             */
+  OP_ENTER,/*     Ax      arg setup according to flags (23=5:5:1:5:5:1:1) */
+  OP_KARG,/*      A B C   R(A) := kdict[Syms(B)]; if C kdict.rm(Syms(B))  */
+  OP_KDICT,/*     A C     R(A) := kdict                                   */
+
+  OP_RETURN,/*    A B     return R(A) (B=normal,in-block return/break)    */
+  OP_TAILCALL,/*  A B C   return call(R(A),Syms(B),*R(C))                 */
+  OP_BLKPUSH,/*   A Bx    R(A) := block (16=6:1:5:4)                      */
+
+  OP_ADD,/*       A B C   R(A) := R(A)+R(A+1) (Syms[B]=:+,C=1)            */
+  OP_ADDI,/*      A B C   R(A) := R(A)+C (Syms[B]=:+)                     */
+  OP_SUB,/*       A B C   R(A) := R(A)-R(A+1) (Syms[B]=:-,C=1)            */
+  OP_SUBI,/*      A B C   R(A) := R(A)-C (Syms[B]=:-)                     */
+  OP_MUL,/*       A B C   R(A) := R(A)*R(A+1) (Syms[B]=:*,C=1)            */
+  OP_DIV,/*       A B C   R(A) := R(A)/R(A+1) (Syms[B]=:/,C=1)            */
+  OP_EQ,/*        A B C   R(A) := R(A)==R(A+1) (Syms[B]=:==,C=1)          */
+  OP_LT,/*        A B C   R(A) := R(A)<R(A+1)  (Syms[B]=:<,C=1)           */
+  OP_LE,/*        A B C   R(A) := R(A)<=R(A+1) (Syms[B]=:<=,C=1)          */
+  OP_GT,/*        A B C   R(A) := R(A)>R(A+1)  (Syms[B]=:>,C=1)           */
+  OP_GE,/*        A B C   R(A) := R(A)>=R(A+1) (Syms[B]=:>=,C=1)          */
+
+  OP_ARRAY,/*     A B C   R(A) := ary_new(R(B),R(B+1)..R(B+C))            */
+  OP_ARYCAT,/*    A B     ary_cat(R(A),R(B))                              */
+  OP_ARYPUSH,/*   A B     ary_push(R(A),R(B))                             */
+  OP_AREF,/*      A B C   R(A) := R(B)[C]                                 */
+  OP_ASET,/*      A B C   R(B)[C] := R(A)                                 */
+  OP_APOST,/*     A B C   *R(A),R(A+1)..R(A+C) := R(A)                    */
+
+  OP_STRING,/*    A Bx    R(A) := str_dup(Lit(Bx))                        */
+  OP_STRCAT,/*    A B     str_cat(R(A),R(B))                              */
+
+  OP_HASH,/*      A B C   R(A) := hash_new(R(B),R(B+1)..R(B+C))           */
+  OP_LAMBDA,/*    A Bz Cz R(A) := lambda(SEQ[Bz],Cz)                      */
+  OP_RANGE,/*     A B C   R(A) := range_new(R(B),R(B+1),C)                */
+
+  OP_OCLASS,/*    A       R(A) := ::Object                                */
+  OP_CLASS,/*     A B     R(A) := newclass(R(A),Syms(B),R(A+1))           */
+  OP_MODULE,/*    A B     R(A) := newmodule(R(A),Syms(B))                 */
+  OP_EXEC,/*      A Bx    R(A) := blockexec(R(A),SEQ[Bx])                 */
+  OP_METHOD,/*    A B     R(A).newmethod(Syms(B),R(A+1))                  */
+  OP_SCLASS,/*    A B     R(A) := R(B).singleton_class                    */
+  OP_TCLASS,/*    A       R(A) := target_class                            */
+
+  OP_DEBUG,/*     A B C   print R(A),R(B),R(C)                            */
+  OP_STOP,/*              stop VM                                         */
+  OP_ERR,/*       Bx      raise RuntimeError with message Lit(Bx)         */
+
+  OP_RSVD1,/*             reserved instruction #1                         */
+  OP_RSVD2,/*             reserved instruction #2                         */
+  OP_RSVD3,/*             reserved instruction #3                         */
+  OP_RSVD4,/*             reserved instruction #4                         */
+  OP_RSVD5,/*             reserved instruction #5                         */
+};
+
+#define OP_L_STRICT  1
+#define OP_L_CAPTURE 2
+#define OP_L_METHOD  OP_L_STRICT
+#define OP_L_LAMBDA  (OP_L_STRICT|OP_L_CAPTURE)
+#define OP_L_BLOCK   OP_L_CAPTURE
+
+#define OP_R_NORMAL 0
+#define OP_R_BREAK  1
+#define OP_R_RETURN 2
+
+#endif  /* MRUBY_OPCODE_H */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/proc.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,77 @@
+/*
+** mruby/proc.h - Proc class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_PROC_H
+#define MRUBY_PROC_H
+
+#include "mruby/irep.h"
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+struct REnv {
+  MRB_OBJECT_HEADER;
+  mrb_value *stack;
+  mrb_sym mid;
+  ptrdiff_t cioff;
+};
+
+#define MRB_SET_ENV_STACK_LEN(e,len) (e)->flags = (unsigned int)(len)
+#define MRB_ENV_STACK_LEN(e) ((mrb_int)(e)->flags)
+#define MRB_ENV_UNSHARE_STACK(e) ((e)->cioff = -1)
+#define MRB_ENV_STACK_SHARED_P(e) ((e)->cioff >= 0)
+
+struct RProc {
+  MRB_OBJECT_HEADER;
+  union {
+    mrb_irep *irep;
+    mrb_func_t func;
+  } body;
+  struct RClass *target_class;
+  struct REnv *env;
+};
+
+/* aspec access */
+#define MRB_ASPEC_REQ(a)          (((a) >> 18) & 0x1f)
+#define MRB_ASPEC_OPT(a)          (((a) >> 13) & 0x1f)
+#define MRB_ASPEC_REST(a)         (((a) >> 12) & 0x1)
+#define MRB_ASPEC_POST(a)         (((a) >> 7) & 0x1f)
+#define MRB_ASPEC_KEY(a)          (((a) >> 2) & 0x1f)
+#define MRB_ASPEC_KDICT(a)        ((a) & (1<<1))
+#define MRB_ASPEC_BLOCK(a)        ((a) & 1)
+
+#define MRB_PROC_CFUNC 128
+#define MRB_PROC_CFUNC_P(p) (((p)->flags & MRB_PROC_CFUNC) != 0)
+#define MRB_PROC_STRICT 256
+#define MRB_PROC_STRICT_P(p) (((p)->flags & MRB_PROC_STRICT) != 0)
+
+#define mrb_proc_ptr(v)    ((struct RProc*)(mrb_ptr(v)))
+
+struct RProc *mrb_proc_new(mrb_state*, mrb_irep*);
+struct RProc *mrb_closure_new(mrb_state*, mrb_irep*);
+MRB_API struct RProc *mrb_proc_new_cfunc(mrb_state*, mrb_func_t);
+MRB_API struct RProc *mrb_closure_new_cfunc(mrb_state *mrb, mrb_func_t func, int nlocals);
+void mrb_proc_copy(struct RProc *a, struct RProc *b);
+
+/* implementation of #send method */
+MRB_API mrb_value mrb_f_send(mrb_state *mrb, mrb_value self);
+
+/* following functions are defined in mruby-proc-ext so please include it when using */
+MRB_API struct RProc *mrb_proc_new_cfunc_with_env(mrb_state*, mrb_func_t, mrb_int, const mrb_value*);
+MRB_API mrb_value mrb_proc_cfunc_env_get(mrb_state*, mrb_int);
+/* old name */
+#define mrb_cfunc_env_get(mrb, idx) mrb_proc_cfunc_env_get(mrb, idx)
+
+#include "mruby/khash.h"
+KHASH_DECLARE(mt, mrb_sym, struct RProc*, TRUE)
+
+#if defined(__cplusplus)
+}  /* extern "C" { */
+#endif
+
+#endif  /* MRUBY_PROC_H */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/range.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,37 @@
+/*
+** mruby/range.h - Range class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_RANGE_H
+#define MRUBY_RANGE_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+typedef struct mrb_range_edges {
+  mrb_value beg;
+  mrb_value end;
+} mrb_range_edges;
+
+struct RRange {
+  MRB_OBJECT_HEADER;
+  mrb_range_edges *edges;
+  mrb_bool excl : 1;
+};
+
+#define mrb_range_ptr(v)    ((struct RRange*)(mrb_ptr(v)))
+#define mrb_range_value(p)  mrb_obj_value((void*)(p))
+
+MRB_API mrb_value mrb_range_new(mrb_state*, mrb_value, mrb_value, mrb_bool);
+MRB_API mrb_bool mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len);
+mrb_value mrb_get_values_at(mrb_state *mrb, mrb_value obj, mrb_int olen, mrb_int argc, const mrb_value *argv, mrb_value (*func)(mrb_state*, mrb_value, mrb_int));
+
+#if defined(__cplusplus)
+}  /* extern "C" { */
+#endif
+
+#endif  /* MRUBY_RANGE_H */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/re.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,21 @@
+/*
+** mruby/re.h - Regexp class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_RE_H
+#define MRUBY_RE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define REGEXP_CLASS          "Regexp"
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* RE_H */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/string.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,123 @@
+/*
+** mruby/string.h - String class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_STRING_H
+#define MRUBY_STRING_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+extern const char mrb_digitmap[];
+
+#define RSTRING_EMBED_LEN_MAX ((mrb_int)(sizeof(void*) * 3 - 1))
+
+struct RString {
+  MRB_OBJECT_HEADER;
+  union {
+    struct {
+      mrb_int len;
+      union {
+        mrb_int capa;
+        struct mrb_shared_string *shared;
+      } aux;
+      char *ptr;
+    } heap;
+    char ary[RSTRING_EMBED_LEN_MAX + 1];
+  } as;
+};
+
+#define RSTR_EMBED_P(s) ((s)->flags & MRB_STR_EMBED)
+#define RSTR_SET_EMBED_FLAG(s) ((s)->flags |= MRB_STR_EMBED)
+#define RSTR_UNSET_EMBED_FLAG(s) ((s)->flags &= ~(MRB_STR_EMBED|MRB_STR_EMBED_LEN_MASK))
+#define RSTR_SET_EMBED_LEN(s, n) do {\
+  size_t tmp_n = (n);\
+  s->flags &= ~MRB_STR_EMBED_LEN_MASK;\
+  s->flags |= (tmp_n) << MRB_STR_EMBED_LEN_SHIFT;\
+} while (0)
+#define RSTR_SET_LEN(s, n) do {\
+  if (RSTR_EMBED_P(s)) {\
+    RSTR_SET_EMBED_LEN((s),(n));\
+  } else {\
+    s->as.heap.len = (mrb_int)(n);\
+  }\
+} while (0)
+#define RSTR_EMBED_LEN(s)\
+  (mrb_int)(((s)->flags & MRB_STR_EMBED_LEN_MASK) >> MRB_STR_EMBED_LEN_SHIFT)
+#define RSTR_PTR(s) ((RSTR_EMBED_P(s)) ? (s)->as.ary : (s)->as.heap.ptr)
+#define RSTR_LEN(s) ((RSTR_EMBED_P(s)) ? RSTR_EMBED_LEN(s) : (s)->as.heap.len)
+#define RSTR_CAPA(s) (RSTR_EMBED_P(s) ? RSTRING_EMBED_LEN_MAX : (s)->as.heap.aux.capa)
+
+#define RSTR_SHARED_P(s) ((s)->flags & MRB_STR_SHARED)
+#define RSTR_SET_SHARED_FLAG(s) ((s)->flags |= MRB_STR_SHARED)
+#define RSTR_UNSET_SHARED_FLAG(s) ((s)->flags &= ~MRB_STR_SHARED)
+
+#define RSTR_NOFREE_P(s) ((s)->flags & MRB_STR_NOFREE)
+#define RSTR_SET_NOFREE_FLAG(s) ((s)->flags |= MRB_STR_NOFREE)
+#define RSTR_UNSET_NOFREE_FLAG(s) ((s)->flags &= ~MRB_STR_NOFREE)
+
+#define mrb_str_ptr(s)       ((struct RString*)(mrb_ptr(s)))
+#define RSTRING(s)           mrb_str_ptr(s)
+#define RSTRING_PTR(s)       RSTR_PTR(RSTRING(s))
+#define RSTRING_EMBED_LEN(s) RSTR_ENBED_LEN(RSTRING(s))
+#define RSTRING_LEN(s)       RSTR_LEN(RSTRING(s))  
+#define RSTRING_CAPA(s)      RSTR_CAPA(RSTRING(s))
+#define RSTRING_END(s)       (RSTRING_PTR(s) + RSTRING_LEN(s))
+mrb_int mrb_str_strlen(mrb_state*, struct RString*);
+
+#define MRB_STR_SHARED    1
+#define MRB_STR_NOFREE    2
+#define MRB_STR_EMBED     4
+#define MRB_STR_EMBED_LEN_MASK 0xf8
+#define MRB_STR_EMBED_LEN_SHIFT 3
+
+void mrb_gc_free_str(mrb_state*, struct RString*);
+MRB_API void mrb_str_modify(mrb_state*, struct RString*);
+MRB_API void mrb_str_concat(mrb_state*, mrb_value, mrb_value);
+MRB_API mrb_value mrb_str_plus(mrb_state*, mrb_value, mrb_value);
+MRB_API mrb_value mrb_ptr_to_str(mrb_state *, void*);
+MRB_API mrb_value mrb_obj_as_string(mrb_state *mrb, mrb_value obj);
+MRB_API mrb_value mrb_str_resize(mrb_state *mrb, mrb_value str, mrb_int len);
+MRB_API mrb_value mrb_str_substr(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len);
+MRB_API mrb_value mrb_string_type(mrb_state *mrb, mrb_value str);
+MRB_API mrb_value mrb_check_string_type(mrb_state *mrb, mrb_value str);
+MRB_API mrb_value mrb_str_buf_new(mrb_state *mrb, size_t capa);
+
+MRB_API const char *mrb_string_value_cstr(mrb_state *mrb, mrb_value *ptr);
+MRB_API const char *mrb_string_value_ptr(mrb_state *mrb, mrb_value ptr);
+MRB_API mrb_value mrb_str_dup(mrb_state *mrb, mrb_value str);
+MRB_API mrb_value mrb_str_intern(mrb_state *mrb, mrb_value self);
+MRB_API mrb_value mrb_str_to_inum(mrb_state *mrb, mrb_value str, mrb_int base, mrb_bool badcheck);
+MRB_API double mrb_str_to_dbl(mrb_state *mrb, mrb_value str, mrb_bool badcheck);
+MRB_API mrb_value mrb_str_to_str(mrb_state *mrb, mrb_value str);
+MRB_API mrb_bool mrb_str_equal(mrb_state *mrb, mrb_value str1, mrb_value str2);
+MRB_API mrb_value mrb_str_cat(mrb_state *mrb, mrb_value str, const char *ptr, size_t len);
+MRB_API mrb_value mrb_str_cat_cstr(mrb_state *mrb, mrb_value str, const char *ptr);
+MRB_API mrb_value mrb_str_cat_str(mrb_state *mrb, mrb_value str, mrb_value str2);
+#define mrb_str_cat_lit(mrb, str, lit) mrb_str_cat(mrb, str, lit, mrb_strlen_lit(lit))
+MRB_API mrb_value mrb_str_append(mrb_state *mrb, mrb_value str, mrb_value str2);
+
+MRB_API int mrb_str_cmp(mrb_state *mrb, mrb_value str1, mrb_value str2);
+MRB_API char *mrb_str_to_cstr(mrb_state *mrb, mrb_value str);
+mrb_value mrb_str_pool(mrb_state *mrb, mrb_value str);
+mrb_int mrb_str_hash(mrb_state *mrb, mrb_value str);
+mrb_value mrb_str_dump(mrb_state *mrb, mrb_value str);
+mrb_value mrb_str_inspect(mrb_state *mrb, mrb_value str);
+
+void mrb_noregexp(mrb_state *mrb, mrb_value self);
+void mrb_regexp_check(mrb_state *mrb, mrb_value obj);
+
+/* For backward compatibility */
+#define mrb_str_cat2(mrb, str, ptr) mrb_str_cat_cstr(mrb, str, ptr)
+#define mrb_str_buf_cat(mrb, str, ptr, len) mrb_str_cat(mrb, str, ptr, len)
+#define mrb_str_buf_append(mrb, str, str2) mrb_str_cat_str(mrb, str, str2)
+
+#if defined(__cplusplus)
+}  /* extern "C" { */
+#endif
+
+#endif  /* MRUBY_STRING_H */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/value.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,238 @@
+/*
+** mruby/value.h - mruby value definitions
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_VALUE_H
+#define MRUBY_VALUE_H
+
+typedef uint32_t mrb_sym;
+typedef uint8_t mrb_bool;
+struct mrb_state;
+
+#if defined(MRB_INT16) && defined(MRB_INT64)
+# error "You can't define MRB_INT16 and MRB_INT64 at the same time."
+#endif
+
+#if defined(MRB_INT64)
+  typedef int64_t mrb_int;
+# define MRB_INT_BIT 64
+# define MRB_INT_MIN (INT64_MIN>>MRB_FIXNUM_SHIFT)
+# define MRB_INT_MAX (INT64_MAX>>MRB_FIXNUM_SHIFT)
+#elif defined(MRB_INT16)
+  typedef int16_t mrb_int;
+# define MRB_INT_BIT 16
+# define MRB_INT_MIN (INT16_MIN>>MRB_FIXNUM_SHIFT)
+# define MRB_INT_MAX (INT16_MAX>>MRB_FIXNUM_SHIFT)
+#else
+  typedef int32_t mrb_int;
+# define MRB_INT_BIT 32
+# define MRB_INT_MIN (INT32_MIN>>MRB_FIXNUM_SHIFT)
+# define MRB_INT_MAX (INT32_MAX>>MRB_FIXNUM_SHIFT)
+#endif
+
+#ifdef MRB_USE_FLOAT
+  typedef float mrb_float;
+# define mrb_float_to_str(buf, i) sprintf(buf, "%.7e", i)
+# define str_to_mrb_float(buf) strtof(buf, NULL)
+#else
+  typedef double mrb_float;
+# define mrb_float_to_str(buf, i) sprintf(buf, "%.16e", i)
+# define str_to_mrb_float(buf) strtod(buf, NULL)
+#endif
+
+#ifdef _MSC_VER
+# ifndef __cplusplus
+#  define inline __inline
+# endif
+# if _MSC_VER < 1900
+#  include <stdarg.h>
+MRB_API int mrb_msvc_vsnprintf(char *s, size_t n, const char *format, va_list arg);
+MRB_API int mrb_msvc_snprintf(char *s, size_t n, const char *format, ...);
+#  define vsnprintf(s, n, format, arg) mrb_msvc_vsnprintf(s, n, format, arg)
+#  define snprintf(s, n, format, ...) mrb_msvc_snprintf(s, n, format, __VA_ARGS__)
+# endif
+# if _MSC_VER < 1800
+#  include <float.h>
+#  define isfinite(n) _finite(n)
+#  define isnan _isnan
+#  define isinf(n) (!_finite(n) && !_isnan(n))
+#  define signbit(n) (_copysign(1.0, (n)) < 0.0)
+#  define strtof (float)strtod
+static const unsigned int IEEE754_INFINITY_BITS_SINGLE = 0x7F800000;
+#  define INFINITY (*(float *)&IEEE754_INFINITY_BITS_SINGLE)
+#  define NAN ((float)(INFINITY - INFINITY))
+# else
+#  include <inttypes.h>
+# endif
+#else
+# include <inttypes.h>
+#endif
+
+enum mrb_vtype {
+  MRB_TT_FALSE = 0,   /*   0 */
+  MRB_TT_FREE,        /*   1 */
+  MRB_TT_TRUE,        /*   2 */
+  MRB_TT_FIXNUM,      /*   3 */
+  MRB_TT_SYMBOL,      /*   4 */
+  MRB_TT_UNDEF,       /*   5 */
+  MRB_TT_FLOAT,       /*   6 */
+  MRB_TT_CPTR,        /*   7 */
+  MRB_TT_OBJECT,      /*   8 */
+  MRB_TT_CLASS,       /*   9 */
+  MRB_TT_MODULE,      /*  10 */
+  MRB_TT_ICLASS,      /*  11 */
+  MRB_TT_SCLASS,      /*  12 */
+  MRB_TT_PROC,        /*  13 */
+  MRB_TT_ARRAY,       /*  14 */
+  MRB_TT_HASH,        /*  15 */
+  MRB_TT_STRING,      /*  16 */
+  MRB_TT_RANGE,       /*  17 */
+  MRB_TT_EXCEPTION,   /*  18 */
+  MRB_TT_FILE,        /*  19 */
+  MRB_TT_ENV,         /*  20 */
+  MRB_TT_DATA,        /*  21 */
+  MRB_TT_FIBER,       /*  22 */
+  MRB_TT_MAXDEFINE    /*  23 */
+};
+
+#include "mruby/object.h"
+
+#if defined(MRB_NAN_BOXING)
+#include "boxing_nan.h"
+#elif defined(MRB_WORD_BOXING)
+#include "boxing_word.h"
+#else
+#include "boxing_no.h"
+#endif
+
+#ifndef mrb_fixnum_p
+#define mrb_fixnum_p(o) (mrb_type(o) == MRB_TT_FIXNUM)
+#endif
+#ifndef mrb_undef_p
+#define mrb_undef_p(o) (mrb_type(o) == MRB_TT_UNDEF)
+#endif
+#ifndef mrb_nil_p
+#define mrb_nil_p(o)  (mrb_type(o) == MRB_TT_FALSE && !mrb_fixnum(o))
+#endif
+#ifndef mrb_bool
+#define mrb_bool(o)   (mrb_type(o) != MRB_TT_FALSE)
+#endif
+#define mrb_float_p(o) (mrb_type(o) == MRB_TT_FLOAT)
+#define mrb_symbol_p(o) (mrb_type(o) == MRB_TT_SYMBOL)
+#define mrb_array_p(o) (mrb_type(o) == MRB_TT_ARRAY)
+#define mrb_string_p(o) (mrb_type(o) == MRB_TT_STRING)
+#define mrb_hash_p(o) (mrb_type(o) == MRB_TT_HASH)
+#define mrb_cptr_p(o) (mrb_type(o) == MRB_TT_CPTR)
+#define mrb_exception_p(o) (mrb_type(o) == MRB_TT_EXCEPTION)
+#define mrb_test(o)   mrb_bool(o)
+MRB_API mrb_bool mrb_regexp_p(struct mrb_state*, mrb_value);
+
+static inline mrb_value
+mrb_float_value(struct mrb_state *mrb, mrb_float f)
+{
+  mrb_value v;
+  (void) mrb;
+  SET_FLOAT_VALUE(mrb, v, f);
+  return v;
+}
+
+static inline mrb_value
+mrb_cptr_value(struct mrb_state *mrb, void *p)
+{
+  mrb_value v;
+  (void) mrb;
+  SET_CPTR_VALUE(mrb,v,p);
+  return v;
+}
+
+static inline mrb_value
+mrb_fixnum_value(mrb_int i)
+{
+  mrb_value v;
+  SET_INT_VALUE(v, i);
+  return v;
+}
+
+static inline mrb_value
+mrb_symbol_value(mrb_sym i)
+{
+  mrb_value v;
+  SET_SYM_VALUE(v, i);
+  return v;
+}
+
+static inline mrb_value
+mrb_obj_value(void *p)
+{
+  mrb_value v;
+  SET_OBJ_VALUE(v, (struct RBasic*)p);
+  return v;
+}
+
+static inline mrb_value
+mrb_nil_value(void)
+{
+  mrb_value v;
+  SET_NIL_VALUE(v);
+  return v;
+}
+
+static inline mrb_value
+mrb_false_value(void)
+{
+  mrb_value v;
+  SET_FALSE_VALUE(v);
+  return v;
+}
+
+static inline mrb_value
+mrb_true_value(void)
+{
+  mrb_value v;
+  SET_TRUE_VALUE(v);
+  return v;
+}
+
+static inline mrb_value
+mrb_bool_value(mrb_bool boolean)
+{
+  mrb_value v;
+  SET_BOOL_VALUE(v, boolean);
+  return v;
+}
+
+static inline mrb_value
+mrb_undef_value(void)
+{
+  mrb_value v;
+  SET_UNDEF_VALUE(v);
+  return v;
+}
+
+#ifdef MRB_USE_ETEXT_EDATA
+extern char _etext[];
+#ifdef MRB_NO_INIT_ARRAY_START
+extern char _edata[];
+
+static inline mrb_bool
+mrb_ro_data_p(const char *p)
+{
+  return _etext < p && p < _edata;
+}
+#else
+extern char __init_array_start[];
+
+static inline mrb_bool
+mrb_ro_data_p(const char *p)
+{
+  return _etext < p && p < (char*)&__init_array_start;
+}
+#endif
+#else
+# define mrb_ro_data_p(p) FALSE
+#endif
+
+#endif  /* MRUBY_VALUE_H */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/variable.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,82 @@
+/*
+** mruby/variable.h - mruby variables
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_VARIABLE_H
+#define MRUBY_VARIABLE_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+typedef struct global_variable {
+  int   counter;
+  mrb_value *data;
+  mrb_value (*getter)(void);
+  void  (*setter)(void);
+  /* void  (*marker)(); */
+  /* int block_trace; */
+  /* struct trace_var *trace; */
+} global_variable;
+
+struct global_entry {
+  global_variable *var;
+  mrb_sym id;
+};
+
+mrb_value mrb_vm_special_get(mrb_state*, mrb_sym);
+void mrb_vm_special_set(mrb_state*, mrb_sym, mrb_value);
+mrb_value mrb_vm_iv_get(mrb_state*, mrb_sym);
+void mrb_vm_iv_set(mrb_state*, mrb_sym, mrb_value);
+mrb_value mrb_vm_cv_get(mrb_state*, mrb_sym);
+void mrb_vm_cv_set(mrb_state*, mrb_sym, mrb_value);
+mrb_value mrb_vm_const_get(mrb_state*, mrb_sym);
+void mrb_vm_const_set(mrb_state*, mrb_sym, mrb_value);
+MRB_API mrb_value mrb_const_get(mrb_state*, mrb_value, mrb_sym);
+MRB_API void mrb_const_set(mrb_state*, mrb_value, mrb_sym, mrb_value);
+MRB_API mrb_bool mrb_const_defined(mrb_state*, mrb_value, mrb_sym);
+MRB_API void mrb_const_remove(mrb_state*, mrb_value, mrb_sym);
+
+MRB_API mrb_bool mrb_iv_p(mrb_state *mrb, mrb_sym sym);
+MRB_API void mrb_iv_check(mrb_state *mrb, mrb_sym sym);
+MRB_API mrb_value mrb_obj_iv_get(mrb_state *mrb, struct RObject *obj, mrb_sym sym);
+MRB_API void mrb_obj_iv_set(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value v);
+MRB_API mrb_bool mrb_obj_iv_defined(mrb_state *mrb, struct RObject *obj, mrb_sym sym);
+MRB_API void mrb_obj_iv_ifnone(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value v);
+MRB_API mrb_value mrb_iv_get(mrb_state *mrb, mrb_value obj, mrb_sym sym);
+MRB_API void mrb_iv_set(mrb_state *mrb, mrb_value obj, mrb_sym sym, mrb_value v);
+MRB_API mrb_bool mrb_iv_defined(mrb_state*, mrb_value, mrb_sym);
+MRB_API mrb_value mrb_iv_remove(mrb_state *mrb, mrb_value obj, mrb_sym sym);
+MRB_API void mrb_iv_copy(mrb_state *mrb, mrb_value dst, mrb_value src);
+MRB_API mrb_bool mrb_const_defined_at(mrb_state *mrb, mrb_value mod, mrb_sym id);
+MRB_API mrb_value mrb_gv_get(mrb_state *mrb, mrb_sym sym);
+MRB_API void mrb_gv_set(mrb_state *mrb, mrb_sym sym, mrb_value val);
+MRB_API void mrb_gv_remove(mrb_state *mrb, mrb_sym sym);
+MRB_API mrb_value mrb_cv_get(mrb_state *mrb, mrb_value mod, mrb_sym sym);
+MRB_API void mrb_mod_cv_set(mrb_state *mrb, struct RClass * c, mrb_sym sym, mrb_value v);
+MRB_API void mrb_cv_set(mrb_state *mrb, mrb_value mod, mrb_sym sym, mrb_value v);
+MRB_API mrb_bool mrb_cv_defined(mrb_state *mrb, mrb_value mod, mrb_sym sym);
+mrb_value mrb_obj_iv_inspect(mrb_state*, struct RObject*);
+mrb_value mrb_mod_constants(mrb_state *mrb, mrb_value mod);
+mrb_value mrb_f_global_variables(mrb_state *mrb, mrb_value self);
+mrb_value mrb_obj_instance_variables(mrb_state*, mrb_value);
+mrb_value mrb_mod_class_variables(mrb_state*, mrb_value);
+mrb_value mrb_mod_cv_get(mrb_state *mrb, struct RClass * c, mrb_sym sym);
+mrb_bool mrb_mod_cv_defined(mrb_state *mrb, struct RClass * c, mrb_sym sym);
+mrb_sym mrb_class_sym(mrb_state *mrb, struct RClass *c, struct RClass *outer);
+
+/* GC functions */
+void mrb_gc_mark_gv(mrb_state*);
+void mrb_gc_free_gv(mrb_state*);
+void mrb_gc_mark_iv(mrb_state*, struct RObject*);
+size_t mrb_gc_mark_iv_size(mrb_state*, struct RObject*);
+void mrb_gc_free_iv(mrb_state*, struct RObject*);
+
+#if defined(__cplusplus)
+}  /* extern "C" { */
+#endif
+
+#endif  /* MRUBY_VARIABLE_H */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/mruby/version.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,41 @@
+/*
+** mruby/version.h - mruby version definition
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRUBY_VERSION_H
+#define MRUBY_VERSION_H
+
+#define MRUBY_RUBY_VERSION "1.9"
+#define MRUBY_RUBY_ENGINE  "mruby"
+
+#define MRUBY_VERSION "1.1.0"
+#define MRUBY_RELEASE_MAJOR 1
+#define MRUBY_RELEASE_MINOR 1
+#define MRUBY_RELEASE_TEENY 1
+#define MRUBY_RELEASE_NO 10101
+#define MRUBY_RELEASE_DATE "2014-11-19"
+#define MRUBY_RELEASE_YEAR 2014
+#define MRUBY_RELEASE_MONTH 11
+#define MRUBY_RELEASE_DAY 19
+
+#define MRUBY_BIRTH_YEAR 2010
+
+#define MRUBY_AUTHOR "mruby developers"
+
+#define MRB_STRINGIZE0(expr) #expr
+#define MRB_STRINGIZE(expr) MRB_STRINGIZE0(expr)
+
+#define MRUBY_DESCRIPTION      \
+  "mruby " MRUBY_VERSION       \
+  " (" MRUBY_RELEASE_DATE ") " \
+
+#define MRUBY_COPYRIGHT                \
+  "mruby - Copyright (c) "             \
+  MRB_STRINGIZE(MRUBY_BIRTH_YEAR)"-"   \
+  MRB_STRINGIZE(MRUBY_RELEASE_YEAR)" " \
+  MRUBY_AUTHOR                         \
+
+#endif  /* MRUBY_VERSION_H */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/gem_init.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,105 @@
+/*
+ * This file contains a list of all
+ * initializing methods which are
+ * necessary to bootstrap all gems.
+ *
+ * IMPORTANT:
+ *   This file was generated!
+ *   All manual changes will get lost.
+ */
+
+#include "mruby.h"
+
+void GENERATED_TMP_mrb_mruby_sprintf_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_sprintf_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_print_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_print_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_math_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_math_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_struct_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_struct_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_enum_ext_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_enum_ext_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_string_ext_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_string_ext_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_numeric_ext_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_numeric_ext_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_array_ext_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_array_ext_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_hash_ext_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_hash_ext_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_range_ext_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_range_ext_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_proc_ext_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_proc_ext_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_symbol_ext_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_symbol_ext_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_random_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_random_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_object_ext_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_object_ext_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_objectspace_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_objectspace_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_fiber_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_fiber_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_enumerator_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_enumerator_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_enum_lazy_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_enum_lazy_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_toplevel_ext_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_toplevel_ext_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_kernel_ext_gem_init(mrb_state*);
+void GENERATED_TMP_mrb_mruby_kernel_ext_gem_final(mrb_state*);
+void GENERATED_TMP_mrb_mruby_mbed_gem_final(mrb_state*);
+
+static void
+mrb_final_mrbgems(mrb_state *mrb) {
+  GENERATED_TMP_mrb_mruby_sprintf_gem_final(mrb);
+  GENERATED_TMP_mrb_mruby_print_gem_final(mrb);
+  GENERATED_TMP_mrb_mruby_math_gem_final(mrb);
+  GENERATED_TMP_mrb_mruby_struct_gem_final(mrb);
+  GENERATED_TMP_mrb_mruby_enum_ext_gem_final(mrb);
+  GENERATED_TMP_mrb_mruby_string_ext_gem_final(mrb);
+  GENERATED_TMP_mrb_mruby_numeric_ext_gem_final(mrb);
+  GENERATED_TMP_mrb_mruby_array_ext_gem_final(mrb);
+  GENERATED_TMP_mrb_mruby_hash_ext_gem_final(mrb);
+  GENERATED_TMP_mrb_mruby_range_ext_gem_final(mrb);
+  GENERATED_TMP_mrb_mruby_proc_ext_gem_final(mrb);
+  GENERATED_TMP_mrb_mruby_symbol_ext_gem_final(mrb);
+  GENERATED_TMP_mrb_mruby_random_gem_final(mrb);
+  GENERATED_TMP_mrb_mruby_object_ext_gem_final(mrb);
+  GENERATED_TMP_mrb_mruby_objectspace_gem_final(mrb);
+  GENERATED_TMP_mrb_mruby_fiber_gem_final(mrb);
+  GENERATED_TMP_mrb_mruby_enumerator_gem_final(mrb);
+  GENERATED_TMP_mrb_mruby_enum_lazy_gem_final(mrb);
+  GENERATED_TMP_mrb_mruby_toplevel_ext_gem_final(mrb);
+  GENERATED_TMP_mrb_mruby_kernel_ext_gem_final(mrb);
+  GENERATED_TMP_mrb_mruby_mbed_gem_final(mrb);
+}
+
+void
+mrb_init_mrbgems(mrb_state *mrb) {
+  GENERATED_TMP_mrb_mruby_sprintf_gem_init(mrb);
+  GENERATED_TMP_mrb_mruby_print_gem_init(mrb);
+  GENERATED_TMP_mrb_mruby_math_gem_init(mrb);
+  GENERATED_TMP_mrb_mruby_struct_gem_init(mrb);
+  GENERATED_TMP_mrb_mruby_enum_ext_gem_init(mrb);
+  GENERATED_TMP_mrb_mruby_string_ext_gem_init(mrb);
+  GENERATED_TMP_mrb_mruby_numeric_ext_gem_init(mrb);
+  GENERATED_TMP_mrb_mruby_array_ext_gem_init(mrb);
+  GENERATED_TMP_mrb_mruby_hash_ext_gem_init(mrb);
+  GENERATED_TMP_mrb_mruby_range_ext_gem_init(mrb);
+  GENERATED_TMP_mrb_mruby_proc_ext_gem_init(mrb);
+  GENERATED_TMP_mrb_mruby_symbol_ext_gem_init(mrb);
+  GENERATED_TMP_mrb_mruby_random_gem_init(mrb);
+  GENERATED_TMP_mrb_mruby_object_ext_gem_init(mrb);
+  GENERATED_TMP_mrb_mruby_objectspace_gem_init(mrb);
+  GENERATED_TMP_mrb_mruby_fiber_gem_init(mrb);
+  GENERATED_TMP_mrb_mruby_enumerator_gem_init(mrb);
+  GENERATED_TMP_mrb_mruby_enum_lazy_gem_init(mrb);
+  GENERATED_TMP_mrb_mruby_toplevel_ext_gem_init(mrb);
+  GENERATED_TMP_mrb_mruby_kernel_ext_gem_init(mrb);
+  GENERATED_TMP_mrb_mruby_mbed_gem_init(mrb);
+  mrb_state_atexit(mrb, mrb_final_mrbgems);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-array-ext/array.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,167 @@
+#include "mruby.h"
+#include "mruby/value.h"
+#include "mruby/array.h"
+#include "mruby/range.h"
+#include "mruby/hash.h"
+
+/*
+ *  call-seq:
+ *     ary.assoc(obj)   -> new_ary  or  nil
+ *
+ *  Searches through an array whose elements are also arrays
+ *  comparing _obj_ with the first element of each contained array
+ *  using obj.==.
+ *  Returns the first contained array that matches (that
+ *  is, the first associated array),
+ *  or +nil+ if no match is found.
+ *  See also <code>Array#rassoc</code>.
+ *
+ *     s1 = [ "colors", "red", "blue", "green" ]
+ *     s2 = [ "letters", "a", "b", "c" ]
+ *     s3 = "foo"
+ *     a  = [ s1, s2, s3 ]
+ *     a.assoc("letters")  #=> [ "letters", "a", "b", "c" ]
+ *     a.assoc("foo")      #=> nil
+ */
+
+static mrb_value
+mrb_ary_assoc(mrb_state *mrb, mrb_value ary)
+{
+  mrb_int i;
+  mrb_value v, k;
+
+  mrb_get_args(mrb, "o", &k);
+
+  for (i = 0; i < RARRAY_LEN(ary); ++i) {
+    v = mrb_check_array_type(mrb, RARRAY_PTR(ary)[i]);
+    if (!mrb_nil_p(v) && RARRAY_LEN(v) > 0 &&
+        mrb_equal(mrb, RARRAY_PTR(v)[0], k))
+      return v;
+  }
+  return mrb_nil_value();
+}
+
+/*
+ *  call-seq:
+ *     ary.rassoc(obj) -> new_ary or nil
+ *
+ *  Searches through the array whose elements are also arrays. Compares
+ *  _obj_ with the second element of each contained array using
+ *  <code>==</code>. Returns the first contained array that matches. See
+ *  also <code>Array#assoc</code>.
+ *
+ *     a = [ [ 1, "one"], [2, "two"], [3, "three"], ["ii", "two"] ]
+ *     a.rassoc("two")    #=> [2, "two"]
+ *     a.rassoc("four")   #=> nil
+ */
+
+static mrb_value
+mrb_ary_rassoc(mrb_state *mrb, mrb_value ary)
+{
+  mrb_int i;
+  mrb_value v, value;
+
+  mrb_get_args(mrb, "o", &value);
+
+  for (i = 0; i < RARRAY_LEN(ary); ++i) {
+    v = RARRAY_PTR(ary)[i];
+    if (mrb_type(v) == MRB_TT_ARRAY &&
+        RARRAY_LEN(v) > 1 &&
+        mrb_equal(mrb, RARRAY_PTR(v)[1], value))
+      return v;
+  }
+  return mrb_nil_value();
+}
+
+/*
+ *  call-seq:
+ *     ary.at(index)   ->   obj  or nil
+ *
+ *  Returns the element at _index_. A
+ *  negative index counts from the end of +self+.  Returns +nil+
+ *  if the index is out of range. See also <code>Array#[]</code>.
+ *
+ *     a = [ "a", "b", "c", "d", "e" ]
+ *     a.at(0)     #=> "a"
+ *     a.at(-1)    #=> "e"
+ */
+
+static mrb_value
+mrb_ary_at(mrb_state *mrb, mrb_value ary)
+{
+  mrb_int pos;
+  mrb_get_args(mrb, "i", &pos);
+
+  return mrb_ary_entry(ary, pos);
+}
+
+static mrb_value
+mrb_ary_values_at(mrb_state *mrb, mrb_value self)
+{
+  mrb_int argc;
+  mrb_value *argv;
+
+  mrb_get_args(mrb, "*", &argv, &argc);
+
+  return mrb_get_values_at(mrb, self, RARRAY_LEN(self), argc, argv, mrb_ary_ref);
+}
+
+/*
+ *  call-seq:
+ *     ary.to_h   ->   Hash
+ *
+ *  Returns the result of interpreting <i>aray</i> as an array of
+ *  <tt>[key, value]</tt> paris.
+ *
+ *     [[:foo, :bar], [1, 2]].to_h
+ *       # => {:foo => :bar, 1 => 2}
+ */
+
+static mrb_value
+mrb_ary_to_h(mrb_state *mrb, mrb_value ary)
+{
+  mrb_int i;
+  mrb_value v, hash;
+
+  hash = mrb_hash_new_capa(mrb, 0);
+
+  for (i = 0; i < RARRAY_LEN(ary); ++i) {
+    v = mrb_check_array_type(mrb, RARRAY_PTR(ary)[i]);
+
+    if (mrb_nil_p(v)) {
+      mrb_raisef(mrb, E_TYPE_ERROR, "wrong element type %S at %S (expected array)",
+        mrb_str_new_cstr(mrb,  mrb_obj_classname(mrb, RARRAY_PTR(ary)[i])),
+        mrb_fixnum_value(i)
+      );
+    }
+
+    if (RARRAY_LEN(v) != 2) {
+      mrb_raisef(mrb, E_ARGUMENT_ERROR, "wrong array length at %S (expected 2, was %S)",
+        mrb_fixnum_value(i),
+        mrb_fixnum_value(RARRAY_LEN(v))
+      );
+    }
+
+    mrb_hash_set(mrb, hash, RARRAY_PTR(v)[0], RARRAY_PTR(v)[1]);
+  }
+
+  return hash;
+}
+
+void
+mrb_mruby_array_ext_gem_init(mrb_state* mrb)
+{
+  struct RClass * a = mrb->array_class;
+
+  mrb_define_method(mrb, a, "assoc",  mrb_ary_assoc,  MRB_ARGS_REQ(1));
+  mrb_define_method(mrb, a, "at",     mrb_ary_at,     MRB_ARGS_REQ(1));
+  mrb_define_method(mrb, a, "rassoc", mrb_ary_rassoc, MRB_ARGS_REQ(1));
+  mrb_define_method(mrb, a, "values_at", mrb_ary_values_at, MRB_ARGS_ANY());
+  mrb_define_method(mrb, a, "to_h",   mrb_ary_to_h, MRB_ARGS_REQ(0));
+}
+
+void
+mrb_mruby_array_ext_gem_final(mrb_state* mrb)
+{
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-array-ext/gem_init.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,496 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ *   This file was generated!
+ *   All manual changes will get lost.
+ */
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+gem_mrblib_irep_mruby_array_ext[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0xf7,0xae,0x00,0x00,0x1c,0x9e,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x1a,0x4e,0x30,0x30,
+0x30,0x30,0x00,0x00,0x00,0x36,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x00,0x80,0x00,0x45,0x00,0x80,0x00,
+0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x05,0x41,0x72,
+0x72,0x61,0x79,0x00,0x00,0x00,0x01,0xf3,0x00,0x01,0x00,0x03,0x00,0x15,0x00,0x00,
+0x00,0x44,0x00,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x04,0x00,0x01,0x46,0x80,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,
+0x46,0xc0,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x08,0x00,0x01,0x46,0x00,0x81,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x0a,0x00,0x01,0x46,0x40,0x81,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x0c,0x00,0x01,0x46,0x80,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x0e,0x00,0x01,
+0x46,0xc0,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x10,0x00,0x01,0x46,0x00,0x82,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x12,0x00,0x01,0x46,0x40,0x82,0x00,0x11,0x05,0x80,0x00,
+0x20,0xc0,0x82,0x00,0x12,0x06,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x14,0x00,0x01,
+0x46,0x40,0x83,0x00,0x48,0x00,0x80,0x00,0xc0,0x16,0x00,0x01,0x46,0x80,0x83,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x18,0x00,0x01,0x46,0xc0,0x83,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x1a,0x00,0x01,0x46,0x00,0x84,0x00,0x48,0x00,0x80,0x00,0xc0,0x1c,0x00,0x01,
+0x46,0x40,0x84,0x00,0x48,0x00,0x80,0x00,0xc0,0x1e,0x00,0x01,0x46,0x80,0x84,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x20,0x00,0x01,0x46,0xc0,0x84,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x22,0x00,0x01,0x46,0x00,0x85,0x00,0x48,0x00,0x80,0x00,0xc0,0x24,0x00,0x01,
+0x46,0x40,0x84,0x00,0x48,0x00,0x80,0x00,0xc0,0x26,0x00,0x01,0x46,0x40,0x85,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x28,0x00,0x01,0x46,0x80,0x85,0x00,0x04,0x0b,0x80,0x00,
+0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x00,0x05,0x75,0x6e,
+0x69,0x71,0x21,0x00,0x00,0x04,0x75,0x6e,0x69,0x71,0x00,0x00,0x01,0x2d,0x00,0x00,
+0x01,0x7c,0x00,0x00,0x01,0x26,0x00,0x00,0x07,0x66,0x6c,0x61,0x74,0x74,0x65,0x6e,
+0x00,0x00,0x08,0x66,0x6c,0x61,0x74,0x74,0x65,0x6e,0x21,0x00,0x00,0x07,0x63,0x6f,
+0x6d,0x70,0x61,0x63,0x74,0x00,0x00,0x08,0x63,0x6f,0x6d,0x70,0x61,0x63,0x74,0x21,
+0x00,0x00,0x0c,0x72,0x65,0x76,0x65,0x72,0x73,0x65,0x5f,0x65,0x61,0x63,0x68,0x00,
+0x00,0x06,0x4f,0x62,0x6a,0x65,0x63,0x74,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,
+0x04,0x4e,0x4f,0x4e,0x45,0x00,0x00,0x05,0x66,0x65,0x74,0x63,0x68,0x00,0x00,0x04,
+0x66,0x69,0x6c,0x6c,0x00,0x00,0x06,0x72,0x6f,0x74,0x61,0x74,0x65,0x00,0x00,0x07,
+0x72,0x6f,0x74,0x61,0x74,0x65,0x21,0x00,0x00,0x09,0x64,0x65,0x6c,0x65,0x74,0x65,
+0x5f,0x69,0x66,0x00,0x00,0x07,0x72,0x65,0x6a,0x65,0x63,0x74,0x21,0x00,0x00,0x06,
+0x69,0x6e,0x73,0x65,0x72,0x74,0x00,0x00,0x07,0x62,0x73,0x65,0x61,0x72,0x63,0x68,
+0x00,0x00,0x07,0x6b,0x65,0x65,0x70,0x5f,0x69,0x66,0x00,0x00,0x07,0x73,0x65,0x6c,
+0x65,0x63,0x74,0x21,0x00,0x00,0x00,0x01,0x6c,0x00,0x07,0x00,0x0c,0x00,0x01,0x00,
+0x00,0x00,0x3c,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x03,0x20,0x00,0x80,0x03,
+0x01,0xc0,0x01,0x01,0x37,0xc0,0x81,0x01,0x19,0x0e,0xc0,0x00,0x3f,0xc0,0x01,0x02,
+0x97,0x08,0x40,0x00,0x01,0x80,0x80,0x03,0x20,0x40,0x80,0x03,0x01,0xc0,0x81,0x02,
+0x01,0x40,0x80,0x03,0x01,0x40,0x01,0x04,0xa0,0x80,0x80,0x03,0x01,0xc0,0x01,0x03,
+0x01,0x00,0x81,0x03,0x01,0x80,0x01,0x04,0xa0,0xc0,0x80,0x03,0x99,0x00,0xc0,0x03,
+0x97,0x02,0x40,0x00,0x01,0x40,0x81,0x03,0x01,0x00,0x01,0x04,0x01,0x80,0x81,0x04,
+0x01,0xc0,0x01,0x05,0x20,0x01,0x01,0x04,0x01,0x80,0x80,0x03,0x20,0x40,0x81,0x03,
+0x83,0xff,0x3f,0x04,0xb5,0x80,0x81,0x03,0x18,0xf5,0xbf,0x03,0x01,0x00,0x81,0x03,
+0x40,0x01,0x00,0x04,0x21,0xc0,0x81,0x03,0x17,0x07,0x40,0x00,0x17,0x04,0x40,0x00,
+0x01,0xc0,0x80,0x03,0x01,0x80,0x00,0x04,0x20,0x40,0x00,0x04,0xa0,0x00,0x82,0x03,
+0x01,0x80,0x80,0x03,0x01,0xc0,0x00,0x04,0x20,0x80,0x02,0x04,0xa0,0x40,0x82,0x03,
+0x01,0x80,0x80,0x03,0x20,0x40,0x81,0x03,0x83,0xff,0x3f,0x04,0xb5,0x80,0x81,0x03,
+0x98,0xf9,0xbf,0x03,0x01,0xc0,0x80,0x03,0x20,0x40,0x81,0x03,0x06,0x00,0x00,0x04,
+0x20,0x40,0x01,0x04,0xb2,0xc0,0x82,0x03,0x19,0x01,0xc0,0x03,0x05,0x00,0x80,0x03,
+0x97,0x01,0x40,0x00,0x06,0x00,0x80,0x03,0x01,0xc0,0x00,0x04,0xa0,0x00,0x83,0x03,
+0x29,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x00,0x03,0x64,0x75,
+0x70,0x00,0x00,0x05,0x73,0x68,0x69,0x66,0x74,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,
+0x00,0x00,0x08,0x68,0x61,0x73,0x5f,0x6b,0x65,0x79,0x3f,0x00,0x00,0x03,0x5b,0x5d,
+0x3d,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01,0x3e,0x00,0x00,0x0a,0x65,
+0x61,0x63,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x02,0x3c,0x3c,0x00,0x00,
+0x06,0x64,0x65,0x6c,0x65,0x74,0x65,0x00,0x00,0x04,0x6c,0x61,0x73,0x74,0x00,0x00,
+0x02,0x3d,0x3d,0x00,0x00,0x07,0x72,0x65,0x70,0x6c,0x61,0x63,0x65,0x00,0x00,0x00,
+0x00,0x33,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x05,0x26,0x00,0x00,0x02,
+0x15,0xc0,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x3c,0x3c,0x00,0x00,0x00,0x00,
+0x58,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0xa6,0x00,0x00,0x00,
+0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,0x01,0xc0,0x00,0x01,0x19,0x02,0xc0,0x00,
+0x01,0x80,0x80,0x01,0x01,0x40,0x00,0x02,0x21,0x40,0x80,0x01,0x17,0x01,0x40,0x00,
+0x01,0x80,0x80,0x01,0x20,0x40,0x80,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x03,0x64,0x75,0x70,0x00,0x00,0x05,0x75,0x6e,0x69,0x71,
+0x21,0x00,0x00,0x00,0x00,0xcd,0x00,0x05,0x00,0x0a,0x00,0x02,0x00,0x00,0x00,0x19,
+0x26,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0x20,0x00,0x80,0x02,0x11,0x01,0x00,0x03,
+0xb2,0x40,0x80,0x02,0x99,0x00,0xc0,0x02,0x97,0x04,0x40,0x00,0x06,0x00,0x80,0x02,
+0x11,0x02,0x00,0x03,0x3d,0x00,0x80,0x03,0x01,0x40,0x00,0x04,0x20,0x00,0x00,0x04,
+0x3e,0x00,0x82,0x03,0xbd,0x00,0x00,0x04,0x3e,0x00,0x82,0x03,0x20,0xc1,0x80,0x02,
+0x3f,0x40,0x81,0x01,0x37,0x40,0x01,0x02,0x01,0x40,0x80,0x02,0x40,0x01,0x00,0x03,
+0x21,0x40,0x81,0x02,0x06,0x00,0x80,0x02,0x40,0x03,0x00,0x03,0x21,0x40,0x81,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x0e,0x63,0x61,0x6e,0x27,0x74,
+0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,0x20,0x00,0x00,0x0b,0x20,0x69,0x6e,0x74,
+0x6f,0x20,0x41,0x72,0x72,0x61,0x79,0x00,0x00,0x00,0x06,0x00,0x05,0x63,0x6c,0x61,
+0x73,0x73,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x05,0x41,0x72,0x72,0x61,0x79,0x00,
+0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,0x70,0x65,0x45,0x72,
+0x72,0x6f,0x72,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x3c,0x00,
+0x03,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x26,0x00,0x00,0x02,
+0x07,0x00,0x80,0x01,0x15,0xc0,0x00,0x02,0x01,0x40,0x80,0x02,0x01,0xc0,0x00,0x03,
+0x20,0x01,0x00,0x02,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x06,0x00,0x00,
+0x00,0x00,0x00,0x0b,0x26,0x00,0x00,0x02,0x15,0xc0,0x80,0x01,0x01,0x40,0x00,0x02,
+0xa0,0x00,0x80,0x01,0x19,0x01,0xc0,0x01,0x05,0x00,0x80,0x01,0x97,0x01,0x40,0x00,
+0x15,0x00,0x81,0x01,0x01,0x40,0x00,0x02,0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x5b,0x5d,0x00,0x00,0x02,0x3c,
+0x3c,0x00,0x00,0x00,0x00,0xce,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x18,
+0x26,0x00,0x00,0x02,0x01,0x40,0x00,0x02,0x20,0x00,0x00,0x02,0x11,0x01,0x80,0x02,
+0xb2,0x40,0x00,0x02,0x99,0x00,0x40,0x02,0x97,0x04,0x40,0x00,0x06,0x00,0x00,0x02,
+0x11,0x02,0x80,0x02,0x3d,0x00,0x00,0x03,0x01,0x40,0x80,0x03,0x20,0x00,0x80,0x03,
+0x3e,0xc0,0x01,0x03,0xbd,0x00,0x80,0x03,0x3e,0xc0,0x01,0x03,0x20,0xc1,0x00,0x02,
+0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xac,0x40,0x01,0x02,0x01,0x00,0x81,0x01,
+0x20,0x80,0x01,0x02,0x98,0x00,0x40,0x02,0x01,0xc0,0x00,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x02,0x00,0x00,0x0e,0x63,0x61,0x6e,0x27,0x74,0x20,0x63,0x6f,0x6e,
+0x76,0x65,0x72,0x74,0x20,0x00,0x00,0x0b,0x20,0x69,0x6e,0x74,0x6f,0x20,0x41,0x72,
+0x72,0x61,0x79,0x00,0x00,0x00,0x07,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,
+0x02,0x3d,0x3d,0x00,0x00,0x05,0x41,0x72,0x72,0x61,0x79,0x00,0x00,0x05,0x72,0x61,
+0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,0x70,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,
+0x00,0x01,0x2b,0x00,0x00,0x05,0x75,0x6e,0x69,0x71,0x21,0x00,0x00,0x00,0x00,0xcd,
+0x00,0x05,0x00,0x0a,0x00,0x02,0x00,0x00,0x00,0x19,0x00,0x00,0x26,0x00,0x00,0x02,
+0x01,0x40,0x80,0x02,0x20,0x00,0x80,0x02,0x11,0x01,0x00,0x03,0xb2,0x40,0x80,0x02,
+0x99,0x00,0xc0,0x02,0x97,0x04,0x40,0x00,0x06,0x00,0x80,0x02,0x11,0x02,0x00,0x03,
+0x3d,0x00,0x80,0x03,0x01,0x40,0x00,0x04,0x20,0x00,0x00,0x04,0x3e,0x00,0x82,0x03,
+0xbd,0x00,0x00,0x04,0x3e,0x00,0x82,0x03,0x20,0xc1,0x80,0x02,0x3f,0x40,0x81,0x01,
+0x37,0x40,0x01,0x02,0x01,0x40,0x80,0x02,0x40,0x01,0x00,0x03,0x21,0x40,0x81,0x02,
+0x06,0x00,0x80,0x02,0x40,0x03,0x00,0x03,0x21,0x40,0x81,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x02,0x00,0x00,0x0e,0x63,0x61,0x6e,0x27,0x74,0x20,0x63,0x6f,0x6e,
+0x76,0x65,0x72,0x74,0x20,0x00,0x00,0x0b,0x20,0x69,0x6e,0x74,0x6f,0x20,0x41,0x72,
+0x72,0x61,0x79,0x00,0x00,0x00,0x06,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,
+0x02,0x3d,0x3d,0x00,0x00,0x05,0x41,0x72,0x72,0x61,0x79,0x00,0x00,0x05,0x72,0x61,
+0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,0x70,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,
+0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x3c,0x00,0x03,0x00,0x08,0x00,
+0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x26,0x00,0x00,0x02,0x07,0x00,0x80,0x01,
+0x15,0xc0,0x00,0x02,0x01,0x40,0x80,0x02,0x01,0xc0,0x00,0x03,0x20,0x01,0x00,0x02,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x5b,0x5d,
+0x3d,0x00,0x00,0x00,0x00,0x65,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x0e,
+0x26,0x00,0x00,0x02,0x15,0xc0,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,
+0x99,0x03,0xc0,0x01,0x15,0x00,0x81,0x01,0x01,0x40,0x00,0x02,0xa0,0x40,0x80,0x01,
+0x15,0xc0,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0x80,0x80,0x01,0x97,0x00,0x40,0x00,
+0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
+0x00,0x02,0x5b,0x5d,0x00,0x00,0x02,0x3c,0x3c,0x00,0x00,0x06,0x64,0x65,0x6c,0x65,
+0x74,0x65,0x00,0x00,0x00,0x00,0x45,0x00,0x04,0x00,0x06,0x00,0x01,0x00,0x00,0x00,
+0x09,0x00,0x00,0x00,0x26,0x00,0x10,0x00,0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,
+0x05,0x00,0x80,0x00,0x37,0x00,0x81,0x01,0x06,0x00,0x00,0x02,0x40,0x01,0x80,0x02,
+0x21,0x00,0x00,0x02,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0xc0,0x00,0x03,0x00,0x08,0x00,
+0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x26,0x00,0x00,0x02,0x01,0x40,0x80,0x01,
+0x91,0x00,0x00,0x02,0xa0,0x00,0x80,0x01,0x19,0x03,0xc0,0x01,0x15,0x40,0x80,0x01,
+0x20,0x80,0x80,0x01,0x98,0x01,0xc0,0x01,0x15,0x40,0x80,0x01,0x83,0xff,0x3f,0x02,
+0xb5,0xc0,0x80,0x01,0x99,0x06,0xc0,0x01,0x15,0xc0,0x80,0x01,0x01,0x40,0x00,0x02,
+0x15,0x40,0x80,0x02,0x20,0x80,0x80,0x02,0x19,0x01,0xc0,0x02,0x05,0x00,0x80,0x02,
+0x17,0x01,0x40,0x00,0x15,0x40,0x80,0x02,0xaf,0x40,0x81,0x02,0xa0,0x00,0x01,0x02,
+0xac,0x80,0x81,0x01,0x16,0xc0,0x80,0x01,0x97,0x01,0x40,0x00,0x15,0xc0,0x80,0x01,
+0x01,0x40,0x00,0x02,0xa0,0xc0,0x81,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x08,0x00,0x05,0x69,0x73,0x5f,0x61,0x3f,0x00,0x00,0x05,0x41,0x72,
+0x72,0x61,0x79,0x00,0x00,0x04,0x6e,0x69,0x6c,0x3f,0x00,0x00,0x01,0x3e,0x00,0x00,
+0x07,0x66,0x6c,0x61,0x74,0x74,0x65,0x6e,0x00,0x00,0x01,0x2d,0x00,0x00,0x01,0x2b,
+0x00,0x00,0x02,0x3c,0x3c,0x00,0x00,0x00,0x00,0x6b,0x00,0x05,0x00,0x08,0x00,0x01,
+0x00,0x00,0x00,0x10,0x26,0x00,0x10,0x00,0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,
+0x05,0x00,0x80,0x00,0x08,0x00,0x80,0x01,0x37,0x40,0x01,0x02,0x06,0x00,0x80,0x02,
+0x40,0x01,0x00,0x03,0x21,0x00,0x80,0x02,0x19,0x02,0xc0,0x01,0x06,0x00,0x80,0x02,
+0x01,0x00,0x01,0x03,0xa0,0x40,0x80,0x02,0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x02,
+0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x65,0x61,
+0x63,0x68,0x00,0x00,0x07,0x72,0x65,0x70,0x6c,0x61,0x63,0x65,0x00,0x00,0x00,0x00,
+0xc8,0x00,0x03,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x26,0x00,0x00,0x02,
+0x01,0x40,0x80,0x01,0x91,0x00,0x00,0x02,0xa0,0x00,0x80,0x01,0x19,0x03,0xc0,0x01,
+0x15,0x40,0x80,0x01,0x20,0x80,0x80,0x01,0x98,0x01,0xc0,0x01,0x15,0x40,0x80,0x01,
+0x83,0xff,0x3f,0x02,0xb5,0xc0,0x80,0x01,0x99,0x07,0xc0,0x01,0x15,0x00,0x81,0x01,
+0x01,0x40,0x00,0x02,0x15,0x40,0x80,0x02,0x20,0x80,0x80,0x02,0x19,0x01,0xc0,0x02,
+0x05,0x00,0x80,0x02,0x17,0x01,0x40,0x00,0x15,0x40,0x80,0x02,0xaf,0x40,0x81,0x02,
+0xa0,0x00,0x01,0x02,0xac,0x80,0x81,0x01,0x16,0x00,0x81,0x01,0x07,0x00,0x80,0x01,
+0x16,0xc0,0x80,0x01,0x97,0x01,0x40,0x00,0x15,0x00,0x81,0x01,0x01,0x40,0x00,0x02,
+0xa0,0xc0,0x81,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,
+0x00,0x05,0x69,0x73,0x5f,0x61,0x3f,0x00,0x00,0x05,0x41,0x72,0x72,0x61,0x79,0x00,
+0x00,0x04,0x6e,0x69,0x6c,0x3f,0x00,0x00,0x01,0x3e,0x00,0x00,0x07,0x66,0x6c,0x61,
+0x74,0x74,0x65,0x6e,0x00,0x00,0x01,0x2d,0x00,0x00,0x01,0x2b,0x00,0x00,0x02,0x3c,
+0x3c,0x00,0x00,0x00,0x00,0x43,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x06,
+0x26,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,0x01,0xc0,0x00,0x01,
+0x20,0x40,0x80,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x03,0x64,0x75,0x70,0x00,0x00,0x08,0x63,0x6f,0x6d,0x70,0x61,0x63,0x74,0x21,
+0x00,0x00,0x00,0x00,0x79,0x00,0x03,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x10,0x00,
+0x26,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0x21,0x00,0x80,0x01,
+0x01,0xc0,0x00,0x01,0x20,0x40,0x80,0x01,0x06,0x00,0x00,0x02,0x20,0x40,0x00,0x02,
+0xb2,0x80,0x80,0x01,0x19,0x01,0xc0,0x01,0x05,0x00,0x80,0x01,0x97,0x01,0x40,0x00,
+0x06,0x00,0x80,0x01,0x01,0x80,0x00,0x02,0xa0,0xc0,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x06,0x73,0x65,0x6c,0x65,0x63,0x74,
+0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x07,0x72,
+0x65,0x70,0x6c,0x61,0x63,0x65,0x00,0x00,0x00,0x00,0x33,0x00,0x03,0x00,0x06,0x00,
+0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x26,0x00,0x00,0x02,0x01,0x40,0x80,0x01,
+0x05,0x00,0x00,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x02,0x21,0x3d,0x00,0x00,0x00,0x00,0xce,0x00,0x03,0x00,
+0x07,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,
+0x20,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,
+0x04,0x01,0x00,0x02,0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x06,0x00,0x80,0x01,
+0x20,0xc0,0x80,0x01,0xaf,0x00,0x81,0x01,0x01,0xc0,0x00,0x01,0x17,0x04,0x40,0x00,
+0x01,0x40,0x80,0x01,0x06,0x00,0x00,0x02,0x01,0x80,0x80,0x02,0xa0,0x80,0x01,0x02,
+0xa0,0x40,0x81,0x01,0x01,0x80,0x80,0x01,0xaf,0x00,0x81,0x01,0x01,0xc0,0x00,0x01,
+0x01,0x80,0x80,0x01,0x83,0xff,0x3f,0x02,0xb6,0xc0,0x81,0x01,0x18,0xfa,0xbf,0x01,
+0x06,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,
+0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,
+0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x0c,0x72,0x65,0x76,0x65,0x72,
+0x73,0x65,0x5f,0x65,0x61,0x63,0x68,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,
+0x01,0x2d,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,
+0x02,0x3e,0x3d,0x00,0x00,0x00,0x01,0xd9,0x00,0x05,0x00,0x0a,0x00,0x00,0x00,0x00,
+0x00,0x45,0x00,0x00,0xa6,0x00,0x20,0x00,0x17,0x01,0x40,0x00,0x17,0x01,0x40,0x00,
+0x17,0x01,0x40,0x00,0x05,0x00,0x80,0x00,0x11,0x00,0x00,0x01,0x01,0x40,0x80,0x02,
+0x05,0x00,0x00,0x03,0xa0,0x40,0x80,0x02,0x99,0x01,0xc0,0x02,0x01,0x80,0x80,0x02,
+0x11,0x00,0x00,0x03,0xa0,0x40,0x80,0x02,0x99,0x00,0xc0,0x02,0x01,0xc0,0x80,0x02,
+0x99,0x01,0xc0,0x02,0x06,0x00,0x80,0x02,0x3d,0x00,0x00,0x03,0xa0,0x80,0x80,0x02,
+0x01,0x40,0x00,0x02,0x01,0x00,0x81,0x02,0x83,0xff,0x3f,0x03,0xb3,0xc0,0x80,0x02,
+0x99,0x02,0xc0,0x02,0x01,0x00,0x81,0x02,0x06,0x00,0x00,0x03,0x20,0x00,0x01,0x03,
+0xac,0x40,0x81,0x02,0x01,0x40,0x01,0x02,0x01,0x00,0x81,0x02,0x83,0xff,0x3f,0x03,
+0xb3,0xc0,0x80,0x02,0x18,0x02,0xc0,0x02,0x06,0x00,0x80,0x02,0x20,0x00,0x81,0x02,
+0x01,0x00,0x01,0x03,0xb4,0x80,0x81,0x02,0x99,0x0d,0xc0,0x02,0x19,0x02,0xc0,0x01,
+0x01,0xc0,0x80,0x02,0x01,0x40,0x00,0x03,0xa0,0xc0,0x81,0x02,0x29,0x00,0x80,0x02,
+0x01,0x80,0x80,0x02,0x11,0x00,0x00,0x03,0xb2,0x00,0x82,0x02,0x99,0x08,0xc0,0x02,
+0x06,0x00,0x80,0x02,0x11,0x05,0x00,0x03,0xbd,0x00,0x80,0x03,0x01,0x40,0x00,0x04,
+0x3e,0x00,0x82,0x03,0x3d,0x01,0x00,0x04,0x3e,0x00,0x82,0x03,0x06,0x00,0x00,0x04,
+0x20,0x00,0x01,0x04,0x20,0xc0,0x02,0x04,0x3e,0x00,0x82,0x03,0xbd,0x01,0x00,0x04,
+0x3e,0x00,0x82,0x03,0x06,0x00,0x00,0x04,0x20,0x00,0x01,0x04,0x3e,0x00,0x82,0x03,
+0x20,0x41,0x82,0x02,0x29,0x00,0x00,0x01,0x06,0x00,0x80,0x02,0x01,0x00,0x01,0x03,
+0xa0,0x00,0x83,0x02,0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x27,0x62,
+0x6c,0x6f,0x63,0x6b,0x20,0x73,0x75,0x70,0x65,0x72,0x73,0x65,0x64,0x65,0x73,0x20,
+0x64,0x65,0x66,0x61,0x75,0x6c,0x74,0x20,0x76,0x61,0x6c,0x75,0x65,0x20,0x61,0x72,
+0x67,0x75,0x6d,0x65,0x6e,0x74,0x00,0x00,0x06,0x69,0x6e,0x64,0x65,0x78,0x20,0x00,
+0x00,0x1a,0x20,0x6f,0x75,0x74,0x73,0x69,0x64,0x65,0x20,0x6f,0x66,0x20,0x61,0x72,
+0x72,0x61,0x79,0x20,0x62,0x6f,0x75,0x6e,0x64,0x73,0x3a,0x20,0x00,0x00,0x03,0x2e,
+0x2e,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x00,0x04,0x4e,0x4f,0x4e,0x45,0x00,
+0x00,0x02,0x21,0x3d,0x00,0x00,0x04,0x77,0x61,0x72,0x6e,0x00,0x00,0x01,0x3c,0x00,
+0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01,0x2b,0x00,0x00,0x02,0x3c,0x3d,0x00,
+0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x05,0x72,0x61,
+0x69,0x73,0x65,0x00,0x00,0x0a,0x49,0x6e,0x64,0x65,0x78,0x45,0x72,0x72,0x6f,0x72,
+0x00,0x00,0x02,0x2d,0x40,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x00,0x04,0x65,0x00,
+0x09,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0xa6,0x00,0x30,0x00,
+0x97,0x01,0x40,0x00,0x97,0x01,0x40,0x00,0x97,0x01,0x40,0x00,0x97,0x01,0x40,0x00,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x05,0x00,0x80,0x01,0x01,0x40,0x80,0x04,
+0x05,0x00,0x00,0x05,0xb2,0x00,0x80,0x04,0x99,0x01,0xc0,0x04,0x01,0x80,0x80,0x04,
+0x05,0x00,0x00,0x05,0xb2,0x00,0x80,0x04,0x99,0x01,0xc0,0x04,0x01,0xc0,0x80,0x04,
+0x05,0x00,0x00,0x05,0xb2,0x00,0x80,0x04,0x19,0x01,0xc0,0x04,0x01,0x00,0x81,0x04,
+0x20,0x40,0x80,0x04,0x19,0x02,0xc0,0x04,0x06,0x00,0x80,0x04,0x91,0x01,0x00,0x05,
+0x3d,0x00,0x80,0x05,0x20,0x81,0x80,0x04,0x83,0xff,0xbf,0x04,0x01,0x40,0x02,0x03,
+0x01,0x40,0x82,0x02,0x37,0x40,0x82,0x03,0x19,0x29,0x40,0x02,0x01,0x40,0x80,0x04,
+0x05,0x00,0x00,0x05,0xb2,0x00,0x80,0x04,0x99,0x01,0xc0,0x04,0x01,0x80,0x80,0x04,
+0x05,0x00,0x00,0x05,0xb2,0x00,0x80,0x04,0x99,0x01,0xc0,0x04,0x01,0xc0,0x80,0x04,
+0x05,0x00,0x00,0x05,0xb2,0x00,0x80,0x04,0x99,0x02,0xc0,0x04,0x83,0xff,0xbf,0x02,
+0x06,0x00,0x80,0x04,0x20,0x00,0x81,0x04,0x01,0x40,0x02,0x03,0x17,0x20,0x40,0x00,
+0x01,0x40,0x80,0x04,0x05,0x00,0x00,0x05,0xa0,0x40,0x81,0x04,0x99,0x01,0xc0,0x04,
+0x01,0x40,0x80,0x04,0x91,0x03,0x00,0x05,0xa0,0x80,0x81,0x04,0x19,0x0f,0xc0,0x04,
+0x01,0x40,0x80,0x04,0x20,0x00,0x82,0x04,0x01,0x40,0x82,0x02,0x83,0xff,0x3f,0x05,
+0xb3,0x40,0x82,0x04,0x99,0x02,0xc0,0x04,0x01,0x40,0x81,0x04,0x06,0x00,0x00,0x05,
+0x20,0x00,0x01,0x05,0xac,0x80,0x82,0x04,0x01,0x40,0x82,0x02,0x01,0x40,0x80,0x04,
+0x20,0xc0,0x82,0x04,0x01,0x40,0x02,0x03,0x83,0xff,0x3f,0x05,0xb3,0x40,0x82,0x04,
+0x99,0x02,0xc0,0x04,0x01,0x80,0x81,0x04,0x06,0x00,0x00,0x05,0x20,0x00,0x01,0x05,
+0xac,0x80,0x82,0x04,0x01,0x40,0x02,0x03,0x01,0x40,0x80,0x04,0x20,0x00,0x83,0x04,
+0x99,0x00,0xc0,0x04,0x97,0x01,0x40,0x00,0x01,0x80,0x81,0x04,0xad,0x80,0x82,0x04,
+0x01,0x40,0x02,0x03,0x17,0x0d,0x40,0x00,0x01,0x40,0x80,0x04,0x05,0x00,0x00,0x05,
+0xa0,0x40,0x81,0x04,0x19,0x0b,0xc0,0x04,0x01,0x40,0x80,0x02,0x01,0x40,0x81,0x04,
+0x83,0xff,0x3f,0x05,0xb3,0x40,0x82,0x04,0x99,0x02,0xc0,0x04,0x01,0x40,0x81,0x04,
+0x06,0x00,0x00,0x05,0x20,0x00,0x01,0x05,0xac,0x80,0x82,0x04,0x01,0x40,0x82,0x02,
+0x01,0x80,0x80,0x04,0x05,0x00,0x00,0x05,0xb2,0x00,0x80,0x04,0x19,0x02,0xc0,0x04,
+0x06,0x00,0x80,0x04,0x20,0x00,0x81,0x04,0x01,0x40,0x02,0x03,0x17,0x02,0x40,0x00,
+0x01,0x40,0x80,0x04,0x01,0x80,0x00,0x05,0xac,0x80,0x82,0x04,0x01,0x40,0x02,0x03,
+0x97,0x2c,0x40,0x00,0x01,0x40,0x80,0x04,0x05,0x00,0x00,0x05,0xa0,0x40,0x81,0x04,
+0x99,0x01,0xc0,0x04,0x01,0x80,0x80,0x04,0x05,0x00,0x00,0x05,0xb2,0x00,0x80,0x04,
+0x99,0x01,0xc0,0x04,0x01,0xc0,0x80,0x04,0x05,0x00,0x00,0x05,0xb2,0x00,0x80,0x04,
+0x99,0x02,0xc0,0x04,0x83,0xff,0xbf,0x02,0x06,0x00,0x80,0x04,0x20,0x00,0x81,0x04,
+0x01,0x40,0x02,0x03,0x17,0x24,0x40,0x00,0x01,0x40,0x80,0x04,0x05,0x00,0x00,0x05,
+0xa0,0x40,0x81,0x04,0x99,0x01,0xc0,0x04,0x01,0x80,0x80,0x04,0x05,0x00,0x00,0x05,
+0xa0,0x40,0x81,0x04,0x99,0x01,0xc0,0x04,0x01,0x80,0x80,0x04,0x91,0x03,0x00,0x05,
+0xa0,0x80,0x81,0x04,0x19,0x0f,0xc0,0x04,0x01,0x80,0x80,0x04,0x20,0x00,0x82,0x04,
+0x01,0x40,0x82,0x02,0x83,0xff,0x3f,0x05,0xb3,0x40,0x82,0x04,0x99,0x02,0xc0,0x04,
+0x01,0x40,0x81,0x04,0x06,0x00,0x00,0x05,0x20,0x00,0x01,0x05,0xac,0x80,0x82,0x04,
+0x01,0x40,0x82,0x02,0x01,0x80,0x80,0x04,0x20,0xc0,0x82,0x04,0x01,0x40,0x02,0x03,
+0x83,0xff,0x3f,0x05,0xb3,0x40,0x82,0x04,0x99,0x02,0xc0,0x04,0x01,0x80,0x81,0x04,
+0x06,0x00,0x00,0x05,0x20,0x00,0x01,0x05,0xac,0x80,0x82,0x04,0x01,0x40,0x02,0x03,
+0x01,0x80,0x80,0x04,0x20,0x00,0x83,0x04,0x99,0x00,0xc0,0x04,0x97,0x01,0x40,0x00,
+0x01,0x80,0x81,0x04,0xad,0x80,0x82,0x04,0x01,0x40,0x02,0x03,0x17,0x0f,0x40,0x00,
+0x01,0x40,0x80,0x04,0x05,0x00,0x00,0x05,0xa0,0x40,0x81,0x04,0x99,0x01,0xc0,0x04,
+0x01,0x80,0x80,0x04,0x05,0x00,0x00,0x05,0xa0,0x40,0x81,0x04,0x19,0x0b,0xc0,0x04,
+0x01,0x80,0x80,0x02,0x01,0x40,0x81,0x04,0x83,0xff,0x3f,0x05,0xb3,0x40,0x82,0x04,
+0x99,0x02,0xc0,0x04,0x01,0x40,0x81,0x04,0x06,0x00,0x00,0x05,0x20,0x00,0x01,0x05,
+0xac,0x80,0x82,0x04,0x01,0x40,0x82,0x02,0x01,0xc0,0x80,0x04,0x05,0x00,0x00,0x05,
+0xb2,0x00,0x80,0x04,0x19,0x02,0xc0,0x04,0x06,0x00,0x80,0x04,0x20,0x00,0x81,0x04,
+0x01,0x40,0x02,0x03,0x17,0x02,0x40,0x00,0x01,0x40,0x81,0x04,0x01,0xc0,0x00,0x05,
+0xac,0x80,0x82,0x04,0x01,0x40,0x02,0x03,0x01,0x40,0x01,0x04,0x19,0x08,0x40,0x02,
+0x17,0x05,0x40,0x00,0x01,0x00,0x81,0x04,0x01,0x00,0x02,0x05,0xa0,0x40,0x83,0x04,
+0x06,0x00,0x00,0x05,0x01,0x00,0x82,0x05,0x01,0x40,0x02,0x06,0x20,0x81,0x03,0x05,
+0x01,0x00,0x82,0x04,0xad,0x80,0x82,0x04,0x01,0x40,0x02,0x04,0x01,0x00,0x82,0x04,
+0x01,0x80,0x01,0x05,0xb3,0x40,0x82,0x04,0x18,0xf9,0xbf,0x04,0x97,0x06,0x40,0x00,
+0x17,0x04,0x40,0x00,0x01,0x40,0x80,0x04,0x06,0x00,0x00,0x05,0x01,0x00,0x82,0x05,
+0x01,0x40,0x02,0x06,0x20,0x81,0x03,0x05,0x01,0x00,0x82,0x04,0xad,0x80,0x82,0x04,
+0x01,0x40,0x02,0x04,0x01,0x00,0x82,0x04,0x01,0x80,0x01,0x05,0xb3,0x40,0x82,0x04,
+0x18,0xfa,0xbf,0x04,0x06,0x00,0x80,0x04,0x29,0x00,0x80,0x04,0x00,0x00,0x00,0x01,
+0x00,0x00,0x26,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,
+0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x30,0x20,
+0x66,0x6f,0x72,0x20,0x31,0x2e,0x2e,0x33,0x29,0x00,0x00,0x00,0x0f,0x00,0x02,0x3d,
+0x3d,0x00,0x00,0x01,0x21,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,
+0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x04,
+0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x08,0x6b,0x69,0x6e,0x64,
+0x5f,0x6f,0x66,0x3f,0x00,0x00,0x05,0x52,0x61,0x6e,0x67,0x65,0x00,0x00,0x05,0x62,
+0x65,0x67,0x69,0x6e,0x00,0x00,0x01,0x3c,0x00,0x00,0x01,0x2b,0x00,0x00,0x03,0x65,
+0x6e,0x64,0x00,0x00,0x0c,0x65,0x78,0x63,0x6c,0x75,0x64,0x65,0x5f,0x65,0x6e,0x64,
+0x3f,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,
+0x00,0x00,0xbb,0x00,0x06,0x00,0x0a,0x00,0x01,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,
+0x26,0x00,0x10,0x00,0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,0x03,0x00,0xc0,0x00,
+0x37,0x80,0x81,0x01,0x06,0x00,0x00,0x03,0x20,0x00,0x00,0x03,0x01,0x80,0x01,0x02,
+0x83,0xff,0xbf,0x03,0xb5,0x40,0x00,0x03,0x99,0x09,0x40,0x03,0x01,0x40,0x00,0x03,
+0x83,0xff,0xbf,0x03,0xb3,0x80,0x00,0x03,0x19,0x04,0x40,0x03,0x01,0x00,0x01,0x03,
+0x01,0x40,0x80,0x03,0x20,0x00,0x81,0x03,0x01,0x00,0x01,0x04,0xa0,0x40,0x81,0x03,
+0xae,0xc0,0x00,0x03,0xaf,0xc0,0x00,0x03,0x97,0x01,0x40,0x00,0x01,0x40,0x00,0x03,
+0x01,0x00,0x81,0x03,0xa0,0x40,0x01,0x03,0x01,0x80,0x81,0x02,0x01,0x00,0x01,0x03,
+0x40,0x01,0x80,0x03,0x21,0x80,0x01,0x03,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x07,0x00,0x06,0x6c,0x65,0x6e,0x67,0x74,0x68,0x00,0x00,0x01,0x3e,
+0x00,0x00,0x01,0x3c,0x00,0x00,0x01,0x2d,0x00,0x00,0x01,0x7e,0x00,0x00,0x01,0x25,
+0x00,0x00,0x05,0x74,0x69,0x6d,0x65,0x73,0x00,0x00,0x00,0x00,0x78,0x00,0x01,0x00,
+0x05,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x15,0xc0,0x80,0x00,0x06,0x00,0x00,0x01,
+0x15,0x40,0x81,0x01,0xa0,0x40,0x00,0x01,0xa0,0x00,0x80,0x00,0x15,0x40,0x81,0x00,
+0xad,0x80,0x80,0x00,0x16,0x40,0x81,0x00,0x15,0x40,0x81,0x00,0x15,0x00,0x01,0x01,
+0xaf,0x00,0x01,0x01,0xb5,0xc0,0x80,0x00,0x99,0x01,0xc0,0x00,0x83,0xff,0xbf,0x00,
+0x16,0x40,0x81,0x00,0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x00,0x29,0x00,0x80,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x02,0x3c,0x3c,0x00,0x00,0x02,0x5b,
+0x5d,0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x3e,0x00,0x00,0x01,0x2d,0x00,0x00,0x00,
+0x00,0x55,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x0a,0x26,0x00,0x10,0x00,
+0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,0x03,0x00,0xc0,0x00,0x06,0x00,0x80,0x01,
+0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x07,0x72,0x65,
+0x70,0x6c,0x61,0x63,0x65,0x00,0x00,0x06,0x72,0x6f,0x74,0x61,0x74,0x65,0x00,0x00,
+0x00,0x00,0xe2,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,
+0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,
+0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x04,0x01,0x00,0x02,0xa0,0x40,0x80,0x01,
+0x29,0x00,0x80,0x01,0x83,0xff,0x3f,0x01,0x97,0x06,0x40,0x00,0x01,0x40,0x80,0x01,
+0x06,0x00,0x00,0x02,0x01,0x80,0x80,0x02,0xa0,0x00,0x01,0x02,0xa0,0xc0,0x80,0x01,
+0x19,0x02,0xc0,0x01,0x06,0x00,0x80,0x01,0x01,0x80,0x00,0x02,0xa0,0x40,0x81,0x01,
+0x97,0x01,0x40,0x00,0x01,0x80,0x80,0x01,0xad,0x80,0x81,0x01,0x01,0xc0,0x00,0x01,
+0x01,0x80,0x80,0x01,0x06,0x00,0x00,0x02,0x20,0x00,0x02,0x02,0xb3,0xc0,0x81,0x01,
+0x18,0xf7,0xbf,0x01,0x06,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x09,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,
+0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x09,0x64,
+0x65,0x6c,0x65,0x74,0x65,0x5f,0x69,0x66,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,
+0x00,0x02,0x5b,0x5d,0x00,0x00,0x09,0x64,0x65,0x6c,0x65,0x74,0x65,0x5f,0x61,0x74,
+0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x3c,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,
+0x00,0x00,0x01,0x0d,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x29,0x00,0x00,
+0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x20,0x00,0x00,0x02,0x99,0x00,0x40,0x02,
+0x17,0x02,0x40,0x00,0x06,0x00,0x00,0x02,0x04,0x01,0x80,0x02,0xa0,0x40,0x00,0x02,
+0x29,0x00,0x00,0x02,0x06,0x00,0x00,0x02,0x20,0xc0,0x00,0x02,0x01,0x00,0x01,0x01,
+0x83,0xff,0xbf,0x01,0x97,0x06,0x40,0x00,0x01,0x40,0x00,0x02,0x06,0x00,0x80,0x02,
+0x01,0xc0,0x00,0x03,0xa0,0x40,0x81,0x02,0xa0,0x00,0x01,0x02,0x19,0x02,0x40,0x02,
+0x06,0x00,0x00,0x02,0x01,0xc0,0x80,0x02,0xa0,0x80,0x01,0x02,0x97,0x01,0x40,0x00,
+0x01,0xc0,0x00,0x02,0xad,0xc0,0x01,0x02,0x01,0x00,0x81,0x01,0x01,0xc0,0x00,0x02,
+0x06,0x00,0x80,0x02,0x20,0xc0,0x80,0x02,0xb3,0x00,0x02,0x02,0x18,0xf7,0x3f,0x02,
+0x06,0x00,0x00,0x02,0x20,0xc0,0x00,0x02,0x01,0x80,0x80,0x02,0xb2,0x40,0x02,0x02,
+0x19,0x01,0x40,0x02,0x05,0x00,0x00,0x02,0x97,0x00,0x40,0x00,0x06,0x00,0x00,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x0c,0x62,0x6c,
+0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,
+0x65,0x6e,0x75,0x6d,0x00,0x00,0x07,0x72,0x65,0x6a,0x65,0x63,0x74,0x21,0x00,0x00,
+0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x02,0x5b,
+0x5d,0x00,0x00,0x09,0x64,0x65,0x6c,0x65,0x74,0x65,0x5f,0x61,0x74,0x00,0x00,0x01,
+0x2b,0x00,0x00,0x01,0x3c,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x00,0x00,0x7b,0x00,
+0x04,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x26,0x00,0x08,0x02,
+0x01,0x40,0x00,0x02,0x83,0xff,0xbf,0x02,0xb3,0x00,0x00,0x02,0x19,0x03,0x40,0x02,
+0x01,0x40,0x00,0x02,0x06,0x00,0x80,0x02,0x20,0x40,0x80,0x02,0xad,0x80,0x80,0x02,
+0xac,0x80,0x00,0x02,0x01,0x00,0x81,0x00,0x01,0x80,0x00,0x02,0x06,0x00,0x80,0x02,
+0x01,0x40,0x00,0x03,0x83,0xff,0xbf,0x03,0x01,0x00,0x01,0x04,0xa0,0xc1,0x80,0x02,
+0x06,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+0x00,0x01,0x3c,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01,0x2b,0x00,0x00,
+0x03,0x5b,0x5d,0x3d,0x00,0x00,0x00,0x01,0xde,0x00,0x09,0x00,0x0d,0x00,0x00,0x00,
+0x00,0x00,0x57,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x04,0x20,0x00,0x80,0x04,
+0x99,0x00,0xc0,0x04,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x04,0x04,0x01,0x00,0x05,
+0xa0,0x40,0x80,0x04,0x29,0x00,0x80,0x04,0x83,0xff,0x3f,0x01,0x06,0x00,0x80,0x04,
+0x20,0xc0,0x80,0x04,0x01,0x40,0x82,0x01,0x08,0x00,0x00,0x02,0x97,0x1a,0x40,0x00,
+0x01,0x80,0x80,0x04,0x01,0xc0,0x00,0x05,0x01,0x80,0x80,0x05,0xae,0x40,0x01,0x05,
+0x83,0x00,0xc0,0x05,0xb1,0x80,0x01,0x05,0x20,0xc0,0x01,0x05,0xac,0x00,0x81,0x04,
+0x01,0x40,0x82,0x02,0x06,0x00,0x80,0x04,0x01,0x40,0x01,0x05,0xa0,0x00,0x82,0x04,
+0x01,0x40,0x02,0x03,0x01,0x40,0x80,0x04,0x01,0x80,0x01,0x05,0xa0,0x40,0x82,0x04,
+0x01,0x40,0x82,0x03,0x91,0x05,0x00,0x05,0xa0,0x80,0x82,0x04,0x99,0x05,0xc0,0x04,
+0x01,0xc0,0x81,0x04,0x83,0xff,0x3f,0x05,0xb2,0x00,0x83,0x04,0x19,0x01,0xc0,0x04,
+0x01,0x80,0x81,0x04,0x29,0x80,0x80,0x04,0x01,0xc0,0x81,0x04,0x83,0xff,0x3f,0x05,
+0xb3,0x40,0x83,0x04,0x01,0x40,0x02,0x04,0x17,0x08,0x40,0x00,0x01,0xc0,0x81,0x04,
+0x07,0x00,0x00,0x05,0xb2,0x00,0x83,0x04,0x99,0x01,0xc0,0x04,0x07,0x00,0x00,0x02,
+0x07,0x00,0x00,0x04,0x97,0x04,0x40,0x00,0x01,0xc0,0x81,0x04,0x08,0x00,0x00,0x05,
+0xb2,0x00,0x83,0x04,0x98,0x01,0xc0,0x04,0x01,0xc0,0x81,0x04,0x05,0x00,0x00,0x05,
+0xb2,0x00,0x83,0x04,0x99,0x00,0xc0,0x04,0x08,0x00,0x00,0x04,0x19,0x01,0x40,0x04,
+0x01,0x40,0x81,0x01,0x97,0x01,0x40,0x00,0x01,0x40,0x81,0x04,0xad,0x00,0x81,0x04,
+0x01,0x40,0x02,0x01,0x01,0x80,0x80,0x04,0x01,0xc0,0x00,0x05,0xb3,0x40,0x83,0x04,
+0x98,0xe3,0xbf,0x04,0x01,0x80,0x80,0x04,0x06,0x00,0x00,0x05,0x20,0xc0,0x00,0x05,
+0xb2,0x00,0x83,0x04,0x19,0x01,0xc0,0x04,0x05,0x00,0x80,0x04,0x29,0x00,0x80,0x04,
+0x99,0x00,0x40,0x02,0x17,0x01,0x40,0x00,0x05,0x00,0x80,0x04,0x29,0x00,0x80,0x04,
+0x06,0x00,0x80,0x04,0x01,0x80,0x00,0x05,0xa0,0x00,0x82,0x04,0x29,0x00,0x80,0x04,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,
+0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,
+0x00,0x00,0x07,0x62,0x73,0x65,0x61,0x72,0x63,0x68,0x00,0x00,0x04,0x73,0x69,0x7a,
+0x65,0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x2d,0x00,0x00,0x01,0x2f,0x00,0x00,0x08,
+0x74,0x72,0x75,0x6e,0x63,0x61,0x74,0x65,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x04,
+0x63,0x61,0x6c,0x6c,0x00,0x00,0x05,0x69,0x73,0x5f,0x61,0x3f,0x00,0x00,0x07,0x49,
+0x6e,0x74,0x65,0x67,0x65,0x72,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x01,0x3c,0x00,
+0x00,0x00,0x00,0xe2,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,
+0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,
+0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x04,0x01,0x00,0x02,0xa0,0x40,0x80,0x01,
+0x29,0x00,0x80,0x01,0x83,0xff,0x3f,0x01,0x97,0x06,0x40,0x00,0x01,0x40,0x80,0x01,
+0x06,0x00,0x00,0x02,0x01,0x80,0x80,0x02,0xa0,0x00,0x01,0x02,0xa0,0xc0,0x80,0x01,
+0x19,0x02,0xc0,0x01,0x06,0x00,0x80,0x01,0x01,0x80,0x00,0x02,0xa0,0x40,0x81,0x01,
+0x97,0x01,0x40,0x00,0x01,0x80,0x80,0x01,0xad,0x80,0x81,0x01,0x01,0xc0,0x00,0x01,
+0x01,0x80,0x80,0x01,0x06,0x00,0x00,0x02,0x20,0x00,0x02,0x02,0xb3,0xc0,0x81,0x01,
+0x18,0xf7,0xbf,0x01,0x06,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x09,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,
+0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x09,0x64,
+0x65,0x6c,0x65,0x74,0x65,0x5f,0x69,0x66,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,
+0x00,0x02,0x5b,0x5d,0x00,0x00,0x09,0x64,0x65,0x6c,0x65,0x74,0x65,0x5f,0x61,0x74,
+0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x3c,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,
+0x00,0x00,0x00,0xec,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x00,
+0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x20,0x00,0x00,0x02,0x99,0x00,0x40,0x02,
+0x17,0x02,0x40,0x00,0x06,0x00,0x00,0x02,0x04,0x01,0x80,0x02,0xa0,0x40,0x00,0x02,
+0x29,0x00,0x00,0x02,0x83,0xff,0x3f,0x01,0x06,0x00,0x00,0x02,0x20,0xc0,0x00,0x02,
+0x01,0x00,0x81,0x01,0x97,0x06,0x40,0x00,0x01,0x40,0x00,0x02,0x06,0x00,0x80,0x02,
+0x01,0x80,0x00,0x03,0xa0,0x40,0x81,0x02,0xa0,0x00,0x01,0x02,0x19,0x02,0x40,0x02,
+0x01,0x80,0x00,0x02,0xad,0x80,0x01,0x02,0x01,0x00,0x01,0x01,0x97,0x01,0x40,0x00,
+0x06,0x00,0x00,0x02,0x01,0x80,0x80,0x02,0xa0,0xc0,0x01,0x02,0x01,0x80,0x00,0x02,
+0x06,0x00,0x80,0x02,0x20,0xc0,0x80,0x02,0xb3,0x00,0x02,0x02,0x18,0xf7,0x3f,0x02,
+0x06,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,
+0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,
+0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x07,0x6b,0x65,0x65,0x70,0x5f,
+0x69,0x66,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,
+0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x01,0x2b,0x00,0x00,0x09,0x64,0x65,0x6c,0x65,
+0x74,0x65,0x5f,0x61,0x74,0x00,0x00,0x01,0x3c,0x00,0x00,0x00,0x00,0xbe,0x00,0x03,
+0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x19,0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,
+0x20,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,
+0x04,0x01,0x00,0x02,0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x37,0xc0,0x00,0x01,
+0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0x21,0xc0,0x80,0x01,0x06,0x00,0x80,0x01,
+0x20,0x00,0x81,0x01,0x01,0x80,0x00,0x02,0x20,0x00,0x01,0x02,0xb2,0x40,0x81,0x01,
+0x19,0x01,0xc0,0x01,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x06,0x00,0x80,0x01,
+0x01,0x80,0x00,0x02,0xa0,0x80,0x81,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x07,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,
+0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x07,0x73,
+0x65,0x6c,0x65,0x63,0x74,0x21,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x04,
+0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x07,0x72,0x65,0x70,0x6c,
+0x61,0x63,0x65,0x00,0x00,0x00,0x00,0x52,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,
+0x00,0x0b,0x00,0x00,0x26,0x00,0x00,0x02,0x15,0x40,0x80,0x01,0x01,0x40,0x00,0x02,
+0xa0,0x00,0x80,0x01,0x19,0x02,0xc0,0x01,0x15,0x80,0x80,0x01,0x01,0x40,0x00,0x02,
+0xa0,0x40,0x80,0x01,0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x02,0x3c,0x3c,0x00,0x4c,0x56,0x41,0x52,0x00,0x00,0x02,0x32,0x00,0x00,0x00,0x1f,
+0x00,0x05,0x62,0x6c,0x6f,0x63,0x6b,0x00,0x03,0x61,0x72,0x79,0x00,0x06,0x72,0x65,
+0x73,0x75,0x6c,0x74,0x00,0x04,0x68,0x61,0x73,0x68,0x00,0x03,0x76,0x61,0x6c,0x00,
+0x03,0x6b,0x65,0x79,0x00,0x05,0x76,0x61,0x6c,0x75,0x65,0x00,0x04,0x65,0x6c,0x65,
+0x6d,0x00,0x05,0x61,0x72,0x72,0x61,0x79,0x00,0x01,0x78,0x00,0x01,0x76,0x00,0x05,
+0x64,0x65,0x70,0x74,0x68,0x00,0x02,0x61,0x72,0x00,0x01,0x65,0x00,0x08,0x6d,0x6f,
+0x64,0x69,0x66,0x69,0x65,0x64,0x00,0x01,0x69,0x00,0x01,0x6e,0x00,0x06,0x69,0x66,
+0x6e,0x6f,0x6e,0x65,0x00,0x03,0x69,0x64,0x78,0x00,0x04,0x61,0x72,0x67,0x30,0x00,
+0x04,0x61,0x72,0x67,0x31,0x00,0x04,0x61,0x72,0x67,0x32,0x00,0x03,0x62,0x65,0x67,
+0x00,0x03,0x6c,0x65,0x6e,0x00,0x05,0x63,0x6f,0x75,0x6e,0x74,0x00,0x04,0x61,0x72,
+0x67,0x73,0x00,0x03,0x6c,0x6f,0x77,0x00,0x04,0x68,0x69,0x67,0x68,0x00,0x09,0x73,
+0x61,0x74,0x69,0x73,0x66,0x69,0x65,0x64,0x00,0x03,0x6d,0x69,0x64,0x00,0x07,0x73,
+0x6d,0x61,0x6c,0x6c,0x65,0x72,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x02,
+0x00,0x03,0x00,0x03,0x00,0x04,0x00,0x04,0x00,0x05,0x00,0x05,0x00,0x06,0x00,0x06,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x07,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x03,0x00,0x03,0x00,0x08,0x00,0x04,0x00,0x09,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x09,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x07,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x07,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x03,0x00,0x03,0x00,0x08,0x00,0x04,0x00,0x0a,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x0a,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0b,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x0c,0x00,0x03,0x00,0x0d,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0b,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0e,0x00,0x03,0x00,0x0c,0x00,0x04,0x00,0x0d,
+0x00,0x01,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x02,0x00,0x02,0xff,0xff,
+0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x0d,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,
+0x00,0x01,0x00,0x0f,0x00,0x02,0x00,0x10,0x00,0x01,0x00,0x11,0x00,0x02,0x00,0x00,
+0x00,0x03,0x00,0x12,0x00,0x04,0x00,0x13,0x00,0x01,0x00,0x14,0x00,0x02,0x00,0x15,
+0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x16,0x00,0x05,0x00,0x17,0x00,0x06,0x00,0x01,
+0x00,0x07,0x00,0x0f,0x00,0x08,0x00,0x18,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x01,
+0x00,0x03,0x00,0x17,0x00,0x04,0x00,0x12,0x00,0x05,0x00,0x18,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x17,
+0x00,0x02,0x00,0x12,0x00,0x03,0x00,0x12,0x00,0x01,0x00,0x19,0x00,0x02,0xff,0xff,
+0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x1a,0x00,0x02,0x00,0x1b,0x00,0x03,0x00,0x1c,
+0x00,0x04,0x00,0x1d,0x00,0x05,0x00,0x04,0x00,0x06,0x00,0x0a,0x00,0x07,0x00,0x1e,
+0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x12,
+0x00,0x02,0x00,0x17,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x09,
+0x00,0x01,0xff,0xff,0x00,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08,
+};
+void mrb_mruby_array_ext_gem_init(mrb_state *mrb);
+void mrb_mruby_array_ext_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_array_ext_gem_init(mrb_state *mrb) {
+  int ai = mrb_gc_arena_save(mrb);
+  mrb_mruby_array_ext_gem_init(mrb);
+  mrb_load_irep(mrb, gem_mrblib_irep_mruby_array_ext);
+  if (mrb->exc) {
+    mrb_print_error(mrb);
+    exit(EXIT_FAILURE);
+  }
+  mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_array_ext_gem_final(mrb_state *mrb) {
+  mrb_mruby_array_ext_gem_final(mrb);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-enum-ext/gem_init.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,648 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ *   This file was generated!
+ *   All manual changes will get lost.
+ */
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+gem_mrblib_irep_mruby_enum_ext[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0x3b,0x5e,0x00,0x00,0x26,0x32,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x23,0x2e,0x30,0x30,
+0x30,0x30,0x00,0x00,0x00,0x37,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x04,
+0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0x45,0x00,0x80,0x00,0x4a,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0a,0x45,0x6e,0x75,0x6d,0x65,0x72,
+0x61,0x62,0x6c,0x65,0x00,0x00,0x00,0x02,0x87,0x00,0x01,0x00,0x04,0x00,0x18,0x00,
+0x00,0x00,0x53,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x04,0x00,0x01,0x46,0x80,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,
+0x46,0xc0,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x08,0x00,0x01,0x46,0x00,0x81,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x0a,0x00,0x01,0x46,0x40,0x81,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x0c,0x00,0x01,0x46,0x80,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x0e,0x00,0x01,
+0x46,0xc0,0x81,0x00,0x11,0x04,0x80,0x00,0x20,0x40,0x82,0x00,0x12,0x05,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x10,0x00,0x01,0x46,0xc0,0x82,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x12,0x00,0x01,0x46,0x00,0x83,0x00,0x48,0x00,0x80,0x00,0xc0,0x14,0x00,0x01,
+0x46,0x40,0x83,0x00,0x48,0x00,0x80,0x00,0x04,0x07,0x00,0x01,0x84,0x06,0x80,0x01,
+0x05,0x00,0x00,0x02,0x20,0xc1,0x83,0x00,0x48,0x00,0x80,0x00,0xc0,0x16,0x00,0x01,
+0x46,0x00,0x84,0x00,0x48,0x00,0x80,0x00,0xc0,0x18,0x00,0x01,0x46,0x40,0x84,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x1a,0x00,0x01,0x46,0x80,0x84,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x1c,0x00,0x01,0x46,0xc0,0x84,0x00,0x48,0x00,0x80,0x00,0xc0,0x1e,0x00,0x01,
+0x46,0x00,0x85,0x00,0x48,0x00,0x80,0x00,0xc0,0x20,0x00,0x01,0x46,0x40,0x85,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x22,0x00,0x01,0x46,0x80,0x85,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x24,0x00,0x01,0x46,0xc0,0x85,0x00,0x48,0x00,0x80,0x00,0xc0,0x26,0x00,0x01,
+0x46,0x00,0x86,0x00,0x48,0x00,0x80,0x00,0xc0,0x28,0x00,0x01,0x46,0x40,0x86,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x2a,0x00,0x01,0x46,0x80,0x86,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x2c,0x00,0x01,0x46,0xc0,0x86,0x00,0x05,0x00,0x80,0x00,0x47,0x40,0x80,0x00,
+0xc0,0x2e,0x00,0x01,0x46,0xc0,0x86,0x00,0x84,0x0d,0x80,0x00,0x29,0x00,0x80,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x04,0x64,0x72,0x6f,0x70,0x00,0x00,
+0x0a,0x64,0x72,0x6f,0x70,0x5f,0x77,0x68,0x69,0x6c,0x65,0x00,0x00,0x04,0x74,0x61,
+0x6b,0x65,0x00,0x00,0x0a,0x74,0x61,0x6b,0x65,0x5f,0x77,0x68,0x69,0x6c,0x65,0x00,
+0x00,0x09,0x65,0x61,0x63,0x68,0x5f,0x63,0x6f,0x6e,0x73,0x00,0x00,0x0a,0x65,0x61,
+0x63,0x68,0x5f,0x73,0x6c,0x69,0x63,0x65,0x00,0x00,0x08,0x67,0x72,0x6f,0x75,0x70,
+0x5f,0x62,0x79,0x00,0x00,0x07,0x73,0x6f,0x72,0x74,0x5f,0x62,0x79,0x00,0x00,0x06,
+0x4f,0x62,0x6a,0x65,0x63,0x74,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x04,0x4e,
+0x4f,0x4e,0x45,0x00,0x00,0x05,0x66,0x69,0x72,0x73,0x74,0x00,0x00,0x05,0x63,0x6f,
+0x75,0x6e,0x74,0x00,0x00,0x08,0x66,0x6c,0x61,0x74,0x5f,0x6d,0x61,0x70,0x00,0x00,
+0x0e,0x63,0x6f,0x6c,0x6c,0x65,0x63,0x74,0x5f,0x63,0x6f,0x6e,0x63,0x61,0x74,0x00,
+0x00,0x0c,0x61,0x6c,0x69,0x61,0x73,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,
+0x06,0x6d,0x61,0x78,0x5f,0x62,0x79,0x00,0x00,0x06,0x6d,0x69,0x6e,0x5f,0x62,0x79,
+0x00,0x00,0x06,0x6d,0x69,0x6e,0x6d,0x61,0x78,0x00,0x00,0x09,0x6d,0x69,0x6e,0x6d,
+0x61,0x78,0x5f,0x62,0x79,0x00,0x00,0x05,0x6e,0x6f,0x6e,0x65,0x3f,0x00,0x00,0x04,
+0x6f,0x6e,0x65,0x3f,0x00,0x00,0x10,0x65,0x61,0x63,0x68,0x5f,0x77,0x69,0x74,0x68,
+0x5f,0x6f,0x62,0x6a,0x65,0x63,0x74,0x00,0x00,0x0c,0x72,0x65,0x76,0x65,0x72,0x73,
+0x65,0x5f,0x65,0x61,0x63,0x68,0x00,0x00,0x05,0x63,0x79,0x63,0x6c,0x65,0x00,0x00,
+0x0a,0x66,0x69,0x6e,0x64,0x5f,0x69,0x6e,0x64,0x65,0x78,0x00,0x00,0x03,0x7a,0x69,
+0x70,0x00,0x00,0x04,0x74,0x6f,0x5f,0x68,0x00,0x00,0x00,0x01,0x31,0x00,0x04,0x00,
+0x09,0x00,0x01,0x00,0x00,0x00,0x1f,0x00,0x26,0x00,0x00,0x02,0x01,0x40,0x00,0x02,
+0x84,0x00,0x80,0x02,0xa0,0x00,0x00,0x02,0x99,0x00,0x40,0x02,0x97,0x04,0x40,0x00,
+0x06,0x00,0x00,0x02,0x91,0x01,0x80,0x02,0x3d,0x00,0x00,0x03,0x01,0x40,0x80,0x03,
+0x20,0x00,0x81,0x03,0x3e,0xc0,0x01,0x03,0xbd,0x00,0x80,0x03,0x3e,0xc0,0x01,0x03,
+0x20,0x81,0x00,0x02,0x01,0x40,0x00,0x02,0x83,0xff,0xbf,0x02,0xb3,0x40,0x01,0x02,
+0x19,0x02,0x40,0x02,0x06,0x00,0x00,0x02,0x11,0x03,0x80,0x02,0x3d,0x01,0x00,0x03,
+0x20,0x81,0x00,0x02,0x01,0x40,0x00,0x02,0x20,0x40,0x00,0x02,0x01,0x00,0x81,0x00,
+0x37,0x00,0x81,0x01,0x06,0x00,0x00,0x02,0x40,0x01,0x80,0x02,0x21,0xc0,0x01,0x02,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x1a,0x6e,0x6f,0x20,0x69,0x6d,
+0x70,0x6c,0x69,0x63,0x69,0x74,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x73,0x69,0x6f,
+0x6e,0x20,0x6f,0x66,0x20,0x00,0x00,0x0d,0x20,0x69,0x6e,0x74,0x6f,0x20,0x49,0x6e,
+0x74,0x65,0x67,0x65,0x72,0x00,0x00,0x1d,0x61,0x74,0x74,0x65,0x6d,0x70,0x74,0x20,
+0x74,0x6f,0x20,0x64,0x72,0x6f,0x70,0x20,0x6e,0x65,0x67,0x61,0x74,0x69,0x76,0x65,
+0x20,0x73,0x69,0x7a,0x65,0x00,0x00,0x00,0x08,0x00,0x0b,0x72,0x65,0x73,0x70,0x6f,
+0x6e,0x64,0x5f,0x74,0x6f,0x3f,0x00,0x00,0x06,0x74,0x6f,0x5f,0x69,0x6e,0x74,0x00,
+0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,0x70,0x65,0x45,0x72,
+0x72,0x6f,0x72,0x00,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x01,0x3c,0x00,
+0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,
+0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x6b,0x00,0x03,0x00,0x06,0x00,
+0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0x40,0x80,0x01,
+0x83,0xff,0x3f,0x02,0xb2,0x00,0x80,0x01,0x99,0x02,0xc0,0x01,0x15,0xc0,0x80,0x01,
+0x01,0x40,0x00,0x02,0x20,0x80,0x00,0x02,0xa0,0x40,0x80,0x01,0x97,0x01,0x40,0x00,
+0x15,0x40,0x80,0x01,0xaf,0xc0,0x80,0x01,0x16,0x40,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x3d,0x3d,0x00,0x00,0x02,0x3c,
+0x3c,0x00,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x01,0x2d,
+0x00,0x00,0x00,0x00,0x8b,0x00,0x04,0x00,0x07,0x00,0x01,0x00,0x00,0x00,0x11,0x00,
+0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x02,0x20,0x00,0x00,0x02,0x99,0x00,0x40,0x02,
+0x17,0x02,0x40,0x00,0x06,0x00,0x00,0x02,0x04,0x01,0x80,0x02,0xa0,0x40,0x00,0x02,
+0x29,0x00,0x00,0x02,0x37,0x00,0x01,0x02,0x08,0x00,0x80,0x02,0x01,0x00,0x01,0x01,
+0x01,0x40,0x81,0x01,0x06,0x00,0x00,0x02,0x40,0x01,0x80,0x02,0x21,0xc0,0x00,0x02,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0c,0x62,0x6c,
+0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,
+0x65,0x6e,0x75,0x6d,0x00,0x00,0x0a,0x64,0x72,0x6f,0x70,0x5f,0x77,0x68,0x69,0x6c,
+0x65,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x8d,0x00,0x03,0x00,
+0x06,0x00,0x00,0x00,0x00,0x00,0x16,0x00,0x26,0x00,0x08,0x00,0x15,0xc0,0x80,0x01,
+0x20,0x00,0x80,0x01,0x19,0x03,0xc0,0x01,0x15,0x40,0x80,0x01,0x37,0x00,0x01,0x02,
+0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x7f,0x80,0x01,0x20,0x00,0x80,0x01,
+0x19,0x01,0xc0,0x01,0x07,0x00,0x80,0x01,0x16,0xc0,0x80,0x01,0x15,0xc0,0x80,0x01,
+0x99,0x02,0xc0,0x01,0x15,0x80,0x80,0x01,0x01,0x40,0x00,0x02,0x20,0xc0,0x00,0x02,
+0xa0,0x80,0x80,0x01,0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x01,0x21,0x00,0x00,0x04,0x63,0x61,
+0x6c,0x6c,0x00,0x00,0x02,0x3c,0x3c,0x00,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,
+0x75,0x65,0x00,0x00,0x00,0x01,0x31,0x00,0x04,0x00,0x09,0x00,0x01,0x00,0x00,0x00,
+0x1f,0x00,0x00,0x00,0x26,0x00,0x00,0x02,0x01,0x40,0x00,0x02,0x84,0x00,0x80,0x02,
+0xa0,0x00,0x00,0x02,0x99,0x00,0x40,0x02,0x97,0x04,0x40,0x00,0x06,0x00,0x00,0x02,
+0x91,0x01,0x80,0x02,0x3d,0x00,0x00,0x03,0x01,0x40,0x80,0x03,0x20,0x00,0x81,0x03,
+0x3e,0xc0,0x01,0x03,0xbd,0x00,0x80,0x03,0x3e,0xc0,0x01,0x03,0x20,0x81,0x00,0x02,
+0x01,0x40,0x00,0x02,0x83,0xff,0xbf,0x02,0xb3,0x40,0x01,0x02,0x19,0x02,0x40,0x02,
+0x06,0x00,0x00,0x02,0x11,0x03,0x80,0x02,0x3d,0x01,0x00,0x03,0x20,0x81,0x00,0x02,
+0x01,0x40,0x00,0x02,0x20,0x40,0x00,0x02,0x01,0x00,0x81,0x00,0x37,0x00,0x81,0x01,
+0x06,0x00,0x00,0x02,0x40,0x01,0x80,0x02,0x21,0xc0,0x01,0x02,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x03,0x00,0x00,0x1a,0x6e,0x6f,0x20,0x69,0x6d,0x70,0x6c,0x69,0x63,
+0x69,0x74,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x6f,0x66,
+0x20,0x00,0x00,0x0d,0x20,0x69,0x6e,0x74,0x6f,0x20,0x49,0x6e,0x74,0x65,0x67,0x65,
+0x72,0x00,0x00,0x1d,0x61,0x74,0x74,0x65,0x6d,0x70,0x74,0x20,0x74,0x6f,0x20,0x74,
+0x61,0x6b,0x65,0x20,0x6e,0x65,0x67,0x61,0x74,0x69,0x76,0x65,0x20,0x73,0x69,0x7a,
+0x65,0x00,0x00,0x00,0x08,0x00,0x0b,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x5f,0x74,
+0x6f,0x3f,0x00,0x00,0x06,0x74,0x6f,0x5f,0x69,0x6e,0x74,0x00,0x00,0x05,0x72,0x61,
+0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,0x70,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,
+0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x01,0x3c,0x00,0x00,0x0d,0x41,0x72,
+0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x04,0x65,0x61,
+0x63,0x68,0x00,0x00,0x00,0x00,0x66,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,
+0x0c,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0xc0,0x80,0x01,0x20,0x00,0x80,0x01,
+0x15,0x40,0x00,0x02,0xb6,0x40,0x80,0x01,0x99,0x00,0xc0,0x01,0x29,0x40,0x80,0x01,
+0x15,0xc0,0x80,0x01,0x01,0x40,0x00,0x02,0x20,0xc0,0x00,0x02,0xa0,0x80,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x73,0x69,
+0x7a,0x65,0x00,0x00,0x02,0x3e,0x3d,0x00,0x00,0x02,0x3c,0x3c,0x00,0x00,0x08,0x5f,
+0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x00,0x7f,0x00,0x03,0x00,0x06,
+0x00,0x01,0x00,0x00,0x00,0x0e,0x00,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,
+0x20,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,
+0x04,0x01,0x00,0x02,0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x37,0xc0,0x00,0x01,
+0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0x21,0xc0,0x80,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,
+0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,
+0x00,0x00,0x0a,0x74,0x61,0x6b,0x65,0x5f,0x77,0x68,0x69,0x6c,0x65,0x00,0x00,0x04,
+0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x6d,0x00,0x03,0x00,0x06,0x00,0x00,0x00,
+0x00,0x00,0x0f,0x00,0x26,0x00,0x08,0x00,0x15,0x40,0x80,0x01,0x37,0x00,0x01,0x02,
+0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,0x99,0x00,0xc0,0x01,
+0x17,0x01,0x40,0x00,0x15,0x80,0x80,0x01,0x29,0x80,0x80,0x01,0x15,0x80,0x80,0x01,
+0x01,0x40,0x00,0x02,0x20,0x80,0x00,0x02,0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x02,0x3c,0x3c,0x00,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,
+0x00,0x01,0x21,0x00,0x04,0x00,0x09,0x00,0x01,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,
+0xa6,0x00,0x00,0x02,0x01,0x40,0x00,0x02,0x84,0x00,0x80,0x02,0xa0,0x00,0x00,0x02,
+0x99,0x00,0x40,0x02,0x97,0x04,0x40,0x00,0x06,0x00,0x00,0x02,0x91,0x01,0x80,0x02,
+0x3d,0x00,0x00,0x03,0x01,0x40,0x80,0x03,0x20,0x00,0x81,0x03,0x3e,0xc0,0x01,0x03,
+0xbd,0x00,0x80,0x03,0x3e,0xc0,0x01,0x03,0x20,0x81,0x00,0x02,0x01,0x40,0x00,0x02,
+0x83,0xff,0xbf,0x02,0xb4,0x40,0x01,0x02,0x19,0x02,0x40,0x02,0x06,0x00,0x00,0x02,
+0x11,0x03,0x80,0x02,0x3d,0x01,0x00,0x03,0x20,0x81,0x00,0x02,0x37,0x00,0x81,0x01,
+0x01,0x40,0x00,0x02,0x20,0x40,0x00,0x02,0x01,0x00,0x81,0x00,0x06,0x00,0x00,0x02,
+0x40,0x01,0x80,0x02,0x21,0xc0,0x01,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x03,
+0x00,0x00,0x1a,0x6e,0x6f,0x20,0x69,0x6d,0x70,0x6c,0x69,0x63,0x69,0x74,0x20,0x63,
+0x6f,0x6e,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x6f,0x66,0x20,0x00,0x00,0x0d,
+0x20,0x69,0x6e,0x74,0x6f,0x20,0x49,0x6e,0x74,0x65,0x67,0x65,0x72,0x00,0x00,0x0c,
+0x69,0x6e,0x76,0x61,0x6c,0x69,0x64,0x20,0x73,0x69,0x7a,0x65,0x00,0x00,0x00,0x08,
+0x00,0x0b,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x5f,0x74,0x6f,0x3f,0x00,0x00,0x06,
+0x74,0x6f,0x5f,0x69,0x6e,0x74,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,
+0x09,0x54,0x79,0x70,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x05,0x63,0x6c,0x61,
+0x73,0x73,0x00,0x00,0x02,0x3c,0x3d,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,
+0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,
+0x00,0x00,0xab,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,
+0x26,0x00,0x08,0x00,0x15,0xc0,0x80,0x01,0x20,0x00,0x80,0x01,0x15,0x40,0x00,0x02,
+0xb2,0x40,0x80,0x01,0x19,0x01,0xc0,0x01,0x15,0xc0,0x80,0x01,0x20,0x80,0x80,0x01,
+0x15,0xc0,0x80,0x01,0x01,0x40,0x00,0x02,0x20,0x00,0x01,0x02,0xa0,0xc0,0x80,0x01,
+0x15,0xc0,0x80,0x01,0x20,0x00,0x80,0x01,0x15,0x40,0x00,0x02,0xb2,0x40,0x80,0x01,
+0x99,0x02,0xc0,0x01,0x15,0x80,0x80,0x01,0x15,0xc0,0x00,0x02,0x20,0x80,0x01,0x02,
+0xa0,0x40,0x81,0x01,0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,
+0x02,0x3d,0x3d,0x00,0x00,0x05,0x73,0x68,0x69,0x66,0x74,0x00,0x00,0x02,0x3c,0x3c,
+0x00,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x04,0x63,0x61,
+0x6c,0x6c,0x00,0x00,0x03,0x64,0x75,0x70,0x00,0x00,0x00,0x01,0x57,0x00,0x04,0x00,
+0x09,0x00,0x01,0x00,0x00,0x00,0x27,0x00,0xa6,0x00,0x00,0x02,0x01,0x40,0x00,0x02,
+0x84,0x00,0x80,0x02,0xa0,0x00,0x00,0x02,0x99,0x00,0x40,0x02,0x97,0x04,0x40,0x00,
+0x06,0x00,0x00,0x02,0x91,0x01,0x80,0x02,0x3d,0x00,0x00,0x03,0x01,0x40,0x80,0x03,
+0x20,0x00,0x81,0x03,0x3e,0xc0,0x01,0x03,0xbd,0x00,0x80,0x03,0x3e,0xc0,0x01,0x03,
+0x20,0x81,0x00,0x02,0x01,0x40,0x00,0x02,0x83,0xff,0xbf,0x02,0xb4,0x40,0x01,0x02,
+0x19,0x02,0x40,0x02,0x06,0x00,0x00,0x02,0x11,0x03,0x80,0x02,0x3d,0x01,0x00,0x03,
+0x20,0x81,0x00,0x02,0x37,0x00,0x81,0x01,0x01,0x40,0x00,0x02,0x20,0x40,0x00,0x02,
+0x01,0x00,0x81,0x00,0x06,0x00,0x00,0x02,0x40,0x01,0x80,0x02,0x21,0xc0,0x01,0x02,
+0x01,0xc0,0x00,0x02,0x20,0x00,0x02,0x02,0x19,0x01,0x40,0x02,0x05,0x00,0x00,0x02,
+0x97,0x01,0x40,0x00,0x01,0x80,0x00,0x02,0x01,0xc0,0x80,0x02,0xa0,0x40,0x02,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x1a,0x6e,0x6f,0x20,0x69,0x6d,
+0x70,0x6c,0x69,0x63,0x69,0x74,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x73,0x69,0x6f,
+0x6e,0x20,0x6f,0x66,0x20,0x00,0x00,0x0d,0x20,0x69,0x6e,0x74,0x6f,0x20,0x49,0x6e,
+0x74,0x65,0x67,0x65,0x72,0x00,0x00,0x12,0x69,0x6e,0x76,0x61,0x6c,0x69,0x64,0x20,
+0x73,0x6c,0x69,0x63,0x65,0x20,0x73,0x69,0x7a,0x65,0x00,0x00,0x00,0x0a,0x00,0x0b,
+0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x5f,0x74,0x6f,0x3f,0x00,0x00,0x06,0x74,0x6f,
+0x5f,0x69,0x6e,0x74,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x09,0x54,
+0x79,0x70,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,
+0x00,0x00,0x02,0x3c,0x3d,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,
+0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x06,0x65,
+0x6d,0x70,0x74,0x79,0x3f,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,
+0x85,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x26,0x00,0x08,0x00,
+0x15,0xc0,0x80,0x01,0x01,0x40,0x00,0x02,0x20,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,
+0x15,0xc0,0x80,0x01,0x20,0x80,0x80,0x01,0x15,0x40,0x00,0x02,0xb2,0xc0,0x80,0x01,
+0x19,0x03,0xc0,0x01,0x15,0x80,0x80,0x01,0x15,0xc0,0x00,0x02,0xa0,0x00,0x81,0x01,
+0x37,0xc0,0x80,0x01,0x16,0xc0,0x80,0x01,0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x02,0x3c,0x3c,
+0x00,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x04,0x73,0x69,
+0x7a,0x65,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x00,0x00,0x7d,0x00,0x03,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,
+0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,
+0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x04,0x01,0x00,0x02,0xa0,0x40,0x80,0x01,
+0x29,0x00,0x80,0x01,0x3f,0xc0,0x00,0x01,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,
+0x21,0xc0,0x80,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,
+0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x08,0x67,0x72,0x6f,0x75,0x70,
+0x5f,0x62,0x79,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0xaf,0x00,
+0x05,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x26,0x00,0x08,0x00,
+0x15,0x40,0x80,0x02,0x37,0x80,0x01,0x03,0x01,0x40,0x80,0x03,0x38,0xc0,0x01,0x03,
+0xa0,0x3f,0x80,0x02,0x01,0x40,0x81,0x01,0x01,0x40,0x80,0x02,0x20,0x40,0x80,0x02,
+0x01,0x40,0x01,0x02,0x15,0x80,0x80,0x02,0x01,0xc0,0x00,0x03,0xa0,0x80,0x80,0x02,
+0x19,0x03,0xc0,0x02,0x15,0x80,0x80,0x02,0x01,0xc0,0x00,0x03,0xa0,0xc0,0x80,0x02,
+0x01,0x00,0x01,0x03,0xa0,0x00,0x81,0x02,0x17,0x03,0x40,0x00,0x01,0x00,0x81,0x02,
+0xb7,0x40,0x81,0x02,0x15,0x80,0x00,0x03,0x01,0xc0,0x80,0x03,0x01,0x40,0x01,0x04,
+0x20,0x41,0x01,0x03,0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,
+0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,
+0x65,0x00,0x00,0x04,0x6b,0x65,0x79,0x3f,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x02,
+0x3c,0x3c,0x00,0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,0x00,0x01,0x19,0x00,0x04,0x00,
+0x0c,0x00,0x03,0x00,0x00,0x00,0x25,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x02,
+0x20,0x00,0x00,0x02,0x99,0x00,0x40,0x02,0x17,0x02,0x40,0x00,0x06,0x00,0x00,0x02,
+0x04,0x01,0x80,0x02,0xa0,0x40,0x00,0x02,0x29,0x00,0x00,0x02,0x37,0x00,0x01,0x01,
+0x37,0x00,0x81,0x01,0x06,0x00,0x00,0x02,0x40,0x01,0x80,0x02,0x21,0xc0,0x00,0x02,
+0x01,0x80,0x00,0x02,0x20,0x00,0x01,0x02,0x03,0x00,0xc0,0x02,0xb5,0x40,0x01,0x02,
+0x19,0x07,0x40,0x02,0x06,0x00,0x00,0x02,0x01,0x80,0x80,0x02,0x42,0x00,0x00,0x03,
+0x93,0x03,0x00,0x03,0x01,0x80,0x80,0x03,0x20,0x00,0x81,0x03,0xa0,0x00,0x02,0x03,
+0x83,0xff,0xbf,0x03,0x83,0xff,0x3f,0x04,0x01,0x80,0x80,0x04,0x20,0x00,0x81,0x04,
+0xaf,0x40,0x82,0x04,0x40,0x03,0x00,0x05,0xa1,0x82,0x01,0x02,0x01,0x80,0x00,0x02,
+0x40,0x05,0x80,0x02,0x21,0x80,0x02,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x0b,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,
+0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x07,0x73,
+0x6f,0x72,0x74,0x5f,0x62,0x79,0x00,0x00,0x0f,0x65,0x61,0x63,0x68,0x5f,0x77,0x69,
+0x74,0x68,0x5f,0x69,0x6e,0x64,0x65,0x78,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,
+0x00,0x01,0x3e,0x00,0x00,0x0c,0x5f,0x5f,0x73,0x6f,0x72,0x74,0x5f,0x73,0x75,0x62,
+0x5f,0x5f,0x00,0x00,0x05,0x41,0x72,0x72,0x61,0x79,0x00,0x00,0x03,0x6e,0x65,0x77,
+0x00,0x00,0x01,0x2d,0x00,0x00,0x07,0x63,0x6f,0x6c,0x6c,0x65,0x63,0x74,0x00,0x00,
+0x00,0x00,0x58,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,
+0x26,0x00,0x00,0x04,0x15,0xc0,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x00,0x00,0x02,
+0x15,0x80,0x00,0x02,0x15,0x40,0x80,0x02,0x01,0x40,0x00,0x03,0xa0,0x40,0x80,0x02,
+0x01,0x80,0x00,0x03,0x37,0x41,0x81,0x02,0xa0,0x00,0x00,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x00,
+0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x34,0x00,0x04,0x00,0x07,0x00,0x00,
+0x00,0x00,0x00,0x05,0x26,0x00,0x00,0x04,0x01,0x40,0x00,0x02,0x01,0x80,0x80,0x02,
+0xa0,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x03,0x3c,0x3d,0x3e,0x00,0x00,0x00,0x00,0x33,0x00,0x04,0x00,0x07,0x00,0x00,
+0x00,0x00,0x00,0x05,0x26,0x00,0x00,0x04,0x15,0xc0,0x00,0x02,0x01,0x80,0x80,0x02,
+0xa0,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x02,0x5b,0x5d,0x00,0x00,0x00,0x00,0x81,0x00,0x05,0x00,0x08,0x00,0x02,0x00,
+0x00,0x00,0x15,0x00,0x26,0x00,0x10,0x00,0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,
+0x11,0x00,0x80,0x00,0x01,0x40,0x80,0x02,0x11,0x00,0x00,0x03,0xb2,0x40,0x80,0x02,
+0x19,0x03,0xc0,0x02,0x06,0x00,0x80,0x02,0x40,0x01,0x00,0x03,0x21,0x80,0x80,0x02,
+0x05,0x00,0x80,0x02,0x29,0x00,0x80,0x02,0x17,0x03,0x40,0x00,0x37,0x40,0x81,0x01,
+0x83,0xff,0x3f,0x02,0x06,0x00,0x80,0x02,0x40,0x03,0x00,0x03,0x21,0x80,0x80,0x02,
+0x01,0xc0,0x80,0x02,0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
+0x00,0x04,0x4e,0x4f,0x4e,0x45,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x04,0x65,0x61,
+0x63,0x68,0x00,0x00,0x00,0x00,0x35,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x00,0x00,
+0x04,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,
+0x29,0x80,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x08,0x5f,0x5f,
+0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x00,0x6d,0x00,0x03,0x00,0x06,0x00,
+0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0x40,0x80,0x01,
+0x15,0x00,0x01,0x02,0xb4,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,0x29,0x40,0x80,0x01,
+0x15,0xc0,0x80,0x01,0x01,0x40,0x00,0x02,0x20,0x80,0x00,0x02,0xa0,0x40,0x80,0x01,
+0x15,0x00,0x81,0x01,0xad,0xc0,0x80,0x01,0x16,0x00,0x81,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x3c,0x3d,0x00,0x00,0x04,0x70,
+0x75,0x73,0x68,0x00,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,
+0x01,0x2b,0x00,0x00,0x00,0x00,0x85,0x00,0x04,0x00,0x07,0x00,0x03,0x00,0x00,0x00,
+0x16,0x00,0x00,0x00,0xa6,0x00,0x10,0x00,0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,
+0x11,0x00,0x80,0x00,0x83,0xff,0xbf,0x01,0x19,0x02,0x40,0x01,0x06,0x00,0x00,0x02,
+0x40,0x01,0x80,0x02,0x21,0x40,0x00,0x02,0x97,0x05,0x40,0x00,0x01,0x40,0x00,0x02,
+0x11,0x00,0x80,0x02,0xb2,0x80,0x00,0x02,0x19,0x02,0x40,0x02,0x06,0x00,0x00,0x02,
+0x40,0x03,0x80,0x02,0x21,0x40,0x00,0x02,0x97,0x01,0x40,0x00,0x06,0x00,0x00,0x02,
+0x40,0x05,0x80,0x02,0x21,0x40,0x00,0x02,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x04,0x4e,0x4f,0x4e,0x45,0x00,0x00,0x04,0x65,0x61,0x63,
+0x68,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x00,0x00,0x59,0x00,0x03,0x00,0x06,0x00,
+0x00,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0x80,0x80,0x01,
+0x37,0x00,0x01,0x02,0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,
+0x19,0x02,0xc0,0x01,0x15,0xc0,0x80,0x01,0xad,0x40,0x80,0x01,0x16,0xc0,0x80,0x01,
+0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x01,0x2b,0x00,0x00,
+0x00,0x00,0x2e,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+0x15,0xc0,0x80,0x00,0xad,0x00,0x80,0x00,0x16,0xc0,0x80,0x00,0x29,0x00,0x80,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x2b,0x00,0x00,0x00,0x00,0x5e,
+0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x26,0x00,0x08,0x00,
+0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,0x15,0x40,0x00,0x02,0xb2,0x40,0x80,0x01,
+0x19,0x02,0xc0,0x01,0x15,0xc0,0x80,0x01,0xad,0x80,0x80,0x01,0x16,0xc0,0x80,0x01,
+0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,
+0x02,0x3d,0x3d,0x00,0x00,0x01,0x2b,0x00,0x00,0x00,0x00,0x7d,0x00,0x03,0x00,0x06,
+0x00,0x01,0x00,0x00,0x00,0x0e,0x00,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,
+0x20,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,
+0x04,0x01,0x00,0x02,0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x37,0xc0,0x00,0x01,
+0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0x21,0xc0,0x80,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,
+0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,
+0x00,0x00,0x08,0x66,0x6c,0x61,0x74,0x5f,0x6d,0x61,0x70,0x00,0x00,0x04,0x65,0x61,
+0x63,0x68,0x00,0x00,0x00,0x00,0x85,0x00,0x04,0x00,0x07,0x00,0x01,0x00,0x00,0x00,
+0x12,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0x40,0x00,0x02,0x37,0x40,0x81,0x02,
+0x01,0x40,0x00,0x03,0x38,0x80,0x81,0x02,0xa0,0x3f,0x00,0x02,0x01,0x00,0x81,0x01,
+0x04,0x01,0x80,0x02,0xa0,0x40,0x00,0x02,0x19,0x02,0x40,0x02,0x01,0xc0,0x00,0x02,
+0x40,0x01,0x80,0x02,0x21,0x80,0x00,0x02,0x97,0x01,0x40,0x00,0x15,0x80,0x00,0x02,
+0x01,0xc0,0x80,0x02,0xa0,0xc0,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x04,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x0b,0x72,0x65,0x73,
+0x70,0x6f,0x6e,0x64,0x5f,0x74,0x6f,0x3f,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,
+0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x00,0x00,0x00,0x35,0x00,0x03,0x00,0x06,0x00,
+0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x26,0x00,0x00,0x02,0x95,0x80,0x80,0x01,
+0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x00,0x00,0x00,0x83,0x00,
+0x05,0x00,0x08,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,
+0x06,0x00,0x80,0x02,0x20,0x00,0x80,0x02,0x99,0x00,0xc0,0x02,0x17,0x02,0x40,0x00,
+0x06,0x00,0x80,0x02,0x04,0x01,0x00,0x03,0xa0,0x40,0x80,0x02,0x29,0x00,0x80,0x02,
+0x07,0x00,0x00,0x01,0x05,0x00,0x80,0x01,0x05,0x00,0x00,0x02,0x06,0x00,0x80,0x02,
+0x40,0x01,0x00,0x03,0x21,0xc0,0x80,0x02,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x04,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,
+0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x06,0x6d,
+0x61,0x78,0x5f,0x62,0x79,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,
+0xb0,0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x26,0x00,0x08,0x00,
+0x15,0x80,0x00,0x02,0x19,0x06,0x40,0x02,0x01,0x40,0x00,0x02,0x20,0x00,0x00,0x02,
+0x16,0xc0,0x00,0x02,0x15,0x40,0x00,0x02,0x37,0x40,0x81,0x02,0x01,0x40,0x00,0x03,
+0x38,0x80,0x81,0x02,0xa0,0x7f,0x00,0x02,0x16,0x00,0x01,0x02,0x08,0x00,0x00,0x02,
+0x16,0x80,0x00,0x02,0x17,0x08,0x40,0x00,0x15,0x40,0x00,0x02,0x37,0x40,0x81,0x02,
+0x01,0x40,0x00,0x03,0x38,0x80,0x81,0x02,0xa0,0x7f,0x00,0x02,0x01,0x00,0x81,0x01,
+0x15,0x00,0x81,0x02,0xb5,0x80,0x00,0x02,0x19,0x03,0x40,0x02,0x01,0x40,0x00,0x02,
+0x20,0x00,0x00,0x02,0x16,0xc0,0x00,0x02,0x01,0xc0,0x00,0x02,0x16,0x00,0x01,0x02,
+0x97,0x00,0x40,0x00,0x05,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,
+0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x01,0x3e,0x00,0x00,0x00,0x00,0x83,0x00,0x05,
+0x00,0x08,0x00,0x01,0x00,0x00,0x00,0x10,0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x02,
+0x20,0x00,0x80,0x02,0x99,0x00,0xc0,0x02,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x02,
+0x04,0x01,0x00,0x03,0xa0,0x40,0x80,0x02,0x29,0x00,0x80,0x02,0x07,0x00,0x00,0x01,
+0x05,0x00,0x80,0x01,0x05,0x00,0x00,0x02,0x06,0x00,0x80,0x02,0x40,0x01,0x00,0x03,
+0x21,0xc0,0x80,0x02,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,
+0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x06,0x6d,0x69,0x6e,0x5f,0x62,
+0x79,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0xb0,0x00,0x04,0x00,
+0x07,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x26,0x00,0x08,0x00,0x15,0x80,0x00,0x02,
+0x19,0x06,0x40,0x02,0x01,0x40,0x00,0x02,0x20,0x00,0x00,0x02,0x16,0xc0,0x00,0x02,
+0x15,0x40,0x00,0x02,0x37,0x40,0x81,0x02,0x01,0x40,0x00,0x03,0x38,0x80,0x81,0x02,
+0xa0,0x7f,0x00,0x02,0x16,0x00,0x01,0x02,0x08,0x00,0x00,0x02,0x16,0x80,0x00,0x02,
+0x17,0x08,0x40,0x00,0x15,0x40,0x00,0x02,0x37,0x40,0x81,0x02,0x01,0x40,0x00,0x03,
+0x38,0x80,0x81,0x02,0xa0,0x7f,0x00,0x02,0x01,0x00,0x81,0x01,0x15,0x00,0x81,0x02,
+0xb3,0x80,0x00,0x02,0x19,0x03,0x40,0x02,0x01,0x40,0x00,0x02,0x20,0x00,0x00,0x02,
+0x16,0xc0,0x00,0x02,0x01,0xc0,0x00,0x02,0x16,0x00,0x01,0x02,0x97,0x00,0x40,0x00,
+0x05,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
+0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x04,0x63,0x61,0x6c,
+0x6c,0x00,0x00,0x01,0x3c,0x00,0x00,0x00,0x00,0x4d,0x00,0x05,0x00,0x07,0x00,0x01,
+0x00,0x00,0x00,0x0b,0xa6,0x00,0x00,0x00,0x05,0x00,0x00,0x01,0x05,0x00,0x80,0x01,
+0x07,0x00,0x00,0x02,0x06,0x00,0x80,0x02,0x40,0x01,0x00,0x03,0x21,0x00,0x80,0x02,
+0x01,0xc0,0x80,0x02,0x01,0x80,0x00,0x03,0x37,0x41,0x81,0x02,0x29,0x00,0x80,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,
+0x00,0x01,0x32,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,
+0x26,0x00,0x08,0x00,0x15,0x00,0x81,0x01,0x19,0x04,0xc0,0x01,0x01,0x40,0x80,0x01,
+0x20,0x00,0x80,0x01,0x01,0xc0,0x80,0x00,0x16,0x80,0x80,0x01,0x16,0xc0,0x80,0x00,
+0x08,0x00,0x80,0x01,0x16,0x00,0x81,0x01,0x17,0x19,0x40,0x00,0x15,0x40,0x80,0x01,
+0x99,0x0e,0xc0,0x01,0x15,0x40,0x80,0x01,0x37,0x00,0x01,0x02,0x01,0x40,0x80,0x02,
+0x38,0x40,0x01,0x02,0x15,0x80,0x80,0x02,0x39,0x40,0x01,0x02,0xa0,0x7f,0x80,0x01,
+0x83,0xff,0x3f,0x02,0xb5,0x80,0x80,0x01,0x99,0x01,0xc0,0x01,0x01,0x40,0x80,0x01,
+0x20,0x00,0x80,0x01,0x16,0x80,0x80,0x01,0x15,0x40,0x80,0x01,0x37,0x00,0x01,0x02,
+0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0x15,0xc0,0x80,0x02,0x39,0x40,0x01,0x02,
+0xa0,0x7f,0x80,0x01,0x83,0xff,0x3f,0x02,0xb3,0xc0,0x80,0x01,0x19,0x02,0xc0,0x01,
+0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,0x16,0xc0,0x80,0x01,0x97,0x00,0x40,0x00,
+0x05,0x00,0x80,0x01,0x97,0x09,0x40,0x00,0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,
+0x01,0xc0,0x80,0x00,0x15,0x80,0x00,0x02,0xa0,0x00,0x81,0x01,0x83,0xff,0x3f,0x02,
+0xb5,0x80,0x80,0x01,0x99,0x00,0xc0,0x01,0x16,0x80,0x80,0x00,0x01,0x40,0x80,0x01,
+0x15,0xc0,0x00,0x02,0xa0,0x00,0x81,0x01,0x83,0xff,0x3f,0x02,0xb3,0xc0,0x80,0x01,
+0x99,0x01,0xc0,0x01,0x01,0x40,0x80,0x01,0x16,0xc0,0x80,0x01,0x97,0x00,0x40,0x00,
+0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,
+0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x04,0x63,0x61,0x6c,
+0x6c,0x00,0x00,0x01,0x3e,0x00,0x00,0x01,0x3c,0x00,0x00,0x03,0x3c,0x3d,0x3e,0x00,
+0x00,0x00,0x00,0x9a,0x00,0x07,0x00,0x0a,0x00,0x01,0x00,0x00,0x00,0x15,0x00,0x00,
+0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x03,0x20,0x00,0x80,0x03,0x99,0x00,0xc0,0x03,
+0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x03,0x04,0x01,0x00,0x04,0xa0,0x40,0x80,0x03,
+0x29,0x00,0x80,0x03,0x05,0x00,0x00,0x01,0x05,0x00,0x80,0x01,0x05,0x00,0x00,0x02,
+0x05,0x00,0x80,0x02,0x07,0x00,0x00,0x03,0x06,0x00,0x80,0x03,0x40,0x01,0x00,0x04,
+0x21,0xc0,0x80,0x03,0x01,0x00,0x81,0x03,0x01,0x80,0x00,0x04,0x37,0xc1,0x81,0x03,
+0x29,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0c,0x62,0x6c,
+0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,
+0x65,0x6e,0x75,0x6d,0x00,0x00,0x09,0x6d,0x69,0x6e,0x6d,0x61,0x78,0x5f,0x62,0x79,
+0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0xf0,0x00,0x04,0x00,0x07,
+0x00,0x00,0x00,0x00,0x00,0x2f,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0x80,0x01,0x02,
+0x19,0x07,0x40,0x02,0x01,0x40,0x00,0x02,0x20,0x00,0x00,0x02,0x16,0x00,0x01,0x02,
+0x16,0x80,0x00,0x02,0x15,0x40,0x00,0x02,0x37,0x40,0x81,0x02,0x01,0x40,0x00,0x03,
+0x38,0x80,0x81,0x02,0xa0,0x7f,0x00,0x02,0x16,0x40,0x01,0x02,0x16,0xc0,0x00,0x02,
+0x08,0x00,0x00,0x02,0x16,0x80,0x01,0x02,0x97,0x0e,0x40,0x00,0x15,0x40,0x00,0x02,
+0x37,0x40,0x81,0x02,0x01,0x40,0x00,0x03,0x38,0x80,0x81,0x02,0xa0,0x7f,0x00,0x02,
+0x01,0x00,0x81,0x01,0x15,0xc0,0x80,0x02,0xb5,0x80,0x00,0x02,0x19,0x02,0x40,0x02,
+0x01,0x40,0x00,0x02,0x20,0x00,0x00,0x02,0x16,0x80,0x00,0x02,0x16,0xc0,0x80,0x01,
+0x15,0x40,0x00,0x02,0x37,0x40,0x81,0x02,0x01,0x40,0x00,0x03,0x38,0x80,0x81,0x02,
+0xa0,0x7f,0x00,0x02,0x01,0x00,0x81,0x01,0x15,0x40,0x81,0x02,0xb3,0xc0,0x00,0x02,
+0x19,0x03,0x40,0x02,0x01,0x40,0x00,0x02,0x20,0x00,0x00,0x02,0x16,0x00,0x01,0x02,
+0x01,0xc0,0x00,0x02,0x16,0x40,0x01,0x02,0x97,0x00,0x40,0x00,0x05,0x00,0x00,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x5f,0x5f,
+0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x01,
+0x3e,0x00,0x00,0x01,0x3c,0x00,0x00,0x00,0x00,0x4d,0x00,0x02,0x00,0x04,0x00,0x02,
+0x00,0x00,0x00,0x0b,0xa6,0x00,0x00,0x00,0x19,0x02,0xc0,0x00,0x06,0x00,0x00,0x01,
+0x40,0x01,0x80,0x01,0x21,0x00,0x00,0x01,0x97,0x01,0x40,0x00,0x06,0x00,0x00,0x01,
+0x40,0x03,0x80,0x01,0x21,0x00,0x00,0x01,0x07,0x00,0x00,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,
+0x00,0x00,0x51,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,
+0x26,0x00,0x08,0x00,0x15,0x40,0x80,0x01,0x37,0x00,0x01,0x02,0x01,0x40,0x80,0x02,
+0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,0x99,0x01,0xc0,0x01,0x08,0x00,0x80,0x01,
+0x29,0x80,0x80,0x01,0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x00,0x00,0x49,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x00,
+0x26,0x00,0x08,0x00,0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,0x99,0x01,0xc0,0x01,
+0x08,0x00,0x80,0x01,0x29,0x80,0x80,0x01,0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x08,0x5f,0x5f,
+0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x00,0x6e,0x00,0x03,0x00,0x06,0x00,
+0x02,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x83,0xff,0x3f,0x01,
+0x19,0x02,0xc0,0x00,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0x21,0x00,0x80,0x01,
+0x97,0x01,0x40,0x00,0x06,0x00,0x80,0x01,0x40,0x03,0x00,0x02,0x21,0x00,0x80,0x01,
+0x01,0x80,0x80,0x01,0x03,0x00,0x40,0x02,0xb2,0x40,0x80,0x01,0x19,0x01,0xc0,0x01,
+0x07,0x00,0x80,0x01,0x97,0x00,0x40,0x00,0x08,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,
+0x02,0x3d,0x3d,0x00,0x00,0x00,0x00,0x75,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,
+0x00,0x13,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0x40,0x80,0x01,0x37,0x00,0x01,0x02,
+0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,0x99,0x01,0xc0,0x01,
+0x15,0x80,0x80,0x01,0xad,0x40,0x80,0x01,0x16,0x80,0x80,0x01,0x15,0x80,0x80,0x01,
+0x03,0x00,0x40,0x02,0xb5,0x80,0x80,0x01,0x99,0x01,0xc0,0x01,0x08,0x00,0x80,0x01,
+0x29,0x80,0x80,0x01,0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x01,0x2b,0x00,0x00,0x01,0x3e,0x00,0x00,0x00,0x00,0x6d,0x00,0x03,0x00,0x06,0x00,
+0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x01,0x40,0x80,0x01,
+0x20,0x00,0x80,0x01,0x99,0x01,0xc0,0x01,0x15,0x80,0x80,0x01,0xad,0x40,0x80,0x01,
+0x16,0x80,0x80,0x01,0x15,0x80,0x80,0x01,0x03,0x00,0x40,0x02,0xb5,0x80,0x80,0x01,
+0x99,0x01,0xc0,0x01,0x08,0x00,0x80,0x01,0x29,0x80,0x80,0x01,0x97,0x00,0x40,0x00,
+0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
+0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x01,0x2b,0x00,0x00,
+0x01,0x3e,0x00,0x00,0x00,0x00,0xf4,0x00,0x03,0x00,0x07,0x00,0x01,0x00,0x00,0x00,
+0x19,0x00,0x00,0x00,0xa6,0x00,0x10,0x00,0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,
+0x05,0x00,0x80,0x00,0x01,0x40,0x80,0x01,0x05,0x00,0x00,0x02,0xb2,0x00,0x80,0x01,
+0x19,0x02,0xc0,0x01,0x06,0x00,0x80,0x01,0x11,0x01,0x00,0x02,0x3d,0x00,0x80,0x02,
+0x20,0x41,0x80,0x01,0x06,0x00,0x80,0x01,0x20,0xc0,0x80,0x01,0x99,0x00,0xc0,0x01,
+0x97,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x84,0x02,0x00,0x02,0x01,0x40,0x80,0x02,
+0x20,0x01,0x81,0x01,0x29,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,
+0x21,0x80,0x81,0x01,0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x23,0x77,
+0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,
+0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x30,0x20,0x66,0x6f,0x72,0x20,
+0x31,0x29,0x00,0x00,0x00,0x07,0x00,0x02,0x3d,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,
+0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,
+0x6f,0x72,0x00,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,
+0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x10,0x65,0x61,
+0x63,0x68,0x5f,0x77,0x69,0x74,0x68,0x5f,0x6f,0x62,0x6a,0x65,0x63,0x74,0x00,0x00,
+0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x48,0x00,0x03,0x00,0x07,0x00,0x00,
+0x00,0x00,0x00,0x07,0x26,0x00,0x08,0x00,0x15,0x80,0x80,0x01,0x01,0x40,0x00,0x02,
+0x20,0x40,0x00,0x02,0x15,0x40,0x80,0x02,0x20,0x01,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x00,0xdd,0x00,0x04,
+0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x1e,0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x02,
+0x20,0x00,0x00,0x02,0x99,0x00,0x40,0x02,0x17,0x02,0x40,0x00,0x06,0x00,0x00,0x02,
+0x04,0x01,0x80,0x02,0xa0,0x40,0x00,0x02,0x29,0x00,0x00,0x02,0x06,0x00,0x00,0x02,
+0x20,0xc0,0x00,0x02,0x01,0x00,0x01,0x01,0x20,0x00,0x01,0x02,0xaf,0x40,0x01,0x02,
+0x01,0x00,0x81,0x01,0x17,0x04,0x40,0x00,0x01,0x40,0x00,0x02,0x01,0x80,0x80,0x02,
+0x01,0xc0,0x00,0x03,0xa0,0xc0,0x81,0x02,0xa0,0x80,0x01,0x02,0x01,0xc0,0x00,0x02,
+0xaf,0x40,0x01,0x02,0x01,0x00,0x81,0x01,0x01,0xc0,0x00,0x02,0x83,0xff,0xbf,0x02,
+0xb6,0x00,0x02,0x02,0x18,0xfa,0x3f,0x02,0x06,0x00,0x00,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,
+0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,
+0x00,0x00,0x0c,0x72,0x65,0x76,0x65,0x72,0x73,0x65,0x5f,0x65,0x61,0x63,0x68,0x00,
+0x00,0x04,0x74,0x6f,0x5f,0x61,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01,
+0x2d,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x02,
+0x3e,0x3d,0x00,0x00,0x00,0x01,0xb6,0x00,0x05,0x00,0x0a,0x00,0x04,0x00,0x00,0x00,
+0x3f,0x00,0x00,0x00,0xa6,0x00,0x10,0x00,0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,
+0x05,0x00,0x80,0x00,0x06,0x00,0x80,0x02,0x20,0x00,0x80,0x02,0x20,0x40,0x80,0x02,
+0x99,0x01,0xc0,0x02,0x01,0x40,0x80,0x02,0x05,0x00,0x00,0x03,0xb2,0x80,0x80,0x02,
+0x99,0x02,0xc0,0x02,0x06,0x00,0x80,0x02,0x04,0x02,0x00,0x03,0x01,0x40,0x80,0x03,
+0x20,0xc1,0x80,0x02,0x29,0x00,0x80,0x02,0x37,0x40,0x81,0x01,0x01,0x40,0x80,0x02,
+0x05,0x00,0x00,0x03,0xb2,0x80,0x80,0x02,0x99,0x03,0xc0,0x02,0x06,0x00,0x80,0x02,
+0x40,0x01,0x00,0x03,0x21,0x40,0x81,0x02,0x06,0x00,0x80,0x02,0x40,0x03,0x00,0x03,
+0x21,0x80,0x81,0x02,0x97,0x10,0x40,0x00,0x01,0x40,0x80,0x02,0x04,0x04,0x00,0x03,
+0xa0,0xc0,0x81,0x02,0x99,0x00,0xc0,0x02,0x97,0x04,0x40,0x00,0x06,0x00,0x80,0x02,
+0x11,0x05,0x00,0x03,0x3d,0x00,0x80,0x03,0x01,0x40,0x00,0x04,0x20,0xc0,0x02,0x04,
+0x3e,0x00,0x82,0x03,0xbd,0x00,0x00,0x04,0x3e,0x00,0x82,0x03,0x20,0x41,0x82,0x02,
+0x01,0x40,0x80,0x02,0x20,0x00,0x82,0x02,0x01,0x40,0x81,0x00,0x06,0x00,0x80,0x02,
+0x40,0x05,0x00,0x03,0x21,0x40,0x81,0x02,0x83,0xff,0x3f,0x02,0x17,0x03,0x40,0x00,
+0x01,0xc0,0x80,0x02,0x40,0x07,0x00,0x03,0x21,0x40,0x81,0x02,0x01,0x00,0x81,0x02,
+0xad,0x00,0x83,0x02,0x01,0x40,0x01,0x02,0x01,0x00,0x81,0x02,0x01,0x40,0x00,0x03,
+0xb3,0x40,0x83,0x02,0x18,0xfb,0xbf,0x02,0x05,0x00,0x80,0x02,0x29,0x00,0x80,0x02,
+0x00,0x00,0x00,0x02,0x00,0x00,0x1a,0x6e,0x6f,0x20,0x69,0x6d,0x70,0x6c,0x69,0x63,
+0x69,0x74,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x6f,0x66,
+0x20,0x00,0x00,0x0d,0x20,0x69,0x6e,0x74,0x6f,0x20,0x49,0x6e,0x74,0x65,0x67,0x65,
+0x72,0x00,0x00,0x00,0x0e,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,
+0x65,0x6e,0x3f,0x00,0x00,0x01,0x21,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x07,0x74,
+0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x05,0x63,0x79,0x63,0x6c,0x65,0x00,0x00,
+0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x04,0x6c,0x6f,0x6f,0x70,0x00,0x00,0x0b,0x72,
+0x65,0x73,0x70,0x6f,0x6e,0x64,0x5f,0x74,0x6f,0x3f,0x00,0x00,0x06,0x74,0x6f,0x5f,
+0x69,0x6e,0x74,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,
+0x70,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,
+0x00,0x01,0x2b,0x00,0x00,0x01,0x3c,0x00,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x06,
+0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0xc0,0x80,0x01,
+0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x15,0x80,0x80,0x01,0x37,0x00,0x01,0x02,
+0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x7f,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x00,
+0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x31,0x00,0x01,0x00,0x03,0x00,0x01,
+0x00,0x00,0x00,0x04,0x15,0xc0,0x80,0x00,0x40,0x01,0x00,0x01,0x21,0x00,0x80,0x00,
+0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,
+0x63,0x68,0x00,0x00,0x00,0x00,0x3d,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,
+0x07,0x00,0x00,0x00,0x26,0x00,0x00,0x02,0x95,0x80,0x80,0x01,0x37,0x00,0x01,0x02,
+0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x00,0x00,0x35,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,
+0x26,0x00,0x08,0x00,0x15,0xc0,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x70,0x75,
+0x73,0x68,0x00,0x00,0x00,0x00,0x3d,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,
+0x07,0x00,0x00,0x00,0x26,0x00,0x00,0x02,0x15,0x80,0x80,0x01,0x37,0x00,0x01,0x02,
+0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x00,0x00,0xc7,0x00,0x04,0x00,0x08,0x00,0x02,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,
+0xa6,0x00,0x10,0x00,0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,0x11,0x00,0x80,0x00,
+0x06,0x00,0x00,0x02,0x20,0x40,0x00,0x02,0x20,0x80,0x00,0x02,0x99,0x01,0x40,0x02,
+0x01,0x40,0x00,0x02,0x11,0x00,0x80,0x02,0xb2,0xc0,0x00,0x02,0x99,0x02,0x40,0x02,
+0x06,0x00,0x00,0x02,0x84,0x02,0x80,0x02,0x01,0x40,0x00,0x03,0x20,0x01,0x01,0x02,
+0x29,0x00,0x00,0x02,0x83,0xff,0xbf,0x01,0x19,0x02,0x40,0x01,0x06,0x00,0x00,0x02,
+0x40,0x01,0x80,0x02,0x21,0x80,0x01,0x02,0x97,0x01,0x40,0x00,0x06,0x00,0x00,0x02,
+0x40,0x03,0x80,0x02,0x21,0x80,0x01,0x02,0x05,0x00,0x00,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x04,0x4e,0x4f,0x4e,0x45,0x00,0x00,
+0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x01,
+0x21,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,
+0x00,0x00,0x0a,0x66,0x69,0x6e,0x64,0x5f,0x69,0x6e,0x64,0x65,0x78,0x00,0x00,0x04,
+0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x59,0x00,0x03,0x00,0x06,0x00,0x00,0x00,
+0x00,0x00,0x0d,0x00,0x26,0x00,0x08,0x00,0x15,0x80,0x80,0x01,0x37,0x00,0x01,0x02,
+0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,0x19,0x01,0xc0,0x01,
+0x15,0xc0,0x80,0x01,0x29,0x80,0x80,0x01,0x15,0xc0,0x80,0x01,0xad,0x40,0x80,0x01,
+0x16,0xc0,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x01,0x2b,0x00,0x00,0x00,0x00,0x5e,0x00,
+0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x26,0x00,0x08,0x00,
+0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,0x15,0x40,0x00,0x02,0xb2,0x40,0x80,0x01,
+0x19,0x01,0xc0,0x01,0x15,0xc0,0x80,0x01,0x29,0x80,0x80,0x01,0x15,0xc0,0x80,0x01,
+0xad,0x80,0x80,0x01,0x16,0xc0,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,
+0x02,0x3d,0x3d,0x00,0x00,0x01,0x2b,0x00,0x00,0x00,0x00,0x53,0x00,0x05,0x00,0x07,
+0x00,0x02,0x00,0x00,0x00,0x0b,0x00,0x00,0x26,0x00,0x08,0x00,0x37,0x40,0x81,0x01,
+0x01,0x40,0x80,0x02,0x40,0x01,0x00,0x03,0x21,0x00,0x80,0x02,0x01,0x40,0x81,0x00,
+0x83,0xff,0x3f,0x02,0x06,0x00,0x80,0x02,0x40,0x03,0x00,0x03,0x21,0x40,0x80,0x02,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x6d,0x61,
+0x70,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x31,0x00,0x03,0x00,
+0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x26,0x00,0x00,0x02,0x01,0x40,0x80,0x01,
+0x20,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x04,0x74,0x6f,0x5f,0x61,0x00,0x00,0x00,0x00,0xb8,0x00,0x05,0x00,0x09,0x00,
+0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x37,0x40,0x81,0x01,
+0x01,0xc0,0x80,0x02,0x01,0x40,0x00,0x03,0x20,0x40,0x00,0x03,0xa0,0x00,0x80,0x02,
+0x83,0xff,0x3f,0x02,0x17,0x05,0x40,0x00,0x01,0xc0,0x80,0x02,0x15,0x40,0x00,0x03,
+0x01,0x00,0x81,0x03,0xa0,0x80,0x00,0x03,0x15,0x00,0x81,0x03,0xa0,0x80,0x00,0x03,
+0xa0,0x00,0x80,0x02,0x01,0x00,0x81,0x02,0xad,0xc0,0x80,0x02,0x01,0x40,0x01,0x02,
+0x01,0x00,0x81,0x02,0x15,0x40,0x00,0x03,0x20,0x40,0x01,0x03,0xb3,0x00,0x81,0x02,
+0x98,0xf8,0xbf,0x02,0x15,0xc0,0x80,0x02,0x01,0xc0,0x00,0x03,0xa0,0x00,0x80,0x02,
+0x15,0x00,0x81,0x02,0xad,0xc0,0x80,0x02,0x16,0x00,0x81,0x02,0x29,0x00,0x80,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x00,
+0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,
+0x01,0x2b,0x00,0x00,0x01,0x3c,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x00,
+0x00,0x39,0x00,0x03,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x06,0x26,0x00,0x00,0x00,
+0x3f,0xc0,0x00,0x01,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0x21,0x00,0x80,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,
+0x63,0x68,0x00,0x00,0x00,0x01,0x7d,0x00,0x03,0x00,0x08,0x00,0x00,0x00,0x00,0x00,
+0x29,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,
+0x01,0xc0,0x80,0x00,0x11,0x01,0x00,0x02,0xa0,0x40,0x80,0x01,0x99,0x00,0xc0,0x01,
+0x97,0x04,0x40,0x00,0x06,0x00,0x80,0x01,0x11,0x02,0x00,0x02,0x3d,0x00,0x80,0x02,
+0x01,0x40,0x00,0x03,0x20,0x40,0x01,0x03,0x3e,0x80,0x81,0x02,0xbd,0x00,0x00,0x03,
+0x3e,0x80,0x81,0x02,0x20,0xc1,0x80,0x01,0x01,0x40,0x80,0x01,0x20,0x80,0x81,0x01,
+0x83,0x00,0x40,0x02,0xa0,0xc0,0x81,0x01,0x99,0x04,0xc0,0x01,0x06,0x00,0x80,0x01,
+0x11,0x04,0x00,0x02,0x3d,0x01,0x80,0x02,0x01,0x40,0x00,0x03,0x20,0x80,0x01,0x03,
+0x3e,0x80,0x81,0x02,0xbd,0x01,0x00,0x03,0x3e,0x80,0x81,0x02,0x20,0xc1,0x80,0x01,
+0x01,0x40,0x80,0x01,0x03,0x00,0x40,0x02,0xa0,0x40,0x82,0x01,0x15,0x80,0x00,0x02,
+0x01,0x40,0x80,0x02,0x83,0xff,0x3f,0x03,0xa0,0x40,0x82,0x02,0x01,0xc0,0x00,0x03,
+0x20,0x81,0x02,0x02,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x13,0x77,
+0x72,0x6f,0x6e,0x67,0x20,0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x20,0x74,0x79,0x70,
+0x65,0x20,0x00,0x00,0x11,0x20,0x28,0x65,0x78,0x70,0x65,0x63,0x74,0x65,0x64,0x20,
+0x41,0x72,0x72,0x61,0x79,0x29,0x00,0x00,0x30,0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,
+0x20,0x68,0x61,0x73,0x20,0x77,0x72,0x6f,0x6e,0x67,0x20,0x61,0x72,0x72,0x61,0x79,
+0x20,0x6c,0x65,0x6e,0x67,0x74,0x68,0x20,0x28,0x65,0x78,0x70,0x65,0x63,0x74,0x65,
+0x64,0x20,0x32,0x2c,0x20,0x77,0x61,0x73,0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x00,
+0x0b,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x05,0x69,0x73,
+0x5f,0x61,0x3f,0x00,0x00,0x05,0x41,0x72,0x72,0x61,0x79,0x00,0x00,0x05,0x72,0x61,
+0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,0x70,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,
+0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,
+0x02,0x21,0x3d,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,
+0x72,0x6f,0x72,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,
+0x00,0x00,0x26,0x00,0x02,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,
+0x26,0x00,0x00,0x00,0x3f,0x80,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x4c,0x56,0x41,0x52,0x00,0x00,0x02,0xe6,0x00,0x00,0x00,0x1a,
+0x00,0x01,0x6e,0x00,0x03,0x61,0x72,0x79,0x00,0x03,0x76,0x61,0x6c,0x00,0x05,0x62,
+0x6c,0x6f,0x63,0x6b,0x00,0x05,0x73,0x74,0x61,0x74,0x65,0x00,0x01,0x68,0x00,0x03,
+0x6b,0x65,0x79,0x00,0x02,0x73,0x76,0x00,0x04,0x6f,0x72,0x69,0x67,0x00,0x01,0x65,
+0x00,0x01,0x69,0x00,0x01,0x61,0x00,0x01,0x62,0x00,0x01,0x76,0x00,0x05,0x63,0x6f,
+0x75,0x6e,0x74,0x00,0x02,0x65,0x32,0x00,0x02,0x65,0x33,0x00,0x05,0x66,0x69,0x72,
+0x73,0x74,0x00,0x03,0x6d,0x61,0x78,0x00,0x07,0x6d,0x61,0x78,0x5f,0x63,0x6d,0x70,
+0x00,0x03,0x63,0x6d,0x70,0x00,0x03,0x6d,0x69,0x6e,0x00,0x07,0x6d,0x69,0x6e,0x5f,
+0x63,0x6d,0x70,0x00,0x03,0x6f,0x62,0x6a,0x00,0x03,0x69,0x64,0x78,0x00,0x03,0x61,
+0x72,0x67,0x00,0x00,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x02,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x04,
+0x00,0x03,0x00,0x02,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x03,
+0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,
+0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x01,0x00,0x03,0x00,0x02,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x05,0x00,0x02,0x00,0x02,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x06,0x00,0x03,0x00,0x07,0x00,0x04,0x00,0x03,
+0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x08,0x00,0x03,0x00,0x09,0x00,0x01,0x00,0x0a,
+0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x0b,0x00,0x01,0x00,0x0c,0x00,0x02,0xff,0xff,
+0x00,0x00,0x00,0x09,0x00,0x01,0x00,0x0a,0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x00,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0b,0x00,0x03,0x00,0x0a,0x00,0x04,0x00,0x02,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x02,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0d,
+0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x0e,0x00,0x03,0x00,0x02,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x02,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x01,
+0x00,0x02,0x00,0x09,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0f,0x00,0x03,0x00,0x10,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x11,0x00,0x02,0x00,0x12,
+0x00,0x03,0x00,0x13,0x00,0x04,0x00,0x02,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x14,
+0x00,0x03,0x00,0x03,0x00,0x01,0x00,0x11,0x00,0x02,0x00,0x15,0x00,0x03,0x00,0x16,
+0x00,0x04,0x00,0x02,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x14,0x00,0x03,0x00,0x03,
+0x00,0x01,0x00,0x12,0x00,0x02,0x00,0x15,0x00,0x03,0x00,0x11,0x00,0x04,0x00,0x02,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x02,0x00,0x13,
+0x00,0x03,0x00,0x15,0x00,0x04,0x00,0x16,0x00,0x05,0x00,0x11,0x00,0x06,0x00,0x02,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x14,0x00,0x03,0x00,0x03,0x00,0x01,0x00,0x02,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x02,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x03,
+0x00,0x01,0x00,0x0e,0x00,0x02,0x00,0x02,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x02,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x17,0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x02,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x0a,
+0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x01,0x00,0x03,0x00,0x0e,
+0x00,0x04,0x00,0x02,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x09,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x02,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x09,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x18,0x00,0x03,0x00,0x09,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x09,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x19,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x0a,0x00,0x04,0x00,0x0b,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x02,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0b,
+0x00,0x03,0x00,0x18,0x00,0x04,0xff,0xff,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x0d,
+0x00,0x01,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,
+0x00,0x08,
+};
+void mrb_mruby_enum_ext_gem_init(mrb_state *mrb);
+void mrb_mruby_enum_ext_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_enum_ext_gem_init(mrb_state *mrb) {
+  int ai = mrb_gc_arena_save(mrb);
+  mrb_load_irep(mrb, gem_mrblib_irep_mruby_enum_ext);
+  if (mrb->exc) {
+    mrb_print_error(mrb);
+    exit(EXIT_FAILURE);
+  }
+  mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_enum_ext_gem_final(mrb_state *mrb) {
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-enum-lazy/gem_init.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,224 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ *   This file was generated!
+ *   All manual changes will get lost.
+ */
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+gem_mrblib_irep_mruby_enum_lazy[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0x7c,0x72,0x00,0x00,0x0b,0xb7,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x0a,0x41,0x30,0x30,
+0x30,0x30,0x00,0x00,0x00,0x37,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x04,
+0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0x45,0x00,0x80,0x00,0x4a,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0a,0x45,0x6e,0x75,0x6d,0x65,0x72,
+0x61,0x62,0x6c,0x65,0x00,0x00,0x00,0x00,0x55,0x00,0x01,0x00,0x03,0x00,0x02,0x00,
+0x00,0x00,0x08,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,
+0x05,0x00,0x80,0x00,0x91,0x00,0x00,0x01,0x43,0x80,0x80,0x00,0xc5,0x00,0x80,0x00,
+0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x6c,0x61,
+0x7a,0x79,0x00,0x00,0x0a,0x45,0x6e,0x75,0x6d,0x65,0x72,0x61,0x74,0x6f,0x72,0x00,
+0x00,0x04,0x4c,0x61,0x7a,0x79,0x00,0x00,0x00,0x00,0x3b,0x00,0x02,0x00,0x05,0x00,
+0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x11,0x00,0x00,0x01,
+0x06,0x00,0x80,0x01,0xa0,0x40,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x04,0x4c,0x61,0x7a,0x79,0x00,0x00,0x03,0x6e,0x65,0x77,
+0x00,0x00,0x00,0x01,0x9b,0x00,0x01,0x00,0x04,0x00,0x0b,0x00,0x00,0x00,0x36,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,0x48,0x00,0x80,0x00,0x04,0x01,0x00,0x01,
+0x84,0x00,0x80,0x01,0x05,0x00,0x00,0x02,0x20,0xc1,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x04,0x00,0x01,0x46,0x00,0x81,0x00,0x48,0x00,0x80,0x00,0x84,0x02,0x00,0x01,
+0x04,0x02,0x80,0x01,0x05,0x00,0x00,0x02,0x20,0xc1,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x06,0x00,0x01,0x46,0x80,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x08,0x00,0x01,
+0x46,0xc0,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x0a,0x00,0x01,0x46,0x00,0x82,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x0c,0x00,0x01,0x46,0x40,0x82,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x0e,0x00,0x01,0x46,0x80,0x82,0x00,0x48,0x00,0x80,0x00,0xc0,0x10,0x00,0x01,
+0x46,0xc0,0x82,0x00,0x48,0x00,0x80,0x00,0xc0,0x12,0x00,0x01,0x46,0x00,0x83,0x00,
+0x48,0x00,0x80,0x00,0x84,0x06,0x00,0x01,0x04,0x06,0x80,0x01,0x05,0x00,0x00,0x02,
+0x20,0xc1,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x14,0x00,0x01,0x46,0x80,0x83,0x00,
+0x48,0x00,0x80,0x00,0x84,0x07,0x00,0x01,0x04,0x08,0x80,0x01,0x05,0x00,0x00,0x02,
+0x20,0xc1,0x80,0x00,0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,
+0x00,0x0a,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x03,0x6d,
+0x61,0x70,0x00,0x00,0x07,0x63,0x6f,0x6c,0x6c,0x65,0x63,0x74,0x00,0x00,0x0c,0x61,
+0x6c,0x69,0x61,0x73,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x06,0x73,0x65,
+0x6c,0x65,0x63,0x74,0x00,0x00,0x08,0x66,0x69,0x6e,0x64,0x5f,0x61,0x6c,0x6c,0x00,
+0x00,0x06,0x72,0x65,0x6a,0x65,0x63,0x74,0x00,0x00,0x04,0x67,0x72,0x65,0x70,0x00,
+0x00,0x04,0x64,0x72,0x6f,0x70,0x00,0x00,0x0a,0x64,0x72,0x6f,0x70,0x5f,0x77,0x68,
+0x69,0x6c,0x65,0x00,0x00,0x04,0x74,0x61,0x6b,0x65,0x00,0x00,0x0a,0x74,0x61,0x6b,
+0x65,0x5f,0x77,0x68,0x69,0x6c,0x65,0x00,0x00,0x08,0x66,0x6c,0x61,0x74,0x5f,0x6d,
+0x61,0x70,0x00,0x00,0x0e,0x63,0x6f,0x6c,0x6c,0x65,0x63,0x74,0x5f,0x63,0x6f,0x6e,
+0x63,0x61,0x74,0x00,0x00,0x03,0x7a,0x69,0x70,0x00,0x00,0x05,0x66,0x6f,0x72,0x63,
+0x65,0x00,0x00,0x04,0x74,0x6f,0x5f,0x61,0x00,0x00,0x00,0x00,0x2a,0x00,0x03,0x00,
+0x05,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0xa6,0x00,0x00,0x02,0x40,0x01,0x00,0x02,
+0x24,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x7b,0x00,0x03,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x11,0x00,0x00,
+0x26,0x00,0x00,0x02,0x1a,0x02,0x40,0x00,0x15,0x40,0x80,0x01,0x40,0x01,0x00,0x02,
+0x21,0x00,0x80,0x01,0x97,0x04,0x40,0x00,0x1b,0x00,0x80,0x01,0x91,0x00,0x00,0x02,
+0x01,0xc0,0x80,0x02,0xa0,0x80,0x00,0x02,0x98,0x00,0x40,0x02,0x17,0x01,0x40,0x00,
+0x05,0x00,0x80,0x01,0x17,0x01,0x40,0x00,0x1d,0x00,0x80,0x01,0x1c,0x00,0x80,0x00,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x65,0x61,
+0x63,0x68,0x00,0x00,0x0d,0x53,0x74,0x6f,0x70,0x49,0x74,0x65,0x72,0x61,0x74,0x69,
+0x6f,0x6e,0x00,0x00,0x03,0x3d,0x3d,0x3d,0x00,0x00,0x00,0x00,0x56,0x00,0x03,0x00,
+0x07,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x26,0x00,0x00,0x02,0x95,0x80,0x80,0x01,
+0x99,0x02,0xc0,0x01,0x95,0x80,0x80,0x01,0x15,0x40,0x00,0x02,0x01,0x40,0x80,0x02,
+0x20,0x01,0x80,0x01,0x97,0x01,0x40,0x00,0x15,0x40,0x80,0x01,0x01,0x40,0x00,0x02,
+0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x02,0x3c,0x3c,0x00,0x00,0x00,0x00,0x3f,
+0x00,0x02,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0xa6,0x00,0x00,0x00,
+0x11,0x00,0x00,0x01,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0xa1,0x40,0x00,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x4c,0x61,
+0x7a,0x79,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x00,0x00,0x42,0x00,0x04,0x00,
+0x08,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x26,0x00,0x00,0x04,0x01,0x40,0x00,0x02,
+0x15,0x40,0x80,0x02,0x01,0x80,0x00,0x03,0xa0,0x40,0x80,0x02,0xa0,0x00,0x00,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x3c,0x3c,
+0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x3f,0x00,0x02,0x00,0x05,
+0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0xa6,0x00,0x00,0x00,0x11,0x00,0x00,0x01,
+0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0xa1,0x40,0x00,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x4c,0x61,0x7a,0x79,0x00,0x00,
+0x03,0x6e,0x65,0x77,0x00,0x00,0x00,0x00,0x52,0x00,0x04,0x00,0x07,0x00,0x00,0x00,
+0x00,0x00,0x0b,0x00,0x26,0x00,0x00,0x04,0x15,0x40,0x00,0x02,0x01,0x80,0x80,0x02,
+0xa0,0x00,0x00,0x02,0x19,0x02,0x40,0x02,0x01,0x40,0x00,0x02,0x01,0x80,0x80,0x02,
+0xa0,0x40,0x00,0x02,0x97,0x00,0x40,0x00,0x05,0x00,0x00,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x02,0x3c,0x3c,0x00,0x00,0x00,0x00,0x3f,0x00,0x02,0x00,0x05,0x00,0x01,0x00,0x00,
+0x00,0x06,0x00,0x00,0xa6,0x00,0x00,0x00,0x11,0x00,0x00,0x01,0x06,0x00,0x80,0x01,
+0x40,0x01,0x00,0x02,0xa1,0x40,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x04,0x4c,0x61,0x7a,0x79,0x00,0x00,0x03,0x6e,0x65,0x77,
+0x00,0x00,0x00,0x00,0x5a,0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,
+0x26,0x00,0x00,0x04,0x15,0x40,0x00,0x02,0x01,0x80,0x80,0x02,0xa0,0x00,0x00,0x02,
+0x20,0x40,0x00,0x02,0x19,0x02,0x40,0x02,0x01,0x40,0x00,0x02,0x01,0x80,0x80,0x02,
+0xa0,0x80,0x00,0x02,0x97,0x00,0x40,0x00,0x05,0x00,0x00,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x01,0x21,0x00,0x00,0x02,0x3c,0x3c,0x00,0x00,0x00,0x00,0x3f,0x00,0x03,0x00,0x06,
+0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x26,0x00,0x00,0x02,0x11,0x00,0x80,0x01,
+0x06,0x00,0x00,0x02,0x40,0x01,0x80,0x02,0xa1,0x40,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x4c,0x61,0x7a,0x79,0x00,0x00,
+0x03,0x6e,0x65,0x77,0x00,0x00,0x00,0x00,0x51,0x00,0x04,0x00,0x07,0x00,0x00,0x00,
+0x00,0x00,0x0b,0x00,0x26,0x00,0x00,0x04,0x15,0x40,0x00,0x02,0x01,0x80,0x80,0x02,
+0xa0,0x00,0x00,0x02,0x19,0x02,0x40,0x02,0x01,0x40,0x00,0x02,0x01,0x80,0x80,0x02,
+0xa0,0x40,0x00,0x02,0x97,0x00,0x40,0x00,0x05,0x00,0x00,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x3d,0x3d,0x3d,0x00,0x00,0x02,
+0x3c,0x3c,0x00,0x00,0x00,0x00,0x43,0x00,0x04,0x00,0x07,0x00,0x01,0x00,0x00,0x00,
+0x07,0x00,0x00,0x00,0x26,0x00,0x00,0x02,0x83,0xff,0xbf,0x01,0x11,0x00,0x00,0x02,
+0x06,0x00,0x80,0x02,0x40,0x01,0x00,0x03,0xa1,0x40,0x00,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x4c,0x61,0x7a,0x79,0x00,0x00,
+0x03,0x6e,0x65,0x77,0x00,0x00,0x00,0x00,0x5b,0x00,0x04,0x00,0x07,0x00,0x00,0x00,
+0x00,0x00,0x0d,0x00,0x26,0x00,0x00,0x04,0x15,0xc0,0x00,0x02,0x15,0x40,0x80,0x02,
+0xb3,0x00,0x00,0x02,0x19,0x02,0x40,0x02,0x15,0xc0,0x00,0x02,0xad,0x40,0x00,0x02,
+0x16,0xc0,0x00,0x02,0x97,0x01,0x40,0x00,0x01,0x40,0x00,0x02,0x01,0x80,0x80,0x02,
+0xa0,0x80,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
+0x00,0x01,0x3c,0x00,0x00,0x01,0x2b,0x00,0x00,0x02,0x3c,0x3c,0x00,0x00,0x00,0x00,
+0x43,0x00,0x03,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0xa6,0x00,0x00,0x00,
+0x07,0x00,0x00,0x01,0x11,0x00,0x80,0x01,0x06,0x00,0x00,0x02,0x40,0x01,0x80,0x02,
+0xa1,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x04,0x4c,0x61,0x7a,0x79,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x00,0x00,
+0x7a,0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x26,0x00,0x00,0x04,
+0x15,0x80,0x00,0x02,0x99,0x06,0x40,0x02,0x15,0x40,0x00,0x02,0x01,0x80,0x80,0x02,
+0xa0,0x00,0x00,0x02,0x20,0x40,0x00,0x02,0x19,0x03,0x40,0x02,0x01,0x40,0x00,0x02,
+0x01,0x80,0x80,0x02,0xa0,0x80,0x00,0x02,0x08,0x00,0x00,0x02,0x16,0x80,0x00,0x02,
+0x97,0x00,0x40,0x00,0x05,0x00,0x00,0x02,0x97,0x01,0x40,0x00,0x01,0x40,0x00,0x02,
+0x01,0x80,0x80,0x02,0xa0,0x80,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x01,0x21,0x00,0x00,
+0x02,0x3c,0x3c,0x00,0x00,0x00,0x00,0x6c,0x00,0x04,0x00,0x07,0x00,0x02,0x00,0x00,
+0x00,0x10,0x00,0x00,0x26,0x00,0x00,0x02,0x01,0x40,0x00,0x02,0x83,0xff,0xbf,0x02,
+0xb2,0x00,0x00,0x02,0x99,0x02,0x40,0x02,0x91,0x00,0x00,0x02,0x06,0x00,0x80,0x02,
+0x40,0x01,0x00,0x03,0xa1,0x80,0x00,0x02,0x29,0x00,0x00,0x02,0x83,0xff,0xbf,0x01,
+0x91,0x00,0x00,0x02,0x06,0x00,0x80,0x02,0x40,0x03,0x00,0x03,0xa1,0x80,0x00,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x02,0x3d,0x3d,
+0x00,0x00,0x04,0x4c,0x61,0x7a,0x79,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x00,
+0x00,0x42,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x06,0x00,0x80,0x00,
+0x91,0x00,0x00,0x01,0xa0,0x00,0x80,0x00,0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x53,0x74,
+0x6f,0x70,0x49,0x74,0x65,0x72,0x61,0x74,0x69,0x6f,0x6e,0x00,0x00,0x00,0x00,0x84,
+0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x00,0x26,0x00,0x00,0x04,
+0x01,0x40,0x00,0x02,0x01,0x80,0x80,0x02,0xa0,0x00,0x00,0x02,0x15,0xc0,0x00,0x02,
+0xad,0x40,0x00,0x02,0x16,0xc0,0x00,0x02,0x15,0xc0,0x00,0x02,0x15,0x40,0x80,0x02,
+0xb6,0x80,0x00,0x02,0x19,0x02,0x40,0x02,0x06,0x00,0x00,0x02,0x11,0x02,0x80,0x02,
+0xa0,0xc0,0x00,0x02,0x97,0x00,0x40,0x00,0x05,0x00,0x00,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x02,0x3c,0x3c,0x00,0x00,0x01,0x2b,
+0x00,0x00,0x02,0x3e,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,
+0x53,0x74,0x6f,0x70,0x49,0x74,0x65,0x72,0x61,0x74,0x69,0x6f,0x6e,0x00,0x00,0x00,
+0x00,0x3f,0x00,0x02,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x06,0xa6,0x00,0x00,0x00,
+0x11,0x00,0x00,0x01,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0xa1,0x40,0x00,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x4c,0x61,
+0x7a,0x79,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x00,0x00,0x72,0x00,0x04,0x00,
+0x07,0x00,0x00,0x00,0x00,0x00,0x0d,0x00,0x26,0x00,0x00,0x04,0x15,0x40,0x00,0x02,
+0x01,0x80,0x80,0x02,0xa0,0x00,0x00,0x02,0x19,0x02,0x40,0x02,0x01,0x40,0x00,0x02,
+0x01,0x80,0x80,0x02,0xa0,0x40,0x00,0x02,0x97,0x01,0x40,0x00,0x06,0x00,0x00,0x02,
+0x91,0x01,0x80,0x02,0xa0,0x80,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x04,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x02,0x3c,0x3c,0x00,
+0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x53,0x74,0x6f,0x70,0x49,0x74,
+0x65,0x72,0x61,0x74,0x69,0x6f,0x6e,0x00,0x00,0x00,0x00,0x3f,0x00,0x02,0x00,0x05,
+0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0xa6,0x00,0x00,0x00,0x11,0x00,0x00,0x01,
+0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0xa1,0x40,0x00,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x4c,0x61,0x7a,0x79,0x00,0x00,
+0x03,0x6e,0x65,0x77,0x00,0x00,0x00,0x00,0x48,0x00,0x05,0x00,0x08,0x00,0x01,0x00,
+0x00,0x00,0x08,0x00,0x26,0x00,0x00,0x04,0x15,0x40,0x80,0x02,0x01,0x80,0x00,0x03,
+0xa0,0x00,0x80,0x02,0x01,0x40,0x01,0x02,0x40,0x01,0x00,0x03,0x21,0x40,0x80,0x02,
+0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x63,0x61,
+0x6c,0x6c,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x33,0x00,0x03,
+0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x05,0x26,0x00,0x00,0x02,0x15,0x40,0x80,0x01,
+0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x02,0x3c,0x3c,0x00,0x00,0x00,0x00,0x57,0x00,0x04,0x00,
+0x07,0x00,0x01,0x00,0x00,0x00,0x0b,0x00,0xa6,0x00,0x08,0x00,0x06,0x00,0x00,0x02,
+0xb7,0x00,0x01,0x02,0x01,0x40,0x80,0x02,0xac,0x00,0x00,0x02,0x01,0x00,0x81,0x01,
+0x91,0x00,0x00,0x02,0x06,0x00,0x80,0x02,0x40,0x01,0x00,0x03,0xa1,0x80,0x00,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x01,0x2b,0x00,
+0x00,0x04,0x4c,0x61,0x7a,0x79,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x00,0x00,
+0x70,0x00,0x05,0x00,0x09,0x00,0x01,0x00,0x00,0x00,0x11,0x00,0x26,0x00,0x00,0x04,
+0x15,0xc0,0x80,0x02,0x40,0x01,0x00,0x03,0x21,0x00,0x80,0x02,0x01,0x40,0x01,0x02,
+0x15,0x80,0x80,0x02,0x19,0x03,0xc0,0x02,0x01,0x40,0x80,0x02,0x15,0x80,0x00,0x03,
+0x01,0x00,0x81,0x03,0xa0,0x80,0x00,0x03,0xa0,0x40,0x80,0x02,0x97,0x01,0x40,0x00,
+0x01,0x40,0x80,0x02,0x01,0x00,0x01,0x03,0xa0,0x40,0x80,0x02,0x29,0x00,0x80,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x03,0x6d,0x61,0x70,0x00,0x00,0x02,
+0x3c,0x3c,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x31,0x00,0x03,
+0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x26,0x00,0x00,0x02,0x01,0x40,0x80,0x01,
+0x20,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x04,0x6e,0x65,0x78,0x74,0x00,0x4c,0x56,0x41,0x52,0x00,0x00,0x01,0x58,0x00,
+0x00,0x00,0x0e,0x00,0x03,0x6f,0x62,0x6a,0x00,0x05,0x62,0x6c,0x6f,0x63,0x6b,0x00,
+0x07,0x79,0x69,0x65,0x6c,0x64,0x65,0x72,0x00,0x01,0x78,0x00,0x03,0x76,0x61,0x6c,
+0x00,0x07,0x70,0x61,0x74,0x74,0x65,0x72,0x6e,0x00,0x01,0x6e,0x00,0x07,0x64,0x72,
+0x6f,0x70,0x70,0x65,0x64,0x00,0x08,0x64,0x72,0x6f,0x70,0x70,0x69,0x6e,0x67,0x00,
+0x05,0x74,0x61,0x6b,0x65,0x6e,0x00,0x03,0x61,0x72,0x79,0x00,0x04,0x61,0x72,0x67,
+0x73,0x00,0x05,0x65,0x6e,0x75,0x6d,0x73,0x00,0x01,0x65,0xff,0xff,0x00,0x00,0x00,
+0x00,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x01,0xff,0xff,0x00,0x00,0x00,
+0x03,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x01,0x00,
+0x04,0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x01,0x00,
+0x04,0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x01,0x00,
+0x04,0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x05,0x00,0x01,0xff,0xff,0x00,0x00,0x00,
+0x02,0x00,0x01,0x00,0x04,0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x06,0x00,0x01,0xff,
+0xff,0x00,0x00,0x00,0x07,0x00,0x03,0x00,0x02,0x00,0x01,0x00,0x04,0x00,0x02,0xff,
+0xff,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x02,0x00,0x02,0x00,0x01,0x00,
+0x04,0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x06,0x00,0x01,0xff,0xff,0x00,0x00,0x00,
+0x09,0x00,0x03,0x00,0x02,0x00,0x01,0x00,0x04,0x00,0x02,0xff,0xff,0x00,0x00,0x00,
+0x01,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x04,0x00,0x02,0xff,0xff,0x00,0x00,0x00,
+0x01,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x04,0x00,0x02,0xff,0xff,0x00,0x00,0x00,
+0x0a,0x00,0x04,0x00,0x03,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0b,0x00,0x01,0x00,
+0x01,0x00,0x02,0x00,0x0c,0x00,0x03,0x00,0x02,0x00,0x01,0x00,0x04,0x00,0x02,0xff,
+0xff,0x00,0x00,0x00,0x0a,0x00,0x04,0x00,0x0d,0x00,0x01,0xff,0xff,0x00,0x00,0x45,
+0x4e,0x44,0x00,0x00,0x00,0x00,0x08,
+};
+void mrb_mruby_enum_lazy_gem_init(mrb_state *mrb);
+void mrb_mruby_enum_lazy_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_enum_lazy_gem_init(mrb_state *mrb) {
+  int ai = mrb_gc_arena_save(mrb);
+  mrb_load_irep(mrb, gem_mrblib_irep_mruby_enum_lazy);
+  if (mrb->exc) {
+    mrb_print_error(mrb);
+    exit(EXIT_FAILURE);
+  }
+  mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_enum_lazy_gem_final(mrb_state *mrb) {
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-enumerator/gem_init.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,386 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ *   This file was generated!
+ *   All manual changes will get lost.
+ */
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+gem_mrblib_irep_mruby_enumerator[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0x7c,0x82,0x00,0x00,0x15,0xda,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x14,0x5d,0x30,0x30,
+0x30,0x30,0x00,0x00,0x00,0x69,0x00,0x01,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x0b,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x00,0x80,0x00,0x45,0x00,0x80,0x00,
+0x05,0x00,0x80,0x00,0x44,0x40,0x80,0x00,0xc5,0x00,0x80,0x00,0x05,0x00,0x80,0x00,
+0x44,0x80,0x80,0x00,0x45,0x01,0x80,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x0a,0x45,0x6e,0x75,0x6d,0x65,0x72,0x61,0x74,0x6f,0x72,
+0x00,0x00,0x06,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x00,0x00,0x0a,0x45,0x6e,0x75,0x6d,
+0x65,0x72,0x61,0x62,0x6c,0x65,0x00,0x00,0x00,0x02,0x3e,0x00,0x01,0x00,0x07,0x00,
+0x10,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x06,0x00,0x80,0x00,0x91,0x00,0x00,0x01,
+0xa0,0x00,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x80,0x80,0x00,
+0x06,0x00,0x80,0x00,0x04,0x02,0x00,0x01,0x84,0x02,0x80,0x01,0x04,0x03,0x00,0x02,
+0x84,0x03,0x80,0x02,0x20,0xc2,0x80,0x00,0x06,0x00,0x80,0x00,0x04,0x02,0x00,0x01,
+0x84,0x02,0x80,0x01,0x04,0x03,0x00,0x02,0x84,0x03,0x80,0x02,0x20,0x02,0x82,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0x40,0x82,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x04,0x00,0x01,0x46,0x80,0x82,0x00,0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,
+0x46,0xc0,0x82,0x00,0x48,0x00,0x80,0x00,0xc0,0x08,0x00,0x01,0x46,0x00,0x83,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x0a,0x00,0x01,0x46,0x40,0x83,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x0c,0x00,0x01,0x46,0x80,0x83,0x00,0x48,0x00,0x80,0x00,0xc0,0x0e,0x00,0x01,
+0x46,0xc0,0x83,0x00,0x06,0x00,0x80,0x00,0x84,0x07,0x00,0x01,0xa0,0x00,0x82,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x10,0x00,0x01,0x46,0x00,0x84,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x12,0x00,0x01,0x46,0x40,0x84,0x00,0x48,0x00,0x80,0x00,0xc0,0x14,0x00,0x01,
+0x46,0x80,0x84,0x00,0x48,0x00,0x80,0x00,0xc0,0x16,0x00,0x01,0x46,0xc0,0x84,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x18,0x00,0x01,0x46,0x00,0x85,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x1a,0x00,0x01,0x46,0x40,0x85,0x00,0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,
+0x43,0x80,0x85,0x00,0x45,0x07,0x80,0x00,0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,
+0x43,0xc0,0x85,0x00,0xc5,0x07,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x18,0x00,0x07,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x00,0x00,0x0a,
+0x45,0x6e,0x75,0x6d,0x65,0x72,0x61,0x62,0x6c,0x65,0x00,0x00,0x0a,0x69,0x6e,0x69,
+0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x0d,0x61,0x74,0x74,0x72,0x5f,0x61,
+0x63,0x63,0x65,0x73,0x73,0x6f,0x72,0x00,0x00,0x03,0x6f,0x62,0x6a,0x00,0x00,0x04,
+0x6d,0x65,0x74,0x68,0x00,0x00,0x04,0x61,0x72,0x67,0x73,0x00,0x00,0x03,0x66,0x69,
+0x62,0x00,0x00,0x07,0x70,0x72,0x69,0x76,0x61,0x74,0x65,0x00,0x00,0x0f,0x69,0x6e,
+0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x5f,0x63,0x6f,0x70,0x79,0x00,0x00,0x0a,
+0x77,0x69,0x74,0x68,0x5f,0x69,0x6e,0x64,0x65,0x78,0x00,0x00,0x0f,0x65,0x61,0x63,
+0x68,0x5f,0x77,0x69,0x74,0x68,0x5f,0x69,0x6e,0x64,0x65,0x78,0x00,0x00,0x0b,0x77,
+0x69,0x74,0x68,0x5f,0x6f,0x62,0x6a,0x65,0x63,0x74,0x00,0x00,0x07,0x69,0x6e,0x73,
+0x70,0x65,0x63,0x74,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x15,0x65,0x6e,
+0x75,0x6d,0x65,0x72,0x61,0x74,0x6f,0x72,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x63,
+0x61,0x6c,0x6c,0x00,0x00,0x04,0x6e,0x65,0x78,0x74,0x00,0x00,0x0b,0x6e,0x65,0x78,
+0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x00,0x00,0x04,0x70,0x65,0x65,0x6b,0x00,
+0x00,0x0b,0x70,0x65,0x65,0x6b,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x00,0x00,0x06,
+0x72,0x65,0x77,0x69,0x6e,0x64,0x00,0x00,0x04,0x66,0x65,0x65,0x64,0x00,0x00,0x09,
+0x47,0x65,0x6e,0x65,0x72,0x61,0x74,0x6f,0x72,0x00,0x00,0x07,0x59,0x69,0x65,0x6c,
+0x64,0x65,0x72,0x00,0x00,0x00,0x01,0x37,0x00,0x05,0x00,0x08,0x00,0x00,0x00,0x00,
+0x00,0x23,0x00,0x00,0xa6,0x00,0x28,0x00,0x17,0x01,0x40,0x00,0x17,0x01,0x40,0x00,
+0x17,0x01,0x40,0x00,0x05,0x00,0x80,0x00,0x04,0x00,0x00,0x01,0x06,0x00,0x80,0x02,
+0x20,0x40,0x80,0x02,0x99,0x02,0xc0,0x02,0x11,0x01,0x80,0x02,0x01,0x00,0x01,0x03,
+0x21,0xc0,0x80,0x02,0x01,0x40,0x81,0x00,0x97,0x02,0x40,0x00,0x99,0x00,0xc0,0x00,
+0x97,0x01,0x40,0x00,0x06,0x00,0x80,0x02,0x91,0x02,0x00,0x03,0xa0,0x00,0x81,0x02,
+0x0e,0x03,0x80,0x00,0x8e,0x03,0x00,0x01,0x01,0xc0,0x80,0x02,0x20,0x00,0x82,0x02,
+0x8e,0x04,0x80,0x02,0x05,0x00,0x80,0x02,0x0e,0x05,0x80,0x02,0x05,0x00,0x80,0x02,
+0x8e,0x05,0x80,0x02,0x05,0x00,0x80,0x02,0x0e,0x06,0x80,0x02,0x05,0x00,0x80,0x02,
+0x8e,0x06,0x80,0x02,0x08,0x00,0x80,0x02,0x0e,0x07,0x80,0x02,0x29,0x00,0x80,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,
+0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x09,
+0x47,0x65,0x6e,0x65,0x72,0x61,0x74,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,
+0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,
+0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x04,0x40,0x6f,0x62,0x6a,0x00,0x00,
+0x05,0x40,0x6d,0x65,0x74,0x68,0x00,0x00,0x03,0x64,0x75,0x70,0x00,0x00,0x05,0x40,
+0x61,0x72,0x67,0x73,0x00,0x00,0x04,0x40,0x66,0x69,0x62,0x00,0x00,0x04,0x40,0x64,
+0x73,0x74,0x00,0x00,0x0a,0x40,0x6c,0x6f,0x6f,0x6b,0x61,0x68,0x65,0x61,0x64,0x00,
+0x00,0x0a,0x40,0x66,0x65,0x65,0x64,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x09,0x40,
+0x73,0x74,0x6f,0x70,0x5f,0x65,0x78,0x63,0x00,0x00,0x00,0x01,0x69,0x00,0x03,0x00,
+0x08,0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x26,0x00,0x00,0x02,0x01,0x40,0x80,0x01,
+0x91,0x00,0x00,0x02,0xa0,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,0x97,0x03,0x40,0x00,
+0x06,0x00,0x80,0x01,0x91,0x01,0x00,0x02,0x3d,0x00,0x80,0x02,0x01,0x40,0x00,0x03,
+0x20,0x00,0x01,0x03,0x3e,0x80,0x81,0x02,0x20,0x81,0x80,0x01,0x01,0x40,0x80,0x01,
+0x20,0x40,0x81,0x01,0x19,0x02,0xc0,0x01,0x06,0x00,0x80,0x01,0x91,0x01,0x00,0x02,
+0x3d,0x01,0x80,0x02,0x20,0x81,0x80,0x01,0x01,0x40,0x80,0x01,0x20,0x80,0x81,0x01,
+0x8e,0x03,0x80,0x01,0x01,0x40,0x80,0x01,0x20,0x00,0x82,0x01,0x8e,0x04,0x80,0x01,
+0x01,0x40,0x80,0x01,0x20,0x80,0x82,0x01,0x8e,0x05,0x80,0x01,0x05,0x00,0x80,0x01,
+0x0e,0x06,0x80,0x01,0x05,0x00,0x80,0x01,0x8e,0x06,0x80,0x01,0x05,0x00,0x80,0x01,
+0x0e,0x07,0x80,0x01,0x06,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x03,
+0x00,0x00,0x10,0x63,0x61,0x6e,0x27,0x74,0x20,0x63,0x6f,0x70,0x79,0x20,0x74,0x79,
+0x70,0x65,0x20,0x00,0x00,0x00,0x00,0x00,0x1c,0x63,0x61,0x6e,0x27,0x74,0x20,0x63,
+0x6f,0x70,0x79,0x20,0x65,0x78,0x65,0x63,0x75,0x74,0x69,0x6f,0x6e,0x20,0x63,0x6f,
+0x6e,0x74,0x65,0x78,0x74,0x00,0x00,0x00,0x0f,0x00,0x08,0x6b,0x69,0x6e,0x64,0x5f,
+0x6f,0x66,0x3f,0x00,0x00,0x0a,0x45,0x6e,0x75,0x6d,0x65,0x72,0x61,0x74,0x6f,0x72,
+0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,0x70,0x65,0x45,
+0x72,0x72,0x6f,0x72,0x00,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x03,0x66,
+0x69,0x62,0x00,0x00,0x03,0x6f,0x62,0x6a,0x00,0x00,0x04,0x40,0x6f,0x62,0x6a,0x00,
+0x00,0x04,0x6d,0x65,0x74,0x68,0x00,0x00,0x05,0x40,0x6d,0x65,0x74,0x68,0x00,0x00,
+0x04,0x61,0x72,0x67,0x73,0x00,0x00,0x05,0x40,0x61,0x72,0x67,0x73,0x00,0x00,0x04,
+0x40,0x66,0x69,0x62,0x00,0x00,0x0a,0x40,0x6c,0x6f,0x6f,0x6b,0x61,0x68,0x65,0x61,
+0x64,0x00,0x00,0x0a,0x40,0x66,0x65,0x65,0x64,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,
+0x00,0x01,0x48,0x00,0x04,0x00,0x09,0x00,0x01,0x00,0x00,0x00,0x23,0x00,0x00,0x00,
+0x26,0x00,0x10,0x00,0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,0x83,0xff,0xbf,0x00,
+0x06,0x00,0x00,0x02,0x20,0x00,0x00,0x02,0x99,0x00,0x40,0x02,0x97,0x02,0x40,0x00,
+0x06,0x00,0x00,0x02,0x04,0x01,0x80,0x02,0x01,0x40,0x00,0x03,0x20,0x41,0x00,0x02,
+0x29,0x00,0x00,0x02,0x01,0x40,0x00,0x02,0x04,0x02,0x80,0x02,0xa0,0xc0,0x00,0x02,
+0x99,0x00,0x40,0x02,0x97,0x04,0x40,0x00,0x06,0x00,0x00,0x02,0x11,0x03,0x80,0x02,
+0x3d,0x00,0x00,0x03,0x01,0x40,0x80,0x03,0x20,0xc0,0x81,0x03,0x3e,0xc0,0x01,0x03,
+0xbd,0x00,0x80,0x03,0x3e,0xc0,0x01,0x03,0x20,0x41,0x01,0x02,0x01,0x40,0x00,0x02,
+0x20,0x00,0x01,0x02,0xaf,0x00,0x02,0x02,0x01,0x00,0x81,0x01,0x06,0x00,0x00,0x02,
+0x40,0x01,0x80,0x02,0x21,0x40,0x02,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x02,
+0x00,0x00,0x1a,0x6e,0x6f,0x20,0x69,0x6d,0x70,0x6c,0x69,0x63,0x69,0x74,0x20,0x63,
+0x6f,0x6e,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x6f,0x66,0x20,0x00,0x00,0x0d,
+0x20,0x69,0x6e,0x74,0x6f,0x20,0x49,0x6e,0x74,0x65,0x67,0x65,0x72,0x00,0x00,0x00,
+0x0a,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,
+0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x0a,0x77,0x69,0x74,0x68,
+0x5f,0x69,0x6e,0x64,0x65,0x78,0x00,0x00,0x0b,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,
+0x5f,0x74,0x6f,0x3f,0x00,0x00,0x06,0x74,0x6f,0x5f,0x69,0x6e,0x74,0x00,0x00,0x05,
+0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,0x70,0x65,0x45,0x72,0x72,0x6f,
+0x72,0x00,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x01,0x2d,0x00,0x00,0x15,
+0x65,0x6e,0x75,0x6d,0x65,0x72,0x61,0x74,0x6f,0x72,0x5f,0x62,0x6c,0x6f,0x63,0x6b,
+0x5f,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x4d,0x00,0x03,0x00,0x06,0x00,0x00,
+0x00,0x00,0x00,0x0a,0x26,0x00,0x00,0x02,0x15,0xc0,0x80,0x01,0xad,0x00,0x80,0x01,
+0x16,0xc0,0x80,0x01,0xab,0x00,0x82,0x01,0x01,0x40,0x00,0x02,0x15,0xc0,0x80,0x02,
+0x37,0x01,0x01,0x02,0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x01,0x2b,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x00,0x00,0x37,0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+0x26,0x00,0x00,0x00,0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0a,0x77,0x69,0x74,0x68,0x5f,0x69,
+0x6e,0x64,0x65,0x78,0x00,0x00,0x00,0x00,0x91,0x00,0x03,0x00,0x07,0x00,0x01,0x00,
+0x00,0x00,0x0e,0x00,0x26,0x00,0x00,0x02,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,
+0x99,0x00,0xc0,0x01,0x97,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x04,0x01,0x00,0x02,
+0x01,0x40,0x80,0x02,0x20,0x41,0x80,0x01,0x29,0x00,0x80,0x01,0x06,0x00,0x80,0x01,
+0x40,0x01,0x00,0x02,0x21,0xc0,0x80,0x01,0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x04,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,
+0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x0b,0x77,
+0x69,0x74,0x68,0x5f,0x6f,0x62,0x6a,0x65,0x63,0x74,0x00,0x00,0x15,0x65,0x6e,0x75,
+0x6d,0x65,0x72,0x61,0x74,0x6f,0x72,0x5f,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x63,0x61,
+0x6c,0x6c,0x00,0x00,0x00,0x00,0x3d,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,
+0x07,0x00,0x00,0x00,0x26,0x00,0x00,0x02,0xab,0x00,0x82,0x01,0x01,0x40,0x00,0x02,
+0x15,0x40,0x80,0x02,0x37,0x01,0x01,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x00,0x01,0x5e,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,
+0x26,0x00,0x00,0x00,0x0d,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,0x97,0x03,0x40,0x00,
+0x3d,0x00,0x80,0x01,0x06,0x00,0x00,0x02,0x20,0x40,0x00,0x02,0x3e,0x00,0x81,0x01,
+0xbd,0x00,0x00,0x02,0x3e,0x00,0x81,0x01,0x29,0x00,0x80,0x01,0x0d,0x01,0x80,0x01,
+0x19,0x02,0xc0,0x01,0x0d,0x01,0x80,0x01,0x20,0xc0,0x80,0x01,0x83,0xff,0x3f,0x02,
+0xb5,0x00,0x81,0x01,0x99,0x0b,0xc0,0x01,0x0d,0x01,0x80,0x01,0x3d,0x01,0x00,0x02,
+0xa0,0x40,0x81,0x01,0x01,0xc0,0x00,0x01,0x3d,0x00,0x80,0x01,0x06,0x00,0x00,0x02,
+0x20,0x40,0x00,0x02,0x3e,0x00,0x81,0x01,0xbd,0x01,0x00,0x02,0x3e,0x00,0x81,0x01,
+0x0d,0x00,0x00,0x02,0x3e,0x00,0x81,0x01,0x3d,0x02,0x00,0x02,0x3e,0x00,0x81,0x01,
+0x0d,0x03,0x00,0x02,0x3e,0x00,0x81,0x01,0xbd,0x02,0x00,0x02,0x3e,0x00,0x81,0x01,
+0x01,0x80,0x00,0x02,0x3e,0x00,0x81,0x01,0x3d,0x03,0x00,0x02,0x3e,0x00,0x81,0x01,
+0x17,0x07,0x40,0x00,0x3d,0x00,0x80,0x01,0x06,0x00,0x00,0x02,0x20,0x40,0x00,0x02,
+0x3e,0x00,0x81,0x01,0xbd,0x01,0x00,0x02,0x3e,0x00,0x81,0x01,0x0d,0x00,0x00,0x02,
+0x3e,0x00,0x81,0x01,0x3d,0x02,0x00,0x02,0x3e,0x00,0x81,0x01,0x0d,0x03,0x00,0x02,
+0x3e,0x00,0x81,0x01,0xbd,0x03,0x00,0x02,0x3e,0x00,0x81,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x08,0x00,0x00,0x02,0x23,0x3c,0x00,0x00,0x10,0x3a,0x20,0x75,0x6e,
+0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x64,0x3e,0x00,0x00,0x02,0x2c,
+0x20,0x00,0x00,0x02,0x3a,0x20,0x00,0x00,0x01,0x3a,0x00,0x00,0x01,0x28,0x00,0x00,
+0x02,0x29,0x3e,0x00,0x00,0x01,0x3e,0x00,0x00,0x00,0x07,0x00,0x04,0x40,0x6f,0x62,
+0x6a,0x00,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x05,0x40,0x61,0x72,0x67,
+0x73,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01,0x3e,0x00,0x00,0x04,0x6a,
+0x6f,0x69,0x6e,0x00,0x00,0x05,0x40,0x6d,0x65,0x74,0x68,0x00,0x00,0x00,0x01,0x0d,
+0x00,0x05,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0xa6,0x00,0x08,0x00,
+0x06,0x00,0x80,0x01,0x83,0xff,0xbf,0x02,0x01,0x40,0x00,0x03,0x20,0x40,0x00,0x03,
+0xb3,0x00,0x80,0x02,0x99,0x0a,0xc0,0x02,0x06,0x00,0x80,0x02,0x20,0x80,0x80,0x02,
+0x01,0x40,0x81,0x01,0x20,0xc0,0x80,0x02,0x01,0x40,0x01,0x02,0x20,0x00,0x81,0x02,
+0x20,0x40,0x81,0x02,0x19,0x03,0xc0,0x02,0x01,0x00,0x81,0x02,0x20,0x80,0x80,0x02,
+0x01,0x40,0x01,0x02,0x01,0x40,0x00,0x03,0xa0,0x80,0x81,0x02,0x97,0x01,0x40,0x00,
+0x01,0x40,0x80,0x02,0x20,0x80,0x80,0x02,0x01,0x40,0x01,0x02,0x01,0x00,0x81,0x02,
+0x01,0xc0,0x00,0x03,0x01,0x40,0x81,0x03,0xa0,0xc0,0x01,0x03,0x06,0x00,0x80,0x02,
+0x20,0x00,0x82,0x02,0x99,0x00,0xc0,0x02,0x97,0x00,0x40,0x00,0x29,0x00,0x80,0x01,
+0x06,0x00,0x80,0x02,0x01,0x80,0x00,0x03,0x21,0x40,0x82,0x02,0x29,0x00,0x80,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x01,0x3c,0x00,0x00,0x06,0x6c,0x65,
+0x6e,0x67,0x74,0x68,0x00,0x00,0x03,0x64,0x75,0x70,0x00,0x00,0x04,0x61,0x72,0x67,
+0x73,0x00,0x00,0x06,0x65,0x6d,0x70,0x74,0x79,0x3f,0x00,0x00,0x01,0x21,0x00,0x00,
+0x06,0x63,0x6f,0x6e,0x63,0x61,0x74,0x00,0x00,0x05,0x61,0x72,0x67,0x73,0x3d,0x00,
+0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,
+0x15,0x65,0x6e,0x75,0x6d,0x65,0x72,0x61,0x74,0x6f,0x72,0x5f,0x62,0x6c,0x6f,0x63,
+0x6b,0x5f,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x60,0x00,0x02,0x00,0x05,0x00,
+0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x0d,0x00,0x00,0x01,
+0x0d,0x01,0x80,0x01,0xb7,0xc0,0x80,0x01,0x8d,0x01,0x00,0x02,0x38,0x00,0x81,0x01,
+0x01,0x40,0x00,0x02,0xa1,0x7f,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x04,0x00,0x04,0x40,0x6f,0x62,0x6a,0x00,0x00,0x08,0x5f,0x5f,0x73,
+0x65,0x6e,0x64,0x5f,0x5f,0x00,0x00,0x05,0x40,0x6d,0x65,0x74,0x68,0x00,0x00,0x05,
+0x40,0x61,0x72,0x67,0x73,0x00,0x00,0x00,0x00,0x47,0x00,0x02,0x00,0x04,0x00,0x00,
+0x00,0x00,0x00,0x05,0x26,0x00,0x00,0x00,0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,
+0x20,0x40,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x0b,0x6e,0x65,0x78,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x00,0x00,0x08,
+0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x01,0x40,0x00,0x04,0x00,
+0x07,0x00,0x01,0x00,0x00,0x00,0x2f,0x00,0x26,0x00,0x00,0x00,0x0d,0x00,0x00,0x02,
+0x19,0x02,0x40,0x02,0x0d,0x00,0x00,0x01,0x05,0x00,0x00,0x02,0x0e,0x00,0x00,0x02,
+0x29,0x00,0x00,0x01,0x8d,0x00,0x00,0x02,0x99,0x01,0x40,0x02,0x06,0x00,0x00,0x02,
+0x8d,0x00,0x80,0x02,0xa0,0x80,0x00,0x02,0x91,0x01,0x00,0x02,0x20,0x00,0x01,0x02,
+0x01,0x00,0x81,0x01,0x8d,0x02,0x00,0x02,0x20,0x80,0x01,0x02,0x98,0x01,0x40,0x02,
+0x8d,0x02,0x00,0x02,0x20,0xc0,0x01,0x02,0x20,0x80,0x01,0x02,0x99,0x03,0x40,0x02,
+0x0e,0x04,0x80,0x01,0x91,0x01,0x00,0x02,0x40,0x01,0x80,0x02,0x21,0x40,0x02,0x02,
+0x8e,0x02,0x00,0x02,0x05,0x00,0x00,0x02,0x0e,0x00,0x00,0x02,0x8d,0x02,0x00,0x02,
+0x01,0xc0,0x80,0x02,0xa0,0x80,0x02,0x02,0x01,0x00,0x01,0x01,0x8d,0x00,0x00,0x02,
+0x99,0x05,0x40,0x02,0x05,0x00,0x00,0x02,0x8e,0x02,0x00,0x02,0x05,0x00,0x00,0x02,
+0x0e,0x04,0x00,0x02,0x05,0x00,0x00,0x02,0x0e,0x00,0x00,0x02,0x05,0x00,0x00,0x02,
+0x8e,0x05,0x00,0x02,0x06,0x00,0x00,0x02,0x8d,0x00,0x80,0x02,0xa0,0x80,0x00,0x02,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x0a,0x40,0x6c,
+0x6f,0x6f,0x6b,0x61,0x68,0x65,0x61,0x64,0x00,0x00,0x09,0x40,0x73,0x74,0x6f,0x70,
+0x5f,0x65,0x78,0x63,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x05,0x46,
+0x69,0x62,0x65,0x72,0x00,0x00,0x07,0x63,0x75,0x72,0x72,0x65,0x6e,0x74,0x00,0x00,
+0x04,0x40,0x66,0x69,0x62,0x00,0x00,0x01,0x21,0x00,0x00,0x06,0x61,0x6c,0x69,0x76,
+0x65,0x3f,0x00,0x00,0x04,0x40,0x64,0x73,0x74,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,
+0x00,0x06,0x72,0x65,0x73,0x75,0x6d,0x65,0x00,0x00,0x0a,0x40,0x66,0x65,0x65,0x64,
+0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x00,0xb8,0x00,0x02,0x00,0x06,0x00,0x01,
+0x00,0x00,0x00,0x10,0x06,0x00,0x00,0x01,0x40,0x01,0x80,0x01,0x21,0x00,0x00,0x01,
+0x01,0x80,0x80,0x00,0x91,0x00,0x00,0x01,0x3d,0x00,0x80,0x01,0xa0,0x80,0x00,0x01,
+0x8e,0x01,0x00,0x01,0x01,0x40,0x00,0x01,0x8d,0x01,0x80,0x01,0x01,0x80,0x00,0x02,
+0xa0,0x00,0x81,0x01,0x91,0x02,0x00,0x01,0x05,0x00,0x80,0x01,0xa0,0x80,0x01,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x18,0x69,0x74,0x65,0x72,0x61,
+0x74,0x69,0x6f,0x6e,0x20,0x72,0x65,0x61,0x63,0x68,0x65,0x64,0x20,0x61,0x6e,0x20,
+0x65,0x6e,0x64,0x00,0x00,0x00,0x07,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x0d,
+0x53,0x74,0x6f,0x70,0x49,0x74,0x65,0x72,0x61,0x74,0x69,0x6f,0x6e,0x00,0x00,0x03,
+0x6e,0x65,0x77,0x00,0x00,0x09,0x40,0x73,0x74,0x6f,0x70,0x5f,0x65,0x78,0x63,0x00,
+0x00,0x07,0x72,0x65,0x73,0x75,0x6c,0x74,0x3d,0x00,0x00,0x05,0x46,0x69,0x62,0x65,
+0x72,0x00,0x00,0x05,0x79,0x69,0x65,0x6c,0x64,0x00,0x00,0x00,0x00,0x63,0x00,0x04,
+0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x0b,0x26,0x00,0x08,0x00,0x05,0x00,0x80,0x01,
+0x11,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x40,0x00,0x02,0x0d,0x01,0x00,0x02,
+0x99,0x01,0x40,0x02,0x0d,0x01,0x80,0x01,0x05,0x00,0x00,0x02,0x0e,0x01,0x00,0x02,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x05,0x46,0x69,
+0x62,0x65,0x72,0x00,0x00,0x05,0x79,0x69,0x65,0x6c,0x64,0x00,0x00,0x0a,0x40,0x66,
+0x65,0x65,0x64,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x00,0x47,0x00,0x02,0x00,
+0x04,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x26,0x00,0x00,0x00,0x06,0x00,0x00,0x01,
+0x20,0x00,0x00,0x01,0x20,0x40,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x0b,0x70,0x65,0x65,0x6b,0x5f,0x76,0x61,0x6c,0x75,0x65,
+0x73,0x00,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x00,
+0x6a,0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x26,0x00,0x00,0x00,
+0x0d,0x00,0x00,0x01,0x20,0x40,0x00,0x01,0x99,0x01,0x40,0x01,0x06,0x00,0x00,0x01,
+0x20,0x80,0x00,0x01,0x0e,0x00,0x00,0x01,0x0d,0x00,0x00,0x01,0x20,0xc0,0x00,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0a,0x40,0x6c,
+0x6f,0x6f,0x6b,0x61,0x68,0x65,0x61,0x64,0x00,0x00,0x04,0x6e,0x69,0x6c,0x3f,0x00,
+0x00,0x0b,0x6e,0x65,0x78,0x74,0x5f,0x76,0x61,0x6c,0x75,0x65,0x73,0x00,0x00,0x03,
+0x64,0x75,0x70,0x00,0x00,0x00,0x00,0xb8,0x00,0x02,0x00,0x05,0x00,0x00,0x00,0x00,
+0x00,0x13,0x00,0x00,0x26,0x00,0x00,0x00,0x0d,0x00,0x00,0x01,0x04,0x01,0x80,0x01,
+0xa0,0x40,0x00,0x01,0x19,0x01,0x40,0x01,0x0d,0x00,0x00,0x01,0x20,0x80,0x00,0x01,
+0x05,0x00,0x00,0x01,0x8e,0x01,0x00,0x01,0x05,0x00,0x00,0x01,0x0e,0x02,0x00,0x01,
+0x05,0x00,0x00,0x01,0x8e,0x02,0x00,0x01,0x05,0x00,0x00,0x01,0x0e,0x03,0x00,0x01,
+0x08,0x00,0x00,0x01,0x8e,0x03,0x00,0x01,0x06,0x00,0x00,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x04,0x40,0x6f,0x62,0x6a,0x00,0x00,
+0x0b,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x5f,0x74,0x6f,0x3f,0x00,0x00,0x06,0x72,
+0x65,0x77,0x69,0x6e,0x64,0x00,0x00,0x04,0x40,0x66,0x69,0x62,0x00,0x00,0x04,0x40,
+0x64,0x73,0x74,0x00,0x00,0x0a,0x40,0x6c,0x6f,0x6f,0x6b,0x61,0x68,0x65,0x61,0x64,
+0x00,0x00,0x0a,0x40,0x66,0x65,0x65,0x64,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x09,
+0x40,0x73,0x74,0x6f,0x70,0x5f,0x65,0x78,0x63,0x00,0x00,0x00,0x00,0x7c,0x00,0x03,
+0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x0a,0x26,0x00,0x00,0x02,0x0d,0x00,0x80,0x01,
+0x19,0x02,0xc0,0x01,0x06,0x00,0x80,0x01,0x11,0x01,0x00,0x02,0x3d,0x00,0x80,0x02,
+0x20,0x41,0x80,0x01,0x0e,0x00,0x80,0x00,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x01,0x00,0x00,0x16,0x66,0x65,0x65,0x64,0x20,0x76,0x61,0x6c,0x75,
+0x65,0x20,0x61,0x6c,0x72,0x65,0x61,0x64,0x79,0x20,0x73,0x65,0x74,0x00,0x00,0x00,
+0x03,0x00,0x0a,0x40,0x66,0x65,0x65,0x64,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x05,
+0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,0x70,0x65,0x45,0x72,0x72,0x6f,
+0x72,0x00,0x00,0x00,0x00,0x4e,0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x00,0x00,0x08,
+0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,0x84,0x00,0x80,0x00,0x29,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x69,0x6e,0x69,0x74,0x69,0x61,
+0x6c,0x69,0x7a,0x65,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0xbe,
+0x00,0x02,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x00,0xa6,0x00,0x00,0x00,
+0x01,0x40,0x00,0x01,0x91,0x00,0x80,0x01,0xa0,0x00,0x00,0x01,0x99,0x00,0x40,0x01,
+0x97,0x04,0x40,0x00,0x06,0x00,0x00,0x01,0x91,0x01,0x80,0x01,0x3d,0x00,0x00,0x02,
+0x06,0x00,0x80,0x02,0x20,0x00,0x81,0x02,0x3e,0x40,0x01,0x02,0xbd,0x00,0x80,0x02,
+0x3e,0x40,0x01,0x02,0x20,0x81,0x00,0x01,0x8e,0x02,0x80,0x00,0x29,0x00,0x80,0x00,
+0x00,0x00,0x00,0x02,0x00,0x00,0x14,0x77,0x72,0x6f,0x6e,0x67,0x20,0x61,0x72,0x67,
+0x75,0x6d,0x65,0x6e,0x74,0x20,0x74,0x79,0x70,0x65,0x20,0x00,0x00,0x10,0x20,0x28,
+0x65,0x78,0x70,0x65,0x63,0x74,0x65,0x64,0x20,0x50,0x72,0x6f,0x63,0x29,0x00,0x00,
+0x00,0x06,0x00,0x08,0x6b,0x69,0x6e,0x64,0x5f,0x6f,0x66,0x3f,0x00,0x00,0x04,0x50,
+0x72,0x6f,0x63,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,
+0x70,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,
+0x00,0x05,0x40,0x70,0x72,0x6f,0x63,0x00,0x00,0x00,0x00,0x73,0x00,0x03,0x00,0x06,
+0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0xa6,0x00,0x08,0x00,0x01,0x40,0x80,0x01,
+0x91,0x00,0x00,0x02,0x01,0x80,0x80,0x02,0x21,0x80,0x00,0x02,0xa0,0x00,0x80,0x01,
+0x8d,0x01,0x80,0x01,0x37,0x00,0x01,0x02,0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,
+0xa0,0x3f,0x81,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,
+0x00,0x07,0x75,0x6e,0x73,0x68,0x69,0x66,0x74,0x00,0x00,0x07,0x59,0x69,0x65,0x6c,
+0x64,0x65,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x05,0x40,0x70,0x72,0x6f,
+0x63,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x60,0x00,0x01,0x00,
+0x03,0x00,0x03,0x00,0x00,0x00,0x0b,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,
+0x46,0x00,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x04,0x00,0x01,0x46,0x80,0x80,0x00,0x04,0x01,0x80,0x00,
+0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x0a,0x69,0x6e,
+0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x05,0x79,0x69,0x65,0x6c,0x64,
+0x00,0x00,0x02,0x3c,0x3c,0x00,0x00,0x00,0x00,0x87,0x00,0x02,0x00,0x06,0x00,0x00,
+0x00,0x00,0x00,0x0b,0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,
+0x99,0x00,0x40,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x00,0x01,0x11,0x01,0x80,0x01,
+0x3d,0x00,0x00,0x02,0x20,0x41,0x00,0x01,0x8e,0x01,0x80,0x00,0x29,0x00,0x80,0x00,
+0x00,0x00,0x00,0x01,0x00,0x00,0x0e,0x6e,0x6f,0x20,0x62,0x6c,0x6f,0x63,0x6b,0x20,
+0x67,0x69,0x76,0x65,0x6e,0x00,0x00,0x00,0x04,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,
+0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,
+0x00,0x0e,0x4c,0x6f,0x63,0x61,0x6c,0x4a,0x75,0x6d,0x70,0x45,0x72,0x72,0x6f,0x72,
+0x00,0x00,0x05,0x40,0x70,0x72,0x6f,0x63,0x00,0x00,0x00,0x00,0x45,0x00,0x03,0x00,
+0x06,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x26,0x00,0x08,0x00,0x0d,0x00,0x80,0x01,
+0x37,0x00,0x01,0x02,0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x7f,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x40,0x70,
+0x72,0x6f,0x63,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x42,0x00,
+0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x26,0x00,0x08,0x00,
+0x06,0x00,0x80,0x01,0x37,0x00,0x01,0x02,0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,
+0xa0,0x3f,0x80,0x01,0x06,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x05,0x79,0x69,0x65,0x6c,0x64,0x00,0x00,0x00,0x00,0x62,
+0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x09,0x00,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,0x48,0x00,0x80,0x00,0x84,0x00,0x00,0x01,
+0x04,0x00,0x80,0x01,0x05,0x00,0x00,0x02,0x20,0x81,0x80,0x00,0x29,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,
+0x6d,0x00,0x00,0x08,0x65,0x6e,0x75,0x6d,0x5f,0x66,0x6f,0x72,0x00,0x00,0x0c,0x61,
+0x6c,0x69,0x61,0x73,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x00,0x00,0x64,
+0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x26,0x00,0x18,0x00,
+0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,0x04,0x00,0x80,0x00,0x91,0x00,0x00,0x02,
+0x06,0x00,0x80,0x02,0x01,0x40,0x00,0x03,0x37,0x41,0x81,0x02,0x01,0x80,0x00,0x03,
+0x38,0x80,0x81,0x02,0xa0,0xbf,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x0a,0x45,0x6e,0x75,
+0x6d,0x65,0x72,0x61,0x74,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x00,
+0x00,0x34,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,0x48,0x00,0x80,0x00,
+0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,0x04,0x00,0x80,0x00,0x29,0x00,0x80,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x7a,0x69,0x70,0x00,0x00,0x00,
+0x00,0x53,0x00,0x05,0x00,0x07,0x00,0x02,0x00,0x00,0x00,0x0b,0x26,0x00,0x08,0x00,
+0x37,0x40,0x81,0x01,0x01,0x40,0x80,0x02,0x40,0x01,0x00,0x03,0x21,0x00,0x80,0x02,
+0x01,0x40,0x81,0x00,0x83,0xff,0x3f,0x02,0x06,0x00,0x80,0x02,0x40,0x03,0x00,0x03,
+0x21,0x40,0x80,0x02,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x03,0x6d,0x61,0x70,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,
+0x31,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x26,0x00,0x00,0x02,
+0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x01,0x09,0x00,
+0x05,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x26,0x00,0x08,0x00,
+0x37,0x40,0x81,0x01,0x01,0xc0,0x80,0x02,0x01,0x40,0x00,0x03,0x20,0x40,0x00,0x03,
+0xa0,0x00,0x80,0x02,0x83,0xff,0x3f,0x02,0x97,0x0b,0x40,0x00,0x9a,0x03,0x40,0x00,
+0x01,0xc0,0x80,0x02,0x15,0x40,0x00,0x03,0x01,0x00,0x81,0x03,0xa0,0x80,0x00,0x03,
+0x20,0xc0,0x00,0x03,0xa0,0x00,0x80,0x02,0x97,0x05,0x40,0x00,0x1b,0x00,0x80,0x02,
+0x11,0x02,0x00,0x03,0x01,0x40,0x81,0x03,0xa0,0x40,0x01,0x03,0x98,0x00,0x40,0x03,
+0x17,0x02,0x40,0x00,0x01,0xc0,0x80,0x02,0x05,0x00,0x00,0x03,0xa0,0x00,0x80,0x02,
+0x17,0x01,0x40,0x00,0x1d,0x00,0x80,0x02,0x1c,0x00,0x80,0x00,0x01,0x00,0x81,0x02,
+0xad,0x80,0x81,0x02,0x01,0x40,0x01,0x02,0x01,0x00,0x81,0x02,0x15,0x40,0x00,0x03,
+0x20,0x00,0x02,0x03,0xb3,0xc0,0x81,0x02,0x18,0xf2,0xbf,0x02,0x15,0xc0,0x80,0x02,
+0x01,0xc0,0x00,0x03,0xa0,0x00,0x80,0x02,0x15,0x00,0x81,0x02,0xad,0x80,0x81,0x02,
+0x16,0x00,0x81,0x02,0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,
+0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,
+0x65,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x04,0x6e,0x65,0x78,0x74,0x00,0x00,0x0d,
+0x53,0x74,0x6f,0x70,0x49,0x74,0x65,0x72,0x61,0x74,0x69,0x6f,0x6e,0x00,0x00,0x03,
+0x3d,0x3d,0x3d,0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x3c,0x00,0x00,0x04,0x73,0x69,
+0x7a,0x65,0x00,0x4c,0x56,0x41,0x52,0x00,0x00,0x01,0x5f,0x00,0x00,0x00,0x13,0x00,
+0x03,0x6f,0x62,0x6a,0x00,0x04,0x6d,0x65,0x74,0x68,0x00,0x04,0x61,0x72,0x67,0x73,
+0x00,0x05,0x62,0x6c,0x6f,0x63,0x6b,0x00,0x06,0x6f,0x66,0x66,0x73,0x65,0x74,0x00,
+0x01,0x6e,0x00,0x01,0x69,0x00,0x06,0x6f,0x62,0x6a,0x65,0x63,0x74,0x00,0x04,0x61,
+0x72,0x67,0x76,0x00,0x02,0x76,0x73,0x00,0x04,0x63,0x75,0x72,0x72,0x00,0x06,0x72,
+0x65,0x73,0x75,0x6c,0x74,0x00,0x09,0x66,0x65,0x65,0x64,0x76,0x61,0x6c,0x75,0x65,
+0x00,0x05,0x76,0x61,0x6c,0x75,0x65,0x00,0x03,0x61,0x72,0x67,0x00,0x03,0x61,0x72,
+0x79,0x00,0x01,0x61,0x00,0x03,0x76,0x61,0x6c,0x00,0x03,0x69,0x64,0x78,0x00,0x00,
+0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x03,0x00,0x03,0x00,0x04,0x00,0x00,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x05,
+0x00,0x03,0x00,0x06,0x00,0x01,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x07,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x06,0x00,0x01,0xff,0xff,0x00,0x00,0xff,0xff,
+0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x08,0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x00,
+0x00,0x03,0x00,0x02,0x00,0x04,0x00,0x03,0x00,0x01,0xff,0xff,0x00,0x00,0xff,0xff,
+0x00,0x00,0x00,0x09,0x00,0x02,0x00,0x0a,0x00,0x03,0x00,0x0b,0x00,0x01,0x00,0x02,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0c,0x00,0x03,0xff,0xff,0x00,0x00,0xff,0xff,
+0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x0d,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x03,
+0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x03,0x00,0x01,0x00,0x02,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x02,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x01,
+0x00,0x01,0x00,0x02,0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x0e,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x0f,0x00,0x03,0x00,0x06,0x00,0x04,0x00,0x10,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x11,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x10,0x00,0x03,0x00,0x12,
+0x00,0x04,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08,
+};
+void mrb_mruby_enumerator_gem_init(mrb_state *mrb);
+void mrb_mruby_enumerator_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_enumerator_gem_init(mrb_state *mrb) {
+  int ai = mrb_gc_arena_save(mrb);
+  mrb_load_irep(mrb, gem_mrblib_irep_mruby_enumerator);
+  if (mrb->exc) {
+    mrb_print_error(mrb);
+    exit(EXIT_FAILURE);
+  }
+  mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_enumerator_gem_final(mrb_state *mrb) {
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-eval/eval.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,239 @@
+#include "mruby.h"
+#include "mruby/class.h"
+#include "mruby/compile.h"
+#include "mruby/irep.h"
+#include "mruby/proc.h"
+#include "mruby/opcode.h"
+
+static struct mrb_irep *
+get_closure_irep(mrb_state *mrb, int level)
+{
+  struct REnv *e = mrb->c->ci[-1].proc->env;
+  struct RProc *proc;
+
+  if (level == 0) {
+    proc = mrb->c->ci[-1].proc;
+    if (MRB_PROC_CFUNC_P(proc)) {
+      return NULL;
+    }
+    return proc->body.irep;
+  }
+
+  while (--level) {
+    e = (struct REnv*)e->c;
+    if (!e) return NULL;
+  }
+
+  if (!e) return NULL;
+  proc = mrb->c->cibase[e->cioff].proc;
+
+  if (MRB_PROC_CFUNC_P(proc)) {
+    return NULL;
+  }
+  return proc->body.irep;
+}
+
+static inline mrb_code
+search_variable(mrb_state *mrb, mrb_sym vsym, int bnest)
+{
+  mrb_irep *virep;
+  int level;
+  int pos;
+
+  for (level = 0; (virep = get_closure_irep(mrb, level)); level++) {
+    if (!virep || virep->lv == NULL) {
+      continue;
+    }
+    for (pos = 0; pos < virep->nlocals - 1; pos++) {
+      if (vsym == virep->lv[pos].name) {
+        return (MKARG_B(pos + 1) | MKARG_C(level + bnest));
+      }
+    }
+  }
+
+  return 0;
+}
+
+
+static void
+patch_irep(mrb_state *mrb, mrb_irep *irep, int bnest)
+{
+  size_t i;
+  mrb_code c;
+
+  for (i = 0; i < irep->ilen; i++) {
+    c = irep->iseq[i];
+    switch(GET_OPCODE(c)){
+    case OP_EPUSH:
+      patch_irep(mrb, irep->reps[GETARG_Bx(c)], bnest + 1);
+      break;
+
+    case OP_LAMBDA:
+      {
+        int arg_c = GETARG_c(c);
+        if (arg_c & OP_L_CAPTURE) {
+          patch_irep(mrb, irep->reps[GETARG_b(c)], bnest + 1);
+        }
+      }
+      break;
+
+    case OP_SEND:
+      if (GETARG_C(c) != 0) {
+        break;
+      }
+      {
+        mrb_code arg = search_variable(mrb, irep->syms[GETARG_B(c)], bnest);
+        if (arg != 0) {
+          /* must replace */
+          irep->iseq[i] = MKOPCODE(OP_GETUPVAR) | MKARG_A(GETARG_A(c)) | arg;
+        }
+      }
+      break;
+
+    case OP_MOVE:
+      /* src part */
+      if (GETARG_B(c) < irep->nlocals) {
+        mrb_code arg = search_variable(mrb, irep->lv[GETARG_B(c) - 1].name, bnest);
+        if (arg != 0) {
+          /* must replace */
+          irep->iseq[i] = MKOPCODE(OP_GETUPVAR) | MKARG_A(GETARG_A(c)) | arg;
+        }
+      }
+      /* dst part */
+      if (GETARG_A(c) < irep->nlocals) {
+        mrb_code arg = search_variable(mrb, irep->lv[GETARG_A(c) - 1].name, bnest);
+        if (arg != 0) {
+          /* must replace */
+          irep->iseq[i] = MKOPCODE(OP_SETUPVAR) | MKARG_A(GETARG_B(c)) | arg;
+        }
+      }
+      break;
+    }
+  }
+}
+
+static struct RProc*
+create_proc_from_string(mrb_state *mrb, char *s, int len, mrb_value binding, char *file, mrb_int line)
+{
+  mrbc_context *cxt;
+  struct mrb_parser_state *p;
+  struct RProc *proc;
+  struct REnv *e;
+
+  if (!mrb_nil_p(binding)) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "Binding of eval must be nil.");
+  }
+
+  cxt = mrbc_context_new(mrb);
+  cxt->lineno = line;
+  if (file) {
+    mrbc_filename(mrb, cxt, file);
+  }
+  cxt->capture_errors = TRUE;
+
+  p = mrb_parse_nstring(mrb, s, len, cxt);
+
+  /* only occur when memory ran out */
+  if (!p) {
+    mrb_raise(mrb, E_RUNTIME_ERROR, "Failed to create parser state.");
+  }
+
+  if (0 < p->nerr) {
+    /* parse error */
+    char buf[256];
+    int n;
+    n = snprintf(buf, sizeof(buf), "line %d: %s\n", p->error_buffer[0].lineno, p->error_buffer[0].message);
+    mrb_parser_free(p);
+    mrbc_context_free(mrb, cxt);
+    mrb_exc_raise(mrb, mrb_exc_new(mrb, E_SYNTAX_ERROR, buf, n));
+  }
+
+  proc = mrb_generate_code(mrb, p);
+  if (proc == NULL) {
+    /* codegen error */
+    mrb_parser_free(p);
+    mrbc_context_free(mrb, cxt);
+    mrb_raise(mrb, E_SCRIPT_ERROR, "codegen error");
+  }
+  if (mrb->c->ci[-1].proc->target_class) {
+    proc->target_class = mrb->c->ci[-1].proc->target_class;
+  }
+  e = (struct REnv*)mrb_obj_alloc(mrb, MRB_TT_ENV, (struct RClass*)mrb->c->ci[-1].proc->env);
+  e->mid = mrb->c->ci[-1].mid;
+  e->cioff = mrb->c->ci - mrb->c->cibase - 1;
+  e->stack = mrb->c->ci->stackent;
+  mrb->c->ci->env = e;
+  proc->env = e;
+  patch_irep(mrb, proc->body.irep, 0);
+
+  mrb_parser_free(p);
+  mrbc_context_free(mrb, cxt);
+
+  return proc;
+}
+
+static mrb_value
+f_eval(mrb_state *mrb, mrb_value self)
+{
+  char *s;
+  mrb_int len;
+  mrb_value binding = mrb_nil_value();
+  char *file = NULL;
+  mrb_int line = 1;
+  mrb_value ret;
+  struct RProc *proc;
+
+  mrb_get_args(mrb, "s|ozi", &s, &len, &binding, &file, &line);
+
+  proc = create_proc_from_string(mrb, s, len, binding, file, line);
+  ret = mrb_toplevel_run(mrb, proc);
+  if (mrb->exc) {
+    mrb_exc_raise(mrb, mrb_obj_value(mrb->exc));
+  }
+
+  return ret;
+}
+
+mrb_value mrb_obj_instance_eval(mrb_state *mrb, mrb_value self);
+
+#define CI_ACC_SKIP    -1
+
+static mrb_value
+f_instance_eval(mrb_state *mrb, mrb_value self)
+{
+  mrb_value b;
+  mrb_int argc; mrb_value *argv;
+
+  mrb_get_args(mrb, "*&", &argv, &argc, &b);
+
+  if (mrb_nil_p(b)) {
+    char *s;
+    mrb_int len;
+    char *file = NULL;
+    mrb_int line = 1;
+
+    mrb_get_args(mrb, "s|zi", &s, &len, &file, &line);
+    mrb->c->ci->acc = CI_ACC_SKIP;
+    if (mrb->c->ci->target_class->tt == MRB_TT_ICLASS) {
+      mrb->c->ci->target_class = mrb->c->ci->target_class->c;
+    }
+    return mrb_run(mrb, create_proc_from_string(mrb, s, len, mrb_nil_value(), file, line), self);
+  }
+  else {
+    mrb_get_args(mrb, "&", &b);
+    return mrb_obj_instance_eval(mrb, self);
+  }
+}
+
+void
+mrb_mruby_eval_gem_init(mrb_state* mrb)
+{
+  mrb_define_module_function(mrb, mrb->kernel_module, "eval", f_eval, MRB_ARGS_ARG(1, 3));
+  mrb_define_method(mrb, mrb->kernel_module, "instance_eval", f_instance_eval, MRB_ARGS_ARG(1, 2));
+}
+
+void
+mrb_mruby_eval_gem_final(mrb_state* mrb)
+{
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-eval/gem_init.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,22 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ *   This file was generated!
+ *   All manual changes will get lost.
+ */
+#include "mruby.h"
+void mrb_mruby_eval_gem_init(mrb_state *mrb);
+void mrb_mruby_eval_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_eval_gem_init(mrb_state *mrb) {
+  int ai = mrb_gc_arena_save(mrb);
+  mrb_mruby_eval_gem_init(mrb);
+  mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_eval_gem_final(mrb_state *mrb) {
+  mrb_mruby_eval_gem_final(mrb);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-fiber/fiber.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,381 @@
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/class.h"
+#include "mruby/proc.h"
+
+#define fiber_ptr(o) ((struct RFiber*)mrb_ptr(o))
+
+#define FIBER_STACK_INIT_SIZE 64
+#define FIBER_CI_INIT_SIZE 8
+
+/*
+ *  call-seq:
+ *     Fiber.new{...} -> obj
+ *
+ *  Creates a fiber, whose execution is suspend until it is explicitly
+ *  resumed using <code>Fiber#resume</code> method.
+ *  The code running inside the fiber can give up control by calling
+ *  <code>Fiber.yield</code> in which case it yields control back to caller
+ *  (the caller of the <code>Fiber#resume</code>).
+ *
+ *  Upon yielding or termination the Fiber returns the value of the last
+ *  executed expression
+ *
+ *  For instance:
+ *
+ *    fiber = Fiber.new do
+ *      Fiber.yield 1
+ *      2
+ *    end
+ *
+ *    puts fiber.resume
+ *    puts fiber.resume
+ *    puts fiber.resume
+ *
+ *  <em>produces</em>
+ *
+ *    1
+ *    2
+ *    resuming dead fiber (FiberError)
+ *
+ *  The <code>Fiber#resume</code> method accepts an arbitrary number of
+ *  parameters, if it is the first call to <code>resume</code> then they
+ *  will be passed as block arguments. Otherwise they will be the return
+ *  value of the call to <code>Fiber.yield</code>
+ *
+ *  Example:
+ *
+ *    fiber = Fiber.new do |first|
+ *      second = Fiber.yield first + 2
+ *    end
+ *
+ *    puts fiber.resume 10
+ *    puts fiber.resume 14
+ *    puts fiber.resume 18
+ *
+ *  <em>produces</em>
+ *
+ *    12
+ *    14
+ *    resuming dead fiber (FiberError)
+ *
+ */
+static mrb_value
+fiber_init(mrb_state *mrb, mrb_value self)
+{
+  static const struct mrb_context mrb_context_zero = { 0 };
+  struct RFiber *f = fiber_ptr(self);
+  struct mrb_context *c;
+  struct RProc *p;
+  mrb_callinfo *ci;
+  mrb_value blk;
+  size_t slen;
+
+  mrb_get_args(mrb, "&", &blk);
+
+  if (mrb_nil_p(blk)) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "tried to create Fiber object without a block");
+  }
+  p = mrb_proc_ptr(blk);
+  if (MRB_PROC_CFUNC_P(p)) {
+    mrb_raise(mrb, E_FIBER_ERROR, "tried to create Fiber from C defined method");
+  }
+
+  f->cxt = (struct mrb_context*)mrb_malloc(mrb, sizeof(struct mrb_context));
+  *f->cxt = mrb_context_zero;
+  c = f->cxt;
+
+  /* initialize VM stack */
+  slen = FIBER_STACK_INIT_SIZE;
+  if (p->body.irep->nregs > slen) {
+    slen += p->body.irep->nregs;
+  }
+  c->stbase = (mrb_value *)mrb_malloc(mrb, slen*sizeof(mrb_value));
+  c->stend = c->stbase + slen;
+  c->stack = c->stbase;
+
+#ifdef MRB_NAN_BOXING
+  {
+    mrb_value *p = c->stbase;
+    mrb_value *pend = c->stend;
+
+    while (p < pend) {
+      SET_NIL_VALUE(*p);
+      p++;
+    }
+  }
+#else
+  memset(c->stbase, 0, slen * sizeof(mrb_value));
+#endif
+
+  /* copy receiver from a block */
+  c->stack[0] = mrb->c->stack[0];
+
+  /* initialize callinfo stack */
+  c->cibase = (mrb_callinfo *)mrb_calloc(mrb, FIBER_CI_INIT_SIZE, sizeof(mrb_callinfo));
+  c->ciend = c->cibase + FIBER_CI_INIT_SIZE;
+  c->ci = c->cibase;
+  c->ci->stackent = c->stack;
+
+  /* adjust return callinfo */
+  ci = c->ci;
+  ci->target_class = p->target_class;
+  ci->proc = p;
+  ci->pc = p->body.irep->iseq;
+  ci->nregs = p->body.irep->nregs;
+  ci[1] = ci[0];
+  c->ci++;                      /* push dummy callinfo */
+
+  c->fib = f;
+  c->status = MRB_FIBER_CREATED;
+
+  return self;
+}
+
+static struct mrb_context*
+fiber_check(mrb_state *mrb, mrb_value fib)
+{
+  struct RFiber *f = fiber_ptr(fib);
+
+  mrb_assert(f->tt == MRB_TT_FIBER);
+  if (!f->cxt) {
+    mrb_raise(mrb, E_FIBER_ERROR, "uninitialized Fiber");
+  }
+  return f->cxt;
+}
+
+static mrb_value
+fiber_result(mrb_state *mrb, const mrb_value *a, mrb_int len)
+{
+  if (len == 0) return mrb_nil_value();
+  if (len == 1) return a[0];
+  return mrb_ary_new_from_values(mrb, len, a);
+}
+
+/* mark return from context modifying method */
+#define MARK_CONTEXT_MODIFY(c) (c)->ci->target_class = NULL
+
+static mrb_value
+fiber_switch(mrb_state *mrb, mrb_value self, mrb_int len, const mrb_value *a, mrb_bool resume)
+{
+  struct mrb_context *c = fiber_check(mrb, self);
+  mrb_callinfo *ci;
+
+  for (ci = c->ci; ci >= c->cibase; ci--) {
+    if (ci->acc < 0) {
+      mrb_raise(mrb, E_FIBER_ERROR, "can't cross C function boundary");
+    }
+  }
+  if (resume && c->status == MRB_FIBER_TRANSFERRED) {
+    mrb_raise(mrb, E_FIBER_ERROR, "resuming transfered fiber");
+  }
+  if (c->status == MRB_FIBER_RUNNING || c->status == MRB_FIBER_RESUMING) {
+    mrb_raise(mrb, E_FIBER_ERROR, "double resume");
+  }
+  if (c->status == MRB_FIBER_TERMINATED) {
+    mrb_raise(mrb, E_FIBER_ERROR, "resuming dead fiber");
+  }
+  mrb->c->status = resume ? MRB_FIBER_RESUMING : MRB_FIBER_TRANSFERRED;
+  c->prev = resume ? mrb->c : (c->prev ? c->prev : mrb->root_c);
+  if (c->status == MRB_FIBER_CREATED) {
+    mrb_value *b = c->stack+1;
+    mrb_value *e = b + len;
+
+    while (b<e) {
+      *b++ = *a++;
+    }
+    c->cibase->argc = len;
+    if (c->prev->fib)
+      mrb_field_write_barrier(mrb, (struct RBasic*)c->fib, (struct RBasic*)c->prev->fib);
+    mrb_write_barrier(mrb, (struct RBasic*)c->fib);
+    c->status = MRB_FIBER_RUNNING;
+    mrb->c = c;
+
+    MARK_CONTEXT_MODIFY(c);
+    return c->ci->proc->env->stack[0];
+  }
+  MARK_CONTEXT_MODIFY(c);
+  if (c->prev->fib)
+    mrb_field_write_barrier(mrb, (struct RBasic*)c->fib, (struct RBasic*)c->prev->fib);
+  mrb_write_barrier(mrb, (struct RBasic*)c->fib);
+  c->status = MRB_FIBER_RUNNING;
+  mrb->c = c;
+  return fiber_result(mrb, a, len);
+}
+
+/*
+ *  call-seq:
+ *     fiber.resume(args, ...) -> obj
+ *
+ *  Resumes the fiber from the point at which the last <code>Fiber.yield</code>
+ *  was called, or starts running it if it is the first call to
+ *  <code>resume</code>. Arguments passed to resume will be the value of
+ *  the <code>Fiber.yield</code> expression or will be passed as block
+ *  parameters to the fiber's block if this is the first <code>resume</code>.
+ *
+ *  Alternatively, when resume is called it evaluates to the arguments passed
+ *  to the next <code>Fiber.yield</code> statement inside the fiber's block
+ *  or to the block value if it runs to completion without any
+ *  <code>Fiber.yield</code>
+ */
+static mrb_value
+fiber_resume(mrb_state *mrb, mrb_value self)
+{
+  mrb_value *a;
+  mrb_int len;
+
+  mrb_get_args(mrb, "*", &a, &len);
+  return fiber_switch(mrb, self, len, a, TRUE);
+}
+
+/*
+ *  call-seq:
+ *     fiber.alive? -> true or false
+ *
+ *  Returns true if the fiber can still be resumed. After finishing
+ *  execution of the fiber block this method will always return false.
+ */
+static mrb_value
+fiber_alive_p(mrb_state *mrb, mrb_value self)
+{
+  struct mrb_context *c = fiber_check(mrb, self);
+  return mrb_bool_value(c->status != MRB_FIBER_TERMINATED);
+}
+
+static mrb_value
+fiber_eq(mrb_state *mrb, mrb_value self)
+{
+  mrb_value other;
+  mrb_get_args(mrb, "o", &other);
+
+  if (mrb_type(other) != MRB_TT_FIBER) {
+    return mrb_false_value();
+  }
+  return mrb_bool_value(fiber_ptr(self) == fiber_ptr(other));
+}
+
+/*
+ *  call-seq:
+ *     fiber.transfer(args, ...) -> obj
+ *
+ *  Transfers control to reciever fiber of the method call.
+ *  Unlike <code>resume</code> the reciever wouldn't be pushed to call
+ * stack of fibers. Instead it will switch to the call stack of
+ * transferring fiber.
+ *  When resuming a fiber that was transferred to another fiber it would
+ * cause double resume error. Though when the fiber is re-transferred
+ * and <code>Fiber.yield</code> is called, the fiber would be resumable.
+ */
+static mrb_value
+fiber_transfer(mrb_state *mrb, mrb_value self)
+{
+  struct mrb_context *c = fiber_check(mrb, self);
+  mrb_value* a;
+  mrb_int len;
+
+  mrb_get_args(mrb, "*", &a, &len);
+
+  if (c == mrb->root_c) {
+    mrb->c->status = MRB_FIBER_TRANSFERRED;
+    mrb->c = c;
+    c->status = MRB_FIBER_RUNNING;
+    MARK_CONTEXT_MODIFY(c);
+    mrb_write_barrier(mrb, (struct RBasic*)c->fib);
+    return fiber_result(mrb, a, len);
+  }
+
+  if (c == mrb->c) {
+    return fiber_result(mrb, a, len);
+  }
+
+  return fiber_switch(mrb, self, len, a, FALSE);
+}
+
+MRB_API mrb_value
+mrb_fiber_yield(mrb_state *mrb, mrb_int len, const mrb_value *a)
+{
+  struct mrb_context *c = mrb->c;
+  mrb_callinfo *ci;
+
+  for (ci = c->ci; ci >= c->cibase; ci--) {
+    if (ci->acc < 0) {
+      mrb_raise(mrb, E_FIBER_ERROR, "can't cross C function boundary");
+    }
+  }
+  if (!c->prev) {
+    mrb_raise(mrb, E_FIBER_ERROR, "can't yield from root fiber");
+  }
+
+  c->prev->status = MRB_FIBER_RUNNING;
+  c->status = MRB_FIBER_SUSPENDED;
+  mrb->c = c->prev;
+  c->prev = NULL;
+  MARK_CONTEXT_MODIFY(mrb->c);
+  mrb_write_barrier(mrb, (struct RBasic*)c->fib);
+  return fiber_result(mrb, a, len);
+}
+
+/*
+ *  call-seq:
+ *     Fiber.yield(args, ...) -> obj
+ *
+ *  Yields control back to the context that resumed the fiber, passing
+ *  along any arguments that were passed to it. The fiber will resume
+ *  processing at this point when <code>resume</code> is called next.
+ *  Any arguments passed to the next <code>resume</code> will be the
+ *  value that this <code>Fiber.yield</code> expression evaluates to.
+ */
+static mrb_value
+fiber_yield(mrb_state *mrb, mrb_value self)
+{
+  mrb_value *a;
+  mrb_int len;
+
+  mrb_get_args(mrb, "*", &a, &len);
+  return mrb_fiber_yield(mrb, len, a);
+}
+
+/*
+ *  call-seq:
+ *     Fiber.current() -> fiber
+ *
+ *  Returns the current fiber. If you are not running in the context of
+ *  a fiber this method will return the root fiber.
+ */
+static mrb_value
+fiber_current(mrb_state *mrb, mrb_value self)
+{
+  if (!mrb->c->fib) {
+    struct RFiber *f = (struct RFiber*)mrb_obj_alloc(mrb, MRB_TT_FIBER, mrb_class_ptr(self));
+
+    f->cxt = mrb->c;
+    mrb->c->fib = f;
+  }
+  return mrb_obj_value(mrb->c->fib);
+}
+
+void
+mrb_mruby_fiber_gem_init(mrb_state* mrb)
+{
+  struct RClass *c;
+
+  c = mrb_define_class(mrb, "Fiber", mrb->object_class);
+  MRB_SET_INSTANCE_TT(c, MRB_TT_FIBER);
+
+  mrb_define_method(mrb, c, "initialize", fiber_init,    MRB_ARGS_NONE());
+  mrb_define_method(mrb, c, "resume",     fiber_resume,  MRB_ARGS_ANY());
+  mrb_define_method(mrb, c, "transfer",   fiber_transfer, MRB_ARGS_ANY());
+  mrb_define_method(mrb, c, "alive?",     fiber_alive_p, MRB_ARGS_NONE());
+  mrb_define_method(mrb, c, "==",         fiber_eq,      MRB_ARGS_REQ(1));
+
+  mrb_define_class_method(mrb, c, "yield", fiber_yield, MRB_ARGS_ANY());
+  mrb_define_class_method(mrb, c, "current", fiber_current, MRB_ARGS_NONE());
+
+  mrb_define_class(mrb, "FiberError", mrb->eStandardError_class);
+}
+
+void
+mrb_mruby_fiber_gem_final(mrb_state* mrb)
+{
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-fiber/gem_init.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,22 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ *   This file was generated!
+ *   All manual changes will get lost.
+ */
+#include "mruby.h"
+void mrb_mruby_fiber_gem_init(mrb_state *mrb);
+void mrb_mruby_fiber_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_fiber_gem_init(mrb_state *mrb) {
+  int ai = mrb_gc_arena_save(mrb);
+  mrb_mruby_fiber_gem_init(mrb);
+  mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_fiber_gem_final(mrb_state *mrb) {
+  mrb_mruby_fiber_gem_final(mrb);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-hash-ext/gem_init.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,229 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ *   This file was generated!
+ *   All manual changes will get lost.
+ */
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+gem_mrblib_irep_mruby_hash_ext[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0xa7,0xae,0x00,0x00,0x0b,0xee,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x0a,0xc6,0x30,0x30,
+0x30,0x30,0x00,0x00,0x00,0x35,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x00,0x80,0x00,0x45,0x00,0x80,0x00,
+0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x48,0x61,
+0x73,0x68,0x00,0x00,0x00,0x01,0x31,0x00,0x01,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
+0x28,0x00,0x00,0x00,0x48,0x00,0x80,0x00,0x04,0x00,0x00,0x01,0x84,0x00,0x80,0x01,
+0x05,0x00,0x00,0x02,0x20,0x81,0x80,0x00,0x06,0x00,0x80,0x00,0x47,0x40,0x80,0x00,
+0xc0,0x00,0x00,0x01,0x46,0xc0,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,
+0x46,0x00,0x81,0x00,0x48,0x00,0x80,0x00,0x84,0x02,0x00,0x01,0x04,0x02,0x80,0x01,
+0x05,0x00,0x00,0x02,0x20,0x81,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x04,0x00,0x01,
+0x46,0x80,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,0x46,0xc0,0x81,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x08,0x00,0x01,0x46,0x00,0x82,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x0a,0x00,0x01,0x46,0x40,0x82,0x00,0x48,0x00,0x80,0x00,0xc0,0x0c,0x00,0x01,
+0x46,0x80,0x82,0x00,0x48,0x00,0x80,0x00,0xc0,0x0e,0x00,0x01,0x46,0xc0,0x82,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x10,0x00,0x01,0x46,0x00,0x83,0x00,0x04,0x06,0x80,0x00,
+0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x00,0x09,0x65,0x61,
+0x63,0x68,0x5f,0x70,0x61,0x69,0x72,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,
+0x0c,0x61,0x6c,0x69,0x61,0x73,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x02,
+0x5b,0x5d,0x00,0x00,0x06,0x6d,0x65,0x72,0x67,0x65,0x21,0x00,0x00,0x06,0x75,0x70,
+0x64,0x61,0x74,0x65,0x00,0x00,0x05,0x66,0x65,0x74,0x63,0x68,0x00,0x00,0x09,0x64,
+0x65,0x6c,0x65,0x74,0x65,0x5f,0x69,0x66,0x00,0x00,0x07,0x66,0x6c,0x61,0x74,0x74,
+0x65,0x6e,0x00,0x00,0x06,0x69,0x6e,0x76,0x65,0x72,0x74,0x00,0x00,0x07,0x6b,0x65,
+0x65,0x70,0x5f,0x69,0x66,0x00,0x00,0x03,0x6b,0x65,0x79,0x00,0x00,0x04,0x74,0x6f,
+0x5f,0x68,0x00,0x00,0x00,0x01,0x92,0x00,0x06,0x00,0x0a,0x00,0x03,0x00,0x00,0x00,
+0x3a,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x01,0x40,0x00,0x03,0x20,0x00,0x00,0x03,
+0x01,0x80,0x81,0x01,0x03,0x00,0xc0,0x03,0xb2,0x40,0x00,0x03,0x19,0x0f,0x40,0x03,
+0x01,0x40,0x00,0x03,0x83,0xff,0xbf,0x03,0xa0,0x80,0x00,0x03,0x01,0x80,0x01,0x02,
+0x04,0x02,0x80,0x03,0xa0,0xc0,0x00,0x03,0x99,0x05,0x40,0x03,0x91,0x02,0x00,0x03,
+0x20,0x80,0x01,0x03,0x01,0x80,0x81,0x02,0x01,0x40,0x00,0x03,0x83,0xff,0xbf,0x03,
+0xa0,0x80,0x00,0x03,0x20,0x00,0x01,0x03,0x40,0x01,0x80,0x03,0x21,0xc0,0x01,0x03,
+0x29,0x00,0x80,0x02,0x17,0x06,0x40,0x00,0x01,0x00,0x01,0x03,0x04,0x04,0x80,0x03,
+0xa0,0xc0,0x00,0x03,0x19,0x04,0x40,0x03,0x91,0x02,0x00,0x03,0x20,0x80,0x01,0x03,
+0x01,0x80,0x81,0x02,0x01,0x00,0x01,0x03,0x20,0x00,0x02,0x03,0x40,0x03,0x80,0x03,
+0x21,0xc0,0x01,0x03,0x29,0x00,0x80,0x02,0x01,0xc0,0x00,0x03,0x83,0x00,0xc0,0x03,
+0xa0,0x40,0x02,0x03,0x83,0xff,0xbf,0x03,0xb2,0x40,0x00,0x03,0x99,0x00,0x40,0x03,
+0x17,0x02,0x40,0x00,0x06,0x00,0x00,0x03,0x91,0x05,0x80,0x03,0x3d,0x00,0x00,0x04,
+0x20,0x81,0x02,0x03,0x91,0x02,0x00,0x03,0x20,0x80,0x01,0x03,0x01,0x80,0x81,0x02,
+0x83,0xff,0x3f,0x03,0x01,0xc0,0x80,0x03,0x2f,0x41,0x83,0x03,0x83,0x00,0x40,0x04,
+0x40,0x05,0x80,0x04,0x21,0x01,0x03,0x03,0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x01,
+0x00,0x00,0x20,0x6f,0x64,0x64,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,
+0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,0x20,0x66,0x6f,0x72,0x20,0x48,
+0x61,0x73,0x68,0x00,0x00,0x00,0x0e,0x00,0x06,0x6c,0x65,0x6e,0x67,0x74,0x68,0x00,
+0x00,0x02,0x3d,0x3d,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x0b,0x72,0x65,0x73,0x70,
+0x6f,0x6e,0x64,0x5f,0x74,0x6f,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x68,0x61,0x73,
+0x68,0x00,0x00,0x04,0x48,0x61,0x73,0x68,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,
+0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x04,0x74,0x6f,0x5f,0x61,0x00,0x00,0x01,0x25,
+0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,
+0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x04,0x73,0x74,0x65,0x70,0x00,
+0x00,0x01,0x2d,0x00,0x00,0x00,0x00,0x3c,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x00,
+0x00,0x07,0x00,0x00,0x26,0x00,0x00,0x04,0x01,0x80,0x00,0x02,0x15,0x40,0x81,0x02,
+0x01,0x40,0x00,0x03,0x01,0x00,0x81,0x03,0x20,0x01,0x80,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,0x00,
+0x01,0xad,0x00,0x05,0x00,0x0b,0x00,0x00,0x00,0x00,0x00,0x3c,0x26,0x00,0x00,0x02,
+0x01,0x40,0x80,0x02,0x84,0x00,0x00,0x03,0xa0,0x00,0x80,0x02,0x99,0x00,0xc0,0x02,
+0x97,0x04,0x40,0x00,0x06,0x00,0x80,0x02,0x91,0x01,0x00,0x03,0x3d,0x00,0x80,0x03,
+0x01,0x40,0x00,0x04,0x20,0x00,0x01,0x04,0x3e,0x00,0x82,0x03,0xbd,0x00,0x00,0x04,
+0x3e,0x00,0x82,0x03,0x20,0x81,0x80,0x02,0x05,0x00,0x80,0x02,0x3a,0x40,0x81,0x01,
+0xba,0x40,0x01,0x02,0x01,0x40,0x80,0x02,0x20,0x40,0x81,0x02,0x83,0x00,0x40,0x03,
+0x01,0x40,0x81,0x03,0xa0,0x80,0x01,0x03,0x98,0x00,0x40,0x03,0x97,0x04,0x40,0x00,
+0x01,0x40,0x00,0x03,0x83,0xff,0xbf,0x03,0xa0,0xc0,0x01,0x03,0x01,0x80,0x81,0x01,
+0x01,0x40,0x00,0x03,0x03,0x00,0xc0,0x03,0xa0,0xc0,0x01,0x03,0x01,0x80,0x01,0x02,
+0x17,0x0a,0x40,0x00,0x03,0x00,0x40,0x03,0x01,0x40,0x81,0x03,0xa0,0x80,0x01,0x03,
+0x98,0x00,0x40,0x03,0x97,0x02,0x40,0x00,0x01,0x40,0x00,0x03,0x83,0xff,0xbf,0x03,
+0xa0,0xc0,0x01,0x03,0x01,0x80,0x81,0x01,0x17,0x05,0x40,0x00,0x06,0x00,0x00,0x03,
+0x91,0x01,0x80,0x03,0x3d,0x01,0x00,0x04,0x01,0x40,0x80,0x04,0x20,0x40,0x81,0x04,
+0x3e,0x40,0x02,0x04,0xbd,0x01,0x80,0x04,0x3e,0x40,0x02,0x04,0x20,0x81,0x00,0x03,
+0x17,0x00,0x40,0x00,0x01,0x00,0x01,0x03,0x15,0x40,0x81,0x03,0x01,0xc0,0x00,0x04,
+0x01,0x80,0x81,0x04,0x20,0x01,0x82,0x03,0x29,0x00,0x00,0x03,0x00,0x00,0x00,0x04,
+0x00,0x00,0x13,0x77,0x72,0x6f,0x6e,0x67,0x20,0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,
+0x20,0x74,0x79,0x70,0x65,0x20,0x00,0x00,0x11,0x20,0x28,0x65,0x78,0x70,0x65,0x63,
+0x74,0x65,0x64,0x20,0x61,0x72,0x72,0x61,0x79,0x29,0x00,0x00,0x1c,0x69,0x6e,0x76,
+0x61,0x6c,0x69,0x64,0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x65,
+0x6c,0x65,0x6d,0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x0a,0x20,0x66,0x6f,0x72,
+0x20,0x31,0x2e,0x2e,0x32,0x29,0x00,0x00,0x00,0x09,0x00,0x0b,0x72,0x65,0x73,0x70,
+0x6f,0x6e,0x64,0x5f,0x74,0x6f,0x3f,0x00,0x00,0x04,0x74,0x6f,0x5f,0x61,0x00,0x00,
+0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,
+0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,
+0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x03,0x3d,0x3d,0x3d,0x00,0x00,0x02,0x5b,0x5d,
+0x00,0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,0x00,0x00,0x59,0x00,0x03,0x00,0x08,0x00,
+0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x26,0x00,0x00,0x02,0x15,0x40,0x80,0x01,
+0x01,0x40,0x00,0x02,0xad,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x15,0x40,0x01,0x02,
+0x15,0x40,0x80,0x02,0x01,0x40,0x00,0x03,0xa0,0x00,0x80,0x02,0x01,0xc0,0x00,0x03,
+0x20,0x81,0x00,0x02,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
+0x00,0x02,0x5b,0x5d,0x00,0x00,0x01,0x2b,0x00,0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,
+0x00,0x00,0xc4,0x00,0x03,0x00,0x07,0x00,0x02,0x00,0x00,0x00,0x14,0x00,0x00,0x00,
+0xa6,0x00,0x00,0x02,0x01,0x40,0x80,0x01,0x84,0x00,0x00,0x02,0xa0,0x00,0x80,0x01,
+0x99,0x00,0xc0,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x91,0x01,0x00,0x02,
+0x3d,0x00,0x80,0x02,0x20,0x81,0x80,0x01,0x19,0x02,0x40,0x01,0x01,0x40,0x80,0x01,
+0x40,0x01,0x00,0x02,0x21,0x00,0x81,0x01,0x97,0x01,0x40,0x00,0x01,0x40,0x80,0x01,
+0x40,0x03,0x00,0x02,0x21,0x00,0x81,0x01,0x06,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x01,0x00,0x00,0x20,0x63,0x61,0x6e,0x27,0x74,0x20,0x63,0x6f,0x6e,
+0x76,0x65,0x72,0x74,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x20,0x69,0x6e,
+0x74,0x6f,0x20,0x48,0x61,0x73,0x68,0x00,0x00,0x00,0x05,0x00,0x0b,0x72,0x65,0x73,
+0x70,0x6f,0x6e,0x64,0x5f,0x74,0x6f,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x68,0x61,
+0x73,0x68,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,0x70,
+0x65,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x08,0x65,0x61,0x63,0x68,0x5f,0x6b,0x65,
+0x79,0x00,0x00,0x00,0x00,0x93,0x00,0x03,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x17,
+0x26,0x00,0x00,0x02,0x06,0x00,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,
+0x19,0x05,0xc0,0x01,0x15,0x80,0x80,0x01,0x01,0x40,0x00,0x02,0x06,0x00,0x80,0x02,
+0x01,0x40,0x00,0x03,0xa0,0x80,0x80,0x02,0x15,0x40,0x00,0x03,0x01,0x40,0x80,0x03,
+0xa0,0x80,0x00,0x03,0xa0,0x41,0x80,0x01,0x97,0x01,0x40,0x00,0x15,0x40,0x80,0x01,
+0x01,0x40,0x00,0x02,0xa0,0x80,0x80,0x01,0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,
+0x01,0xc0,0x00,0x03,0x20,0xc1,0x00,0x02,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x04,0x00,0x08,0x68,0x61,0x73,0x5f,0x6b,0x65,0x79,0x3f,0x00,0x00,
+0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x03,0x5b,0x5d,0x3d,
+0x00,0x00,0x00,0x00,0x49,0x00,0x03,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x09,0x00,
+0x26,0x00,0x00,0x02,0x15,0x40,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,
+0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0x01,0xc0,0x00,0x03,0x20,0x41,0x00,0x02,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x5b,0x5d,
+0x00,0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,0x00,0x00,0xd9,0x00,0x04,0x00,0x08,0x00,
+0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0xa6,0x00,0x10,0x02,0x97,0x00,0x40,0x00,
+0x97,0x00,0x40,0x00,0x11,0x00,0x00,0x01,0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,
+0xa0,0x40,0x00,0x02,0x19,0x02,0x40,0x02,0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,
+0xa0,0x80,0x00,0x02,0x17,0x08,0x40,0x00,0x99,0x01,0xc0,0x01,0x01,0xc0,0x00,0x02,
+0x20,0xc0,0x00,0x02,0x17,0x06,0x40,0x00,0x01,0x80,0x00,0x02,0x11,0x00,0x80,0x02,
+0xa0,0x00,0x01,0x02,0x19,0x01,0x40,0x02,0x01,0x80,0x00,0x02,0x17,0x03,0x40,0x00,
+0x06,0x00,0x00,0x02,0x11,0x03,0x80,0x02,0x3d,0x00,0x00,0x03,0x01,0x40,0x80,0x03,
+0x3e,0xc0,0x01,0x03,0x20,0x41,0x01,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x02,
+0x00,0x00,0x0f,0x4b,0x65,0x79,0x20,0x6e,0x6f,0x74,0x20,0x66,0x6f,0x75,0x6e,0x64,
+0x3a,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x04,0x4e,0x4f,0x4e,0x45,0x00,
+0x00,0x04,0x6b,0x65,0x79,0x3f,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x04,0x63,0x61,
+0x6c,0x6c,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,
+0x00,0x0c,0x52,0x75,0x6e,0x74,0x69,0x6d,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,
+0x00,0x00,0x7e,0x00,0x02,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,
+0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x99,0x00,0x40,0x01,
+0x17,0x02,0x40,0x00,0x06,0x00,0x00,0x01,0x04,0x01,0x80,0x01,0xa0,0x40,0x00,0x01,
+0x29,0x00,0x00,0x01,0x06,0x00,0x00,0x01,0x40,0x01,0x80,0x01,0x21,0xc0,0x00,0x01,
+0x06,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,
+0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x09,0x64,0x65,0x6c,0x65,0x74,
+0x65,0x5f,0x69,0x66,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x5a,
+0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x26,0x00,0x00,0x04,
+0x15,0x40,0x00,0x02,0x01,0x40,0x80,0x02,0x01,0x80,0x00,0x03,0x20,0x01,0x00,0x02,
+0x19,0x02,0x40,0x02,0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x40,0x00,0x02,
+0x97,0x00,0x40,0x00,0x05,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x06,0x64,0x65,0x6c,
+0x65,0x74,0x65,0x00,0x00,0x00,0x00,0x4f,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,
+0x00,0x09,0x00,0x00,0x26,0x00,0x10,0x00,0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,
+0x03,0x00,0xc0,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,0x01,0x40,0x00,0x02,
+0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x04,0x74,0x6f,0x5f,0x61,0x00,0x00,0x07,0x66,0x6c,0x61,0x74,0x74,0x65,0x6e,
+0x00,0x00,0x00,0x00,0x4e,0x00,0x03,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x08,0x00,
+0x26,0x00,0x00,0x00,0x11,0x00,0x80,0x01,0x20,0x40,0x80,0x01,0x01,0xc0,0x00,0x01,
+0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0x21,0x80,0x80,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x48,0x61,0x73,0x68,0x00,0x00,
+0x03,0x6e,0x65,0x77,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x3c,
+0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x26,0x00,0x00,0x04,
+0x01,0x40,0x00,0x02,0x15,0x80,0x80,0x02,0x01,0x80,0x00,0x03,0x01,0x00,0x81,0x03,
+0x20,0x01,0x80,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,0x00,0x00,0x80,0x00,0x03,0x00,0x06,0x00,0x01,
+0x00,0x00,0x00,0x0f,0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,
+0x99,0x00,0xc0,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x04,0x01,0x00,0x02,
+0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x37,0xc0,0x00,0x01,0x06,0x00,0x80,0x01,
+0x40,0x01,0x00,0x02,0x21,0xc0,0x80,0x01,0x06,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,
+0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,
+0x00,0x00,0x07,0x6b,0x65,0x65,0x70,0x5f,0x69,0x66,0x00,0x00,0x04,0x65,0x61,0x63,
+0x68,0x00,0x00,0x00,0x00,0x5e,0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x0d,
+0x26,0x00,0x00,0x04,0x15,0x40,0x00,0x02,0x01,0x40,0x80,0x02,0x01,0x80,0x00,0x03,
+0x37,0x41,0x81,0x02,0xa0,0x00,0x00,0x02,0x19,0x01,0x40,0x02,0x05,0x00,0x00,0x02,
+0x97,0x01,0x40,0x00,0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x40,0x00,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x63,0x61,
+0x6c,0x6c,0x00,0x00,0x06,0x64,0x65,0x6c,0x65,0x74,0x65,0x00,0x00,0x00,0x00,0x39,
+0x00,0x03,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x26,0x00,0x00,0x02,
+0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0x21,0x00,0x80,0x01,0x05,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,
+0x63,0x68,0x00,0x00,0x00,0x00,0x47,0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x00,
+0x0a,0x00,0x00,0x00,0x26,0x00,0x00,0x04,0x01,0x80,0x00,0x02,0x15,0x40,0x80,0x02,
+0xb2,0x00,0x00,0x02,0x99,0x01,0x40,0x02,0x01,0x40,0x00,0x02,0x29,0x80,0x00,0x02,
+0x97,0x00,0x40,0x00,0x05,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x02,0x3d,0x3d,0x00,0x00,0x00,0x00,0x26,0x00,0x02,0x00,
+0x03,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x26,0x00,0x00,0x00,0x06,0x00,0x00,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x56,0x41,0x52,
+0x00,0x00,0x01,0x0a,0x00,0x00,0x00,0x0e,0x00,0x06,0x6f,0x62,0x6a,0x65,0x63,0x74,
+0x00,0x06,0x6c,0x65,0x6e,0x67,0x74,0x68,0x00,0x01,0x6f,0x00,0x01,0x68,0x00,0x01,
+0x6b,0x00,0x01,0x76,0x00,0x01,0x69,0x00,0x05,0x6f,0x74,0x68,0x65,0x72,0x00,0x05,
+0x62,0x6c,0x6f,0x63,0x6b,0x00,0x03,0x6b,0x65,0x79,0x00,0x04,0x6e,0x6f,0x6e,0x65,
+0x00,0x05,0x6c,0x65,0x76,0x65,0x6c,0x00,0x04,0x6b,0x65,0x79,0x73,0x00,0x03,0x76,
+0x61,0x6c,0x00,0x00,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x02,
+0x00,0x04,0x00,0x03,0x00,0x05,0x00,0x04,0x00,0x01,0x00,0x05,0x00,0x02,0xff,0xff,
+0x00,0x00,0x00,0x06,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x03,0x00,0x05,
+0x00,0x04,0x00,0x06,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x07,0x00,0x01,0x00,0x08,
+0x00,0x02,0x00,0x04,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x09,0x00,0x01,0x00,0x0a,0x00,0x02,0x00,0x08,0x00,0x03,0x00,0x08,
+0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x05,0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x0b,
+0x00,0x01,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x04,
+0x00,0x01,0x00,0x05,0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x08,0x00,0x01,0x00,0x0c,
+0x00,0x02,0x00,0x04,0x00,0x01,0x00,0x05,0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x0d,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x01,0x00,0x05,0x00,0x02,0xff,0xff,
+0x00,0x00,0xff,0xff,0x00,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08,
+};
+void mrb_mruby_hash_ext_gem_init(mrb_state *mrb);
+void mrb_mruby_hash_ext_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_hash_ext_gem_init(mrb_state *mrb) {
+  int ai = mrb_gc_arena_save(mrb);
+  mrb_mruby_hash_ext_gem_init(mrb);
+  mrb_load_irep(mrb, gem_mrblib_irep_mruby_hash_ext);
+  if (mrb->exc) {
+    mrb_print_error(mrb);
+    exit(EXIT_FAILURE);
+  }
+  mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_hash_ext_gem_final(mrb_state *mrb) {
+  mrb_mruby_hash_ext_gem_final(mrb);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-hash-ext/hash-ext.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,52 @@
+/*
+** hash.c - Hash class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/hash.h"
+
+/*
+ * call-seq:
+ *   hsh.values_at(key, ...)   -> array
+ *
+ * Return an array containing the values associated with the given keys.
+ * Also see <code>Hash.select</code>.
+ *
+ *   h = { "cat" => "feline", "dog" => "canine", "cow" => "bovine" }
+ *   h.values_at("cow", "cat")  #=> ["bovine", "feline"]
+ */
+
+static mrb_value
+hash_values_at(mrb_state *mrb, mrb_value hash)
+{
+  mrb_value *argv, result;
+  mrb_int argc, i;
+  int ai;
+
+  mrb_get_args(mrb, "*", &argv, &argc);
+  result = mrb_ary_new_capa(mrb, argc);
+  ai = mrb_gc_arena_save(mrb);
+  for (i = 0; i < argc; i++) {
+    mrb_ary_push(mrb, result, mrb_hash_get(mrb, hash, argv[i]));
+    mrb_gc_arena_restore(mrb, ai);
+  }
+  return result;
+}
+
+void
+mrb_mruby_hash_ext_gem_init(mrb_state *mrb)
+{
+  struct RClass *h;
+
+  h = mrb->hash_class;
+  mrb_define_method(mrb, h, "values_at", hash_values_at, MRB_ARGS_ANY());
+}
+
+void
+mrb_mruby_hash_ext_gem_final(mrb_state *mrb)
+{
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-kernel-ext/gem_init.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,22 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ *   This file was generated!
+ *   All manual changes will get lost.
+ */
+#include "mruby.h"
+void mrb_mruby_kernel_ext_gem_init(mrb_state *mrb);
+void mrb_mruby_kernel_ext_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_kernel_ext_gem_init(mrb_state *mrb) {
+  int ai = mrb_gc_arena_save(mrb);
+  mrb_mruby_kernel_ext_gem_init(mrb);
+  mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_kernel_ext_gem_final(mrb_state *mrb) {
+  mrb_mruby_kernel_ext_gem_final(mrb);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-kernel-ext/kernel.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,184 @@
+#include "mruby.h"
+#include "mruby/error.h"
+#include "mruby/array.h"
+#include "mruby/hash.h"
+
+/*
+ *  call-seq:
+ *     __method__         -> symbol
+ *
+ *  Returns the name at the definition of the current method as a
+ *  Symbol.
+ *  If called outside of a method, it returns <code>nil</code>.
+ *
+ */
+static mrb_value
+mrb_f_method(mrb_state *mrb, mrb_value self)
+{
+  mrb_callinfo *ci = mrb->c->ci;
+  ci--;
+  if (ci->mid)
+    return mrb_symbol_value(ci->mid);
+  else
+    return mrb_nil_value();
+}
+
+/*
+ *  call-seq:
+ *     Integer(arg,base=0)    -> integer
+ *
+ *  Converts <i>arg</i> to a <code>Fixnum</code>.
+ *  Numeric types are converted directly (with floating point numbers
+ *  being truncated).    <i>base</i> (0, or between 2 and 36) is a base for
+ *  integer string representation.  If <i>arg</i> is a <code>String</code>,
+ *  when <i>base</i> is omitted or equals to zero, radix indicators
+ *  (<code>0</code>, <code>0b</code>, and <code>0x</code>) are honored.
+ *  In any case, strings should be strictly conformed to numeric
+ *  representation. This behavior is different from that of
+ *  <code>String#to_i</code>.  Non string values will be converted using
+ *  <code>to_int</code>, and <code>to_i</code>. Passing <code>nil</code>
+ *  raises a TypeError.
+ *
+ *     Integer(123.999)    #=> 123
+ *     Integer("0x1a")     #=> 26
+ *     Integer(Time.new)   #=> 1204973019
+ *     Integer("0930", 10) #=> 930
+ *     Integer("111", 2)   #=> 7
+ *     Integer(nil)        #=> TypeError
+ */
+static mrb_value
+mrb_f_integer(mrb_state *mrb, mrb_value self)
+{
+  mrb_value arg;
+  mrb_int base = 0;
+
+  mrb_get_args(mrb, "o|i", &arg, &base);
+  return mrb_convert_to_integer(mrb, arg, base);
+}
+
+/*
+ *  call-seq:
+ *     Float(arg)    -> float
+ *
+ *  Returns <i>arg</i> converted to a float. Numeric types are converted
+ *  directly, the rest are converted using <i>arg</i>.to_f. 
+ *
+ *     Float(1)           #=> 1.0
+ *     Float(123.456)     #=> 123.456
+ *     Float("123.456")   #=> 123.456
+ *     Float(nil)         #=> TypeError
+ */
+static mrb_value
+mrb_f_float(mrb_state *mrb, mrb_value self)
+{
+  mrb_value arg;
+
+  mrb_get_args(mrb, "o", &arg);
+  return mrb_Float(mrb, arg);
+}
+
+/*
+ *  call-seq:
+ *     String(arg)   -> string
+ *
+ *  Returns <i>arg</i> as an <code>String</code>.
+ *
+ *  First tries to call its <code>to_str</code> method, then its to_s method.
+ *
+ *     String(self)        #=> "main"
+ *     String(self.class)  #=> "Object"
+ *     String(123456)      #=> "123456"
+ */
+static mrb_value
+mrb_f_string(mrb_state *mrb, mrb_value self)
+{
+  mrb_value arg, tmp;
+
+  mrb_get_args(mrb, "o", &arg);
+  tmp = mrb_check_convert_type(mrb, arg, MRB_TT_STRING, "String", "to_str");
+  if (mrb_nil_p(tmp)) {
+    tmp = mrb_check_convert_type(mrb, arg, MRB_TT_STRING, "String", "to_s");
+  }
+  return tmp;
+}
+
+/*
+ *  call-seq:
+ *     Array(arg)    -> array
+ *
+ *  Returns +arg+ as an Array.
+ *
+ *  First tries to call Array#to_ary on +arg+, then Array#to_a.
+ *
+ *     Array(1..5)   #=> [1, 2, 3, 4, 5]
+ *
+ */
+static mrb_value
+mrb_f_array(mrb_state *mrb, mrb_value self)
+{
+  mrb_value arg, tmp;
+
+  mrb_get_args(mrb, "o", &arg);
+  tmp = mrb_check_convert_type(mrb, arg, MRB_TT_ARRAY, "Array", "to_ary");
+  if (mrb_nil_p(tmp)) {
+    tmp = mrb_check_convert_type(mrb, arg, MRB_TT_ARRAY, "Array", "to_a");
+  }
+  if (mrb_nil_p(tmp)) {
+    return mrb_ary_new_from_values(mrb, 1, &arg);
+  }
+
+  return tmp;
+}
+
+/*
+ *  call-seq:
+ *     Hash(arg)    -> hash
+ *
+ *  Converts <i>arg</i> to a <code>Hash</code> by calling
+ *  <i>arg</i><code>.to_hash</code>. Returns an empty <code>Hash</code> when
+ *  <i>arg</i> is <tt>nil</tt> or <tt>[]</tt>.
+ *
+ *     Hash([])          #=> {}
+ *     Hash(nil)         #=> {}
+ *     Hash(key: :value) #=> {:key => :value}
+ *     Hash([1, 2, 3])   #=> TypeError
+ */
+static mrb_value
+mrb_f_hash(mrb_state *mrb, mrb_value self)
+{
+  mrb_value arg, tmp;
+
+  mrb_get_args(mrb, "o", &arg);
+  if (mrb_nil_p(arg)) {
+    return mrb_hash_new(mrb);
+  }
+  tmp = mrb_check_convert_type(mrb, arg, MRB_TT_HASH, "Hash", "to_hash");
+  if (mrb_nil_p(tmp)) {
+    if (mrb_array_p(arg) && RARRAY_LEN(arg) == 0) {
+      return mrb_hash_new(mrb);
+    }
+    mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %S into Hash",
+      mrb_str_new_cstr(mrb, mrb_obj_classname(mrb, arg)));
+  }
+  return tmp;
+}
+
+void
+mrb_mruby_kernel_ext_gem_init(mrb_state *mrb)
+{
+  struct RClass *krn = mrb->kernel_module;
+
+  mrb_define_module_function(mrb, krn, "fail", mrb_f_raise, MRB_ARGS_OPT(2));
+  mrb_define_method(mrb, krn, "__method__", mrb_f_method, MRB_ARGS_NONE());
+  mrb_define_module_function(mrb, krn, "Integer", mrb_f_integer, MRB_ARGS_ANY());
+  mrb_define_module_function(mrb, krn, "Float", mrb_f_float, MRB_ARGS_REQ(1));
+  mrb_define_module_function(mrb, krn, "String", mrb_f_string, MRB_ARGS_REQ(1));
+  mrb_define_module_function(mrb, krn, "Array", mrb_f_array, MRB_ARGS_REQ(1));
+  mrb_define_module_function(mrb, krn, "Hash", mrb_f_hash, MRB_ARGS_REQ(1));
+}
+
+void
+mrb_mruby_kernel_ext_gem_final(mrb_state *mrb)
+{
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-math/gem_init.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,22 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ *   This file was generated!
+ *   All manual changes will get lost.
+ */
+#include "mruby.h"
+void mrb_mruby_math_gem_init(mrb_state *mrb);
+void mrb_mruby_math_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_math_gem_init(mrb_state *mrb) {
+  int ai = mrb_gc_arena_save(mrb);
+  mrb_mruby_math_gem_init(mrb);
+  mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_math_gem_final(mrb_state *mrb) {
+  mrb_mruby_math_gem_final(mrb);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-math/math.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,783 @@
+/*
+** math.c - Math module
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+#include "mruby/array.h"
+
+#include <math.h>
+
+static void
+domain_error(mrb_state *mrb, const char *func)
+{
+  struct RClass *math = mrb_module_get(mrb, "Math");
+  struct RClass *domainerror = mrb_class_get_under(mrb, math, "DomainError");
+  mrb_value str = mrb_str_new_cstr(mrb, func);
+  mrb_raisef(mrb, domainerror, "Numerical argument is out of domain - %S", str);
+}
+
+/* math functions not provided by Microsoft Visual C++ 2012 or older */
+#if defined _MSC_VER && _MSC_VER < 1800
+
+#include <float.h>
+
+#define MATH_TOLERANCE 1E-12
+
+double
+asinh(double x)
+{
+  double xa, ya, y;
+
+  /* Basic formula loses precision for x < 0, but asinh is an odd function */
+  xa = fabs(x);
+  if (xa > 3.16227E+18) {
+    /* Prevent x*x from overflowing; basic formula reduces to log(2*x) */
+    ya = log(xa) + 0.69314718055994530942;
+  }
+  else {
+    /* Basic formula for asinh */
+    ya = log(xa + sqrt(xa*xa + 1.0));
+  }
+
+  y = _copysign(ya, x);
+  return y;
+}
+
+double
+acosh(double x)
+{
+  double y;
+
+  if (x > 3.16227E+18) {
+    /* Prevent x*x from overflowing; basic formula reduces to log(2*x) */
+    y = log(x) + 0.69314718055994530942;
+  }
+  else {
+    /* Basic formula for acosh */
+    y = log(x + sqrt(x*x - 1.0));
+  }
+
+  return y;
+}
+
+double
+atanh(double x)
+{
+  double y;
+
+  if (fabs(x) < 1E-2) {
+    /* The sums 1+x and 1-x lose precision for small x.  Use the polynomial
+       instead. */
+    double x2 = x * x;
+    y = x*(1.0 + x2*(1.0/3.0 + x2*(1.0/5.0 + x2*(1.0/7.0))));
+  }
+  else {
+    /* Basic formula for atanh */
+    y = 0.5 * (log(1.0+x) - log(1.0-x));
+  }
+
+  return y;
+}
+
+double
+cbrt(double x)
+{
+  double xa, ya, y;
+
+  /* pow(x, y) is undefined for x < 0 and y not an integer, but cbrt is an
+     odd function */
+  xa = fabs(x);
+  ya = pow(xa, 1.0/3.0);
+  y = _copysign(ya, x);
+  return y;
+}
+
+/* Declaration of complementary Error function */
+double
+erfc(double x);
+
+/*
+** Implementations of error functions
+** credits to http://www.digitalmars.com/archives/cplusplus/3634.html
+*/
+
+/* Implementation of Error function */
+double
+erf(double x)
+{
+  static const double two_sqrtpi =  1.128379167095512574;
+  double sum  = x;
+  double term = x;
+  double xsqr = x*x;
+  int j= 1;
+  if (fabs(x) > 2.2) {
+    return 1.0 - erfc(x);
+  }
+  do {
+    term *= xsqr/j;
+    sum  -= term/(2*j+1);
+    ++j;
+    term *= xsqr/j;
+    sum  += term/(2*j+1);
+    ++j;
+  } while (fabs(term/sum) > MATH_TOLERANCE);
+  return two_sqrtpi*sum;
+}
+
+/* Implementation of complementary Error function */
+double
+erfc(double x)
+{
+  static const double one_sqrtpi=  0.564189583547756287;
+  double a = 1;
+  double b = x;
+  double c = x;
+  double d = x*x+0.5;
+  double q1;
+  double q2 = b/d;
+  double n = 1.0;
+  double t;
+  if (fabs(x) < 2.2) {
+    return 1.0 - erf(x);
+  }
+  if (x < 0.0) { /*signbit(x)*/
+    return 2.0 - erfc(-x);
+  }
+  do {
+    t  = a*n+b*x;
+    a  = b;
+    b  = t;
+    t  = c*n+d*x;
+    c  = d;
+    d  = t;
+    n += 0.5;
+    q1 = q2;
+    q2 = b/d;
+  } while (fabs(q1-q2)/q2 > MATH_TOLERANCE);
+  return one_sqrtpi*exp(-x*x)*q2;
+}
+
+#endif
+
+#if (defined _MSC_VER && _MSC_VER < 1800) || defined __ANDROID__ || (defined __FreeBSD__  &&  __FreeBSD_version < 803000)
+
+double
+log2(double x)
+{
+    return log10(x)/log10(2.0);
+}
+
+#endif
+
+/*
+  TRIGONOMETRIC FUNCTIONS
+*/
+
+/*
+ *  call-seq:
+ *     Math.sin(x)    -> float
+ *
+ *  Computes the sine of <i>x</i> (expressed in radians). Returns
+ *  -1..1.
+ */
+static mrb_value
+math_sin(mrb_state *mrb, mrb_value obj)
+{
+  mrb_float x;
+
+  mrb_get_args(mrb, "f", &x);
+  x = sin(x);
+
+  return mrb_float_value(mrb, x);
+}
+
+/*
+ *  call-seq:
+ *     Math.cos(x)    -> float
+ *
+ *  Computes the cosine of <i>x</i> (expressed in radians). Returns
+ *  -1..1.
+ */
+static mrb_value
+math_cos(mrb_state *mrb, mrb_value obj)
+{
+  mrb_float x;
+
+  mrb_get_args(mrb, "f", &x);
+  x = cos(x);
+
+  return mrb_float_value(mrb, x);
+}
+
+/*
+ *  call-seq:
+ *     Math.tan(x)    -> float
+ *
+ *  Returns the tangent of <i>x</i> (expressed in radians).
+ */
+static mrb_value
+math_tan(mrb_state *mrb, mrb_value obj)
+{
+  mrb_float x;
+
+  mrb_get_args(mrb, "f", &x);
+  x = tan(x);
+
+  return mrb_float_value(mrb, x);
+}
+
+/*
+  INVERSE TRIGONOMETRIC FUNCTIONS
+*/
+
+/*
+ *  call-seq:
+ *     Math.asin(x)    -> float
+ *
+ *  Computes the arc sine of <i>x</i>. Returns -{PI/2} .. {PI/2}.
+ */
+static mrb_value
+math_asin(mrb_state *mrb, mrb_value obj)
+{
+  mrb_float x;
+
+  mrb_get_args(mrb, "f", &x);
+  if (x < -1.0 || x > 1.0) {
+    domain_error(mrb, "asin");
+  }
+  x = asin(x);
+
+  return mrb_float_value(mrb, x);
+}
+
+/*
+ *  call-seq:
+ *     Math.acos(x)    -> float
+ *
+ *  Computes the arc cosine of <i>x</i>. Returns 0..PI.
+ */
+static mrb_value
+math_acos(mrb_state *mrb, mrb_value obj)
+{
+  mrb_float x;
+
+  mrb_get_args(mrb, "f", &x);
+  if (x < -1.0 || x > 1.0) {
+    domain_error(mrb, "acos");
+  }
+  x = acos(x);
+
+  return mrb_float_value(mrb, x);
+}
+
+/*
+ *  call-seq:
+ *     Math.atan(x)    -> float
+ *
+ *  Computes the arc tangent of <i>x</i>. Returns -{PI/2} .. {PI/2}.
+ */
+static mrb_value
+math_atan(mrb_state *mrb, mrb_value obj)
+{
+  mrb_float x;
+
+  mrb_get_args(mrb, "f", &x);
+  x = atan(x);
+
+  return mrb_float_value(mrb, x);
+}
+
+/*
+ *  call-seq:
+ *     Math.atan2(y, x)  -> float
+ *
+ *  Computes the arc tangent given <i>y</i> and <i>x</i>. Returns
+ *  -PI..PI.
+ *
+ *    Math.atan2(-0.0, -1.0) #=> -3.141592653589793
+ *    Math.atan2(-1.0, -1.0) #=> -2.356194490192345
+ *    Math.atan2(-1.0, 0.0)  #=> -1.5707963267948966
+ *    Math.atan2(-1.0, 1.0)  #=> -0.7853981633974483
+ *    Math.atan2(-0.0, 1.0)  #=> -0.0
+ *    Math.atan2(0.0, 1.0)   #=> 0.0
+ *    Math.atan2(1.0, 1.0)   #=> 0.7853981633974483
+ *    Math.atan2(1.0, 0.0)   #=> 1.5707963267948966
+ *    Math.atan2(1.0, -1.0)  #=> 2.356194490192345
+ *    Math.atan2(0.0, -1.0)  #=> 3.141592653589793
+ *
+ */
+static mrb_value
+math_atan2(mrb_state *mrb, mrb_value obj)
+{
+  mrb_float x, y;
+
+  mrb_get_args(mrb, "ff", &x, &y);
+  x = atan2(x, y);
+
+  return mrb_float_value(mrb, x);
+}
+
+
+
+/*
+  HYPERBOLIC TRIG FUNCTIONS
+*/
+/*
+ *  call-seq:
+ *     Math.sinh(x)    -> float
+ *
+ *  Computes the hyperbolic sine of <i>x</i> (expressed in
+ *  radians).
+ */
+static mrb_value
+math_sinh(mrb_state *mrb, mrb_value obj)
+{
+  mrb_float x;
+
+  mrb_get_args(mrb, "f", &x);
+  x = sinh(x);
+
+  return mrb_float_value(mrb, x);
+}
+
+/*
+ *  call-seq:
+ *     Math.cosh(x)    -> float
+ *
+ *  Computes the hyperbolic cosine of <i>x</i> (expressed in radians).
+ */
+static mrb_value
+math_cosh(mrb_state *mrb, mrb_value obj)
+{
+  mrb_float x;
+
+  mrb_get_args(mrb, "f", &x);
+  x = cosh(x);
+
+  return mrb_float_value(mrb, x);
+}
+
+/*
+ *  call-seq:
+ *     Math.tanh()    -> float
+ *
+ *  Computes the hyperbolic tangent of <i>x</i> (expressed in
+ *  radians).
+ */
+static mrb_value
+math_tanh(mrb_state *mrb, mrb_value obj)
+{
+  mrb_float x;
+
+  mrb_get_args(mrb, "f", &x);
+  x = tanh(x);
+
+  return mrb_float_value(mrb, x);
+}
+
+
+/*
+  INVERSE HYPERBOLIC TRIG FUNCTIONS
+*/
+
+/*
+ *  call-seq:
+ *     Math.asinh(x)    -> float
+ *
+ *  Computes the inverse hyperbolic sine of <i>x</i>.
+ */
+static mrb_value
+math_asinh(mrb_state *mrb, mrb_value obj)
+{
+  mrb_float x;
+
+  mrb_get_args(mrb, "f", &x);
+
+  x = asinh(x);
+
+  return mrb_float_value(mrb, x);
+}
+
+/*
+ *  call-seq:
+ *     Math.acosh(x)    -> float
+ *
+ *  Computes the inverse hyperbolic cosine of <i>x</i>.
+ */
+static mrb_value
+math_acosh(mrb_state *mrb, mrb_value obj)
+{
+  mrb_float x;
+
+  mrb_get_args(mrb, "f", &x);
+  if (x < 1.0) {
+    domain_error(mrb, "acosh");
+  }
+  x = acosh(x);
+
+  return mrb_float_value(mrb, x);
+}
+
+/*
+ *  call-seq:
+ *     Math.atanh(x)    -> float
+ *
+ *  Computes the inverse hyperbolic tangent of <i>x</i>.
+ */
+static mrb_value
+math_atanh(mrb_state *mrb, mrb_value obj)
+{
+  mrb_float x;
+
+  mrb_get_args(mrb, "f", &x);
+  if (x < -1.0 || x > 1.0) {
+    domain_error(mrb, "atanh");
+  }
+  x = atanh(x);
+
+  return mrb_float_value(mrb, x);
+}
+
+/*
+  EXPONENTIALS AND LOGARITHMS
+*/
+
+/*
+ *  call-seq:
+ *     Math.exp(x)    -> float
+ *
+ *  Returns e**x.
+ *
+ *    Math.exp(0)       #=> 1.0
+ *    Math.exp(1)       #=> 2.718281828459045
+ *    Math.exp(1.5)     #=> 4.4816890703380645
+ *
+ */
+static mrb_value
+math_exp(mrb_state *mrb, mrb_value obj)
+{
+  mrb_float x;
+
+  mrb_get_args(mrb, "f", &x);
+  x = exp(x);
+
+  return mrb_float_value(mrb, x);
+}
+
+/*
+ *  call-seq:
+ *     Math.log(numeric)    -> float
+ *     Math.log(num,base)   -> float
+ *
+ *  Returns the natural logarithm of <i>numeric</i>.
+ *  If additional second argument is given, it will be the base
+ *  of logarithm.
+ *
+ *    Math.log(1)          #=> 0.0
+ *    Math.log(Math::E)    #=> 1.0
+ *    Math.log(Math::E**3) #=> 3.0
+ *    Math.log(12,3)       #=> 2.2618595071429146
+ *
+ */
+static mrb_value
+math_log(mrb_state *mrb, mrb_value obj)
+{
+  mrb_float x, base;
+  int argc;
+
+  argc = mrb_get_args(mrb, "f|f", &x, &base);
+  if (x < 0.0) {
+    domain_error(mrb, "log");
+  }
+  x = log(x);
+  if (argc == 2) {
+    if (base < 0.0) {
+      domain_error(mrb, "log");
+    }
+    x /= log(base);
+  }
+  return mrb_float_value(mrb, x);
+}
+
+/*
+ *  call-seq:
+ *     Math.log2(numeric)    -> float
+ *
+ *  Returns the base 2 logarithm of <i>numeric</i>.
+ *
+ *    Math.log2(1)      #=> 0.0
+ *    Math.log2(2)      #=> 1.0
+ *    Math.log2(32768)  #=> 15.0
+ *    Math.log2(65536)  #=> 16.0
+ *
+ */
+static mrb_value
+math_log2(mrb_state *mrb, mrb_value obj)
+{
+  mrb_float x;
+
+  mrb_get_args(mrb, "f", &x);
+  if (x < 0.0) {
+    domain_error(mrb, "log2");
+  }
+  x = log2(x);
+
+  return mrb_float_value(mrb, x);
+}
+
+/*
+ *  call-seq:
+ *     Math.log10(numeric)    -> float
+ *
+ *  Returns the base 10 logarithm of <i>numeric</i>.
+ *
+ *    Math.log10(1)       #=> 0.0
+ *    Math.log10(10)      #=> 1.0
+ *    Math.log10(10**100) #=> 100.0
+ *
+ */
+static mrb_value
+math_log10(mrb_state *mrb, mrb_value obj)
+{
+  mrb_float x;
+
+  mrb_get_args(mrb, "f", &x);
+  if (x < 0.0) {
+    domain_error(mrb, "log10");
+  }
+  x = log10(x);
+
+  return mrb_float_value(mrb, x);
+}
+
+/*
+ *  call-seq:
+ *     Math.sqrt(numeric)    -> float
+ *
+ *  Returns the square root of <i>numeric</i>.
+ *
+ */
+static mrb_value
+math_sqrt(mrb_state *mrb, mrb_value obj)
+{
+  mrb_float x;
+
+  mrb_get_args(mrb, "f", &x);
+  if (x < 0.0) {
+    domain_error(mrb, "sqrt");
+  }
+  x = sqrt(x);
+
+  return mrb_float_value(mrb, x);
+}
+
+
+/*
+ *  call-seq:
+ *     Math.cbrt(numeric)    -> float
+ *
+ *  Returns the cube root of <i>numeric</i>.
+ *
+ *    -9.upto(9) {|x|
+ *      p [x, Math.cbrt(x), Math.cbrt(x)**3]
+ *    }
+ *    #=>
+ *    [-9, -2.0800838230519, -9.0]
+ *    [-8, -2.0, -8.0]
+ *    [-7, -1.91293118277239, -7.0]
+ *    [-6, -1.81712059283214, -6.0]
+ *    [-5, -1.7099759466767, -5.0]
+ *    [-4, -1.5874010519682, -4.0]
+ *    [-3, -1.44224957030741, -3.0]
+ *    [-2, -1.25992104989487, -2.0]
+ *    [-1, -1.0, -1.0]
+ *    [0, 0.0, 0.0]
+ *    [1, 1.0, 1.0]
+ *    [2, 1.25992104989487, 2.0]
+ *    [3, 1.44224957030741, 3.0]
+ *    [4, 1.5874010519682, 4.0]
+ *    [5, 1.7099759466767, 5.0]
+ *    [6, 1.81712059283214, 6.0]
+ *    [7, 1.91293118277239, 7.0]
+ *    [8, 2.0, 8.0]
+ *    [9, 2.0800838230519, 9.0]
+ *
+ */
+static mrb_value
+math_cbrt(mrb_state *mrb, mrb_value obj)
+{
+  mrb_float x;
+
+  mrb_get_args(mrb, "f", &x);
+  x = cbrt(x);
+
+  return mrb_float_value(mrb, x);
+}
+
+
+/*
+ *  call-seq:
+ *     Math.frexp(numeric)    -> [ fraction, exponent ]
+ *
+ *  Returns a two-element array containing the normalized fraction (a
+ *  <code>Float</code>) and exponent (a <code>Fixnum</code>) of
+ *  <i>numeric</i>.
+ *
+ *     fraction, exponent = Math.frexp(1234)   #=> [0.6025390625, 11]
+ *     fraction * 2**exponent                  #=> 1234.0
+ */
+static mrb_value
+math_frexp(mrb_state *mrb, mrb_value obj)
+{
+  mrb_float x;
+  int exp;
+
+  mrb_get_args(mrb, "f", &x);
+  x = frexp(x, &exp);
+
+  return mrb_assoc_new(mrb, mrb_float_value(mrb, x), mrb_fixnum_value(exp));
+}
+
+/*
+ *  call-seq:
+ *     Math.ldexp(flt, int) -> float
+ *
+ *  Returns the value of <i>flt</i>*(2**<i>int</i>).
+ *
+ *     fraction, exponent = Math.frexp(1234)
+ *     Math.ldexp(fraction, exponent)   #=> 1234.0
+ */
+static mrb_value
+math_ldexp(mrb_state *mrb, mrb_value obj)
+{
+  mrb_float x;
+  mrb_int   i;
+
+  mrb_get_args(mrb, "fi", &x, &i);
+  x = ldexp(x, i);
+
+  return mrb_float_value(mrb, x);
+}
+
+/*
+ *  call-seq:
+ *     Math.hypot(x, y)    -> float
+ *
+ *  Returns sqrt(x**2 + y**2), the hypotenuse of a right-angled triangle
+ *  with sides <i>x</i> and <i>y</i>.
+ *
+ *     Math.hypot(3, 4)   #=> 5.0
+ */
+static mrb_value
+math_hypot(mrb_state *mrb, mrb_value obj)
+{
+  mrb_float x, y;
+
+  mrb_get_args(mrb, "ff", &x, &y);
+  x = hypot(x, y);
+
+  return mrb_float_value(mrb, x);
+}
+
+/*
+ * call-seq:
+ *    Math.erf(x)  -> float
+ *
+ *  Calculates the error function of x.
+ */
+static mrb_value
+math_erf(mrb_state *mrb, mrb_value obj)
+{
+  mrb_float x;
+
+  mrb_get_args(mrb, "f", &x);
+  x = erf(x);
+
+  return mrb_float_value(mrb, x);
+}
+
+
+/*
+ * call-seq:
+ *    Math.erfc(x)  -> float
+ *
+ *  Calculates the complementary error function of x.
+ */
+static mrb_value
+math_erfc(mrb_state *mrb, mrb_value obj)
+{
+  mrb_float x;
+
+  mrb_get_args(mrb, "f", &x);
+  x = erfc(x);
+
+  return mrb_float_value(mrb, x);
+}
+
+/* ------------------------------------------------------------------------*/
+void
+mrb_mruby_math_gem_init(mrb_state* mrb)
+{
+  struct RClass *mrb_math;
+  mrb_math = mrb_define_module(mrb, "Math");
+
+  mrb_define_class_under(mrb, mrb_math, "DomainError", mrb->eStandardError_class);
+
+#ifdef M_PI
+  mrb_define_const(mrb, mrb_math, "PI", mrb_float_value(mrb, M_PI));
+#else
+  mrb_define_const(mrb, mrb_math, "PI", mrb_float_value(mrb, atan(1.0)*4.0));
+#endif
+
+#ifdef M_E
+  mrb_define_const(mrb, mrb_math, "E", mrb_float_value(mrb, M_E));
+#else
+  mrb_define_const(mrb, mrb_math, "E", mrb_float_value(mrb, exp(1.0)));
+#endif
+
+#ifdef MRB_USE_FLOAT
+  mrb_define_const(mrb, mrb_math, "TOLERANCE", mrb_float_value(mrb, 1e-5));
+#else
+  mrb_define_const(mrb, mrb_math, "TOLERANCE", mrb_float_value(mrb, 1e-12));
+#endif
+
+  mrb_define_module_function(mrb, mrb_math, "sin", math_sin, MRB_ARGS_REQ(1));
+  mrb_define_module_function(mrb, mrb_math, "cos", math_cos, MRB_ARGS_REQ(1));
+  mrb_define_module_function(mrb, mrb_math, "tan", math_tan, MRB_ARGS_REQ(1));
+
+  mrb_define_module_function(mrb, mrb_math, "asin", math_asin, MRB_ARGS_REQ(1));
+  mrb_define_module_function(mrb, mrb_math, "acos", math_acos, MRB_ARGS_REQ(1));
+  mrb_define_module_function(mrb, mrb_math, "atan", math_atan, MRB_ARGS_REQ(1));
+  mrb_define_module_function(mrb, mrb_math, "atan2", math_atan2, MRB_ARGS_REQ(2));
+
+  mrb_define_module_function(mrb, mrb_math, "sinh", math_sinh, MRB_ARGS_REQ(1));
+  mrb_define_module_function(mrb, mrb_math, "cosh", math_cosh, MRB_ARGS_REQ(1));
+  mrb_define_module_function(mrb, mrb_math, "tanh", math_tanh, MRB_ARGS_REQ(1));
+
+  mrb_define_module_function(mrb, mrb_math, "asinh", math_asinh, MRB_ARGS_REQ(1));
+  mrb_define_module_function(mrb, mrb_math, "acosh", math_acosh, MRB_ARGS_REQ(1));
+  mrb_define_module_function(mrb, mrb_math, "atanh", math_atanh, MRB_ARGS_REQ(1));
+
+  mrb_define_module_function(mrb, mrb_math, "exp", math_exp, MRB_ARGS_REQ(1));
+  mrb_define_module_function(mrb, mrb_math, "log", math_log, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1));
+  mrb_define_module_function(mrb, mrb_math, "log2", math_log2, MRB_ARGS_REQ(1));
+  mrb_define_module_function(mrb, mrb_math, "log10", math_log10, MRB_ARGS_REQ(1));
+  mrb_define_module_function(mrb, mrb_math, "sqrt", math_sqrt, MRB_ARGS_REQ(1));
+  mrb_define_module_function(mrb, mrb_math, "cbrt", math_cbrt, MRB_ARGS_REQ(1));
+
+  mrb_define_module_function(mrb, mrb_math, "frexp", math_frexp, MRB_ARGS_REQ(1));
+  mrb_define_module_function(mrb, mrb_math, "ldexp", math_ldexp, MRB_ARGS_REQ(2));
+
+  mrb_define_module_function(mrb, mrb_math, "hypot", math_hypot, MRB_ARGS_REQ(2));
+
+  mrb_define_module_function(mrb, mrb_math, "erf",  math_erf,  MRB_ARGS_REQ(1));
+  mrb_define_module_function(mrb, mrb_math, "erfc", math_erfc, MRB_ARGS_REQ(1));
+}
+
+void
+mrb_mruby_math_gem_final(mrb_state* mrb)
+{
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-mbed/gem_init.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,22 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ *   This file was generated!
+ *   All manual changes will get lost.
+ */
+#include "mruby.h"
+void mrb_mruby_mbed_gem_init(mrb_state *mrb);
+void mrb_mruby_mbed_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_mbed_gem_init(mrb_state *mrb) {
+  int ai = mrb_gc_arena_save(mrb);
+  mrb_mruby_mbed_gem_init(mrb);
+  mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_mbed_gem_final(mrb_state *mrb) {
+  mrb_mruby_mbed_gem_final(mrb);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-mbed/mbed.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,211 @@
+/*
+** mbed.c - mbed module
+**
+*/
+
+#include "mruby.h"
+#include "mruby/data.h"
+
+#include "mrbPinName.h"
+#include "mrbDigitalOut.h"
+#include "mrbTimer.h"
+#include "mrbMbedFunc.h"
+
+/**
+ * mbed
+ */
+static mrb_value
+mrb_mbed_sleep(mrb_state *mrb, mrb_value obj)
+{
+    mrb_int t;
+    mrb_get_args(mrb, "i", &t);
+    mbedSleep(t);
+
+    return obj;
+}
+
+static mrb_value
+mrb_mbed_sleep_ms(mrb_state *mrb, mrb_value obj)
+{
+    mrb_int t;
+    mrb_get_args(mrb, "i", &t);
+    mbedSleepMS(t);
+
+    return obj;
+}
+
+static mrb_value
+mrb_mbed_sleep_us(mrb_state *mrb, mrb_value obj)
+{
+    mrb_int t;
+    mrb_get_args(mrb, "i", &t);
+    mbedSleepUS(t);
+
+    return obj;
+}
+
+/**
+ * mbed::I2C
+ */
+
+
+/**
+ * mbed::DigitalOut
+ */
+static void mbed_do_free(mrb_state *mrb, void *ptr) {
+    delDigitalOut(ptr);
+}
+
+static struct mrb_data_type mbed_do_type = {
+    "DigitalOut", mbed_do_free
+};
+
+static mrb_value
+mrb_mbed_do_init(mrb_state *mrb, mrb_value self)
+{
+    mrb_int pin;
+    mrb_get_args(mrb, "i", &pin);
+
+    DATA_TYPE(self) = &mbed_do_type;
+    DATA_PTR(self) = newDigitalOut(pin);
+
+    return self;
+}
+
+static mrb_value
+mrb_mbed_do_write(mrb_state *mrb, mrb_value self)
+{
+    void *do_obj = DATA_PTR(self);
+
+    mrb_int val;
+    mrb_get_args(mrb, "i", &val);
+
+    writeDigitalOut(do_obj, val);
+
+    return self;
+}
+
+static mrb_value
+mrb_mbed_do_read(mrb_state *mrb, mrb_value self)
+{
+    void *do_obj = DATA_PTR(self);
+
+    return mrb_fixnum_value(readDigitalOut(do_obj));
+}
+
+/**
+ * mbed::Timer
+ */
+static void mbed_timer_free(mrb_state *mrb, void *ptr) {
+    delTimer(ptr);
+}
+
+static struct mrb_data_type mbed_timer_type = {
+    "Timer", mbed_timer_free
+};
+
+static mrb_value
+mrb_mbed_timer_init(mrb_state *mrb, mrb_value self)
+{
+    void *timer_obj;
+
+    DATA_TYPE(self) = &mbed_timer_type;
+    DATA_PTR(self) = newTimer();
+
+    return self;
+}
+
+static mrb_value
+mrb_mbed_timer_start(mrb_state *mrb, mrb_value self)
+{
+    void *timer_obj = DATA_PTR(self);
+
+    startTimer(timer_obj);
+
+    return self;
+}
+
+static mrb_value
+mrb_mbed_timer_stop(mrb_state *mrb, mrb_value self)
+{
+    void *timer_obj = DATA_PTR(self);
+
+    stopTimer(timer_obj);
+
+    return self;
+}
+
+static mrb_value
+mrb_mbed_timer_reset(mrb_state *mrb, mrb_value self)
+{
+    void *timer_obj = DATA_PTR(self);
+
+    resetTimer(timer_obj);
+
+    return self;
+}
+
+static mrb_value
+mrb_mbed_timer_read(mrb_state *mrb, mrb_value self)
+{
+    void *timer_obj = DATA_PTR(self);
+
+    return mrb_float_value(mrb, readTimer(timer_obj));
+}
+
+static mrb_value
+mrb_mbed_timer_read_ms(mrb_state *mrb, mrb_value self)
+{
+    void *timer_obj = DATA_PTR(self);
+
+    return mrb_fixnum_value(readMSTimer(timer_obj));
+}
+
+static mrb_value
+mrb_mbed_timer_read_us(mrb_state *mrb, mrb_value self)
+{
+    void *timer_obj = DATA_PTR(self);
+
+    return mrb_fixnum_value(readUSTimer(timer_obj));
+}
+
+/* ------------------------------------------------------------------------*/
+void
+mrb_mruby_mbed_gem_init(mrb_state* mrb)
+{
+    struct RClass *mrb_mbed;
+    struct RClass *mrb_mbed_do;
+    struct RClass *mrb_mbed_timer;
+
+    mrb_mbed = mrb_define_module(mrb, "Mbed");
+    mrb_define_const(mrb,   mrb_mbed,   "LED1",         mrb_fixnum_value(LED1));
+    mrb_define_const(mrb,   mrb_mbed,   "LED2",         mrb_fixnum_value(LED2));
+    mrb_define_const(mrb,   mrb_mbed,   "LED3",         mrb_fixnum_value(LED3));
+    mrb_define_const(mrb,   mrb_mbed,   "LED4",         mrb_fixnum_value(LED4));
+    mrb_define_const(mrb,   mrb_mbed,   "LED_RED",      mrb_fixnum_value(LED_RED));
+    mrb_define_const(mrb,   mrb_mbed,   "LED_GREEN",    mrb_fixnum_value(LED_GREEN));
+    mrb_define_const(mrb,   mrb_mbed,   "LED_BLUE",     mrb_fixnum_value(LED_BLUE));
+    mrb_define_const(mrb,   mrb_mbed,   "LED_USER",     mrb_fixnum_value(LED_USER));
+    mrb_define_module_function(mrb, mrb_mbed,   "sleep",    mrb_mbed_sleep, MRB_ARGS_REQ(1));
+    mrb_define_module_function(mrb, mrb_mbed,   "sleep_ms", mrb_mbed_sleep, MRB_ARGS_REQ(1));
+    mrb_define_module_function(mrb, mrb_mbed,   "sleep_us", mrb_mbed_sleep, MRB_ARGS_REQ(1));
+    
+    mrb_mbed_do = mrb_define_class_under(mrb, mrb_mbed, "DigitalOut", mrb->object_class);
+    mrb_define_method(mrb,  mrb_mbed_do,    "initialize",   mrb_mbed_do_init,       MRB_ARGS_REQ(1));
+    mrb_define_method(mrb,  mrb_mbed_do,    "write",        mrb_mbed_do_write,      MRB_ARGS_REQ(1));
+    mrb_define_method(mrb,  mrb_mbed_do,    "read",         mrb_mbed_do_read,       MRB_ARGS_NONE());
+
+    mrb_mbed_timer = mrb_define_class_under(mrb, mrb_mbed, "Timer", mrb->object_class);
+    mrb_define_method(mrb,  mrb_mbed_timer, "initialize",   mrb_mbed_timer_init,    MRB_ARGS_NONE());
+    mrb_define_method(mrb,  mrb_mbed_timer, "start",        mrb_mbed_timer_start,   MRB_ARGS_NONE());
+    mrb_define_method(mrb,  mrb_mbed_timer, "stop",         mrb_mbed_timer_stop,    MRB_ARGS_NONE());
+    mrb_define_method(mrb,  mrb_mbed_timer, "reset",        mrb_mbed_timer_reset,   MRB_ARGS_NONE());
+    mrb_define_method(mrb,  mrb_mbed_timer, "read",         mrb_mbed_timer_read,    MRB_ARGS_NONE());
+    mrb_define_method(mrb,  mrb_mbed_timer, "read_ms",      mrb_mbed_timer_read_ms, MRB_ARGS_NONE());
+    mrb_define_method(mrb,  mrb_mbed_timer, "read_us",      mrb_mbed_timer_read_us, MRB_ARGS_NONE());
+}
+
+void
+mrb_mruby_mbed_gem_final(mrb_state* mrb)
+{
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-mbed/mrbDigitalOut.cpp	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,30 @@
+#include "mbed.h"
+#include "mrbDigitalOut.h"
+
+void *
+newDigitalOut(int pin)
+{
+    PinName pinname = static_cast<PinName>(pin);
+    return static_cast<void*>(new DigitalOut(pinname));
+}
+
+void
+delDigitalOut(void *ptr)
+{
+    DigitalOut *obj = static_cast<DigitalOut*>(ptr);
+    delete obj;
+}
+
+void
+writeDigitalOut(void *ptr, int val)
+{
+    DigitalOut *obj = static_cast<DigitalOut*>(ptr);
+    obj->write(val);
+}
+
+int
+readDigitalOut(void *ptr)
+{
+    DigitalOut *obj = static_cast<DigitalOut*>(ptr);
+    return obj->read();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-mbed/mrbDigitalOut.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,12 @@
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void *newDigitalOut(int pin);
+void delDigitalOut(void *object);
+void writeDigitalOut(void *object, int value);
+int readDigitalOut(void *object);
+
+#ifdef __cplusplus
+}
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-mbed/mrbMbedFunc.cpp	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,20 @@
+#include "mbed.h"
+#include "mrbMbedFunc.h"
+
+void
+mbedSleep(int t)
+{
+    wait((float)t);
+}
+
+void
+mbedSleepMS(int t)
+{
+    wait_ms(t);
+}
+
+void
+mbedSleepUS(int t)
+{
+    wait_us(t);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-mbed/mrbMbedFunc.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,11 @@
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void mbedSleep(int t);
+void mbedSleepMS(int t);
+void mbedSleepUS(int t);
+
+#ifdef __cplusplus
+}
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-mbed/mrbPinName.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,4 @@
+
+#include "PinNames.h"
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-mbed/mrbTimer.cpp	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,59 @@
+#include "mbed.h"
+#include "mrbTimer.h"
+
+void *
+newTimer()
+{
+    return static_cast<void*>(new Timer());
+}
+
+void
+delTimer(void *ptr)
+{
+    Timer *obj = static_cast<Timer*>(ptr);
+    delete obj;
+}
+
+void
+startTimer(void *ptr)
+{
+    Timer *obj = static_cast<Timer*>(ptr);
+    obj->start();
+}
+
+void
+stopTimer(void *ptr)
+{
+    Timer *obj = static_cast<Timer*>(ptr);
+    obj->stop();
+}
+
+void
+resetTimer(void *ptr)
+{
+    Timer *obj = static_cast<Timer*>(ptr);
+    obj->reset();
+}
+
+float
+readTimer(void *ptr)
+{
+    Timer *obj = static_cast<Timer*>(ptr);
+    return obj->read();
+}
+
+int
+readMSTimer(void *ptr)
+{
+    Timer *obj = static_cast<Timer*>(ptr);
+    return obj->read_ms();
+}
+
+int
+readUSTimer(void *ptr)
+{
+    Timer *obj = static_cast<Timer*>(ptr);
+    return obj->read_us();
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-mbed/mrbTimer.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,18 @@
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void *newTimer();
+void delTimer(void *ptr);
+void startTimer(void *ptr);
+void stopTimer(void *ptr);
+void resetTimer(void *ptr);
+float readTimer(void *ptr);
+int readMSTimer(void *ptr);
+int readUSTimer(void *ptr);
+
+#ifdef __cplusplus
+}
+#endif
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-numeric-ext/gem_init.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,53 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ *   This file was generated!
+ *   All manual changes will get lost.
+ */
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+gem_mrblib_irep_mruby_numeric_ext[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0x63,0x2e,0x00,0x00,0x00,0xe9,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x00,0xb0,0x30,0x30,
+0x30,0x30,0x00,0x00,0x00,0x35,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x04,
+0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0x45,0x00,0x80,0x00,0x4a,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x08,0x49,0x6e,0x74,0x65,0x67,0x72,
+0x61,0x6c,0x00,0x00,0x00,0x00,0x34,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,
+0x05,0x00,0x00,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,
+0x04,0x00,0x80,0x00,0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x03,0x64,0x69,0x76,0x00,0x00,0x00,0x00,0x44,0x00,0x03,0x00,0x06,0x00,0x00,
+0x00,0x00,0x00,0x07,0x26,0x00,0x00,0x02,0x06,0x00,0x80,0x01,0x01,0x40,0x00,0x02,
+0xa0,0x00,0x80,0x01,0x83,0xff,0x3f,0x02,0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x64,0x69,0x76,0x6d,0x6f,0x64,
+0x00,0x00,0x02,0x5b,0x5d,0x00,0x4c,0x56,0x41,0x52,0x00,0x00,0x00,0x1b,0x00,0x00,
+0x00,0x01,0x00,0x05,0x6f,0x74,0x68,0x65,0x72,0x00,0x00,0x00,0x01,0xff,0xff,0x00,
+0x00,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08,
+};
+void mrb_mruby_numeric_ext_gem_init(mrb_state *mrb);
+void mrb_mruby_numeric_ext_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_numeric_ext_gem_init(mrb_state *mrb) {
+  int ai = mrb_gc_arena_save(mrb);
+  mrb_mruby_numeric_ext_gem_init(mrb);
+  mrb_load_irep(mrb, gem_mrblib_irep_mruby_numeric_ext);
+  if (mrb->exc) {
+    mrb_print_error(mrb);
+    exit(EXIT_FAILURE);
+  }
+  mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_numeric_ext_gem_final(mrb_state *mrb) {
+  mrb_mruby_numeric_ext_gem_final(mrb);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-numeric-ext/numeric_ext.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,31 @@
+#include <limits.h>
+#include "mruby.h"
+
+static mrb_value
+mrb_int_chr(mrb_state *mrb, mrb_value x)
+{
+  mrb_int chr;
+  char c;
+
+  chr = mrb_fixnum(x);
+  if (chr >= (1 << CHAR_BIT)) {
+    mrb_raisef(mrb, E_RANGE_ERROR, "%S out of char range", x);
+  }
+  c = (char)chr;
+
+  return mrb_str_new(mrb, &c, 1);
+}
+
+void
+mrb_mruby_numeric_ext_gem_init(mrb_state* mrb)
+{
+  struct RClass *i = mrb_class_get(mrb, "Integer");
+
+  mrb_define_method(mrb, i, "chr", mrb_int_chr, MRB_ARGS_NONE());
+}
+
+void
+mrb_mruby_numeric_ext_gem_final(mrb_state* mrb)
+{
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-object-ext/gem_init.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,52 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ *   This file was generated!
+ *   All manual changes will get lost.
+ */
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+gem_mrblib_irep_mruby_object_ext[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0x55,0xf0,0x00,0x00,0x00,0xd3,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x00,0xa5,0x30,0x30,
+0x30,0x30,0x00,0x00,0x00,0x37,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x00,0x80,0x00,0x45,0x00,0x80,0x00,
+0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x06,0x4f,0x62,
+0x6a,0x65,0x63,0x74,0x00,0x00,0x00,0x00,0x34,0x00,0x01,0x00,0x03,0x00,0x01,0x00,
+0x00,0x00,0x05,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,
+0x04,0x00,0x80,0x00,0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x03,0x74,0x61,0x70,0x00,0x00,0x00,0x00,0x39,0x00,0x02,0x00,0x04,0x00,0x00,
+0x00,0x00,0x00,0x06,0x26,0x00,0x00,0x00,0x2b,0x00,0x00,0x01,0x06,0x00,0x80,0x01,
+0xa0,0x00,0x00,0x01,0x06,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x4c,0x56,0x41,0x52,0x00,
+0x00,0x00,0x10,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x45,0x4e,0x44,0x00,0x00,
+0x00,0x00,0x08,
+};
+void mrb_mruby_object_ext_gem_init(mrb_state *mrb);
+void mrb_mruby_object_ext_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_object_ext_gem_init(mrb_state *mrb) {
+  int ai = mrb_gc_arena_save(mrb);
+  mrb_mruby_object_ext_gem_init(mrb);
+  mrb_load_irep(mrb, gem_mrblib_irep_mruby_object_ext);
+  if (mrb->exc) {
+    mrb_print_error(mrb);
+    exit(EXIT_FAILURE);
+  }
+  mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_object_ext_gem_final(mrb_state *mrb) {
+  mrb_mruby_object_ext_gem_final(mrb);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-object-ext/object.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,106 @@
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/class.h"
+
+/*
+ *  call-seq:
+ *     nil.to_a    -> []
+ *
+ *  Always returns an empty array.
+ */
+
+static mrb_value
+nil_to_a(mrb_state *mrb, mrb_value obj)
+{
+  return mrb_ary_new(mrb);
+}
+
+/*
+ *  call-seq:
+ *     nil.to_f    -> 0.0
+ *
+ *  Always returns zero.
+ */
+
+static mrb_value
+nil_to_f(mrb_state *mrb, mrb_value obj)
+{
+  return mrb_float_value(mrb, 0.0);
+}
+
+/*
+ *  call-seq:
+ *     nil.to_i    -> 0
+ *
+ *  Always returns zero.
+ */
+
+static mrb_value
+nil_to_i(mrb_state *mrb, mrb_value obj)
+{
+  return mrb_fixnum_value(0);
+}
+
+/*
+ *  call-seq:
+ *     obj.instance_exec(arg...) {|var...| block }                       -> obj
+ *
+ *  Executes the given block within the context of the receiver
+ *  (_obj_). In order to set the context, the variable +self+ is set
+ *  to _obj_ while the code is executing, giving the code access to
+ *  _obj_'s instance variables.  Arguments are passed as block parameters.
+ *
+ *     class KlassWithSecret
+ *       def initialize
+ *         @secret = 99
+ *       end
+ *     end
+ *     k = KlassWithSecret.new
+ *     k.instance_exec(5) {|x| @secret+x }   #=> 104
+ */
+
+static mrb_value
+mrb_obj_instance_exec(mrb_state *mrb, mrb_value self)
+{
+  mrb_value *argv;
+  mrb_int argc;
+  mrb_value blk;
+  struct RClass *c;
+
+  mrb_get_args(mrb, "*&", &argv, &argc, &blk);
+
+  if (mrb_nil_p(blk)) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");
+  }
+
+  switch (mrb_type(self)) {
+  case MRB_TT_SYMBOL:
+  case MRB_TT_FIXNUM:
+  case MRB_TT_FLOAT:
+    c = NULL;
+    break;
+  default:
+    c = mrb_class_ptr(mrb_singleton_class(mrb, self));
+    break;
+  }
+
+  return mrb_yield_with_class(mrb, blk, argc, argv, self, c);
+}
+
+void
+mrb_mruby_object_ext_gem_init(mrb_state* mrb)
+{
+  struct RClass * n = mrb->nil_class;
+
+  mrb_define_method(mrb, n, "to_a", nil_to_a,       MRB_ARGS_NONE());
+  mrb_define_method(mrb, n, "to_f", nil_to_f,       MRB_ARGS_NONE());
+  mrb_define_method(mrb, n, "to_i", nil_to_i,       MRB_ARGS_NONE());
+
+  mrb_define_method(mrb, mrb->object_class, "instance_exec", mrb_obj_instance_exec, MRB_ARGS_ANY() | MRB_ARGS_BLOCK());
+}
+
+void
+mrb_mruby_object_ext_gem_final(mrb_state* mrb)
+{
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-objectspace/gem_init.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,22 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ *   This file was generated!
+ *   All manual changes will get lost.
+ */
+#include "mruby.h"
+void mrb_mruby_objectspace_gem_init(mrb_state *mrb);
+void mrb_mruby_objectspace_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_objectspace_gem_init(mrb_state *mrb) {
+  int ai = mrb_gc_arena_save(mrb);
+  mrb_mruby_objectspace_gem_init(mrb);
+  mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_objectspace_gem_final(mrb_state *mrb) {
+  mrb_mruby_objectspace_gem_final(mrb);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-objectspace/mruby_objectspace.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,186 @@
+#include "mruby.h"
+#include "mruby/gc.h"
+#include "mruby/hash.h"
+#include "mruby/class.h"
+
+struct os_count_struct {
+  mrb_int total;
+  mrb_int freed;
+  mrb_int counts[MRB_TT_MAXDEFINE+1];
+};
+
+static void
+os_count_object_type(mrb_state *mrb, struct RBasic *obj, void *data)
+{
+  struct os_count_struct *obj_count;
+  obj_count = (struct os_count_struct*)data;
+
+  obj_count->total++;
+
+  if (is_dead(mrb, obj)) {
+    obj_count->freed++;
+  }
+  else {
+    obj_count->counts[obj->tt]++;
+  }
+}
+
+/*
+ *  call-seq:
+ *     ObjectSpace.count_objects([result_hash]) -> hash
+ *
+ *  Counts objects for each type.
+ *
+ *  It returns a hash, such as:
+ *  {
+ *    :TOTAL=>10000,
+ *    :FREE=>3011,
+ *    :T_OBJECT=>6,
+ *    :T_CLASS=>404,
+ *    # ...
+ *  }
+ *
+ *  If the optional argument +result_hash+ is given,
+ *  it is overwritten and returned. This is intended to avoid probe effect.
+ *
+ */
+
+static mrb_value
+os_count_objects(mrb_state *mrb, mrb_value self)
+{
+  struct os_count_struct obj_count = { 0 };
+  enum mrb_vtype i;
+  mrb_value hash;
+
+  if (mrb_get_args(mrb, "|H", &hash) == 0) {
+    hash = mrb_hash_new(mrb);
+  }
+
+  if (!mrb_test(mrb_hash_empty_p(mrb, hash))) {
+    mrb_hash_clear(mrb, hash);
+  }
+
+  mrb_objspace_each_objects(mrb, os_count_object_type, &obj_count);
+
+  mrb_hash_set(mrb, hash, mrb_symbol_value(mrb_intern_lit(mrb, "TOTAL")), mrb_fixnum_value(obj_count.total));
+  mrb_hash_set(mrb, hash, mrb_symbol_value(mrb_intern_lit(mrb, "FREE")), mrb_fixnum_value(obj_count.freed));
+
+  for (i = MRB_TT_FALSE; i < MRB_TT_MAXDEFINE; i++) {
+    mrb_value type;
+    switch (i) {
+#define COUNT_TYPE(t) case (MRB_T ## t): type = mrb_symbol_value(mrb_intern_lit(mrb, #t)); break;
+      COUNT_TYPE(T_FALSE);
+      COUNT_TYPE(T_FREE);
+      COUNT_TYPE(T_TRUE);
+      COUNT_TYPE(T_FIXNUM);
+      COUNT_TYPE(T_SYMBOL);
+      COUNT_TYPE(T_UNDEF);
+      COUNT_TYPE(T_FLOAT);
+      COUNT_TYPE(T_CPTR);
+      COUNT_TYPE(T_OBJECT);
+      COUNT_TYPE(T_CLASS);
+      COUNT_TYPE(T_MODULE);
+      COUNT_TYPE(T_ICLASS);
+      COUNT_TYPE(T_SCLASS);
+      COUNT_TYPE(T_PROC);
+      COUNT_TYPE(T_ARRAY);
+      COUNT_TYPE(T_HASH);
+      COUNT_TYPE(T_STRING);
+      COUNT_TYPE(T_RANGE);
+      COUNT_TYPE(T_EXCEPTION);
+      COUNT_TYPE(T_FILE);
+      COUNT_TYPE(T_ENV);
+      COUNT_TYPE(T_DATA);
+      COUNT_TYPE(T_FIBER);
+#undef COUNT_TYPE
+    default:
+      type = mrb_fixnum_value(i); break;
+    }
+    if (obj_count.counts[i])
+      mrb_hash_set(mrb, hash, type, mrb_fixnum_value(obj_count.counts[i]));
+  }
+
+  return hash;
+}
+
+struct os_each_object_data {
+  mrb_value block;
+  struct RClass *target_module;
+  mrb_int count;
+};
+
+static void
+os_each_object_cb(mrb_state *mrb, struct RBasic *obj, void *ud)
+{
+  struct os_each_object_data *d = (struct os_each_object_data*)ud;
+
+  /* filter dead objects */
+  if (is_dead(mrb, obj)) {
+    return;
+  }
+
+  /* filter internal objects */
+  switch (obj->tt) {
+  case MRB_TT_ENV:
+  case MRB_TT_ICLASS:
+    return;
+  default:
+    break;
+  }
+
+  /* filter half baked (or internal) objects */
+  if (!obj->c) return;
+
+  /* filter class kind if target module defined */
+  if (d->target_module && !mrb_obj_is_kind_of(mrb, mrb_obj_value(obj), d->target_module)) {
+    return;
+  }
+
+  mrb_yield(mrb, d->block, mrb_obj_value(obj));
+  ++d->count;
+}
+
+/*
+ *  call-seq:
+ *     ObjectSpace.each_object([module]) {|obj| ... } -> fixnum
+ *
+ *  Calls the block once for each object in this Ruby process.
+ *  Returns the number of objects found.
+ *  If the optional argument +module+ is given,
+ *  calls the block for only those classes or modules
+ *  that match (or are a subclass of) +module+.
+ *
+ *  If no block is given, ArgumentError is raised.
+ *
+ */
+
+static mrb_value
+os_each_object(mrb_state *mrb, mrb_value self)
+{
+  mrb_value cls = mrb_nil_value();
+  struct os_each_object_data d;
+  mrb_get_args(mrb, "&|C", &d.block, &cls);
+
+  if (mrb_nil_p(d.block)) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "Expected block in ObjectSpace.each_object.");
+  }
+
+  d.target_module = mrb_nil_p(cls) ? NULL : mrb_class_ptr(cls);
+  d.count = 0;
+  mrb_objspace_each_objects(mrb, os_each_object_cb, &d);
+  return mrb_fixnum_value(d.count);
+}
+
+void
+mrb_mruby_objectspace_gem_init(mrb_state *mrb)
+{
+  struct RClass *os = mrb_define_module(mrb, "ObjectSpace");
+  mrb_define_class_method(mrb, os, "count_objects", os_count_objects, MRB_ARGS_OPT(1));
+  mrb_define_class_method(mrb, os, "each_object", os_each_object, MRB_ARGS_OPT(1));
+}
+
+void
+mrb_mruby_objectspace_gem_final(mrb_state *mrb)
+{
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-print/gem_init.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,117 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ *   This file was generated!
+ *   All manual changes will get lost.
+ */
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+gem_mrblib_irep_mruby_print[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0x5b,0x68,0x00,0x00,0x04,0xe5,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x04,0x5e,0x30,0x30,
+0x30,0x30,0x00,0x00,0x00,0x33,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x04,
+0x05,0x00,0x80,0x00,0x44,0x00,0x80,0x00,0x45,0x00,0x80,0x00,0x4a,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x06,0x4b,0x65,0x72,0x6e,0x65,0x6c,
+0x00,0x00,0x00,0x00,0xbf,0x00,0x01,0x00,0x04,0x00,0x06,0x00,0x00,0x00,0x1a,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x04,0x00,0x01,
+0x46,0x80,0x80,0x00,0x91,0x01,0x80,0x00,0x84,0x02,0x00,0x01,0xa0,0x00,0x81,0x00,
+0x99,0x02,0xc0,0x00,0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,0x46,0x80,0x81,0x00,
+0x04,0x03,0x80,0x00,0x97,0x03,0x40,0x00,0x48,0x00,0x80,0x00,0xc0,0x08,0x00,0x01,
+0x46,0x80,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x0a,0x00,0x01,0x46,0x40,0x81,0x00,
+0x84,0x02,0x80,0x00,0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,
+0x00,0x05,0x70,0x72,0x69,0x6e,0x74,0x00,0x00,0x04,0x70,0x75,0x74,0x73,0x00,0x00,
+0x01,0x70,0x00,0x00,0x06,0x4b,0x65,0x72,0x6e,0x65,0x6c,0x00,0x00,0x0b,0x72,0x65,
+0x73,0x70,0x6f,0x6e,0x64,0x5f,0x74,0x6f,0x3f,0x00,0x00,0x07,0x73,0x70,0x72,0x69,
+0x6e,0x74,0x66,0x00,0x00,0x06,0x70,0x72,0x69,0x6e,0x74,0x66,0x00,0x00,0x00,0x00,
+0x98,0x00,0x05,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x15,0x00,0x26,0x00,0x08,0x00,
+0x83,0xff,0xbf,0x01,0x01,0x40,0x80,0x02,0x20,0x00,0x80,0x02,0x01,0x40,0x01,0x02,
+0x97,0x04,0x40,0x00,0x06,0x00,0x80,0x02,0x01,0x40,0x00,0x03,0x01,0xc0,0x80,0x03,
+0xa0,0x80,0x00,0x03,0x20,0xc0,0x00,0x03,0xa0,0x40,0x80,0x02,0x01,0xc0,0x80,0x02,
+0xad,0x00,0x81,0x02,0x01,0x40,0x81,0x01,0x01,0xc0,0x80,0x02,0x01,0x00,0x01,0x03,
+0xb3,0x40,0x81,0x02,0x98,0xf9,0xbf,0x02,0x05,0x00,0x80,0x02,0x29,0x00,0x80,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,
+0x0c,0x5f,0x5f,0x70,0x72,0x69,0x6e,0x74,0x73,0x74,0x72,0x5f,0x5f,0x00,0x00,0x02,
+0x5b,0x5d,0x00,0x00,0x04,0x74,0x6f,0x5f,0x73,0x00,0x00,0x01,0x2b,0x00,0x00,0x01,
+0x3c,0x00,0x00,0x00,0x00,0xee,0x00,0x06,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x27,
+0x26,0x00,0x08,0x00,0x83,0xff,0xbf,0x01,0x01,0x40,0x00,0x03,0x20,0x00,0x00,0x03,
+0x01,0x80,0x01,0x02,0x17,0x0a,0x40,0x00,0x01,0x40,0x00,0x03,0x01,0xc0,0x80,0x03,
+0xa0,0x40,0x00,0x03,0x20,0x80,0x00,0x03,0x01,0x80,0x81,0x02,0x06,0x00,0x00,0x03,
+0x01,0x40,0x81,0x03,0xa0,0xc0,0x00,0x03,0x01,0x40,0x01,0x03,0x03,0xff,0xbf,0x03,
+0xa0,0x40,0x00,0x03,0x3d,0x00,0x80,0x03,0xa0,0x00,0x01,0x03,0x99,0x01,0x40,0x03,
+0x06,0x00,0x00,0x03,0x3d,0x00,0x80,0x03,0xa0,0xc0,0x00,0x03,0x01,0xc0,0x00,0x03,
+0xad,0x40,0x01,0x03,0x01,0x80,0x81,0x01,0x01,0xc0,0x00,0x03,0x01,0x00,0x81,0x03,
+0xb3,0x80,0x01,0x03,0x18,0xf4,0x3f,0x03,0x01,0x00,0x01,0x03,0x83,0xff,0xbf,0x03,
+0xb2,0xc0,0x01,0x03,0x99,0x01,0x40,0x03,0x06,0x00,0x00,0x03,0x3d,0x00,0x80,0x03,
+0xa0,0xc0,0x00,0x03,0x05,0x00,0x00,0x03,0x29,0x00,0x00,0x03,0x00,0x00,0x00,0x01,
+0x00,0x00,0x01,0x0a,0x00,0x00,0x00,0x08,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,
+0x02,0x5b,0x5d,0x00,0x00,0x04,0x74,0x6f,0x5f,0x73,0x00,0x00,0x0c,0x5f,0x5f,0x70,
+0x72,0x69,0x6e,0x74,0x73,0x74,0x72,0x5f,0x5f,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,
+0x01,0x2b,0x00,0x00,0x01,0x3c,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x00,0x00,0xb3,
+0x00,0x05,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x1a,0x00,0x00,0x26,0x00,0x08,0x00,
+0x83,0xff,0xbf,0x01,0x01,0x40,0x80,0x02,0x20,0x00,0x80,0x02,0x01,0x40,0x01,0x02,
+0x17,0x06,0x40,0x00,0x06,0x00,0x80,0x02,0x01,0x40,0x00,0x03,0x01,0xc0,0x80,0x03,
+0xa0,0x80,0x00,0x03,0x20,0xc0,0x00,0x03,0xa0,0x40,0x80,0x02,0x06,0x00,0x80,0x02,
+0x3d,0x00,0x00,0x03,0xa0,0x40,0x80,0x02,0x01,0xc0,0x80,0x02,0xad,0x00,0x81,0x02,
+0x01,0x40,0x81,0x01,0x01,0xc0,0x80,0x02,0x01,0x00,0x01,0x03,0xb3,0x40,0x81,0x02,
+0x18,0xf8,0xbf,0x02,0x01,0x40,0x80,0x02,0x83,0xff,0x3f,0x03,0xa0,0x80,0x80,0x02,
+0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x0a,0x00,0x00,0x00,0x06,
+0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x0c,0x5f,0x5f,0x70,0x72,0x69,0x6e,0x74,
+0x73,0x74,0x72,0x5f,0x5f,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x07,0x69,0x6e,0x73,
+0x70,0x65,0x63,0x74,0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x3c,0x00,0x00,0x00,0x00,
+0x5b,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x26,0x00,0x08,0x00,
+0x06,0x00,0x80,0x01,0x06,0x00,0x00,0x02,0x37,0x40,0x81,0x02,0x01,0x40,0x00,0x03,
+0x38,0x80,0x81,0x02,0xa0,0x7f,0x00,0x02,0xa0,0x00,0x80,0x01,0x05,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0c,0x5f,0x5f,
+0x70,0x72,0x69,0x6e,0x74,0x73,0x74,0x72,0x5f,0x5f,0x00,0x00,0x07,0x73,0x70,0x72,
+0x69,0x6e,0x74,0x66,0x00,0x00,0x00,0x00,0x71,0x00,0x03,0x00,0x07,0x00,0x00,0x00,
+0x00,0x00,0x07,0x00,0x26,0x00,0x08,0x00,0x06,0x00,0x80,0x01,0x91,0x00,0x00,0x02,
+0x3d,0x00,0x80,0x02,0xa0,0x80,0x00,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x01,0x00,0x00,0x14,0x70,0x72,0x69,0x6e,0x74,0x66,0x20,0x6e,0x6f,
+0x74,0x20,0x61,0x76,0x61,0x69,0x6c,0x61,0x62,0x6c,0x65,0x00,0x00,0x00,0x03,0x00,
+0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x13,0x4e,0x6f,0x74,0x49,0x6d,0x70,0x6c,
+0x65,0x6d,0x65,0x6e,0x74,0x65,0x64,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,
+0x65,0x77,0x00,0x00,0x00,0x00,0x72,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,
+0x07,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x06,0x00,0x80,0x01,0x91,0x00,0x00,0x02,
+0x3d,0x00,0x80,0x02,0xa0,0x80,0x00,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x01,0x00,0x00,0x15,0x73,0x70,0x72,0x69,0x6e,0x74,0x66,0x20,0x6e,
+0x6f,0x74,0x20,0x61,0x76,0x61,0x69,0x6c,0x61,0x62,0x6c,0x65,0x00,0x00,0x00,0x03,
+0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x13,0x4e,0x6f,0x74,0x49,0x6d,0x70,
+0x6c,0x65,0x6d,0x65,0x6e,0x74,0x65,0x64,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,
+0x6e,0x65,0x77,0x00,0x4c,0x56,0x41,0x52,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x04,
+0x00,0x04,0x61,0x72,0x67,0x73,0x00,0x01,0x69,0x00,0x03,0x6c,0x65,0x6e,0x00,0x01,
+0x73,0x00,0x00,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x02,0x00,
+0x04,0x00,0x00,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x02,0x00,
+0x04,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x01,0x00,
+0x03,0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,0x00,
+0x01,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0x00,0x00,0x45,0x4e,0x44,
+0x00,0x00,0x00,0x00,0x08,
+};
+void mrb_mruby_print_gem_init(mrb_state *mrb);
+void mrb_mruby_print_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_print_gem_init(mrb_state *mrb) {
+  int ai = mrb_gc_arena_save(mrb);
+  mrb_mruby_print_gem_init(mrb);
+  mrb_load_irep(mrb, gem_mrblib_irep_mruby_print);
+  if (mrb->exc) {
+    mrb_print_error(mrb);
+    exit(EXIT_FAILURE);
+  }
+  mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_print_gem_final(mrb_state *mrb) {
+  mrb_mruby_print_gem_final(mrb);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-print/print.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,43 @@
+#include "mruby.h"
+#include "mruby/string.h"
+#include <stdio.h>
+
+static void
+printstr(mrb_state *mrb, mrb_value obj)
+{
+  char *s;
+  mrb_int len;
+
+  if (mrb_string_p(obj)) {
+    s = RSTRING_PTR(obj);
+    len = RSTRING_LEN(obj);
+    fwrite(s, len, 1, stdout);
+  }
+}
+
+/* 15.3.1.2.9  */
+/* 15.3.1.3.34 */
+mrb_value
+mrb_printstr(mrb_state *mrb, mrb_value self)
+{
+  mrb_value argv;
+
+  mrb_get_args(mrb, "o", &argv);
+  printstr(mrb, argv);
+
+  return argv;
+}
+
+void
+mrb_mruby_print_gem_init(mrb_state* mrb)
+{
+  struct RClass *krn;
+  krn = mrb->kernel_module;
+  mrb_define_method(mrb, krn, "__printstr__", mrb_printstr, MRB_ARGS_REQ(1));
+}
+
+void
+mrb_mruby_print_gem_final(mrb_state* mrb)
+{
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-proc-ext/gem_init.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,111 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ *   This file was generated!
+ *   All manual changes will get lost.
+ */
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+gem_mrblib_irep_mruby_proc_ext[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0xfa,0x0c,0x00,0x00,0x04,0x8b,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x03,0xcf,0x30,0x30,
+0x30,0x30,0x00,0x00,0x00,0x35,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x00,0x80,0x00,0x45,0x00,0x80,0x00,
+0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x50,0x72,
+0x6f,0x63,0x00,0x00,0x00,0x00,0x72,0x00,0x01,0x00,0x03,0x00,0x04,0x00,0x00,0x00,
+0x0e,0x00,0x00,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x04,0x00,0x01,0x46,0x80,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,
+0x46,0xc0,0x80,0x00,0x84,0x01,0x80,0x00,0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x04,0x00,0x03,0x3d,0x3d,0x3d,0x00,0x00,0x05,0x79,0x69,0x65,0x6c,
+0x64,0x00,0x00,0x07,0x74,0x6f,0x5f,0x70,0x72,0x6f,0x63,0x00,0x00,0x05,0x63,0x75,
+0x72,0x72,0x79,0x00,0x00,0x00,0x00,0x3d,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,
+0x00,0x07,0x00,0x00,0x26,0x00,0x08,0x00,0x06,0x00,0x80,0x01,0x37,0x00,0x01,0x02,
+0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x00,0x00,0x3d,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,
+0x26,0x00,0x08,0x00,0x06,0x00,0x80,0x01,0x37,0x00,0x01,0x02,0x01,0x40,0x80,0x02,
+0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x26,0x00,
+0x02,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x26,0x00,0x00,0x00,
+0x06,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x01,0x80,0x00,0x07,0x00,0x0d,0x00,0x02,0x00,0x00,0x00,0x39,0x00,0x00,
+0x26,0x00,0x10,0x00,0x97,0x00,0x40,0x00,0x97,0x01,0x40,0x00,0x06,0x00,0x80,0x03,
+0x20,0x00,0x80,0x03,0x01,0xc0,0x81,0x00,0x06,0x00,0x80,0x03,0x40,0x01,0x00,0x04,
+0x21,0x40,0x80,0x03,0x01,0xc0,0x81,0x01,0x01,0x40,0x00,0x04,0xa0,0x80,0x80,0x03,
+0x01,0xc0,0x81,0x00,0x06,0x00,0x80,0x03,0x20,0xc0,0x80,0x03,0x19,0x11,0xc0,0x03,
+0x06,0x00,0x80,0x03,0x20,0x00,0x80,0x03,0x01,0xc0,0x01,0x02,0x83,0xff,0x3f,0x04,
+0xb6,0x00,0x81,0x03,0x99,0x01,0xc0,0x03,0x01,0x40,0x80,0x03,0x01,0x00,0x01,0x04,
+0xa0,0x40,0x81,0x03,0x98,0x04,0xc0,0x03,0x01,0x00,0x81,0x03,0x83,0xff,0x3f,0x04,
+0xb3,0x80,0x81,0x03,0x99,0x02,0xc0,0x03,0x01,0xc0,0x80,0x03,0x01,0x00,0x01,0x04,
+0xa0,0x80,0x80,0x03,0x01,0x40,0x00,0x04,0xb5,0xc0,0x81,0x03,0x19,0x07,0xc0,0x03,
+0x06,0x00,0x80,0x03,0x91,0x04,0x00,0x04,0x3d,0x00,0x80,0x04,0x01,0x40,0x00,0x05,
+0x3e,0x80,0x82,0x04,0xbd,0x00,0x00,0x05,0x3e,0x80,0x82,0x04,0x01,0xc0,0x00,0x05,
+0x01,0x00,0x81,0x05,0xa0,0x80,0x00,0x05,0x3e,0x80,0x82,0x04,0x3d,0x01,0x00,0x05,
+0x3e,0x80,0x82,0x04,0x20,0x01,0x82,0x03,0x06,0x00,0x80,0x02,0x06,0x00,0x80,0x03,
+0x40,0x03,0x00,0x04,0x21,0x80,0x82,0x03,0x01,0xc0,0x01,0x03,0x20,0xc0,0x82,0x03,
+0x29,0x00,0x80,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x1b,0x77,0x72,0x6f,0x6e,0x67,
+0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,
+0x65,0x6e,0x74,0x73,0x20,0x28,0x00,0x00,0x05,0x20,0x66,0x6f,0x72,0x20,0x00,0x00,
+0x01,0x29,0x00,0x00,0x00,0x0c,0x00,0x05,0x61,0x72,0x69,0x74,0x79,0x00,0x00,0x06,
+0x6c,0x61,0x6d,0x62,0x64,0x61,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x07,0x6c,0x61,
+0x6d,0x62,0x64,0x61,0x3f,0x00,0x00,0x02,0x3e,0x3d,0x00,0x00,0x02,0x21,0x3d,0x00,
+0x00,0x01,0x3c,0x00,0x00,0x01,0x3e,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,
+0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,
+0x00,0x04,0x70,0x72,0x6f,0x63,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,
+0x00,0x53,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x0b,0x26,0x00,0x00,0x02,
+0x01,0x40,0x80,0x01,0x83,0xff,0x3f,0x02,0xb3,0x00,0x80,0x01,0x19,0x02,0xc0,0x01,
+0x01,0x40,0x80,0x01,0x20,0x40,0x80,0x01,0xaf,0x80,0x80,0x01,0x97,0x00,0x40,0x00,
+0x01,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
+0x00,0x01,0x3c,0x00,0x00,0x02,0x2d,0x40,0x00,0x00,0x01,0x2d,0x00,0x00,0x00,0x00,
+0x41,0x00,0x03,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x26,0x00,0x10,0x00,
+0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,0x37,0xc0,0x80,0x00,0x06,0x00,0x80,0x01,
+0x40,0x01,0x00,0x02,0x21,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x04,0x70,0x72,0x6f,0x63,0x00,0x00,0x00,0x00,0x7b,0x00,
+0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x26,0x00,0x08,0x00,
+0x15,0x40,0x00,0x02,0x01,0x40,0x80,0x02,0xac,0x00,0x00,0x02,0x01,0x00,0x81,0x01,
+0x20,0x40,0x00,0x02,0x95,0x40,0x80,0x02,0xb6,0x80,0x00,0x02,0x19,0x03,0x40,0x02,
+0x95,0x40,0x01,0x02,0x37,0x40,0x81,0x02,0x01,0xc0,0x00,0x03,0x38,0x80,0x81,0x02,
+0xa0,0xff,0x00,0x02,0x97,0x01,0x40,0x00,0x95,0x80,0x01,0x02,0x01,0xc0,0x80,0x02,
+0xa0,0xc0,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+0x00,0x01,0x2b,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x3e,0x3d,0x00,
+0x00,0x02,0x5b,0x5d,0x00,0x4c,0x56,0x41,0x52,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,
+0x09,0x00,0x04,0x61,0x72,0x67,0x73,0x00,0x05,0x61,0x72,0x69,0x74,0x79,0x00,0x03,
+0x61,0x62,0x73,0x00,0x0a,0x73,0x65,0x6c,0x66,0x5f,0x61,0x72,0x69,0x74,0x79,0x00,
+0x05,0x70,0x70,0x72,0x6f,0x63,0x00,0x0a,0x6d,0x61,0x6b,0x65,0x5f,0x63,0x75,0x72,
+0x72,0x79,0x00,0x01,0x61,0x00,0x0a,0x67,0x69,0x76,0x65,0x6e,0x5f,0x61,0x72,0x67,
+0x73,0x00,0x08,0x6e,0x65,0x77,0x5f,0x61,0x72,0x67,0x73,0x00,0x00,0x00,0x01,0xff,
+0xff,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0x00,
+0x01,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x02,0x00,0x03,0x00,0x03,0x00,0x04,0x00,
+0x04,0x00,0x05,0x00,0x05,0x00,0x06,0x00,0x06,0x00,0x01,0xff,0xff,0x00,0x00,0x00,
+0x07,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xff,0x00,0x00,0x00,
+0x08,0x00,0x03,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08,
+};
+void mrb_mruby_proc_ext_gem_init(mrb_state *mrb);
+void mrb_mruby_proc_ext_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_proc_ext_gem_init(mrb_state *mrb) {
+  int ai = mrb_gc_arena_save(mrb);
+  mrb_mruby_proc_ext_gem_init(mrb);
+  mrb_load_irep(mrb, gem_mrblib_irep_mruby_proc_ext);
+  if (mrb->exc) {
+    mrb_print_error(mrb);
+    exit(EXIT_FAILURE);
+  }
+  mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_proc_ext_gem_final(mrb_state *mrb) {
+  mrb_mruby_proc_ext_gem_final(mrb);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-proc-ext/proc.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,168 @@
+#include "mruby.h"
+#include "mruby/proc.h"
+#include "mruby/opcode.h"
+#include "mruby/array.h"
+#include "mruby/string.h"
+#include "mruby/debug.h"
+
+static mrb_value
+mrb_proc_lambda(mrb_state *mrb, mrb_value self)
+{
+  struct RProc *p = mrb_proc_ptr(self);
+  return mrb_bool_value(MRB_PROC_STRICT_P(p));
+}
+
+static mrb_value
+mrb_proc_source_location(mrb_state *mrb, mrb_value self)
+{
+  struct RProc *p = mrb_proc_ptr(self);
+
+  if (MRB_PROC_CFUNC_P(p)) {
+    return mrb_nil_value();
+  }
+  else {
+    mrb_irep *irep = p->body.irep;
+    int32_t line;
+    const char *filename;
+
+    filename = mrb_debug_get_filename(irep, 0);
+    line = mrb_debug_get_line(irep, 0);
+
+    return (!filename && line == -1)? mrb_nil_value()
+        : mrb_assoc_new(mrb, mrb_str_new_cstr(mrb, filename), mrb_fixnum_value(line));
+  }
+}
+
+static mrb_value
+mrb_proc_inspect(mrb_state *mrb, mrb_value self)
+{
+  struct RProc *p = mrb_proc_ptr(self);
+  mrb_value str = mrb_str_new_lit(mrb, "#<Proc:");
+  mrb_str_concat(mrb, str, mrb_ptr_to_str(mrb, mrb_cptr(self)));
+
+  if (!MRB_PROC_CFUNC_P(p)) {
+    mrb_irep *irep = p->body.irep;
+    const char *filename;
+    int32_t line;
+    mrb_str_cat_lit(mrb, str, "@");
+
+    filename = mrb_debug_get_filename(irep, 0);
+    mrb_str_cat_cstr(mrb, str, filename ? filename : "-");
+    mrb_str_cat_lit(mrb, str, ":");
+
+    line = mrb_debug_get_line(irep, 0);
+    if (line != -1) {
+      mrb_str_append(mrb, str, mrb_fixnum_value(line));
+    }
+    else {
+      mrb_str_cat_lit(mrb, str, "-");
+    }
+  }
+
+  if (MRB_PROC_STRICT_P(p)) {
+    mrb_str_cat_lit(mrb, str, " (lambda)");
+  }
+
+  mrb_str_cat_lit(mrb, str, ">");
+  return str;
+}
+
+static mrb_value
+mrb_kernel_proc(mrb_state *mrb, mrb_value self)
+{
+  mrb_value blk;
+
+  mrb_get_args(mrb, "&", &blk);
+  if (mrb_nil_p(blk)) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "tried to create Proc object without a block");
+  }
+
+  return blk;
+}
+
+/*
+ * call-seq:
+ *    prc.parameters  -> array
+ *
+ * Returns the parameter information of this proc.
+ *
+ *    prc = lambda{|x, y=42, *other|}
+ *    prc.parameters  #=> [[:req, :x], [:opt, :y], [:rest, :other]]
+ */
+
+static mrb_value
+mrb_proc_parameters(mrb_state *mrb, mrb_value self)
+{
+  struct parameters_type {
+    int size;
+    const char *name;
+  } *p, parameters_list [] = {
+    {0, "req"},
+    {0, "opt"},
+    {0, "rest"},
+    {0, "req"},
+    {0, "block"},
+    {0, NULL}
+  };
+  const struct RProc *proc = mrb_proc_ptr(self);
+  const struct mrb_irep *irep = proc->body.irep;
+  mrb_aspec aspec;
+  mrb_value parameters;
+  int i, j;
+
+  if (MRB_PROC_CFUNC_P(proc)) {
+    // TODO cfunc aspec is not implemented yet
+    return mrb_ary_new(mrb);
+  }
+  if (!irep->lv) {
+    return mrb_ary_new(mrb);
+  }
+  if (GET_OPCODE(*irep->iseq) != OP_ENTER) {
+    return mrb_ary_new(mrb);
+  }
+
+  if (!MRB_PROC_STRICT_P(proc)) {
+    parameters_list[0].name = "opt";
+    parameters_list[3].name = "opt";
+  }
+
+  aspec = GETARG_Ax(*irep->iseq);
+  parameters_list[0].size = MRB_ASPEC_REQ(aspec);
+  parameters_list[1].size = MRB_ASPEC_OPT(aspec);
+  parameters_list[2].size = MRB_ASPEC_REST(aspec);
+  parameters_list[3].size = MRB_ASPEC_POST(aspec);
+  parameters_list[4].size = MRB_ASPEC_BLOCK(aspec);
+
+  parameters = mrb_ary_new_capa(mrb, irep->nlocals-1);
+  for (i = 0, p = parameters_list; p->name; p++) {
+    mrb_value sname = mrb_symbol_value(mrb_intern_cstr(mrb, p->name));
+    for (j = 0; j < p->size; i++, j++) {
+      mrb_assert(i < (irep->nlocals-1));
+      mrb_ary_push(mrb, parameters, mrb_assoc_new(mrb,
+        sname,
+        mrb_symbol_value(irep->lv[i].name)
+      ));
+    }
+  }
+  return parameters;
+}
+
+void
+mrb_mruby_proc_ext_gem_init(mrb_state* mrb)
+{
+  struct RClass *p = mrb->proc_class;
+  mrb_define_method(mrb, p, "lambda?",         mrb_proc_lambda,          MRB_ARGS_NONE());
+  mrb_define_method(mrb, p, "source_location", mrb_proc_source_location, MRB_ARGS_NONE());
+  mrb_define_method(mrb, p, "to_s",            mrb_proc_inspect,         MRB_ARGS_NONE());
+  mrb_define_method(mrb, p, "inspect",         mrb_proc_inspect,         MRB_ARGS_NONE());
+  mrb_define_method(mrb, p, "parameters",      mrb_proc_parameters,      MRB_ARGS_NONE());
+
+  mrb_define_class_method(mrb, mrb->kernel_module, "proc", mrb_kernel_proc, MRB_ARGS_NONE());
+  mrb_define_method(mrb, mrb->kernel_module,       "proc", mrb_kernel_proc, MRB_ARGS_NONE());
+}
+
+void
+mrb_mruby_proc_ext_gem_final(mrb_state* mrb)
+{
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-random/gem_init.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,22 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ *   This file was generated!
+ *   All manual changes will get lost.
+ */
+#include "mruby.h"
+void mrb_mruby_random_gem_init(mrb_state *mrb);
+void mrb_mruby_random_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_random_gem_init(mrb_state *mrb) {
+  int ai = mrb_gc_arena_save(mrb);
+  mrb_mruby_random_gem_init(mrb);
+  mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_random_gem_final(mrb_state *mrb) {
+  mrb_mruby_random_gem_final(mrb);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-random/mt19937ar.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,198 @@
+/*
+** mt19937ar.c - MT Random functions
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+#include "mt19937ar.h"
+
+/* Period parameters */
+/* #define N 624 */
+#define M 397
+#define MATRIX_A 0x9908b0dfUL   /* constant vector a */
+#define UPPER_MASK 0x80000000UL /* most significant w-r bits */
+#define LOWER_MASK 0x7fffffffUL /* least significant r bits */
+
+#if 0 /* dead_code */
+static unsigned long mt[N]; /* the array for the state vector  */
+static int mti=N+1; /* mti==N+1 means mt[N] is not initialized */
+#endif /* dead_code */
+
+void mrb_random_init_genrand(mt_state *t, unsigned long s)
+{
+    t->mt[0]= s & 0xffffffffUL;
+    for (t->mti=1; t->mti<N; t->mti++) {
+        t->mt[t->mti] =
+	    (1812433253UL * (t->mt[t->mti-1] ^ (t->mt[t->mti-1] >> 30)) + t->mti);
+        t->mt[t->mti] &= 0xffffffffUL;
+    }
+}
+
+unsigned long mrb_random_genrand_int32(mt_state *t)
+{
+    unsigned long y;
+    static const unsigned long mag01[2]={0x0UL, MATRIX_A};
+    /* mag01[x] = x * MATRIX_A  for x=0,1 */
+
+    if (t->mti >= N) { /* generate N words at one time */
+        int kk;
+
+        if (t->mti == N+1)   /* if init_genrand() has not been called, */
+            mrb_random_init_genrand(t, 5489UL); /* a default initial seed is used */
+
+        for (kk=0;kk<N-M;kk++) {
+            y = (t->mt[kk]&UPPER_MASK)|(t->mt[kk+1]&LOWER_MASK);
+            t->mt[kk] = t->mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1UL];
+        }
+        for (;kk<N-1;kk++) {
+            y = (t->mt[kk]&UPPER_MASK)|(t->mt[kk+1]&LOWER_MASK);
+            t->mt[kk] = t->mt[kk+(M-N)] ^ (y >> 1) ^ mag01[y & 0x1UL];
+        }
+        y = (t->mt[N-1]&UPPER_MASK)|(t->mt[0]&LOWER_MASK);
+        t->mt[N-1] = t->mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1UL];
+
+        t->mti = 0;
+    }
+
+    y = t->mt[t->mti++];
+
+    /* Tempering */
+    y ^= (y >> 11);
+    y ^= (y << 7) & 0x9d2c5680UL;
+    y ^= (y << 15) & 0xefc60000UL;
+    y ^= (y >> 18);
+
+    t->gen.int_ = y;
+
+    return y;
+}
+
+double mrb_random_genrand_real1(mt_state *t)
+{
+    mrb_random_genrand_int32(t);
+    t->gen.double_ =  t->gen.int_*(1.0/4294967295.0);
+    return t->gen.double_;
+    /* divided by 2^32-1 */
+}
+
+#if 0 /* dead_code */
+/* initializes mt[N] with a seed */
+void init_genrand(unsigned long s)
+{
+    mt[0]= s & 0xffffffffUL;
+    for (mti=1; mti<N; mti++) {
+        mt[mti] =
+	    (1812433253UL * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti);
+        /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */
+        /* In the previous versions, MSBs of the seed affect   */
+        /* only MSBs of the array mt[].                        */
+        /* 2002/01/09 modified by Makoto Matsumoto             */
+        mt[mti] &= 0xffffffffUL;
+        /* for >32 bit machines */
+    }
+}
+
+/* initialize by an array with array-length */
+/* init_key is the array for initializing keys */
+/* key_length is its length */
+/* slight change for C++, 2004/2/26 */
+void init_by_array(unsigned long init_key[], int key_length)
+{
+    int i, j, k;
+    init_genrand(19650218UL);
+    i=1; j=0;
+    k = (N>key_length ? N : key_length);
+    for (; k; k--) {
+        mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1664525UL))
+          + init_key[j] + j; /* non linear */
+        mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */
+        i++; j++;
+        if (i>=N) { mt[0] = mt[N-1]; i=1; }
+        if (j>=key_length) j=0;
+    }
+    for (k=N-1; k; k--) {
+        mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1566083941UL))
+          - i; /* non linear */
+        mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */
+        i++;
+        if (i>=N) { mt[0] = mt[N-1]; i=1; }
+    }
+
+    mt[0] = 0x80000000UL; /* MSB is 1; assuring non-zero initial array */
+}
+
+/* generates a random number on [0,0xffffffff]-interval */
+unsigned long genrand_int32(void)
+{
+    unsigned long y;
+    static const unsigned long mag01[2]={0x0UL, MATRIX_A};
+    /* mag01[x] = x * MATRIX_A  for x=0,1 */
+
+    if (mti >= N) { /* generate N words at one time */
+        int kk;
+
+        if (mti == N+1)   /* if init_genrand() has not been called, */
+            init_genrand(5489UL); /* a default initial seed is used */
+
+        for (kk=0;kk<N-M;kk++) {
+            y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
+            mt[kk] = mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1UL];
+        }
+        for (;kk<N-1;kk++) {
+            y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
+            mt[kk] = mt[kk+(M-N)] ^ (y >> 1) ^ mag01[y & 0x1UL];
+        }
+        y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK);
+        mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1UL];
+
+        mti = 0;
+    }
+
+    y = mt[mti++];
+
+    /* Tempering */
+    y ^= (y >> 11);
+    y ^= (y << 7) & 0x9d2c5680UL;
+    y ^= (y << 15) & 0xefc60000UL;
+    y ^= (y >> 18);
+
+    return y;
+}
+
+/* generates a random number on [0,0x7fffffff]-interval */
+long genrand_int31(void)
+{
+    return (long)(genrand_int32()>>1);
+}
+
+/* generates a random number on [0,1]-real-interval */
+double genrand_real1(void)
+{
+    return genrand_int32()*(1.0/4294967295.0);
+    /* divided by 2^32-1 */
+}
+
+/* generates a random number on [0,1)-real-interval */
+double genrand_real2(void)
+{
+    return genrand_int32()*(1.0/4294967296.0);
+    /* divided by 2^32 */
+}
+
+/* generates a random number on (0,1)-real-interval */
+double genrand_real3(void)
+{
+    return (((double)genrand_int32()) + 0.5)*(1.0/4294967296.0);
+    /* divided by 2^32 */
+}
+
+/* generates a random number on [0,1) with 53-bit resolution*/
+double genrand_res53(void)
+{
+    unsigned long a=genrand_int32()>>5, b=genrand_int32()>>6;
+    return(a*67108864.0+b)*(1.0/9007199254740992.0);
+}
+/* These real versions are due to Isaku Wada, 2002/01/09 added */
+#endif /* dead_code */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-random/mt19937ar.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,52 @@
+/*
+** mt19937ar.h - MT Random functions
+**
+** See Copyright Notice in mruby.h
+*/
+
+#define N 624
+
+typedef struct {
+  unsigned long mt[N];
+  int mti;
+  union {
+    unsigned long int_;
+    double double_;
+  } gen;
+
+  mrb_int seed;
+  mrb_bool has_seed : 1;
+} mt_state;
+
+void mrb_random_init_genrand(mt_state *, unsigned long);
+unsigned long mrb_random_genrand_int32(mt_state *);
+double mrb_random_genrand_real1(mt_state *t);
+
+/* initializes mt[N] with a seed */
+void init_genrand(unsigned long s);
+
+/* initialize by an array with array-length */
+/* init_key is the array for initializing keys */
+/* key_length is its length */
+/* slight change for C++, 2004/2/26 */
+void init_by_array(unsigned long init_key[], int key_length);
+
+/* generates a random number on [0,0xffffffff]-interval */
+unsigned long genrand_int32(void);
+
+/* generates a random number on [0,0x7fffffff]-interval */
+long genrand_int31(void);
+
+/* These real versions are due to Isaku Wada, 2002/01/09 added */
+/* generates a random number on [0,1]-real-interval */
+double genrand_real1(void);
+
+/* generates a random number on [0,1)-real-interval */
+double genrand_real2(void);
+
+/* generates a random number on (0,1)-real-interval */
+double genrand_real3(void);
+
+/* generates a random number on [0,1) with 53-bit resolution*/
+double genrand_res53(void);
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-random/random.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,346 @@
+/*
+** random.c - Random module
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+#include "mruby/variable.h"
+#include "mruby/class.h"
+#include "mruby/data.h"
+#include "mruby/array.h"
+#include "mt19937ar.h"
+
+#include <time.h>
+
+static char const MT_STATE_KEY[] = "$mrb_i_mt_state";
+
+static const struct mrb_data_type mt_state_type = {
+  MT_STATE_KEY, mrb_free,
+};
+
+static mrb_value mrb_random_rand(mrb_state *mrb, mrb_value self);
+static mrb_value mrb_random_srand(mrb_state *mrb, mrb_value self);
+
+static void
+mt_srand(mt_state *t, unsigned long seed)
+{
+  mrb_random_init_genrand(t, seed);
+}
+
+static unsigned long
+mt_rand(mt_state *t)
+{
+  return mrb_random_genrand_int32(t);
+}
+
+static double
+mt_rand_real(mt_state *t)
+{
+  return mrb_random_genrand_real1(t);
+}
+
+static mrb_value
+mrb_random_mt_srand(mrb_state *mrb, mt_state *t, mrb_value seed)
+{
+  if (mrb_nil_p(seed)) {
+    seed = mrb_fixnum_value((mrb_int)(time(NULL) + mt_rand(t)));
+    if (mrb_fixnum(seed) < 0) {
+      seed = mrb_fixnum_value(0 - mrb_fixnum(seed));
+    }
+  }
+
+  mt_srand(t, (unsigned) mrb_fixnum(seed));
+
+  return seed;
+}
+
+static mrb_value
+mrb_random_mt_rand(mrb_state *mrb, mt_state *t, mrb_value max)
+{
+  mrb_value value;
+
+  if (mrb_fixnum(max) == 0) {
+    value = mrb_float_value(mrb, mt_rand_real(t));
+  }
+  else {
+    value = mrb_fixnum_value(mt_rand(t) % mrb_fixnum(max));
+  }
+
+  return value;
+}
+
+static mrb_value
+get_opt(mrb_state* mrb)
+{
+  mrb_value arg;
+
+  arg = mrb_nil_value();
+  mrb_get_args(mrb, "|o", &arg);
+
+  if (!mrb_nil_p(arg)) {
+    if (!mrb_fixnum_p(arg)) {
+      mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid argument type");
+    }
+    arg = mrb_check_convert_type(mrb, arg, MRB_TT_FIXNUM, "Fixnum", "to_int");
+    if (mrb_fixnum(arg) < 0) {
+      arg = mrb_fixnum_value(0 - mrb_fixnum(arg));
+    }
+  }
+  return arg;
+}
+
+static mrb_value
+get_random(mrb_state *mrb) {
+  return mrb_const_get(mrb,
+             mrb_obj_value(mrb_class_get(mrb, "Random")),
+             mrb_intern_lit(mrb, "DEFAULT"));
+}
+
+static mt_state *
+get_random_state(mrb_state *mrb)
+{
+  mrb_value random_val = get_random(mrb);
+  return DATA_GET_PTR(mrb, random_val, &mt_state_type, mt_state);
+}
+
+static mrb_value
+mrb_random_g_rand(mrb_state *mrb, mrb_value self)
+{
+  mrb_value random = get_random(mrb);
+  return mrb_random_rand(mrb, random);
+}
+
+static mrb_value
+mrb_random_g_srand(mrb_state *mrb, mrb_value self)
+{
+  mrb_value random = get_random(mrb);
+  return mrb_random_srand(mrb, random);
+}
+
+static mrb_value
+mrb_random_init(mrb_state *mrb, mrb_value self)
+{
+  mrb_value seed;
+  mt_state *t;
+
+  /* avoid memory leaks */
+  t = (mt_state*)DATA_PTR(self);
+  if (t) {
+    mrb_free(mrb, t);
+  }
+  mrb_data_init(self, NULL, &mt_state_type);
+
+  t = (mt_state *)mrb_malloc(mrb, sizeof(mt_state));
+  t->mti = N + 1;
+
+  seed = get_opt(mrb);
+  seed = mrb_random_mt_srand(mrb, t, seed);
+  if (mrb_nil_p(seed)) {
+    t->has_seed = FALSE;
+  }
+  else {
+    mrb_assert(mrb_fixnum_p(seed));
+    t->has_seed = TRUE;
+    t->seed = mrb_fixnum(seed);
+  }
+
+  mrb_data_init(self, t, &mt_state_type);
+
+  return self;
+}
+
+static void
+mrb_random_rand_seed(mrb_state *mrb, mt_state *t)
+{
+  if (!t->has_seed) {
+    mrb_random_mt_srand(mrb, t, mrb_nil_value());
+  }
+}
+
+static mrb_value
+mrb_random_rand(mrb_state *mrb, mrb_value self)
+{
+  mrb_value max;
+  mt_state *t = DATA_GET_PTR(mrb, self, &mt_state_type, mt_state);
+
+  max = get_opt(mrb);
+  mrb_random_rand_seed(mrb, t);
+  return mrb_random_mt_rand(mrb, t, max);
+}
+
+static mrb_value
+mrb_random_srand(mrb_state *mrb, mrb_value self)
+{
+  mrb_value seed;
+  mrb_value old_seed;
+  mt_state *t = DATA_GET_PTR(mrb, self, &mt_state_type, mt_state);
+
+  seed = get_opt(mrb);
+  seed = mrb_random_mt_srand(mrb, t, seed);
+  old_seed = t->has_seed? mrb_fixnum_value(t->seed) : mrb_nil_value();
+  if (mrb_nil_p(seed)) {
+    t->has_seed = FALSE;
+  }
+  else {
+    mrb_assert(mrb_fixnum_p(seed));
+    t->has_seed = TRUE;
+    t->seed = mrb_fixnum(seed);
+  }
+
+  return old_seed;
+}
+
+/*
+ *  call-seq:
+ *     ary.shuffle!   ->   ary
+ *
+ *  Shuffles elements in self in place.
+ */
+
+static mrb_value
+mrb_ary_shuffle_bang(mrb_state *mrb, mrb_value ary)
+{
+  mrb_int i;
+  mt_state *random = NULL;
+
+  if (RARRAY_LEN(ary) > 1) {
+    mrb_get_args(mrb, "|d", &random, &mt_state_type);
+
+    if (random == NULL) {
+      random = get_random_state(mrb);
+    }
+    mrb_random_rand_seed(mrb, random);
+
+    mrb_ary_modify(mrb, mrb_ary_ptr(ary));
+
+    for (i = RARRAY_LEN(ary) - 1; i > 0; i--)  {
+      mrb_int j;
+      mrb_value tmp;
+
+      j = mrb_fixnum(mrb_random_mt_rand(mrb, random, mrb_fixnum_value(RARRAY_LEN(ary))));
+
+      tmp = RARRAY_PTR(ary)[i];
+      mrb_ary_ptr(ary)->ptr[i] = RARRAY_PTR(ary)[j];
+      mrb_ary_ptr(ary)->ptr[j] = tmp;
+    }
+  }
+
+  return ary;
+}
+
+/*
+ *  call-seq:
+ *     ary.shuffle   ->   new_ary
+ *
+ *  Returns a new array with elements of self shuffled.
+ */
+
+static mrb_value
+mrb_ary_shuffle(mrb_state *mrb, mrb_value ary)
+{
+  mrb_value new_ary = mrb_ary_new_from_values(mrb, RARRAY_LEN(ary), RARRAY_PTR(ary));
+  mrb_ary_shuffle_bang(mrb, new_ary);
+
+  return new_ary;
+}
+
+/*
+ *  call-seq:
+ *     ary.sample      ->   obj
+ *     ary.sample(n)   ->   new_ary
+ *
+ *  Choose a random element or +n+ random elements from the array.
+ *
+ *  The elements are chosen by using random and unique indices into the array
+ *  in order to ensure that an element doesn't repeat itself unless the array
+ *  already contained duplicate elements.
+ *
+ *  If the array is empty the first form returns +nil+ and the second form
+ *  returns an empty array.
+ */
+
+static mrb_value
+mrb_ary_sample(mrb_state *mrb, mrb_value ary)
+{
+  mrb_int n = 0;
+  mrb_bool given;
+  mt_state *random = NULL;
+  mrb_int len = RARRAY_LEN(ary);
+
+  mrb_get_args(mrb, "|i?d", &n, &given, &random, &mt_state_type);
+  if (random == NULL) {
+    random = get_random_state(mrb);
+  }
+  mrb_random_rand_seed(mrb, random);
+  mt_rand(random);
+  if (!given) {                 /* pick one element */
+    switch (len) {
+    case 0:
+      return mrb_nil_value();
+    case 1:
+      return RARRAY_PTR(ary)[0];
+    default:
+      return RARRAY_PTR(ary)[mt_rand(random) % len];
+    }
+  }
+  else {
+    mrb_value result;
+    mrb_int i, j;
+
+    if (n < 0) mrb_raise(mrb, E_ARGUMENT_ERROR, "negative sample number");
+    if (n > len) n = len;
+    result = mrb_ary_new_capa(mrb, n);
+    for (i=0; i<n; i++) {
+      mrb_int r;
+
+      for (;;) {
+      retry:
+        r = mt_rand(random) % len;
+
+        for (j=0; j<i; j++) {
+          if (mrb_fixnum(RARRAY_PTR(result)[j]) == r) {
+            goto retry;         /* retry if duplicate */
+          }
+        }
+        break;
+      }
+      mrb_ary_push(mrb, result, mrb_fixnum_value(r));
+    }
+    for (i=0; i<n; i++) {
+      mrb_ary_set(mrb, result, i, RARRAY_PTR(ary)[mrb_fixnum(RARRAY_PTR(result)[i])]);
+    }
+    return result;
+  }
+}
+
+
+void mrb_mruby_random_gem_init(mrb_state *mrb)
+{
+  struct RClass *random;
+  struct RClass *array = mrb->array_class;
+
+  mrb_define_method(mrb, mrb->kernel_module, "rand", mrb_random_g_rand, MRB_ARGS_OPT(1));
+  mrb_define_method(mrb, mrb->kernel_module, "srand", mrb_random_g_srand, MRB_ARGS_OPT(1));
+
+  random = mrb_define_class(mrb, "Random", mrb->object_class);
+  MRB_SET_INSTANCE_TT(random, MRB_TT_DATA);
+  mrb_define_class_method(mrb, random, "rand", mrb_random_g_rand, MRB_ARGS_OPT(1));
+  mrb_define_class_method(mrb, random, "srand", mrb_random_g_srand, MRB_ARGS_OPT(1));
+
+  mrb_define_method(mrb, random, "initialize", mrb_random_init, MRB_ARGS_OPT(1));
+  mrb_define_method(mrb, random, "rand", mrb_random_rand, MRB_ARGS_OPT(1));
+  mrb_define_method(mrb, random, "srand", mrb_random_srand, MRB_ARGS_OPT(1));
+
+  mrb_define_method(mrb, array, "shuffle", mrb_ary_shuffle, MRB_ARGS_OPT(1));
+  mrb_define_method(mrb, array, "shuffle!", mrb_ary_shuffle_bang, MRB_ARGS_OPT(1));
+  mrb_define_method(mrb, array, "sample", mrb_ary_sample, MRB_ARGS_OPT(2));
+
+  mrb_const_set(mrb, mrb_obj_value(random), mrb_intern_lit(mrb, "DEFAULT"),
+          mrb_obj_new(mrb, random, 0, NULL));
+}
+
+void mrb_mruby_random_gem_final(mrb_state *mrb)
+{
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-random/random.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,13 @@
+/*
+** random.h - Random module
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef RANDOM_H
+#define RANDOM_H
+
+void mrb_mruby_random_gem_init(mrb_state *mrb);
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-range-ext/gem_init.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,22 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ *   This file was generated!
+ *   All manual changes will get lost.
+ */
+#include "mruby.h"
+void mrb_mruby_range_ext_gem_init(mrb_state *mrb);
+void mrb_mruby_range_ext_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_range_ext_gem_init(mrb_state *mrb) {
+  int ai = mrb_gc_arena_save(mrb);
+  mrb_mruby_range_ext_gem_init(mrb);
+  mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_range_ext_gem_final(mrb_state *mrb) {
+  mrb_mruby_range_ext_gem_final(mrb);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-range-ext/range.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,192 @@
+#include "mruby.h"
+#include "mruby/range.h"
+#include <math.h>
+
+static mrb_bool
+r_le(mrb_state *mrb, mrb_value a, mrb_value b)
+{
+  mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b); /* compare result */
+  /* output :a < b => -1, a = b =>  0, a > b => +1 */
+
+  if (mrb_fixnum_p(r)) {
+    mrb_int c = mrb_fixnum(r);
+    if (c == 0 || c == -1) return TRUE;
+  }
+
+  return FALSE;
+}
+
+static mrb_bool
+r_lt(mrb_state *mrb, mrb_value a, mrb_value b)
+{
+  mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b);
+  /* output :a < b => -1, a = b =>  0, a > b => +1 */
+
+  return mrb_fixnum_p(r) && mrb_fixnum(r) == -1;
+}
+
+/*
+ *  call-seq:
+ *     rng.cover?(obj)  ->  true or false
+ *
+ *  Returns <code>true</code> if +obj+ is between the begin and end of
+ *  the range.
+ *
+ *  This tests <code>begin <= obj <= end</code> when #exclude_end? is +false+
+ *  and <code>begin <= obj < end</code> when #exclude_end? is +true+.
+ *
+ *     ("a".."z").cover?("c")    #=> true
+ *     ("a".."z").cover?("5")    #=> false
+ *     ("a".."z").cover?("cc")   #=> true
+ */
+static mrb_value
+mrb_range_cover(mrb_state *mrb, mrb_value range)
+{
+  mrb_value val;
+  struct RRange *r = mrb_range_ptr(range);
+  mrb_value beg, end;
+
+  mrb_get_args(mrb, "o", &val);
+
+  beg = r->edges->beg;
+  end = r->edges->end;
+
+  if (r_le(mrb, beg, val)) {
+    if (r->excl) {
+      if (r_lt(mrb, val, end))
+        return mrb_true_value();
+    }
+    else {
+      if (r_le(mrb, val, end))
+        return mrb_true_value();
+    }
+  }
+
+  return mrb_false_value();
+}
+
+/*
+ *  call-seq:
+ *     rng.first    -> obj
+ *     rng.first(n) -> an_array
+ *
+ *  Returns the first object in the range, or an array of the first +n+
+ *  elements.
+ *
+ *    (10..20).first     #=> 10
+ *    (10..20).first(3)  #=> [10, 11, 12]
+ */
+static mrb_value
+mrb_range_first(mrb_state *mrb, mrb_value range)
+{
+  mrb_int num;
+  mrb_value array;
+  struct RRange *r = mrb_range_ptr(range);
+
+  if (mrb_get_args(mrb, "|i", &num) == 0) {
+    return r->edges->beg;
+  }
+
+  array = mrb_funcall(mrb, range, "to_a", 0);
+  return mrb_funcall(mrb, array, "first", 1, mrb_fixnum_value(num));
+}
+
+/*
+ *  call-seq:
+ *     rng.last    -> obj
+ *     rng.last(n) -> an_array
+ *
+ *  Returns the last object in the range,
+ *  or an array of the last +n+ elements.
+ *
+ *  Note that with no arguments +last+ will return the object that defines
+ *  the end of the range even if #exclude_end? is +true+.
+ *
+ *    (10..20).last      #=> 20
+ *    (10...20).last     #=> 20
+ *    (10..20).last(3)   #=> [18, 19, 20]
+ *    (10...20).last(3)  #=> [17, 18, 19]
+ */
+static mrb_value
+mrb_range_last(mrb_state *mrb, mrb_value range)
+{
+  mrb_value num;
+  mrb_value array;
+  struct RRange *r = mrb_range_ptr(range);
+
+  if (mrb_get_args(mrb, "|o", &num) == 0) {
+    return r->edges->end;
+  }
+
+  array = mrb_funcall(mrb, range, "to_a", 0);
+  return mrb_funcall(mrb, array, "last", 1, mrb_to_int(mrb, num));
+}
+
+/*
+ *  call-seq:
+ *     rng.size                   -> num
+ *
+ *  Returns the number of elements in the range. Both the begin and the end of
+ *  the Range must be Numeric, otherwise nil is returned.
+ *
+ *    (10..20).size    #=> 11
+ *    ('a'..'z').size  #=> nil
+ */
+
+static mrb_value
+mrb_range_size(mrb_state *mrb, mrb_value range)
+{
+  struct RRange *r = mrb_range_ptr(range);
+  mrb_value beg, end;
+  double beg_f, end_f;
+  mrb_bool num_p = TRUE;
+
+  beg = r->edges->beg;
+  end = r->edges->end;
+  if (mrb_fixnum_p(beg)) {
+    beg_f = (double)mrb_fixnum(beg);
+  }
+  else if (mrb_float_p(beg)) {
+    beg_f = mrb_float(beg);
+  }
+  else {
+    num_p = FALSE;
+  }
+  if (mrb_fixnum_p(end)) {
+    end_f = (double)mrb_fixnum(end);
+  }
+  else if (mrb_float_p(end)) {
+    end_f = mrb_float(end);
+  }
+  else {
+    num_p = FALSE;
+  }
+  if (num_p) {
+    double f;
+
+    if (beg_f > end_f) return mrb_fixnum_value(0);
+    f = end_f - beg_f;
+    if (!r->excl) {
+      return mrb_fixnum_value((mrb_int)ceil(f + 1));
+    }
+    return mrb_fixnum_value((mrb_int)ceil(f));
+  }
+  return mrb_nil_value();
+}
+
+void
+mrb_mruby_range_ext_gem_init(mrb_state* mrb)
+{
+  struct RClass * s = mrb_class_get(mrb, "Range");
+
+  mrb_define_method(mrb, s, "cover?", mrb_range_cover, MRB_ARGS_REQ(1));
+  mrb_define_method(mrb, s, "first",  mrb_range_first, MRB_ARGS_OPT(1));
+  mrb_define_method(mrb, s, "last",   mrb_range_last,  MRB_ARGS_OPT(1));
+  mrb_define_method(mrb, s, "size",   mrb_range_size,  MRB_ARGS_NONE());
+}
+
+void
+mrb_mruby_range_ext_gem_final(mrb_state* mrb)
+{
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-sprintf/gem_init.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,56 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ *   This file was generated!
+ *   All manual changes will get lost.
+ */
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+gem_mrblib_irep_mruby_sprintf[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0xd0,0x99,0x00,0x00,0x01,0x1c,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x00,0xe4,0x30,0x30,
+0x30,0x30,0x00,0x00,0x00,0x37,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x00,0x80,0x00,0x45,0x00,0x80,0x00,
+0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x06,0x53,0x74,
+0x72,0x69,0x6e,0x67,0x00,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x03,0x00,0x01,0x00,
+0x00,0x00,0x05,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,
+0x04,0x00,0x80,0x00,0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x01,0x25,0x00,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,
+0x00,0x11,0x00,0x00,0x26,0x00,0x00,0x02,0x01,0x40,0x80,0x01,0x91,0x00,0x00,0x02,
+0xa0,0x00,0x80,0x01,0x99,0x03,0xc0,0x01,0x06,0x00,0x80,0x01,0x06,0x00,0x00,0x02,
+0xb7,0x00,0x01,0x02,0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0xbf,0x80,0x01,
+0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,
+0x20,0x81,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
+0x00,0x05,0x69,0x73,0x5f,0x61,0x3f,0x00,0x00,0x05,0x41,0x72,0x72,0x61,0x79,0x00,
+0x00,0x07,0x73,0x70,0x72,0x69,0x6e,0x74,0x66,0x00,0x4c,0x56,0x41,0x52,0x00,0x00,
+0x00,0x1a,0x00,0x00,0x00,0x01,0x00,0x04,0x61,0x72,0x67,0x73,0x00,0x00,0x00,0x01,
+0xff,0xff,0x00,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08,
+};
+void mrb_mruby_sprintf_gem_init(mrb_state *mrb);
+void mrb_mruby_sprintf_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_sprintf_gem_init(mrb_state *mrb) {
+  int ai = mrb_gc_arena_save(mrb);
+  mrb_mruby_sprintf_gem_init(mrb);
+  mrb_load_irep(mrb, gem_mrblib_irep_mruby_sprintf);
+  if (mrb->exc) {
+    mrb_print_error(mrb);
+    exit(EXIT_FAILURE);
+  }
+  mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_sprintf_gem_final(mrb_state *mrb) {
+  mrb_mruby_sprintf_gem_final(mrb);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-sprintf/kernel.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,31 @@
+/*
+** kernel.c - Kernel module suppliment
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+
+mrb_value mrb_f_sprintf(mrb_state *mrb, mrb_value obj); /* in sprintf.c */
+
+void
+mrb_mruby_sprintf_gem_init(mrb_state* mrb)
+{
+  struct RClass *krn;
+
+  if (mrb->kernel_module == NULL) {
+    mrb->kernel_module = mrb_define_module(mrb, "Kernel"); /* Might be PARANOID. */
+  }
+  krn = mrb->kernel_module;
+
+  mrb_define_method(mrb, krn, "sprintf", mrb_f_sprintf, MRB_ARGS_ANY());
+  mrb_define_method(mrb, krn, "format",  mrb_f_sprintf, MRB_ARGS_ANY());
+}
+
+void
+mrb_mruby_sprintf_gem_final(mrb_state* mrb)
+{
+  /* nothing to do. */
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-sprintf/sprintf.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,1105 @@
+/*
+** sprintf.c - Kernel.#sprintf
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+
+#include <limits.h>
+#include <stdio.h>
+#include <string.h>
+#include "mruby/string.h"
+#include "mruby/hash.h"
+#include "mruby/numeric.h"
+#include <math.h>
+#include <ctype.h>
+
+#define BIT_DIGITS(N)   (((N)*146)/485 + 1)  /* log2(10) =~ 146/485 */
+#define BITSPERDIG MRB_INT_BIT
+#define EXTENDSIGN(n, l) (((~0 << (n)) >> (((n)*(l)) % BITSPERDIG)) & ~(~0 << (n)))
+
+mrb_value mrb_str_format(mrb_state *, int, const mrb_value *, mrb_value);
+static void fmt_setup(char*,size_t,int,int,mrb_int,mrb_int);
+
+static char*
+remove_sign_bits(char *str, int base)
+{
+  char *t;
+
+  t = str;
+  if (base == 16) {
+    while (*t == 'f') {
+      t++;
+    }
+  }
+  else if (base == 8) {
+    *t |= EXTENDSIGN(3, strlen(t));
+    while (*t == '7') {
+      t++;
+    }
+  }
+  else if (base == 2) {
+    while (*t == '1') {
+      t++;
+    }
+  }
+
+  return t;
+}
+
+static char
+sign_bits(int base, const char *p)
+{
+  char c;
+
+  switch (base) {
+  case 16:
+    if (*p == 'X') c = 'F';
+    else c = 'f';
+    break;
+  case 8:
+    c = '7'; break;
+  case 2:
+    c = '1'; break;
+  default:
+    c = '.'; break;
+  }
+  return c;
+}
+
+static mrb_value
+mrb_fix2binstr(mrb_state *mrb, mrb_value x, int base)
+{
+  char buf[64], *b = buf + sizeof buf;
+  mrb_int num = mrb_fixnum(x);
+  unsigned long val = (unsigned long)num;
+  char d;
+
+  if (base != 2) {
+    mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid radix %S", mrb_fixnum_value(base));
+  }
+
+  if (val >= (1 << 10))
+    val &= 0x3ff;
+
+  if (val == 0) {
+    return mrb_str_new_lit(mrb, "0");
+  }
+  *--b = '\0';
+  do {
+    *--b = mrb_digitmap[(int)(val % base)];
+  } while (val /= base);
+
+  if (num < 0) {
+    b = remove_sign_bits(b, base);
+    switch (base) {
+    case 16: d = 'f'; break;
+    case 8:  d = '7'; break;
+    case 2:  d = '1'; break;
+    default: d = 0;   break;
+    }
+
+    if (d && *b != d) {
+      *--b = d;
+    }
+  }
+
+  return mrb_str_new_cstr(mrb, b);
+}
+
+#define FNONE  0
+#define FSHARP 1
+#define FMINUS 2
+#define FPLUS  4
+#define FZERO  8
+#define FSPACE 16
+#define FWIDTH 32
+#define FPREC  64
+#define FPREC0 128
+
+#define CHECK(l) do {\
+/*  int cr = ENC_CODERANGE(result);*/\
+  while (blen + (l) >= bsiz) {\
+    bsiz*=2;\
+  }\
+  mrb_str_resize(mrb, result, bsiz);\
+/*  ENC_CODERANGE_SET(result, cr);*/\
+  buf = RSTRING_PTR(result);\
+} while (0)
+
+#define PUSH(s, l) do { \
+  CHECK(l);\
+  memcpy(&buf[blen], s, l);\
+  blen += (l);\
+} while (0)
+
+#define FILL(c, l) do { \
+  CHECK(l);\
+  memset(&buf[blen], c, l);\
+  blen += (l);\
+} while (0)
+
+#define GETARG() (!mrb_undef_p(nextvalue) ? nextvalue : \
+  posarg == -1 ? \
+  (mrb_raisef(mrb, E_ARGUMENT_ERROR, "unnumbered(%S) mixed with numbered", mrb_fixnum_value(nextarg)), mrb_undef_value()) : \
+  posarg == -2 ? \
+  (mrb_raisef(mrb, E_ARGUMENT_ERROR, "unnumbered(%S) mixed with named", mrb_fixnum_value(nextarg)), mrb_undef_value()) : \
+  (posarg = nextarg++, GETNTHARG(posarg)))
+
+#define GETPOSARG(n) (posarg > 0 ? \
+  (mrb_raisef(mrb, E_ARGUMENT_ERROR, "numbered(%S) after unnumbered(%S)", mrb_fixnum_value(n), mrb_fixnum_value(posarg)), mrb_undef_value()) : \
+  posarg == -2 ? \
+  (mrb_raisef(mrb, E_ARGUMENT_ERROR, "numbered(%S) after named", mrb_fixnum_value(n)), mrb_undef_value()) : \
+  ((n < 1) ? \
+  (mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid index - %S$", mrb_fixnum_value(n)), mrb_undef_value()) : \
+  (posarg = -1, GETNTHARG(n))))
+
+#define GETNTHARG(nth) \
+  ((nth >= argc) ? (mrb_raise(mrb, E_ARGUMENT_ERROR, "too few arguments"), mrb_undef_value()) : argv[nth])
+
+#define GETNAMEARG(id, name, len) ( \
+  posarg > 0 ? \
+  (mrb_raisef(mrb, E_ARGUMENT_ERROR, "named%S after unnumbered(%S)", mrb_str_new(mrb, (name), (len)), mrb_fixnum_value(posarg)), mrb_undef_value()) : \
+  posarg == -1 ? \
+  (mrb_raisef(mrb, E_ARGUMENT_ERROR, "named%S after numbered", mrb_str_new(mrb, (name), (len))), mrb_undef_value()) :    \
+  (posarg = -2, mrb_hash_fetch(mrb, get_hash(mrb, &hash, argc, argv), id, mrb_undef_value())))
+
+#define GETNUM(n, val) \
+  for (; p < end && ISDIGIT(*p); p++) {\
+    int next_n = 10 * n + (*p - '0'); \
+    if (next_n / 10 != n) {\
+      mrb_raise(mrb, E_ARGUMENT_ERROR, #val " too big"); \
+    } \
+    n = next_n; \
+  } \
+  if (p >= end) { \
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "malformed format string - %*[0-9]"); \
+  }
+
+#define GETASTER(num) do { \
+  mrb_value tmp_v; \
+  t = p++; \
+  n = 0; \
+  GETNUM(n, val); \
+  if (*p == '$') { \
+    tmp_v = GETPOSARG(n); \
+  } \
+  else { \
+    tmp_v = GETARG(); \
+    p = t; \
+  } \
+  num = mrb_fixnum(tmp_v); \
+} while (0)
+
+static mrb_value
+get_hash(mrb_state *mrb, mrb_value *hash, int argc, const mrb_value *argv)
+{
+  mrb_value tmp;
+
+  if (!mrb_undef_p(*hash)) return *hash;
+  if (argc != 2) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "one hash required");
+  }
+  tmp = mrb_check_convert_type(mrb, argv[1], MRB_TT_HASH, "Hash", "to_hash");
+  if (mrb_nil_p(tmp)) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "one hash required");
+  }
+  return (*hash = tmp);
+}
+
+/*
+ *  call-seq:
+ *     format(format_string [, arguments...] )   -> string
+ *     sprintf(format_string [, arguments...] )  -> string
+ *
+ *  Returns the string resulting from applying <i>format_string</i> to
+ *  any additional arguments.  Within the format string, any characters
+ *  other than format sequences are copied to the result.
+ *
+ *  The syntax of a format sequence is follows.
+ *
+ *    %[flags][width][.precision]type
+ *
+ *  A format
+ *  sequence consists of a percent sign, followed by optional flags,
+ *  width, and precision indicators, then terminated with a field type
+ *  character.  The field type controls how the corresponding
+ *  <code>sprintf</code> argument is to be interpreted, while the flags
+ *  modify that interpretation.
+ *
+ *  The field type characters are:
+ *
+ *      Field |  Integer Format
+ *      ------+--------------------------------------------------------------
+ *        b   | Convert argument as a binary number.
+ *            | Negative numbers will be displayed as a two's complement
+ *            | prefixed with `..1'.
+ *        B   | Equivalent to `b', but uses an uppercase 0B for prefix
+ *            | in the alternative format by #.
+ *        d   | Convert argument as a decimal number.
+ *        i   | Identical to `d'.
+ *        o   | Convert argument as an octal number.
+ *            | Negative numbers will be displayed as a two's complement
+ *            | prefixed with `..7'.
+ *        u   | Identical to `d'.
+ *        x   | Convert argument as a hexadecimal number.
+ *            | Negative numbers will be displayed as a two's complement
+ *            | prefixed with `..f' (representing an infinite string of
+ *            | leading 'ff's).
+ *        X   | Equivalent to `x', but uses uppercase letters.
+ *
+ *      Field |  Float Format
+ *      ------+--------------------------------------------------------------
+ *        e   | Convert floating point argument into exponential notation
+ *            | with one digit before the decimal point as [-]d.dddddde[+-]dd.
+ *            | The precision specifies the number of digits after the decimal
+ *            | point (defaulting to six).
+ *        E   | Equivalent to `e', but uses an uppercase E to indicate
+ *            | the exponent.
+ *        f   | Convert floating point argument as [-]ddd.dddddd,
+ *            | where the precision specifies the number of digits after
+ *            | the decimal point.
+ *        g   | Convert a floating point number using exponential form
+ *            | if the exponent is less than -4 or greater than or
+ *            | equal to the precision, or in dd.dddd form otherwise.
+ *            | The precision specifies the number of significant digits.
+ *        G   | Equivalent to `g', but use an uppercase `E' in exponent form.
+ *        a   | Convert floating point argument as [-]0xh.hhhhp[+-]dd,
+ *            | which is consisted from optional sign, "0x", fraction part
+ *            | as hexadecimal, "p", and exponential part as decimal.
+ *        A   | Equivalent to `a', but use uppercase `X' and `P'.
+ *
+ *      Field |  Other Format
+ *      ------+--------------------------------------------------------------
+ *        c   | Argument is the numeric code for a single character or
+ *            | a single character string itself.
+ *        p   | The valuing of argument.inspect.
+ *        s   | Argument is a string to be substituted.  If the format
+ *            | sequence contains a precision, at most that many characters
+ *            | will be copied.
+ *        %   | A percent sign itself will be displayed.  No argument taken.
+ *
+ *  The flags modifies the behavior of the formats.
+ *  The flag characters are:
+ *
+ *    Flag     | Applies to    | Meaning
+ *    ---------+---------------+-----------------------------------------
+ *    space    | bBdiouxX      | Leave a space at the start of
+ *             | aAeEfgG       | non-negative numbers.
+ *             | (numeric fmt) | For `o', `x', `X', `b' and `B', use
+ *             |               | a minus sign with absolute value for
+ *             |               | negative values.
+ *    ---------+---------------+-----------------------------------------
+ *    (digit)$ | all           | Specifies the absolute argument number
+ *             |               | for this field.  Absolute and relative
+ *             |               | argument numbers cannot be mixed in a
+ *             |               | sprintf string.
+ *    ---------+---------------+-----------------------------------------
+ *     #       | bBoxX         | Use an alternative format.
+ *             | aAeEfgG       | For the conversions `o', increase the precision
+ *             |               | until the first digit will be `0' if
+ *             |               | it is not formatted as complements.
+ *             |               | For the conversions `x', `X', `b' and `B'
+ *             |               | on non-zero, prefix the result with ``0x'',
+ *             |               | ``0X'', ``0b'' and ``0B'', respectively.
+ *             |               | For `a', `A', `e', `E', `f', `g', and 'G',
+ *             |               | force a decimal point to be added,
+ *             |               | even if no digits follow.
+ *             |               | For `g' and 'G', do not remove trailing zeros.
+ *    ---------+---------------+-----------------------------------------
+ *    +        | bBdiouxX      | Add a leading plus sign to non-negative
+ *             | aAeEfgG       | numbers.
+ *             | (numeric fmt) | For `o', `x', `X', `b' and `B', use
+ *             |               | a minus sign with absolute value for
+ *             |               | negative values.
+ *    ---------+---------------+-----------------------------------------
+ *    -        | all           | Left-justify the result of this conversion.
+ *    ---------+---------------+-----------------------------------------
+ *    0 (zero) | bBdiouxX      | Pad with zeros, not spaces.
+ *             | aAeEfgG       | For `o', `x', `X', `b' and `B', radix-1
+ *             | (numeric fmt) | is used for negative numbers formatted as
+ *             |               | complements.
+ *    ---------+---------------+-----------------------------------------
+ *    *        | all           | Use the next argument as the field width.
+ *             |               | If negative, left-justify the result. If the
+ *             |               | asterisk is followed by a number and a dollar
+ *             |               | sign, use the indicated argument as the width.
+ *
+ *  Examples of flags:
+ *
+ *   # `+' and space flag specifies the sign of non-negative numbers.
+ *   sprintf("%d", 123)  #=> "123"
+ *   sprintf("%+d", 123) #=> "+123"
+ *   sprintf("% d", 123) #=> " 123"
+ *
+ *   # `#' flag for `o' increases number of digits to show `0'.
+ *   # `+' and space flag changes format of negative numbers.
+ *   sprintf("%o", 123)   #=> "173"
+ *   sprintf("%#o", 123)  #=> "0173"
+ *   sprintf("%+o", -123) #=> "-173"
+ *   sprintf("%o", -123)  #=> "..7605"
+ *   sprintf("%#o", -123) #=> "..7605"
+ *
+ *   # `#' flag for `x' add a prefix `0x' for non-zero numbers.
+ *   # `+' and space flag disables complements for negative numbers.
+ *   sprintf("%x", 123)   #=> "7b"
+ *   sprintf("%#x", 123)  #=> "0x7b"
+ *   sprintf("%+x", -123) #=> "-7b"
+ *   sprintf("%x", -123)  #=> "..f85"
+ *   sprintf("%#x", -123) #=> "0x..f85"
+ *   sprintf("%#x", 0)    #=> "0"
+ *
+ *   # `#' for `X' uses the prefix `0X'.
+ *   sprintf("%X", 123)  #=> "7B"
+ *   sprintf("%#X", 123) #=> "0X7B"
+ *
+ *   # `#' flag for `b' add a prefix `0b' for non-zero numbers.
+ *   # `+' and space flag disables complements for negative numbers.
+ *   sprintf("%b", 123)   #=> "1111011"
+ *   sprintf("%#b", 123)  #=> "0b1111011"
+ *   sprintf("%+b", -123) #=> "-1111011"
+ *   sprintf("%b", -123)  #=> "..10000101"
+ *   sprintf("%#b", -123) #=> "0b..10000101"
+ *   sprintf("%#b", 0)    #=> "0"
+ *
+ *   # `#' for `B' uses the prefix `0B'.
+ *   sprintf("%B", 123)  #=> "1111011"
+ *   sprintf("%#B", 123) #=> "0B1111011"
+ *
+ *   # `#' for `e' forces to show the decimal point.
+ *   sprintf("%.0e", 1)  #=> "1e+00"
+ *   sprintf("%#.0e", 1) #=> "1.e+00"
+ *
+ *   # `#' for `f' forces to show the decimal point.
+ *   sprintf("%.0f", 1234)  #=> "1234"
+ *   sprintf("%#.0f", 1234) #=> "1234."
+ *
+ *   # `#' for `g' forces to show the decimal point.
+ *   # It also disables stripping lowest zeros.
+ *   sprintf("%g", 123.4)   #=> "123.4"
+ *   sprintf("%#g", 123.4)  #=> "123.400"
+ *   sprintf("%g", 123456)  #=> "123456"
+ *   sprintf("%#g", 123456) #=> "123456."
+ *
+ *  The field width is an optional integer, followed optionally by a
+ *  period and a precision.  The width specifies the minimum number of
+ *  characters that will be written to the result for this field.
+ *
+ *  Examples of width:
+ *
+ *   # padding is done by spaces,       width=20
+ *   # 0 or radix-1.             <------------------>
+ *   sprintf("%20d", 123)   #=> "                 123"
+ *   sprintf("%+20d", 123)  #=> "                +123"
+ *   sprintf("%020d", 123)  #=> "00000000000000000123"
+ *   sprintf("%+020d", 123) #=> "+0000000000000000123"
+ *   sprintf("% 020d", 123) #=> " 0000000000000000123"
+ *   sprintf("%-20d", 123)  #=> "123                 "
+ *   sprintf("%-+20d", 123) #=> "+123                "
+ *   sprintf("%- 20d", 123) #=> " 123                "
+ *   sprintf("%020x", -123) #=> "..ffffffffffffffff85"
+ *
+ *  For
+ *  numeric fields, the precision controls the number of decimal places
+ *  displayed.  For string fields, the precision determines the maximum
+ *  number of characters to be copied from the string.  (Thus, the format
+ *  sequence <code>%10.10s</code> will always contribute exactly ten
+ *  characters to the result.)
+ *
+ *  Examples of precisions:
+ *
+ *   # precision for `d', 'o', 'x' and 'b' is
+ *   # minimum number of digits               <------>
+ *   sprintf("%20.8d", 123)  #=> "            00000123"
+ *   sprintf("%20.8o", 123)  #=> "            00000173"
+ *   sprintf("%20.8x", 123)  #=> "            0000007b"
+ *   sprintf("%20.8b", 123)  #=> "            01111011"
+ *   sprintf("%20.8d", -123) #=> "           -00000123"
+ *   sprintf("%20.8o", -123) #=> "            ..777605"
+ *   sprintf("%20.8x", -123) #=> "            ..ffff85"
+ *   sprintf("%20.8b", -11)  #=> "            ..110101"
+ *
+ *   # "0x" and "0b" for `#x' and `#b' is not counted for
+ *   # precision but "0" for `#o' is counted.  <------>
+ *   sprintf("%#20.8d", 123)  #=> "            00000123"
+ *   sprintf("%#20.8o", 123)  #=> "            00000173"
+ *   sprintf("%#20.8x", 123)  #=> "          0x0000007b"
+ *   sprintf("%#20.8b", 123)  #=> "          0b01111011"
+ *   sprintf("%#20.8d", -123) #=> "           -00000123"
+ *   sprintf("%#20.8o", -123) #=> "            ..777605"
+ *   sprintf("%#20.8x", -123) #=> "          0x..ffff85"
+ *   sprintf("%#20.8b", -11)  #=> "          0b..110101"
+ *
+ *   # precision for `e' is number of
+ *   # digits after the decimal point           <------>
+ *   sprintf("%20.8e", 1234.56789) #=> "      1.23456789e+03"
+ *
+ *   # precision for `f' is number of
+ *   # digits after the decimal point               <------>
+ *   sprintf("%20.8f", 1234.56789) #=> "       1234.56789000"
+ *
+ *   # precision for `g' is number of
+ *   # significant digits                          <------->
+ *   sprintf("%20.8g", 1234.56789) #=> "           1234.5679"
+ *
+ *   #                                         <------->
+ *   sprintf("%20.8g", 123456789)  #=> "       1.2345679e+08"
+ *
+ *   # precision for `s' is
+ *   # maximum number of characters                    <------>
+ *   sprintf("%20.8s", "string test") #=> "            string t"
+ *
+ *  Examples:
+ *
+ *     sprintf("%d %04x", 123, 123)               #=> "123 007b"
+ *     sprintf("%08b '%4s'", 123, 123)            #=> "01111011 ' 123'"
+ *     sprintf("%1$*2$s %2$d %1$s", "hello", 8)   #=> "   hello 8 hello"
+ *     sprintf("%1$*2$s %2$d", "hello", -8)       #=> "hello    -8"
+ *     sprintf("%+g:% g:%-g", 1.23, 1.23, 1.23)   #=> "+1.23: 1.23:1.23"
+ *     sprintf("%u", -123)                        #=> "-123"
+ *
+ *  For more complex formatting, Ruby supports a reference by name.
+ *  %<name>s style uses format style, but %{name} style doesn't.
+ *
+ *  Exapmles:
+ *    sprintf("%<foo>d : %<bar>f", { :foo => 1, :bar => 2 })
+ *      #=> 1 : 2.000000
+ *    sprintf("%{foo}f", { :foo => 1 })
+ *      # => "1f"
+ */
+
+mrb_value
+mrb_f_sprintf(mrb_state *mrb, mrb_value obj)
+{
+  mrb_int argc;
+  mrb_value *argv;
+
+  mrb_get_args(mrb, "*", &argv, &argc);
+
+  if (argc <= 0) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "too few arguments");
+    return mrb_nil_value();
+  }
+  else {
+    return mrb_str_format(mrb, argc - 1, argv + 1, argv[0]);
+  }
+}
+
+mrb_value
+mrb_str_format(mrb_state *mrb, int argc, const mrb_value *argv, mrb_value fmt)
+{
+  const char *p, *end;
+  char *buf;
+  mrb_int blen;
+  mrb_int bsiz;
+  mrb_value result;
+  mrb_int n;
+  mrb_int width;
+  mrb_int prec;
+  int flags = FNONE;
+  int nextarg = 1;
+  int posarg = 0;
+  mrb_value nextvalue;
+  mrb_value str;
+  mrb_value hash = mrb_undef_value();
+
+#define CHECK_FOR_WIDTH(f)                                                  \
+  if ((f) & FWIDTH) {                                                       \
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "width given twice");         \
+  }                                                                         \
+  if ((f) & FPREC0) {                                                       \
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "width after precision");     \
+  }
+#define CHECK_FOR_FLAGS(f)                                                  \
+  if ((f) & FWIDTH) {                                                       \
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "flag after width");          \
+  }                                                                         \
+  if ((f) & FPREC0) {                                                       \
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "flag after precision");      \
+  }
+
+  ++argc;
+  --argv;
+  fmt = mrb_str_to_str(mrb, fmt);
+  p = RSTRING_PTR(fmt);
+  end = p + RSTRING_LEN(fmt);
+  blen = 0;
+  bsiz = 120;
+  result = mrb_str_buf_new(mrb, bsiz);
+  buf = RSTRING_PTR(result);
+  memset(buf, 0, bsiz);
+
+  for (; p < end; p++) {
+    const char *t;
+    mrb_sym id = 0;
+
+    for (t = p; t < end && *t != '%'; t++) ;
+    PUSH(p, t - p);
+    if (t >= end)
+      goto sprint_exit; /* end of fmt string */
+
+    p = t + 1;    /* skip `%' */
+
+    width = prec = -1;
+    nextvalue = mrb_undef_value();
+
+retry:
+    switch (*p) {
+      default:
+        mrb_raisef(mrb, E_ARGUMENT_ERROR, "malformed format string - \\%%S", mrb_str_new(mrb, p, 1));
+        break;
+
+      case ' ':
+        CHECK_FOR_FLAGS(flags);
+        flags |= FSPACE;
+        p++;
+        goto retry;
+
+      case '#':
+        CHECK_FOR_FLAGS(flags);
+        flags |= FSHARP;
+        p++;
+        goto retry;
+
+      case '+':
+        CHECK_FOR_FLAGS(flags);
+        flags |= FPLUS;
+        p++;
+        goto retry;
+
+      case '-':
+        CHECK_FOR_FLAGS(flags);
+        flags |= FMINUS;
+        p++;
+        goto retry;
+
+      case '0':
+        CHECK_FOR_FLAGS(flags);
+        flags |= FZERO;
+        p++;
+        goto retry;
+
+      case '1': case '2': case '3': case '4':
+      case '5': case '6': case '7': case '8': case '9':
+        n = 0;
+        GETNUM(n, width);
+        if (*p == '$') {
+          if (!mrb_undef_p(nextvalue)) {
+            mrb_raisef(mrb, E_ARGUMENT_ERROR, "value given twice - %S$", mrb_fixnum_value(n));
+          }
+          nextvalue = GETPOSARG(n);
+          p++;
+          goto retry;
+        }
+        CHECK_FOR_WIDTH(flags);
+        width = n;
+        flags |= FWIDTH;
+        goto retry;
+
+      case '<':
+      case '{': {
+        const char *start = p;
+        char term = (*p == '<') ? '>' : '}';
+        mrb_value symname;
+
+        for (; p < end && *p != term; )
+          p++;
+        if (id) {
+          mrb_raisef(mrb, E_ARGUMENT_ERROR, "name%S after <%S>",
+                     mrb_str_new(mrb, start, p - start + 1), mrb_sym2str(mrb, id));
+        }
+        symname = mrb_str_new(mrb, start + 1, p - start - 1);
+        id = mrb_intern_str(mrb, symname);
+        nextvalue = GETNAMEARG(mrb_symbol_value(id), start, (int)(p - start + 1));
+        if (mrb_undef_p(nextvalue)) {
+          mrb_raisef(mrb, E_KEY_ERROR, "key%S not found", mrb_str_new(mrb, start, p - start + 1));
+        }
+        if (term == '}') goto format_s;
+        p++;
+        goto retry;
+      }
+
+      case '*':
+        CHECK_FOR_WIDTH(flags);
+        flags |= FWIDTH;
+        GETASTER(width);
+        if (width < 0) {
+          flags |= FMINUS;
+          width = -width;
+        }
+        p++;
+        goto retry;
+
+      case '.':
+        if (flags & FPREC0) {
+          mrb_raise(mrb, E_ARGUMENT_ERROR, "precision given twice");
+        }
+        flags |= FPREC|FPREC0;
+
+        prec = 0;
+        p++;
+        if (*p == '*') {
+          GETASTER(prec);
+          if (prec < 0) {  /* ignore negative precision */
+            flags &= ~FPREC;
+          }
+          p++;
+          goto retry;
+        }
+
+        GETNUM(prec, precision);
+        goto retry;
+
+      case '\n':
+      case '\0':
+        p--;
+        /* fallthrough */
+      case '%':
+        if (flags != FNONE) {
+          mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid format character - %");
+        }
+        PUSH("%", 1);
+        break;
+
+      case 'c': {
+        mrb_value val = GETARG();
+        mrb_value tmp;
+        char *c;
+
+        tmp = mrb_check_string_type(mrb, val);
+        if (!mrb_nil_p(tmp)) {
+          if (mrb_fixnum(mrb_funcall(mrb, tmp, "size", 0)) != 1 ) {
+            mrb_raise(mrb, E_ARGUMENT_ERROR, "%c requires a character");
+          }
+        }
+        else if (mrb_fixnum_p(val)) {
+          tmp = mrb_funcall(mrb, val, "chr", 0);
+        }
+        else {
+          mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid character");
+        }
+        c = RSTRING_PTR(tmp);
+        n = RSTRING_LEN(tmp);
+        if (!(flags & FWIDTH)) {
+          CHECK(n);
+          memcpy(buf+blen, c, n);
+          blen += n;
+        }
+        else if ((flags & FMINUS)) {
+          CHECK(n);
+          memcpy(buf+blen, c, n);
+          blen += n;
+          FILL(' ', width-1);
+        }
+        else {
+          FILL(' ', width-1);
+          CHECK(n);
+          memcpy(buf+blen, c, n);
+          blen += n;
+        }
+      }
+      break;
+
+      case 's':
+      case 'p':
+  format_s:
+      {
+        mrb_value arg = GETARG();
+        mrb_int len;
+        mrb_int slen;
+
+        if (*p == 'p') arg = mrb_inspect(mrb, arg);
+        str = mrb_obj_as_string(mrb, arg);
+        len = RSTRING_LEN(str);
+        if (RSTRING(result)->flags & MRB_STR_EMBED) {
+          mrb_int tmp_n = len;
+          RSTRING(result)->flags &= ~MRB_STR_EMBED_LEN_MASK;
+          RSTRING(result)->flags |= tmp_n << MRB_STR_EMBED_LEN_SHIFT;
+        } else {
+          RSTRING(result)->as.heap.len = blen;
+        }
+        if (flags&(FPREC|FWIDTH)) {
+          slen = RSTRING_LEN(str);
+          if (slen < 0) {
+            mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid mbstring sequence");
+          }
+          if ((flags&FPREC) && (prec < slen)) {
+            char *p = RSTRING_PTR(str) + prec;
+            slen = prec;
+            len = p - RSTRING_PTR(str);
+          }
+          /* need to adjust multi-byte string pos */
+          if ((flags&FWIDTH) && (width > slen)) {
+            width -= (int)slen;
+            if (!(flags&FMINUS)) {
+              CHECK(width);
+              while (width--) {
+                buf[blen++] = ' ';
+              }
+            }
+            CHECK(len);
+            memcpy(&buf[blen], RSTRING_PTR(str), len);
+            blen += len;
+            if (flags&FMINUS) {
+              CHECK(width);
+              while (width--) {
+                buf[blen++] = ' ';
+              }
+            }
+            break;
+          }
+        }
+        PUSH(RSTRING_PTR(str), len);
+      }
+      break;
+
+      case 'd':
+      case 'i':
+      case 'o':
+      case 'x':
+      case 'X':
+      case 'b':
+      case 'B':
+      case 'u': {
+        mrb_value val = GETARG();
+        char fbuf[32], nbuf[64], *s;
+        const char *prefix = NULL;
+        int sign = 0, dots = 0;
+        char sc = 0;
+        mrb_int v = 0, org_v = 0;
+        int base;
+        mrb_int len;
+
+        switch (*p) {
+          case 'd':
+          case 'i':
+          case 'u':
+            sign = 1; break;
+          case 'o':
+          case 'x':
+          case 'X':
+          case 'b':
+          case 'B':
+            if (flags&(FPLUS|FSPACE)) sign = 1;
+            break;
+          default:
+            break;
+        }
+        if (flags & FSHARP) {
+          switch (*p) {
+            case 'o': prefix = "0"; break;
+            case 'x': prefix = "0x"; break;
+            case 'X': prefix = "0X"; break;
+            case 'b': prefix = "0b"; break;
+            case 'B': prefix = "0B"; break;
+            default: break;
+          }
+        }
+
+  bin_retry:
+        switch (mrb_type(val)) {
+          case MRB_TT_FLOAT:
+            if (FIXABLE(mrb_float(val))) {
+              val = mrb_fixnum_value((mrb_int)mrb_float(val));
+              goto bin_retry;
+            }
+            val = mrb_flo_to_fixnum(mrb, val);
+            if (mrb_fixnum_p(val)) goto bin_retry;
+            break;
+          case MRB_TT_STRING:
+            val = mrb_str_to_inum(mrb, val, 0, TRUE);
+            goto bin_retry;
+          case MRB_TT_FIXNUM:
+            v = mrb_fixnum(val);
+            break;
+          default:
+            val = mrb_Integer(mrb, val);
+            goto bin_retry;
+        }
+
+        switch (*p) {
+          case 'o':
+            base = 8; break;
+          case 'x':
+          case 'X':
+            base = 16; break;
+          case 'b':
+          case 'B':
+            base = 2; break;
+          case 'u':
+          case 'd':
+          case 'i':
+          default:
+            base = 10; break;
+        }
+
+        if (base == 2) {
+          org_v = v;
+          if (v < 0 && !sign) {
+            val = mrb_fix2binstr(mrb, mrb_fixnum_value(v), base);
+            dots = 1;
+          }
+          else {
+            val = mrb_fixnum_to_str(mrb, mrb_fixnum_value(v), base);
+          }
+          v = mrb_fixnum(mrb_str_to_inum(mrb, val, 10, FALSE));
+        }
+        if (sign) {
+          char c = *p;
+          if (c == 'i') c = 'd'; /* %d and %i are identical */
+          if (base == 2) c = 'd';
+          if (v < 0) {
+            v = -v;
+            sc = '-';
+            width--;
+          }
+          else if (flags & FPLUS) {
+            sc = '+';
+            width--;
+          }
+          else if (flags & FSPACE) {
+            sc = ' ';
+            width--;
+          }
+          snprintf(fbuf, sizeof(fbuf), "%%l%c", c);
+          snprintf(nbuf, sizeof(nbuf), fbuf, v);
+          s = nbuf;
+        }
+        else {
+          char c = *p;
+          if (c == 'X') c = 'x';
+          if (base == 2) c = 'd';
+          s = nbuf;
+          if (v < 0) {
+            dots = 1;
+          }
+          snprintf(fbuf, sizeof(fbuf), "%%l%c", c);
+          snprintf(++s, sizeof(nbuf) - 1, fbuf, v);
+          if (v < 0) {
+            char d;
+
+            s = remove_sign_bits(s, base);
+            switch (base) {
+              case 16: d = 'f'; break;
+              case 8:  d = '7'; break;
+              case 2:  d = '1'; break;
+              default: d = 0; break;
+            }
+
+            if (d && *s != d) {
+              *--s = d;
+            }
+          }
+        }
+        {
+          size_t size;
+          size = strlen(s);
+          /* PARANOID: assert(size <= MRB_INT_MAX) */
+          len = (mrb_int)size;
+        }
+
+        if (dots) {
+          prec -= 2;
+          width -= 2;
+        }
+
+        if (*p == 'X') {
+          char *pp = s;
+          int c;
+          while ((c = (int)(unsigned char)*pp) != 0) {
+            *pp = toupper(c);
+            pp++;
+          }
+        }
+
+        if (prefix && !prefix[1]) { /* octal */
+          if (dots) {
+            prefix = NULL;
+          }
+          else if (len == 1 && *s == '0') {
+            len = 0;
+            if (flags & FPREC) prec--;
+          }
+          else if ((flags & FPREC) && (prec > len)) {
+            prefix = NULL;
+          }
+        }
+        else if (len == 1 && *s == '0') {
+          prefix = NULL;
+        }
+
+        if (prefix) {
+          size_t size;
+          size = strlen(prefix);
+          /* PARANOID: assert(size <= MRB_INT_MAX).
+           *  this check is absolutely paranoid. */
+          width -= (mrb_int)size;
+        }
+
+        if ((flags & (FZERO|FMINUS|FPREC)) == FZERO) {
+          prec = width;
+          width = 0;
+        }
+        else {
+          if (prec < len) {
+            if (!prefix && prec == 0 && len == 1 && *s == '0') len = 0;
+            prec = len;
+          }
+          width -= prec;
+        }
+
+        if (!(flags&FMINUS)) {
+          CHECK(width);
+          while (width-- > 0) {
+            buf[blen++] = ' ';
+          }
+        }
+
+        if (sc) PUSH(&sc, 1);
+
+        if (prefix) {
+          int plen = (int)strlen(prefix);
+          PUSH(prefix, plen);
+        }
+        CHECK(prec - len);
+        if (dots) PUSH("..", 2);
+
+        if (v < 0 || (base == 2 && org_v < 0)) {
+          char c = sign_bits(base, p);
+          while (len < prec--) {
+            buf[blen++] = c;
+          }
+        }
+        else if ((flags & (FMINUS|FPREC)) != FMINUS) {
+          char c = '0';
+          while (len < prec--) {
+            buf[blen++] = c;
+          }
+        }
+
+        PUSH(s, len);
+        CHECK(width);
+        while (width-- > 0) {
+          buf[blen++] = ' ';
+        }
+      }
+      break;
+
+      case 'f':
+      case 'g':
+      case 'G':
+      case 'e':
+      case 'E':
+      case 'a':
+      case 'A': {
+        mrb_value val = GETARG();
+        double fval;
+        int i, need = 6;
+        char fbuf[32];
+
+        fval = mrb_float(mrb_Float(mrb, val));
+        if (!isfinite(fval)) {
+          const char *expr;
+          const int elen = 3;
+
+          if (isnan(fval)) {
+            expr = "NaN";
+          }
+          else {
+            expr = "Inf";
+          }
+          need = elen;
+          if ((!isnan(fval) && fval < 0.0) || (flags & FPLUS))
+            need++;
+          if ((flags & FWIDTH) && need < width)
+            need = width;
+
+          CHECK(need + 1);
+          snprintf(&buf[blen], need + 1, "%*s", need, "");
+          if (flags & FMINUS) {
+            if (!isnan(fval) && fval < 0.0)
+              buf[blen++] = '-';
+            else if (flags & FPLUS)
+              buf[blen++] = '+';
+            else if (flags & FSPACE)
+              blen++;
+            memcpy(&buf[blen], expr, elen);
+          }
+          else {
+            if (!isnan(fval) && fval < 0.0)
+              buf[blen + need - elen - 1] = '-';
+            else if (flags & FPLUS)
+              buf[blen + need - elen - 1] = '+';
+            else if ((flags & FSPACE) && need > width)
+              blen++;
+            memcpy(&buf[blen + need - elen], expr, elen);
+          }
+          blen += strlen(&buf[blen]);
+          break;
+        }
+
+        fmt_setup(fbuf, sizeof(fbuf), *p, flags, width, prec);
+        need = 0;
+        if (*p != 'e' && *p != 'E') {
+          i = INT_MIN;
+          frexp(fval, &i);
+          if (i > 0)
+            need = BIT_DIGITS(i);
+        }
+        need += (flags&FPREC) ? prec : 6;
+        if ((flags&FWIDTH) && need < width)
+          need = width;
+        need += 20;
+
+        CHECK(need);
+        n = snprintf(&buf[blen], need, fbuf, fval);
+        blen += n;
+      }
+      break;
+    }
+    flags = FNONE;
+  }
+
+  sprint_exit:
+#if 0
+  /* XXX - We cannot validate the number of arguments if (digit)$ style used.
+   */
+  if (posarg >= 0 && nextarg < argc) {
+    const char *mesg = "too many arguments for format string";
+    if (mrb_test(ruby_debug)) mrb_raise(mrb, E_ARGUMENT_ERROR, mesg);
+    if (mrb_test(ruby_verbose)) mrb_warn(mrb, "%S", mrb_str_new_cstr(mrb, mesg));
+  }
+#endif
+  mrb_str_resize(mrb, result, blen);
+
+  return result;
+}
+
+static void
+fmt_setup(char *buf, size_t size, int c, int flags, mrb_int width, mrb_int prec)
+{
+  char *end = buf + size;
+  int n;
+
+  *buf++ = '%';
+  if (flags & FSHARP) *buf++ = '#';
+  if (flags & FPLUS)  *buf++ = '+';
+  if (flags & FMINUS) *buf++ = '-';
+  if (flags & FZERO)  *buf++ = '0';
+  if (flags & FSPACE) *buf++ = ' ';
+
+  if (flags & FWIDTH) {
+    n = snprintf(buf, end - buf, "%d", (int)width);
+    buf += n;
+  }
+
+  if (flags & FPREC) {
+    n = snprintf(buf, end - buf, ".%d", (int)prec);
+    buf += n;
+  }
+
+  *buf++ = c;
+  *buf = '\0';
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-string-ext/gem_init.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,273 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ *   This file was generated!
+ *   All manual changes will get lost.
+ */
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+gem_mrblib_irep_mruby_string_ext[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0x77,0xa0,0x00,0x00,0x0e,0xa4,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x0d,0xa0,0x30,0x30,
+0x30,0x30,0x00,0x00,0x00,0x37,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x00,0x80,0x00,0x45,0x00,0x80,0x00,
+0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x06,0x53,0x74,
+0x72,0x69,0x6e,0x67,0x00,0x00,0x00,0x01,0x11,0x00,0x01,0x00,0x03,0x00,0x0b,0x00,
+0x00,0x00,0x23,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x04,0x00,0x01,0x46,0x80,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,
+0x46,0xc0,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x08,0x00,0x01,0x46,0x00,0x81,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x0a,0x00,0x01,0x46,0x40,0x81,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x0c,0x00,0x01,0x46,0x80,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x0e,0x00,0x01,
+0x46,0xc0,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x10,0x00,0x01,0x46,0x00,0x82,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x12,0x00,0x01,0x46,0x40,0x82,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x14,0x00,0x01,0x46,0x80,0x82,0x00,0x04,0x05,0x80,0x00,0x29,0x00,0x80,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x00,0x05,0x63,0x6c,0x65,0x61,0x72,0x00,
+0x00,0x06,0x6c,0x73,0x74,0x72,0x69,0x70,0x00,0x00,0x06,0x72,0x73,0x74,0x72,0x69,
+0x70,0x00,0x00,0x05,0x73,0x74,0x72,0x69,0x70,0x00,0x00,0x07,0x6c,0x73,0x74,0x72,
+0x69,0x70,0x21,0x00,0x00,0x07,0x72,0x73,0x74,0x72,0x69,0x70,0x21,0x00,0x00,0x06,
+0x73,0x74,0x72,0x69,0x70,0x21,0x00,0x00,0x07,0x63,0x61,0x73,0x65,0x63,0x6d,0x70,
+0x00,0x00,0x09,0x70,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x00,0x00,0x0a,0x72,
+0x70,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x00,0x00,0x06,0x73,0x6c,0x69,0x63,
+0x65,0x21,0x00,0x00,0x00,0x00,0x3b,0x00,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x00,
+0x05,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x06,0x00,0x00,0x01,0x3d,0x00,0x80,0x01,
+0xa0,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x01,0x00,0x07,0x72,0x65,0x70,0x6c,0x61,0x63,0x65,0x00,0x00,0x00,0x00,
+0xcf,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x26,0x00,0x00,0x00,
+0x83,0xff,0x3f,0x01,0x06,0x00,0x00,0x02,0x20,0x00,0x00,0x02,0xaf,0x40,0x00,0x02,
+0x01,0x00,0x81,0x01,0x97,0x01,0x40,0x00,0x01,0x80,0x00,0x02,0xad,0x80,0x00,0x02,
+0x01,0x00,0x01,0x01,0x3d,0x00,0x00,0x02,0x06,0x00,0x80,0x02,0x01,0x80,0x00,0x03,
+0xa0,0x00,0x81,0x02,0xa0,0xc0,0x00,0x02,0x99,0x01,0x40,0x02,0x01,0x80,0x00,0x02,
+0x01,0xc0,0x80,0x02,0xb4,0x40,0x01,0x02,0x98,0xf9,0x3f,0x02,0x01,0xc0,0x00,0x02,
+0x83,0xff,0xbf,0x02,0xb6,0x80,0x01,0x02,0x19,0x03,0x40,0x02,0x06,0x00,0x00,0x02,
+0x01,0x80,0x80,0x02,0x01,0xc0,0x00,0x03,0x41,0x40,0x81,0x02,0xa0,0x00,0x01,0x02,
+0x97,0x00,0x40,0x00,0xbd,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x02,
+0x00,0x00,0x06,0x20,0x0c,0x0a,0x0d,0x09,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x07,
+0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01,0x2d,0x00,0x00,0x01,0x2b,0x00,0x00,
+0x08,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x3f,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,
+0x02,0x3c,0x3d,0x00,0x00,0x02,0x3e,0x3d,0x00,0x00,0x00,0x00,0xcc,0x00,0x04,0x00,
+0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x26,0x00,0x00,0x00,0x83,0xff,0x3f,0x01,
+0x06,0x00,0x00,0x02,0x20,0x00,0x00,0x02,0xaf,0x40,0x00,0x02,0x01,0x00,0x81,0x01,
+0x97,0x01,0x40,0x00,0x01,0xc0,0x00,0x02,0xaf,0x40,0x00,0x02,0x01,0x00,0x81,0x01,
+0x3d,0x00,0x00,0x02,0x06,0x00,0x80,0x02,0x01,0xc0,0x00,0x03,0xa0,0xc0,0x80,0x02,
+0xa0,0x80,0x00,0x02,0x99,0x01,0x40,0x02,0x01,0x80,0x00,0x02,0x01,0xc0,0x80,0x02,
+0xb4,0x00,0x01,0x02,0x98,0xf9,0x3f,0x02,0x01,0xc0,0x00,0x02,0x83,0xff,0xbf,0x02,
+0xb6,0x40,0x01,0x02,0x19,0x03,0x40,0x02,0x06,0x00,0x00,0x02,0x01,0x80,0x80,0x02,
+0x01,0xc0,0x00,0x03,0x41,0x40,0x81,0x02,0xa0,0xc0,0x00,0x02,0x97,0x00,0x40,0x00,
+0xbd,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x07,0x20,
+0x0c,0x0a,0x0d,0x09,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x04,0x73,
+0x69,0x7a,0x65,0x00,0x00,0x01,0x2d,0x00,0x00,0x08,0x69,0x6e,0x63,0x6c,0x75,0x64,
+0x65,0x3f,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x02,0x3c,0x3d,0x00,0x00,0x02,0x3e,
+0x3d,0x00,0x00,0x00,0x01,0x11,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x2e,
+0x26,0x00,0x00,0x00,0x83,0xff,0x3f,0x01,0x06,0x00,0x00,0x02,0x20,0x00,0x00,0x02,
+0xaf,0x40,0x00,0x02,0x01,0x00,0x81,0x01,0x97,0x01,0x40,0x00,0x01,0x80,0x00,0x02,
+0xad,0x80,0x00,0x02,0x01,0x00,0x01,0x01,0x3d,0x00,0x00,0x02,0x06,0x00,0x80,0x02,
+0x01,0x80,0x00,0x03,0xa0,0x00,0x81,0x02,0xa0,0xc0,0x00,0x02,0x99,0x01,0x40,0x02,
+0x01,0x80,0x00,0x02,0x01,0xc0,0x80,0x02,0xb4,0x40,0x01,0x02,0x98,0xf9,0x3f,0x02,
+0x97,0x01,0x40,0x00,0x01,0xc0,0x00,0x02,0xaf,0x40,0x00,0x02,0x01,0x00,0x81,0x01,
+0xbd,0x00,0x00,0x02,0x06,0x00,0x80,0x02,0x01,0xc0,0x00,0x03,0xa0,0x00,0x81,0x02,
+0xa0,0xc0,0x00,0x02,0x99,0x01,0x40,0x02,0x01,0x80,0x00,0x02,0x01,0xc0,0x80,0x02,
+0xb4,0x40,0x01,0x02,0x98,0xf9,0x3f,0x02,0x01,0xc0,0x00,0x02,0x83,0xff,0xbf,0x02,
+0xb6,0x80,0x01,0x02,0x19,0x03,0x40,0x02,0x06,0x00,0x00,0x02,0x01,0x80,0x80,0x02,
+0x01,0xc0,0x00,0x03,0x41,0x40,0x81,0x02,0xa0,0x00,0x01,0x02,0x97,0x00,0x40,0x00,
+0x3d,0x01,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x06,0x20,
+0x0c,0x0a,0x0d,0x09,0x0b,0x00,0x00,0x07,0x20,0x0c,0x0a,0x0d,0x09,0x0b,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01,0x2d,
+0x00,0x00,0x01,0x2b,0x00,0x00,0x08,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x3f,0x00,
+0x00,0x02,0x5b,0x5d,0x00,0x00,0x02,0x3c,0x3d,0x00,0x00,0x02,0x3e,0x3d,0x00,0x00,
+0x00,0x00,0x66,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,
+0x26,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,0x01,0xc0,0x00,0x01,
+0x06,0x00,0x00,0x02,0xb2,0x40,0x80,0x01,0x19,0x01,0xc0,0x01,0x05,0x00,0x80,0x01,
+0x97,0x01,0x40,0x00,0x06,0x00,0x80,0x01,0x01,0x80,0x00,0x02,0xa0,0x80,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x6c,0x73,
+0x74,0x72,0x69,0x70,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x07,0x72,0x65,0x70,0x6c,
+0x61,0x63,0x65,0x00,0x00,0x00,0x00,0x66,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,
+0x00,0x0d,0x00,0x00,0x26,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,
+0x01,0xc0,0x00,0x01,0x06,0x00,0x00,0x02,0xb2,0x40,0x80,0x01,0x19,0x01,0xc0,0x01,
+0x05,0x00,0x80,0x01,0x97,0x01,0x40,0x00,0x06,0x00,0x80,0x01,0x01,0x80,0x00,0x02,
+0xa0,0x80,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
+0x00,0x06,0x72,0x73,0x74,0x72,0x69,0x70,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x07,
+0x72,0x65,0x70,0x6c,0x61,0x63,0x65,0x00,0x00,0x00,0x00,0x65,0x00,0x03,0x00,0x06,
+0x00,0x00,0x00,0x00,0x00,0x0d,0x00,0x00,0x26,0x00,0x00,0x00,0x06,0x00,0x80,0x01,
+0x20,0x00,0x80,0x01,0x01,0xc0,0x00,0x01,0x06,0x00,0x00,0x02,0xb2,0x40,0x80,0x01,
+0x19,0x01,0xc0,0x01,0x05,0x00,0x80,0x01,0x97,0x01,0x40,0x00,0x06,0x00,0x80,0x01,
+0x01,0x80,0x00,0x02,0xa0,0x80,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x05,0x73,0x74,0x72,0x69,0x70,0x00,0x00,0x02,0x3d,0x3d,
+0x00,0x00,0x07,0x72,0x65,0x70,0x6c,0x61,0x63,0x65,0x00,0x00,0x00,0x01,0x02,0x00,
+0x03,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x26,0x00,0x00,0x02,
+0x9a,0x03,0x40,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,0x01,0x40,0x00,0x02,
+0x20,0x80,0x00,0x02,0x20,0x00,0x00,0x02,0xa0,0x40,0x80,0x01,0x97,0x08,0x40,0x00,
+0x1b,0x00,0x80,0x01,0x91,0x01,0x00,0x02,0x01,0xc0,0x80,0x02,0xa0,0x00,0x01,0x02,
+0x98,0x00,0x40,0x02,0x17,0x05,0x40,0x00,0x06,0x00,0x80,0x01,0x11,0x03,0x00,0x02,
+0x3d,0x00,0x80,0x02,0x01,0x40,0x00,0x03,0x20,0xc0,0x01,0x03,0x3e,0x80,0x81,0x02,
+0xbd,0x00,0x00,0x03,0x3e,0x80,0x81,0x02,0x20,0x41,0x81,0x01,0x17,0x01,0x40,0x00,
+0x1d,0x00,0x80,0x01,0x1c,0x00,0x80,0x00,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x02,
+0x00,0x00,0x1a,0x6e,0x6f,0x20,0x69,0x6d,0x70,0x6c,0x69,0x63,0x69,0x74,0x20,0x63,
+0x6f,0x6e,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x6f,0x66,0x20,0x00,0x00,0x0c,
+0x20,0x69,0x6e,0x74,0x6f,0x20,0x53,0x74,0x72,0x69,0x6e,0x67,0x00,0x00,0x00,0x08,
+0x00,0x08,0x64,0x6f,0x77,0x6e,0x63,0x61,0x73,0x65,0x00,0x00,0x03,0x3c,0x3d,0x3e,
+0x00,0x00,0x06,0x74,0x6f,0x5f,0x73,0x74,0x72,0x00,0x00,0x0d,0x4e,0x6f,0x4d,0x65,
+0x74,0x68,0x6f,0x64,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x3d,0x3d,0x3d,0x00,
+0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,0x70,0x65,0x45,0x72,
+0x72,0x6f,0x72,0x00,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x00,0x01,0x3f,
+0x00,0x05,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x00,0x26,0x00,0x00,0x02,
+0x01,0x40,0x80,0x02,0x91,0x00,0x00,0x03,0xa0,0x00,0x80,0x02,0x99,0x00,0xc0,0x02,
+0x97,0x04,0x40,0x00,0x06,0x00,0x80,0x02,0x91,0x01,0x00,0x03,0x3d,0x00,0x80,0x03,
+0x01,0x40,0x00,0x04,0x20,0x00,0x01,0x04,0x3e,0x00,0x82,0x03,0xbd,0x00,0x00,0x04,
+0x3e,0x00,0x82,0x03,0x20,0x81,0x80,0x02,0x06,0x00,0x80,0x02,0x01,0x40,0x00,0x03,
+0xa0,0x40,0x81,0x02,0x01,0x40,0x81,0x01,0x20,0x80,0x81,0x02,0x99,0x02,0xc0,0x02,
+0x06,0x00,0x80,0x02,0x3d,0x01,0x00,0x03,0x3d,0x01,0x80,0x03,0xb7,0x41,0x81,0x02,
+0x17,0x09,0x40,0x00,0x01,0xc0,0x80,0x02,0x01,0x40,0x00,0x03,0x20,0x00,0x02,0x03,
+0xac,0xc0,0x81,0x02,0x01,0x40,0x01,0x02,0x06,0x00,0x80,0x02,0x83,0xff,0x3f,0x03,
+0x01,0xc0,0x80,0x03,0x20,0x41,0x82,0x02,0x01,0x40,0x00,0x03,0x06,0x00,0x80,0x03,
+0x01,0x00,0x01,0x04,0x06,0x00,0x80,0x04,0x20,0x00,0x82,0x04,0x01,0x00,0x01,0x05,
+0xae,0x80,0x82,0x04,0x20,0x41,0x82,0x03,0xb7,0x41,0x81,0x02,0x29,0x00,0x80,0x02,
+0x00,0x00,0x00,0x03,0x00,0x00,0x0f,0x74,0x79,0x70,0x65,0x20,0x6d,0x69,0x73,0x6d,
+0x61,0x74,0x63,0x68,0x3a,0x20,0x00,0x00,0x06,0x20,0x67,0x69,0x76,0x65,0x6e,0x00,
+0x00,0x00,0x00,0x00,0x00,0x0b,0x00,0x05,0x69,0x73,0x5f,0x61,0x3f,0x00,0x00,0x06,
+0x53,0x74,0x72,0x69,0x6e,0x67,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,
+0x09,0x54,0x79,0x70,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x05,0x63,0x6c,0x61,
+0x73,0x73,0x00,0x00,0x05,0x69,0x6e,0x64,0x65,0x78,0x00,0x00,0x04,0x6e,0x69,0x6c,
+0x3f,0x00,0x00,0x01,0x2b,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x05,0x73,
+0x6c,0x69,0x63,0x65,0x00,0x00,0x01,0x2d,0x00,0x00,0x00,0x01,0x40,0x00,0x05,0x00,
+0x0c,0x00,0x00,0x00,0x00,0x00,0x2d,0x00,0x26,0x00,0x00,0x02,0x01,0x40,0x80,0x02,
+0x91,0x00,0x00,0x03,0xa0,0x00,0x80,0x02,0x99,0x00,0xc0,0x02,0x97,0x04,0x40,0x00,
+0x06,0x00,0x80,0x02,0x91,0x01,0x00,0x03,0x3d,0x00,0x80,0x03,0x01,0x40,0x00,0x04,
+0x20,0x00,0x01,0x04,0x3e,0x00,0x82,0x03,0xbd,0x00,0x00,0x04,0x3e,0x00,0x82,0x03,
+0x20,0x81,0x80,0x02,0x06,0x00,0x80,0x02,0x01,0x40,0x00,0x03,0xa0,0x40,0x81,0x02,
+0x01,0x40,0x81,0x01,0x20,0x80,0x81,0x02,0x99,0x02,0xc0,0x02,0x3d,0x01,0x80,0x02,
+0x3d,0x01,0x00,0x03,0x06,0x00,0x80,0x03,0xb7,0x41,0x81,0x02,0x17,0x09,0x40,0x00,
+0x01,0xc0,0x80,0x02,0x01,0x40,0x00,0x03,0x20,0x00,0x02,0x03,0xac,0xc0,0x81,0x02,
+0x01,0x40,0x01,0x02,0x06,0x00,0x80,0x02,0x83,0xff,0x3f,0x03,0x01,0xc0,0x80,0x03,
+0x20,0x41,0x82,0x02,0x01,0x40,0x00,0x03,0x06,0x00,0x80,0x03,0x01,0x00,0x01,0x04,
+0x06,0x00,0x80,0x04,0x20,0x00,0x82,0x04,0x01,0x00,0x01,0x05,0xae,0x80,0x82,0x04,
+0x20,0x41,0x82,0x03,0xb7,0x41,0x81,0x02,0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x03,
+0x00,0x00,0x0f,0x74,0x79,0x70,0x65,0x20,0x6d,0x69,0x73,0x6d,0x61,0x74,0x63,0x68,
+0x3a,0x20,0x00,0x00,0x06,0x20,0x67,0x69,0x76,0x65,0x6e,0x00,0x00,0x00,0x00,0x00,
+0x00,0x0b,0x00,0x05,0x69,0x73,0x5f,0x61,0x3f,0x00,0x00,0x06,0x53,0x74,0x72,0x69,
+0x6e,0x67,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,0x70,
+0x65,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,
+0x06,0x72,0x69,0x6e,0x64,0x65,0x78,0x00,0x00,0x04,0x6e,0x69,0x6c,0x3f,0x00,0x00,
+0x01,0x2b,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x05,0x73,0x6c,0x69,0x63,
+0x65,0x00,0x00,0x01,0x2d,0x00,0x00,0x00,0x04,0xd4,0x00,0x0b,0x00,0x10,0x00,0x00,
+0x00,0x00,0x01,0x08,0x26,0x00,0x10,0x02,0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,
+0x05,0x00,0x00,0x01,0x01,0x40,0x80,0x05,0x05,0x00,0x00,0x06,0xb2,0x00,0x80,0x05,
+0x99,0x01,0xc0,0x05,0x01,0x80,0x80,0x05,0x05,0x00,0x00,0x06,0xb2,0x00,0x80,0x05,
+0x99,0x01,0xc0,0x05,0x06,0x00,0x80,0x05,0x3d,0x00,0x00,0x06,0xa0,0x40,0x80,0x05,
+0x01,0x40,0x80,0x05,0x05,0x00,0x00,0x06,0xa0,0x80,0x80,0x05,0x99,0x01,0xc0,0x05,
+0x01,0x80,0x80,0x05,0x05,0x00,0x00,0x06,0xa0,0x80,0x80,0x05,0x19,0x10,0xc0,0x05,
+0x01,0x40,0x00,0x02,0x01,0x40,0x80,0x05,0x83,0xff,0x3f,0x06,0xb3,0xc0,0x80,0x05,
+0x99,0x02,0xc0,0x05,0x01,0x00,0x81,0x05,0x06,0x00,0x00,0x06,0x20,0x00,0x01,0x06,
+0xac,0x40,0x81,0x05,0x01,0xc0,0x02,0x02,0x01,0x00,0x81,0x05,0x83,0xff,0x3f,0x06,
+0xb6,0x80,0x81,0x05,0x19,0x02,0xc0,0x05,0x01,0x00,0x81,0x05,0x06,0x00,0x00,0x06,
+0x20,0x00,0x01,0x06,0xb4,0xc0,0x81,0x05,0x99,0x01,0xc0,0x05,0x01,0x80,0x80,0x05,
+0x83,0xff,0x3f,0x06,0xb5,0x00,0x82,0x05,0x19,0x03,0xc0,0x05,0x06,0x00,0x80,0x05,
+0x01,0x00,0x01,0x06,0x01,0x80,0x80,0x06,0x20,0x41,0x82,0x05,0x01,0xc0,0x82,0x02,
+0x17,0x01,0x40,0x00,0x05,0x00,0x80,0x05,0x29,0x00,0x80,0x05,0x97,0x20,0x40,0x00,
+0x08,0x00,0x00,0x03,0x01,0x40,0x80,0x05,0x91,0x05,0x00,0x06,0xa0,0x80,0x82,0x05,
+0x19,0x0d,0xc0,0x05,0x01,0x40,0x80,0x05,0x20,0x00,0x83,0x05,0x01,0xc0,0x82,0x03,
+0x01,0x40,0x80,0x05,0x20,0x40,0x83,0x05,0x01,0xc0,0x02,0x04,0x01,0xc0,0x81,0x05,
+0x83,0xff,0x3f,0x06,0xb3,0xc0,0x80,0x05,0x99,0x02,0xc0,0x05,0x01,0xc0,0x81,0x05,
+0x06,0x00,0x00,0x06,0x20,0x00,0x01,0x06,0xac,0x40,0x81,0x05,0x01,0xc0,0x82,0x03,
+0x01,0x00,0x82,0x05,0x83,0xff,0x3f,0x06,0xb3,0xc0,0x80,0x05,0x99,0x02,0xc0,0x05,
+0x01,0x00,0x82,0x05,0x06,0x00,0x00,0x06,0x20,0x00,0x01,0x06,0xac,0x40,0x81,0x05,
+0x01,0xc0,0x02,0x04,0x07,0x00,0x00,0x03,0x17,0x0d,0x40,0x00,0x01,0x40,0x80,0x05,
+0x11,0x07,0x00,0x06,0xa0,0x80,0x82,0x05,0x19,0x01,0xc0,0x05,0x07,0x00,0x00,0x03,
+0x17,0x0a,0x40,0x00,0x01,0x40,0x00,0x02,0x01,0x40,0x80,0x05,0x83,0xff,0x3f,0x06,
+0xb3,0xc0,0x80,0x05,0x99,0x02,0xc0,0x05,0x01,0x00,0x81,0x05,0x06,0x00,0x00,0x06,
+0x20,0x00,0x01,0x06,0xac,0x40,0x81,0x05,0x01,0xc0,0x02,0x02,0x01,0x00,0x81,0x05,
+0x83,0xff,0x3f,0x06,0xb6,0x80,0x81,0x05,0x19,0x02,0xc0,0x05,0x01,0x40,0x80,0x05,
+0x06,0x00,0x00,0x06,0x20,0x00,0x01,0x06,0xb3,0xc0,0x80,0x05,0x99,0x00,0xc0,0x05,
+0x07,0x00,0x00,0x03,0x99,0x02,0x40,0x03,0x06,0x00,0x80,0x05,0x01,0x40,0x00,0x06,
+0xa0,0x40,0x82,0x05,0x01,0xc0,0x82,0x02,0x17,0x01,0x40,0x00,0x05,0x00,0x80,0x05,
+0x29,0x00,0x80,0x05,0x01,0x40,0x81,0x05,0x05,0x00,0x00,0x06,0xb2,0x00,0x80,0x05,
+0x98,0x01,0xc0,0x05,0x01,0x40,0x81,0x05,0xbd,0x00,0x00,0x06,0xb2,0x00,0x80,0x05,
+0x99,0x00,0xc0,0x05,0x17,0x43,0x40,0x00,0x01,0x40,0x80,0x05,0x05,0x00,0x00,0x06,
+0xa0,0x80,0x80,0x05,0x99,0x01,0xc0,0x05,0x01,0x80,0x80,0x05,0x05,0x00,0x00,0x06,
+0xa0,0x80,0x80,0x05,0x19,0x0d,0xc0,0x05,0x01,0x40,0x80,0x05,0x83,0xff,0x3f,0x06,
+0xb6,0x80,0x81,0x05,0x19,0x01,0xc0,0x05,0x01,0x40,0x80,0x05,0x17,0x02,0x40,0x00,
+0x06,0x00,0x80,0x05,0x20,0x00,0x81,0x05,0x01,0x40,0x00,0x06,0xac,0x40,0x81,0x05,
+0x01,0xc0,0x02,0x02,0x06,0x00,0x80,0x05,0x83,0xff,0x3f,0x06,0x01,0x00,0x81,0x06,
+0xc1,0x00,0x03,0x06,0xa0,0x40,0x82,0x05,0x06,0x00,0x00,0x06,0x01,0x00,0x81,0x06,
+0x01,0x80,0x00,0x07,0xac,0x40,0x81,0x06,0x03,0xff,0x3f,0x07,0x41,0x40,0x83,0x06,
+0xa0,0x40,0x02,0x06,0xac,0x40,0x81,0x05,0x01,0xc0,0x82,0x04,0x17,0x2e,0x40,0x00,
+0x01,0x40,0x80,0x05,0x91,0x05,0x00,0x06,0xa0,0x80,0x82,0x05,0x19,0x12,0xc0,0x05,
+0x01,0xc0,0x81,0x05,0x83,0xff,0x3f,0x06,0xb6,0x80,0x81,0x05,0x19,0x01,0xc0,0x05,
+0x01,0xc0,0x81,0x05,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x05,0x20,0x00,0x81,0x05,
+0x01,0xc0,0x01,0x06,0xac,0x40,0x81,0x05,0x01,0xc0,0x02,0x02,0x01,0x00,0x82,0x05,
+0x83,0xff,0x3f,0x06,0xb6,0x80,0x81,0x05,0x19,0x01,0xc0,0x05,0x01,0x00,0x82,0x05,
+0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x05,0x20,0x00,0x81,0x05,0x01,0x00,0x02,0x06,
+0xac,0x40,0x81,0x05,0x01,0xc0,0x02,0x05,0x06,0x00,0x80,0x05,0x83,0xff,0x3f,0x06,
+0x01,0x00,0x81,0x06,0xc1,0x00,0x03,0x06,0xa0,0x40,0x82,0x05,0x06,0x00,0x00,0x06,
+0x01,0x80,0x82,0x06,0xad,0x40,0x81,0x06,0x03,0xff,0x3f,0x07,0x41,0x40,0x83,0x06,
+0xa0,0x40,0x02,0x06,0xac,0x40,0x81,0x05,0x01,0xc0,0x82,0x04,0x17,0x1a,0x40,0x00,
+0x01,0x40,0x80,0x05,0x11,0x07,0x00,0x06,0xa0,0x80,0x82,0x05,0x19,0x0c,0xc0,0x05,
+0x06,0x00,0x80,0x05,0x01,0x40,0x00,0x06,0xa0,0xc0,0x83,0x05,0x01,0xc0,0x02,0x02,
+0x05,0x00,0x00,0x06,0xb2,0x00,0x80,0x05,0x99,0x00,0xc0,0x05,0x97,0x07,0x40,0x00,
+0x06,0x00,0x80,0x05,0x83,0xff,0x3f,0x06,0x01,0x00,0x81,0x06,0xc1,0x00,0x03,0x06,
+0xa0,0x40,0x82,0x05,0x06,0x00,0x00,0x06,0x01,0x00,0x81,0x06,0x01,0x40,0x00,0x07,
+0x20,0x00,0x01,0x07,0xac,0x40,0x81,0x06,0x03,0xff,0x3f,0x07,0x41,0x40,0x83,0x06,
+0xa0,0x40,0x02,0x06,0xac,0x40,0x81,0x05,0x01,0xc0,0x82,0x04,0x17,0x0c,0x40,0x00,
+0x01,0x40,0x80,0x05,0x83,0xff,0x3f,0x06,0xb6,0x80,0x81,0x05,0x19,0x01,0xc0,0x05,
+0x01,0x40,0x80,0x05,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x05,0x20,0x00,0x81,0x05,
+0x01,0x40,0x00,0x06,0xac,0x40,0x81,0x05,0x01,0xc0,0x02,0x02,0x06,0x00,0x80,0x05,
+0x83,0xff,0x3f,0x06,0x01,0x00,0x81,0x06,0xc1,0x00,0x03,0x06,0xa0,0x40,0x82,0x05,
+0x06,0x00,0x00,0x06,0x01,0x00,0x81,0x06,0xad,0x40,0x81,0x06,0x03,0xff,0x3f,0x07,
+0x41,0x40,0x83,0x06,0xa0,0x40,0x02,0x06,0xac,0x40,0x81,0x05,0x01,0xc0,0x82,0x04,
+0x01,0x40,0x82,0x05,0x05,0x00,0x00,0x06,0xb2,0x00,0x80,0x05,0x99,0x00,0xc0,0x05,
+0x97,0x01,0x40,0x00,0x06,0x00,0x80,0x05,0x01,0x40,0x02,0x06,0xa0,0x00,0x84,0x05,
+0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x24,0x77,0x72,0x6f,0x6e,0x67,
+0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,
+0x65,0x6e,0x74,0x73,0x20,0x28,0x66,0x6f,0x72,0x20,0x31,0x2e,0x2e,0x32,0x29,0x00,
+0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x02,0x3d,0x3d,0x00,0x00,0x05,0x72,0x61,0x69,
+0x73,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x01,0x3c,0x00,0x00,0x04,0x73,0x69,
+0x7a,0x65,0x00,0x00,0x01,0x2b,0x00,0x00,0x02,0x3e,0x3d,0x00,0x00,0x02,0x3c,0x3d,
+0x00,0x00,0x01,0x3e,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x08,0x6b,0x69,0x6e,0x64,
+0x5f,0x6f,0x66,0x3f,0x00,0x00,0x05,0x52,0x61,0x6e,0x67,0x65,0x00,0x00,0x05,0x62,
+0x65,0x67,0x69,0x6e,0x00,0x00,0x03,0x65,0x6e,0x64,0x00,0x00,0x06,0x53,0x74,0x72,
+0x69,0x6e,0x67,0x00,0x00,0x05,0x69,0x6e,0x64,0x65,0x78,0x00,0x00,0x07,0x72,0x65,
+0x70,0x6c,0x61,0x63,0x65,0x00,0x4c,0x56,0x41,0x52,0x00,0x00,0x00,0xe6,0x00,0x00,
+0x00,0x0f,0x00,0x01,0x61,0x00,0x01,0x7a,0x00,0x01,0x73,0x00,0x03,0x73,0x74,0x72,
+0x00,0x03,0x73,0x65,0x70,0x00,0x01,0x6e,0x00,0x01,0x6d,0x00,0x04,0x61,0x72,0x67,
+0x31,0x00,0x04,0x61,0x72,0x67,0x32,0x00,0x03,0x69,0x64,0x78,0x00,0x09,0x76,0x61,
+0x6c,0x69,0x64,0x61,0x74,0x65,0x64,0x00,0x03,0x62,0x65,0x67,0x00,0x02,0x65,0x64,
+0x00,0x04,0x73,0x74,0x72,0x32,0x00,0x04,0x69,0x64,0x78,0x32,0xff,0xff,0x00,0x00,
+0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x03,0xff,0xff,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x03,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x01,0x00,0x03,0xff,0xff,0x00,0x00,0x00,0x02,0x00,0x02,0xff,0xff,0x00,0x00,
+0x00,0x02,0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x03,0x00,0x01,
+0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x05,0x00,0x03,
+0x00,0x06,0x00,0x04,0x00,0x04,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x05,0x00,0x03,
+0x00,0x06,0x00,0x04,0x00,0x07,0x00,0x01,0x00,0x08,0x00,0x02,0xff,0xff,0x00,0x00,
+0x00,0x09,0x00,0x04,0x00,0x03,0x00,0x05,0x00,0x0a,0x00,0x06,0x00,0x0b,0x00,0x07,
+0x00,0x0c,0x00,0x08,0x00,0x0d,0x00,0x09,0x00,0x0e,0x00,0x0a,0x45,0x4e,0x44,0x00,
+0x00,0x00,0x00,0x08,
+};
+void mrb_mruby_string_ext_gem_init(mrb_state *mrb);
+void mrb_mruby_string_ext_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_string_ext_gem_init(mrb_state *mrb) {
+  int ai = mrb_gc_arena_save(mrb);
+  mrb_mruby_string_ext_gem_init(mrb);
+  mrb_load_irep(mrb, gem_mrblib_irep_mruby_string_ext);
+  if (mrb->exc) {
+    mrb_print_error(mrb);
+    exit(EXIT_FAILURE);
+  }
+  mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_string_ext_gem_final(mrb_state *mrb) {
+  mrb_mruby_string_ext_gem_final(mrb);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-string-ext/string.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,361 @@
+#include <ctype.h>
+#include <string.h>
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/class.h"
+#include "mruby/string.h"
+
+static mrb_value
+mrb_str_getbyte(mrb_state *mrb, mrb_value str)
+{
+  mrb_int pos;
+  mrb_get_args(mrb, "i", &pos);
+
+  if (pos < 0)
+    pos += RSTRING_LEN(str);
+  if (pos < 0 ||  RSTRING_LEN(str) <= pos)
+    return mrb_nil_value();
+
+  return mrb_fixnum_value((unsigned char)RSTRING_PTR(str)[pos]);
+}
+
+/*
+ *  call-seq:
+ *     str.swapcase!   -> str or nil
+ *
+ *  Equivalent to <code>String#swapcase</code>, but modifies the receiver in
+ *  place, returning <i>str</i>, or <code>nil</code> if no changes were made.
+ *  Note: case conversion is effective only in ASCII region.
+ */
+static mrb_value
+mrb_str_swapcase_bang(mrb_state *mrb, mrb_value str)
+{
+  char *p, *pend;
+  int modify = 0;
+  struct RString *s = mrb_str_ptr(str);
+
+  mrb_str_modify(mrb, s);
+  p = RSTRING_PTR(str);
+  pend = p + RSTRING_LEN(str);
+  while (p < pend) {
+    if (ISUPPER(*p)) {
+      *p = TOLOWER(*p);
+      modify = 1;
+    }
+    else if (ISLOWER(*p)) {
+      *p = TOUPPER(*p);
+      modify = 1;
+    }
+    p++;
+  }
+
+  if (modify) return str;
+  return mrb_nil_value();
+}
+
+/*
+ *  call-seq:
+ *     str.swapcase   -> new_str
+ *
+ *  Returns a copy of <i>str</i> with uppercase alphabetic characters converted
+ *  to lowercase and lowercase characters converted to uppercase.
+ *  Note: case conversion is effective only in ASCII region.
+ *
+ *     "Hello".swapcase          #=> "hELLO"
+ *     "cYbEr_PuNk11".swapcase   #=> "CyBeR_pUnK11"
+ */
+static mrb_value
+mrb_str_swapcase(mrb_state *mrb, mrb_value self)
+{
+  mrb_value str;
+
+  str = mrb_str_dup(mrb, self);
+  mrb_str_swapcase_bang(mrb, str);
+  return str;
+}
+
+/*
+ *  call-seq:
+ *     str << integer       -> str
+ *     str.concat(integer)  -> str
+ *     str << obj           -> str
+ *     str.concat(obj)      -> str
+ *
+ *  Append---Concatenates the given object to <i>str</i>. If the object is a
+ *  <code>Integer</code>, it is considered as a codepoint, and is converted
+ *  to a character before concatenation.
+ *
+ *     a = "hello "
+ *     a << "world"   #=> "hello world"
+ *     a.concat(33)   #=> "hello world!"
+ */
+static mrb_value
+mrb_str_concat2(mrb_state *mrb, mrb_value self)
+{
+  mrb_value str;
+  mrb_get_args(mrb, "S", &str);
+  mrb_str_concat(mrb, self, str);
+  return self;
+}
+
+/*
+ *  call-seq:
+ *     str.start_with?([prefixes]+)   -> true or false
+ *
+ *  Returns true if +str+ starts with one of the +prefixes+ given.
+ *
+ *    "hello".start_with?("hell")               #=> true
+ *
+ *    # returns true if one of the prefixes matches.
+ *    "hello".start_with?("heaven", "hell")     #=> true
+ *    "hello".start_with?("heaven", "paradise") #=> false
+ *    "h".start_with?("heaven", "hell")         #=> false
+ */
+static mrb_value
+mrb_str_start_with(mrb_state *mrb, mrb_value self)
+{
+  mrb_value *argv, sub;
+  mrb_int argc, i;
+  mrb_get_args(mrb, "*", &argv, &argc);
+
+  for (i = 0; i < argc; i++) {
+    size_t len_l, len_r;
+    int ai = mrb_gc_arena_save(mrb);
+    sub = mrb_string_type(mrb, argv[i]);
+    mrb_gc_arena_restore(mrb, ai);
+    len_l = RSTRING_LEN(self);
+    len_r = RSTRING_LEN(sub);
+    if (len_l >= len_r) {
+      if (memcmp(RSTRING_PTR(self), RSTRING_PTR(sub), len_r) == 0) {
+        return mrb_true_value();
+      }
+    }
+  }
+  return mrb_false_value();
+}
+
+/*
+ *  call-seq:
+ *     str.end_with?([suffixes]+)   -> true or false
+ *
+ *  Returns true if +str+ ends with one of the +suffixes+ given.
+ */
+static mrb_value
+mrb_str_end_with(mrb_state *mrb, mrb_value self)
+{
+  mrb_value *argv, sub;
+  mrb_int argc, i;
+  mrb_get_args(mrb, "*", &argv, &argc);
+
+  for (i = 0; i < argc; i++) {
+    size_t len_l, len_r;
+    int ai = mrb_gc_arena_save(mrb);
+    sub = mrb_string_type(mrb, argv[i]);
+    mrb_gc_arena_restore(mrb, ai);
+    len_l = RSTRING_LEN(self);
+    len_r = RSTRING_LEN(sub);
+    if (len_l >= len_r) {
+      if (memcmp(RSTRING_PTR(self) + (len_l - len_r),
+                 RSTRING_PTR(sub),
+                 len_r) == 0) {
+        return mrb_true_value();
+      }
+    }
+  }
+  return mrb_false_value();
+}
+
+static mrb_value
+mrb_str_hex(mrb_state *mrb, mrb_value self)
+{
+  return mrb_str_to_inum(mrb, self, 16, FALSE);
+}
+
+static mrb_value
+mrb_str_oct(mrb_state *mrb, mrb_value self)
+{
+  return mrb_str_to_inum(mrb, self, 8, FALSE);
+}
+
+/*
+ *  call-seq:
+ *     string.chr    ->  string
+ *
+ *  Returns a one-character string at the beginning of the string.
+ *
+ *     a = "abcde"
+ *     a.chr    #=> "a"
+ */
+static mrb_value
+mrb_str_chr(mrb_state *mrb, mrb_value self)
+{
+  return mrb_str_substr(mrb, self, 0, 1);
+}
+
+/*
+ *  call-seq:
+ *     string.lines    ->  array of string
+ *
+ *  Returns strings per line;
+ *
+ *     a = "abc\ndef"
+ *     a.lines    #=> ["abc\n", "def"]
+ */
+static mrb_value
+mrb_str_lines(mrb_state *mrb, mrb_value self)
+{
+  mrb_value result;
+  mrb_value blk;
+  int ai;
+  mrb_int len;
+  mrb_value arg;
+  char *p = RSTRING_PTR(self), *t;
+  char *e = p + RSTRING_LEN(self);
+
+  mrb_get_args(mrb, "&", &blk);
+
+  result = mrb_ary_new(mrb);
+
+  if (!mrb_nil_p(blk)) {
+    while (p < e) {
+      t = p;
+      while (p < e && *p != '\n') p++;
+      if (*p == '\n') p++;
+      len = (mrb_int) (p - t);
+      arg = mrb_str_new(mrb, t, len);
+      mrb_yield_argv(mrb, blk, 1, &arg);
+    }
+    return self;
+  }
+  while (p < e) {
+    ai = mrb_gc_arena_save(mrb);
+    t = p;
+    while (p < e && *p != '\n') p++;
+    if (*p == '\n') p++;
+    len = (mrb_int) (p - t);
+    mrb_ary_push(mrb, result, mrb_str_new(mrb, t, len));
+    mrb_gc_arena_restore(mrb, ai);
+  }
+  return result;
+}
+
+/*
+ *  call-seq:
+ *     string.succ    ->  string
+ *
+ *  Returns next sequence of the string;
+ *
+ *     a = "abc"
+ *     a.succ    #=> "abd"
+ */
+static mrb_value
+mrb_str_succ_bang(mrb_state *mrb, mrb_value self)
+{
+  mrb_value result;
+  unsigned char *p, *e, *b, *t;
+  char *prepend;
+  struct RString *s = mrb_str_ptr(self);
+  size_t l;
+
+  if (RSTRING_LEN(self) == 0)
+    return self;
+
+  mrb_str_modify(mrb, s);
+  l = RSTRING_LEN(self);
+  b = p = (unsigned char*) RSTRING_PTR(self);
+  t = e = p + l;
+  *(e--) = 0;
+
+  // find trailing ascii/number
+  while (e >= b) {
+    if (ISALNUM(*e))
+      break;
+    e--;
+  }
+  if (e < b) {
+    e = p + l - 1;
+    result = mrb_str_new_lit(mrb, "");
+  } else {
+    // find leading letter of the ascii/number
+    b = e;
+    while (b > p) {
+      if (!ISALNUM(*b) || (ISALNUM(*b) && *b != '9' && *b != 'z' && *b != 'Z'))
+        break;
+      b--;
+    }
+    if (!ISALNUM(*b))
+      b++;
+    result = mrb_str_new(mrb, (char*) p, b - p);
+  }
+
+  while (e >= b) {
+    if (!ISALNUM(*e)) {
+      if (*e == 0xff) {
+        mrb_str_cat_lit(mrb, result, "\x01");
+        (*e) = 0;
+      } else
+        (*e)++;
+      break;
+    }
+    prepend = NULL;
+    if (*e == '9') {
+      if (e == b) prepend = "1";
+      *e = '0';
+    } else if (*e == 'z') {
+      if (e == b) prepend = "a";
+      *e = 'a';
+    } else if (*e == 'Z') {
+      if (e == b) prepend = "A";
+      *e = 'A';
+    } else {
+      (*e)++;
+      break;
+    }
+    if (prepend) mrb_str_cat_cstr(mrb, result, prepend);
+    e--;
+  }
+  result = mrb_str_cat(mrb, result, (char*) b, t - b);
+  l = RSTRING_LEN(result);
+  mrb_str_resize(mrb, self, l);
+  memcpy(RSTRING_PTR(self), RSTRING_PTR(result), l);
+  return self;
+}
+
+static mrb_value
+mrb_str_succ(mrb_state *mrb, mrb_value self)
+{
+  mrb_value str;
+
+  str = mrb_str_dup(mrb, self);
+  mrb_str_succ_bang(mrb, str);
+  return str;
+}
+
+void
+mrb_mruby_string_ext_gem_init(mrb_state* mrb)
+{
+  struct RClass * s = mrb->string_class;
+
+  mrb_define_method(mrb, s, "dump",            mrb_str_dump,            MRB_ARGS_NONE());
+  mrb_define_method(mrb, s, "getbyte",         mrb_str_getbyte,         MRB_ARGS_REQ(1));
+  mrb_define_method(mrb, s, "swapcase!",       mrb_str_swapcase_bang,   MRB_ARGS_NONE());
+  mrb_define_method(mrb, s, "swapcase",        mrb_str_swapcase,        MRB_ARGS_NONE());
+  mrb_define_method(mrb, s, "concat",          mrb_str_concat2,         MRB_ARGS_REQ(1));
+  mrb_define_method(mrb, s, "<<",              mrb_str_concat2,         MRB_ARGS_REQ(1));
+  mrb_define_method(mrb, s, "start_with?",     mrb_str_start_with,      MRB_ARGS_REST());
+  mrb_define_method(mrb, s, "end_with?",       mrb_str_end_with,        MRB_ARGS_REST());
+  mrb_define_method(mrb, s, "hex",             mrb_str_hex,             MRB_ARGS_NONE());
+  mrb_define_method(mrb, s, "oct",             mrb_str_oct,             MRB_ARGS_NONE());
+  mrb_define_method(mrb, s, "chr",             mrb_str_chr,             MRB_ARGS_NONE());
+  mrb_define_method(mrb, s, "lines",           mrb_str_lines,           MRB_ARGS_NONE());
+  mrb_define_method(mrb, s, "succ",            mrb_str_succ,            MRB_ARGS_NONE());
+  mrb_define_method(mrb, s, "succ!",           mrb_str_succ_bang,       MRB_ARGS_NONE());
+  mrb_alias_method(mrb, s, mrb_intern_lit(mrb, "next"), mrb_intern_lit(mrb, "succ"));
+  mrb_alias_method(mrb, s, mrb_intern_lit(mrb, "next!"), mrb_intern_lit(mrb, "succ!"));
+}
+
+void
+mrb_mruby_string_ext_gem_final(mrb_state* mrb)
+{
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-struct/gem_init.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,89 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ *   This file was generated!
+ *   All manual changes will get lost.
+ */
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+gem_mrblib_irep_mruby_struct[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0xc8,0x02,0x00,0x00,0x03,0x27,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x02,0xb9,0x30,0x30,
+0x30,0x30,0x00,0x00,0x00,0x69,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x0b,
+0x11,0x00,0x80,0x00,0x04,0x01,0x00,0x01,0xa0,0x40,0x80,0x00,0x99,0x02,0xc0,0x00,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x80,0x80,0x00,0x45,0x00,0x80,0x00,
+0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x06,0x4f,0x62,0x6a,0x65,0x63,0x74,0x00,0x00,0x0e,0x63,
+0x6f,0x6e,0x73,0x74,0x5f,0x64,0x65,0x66,0x69,0x6e,0x65,0x64,0x3f,0x00,0x00,0x06,
+0x53,0x74,0x72,0x75,0x63,0x74,0x00,0x00,0x00,0x00,0x62,0x00,0x01,0x00,0x03,0x00,
+0x03,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,
+0x46,0x00,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x04,0x00,0x01,0x46,0x80,0x80,0x00,0x04,0x01,0x80,0x00,
+0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x65,0x61,
+0x63,0x68,0x00,0x00,0x09,0x65,0x61,0x63,0x68,0x5f,0x70,0x61,0x69,0x72,0x00,0x00,
+0x06,0x73,0x65,0x6c,0x65,0x63,0x74,0x00,0x00,0x00,0x00,0x53,0x00,0x02,0x00,0x04,
+0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x01,
+0x20,0x00,0x00,0x01,0x20,0x40,0x00,0x01,0x40,0x01,0x80,0x01,0x21,0x80,0x00,0x01,
+0x06,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
+0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x07,0x6d,0x65,0x6d,0x62,0x65,0x72,
+0x73,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x42,0x00,0x03,0x00,
+0x07,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x26,0x00,0x00,0x02,0x15,0x40,0x80,0x01,
+0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x63,0x61,
+0x6c,0x6c,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x00,0x00,0x53,0x00,0x02,0x00,0x04,
+0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x01,
+0x20,0x00,0x00,0x01,0x20,0x40,0x00,0x01,0x40,0x01,0x80,0x01,0x21,0x80,0x00,0x01,
+0x06,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
+0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x07,0x6d,0x65,0x6d,0x62,0x65,0x72,
+0x73,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x53,0x00,0x03,0x00,
+0x08,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x26,0x00,0x00,0x02,0x15,0x40,0x80,0x01,
+0x01,0x40,0x00,0x02,0x20,0x40,0x00,0x02,0x06,0x00,0x80,0x02,0x01,0x40,0x00,0x03,
+0xa0,0x80,0x80,0x02,0x20,0x01,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x06,0x74,0x6f,0x5f,
+0x73,0x79,0x6d,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x00,0x00,0x53,0x00,0x03,0x00,
+0x05,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0xa6,0x00,0x00,0x00,0x37,0xc0,0x00,0x01,
+0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,0x20,0x40,0x80,0x01,0x40,0x01,0x00,0x02,
+0x21,0x80,0x80,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
+0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x07,0x6d,0x65,0x6d,0x62,0x65,0x72,
+0x73,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x69,0x00,0x04,0x00,
+0x07,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x26,0x00,0x00,0x02,0x06,0x00,0x00,0x02,
+0x01,0x40,0x80,0x02,0xa0,0x00,0x00,0x02,0x01,0x00,0x81,0x01,0x15,0x40,0x00,0x02,
+0x01,0xc0,0x80,0x02,0xa0,0x40,0x00,0x02,0x19,0x02,0x40,0x02,0x15,0x80,0x00,0x02,
+0x01,0xc0,0x80,0x02,0xa0,0x80,0x00,0x02,0x97,0x00,0x40,0x00,0x05,0x00,0x00,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x02,0x5b,0x5d,
+0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x4c,
+0x56,0x41,0x52,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x04,0x00,0x05,0x62,0x6c,0x6f,
+0x63,0x6b,0x00,0x05,0x66,0x69,0x65,0x6c,0x64,0x00,0x03,0x61,0x72,0x79,0x00,0x03,
+0x76,0x61,0x6c,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0xff,0xff,0x00,0x00,0x00,
+0x00,0x00,0x01,0x00,0x01,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x01,0x00,
+0x02,0x00,0x02,0x00,0x01,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x03,0x00,0x03,0x45,
+0x4e,0x44,0x00,0x00,0x00,0x00,0x08,
+};
+void mrb_mruby_struct_gem_init(mrb_state *mrb);
+void mrb_mruby_struct_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_struct_gem_init(mrb_state *mrb) {
+  int ai = mrb_gc_arena_save(mrb);
+  mrb_mruby_struct_gem_init(mrb);
+  mrb_load_irep(mrb, gem_mrblib_irep_mruby_struct);
+  if (mrb->exc) {
+    mrb_print_error(mrb);
+    exit(EXIT_FAILURE);
+  }
+  mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_struct_gem_final(mrb_state *mrb) {
+  mrb_mruby_struct_gem_final(mrb);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-struct/struct.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,864 @@
+/*
+** struct.c - Struct class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <ctype.h>
+#include <string.h>
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/string.h"
+#include "mruby/class.h"
+#include "mruby/variable.h"
+#include "mruby/hash.h"
+#include "mruby/range.h"
+
+#define RSTRUCT_LEN(st) mrb_ary_ptr(st)->len
+#define RSTRUCT_PTR(st) mrb_ary_ptr(st)->ptr
+
+static struct RClass *
+struct_class(mrb_state *mrb)
+{
+  return mrb_class_get(mrb, "Struct");
+}
+
+static inline mrb_value
+struct_ivar_get(mrb_state *mrb, mrb_value c, mrb_sym id)
+{
+  struct RClass* kclass;
+  struct RClass* sclass = struct_class(mrb);
+  mrb_value ans;
+
+  for (;;) {
+    ans = mrb_iv_get(mrb, c, id);
+    if (!mrb_nil_p(ans)) return ans;
+    kclass = RCLASS_SUPER(c);
+    if (kclass == 0 || kclass == sclass)
+      return mrb_nil_value();
+    c = mrb_obj_value(kclass);
+  }
+}
+
+static mrb_value
+mrb_struct_s_members(mrb_state *mrb, mrb_value klass)
+{
+  mrb_value members = struct_ivar_get(mrb, klass, mrb_intern_lit(mrb, "__members__"));
+
+  if (mrb_nil_p(members)) {
+    mrb_raise(mrb, E_TYPE_ERROR, "uninitialized struct");
+  }
+  if (!mrb_array_p(members)) {
+    mrb_raise(mrb, E_TYPE_ERROR, "corrupted struct");
+  }
+  return members;
+}
+
+static mrb_value
+mrb_struct_members(mrb_state *mrb, mrb_value s)
+{
+  mrb_value members = mrb_struct_s_members(mrb, mrb_obj_value(mrb_obj_class(mrb, s)));
+  if (!strcmp(mrb_class_name(mrb, mrb_obj_class(mrb, s)), "Struct")) {
+    if (RSTRUCT_LEN(s) != RARRAY_LEN(members)) {
+      mrb_raisef(mrb, E_TYPE_ERROR,
+                 "struct size differs (%S required %S given)",
+                 mrb_fixnum_value(RARRAY_LEN(members)), mrb_fixnum_value(RSTRUCT_LEN(s)));
+    }
+  }
+  return members;
+}
+
+static mrb_value
+mrb_struct_s_members_m(mrb_state *mrb, mrb_value klass)
+{
+  mrb_value members, ary;
+
+  members = mrb_struct_s_members(mrb, klass);
+  ary = mrb_ary_new_capa(mrb, RARRAY_LEN(members));
+  mrb_ary_replace(mrb, ary, members);
+  return ary;
+}
+
+/* 15.2.18.4.6  */
+/*
+ *  call-seq:
+ *     struct.members    -> array
+ *
+ *  Returns an array of strings representing the names of the instance
+ *  variables.
+ *
+ *     Customer = Struct.new(:name, :address, :zip)
+ *     joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
+ *     joe.members   #=> [:name, :address, :zip]
+ */
+
+static mrb_value
+mrb_struct_members_m(mrb_state *mrb, mrb_value obj)
+{
+  return mrb_struct_s_members_m(mrb, mrb_obj_value(mrb_obj_class(mrb, obj)));
+}
+
+static mrb_value
+mrb_struct_getmember(mrb_state *mrb, mrb_value obj, mrb_sym id)
+{
+  mrb_value members, slot, *ptr;
+  const mrb_value *ptr_members;
+  mrb_int i, len;
+
+  ptr = RSTRUCT_PTR(obj);
+  members = mrb_struct_members(mrb, obj);
+  ptr_members = RARRAY_PTR(members);
+  slot = mrb_symbol_value(id);
+  len = RARRAY_LEN(members);
+  for (i=0; i<len; i++) {
+    if (mrb_obj_equal(mrb, ptr_members[i], slot)) {
+      return ptr[i];
+    }
+  }
+  mrb_raisef(mrb, E_INDEX_ERROR, "`%S' is not a struct member", mrb_sym2str(mrb, id));
+  return mrb_nil_value();       /* not reached */
+}
+
+static mrb_value
+mrb_struct_ref(mrb_state *mrb, mrb_value obj)
+{
+  return mrb_struct_getmember(mrb, obj, mrb->c->ci->mid);
+}
+
+static mrb_value mrb_struct_ref0(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[0];}
+static mrb_value mrb_struct_ref1(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[1];}
+static mrb_value mrb_struct_ref2(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[2];}
+static mrb_value mrb_struct_ref3(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[3];}
+static mrb_value mrb_struct_ref4(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[4];}
+static mrb_value mrb_struct_ref5(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[5];}
+static mrb_value mrb_struct_ref6(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[6];}
+static mrb_value mrb_struct_ref7(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[7];}
+static mrb_value mrb_struct_ref8(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[8];}
+static mrb_value mrb_struct_ref9(mrb_state* mrb, mrb_value obj) {return RSTRUCT_PTR(obj)[9];}
+
+#define numberof(array) (int)(sizeof(array) / sizeof((array)[0]))
+#define N_REF_FUNC numberof(ref_func)
+
+static const mrb_func_t ref_func[] = {
+  mrb_struct_ref0,
+  mrb_struct_ref1,
+  mrb_struct_ref2,
+  mrb_struct_ref3,
+  mrb_struct_ref4,
+  mrb_struct_ref5,
+  mrb_struct_ref6,
+  mrb_struct_ref7,
+  mrb_struct_ref8,
+  mrb_struct_ref9,
+};
+
+static mrb_sym
+mrb_id_attrset(mrb_state *mrb, mrb_sym id)
+{
+  const char *name;
+  char *buf;
+  mrb_int len;
+  mrb_sym mid;
+
+  name = mrb_sym2name_len(mrb, id, &len);
+  buf = (char *)mrb_malloc(mrb, (size_t)len+2);
+  memcpy(buf, name, (size_t)len);
+  buf[len] = '=';
+  buf[len+1] = '\0';
+
+  mid = mrb_intern(mrb, buf, len+1);
+  mrb_free(mrb, buf);
+  return mid;
+}
+
+static mrb_value
+mrb_struct_set(mrb_state *mrb, mrb_value obj, mrb_value val)
+{
+  const char *name;
+  mrb_int i, len, slen;
+  mrb_sym mid;
+  mrb_value members, slot, *ptr;
+  const mrb_value *ptr_members;
+
+  /* get base id */
+  name = mrb_sym2name_len(mrb, mrb->c->ci->mid, &slen);
+  mid = mrb_intern(mrb, name, slen-1); /* omit last "=" */
+
+  members = mrb_struct_members(mrb, obj);
+  ptr_members = RARRAY_PTR(members);
+  len = RARRAY_LEN(members);
+  ptr = RSTRUCT_PTR(obj);
+  for (i=0; i<len; i++) {
+    slot = ptr_members[i];
+    if (mrb_symbol(slot) == mid) {
+      return ptr[i] = val;
+    }
+  }
+  mrb_raisef(mrb, E_INDEX_ERROR, "`%S' is not a struct member", mrb_sym2str(mrb, mid));
+  return mrb_nil_value();       /* not reached */
+}
+
+static mrb_value
+mrb_struct_set_m(mrb_state *mrb, mrb_value obj)
+{
+  mrb_value val;
+
+  mrb_get_args(mrb, "o", &val);
+  return mrb_struct_set(mrb, obj, val);
+}
+
+static mrb_bool
+is_local_id(mrb_state *mrb, const char *name)
+{
+  if (!name) return FALSE;
+  return !ISUPPER(name[0]);
+}
+
+static mrb_bool
+is_const_id(mrb_state *mrb, const char *name)
+{
+  if (!name) return FALSE;
+  return ISUPPER(name[0]);
+}
+
+static void
+make_struct_define_accessors(mrb_state *mrb, mrb_value members, struct RClass *c)
+{
+  const mrb_value *ptr_members = RARRAY_PTR(members);
+  mrb_int i;
+  mrb_int len = RARRAY_LEN(members);
+  int ai = mrb_gc_arena_save(mrb);
+
+  for (i=0; i<len; i++) {
+    mrb_sym id = mrb_symbol(ptr_members[i]);
+    const char *name = mrb_sym2name_len(mrb, id, NULL);
+
+    if (is_local_id(mrb, name) || is_const_id(mrb, name)) {
+      if (i < N_REF_FUNC) {
+        mrb_define_method_id(mrb, c, id, ref_func[i], MRB_ARGS_NONE());
+      }
+      else {
+        mrb_define_method_id(mrb, c, id, mrb_struct_ref, MRB_ARGS_NONE());
+      }
+      mrb_define_method_id(mrb, c, mrb_id_attrset(mrb, id), mrb_struct_set_m, MRB_ARGS_REQ(1));
+      mrb_gc_arena_restore(mrb, ai);
+    }
+  }
+}
+
+static mrb_value
+make_struct(mrb_state *mrb, mrb_value name, mrb_value members, struct RClass * klass)
+{
+  mrb_value nstr;
+  mrb_sym id;
+  struct RClass *c;
+
+  if (mrb_nil_p(name)) {
+    c = mrb_class_new(mrb, klass);
+  }
+  else {
+    /* old style: should we warn? */
+    name = mrb_str_to_str(mrb, name);
+    id = mrb_obj_to_sym(mrb, name);
+    if (!is_const_id(mrb, mrb_sym2name_len(mrb, id, NULL))) {
+      mrb_name_error(mrb, id, "identifier %S needs to be constant", name);
+    }
+    if (mrb_const_defined_at(mrb, mrb_obj_value(klass), id)) {
+      mrb_warn(mrb, "redefining constant Struct::%S", name);
+      /* ?rb_mod_remove_const(klass, mrb_sym2name(mrb, id)); */
+    }
+    c = mrb_define_class_under(mrb, klass, RSTRING_PTR(name), klass);
+  }
+  MRB_SET_INSTANCE_TT(c, MRB_TT_ARRAY);
+  nstr = mrb_obj_value(c);
+  mrb_iv_set(mrb, nstr, mrb_intern_lit(mrb, "__members__"), members);
+
+  mrb_define_class_method(mrb, c, "new", mrb_instance_new, MRB_ARGS_ANY());
+  mrb_define_class_method(mrb, c, "[]", mrb_instance_new, MRB_ARGS_ANY());
+  mrb_define_class_method(mrb, c, "members", mrb_struct_s_members_m, MRB_ARGS_NONE());
+  /* RSTRUCT(nstr)->basic.c->super = c->c; */
+  make_struct_define_accessors(mrb, members, c);
+  return nstr;
+}
+
+/* 15.2.18.3.1  */
+/*
+ *  call-seq:
+ *     Struct.new( [aString] [, aSym]+> )    -> StructClass
+ *     StructClass.new(arg, ...)             -> obj
+ *     StructClass[arg, ...]                 -> obj
+ *
+ *  Creates a new class, named by <i>aString</i>, containing accessor
+ *  methods for the given symbols. If the name <i>aString</i> is
+ *  omitted, an anonymous structure class will be created. Otherwise,
+ *  the name of this struct will appear as a constant in class
+ *  <code>Struct</code>, so it must be unique for all
+ *  <code>Struct</code>s in the system and should start with a capital
+ *  letter. Assigning a structure class to a constant effectively gives
+ *  the class the name of the constant.
+ *
+ *  <code>Struct::new</code> returns a new <code>Class</code> object,
+ *  which can then be used to create specific instances of the new
+ *  structure. The number of actual parameters must be
+ *  less than or equal to the number of attributes defined for this
+ *  class; unset parameters default to <code>nil</code>.  Passing too many
+ *  parameters will raise an <code>ArgumentError</code>.
+ *
+ *  The remaining methods listed in this section (class and instance)
+ *  are defined for this generated class.
+ *
+ *     # Create a structure with a name in Struct
+ *     Struct.new("Customer", :name, :address)    #=> Struct::Customer
+ *     Struct::Customer.new("Dave", "123 Main")   #=> #<struct Struct::Customer name="Dave", address="123 Main">
+ *
+ *     # Create a structure named by its constant
+ *     Customer = Struct.new(:name, :address)     #=> Customer
+ *     Customer.new("Dave", "123 Main")           #=> #<struct Customer name="Dave", address="123 Main">
+ */
+static mrb_value
+mrb_struct_s_def(mrb_state *mrb, mrb_value klass)
+{
+  mrb_value name, rest;
+  mrb_value *pargv;
+  mrb_int argcnt;
+  mrb_int i;
+  mrb_value b, st;
+  mrb_sym id;
+  mrb_value *argv;
+  mrb_int argc;
+
+  name = mrb_nil_value();
+  rest = mrb_nil_value();
+  mrb_get_args(mrb, "*&", &argv, &argc, &b);
+  if (argc == 0) { /* special case to avoid crash */
+    rest = mrb_ary_new(mrb);
+  }
+  else {
+    if (argc > 0) name = argv[0];
+    if (argc > 1) rest = argv[1];
+    if (mrb_array_p(rest)) {
+      if (!mrb_nil_p(name) && mrb_symbol_p(name)) {
+        /* 1stArgument:symbol -> name=nil rest=argv[0]-[n] */
+        mrb_ary_unshift(mrb, rest, name);
+        name = mrb_nil_value();
+      }
+    }
+    else {
+      pargv = &argv[1];
+      argcnt = argc-1;
+      if (!mrb_nil_p(name) && mrb_symbol_p(name)) {
+        /* 1stArgument:symbol -> name=nil rest=argv[0]-[n] */
+        name = mrb_nil_value();
+        pargv = &argv[0];
+        argcnt++;
+      }
+      rest = mrb_ary_new_from_values(mrb, argcnt, pargv);
+    }
+    for (i=0; i<RARRAY_LEN(rest); i++) {
+      id = mrb_obj_to_sym(mrb, RARRAY_PTR(rest)[i]);
+      mrb_ary_set(mrb, rest, i, mrb_symbol_value(id));
+    }
+  }
+  st = make_struct(mrb, name, rest, struct_class(mrb));
+  if (!mrb_nil_p(b)) {
+    mrb_yield_with_class(mrb, b, 1, &st, st, mrb_class_ptr(klass));
+  }
+
+  return st;
+}
+
+static mrb_int
+num_members(mrb_state *mrb, struct RClass *klass)
+{
+  mrb_value members;
+
+  members = struct_ivar_get(mrb, mrb_obj_value(klass), mrb_intern_lit(mrb, "__members__"));
+  if (!mrb_array_p(members)) {
+    mrb_raise(mrb, E_TYPE_ERROR, "broken members");
+  }
+  return RARRAY_LEN(members);
+}
+
+/* 15.2.18.4.8  */
+/*
+ */
+static mrb_value
+mrb_struct_initialize_withArg(mrb_state *mrb, mrb_int argc, mrb_value *argv, mrb_value self)
+{
+  struct RClass *klass = mrb_obj_class(mrb, self);
+  mrb_int i, n;
+
+  n = num_members(mrb, klass);
+  if (n < argc) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "struct size differs");
+  }
+
+  for (i = 0; i < argc; i++) {
+    mrb_ary_set(mrb, self, i, argv[i]);
+  }
+  for (i = argc; i < n; i++) {
+    mrb_ary_set(mrb, self, i, mrb_nil_value());
+  }
+  return self;
+}
+
+static mrb_value
+mrb_struct_initialize_m(mrb_state *mrb, /*int argc, mrb_value *argv,*/ mrb_value self)
+{
+  mrb_value *argv;
+  mrb_int argc;
+
+  mrb_get_args(mrb, "*", &argv, &argc);
+  return mrb_struct_initialize_withArg(mrb, argc, argv, self);
+}
+
+static mrb_value
+inspect_struct(mrb_state *mrb, mrb_value s, mrb_bool recur)
+{
+  const char *cn = mrb_class_name(mrb, mrb_obj_class(mrb, s));
+  mrb_value members, str = mrb_str_new_lit(mrb, "#<struct ");
+  mrb_value *ptr;
+  const mrb_value *ptr_members;
+  mrb_int i, len;
+
+  if (cn) {
+    mrb_str_append(mrb, str, mrb_str_new_cstr(mrb, cn));
+  }
+  if (recur) {
+    return mrb_str_cat_lit(mrb, str, ":...>");
+  }
+
+  members = mrb_struct_members(mrb, s);
+  ptr_members = RARRAY_PTR(members);
+  ptr = RSTRUCT_PTR(s);
+  len = RSTRUCT_LEN(s);
+  for (i=0; i<len; i++) {
+    mrb_value slot;
+    mrb_sym id;
+    const char *name;
+    mrb_int namelen;
+
+    if (i > 0) {
+      mrb_str_cat_lit(mrb, str, ", ");
+    }
+    else if (cn) {
+      mrb_str_cat_lit(mrb, str, " ");
+    }
+    slot = ptr_members[i];
+    id = mrb_symbol(slot);
+    name = mrb_sym2name_len(mrb, id, &namelen);
+    if (is_local_id(mrb, name) || is_const_id(mrb, name)) {
+      mrb_str_append(mrb, str, mrb_str_new(mrb, name, namelen));
+    }
+    else {
+      mrb_str_append(mrb, str, mrb_inspect(mrb, slot));
+    }
+    mrb_str_cat_lit(mrb, str, "=");
+    mrb_str_append(mrb, str, mrb_inspect(mrb, ptr[i]));
+  }
+  mrb_str_cat_lit(mrb, str, ">");
+
+  return str;
+}
+
+/*
+ * call-seq:
+ *   struct.to_s      -> string
+ *   struct.inspect   -> string
+ *
+ * Describe the contents of this struct in a string.
+ */
+static mrb_value
+mrb_struct_inspect(mrb_state *mrb, mrb_value s)
+{
+  return inspect_struct(mrb, s, FALSE);
+}
+
+/* 15.2.18.4.9  */
+/* :nodoc: */
+static mrb_value
+mrb_struct_init_copy(mrb_state *mrb, mrb_value copy)
+{
+  mrb_value s;
+  mrb_int i, len;
+
+  mrb_get_args(mrb, "o", &s);
+
+  if (mrb_obj_equal(mrb, copy, s)) return copy;
+  if (!mrb_obj_is_instance_of(mrb, s, mrb_obj_class(mrb, copy))) {
+    mrb_raise(mrb, E_TYPE_ERROR, "wrong argument class");
+  }
+  if (!mrb_array_p(s)) {
+    mrb_raise(mrb, E_TYPE_ERROR, "corrupted struct");
+  }
+  if (RSTRUCT_LEN(copy) != RSTRUCT_LEN(s)) {
+    mrb_raise(mrb, E_TYPE_ERROR, "struct size mismatch");
+  }
+  len = RSTRUCT_LEN(copy);
+  for (i = 0; i < len; i++) {
+    mrb_ary_set(mrb, copy, i, RSTRUCT_PTR(s)[i]);
+  }
+  return copy;
+}
+
+static mrb_value
+struct_aref_sym(mrb_state *mrb, mrb_value s, mrb_sym id)
+{
+  mrb_value *ptr, members;
+  const mrb_value *ptr_members;
+  mrb_int i, len;
+
+  ptr = RSTRUCT_PTR(s);
+  members = mrb_struct_members(mrb, s);
+  ptr_members = RARRAY_PTR(members);
+  len = RARRAY_LEN(members);
+  for (i=0; i<len; i++) {
+    if (mrb_symbol(ptr_members[i]) == id) {
+      return ptr[i];
+    }
+  }
+  mrb_raisef(mrb, E_INDEX_ERROR, "no member '%S' in struct", mrb_sym2str(mrb, id));
+  return mrb_nil_value();       /* not reached */
+}
+
+static mrb_value
+struct_aref_int(mrb_state *mrb, mrb_value s, mrb_int i)
+{
+  if (i < 0) i = RSTRUCT_LEN(s) + i;
+  if (i < 0)
+      mrb_raisef(mrb, E_INDEX_ERROR,
+                 "offset %S too small for struct(size:%S)",
+                 mrb_fixnum_value(i), mrb_fixnum_value(RSTRUCT_LEN(s)));
+  if (RSTRUCT_LEN(s) <= i)
+    mrb_raisef(mrb, E_INDEX_ERROR,
+               "offset %S too large for struct(size:%S)",
+               mrb_fixnum_value(i), mrb_fixnum_value(RSTRUCT_LEN(s)));
+  return RSTRUCT_PTR(s)[i];
+}
+
+/* 15.2.18.4.2  */
+/*
+ *  call-seq:
+ *     struct[symbol]    -> anObject
+ *     struct[fixnum]    -> anObject
+ *
+ *  Attribute Reference---Returns the value of the instance variable
+ *  named by <i>symbol</i>, or indexed (0..length-1) by
+ *  <i>fixnum</i>. Will raise <code>NameError</code> if the named
+ *  variable does not exist, or <code>IndexError</code> if the index is
+ *  out of range.
+ *
+ *     Customer = Struct.new(:name, :address, :zip)
+ *     joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
+ *
+ *     joe["name"]   #=> "Joe Smith"
+ *     joe[:name]    #=> "Joe Smith"
+ *     joe[0]        #=> "Joe Smith"
+ */
+static mrb_value
+mrb_struct_aref(mrb_state *mrb, mrb_value s)
+{
+  mrb_value idx;
+
+  mrb_get_args(mrb, "o", &idx);
+  if (mrb_string_p(idx)) {
+    mrb_value sym = mrb_check_intern_str(mrb, idx);
+
+    if (mrb_nil_p(sym)) {
+      mrb_raisef(mrb, E_INDEX_ERROR, "no member '%S' in struct", idx);
+    }
+    idx = sym;
+  }
+  if (mrb_symbol_p(idx)) {
+    return struct_aref_sym(mrb, s, mrb_symbol(idx));
+  }
+  return struct_aref_int(mrb, s, mrb_int(mrb, idx));
+}
+
+static mrb_value
+mrb_struct_aset_sym(mrb_state *mrb, mrb_value s, mrb_sym id, mrb_value val)
+{
+  mrb_value members, *ptr;
+  const mrb_value *ptr_members;
+  mrb_int i, len;
+
+  members = mrb_struct_members(mrb, s);
+  len = RARRAY_LEN(members);
+  if (RSTRUCT_LEN(s) != len) {
+    mrb_raisef(mrb, E_TYPE_ERROR,
+               "struct size differs (%S required %S given)",
+               mrb_fixnum_value(len), mrb_fixnum_value(RSTRUCT_LEN(s)));
+  }
+  ptr = RSTRUCT_PTR(s);
+  ptr_members = RARRAY_PTR(members);
+  for (i=0; i<len; i++) {
+    if (mrb_symbol(ptr_members[i]) == id) {
+      ptr[i] = val;
+      return val;
+    }
+  }
+  mrb_raisef(mrb, E_INDEX_ERROR, "no member '%S' in struct", mrb_sym2str(mrb, id));
+  return val;                   /* not reach */
+}
+
+/* 15.2.18.4.3  */
+/*
+ *  call-seq:
+ *     struct[symbol] = obj    -> obj
+ *     struct[fixnum] = obj    -> obj
+ *
+ *  Attribute Assignment---Assigns to the instance variable named by
+ *  <i>symbol</i> or <i>fixnum</i> the value <i>obj</i> and
+ *  returns it. Will raise a <code>NameError</code> if the named
+ *  variable does not exist, or an <code>IndexError</code> if the index
+ *  is out of range.
+ *
+ *     Customer = Struct.new(:name, :address, :zip)
+ *     joe = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
+ *
+ *     joe["name"] = "Luke"
+ *     joe[:zip]   = "90210"
+ *
+ *     joe.name   #=> "Luke"
+ *     joe.zip    #=> "90210"
+ */
+
+static mrb_value
+mrb_struct_aset(mrb_state *mrb, mrb_value s)
+{
+  mrb_int i;
+  mrb_value idx;
+  mrb_value val;
+
+  mrb_get_args(mrb, "oo", &idx, &val);
+
+  if (mrb_string_p(idx)) {
+    mrb_value sym = mrb_check_intern_str(mrb, idx);
+
+    if (mrb_nil_p(sym)) {
+      mrb_raisef(mrb, E_INDEX_ERROR, "no member '%S' in struct", idx);
+    }
+    idx = sym;
+  }
+  if (mrb_symbol_p(idx)) {
+    return mrb_struct_aset_sym(mrb, s, mrb_symbol(idx), val);
+  }
+
+  i = mrb_int(mrb, idx);
+  if (i < 0) i = RSTRUCT_LEN(s) + i;
+  if (i < 0) {
+    mrb_raisef(mrb, E_INDEX_ERROR,
+               "offset %S too small for struct(size:%S)",
+               mrb_fixnum_value(i), mrb_fixnum_value(RSTRUCT_LEN(s)));
+  }
+  if (RSTRUCT_LEN(s) <= i) {
+    mrb_raisef(mrb, E_INDEX_ERROR,
+               "offset %S too large for struct(size:%S)",
+               mrb_fixnum_value(i), mrb_fixnum_value(RSTRUCT_LEN(s)));
+  }
+  return RSTRUCT_PTR(s)[i] = val;
+}
+
+/* 15.2.18.4.1  */
+/*
+ *  call-seq:
+ *     struct == other_struct     -> true or false
+ *
+ *  Equality---Returns <code>true</code> if <i>other_struct</i> is
+ *  equal to this one: they must be of the same class as generated by
+ *  <code>Struct::new</code>, and the values of all instance variables
+ *  must be equal (according to <code>Object#==</code>).
+ *
+ *     Customer = Struct.new(:name, :address, :zip)
+ *     joe   = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
+ *     joejr = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345)
+ *     jane  = Customer.new("Jane Doe", "456 Elm, Anytown NC", 12345)
+ *     joe == joejr   #=> true
+ *     joe == jane    #=> false
+ */
+
+static mrb_value
+mrb_struct_equal(mrb_state *mrb, mrb_value s)
+{
+  mrb_value s2;
+  mrb_value *ptr, *ptr2;
+  mrb_int i, len;
+  mrb_bool equal_p;
+
+  mrb_get_args(mrb, "o", &s2);
+  if (mrb_obj_equal(mrb, s, s2)) {
+    equal_p = 1;
+  }
+  else if (!strcmp(mrb_class_name(mrb, mrb_obj_class(mrb, s)), "Struct") ||
+           mrb_obj_class(mrb, s) != mrb_obj_class(mrb, s2)) {
+    equal_p = 0;
+  }
+  else if (RSTRUCT_LEN(s) != RSTRUCT_LEN(s2)) {
+    mrb_bug(mrb, "inconsistent struct"); /* should never happen */
+    equal_p = 0; /* This substuture is just to suppress warnings. never called. */
+  }
+  else {
+    ptr = RSTRUCT_PTR(s);
+    ptr2 = RSTRUCT_PTR(s2);
+    len = RSTRUCT_LEN(s);
+    equal_p = 1;
+    for (i=0; i<len; i++) {
+      if (!mrb_equal(mrb, ptr[i], ptr2[i])) {
+        equal_p = 0;
+        break;
+      }
+    }
+  }
+
+  return mrb_bool_value(equal_p);
+}
+
+/* 15.2.18.4.12(x)  */
+/*
+ * code-seq:
+ *   struct.eql?(other)   -> true or false
+ *
+ * Two structures are equal if they are the same object, or if all their
+ * fields are equal (using <code>eql?</code>).
+ */
+static mrb_value
+mrb_struct_eql(mrb_state *mrb, mrb_value s)
+{
+  mrb_value s2;
+  mrb_value *ptr, *ptr2;
+  mrb_int i, len;
+  mrb_bool eql_p;
+
+  mrb_get_args(mrb, "o", &s2);
+  if (mrb_obj_equal(mrb, s, s2)) {
+    eql_p = 1;
+  }
+  else if (strcmp(mrb_class_name(mrb, mrb_obj_class(mrb, s2)), "Struct") ||
+           mrb_obj_class(mrb, s) != mrb_obj_class(mrb, s2)) {
+    eql_p = 0;
+  }
+  else if (RSTRUCT_LEN(s) != RSTRUCT_LEN(s2)) {
+    mrb_bug(mrb, "inconsistent struct"); /* should never happen */
+    eql_p = 0; /* This substuture is just to suppress warnings. never called. */
+  }
+  else {
+    ptr = RSTRUCT_PTR(s);
+    ptr2 = RSTRUCT_PTR(s2);
+    len = RSTRUCT_LEN(s);
+    eql_p = 1;
+    for (i=0; i<len; i++) {
+      if (!mrb_eql(mrb, ptr[i], ptr2[i])) {
+        eql_p = 0;
+        break;
+      }
+    }
+  }
+
+  return mrb_bool_value(eql_p);
+}
+
+/*
+ * call-seq:
+ *    struct.length   -> Fixnum
+ *    struct.size     -> Fixnum
+ *
+ * Returns number of struct members.
+ */
+static mrb_value
+mrb_struct_len(mrb_state *mrb, mrb_value self)
+{
+  return mrb_fixnum_value(RSTRUCT_LEN(self));
+}
+
+/*
+ * call-seq:
+ *    struct.to_a    -> array
+ *    struct.values  -> array
+ *
+ * Create an array from struct values.
+ */
+static mrb_value
+mrb_struct_to_a(mrb_state *mrb, mrb_value self)
+{
+  return mrb_ary_new_from_values(mrb, RSTRUCT_LEN(self), RSTRUCT_PTR(self));
+}
+
+/*
+ * call-seq:
+ *    struct.to_h -> hash
+ *
+ * Create a hash from member names and struct values.
+ */
+static mrb_value
+mrb_struct_to_h(mrb_state *mrb, mrb_value self)
+{
+  mrb_value members, ret;
+  mrb_int i;
+
+  members = mrb_struct_s_members(mrb, mrb_obj_value(mrb_class(mrb, self)));
+  ret = mrb_hash_new_capa(mrb, RARRAY_LEN(members));
+
+  for (i = 0; i < RARRAY_LEN(members); ++i) {
+    mrb_hash_set(mrb, ret, RARRAY_PTR(members)[i], RSTRUCT_PTR(self)[i]);
+  }
+
+  return ret;
+}
+
+static mrb_value
+mrb_struct_values_at(mrb_state *mrb, mrb_value self)
+{
+  mrb_int argc;
+  mrb_value *argv;
+
+  mrb_get_args(mrb, "*", &argv, &argc);
+
+  return mrb_get_values_at(mrb, self, RSTRUCT_LEN(self), argc, argv, struct_aref_int);
+}
+
+/*
+ *  A <code>Struct</code> is a convenient way to bundle a number of
+ *  attributes together, using accessor methods, without having to write
+ *  an explicit class.
+ *
+ *  The <code>Struct</code> class is a generator of specific classes,
+ *  each one of which is defined to hold a set of variables and their
+ *  accessors. In these examples, we'll call the generated class
+ *  ``<i>Customer</i>Class,'' and we'll show an example instance of that
+ *  class as ``<i>Customer</i>Inst.''
+ *
+ *  In the descriptions that follow, the parameter <i>symbol</i> refers
+ *  to a symbol, which is either a quoted string or a
+ *  <code>Symbol</code> (such as <code>:name</code>).
+ */
+void
+mrb_mruby_struct_gem_init(mrb_state* mrb)
+{
+  struct RClass *st;
+  st = mrb_define_class(mrb, "Struct",  mrb->object_class);
+
+  mrb_define_class_method(mrb, st, "new",             mrb_struct_s_def,       MRB_ARGS_ANY());  /* 15.2.18.3.1  */
+
+  mrb_define_method(mrb, st,       "==",              mrb_struct_equal,       MRB_ARGS_REQ(1)); /* 15.2.18.4.1  */
+  mrb_define_method(mrb, st,       "[]",              mrb_struct_aref,        MRB_ARGS_REQ(1)); /* 15.2.18.4.2  */
+  mrb_define_method(mrb, st,       "[]=",             mrb_struct_aset,        MRB_ARGS_REQ(2)); /* 15.2.18.4.3  */
+  mrb_define_method(mrb, st,       "members",         mrb_struct_members_m,   MRB_ARGS_NONE()); /* 15.2.18.4.6  */
+  mrb_define_method(mrb, st,       "initialize",      mrb_struct_initialize_m,MRB_ARGS_ANY());  /* 15.2.18.4.8  */
+  mrb_define_method(mrb, st,       "initialize_copy", mrb_struct_init_copy,   MRB_ARGS_REQ(1)); /* 15.2.18.4.9  */
+  mrb_define_method(mrb, st,       "inspect",         mrb_struct_inspect,     MRB_ARGS_NONE()); /* 15.2.18.4.10(x)  */
+  mrb_define_alias(mrb, st,        "to_s", "inspect");                                      /* 15.2.18.4.11(x)  */
+  mrb_define_method(mrb, st,       "eql?",            mrb_struct_eql,         MRB_ARGS_REQ(1)); /* 15.2.18.4.12(x)  */
+
+  mrb_define_method(mrb, st,        "size",           mrb_struct_len,         MRB_ARGS_NONE());
+  mrb_define_method(mrb, st,        "length",         mrb_struct_len,         MRB_ARGS_NONE());
+  mrb_define_method(mrb, st,        "to_a",           mrb_struct_to_a,        MRB_ARGS_NONE());
+  mrb_define_method(mrb, st,        "values",         mrb_struct_to_a,        MRB_ARGS_NONE());
+  mrb_define_method(mrb, st,        "to_h",           mrb_struct_to_h,        MRB_ARGS_NONE());
+  mrb_define_method(mrb, st,        "values_at",      mrb_struct_values_at,   MRB_ARGS_NONE());
+}
+
+void
+mrb_mruby_struct_gem_final(mrb_state* mrb)
+{
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-symbol-ext/gem_init.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,101 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ *   This file was generated!
+ *   All manual changes will get lost.
+ */
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+gem_mrblib_irep_mruby_symbol_ext[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0x2f,0x06,0x00,0x00,0x03,0xed,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x03,0x70,0x30,0x30,
+0x30,0x30,0x00,0x00,0x00,0x37,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x05,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x00,0x80,0x00,0x45,0x00,0x80,0x00,
+0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x06,0x53,0x79,
+0x6d,0x62,0x6f,0x6c,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x04,0x00,0x06,0x00,
+0x00,0x00,0x1c,0x00,0x06,0x00,0x80,0x00,0x91,0x00,0x00,0x01,0xa0,0x00,0x80,0x00,
+0x48,0x00,0x80,0x00,0x04,0x01,0x00,0x01,0x84,0x01,0x80,0x01,0x05,0x00,0x00,0x02,
+0x20,0x01,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x40,0x81,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0x80,0x81,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x04,0x00,0x01,0x46,0xc0,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,
+0x46,0x00,0x82,0x00,0x48,0x00,0x80,0x00,0xc0,0x08,0x00,0x01,0x46,0x40,0x82,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x0a,0x00,0x01,0x46,0x80,0x82,0x00,0x04,0x05,0x80,0x00,
+0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x00,0x07,0x69,0x6e,
+0x63,0x6c,0x75,0x64,0x65,0x00,0x00,0x0a,0x43,0x6f,0x6d,0x70,0x61,0x72,0x61,0x62,
+0x6c,0x65,0x00,0x00,0x06,0x69,0x6e,0x74,0x65,0x72,0x6e,0x00,0x00,0x06,0x74,0x6f,
+0x5f,0x73,0x79,0x6d,0x00,0x00,0x0c,0x61,0x6c,0x69,0x61,0x73,0x5f,0x6d,0x65,0x74,
+0x68,0x6f,0x64,0x00,0x00,0x07,0x74,0x6f,0x5f,0x70,0x72,0x6f,0x63,0x00,0x00,0x0a,
+0x63,0x61,0x70,0x69,0x74,0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x08,0x64,0x6f,0x77,
+0x6e,0x63,0x61,0x73,0x65,0x00,0x00,0x06,0x75,0x70,0x63,0x61,0x73,0x65,0x00,0x00,
+0x07,0x63,0x61,0x73,0x65,0x63,0x6d,0x70,0x00,0x00,0x06,0x65,0x6d,0x70,0x74,0x79,
+0x3f,0x00,0x00,0x00,0x00,0x26,0x00,0x02,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x03,
+0x26,0x00,0x00,0x00,0xc0,0x01,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x00,
+0x00,0x09,0x00,0x00,0xa6,0x00,0x08,0x02,0x01,0x40,0x00,0x02,0x06,0x00,0x80,0x02,
+0xb7,0x40,0x81,0x02,0x01,0x80,0x00,0x03,0x38,0x80,0x81,0x02,0x01,0xc0,0x00,0x03,
+0xa1,0x3f,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x08,0x5f,0x5f,0x73,0x65,0x6e,0x64,0x5f,0x5f,0x00,0x00,0x00,0x00,0x58,0x00,
+0x02,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x26,0x00,0x00,0x00,
+0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x40,0x00,0x01,0x98,0x00,0x40,0x01,
+0x06,0x00,0x00,0x01,0x20,0x80,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x04,0x74,0x6f,0x5f,0x73,0x00,0x00,0x0b,0x63,0x61,0x70,
+0x69,0x74,0x61,0x6c,0x69,0x7a,0x65,0x21,0x00,0x00,0x06,0x74,0x6f,0x5f,0x73,0x79,
+0x6d,0x00,0x00,0x00,0x00,0x56,0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x08,
+0x26,0x00,0x00,0x00,0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x40,0x00,0x01,
+0x98,0x00,0x40,0x01,0x06,0x00,0x00,0x01,0x20,0x80,0x00,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x74,0x6f,0x5f,0x73,0x00,0x00,
+0x09,0x64,0x6f,0x77,0x6e,0x63,0x61,0x73,0x65,0x21,0x00,0x00,0x06,0x74,0x6f,0x5f,
+0x73,0x79,0x6d,0x00,0x00,0x00,0x00,0x54,0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x00,
+0x00,0x08,0x00,0x00,0x26,0x00,0x00,0x00,0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,
+0x20,0x40,0x00,0x01,0x98,0x00,0x40,0x01,0x06,0x00,0x00,0x01,0x20,0x80,0x00,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x74,0x6f,
+0x5f,0x73,0x00,0x00,0x07,0x75,0x70,0x63,0x61,0x73,0x65,0x21,0x00,0x00,0x06,0x74,
+0x6f,0x5f,0x73,0x79,0x6d,0x00,0x00,0x00,0x00,0x95,0x00,0x05,0x00,0x08,0x00,0x00,
+0x00,0x00,0x00,0x14,0x26,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0x91,0x00,0x00,0x03,
+0xa0,0x00,0x80,0x02,0x99,0x00,0xc0,0x02,0x17,0x01,0x40,0x00,0x05,0x00,0x80,0x02,
+0x29,0x00,0x80,0x02,0x06,0x00,0x80,0x02,0x20,0x80,0x80,0x02,0x01,0x40,0x81,0x01,
+0x20,0xc0,0x80,0x02,0x01,0x40,0x80,0x02,0x20,0x80,0x80,0x02,0x01,0x40,0x01,0x02,
+0x20,0xc0,0x80,0x02,0x01,0xc0,0x80,0x02,0x01,0x00,0x01,0x03,0xa0,0x00,0x81,0x02,
+0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x08,0x6b,0x69,
+0x6e,0x64,0x5f,0x6f,0x66,0x3f,0x00,0x00,0x06,0x53,0x79,0x6d,0x62,0x6f,0x6c,0x00,
+0x00,0x04,0x74,0x6f,0x5f,0x73,0x00,0x00,0x07,0x75,0x70,0x63,0x61,0x73,0x65,0x21,
+0x00,0x00,0x03,0x3c,0x3d,0x3e,0x00,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x05,0x00,
+0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x06,0x00,0x00,0x01,
+0x20,0x00,0x00,0x01,0x83,0xff,0xbf,0x01,0xb2,0x40,0x00,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x6c,0x65,0x6e,0x67,0x74,0x68,
+0x00,0x00,0x02,0x3d,0x3d,0x00,0x4c,0x56,0x41,0x52,0x00,0x00,0x00,0x5f,0x00,0x00,
+0x00,0x06,0x00,0x03,0x6f,0x62,0x6a,0x00,0x04,0x61,0x72,0x67,0x73,0x00,0x05,0x62,
+0x6c,0x6f,0x63,0x6b,0x00,0x05,0x6f,0x74,0x68,0x65,0x72,0x00,0x03,0x6c,0x68,0x73,
+0x00,0x03,0x72,0x68,0x73,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,
+0x02,0x00,0x02,0x00,0x03,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,
+0x00,0x00,0x03,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x03,0x00,0x05,0x00,
+0x04,0xff,0xff,0x00,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08,
+};
+void mrb_mruby_symbol_ext_gem_init(mrb_state *mrb);
+void mrb_mruby_symbol_ext_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_symbol_ext_gem_init(mrb_state *mrb) {
+  int ai = mrb_gc_arena_save(mrb);
+  mrb_mruby_symbol_ext_gem_init(mrb);
+  mrb_load_irep(mrb, gem_mrblib_irep_mruby_symbol_ext);
+  if (mrb->exc) {
+    mrb_print_error(mrb);
+    exit(EXIT_FAILURE);
+  }
+  mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_symbol_ext_gem_final(mrb_state *mrb) {
+  mrb_mruby_symbol_ext_gem_final(mrb);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-symbol-ext/symbol.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,65 @@
+#include "mruby.h"
+#include "mruby/khash.h"
+#include "mruby/array.h"
+
+typedef struct symbol_name {
+  size_t len;
+  const char *name;
+} symbol_name;
+
+/*
+ *  call-seq:
+ *     Symbol.all_symbols    => array
+ *
+ *  Returns an array of all the symbols currently in Ruby's symbol
+ *  table.
+ *
+ *     Symbol.all_symbols.size    #=> 903
+ *     Symbol.all_symbols[1,20]   #=> [:floor, :ARGV, :Binding, :symlink,
+ *                                     :chown, :EOFError, :$;, :String,
+ *                                     :LOCK_SH, :"setuid?", :$<,
+ *                                     :default_proc, :compact, :extend,
+ *                                     :Tms, :getwd, :$=, :ThreadGroup,
+ *                                     :wait2, :$>]
+ */
+static mrb_value
+mrb_sym_all_symbols(mrb_state *mrb, mrb_value self)
+{
+  mrb_sym i, lim;
+  mrb_value ary = mrb_ary_new_capa(mrb, mrb->symidx);
+
+  for (i=1, lim=mrb->symidx+1; i<lim; i++) {
+    mrb_ary_push(mrb, ary, mrb_symbol_value(i));
+  }
+
+  return ary;
+}
+
+/*
+ * call-seq:
+ *   sym.length    -> integer
+ *
+ * Same as <code>sym.to_s.length</code>.
+ */
+static mrb_value
+mrb_sym_length(mrb_state *mrb, mrb_value self)
+{
+  mrb_int len;
+  mrb_sym2name_len(mrb, mrb_symbol(self), &len);
+  return mrb_fixnum_value(len);
+}
+
+void
+mrb_mruby_symbol_ext_gem_init(mrb_state* mrb)
+{
+  struct RClass *s = mrb->symbol_class;
+  mrb_define_class_method(mrb, s, "all_symbols", mrb_sym_all_symbols, MRB_ARGS_NONE());
+  mrb_define_method(mrb, s, "length", mrb_sym_length, MRB_ARGS_NONE());
+  mrb_define_method(mrb, s, "size", mrb_sym_length, MRB_ARGS_NONE());
+}
+
+void
+mrb_mruby_symbol_ext_gem_final(mrb_state* mrb)
+{
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrbgems/mruby-toplevel-ext/gem_init.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,63 @@
+/*
+ * This file is loading the irep
+ * Ruby GEM code.
+ *
+ * IMPORTANT:
+ *   This file was generated!
+ *   All manual changes will get lost.
+ */
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+gem_mrblib_irep_mruby_toplevel_ext[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0x72,0x41,0x00,0x00,0x01,0xa2,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x01,0x46,0x30,0x30,
+0x30,0x30,0x00,0x00,0x00,0x8b,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x12,
+0x06,0x00,0x80,0x00,0x47,0x40,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,
+0x06,0x00,0x80,0x00,0x47,0x40,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,
+0x06,0x00,0x80,0x00,0x47,0x40,0x80,0x00,0xc0,0x04,0x00,0x01,0x46,0x80,0x80,0x00,
+0x06,0x00,0x80,0x00,0x47,0x40,0x80,0x00,0xc0,0x06,0x00,0x01,0x46,0xc0,0x80,0x00,
+0x84,0x01,0x80,0x00,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+0x00,0x07,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x00,0x00,0x07,0x70,0x72,0x69,0x76,
+0x61,0x74,0x65,0x00,0x00,0x09,0x70,0x72,0x6f,0x74,0x65,0x63,0x74,0x65,0x64,0x00,
+0x00,0x06,0x70,0x75,0x62,0x6c,0x69,0x63,0x00,0x00,0x00,0x00,0x4c,0x00,0x03,0x00,
+0x06,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x26,0x00,0x08,0x00,0x06,0x00,0x80,0x01,
+0x20,0x00,0x80,0x01,0x37,0x00,0x01,0x02,0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,
+0xa0,0x7f,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x07,0x69,0x6e,0x63,0x6c,0x75,0x64,
+0x65,0x00,0x00,0x00,0x00,0x26,0x00,0x03,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x03,
+0x26,0x00,0x08,0x00,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x00,0x03,0x00,0x04,0x00,0x00,0x00,0x00,
+0x00,0x03,0x00,0x00,0x26,0x00,0x08,0x00,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x00,0x03,0x00,0x04,
+0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x26,0x00,0x08,0x00,0x05,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x56,0x41,0x52,
+0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x02,0x00,0x07,0x6d,0x6f,0x64,0x75,0x6c,0x65,
+0x73,0x00,0x07,0x6d,0x65,0x74,0x68,0x6f,0x64,0x73,0x00,0x00,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x01,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x01,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x01,0x00,0x01,0xff,0xff,0x00,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,
+0x00,0x08,
+};
+void mrb_mruby_toplevel_ext_gem_init(mrb_state *mrb);
+void mrb_mruby_toplevel_ext_gem_final(mrb_state *mrb);
+
+void GENERATED_TMP_mrb_mruby_toplevel_ext_gem_init(mrb_state *mrb) {
+  int ai = mrb_gc_arena_save(mrb);
+  mrb_load_irep(mrb, gem_mrblib_irep_mruby_toplevel_ext);
+  if (mrb->exc) {
+    mrb_print_error(mrb);
+    exit(EXIT_FAILURE);
+  }
+  mrb_gc_arena_restore(mrb, ai);
+}
+
+void GENERATED_TMP_mrb_mruby_toplevel_ext_gem_final(mrb_state *mrb) {
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mrblib/mrblib.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,1392 @@
+#include "mruby.h"
+#include "mruby/irep.h"
+
+extern const uint8_t mrblib_irep[];
+
+void
+mrb_init_mrblib(mrb_state *mrb)
+{
+  mrb_load_irep(mrb, mrblib_irep);
+}
+
+#include <stdint.h>
+const uint8_t
+#if defined __GNUC__
+__attribute__((aligned(4)))
+#elif defined _MSC_VER
+__declspec(align(4))
+#endif
+mrblib_irep[] = {
+0x45,0x54,0x49,0x52,0x30,0x30,0x30,0x33,0xe5,0xf9,0x00,0x00,0x55,0xaa,0x4d,0x41,
+0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x4f,0x9d,0x30,0x30,
+0x30,0x30,0x00,0x00,0x03,0x3c,0x00,0x01,0x00,0x03,0x00,0x1e,0x00,0x00,0x00,0x74,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x00,0x80,0x00,0x45,0x00,0x80,0x00,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x00,0x80,0x00,0xc5,0x00,0x80,0x00,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x40,0x80,0x00,0x45,0x01,0x80,0x00,
+0x05,0x00,0x80,0x00,0x44,0x80,0x80,0x00,0xc5,0x01,0x80,0x00,0x05,0x00,0x80,0x00,
+0x44,0xc0,0x80,0x00,0x45,0x02,0x80,0x00,0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,
+0x43,0x00,0x81,0x00,0xc5,0x02,0x80,0x00,0x05,0x00,0x80,0x00,0x91,0x02,0x00,0x01,
+0x43,0x80,0x81,0x00,0x45,0x03,0x80,0x00,0x05,0x00,0x80,0x00,0x91,0x02,0x00,0x01,
+0x43,0xc0,0x81,0x00,0xc5,0x03,0x80,0x00,0x05,0x00,0x80,0x00,0x91,0x02,0x00,0x01,
+0x43,0x00,0x82,0x00,0x45,0x04,0x80,0x00,0x05,0x00,0x80,0x00,0x11,0x04,0x00,0x01,
+0x43,0x40,0x82,0x00,0xc5,0x04,0x80,0x00,0x05,0x00,0x80,0x00,0x91,0x02,0x00,0x01,
+0x43,0x80,0x82,0x00,0x45,0x05,0x80,0x00,0x05,0x00,0x80,0x00,0x91,0x02,0x00,0x01,
+0x43,0xc0,0x82,0x00,0xc5,0x05,0x80,0x00,0x05,0x00,0x80,0x00,0x91,0x02,0x00,0x01,
+0x43,0x00,0x83,0x00,0x45,0x06,0x80,0x00,0x05,0x00,0x80,0x00,0x11,0x06,0x00,0x01,
+0x43,0x40,0x83,0x00,0xc5,0x06,0x80,0x00,0x05,0x00,0x80,0x00,0x91,0x02,0x00,0x01,
+0x43,0x80,0x83,0x00,0x45,0x07,0x80,0x00,0x05,0x00,0x80,0x00,0x11,0x07,0x00,0x01,
+0x43,0xc0,0x83,0x00,0xc5,0x07,0x80,0x00,0x05,0x00,0x80,0x00,0x11,0x08,0x00,0x01,
+0x43,0x40,0x84,0x00,0x45,0x08,0x80,0x00,0x05,0x00,0x80,0x00,0x11,0x07,0x00,0x01,
+0x43,0x80,0x84,0x00,0xc5,0x08,0x80,0x00,0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,
+0x43,0xc0,0x84,0x00,0x45,0x09,0x80,0x00,0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,
+0x43,0xc0,0x84,0x00,0xc5,0x09,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x00,0x85,0x00,
+0x45,0x0a,0x80,0x00,0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x40,0x85,0x00,
+0xc5,0x0a,0x80,0x00,0x05,0x00,0x80,0x00,0x44,0x80,0x85,0x00,0x45,0x0b,0x80,0x00,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0xc0,0x85,0x00,0xc5,0x0b,0x80,0x00,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x00,0x86,0x00,0x45,0x0c,0x80,0x00,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x40,0x86,0x00,0xc5,0x0c,0x80,0x00,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x40,0x86,0x00,0x45,0x0d,0x80,0x00,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x43,0x80,0x86,0x00,0xc5,0x0d,0x80,0x00,
+0x05,0x00,0x80,0x00,0x44,0x80,0x80,0x00,0x45,0x0e,0x80,0x00,0x05,0x00,0x80,0x00,
+0x05,0x00,0x00,0x01,0x43,0x80,0x86,0x00,0xc5,0x0e,0x80,0x00,0x4a,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x05,0x41,0x72,0x72,0x61,0x79,0x00,
+0x00,0x06,0x4d,0x6f,0x64,0x75,0x6c,0x65,0x00,0x00,0x0a,0x43,0x6f,0x6d,0x70,0x61,
+0x72,0x61,0x62,0x6c,0x65,0x00,0x00,0x0a,0x45,0x6e,0x75,0x6d,0x65,0x72,0x61,0x62,
+0x6c,0x65,0x00,0x00,0x09,0x45,0x78,0x63,0x65,0x70,0x74,0x69,0x6f,0x6e,0x00,0x00,
+0x0d,0x53,0x74,0x61,0x6e,0x64,0x61,0x72,0x64,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,
+0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,
+0x0e,0x4c,0x6f,0x63,0x61,0x6c,0x4a,0x75,0x6d,0x70,0x45,0x72,0x72,0x6f,0x72,0x00,
+0x00,0x0a,0x52,0x61,0x6e,0x67,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x10,0x46,
+0x6c,0x6f,0x61,0x74,0x44,0x6f,0x6d,0x61,0x69,0x6e,0x45,0x72,0x72,0x6f,0x72,0x00,
+0x00,0x0b,0x52,0x65,0x67,0x65,0x78,0x70,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x09,
+0x54,0x79,0x70,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x09,0x4e,0x61,0x6d,0x65,
+0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x0d,0x4e,0x6f,0x4d,0x65,0x74,0x68,0x6f,0x64,
+0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x0a,0x49,0x6e,0x64,0x65,0x78,0x45,0x72,0x72,
+0x6f,0x72,0x00,0x00,0x08,0x4b,0x65,0x79,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x0b,
+0x53,0x63,0x72,0x69,0x70,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x13,0x4e,0x6f,
+0x74,0x49,0x6d,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x65,0x64,0x45,0x72,0x72,0x6f,
+0x72,0x00,0x00,0x0d,0x53,0x74,0x6f,0x70,0x49,0x74,0x65,0x72,0x61,0x74,0x69,0x6f,
+0x6e,0x00,0x00,0x04,0x48,0x61,0x73,0x68,0x00,0x00,0x06,0x4b,0x65,0x72,0x6e,0x65,
+0x6c,0x00,0x00,0x07,0x4e,0x75,0x6d,0x65,0x72,0x69,0x63,0x00,0x00,0x08,0x49,0x6e,
+0x74,0x65,0x67,0x72,0x61,0x6c,0x00,0x00,0x07,0x49,0x6e,0x74,0x65,0x67,0x65,0x72,
+0x00,0x00,0x05,0x46,0x6c,0x6f,0x61,0x74,0x00,0x00,0x05,0x52,0x61,0x6e,0x67,0x65,
+0x00,0x00,0x06,0x53,0x74,0x72,0x69,0x6e,0x67,0x00,0x00,0x00,0x01,0x52,0x00,0x01,
+0x00,0x04,0x00,0x0b,0x00,0x00,0x00,0x2d,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,
+0x46,0x00,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x04,0x00,0x01,0x46,0x80,0x80,0x00,0x48,0x00,0x80,0x00,
+0x84,0x01,0x00,0x01,0x04,0x01,0x80,0x01,0x05,0x00,0x00,0x02,0x20,0x01,0x81,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,0x46,0x40,0x81,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x08,0x00,0x01,0x46,0x80,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x0a,0x00,0x01,
+0x46,0xc0,0x81,0x00,0x48,0x00,0x80,0x00,0x04,0x04,0x00,0x01,0x84,0x03,0x80,0x01,
+0x05,0x00,0x00,0x02,0x20,0x01,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x0c,0x00,0x01,
+0x46,0x40,0x82,0x00,0x48,0x00,0x80,0x00,0xc0,0x0e,0x00,0x01,0x46,0x80,0x82,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x10,0x00,0x01,0x46,0xc0,0x82,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x12,0x00,0x01,0x46,0x00,0x83,0x00,0x48,0x00,0x80,0x00,0xc0,0x14,0x00,0x01,
+0x46,0x40,0x83,0x00,0x84,0x06,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x0e,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x0a,0x65,0x61,0x63,
+0x68,0x5f,0x69,0x6e,0x64,0x65,0x78,0x00,0x00,0x08,0x63,0x6f,0x6c,0x6c,0x65,0x63,
+0x74,0x21,0x00,0x00,0x04,0x6d,0x61,0x70,0x21,0x00,0x00,0x0c,0x61,0x6c,0x69,0x61,
+0x73,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x0a,0x69,0x6e,0x69,0x74,0x69,
+0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x08,0x5f,0x69,0x6e,0x73,0x70,0x65,0x63,0x74,
+0x00,0x00,0x07,0x69,0x6e,0x73,0x70,0x65,0x63,0x74,0x00,0x00,0x04,0x74,0x6f,0x5f,
+0x73,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x04,0x65,0x71,0x6c,0x3f,0x00,0x00,0x03,
+0x3c,0x3d,0x3e,0x00,0x00,0x06,0x64,0x65,0x6c,0x65,0x74,0x65,0x00,0x00,0x08,0x5f,
+0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x01,0x3e,0x00,0x05,0x00,0x09,
+0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x02,
+0x20,0x00,0x80,0x02,0x99,0x00,0xc0,0x02,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x02,
+0x04,0x01,0x00,0x03,0xa0,0x40,0x80,0x02,0x29,0x00,0x80,0x02,0x03,0xff,0xbf,0x02,
+0x06,0x00,0x00,0x03,0x20,0xc0,0x00,0x03,0xaf,0x00,0x01,0x03,0x01,0x40,0x01,0x01,
+0x01,0x80,0x81,0x01,0x97,0x0a,0x40,0x00,0x06,0x00,0x80,0x02,0x01,0x80,0x00,0x03,
+0xad,0x80,0x01,0x03,0x01,0x80,0x01,0x01,0xa0,0x40,0x81,0x02,0x01,0x40,0x01,0x02,
+0x99,0x00,0xc0,0x02,0x17,0x05,0x40,0x00,0x01,0x00,0x81,0x02,0x05,0x00,0x00,0x03,
+0xb2,0xc0,0x81,0x02,0x19,0x02,0xc0,0x02,0x01,0xc0,0x80,0x02,0x06,0x00,0x00,0x03,
+0x20,0xc0,0x00,0x03,0xb6,0x00,0x82,0x02,0x99,0x00,0xc0,0x02,0x97,0x08,0x40,0x00,
+0x01,0x40,0x80,0x02,0x01,0x00,0x01,0x03,0xa0,0x40,0x82,0x02,0x01,0x80,0x80,0x02,
+0x01,0xc0,0x00,0x03,0xb3,0x80,0x82,0x02,0x19,0x02,0xc0,0x02,0x01,0xc0,0x80,0x02,
+0x06,0x00,0x00,0x03,0x20,0xc0,0x00,0x03,0xb4,0xc0,0x82,0x02,0x19,0x02,0xc0,0x02,
+0x06,0x00,0x80,0x02,0x20,0xc0,0x80,0x02,0xaf,0x00,0x81,0x02,0x01,0x40,0x81,0x01,
+0x98,0xee,0xbf,0x02,0x06,0x00,0x80,0x02,0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x0c,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,
+0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x04,0x65,
+0x61,0x63,0x68,0x00,0x00,0x06,0x6c,0x65,0x6e,0x67,0x74,0x68,0x00,0x00,0x01,0x2d,
+0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x01,0x2b,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,
+0x02,0x3e,0x3d,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x01,0x3c,0x00,0x00,
+0x02,0x3c,0x3d,0x00,0x00,0x00,0x00,0xb8,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,
+0x00,0x18,0x00,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,
+0x99,0x00,0xc0,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x04,0x01,0x00,0x02,
+0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x83,0xff,0x3f,0x01,0x17,0x03,0x40,0x00,
+0x01,0x40,0x80,0x01,0x01,0x80,0x00,0x02,0xa0,0xc0,0x80,0x01,0x01,0x80,0x80,0x01,
+0xad,0x00,0x81,0x01,0x01,0xc0,0x00,0x01,0x01,0x80,0x80,0x01,0x06,0x00,0x00,0x02,
+0x20,0x80,0x01,0x02,0xb3,0x40,0x81,0x01,0x98,0xfa,0xbf,0x01,0x06,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x0c,0x62,0x6c,
+0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,
+0x65,0x6e,0x75,0x6d,0x00,0x00,0x0a,0x65,0x61,0x63,0x68,0x5f,0x69,0x6e,0x64,0x65,
+0x78,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x3c,
+0x00,0x00,0x06,0x6c,0x65,0x6e,0x67,0x74,0x68,0x00,0x00,0x00,0x00,0x83,0x00,0x02,
+0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x0e,0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x01,
+0x20,0x00,0x00,0x01,0x99,0x00,0x40,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x00,0x01,
+0x04,0x01,0x80,0x01,0xa0,0x40,0x00,0x01,0x29,0x00,0x00,0x01,0x06,0x00,0x00,0x01,
+0x40,0x01,0x80,0x01,0x21,0xc0,0x00,0x01,0x06,0x00,0x00,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,
+0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,
+0x00,0x00,0x08,0x63,0x6f,0x6c,0x6c,0x65,0x63,0x74,0x21,0x00,0x00,0x0a,0x65,0x61,
+0x63,0x68,0x5f,0x69,0x6e,0x64,0x65,0x78,0x00,0x00,0x00,0x00,0x58,0x00,0x03,0x00,
+0x08,0x00,0x00,0x00,0x00,0x00,0x0b,0x00,0x26,0x00,0x00,0x02,0x15,0x40,0x80,0x01,
+0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,
+0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0x01,0xc0,0x00,0x03,0x20,0x81,0x00,0x02,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x63,0x61,
+0x6c,0x6c,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,0x00,
+0x01,0x92,0x00,0x05,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x38,0xa6,0x00,0x20,0x00,
+0x17,0x01,0x40,0x00,0x17,0x01,0x40,0x00,0x17,0x01,0x40,0x00,0x83,0xff,0xbf,0x00,
+0x05,0x00,0x00,0x01,0x01,0x40,0x80,0x02,0x91,0x00,0x00,0x03,0xa0,0x00,0x80,0x02,
+0x99,0x00,0xc0,0x02,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x02,0x91,0x01,0x00,0x03,
+0x3d,0x00,0x80,0x03,0x20,0x81,0x80,0x02,0x01,0x40,0x80,0x02,0x83,0xff,0x3f,0x03,
+0xb3,0x00,0x81,0x02,0x19,0x02,0xc0,0x02,0x06,0x00,0x80,0x02,0x91,0x02,0x00,0x03,
+0xbd,0x00,0x80,0x03,0x20,0x81,0x80,0x02,0x06,0x00,0x80,0x02,0x20,0x80,0x81,0x02,
+0x01,0x40,0x80,0x02,0x83,0xff,0x3f,0x03,0xb5,0xc0,0x81,0x02,0x99,0x0c,0xc0,0x02,
+0x05,0x00,0x80,0x02,0x06,0x00,0x00,0x03,0x01,0x40,0x80,0x03,0xaf,0x40,0x82,0x03,
+0x01,0x40,0x01,0x04,0x20,0x01,0x02,0x03,0x83,0xff,0x3f,0x02,0x97,0x06,0x40,0x00,
+0x19,0x02,0xc0,0x01,0x01,0xc0,0x80,0x02,0x01,0x00,0x01,0x03,0xa0,0x80,0x82,0x02,
+0x97,0x00,0x40,0x00,0x01,0x80,0x80,0x02,0x06,0x00,0x00,0x03,0x01,0x00,0x81,0x03,
+0x01,0x40,0x01,0x04,0x20,0x01,0x02,0x03,0x01,0x00,0x81,0x02,0xad,0xc0,0x82,0x02,
+0x01,0x40,0x01,0x02,0x01,0x00,0x81,0x02,0x01,0x40,0x00,0x03,0xb3,0x00,0x81,0x02,
+0x98,0xf7,0xbf,0x02,0x06,0x00,0x80,0x02,0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x02,
+0x00,0x00,0x21,0x65,0x78,0x70,0x65,0x63,0x74,0x65,0x64,0x20,0x49,0x6e,0x74,0x65,
+0x67,0x65,0x72,0x20,0x66,0x6f,0x72,0x20,0x31,0x73,0x74,0x20,0x61,0x72,0x67,0x75,
+0x6d,0x65,0x6e,0x74,0x00,0x00,0x13,0x6e,0x65,0x67,0x61,0x74,0x69,0x76,0x65,0x20,
+0x61,0x72,0x72,0x61,0x79,0x20,0x73,0x69,0x7a,0x65,0x00,0x00,0x00,0x0c,0x00,0x08,
+0x6b,0x69,0x6e,0x64,0x5f,0x6f,0x66,0x3f,0x00,0x00,0x07,0x49,0x6e,0x74,0x65,0x67,
+0x65,0x72,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,0x70,
+0x65,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x01,0x3c,0x00,0x00,0x0d,0x41,0x72,0x67,
+0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x05,0x63,0x6c,0x65,
+0x61,0x72,0x00,0x00,0x01,0x3e,0x00,0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,0x01,0x2d,
+0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x01,0x2b,0x00,0x00,0x00,0x00,0x91,
+0x00,0x02,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x12,0x00,0x00,0x26,0x00,0x00,0x00,
+0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x83,0xff,0xbf,0x01,0xb2,0x40,0x00,0x01,
+0x19,0x01,0x40,0x01,0x3d,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0xbd,0x00,0x00,0x01,
+0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0x21,0xc0,0x80,0x01,0x3d,0x01,0x00,0x02,
+0xa0,0x00,0x81,0x01,0xac,0x80,0x00,0x01,0xbd,0x01,0x80,0x01,0xac,0x80,0x00,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x01,
+0x5b,0x00,0x00,0x02,0x2c,0x20,0x00,0x00,0x01,0x5d,0x00,0x00,0x00,0x05,0x00,0x04,
+0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x01,0x2b,0x00,0x00,0x03,
+0x6d,0x61,0x70,0x00,0x00,0x04,0x6a,0x6f,0x69,0x6e,0x00,0x00,0x00,0x00,0x34,0x00,
+0x03,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x26,0x00,0x00,0x02,
+0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x07,0x69,0x6e,0x73,0x70,0x65,0x63,0x74,0x00,0x00,0x00,
+0x00,0x86,0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x10,0x26,0x00,0x00,0x00,
+0x9a,0x01,0x40,0x00,0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x97,0x04,0x40,0x00,
+0x1b,0x00,0x00,0x01,0x91,0x00,0x80,0x01,0x01,0x80,0x00,0x02,0xa0,0x80,0x80,0x01,
+0x98,0x00,0xc0,0x01,0x17,0x01,0x40,0x00,0x3d,0x00,0x00,0x01,0x17,0x01,0x40,0x00,
+0x1d,0x00,0x00,0x01,0x1c,0x00,0x80,0x00,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x01,
+0x00,0x00,0x05,0x5b,0x2e,0x2e,0x2e,0x5d,0x00,0x00,0x00,0x03,0x00,0x08,0x5f,0x69,
+0x6e,0x73,0x70,0x65,0x63,0x74,0x00,0x00,0x10,0x53,0x79,0x73,0x74,0x65,0x6d,0x53,
+0x74,0x61,0x63,0x6b,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x3d,0x3d,0x3d,0x00,
+0x00,0x00,0x00,0xe3,0x00,0x05,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,
+0x26,0x00,0x00,0x02,0x06,0x00,0x80,0x02,0x01,0x40,0x00,0x03,0xa0,0x00,0x80,0x02,
+0x01,0x40,0x81,0x00,0x08,0x00,0x00,0x03,0xb2,0x40,0x80,0x02,0x19,0x01,0xc0,0x02,
+0x08,0x00,0x80,0x02,0x29,0x00,0x80,0x02,0x01,0x40,0x80,0x02,0x07,0x00,0x00,0x03,
+0xb2,0x40,0x80,0x02,0x19,0x01,0xc0,0x02,0x07,0x00,0x80,0x02,0x29,0x00,0x80,0x02,
+0x06,0x00,0x80,0x02,0x20,0x80,0x80,0x02,0x01,0x40,0x81,0x01,0x83,0xff,0x3f,0x02,
+0x97,0x06,0x40,0x00,0x06,0x00,0x80,0x02,0x01,0x00,0x01,0x03,0xa0,0xc0,0x80,0x02,
+0x01,0x40,0x00,0x03,0x01,0x00,0x81,0x03,0xa0,0xc0,0x00,0x03,0xa0,0x00,0x81,0x02,
+0x19,0x01,0xc0,0x02,0x08,0x00,0x80,0x02,0x29,0x80,0x80,0x02,0x01,0x00,0x81,0x02,
+0xad,0x40,0x81,0x02,0x01,0x40,0x01,0x02,0x01,0x00,0x81,0x02,0x01,0xc0,0x00,0x03,
+0xb3,0x80,0x81,0x02,0x98,0xf7,0xbf,0x02,0x07,0x00,0x80,0x02,0x29,0x00,0x80,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x08,0x5f,0x5f,0x61,0x72,0x79,0x5f,
+0x65,0x71,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,
+0x02,0x5b,0x5d,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x3c,
+0x00,0x00,0x00,0x00,0xe9,0x00,0x05,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x29,0x00,
+0x26,0x00,0x00,0x02,0x06,0x00,0x80,0x02,0x01,0x40,0x00,0x03,0xa0,0x00,0x80,0x02,
+0x01,0x40,0x81,0x00,0x08,0x00,0x00,0x03,0xb2,0x40,0x80,0x02,0x19,0x01,0xc0,0x02,
+0x08,0x00,0x80,0x02,0x29,0x00,0x80,0x02,0x01,0x40,0x80,0x02,0x07,0x00,0x00,0x03,
+0xb2,0x40,0x80,0x02,0x19,0x01,0xc0,0x02,0x07,0x00,0x80,0x02,0x29,0x00,0x80,0x02,
+0x06,0x00,0x80,0x02,0x20,0x80,0x80,0x02,0x01,0x40,0x81,0x01,0x83,0xff,0x3f,0x02,
+0x17,0x07,0x40,0x00,0x06,0x00,0x80,0x02,0x01,0x00,0x01,0x03,0xa0,0xc0,0x80,0x02,
+0x01,0x40,0x00,0x03,0x01,0x00,0x81,0x03,0xa0,0xc0,0x00,0x03,0xa0,0x00,0x81,0x02,
+0x99,0x00,0xc0,0x02,0x17,0x01,0x40,0x00,0x08,0x00,0x80,0x02,0x29,0x80,0x80,0x02,
+0x01,0x00,0x81,0x02,0xad,0x40,0x81,0x02,0x01,0x40,0x01,0x02,0x01,0x00,0x81,0x02,
+0x01,0xc0,0x00,0x03,0xb3,0x80,0x81,0x02,0x18,0xf7,0xbf,0x02,0x07,0x00,0x80,0x02,
+0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x08,0x5f,0x5f,
+0x61,0x72,0x79,0x5f,0x65,0x71,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x04,0x73,0x69,
+0x7a,0x65,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x04,0x65,0x71,0x6c,0x3f,0x00,0x00,
+0x01,0x2b,0x00,0x00,0x01,0x3c,0x00,0x00,0x00,0x01,0x7e,0x00,0x06,0x00,0x0a,0x00,
+0x00,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x26,0x00,0x00,0x02,0x06,0x00,0x00,0x03,
+0x01,0x40,0x80,0x03,0xa0,0x00,0x00,0x03,0x01,0x80,0x81,0x00,0x83,0xff,0x3f,0x03,
+0x01,0x40,0x80,0x03,0xb2,0x40,0x00,0x03,0x19,0x01,0x40,0x03,0x83,0xff,0x3f,0x03,
+0x29,0x00,0x00,0x03,0x05,0x00,0x00,0x03,0x01,0x40,0x80,0x03,0xb2,0x40,0x00,0x03,
+0x19,0x01,0x40,0x03,0x05,0x00,0x00,0x03,0x29,0x00,0x00,0x03,0x06,0x00,0x00,0x03,
+0x20,0x80,0x00,0x03,0x01,0x80,0x81,0x01,0x01,0x40,0x00,0x03,0x20,0x80,0x00,0x03,
+0x01,0x80,0x01,0x02,0x01,0xc0,0x00,0x03,0x01,0x00,0x81,0x03,0xb5,0xc0,0x00,0x03,
+0x99,0x00,0x40,0x03,0x01,0x00,0x81,0x01,0x83,0xff,0xbf,0x02,0x17,0x0b,0x40,0x00,
+0x06,0x00,0x00,0x03,0x01,0x40,0x81,0x03,0xa0,0x00,0x01,0x03,0x01,0x40,0x80,0x03,
+0x01,0x40,0x01,0x04,0xa0,0x00,0x81,0x03,0xa0,0x40,0x01,0x03,0x01,0x80,0x01,0x02,
+0x05,0x00,0x80,0x03,0xb2,0x40,0x00,0x03,0x19,0x01,0x40,0x03,0x01,0x00,0x01,0x03,
+0x29,0x80,0x00,0x03,0x01,0x00,0x01,0x03,0x83,0xff,0xbf,0x03,0xa0,0x80,0x01,0x03,
+0x19,0x01,0x40,0x03,0x01,0x00,0x01,0x03,0x29,0x80,0x00,0x03,0x01,0x40,0x01,0x03,
+0xad,0xc0,0x01,0x03,0x01,0x80,0x81,0x02,0x01,0x40,0x01,0x03,0x01,0xc0,0x80,0x03,
+0xb3,0x00,0x02,0x03,0x18,0xf3,0x3f,0x03,0x06,0x00,0x00,0x03,0x20,0x80,0x00,0x03,
+0x01,0x40,0x80,0x03,0x20,0x80,0x80,0x03,0xae,0x40,0x02,0x03,0x01,0x80,0x81,0x01,
+0x83,0xff,0xbf,0x03,0xb2,0x40,0x00,0x03,0x19,0x01,0x40,0x03,0x83,0xff,0x3f,0x03,
+0x97,0x03,0x40,0x00,0x01,0xc0,0x00,0x03,0x83,0xff,0xbf,0x03,0xb5,0xc0,0x00,0x03,
+0x19,0x01,0x40,0x03,0x03,0x00,0x40,0x03,0x97,0x00,0x40,0x00,0x03,0xff,0x3f,0x03,
+0x29,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x09,0x5f,0x5f,
+0x61,0x72,0x79,0x5f,0x63,0x6d,0x70,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x04,0x73,
+0x69,0x7a,0x65,0x00,0x00,0x01,0x3e,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x03,0x3c,
+0x3d,0x3e,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x3c,0x00,
+0x00,0x01,0x2d,0x00,0x00,0x00,0x00,0x92,0x00,0x05,0x00,0x08,0x00,0x00,0x00,0x00,
+0x00,0x16,0x00,0x00,0xa6,0x00,0x00,0x02,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x02,
+0x01,0xc0,0x00,0x03,0xa0,0x00,0x80,0x02,0x01,0x40,0x00,0x02,0x06,0x00,0x80,0x02,
+0x01,0x40,0x00,0x03,0xa0,0x40,0x80,0x02,0x01,0x40,0x81,0x01,0x98,0xfb,0xbf,0x02,
+0x01,0x00,0x81,0x02,0x05,0x00,0x00,0x03,0xb2,0x80,0x80,0x02,0x99,0x00,0xc0,0x02,
+0x01,0x80,0x80,0x02,0x99,0x01,0xc0,0x02,0x01,0x80,0x80,0x02,0x20,0xc0,0x80,0x02,
+0x97,0x00,0x40,0x00,0x01,0x00,0x81,0x02,0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x04,0x00,0x09,0x64,0x65,0x6c,0x65,0x74,0x65,0x5f,0x61,0x74,0x00,
+0x00,0x05,0x69,0x6e,0x64,0x65,0x78,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x04,0x63,
+0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x59,0x00,0x02,0x00,0x05,0x00,0x00,0x00,0x00,
+0x00,0x0b,0x00,0x00,0x26,0x00,0x00,0x00,0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,
+0x83,0x00,0xc0,0x01,0xb3,0x40,0x00,0x01,0x99,0x01,0x40,0x01,0x06,0x00,0x00,0x01,
+0x20,0x80,0x00,0x01,0x97,0x00,0x40,0x00,0x06,0x00,0x00,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,
+0x01,0x3c,0x00,0x00,0x05,0x66,0x69,0x72,0x73,0x74,0x00,0x00,0x00,0x00,0x59,0x00,
+0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x06,0x00,0x80,0x00,
+0x91,0x00,0x00,0x01,0xa0,0x00,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,
+0x46,0x80,0x80,0x00,0x04,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x07,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x00,0x00,0x0a,
+0x45,0x6e,0x75,0x6d,0x65,0x72,0x61,0x62,0x6c,0x65,0x00,0x00,0x05,0x73,0x6f,0x72,
+0x74,0x21,0x00,0x00,0x00,0x00,0x47,0x00,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x00,
+0x07,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x01,0x06,0x00,0x80,0x01,
+0x01,0x40,0x00,0x02,0x21,0x40,0x80,0x01,0xa0,0x00,0x00,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x07,0x72,0x65,0x70,0x6c,0x61,0x63,
+0x65,0x00,0x00,0x04,0x73,0x6f,0x72,0x74,0x00,0x00,0x00,0x00,0x51,0x00,0x01,0x00,
+0x03,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,
+0x46,0x00,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,
+0x84,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x0d,0x61,0x74,0x74,0x72,0x5f,0x61,0x63,0x63,0x65,0x73,0x73,0x6f,0x72,0x00,
+0x00,0x04,0x61,0x74,0x74,0x72,0x00,0x00,0x00,0x00,0x66,0x00,0x03,0x00,0x06,0x00,
+0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x06,0x00,0x80,0x01,
+0x37,0x00,0x01,0x02,0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,
+0x06,0x00,0x80,0x01,0x37,0x00,0x01,0x02,0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,
+0xa0,0x7f,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x0b,0x61,0x74,0x74,0x72,0x5f,0x72,0x65,0x61,0x64,0x65,0x72,0x00,0x00,0x0b,
+0x61,0x74,0x74,0x72,0x5f,0x77,0x72,0x69,0x74,0x65,0x72,0x00,0x00,0x00,0x00,0x3c,
+0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x26,0x00,0x00,0x02,
+0x06,0x00,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0b,0x61,0x74,0x74,0x72,0x5f,0x72,
+0x65,0x61,0x64,0x65,0x72,0x00,0x00,0x00,0x00,0x8c,0x00,0x01,0x00,0x03,0x00,0x06,
+0x00,0x00,0x00,0x14,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x04,0x00,0x01,0x46,0x80,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,
+0x46,0xc0,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x08,0x00,0x01,0x46,0x00,0x81,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x0a,0x00,0x01,0x46,0x40,0x81,0x00,0x84,0x02,0x80,0x00,
+0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x01,0x3c,0x00,
+0x00,0x02,0x3c,0x3d,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x01,0x3e,0x00,0x00,0x02,
+0x3e,0x3d,0x00,0x00,0x08,0x62,0x65,0x74,0x77,0x65,0x65,0x6e,0x3f,0x00,0x00,0x00,
+0x00,0xd3,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x19,0x26,0x00,0x00,0x02,
+0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x00,0x00,0x02,0x01,0x00,0x81,0x01,
+0x20,0x40,0x00,0x02,0x19,0x07,0x40,0x02,0x06,0x00,0x00,0x02,0x91,0x01,0x80,0x02,
+0x3d,0x00,0x00,0x03,0x06,0x00,0x80,0x03,0x20,0x00,0x81,0x03,0x3e,0xc0,0x01,0x03,
+0xbd,0x00,0x80,0x03,0x3e,0xc0,0x01,0x03,0x01,0x40,0x80,0x03,0x20,0x00,0x81,0x03,
+0x3e,0xc0,0x01,0x03,0x3d,0x01,0x80,0x03,0x3e,0xc0,0x01,0x03,0x20,0x81,0x00,0x02,
+0x01,0xc0,0x00,0x02,0x83,0xff,0xbf,0x02,0xb3,0x40,0x01,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x03,0x00,0x00,0x0e,0x63,0x6f,0x6d,0x70,0x61,0x72,0x69,0x73,0x6f,
+0x6e,0x20,0x6f,0x66,0x20,0x00,0x00,0x06,0x20,0x77,0x69,0x74,0x68,0x20,0x00,0x00,
+0x07,0x20,0x66,0x61,0x69,0x6c,0x65,0x64,0x00,0x00,0x00,0x06,0x00,0x03,0x3c,0x3d,
+0x3e,0x00,0x00,0x04,0x6e,0x69,0x6c,0x3f,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,
+0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,
+0x00,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x01,0x3c,0x00,0x00,0x00,0x00,
+0xd4,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x19,0x00,0x26,0x00,0x00,0x02,
+0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x00,0x00,0x02,0x01,0x00,0x81,0x01,
+0x20,0x40,0x00,0x02,0x19,0x07,0x40,0x02,0x06,0x00,0x00,0x02,0x91,0x01,0x80,0x02,
+0x3d,0x00,0x00,0x03,0x06,0x00,0x80,0x03,0x20,0x00,0x81,0x03,0x3e,0xc0,0x01,0x03,
+0xbd,0x00,0x80,0x03,0x3e,0xc0,0x01,0x03,0x01,0x40,0x80,0x03,0x20,0x00,0x81,0x03,
+0x3e,0xc0,0x01,0x03,0x3d,0x01,0x80,0x03,0x3e,0xc0,0x01,0x03,0x20,0x81,0x00,0x02,
+0x01,0xc0,0x00,0x02,0x83,0xff,0xbf,0x02,0xb4,0x40,0x01,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x03,0x00,0x00,0x0e,0x63,0x6f,0x6d,0x70,0x61,0x72,0x69,0x73,0x6f,
+0x6e,0x20,0x6f,0x66,0x20,0x00,0x00,0x06,0x20,0x77,0x69,0x74,0x68,0x20,0x00,0x00,
+0x07,0x20,0x66,0x61,0x69,0x6c,0x65,0x64,0x00,0x00,0x00,0x06,0x00,0x03,0x3c,0x3d,
+0x3e,0x00,0x00,0x04,0x6e,0x69,0x6c,0x3f,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,
+0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,
+0x00,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x02,0x3c,0x3d,0x00,0x00,0x00,
+0x00,0x45,0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x08,0x26,0x00,0x00,0x02,
+0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x00,0x00,0x02,0x01,0x00,0x81,0x01,
+0x83,0xff,0xbf,0x02,0xb2,0x40,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x03,0x3c,0x3d,0x3e,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,
+0x00,0x00,0xd3,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x19,0x00,0x00,0x00,
+0x26,0x00,0x00,0x02,0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x00,0x00,0x02,
+0x01,0x00,0x81,0x01,0x20,0x40,0x00,0x02,0x19,0x07,0x40,0x02,0x06,0x00,0x00,0x02,
+0x91,0x01,0x80,0x02,0x3d,0x00,0x00,0x03,0x06,0x00,0x80,0x03,0x20,0x00,0x81,0x03,
+0x3e,0xc0,0x01,0x03,0xbd,0x00,0x80,0x03,0x3e,0xc0,0x01,0x03,0x01,0x40,0x80,0x03,
+0x20,0x00,0x81,0x03,0x3e,0xc0,0x01,0x03,0x3d,0x01,0x80,0x03,0x3e,0xc0,0x01,0x03,
+0x20,0x81,0x00,0x02,0x01,0xc0,0x00,0x02,0x83,0xff,0xbf,0x02,0xb5,0x40,0x01,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x0e,0x63,0x6f,0x6d,0x70,0x61,
+0x72,0x69,0x73,0x6f,0x6e,0x20,0x6f,0x66,0x20,0x00,0x00,0x06,0x20,0x77,0x69,0x74,
+0x68,0x20,0x00,0x00,0x07,0x20,0x66,0x61,0x69,0x6c,0x65,0x64,0x00,0x00,0x00,0x06,
+0x00,0x03,0x3c,0x3d,0x3e,0x00,0x00,0x04,0x6e,0x69,0x6c,0x3f,0x00,0x00,0x05,0x72,
+0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,
+0x72,0x72,0x6f,0x72,0x00,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x01,0x3e,
+0x00,0x00,0x00,0x00,0xd4,0x00,0x04,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x19,0x00,
+0x26,0x00,0x00,0x02,0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x00,0x00,0x02,
+0x01,0x00,0x81,0x01,0x20,0x40,0x00,0x02,0x19,0x07,0x40,0x02,0x06,0x00,0x00,0x02,
+0x91,0x01,0x80,0x02,0x3d,0x00,0x00,0x03,0x06,0x00,0x80,0x03,0x20,0x00,0x81,0x03,
+0x3e,0xc0,0x01,0x03,0xbd,0x00,0x80,0x03,0x3e,0xc0,0x01,0x03,0x01,0x40,0x80,0x03,
+0x20,0x00,0x81,0x03,0x3e,0xc0,0x01,0x03,0x3d,0x01,0x80,0x03,0x3e,0xc0,0x01,0x03,
+0x20,0x81,0x00,0x02,0x01,0xc0,0x00,0x02,0x83,0xff,0xbf,0x02,0xb6,0x40,0x01,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x0e,0x63,0x6f,0x6d,0x70,0x61,
+0x72,0x69,0x73,0x6f,0x6e,0x20,0x6f,0x66,0x20,0x00,0x00,0x06,0x20,0x77,0x69,0x74,
+0x68,0x20,0x00,0x00,0x07,0x20,0x66,0x61,0x69,0x6c,0x65,0x64,0x00,0x00,0x00,0x06,
+0x00,0x03,0x3c,0x3d,0x3e,0x00,0x00,0x04,0x6e,0x69,0x6c,0x3f,0x00,0x00,0x05,0x72,
+0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,
+0x72,0x72,0x6f,0x72,0x00,0x00,0x05,0x63,0x6c,0x61,0x73,0x73,0x00,0x00,0x02,0x3e,
+0x3d,0x00,0x00,0x00,0x00,0x48,0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x09,
+0x26,0x00,0x00,0x04,0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xb6,0x00,0x00,0x02,
+0x99,0x01,0x40,0x02,0x06,0x00,0x00,0x02,0x01,0x80,0x80,0x02,0xb4,0x40,0x00,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x3e,0x3d,
+0x00,0x00,0x02,0x3c,0x3d,0x00,0x00,0x00,0x02,0x46,0x00,0x01,0x00,0x04,0x00,0x11,
+0x00,0x00,0x00,0x53,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x04,0x00,0x01,0x46,0x80,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,
+0x46,0xc0,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x08,0x00,0x01,0x46,0x00,0x81,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x0a,0x00,0x01,0x46,0x40,0x81,0x00,0x48,0x00,0x80,0x00,
+0x04,0x03,0x00,0x01,0x84,0x01,0x80,0x01,0x05,0x00,0x00,0x02,0x20,0xc1,0x81,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x0c,0x00,0x01,0x46,0x00,0x82,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x0e,0x00,0x01,0x46,0x40,0x82,0x00,0x48,0x00,0x80,0x00,0xc0,0x10,0x00,0x01,
+0x46,0x80,0x82,0x00,0x48,0x00,0x80,0x00,0xc0,0x12,0x00,0x01,0x46,0xc0,0x82,0x00,
+0x48,0x00,0x80,0x00,0x04,0x06,0x00,0x01,0x84,0x05,0x80,0x01,0x05,0x00,0x00,0x02,
+0x20,0xc1,0x81,0x00,0x48,0x00,0x80,0x00,0x84,0x06,0x00,0x01,0x04,0x01,0x80,0x01,
+0x05,0x00,0x00,0x02,0x20,0xc1,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x14,0x00,0x01,
+0x46,0x80,0x83,0x00,0x48,0x00,0x80,0x00,0xc0,0x16,0x00,0x01,0x46,0xc0,0x83,0x00,
+0x48,0x00,0x80,0x00,0x04,0x08,0x00,0x01,0x04,0x05,0x80,0x01,0x05,0x00,0x00,0x02,
+0x20,0xc1,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x18,0x00,0x01,0x46,0x40,0x84,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x1a,0x00,0x01,0x46,0x80,0x84,0x00,0x48,0x00,0x80,0x00,
+0x84,0x09,0x00,0x01,0x04,0x04,0x80,0x01,0x05,0x00,0x00,0x02,0x20,0xc1,0x81,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x1c,0x00,0x01,0x46,0x00,0x85,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x1e,0x00,0x01,0x46,0x40,0x85,0x00,0x48,0x00,0x80,0x00,0x04,0x0b,0x00,0x01,
+0x84,0x02,0x80,0x01,0x05,0x00,0x00,0x02,0x20,0xc1,0x81,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x20,0x00,0x01,0x46,0xc0,0x85,0x00,0x84,0x0b,0x80,0x00,0x29,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x04,0x61,0x6c,0x6c,0x3f,0x00,0x00,
+0x04,0x61,0x6e,0x79,0x3f,0x00,0x00,0x07,0x63,0x6f,0x6c,0x6c,0x65,0x63,0x74,0x00,
+0x00,0x06,0x64,0x65,0x74,0x65,0x63,0x74,0x00,0x00,0x0f,0x65,0x61,0x63,0x68,0x5f,
+0x77,0x69,0x74,0x68,0x5f,0x69,0x6e,0x64,0x65,0x78,0x00,0x00,0x07,0x65,0x6e,0x74,
+0x72,0x69,0x65,0x73,0x00,0x00,0x04,0x66,0x69,0x6e,0x64,0x00,0x00,0x0c,0x61,0x6c,
+0x69,0x61,0x73,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x08,0x66,0x69,0x6e,
+0x64,0x5f,0x61,0x6c,0x6c,0x00,0x00,0x04,0x67,0x72,0x65,0x70,0x00,0x00,0x08,0x69,
+0x6e,0x63,0x6c,0x75,0x64,0x65,0x3f,0x00,0x00,0x06,0x69,0x6e,0x6a,0x65,0x63,0x74,
+0x00,0x00,0x06,0x72,0x65,0x64,0x75,0x63,0x65,0x00,0x00,0x03,0x6d,0x61,0x70,0x00,
+0x00,0x03,0x6d,0x61,0x78,0x00,0x00,0x03,0x6d,0x69,0x6e,0x00,0x00,0x07,0x6d,0x65,
+0x6d,0x62,0x65,0x72,0x3f,0x00,0x00,0x09,0x70,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,
+0x6e,0x00,0x00,0x06,0x72,0x65,0x6a,0x65,0x63,0x74,0x00,0x00,0x06,0x73,0x65,0x6c,
+0x65,0x63,0x74,0x00,0x00,0x0c,0x5f,0x5f,0x73,0x6f,0x72,0x74,0x5f,0x73,0x75,0x62,
+0x5f,0x5f,0x00,0x00,0x04,0x73,0x6f,0x72,0x74,0x00,0x00,0x04,0x74,0x6f,0x5f,0x61,
+0x00,0x00,0x04,0x68,0x61,0x73,0x68,0x00,0x00,0x00,0x00,0x4d,0x00,0x02,0x00,0x04,
+0x00,0x02,0x00,0x00,0x00,0x0b,0x00,0x00,0xa6,0x00,0x00,0x00,0x19,0x02,0xc0,0x00,
+0x06,0x00,0x00,0x01,0x40,0x01,0x80,0x01,0x21,0x00,0x00,0x01,0x97,0x01,0x40,0x00,
+0x06,0x00,0x00,0x01,0x40,0x03,0x80,0x01,0x21,0x00,0x00,0x01,0x07,0x00,0x00,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,
+0x63,0x68,0x00,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,
+0x0c,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0x40,0x80,0x01,0x37,0x00,0x01,0x02,
+0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,0x19,0x01,0xc0,0x01,
+0x05,0x00,0x80,0x01,0x17,0x01,0x40,0x00,0x08,0x00,0x80,0x01,0x29,0x80,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x63,0x61,
+0x6c,0x6c,0x00,0x00,0x00,0x00,0x49,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x00,0x00,
+0x09,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,
+0x19,0x01,0xc0,0x01,0x05,0x00,0x80,0x01,0x17,0x01,0x40,0x00,0x08,0x00,0x80,0x01,
+0x29,0x80,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x00,0x4d,0x00,
+0x02,0x00,0x04,0x00,0x02,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,
+0x19,0x02,0xc0,0x00,0x06,0x00,0x00,0x01,0x40,0x01,0x80,0x01,0x21,0x00,0x00,0x01,
+0x97,0x01,0x40,0x00,0x06,0x00,0x00,0x01,0x40,0x03,0x80,0x01,0x21,0x00,0x00,0x01,
+0x08,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x06,0x00,
+0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0x40,0x80,0x01,
+0x37,0x00,0x01,0x02,0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,
+0x99,0x01,0xc0,0x01,0x07,0x00,0x80,0x01,0x29,0x80,0x80,0x01,0x97,0x00,0x40,0x00,
+0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x49,0x00,0x03,0x00,0x05,0x00,
+0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x01,0x40,0x80,0x01,
+0x20,0x00,0x80,0x01,0x99,0x01,0xc0,0x01,0x07,0x00,0x80,0x01,0x29,0x80,0x80,0x01,
+0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,
+0x00,0x00,0x7c,0x00,0x03,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,
+0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,
+0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x04,0x01,0x00,0x02,0xa0,0x40,0x80,0x01,
+0x29,0x00,0x80,0x01,0x37,0xc0,0x00,0x01,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,
+0x21,0xc0,0x80,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,
+0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x07,0x63,0x6f,0x6c,0x6c,0x65,
+0x63,0x74,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x4c,0x00,0x03,
+0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x09,0x26,0x00,0x08,0x00,0x15,0x80,0x80,0x01,
+0x15,0x40,0x00,0x02,0x37,0x40,0x81,0x02,0x01,0x40,0x00,0x03,0x38,0x80,0x81,0x02,
+0xa0,0x7f,0x00,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x00,0x04,0x63,0x61,0x6c,
+0x6c,0x00,0x00,0x00,0x00,0x45,0x00,0x04,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x09,
+0xa6,0x00,0x10,0x00,0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x00,
+0x01,0x40,0x80,0x01,0x06,0x00,0x00,0x02,0x40,0x01,0x80,0x02,0x21,0x00,0x00,0x02,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,
+0x63,0x68,0x00,0x00,0x00,0x00,0x64,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,
+0x0e,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0x80,0x80,0x01,0x37,0x00,0x01,0x02,
+0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,0x99,0x02,0xc0,0x01,
+0x01,0x40,0x80,0x01,0x20,0x40,0x80,0x01,0x16,0xc0,0x80,0x01,0x29,0x40,0x80,0x01,
+0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x08,0x5f,0x5f,0x73,
+0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x00,0x88,0x00,0x03,0x00,0x06,0x00,0x01,
+0x00,0x00,0x00,0x0f,0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,
+0x99,0x00,0xc0,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x04,0x01,0x00,0x02,
+0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x83,0xff,0x3f,0x01,0x06,0x00,0x80,0x01,
+0x40,0x01,0x00,0x02,0x21,0xc0,0x80,0x01,0x06,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,
+0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,
+0x00,0x00,0x0f,0x65,0x61,0x63,0x68,0x5f,0x77,0x69,0x74,0x68,0x5f,0x69,0x6e,0x64,
+0x65,0x78,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x58,0x00,0x03,
+0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x0a,0x26,0x00,0x08,0x00,0x15,0x40,0x80,0x01,
+0x01,0x40,0x00,0x02,0x20,0x40,0x00,0x02,0x15,0x80,0x80,0x02,0x20,0x01,0x80,0x01,
+0x15,0x80,0x80,0x01,0xad,0x80,0x80,0x01,0x16,0x80,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x01,0x2b,0x00,0x00,0x00,
+0x00,0x39,0x00,0x03,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x06,0x26,0x00,0x00,0x00,
+0x37,0xc0,0x00,0x01,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0x21,0x00,0x80,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,
+0x63,0x68,0x00,0x00,0x00,0x00,0x44,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,
+0x06,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0x80,0x80,0x01,0x01,0x40,0x00,0x02,
+0x20,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x00,0x08,0x5f,0x5f,0x73,
+0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x00,0x7d,0x00,0x03,0x00,0x06,0x00,0x01,
+0x00,0x00,0x00,0x0e,0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,
+0x99,0x00,0xc0,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x04,0x01,0x00,0x02,
+0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x37,0xc0,0x00,0x01,0x06,0x00,0x80,0x01,
+0x40,0x01,0x00,0x02,0x21,0xc0,0x80,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x04,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,
+0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x08,0x66,
+0x69,0x6e,0x64,0x5f,0x61,0x6c,0x6c,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,
+0x00,0x00,0x6b,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,
+0x26,0x00,0x08,0x00,0x15,0x40,0x80,0x01,0x37,0x00,0x01,0x02,0x01,0x40,0x80,0x02,
+0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,0x99,0x02,0xc0,0x01,0x15,0x80,0x80,0x01,
+0x01,0x40,0x00,0x02,0x20,0x80,0x00,0x02,0xa0,0x40,0x80,0x01,0x97,0x00,0x40,0x00,
+0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
+0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x00,0x08,
+0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x00,0x39,0x00,0x04,0x00,
+0x06,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0xa6,0x00,0x00,0x02,0x37,0x00,0x81,0x01,
+0x06,0x00,0x00,0x02,0x40,0x01,0x80,0x02,0x21,0x00,0x00,0x02,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,
+0x00,0x00,0x91,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x16,0x00,0x00,0x00,
+0x26,0x00,0x08,0x00,0x01,0x40,0x00,0x02,0x20,0x00,0x00,0x02,0x01,0x00,0x81,0x01,
+0x15,0x40,0x00,0x02,0x01,0xc0,0x80,0x02,0xa0,0x40,0x00,0x02,0x19,0x06,0x40,0x02,
+0x15,0xc0,0x00,0x02,0x15,0x80,0x80,0x02,0x19,0x03,0xc0,0x02,0x15,0x80,0x80,0x02,
+0x37,0x80,0x01,0x03,0x01,0x40,0x80,0x03,0x38,0xc0,0x01,0x03,0xa0,0xff,0x80,0x02,
+0x97,0x00,0x40,0x00,0x01,0xc0,0x80,0x02,0xa0,0x80,0x00,0x02,0x97,0x00,0x40,0x00,
+0x05,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x03,0x3d,0x3d,0x3d,
+0x00,0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x00,0x00,0x39,0x00,0x03,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,
+0x26,0x00,0x00,0x02,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0x21,0x00,0x80,0x01,
+0x08,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x56,0x00,0x03,0x00,0x06,0x00,
+0x00,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x01,0x40,0x80,0x01,
+0x20,0x00,0x80,0x01,0x15,0x40,0x00,0x02,0xb2,0x40,0x80,0x01,0x99,0x01,0xc0,0x01,
+0x07,0x00,0x80,0x01,0x29,0x80,0x80,0x01,0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x5f,0x5f,
+0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x00,0x01,0x18,
+0x00,0x06,0x00,0x0a,0x00,0x02,0x00,0x00,0x00,0x27,0x00,0x00,0xa6,0x00,0x08,0x00,
+0x01,0x40,0x00,0x03,0x20,0x00,0x00,0x03,0x83,0x00,0xc0,0x03,0xb5,0x40,0x00,0x03,
+0x19,0x02,0x40,0x03,0x06,0x00,0x00,0x03,0x91,0x01,0x80,0x03,0x3d,0x00,0x00,0x04,
+0x20,0x81,0x00,0x03,0x11,0x02,0x00,0x03,0x01,0x40,0x80,0x03,0x03,0xff,0x3f,0x04,
+0xa0,0x80,0x81,0x03,0xa0,0x40,0x01,0x03,0x19,0x04,0x40,0x03,0x01,0x40,0x00,0x03,
+0x03,0xff,0xbf,0x03,0xa0,0x80,0x01,0x03,0x01,0x80,0x81,0x01,0xc0,0x01,0x00,0x03,
+0x01,0x80,0x01,0x01,0x01,0x40,0x00,0x03,0x20,0xc0,0x01,0x03,0x01,0x40,0x00,0x03,
+0x20,0x00,0x02,0x03,0x99,0x01,0x40,0x03,0x07,0x00,0x00,0x02,0x05,0x00,0x80,0x02,
+0x97,0x02,0x40,0x00,0x08,0x00,0x00,0x02,0x01,0x40,0x00,0x03,0x83,0xff,0xbf,0x03,
+0xa0,0x80,0x01,0x03,0x01,0x80,0x81,0x02,0x06,0x00,0x00,0x03,0x40,0x03,0x80,0x03,
+0x21,0x40,0x02,0x03,0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x12,0x74,
+0x6f,0x6f,0x20,0x6d,0x61,0x6e,0x79,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,
+0x73,0x00,0x00,0x00,0x0a,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01,0x3e,0x00,
+0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,
+0x6e,0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x06,0x53,0x79,0x6d,0x62,0x6f,0x6c,
+0x00,0x00,0x03,0x3d,0x3d,0x3d,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x03,0x70,0x6f,
+0x70,0x00,0x00,0x06,0x65,0x6d,0x70,0x74,0x79,0x3f,0x00,0x00,0x04,0x65,0x61,0x63,
+0x68,0x00,0x00,0x00,0x00,0x3d,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x06,
+0x26,0x00,0x00,0x04,0x01,0x40,0x00,0x02,0x15,0xc0,0x80,0x02,0x01,0x80,0x00,0x03,
+0x20,0x01,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x08,0x5f,0x5f,0x73,0x65,0x6e,0x64,0x5f,0x5f,0x00,0x00,0x00,0x00,0x70,0x00,
+0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x26,0x00,0x08,0x00,
+0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,0x01,0xc0,0x80,0x00,0x15,0x00,0x81,0x01,
+0x99,0x02,0xc0,0x01,0x08,0x00,0x80,0x01,0x16,0x00,0x81,0x01,0x01,0x40,0x80,0x01,
+0x16,0x40,0x81,0x01,0x97,0x02,0x40,0x00,0x15,0x80,0x80,0x01,0x15,0x40,0x01,0x02,
+0x01,0x40,0x80,0x02,0x20,0x41,0x80,0x01,0x16,0x40,0x81,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,
+0x75,0x65,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x3d,0x00,0x04,
+0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x07,0xa6,0x00,0x00,0x00,0x07,0x00,0x00,0x01,
+0x05,0x00,0x80,0x01,0x06,0x00,0x00,0x02,0x40,0x01,0x80,0x02,0x21,0x00,0x00,0x02,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,
+0x63,0x68,0x00,0x00,0x00,0x00,0xc2,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,
+0x23,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,
+0x01,0xc0,0x80,0x00,0x15,0x80,0x80,0x01,0x19,0x02,0xc0,0x01,0x16,0xc0,0x80,0x00,
+0x08,0x00,0x80,0x01,0x16,0x80,0x80,0x01,0x17,0x0c,0x40,0x00,0x15,0x40,0x80,0x01,
+0x19,0x06,0xc0,0x01,0x15,0x40,0x80,0x01,0x01,0x40,0x00,0x02,0x15,0xc0,0x80,0x02,
+0x20,0x41,0x80,0x01,0x83,0xff,0x3f,0x02,0xb5,0x80,0x80,0x01,0x99,0x01,0xc0,0x01,
+0x01,0x40,0x80,0x01,0x16,0xc0,0x80,0x01,0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,
+0x17,0x05,0x40,0x00,0x01,0x40,0x80,0x01,0x15,0xc0,0x00,0x02,0xa0,0xc0,0x80,0x01,
+0x83,0xff,0x3f,0x02,0xb5,0x80,0x80,0x01,0x99,0x01,0xc0,0x01,0x01,0x40,0x80,0x01,
+0x16,0xc0,0x80,0x01,0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,
+0x75,0x65,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x01,0x3e,0x00,0x00,0x03,
+0x3c,0x3d,0x3e,0x00,0x00,0x00,0x00,0x3d,0x00,0x04,0x00,0x06,0x00,0x01,0x00,0x00,
+0x00,0x07,0x00,0x00,0xa6,0x00,0x00,0x00,0x07,0x00,0x00,0x01,0x05,0x00,0x80,0x01,
+0x06,0x00,0x00,0x02,0x40,0x01,0x80,0x02,0x21,0x00,0x00,0x02,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,
+0x00,0x00,0xc2,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x00,
+0x26,0x00,0x08,0x00,0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,0x01,0xc0,0x80,0x00,
+0x15,0x80,0x80,0x01,0x19,0x02,0xc0,0x01,0x16,0xc0,0x80,0x00,0x08,0x00,0x80,0x01,
+0x16,0x80,0x80,0x01,0x17,0x0c,0x40,0x00,0x15,0x40,0x80,0x01,0x19,0x06,0xc0,0x01,
+0x15,0x40,0x80,0x01,0x01,0x40,0x00,0x02,0x15,0xc0,0x80,0x02,0x20,0x41,0x80,0x01,
+0x83,0xff,0x3f,0x02,0xb3,0x80,0x80,0x01,0x99,0x01,0xc0,0x01,0x01,0x40,0x80,0x01,
+0x16,0xc0,0x80,0x01,0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,0x17,0x05,0x40,0x00,
+0x01,0x40,0x80,0x01,0x15,0xc0,0x00,0x02,0xa0,0xc0,0x80,0x01,0x83,0xff,0x3f,0x02,
+0xb3,0x80,0x80,0x01,0x99,0x01,0xc0,0x01,0x01,0x40,0x80,0x01,0x16,0xc0,0x80,0x01,
+0x97,0x00,0x40,0x00,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x04,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,
+0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x01,0x3c,0x00,0x00,0x03,0x3c,0x3d,0x3e,0x00,
+0x00,0x00,0x00,0x49,0x00,0x04,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x0a,0x00,0x00,
+0xa6,0x00,0x00,0x00,0x37,0x00,0x01,0x01,0x37,0x00,0x81,0x01,0x06,0x00,0x00,0x02,
+0x40,0x01,0x80,0x02,0x21,0x00,0x00,0x02,0x01,0x80,0x00,0x02,0x01,0xc0,0x80,0x02,
+0x37,0x01,0x01,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x77,0x00,0x03,0x00,0x06,0x00,
+0x00,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0x40,0x80,0x01,
+0x37,0x00,0x01,0x02,0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,
+0x99,0x02,0xc0,0x01,0x15,0x80,0x80,0x01,0x01,0x40,0x00,0x02,0x20,0x80,0x00,0x02,
+0xa0,0x40,0x80,0x01,0x17,0x02,0x40,0x00,0x15,0xc0,0x80,0x01,0x01,0x40,0x00,0x02,
+0x20,0x80,0x00,0x02,0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x04,0x70,0x75,0x73,
+0x68,0x00,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x00,
+0x39,0x00,0x03,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0xa6,0x00,0x00,0x00,
+0x37,0xc0,0x00,0x01,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0x21,0x00,0x80,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,
+0x63,0x68,0x00,0x00,0x00,0x00,0x6b,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,
+0x0e,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0x40,0x80,0x01,0x37,0x00,0x01,0x02,
+0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0xa0,0x3f,0x80,0x01,0x19,0x01,0xc0,0x01,
+0x05,0x00,0x80,0x01,0x17,0x02,0x40,0x00,0x15,0x80,0x80,0x01,0x01,0x40,0x00,0x02,
+0x20,0x80,0x00,0x02,0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x04,0x70,0x75,0x73,
+0x68,0x00,0x00,0x08,0x5f,0x5f,0x73,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x01,
+0xa0,0x00,0x0c,0x00,0x14,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0xa6,0x00,0x00,0x0a,
+0x01,0x00,0x01,0x06,0x01,0x40,0x81,0x06,0xb2,0x00,0x00,0x06,0x99,0x06,0x40,0x06,
+0x01,0xc0,0x00,0x06,0x03,0x00,0xc0,0x06,0xb2,0x00,0x00,0x06,0x99,0x03,0x40,0x06,
+0x01,0x80,0x00,0x06,0x01,0x00,0x81,0x06,0xa0,0x40,0x00,0x06,0x01,0x40,0x80,0x06,
+0x01,0x00,0x01,0x07,0x01,0x00,0x83,0x07,0x20,0x81,0x80,0x06,0x05,0x00,0x00,0x06,
+0x29,0x00,0x00,0x06,0x01,0xc0,0x00,0x06,0x83,0xff,0xbf,0x06,0xb2,0x00,0x00,0x06,
+0x99,0x02,0x40,0x06,0x01,0x40,0x00,0x06,0x01,0x80,0x80,0x06,0x01,0x00,0x83,0x03,
+0x01,0x40,0x03,0x04,0x17,0x02,0x40,0x00,0x01,0x80,0x00,0x06,0x01,0x40,0x80,0x06,
+0x01,0x00,0x83,0x03,0x01,0x40,0x03,0x04,0x01,0xc0,0x01,0x06,0x01,0x00,0x81,0x06,
+0xa0,0x40,0x00,0x06,0x01,0x00,0x83,0x04,0x01,0x00,0x01,0x06,0x01,0x40,0x81,0x06,
+0x01,0x00,0x03,0x05,0x01,0x40,0x83,0x05,0x01,0x00,0x01,0x06,0xad,0xc0,0x00,0x06,
+0x01,0x40,0x81,0x06,0x40,0x01,0x00,0x07,0xa1,0x00,0x01,0x06,0x01,0x40,0x02,0x06,
+0x01,0x40,0x80,0x06,0x01,0x80,0x02,0x07,0x01,0x00,0x83,0x07,0x20,0x81,0x80,0x06,
+0x01,0xc0,0x00,0x06,0xad,0xc0,0x00,0x06,0x83,0x00,0xc0,0x06,0xa0,0x40,0x01,0x06,
+0x01,0x00,0x83,0x01,0x01,0x80,0x02,0x06,0x01,0x00,0x81,0x06,0xb5,0x80,0x01,0x06,
+0x99,0x04,0x40,0x06,0x06,0x00,0x00,0x06,0x01,0x40,0x80,0x06,0x01,0x80,0x00,0x07,
+0x01,0xc0,0x80,0x07,0x01,0x00,0x01,0x08,0x01,0x80,0x82,0x08,0xaf,0x00,0x82,0x08,
+0x01,0x80,0x01,0x09,0xa1,0xc2,0x01,0x06,0x01,0x80,0x02,0x06,0x01,0x40,0x81,0x06,
+0xb3,0x40,0x02,0x06,0x19,0x05,0x40,0x06,0x06,0x00,0x00,0x06,0x01,0x40,0x80,0x06,
+0x01,0x80,0x00,0x07,0x01,0xc0,0x80,0x07,0x01,0x80,0x02,0x08,0xad,0xc0,0x00,0x08,
+0x01,0x40,0x81,0x08,0x01,0x80,0x01,0x09,0xa1,0xc2,0x01,0x06,0x97,0x00,0x40,0x00,
+0x05,0x00,0x00,0x06,0x29,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,
+0x00,0x02,0x3d,0x3d,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x03,0x5b,0x5d,0x3d,0x00,
+0x00,0x01,0x2b,0x00,0x00,0x04,0x75,0x70,0x74,0x6f,0x00,0x00,0x01,0x25,0x00,0x00,
+0x01,0x3e,0x00,0x00,0x0c,0x5f,0x5f,0x73,0x6f,0x72,0x74,0x5f,0x73,0x75,0x62,0x5f,
+0x5f,0x00,0x00,0x01,0x2d,0x00,0x00,0x01,0x3c,0x00,0x00,0x00,0x00,0xde,0x00,0x03,
+0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x28,0x26,0x00,0x00,0x02,0x15,0x80,0x81,0x01,
+0x99,0x03,0xc0,0x01,0x15,0x80,0x81,0x01,0x15,0xc0,0x01,0x02,0x01,0x40,0x80,0x02,
+0xa0,0x40,0x00,0x02,0x15,0x40,0x82,0x02,0x20,0x01,0x80,0x01,0x97,0x02,0x40,0x00,
+0x15,0xc0,0x81,0x01,0x01,0x40,0x00,0x02,0xa0,0x40,0x80,0x01,0x15,0x40,0x02,0x02,
+0xa0,0x80,0x80,0x01,0x83,0xff,0x3f,0x02,0xb5,0xc0,0x80,0x01,0x99,0x05,0xc0,0x01,
+0x15,0xc0,0x81,0x01,0x01,0x40,0x00,0x02,0xa0,0x40,0x80,0x01,0x15,0x00,0x02,0x02,
+0x15,0xc0,0x82,0x02,0x01,0xc0,0x00,0x03,0x20,0x01,0x01,0x02,0x15,0xc0,0x82,0x01,
+0xaf,0x40,0x81,0x01,0x16,0xc0,0x82,0x01,0x17,0x05,0x40,0x00,0x15,0xc0,0x81,0x01,
+0x01,0x40,0x00,0x02,0xa0,0x40,0x80,0x01,0x15,0x00,0x02,0x02,0x15,0x80,0x82,0x02,
+0x01,0xc0,0x00,0x03,0x20,0x01,0x01,0x02,0x15,0x80,0x82,0x01,0xad,0x80,0x81,0x01,
+0x16,0x80,0x82,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,
+0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x03,0x3c,0x3d,
+0x3e,0x00,0x00,0x01,0x3e,0x00,0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,0x01,0x2d,0x00,
+0x00,0x01,0x2b,0x00,0x00,0x00,0x00,0xb1,0x00,0x03,0x00,0x0b,0x00,0x01,0x00,0x00,
+0x00,0x19,0x00,0x00,0xa6,0x00,0x00,0x00,0x37,0xc0,0x00,0x01,0x06,0x00,0x80,0x01,
+0x40,0x01,0x00,0x02,0x21,0x00,0x80,0x01,0x01,0x80,0x80,0x01,0x20,0x40,0x80,0x01,
+0x03,0x00,0x40,0x02,0xb5,0x80,0x80,0x01,0x19,0x07,0xc0,0x01,0x06,0x00,0x80,0x01,
+0x01,0x80,0x00,0x02,0x42,0x00,0x80,0x02,0x13,0x02,0x80,0x02,0x01,0x80,0x00,0x03,
+0x20,0x40,0x00,0x03,0xa0,0x40,0x81,0x02,0x83,0xff,0x3f,0x03,0x83,0xff,0xbf,0x03,
+0x01,0x80,0x00,0x04,0x20,0x40,0x00,0x04,0xaf,0x80,0x01,0x04,0x01,0x40,0x80,0x04,
+0xa1,0xc2,0x80,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,
+0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x01,
+0x3e,0x00,0x00,0x0c,0x5f,0x5f,0x73,0x6f,0x72,0x74,0x5f,0x73,0x75,0x62,0x5f,0x5f,
+0x00,0x00,0x05,0x41,0x72,0x72,0x61,0x79,0x00,0x00,0x03,0x6e,0x65,0x77,0x00,0x00,
+0x01,0x2d,0x00,0x00,0x00,0x00,0x44,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,
+0x06,0x00,0x00,0x00,0x26,0x00,0x08,0x00,0x15,0x80,0x80,0x01,0x01,0x40,0x00,0x02,
+0x20,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x00,0x08,0x5f,0x5f,0x73,
+0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x00,0x00,0x39,0x00,0x03,0x00,0x05,0x00,0x01,
+0x00,0x00,0x00,0x06,0x26,0x00,0x00,0x00,0x03,0x1d,0x58,0x01,0x06,0x00,0x80,0x01,
+0x40,0x01,0x00,0x02,0x21,0x00,0x80,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x41,0x00,
+0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x26,0x00,0x00,0x02,
+0x15,0x80,0x80,0x01,0x01,0x40,0x00,0x02,0x20,0x00,0x00,0x02,0xa0,0x40,0x80,0x01,
+0x16,0x80,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x04,0x68,0x61,0x73,0x68,0x00,0x00,0x01,0x5e,0x00,0x00,0x00,0x00,0x3e,0x00,
+0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x80,0x00,
+0x47,0x40,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,0x04,0x00,0x80,0x00,
+0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x09,0x65,0x78,
+0x63,0x65,0x70,0x74,0x69,0x6f,0x6e,0x00,0x00,0x00,0x00,0x40,0x00,0x03,0x00,0x06,
+0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0xa6,0x00,0x08,0x00,0x06,0x00,0x80,0x01,
+0x37,0x00,0x01,0x02,0x01,0x40,0x80,0x02,0x38,0x40,0x01,0x02,0x01,0x80,0x80,0x02,
+0xa1,0x3f,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+0x00,0x03,0x6e,0x65,0x77,0x00,0x00,0x00,0x00,0x22,0x00,0x01,0x00,0x02,0x00,0x00,
+0x00,0x00,0x00,0x02,0x05,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x02,0x00,0x00,0x05,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x02,0x00,0x00,0x05,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x02,0x00,0x00,0x05,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x02,0x00,0x00,0x05,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x02,0x00,0x00,0x05,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,
+0x00,0x08,0x00,0x00,0x06,0x00,0x80,0x00,0x84,0x00,0x00,0x01,0xa0,0x00,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x80,0x80,0x00,0x04,0x01,0x80,0x00,
+0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x0d,0x61,0x74,
+0x74,0x72,0x5f,0x61,0x63,0x63,0x65,0x73,0x73,0x6f,0x72,0x00,0x00,0x04,0x6e,0x61,
+0x6d,0x65,0x00,0x00,0x0a,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,0x7a,0x65,0x00,
+0x00,0x00,0x00,0x4e,0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x0b,0x00,0x00,
+0x26,0x00,0x20,0x00,0x17,0x01,0x40,0x00,0x17,0x01,0x40,0x00,0x17,0x01,0x40,0x00,
+0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,0x0e,0x00,0x00,0x01,0x01,0x40,0x80,0x02,
+0x05,0x00,0x00,0x03,0xa4,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x05,0x40,0x6e,0x61,0x6d,0x65,0x00,0x00,0x00,0x00,0x5c,
+0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0x06,0x00,0x80,0x00,
+0x84,0x00,0x00,0x01,0xa0,0x00,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,
+0x46,0x80,0x80,0x00,0x04,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x0b,0x61,0x74,0x74,0x72,0x5f,0x72,0x65,0x61,0x64,0x65,
+0x72,0x00,0x00,0x04,0x61,0x72,0x67,0x73,0x00,0x00,0x0a,0x69,0x6e,0x69,0x74,0x69,
+0x61,0x6c,0x69,0x7a,0x65,0x00,0x00,0x00,0x00,0x5a,0x00,0x05,0x00,0x09,0x00,0x00,
+0x00,0x00,0x00,0x0e,0x26,0x00,0x30,0x00,0x97,0x01,0x40,0x00,0x97,0x01,0x40,0x00,
+0x97,0x01,0x40,0x00,0x97,0x01,0x40,0x00,0x05,0x00,0x80,0x00,0x05,0x00,0x00,0x01,
+0x05,0x00,0x80,0x01,0x0e,0x00,0x80,0x01,0x01,0x40,0x00,0x03,0x01,0x80,0x80,0x03,
+0x05,0x00,0x00,0x04,0x24,0x01,0x80,0x02,0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x05,0x40,0x61,0x72,0x67,0x73,0x00,0x00,0x00,0x00,0x22,
+0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x05,0x00,0x80,0x00,
+0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,
+0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x05,0x00,0x80,0x00,
+0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,
+0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x05,0x00,0x80,0x00,
+0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,
+0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x06,0x00,0x80,0x00,
+0x84,0x00,0x00,0x01,0xa0,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x0d,0x61,0x74,0x74,0x72,0x5f,0x61,0x63,0x63,0x65,0x73,
+0x73,0x6f,0x72,0x00,0x00,0x06,0x72,0x65,0x73,0x75,0x6c,0x74,0x00,0x00,0x00,0x01,
+0xb2,0x00,0x01,0x00,0x04,0x00,0x0f,0x00,0x00,0x00,0x39,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,
+0x46,0x40,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x04,0x00,0x01,0x46,0x80,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,0x46,0xc0,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x08,0x00,0x01,0x46,0x00,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x0a,0x00,0x01,
+0x46,0x40,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x0c,0x00,0x01,0x46,0x80,0x81,0x00,
+0x48,0x00,0x80,0x00,0x84,0x03,0x00,0x01,0x04,0x03,0x80,0x01,0x05,0x00,0x00,0x02,
+0x20,0x01,0x82,0x00,0x48,0x00,0x80,0x00,0xc0,0x0e,0x00,0x01,0x46,0x40,0x82,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x10,0x00,0x01,0x46,0x80,0x82,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x12,0x00,0x01,0x46,0xc0,0x82,0x00,0x48,0x00,0x80,0x00,0x04,0x06,0x00,0x01,
+0x84,0x05,0x80,0x01,0x05,0x00,0x00,0x02,0x20,0x01,0x82,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x14,0x00,0x01,0x46,0x40,0x83,0x00,0x48,0x00,0x80,0x00,0xc0,0x16,0x00,0x01,
+0x46,0x80,0x83,0x00,0x48,0x00,0x80,0x00,0xc0,0x18,0x00,0x01,0x46,0xc0,0x83,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x1a,0x00,0x01,0x46,0x00,0x84,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x1c,0x00,0x01,0x46,0x40,0x84,0x00,0x84,0x08,0x80,0x00,0x29,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x02,0x3d,0x3d,0x00,0x00,0x04,0x65,
+0x71,0x6c,0x3f,0x00,0x00,0x06,0x64,0x65,0x6c,0x65,0x74,0x65,0x00,0x00,0x04,0x65,
+0x61,0x63,0x68,0x00,0x00,0x08,0x65,0x61,0x63,0x68,0x5f,0x6b,0x65,0x79,0x00,0x00,
+0x0a,0x65,0x61,0x63,0x68,0x5f,0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x07,0x72,0x65,
+0x70,0x6c,0x61,0x63,0x65,0x00,0x00,0x0f,0x69,0x6e,0x69,0x74,0x69,0x61,0x6c,0x69,
+0x7a,0x65,0x5f,0x63,0x6f,0x70,0x79,0x00,0x00,0x0c,0x61,0x6c,0x69,0x61,0x73,0x5f,
+0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x05,0x6d,0x65,0x72,0x67,0x65,0x00,0x00,
+0x08,0x5f,0x69,0x6e,0x73,0x70,0x65,0x63,0x74,0x00,0x00,0x07,0x69,0x6e,0x73,0x70,
+0x65,0x63,0x74,0x00,0x00,0x04,0x74,0x6f,0x5f,0x73,0x00,0x00,0x07,0x72,0x65,0x6a,
+0x65,0x63,0x74,0x21,0x00,0x00,0x06,0x72,0x65,0x6a,0x65,0x63,0x74,0x00,0x00,0x07,
+0x73,0x65,0x6c,0x65,0x63,0x74,0x21,0x00,0x00,0x06,0x73,0x65,0x6c,0x65,0x63,0x74,
+0x00,0x00,0x08,0x5f,0x5f,0x75,0x70,0x64,0x61,0x74,0x65,0x00,0x00,0x00,0x00,0xe6,
+0x00,0x03,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x24,0x00,0x00,0x26,0x00,0x00,0x02,
+0x06,0x00,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x19,0x01,0xc0,0x01,
+0x07,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x1a,0x02,0x40,0x00,0x01,0x40,0x80,0x01,
+0x20,0x40,0x80,0x01,0x01,0xc0,0x80,0x00,0x17,0x05,0x40,0x00,0x1b,0x00,0x80,0x01,
+0x11,0x01,0x00,0x02,0x01,0xc0,0x80,0x02,0xa0,0xc0,0x00,0x02,0x98,0x00,0x40,0x02,
+0x97,0x01,0x40,0x00,0x08,0x00,0x80,0x01,0x29,0x80,0x80,0x01,0x17,0x01,0x40,0x00,
+0x1d,0x00,0x80,0x01,0x1c,0x00,0x80,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x81,0x01,
+0x01,0x40,0x00,0x02,0x20,0x00,0x01,0x02,0xa0,0x40,0x81,0x01,0x19,0x01,0xc0,0x01,
+0x08,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,
+0x21,0x80,0x81,0x01,0x07,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x07,0x00,0x06,0x65,0x71,0x75,0x61,0x6c,0x3f,0x00,0x00,0x07,0x74,
+0x6f,0x5f,0x68,0x61,0x73,0x68,0x00,0x00,0x0d,0x4e,0x6f,0x4d,0x65,0x74,0x68,0x6f,
+0x64,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x3d,0x3d,0x3d,0x00,0x00,0x04,0x73,
+0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,
+0x00,0x00,0x00,0x7f,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x15,0x00,0x00,
+0x26,0x00,0x00,0x04,0x15,0x40,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x00,0x00,0x02,
+0x99,0x00,0x40,0x02,0x17,0x01,0x40,0x00,0x08,0x00,0x00,0x02,0x29,0x80,0x00,0x02,
+0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x40,0x00,0x02,0x15,0x40,0x80,0x02,
+0x01,0x40,0x00,0x03,0xa0,0x40,0x80,0x02,0xb2,0x80,0x00,0x02,0x19,0x01,0x40,0x02,
+0x05,0x00,0x00,0x02,0x17,0x01,0x40,0x00,0x08,0x00,0x00,0x02,0x29,0x80,0x00,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x6b,0x65,
+0x79,0x3f,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x00,0x00,
+0xe6,0x00,0x03,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x24,0x00,0x26,0x00,0x00,0x02,
+0x06,0x00,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x19,0x01,0xc0,0x01,
+0x07,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x1a,0x02,0x40,0x00,0x01,0x40,0x80,0x01,
+0x20,0x40,0x80,0x01,0x01,0xc0,0x80,0x00,0x17,0x05,0x40,0x00,0x1b,0x00,0x80,0x01,
+0x11,0x01,0x00,0x02,0x01,0xc0,0x80,0x02,0xa0,0xc0,0x00,0x02,0x98,0x00,0x40,0x02,
+0x97,0x01,0x40,0x00,0x08,0x00,0x80,0x01,0x29,0x80,0x80,0x01,0x17,0x01,0x40,0x00,
+0x1d,0x00,0x80,0x01,0x1c,0x00,0x80,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x81,0x01,
+0x01,0x40,0x00,0x02,0x20,0x00,0x01,0x02,0xa0,0x40,0x81,0x01,0x19,0x01,0xc0,0x01,
+0x08,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,
+0x21,0x80,0x81,0x01,0x07,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x07,0x00,0x06,0x65,0x71,0x75,0x61,0x6c,0x3f,0x00,0x00,0x07,0x74,
+0x6f,0x5f,0x68,0x61,0x73,0x68,0x00,0x00,0x0d,0x4e,0x6f,0x4d,0x65,0x74,0x68,0x6f,
+0x64,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x3d,0x3d,0x3d,0x00,0x00,0x04,0x73,
+0x69,0x7a,0x65,0x00,0x00,0x02,0x21,0x3d,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,
+0x00,0x00,0x00,0x81,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x15,0x00,0x00,
+0x26,0x00,0x00,0x04,0x15,0x40,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x00,0x00,0x02,
+0x99,0x00,0x40,0x02,0x17,0x01,0x40,0x00,0x08,0x00,0x00,0x02,0x29,0x80,0x00,0x02,
+0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0xa0,0x40,0x00,0x02,0x15,0x40,0x80,0x02,
+0x01,0x40,0x00,0x03,0xa0,0x40,0x80,0x02,0xa0,0x80,0x00,0x02,0x19,0x01,0x40,0x02,
+0x05,0x00,0x00,0x02,0x17,0x01,0x40,0x00,0x08,0x00,0x00,0x02,0x29,0x80,0x00,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x6b,0x65,
+0x79,0x3f,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x04,0x65,0x71,0x6c,0x3f,0x00,0x00,
+0x00,0x00,0x7b,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,
+0xa6,0x00,0x00,0x02,0x01,0x80,0x80,0x01,0x19,0x02,0xc0,0x01,0x06,0x00,0x80,0x01,
+0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x20,0x40,0x80,0x01,0x19,0x02,0xc0,0x01,
+0x01,0x80,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0x80,0x80,0x01,0x97,0x01,0x40,0x00,
+0x06,0x00,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0xc0,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x68,0x61,0x73,0x5f,0x6b,0x65,
+0x79,0x3f,0x00,0x00,0x01,0x21,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x08,
+0x5f,0x5f,0x64,0x65,0x6c,0x65,0x74,0x65,0x00,0x00,0x00,0x00,0xfd,0x00,0x06,0x00,
+0x0b,0x00,0x00,0x00,0x00,0x00,0x26,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x03,
+0x20,0x00,0x00,0x03,0x99,0x00,0x40,0x03,0x17,0x02,0x40,0x00,0x06,0x00,0x00,0x03,
+0x04,0x01,0x80,0x03,0xa0,0x40,0x00,0x03,0x29,0x00,0x00,0x03,0x06,0x00,0x00,0x03,
+0x20,0xc0,0x00,0x03,0x01,0x80,0x01,0x01,0x06,0x00,0x00,0x03,0x20,0x00,0x01,0x03,
+0x01,0x80,0x81,0x01,0x06,0x00,0x00,0x03,0x20,0x40,0x01,0x03,0x01,0x80,0x01,0x02,
+0x83,0xff,0xbf,0x02,0x17,0x06,0x40,0x00,0x01,0x40,0x00,0x03,0x01,0x80,0x80,0x03,
+0x01,0x40,0x01,0x04,0xa0,0xc0,0x81,0x03,0x01,0xc0,0x00,0x04,0x01,0x40,0x81,0x04,
+0xa0,0xc0,0x01,0x04,0x37,0xc1,0x81,0x03,0xa0,0x80,0x01,0x03,0x01,0x40,0x01,0x03,
+0xad,0x00,0x02,0x03,0x01,0x80,0x81,0x02,0x01,0x40,0x01,0x03,0x01,0x00,0x81,0x03,
+0xb3,0x40,0x02,0x03,0x18,0xf8,0x3f,0x03,0x06,0x00,0x00,0x03,0x29,0x00,0x00,0x03,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,
+0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,
+0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x04,0x6b,0x65,0x79,0x73,0x00,0x00,
+0x06,0x76,0x61,0x6c,0x75,0x65,0x73,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,
+0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x01,0x2b,0x00,0x00,
+0x01,0x3c,0x00,0x00,0x00,0x00,0x88,0x00,0x02,0x00,0x05,0x00,0x01,0x00,0x00,0x00,
+0x0f,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,
+0x99,0x00,0x40,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x00,0x01,0x04,0x01,0x80,0x01,
+0xa0,0x40,0x00,0x01,0x29,0x00,0x00,0x01,0x06,0x00,0x00,0x01,0x20,0xc0,0x00,0x01,
+0x40,0x01,0x80,0x01,0x21,0x00,0x01,0x01,0x06,0x00,0x00,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,
+0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,
+0x00,0x00,0x08,0x65,0x61,0x63,0x68,0x5f,0x6b,0x65,0x79,0x00,0x00,0x04,0x6b,0x65,
+0x79,0x73,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x35,0x00,0x03,
+0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x05,0x26,0x00,0x00,0x02,0x15,0x40,0x80,0x01,
+0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x00,0x00,0x8a,0x00,
+0x02,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,
+0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x99,0x00,0x40,0x01,0x17,0x02,0x40,0x00,
+0x06,0x00,0x00,0x01,0x04,0x01,0x80,0x01,0xa0,0x40,0x00,0x01,0x29,0x00,0x00,0x01,
+0x06,0x00,0x00,0x01,0x20,0xc0,0x00,0x01,0x40,0x01,0x80,0x01,0x21,0x00,0x01,0x01,
+0x06,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,
+0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,
+0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x0a,0x65,0x61,0x63,0x68,0x5f,
+0x76,0x61,0x6c,0x75,0x65,0x00,0x00,0x04,0x6b,0x65,0x79,0x73,0x00,0x00,0x04,0x65,
+0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x42,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,
+0x00,0x07,0x00,0x00,0x26,0x00,0x00,0x02,0x15,0x40,0x80,0x01,0x06,0x00,0x00,0x02,
+0x01,0x40,0x80,0x02,0xa0,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x02,0x5b,0x5d,0x00,0x00,0x00,0x00,0xcb,0x00,0x03,0x00,0x07,0x00,0x01,0x00,0x00,
+0x00,0x18,0x00,0x00,0x26,0x00,0x00,0x02,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,
+0x01,0x40,0x80,0x01,0x20,0x40,0x80,0x01,0x01,0xc0,0x80,0x00,0x40,0x01,0x00,0x02,
+0x21,0x80,0x80,0x01,0x01,0x40,0x80,0x01,0x20,0xc0,0x80,0x01,0x19,0x03,0xc0,0x01,
+0x01,0x40,0x80,0x01,0x20,0xc0,0x80,0x01,0x06,0x00,0x00,0x02,0x01,0xc0,0x80,0x02,
+0xa0,0x00,0x01,0x02,0x97,0x02,0x40,0x00,0x01,0x40,0x80,0x01,0x20,0x40,0x81,0x01,
+0x06,0x00,0x00,0x02,0x01,0xc0,0x80,0x02,0xa0,0x80,0x01,0x02,0x06,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x05,0x63,0x6c,
+0x65,0x61,0x72,0x00,0x00,0x07,0x74,0x6f,0x5f,0x68,0x61,0x73,0x68,0x00,0x00,0x08,
+0x65,0x61,0x63,0x68,0x5f,0x6b,0x65,0x79,0x00,0x00,0x0c,0x64,0x65,0x66,0x61,0x75,
+0x6c,0x74,0x5f,0x70,0x72,0x6f,0x63,0x00,0x00,0x0d,0x64,0x65,0x66,0x61,0x75,0x6c,
+0x74,0x5f,0x70,0x72,0x6f,0x63,0x3d,0x00,0x00,0x07,0x64,0x65,0x66,0x61,0x75,0x6c,
+0x74,0x00,0x00,0x08,0x64,0x65,0x66,0x61,0x75,0x6c,0x74,0x3d,0x00,0x00,0x00,0x00,
+0x49,0x00,0x03,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x26,0x00,0x00,0x02,
+0x15,0x40,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x06,0x00,0x00,0x02,
+0x01,0x40,0x80,0x02,0x01,0xc0,0x00,0x03,0x20,0x41,0x00,0x02,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x5b,0x5d,0x00,0x00,0x03,0x5b,
+0x5d,0x3d,0x00,0x00,0x00,0x00,0xdc,0x00,0x04,0x00,0x08,0x00,0x03,0x00,0x00,0x00,
+0x1a,0x00,0x00,0x00,0xa6,0x00,0x00,0x02,0x3f,0x00,0x81,0x01,0x01,0x40,0x00,0x02,
+0x84,0x00,0x80,0x02,0xa0,0x00,0x00,0x02,0x99,0x00,0x40,0x02,0x17,0x02,0x40,0x00,
+0x06,0x00,0x00,0x02,0x91,0x01,0x80,0x02,0x3d,0x00,0x00,0x03,0x20,0x81,0x00,0x02,
+0x01,0x40,0x00,0x02,0x20,0x40,0x00,0x02,0x01,0x00,0x81,0x00,0x06,0x00,0x00,0x02,
+0x40,0x01,0x80,0x02,0x21,0x00,0x01,0x02,0x19,0x02,0x40,0x01,0x01,0x40,0x00,0x02,
+0x40,0x03,0x80,0x02,0x21,0x00,0x01,0x02,0x97,0x01,0x40,0x00,0x01,0x40,0x00,0x02,
+0x40,0x05,0x80,0x02,0x21,0x00,0x01,0x02,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x01,
+0x00,0x00,0x20,0x63,0x61,0x6e,0x27,0x74,0x20,0x63,0x6f,0x6e,0x76,0x65,0x72,0x74,
+0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x20,0x69,0x6e,0x74,0x6f,0x20,0x48,
+0x61,0x73,0x68,0x00,0x00,0x00,0x05,0x00,0x0b,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,
+0x5f,0x74,0x6f,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x68,0x61,0x73,0x68,0x00,0x00,
+0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x09,0x54,0x79,0x70,0x65,0x45,0x72,0x72,
+0x6f,0x72,0x00,0x00,0x08,0x65,0x61,0x63,0x68,0x5f,0x6b,0x65,0x79,0x00,0x00,0x00,
+0x00,0x49,0x00,0x03,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x09,0x26,0x00,0x00,0x02,
+0x06,0x00,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x15,0xc0,0x00,0x02,
+0x01,0x40,0x80,0x02,0x01,0xc0,0x00,0x03,0x20,0x41,0x00,0x02,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x5b,0x5d,0x00,0x00,0x03,0x5b,
+0x5d,0x3d,0x00,0x00,0x00,0x00,0x93,0x00,0x03,0x00,0x09,0x00,0x00,0x00,0x00,0x00,
+0x17,0x00,0x00,0x00,0x26,0x00,0x00,0x02,0x06,0x00,0x80,0x01,0x01,0x40,0x00,0x02,
+0xa0,0x00,0x80,0x01,0x19,0x05,0xc0,0x01,0x15,0x80,0x80,0x01,0x01,0x40,0x00,0x02,
+0x06,0x00,0x80,0x02,0x01,0x40,0x00,0x03,0xa0,0x80,0x80,0x02,0x15,0x40,0x00,0x03,
+0x01,0x40,0x80,0x03,0xa0,0x80,0x00,0x03,0xa0,0x41,0x80,0x01,0x97,0x01,0x40,0x00,
+0x15,0x40,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0x80,0x80,0x01,0x15,0xc0,0x00,0x02,
+0x01,0x40,0x80,0x02,0x01,0xc0,0x00,0x03,0x20,0xc1,0x00,0x02,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x68,0x61,0x73,0x5f,0x6b,0x65,
+0x79,0x3f,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,
+0x03,0x5b,0x5d,0x3d,0x00,0x00,0x00,0x00,0x49,0x00,0x03,0x00,0x08,0x00,0x00,0x00,
+0x00,0x00,0x09,0x00,0x26,0x00,0x00,0x02,0x15,0x40,0x80,0x01,0x01,0x40,0x00,0x02,
+0xa0,0x00,0x80,0x01,0x15,0xc0,0x00,0x02,0x01,0x40,0x80,0x02,0x01,0xc0,0x00,0x03,
+0x20,0x41,0x00,0x02,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x02,0x5b,0x5d,0x00,0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,0x00,0x00,0x91,0x00,
+0x02,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x26,0x00,0x00,0x00,
+0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x83,0xff,0xbf,0x01,0xb2,0x40,0x00,0x01,
+0x19,0x01,0x40,0x01,0x3d,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0xbd,0x00,0x00,0x01,
+0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0x21,0xc0,0x80,0x01,0x3d,0x01,0x00,0x02,
+0xa0,0x00,0x81,0x01,0xac,0x80,0x00,0x01,0xbd,0x01,0x80,0x01,0xac,0x80,0x00,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x7b,0x7d,0x00,0x00,0x01,
+0x7b,0x00,0x00,0x02,0x2c,0x20,0x00,0x00,0x01,0x7d,0x00,0x00,0x00,0x05,0x00,0x04,
+0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x01,0x2b,0x00,0x00,0x03,
+0x6d,0x61,0x70,0x00,0x00,0x04,0x6a,0x6f,0x69,0x6e,0x00,0x00,0x00,0x00,0x52,0x00,
+0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x26,0x00,0x00,0x04,
+0x01,0x40,0x00,0x02,0x20,0x00,0x00,0x02,0x3d,0x00,0x80,0x02,0xac,0x40,0x00,0x02,
+0x01,0x80,0x80,0x02,0x20,0x00,0x80,0x02,0xac,0x40,0x00,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x3d,0x3e,0x00,0x00,0x00,0x02,0x00,0x08,0x5f,
+0x69,0x6e,0x73,0x70,0x65,0x63,0x74,0x00,0x00,0x01,0x2b,0x00,0x00,0x00,0x00,0x86,
+0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x26,0x00,0x00,0x00,
+0x9a,0x01,0x40,0x00,0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x97,0x04,0x40,0x00,
+0x1b,0x00,0x00,0x01,0x91,0x00,0x80,0x01,0x01,0x80,0x00,0x02,0xa0,0x80,0x80,0x01,
+0x98,0x00,0xc0,0x01,0x17,0x01,0x40,0x00,0x3d,0x00,0x00,0x01,0x17,0x01,0x40,0x00,
+0x1d,0x00,0x00,0x01,0x1c,0x00,0x80,0x00,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x01,
+0x00,0x00,0x05,0x7b,0x2e,0x2e,0x2e,0x7d,0x00,0x00,0x00,0x03,0x00,0x08,0x5f,0x69,
+0x6e,0x73,0x70,0x65,0x63,0x74,0x00,0x00,0x10,0x53,0x79,0x73,0x74,0x65,0x6d,0x53,
+0x74,0x61,0x63,0x6b,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x3d,0x3d,0x3d,0x00,
+0x00,0x00,0x00,0xb4,0x00,0x03,0x00,0x06,0x00,0x02,0x00,0x00,0x00,0x19,0x00,0x00,
+0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,
+0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x04,0x01,0x00,0x02,0xa0,0x40,0x80,0x01,
+0x29,0x00,0x80,0x01,0x37,0xc0,0x00,0x01,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,
+0x21,0xc0,0x80,0x01,0x01,0x80,0x80,0x01,0x20,0x00,0x81,0x01,0x83,0xff,0x3f,0x02,
+0xb2,0x40,0x81,0x01,0x19,0x01,0xc0,0x01,0x05,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x01,0x80,0x80,0x01,0x40,0x03,0x00,0x02,0x21,0xc0,0x80,0x01,0x06,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x0c,0x62,0x6c,
+0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,
+0x65,0x6e,0x75,0x6d,0x00,0x00,0x07,0x72,0x65,0x6a,0x65,0x63,0x74,0x21,0x00,0x00,
+0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x3d,
+0x3d,0x00,0x00,0x00,0x00,0x5c,0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x0d,
+0x26,0x00,0x00,0x04,0x15,0x40,0x00,0x02,0x01,0x40,0x80,0x02,0x01,0x80,0x00,0x03,
+0x37,0x41,0x81,0x02,0xa0,0x00,0x00,0x02,0x19,0x02,0x40,0x02,0x15,0x80,0x00,0x02,
+0x01,0x40,0x80,0x02,0xa0,0x40,0x00,0x02,0x97,0x00,0x40,0x00,0x05,0x00,0x00,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x63,0x61,
+0x6c,0x6c,0x00,0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x00,0x00,0x00,0x37,0x00,0x03,
+0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x05,0x26,0x00,0x00,0x02,0x06,0x00,0x80,0x01,
+0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x06,0x64,0x65,0x6c,0x65,0x74,0x65,0x00,0x00,0x00,0x00,
+0x7b,0x00,0x03,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x0e,0x00,0xa6,0x00,0x00,0x00,
+0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,0x17,0x02,0x40,0x00,
+0x06,0x00,0x80,0x01,0x04,0x01,0x00,0x02,0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,
+0x3f,0xc0,0x00,0x01,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,0x21,0xc0,0x80,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0c,0x62,0x6c,
+0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,
+0x65,0x6e,0x75,0x6d,0x00,0x00,0x06,0x72,0x65,0x6a,0x65,0x63,0x74,0x00,0x00,0x04,
+0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x63,0x00,0x04,0x00,0x09,0x00,0x00,0x00,
+0x00,0x00,0x0f,0x00,0x26,0x00,0x00,0x04,0x15,0x40,0x00,0x02,0x01,0x40,0x80,0x02,
+0x01,0x80,0x00,0x03,0x37,0x41,0x81,0x02,0xa0,0x00,0x00,0x02,0x19,0x01,0x40,0x02,
+0x05,0x00,0x00,0x02,0x97,0x02,0x40,0x00,0x01,0x80,0x00,0x02,0x15,0x80,0x80,0x02,
+0x01,0x40,0x00,0x03,0x01,0x00,0x81,0x03,0x20,0x41,0x80,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x03,0x5b,0x5d,0x3d,0x00,0x00,0x00,0x00,0xb4,0x00,0x03,0x00,0x06,0x00,0x02,0x00,
+0x00,0x00,0x19,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,
+0x99,0x00,0xc0,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x04,0x01,0x00,0x02,
+0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x37,0xc0,0x00,0x01,0x06,0x00,0x80,0x01,
+0x40,0x01,0x00,0x02,0x21,0xc0,0x80,0x01,0x01,0x80,0x80,0x01,0x20,0x00,0x81,0x01,
+0x83,0xff,0x3f,0x02,0xb2,0x40,0x81,0x01,0x19,0x01,0xc0,0x01,0x05,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x01,0x80,0x80,0x01,0x40,0x03,0x00,0x02,0x21,0xc0,0x80,0x01,
+0x06,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,
+0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,
+0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x07,0x73,0x65,0x6c,0x65,0x63,
+0x74,0x21,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x04,0x73,0x69,0x7a,0x65,
+0x00,0x00,0x02,0x3d,0x3d,0x00,0x00,0x00,0x00,0x5c,0x00,0x04,0x00,0x07,0x00,0x00,
+0x00,0x00,0x00,0x0d,0x26,0x00,0x00,0x04,0x15,0x40,0x00,0x02,0x01,0x40,0x80,0x02,
+0x01,0x80,0x00,0x03,0x37,0x41,0x81,0x02,0xa0,0x00,0x00,0x02,0x19,0x01,0x40,0x02,
+0x05,0x00,0x00,0x02,0x97,0x01,0x40,0x00,0x15,0x80,0x00,0x02,0x01,0x40,0x80,0x02,
+0xa0,0x40,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x04,0x70,0x75,0x73,0x68,0x00,0x00,0x00,
+0x00,0x37,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x05,0x26,0x00,0x00,0x02,
+0x06,0x00,0x80,0x01,0x01,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x06,0x64,0x65,0x6c,0x65,0x74,0x65,
+0x00,0x00,0x00,0x00,0x7b,0x00,0x03,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x0e,0x00,
+0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,
+0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x04,0x01,0x00,0x02,0xa0,0x40,0x80,0x01,
+0x29,0x00,0x80,0x01,0x3f,0xc0,0x00,0x01,0x06,0x00,0x80,0x01,0x40,0x01,0x00,0x02,
+0x21,0xc0,0x80,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,
+0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x06,0x73,0x65,0x6c,0x65,0x63,
+0x74,0x00,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,0x00,0x00,0x63,0x00,0x04,0x00,
+0x09,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x26,0x00,0x00,0x04,0x15,0x40,0x00,0x02,
+0x01,0x40,0x80,0x02,0x01,0x80,0x00,0x03,0x37,0x41,0x81,0x02,0xa0,0x00,0x00,0x02,
+0x19,0x03,0x40,0x02,0x01,0x80,0x00,0x02,0x15,0x80,0x80,0x02,0x01,0x40,0x00,0x03,
+0x01,0x00,0x81,0x03,0x20,0x41,0x80,0x02,0x97,0x00,0x40,0x00,0x05,0x00,0x00,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x63,0x61,
+0x6c,0x6c,0x00,0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,0x00,0x00,0x3d,0x00,0x03,0x00,
+0x05,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x26,0x00,0x00,0x02,0x01,0x40,0x80,0x01,
+0x40,0x01,0x00,0x02,0x21,0x00,0x80,0x01,0x06,0x00,0x80,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x08,0x65,0x61,0x63,0x68,0x5f,0x6b,
+0x65,0x79,0x00,0x00,0x00,0x00,0x49,0x00,0x03,0x00,0x08,0x00,0x00,0x00,0x00,0x00,
+0x09,0x00,0x00,0x00,0x26,0x00,0x00,0x02,0x15,0x40,0x80,0x01,0x01,0x40,0x00,0x02,
+0xa0,0x00,0x80,0x01,0x06,0x00,0x00,0x02,0x01,0x40,0x80,0x02,0x01,0xc0,0x00,0x03,
+0x20,0x41,0x00,0x02,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x02,0x5b,0x5d,0x00,0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,0x00,0x00,0x41,0x00,
+0x01,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x06,0x00,0x80,0x00,
+0x91,0x00,0x00,0x01,0xa0,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x07,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x00,0x00,0x0a,
+0x45,0x6e,0x75,0x6d,0x65,0x72,0x61,0x62,0x6c,0x65,0x00,0x00,0x00,0x00,0x83,0x00,
+0x01,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,
+0x46,0x40,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x04,0x00,0x01,0x46,0x80,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,0x46,0xc0,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x08,0x00,0x01,0x46,0x00,0x81,0x00,0x04,0x02,0x80,0x00,0x29,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x01,0x60,0x00,0x00,0x04,0x6c,0x6f,
+0x6f,0x70,0x00,0x00,0x02,0x21,0x7e,0x00,0x00,0x08,0x5f,0x69,0x6e,0x73,0x70,0x65,
+0x63,0x74,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x00,0x00,
+0x77,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x26,0x00,0x00,0x02,
+0x06,0x00,0x80,0x01,0x91,0x00,0x00,0x02,0x3d,0x00,0x80,0x02,0xa0,0x80,0x00,0x02,
+0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x1a,0x62,
+0x61,0x63,0x6b,0x71,0x75,0x6f,0x74,0x65,0x73,0x20,0x6e,0x6f,0x74,0x20,0x69,0x6d,
+0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x65,0x64,0x00,0x00,0x00,0x03,0x00,0x05,0x72,
+0x61,0x69,0x73,0x65,0x00,0x00,0x13,0x4e,0x6f,0x74,0x49,0x6d,0x70,0x6c,0x65,0x6d,
+0x65,0x6e,0x74,0x65,0x64,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,0x6e,0x65,0x77,
+0x00,0x00,0x00,0x00,0xc7,0x00,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,
+0x26,0x00,0x00,0x00,0x9a,0x07,0x40,0x00,0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,
+0x99,0x00,0x40,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x00,0x01,0x04,0x01,0x80,0x01,
+0xa0,0x40,0x00,0x01,0x29,0x80,0x00,0x01,0x17,0x01,0x40,0x00,0x2b,0x00,0x00,0x01,
+0x20,0xc0,0x00,0x01,0x07,0x00,0x00,0x01,0x18,0xfe,0x3f,0x01,0x05,0x00,0x00,0x01,
+0x97,0x04,0x40,0x00,0x1b,0x00,0x00,0x01,0x11,0x02,0x80,0x01,0x01,0x80,0x00,0x02,
+0xa0,0x40,0x81,0x01,0x98,0x00,0xc0,0x01,0x17,0x01,0x40,0x00,0x05,0x00,0x00,0x01,
+0x17,0x01,0x40,0x00,0x1d,0x00,0x00,0x01,0x1c,0x00,0x80,0x00,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,
+0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,
+0x00,0x00,0x04,0x6c,0x6f,0x6f,0x70,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x0d,0x53,0x74,0x6f,0x70,0x49,0x74,0x65,0x72,0x61,0x74,0x69,0x6f,0x6e,0x00,0x00,
+0x03,0x3d,0x3d,0x3d,0x00,0x00,0x00,0x00,0x3b,0x00,0x03,0x00,0x06,0x00,0x00,0x00,
+0x00,0x00,0x06,0x00,0x26,0x00,0x00,0x02,0x06,0x00,0x80,0x01,0x01,0x40,0x00,0x02,
+0xa0,0x00,0x80,0x01,0x20,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x02,0x00,0x02,0x3d,0x7e,0x00,0x00,0x01,0x21,0x00,0x00,0x00,0x00,
+0x34,0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x26,0x00,0x00,0x00,
+0x06,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x07,0x69,0x6e,0x73,0x70,0x65,0x63,0x74,0x00,0x00,0x00,
+0x00,0x7a,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x07,0x26,0x00,0x08,0x00,
+0x06,0x00,0x80,0x01,0x91,0x00,0x00,0x02,0x3d,0x00,0x80,0x02,0xa0,0x80,0x00,0x02,
+0xa0,0x00,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x1d,0x66,
+0x69,0x62,0x65,0x72,0x20,0x72,0x65,0x71,0x75,0x69,0x72,0x65,0x64,0x20,0x66,0x6f,
+0x72,0x20,0x65,0x6e,0x75,0x6d,0x65,0x72,0x61,0x74,0x6f,0x72,0x00,0x00,0x00,0x03,
+0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x13,0x4e,0x6f,0x74,0x49,0x6d,0x70,
+0x6c,0x65,0x6d,0x65,0x6e,0x74,0x65,0x64,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,
+0x6e,0x65,0x77,0x00,0x00,0x00,0x00,0x79,0x00,0x01,0x00,0x04,0x00,0x03,0x00,0x00,
+0x00,0x0e,0x00,0x00,0x06,0x00,0x80,0x00,0x91,0x00,0x00,0x01,0xa0,0x00,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x80,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x02,0x00,0x01,0x46,0xc0,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x04,0x00,0x01,
+0x46,0x00,0x81,0x00,0x04,0x02,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x05,0x00,0x07,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x00,0x00,0x0a,
+0x43,0x6f,0x6d,0x70,0x61,0x72,0x61,0x62,0x6c,0x65,0x00,0x00,0x02,0x2b,0x40,0x00,
+0x00,0x02,0x2d,0x40,0x00,0x00,0x03,0x61,0x62,0x73,0x00,0x00,0x00,0x00,0x26,0x00,
+0x02,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x26,0x00,0x00,0x00,
+0x06,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x32,0x00,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,
+0x26,0x00,0x00,0x00,0x83,0xff,0x3f,0x01,0x06,0x00,0x80,0x01,0xae,0x00,0x00,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x2d,0x00,
+0x00,0x00,0x00,0x4b,0x00,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,
+0x26,0x00,0x00,0x00,0x06,0x00,0x00,0x01,0x83,0xff,0xbf,0x01,0xb3,0x00,0x00,0x01,
+0x99,0x01,0x40,0x01,0x06,0x00,0x00,0x01,0x20,0x40,0x00,0x01,0x97,0x00,0x40,0x00,
+0x06,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x01,0x3c,0x00,0x00,0x02,0x2d,0x40,0x00,0x00,0x00,0x00,0xae,0x00,0x01,0x00,
+0x04,0x00,0x05,0x00,0x00,0x00,0x16,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,
+0x46,0x00,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,
+0x48,0x00,0x80,0x00,0x04,0x01,0x00,0x01,0x84,0x00,0x80,0x01,0x05,0x00,0x00,0x02,
+0x20,0xc1,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x04,0x00,0x01,0x46,0x00,0x81,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,0x46,0x40,0x81,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x08,0x00,0x01,0x46,0x80,0x81,0x00,0x04,0x03,0x80,0x00,0x29,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x06,0x64,0x6f,0x77,0x6e,0x74,0x6f,
+0x00,0x00,0x04,0x6e,0x65,0x78,0x74,0x00,0x00,0x04,0x73,0x75,0x63,0x63,0x00,0x00,
+0x0c,0x61,0x6c,0x69,0x61,0x73,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x05,
+0x74,0x69,0x6d,0x65,0x73,0x00,0x00,0x04,0x75,0x70,0x74,0x6f,0x00,0x00,0x04,0x73,
+0x74,0x65,0x70,0x00,0x00,0x00,0x00,0xbb,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,
+0x00,0x1a,0x00,0x00,0xa6,0x00,0x00,0x02,0x06,0x00,0x00,0x02,0x20,0x00,0x00,0x02,
+0x99,0x00,0x40,0x02,0x97,0x02,0x40,0x00,0x06,0x00,0x00,0x02,0x04,0x01,0x80,0x02,
+0x01,0x40,0x00,0x03,0x20,0x41,0x00,0x02,0x29,0x00,0x00,0x02,0x06,0x00,0x00,0x02,
+0x20,0xc0,0x00,0x02,0x01,0x00,0x81,0x01,0x17,0x03,0x40,0x00,0x01,0x80,0x00,0x02,
+0x01,0xc0,0x80,0x02,0xa0,0x00,0x01,0x02,0x01,0xc0,0x00,0x02,0xaf,0x40,0x01,0x02,
+0x01,0x00,0x81,0x01,0x01,0xc0,0x00,0x02,0x01,0x40,0x80,0x02,0xb6,0x80,0x01,0x02,
+0x18,0xfb,0x3f,0x02,0x06,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x07,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,
+0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x06,0x64,
+0x6f,0x77,0x6e,0x74,0x6f,0x00,0x00,0x04,0x74,0x6f,0x5f,0x69,0x00,0x00,0x04,0x63,
+0x61,0x6c,0x6c,0x00,0x00,0x01,0x2d,0x00,0x00,0x02,0x3e,0x3d,0x00,0x00,0x00,0x00,
+0x2e,0x00,0x02,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x26,0x00,0x00,0x00,
+0x06,0x00,0x00,0x01,0xad,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x01,0x00,0x01,0x2b,0x00,0x00,0x00,0x00,0xa6,0x00,0x03,0x00,0x06,
+0x00,0x00,0x00,0x00,0x00,0x17,0x00,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x80,0x01,
+0x20,0x00,0x80,0x01,0x99,0x00,0xc0,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,
+0x04,0x01,0x00,0x02,0xa0,0x40,0x80,0x01,0x29,0x00,0x80,0x01,0x83,0xff,0x3f,0x01,
+0x17,0x03,0x40,0x00,0x01,0x40,0x80,0x01,0x01,0x80,0x00,0x02,0xa0,0xc0,0x80,0x01,
+0x01,0x80,0x80,0x01,0xad,0x00,0x81,0x01,0x01,0xc0,0x00,0x01,0x01,0x80,0x80,0x01,
+0x06,0x00,0x00,0x02,0xb3,0x40,0x81,0x01,0x18,0xfb,0xbf,0x01,0x06,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x0c,0x62,0x6c,
+0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,
+0x65,0x6e,0x75,0x6d,0x00,0x00,0x05,0x74,0x69,0x6d,0x65,0x73,0x00,0x00,0x04,0x63,
+0x61,0x6c,0x6c,0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x3c,0x00,0x00,0x00,0x00,0xb9,
+0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x1a,0x00,0x00,0xa6,0x00,0x00,0x02,
+0x06,0x00,0x00,0x02,0x20,0x00,0x00,0x02,0x99,0x00,0x40,0x02,0x97,0x02,0x40,0x00,
+0x06,0x00,0x00,0x02,0x04,0x01,0x80,0x02,0x01,0x40,0x00,0x03,0x20,0x41,0x00,0x02,
+0x29,0x00,0x00,0x02,0x06,0x00,0x00,0x02,0x20,0xc0,0x00,0x02,0x01,0x00,0x81,0x01,
+0x17,0x03,0x40,0x00,0x01,0x80,0x00,0x02,0x01,0xc0,0x80,0x02,0xa0,0x00,0x01,0x02,
+0x01,0xc0,0x00,0x02,0xad,0x40,0x01,0x02,0x01,0x00,0x81,0x01,0x01,0xc0,0x00,0x02,
+0x01,0x40,0x80,0x02,0xb4,0x80,0x01,0x02,0x18,0xfb,0x3f,0x02,0x06,0x00,0x00,0x02,
+0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x0c,0x62,0x6c,
+0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,
+0x65,0x6e,0x75,0x6d,0x00,0x00,0x04,0x75,0x70,0x74,0x6f,0x00,0x00,0x04,0x74,0x6f,
+0x5f,0x69,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x01,0x2b,0x00,0x00,0x02,
+0x3c,0x3d,0x00,0x00,0x00,0x00,0xf8,0x00,0x05,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,
+0x25,0x00,0x00,0x00,0xa6,0x00,0x10,0x02,0x97,0x00,0x40,0x00,0x97,0x00,0x40,0x00,
+0x03,0x00,0x40,0x01,0x06,0x00,0x80,0x02,0x20,0x00,0x80,0x02,0x99,0x00,0xc0,0x02,
+0x17,0x03,0x40,0x00,0x06,0x00,0x80,0x02,0x04,0x01,0x00,0x03,0x01,0x40,0x80,0x03,
+0x01,0x80,0x00,0x04,0xa0,0x41,0x80,0x02,0x29,0x00,0x80,0x02,0x01,0x40,0x80,0x02,
+0x11,0x02,0x00,0x03,0xa0,0xc0,0x80,0x02,0x99,0x01,0xc0,0x02,0x06,0x00,0x80,0x02,
+0x20,0x40,0x81,0x02,0x97,0x00,0x40,0x00,0x06,0x00,0x80,0x02,0x01,0x40,0x01,0x02,
+0x97,0x03,0x40,0x00,0x01,0xc0,0x80,0x02,0x01,0x00,0x01,0x03,0xa0,0x80,0x81,0x02,
+0x01,0x00,0x81,0x02,0x01,0x80,0x00,0x03,0xac,0xc0,0x81,0x02,0x01,0x40,0x01,0x02,
+0x01,0x00,0x81,0x02,0x01,0x40,0x00,0x03,0xb4,0x00,0x82,0x02,0x98,0xfa,0xbf,0x02,
+0x06,0x00,0x80,0x02,0x29,0x00,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,
+0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,0x6e,0x3f,0x00,0x00,
+0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x04,0x73,0x74,0x65,0x70,0x00,
+0x00,0x08,0x6b,0x69,0x6e,0x64,0x5f,0x6f,0x66,0x3f,0x00,0x00,0x05,0x46,0x6c,0x6f,
+0x61,0x74,0x00,0x00,0x04,0x74,0x6f,0x5f,0x66,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,
+0x00,0x00,0x01,0x2b,0x00,0x00,0x02,0x3c,0x3d,0x00,0x00,0x00,0x00,0xb0,0x00,0x01,
+0x00,0x04,0x00,0x02,0x00,0x00,0x00,0x14,0x06,0x00,0x80,0x00,0x91,0x00,0x00,0x01,
+0xa0,0x00,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x80,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0xc0,0x80,0x00,0x48,0x00,0x80,0x00,
+0x04,0x02,0x00,0x01,0x84,0x01,0x80,0x01,0x05,0x00,0x00,0x02,0x20,0x41,0x81,0x00,
+0x48,0x00,0x80,0x00,0x04,0x03,0x00,0x01,0x84,0x01,0x80,0x01,0x05,0x00,0x00,0x02,
+0x20,0x41,0x81,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,
+0x00,0x07,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x00,0x00,0x08,0x49,0x6e,0x74,0x65,
+0x67,0x72,0x61,0x6c,0x00,0x00,0x04,0x63,0x65,0x69,0x6c,0x00,0x00,0x05,0x66,0x6c,
+0x6f,0x6f,0x72,0x00,0x00,0x05,0x72,0x6f,0x75,0x6e,0x64,0x00,0x00,0x0c,0x61,0x6c,
+0x69,0x61,0x73,0x5f,0x6d,0x65,0x74,0x68,0x6f,0x64,0x00,0x00,0x08,0x74,0x72,0x75,
+0x6e,0x63,0x61,0x74,0x65,0x00,0x00,0x00,0x00,0x26,0x00,0x02,0x00,0x03,0x00,0x00,
+0x00,0x00,0x00,0x03,0x26,0x00,0x00,0x00,0x06,0x00,0x00,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x00,0x02,0x00,0x03,
+0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x26,0x00,0x00,0x00,0x06,0x00,0x00,0x01,
+0x29,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,
+0x00,0x01,0x00,0x04,0x00,0x02,0x00,0x00,0x00,0x0b,0x00,0x00,0x06,0x00,0x80,0x00,
+0x91,0x00,0x00,0x01,0xa0,0x00,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,
+0x46,0x80,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x02,0x00,0x01,0x46,0xc0,0x80,0x00,
+0x84,0x01,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+0x00,0x07,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x00,0x00,0x08,0x49,0x6e,0x74,0x65,
+0x67,0x72,0x61,0x6c,0x00,0x00,0x02,0x3e,0x3e,0x00,0x00,0x02,0x3c,0x3c,0x00,0x00,
+0x00,0x00,0x4d,0x00,0x04,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x09,0x00,0x00,0x00,
+0x26,0x00,0x00,0x02,0x06,0x00,0x00,0x02,0x20,0x00,0x00,0x02,0x01,0x00,0x81,0x01,
+0x01,0x40,0x00,0x02,0x20,0x00,0x00,0x02,0x40,0x01,0x80,0x02,0x21,0x40,0x00,0x02,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x74,0x6f,
+0x5f,0x69,0x00,0x00,0x05,0x74,0x69,0x6d,0x65,0x73,0x00,0x00,0x00,0x00,0x32,0x00,
+0x01,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x15,0xc0,0x80,0x00,
+0x83,0x00,0x40,0x01,0xb1,0x00,0x80,0x00,0x16,0xc0,0x80,0x00,0x29,0x00,0x80,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x2f,0x00,0x00,0x00,0x00,0x55,
+0x00,0x04,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x0b,0x00,0x00,0x26,0x00,0x00,0x02,
+0x06,0x00,0x00,0x02,0x20,0x00,0x00,0x02,0x01,0x00,0x81,0x01,0x01,0x40,0x00,0x02,
+0x20,0x00,0x00,0x02,0x40,0x01,0x80,0x02,0x21,0x40,0x00,0x02,0x01,0xc0,0x00,0x02,
+0x20,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+0x00,0x04,0x74,0x6f,0x5f,0x69,0x00,0x00,0x05,0x74,0x69,0x6d,0x65,0x73,0x00,0x00,
+0x00,0x00,0x32,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,
+0x15,0xc0,0x80,0x00,0x83,0x00,0x40,0x01,0xb0,0x00,0x80,0x00,0x16,0xc0,0x80,0x00,
+0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x2a,0x00,
+0x00,0x00,0x00,0x48,0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x00,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x02,0x00,0x01,0x46,0x40,0x80,0x00,0x84,0x00,0x80,0x00,0x29,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x65,0x61,0x63,0x68,0x00,0x00,
+0x04,0x68,0x61,0x73,0x68,0x00,0x00,0x00,0x02,0x2f,0x00,0x06,0x00,0x0a,0x00,0x00,
+0x00,0x00,0x00,0x5a,0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x03,0x20,0x00,0x00,0x03,
+0x99,0x00,0x40,0x03,0x17,0x02,0x40,0x00,0x06,0x00,0x00,0x03,0x04,0x01,0x80,0x03,
+0xa0,0x40,0x00,0x03,0x29,0x00,0x00,0x03,0x06,0x00,0x00,0x03,0x20,0xc0,0x00,0x03,
+0x01,0x80,0x01,0x01,0x06,0x00,0x00,0x03,0x20,0x00,0x01,0x03,0x01,0x80,0x81,0x01,
+0x01,0x80,0x00,0x03,0x11,0x03,0x80,0x03,0xa0,0x40,0x01,0x03,0x99,0x01,0x40,0x03,
+0x01,0xc0,0x00,0x03,0x11,0x03,0x80,0x03,0xa0,0x40,0x01,0x03,0x19,0x0b,0x40,0x03,
+0x01,0xc0,0x00,0x02,0x06,0x00,0x00,0x03,0x20,0xc0,0x01,0x03,0x99,0x00,0x40,0x03,
+0x97,0x01,0x40,0x00,0x01,0x00,0x01,0x03,0xad,0x00,0x02,0x03,0x01,0x80,0x01,0x02,
+0x01,0x80,0x80,0x02,0x17,0x03,0x40,0x00,0x01,0x40,0x00,0x03,0x01,0x40,0x81,0x03,
+0xa0,0x40,0x02,0x03,0x01,0x40,0x01,0x03,0xad,0x00,0x02,0x03,0x01,0x80,0x81,0x02,
+0x01,0x40,0x01,0x03,0x01,0x00,0x81,0x03,0xb3,0x80,0x02,0x03,0x18,0xfb,0x3f,0x03,
+0x06,0x00,0x00,0x03,0x29,0x00,0x00,0x03,0x01,0x80,0x00,0x03,0x04,0x06,0x80,0x03,
+0xa0,0xc0,0x02,0x03,0x99,0x00,0x40,0x03,0x17,0x02,0x40,0x00,0x06,0x00,0x00,0x03,
+0x11,0x07,0x80,0x03,0x3d,0x00,0x00,0x04,0x20,0x41,0x03,0x03,0x01,0x80,0x00,0x03,
+0x01,0xc0,0x80,0x03,0xa0,0xc0,0x03,0x03,0x83,0xff,0xbf,0x03,0xb5,0x00,0x04,0x03,
+0x19,0x01,0x40,0x03,0x06,0x00,0x00,0x03,0x29,0x00,0x00,0x03,0x17,0x03,0x40,0x00,
+0x01,0x40,0x00,0x03,0x01,0x80,0x80,0x03,0xa0,0x40,0x02,0x03,0x01,0x80,0x00,0x03,
+0x20,0x00,0x03,0x03,0x01,0x80,0x01,0x01,0x01,0x80,0x00,0x03,0x01,0xc0,0x80,0x03,
+0xa0,0xc0,0x03,0x03,0x83,0xff,0xbf,0x03,0xb3,0x80,0x02,0x03,0x18,0xfa,0x3f,0x03,
+0x06,0x00,0x00,0x03,0x20,0xc0,0x01,0x03,0x20,0x40,0x04,0x03,0x99,0x02,0x40,0x03,
+0x01,0x80,0x00,0x03,0x01,0xc0,0x80,0x03,0xa0,0xc0,0x03,0x03,0x83,0xff,0xbf,0x03,
+0xb2,0x80,0x04,0x03,0x99,0x01,0x40,0x03,0x01,0x40,0x00,0x03,0x01,0x80,0x80,0x03,
+0xa0,0x40,0x02,0x03,0x06,0x00,0x00,0x03,0x29,0x00,0x00,0x03,0x00,0x00,0x00,0x01,
+0x00,0x00,0x0d,0x63,0x61,0x6e,0x27,0x74,0x20,0x69,0x74,0x65,0x72,0x61,0x74,0x65,
+0x00,0x00,0x00,0x13,0x00,0x0c,0x62,0x6c,0x6f,0x63,0x6b,0x5f,0x67,0x69,0x76,0x65,
+0x6e,0x3f,0x00,0x00,0x07,0x74,0x6f,0x5f,0x65,0x6e,0x75,0x6d,0x00,0x00,0x04,0x65,
+0x61,0x63,0x68,0x00,0x00,0x05,0x66,0x69,0x72,0x73,0x74,0x00,0x00,0x04,0x6c,0x61,
+0x73,0x74,0x00,0x00,0x08,0x6b,0x69,0x6e,0x64,0x5f,0x6f,0x66,0x3f,0x00,0x00,0x06,
+0x46,0x69,0x78,0x6e,0x75,0x6d,0x00,0x00,0x0c,0x65,0x78,0x63,0x6c,0x75,0x64,0x65,
+0x5f,0x65,0x6e,0x64,0x3f,0x00,0x00,0x01,0x2b,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,
+0x00,0x00,0x01,0x3c,0x00,0x00,0x0b,0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x5f,0x74,
+0x6f,0x3f,0x00,0x00,0x04,0x73,0x75,0x63,0x63,0x00,0x00,0x05,0x72,0x61,0x69,0x73,
+0x65,0x00,0x00,0x09,0x54,0x79,0x70,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x03,
+0x3c,0x3d,0x3e,0x00,0x00,0x01,0x3e,0x00,0x00,0x01,0x21,0x00,0x00,0x02,0x3d,0x3d,
+0x00,0x00,0x00,0x00,0x87,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x10,0x00,
+0x26,0x00,0x00,0x00,0x06,0x00,0x80,0x01,0x20,0x00,0x80,0x01,0x20,0x40,0x80,0x01,
+0x06,0x00,0x00,0x02,0x20,0xc0,0x00,0x02,0x20,0x40,0x00,0x02,0xa0,0x80,0x80,0x01,
+0x01,0xc0,0x00,0x01,0x06,0x00,0x80,0x01,0x20,0x00,0x81,0x01,0x99,0x01,0xc0,0x01,
+0x01,0x80,0x80,0x01,0xad,0x40,0x81,0x01,0x01,0xc0,0x00,0x01,0x29,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x05,0x66,0x69,0x72,0x73,0x74,0x00,
+0x00,0x04,0x68,0x61,0x73,0x68,0x00,0x00,0x01,0x5e,0x00,0x00,0x04,0x6c,0x61,0x73,
+0x74,0x00,0x00,0x0c,0x65,0x78,0x63,0x6c,0x75,0x64,0x65,0x5f,0x65,0x6e,0x64,0x3f,
+0x00,0x00,0x01,0x2b,0x00,0x00,0x00,0x00,0x41,0x00,0x01,0x00,0x04,0x00,0x00,0x00,
+0x00,0x00,0x04,0x00,0x06,0x00,0x80,0x00,0x91,0x00,0x00,0x01,0xa0,0x00,0x80,0x00,
+0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x07,0x69,0x6e,
+0x63,0x6c,0x75,0x64,0x65,0x00,0x00,0x0a,0x45,0x6e,0x75,0x6d,0x65,0x72,0x61,0x62,
+0x6c,0x65,0x00,0x00,0x00,0x01,0x23,0x00,0x01,0x00,0x04,0x00,0x0b,0x00,0x00,0x00,
+0x26,0x00,0x00,0x00,0x06,0x00,0x80,0x00,0x91,0x00,0x00,0x01,0xa0,0x00,0x80,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x00,0x00,0x01,0x46,0x80,0x80,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x02,0x00,0x01,0x46,0xc0,0x80,0x00,0x48,0x00,0x80,0x00,0xc0,0x04,0x00,0x01,
+0x46,0x00,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x06,0x00,0x01,0x46,0x40,0x81,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x08,0x00,0x01,0x46,0x80,0x81,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x0a,0x00,0x01,0x46,0xc0,0x81,0x00,0x48,0x00,0x80,0x00,0xc0,0x0c,0x00,0x01,
+0x46,0x00,0x82,0x00,0x48,0x00,0x80,0x00,0xc0,0x0e,0x00,0x01,0x46,0x40,0x82,0x00,
+0x48,0x00,0x80,0x00,0xc0,0x10,0x00,0x01,0x46,0x80,0x82,0x00,0x48,0x00,0x80,0x00,
+0xc0,0x12,0x00,0x01,0x46,0xc0,0x82,0x00,0x48,0x00,0x80,0x00,0xc0,0x14,0x00,0x01,
+0x46,0x00,0x83,0x00,0x04,0x06,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x0d,0x00,0x07,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x00,0x00,0x0a,
+0x43,0x6f,0x6d,0x70,0x61,0x72,0x61,0x62,0x6c,0x65,0x00,0x00,0x09,0x65,0x61,0x63,
+0x68,0x5f,0x6c,0x69,0x6e,0x65,0x00,0x00,0x04,0x67,0x73,0x75,0x62,0x00,0x00,0x05,
+0x67,0x73,0x75,0x62,0x21,0x00,0x00,0x04,0x73,0x63,0x61,0x6e,0x00,0x00,0x03,0x73,
+0x75,0x62,0x00,0x00,0x04,0x73,0x75,0x62,0x21,0x00,0x00,0x09,0x65,0x61,0x63,0x68,
+0x5f,0x63,0x68,0x61,0x72,0x00,0x00,0x09,0x65,0x61,0x63,0x68,0x5f,0x62,0x79,0x74,
+0x65,0x00,0x00,0x03,0x5b,0x5d,0x3d,0x00,0x00,0x02,0x3d,0x7e,0x00,0x00,0x05,0x6d,
+0x61,0x74,0x63,0x68,0x00,0x00,0x00,0x00,0xd5,0x00,0x04,0x00,0x0a,0x00,0x00,0x00,
+0x00,0x00,0x25,0x00,0xa6,0x00,0x00,0x00,0x83,0xff,0x3f,0x01,0x17,0x06,0x40,0x00,
+0x01,0x40,0x00,0x02,0x06,0x00,0x80,0x02,0x01,0x80,0x00,0x03,0x01,0xc0,0x80,0x03,
+0xad,0x80,0x80,0x03,0x01,0x80,0x00,0x04,0xae,0xc0,0x80,0x03,0x20,0x41,0x80,0x02,
+0xa0,0x00,0x00,0x02,0x01,0xc0,0x00,0x02,0xad,0x80,0x00,0x02,0x01,0x00,0x01,0x01,
+0x06,0x00,0x00,0x02,0x83,0x04,0xc0,0x02,0x01,0x80,0x00,0x03,0x20,0x01,0x01,0x02,
+0x01,0x00,0x81,0x01,0x18,0xf7,0x3f,0x02,0x06,0x00,0x00,0x02,0x20,0x40,0x01,0x02,
+0x01,0x80,0x80,0x02,0xb5,0x80,0x01,0x02,0x99,0x04,0x40,0x02,0x01,0x40,0x00,0x02,
+0x06,0x00,0x80,0x02,0x01,0x80,0x00,0x03,0x06,0x00,0x80,0x03,0x20,0x40,0x81,0x03,
+0x01,0x80,0x00,0x04,0xae,0xc0,0x80,0x03,0x20,0x41,0x80,0x02,0xa0,0x00,0x00,0x02,
+0x06,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,
+0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x01,0x2b,0x00,
+0x00,0x01,0x2d,0x00,0x00,0x05,0x69,0x6e,0x64,0x65,0x78,0x00,0x00,0x04,0x73,0x69,
+0x7a,0x65,0x00,0x00,0x01,0x3e,0x00,0x00,0x00,0x01,0x1d,0x00,0x03,0x00,0x08,0x00,
+0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0xa6,0x00,0x08,0x00,0x01,0x40,0x80,0x01,
+0x20,0x00,0x80,0x01,0x83,0x00,0x40,0x02,0xb2,0x40,0x80,0x01,0x99,0x05,0xc0,0x01,
+0x06,0x00,0x80,0x01,0x01,0x40,0x00,0x02,0x83,0xff,0xbf,0x02,0xa0,0xc0,0x00,0x02,
+0x03,0xff,0xbf,0x02,0x20,0x81,0x80,0x01,0x01,0x40,0x00,0x02,0x03,0x00,0xc0,0x02,
+0xa0,0xc0,0x00,0x02,0xa0,0x00,0x81,0x01,0x17,0x0c,0x40,0x00,0x01,0x40,0x80,0x01,
+0x20,0x00,0x80,0x01,0x03,0x00,0x40,0x02,0xb2,0x40,0x80,0x01,0x99,0x00,0xc0,0x01,
+0x01,0x80,0x80,0x01,0x99,0x06,0xc0,0x01,0x06,0x00,0x80,0x01,0x01,0x40,0x00,0x02,
+0x83,0xff,0xbf,0x02,0xa0,0xc0,0x00,0x02,0x03,0xff,0xbf,0x02,0x20,0x81,0x80,0x01,
+0x01,0x80,0x00,0x02,0x01,0x40,0x80,0x02,0x83,0xff,0x3f,0x03,0xa0,0xc0,0x80,0x02,
+0xa0,0x40,0x01,0x02,0xa0,0x00,0x81,0x01,0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,
+0x91,0x03,0x00,0x02,0x3d,0x00,0x80,0x02,0x20,0x81,0x81,0x01,0x29,0x00,0x80,0x01,
+0x00,0x00,0x00,0x01,0x00,0x00,0x19,0x77,0x72,0x6f,0x6e,0x67,0x20,0x6e,0x75,0x6d,
+0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x73,
+0x00,0x00,0x00,0x08,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x02,0x3d,0x3d,0x00,
+0x00,0x05,0x73,0x70,0x6c,0x69,0x74,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x04,0x6a,
+0x6f,0x69,0x6e,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,0x05,0x72,0x61,0x69,
+0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,0x74,0x45,0x72,0x72,
+0x6f,0x72,0x00,0x00,0x00,0x00,0x78,0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x00,
+0x12,0x00,0x00,0x00,0xa6,0x00,0x08,0x00,0x06,0x00,0x00,0x02,0x37,0x40,0x81,0x02,
+0x01,0x40,0x00,0x03,0x38,0x80,0x81,0x02,0x01,0x80,0x00,0x03,0xa1,0x3f,0x00,0x02,
+0x01,0x00,0x81,0x01,0x06,0x00,0x80,0x02,0xa0,0x40,0x00,0x02,0x99,0x02,0x40,0x02,
+0x06,0x00,0x00,0x02,0x01,0xc0,0x80,0x02,0xa0,0x80,0x00,0x02,0x06,0x00,0x00,0x02,
+0x97,0x00,0x40,0x00,0x05,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x03,0x00,0x04,0x67,0x73,0x75,0x62,0x00,0x00,0x02,0x21,0x3d,0x00,
+0x00,0x07,0x72,0x65,0x70,0x6c,0x61,0x63,0x65,0x00,0x00,0x00,0x00,0xa6,0x00,0x03,
+0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x0c,0xa6,0x00,0x00,0x02,0x11,0x00,0x80,0x01,
+0x04,0x01,0x00,0x02,0xa0,0x40,0x80,0x01,0x19,0x01,0xc0,0x01,0x05,0x00,0x80,0x01,
+0x17,0x02,0x40,0x00,0x06,0x00,0x80,0x01,0x11,0x02,0x00,0x02,0x3d,0x00,0x80,0x02,
+0x20,0xc1,0x80,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x18,0x73,
+0x63,0x61,0x6e,0x20,0x6e,0x6f,0x74,0x20,0x61,0x76,0x61,0x69,0x6c,0x61,0x62,0x6c,
+0x65,0x20,0x28,0x79,0x65,0x74,0x29,0x00,0x00,0x00,0x05,0x00,0x06,0x4f,0x62,0x6a,
+0x65,0x63,0x74,0x00,0x00,0x0e,0x63,0x6f,0x6e,0x73,0x74,0x5f,0x64,0x65,0x66,0x69,
+0x6e,0x65,0x64,0x3f,0x00,0x00,0x06,0x52,0x65,0x67,0x65,0x78,0x70,0x00,0x00,0x05,
+0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x13,0x4e,0x6f,0x74,0x49,0x6d,0x70,0x6c,0x65,
+0x6d,0x65,0x6e,0x74,0x65,0x64,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x00,0x01,0x1d,
+0x00,0x03,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0xa6,0x00,0x08,0x00,
+0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,0x83,0x00,0x40,0x02,0xb2,0x40,0x80,0x01,
+0x99,0x05,0xc0,0x01,0x06,0x00,0x80,0x01,0x01,0x40,0x00,0x02,0x83,0xff,0xbf,0x02,
+0xa0,0xc0,0x00,0x02,0x83,0x00,0xc0,0x02,0x20,0x81,0x80,0x01,0x01,0x40,0x00,0x02,
+0x03,0x00,0xc0,0x02,0xa0,0xc0,0x00,0x02,0xa0,0x00,0x81,0x01,0x17,0x0c,0x40,0x00,
+0x01,0x40,0x80,0x01,0x20,0x00,0x80,0x01,0x03,0x00,0x40,0x02,0xb2,0x40,0x80,0x01,
+0x99,0x00,0xc0,0x01,0x01,0x80,0x80,0x01,0x99,0x06,0xc0,0x01,0x06,0x00,0x80,0x01,
+0x01,0x40,0x00,0x02,0x83,0xff,0xbf,0x02,0xa0,0xc0,0x00,0x02,0x83,0x00,0xc0,0x02,
+0x20,0x81,0x80,0x01,0x01,0x80,0x00,0x02,0x01,0x40,0x80,0x02,0x83,0xff,0x3f,0x03,
+0xa0,0xc0,0x80,0x02,0xa0,0x40,0x01,0x02,0xa0,0x00,0x81,0x01,0x17,0x02,0x40,0x00,
+0x06,0x00,0x80,0x01,0x91,0x03,0x00,0x02,0x3d,0x00,0x80,0x02,0x20,0x81,0x81,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x19,0x77,0x72,0x6f,0x6e,0x67,
+0x20,0x6e,0x75,0x6d,0x62,0x65,0x72,0x20,0x6f,0x66,0x20,0x61,0x72,0x67,0x75,0x6d,
+0x65,0x6e,0x74,0x73,0x00,0x00,0x00,0x08,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,
+0x02,0x3d,0x3d,0x00,0x00,0x05,0x73,0x70,0x6c,0x69,0x74,0x00,0x00,0x02,0x5b,0x5d,
+0x00,0x00,0x04,0x6a,0x6f,0x69,0x6e,0x00,0x00,0x04,0x63,0x61,0x6c,0x6c,0x00,0x00,
+0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x0d,0x41,0x72,0x67,0x75,0x6d,0x65,0x6e,
+0x74,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x00,0x00,0x77,0x00,0x04,0x00,0x07,0x00,
+0x00,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0xa6,0x00,0x08,0x00,0x06,0x00,0x00,0x02,
+0x37,0x40,0x81,0x02,0x01,0x40,0x00,0x03,0x38,0x80,0x81,0x02,0x01,0x80,0x00,0x03,
+0xa1,0x3f,0x00,0x02,0x01,0x00,0x81,0x01,0x06,0x00,0x80,0x02,0xa0,0x40,0x00,0x02,
+0x99,0x02,0x40,0x02,0x06,0x00,0x00,0x02,0x01,0xc0,0x80,0x02,0xa0,0x80,0x00,0x02,
+0x06,0x00,0x00,0x02,0x97,0x00,0x40,0x00,0x05,0x00,0x00,0x02,0x29,0x00,0x00,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x03,0x73,0x75,0x62,0x00,0x00,0x02,
+0x21,0x3d,0x00,0x00,0x07,0x72,0x65,0x70,0x6c,0x61,0x63,0x65,0x00,0x00,0x00,0x00,
+0x7d,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0xa6,0x00,0x00,0x00,
+0x83,0xff,0x3f,0x01,0x17,0x04,0x40,0x00,0x01,0x40,0x80,0x01,0x06,0x00,0x00,0x02,
+0x01,0x80,0x80,0x02,0xa0,0x40,0x00,0x02,0xa0,0x00,0x80,0x01,0x01,0x80,0x80,0x01,
+0xad,0x80,0x80,0x01,0x01,0xc0,0x00,0x01,0x01,0x80,0x80,0x01,0x06,0x00,0x00,0x02,
+0x20,0x00,0x01,0x02,0xb3,0xc0,0x80,0x01,0x98,0xf9,0xbf,0x01,0x06,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x04,0x63,0x61,
+0x6c,0x6c,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x3c,0x00,
+0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x00,0x00,0x91,0x00,0x04,0x00,0x08,0x00,
+0x00,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x06,0x00,0x00,0x02,
+0x20,0x00,0x00,0x02,0x01,0x00,0x01,0x01,0x83,0xff,0xbf,0x01,0x17,0x04,0x40,0x00,
+0x01,0x40,0x00,0x02,0x01,0x80,0x80,0x02,0x01,0xc0,0x00,0x03,0xa0,0x80,0x80,0x02,
+0xa0,0x40,0x00,0x02,0x01,0xc0,0x00,0x02,0xad,0xc0,0x00,0x02,0x01,0x00,0x81,0x01,
+0x01,0xc0,0x00,0x02,0x01,0x80,0x80,0x02,0x20,0x40,0x81,0x02,0xb3,0x00,0x01,0x02,
+0x98,0xf9,0x3f,0x02,0x06,0x00,0x00,0x02,0x29,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x06,0x00,0x05,0x62,0x79,0x74,0x65,0x73,0x00,0x00,0x04,0x63,0x61,
+0x6c,0x6c,0x00,0x00,0x02,0x5b,0x5d,0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x3c,0x00,
+0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x00,0x00,0x00,0x8f,0x00,0x06,0x00,0x0a,0x00,
+0x00,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x26,0x00,0x00,0x04,0x06,0x00,0x00,0x03,
+0x83,0xff,0xbf,0x03,0x01,0x40,0x00,0x04,0x20,0x01,0x00,0x03,0x01,0x80,0x01,0x02,
+0x06,0x00,0x00,0x03,0x01,0x40,0x80,0x03,0xad,0x40,0x80,0x03,0x03,0xff,0x3f,0x04,
+0x41,0xc0,0x81,0x03,0xa0,0x00,0x00,0x03,0x01,0x80,0x81,0x02,0x06,0x00,0x00,0x03,
+0x01,0x00,0x81,0x03,0x01,0x80,0x00,0x04,0x01,0x40,0x81,0x04,0xb7,0xc1,0x81,0x03,
+0x3d,0x00,0x00,0x04,0xa0,0xc0,0x80,0x03,0xa0,0x80,0x00,0x03,0x29,0x00,0x00,0x03,
+0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x5b,0x5d,0x00,
+0x00,0x01,0x2b,0x00,0x00,0x07,0x72,0x65,0x70,0x6c,0x61,0x63,0x65,0x00,0x00,0x04,
+0x6a,0x6f,0x69,0x6e,0x00,0x00,0x00,0x00,0x9c,0x00,0x03,0x00,0x07,0x00,0x00,0x00,
+0x00,0x00,0x0d,0x00,0x26,0x00,0x00,0x02,0x01,0x40,0x80,0x01,0x84,0x00,0x00,0x02,
+0xa0,0x00,0x80,0x01,0x19,0x02,0xc0,0x01,0x06,0x00,0x80,0x01,0x91,0x01,0x00,0x02,
+0x3d,0x00,0x80,0x02,0x20,0x81,0x80,0x01,0x01,0x40,0x80,0x01,0x06,0x00,0x00,0x02,
+0xa0,0x00,0x81,0x01,0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x1b,0x74,
+0x79,0x70,0x65,0x20,0x6d,0x69,0x73,0x6d,0x61,0x74,0x63,0x68,0x3a,0x20,0x53,0x74,
+0x72,0x69,0x6e,0x67,0x20,0x67,0x69,0x76,0x65,0x6e,0x00,0x00,0x00,0x05,0x00,0x0b,
+0x72,0x65,0x73,0x70,0x6f,0x6e,0x64,0x5f,0x74,0x6f,0x3f,0x00,0x00,0x06,0x74,0x6f,
+0x5f,0x73,0x74,0x72,0x00,0x00,0x05,0x72,0x61,0x69,0x73,0x65,0x00,0x00,0x09,0x54,
+0x79,0x70,0x65,0x45,0x72,0x72,0x6f,0x72,0x00,0x00,0x02,0x3d,0x7e,0x00,0x00,0x00,
+0x00,0x3a,0x00,0x03,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x06,0xa6,0x00,0x00,0x02,
+0x01,0x40,0x80,0x01,0x06,0x00,0x00,0x02,0x01,0x80,0x80,0x02,0xa1,0x00,0x80,0x01,
+0x29,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x05,0x6d,0x61,
+0x74,0x63,0x68,0x00,0x00,0x00,0x00,0x22,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x02,0x00,0x00,0x05,0x00,0x80,0x00,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x00,
+0x00,0x04,0x00,0x00,0x06,0x00,0x80,0x00,0x91,0x00,0x00,0x01,0xa0,0x00,0x80,0x00,
+0x29,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x07,0x69,0x6e,
+0x63,0x6c,0x75,0x64,0x65,0x00,0x00,0x0a,0x43,0x6f,0x6d,0x70,0x61,0x72,0x61,0x62,
+0x6c,0x65,0x00,0x4c,0x56,0x41,0x52,0x00,0x00,0x05,0xef,0x00,0x00,0x00,0x3c,0x00,
+0x05,0x62,0x6c,0x6f,0x63,0x6b,0x00,0x03,0x69,0x64,0x78,0x00,0x06,0x6c,0x65,0x6e,
+0x67,0x74,0x68,0x00,0x03,0x65,0x6c,0x6d,0x00,0x04,0x73,0x69,0x7a,0x65,0x00,0x03,
+0x6f,0x62,0x6a,0x00,0x01,0x78,0x00,0x05,0x6f,0x74,0x68,0x65,0x72,0x00,0x03,0x6c,
+0x65,0x6e,0x00,0x01,0x69,0x00,0x01,0x6e,0x00,0x03,0x6b,0x65,0x79,0x00,0x03,0x72,
+0x65,0x74,0x00,0x05,0x6e,0x61,0x6d,0x65,0x73,0x00,0x04,0x6e,0x61,0x6d,0x65,0x00,
+0x03,0x63,0x6d,0x70,0x00,0x03,0x6d,0x69,0x6e,0x00,0x03,0x6d,0x61,0x78,0x00,0x03,
+0x76,0x61,0x6c,0x00,0x03,0x61,0x72,0x79,0x00,0x06,0x69,0x66,0x6e,0x6f,0x6e,0x65,
+0x00,0x07,0x70,0x61,0x74,0x74,0x65,0x72,0x6e,0x00,0x02,0x73,0x76,0x00,0x04,0x61,
+0x72,0x67,0x73,0x00,0x03,0x73,0x79,0x6d,0x00,0x04,0x66,0x6c,0x61,0x67,0x00,0x06,
+0x72,0x65,0x73,0x75,0x6c,0x74,0x00,0x01,0x79,0x00,0x05,0x61,0x72,0x79,0x5f,0x54,
+0x00,0x05,0x61,0x72,0x79,0x5f,0x46,0x00,0x06,0x73,0x6f,0x72,0x74,0x65,0x64,0x00,
+0x04,0x77,0x6f,0x72,0x6b,0x00,0x07,0x73,0x72,0x63,0x5f,0x61,0x72,0x79,0x00,0x04,
+0x68,0x65,0x61,0x64,0x00,0x04,0x74,0x61,0x69,0x6c,0x00,0x03,0x73,0x72,0x63,0x00,
+0x03,0x64,0x73,0x74,0x00,0x01,0x6a,0x00,0x01,0x68,0x00,0x01,0x65,0x00,0x07,0x6d,
+0x65,0x73,0x73,0x61,0x67,0x65,0x00,0x04,0x68,0x61,0x73,0x68,0x00,0x01,0x6b,0x00,
+0x01,0x76,0x00,0x04,0x6b,0x65,0x79,0x73,0x00,0x04,0x76,0x61,0x6c,0x73,0x00,0x01,
+0x62,0x00,0x01,0x73,0x00,0x01,0x61,0x00,0x03,0x6e,0x75,0x6d,0x00,0x04,0x73,0x74,
+0x65,0x70,0x00,0x04,0x6c,0x61,0x73,0x74,0x00,0x03,0x6c,0x69,0x6d,0x00,0x06,0x6f,
+0x66,0x66,0x73,0x65,0x74,0x00,0x03,0x70,0x6f,0x73,0x00,0x03,0x73,0x74,0x72,0x00,
+0x03,0x72,0x65,0x67,0x00,0x05,0x62,0x79,0x74,0x65,0x73,0x00,0x05,0x76,0x61,0x6c,
+0x75,0x65,0x00,0x02,0x72,0x65,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x02,
+0x00,0x03,0x00,0x03,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x00,
+0x00,0x01,0x00,0x01,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x01,0x00,0x05,
+0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x04,0xff,0xff,0x00,0x00,0x00,0x06,
+0x00,0x01,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x07,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x08,0x00,0x03,0x00,0x09,0x00,0x04,0x00,0x07,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x08,0x00,0x03,0x00,0x09,0x00,0x04,0x00,0x07,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x08,0x00,0x03,0x00,0x0a,0x00,0x04,0x00,0x09,0x00,0x05,0x00,0x0b,
+0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x09,0x00,0x03,0x00,0x0c,0x00,0x04,0xff,0xff,
+0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0d,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0e,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x07,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0f,
+0x00,0x03,0x00,0x07,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0f,0x00,0x03,0x00,0x07,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0f,0x00,0x03,0x00,0x07,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x0f,0x00,0x03,0x00,0x07,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0f,
+0x00,0x03,0x00,0x10,0x00,0x01,0x00,0x11,0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x00,
+0x00,0x01,0x00,0x12,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x12,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x12,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x13,0x00,0x02,0x00,0x12,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x14,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x0c,
+0x00,0x03,0x00,0x12,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x09,
+0x00,0x02,0x00,0x12,0x00,0x01,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x13,
+0x00,0x02,0x00,0x12,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x13,
+0x00,0x02,0x00,0x12,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x15,0x00,0x01,0x00,0x00,
+0x00,0x02,0x00,0x13,0x00,0x03,0x00,0x12,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x16,
+0x00,0x03,0x00,0x05,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x12,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x17,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x18,0x00,0x03,0x00,0x19,
+0x00,0x04,0x00,0x1a,0x00,0x05,0x00,0x06,0x00,0x01,0x00,0x1b,0x00,0x02,0xff,0xff,
+0x00,0x00,0x00,0x12,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x19,
+0x00,0x02,0x00,0x1a,0x00,0x03,0x00,0x12,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,
+0x00,0x01,0x00,0x19,0x00,0x02,0x00,0x1a,0x00,0x03,0x00,0x12,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x1c,0x00,0x02,0x00,0x1d,0x00,0x03,0x00,0x12,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x13,0x00,0x02,0x00,0x12,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x1e,0x00,0x01,0x00,0x1f,0x00,0x02,0x00,0x20,
+0x00,0x03,0x00,0x21,0x00,0x04,0x00,0x22,0x00,0x05,0x00,0x00,0x00,0x06,0x00,0x23,
+0x00,0x07,0x00,0x24,0x00,0x08,0x00,0x0b,0x00,0x09,0x00,0x09,0x00,0x0a,0x00,0x25,
+0x00,0x0b,0x00,0x01,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x13,
+0x00,0x02,0x00,0x12,0x00,0x01,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x26,
+0x00,0x02,0x00,0x27,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x17,0x00,0x01,0x00,0x00,
+0x00,0x02,0x00,0x28,0x00,0x01,0x00,0x0e,0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x28,
+0x00,0x01,0x00,0x0e,0x00,0x02,0x00,0x17,0x00,0x03,0xff,0xff,0x00,0x00,0x00,0x29,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x2a,0x00,0x01,0x00,0x2b,0x00,0x02,0xff,0xff,
+0x00,0x00,0x00,0x29,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x2a,0x00,0x01,0x00,0x2b,
+0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x0b,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,
+0x00,0x01,0x00,0x2c,0x00,0x02,0x00,0x2d,0x00,0x03,0x00,0x08,0x00,0x04,0x00,0x09,
+0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x2a,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x00,
+0x00,0x01,0x00,0x2a,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x29,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x2a,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x07,0x00,0x01,0x00,0x00,
+0x00,0x02,0x00,0x26,0x00,0x03,0x00,0x2a,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x2a,
+0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x2a,0x00,0x01,0xff,0xff,0x00,0x00,0xff,0xff,
+0x00,0x00,0x00,0x2a,0x00,0x01,0x00,0x2b,0x00,0x02,0xff,0xff,0x00,0x00,0xff,0xff,
+0x00,0x00,0x00,0x2e,0x00,0x01,0x00,0x2c,0x00,0x02,0x00,0x2a,0x00,0x01,0x00,0x2b,
+0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x2a,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x2e,
+0x00,0x01,0x00,0x26,0x00,0x02,0x00,0x2a,0x00,0x01,0x00,0x2b,0x00,0x02,0xff,0xff,
+0x00,0x00,0x00,0x2e,0x00,0x01,0x00,0x2c,0x00,0x02,0x00,0x2a,0x00,0x01,0x00,0x2b,
+0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x2a,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x2e,
+0x00,0x01,0x00,0x26,0x00,0x02,0x00,0x2a,0x00,0x01,0x00,0x2b,0x00,0x02,0xff,0xff,
+0x00,0x00,0x00,0x26,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x2a,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x2f,0x00,0x01,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x1b,
+0x00,0x01,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x30,0x00,0x01,0xff,0xff,
+0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x31,
+0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x09,0x00,0x03,0xff,0xff,0x00,0x00,0x00,0x00,
+0x00,0x01,0x00,0x09,0x00,0x02,0x00,0x31,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x09,
+0x00,0x03,0x00,0x31,0x00,0x01,0x00,0x32,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x09,
+0x00,0x04,0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x07,0x00,0x01,0xff,0xff,
+0x00,0x00,0x00,0x0a,0x00,0x03,0x00,0x07,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x0a,
+0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x02,0x00,0x33,0x00,0x03,0x00,0x34,
+0x00,0x04,0x00,0x09,0x00,0x05,0xff,0xff,0x00,0x00,0x00,0x26,0x00,0x02,0x00,0x00,
+0x00,0x01,0x00,0x35,0x00,0x02,0x00,0x36,0x00,0x03,0x00,0x17,0x00,0x01,0x00,0x00,
+0x00,0x02,0x00,0x17,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x37,0x00,0x03,0x00,0x38,
+0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x17,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x17,
+0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x37,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x36,
+0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x39,0x00,0x02,0x00,0x36,0x00,0x03,0x00,0x36,
+0x00,0x01,0x00,0x3a,0x00,0x02,0xff,0xff,0x00,0x00,0x00,0x2e,0x00,0x04,0x00,0x30,
+0x00,0x05,0x00,0x3b,0x00,0x01,0xff,0xff,0x00,0x00,0x00,0x3b,0x00,0x01,0x00,0x00,
+0x00,0x02,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08,
+};
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/array.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,1113 @@
+/*
+** array.c - Array class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/class.h"
+#include "mruby/string.h"
+#include "mruby/range.h"
+#include "value_array.h"
+
+#define ARY_DEFAULT_LEN   4
+#define ARY_SHRINK_RATIO  5 /* must be larger than 2 */
+#define ARY_C_MAX_SIZE (SIZE_MAX / sizeof(mrb_value))
+#define ARY_MAX_SIZE ((ARY_C_MAX_SIZE < (size_t)MRB_INT_MAX) ? (mrb_int)ARY_C_MAX_SIZE : MRB_INT_MAX-1)
+
+static inline mrb_value
+ary_elt(mrb_value ary, mrb_int offset)
+{
+  if (RARRAY_LEN(ary) == 0) return mrb_nil_value();
+  if (offset < 0 || RARRAY_LEN(ary) <= offset) {
+    return mrb_nil_value();
+  }
+  return RARRAY_PTR(ary)[offset];
+}
+
+static struct RArray*
+ary_new_capa(mrb_state *mrb, mrb_int capa)
+{
+  struct RArray *a;
+  mrb_int blen;
+
+  if (capa > ARY_MAX_SIZE) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big");
+  }
+  blen = capa * sizeof(mrb_value);
+  if (blen < capa) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big");
+  }
+
+  a = (struct RArray*)mrb_obj_alloc(mrb, MRB_TT_ARRAY, mrb->array_class);
+  a->ptr = (mrb_value *)mrb_malloc(mrb, blen);
+  a->aux.capa = capa;
+  a->len = 0;
+
+  return a;
+}
+
+MRB_API mrb_value
+mrb_ary_new_capa(mrb_state *mrb, mrb_int capa)
+{
+  struct RArray *a = ary_new_capa(mrb, capa);
+  return mrb_obj_value(a);
+}
+
+MRB_API mrb_value
+mrb_ary_new(mrb_state *mrb)
+{
+  return mrb_ary_new_capa(mrb, 0);
+}
+
+/*
+ * to copy array, use this instead of memcpy because of portability
+ * * gcc on ARM may fail optimization of memcpy
+ *   http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka3934.html
+ * * gcc on MIPS also fail
+ *   http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39755
+ * * memcpy doesn't exist on freestanding environment
+ *
+ * If you optimize for binary size, use memcpy instead of this at your own risk
+ * of above portability issue.
+ *
+ * see also http://togetter.com/li/462898
+ *
+ */
+static inline void
+array_copy(mrb_value *dst, const mrb_value *src, mrb_int size)
+{
+  mrb_int i;
+
+  for (i = 0; i < size; i++) {
+    dst[i] = src[i];
+  }
+}
+
+MRB_API mrb_value
+mrb_ary_new_from_values(mrb_state *mrb, mrb_int size, const mrb_value *vals)
+{
+  mrb_value ary;
+  struct RArray *a;
+
+  ary = mrb_ary_new_capa(mrb, size);
+  a = mrb_ary_ptr(ary);
+  array_copy(a->ptr, vals, size);
+  a->len = size;
+
+  return ary;
+}
+
+MRB_API mrb_value
+mrb_assoc_new(mrb_state *mrb, mrb_value car, mrb_value cdr)
+{
+  struct RArray *a;
+
+  a = ary_new_capa(mrb, 2);
+  a->ptr[0] = car;
+  a->ptr[1] = cdr;
+  a->len = 2;
+  return mrb_obj_value(a);
+}
+
+static void
+ary_fill_with_nil(mrb_value *ptr, mrb_int size)
+{
+  mrb_value nil = mrb_nil_value();
+
+  while (size--) {
+    *ptr++ = nil;
+  }
+}
+
+static void
+ary_modify(mrb_state *mrb, struct RArray *a)
+{
+  if (ARY_SHARED_P(a)) {
+    mrb_shared_array *shared = a->aux.shared;
+
+    if (shared->refcnt == 1 && a->ptr == shared->ptr) {
+      a->ptr = shared->ptr;
+      a->aux.capa = a->len;
+      mrb_free(mrb, shared);
+    }
+    else {
+      mrb_value *ptr, *p;
+      mrb_int len;
+
+      p = a->ptr;
+      len = a->len * sizeof(mrb_value);
+      ptr = (mrb_value *)mrb_malloc(mrb, len);
+      if (p) {
+        array_copy(ptr, p, a->len);
+      }
+      a->ptr = ptr;
+      a->aux.capa = a->len;
+      mrb_ary_decref(mrb, shared);
+    }
+    ARY_UNSET_SHARED_FLAG(a);
+  }
+}
+
+MRB_API void
+mrb_ary_modify(mrb_state *mrb, struct RArray* a)
+{
+  mrb_write_barrier(mrb, (struct RBasic*)a);
+  ary_modify(mrb, a);
+}
+
+static void
+ary_make_shared(mrb_state *mrb, struct RArray *a)
+{
+  if (!ARY_SHARED_P(a)) {
+    mrb_shared_array *shared = (mrb_shared_array *)mrb_malloc(mrb, sizeof(mrb_shared_array));
+
+    shared->refcnt = 1;
+    if (a->aux.capa > a->len) {
+      a->ptr = shared->ptr = (mrb_value *)mrb_realloc(mrb, a->ptr, sizeof(mrb_value)*a->len+1);
+    }
+    else {
+      shared->ptr = a->ptr;
+    }
+    shared->len = a->len;
+    a->aux.shared = shared;
+    ARY_SET_SHARED_FLAG(a);
+  }
+}
+
+static void
+ary_expand_capa(mrb_state *mrb, struct RArray *a, mrb_int len)
+{
+  mrb_int capa = a->aux.capa;
+
+  if (len > ARY_MAX_SIZE) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big");
+  }
+
+  if (capa == 0) {
+    capa = ARY_DEFAULT_LEN;
+  }
+  while (capa < len) {
+    capa *= 2;
+  }
+
+  if (capa > ARY_MAX_SIZE) capa = ARY_MAX_SIZE; /* len <= capa <= ARY_MAX_SIZE */
+
+  if (capa > a->aux.capa) {
+    mrb_value *expanded_ptr = (mrb_value *)mrb_realloc(mrb, a->ptr, sizeof(mrb_value)*capa);
+
+    a->aux.capa = capa;
+    a->ptr = expanded_ptr;
+  }
+}
+
+static void
+ary_shrink_capa(mrb_state *mrb, struct RArray *a)
+{
+  mrb_int capa = a->aux.capa;
+
+  if (capa < ARY_DEFAULT_LEN * 2) return;
+  if (capa <= a->len * ARY_SHRINK_RATIO) return;
+
+  do {
+    capa /= 2;
+    if (capa < ARY_DEFAULT_LEN) {
+      capa = ARY_DEFAULT_LEN;
+      break;
+    }
+  } while (capa > a->len * ARY_SHRINK_RATIO);
+
+  if (capa > a->len && capa < a->aux.capa) {
+    a->aux.capa = capa;
+    a->ptr = (mrb_value *)mrb_realloc(mrb, a->ptr, sizeof(mrb_value)*capa);
+  }
+}
+
+MRB_API mrb_value
+mrb_ary_resize(mrb_state *mrb, mrb_value ary, mrb_int new_len)
+{
+  mrb_int old_len;
+  struct RArray *a = mrb_ary_ptr(ary);
+
+  ary_modify(mrb, a);
+  old_len = RARRAY_LEN(ary);
+  if (old_len != new_len) {
+    a->len = new_len;
+    if (new_len < old_len) {
+      ary_shrink_capa(mrb, a);
+    }
+    else {
+      ary_expand_capa(mrb, a, new_len);
+      ary_fill_with_nil(a->ptr + old_len, new_len - old_len);
+    }
+  }
+
+  return ary;
+}
+
+static mrb_value
+mrb_ary_s_create(mrb_state *mrb, mrb_value self)
+{
+  mrb_value *vals;
+  mrb_int len;
+
+  mrb_get_args(mrb, "*", &vals, &len);
+
+  return mrb_ary_new_from_values(mrb, len, vals);
+}
+
+static void
+ary_concat(mrb_state *mrb, struct RArray *a, mrb_value *ptr, mrb_int blen)
+{
+  mrb_int len = a->len + blen;
+
+  ary_modify(mrb, a);
+  if (a->aux.capa < len) ary_expand_capa(mrb, a, len);
+  array_copy(a->ptr+a->len, ptr, blen);
+  mrb_write_barrier(mrb, (struct RBasic*)a);
+  a->len = len;
+}
+
+MRB_API void
+mrb_ary_concat(mrb_state *mrb, mrb_value self, mrb_value other)
+{
+  struct RArray *a2 = mrb_ary_ptr(other);
+
+  ary_concat(mrb, mrb_ary_ptr(self), a2->ptr, a2->len);
+}
+
+static mrb_value
+mrb_ary_concat_m(mrb_state *mrb, mrb_value self)
+{
+  mrb_value *ptr;
+  mrb_int blen;
+
+  mrb_get_args(mrb, "a", &ptr, &blen);
+  ary_concat(mrb, mrb_ary_ptr(self), ptr, blen);
+  return self;
+}
+
+static mrb_value
+mrb_ary_plus(mrb_state *mrb, mrb_value self)
+{
+  struct RArray *a1 = mrb_ary_ptr(self);
+  struct RArray *a2;
+  mrb_value ary;
+  mrb_value *ptr;
+  mrb_int blen;
+
+  mrb_get_args(mrb, "a", &ptr, &blen);
+  ary = mrb_ary_new_capa(mrb, a1->len + blen);
+  a2 = mrb_ary_ptr(ary);
+  array_copy(a2->ptr, a1->ptr, a1->len);
+  array_copy(a2->ptr + a1->len, ptr, blen);
+  a2->len = a1->len + blen;
+
+  return ary;
+}
+
+static void
+ary_replace(mrb_state *mrb, struct RArray *a, mrb_value *argv, mrb_int len)
+{
+  ary_modify(mrb, a);
+  if (a->aux.capa < len)
+    ary_expand_capa(mrb, a, len);
+  array_copy(a->ptr, argv, len);
+  mrb_write_barrier(mrb, (struct RBasic*)a);
+  a->len = len;
+}
+
+MRB_API void
+mrb_ary_replace(mrb_state *mrb, mrb_value self, mrb_value other)
+{
+  struct RArray *a2 = mrb_ary_ptr(other);
+
+  ary_replace(mrb, mrb_ary_ptr(self), a2->ptr, a2->len);
+}
+
+static mrb_value
+mrb_ary_replace_m(mrb_state *mrb, mrb_value self)
+{
+  mrb_value other;
+
+  mrb_get_args(mrb, "A", &other);
+  mrb_ary_replace(mrb, self, other);
+
+  return self;
+}
+
+static mrb_value
+mrb_ary_times(mrb_state *mrb, mrb_value self)
+{
+  struct RArray *a1 = mrb_ary_ptr(self);
+  struct RArray *a2;
+  mrb_value ary;
+  mrb_value *ptr;
+  mrb_int times;
+
+  mrb_get_args(mrb, "i", &times);
+  if (times < 0) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "negative argument");
+  }
+  if (times == 0) return mrb_ary_new(mrb);
+
+  ary = mrb_ary_new_capa(mrb, a1->len * times);
+  a2 = mrb_ary_ptr(ary);
+  ptr = a2->ptr;
+  while (times--) {
+    array_copy(ptr, a1->ptr, a1->len);
+    ptr += a1->len;
+    a2->len += a1->len;
+  }
+
+  return ary;
+}
+
+static mrb_value
+mrb_ary_reverse_bang(mrb_state *mrb, mrb_value self)
+{
+  struct RArray *a = mrb_ary_ptr(self);
+
+  if (a->len > 1) {
+    mrb_value *p1, *p2;
+
+    ary_modify(mrb, a);
+    p1 = a->ptr;
+    p2 = a->ptr + a->len - 1;
+
+    while (p1 < p2) {
+      mrb_value tmp = *p1;
+      *p1++ = *p2;
+      *p2-- = tmp;
+    }
+  }
+  return self;
+}
+
+static mrb_value
+mrb_ary_reverse(mrb_state *mrb, mrb_value self)
+{
+  struct RArray *a = mrb_ary_ptr(self), *b;
+  mrb_value ary;
+
+  ary = mrb_ary_new_capa(mrb, a->len);
+  b = mrb_ary_ptr(ary);
+  if (a->len > 0) {
+    mrb_value *p1, *p2, *e;
+
+    p1 = a->ptr;
+    e  = p1 + a->len;
+    p2 = b->ptr + a->len - 1;
+    while (p1 < e) {
+      *p2-- = *p1++;
+    }
+    b->len = a->len;
+  }
+  return ary;
+}
+
+MRB_API void
+mrb_ary_push(mrb_state *mrb, mrb_value ary, mrb_value elem)
+{
+  struct RArray *a = mrb_ary_ptr(ary);
+
+  ary_modify(mrb, a);
+  if (a->len == a->aux.capa)
+    ary_expand_capa(mrb, a, a->len + 1);
+  a->ptr[a->len++] = elem;
+  mrb_field_write_barrier_value(mrb, (struct RBasic*)a, elem);
+}
+
+static mrb_value
+mrb_ary_push_m(mrb_state *mrb, mrb_value self)
+{
+  mrb_value *argv;
+  mrb_int len;
+
+  mrb_get_args(mrb, "*", &argv, &len);
+  while (len--) {
+    mrb_ary_push(mrb, self, *argv++);
+  }
+
+  return self;
+}
+
+MRB_API mrb_value
+mrb_ary_pop(mrb_state *mrb, mrb_value ary)
+{
+  struct RArray *a = mrb_ary_ptr(ary);
+
+  if (a->len == 0) return mrb_nil_value();
+  return a->ptr[--a->len];
+}
+
+#define ARY_SHIFT_SHARED_MIN 10
+
+MRB_API mrb_value
+mrb_ary_shift(mrb_state *mrb, mrb_value self)
+{
+  struct RArray *a = mrb_ary_ptr(self);
+  mrb_value val;
+
+  if (a->len == 0) return mrb_nil_value();
+  if (ARY_SHARED_P(a)) {
+  L_SHIFT:
+    val = a->ptr[0];
+    a->ptr++;
+    a->len--;
+    return val;
+  }
+  if (a->len > ARY_SHIFT_SHARED_MIN) {
+    ary_make_shared(mrb, a);
+    goto L_SHIFT;
+  }
+  else {
+    mrb_value *ptr = a->ptr;
+    mrb_int size = a->len;
+
+    val = *ptr;
+    while (--size) {
+      *ptr = *(ptr+1);
+      ++ptr;
+    }
+    --a->len;
+  }
+  return val;
+}
+
+/* self = [1,2,3]
+   item = 0
+   self.unshift item
+   p self #=> [0, 1, 2, 3] */
+MRB_API mrb_value
+mrb_ary_unshift(mrb_state *mrb, mrb_value self, mrb_value item)
+{
+  struct RArray *a = mrb_ary_ptr(self);
+
+  if (ARY_SHARED_P(a)
+      && a->aux.shared->refcnt == 1 /* shared only referenced from this array */
+      && a->ptr - a->aux.shared->ptr >= 1) /* there's room for unshifted item */ {
+    a->ptr--;
+    a->ptr[0] = item;
+  }
+  else {
+    ary_modify(mrb, a);
+    if (a->aux.capa < a->len + 1)
+      ary_expand_capa(mrb, a, a->len + 1);
+    value_move(a->ptr + 1, a->ptr, a->len);
+    a->ptr[0] = item;
+  }
+  a->len++;
+  mrb_field_write_barrier_value(mrb, (struct RBasic*)a, item);
+
+  return self;
+}
+
+static mrb_value
+mrb_ary_unshift_m(mrb_state *mrb, mrb_value self)
+{
+  struct RArray *a = mrb_ary_ptr(self);
+  mrb_value *vals;
+  mrb_int len;
+
+  mrb_get_args(mrb, "*", &vals, &len);
+  if (ARY_SHARED_P(a)
+      && a->aux.shared->refcnt == 1 /* shared only referenced from this array */
+      && a->ptr - a->aux.shared->ptr >= len) /* there's room for unshifted item */ {
+    a->ptr -= len;
+  }
+  else {
+    ary_modify(mrb, a);
+    if (len == 0) return self;
+    if (a->aux.capa < a->len + len)
+      ary_expand_capa(mrb, a, a->len + len);
+    value_move(a->ptr + len, a->ptr, a->len);
+  }
+  array_copy(a->ptr, vals, len);
+  a->len += len;
+  while (len--) {
+    mrb_field_write_barrier_value(mrb, (struct RBasic*)a, vals[len]);
+  }
+
+  return self;
+}
+
+MRB_API mrb_value
+mrb_ary_ref(mrb_state *mrb, mrb_value ary, mrb_int n)
+{
+  struct RArray *a = mrb_ary_ptr(ary);
+
+  /* range check */
+  if (n < 0) n += a->len;
+  if (n < 0 || a->len <= n) return mrb_nil_value();
+
+  return a->ptr[n];
+}
+
+MRB_API void
+mrb_ary_set(mrb_state *mrb, mrb_value ary, mrb_int n, mrb_value val)
+{
+  struct RArray *a = mrb_ary_ptr(ary);
+
+  ary_modify(mrb, a);
+  /* range check */
+  if (n < 0) {
+    n += a->len;
+    if (n < 0) {
+      mrb_raisef(mrb, E_INDEX_ERROR, "index %S out of array", mrb_fixnum_value(n - a->len));
+    }
+  }
+  if (a->len <= n) {
+    if (a->aux.capa <= n)
+      ary_expand_capa(mrb, a, n + 1);
+    ary_fill_with_nil(a->ptr + a->len, n + 1 - a->len);
+    a->len = n + 1;
+  }
+
+  a->ptr[n] = val;
+  mrb_field_write_barrier_value(mrb, (struct RBasic*)a, val);
+}
+
+MRB_API mrb_value
+mrb_ary_splice(mrb_state *mrb, mrb_value ary, mrb_int head, mrb_int len, mrb_value rpl)
+{
+  struct RArray *a = mrb_ary_ptr(ary);
+  mrb_int tail, size;
+  const mrb_value *argv;
+  mrb_int i, argc;
+
+  ary_modify(mrb, a);
+
+  /* len check */
+  if (len < 0) mrb_raisef(mrb, E_INDEX_ERROR, "negative length (%S)", mrb_fixnum_value(len));
+
+  /* range check */
+  if (head < 0) {
+    head += a->len;
+    if (head < 0) {
+      mrb_raise(mrb, E_INDEX_ERROR, "index is out of array");
+    }
+  }
+  if (a->len < len || a->len < head + len) {
+    len = a->len - head;
+  }
+  tail = head + len;
+
+  /* size check */
+  if (mrb_array_p(rpl)) {
+    argc = RARRAY_LEN(rpl);
+    argv = RARRAY_PTR(rpl);
+  }
+  else {
+    argc = 1;
+    argv = &rpl;
+  }
+  size = head + argc;
+
+  if (tail < a->len) size += a->len - tail;
+  if (size > a->aux.capa)
+    ary_expand_capa(mrb, a, size);
+
+  if (head > a->len) {
+    ary_fill_with_nil(a->ptr + a->len, head - a->len);
+  }
+  else if (head < a->len) {
+    value_move(a->ptr + head + argc, a->ptr + tail, a->len - tail);
+  }
+
+  for (i = 0; i < argc; i++) {
+    *(a->ptr + head + i) = *(argv + i);
+    mrb_field_write_barrier_value(mrb, (struct RBasic*)a, argv[i]);
+  }
+
+  a->len = size;
+
+  return ary;
+}
+
+void
+mrb_ary_decref(mrb_state *mrb, mrb_shared_array *shared)
+{
+  shared->refcnt--;
+  if (shared->refcnt == 0) {
+    mrb_free(mrb, shared->ptr);
+    mrb_free(mrb, shared);
+  }
+}
+
+static mrb_value
+ary_subseq(mrb_state *mrb, struct RArray *a, mrb_int beg, mrb_int len)
+{
+  struct RArray *b;
+
+  ary_make_shared(mrb, a);
+  b  = (struct RArray*)mrb_obj_alloc(mrb, MRB_TT_ARRAY, mrb->array_class);
+  b->ptr = a->ptr + beg;
+  b->len = len;
+  b->aux.shared = a->aux.shared;
+  b->aux.shared->refcnt++;
+  ARY_SET_SHARED_FLAG(b);
+
+  return mrb_obj_value(b);
+}
+
+static mrb_int
+aget_index(mrb_state *mrb, mrb_value index)
+{
+  if (mrb_fixnum_p(index)) {
+    return mrb_fixnum(index);
+  }
+  else if (mrb_float_p(index)) {
+    return (mrb_int)mrb_float(index);
+  }
+  else {
+    mrb_int i, argc;
+    mrb_value *argv;
+
+    mrb_get_args(mrb, "i*", &i, &argv, &argc);
+    return i;
+  }
+}
+
+/*
+ *  call-seq:
+ *     ary[index]                -> obj     or nil
+ *     ary[start, length]        -> new_ary or nil
+ *     ary[range]                -> new_ary or nil
+ *     ary.slice(index)          -> obj     or nil
+ *     ary.slice(start, length)  -> new_ary or nil
+ *     ary.slice(range)          -> new_ary or nil
+ *
+ *  Element Reference --- Returns the element at +index+, or returns a
+ *  subarray starting at the +start+ index and continuing for +length+
+ *  elements, or returns a subarray specified by +range+ of indices.
+ *
+ *  Negative indices count backward from the end of the array (-1 is the last
+ *  element).  For +start+ and +range+ cases the starting index is just before
+ *  an element.  Additionally, an empty array is returned when the starting
+ *  index for an element range is at the end of the array.
+ *
+ *  Returns +nil+ if the index (or starting index) are out of range.
+ *
+ *  a = [ "a", "b", "c", "d", "e" ]
+ *  a[1]     => "b"
+ *  a[1,2]   => ["b", "c"]
+ *  a[1..-2] => ["b", "c", "d"]
+ *
+ */
+
+static mrb_value
+mrb_ary_aget(mrb_state *mrb, mrb_value self)
+{
+  struct RArray *a = mrb_ary_ptr(self);
+  mrb_int i, len;
+  mrb_value index;
+
+  if (mrb_get_args(mrb, "o|i", &index, &len) == 1) {
+    switch (mrb_type(index)) {
+      /* a[n..m] */
+    case MRB_TT_RANGE:
+      if (mrb_range_beg_len(mrb, index, &i, &len, a->len)) {
+        return ary_subseq(mrb, a, i, len);
+      }
+      else {
+        return mrb_nil_value();
+      }
+    case MRB_TT_FIXNUM:
+      return mrb_ary_ref(mrb, self, mrb_fixnum(index));
+    default:
+      return mrb_ary_ref(mrb, self, aget_index(mrb, index));
+    }
+  }
+
+  i = aget_index(mrb, index);
+  if (i < 0) i += a->len;
+  if (i < 0 || a->len < i) return mrb_nil_value();
+  if (len < 0) return mrb_nil_value();
+  if (a->len == i) return mrb_ary_new(mrb);
+  if (len > a->len - i) len = a->len - i;
+
+  return ary_subseq(mrb, a, i, len);
+}
+
+/*
+ *  call-seq:
+ *     ary[index]         = obj                      ->  obj
+ *     ary[start, length] = obj or other_ary or nil  ->  obj or other_ary or nil
+ *     ary[range]         = obj or other_ary or nil  ->  obj or other_ary or nil
+ *
+ *  Element Assignment --- Sets the element at +index+, or replaces a subarray
+ *  from the +start+ index for +length+ elements, or replaces a subarray
+ *  specified by the +range+ of indices.
+ *
+ *  If indices are greater than the current capacity of the array, the array
+ *  grows automatically.  Elements are inserted into the array at +start+ if
+ *  +length+ is zero.
+ *
+ *  Negative indices will count backward from the end of the array.  For
+ *  +start+ and +range+ cases the starting index is just before an element.
+ *
+ *  An IndexError is raised if a negative index points past the beginning of
+ *  the array.
+ *
+ *  See also Array#push, and Array#unshift.
+ *
+ *     a = Array.new
+ *     a[4] = "4";                 #=> [nil, nil, nil, nil, "4"]
+ *     a[0, 3] = [ 'a', 'b', 'c' ] #=> ["a", "b", "c", nil, "4"]
+ *     a[1..2] = [ 1, 2 ]          #=> ["a", 1, 2, nil, "4"]
+ *     a[0, 2] = "?"               #=> ["?", 2, nil, "4"]
+ *     a[0..2] = "A"               #=> ["A", "4"]
+ *     a[-1]   = "Z"               #=> ["A", "Z"]
+ *     a[1..-1] = nil              #=> ["A", nil]
+ *     a[1..-1] = []               #=> ["A"]
+ *     a[0, 0] = [ 1, 2 ]          #=> [1, 2, "A"]
+ *     a[3, 0] = "B"               #=> [1, 2, "A", "B"]
+ */
+
+static mrb_value
+mrb_ary_aset(mrb_state *mrb, mrb_value self)
+{
+  mrb_value v1, v2, v3;
+  mrb_int i, len;
+
+  if (mrb_get_args(mrb, "oo|o", &v1, &v2, &v3) == 2) {
+    switch (mrb_type(v1)) {
+    /* a[n..m] = v */
+    case MRB_TT_RANGE:
+      if (mrb_range_beg_len(mrb, v1, &i, &len, RARRAY_LEN(self))) {
+        mrb_ary_splice(mrb, self, i, len, v2);
+      }
+      break;
+    /* a[n] = v */
+    case MRB_TT_FIXNUM:
+      mrb_ary_set(mrb, self, mrb_fixnum(v1), v2);
+      break;
+    default:
+      mrb_ary_set(mrb, self, aget_index(mrb, v1), v2);
+      break;
+    }
+    return v2;
+  }
+
+  /* a[n,m] = v */
+  mrb_ary_splice(mrb, self, aget_index(mrb, v1), aget_index(mrb, v2), v3);
+  return v3;
+}
+
+static mrb_value
+mrb_ary_delete_at(mrb_state *mrb, mrb_value self)
+{
+  struct RArray *a = mrb_ary_ptr(self);
+  mrb_int   index;
+  mrb_value val;
+  mrb_value *ptr;
+  mrb_int len;
+
+  mrb_get_args(mrb, "i", &index);
+  if (index < 0) index += a->len;
+  if (index < 0 || a->len <= index) return mrb_nil_value();
+
+  ary_modify(mrb, a);
+  val = a->ptr[index];
+
+  ptr = a->ptr + index;
+  len = a->len - index;
+  while (--len) {
+    *ptr = *(ptr+1);
+    ++ptr;
+  }
+  --a->len;
+
+  ary_shrink_capa(mrb, a);
+
+  return val;
+}
+
+static mrb_value
+mrb_ary_first(mrb_state *mrb, mrb_value self)
+{
+  struct RArray *a = mrb_ary_ptr(self);
+  mrb_int size;
+
+  if (mrb_get_args(mrb, "|i", &size) == 0) {
+    return (a->len > 0)? a->ptr[0]: mrb_nil_value();
+  }
+  if (size < 0) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "negative array size");
+  }
+
+  if (size > a->len) size = a->len;
+  if (ARY_SHARED_P(a)) {
+    return ary_subseq(mrb, a, 0, size);
+  }
+  return mrb_ary_new_from_values(mrb, size, a->ptr);
+}
+
+static mrb_value
+mrb_ary_last(mrb_state *mrb, mrb_value self)
+{
+  struct RArray *a = mrb_ary_ptr(self);
+  mrb_int size;
+
+  if (mrb_get_args(mrb, "|i", &size) == 0)
+    return (a->len > 0)? a->ptr[a->len - 1]: mrb_nil_value();
+
+  if (size < 0) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "negative array size");
+  }
+  if (size > a->len) size = a->len;
+  if (ARY_SHARED_P(a) || size > ARY_DEFAULT_LEN) {
+    return ary_subseq(mrb, a, a->len - size, size);
+  }
+  return mrb_ary_new_from_values(mrb, size, a->ptr + a->len - size);
+}
+
+static mrb_value
+mrb_ary_index_m(mrb_state *mrb, mrb_value self)
+{
+  mrb_value obj;
+  mrb_int i;
+
+  mrb_get_args(mrb, "o", &obj);
+  for (i = 0; i < RARRAY_LEN(self); i++) {
+    if (mrb_equal(mrb, RARRAY_PTR(self)[i], obj)) {
+      return mrb_fixnum_value(i);
+    }
+  }
+  return mrb_nil_value();
+}
+
+static mrb_value
+mrb_ary_rindex_m(mrb_state *mrb, mrb_value self)
+{
+  mrb_value obj;
+  mrb_int i;
+
+  mrb_get_args(mrb, "o", &obj);
+  for (i = RARRAY_LEN(self) - 1; i >= 0; i--) {
+    if (mrb_equal(mrb, RARRAY_PTR(self)[i], obj)) {
+      return mrb_fixnum_value(i);
+    }
+  }
+  return mrb_nil_value();
+}
+
+MRB_API mrb_value
+mrb_ary_splat(mrb_state *mrb, mrb_value v)
+{
+  if (mrb_array_p(v)) {
+    return v;
+  }
+  if (mrb_respond_to(mrb, v, mrb_intern_lit(mrb, "to_a"))) {
+    return mrb_funcall(mrb, v, "to_a", 0);
+  }
+  else {
+    return mrb_ary_new_from_values(mrb, 1, &v);
+  }
+}
+
+static mrb_value
+mrb_ary_size(mrb_state *mrb, mrb_value self)
+{
+  struct RArray *a = mrb_ary_ptr(self);
+
+  return mrb_fixnum_value(a->len);
+}
+
+MRB_API mrb_value
+mrb_ary_clear(mrb_state *mrb, mrb_value self)
+{
+  struct RArray *a = mrb_ary_ptr(self);
+
+  if (ARY_SHARED_P(a)) {
+    mrb_ary_decref(mrb, a->aux.shared);
+    ARY_UNSET_SHARED_FLAG(a);
+  }
+  else {
+    mrb_free(mrb, a->ptr);
+  }
+  a->len = 0;
+  a->aux.capa = 0;
+  a->ptr = 0;
+
+  return self;
+}
+
+static mrb_value
+mrb_ary_empty_p(mrb_state *mrb, mrb_value self)
+{
+  struct RArray *a = mrb_ary_ptr(self);
+
+  return mrb_bool_value(a->len == 0);
+}
+
+MRB_API mrb_value
+mrb_check_array_type(mrb_state *mrb, mrb_value ary)
+{
+  return mrb_check_convert_type(mrb, ary, MRB_TT_ARRAY, "Array", "to_ary");
+}
+
+MRB_API mrb_value
+mrb_ary_entry(mrb_value ary, mrb_int offset)
+{
+  if (offset < 0) {
+    offset += RARRAY_LEN(ary);
+  }
+  return ary_elt(ary, offset);
+}
+
+static mrb_value
+join_ary(mrb_state *mrb, mrb_value ary, mrb_value sep, mrb_value list)
+{
+  mrb_int i;
+  mrb_value result, val, tmp;
+
+  /* check recursive */
+  for (i=0; i<RARRAY_LEN(list); i++) {
+    if (mrb_obj_equal(mrb, ary, RARRAY_PTR(list)[i])) {
+      mrb_raise(mrb, E_ARGUMENT_ERROR, "recursive array join");
+    }
+  }
+
+  mrb_ary_push(mrb, list, ary);
+
+  result = mrb_str_buf_new(mrb, 64);
+
+  for (i=0; i<RARRAY_LEN(ary); i++) {
+    if (i > 0 && !mrb_nil_p(sep)) {
+      mrb_str_cat_str(mrb, result, sep);
+    }
+
+    val = RARRAY_PTR(ary)[i];
+    switch (mrb_type(val)) {
+    case MRB_TT_ARRAY:
+    ary_join:
+      val = join_ary(mrb, val, sep, list);
+      /* fall through */
+
+    case MRB_TT_STRING:
+    str_join:
+      mrb_str_cat_str(mrb, result, val);
+      break;
+
+    default:
+      tmp = mrb_check_string_type(mrb, val);
+      if (!mrb_nil_p(tmp)) {
+        val = tmp;
+        goto str_join;
+      }
+      tmp = mrb_check_convert_type(mrb, val, MRB_TT_ARRAY, "Array", "to_ary");
+      if (!mrb_nil_p(tmp)) {
+        val = tmp;
+        goto ary_join;
+      }
+      val = mrb_obj_as_string(mrb, val);
+      goto str_join;
+    }
+  }
+
+  mrb_ary_pop(mrb, list);
+
+  return result;
+}
+
+MRB_API mrb_value
+mrb_ary_join(mrb_state *mrb, mrb_value ary, mrb_value sep)
+{
+  sep = mrb_obj_as_string(mrb, sep);
+  return join_ary(mrb, ary, sep, mrb_ary_new(mrb));
+}
+
+/*
+ *  call-seq:
+ *     ary.join(sep="")    -> str
+ *
+ *  Returns a string created by converting each element of the array to
+ *  a string, separated by <i>sep</i>.
+ *
+ *     [ "a", "b", "c" ].join        #=> "abc"
+ *     [ "a", "b", "c" ].join("-")   #=> "a-b-c"
+ */
+
+static mrb_value
+mrb_ary_join_m(mrb_state *mrb, mrb_value ary)
+{
+  mrb_value sep = mrb_nil_value();
+
+  mrb_get_args(mrb, "|S", &sep);
+  return mrb_ary_join(mrb, ary, sep);
+}
+
+static mrb_value
+mrb_ary_eq(mrb_state *mrb, mrb_value ary1)
+{
+  mrb_value ary2;
+
+  mrb_get_args(mrb, "o", &ary2);
+  if (mrb_obj_equal(mrb, ary1, ary2)) return mrb_true_value();
+  if (mrb_immediate_p(ary2)) return mrb_false_value();
+  if (!mrb_array_p(ary2)) {
+    return mrb_false_value();
+  }
+  if (RARRAY_LEN(ary1) != RARRAY_LEN(ary2)) return mrb_false_value();
+
+  return ary2;
+}
+
+static mrb_value
+mrb_ary_cmp(mrb_state *mrb, mrb_value ary1)
+{
+  mrb_value ary2;
+
+  mrb_get_args(mrb, "o", &ary2);
+  if (mrb_obj_equal(mrb, ary1, ary2)) return mrb_fixnum_value(0);
+  if (mrb_immediate_p(ary2)) return mrb_nil_value();
+  if (!mrb_array_p(ary2)) {
+    return mrb_nil_value();
+  }
+
+  return ary2;
+}
+
+void
+mrb_init_array(mrb_state *mrb)
+{
+  struct RClass *a;
+
+  a = mrb->array_class = mrb_define_class(mrb, "Array", mrb->object_class);            /* 15.2.12 */
+  MRB_SET_INSTANCE_TT(a, MRB_TT_ARRAY);
+
+  mrb_define_class_method(mrb, a, "[]",        mrb_ary_s_create,     MRB_ARGS_ANY());  /* 15.2.12.4.1 */
+
+  mrb_define_method(mrb, a, "+",               mrb_ary_plus,         MRB_ARGS_REQ(1)); /* 15.2.12.5.1  */
+  mrb_define_method(mrb, a, "*",               mrb_ary_times,        MRB_ARGS_REQ(1)); /* 15.2.12.5.2  */
+  mrb_define_method(mrb, a, "<<",              mrb_ary_push_m,       MRB_ARGS_REQ(1)); /* 15.2.12.5.3  */
+  mrb_define_method(mrb, a, "[]",              mrb_ary_aget,         MRB_ARGS_ANY());  /* 15.2.12.5.4  */
+  mrb_define_method(mrb, a, "[]=",             mrb_ary_aset,         MRB_ARGS_ANY());  /* 15.2.12.5.5  */
+  mrb_define_method(mrb, a, "clear",           mrb_ary_clear,        MRB_ARGS_NONE()); /* 15.2.12.5.6  */
+  mrb_define_method(mrb, a, "concat",          mrb_ary_concat_m,     MRB_ARGS_REQ(1)); /* 15.2.12.5.8  */
+  mrb_define_method(mrb, a, "delete_at",       mrb_ary_delete_at,    MRB_ARGS_REQ(1)); /* 15.2.12.5.9  */
+  mrb_define_method(mrb, a, "empty?",          mrb_ary_empty_p,      MRB_ARGS_NONE()); /* 15.2.12.5.12 */
+  mrb_define_method(mrb, a, "first",           mrb_ary_first,        MRB_ARGS_OPT(1)); /* 15.2.12.5.13 */
+  mrb_define_method(mrb, a, "index",           mrb_ary_index_m,      MRB_ARGS_REQ(1)); /* 15.2.12.5.14 */
+  mrb_define_method(mrb, a, "initialize_copy", mrb_ary_replace_m,    MRB_ARGS_REQ(1)); /* 15.2.12.5.16 */
+  mrb_define_method(mrb, a, "join",            mrb_ary_join_m,       MRB_ARGS_ANY());  /* 15.2.12.5.17 */
+  mrb_define_method(mrb, a, "last",            mrb_ary_last,         MRB_ARGS_ANY());  /* 15.2.12.5.18 */
+  mrb_define_method(mrb, a, "length",          mrb_ary_size,         MRB_ARGS_NONE()); /* 15.2.12.5.19 */
+  mrb_define_method(mrb, a, "pop",             mrb_ary_pop,          MRB_ARGS_NONE()); /* 15.2.12.5.21 */
+  mrb_define_method(mrb, a, "push",            mrb_ary_push_m,       MRB_ARGS_ANY());  /* 15.2.12.5.22 */
+  mrb_define_method(mrb, a, "replace",         mrb_ary_replace_m,    MRB_ARGS_REQ(1)); /* 15.2.12.5.23 */
+  mrb_define_method(mrb, a, "reverse",         mrb_ary_reverse,      MRB_ARGS_NONE()); /* 15.2.12.5.24 */
+  mrb_define_method(mrb, a, "reverse!",        mrb_ary_reverse_bang, MRB_ARGS_NONE()); /* 15.2.12.5.25 */
+  mrb_define_method(mrb, a, "rindex",          mrb_ary_rindex_m,     MRB_ARGS_REQ(1)); /* 15.2.12.5.26 */
+  mrb_define_method(mrb, a, "shift",           mrb_ary_shift,        MRB_ARGS_NONE()); /* 15.2.12.5.27 */
+  mrb_define_method(mrb, a, "size",            mrb_ary_size,         MRB_ARGS_NONE()); /* 15.2.12.5.28 */
+  mrb_define_method(mrb, a, "slice",           mrb_ary_aget,         MRB_ARGS_ANY());  /* 15.2.12.5.29 */
+  mrb_define_method(mrb, a, "unshift",         mrb_ary_unshift_m,    MRB_ARGS_ANY());  /* 15.2.12.5.30 */
+
+  mrb_define_method(mrb, a, "__ary_eq",        mrb_ary_eq,           MRB_ARGS_REQ(1));
+  mrb_define_method(mrb, a, "__ary_cmp",       mrb_ary_cmp,          MRB_ARGS_REQ(1));
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/backtrace.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,202 @@
+/*
+** backtrace.c -
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <stdarg.h>
+#include "mruby.h"
+#include "mruby/variable.h"
+#include "mruby/proc.h"
+#include "mruby/array.h"
+#include "mruby/string.h"
+#include "mruby/class.h"
+#include "mruby/debug.h"
+#include "mruby/error.h"
+
+#ifdef ENABLE_STDIO
+
+typedef void (*output_stream_func)(mrb_state*, void*, int, const char*, ...);
+
+static void
+print_backtrace_i(mrb_state *mrb, void *stream, int level, const char *format, ...)
+{
+  va_list ap;
+
+  va_start(ap, format);
+  vfprintf((FILE*)stream, format, ap);
+  va_end(ap);
+}
+
+
+#define MIN_BUFSIZE 127
+
+static void
+get_backtrace_i(mrb_state *mrb, void *stream, int level, const char *format, ...)
+{
+  va_list ap;
+  mrb_value ary, str;
+  int ai;
+
+  if (level > 0) {
+    return;
+  }
+
+  ai = mrb_gc_arena_save(mrb);
+  ary = mrb_obj_value((struct RArray*)stream);
+
+  va_start(ap, format);
+  str = mrb_str_new(mrb, 0, vsnprintf(NULL, 0, format, ap) + 1);
+  va_end(ap);
+
+  va_start(ap, format);
+  vsnprintf(RSTRING_PTR(str), RSTRING_LEN(str), format, ap);
+  va_end(ap);
+
+  mrb_str_resize(mrb, str, RSTRING_LEN(str) - 1);
+  mrb_ary_push(mrb, ary, str);
+  mrb_gc_arena_restore(mrb, ai);
+}
+
+static void
+output_backtrace(mrb_state *mrb, mrb_int ciidx, mrb_code *pc0, output_stream_func func, void *stream)
+{
+  mrb_callinfo *ci;
+  const char *filename, *method, *sep;
+  int i, lineno, tracehead = 1;
+
+  if (ciidx >= mrb->c->ciend - mrb->c->cibase)
+    ciidx = 10; /* ciidx is broken... */
+
+  for (i = ciidx; i >= 0; i--) {
+    ci = &mrb->c->cibase[i];
+    filename = NULL;
+
+    if (!ci->proc) continue;
+    if (MRB_PROC_CFUNC_P(ci->proc)) {
+      continue;
+    }
+    else {
+      mrb_irep *irep = ci->proc->body.irep;
+      mrb_code *pc;
+
+      if (mrb->c->cibase[i].err) {
+        pc = mrb->c->cibase[i].err;
+      }
+      else if (i+1 <= ciidx) {
+        pc = mrb->c->cibase[i+1].pc - 1;
+      }
+      else {
+        pc = pc0;
+      }
+      filename = mrb_debug_get_filename(irep, (uint32_t)(pc - irep->iseq));
+      lineno = mrb_debug_get_line(irep, (uint32_t)(pc - irep->iseq));
+    }
+    if (lineno == -1) continue;
+    if (ci->target_class == ci->proc->target_class)
+      sep = ".";
+    else
+      sep = "#";
+
+    if (!filename) {
+      filename = "(unknown)";
+    }
+
+    if (tracehead) {
+      func(mrb, stream, 1, "trace:\n");
+      tracehead = 0;
+    }
+    method = mrb_sym2name(mrb, ci->mid);
+    if (method) {
+      const char *cn = mrb_class_name(mrb, ci->proc->target_class);
+
+      if (cn) {
+        func(mrb, stream, 1, "\t[%d] ", i);
+        func(mrb, stream, 0, "%s:%d:in %s%s%s", filename, lineno, cn, sep, method);
+        func(mrb, stream, 1, "\n");
+      }
+      else {
+        func(mrb, stream, 1, "\t[%d] ", i);
+        func(mrb, stream, 0, "%s:%d:in %s", filename, lineno, method);
+        func(mrb, stream, 1, "\n");
+      }
+    }
+    else {
+        func(mrb, stream, 1, "\t[%d] ", i);
+        func(mrb, stream, 0, "%s:%d", filename, lineno);
+        func(mrb, stream, 1, "\n");
+    }
+  }
+}
+
+static void
+exc_output_backtrace(mrb_state *mrb, struct RObject *exc, output_stream_func func, void *stream)
+{
+  output_backtrace(mrb, mrb_fixnum(mrb_obj_iv_get(mrb, exc, mrb_intern_lit(mrb, "ciidx"))),
+                   (mrb_code*)mrb_cptr(mrb_obj_iv_get(mrb, exc, mrb_intern_lit(mrb, "lastpc"))),
+                   func, stream);
+}
+
+/* mrb_print_backtrace/mrb_get_backtrace:
+
+   function to retrieve backtrace information from the exception.
+   note that if you call method after the exception, call stack will be
+   overwritten.  So invoke these functions just after detecting exceptions.
+*/
+
+MRB_API void
+mrb_print_backtrace(mrb_state *mrb)
+{
+  if (!mrb->exc || mrb_obj_is_kind_of(mrb, mrb_obj_value(mrb->exc), E_SYSSTACK_ERROR)) {
+    return;
+  }
+  exc_output_backtrace(mrb, mrb->exc, print_backtrace_i, (void*)stderr);
+}
+
+MRB_API mrb_value
+mrb_exc_backtrace(mrb_state *mrb, mrb_value self)
+{
+  mrb_value ary;
+
+  ary = mrb_ary_new(mrb);
+  exc_output_backtrace(mrb, mrb_obj_ptr(self), get_backtrace_i, (void*)mrb_ary_ptr(ary));
+
+  return ary;
+}
+
+MRB_API mrb_value
+mrb_get_backtrace(mrb_state *mrb)
+{
+  mrb_value ary;
+  mrb_callinfo *ci = mrb->c->ci;
+  mrb_code *pc = ci->pc;
+  mrb_int ciidx = (mrb_int)(ci - mrb->c->cibase - 1);
+
+  if (ciidx < 0) ciidx = 0;
+  ary = mrb_ary_new(mrb);
+  output_backtrace(mrb, ciidx, pc, get_backtrace_i, (void*)mrb_ary_ptr(ary));
+
+  return ary;
+}
+
+#else
+
+MRB_API void
+mrb_print_backtrace(mrb_state *mrb)
+{
+}
+
+MRB_API mrb_value
+mrb_exc_backtrace(mrb_state *mrb, mrb_value self)
+{
+  return mrb_ary_new(mrb);
+}
+
+MRB_API mrb_value
+mrb_get_backtrace(mrb_state *mrb)
+{
+  return mrb_ary_new(mrb);
+}
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/class.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,2129 @@
+/*
+** class.c - Class class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <ctype.h>
+#include <stdarg.h>
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/class.h"
+#include "mruby/numeric.h"
+#include "mruby/proc.h"
+#include "mruby/string.h"
+#include "mruby/variable.h"
+#include "mruby/error.h"
+#include "mruby/data.h"
+
+KHASH_DEFINE(mt, mrb_sym, struct RProc*, TRUE, kh_int_hash_func, kh_int_hash_equal)
+
+void
+mrb_gc_mark_mt(mrb_state *mrb, struct RClass *c)
+{
+  khiter_t k;
+  khash_t(mt) *h = c->mt;
+
+  if (!h) return;
+  for (k = kh_begin(h); k != kh_end(h); k++) {
+    if (kh_exist(h, k)) {
+      struct RProc *m = kh_value(h, k);
+      if (m) {
+        mrb_gc_mark(mrb, (struct RBasic*)m);
+      }
+    }
+  }
+}
+
+size_t
+mrb_gc_mark_mt_size(mrb_state *mrb, struct RClass *c)
+{
+  khash_t(mt) *h = c->mt;
+
+  if (!h) return 0;
+  return kh_size(h);
+}
+
+void
+mrb_gc_free_mt(mrb_state *mrb, struct RClass *c)
+{
+  kh_destroy(mt, mrb, c->mt);
+}
+
+static void
+name_class(mrb_state *mrb, struct RClass *c, mrb_sym name)
+{
+  mrb_obj_iv_set(mrb, (struct RObject*)c,
+                 mrb_intern_lit(mrb, "__classid__"), mrb_symbol_value(name));
+}
+
+static void
+setup_class(mrb_state *mrb, struct RClass *outer, struct RClass *c, mrb_sym id)
+{
+  name_class(mrb, c, id);
+  mrb_obj_iv_set(mrb, (struct RObject*)outer, id, mrb_obj_value(c));
+  if (outer != mrb->object_class) {
+    mrb_obj_iv_set(mrb, (struct RObject*)c, mrb_intern_lit(mrb, "__outer__"),
+                   mrb_obj_value(outer));
+  }
+}
+
+#define make_metaclass(mrb, c) prepare_singleton_class((mrb), (struct RBasic*)(c))
+
+static void
+prepare_singleton_class(mrb_state *mrb, struct RBasic *o)
+{
+  struct RClass *sc, *c;
+
+  if (o->c->tt == MRB_TT_SCLASS) return;
+  sc = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_SCLASS, mrb->class_class);
+  sc->mt = 0;
+  sc->iv = 0;
+  if (o->tt == MRB_TT_CLASS) {
+    c = (struct RClass*)o;
+    if (!c->super) {
+      sc->super = mrb->class_class;
+    }
+    else {
+      sc->super = c->super->c;
+    }
+  }
+  else if (o->tt == MRB_TT_SCLASS) {
+    c = (struct RClass*)o;
+    while (c->super->tt == MRB_TT_ICLASS)
+      c = c->super;
+    make_metaclass(mrb, c->super);
+    sc->super = c->super->c;
+  }
+  else {
+    sc->super = o->c;
+  }
+  o->c = sc;
+  mrb_field_write_barrier(mrb, (struct RBasic*)o, (struct RBasic*)sc);
+  mrb_field_write_barrier(mrb, (struct RBasic*)sc, (struct RBasic*)o);
+  mrb_obj_iv_set(mrb, (struct RObject*)sc, mrb_intern_lit(mrb, "__attached__"), mrb_obj_value(o));
+}
+
+static struct RClass *
+class_from_sym(mrb_state *mrb, struct RClass *klass, mrb_sym id)
+{
+  mrb_value c = mrb_const_get(mrb, mrb_obj_value(klass), id);
+
+  mrb_check_type(mrb, c, MRB_TT_CLASS);
+  return mrb_class_ptr(c);
+}
+
+static struct RClass *
+module_from_sym(mrb_state *mrb, struct RClass *klass, mrb_sym id)
+{
+  mrb_value c = mrb_const_get(mrb, mrb_obj_value(klass), id);
+
+  mrb_check_type(mrb, c, MRB_TT_MODULE);
+  return mrb_class_ptr(c);
+}
+
+MRB_API struct RClass*
+mrb_class_outer_module(mrb_state *mrb, struct RClass *c)
+{
+  mrb_value outer;
+
+  outer = mrb_obj_iv_get(mrb, (struct RObject*)c, mrb_intern_lit(mrb, "__outer__"));
+  if (mrb_nil_p(outer)) return NULL;
+  return mrb_class_ptr(outer);
+}
+
+static struct RClass*
+define_module(mrb_state *mrb, mrb_sym name, struct RClass *outer)
+{
+  struct RClass *m;
+
+  if (mrb_const_defined_at(mrb, mrb_obj_value(outer), name)) {
+    return module_from_sym(mrb, outer, name);
+  }
+  m = mrb_module_new(mrb);
+  setup_class(mrb, outer, m, name);
+
+  return m;
+}
+
+MRB_API struct RClass*
+mrb_define_module_id(mrb_state *mrb, mrb_sym name)
+{
+  return define_module(mrb, name, mrb->object_class);
+}
+
+MRB_API struct RClass*
+mrb_define_module(mrb_state *mrb, const char *name)
+{
+  return define_module(mrb, mrb_intern_cstr(mrb, name), mrb->object_class);
+}
+
+MRB_API struct RClass*
+mrb_vm_define_module(mrb_state *mrb, mrb_value outer, mrb_sym id)
+{
+  return define_module(mrb, id, mrb_class_ptr(outer));
+}
+
+MRB_API struct RClass*
+mrb_define_module_under(mrb_state *mrb, struct RClass *outer, const char *name)
+{
+  mrb_sym id = mrb_intern_cstr(mrb, name);
+  struct RClass * c = define_module(mrb, id, outer);
+
+  setup_class(mrb, outer, c, id);
+  return c;
+}
+
+static struct RClass*
+define_class(mrb_state *mrb, mrb_sym name, struct RClass *super, struct RClass *outer)
+{
+  struct RClass * c;
+
+  if (mrb_const_defined_at(mrb, mrb_obj_value(outer), name)) {
+    c = class_from_sym(mrb, outer, name);
+    if (super && mrb_class_real(c->super) != super) {
+      mrb_raisef(mrb, E_TYPE_ERROR, "superclass mismatch for Class %S (%S not %S)",
+                 mrb_sym2str(mrb, name),
+                 mrb_obj_value(c->super), mrb_obj_value(super));
+    }
+    return c;
+  }
+
+  c = mrb_class_new(mrb, super);
+  setup_class(mrb, outer, c, name);
+
+  return c;
+}
+
+MRB_API struct RClass*
+mrb_define_class_id(mrb_state *mrb, mrb_sym name, struct RClass *super)
+{
+  if (!super) {
+    mrb_warn(mrb, "no super class for `%S', Object assumed", mrb_sym2str(mrb, name));
+  }
+  return define_class(mrb, name, super, mrb->object_class);
+}
+
+MRB_API struct RClass*
+mrb_define_class(mrb_state *mrb, const char *name, struct RClass *super)
+{
+  return mrb_define_class_id(mrb, mrb_intern_cstr(mrb, name), super);
+}
+
+static void
+mrb_class_inherited(mrb_state *mrb, struct RClass *super, struct RClass *klass)
+{
+  if (!super)
+    super = mrb->object_class;
+  mrb_funcall(mrb, mrb_obj_value(super), "inherited", 1, mrb_obj_value(klass));
+}
+
+MRB_API struct RClass*
+mrb_vm_define_class(mrb_state *mrb, mrb_value outer, mrb_value super, mrb_sym id)
+{
+  struct RClass *s;
+  struct RClass *c;
+
+  if (!mrb_nil_p(super)) {
+    if (mrb_type(super) != MRB_TT_CLASS) {
+      mrb_raisef(mrb, E_TYPE_ERROR, "superclass must be a Class (%S given)", super);
+    }
+    s = mrb_class_ptr(super);
+  }
+  else {
+    s = 0;
+  }
+  switch (mrb_type(outer)) {
+  case MRB_TT_CLASS:
+  case MRB_TT_SCLASS:
+  case MRB_TT_MODULE:
+    break;
+  default:
+    mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a class/module", outer);
+    break;
+  }
+  c = define_class(mrb, id, s, mrb_class_ptr(outer));
+  mrb_class_inherited(mrb, mrb_class_real(c->super), c);
+
+  return c;
+}
+
+MRB_API mrb_bool
+mrb_class_defined(mrb_state *mrb, const char *name)
+{
+  mrb_value sym = mrb_check_intern_cstr(mrb, name);
+  if (mrb_nil_p(sym)) {
+    return FALSE;
+  }
+  return mrb_const_defined(mrb, mrb_obj_value(mrb->object_class), mrb_symbol(sym));
+}
+
+MRB_API struct RClass *
+mrb_class_get_under(mrb_state *mrb, struct RClass *outer, const char *name)
+{
+  return class_from_sym(mrb, outer, mrb_intern_cstr(mrb, name));
+}
+
+MRB_API struct RClass *
+mrb_class_get(mrb_state *mrb, const char *name)
+{
+  return mrb_class_get_under(mrb, mrb->object_class, name);
+}
+
+MRB_API struct RClass *
+mrb_module_get_under(mrb_state *mrb, struct RClass *outer, const char *name)
+{
+  return module_from_sym(mrb, outer, mrb_intern_cstr(mrb, name));
+}
+
+MRB_API struct RClass *
+mrb_module_get(mrb_state *mrb, const char *name)
+{
+  return mrb_module_get_under(mrb, mrb->object_class, name);
+}
+
+/*!
+ * Defines a class under the namespace of \a outer.
+ * \param outer  a class which contains the new class.
+ * \param id     name of the new class
+ * \param super  a class from which the new class will derive.
+ *               NULL means \c Object class.
+ * \return the created class
+ * \throw TypeError if the constant name \a name is already taken but
+ *                  the constant is not a \c Class.
+ * \throw NameError if the class is already defined but the class can not
+ *                  be reopened because its superclass is not \a super.
+ * \post top-level constant named \a name refers the returned class.
+ *
+ * \note if a class named \a name is already defined and its superclass is
+ *       \a super, the function just returns the defined class.
+ */
+MRB_API struct RClass *
+mrb_define_class_under(mrb_state *mrb, struct RClass *outer, const char *name, struct RClass *super)
+{
+  mrb_sym id = mrb_intern_cstr(mrb, name);
+  struct RClass * c;
+
+#if 0
+  if (!super) {
+    mrb_warn(mrb, "no super class for `%S::%S', Object assumed",
+             mrb_obj_value(outer), mrb_sym2str(mrb, id));
+  }
+#endif
+  c = define_class(mrb, id, super, outer);
+  setup_class(mrb, outer, c, id);
+  return c;
+}
+
+MRB_API void
+mrb_define_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RProc *p)
+{
+  khash_t(mt) *h = c->mt;
+  khiter_t k;
+
+  if (!h) h = c->mt = kh_init(mt, mrb);
+  k = kh_put(mt, mrb, h, mid);
+  kh_value(h, k) = p;
+  if (p) {
+    mrb_field_write_barrier(mrb, (struct RBasic *)c, (struct RBasic *)p);
+  }
+}
+
+MRB_API void
+mrb_define_method_id(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_func_t func, mrb_aspec aspec)
+{
+  struct RProc *p;
+  int ai = mrb_gc_arena_save(mrb);
+
+  p = mrb_proc_new_cfunc(mrb, func);
+  p->target_class = c;
+  mrb_define_method_raw(mrb, c, mid, p);
+  mrb_gc_arena_restore(mrb, ai);
+}
+
+MRB_API void
+mrb_define_method(mrb_state *mrb, struct RClass *c, const char *name, mrb_func_t func, mrb_aspec aspec)
+{
+  mrb_define_method_id(mrb, c, mrb_intern_cstr(mrb, name), func, aspec);
+}
+
+MRB_API void
+mrb_define_method_vm(mrb_state *mrb, struct RClass *c, mrb_sym name, mrb_value body)
+{
+  khash_t(mt) *h = c->mt;
+  khiter_t k;
+  struct RProc *p;
+
+  if (!h) h = c->mt = kh_init(mt, mrb);
+  k = kh_put(mt, mrb, h, name);
+  p = mrb_proc_ptr(body);
+  kh_value(h, k) = p;
+  if (p) {
+    mrb_field_write_barrier(mrb, (struct RBasic *)c, (struct RBasic *)p);
+  }
+}
+
+/* a function to raise NotImplementedError with current method name */
+MRB_API void
+mrb_notimplement(mrb_state *mrb)
+{
+  const char *str;
+  mrb_int len;
+  mrb_callinfo *ci = mrb->c->ci;
+
+  if (ci->mid) {
+    str = mrb_sym2name_len(mrb, ci->mid, &len);
+    mrb_raisef(mrb, E_NOTIMP_ERROR,
+      "%S() function is unimplemented on this machine",
+      mrb_str_new_static(mrb, str, (size_t)len));
+  }
+}
+
+/* a function to be replacement of unimplemented method */
+MRB_API mrb_value
+mrb_notimplement_m(mrb_state *mrb, mrb_value self)
+{
+  mrb_notimplement(mrb);
+  /* not reached */
+  return mrb_nil_value();
+}
+
+static mrb_value
+check_type(mrb_state *mrb, mrb_value val, enum mrb_vtype t, const char *c, const char *m)
+{
+  mrb_value tmp;
+
+  tmp = mrb_check_convert_type(mrb, val, t, c, m);
+  if (mrb_nil_p(tmp)) {
+    mrb_raisef(mrb, E_TYPE_ERROR, "expected %S", mrb_str_new_cstr(mrb, c));
+  }
+  return tmp;
+}
+
+static mrb_value
+to_str(mrb_state *mrb, mrb_value val)
+{
+  return check_type(mrb, val, MRB_TT_STRING, "String", "to_str");
+}
+
+static mrb_value
+to_ary(mrb_state *mrb, mrb_value val)
+{
+  return check_type(mrb, val, MRB_TT_ARRAY, "Array", "to_ary");
+}
+
+static mrb_value
+to_hash(mrb_state *mrb, mrb_value val)
+{
+  return check_type(mrb, val, MRB_TT_HASH, "Hash", "to_hash");
+}
+
+static mrb_sym
+to_sym(mrb_state *mrb, mrb_value ss)
+{
+  if (mrb_type(ss) == MRB_TT_SYMBOL) {
+    return mrb_symbol(ss);
+  }
+  else if (mrb_string_p(ss)) {
+    return mrb_intern_str(mrb, to_str(mrb, ss));
+  }
+  else {
+    mrb_value obj = mrb_funcall(mrb, ss, "inspect", 0);
+    mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a symbol", obj);
+  }
+}
+
+/*
+  retrieve arguments from mrb_state.
+
+  mrb_get_args(mrb, format, ...)
+
+  returns number of arguments parsed.
+
+  format specifiers:
+
+    string  mruby type     C type                 note
+    ----------------------------------------------------------------------------------------------
+    o:      Object         [mrb_value]
+    C:      class/module   [mrb_value]
+    S:      String         [mrb_value]
+    A:      Array          [mrb_value]
+    H:      Hash           [mrb_value]
+    s:      String         [char*,mrb_int]        Receive two arguments.
+    z:      String         [char*]                NUL terminated string.
+    a:      Array          [mrb_value*,mrb_int]   Receive two arguments.
+    f:      Float          [mrb_float]
+    i:      Integer        [mrb_int]
+    b:      Boolean        [mrb_bool]
+    n:      Symbol         [mrb_sym]
+    d:      Data           [void*,mrb_data_type const] 2nd argument will be used to check data type so it won't be modified
+    &:      Block          [mrb_value]
+    *:      rest argument  [mrb_value*,mrb_int]   Receive the rest of the arguments as an array.
+    |:      optional                              Next argument of '|' and later are optional.
+    ?:      optional given [mrb_bool]             true if preceding argument (optional) is given.
+ */
+MRB_API mrb_int
+mrb_get_args(mrb_state *mrb, const char *format, ...)
+{
+  char c;
+  int i = 0;
+  mrb_value *sp = mrb->c->stack + 1;
+  va_list ap;
+  int argc = mrb->c->ci->argc;
+  mrb_bool opt = FALSE;
+  mrb_bool given = TRUE;
+
+  va_start(ap, format);
+  if (argc < 0) {
+    struct RArray *a = mrb_ary_ptr(mrb->c->stack[1]);
+
+    argc = a->len;
+    sp = a->ptr;
+  }
+  while ((c = *format++)) {
+    switch (c) {
+    case '|': case '*': case '&': case '?':
+      break;
+    default:
+      if (argc <= i) {
+        if (opt) {
+          given = FALSE;
+        }
+        else {
+          mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments");
+        }
+      }
+      break;
+    }
+
+    switch (c) {
+    case 'o':
+      {
+        mrb_value *p;
+
+        p = va_arg(ap, mrb_value*);
+        if (i < argc) {
+          *p = *sp++;
+          i++;
+        }
+      }
+      break;
+    case 'C':
+      {
+        mrb_value *p;
+
+        p = va_arg(ap, mrb_value*);
+        if (i < argc) {
+          mrb_value ss;
+
+          ss = *sp++;
+          switch (mrb_type(ss)) {
+          case MRB_TT_CLASS:
+          case MRB_TT_MODULE:
+          case MRB_TT_SCLASS:
+            break;
+          default:
+            mrb_raisef(mrb, E_TYPE_ERROR, "%S is not class/module", ss);
+            break;
+          }
+          *p = ss;
+          i++;
+        }
+      }
+      break;
+    case 'S':
+      {
+        mrb_value *p;
+
+        p = va_arg(ap, mrb_value*);
+        if (i < argc) {
+          *p = to_str(mrb, *sp++);
+          i++;
+        }
+      }
+      break;
+    case 'A':
+      {
+        mrb_value *p;
+
+        p = va_arg(ap, mrb_value*);
+        if (i < argc) {
+          *p = to_ary(mrb, *sp++);
+          i++;
+        }
+      }
+      break;
+    case 'H':
+      {
+        mrb_value *p;
+
+        p = va_arg(ap, mrb_value*);
+        if (i < argc) {
+          *p = to_hash(mrb, *sp++);
+          i++;
+        }
+      }
+      break;
+    case 's':
+      {
+        mrb_value ss;
+        char **ps = 0;
+        mrb_int *pl = 0;
+
+        ps = va_arg(ap, char**);
+        pl = va_arg(ap, mrb_int*);
+        if (i < argc) {
+          ss = to_str(mrb, *sp++);
+          *ps = RSTRING_PTR(ss);
+          *pl = RSTRING_LEN(ss);
+          i++;
+        }
+      }
+      break;
+    case 'z':
+      {
+        mrb_value ss;
+        const char **ps;
+
+        ps = va_arg(ap, const char**);
+        if (i < argc) {
+          ss = to_str(mrb, *sp++);
+          *ps = mrb_string_value_cstr(mrb, &ss);
+          i++;
+        }
+      }
+      break;
+    case 'a':
+      {
+        mrb_value aa;
+        struct RArray *a;
+        mrb_value **pb;
+        mrb_int *pl;
+
+        pb = va_arg(ap, mrb_value**);
+        pl = va_arg(ap, mrb_int*);
+        if (i < argc) {
+          aa = to_ary(mrb, *sp++);
+          a = mrb_ary_ptr(aa);
+          *pb = a->ptr;
+          *pl = a->len;
+          i++;
+        }
+      }
+      break;
+    case 'f':
+      {
+        mrb_float *p;
+
+        p = va_arg(ap, mrb_float*);
+        if (i < argc) {
+          *p = mrb_to_flo(mrb, *sp);
+          sp++;
+          i++;
+        }
+      }
+      break;
+    case 'i':
+      {
+        mrb_int *p;
+
+        p = va_arg(ap, mrb_int*);
+        if (i < argc) {
+          switch (mrb_type(*sp)) {
+            case MRB_TT_FIXNUM:
+              *p = mrb_fixnum(*sp);
+              break;
+            case MRB_TT_FLOAT:
+              {
+                mrb_float f = mrb_float(*sp);
+
+                if (!FIXABLE(f)) {
+                  mrb_raise(mrb, E_RANGE_ERROR, "float too big for int");
+                }
+                *p = (mrb_int)f;
+              }
+              break;
+            case MRB_TT_STRING:
+              mrb_raise(mrb, E_TYPE_ERROR, "no implicit conversion of String into Integer");
+              break;
+            default:
+              *p = mrb_fixnum(mrb_Integer(mrb, *sp));
+              break;
+          }
+          sp++;
+          i++;
+        }
+      }
+      break;
+    case 'b':
+      {
+        mrb_bool *boolp = va_arg(ap, mrb_bool*);
+
+        if (i < argc) {
+          mrb_value b = *sp++;
+          *boolp = mrb_test(b);
+          i++;
+        }
+      }
+      break;
+    case 'n':
+      {
+        mrb_sym *symp;
+
+        symp = va_arg(ap, mrb_sym*);
+        if (i < argc) {
+          mrb_value ss;
+
+          ss = *sp++;
+          *symp = to_sym(mrb, ss);
+          i++;
+        }
+      }
+      break;
+    case 'd':
+      {
+        void** datap;
+        struct mrb_data_type const* type;
+
+        datap = va_arg(ap, void**);
+        type = va_arg(ap, struct mrb_data_type const*);
+        if (i < argc) {
+          *datap = mrb_data_get_ptr(mrb, *sp++, type);
+          ++i;
+        }
+      }
+      break;
+
+    case '&':
+      {
+        mrb_value *p, *bp;
+
+        p = va_arg(ap, mrb_value*);
+        if (mrb->c->ci->argc < 0) {
+          bp = mrb->c->stack + 2;
+        }
+        else {
+          bp = mrb->c->stack + mrb->c->ci->argc + 1;
+        }
+        *p = *bp;
+      }
+      break;
+    case '|':
+      opt = TRUE;
+      break;
+    case '?':
+      {
+        mrb_bool *p;
+
+        p = va_arg(ap, mrb_bool*);
+        *p = given;
+      }
+      break;
+
+    case '*':
+      {
+        mrb_value **var;
+        mrb_int *pl;
+
+        var = va_arg(ap, mrb_value**);
+        pl = va_arg(ap, mrb_int*);
+        if (argc > i) {
+          *pl = argc-i;
+          if (*pl > 0) {
+            *var = sp;
+          }
+          i = argc;
+          sp += *pl;
+        }
+        else {
+          *pl = 0;
+          *var = NULL;
+        }
+      }
+      break;
+    default:
+      mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid argument specifier %S", mrb_str_new(mrb, &c, 1));
+      break;
+    }
+  }
+  if (!c && argc > i) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments");
+  }
+  va_end(ap);
+  return i;
+}
+
+static struct RClass*
+boot_defclass(mrb_state *mrb, struct RClass *super)
+{
+  struct RClass *c;
+
+  c = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_CLASS, mrb->class_class);
+  if (super) {
+    c->super = super;
+    mrb_field_write_barrier(mrb, (struct RBasic*)c, (struct RBasic*)super);
+  }
+  else {
+    c->super = mrb->object_class;
+  }
+  c->mt = kh_init(mt, mrb);
+  return c;
+}
+
+MRB_API void
+mrb_include_module(mrb_state *mrb, struct RClass *c, struct RClass *m)
+{
+  struct RClass *ins_pos;
+
+  ins_pos = c;
+  while (m) {
+    struct RClass *p = c, *ic;
+    int superclass_seen = 0;
+
+    if (c->mt && c->mt == m->mt) {
+      mrb_raise(mrb, E_ARGUMENT_ERROR, "cyclic include detected");
+    }
+    while (p) {
+      if (c != p && p->tt == MRB_TT_CLASS) {
+        superclass_seen = 1;
+      }
+      else if (p->mt == m->mt) {
+        if (p->tt == MRB_TT_ICLASS && !superclass_seen) {
+          ins_pos = p;
+        }
+        goto skip;
+      }
+      p = p->super;
+    }
+    ic = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_ICLASS, mrb->class_class);
+    if (m->tt == MRB_TT_ICLASS) {
+      ic->c = m->c;
+    }
+    else {
+      ic->c = m;
+    }
+    ic->mt = m->mt;
+    ic->iv = m->iv;
+    ic->super = ins_pos->super;
+    ins_pos->super = ic;
+    mrb_field_write_barrier(mrb, (struct RBasic*)ins_pos, (struct RBasic*)ic);
+    ins_pos = ic;
+  skip:
+    m = m->super;
+  }
+}
+
+static mrb_value
+mrb_mod_append_features(mrb_state *mrb, mrb_value mod)
+{
+  mrb_value klass;
+
+  mrb_check_type(mrb, mod, MRB_TT_MODULE);
+  mrb_get_args(mrb, "C", &klass);
+  mrb_include_module(mrb, mrb_class_ptr(klass), mrb_class_ptr(mod));
+  return mod;
+}
+
+static mrb_value
+mrb_mod_include(mrb_state *mrb, mrb_value klass)
+{
+  mrb_value *argv;
+  mrb_int argc, i;
+
+  mrb_get_args(mrb, "*", &argv, &argc);
+  for (i=0; i<argc; i++) {
+    mrb_check_type(mrb, argv[i], MRB_TT_MODULE);
+  }
+  while (argc--) {
+    mrb_funcall(mrb, argv[argc], "append_features", 1, klass);
+    mrb_funcall(mrb, argv[argc], "included", 1, klass);
+  }
+
+  return klass;
+}
+
+/* 15.2.2.4.28 */
+/*
+ *  call-seq:
+ *     mod.include?(module)    -> true or false
+ *
+ *  Returns <code>true</code> if <i>module</i> is included in
+ *  <i>mod</i> or one of <i>mod</i>'s ancestors.
+ *
+ *     module A
+ *     end
+ *     class B
+ *       include A
+ *     end
+ *     class C < B
+ *     end
+ *     B.include?(A)   #=> true
+ *     C.include?(A)   #=> true
+ *     A.include?(A)   #=> false
+ */
+static mrb_value
+mrb_mod_include_p(mrb_state *mrb, mrb_value mod)
+{
+  mrb_value mod2;
+  struct RClass *c = mrb_class_ptr(mod);
+
+  mrb_get_args(mrb, "C", &mod2);
+  mrb_check_type(mrb, mod2, MRB_TT_MODULE);
+
+  while (c) {
+    if (c->tt == MRB_TT_ICLASS) {
+      if (c->c == mrb_class_ptr(mod2)) return mrb_true_value();
+    }
+    c = c->super;
+  }
+  return mrb_false_value();
+}
+
+static mrb_value
+mrb_mod_ancestors(mrb_state *mrb, mrb_value self)
+{
+  mrb_value result;
+  struct RClass *c = mrb_class_ptr(self);
+
+  result = mrb_ary_new(mrb);
+  mrb_ary_push(mrb, result, mrb_obj_value(c));
+  c = c->super;
+  while (c) {
+    if (c->tt == MRB_TT_ICLASS) {
+      mrb_ary_push(mrb, result, mrb_obj_value(c->c));
+    }
+    else if (c->tt != MRB_TT_SCLASS) {
+      mrb_ary_push(mrb, result, mrb_obj_value(c));
+    }
+    c = c->super;
+  }
+
+  return result;
+}
+
+static mrb_value
+mrb_mod_extend_object(mrb_state *mrb, mrb_value mod)
+{
+  mrb_value obj;
+
+  mrb_check_type(mrb, mod, MRB_TT_MODULE);
+  mrb_get_args(mrb, "o", &obj);
+  mrb_include_module(mrb, mrb_class_ptr(mrb_singleton_class(mrb, obj)), mrb_class_ptr(mod));
+  return mod;
+}
+
+static mrb_value
+mrb_mod_included_modules(mrb_state *mrb, mrb_value self)
+{
+  mrb_value result;
+  struct RClass *c = mrb_class_ptr(self);
+
+  result = mrb_ary_new(mrb);
+  while (c) {
+    if (c->tt == MRB_TT_ICLASS) {
+      mrb_ary_push(mrb, result, mrb_obj_value(c->c));
+    }
+    c = c->super;
+  }
+
+  return result;
+}
+
+static mrb_value
+mrb_mod_initialize(mrb_state *mrb, mrb_value mod)
+{
+  mrb_value b;
+
+  mrb_get_args(mrb, "&", &b);
+  if (!mrb_nil_p(b)) {
+    mrb_yield_with_class(mrb, b, 1, &mod, mod, mrb_class_ptr(mod));
+  }
+  return mod;
+}
+
+mrb_value mrb_class_instance_method_list(mrb_state*, mrb_bool, struct RClass*, int);
+
+/* 15.2.2.4.33 */
+/*
+ *  call-seq:
+ *     mod.instance_methods(include_super=true)   -> array
+ *
+ *  Returns an array containing the names of the public and protected instance
+ *  methods in the receiver. For a module, these are the public and protected methods;
+ *  for a class, they are the instance (not singleton) methods. With no
+ *  argument, or with an argument that is <code>false</code>, the
+ *  instance methods in <i>mod</i> are returned, otherwise the methods
+ *  in <i>mod</i> and <i>mod</i>'s superclasses are returned.
+ *
+ *     module A
+ *       def method1()  end
+ *     end
+ *     class B
+ *       def method2()  end
+ *     end
+ *     class C < B
+ *       def method3()  end
+ *     end
+ *
+ *     A.instance_methods                #=> [:method1]
+ *     B.instance_methods(false)         #=> [:method2]
+ *     C.instance_methods(false)         #=> [:method3]
+ *     C.instance_methods(true).length   #=> 43
+ */
+
+static mrb_value
+mrb_mod_instance_methods(mrb_state *mrb, mrb_value mod)
+{
+  struct RClass *c = mrb_class_ptr(mod);
+  mrb_bool recur = TRUE;
+  mrb_get_args(mrb, "|b", &recur);
+  return mrb_class_instance_method_list(mrb, recur, c, 0);
+}
+
+/* implementation of module_eval/class_eval */
+mrb_value mrb_mod_module_eval(mrb_state*, mrb_value);
+
+static mrb_value
+mrb_mod_dummy_visibility(mrb_state *mrb, mrb_value mod)
+{
+  return mod;
+}
+
+MRB_API mrb_value
+mrb_singleton_class(mrb_state *mrb, mrb_value v)
+{
+  struct RBasic *obj;
+
+  switch (mrb_type(v)) {
+  case MRB_TT_FALSE:
+    if (mrb_nil_p(v))
+      return mrb_obj_value(mrb->nil_class);
+    return mrb_obj_value(mrb->false_class);
+  case MRB_TT_TRUE:
+    return mrb_obj_value(mrb->true_class);
+  case MRB_TT_CPTR:
+    return mrb_obj_value(mrb->object_class);
+  case MRB_TT_SYMBOL:
+  case MRB_TT_FIXNUM:
+  case MRB_TT_FLOAT:
+    mrb_raise(mrb, E_TYPE_ERROR, "can't define singleton");
+    return mrb_nil_value();    /* not reached */
+  default:
+    break;
+  }
+  obj = mrb_basic_ptr(v);
+  prepare_singleton_class(mrb, obj);
+  if (mrb->c && mrb->c->ci && mrb->c->ci->target_class) {
+    mrb_obj_iv_set(mrb, (struct RObject*)obj->c, mrb_intern_lit(mrb, "__outer__"),
+                   mrb_obj_value(mrb->c->ci->target_class));
+  }
+  return mrb_obj_value(obj->c);
+}
+
+MRB_API void
+mrb_define_singleton_method(mrb_state *mrb, struct RObject *o, const char *name, mrb_func_t func, mrb_aspec aspec)
+{
+  prepare_singleton_class(mrb, (struct RBasic*)o);
+  mrb_define_method_id(mrb, o->c, mrb_intern_cstr(mrb, name), func, aspec);
+}
+
+MRB_API void
+mrb_define_class_method(mrb_state *mrb, struct RClass *c, const char *name, mrb_func_t func, mrb_aspec aspec)
+{
+  mrb_define_singleton_method(mrb, (struct RObject*)c, name, func, aspec);
+}
+
+MRB_API void
+mrb_define_module_function(mrb_state *mrb, struct RClass *c, const char *name, mrb_func_t func, mrb_aspec aspec)
+{
+  mrb_define_class_method(mrb, c, name, func, aspec);
+  mrb_define_method(mrb, c, name, func, aspec);
+}
+
+MRB_API struct RProc*
+mrb_method_search_vm(mrb_state *mrb, struct RClass **cp, mrb_sym mid)
+{
+  khiter_t k;
+  struct RProc *m;
+  struct RClass *c = *cp;
+
+  while (c) {
+    khash_t(mt) *h = c->mt;
+
+    if (h) {
+      k = kh_get(mt, mrb, h, mid);
+      if (k != kh_end(h)) {
+        m = kh_value(h, k);
+        if (!m) break;
+        *cp = c;
+        return m;
+      }
+    }
+    c = c->super;
+  }
+  return NULL;                  /* no method */
+}
+
+MRB_API struct RProc*
+mrb_method_search(mrb_state *mrb, struct RClass* c, mrb_sym mid)
+{
+  struct RProc *m;
+
+  m = mrb_method_search_vm(mrb, &c, mid);
+  if (!m) {
+    mrb_value inspect = mrb_funcall(mrb, mrb_obj_value(c), "inspect", 0);
+    if (RSTRING_LEN(inspect) > 64) {
+      inspect = mrb_any_to_s(mrb, mrb_obj_value(c));
+    }
+    mrb_name_error(mrb, mid, "undefined method '%S' for class %S",
+               mrb_sym2str(mrb, mid), inspect);
+  }
+  return m;
+}
+
+static mrb_value
+attr_reader(mrb_state *mrb, mrb_value obj)
+{
+  mrb_value name = mrb_proc_cfunc_env_get(mrb, 0);
+  return mrb_iv_get(mrb, obj, to_sym(mrb, name));
+}
+
+static mrb_value
+mrb_mod_attr_reader(mrb_state *mrb, mrb_value mod)
+{
+  struct RClass *c = mrb_class_ptr(mod);
+  mrb_value *argv;
+  mrb_int argc, i;
+  int ai;
+
+  mrb_get_args(mrb, "*", &argv, &argc);
+  ai = mrb_gc_arena_save(mrb);
+  for (i=0; i<argc; i++) {
+    mrb_value name, str;
+    mrb_sym method, sym;
+
+    method = to_sym(mrb, argv[i]);
+    name = mrb_sym2str(mrb, method);
+    str = mrb_str_buf_new(mrb, RSTRING_LEN(name)+1);
+    mrb_str_cat_lit(mrb, str, "@");
+    mrb_str_cat_str(mrb, str, name);
+    sym = mrb_intern_str(mrb, str);
+    mrb_iv_check(mrb, sym);
+    name = mrb_symbol_value(sym);
+    mrb_define_method_raw(mrb, c, method,
+                          mrb_proc_new_cfunc_with_env(mrb, attr_reader, 1, &name));
+    mrb_gc_arena_restore(mrb, ai);
+  }
+  return mrb_nil_value();
+}
+
+static mrb_value
+attr_writer(mrb_state *mrb, mrb_value obj)
+{
+  mrb_value name = mrb_proc_cfunc_env_get(mrb, 0);
+  mrb_value val;
+
+  mrb_get_args(mrb, "o", &val);
+  mrb_iv_set(mrb, obj, to_sym(mrb, name), val);
+  return val;
+}
+
+static mrb_value
+mrb_mod_attr_writer(mrb_state *mrb, mrb_value mod)
+{
+  struct RClass *c = mrb_class_ptr(mod);
+  mrb_value *argv;
+  mrb_int argc, i;
+  int ai;
+
+  mrb_get_args(mrb, "*", &argv, &argc);
+  ai = mrb_gc_arena_save(mrb);
+  for (i=0; i<argc; i++) {
+    mrb_value name, str, attr;
+    mrb_sym method, sym;
+
+    method = to_sym(mrb, argv[i]);
+
+    /* prepare iv name (@name) */
+    name = mrb_sym2str(mrb, method);
+    str = mrb_str_buf_new(mrb, RSTRING_LEN(name)+1);
+    mrb_str_cat_lit(mrb, str, "@");
+    mrb_str_cat_str(mrb, str, name);
+    sym = mrb_intern_str(mrb, str);
+    mrb_iv_check(mrb, sym);
+    attr = mrb_symbol_value(sym);
+
+    /* prepare method name (name=) */
+    str = mrb_str_buf_new(mrb, RSTRING_LEN(str));
+    mrb_str_cat_str(mrb, str, name);
+    mrb_str_cat_lit(mrb, str, "=");
+    method = mrb_intern_str(mrb, str);
+
+    mrb_define_method_raw(mrb, c, method,
+                          mrb_proc_new_cfunc_with_env(mrb, attr_writer, 1, &attr));
+    mrb_gc_arena_restore(mrb, ai);
+  }
+  return mrb_nil_value();
+}
+
+static mrb_value
+mrb_instance_alloc(mrb_state *mrb, mrb_value cv)
+{
+  struct RClass *c = mrb_class_ptr(cv);
+  struct RObject *o;
+  enum mrb_vtype ttype = MRB_INSTANCE_TT(c);
+
+  if (c->tt == MRB_TT_SCLASS)
+    mrb_raise(mrb, E_TYPE_ERROR, "can't create instance of singleton class");
+
+  if (ttype == 0) ttype = MRB_TT_OBJECT;
+  o = (struct RObject*)mrb_obj_alloc(mrb, ttype, c);
+  return mrb_obj_value(o);
+}
+
+/*
+ *  call-seq:
+ *     class.new(args, ...)    ->  obj
+ *
+ *  Calls <code>allocate</code> to create a new object of
+ *  <i>class</i>'s class, then invokes that object's
+ *  <code>initialize</code> method, passing it <i>args</i>.
+ *  This is the method that ends up getting called whenever
+ *  an object is constructed using .new.
+ *
+ */
+
+MRB_API mrb_value
+mrb_instance_new(mrb_state *mrb, mrb_value cv)
+{
+  mrb_value obj, blk;
+  mrb_value *argv;
+  mrb_int argc;
+
+  mrb_get_args(mrb, "*&", &argv, &argc, &blk);
+  obj = mrb_instance_alloc(mrb, cv);
+  mrb_funcall_with_block(mrb, obj, mrb_intern_lit(mrb, "initialize"), argc, argv, blk);
+
+  return obj;
+}
+
+MRB_API mrb_value
+mrb_obj_new(mrb_state *mrb, struct RClass *c, mrb_int argc, const mrb_value *argv)
+{
+  mrb_value obj;
+
+  obj = mrb_instance_alloc(mrb, mrb_obj_value(c));
+  mrb_funcall_argv(mrb, obj, mrb_intern_lit(mrb, "initialize"), argc, argv);
+
+  return obj;
+}
+
+static mrb_value
+mrb_class_initialize(mrb_state *mrb, mrb_value c)
+{
+  mrb_value a, b;
+
+  mrb_get_args(mrb, "|C&", &a, &b);
+  if (!mrb_nil_p(b)) {
+    mrb_yield_with_class(mrb, b, 1, &c, c, mrb_class_ptr(c));
+  }
+  return c;
+}
+
+static mrb_value
+mrb_class_new_class(mrb_state *mrb, mrb_value cv)
+{
+  mrb_int n;
+  mrb_value super, blk;
+  mrb_value new_class;
+
+  n = mrb_get_args(mrb, "|C&", &super, &blk);
+  if (n == 0) {
+    super = mrb_obj_value(mrb->object_class);
+  }
+  new_class = mrb_obj_value(mrb_class_new(mrb, mrb_class_ptr(super)));
+  mrb_funcall_with_block(mrb, new_class, mrb_intern_lit(mrb, "initialize"), n, &super, blk);
+  mrb_class_inherited(mrb, mrb_class_ptr(super), mrb_class_ptr(new_class));
+  return new_class;
+}
+
+static mrb_value
+mrb_class_superclass(mrb_state *mrb, mrb_value klass)
+{
+  struct RClass *c;
+
+  c = mrb_class_ptr(klass);
+  c = c->super;
+  while (c && c->tt == MRB_TT_ICLASS) {
+    c = c->super;
+  }
+  if (!c) return mrb_nil_value();
+  return mrb_obj_value(c);
+}
+
+static mrb_value
+mrb_bob_init(mrb_state *mrb, mrb_value cv)
+{
+  return mrb_nil_value();
+}
+
+static mrb_value
+mrb_bob_not(mrb_state *mrb, mrb_value cv)
+{
+  return mrb_bool_value(!mrb_test(cv));
+}
+
+/* 15.3.1.3.30 */
+/*
+ *  call-seq:
+ *     obj.method_missing(symbol [, *args] )   -> result
+ *
+ *  Invoked by Ruby when <i>obj</i> is sent a message it cannot handle.
+ *  <i>symbol</i> is the symbol for the method called, and <i>args</i>
+ *  are any arguments that were passed to it. By default, the interpreter
+ *  raises an error when this method is called. However, it is possible
+ *  to override the method to provide more dynamic behavior.
+ *  If it is decided that a particular method should not be handled, then
+ *  <i>super</i> should be called, so that ancestors can pick up the
+ *  missing method.
+ *  The example below creates
+ *  a class <code>Roman</code>, which responds to methods with names
+ *  consisting of roman numerals, returning the corresponding integer
+ *  values.
+ *
+ *     class Roman
+ *       def romanToInt(str)
+ *         # ...
+ *       end
+ *       def method_missing(methId)
+ *         str = methId.id2name
+ *         romanToInt(str)
+ *       end
+ *     end
+ *
+ *     r = Roman.new
+ *     r.iv      #=> 4
+ *     r.xxiii   #=> 23
+ *     r.mm      #=> 2000
+ */
+static mrb_value
+mrb_bob_missing(mrb_state *mrb, mrb_value mod)
+{
+  mrb_sym name;
+  mrb_value *a;
+  mrb_int alen;
+  mrb_sym inspect;
+  mrb_value repr;
+
+  mrb_get_args(mrb, "n*", &name, &a, &alen);
+
+  inspect = mrb_intern_lit(mrb, "inspect");
+  if (mrb->c->ci > mrb->c->cibase && mrb->c->ci[-1].mid == inspect) {
+    /* method missing in inspect; avoid recursion */
+    repr = mrb_any_to_s(mrb, mod);
+  }
+  else if (mrb_respond_to(mrb, mod, inspect) && mrb->c->ci - mrb->c->cibase < 64) {
+    repr = mrb_funcall_argv(mrb, mod, inspect, 0, 0);
+    if (RSTRING_LEN(repr) > 64) {
+      repr = mrb_any_to_s(mrb, mod);
+    }
+  }
+  else {
+    repr = mrb_any_to_s(mrb, mod);
+  }
+
+  mrb_no_method_error(mrb, name, alen, a, "undefined method '%S' for %S", mrb_sym2str(mrb, name), repr);
+  /* not reached */
+  return mrb_nil_value();
+}
+
+MRB_API mrb_bool
+mrb_obj_respond_to(mrb_state *mrb, struct RClass* c, mrb_sym mid)
+{
+  khiter_t k;
+
+  while (c) {
+    khash_t(mt) *h = c->mt;
+
+    if (h) {
+      k = kh_get(mt, mrb, h, mid);
+      if (k != kh_end(h)) {
+        if (kh_value(h, k)) {
+          return TRUE;  /* method exists */
+        }
+        else {
+          return FALSE; /* undefined method */
+        }
+      }
+    }
+    c = c->super;
+  }
+  return FALSE;         /* no method */
+}
+
+MRB_API mrb_bool
+mrb_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym mid)
+{
+  return mrb_obj_respond_to(mrb, mrb_class(mrb, obj), mid);
+}
+
+MRB_API mrb_value
+mrb_class_path(mrb_state *mrb, struct RClass *c)
+{
+  mrb_value path;
+  const char *name;
+  mrb_sym classpath = mrb_intern_lit(mrb, "__classpath__");
+
+  path = mrb_obj_iv_get(mrb, (struct RObject*)c, classpath);
+  if (mrb_nil_p(path)) {
+    struct RClass *outer = mrb_class_outer_module(mrb, c);
+    mrb_sym sym = mrb_class_sym(mrb, c, outer);
+    mrb_int len;
+
+    if (sym == 0) {
+      return mrb_nil_value();
+    }
+    else if (outer && outer != mrb->object_class) {
+      mrb_value base = mrb_class_path(mrb, outer);
+      path = mrb_str_buf_new(mrb, 0);
+      if (mrb_nil_p(base)) {
+        mrb_str_cat_lit(mrb, path, "#<Class:");
+        mrb_str_concat(mrb, path, mrb_ptr_to_str(mrb, outer));
+        mrb_str_cat_lit(mrb, path, ">");
+      }
+      else {
+        mrb_str_concat(mrb, path, base);
+      }
+      mrb_str_cat_lit(mrb, path, "::");
+      name = mrb_sym2name_len(mrb, sym, &len);
+      mrb_str_cat(mrb, path, name, len);
+    }
+    else {
+      name = mrb_sym2name_len(mrb, sym, &len);
+      path = mrb_str_new(mrb, name, len);
+    }
+    mrb_obj_iv_set(mrb, (struct RObject*)c, classpath, path);
+  }
+  return path;
+}
+
+MRB_API struct RClass *
+mrb_class_real(struct RClass* cl)
+{
+  if (cl == 0)
+    return NULL;
+  while ((cl->tt == MRB_TT_SCLASS) || (cl->tt == MRB_TT_ICLASS)) {
+    cl = cl->super;
+  }
+  return cl;
+}
+
+MRB_API const char*
+mrb_class_name(mrb_state *mrb, struct RClass* c)
+{
+  mrb_value path = mrb_class_path(mrb, c);
+  if (mrb_nil_p(path)) {
+    path = mrb_str_new_lit(mrb, "#<Class:");
+    mrb_str_concat(mrb, path, mrb_ptr_to_str(mrb, c));
+    mrb_str_cat_lit(mrb, path, ">");
+  }
+  return RSTRING_PTR(path);
+}
+
+MRB_API const char*
+mrb_obj_classname(mrb_state *mrb, mrb_value obj)
+{
+  return mrb_class_name(mrb, mrb_obj_class(mrb, obj));
+}
+
+/*!
+ * Ensures a class can be derived from super.
+ *
+ * \param super a reference to an object.
+ * \exception TypeError if \a super is not a Class or \a super is a singleton class.
+ */
+static void
+mrb_check_inheritable(mrb_state *mrb, struct RClass *super)
+{
+  if (super->tt != MRB_TT_CLASS) {
+    mrb_raisef(mrb, E_TYPE_ERROR, "superclass must be a Class (%S given)", mrb_obj_value(super));
+  }
+  if (super->tt == MRB_TT_SCLASS) {
+    mrb_raise(mrb, E_TYPE_ERROR, "can't make subclass of singleton class");
+  }
+  if (super == mrb->class_class) {
+    mrb_raise(mrb, E_TYPE_ERROR, "can't make subclass of Class");
+  }
+}
+
+/*!
+ * Creates a new class.
+ * \param super     a class from which the new class derives.
+ * \exception TypeError \a super is not inheritable.
+ * \exception TypeError \a super is the Class class.
+ */
+MRB_API struct RClass*
+mrb_class_new(mrb_state *mrb, struct RClass *super)
+{
+  struct RClass *c;
+
+  if (super) {
+    mrb_check_inheritable(mrb, super);
+  }
+  c = boot_defclass(mrb, super);
+  if (super) {
+    MRB_SET_INSTANCE_TT(c, MRB_INSTANCE_TT(super));
+  }
+  make_metaclass(mrb, c);
+
+  return c;
+}
+
+/*!
+ * Creates a new module.
+ */
+MRB_API struct RClass*
+mrb_module_new(mrb_state *mrb)
+{
+  struct RClass *m = (struct RClass*)mrb_obj_alloc(mrb, MRB_TT_MODULE, mrb->module_class);
+  m->mt = kh_init(mt, mrb);
+
+  return m;
+}
+
+/*
+ *  call-seq:
+ *     obj.class    => class
+ *
+ *  Returns the class of <i>obj</i>, now preferred over
+ *  <code>Object#type</code>, as an object's type in Ruby is only
+ *  loosely tied to that object's class. This method must always be
+ *  called with an explicit receiver, as <code>class</code> is also a
+ *  reserved word in Ruby.
+ *
+ *     1.class      #=> Fixnum
+ *     self.class   #=> Object
+ */
+
+MRB_API struct RClass*
+mrb_obj_class(mrb_state *mrb, mrb_value obj)
+{
+  return mrb_class_real(mrb_class(mrb, obj));
+}
+
+MRB_API void
+mrb_alias_method(mrb_state *mrb, struct RClass *c, mrb_sym a, mrb_sym b)
+{
+  struct RProc *m = mrb_method_search(mrb, c, b);
+
+  mrb_define_method_vm(mrb, c, a, mrb_obj_value(m));
+}
+
+/*!
+ * Defines an alias of a method.
+ * \param klass  the class which the original method belongs to
+ * \param name1  a new name for the method
+ * \param name2  the original name of the method
+ */
+MRB_API void
+mrb_define_alias(mrb_state *mrb, struct RClass *klass, const char *name1, const char *name2)
+{
+  mrb_alias_method(mrb, klass, mrb_intern_cstr(mrb, name1), mrb_intern_cstr(mrb, name2));
+}
+
+/*
+ * call-seq:
+ *   mod.to_s   -> string
+ *
+ * Return a string representing this module or class. For basic
+ * classes and modules, this is the name. For singletons, we
+ * show information on the thing we're attached to as well.
+ */
+
+static mrb_value
+mrb_mod_to_s(mrb_state *mrb, mrb_value klass)
+{
+  mrb_value str;
+
+  if (mrb_type(klass) == MRB_TT_SCLASS) {
+    mrb_value v = mrb_iv_get(mrb, klass, mrb_intern_lit(mrb, "__attached__"));
+
+    str = mrb_str_new_lit(mrb, "#<Class:");
+
+    switch (mrb_type(v)) {
+      case MRB_TT_CLASS:
+      case MRB_TT_MODULE:
+      case MRB_TT_SCLASS:
+        mrb_str_append(mrb, str, mrb_inspect(mrb, v));
+        break;
+      default:
+        mrb_str_append(mrb, str, mrb_any_to_s(mrb, v));
+        break;
+    }
+    return mrb_str_cat_lit(mrb, str, ">");
+  }
+  else {
+    struct RClass *c;
+    mrb_value path;
+
+    str = mrb_str_buf_new(mrb, 32);
+    c = mrb_class_ptr(klass);
+    path = mrb_class_path(mrb, c);
+
+    if (mrb_nil_p(path)) {
+      switch (mrb_type(klass)) {
+        case MRB_TT_CLASS:
+          mrb_str_cat_lit(mrb, str, "#<Class:");
+          break;
+
+        case MRB_TT_MODULE:
+          mrb_str_cat_lit(mrb, str, "#<Module:");
+          break;
+
+        default:
+          /* Shouldn't be happened? */
+          mrb_str_cat_lit(mrb, str, "#<??????:");
+          break;
+      }
+      mrb_str_concat(mrb, str, mrb_ptr_to_str(mrb, c));
+      return mrb_str_cat_lit(mrb, str, ">");
+    }
+    else {
+      return path;
+    }
+  }
+}
+
+static mrb_value
+mrb_mod_alias(mrb_state *mrb, mrb_value mod)
+{
+  struct RClass *c = mrb_class_ptr(mod);
+  mrb_sym new_name, old_name;
+
+  mrb_get_args(mrb, "nn", &new_name, &old_name);
+  mrb_alias_method(mrb, c, new_name, old_name);
+  return mrb_nil_value();
+}
+
+static void
+undef_method(mrb_state *mrb, struct RClass *c, mrb_sym a)
+{
+  mrb_value m;
+
+  if (!mrb_obj_respond_to(mrb, c, a)) {
+    mrb_name_error(mrb, a, "undefined method '%S' for class '%S'", mrb_sym2str(mrb, a), mrb_obj_value(c));
+  }
+  else {
+    SET_PROC_VALUE(m, 0);
+    mrb_define_method_vm(mrb, c, a, m);
+  }
+}
+
+MRB_API void
+mrb_undef_method(mrb_state *mrb, struct RClass *c, const char *name)
+{
+  undef_method(mrb, c, mrb_intern_cstr(mrb, name));
+}
+
+MRB_API void
+mrb_undef_class_method(mrb_state *mrb, struct RClass *c, const char *name)
+{
+  mrb_undef_method(mrb,  mrb_class_ptr(mrb_singleton_class(mrb, mrb_obj_value(c))), name);
+}
+
+static mrb_value
+mrb_mod_undef(mrb_state *mrb, mrb_value mod)
+{
+  struct RClass *c = mrb_class_ptr(mod);
+  mrb_int argc;
+  mrb_value *argv;
+
+  mrb_get_args(mrb, "*", &argv, &argc);
+  while (argc--) {
+    undef_method(mrb, c, mrb_symbol(*argv));
+    argv++;
+  }
+  return mrb_nil_value();
+}
+
+static mrb_value
+mod_define_method(mrb_state *mrb, mrb_value self)
+{
+  struct RClass *c = mrb_class_ptr(self);
+  struct RProc *p;
+  mrb_sym mid;
+  mrb_value blk;
+
+  mrb_get_args(mrb, "n&", &mid, &blk);
+  if (mrb_nil_p(blk)) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");
+  }
+  p = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb->proc_class);
+  mrb_proc_copy(p, mrb_proc_ptr(blk));
+  p->flags |= MRB_PROC_STRICT;
+  mrb_define_method_raw(mrb, c, mid, p);
+  return mrb_symbol_value(mid);
+}
+
+static void
+check_cv_name_str(mrb_state *mrb, mrb_value str)
+{
+  const char *s = RSTRING_PTR(str);
+  mrb_int len = RSTRING_LEN(str);
+
+  if (len < 3 || !(s[0] == '@' && s[1] == '@')) {
+    mrb_name_error(mrb, mrb_intern_str(mrb, str), "`%S' is not allowed as a class variable name", str);
+  }
+}
+
+static void
+check_cv_name_sym(mrb_state *mrb, mrb_sym id)
+{
+  check_cv_name_str(mrb, mrb_sym2str(mrb, id));
+}
+
+/* 15.2.2.4.16 */
+/*
+ *  call-seq:
+ *     obj.class_variable_defined?(symbol)    -> true or false
+ *
+ *  Returns <code>true</code> if the given class variable is defined
+ *  in <i>obj</i>.
+ *
+ *     class Fred
+ *       @@foo = 99
+ *     end
+ *     Fred.class_variable_defined?(:@@foo)    #=> true
+ *     Fred.class_variable_defined?(:@@bar)    #=> false
+ */
+
+static mrb_value
+mrb_mod_cvar_defined(mrb_state *mrb, mrb_value mod)
+{
+  mrb_sym id;
+
+  mrb_get_args(mrb, "n", &id);
+  check_cv_name_sym(mrb, id);
+  return mrb_bool_value(mrb_cv_defined(mrb, mod, id));
+}
+
+/* 15.2.2.4.17 */
+/*
+ *  call-seq:
+ *     mod.class_variable_get(symbol)    -> obj
+ *
+ *  Returns the value of the given class variable (or throws a
+ *  <code>NameError</code> exception). The <code>@@</code> part of the
+ *  variable name should be included for regular class variables
+ *
+ *     class Fred
+ *       @@foo = 99
+ *     end
+ *     Fred.class_variable_get(:@@foo)     #=> 99
+ */
+
+static mrb_value
+mrb_mod_cvar_get(mrb_state *mrb, mrb_value mod)
+{
+  mrb_sym id;
+
+  mrb_get_args(mrb, "n", &id);
+  check_cv_name_sym(mrb, id);
+  return mrb_cv_get(mrb, mod, id);
+}
+
+/* 15.2.2.4.18 */
+/*
+ *  call-seq:
+ *     obj.class_variable_set(symbol, obj)    -> obj
+ *
+ *  Sets the class variable names by <i>symbol</i> to
+ *  <i>object</i>.
+ *
+ *     class Fred
+ *       @@foo = 99
+ *       def foo
+ *         @@foo
+ *       end
+ *     end
+ *     Fred.class_variable_set(:@@foo, 101)     #=> 101
+ *     Fred.new.foo                             #=> 101
+ */
+
+static mrb_value
+mrb_mod_cvar_set(mrb_state *mrb, mrb_value mod)
+{
+  mrb_value value;
+  mrb_sym id;
+
+  mrb_get_args(mrb, "no", &id, &value);
+  check_cv_name_sym(mrb, id);
+  mrb_cv_set(mrb, mod, id, value);
+  return value;
+}
+
+/* 15.2.2.4.39 */
+/*
+ *  call-seq:
+ *     remove_class_variable(sym)    -> obj
+ *
+ *  Removes the definition of the <i>sym</i>, returning that
+ *  constant's value.
+ *
+ *     class Dummy
+ *       @@var = 99
+ *       puts @@var
+ *       p class_variables
+ *       remove_class_variable(:@@var)
+ *       p class_variables
+ *     end
+ *
+ *  <em>produces:</em>
+ *
+ *     99
+ *     [:@@var]
+ *     []
+ */
+
+static mrb_value
+mrb_mod_remove_cvar(mrb_state *mrb, mrb_value mod)
+{
+  mrb_value val;
+  mrb_sym id;
+
+  mrb_get_args(mrb, "n", &id);
+  check_cv_name_sym(mrb, id);
+
+  val = mrb_iv_remove(mrb, mod, id);
+  if (!mrb_undef_p(val)) return val;
+
+  if (mrb_cv_defined(mrb, mod, id)) {
+    mrb_name_error(mrb, id, "cannot remove %S for %S",
+                   mrb_sym2str(mrb, id), mod);
+  }
+
+  mrb_name_error(mrb, id, "class variable %S not defined for %S",
+                 mrb_sym2str(mrb, id), mod);
+
+ /* not reached */
+ return mrb_nil_value();
+}
+
+/* 15.2.2.4.34 */
+/*
+ *  call-seq:
+ *     mod.method_defined?(symbol)    -> true or false
+ *
+ *  Returns +true+ if the named method is defined by
+ *  _mod_ (or its included modules and, if _mod_ is a class,
+ *  its ancestors). Public and protected methods are matched.
+ *
+ *     module A
+ *       def method1()  end
+ *     end
+ *     class B
+ *       def method2()  end
+ *     end
+ *     class C < B
+ *       include A
+ *       def method3()  end
+ *     end
+ *
+ *     A.method_defined? :method1    #=> true
+ *     C.method_defined? "method1"   #=> true
+ *     C.method_defined? "method2"   #=> true
+ *     C.method_defined? "method3"   #=> true
+ *     C.method_defined? "method4"   #=> false
+ */
+
+static mrb_value
+mrb_mod_method_defined(mrb_state *mrb, mrb_value mod)
+{
+  mrb_sym id;
+
+  mrb_get_args(mrb, "n", &id);
+  return mrb_bool_value(mrb_obj_respond_to(mrb, mrb_class_ptr(mod), id));
+}
+
+static void
+remove_method(mrb_state *mrb, mrb_value mod, mrb_sym mid)
+{
+  struct RClass *c = mrb_class_ptr(mod);
+  khash_t(mt) *h = c->mt;
+  khiter_t k;
+
+  if (h) {
+    k = kh_get(mt, mrb, h, mid);
+    if (k != kh_end(h)) {
+      kh_del(mt, mrb, h, k);
+      return;
+    }
+  }
+
+  mrb_name_error(mrb, mid, "method `%S' not defined in %S",
+    mrb_sym2str(mrb, mid), mod);
+}
+
+/* 15.2.2.4.41 */
+/*
+ *  call-seq:
+ *     remove_method(symbol)   -> self
+ *
+ *  Removes the method identified by _symbol_ from the current
+ *  class. For an example, see <code>Module.undef_method</code>.
+ */
+
+static mrb_value
+mrb_mod_remove_method(mrb_state *mrb, mrb_value mod)
+{
+  mrb_int argc;
+  mrb_value *argv;
+
+  mrb_get_args(mrb, "*", &argv, &argc);
+  while (argc--) {
+    remove_method(mrb, mod, mrb_symbol(*argv));
+    argv++;
+  }
+  return mod;
+}
+
+
+
+static void
+check_const_name_str(mrb_state *mrb, mrb_value str)
+{
+  if (RSTRING_LEN(str) < 1 || !ISUPPER(*RSTRING_PTR(str))) {
+    mrb_name_error(mrb, mrb_intern_str(mrb, str), "wrong constant name %S", str);
+  }
+}
+
+static void
+check_const_name_sym(mrb_state *mrb, mrb_sym id)
+{
+  check_const_name_str(mrb, mrb_sym2str(mrb, id));
+}
+
+static mrb_value
+const_defined(mrb_state *mrb, mrb_value mod, mrb_sym id, mrb_bool inherit)
+{
+  if (inherit) {
+    return mrb_bool_value(mrb_const_defined(mrb, mod, id));
+  }
+  return mrb_bool_value(mrb_const_defined_at(mrb, mod, id));
+}
+
+static mrb_value
+mrb_mod_const_defined(mrb_state *mrb, mrb_value mod)
+{
+  mrb_sym id;
+  mrb_bool inherit = TRUE;
+
+  mrb_get_args(mrb, "n|b", &id, &inherit);
+  check_const_name_sym(mrb, id);
+  return const_defined(mrb, mod, id, inherit);
+}
+
+static mrb_value
+mrb_mod_const_get(mrb_state *mrb, mrb_value mod)
+{
+  mrb_sym id;
+
+  mrb_get_args(mrb, "n", &id);
+  check_const_name_sym(mrb, id);
+  return mrb_const_get(mrb, mod, id);
+}
+
+static mrb_value
+mrb_mod_const_set(mrb_state *mrb, mrb_value mod)
+{
+  mrb_sym id;
+  mrb_value value;
+
+  mrb_get_args(mrb, "no", &id, &value);
+  check_const_name_sym(mrb, id);
+  mrb_const_set(mrb, mod, id, value);
+  return value;
+}
+
+static mrb_value
+mrb_mod_remove_const(mrb_state *mrb, mrb_value mod)
+{
+  mrb_sym id;
+  mrb_value val;
+
+  mrb_get_args(mrb, "n", &id);
+  check_const_name_sym(mrb, id);
+  val = mrb_iv_remove(mrb, mod, id);
+  if (mrb_undef_p(val)) {
+    mrb_name_error(mrb, id, "constant %S not defined", mrb_sym2str(mrb, id));
+  }
+  return val;
+}
+
+static mrb_value
+mrb_mod_const_missing(mrb_state *mrb, mrb_value mod)
+{
+  mrb_sym sym;
+
+  mrb_get_args(mrb, "n", &sym);
+
+  if (mrb_class_real(mrb_class_ptr(mod)) != mrb->object_class) {
+    mrb_name_error(mrb, sym, "uninitialized constant %S::%S",
+                   mod,
+                   mrb_sym2str(mrb, sym));
+  }
+  else {
+    mrb_name_error(mrb, sym, "uninitialized constant %S",
+                   mrb_sym2str(mrb, sym));
+  }
+  /* not reached */
+  return mrb_nil_value();
+}
+
+static mrb_value
+mrb_mod_s_constants(mrb_state *mrb, mrb_value mod)
+{
+  mrb_raise(mrb, E_NOTIMP_ERROR, "Module.constants not implemented");
+  return mrb_nil_value();       /* not reached */
+}
+
+static mrb_value
+mrb_mod_eqq(mrb_state *mrb, mrb_value mod)
+{
+  mrb_value obj;
+  mrb_bool eqq;
+
+  mrb_get_args(mrb, "o", &obj);
+  eqq = mrb_obj_is_kind_of(mrb, obj, mrb_class_ptr(mod));
+
+  return mrb_bool_value(eqq);
+}
+
+MRB_API mrb_value
+mrb_mod_module_function(mrb_state *mrb, mrb_value mod)
+{
+  mrb_value *argv;
+  mrb_int argc, i;
+  mrb_sym mid;
+  struct RProc *method_rproc;
+  struct RClass *rclass;
+  int ai;
+
+  mrb_check_type(mrb, mod, MRB_TT_MODULE);
+
+  mrb_get_args(mrb, "*", &argv, &argc);
+  if(argc == 0) {
+    /* set MODFUNC SCOPE if implemented */
+    return mod;
+  }
+
+  /* set PRIVATE method visibility if implemented */
+  /* mrb_mod_dummy_visibility(mrb, mod); */
+
+  for (i=0; i<argc; i++) {
+    mrb_check_type(mrb, argv[i], MRB_TT_SYMBOL);
+
+    mid = mrb_symbol(argv[i]);
+    rclass = mrb_class_ptr(mod);
+    method_rproc = mrb_method_search(mrb, rclass, mid);
+
+    prepare_singleton_class(mrb, (struct RBasic*)rclass);
+    ai = mrb_gc_arena_save(mrb);
+    mrb_define_method_raw(mrb, rclass->c, mid, method_rproc);
+    mrb_gc_arena_restore(mrb, ai);
+  }
+
+  return mod;
+}
+
+void
+mrb_init_class(mrb_state *mrb)
+{
+  struct RClass *bob;           /* BasicObject */
+  struct RClass *obj;           /* Object */
+  struct RClass *mod;           /* Module */
+  struct RClass *cls;           /* Class */
+
+  /* boot class hierarchy */
+  bob = boot_defclass(mrb, 0);
+  obj = boot_defclass(mrb, bob); mrb->object_class = obj;
+  mod = boot_defclass(mrb, obj); mrb->module_class = mod;/* obj -> mod */
+  cls = boot_defclass(mrb, mod); mrb->class_class = cls; /* obj -> cls */
+  /* fix-up loose ends */
+  bob->c = obj->c = mod->c = cls->c = cls;
+  make_metaclass(mrb, bob);
+  make_metaclass(mrb, obj);
+  make_metaclass(mrb, mod);
+  make_metaclass(mrb, cls);
+
+  /* name basic classes */
+  mrb_define_const(mrb, bob, "BasicObject", mrb_obj_value(bob));
+  mrb_define_const(mrb, obj, "BasicObject", mrb_obj_value(bob));
+  mrb_define_const(mrb, obj, "Object",      mrb_obj_value(obj));
+  mrb_define_const(mrb, obj, "Module",      mrb_obj_value(mod));
+  mrb_define_const(mrb, obj, "Class",       mrb_obj_value(cls));
+
+  /* name each classes */
+  name_class(mrb, bob, mrb_intern_lit(mrb, "BasicObject"));
+  name_class(mrb, obj, mrb_intern_lit(mrb, "Object"));           /* 15.2.1 */
+  name_class(mrb, mod, mrb_intern_lit(mrb, "Module"));           /* 15.2.2 */
+  name_class(mrb, cls, mrb_intern_lit(mrb, "Class"));            /* 15.2.3 */
+
+  mrb->proc_class = mrb_define_class(mrb, "Proc", mrb->object_class);  /* 15.2.17 */
+  MRB_SET_INSTANCE_TT(mrb->proc_class, MRB_TT_PROC);
+
+  MRB_SET_INSTANCE_TT(cls, MRB_TT_CLASS);
+  mrb_define_method(mrb, bob, "initialize",              mrb_bob_init,             MRB_ARGS_NONE());
+  mrb_define_method(mrb, bob, "!",                       mrb_bob_not,              MRB_ARGS_NONE());
+  mrb_define_method(mrb, bob, "method_missing",          mrb_bob_missing,          MRB_ARGS_ANY());  /* 15.3.1.3.30 */
+
+  mrb_define_class_method(mrb, cls, "new",               mrb_class_new_class,      MRB_ARGS_OPT(1));
+  mrb_define_method(mrb, cls, "superclass",              mrb_class_superclass,     MRB_ARGS_NONE()); /* 15.2.3.3.4 */
+  mrb_define_method(mrb, cls, "new",                     mrb_instance_new,         MRB_ARGS_ANY());  /* 15.2.3.3.3 */
+  mrb_define_method(mrb, cls, "initialize",              mrb_class_initialize,     MRB_ARGS_OPT(1)); /* 15.2.3.3.1 */
+  mrb_define_method(mrb, cls, "inherited",               mrb_bob_init,             MRB_ARGS_REQ(1));
+
+  MRB_SET_INSTANCE_TT(mod, MRB_TT_MODULE);
+  mrb_define_method(mrb, mod, "class_variable_defined?", mrb_mod_cvar_defined,     MRB_ARGS_REQ(1)); /* 15.2.2.4.16 */
+  mrb_define_method(mrb, mod, "class_variable_get",      mrb_mod_cvar_get,         MRB_ARGS_REQ(1)); /* 15.2.2.4.17 */
+  mrb_define_method(mrb, mod, "class_variable_set",      mrb_mod_cvar_set,         MRB_ARGS_REQ(2)); /* 15.2.2.4.18 */
+  mrb_define_method(mrb, mod, "extend_object",           mrb_mod_extend_object,    MRB_ARGS_REQ(1)); /* 15.2.2.4.25 */
+  mrb_define_method(mrb, mod, "extended",                mrb_bob_init,             MRB_ARGS_REQ(1)); /* 15.2.2.4.26 */
+  mrb_define_method(mrb, mod, "include",                 mrb_mod_include,          MRB_ARGS_ANY());  /* 15.2.2.4.27 */
+  mrb_define_method(mrb, mod, "include?",                mrb_mod_include_p,        MRB_ARGS_REQ(1)); /* 15.2.2.4.28 */
+  mrb_define_method(mrb, mod, "append_features",         mrb_mod_append_features,  MRB_ARGS_REQ(1)); /* 15.2.2.4.10 */
+  mrb_define_method(mrb, mod, "class_eval",              mrb_mod_module_eval,      MRB_ARGS_ANY());  /* 15.2.2.4.15 */
+  mrb_define_method(mrb, mod, "included",                mrb_bob_init,             MRB_ARGS_REQ(1)); /* 15.2.2.4.29 */
+  mrb_define_method(mrb, mod, "included_modules",        mrb_mod_included_modules, MRB_ARGS_NONE()); /* 15.2.2.4.30 */
+  mrb_define_method(mrb, mod, "initialize",              mrb_mod_initialize,       MRB_ARGS_NONE()); /* 15.2.2.4.31 */
+  mrb_define_method(mrb, mod, "instance_methods",        mrb_mod_instance_methods, MRB_ARGS_ANY());  /* 15.2.2.4.33 */
+  mrb_define_method(mrb, mod, "method_defined?",         mrb_mod_method_defined,   MRB_ARGS_REQ(1)); /* 15.2.2.4.34 */
+  mrb_define_method(mrb, mod, "module_eval",             mrb_mod_module_eval,      MRB_ARGS_ANY());  /* 15.2.2.4.35 */
+  mrb_define_method(mrb, mod, "module_function",         mrb_mod_module_function,  MRB_ARGS_ANY());
+  mrb_define_method(mrb, mod, "private",                 mrb_mod_dummy_visibility, MRB_ARGS_ANY());  /* 15.2.2.4.36 */
+  mrb_define_method(mrb, mod, "protected",               mrb_mod_dummy_visibility, MRB_ARGS_ANY());  /* 15.2.2.4.37 */
+  mrb_define_method(mrb, mod, "public",                  mrb_mod_dummy_visibility, MRB_ARGS_ANY());  /* 15.2.2.4.38 */
+  mrb_define_method(mrb, mod, "remove_class_variable",   mrb_mod_remove_cvar,      MRB_ARGS_REQ(1)); /* 15.2.2.4.39 */
+  mrb_define_method(mrb, mod, "remove_method",           mrb_mod_remove_method,    MRB_ARGS_ANY());  /* 15.2.2.4.41 */
+  mrb_define_method(mrb, mod, "attr_reader",             mrb_mod_attr_reader,      MRB_ARGS_ANY());  /* 15.2.2.4.13 */
+  mrb_define_method(mrb, mod, "attr_writer",             mrb_mod_attr_writer,      MRB_ARGS_ANY());  /* 15.2.2.4.14 */
+  mrb_define_method(mrb, mod, "to_s",                    mrb_mod_to_s,             MRB_ARGS_NONE());
+  mrb_define_method(mrb, mod, "inspect",                 mrb_mod_to_s,             MRB_ARGS_NONE());
+  mrb_define_method(mrb, mod, "alias_method",            mrb_mod_alias,            MRB_ARGS_ANY());  /* 15.2.2.4.8 */
+  mrb_define_method(mrb, mod, "ancestors",               mrb_mod_ancestors,        MRB_ARGS_NONE()); /* 15.2.2.4.9 */
+  mrb_define_method(mrb, mod, "undef_method",            mrb_mod_undef,            MRB_ARGS_ANY());  /* 15.2.2.4.41 */
+  mrb_define_method(mrb, mod, "const_defined?",          mrb_mod_const_defined,    MRB_ARGS_ARG(1,1)); /* 15.2.2.4.20 */
+  mrb_define_method(mrb, mod, "const_get",               mrb_mod_const_get,        MRB_ARGS_REQ(1)); /* 15.2.2.4.21 */
+  mrb_define_method(mrb, mod, "const_set",               mrb_mod_const_set,        MRB_ARGS_REQ(2)); /* 15.2.2.4.23 */
+  mrb_define_method(mrb, mod, "constants",               mrb_mod_constants,        MRB_ARGS_OPT(1)); /* 15.2.2.4.24 */
+  mrb_define_method(mrb, mod, "remove_const",            mrb_mod_remove_const,     MRB_ARGS_REQ(1)); /* 15.2.2.4.40 */
+  mrb_define_method(mrb, mod, "const_missing",           mrb_mod_const_missing,    MRB_ARGS_REQ(1));
+  mrb_define_method(mrb, mod, "define_method",           mod_define_method,        MRB_ARGS_REQ(1));
+  mrb_define_method(mrb, mod, "class_variables",         mrb_mod_class_variables,  MRB_ARGS_NONE()); /* 15.2.2.4.19 */
+  mrb_define_method(mrb, mod, "===",                     mrb_mod_eqq,              MRB_ARGS_REQ(1));
+  mrb_define_class_method(mrb, mod, "constants",         mrb_mod_s_constants,      MRB_ARGS_ANY());  /* 15.2.2.3.1 */
+
+  mrb_undef_method(mrb, cls, "append_features");
+  mrb_undef_method(mrb, cls, "extend_object");
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/codegen.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,3146 @@
+/*
+** codegen.c - mruby code generator
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <ctype.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mruby.h"
+#include "mruby/compile.h"
+#include "mruby/proc.h"
+#include "mruby/numeric.h"
+#include "mruby/string.h"
+#include "mruby/debug.h"
+#include "node.h"
+#include "mruby/opcode.h"
+#include "mruby/re.h"
+#include "mrb_throw.h"
+
+typedef mrb_ast_node node;
+typedef struct mrb_parser_state parser_state;
+
+enum looptype {
+  LOOP_NORMAL,
+  LOOP_BLOCK,
+  LOOP_FOR,
+  LOOP_BEGIN,
+  LOOP_RESCUE,
+};
+
+struct loopinfo {
+  enum looptype type;
+  int pc1, pc2, pc3, acc;
+  int ensure_level;
+  struct loopinfo *prev;
+};
+
+typedef struct scope {
+  mrb_state *mrb;
+  mrb_pool *mpool;
+  struct mrb_jmpbuf jmp;
+
+  struct scope *prev;
+
+  node *lv;
+
+  int sp;
+  int pc;
+  int lastlabel;
+  int ainfo:15;
+  mrb_bool mscope:1;
+
+  struct loopinfo *loop;
+  int ensure_level;
+  char const *filename;
+  uint16_t lineno;
+
+  mrb_code *iseq;
+  uint16_t *lines;
+  int icapa;
+
+  mrb_irep *irep;
+  size_t pcapa;
+  size_t scapa;
+  size_t rcapa;
+
+  uint16_t nlocals;
+  uint16_t nregs;
+  int ai;
+
+  int debug_start_pos;
+  uint16_t filename_index;
+  parser_state* parser;
+} codegen_scope;
+
+static codegen_scope* scope_new(mrb_state *mrb, codegen_scope *prev, node *lv);
+static void scope_finish(codegen_scope *s);
+static struct loopinfo *loop_push(codegen_scope *s, enum looptype t);
+static void loop_break(codegen_scope *s, node *tree);
+static void loop_pop(codegen_scope *s, int val);
+
+static void gen_assignment(codegen_scope *s, node *tree, int sp, int val);
+static void gen_vmassignment(codegen_scope *s, node *tree, int rhs, int val);
+
+static void codegen(codegen_scope *s, node *tree, int val);
+static void raise_error(codegen_scope *s, const char *msg);
+
+static void
+codegen_error(codegen_scope *s, const char *message)
+{
+  if (!s) return;
+  while (s->prev) {
+    codegen_scope *tmp = s->prev;
+    mrb_pool_close(s->mpool);
+    s = tmp;
+  }
+#ifdef ENABLE_STDIO
+  if (s->filename && s->lineno) {
+    fprintf(stderr, "codegen error:%s:%d: %s\n", s->filename, s->lineno, message);
+  }
+  else {
+    fprintf(stderr, "codegen error: %s\n", message);
+  }
+#endif
+  MRB_THROW(&s->jmp);
+}
+
+static void*
+codegen_palloc(codegen_scope *s, size_t len)
+{
+  void *p = mrb_pool_alloc(s->mpool, len);
+
+  if (!p) codegen_error(s, "pool memory allocation");
+  return p;
+}
+
+static void*
+codegen_malloc(codegen_scope *s, size_t len)
+{
+  void *p = mrb_malloc_simple(s->mrb, len);
+
+  if (!p) codegen_error(s, "mrb_malloc");
+  return p;
+}
+
+static void*
+codegen_realloc(codegen_scope *s, void *p, size_t len)
+{
+  p = mrb_realloc_simple(s->mrb, p, len);
+
+  if (!p && len > 0) codegen_error(s, "mrb_realloc");
+  return p;
+}
+
+static int
+new_label(codegen_scope *s)
+{
+  s->lastlabel = s->pc;
+  return s->pc;
+}
+
+static inline int
+genop(codegen_scope *s, mrb_code i)
+{
+  if (s->pc == s->icapa) {
+    s->icapa *= 2;
+    s->iseq = (mrb_code *)codegen_realloc(s, s->iseq, sizeof(mrb_code)*s->icapa);
+    if (s->lines) {
+      s->lines = (uint16_t*)codegen_realloc(s, s->lines, sizeof(short)*s->icapa);
+      s->irep->lines = s->lines;
+    }
+  }
+  s->iseq[s->pc] = i;
+  if (s->lines) {
+    s->lines[s->pc] = s->lineno;
+  }
+  return s->pc++;
+}
+
+#define NOVAL  0
+#define VAL    1
+
+static mrb_bool
+no_optimize(codegen_scope *s)
+{
+  if (s && s->parser && s->parser->no_optimize)
+    return TRUE;
+  return FALSE;
+}
+
+static int
+genop_peep(codegen_scope *s, mrb_code i, int val)
+{
+  /* peephole optimization */
+  if (!no_optimize(s) && s->lastlabel != s->pc && s->pc > 0) {
+    mrb_code i0 = s->iseq[s->pc-1];
+    int c1 = GET_OPCODE(i);
+    int c0 = GET_OPCODE(i0);
+
+    switch (c1) {
+    case OP_MOVE:
+      if (GETARG_A(i) == GETARG_B(i)) {
+        /* skip useless OP_MOVE */
+        return 0;
+      }
+      if (val) break;
+      switch (c0) {
+      case OP_MOVE:
+        if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i) == GETARG_B(i0)) {
+          /* skip swapping OP_MOVE */
+          return 0;
+        }
+        if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) {
+          s->pc--;
+          return genop_peep(s, MKOP_AB(OP_MOVE, GETARG_A(i), GETARG_B(i0)), val);
+        }
+        break;
+      case OP_LOADI:
+        if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) {
+          s->iseq[s->pc-1] = MKOP_AsBx(OP_LOADI, GETARG_A(i), GETARG_sBx(i0));
+          return 0;
+        }
+        break;
+      case OP_ARRAY:
+      case OP_HASH:
+      case OP_RANGE:
+      case OP_AREF:
+      case OP_GETUPVAR:
+        if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) {
+          s->iseq[s->pc-1] = MKOP_ABC(c0, GETARG_A(i), GETARG_B(i0), GETARG_C(i0));
+          return 0;
+        }
+        break;
+      case OP_LOADSYM:
+      case OP_GETGLOBAL:
+      case OP_GETIV:
+      case OP_GETCV:
+      case OP_GETCONST:
+      case OP_GETSPECIAL:
+      case OP_LOADL:
+      case OP_STRING:
+        if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) {
+          s->iseq[s->pc-1] = MKOP_ABx(c0, GETARG_A(i), GETARG_Bx(i0));
+          return 0;
+        }
+        break;
+      case OP_SCLASS:
+        if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) {
+          s->iseq[s->pc-1] = MKOP_AB(c0, GETARG_A(i), GETARG_B(i0));
+          return 0;
+        }
+        break;
+      case OP_LOADNIL:
+      case OP_LOADSELF:
+      case OP_LOADT:
+      case OP_LOADF:
+      case OP_OCLASS:
+        if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) {
+          s->iseq[s->pc-1] = MKOP_A(c0, GETARG_A(i));
+          return 0;
+        }
+        break;
+      default:
+        break;
+      }
+      break;
+    case OP_SETIV:
+    case OP_SETCV:
+    case OP_SETCONST:
+    case OP_SETMCNST:
+    case OP_SETGLOBAL:
+      if (val) break;
+      if (c0 == OP_MOVE) {
+        if (GETARG_A(i) == GETARG_A(i0)) {
+          s->iseq[s->pc-1] = MKOP_ABx(c1, GETARG_B(i0), GETARG_Bx(i));
+          return 0;
+        }
+      }
+      break;
+    case OP_SETUPVAR:
+      if (val) break;
+      if (c0 == OP_MOVE) {
+        if (GETARG_A(i) == GETARG_A(i0)) {
+          s->iseq[s->pc-1] = MKOP_ABC(c1, GETARG_B(i0), GETARG_B(i), GETARG_C(i));
+          return 0;
+        }
+      }
+      break;
+    case OP_EPOP:
+      if (c0 == OP_EPOP) {
+        s->iseq[s->pc-1] = MKOP_A(OP_EPOP, GETARG_A(i0)+GETARG_A(i));
+        return 0;
+      }
+      break;
+    case OP_POPERR:
+      if (c0 == OP_POPERR) {
+        s->iseq[s->pc-1] = MKOP_A(OP_POPERR, GETARG_A(i0)+GETARG_A(i));
+        return 0;
+      }
+      break;
+    case OP_RETURN:
+      switch (c0) {
+      case OP_RETURN:
+        return 0;
+      case OP_MOVE:
+        if (GETARG_A(i0) >= s->nlocals) {
+          s->iseq[s->pc-1] = MKOP_AB(OP_RETURN, GETARG_B(i0), OP_R_NORMAL);
+          return 0;
+        }
+        break;
+      case OP_SETIV:
+      case OP_SETCV:
+      case OP_SETCONST:
+      case OP_SETMCNST:
+      case OP_SETUPVAR:
+      case OP_SETGLOBAL:
+        s->pc--;
+        genop_peep(s, i0, NOVAL);
+        i0 = s->iseq[s->pc-1];
+        return genop(s, MKOP_AB(OP_RETURN, GETARG_A(i0), OP_R_NORMAL));
+#if 0
+      case OP_SEND:
+        if (GETARG_B(i) == OP_R_NORMAL && GETARG_A(i) == GETARG_A(i0)) {
+          s->iseq[s->pc-1] = MKOP_ABC(OP_TAILCALL, GETARG_A(i0), GETARG_B(i0), GETARG_C(i0));
+          return;
+        }
+        break;
+#endif
+      default:
+        break;
+      }
+      break;
+    case OP_ADD:
+    case OP_SUB:
+      if (c0 == OP_LOADI) {
+        int c = GETARG_sBx(i0);
+
+        if (c1 == OP_SUB) c = -c;
+        if (c > 127 || c < -127) break;
+        if (0 <= c)
+          s->iseq[s->pc-1] = MKOP_ABC(OP_ADDI, GETARG_A(i), GETARG_B(i), c);
+        else
+          s->iseq[s->pc-1] = MKOP_ABC(OP_SUBI, GETARG_A(i), GETARG_B(i), -c);
+        return 0;
+      }
+    case OP_STRCAT:
+      if (c0 == OP_STRING) {
+        mrb_value v = s->irep->pool[GETARG_Bx(i0)];
+
+        if (mrb_string_p(v) && RSTRING_LEN(v) == 0) {
+          s->pc--;
+          return 0;
+        }
+      }
+      break;
+    case OP_JMPIF:
+    case OP_JMPNOT:
+      if (c0 == OP_MOVE && GETARG_A(i) == GETARG_A(i0)) {
+        s->iseq[s->pc-1] = MKOP_AsBx(c1, GETARG_B(i0), GETARG_sBx(i));
+        return s->pc-1;
+      }
+      break;
+    default:
+      break;
+    }
+  }
+  return genop(s, i);
+}
+
+static void
+scope_error(codegen_scope *s)
+{
+  exit(EXIT_FAILURE);
+}
+
+static inline void
+dispatch(codegen_scope *s, int pc)
+{
+  int diff = s->pc - pc;
+  mrb_code i = s->iseq[pc];
+  int c = GET_OPCODE(i);
+
+  s->lastlabel = s->pc;
+  switch (c) {
+  case OP_JMP:
+  case OP_JMPIF:
+  case OP_JMPNOT:
+  case OP_ONERR:
+    break;
+  default:
+#ifdef ENABLE_STDIO
+    fprintf(stderr, "bug: dispatch on non JMP op\n");
+#endif
+    scope_error(s);
+    break;
+  }
+  s->iseq[pc] = MKOP_AsBx(c, GETARG_A(i), diff);
+}
+
+static void
+dispatch_linked(codegen_scope *s, int pc)
+{
+  mrb_code i;
+  int pos;
+
+  if (!pc) return;
+  for (;;) {
+    i = s->iseq[pc];
+    pos = GETARG_sBx(i);
+    dispatch(s, pc);
+    if (!pos) break;
+    pc = pos;
+  }
+}
+
+#define nregs_update do {if (s->sp > s->nregs) s->nregs = s->sp;} while (0)
+static void
+push_(codegen_scope *s)
+{
+  if (s->sp > 511) {
+    codegen_error(s, "too complex expression");
+  }
+  s->sp++;
+  nregs_update;
+}
+
+#define push() push_(s)
+#define pop_(s) ((s)->sp--)
+#define pop() pop_(s)
+#define pop_n(n) (s->sp-=(n))
+#define cursp() (s->sp)
+
+static inline int
+new_lit(codegen_scope *s, mrb_value val)
+{
+  size_t i;
+  mrb_value *pv;
+
+  switch (mrb_type(val)) {
+  case MRB_TT_STRING:
+    for (i=0; i<s->irep->plen; i++) {
+      mrb_int len;
+      pv = &s->irep->pool[i];
+
+      if (mrb_type(*pv) != MRB_TT_STRING) continue;
+      if ((len = RSTRING_LEN(*pv)) != RSTRING_LEN(val)) continue;
+      if (memcmp(RSTRING_PTR(*pv), RSTRING_PTR(val), len) == 0)
+        return i;
+    }
+    break;
+  case MRB_TT_FLOAT:
+    for (i=0; i<s->irep->plen; i++) {
+      pv = &s->irep->pool[i];
+      if (mrb_type(*pv) != MRB_TT_FLOAT) continue;
+      if (mrb_float(*pv) == mrb_float(val)) return i;
+    }
+    break;
+  case MRB_TT_FIXNUM:
+    for (i=0; i<s->irep->plen; i++) {
+      pv = &s->irep->pool[i];
+      if (!mrb_fixnum_p(*pv)) continue;
+      if (mrb_fixnum(*pv) == mrb_fixnum(val)) return i;
+    }
+    break;
+  default:
+    /* should not happen */
+    return 0;
+  }
+
+  if (s->irep->plen == s->pcapa) {
+    s->pcapa *= 2;
+    s->irep->pool = (mrb_value *)codegen_realloc(s, s->irep->pool, sizeof(mrb_value)*s->pcapa);
+  }
+
+  pv = &s->irep->pool[s->irep->plen];
+  i = s->irep->plen++;
+
+  switch (mrb_type(val)) {
+  case MRB_TT_STRING:
+    *pv = mrb_str_pool(s->mrb, val);
+    break;
+
+  case MRB_TT_FLOAT:
+#ifdef MRB_WORD_BOXING
+    *pv = mrb_float_pool(s->mrb, mrb_float(val));
+    break;
+#endif
+  case MRB_TT_FIXNUM:
+    *pv = val;
+    break;
+
+  default:
+    /* should not happen */
+    break;
+  }
+  return i;
+}
+
+static inline int
+new_msym(codegen_scope *s, mrb_sym sym)
+{
+  size_t i, len;
+
+  mrb_assert(s->irep);
+
+  len = s->irep->slen;
+  if (len > 256) len = 256;
+  for (i=0; i<len; i++) {
+    if (s->irep->syms[i] == sym) return i;
+    if (s->irep->syms[i] == 0) break;
+  }
+  if (i == 256) {
+    codegen_error(s, "too many symbols (max 256)");
+  }
+  s->irep->syms[i] = sym;
+  if (i == s->irep->slen) s->irep->slen++;
+  return i;
+}
+
+static inline int
+new_sym(codegen_scope *s, mrb_sym sym)
+{
+  size_t i;
+
+  for (i=0; i<s->irep->slen; i++) {
+    if (s->irep->syms[i] == sym) return i;
+  }
+  if (s->irep->slen > 125 && s->irep->slen < 256) {
+    s->irep->syms = (mrb_sym *)codegen_realloc(s, s->irep->syms, sizeof(mrb_sym)*65536);
+    for (i = 0; i < 256 - s->irep->slen; i++) {
+      static const mrb_sym mrb_sym_zero = { 0 };
+      s->irep->syms[i + s->irep->slen] = mrb_sym_zero;
+    }
+    s->irep->slen = 256;
+  }
+  s->irep->syms[s->irep->slen] = sym;
+  return s->irep->slen++;
+}
+
+static int
+node_len(node *tree)
+{
+  int n = 0;
+
+  while (tree) {
+    n++;
+    tree = tree->cdr;
+  }
+  return n;
+}
+
+#define sym(x) ((mrb_sym)(intptr_t)(x))
+#define lv_name(lv) sym((lv)->car)
+static int
+lv_idx(codegen_scope *s, mrb_sym id)
+{
+  node *lv = s->lv;
+  int n = 1;
+
+  while (lv) {
+    if (lv_name(lv) == id) return n;
+    n++;
+    lv = lv->cdr;
+  }
+  return 0;
+}
+
+static void
+for_body(codegen_scope *s, node *tree)
+{
+  codegen_scope *prev = s;
+  int idx;
+  struct loopinfo *lp;
+  node *n2;
+  mrb_code c;
+
+  /* generate receiver */
+  codegen(s, tree->cdr->car, VAL);
+  /* generate loop-block */
+  s = scope_new(s->mrb, s, NULL);
+  if (s == NULL) {
+    raise_error(prev, "unexpected scope");
+  }
+
+  push();                       /* push for a block parameter */
+
+  lp = loop_push(s, LOOP_FOR);
+  lp->pc1 = new_label(s);
+
+  /* generate loop variable */
+  n2 = tree->car;
+  genop(s, MKOP_Ax(OP_ENTER, 0x40000));
+  if (n2->car && !n2->car->cdr && !n2->cdr) {
+    gen_assignment(s, n2->car->car, 1, NOVAL);
+  }
+  else {
+    gen_vmassignment(s, n2, 1, VAL);
+  }
+  codegen(s, tree->cdr->cdr->car, VAL);
+  pop();
+  if (s->pc > 0) {
+    c = s->iseq[s->pc-1];
+    if (GET_OPCODE(c) != OP_RETURN || GETARG_B(c) != OP_R_NORMAL || s->pc == s->lastlabel)
+      genop_peep(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL);
+  }
+  loop_pop(s, NOVAL);
+  scope_finish(s);
+  s = prev;
+  genop(s, MKOP_Abc(OP_LAMBDA, cursp(), s->irep->rlen-1, OP_L_BLOCK));
+  pop();
+  idx = new_msym(s, mrb_intern_lit(s->mrb, "each"));
+  genop(s, MKOP_ABC(OP_SENDB, cursp(), idx, 0));
+}
+
+static int
+lambda_body(codegen_scope *s, node *tree, int blk)
+{
+  mrb_code c;
+  codegen_scope *parent = s;
+  s = scope_new(s->mrb, s, tree->car);
+  if (s == NULL) {
+    raise_error(parent, "unexpected scope");
+  }
+
+  s->mscope = !blk;
+
+  if (blk) {
+    struct loopinfo *lp = loop_push(s, LOOP_BLOCK);
+    lp->pc1 = new_label(s);
+  }
+  tree = tree->cdr;
+  if (tree->car) {
+    mrb_aspec a;
+    int ma, oa, ra, pa, ka, kd, ba;
+    int pos, i;
+    node *n, *opt;
+
+    ma = node_len(tree->car->car);
+    n = tree->car->car;
+    while (n) {
+      n = n->cdr;
+    }
+    oa = node_len(tree->car->cdr->car);
+    ra = tree->car->cdr->cdr->car ? 1 : 0;
+    pa = node_len(tree->car->cdr->cdr->cdr->car);
+    ka = kd = 0;
+    ba = tree->car->cdr->cdr->cdr->cdr ? 1 : 0;
+
+    a = ((mrb_aspec)(ma & 0x1f) << 18)
+      | ((mrb_aspec)(oa & 0x1f) << 13)
+      | ((ra & 1) << 12)
+      | ((pa & 0x1f) << 7)
+      | ((ka & 0x1f) << 2)
+      | ((kd & 1)<< 1)
+      | (ba & 1);
+    s->ainfo = (((ma+oa) & 0x3f) << 6) /* (12bits = 6:1:5) */
+      | ((ra & 1) << 5)
+      | (pa & 0x1f);
+    genop(s, MKOP_Ax(OP_ENTER, a));
+    pos = new_label(s);
+    for (i=0; i<oa; i++) {
+      new_label(s);
+      genop(s, MKOP_sBx(OP_JMP, 0));
+    }
+    if (oa > 0) {
+      genop(s, MKOP_sBx(OP_JMP, 0));
+    }
+    opt = tree->car->cdr->car;
+    i = 0;
+    while (opt) {
+      int idx;
+
+      dispatch(s, pos+i);
+      codegen(s, opt->car->cdr, VAL);
+      idx = lv_idx(s, (mrb_sym)(intptr_t)opt->car->car);
+      pop();
+      genop_peep(s, MKOP_AB(OP_MOVE, idx, cursp()), NOVAL);
+      i++;
+      opt = opt->cdr;
+    }
+    if (oa > 0) {
+      dispatch(s, pos+i);
+    }
+  }
+  codegen(s, tree->cdr->car, VAL);
+  pop();
+  if (s->pc > 0) {
+    c = s->iseq[s->pc-1];
+    if (GET_OPCODE(c) != OP_RETURN || GETARG_B(c) != OP_R_NORMAL || s->pc == s->lastlabel) {
+      if (s->nregs == 0) {
+        genop(s, MKOP_A(OP_LOADNIL, 0));
+        genop(s, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL));
+      }
+      else {
+        genop_peep(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL);
+      }
+    }
+  }
+  if (blk) {
+    loop_pop(s, NOVAL);
+  }
+  scope_finish(s);
+  return parent->irep->rlen - 1;
+}
+
+static int
+scope_body(codegen_scope *s, node *tree, int val)
+{
+  codegen_scope *scope = scope_new(s->mrb, s, tree->car);
+  if (scope == NULL) {
+    raise_error(s, "unexpected scope");
+  }
+
+  codegen(scope, tree->cdr, VAL);
+  if (!s->iseq) {
+    genop(scope, MKOP_A(OP_STOP, 0));
+  }
+  else if (!val) {
+    genop(scope, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL));
+  }
+  else {
+    if (scope->nregs == 0) {
+      genop(scope, MKOP_A(OP_LOADNIL, 0));
+      genop(scope, MKOP_AB(OP_RETURN, 0, OP_R_NORMAL));
+    }
+    else {
+      genop_peep(scope, MKOP_AB(OP_RETURN, scope->sp-1, OP_R_NORMAL), NOVAL);
+    }
+  }
+  scope_finish(scope);
+  if (!s->irep) {
+    /* should not happen */
+    return 0;
+  }
+  return s->irep->rlen - 1;
+}
+
+static mrb_bool
+nosplat(node *t)
+{
+  while (t) {
+    if ((intptr_t)t->car->car == NODE_SPLAT) return FALSE;
+    t = t->cdr;
+  }
+  return TRUE;
+}
+
+static mrb_sym
+attrsym(codegen_scope *s, mrb_sym a)
+{
+  const char *name;
+  mrb_int len;
+  char *name2;
+
+  name = mrb_sym2name_len(s->mrb, a, &len);
+  name2 = (char *)codegen_palloc(s,
+                                 (size_t)len
+                                 + 1 /* '=' */
+                                 + 1 /* '\0' */
+                                 );
+  mrb_assert_int_fit(mrb_int, len, size_t, SIZE_MAX);
+  memcpy(name2, name, (size_t)len);
+  name2[len] = '=';
+  name2[len+1] = '\0';
+
+  return mrb_intern(s->mrb, name2, len+1);
+}
+
+static int
+gen_values(codegen_scope *s, node *t, int val)
+{
+  int n = 0;
+  int is_splat;
+
+  while (t) {
+    is_splat = (intptr_t)t->car->car == NODE_SPLAT; /* splat mode */
+    if (n >= 127 || is_splat) {
+      if (val) {
+        pop_n(n);
+        genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), n));
+        push();
+        codegen(s, t->car, VAL);
+        pop(); pop();
+        if (is_splat) {
+          genop(s, MKOP_AB(OP_ARYCAT, cursp(), cursp()+1));
+        }
+        else {
+          genop(s, MKOP_AB(OP_ARYPUSH, cursp(), cursp()+1));
+        }
+        t = t->cdr;
+        while (t) {
+          push();
+          codegen(s, t->car, VAL);
+          pop(); pop();
+          if ((intptr_t)t->car->car == NODE_SPLAT) {
+            genop(s, MKOP_AB(OP_ARYCAT, cursp(), cursp()+1));
+          }
+          else {
+            genop(s, MKOP_AB(OP_ARYPUSH, cursp(), cursp()+1));
+          }
+          t = t->cdr;
+        }
+      }
+      else {
+        codegen(s, t->car->cdr, NOVAL);
+        t = t->cdr;
+        while (t) {
+          codegen(s, t->car, NOVAL);
+          t = t->cdr;
+        }
+      }
+      return -1;
+    }
+    /* normal (no splat) mode */
+    codegen(s, t->car, val);
+    n++;
+    t = t->cdr;
+  }
+  return n;
+}
+
+#define CALL_MAXARGS 127
+
+static void
+gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val)
+{
+  mrb_sym sym = name ? name : sym(tree->cdr->car);
+  int idx;
+  int n = 0, noop = 0, sendv = 0, blk = 0;
+
+  codegen(s, tree->car, VAL); /* receiver */
+  idx = new_msym(s, sym);
+  tree = tree->cdr->cdr->car;
+  if (tree) {
+    n = gen_values(s, tree->car, VAL);
+    if (n < 0) {
+      n = noop = sendv = 1;
+      push();
+    }
+  }
+  if (sp) {
+    if (sendv) {
+      pop();
+      genop(s, MKOP_AB(OP_ARYPUSH, cursp(), sp));
+      push();
+    }
+    else {
+      genop(s, MKOP_AB(OP_MOVE, cursp(), sp));
+      push();
+      n++;
+    }
+  }
+  if (tree && tree->cdr) {
+    noop = 1;
+    codegen(s, tree->cdr, VAL);
+    pop();
+  }
+  else {
+    blk = cursp();
+  }
+  push();pop();
+  pop_n(n+1);
+  {
+    mrb_int symlen;
+    const char *symname = mrb_sym2name_len(s->mrb, sym, &symlen);
+
+    if (!noop && symlen == 1 && symname[0] == '+')  {
+      genop_peep(s, MKOP_ABC(OP_ADD, cursp(), idx, n), val);
+    }
+    else if (!noop && symlen == 1 && symname[0] == '-')  {
+      genop_peep(s, MKOP_ABC(OP_SUB, cursp(), idx, n), val);
+    }
+    else if (!noop && symlen == 1 && symname[0] == '*')  {
+      genop(s, MKOP_ABC(OP_MUL, cursp(), idx, n));
+    }
+    else if (!noop && symlen == 1 && symname[0] == '/')  {
+      genop(s, MKOP_ABC(OP_DIV, cursp(), idx, n));
+    }
+    else if (!noop && symlen == 1 && symname[0] == '<')  {
+      genop(s, MKOP_ABC(OP_LT, cursp(), idx, n));
+    }
+    else if (!noop && symlen == 2 && symname[0] == '<' && symname[1] == '=')  {
+      genop(s, MKOP_ABC(OP_LE, cursp(), idx, n));
+    }
+    else if (!noop && symlen == 1 && symname[0] == '>')  {
+      genop(s, MKOP_ABC(OP_GT, cursp(), idx, n));
+    }
+    else if (!noop && symlen == 2 && symname[0] == '>' && symname[1] == '=')  {
+      genop(s, MKOP_ABC(OP_GE, cursp(), idx, n));
+    }
+    else if (!noop && symlen == 2 && symname[0] == '=' && symname[1] == '=')  {
+      genop(s, MKOP_ABC(OP_EQ, cursp(), idx, n));
+    }
+    else {
+      if (sendv) n = CALL_MAXARGS;
+      if (blk > 0) {                   /* no block */
+        genop(s, MKOP_ABC(OP_SEND, cursp(), idx, n));
+      }
+      else {
+        genop(s, MKOP_ABC(OP_SENDB, cursp(), idx, n));
+      }
+    }
+  }
+  if (val) {
+    push();
+  }
+}
+
+static void
+gen_assignment(codegen_scope *s, node *tree, int sp, int val)
+{
+  int idx;
+  int type = (intptr_t)tree->car;
+
+  tree = tree->cdr;
+  switch ((intptr_t)type) {
+  case NODE_GVAR:
+    idx = new_sym(s, sym(tree));
+    genop_peep(s, MKOP_ABx(OP_SETGLOBAL, sp, idx), val);
+    break;
+  case NODE_LVAR:
+    idx = lv_idx(s, sym(tree));
+    if (idx > 0) {
+      if (idx != sp) {
+        genop_peep(s, MKOP_AB(OP_MOVE, idx, sp), val);
+      }
+      break;
+    }
+    else {                      /* upvar */
+      int lv = 0;
+      codegen_scope *up = s->prev;
+
+      while (up) {
+        idx = lv_idx(up, sym(tree));
+        if (idx > 0) {
+          genop_peep(s, MKOP_ABC(OP_SETUPVAR, sp, idx, lv), val);
+          break;
+        }
+        lv++;
+        up = up->prev;
+      }
+    }
+    break;
+  case NODE_IVAR:
+    idx = new_sym(s, sym(tree));
+    genop_peep(s, MKOP_ABx(OP_SETIV, sp, idx), val);
+    break;
+  case NODE_CVAR:
+    idx = new_sym(s, sym(tree));
+    genop_peep(s, MKOP_ABx(OP_SETCV, sp, idx), val);
+    break;
+  case NODE_CONST:
+    idx = new_sym(s, sym(tree));
+    genop_peep(s, MKOP_ABx(OP_SETCONST, sp, idx), val);
+    break;
+  case NODE_COLON2:
+    idx = new_sym(s, sym(tree->cdr));
+    genop_peep(s, MKOP_AB(OP_MOVE, cursp(), sp), NOVAL);
+    push();
+    codegen(s, tree->car, VAL);
+    pop_n(2);
+    genop_peep(s, MKOP_ABx(OP_SETMCNST, cursp(), idx), val);
+    break;
+
+  case NODE_CALL:
+    push();
+    gen_call(s, tree, attrsym(s, sym(tree->cdr->car)), sp, NOVAL);
+    pop();
+    if (val) {
+      genop_peep(s, MKOP_AB(OP_MOVE, cursp(), sp), val);
+    }
+    break;
+
+  default:
+#ifdef ENABLE_STDIO
+    printf("unknown lhs %d\n", type);
+#endif
+    break;
+  }
+  if (val) push();
+}
+
+static void
+gen_vmassignment(codegen_scope *s, node *tree, int rhs, int val)
+{
+  int n = 0, post = 0;
+  node *t, *p;
+
+  if (tree->car) {              /* pre */
+    t = tree->car;
+    n = 0;
+    while (t) {
+      genop(s, MKOP_ABC(OP_AREF, cursp(), rhs, n));
+      gen_assignment(s, t->car, cursp(), NOVAL);
+      n++;
+      t = t->cdr;
+    }
+  }
+  t = tree->cdr;
+  if (t) {
+    if (t->cdr) {               /* post count */
+      p = t->cdr->car;
+      while (p) {
+        post++;
+        p = p->cdr;
+      }
+    }
+    if (val) {
+      genop(s, MKOP_AB(OP_MOVE, cursp(), rhs));
+      push();
+    }
+    pop();
+    genop(s, MKOP_ABC(OP_APOST, cursp(), n, post));
+    n = 1;
+    if (t->car) {               /* rest */
+      gen_assignment(s, t->car, cursp(), NOVAL);
+    }
+    if (t->cdr && t->cdr->car) {
+      t = t->cdr->car;
+      while (t) {
+        gen_assignment(s, t->car, cursp()+n, NOVAL);
+        t = t->cdr;
+        n++;
+      }
+    }
+  }
+  else {
+    pop();
+  }
+}
+
+static void
+gen_send_intern(codegen_scope *s)
+{
+  pop();
+  genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "intern")), 0));
+  push();
+}
+static void
+gen_literal_array(codegen_scope *s, node *tree, mrb_bool sym, int val)
+{
+  if (val) {
+    int i = 0, j = 0;
+
+    while (tree) {
+      switch ((intptr_t)tree->car->car) {
+      case NODE_STR:
+        if ((tree->cdr == NULL) && ((intptr_t)tree->car->cdr->cdr == 0))
+          break;
+        /* fall through */
+      case NODE_BEGIN:
+        codegen(s, tree->car, VAL);
+        ++j;
+        break;
+
+      case NODE_LITERAL_DELIM:
+        if (j > 0) {
+          j = 0;
+          ++i;
+          if (sym)
+            gen_send_intern(s);
+        }
+        break;
+      }
+      if (j >= 2) {
+        pop(); pop();
+        genop_peep(s, MKOP_AB(OP_STRCAT, cursp(), cursp()+1), VAL);
+        push();
+        j = 1;
+      }
+      tree = tree->cdr;
+    }
+    if (j > 0) {
+      ++i;
+      if (sym)
+        gen_send_intern(s);
+    }
+    pop_n(i);
+    genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), i));
+    push();
+  }
+  else {
+    while (tree) {
+      switch ((intptr_t)tree->car->car) {
+      case NODE_BEGIN: case NODE_BLOCK:
+        codegen(s, tree->car, NOVAL);
+      }
+      tree = tree->cdr;
+    }
+  }
+}
+
+static void
+raise_error(codegen_scope *s, const char *msg)
+{
+  int idx = new_lit(s, mrb_str_new_cstr(s->mrb, msg));
+
+  genop(s, MKOP_ABx(OP_ERR, 1, idx));
+}
+
+static double
+readint_float(codegen_scope *s, const char *p, int base)
+{
+  const char *e = p + strlen(p);
+  double f = 0;
+  int n;
+
+  if (*p == '+') p++;
+  while (p < e) {
+    char c = *p;
+    c = tolower((unsigned char)c);
+    for (n=0; n<base; n++) {
+      if (mrb_digitmap[n] == c) {
+        f *= base;
+        f += n;
+        break;
+      }
+    }
+    if (n == base) {
+      codegen_error(s, "malformed readint input");
+    }
+    p++;
+  }
+  return f;
+}
+
+static mrb_int
+readint_mrb_int(codegen_scope *s, const char *p, int base, mrb_bool neg, mrb_bool *overflow)
+{
+  const char *e = p + strlen(p);
+  mrb_int result = 0;
+  int n;
+
+  mrb_assert(base >= 2 && base <= 36);
+  if (*p == '+') p++;
+  while (p < e) {
+    char c = *p;
+    c = tolower((unsigned char)c);
+    for (n=0; n<base; n++) {
+      if (mrb_digitmap[n] == c) {
+        break;
+      }
+    }
+    if (n == base) {
+      codegen_error(s, "malformed readint input");
+    }
+
+    if (neg) {
+      if ((MRB_INT_MIN + n)/base > result) {
+        *overflow = TRUE;
+        return 0;
+      }
+      result *= base;
+      result -= n;
+    }
+    else {
+      if ((MRB_INT_MAX - n)/base < result) {
+        *overflow = TRUE;
+        return 0;
+      }
+      result *= base;
+      result += n;
+    }
+    p++;
+  }
+  *overflow = FALSE;
+  return result;
+}
+
+static void
+codegen(codegen_scope *s, node *tree, int val)
+{
+  int nt;
+
+  if (!tree) return;
+
+  if (s->irep && s->filename_index != tree->filename_index) {
+    s->irep->filename = mrb_parser_get_filename(s->parser, s->filename_index);
+    mrb_debug_info_append_file(s->mrb, s->irep, s->debug_start_pos, s->pc);
+    s->debug_start_pos = s->pc;
+    s->filename_index = tree->filename_index;
+    s->filename = mrb_parser_get_filename(s->parser, tree->filename_index);
+  }
+
+  nt = (intptr_t)tree->car;
+  s->lineno = tree->lineno;
+  tree = tree->cdr;
+  switch (nt) {
+  case NODE_BEGIN:
+    if (val && !tree) {
+      genop(s, MKOP_A(OP_LOADNIL, cursp()));
+      push();
+    }
+    while (tree) {
+      codegen(s, tree->car, tree->cdr ? NOVAL : val);
+      tree = tree->cdr;
+    }
+    break;
+
+  case NODE_RESCUE:
+    {
+      int onerr, noexc, exend, pos1, pos2, tmp;
+      struct loopinfo *lp;
+
+      onerr = genop(s, MKOP_Bx(OP_ONERR, 0));
+      lp = loop_push(s, LOOP_BEGIN);
+      lp->pc1 = onerr;
+      if (tree->car) {
+        codegen(s, tree->car, val);
+        if (val) pop();
+      }
+      lp->type = LOOP_RESCUE;
+      noexc = genop(s, MKOP_Bx(OP_JMP, 0));
+      dispatch(s, onerr);
+      tree = tree->cdr;
+      exend = 0;
+      pos1 = 0;
+      if (tree->car) {
+        node *n2 = tree->car;
+        int exc = cursp();
+
+        genop(s, MKOP_A(OP_RESCUE, exc));
+        push();
+        while (n2) {
+          node *n3 = n2->car;
+          node *n4 = n3->car;
+
+          if (pos1) dispatch(s, pos1);
+          pos2 = 0;
+          do {
+            if (n4) {
+              codegen(s, n4->car, VAL);
+            }
+            else {
+              genop(s, MKOP_ABx(OP_GETCONST, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "StandardError"))));
+              push();
+            }
+            genop(s, MKOP_AB(OP_MOVE, cursp(), exc));
+            pop();
+            if (n4 && n4->car && (intptr_t)n4->car->car == NODE_SPLAT) {
+              genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "__case_eqq")), 1));
+            }
+            else {
+              genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "===")), 1));
+            }
+            tmp = genop(s, MKOP_AsBx(OP_JMPIF, cursp(), pos2));
+            pos2 = tmp;
+            if (n4) {
+              n4 = n4->cdr;
+            }
+          } while (n4);
+          pos1 = genop(s, MKOP_sBx(OP_JMP, 0));
+          dispatch_linked(s, pos2);
+
+          pop();
+          if (n3->cdr->car) {
+            gen_assignment(s, n3->cdr->car, exc, NOVAL);
+          }
+          if (n3->cdr->cdr->car) {
+            codegen(s, n3->cdr->cdr->car, val);
+            if (val) pop();
+          }
+          tmp = genop(s, MKOP_sBx(OP_JMP, exend));
+          exend = tmp;
+          n2 = n2->cdr;
+          push();
+        }
+        if (pos1) {
+          dispatch(s, pos1);
+          genop(s, MKOP_A(OP_RAISE, exc));
+        }
+      }
+      pop();
+      tree = tree->cdr;
+      dispatch(s, noexc);
+      genop(s, MKOP_A(OP_POPERR, 1));
+      if (tree->car) {
+        codegen(s, tree->car, val);
+      }
+      else if (val) {
+        push();
+      }
+      dispatch_linked(s, exend);
+      loop_pop(s, NOVAL);
+    }
+    break;
+
+  case NODE_ENSURE:
+    {
+      int idx;
+      int epush = s->pc;
+
+      genop(s, MKOP_Bx(OP_EPUSH, 0));
+      s->ensure_level++;
+      codegen(s, tree->car, val);
+      idx = scope_body(s, tree->cdr, NOVAL);
+      s->iseq[epush] = MKOP_Bx(OP_EPUSH, idx);
+      s->ensure_level--;
+      genop_peep(s, MKOP_A(OP_EPOP, 1), NOVAL);
+    }
+    break;
+
+  case NODE_LAMBDA:
+    {
+      int idx = lambda_body(s, tree, 1);
+
+      genop(s, MKOP_Abc(OP_LAMBDA, cursp(), idx, OP_L_LAMBDA));
+      push();
+    }
+    break;
+
+  case NODE_BLOCK:
+    {
+      int idx = lambda_body(s, tree, 1);
+
+      genop(s, MKOP_Abc(OP_LAMBDA, cursp(), idx, OP_L_BLOCK));
+      push();
+    }
+    break;
+
+  case NODE_IF:
+    {
+      int pos1, pos2;
+      node *e = tree->cdr->cdr->car;
+
+      codegen(s, tree->car, VAL);
+      pop();
+      pos1 = genop_peep(s, MKOP_AsBx(OP_JMPNOT, cursp(), 0), NOVAL);
+
+      codegen(s, tree->cdr->car, val);
+      if (val && !(tree->cdr->car)) {
+        genop(s, MKOP_A(OP_LOADNIL, cursp()));
+        push();
+      }
+      if (e) {
+        if (val) pop();
+        pos2 = genop(s, MKOP_sBx(OP_JMP, 0));
+        dispatch(s, pos1);
+        codegen(s, e, val);
+        dispatch(s, pos2);
+      }
+      else {
+        if (val) {
+          pop();
+          pos2 = genop(s, MKOP_sBx(OP_JMP, 0));
+          dispatch(s, pos1);
+          genop(s, MKOP_A(OP_LOADNIL, cursp()));
+          dispatch(s, pos2);
+          push();
+        }
+        else {
+          dispatch(s, pos1);
+        }
+      }
+    }
+    break;
+
+  case NODE_AND:
+    {
+      int pos;
+
+      codegen(s, tree->car, VAL);
+      pop();
+      pos = genop(s, MKOP_AsBx(OP_JMPNOT, cursp(), 0));
+      codegen(s, tree->cdr, val);
+      dispatch(s, pos);
+    }
+    break;
+
+  case NODE_OR:
+    {
+      int pos;
+
+      codegen(s, tree->car, VAL);
+      pop();
+      pos = genop(s, MKOP_AsBx(OP_JMPIF, cursp(), 0));
+      codegen(s, tree->cdr, val);
+      dispatch(s, pos);
+    }
+    break;
+
+  case NODE_WHILE:
+    {
+      struct loopinfo *lp = loop_push(s, LOOP_NORMAL);
+
+      lp->pc1 = genop(s, MKOP_sBx(OP_JMP, 0));
+      lp->pc2 = new_label(s);
+      codegen(s, tree->cdr, NOVAL);
+      dispatch(s, lp->pc1);
+      codegen(s, tree->car, VAL);
+      pop();
+      genop(s, MKOP_AsBx(OP_JMPIF, cursp(), lp->pc2 - s->pc));
+
+      loop_pop(s, val);
+    }
+    break;
+
+  case NODE_UNTIL:
+    {
+      struct loopinfo *lp = loop_push(s, LOOP_NORMAL);
+
+      lp->pc1 = genop(s, MKOP_sBx(OP_JMP, 0));
+      lp->pc2 = new_label(s);
+      codegen(s, tree->cdr, NOVAL);
+      dispatch(s, lp->pc1);
+      codegen(s, tree->car, VAL);
+      pop();
+      genop(s, MKOP_AsBx(OP_JMPNOT, cursp(), lp->pc2 - s->pc));
+
+      loop_pop(s, val);
+    }
+    break;
+
+  case NODE_FOR:
+    for_body(s, tree);
+    if (val) push();
+    break;
+
+  case NODE_CASE:
+    {
+      int head = 0;
+      int pos1, pos2, pos3, tmp;
+      node *n;
+
+      pos3 = 0;
+      if (tree->car) {
+        head = cursp();
+        codegen(s, tree->car, VAL);
+      }
+      tree = tree->cdr;
+      while (tree) {
+        n = tree->car->car;
+        pos1 = pos2 = 0;
+        while (n) {
+          codegen(s, n->car, VAL);
+          if (head) {
+            genop(s, MKOP_AB(OP_MOVE, cursp(), head));
+            pop();
+            if ((intptr_t)n->car->car == NODE_SPLAT) {
+              genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "__case_eqq")), 1));
+            }
+            else {
+              genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "===")), 1));
+            }
+          }
+          else {
+            pop();
+          }
+          tmp = genop(s, MKOP_AsBx(OP_JMPIF, cursp(), pos2));
+          pos2 = tmp;
+          n = n->cdr;
+        }
+        if (tree->car->car) {
+          pos1 = genop(s, MKOP_sBx(OP_JMP, 0));
+          dispatch_linked(s, pos2);
+        }
+        codegen(s, tree->car->cdr, val);
+        if (val) pop();
+        tmp = genop(s, MKOP_sBx(OP_JMP, pos3));
+        pos3 = tmp;
+        if (pos1) dispatch(s, pos1);
+        tree = tree->cdr;
+      }
+      if (val) {
+        int pos = cursp();
+        genop(s, MKOP_A(OP_LOADNIL, cursp()));
+        if (pos3) dispatch_linked(s, pos3);
+        pop();
+        genop(s, MKOP_AB(OP_MOVE, cursp(), pos));
+        push();
+      }
+      else if (pos3) {
+        dispatch_linked(s, pos3);
+      }
+    }
+    break;
+
+  case NODE_SCOPE:
+    scope_body(s, tree, NOVAL);
+    break;
+
+  case NODE_FCALL:
+  case NODE_CALL:
+    gen_call(s, tree, 0, 0, val);
+    break;
+
+  case NODE_DOT2:
+    codegen(s, tree->car, val);
+    codegen(s, tree->cdr, val);
+    if (val) {
+      pop(); pop();
+      genop(s, MKOP_ABC(OP_RANGE, cursp(), cursp(), FALSE));
+      push();
+    }
+    break;
+
+  case NODE_DOT3:
+    codegen(s, tree->car, val);
+    codegen(s, tree->cdr, val);
+    if (val) {
+      pop(); pop();
+      genop(s, MKOP_ABC(OP_RANGE, cursp(), cursp(), TRUE));
+      push();
+    }
+    break;
+
+  case NODE_COLON2:
+    {
+      int sym = new_sym(s, sym(tree->cdr));
+
+      codegen(s, tree->car, VAL);
+      pop();
+      genop(s, MKOP_ABx(OP_GETMCNST, cursp(), sym));
+      if (val) push();
+    }
+    break;
+
+  case NODE_COLON3:
+    {
+      int sym = new_sym(s, sym(tree));
+
+      genop(s, MKOP_A(OP_OCLASS, cursp()));
+      genop(s, MKOP_ABx(OP_GETMCNST, cursp(), sym));
+      if (val) push();
+    }
+    break;
+
+  case NODE_ARRAY:
+    {
+      int n;
+
+      n = gen_values(s, tree, val);
+      if (n >= 0) {
+        if (val) {
+          pop_n(n);
+          genop(s, MKOP_ABC(OP_ARRAY, cursp(), cursp(), n));
+          push();
+        }
+      }
+      else if (val) {
+        push();
+      }
+    }
+    break;
+
+  case NODE_HASH:
+    {
+      int len = 0;
+      mrb_bool update = FALSE;
+
+      while (tree) {
+        codegen(s, tree->car->car, val);
+        codegen(s, tree->car->cdr, val);
+        len++;
+        tree = tree->cdr;
+        if (val && len == 126) {
+          pop_n(len*2);
+          genop(s, MKOP_ABC(OP_HASH, cursp(), cursp(), len));
+          if (update) {
+            pop();
+            genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "__update")), 1));
+          }
+          push();
+          update = TRUE;
+          len = 0;
+        }
+      }
+      if (val) {
+        pop_n(len*2);
+        genop(s, MKOP_ABC(OP_HASH, cursp(), cursp(), len));
+        if (update) {
+          pop();
+          genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "__update")), 1));
+        }
+        push();
+      }
+    }
+    break;
+
+  case NODE_SPLAT:
+    codegen(s, tree, VAL);
+    break;
+
+  case NODE_ASGN:
+    codegen(s, tree->cdr, VAL);
+    pop();
+    gen_assignment(s, tree->car, cursp(), val);
+    break;
+
+  case NODE_MASGN:
+    {
+      int len = 0, n = 0, post = 0;
+      node *t = tree->cdr, *p;
+      int rhs = cursp();
+
+      if ((intptr_t)t->car == NODE_ARRAY && nosplat(t->cdr)) {
+        /* fixed rhs */
+        t = t->cdr;
+        while (t) {
+          codegen(s, t->car, VAL);
+          len++;
+          t = t->cdr;
+        }
+        tree = tree->car;
+        if (tree->car) {                /* pre */
+          t = tree->car;
+          n = 0;
+          while (t) {
+            gen_assignment(s, t->car, rhs+n, NOVAL);
+            n++;
+            t = t->cdr;
+          }
+        }
+        t = tree->cdr;
+        if (t) {
+          if (t->cdr) {         /* post count */
+            p = t->cdr->car;
+            while (p) {
+              post++;
+              p = p->cdr;
+            }
+          }
+          if (t->car) {         /* rest (len - pre - post) */
+            int rn = len - post - n;
+
+            genop(s, MKOP_ABC(OP_ARRAY, cursp(), rhs+n, rn));
+            gen_assignment(s, t->car, cursp(), NOVAL);
+            n += rn;
+          }
+          if (t->cdr && t->cdr->car) {
+            t = t->cdr->car;
+            while (n<len) {
+              gen_assignment(s, t->car, rhs+n, NOVAL);
+              t = t->cdr;
+              n++;
+            }
+          }
+        }
+        pop_n(len);
+        if (val) {
+          genop(s, MKOP_ABC(OP_ARRAY, rhs, rhs, len));
+          push();
+        }
+      }
+      else {
+        /* variable rhs */
+        codegen(s, t, VAL);
+        gen_vmassignment(s, tree->car, rhs, val);
+      }
+    }
+    break;
+
+  case NODE_OP_ASGN:
+    {
+      mrb_sym sym = sym(tree->cdr->car);
+      mrb_int len;
+      const char *name = mrb_sym2name_len(s->mrb, sym, &len);
+      int idx;
+
+      codegen(s, tree->car, VAL);
+      if (len == 2 &&
+          ((name[0] == '|' && name[1] == '|') ||
+           (name[0] == '&' && name[1] == '&'))) {
+        int pos;
+
+        pop();
+        pos = genop_peep(s, MKOP_AsBx(name[0] == '|' ? OP_JMPIF : OP_JMPNOT, cursp(), 0), NOVAL);
+        codegen(s, tree->cdr->cdr->car, VAL);
+        pop();
+        gen_assignment(s, tree->car, cursp(), val);
+        dispatch(s, pos);
+        break;
+      }
+      codegen(s, tree->cdr->cdr->car, VAL);
+      push(); pop();
+      pop(); pop();
+
+      idx = new_msym(s, sym);
+      if (len == 1 && name[0] == '+')  {
+        genop_peep(s, MKOP_ABC(OP_ADD, cursp(), idx, 1), val);
+      }
+      else if (len == 1 && name[0] == '-')  {
+        genop_peep(s, MKOP_ABC(OP_SUB, cursp(), idx, 1), val);
+      }
+      else if (len == 1 && name[0] == '*')  {
+        genop(s, MKOP_ABC(OP_MUL, cursp(), idx, 1));
+      }
+      else if (len == 1 && name[0] == '/')  {
+        genop(s, MKOP_ABC(OP_DIV, cursp(), idx, 1));
+      }
+      else if (len == 1 && name[0] == '<')  {
+        genop(s, MKOP_ABC(OP_LT, cursp(), idx, 1));
+      }
+      else if (len == 2 && name[0] == '<' && name[1] == '=')  {
+        genop(s, MKOP_ABC(OP_LE, cursp(), idx, 1));
+      }
+      else if (len == 1 && name[0] == '>')  {
+        genop(s, MKOP_ABC(OP_GT, cursp(), idx, 1));
+      }
+      else if (len == 2 && name[0] == '>' && name[1] == '=')  {
+        genop(s, MKOP_ABC(OP_GE, cursp(), idx, 1));
+      }
+      else {
+        genop(s, MKOP_ABC(OP_SEND, cursp(), idx, 1));
+      }
+    }
+    gen_assignment(s, tree->car, cursp(), val);
+    break;
+
+  case NODE_SUPER:
+    {
+      int n = 0, noop = 0, sendv = 0;
+
+      push();        /* room for receiver */
+      if (tree) {
+        node *args = tree->car;
+        if (args) {
+          n = gen_values(s, args, VAL);
+          if (n < 0) {
+            n = noop = sendv = 1;
+            push();
+          }
+        }
+      }
+      if (tree && tree->cdr) {
+        codegen(s, tree->cdr, VAL);
+        pop();
+      }
+      else {
+        genop(s, MKOP_A(OP_LOADNIL, cursp()));
+        push(); pop();
+      }
+      pop_n(n+1);
+      if (sendv) n = CALL_MAXARGS;
+      genop(s, MKOP_ABC(OP_SUPER, cursp(), 0, n));
+      if (val) push();
+    }
+    break;
+
+  case NODE_ZSUPER:
+    {
+      codegen_scope *s2 = s;
+      int lv = 0, ainfo = 0;
+
+      push();        /* room for receiver */
+      while (!s2->mscope) {
+        lv++;
+        s2 = s2->prev;
+        if (!s2) break;
+      }
+      if (s2) ainfo = s2->ainfo;
+      genop(s, MKOP_ABx(OP_ARGARY, cursp(), (ainfo<<4)|(lv & 0xf)));
+      push(); push(); pop();    /* ARGARY pushes two values */
+      if (tree && tree->cdr) {
+        codegen(s, tree->cdr, VAL);
+        pop();
+      }
+      pop(); pop();
+      genop(s, MKOP_ABC(OP_SUPER, cursp(), 0, CALL_MAXARGS));
+      if (val) push();
+    }
+    break;
+
+  case NODE_RETURN:
+    if (tree) {
+      codegen(s, tree, VAL);
+      pop();
+    }
+    else {
+      genop(s, MKOP_A(OP_LOADNIL, cursp()));
+    }
+    if (s->loop) {
+      genop(s, MKOP_AB(OP_RETURN, cursp(), OP_R_RETURN));
+    }
+    else {
+      genop_peep(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL);
+    }
+    if (val) push();
+    break;
+
+  case NODE_YIELD:
+    {
+      codegen_scope *s2 = s;
+      int lv = 0, ainfo = 0;
+      int n = 0, sendv = 0;
+
+      while (!s2->mscope) {
+        lv++;
+        s2 = s2->prev;
+        if (!s2) break;
+      }
+      if (s2) ainfo = s2->ainfo;
+      genop(s, MKOP_ABx(OP_BLKPUSH, cursp(), (ainfo<<4)|(lv & 0xf)));
+      push();
+      if (tree) {
+        n = gen_values(s, tree, VAL);
+        if (n < 0) {
+          n = sendv = 1;
+          push();
+        }
+      }
+      pop_n(n+1);
+      if (sendv) n = CALL_MAXARGS;
+      genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "call")), n));
+      if (val) push();
+    }
+    break;
+
+  case NODE_BREAK:
+    loop_break(s, tree);
+    if (val) push();
+    break;
+
+  case NODE_NEXT:
+    if (!s->loop) {
+      raise_error(s, "unexpected next");
+    }
+    else if (s->loop->type == LOOP_NORMAL) {
+      if (s->ensure_level > s->loop->ensure_level) {
+        genop_peep(s, MKOP_A(OP_EPOP, s->ensure_level - s->loop->ensure_level), NOVAL);
+      }
+      codegen(s, tree, NOVAL);
+      genop(s, MKOP_sBx(OP_JMP, s->loop->pc1 - s->pc));
+    }
+    else {
+      if (tree) {
+        codegen(s, tree, VAL);
+        pop();
+      }
+      else {
+        genop(s, MKOP_A(OP_LOADNIL, cursp()));
+      }
+      genop_peep(s, MKOP_AB(OP_RETURN, cursp(), OP_R_NORMAL), NOVAL);
+    }
+    if (val) push();
+    break;
+
+  case NODE_REDO:
+    if (!s->loop) {
+      raise_error(s, "unexpected redo");
+    }
+    else {
+      if (s->ensure_level > s->loop->ensure_level) {
+        genop_peep(s, MKOP_A(OP_EPOP, s->ensure_level - s->loop->ensure_level), NOVAL);
+      }
+      genop(s, MKOP_sBx(OP_JMP, s->loop->pc2 - s->pc));
+    }
+    break;
+
+  case NODE_RETRY:
+    {
+      const char *msg = "unexpected retry";
+
+      if (!s->loop) {
+        raise_error(s, msg);
+      }
+      else {
+        struct loopinfo *lp = s->loop;
+        int n = 0;
+
+        while (lp && lp->type != LOOP_RESCUE) {
+          if (lp->type == LOOP_BEGIN) {
+            n++;
+          }
+          lp = lp->prev;
+        }
+        if (!lp) {
+          raise_error(s, msg);
+        }
+        else {
+          if (n > 0) {
+            while (n--) {
+              genop_peep(s, MKOP_A(OP_POPERR, 1), NOVAL);
+            }
+          }
+          if (s->ensure_level > lp->ensure_level) {
+            genop_peep(s, MKOP_A(OP_EPOP, s->ensure_level - lp->ensure_level), NOVAL);
+          }
+          genop(s, MKOP_sBx(OP_JMP, lp->pc1 - s->pc));
+        }
+      }
+    }
+    break;
+
+  case NODE_LVAR:
+    if (val) {
+      int idx = lv_idx(s, sym(tree));
+
+      if (idx > 0) {
+        genop_peep(s, MKOP_AB(OP_MOVE, cursp(), idx), NOVAL);
+      }
+      else {
+        int lv = 0;
+        codegen_scope *up = s->prev;
+
+        while (up) {
+          idx = lv_idx(up, sym(tree));
+          if (idx > 0) {
+            genop(s, MKOP_ABC(OP_GETUPVAR, cursp(), idx, lv));
+            break;
+          }
+          lv++;
+          up = up->prev;
+        }
+      }
+      push();
+    }
+    break;
+
+  case NODE_GVAR:
+    {
+      int sym = new_sym(s, sym(tree));
+
+      genop(s, MKOP_ABx(OP_GETGLOBAL, cursp(), sym));
+      push();
+    }
+    break;
+
+  case NODE_IVAR:
+    {
+      int sym = new_sym(s, sym(tree));
+
+      genop(s, MKOP_ABx(OP_GETIV, cursp(), sym));
+      push();
+    }
+    break;
+
+  case NODE_CVAR:
+    {
+      int sym = new_sym(s, sym(tree));
+
+      genop(s, MKOP_ABx(OP_GETCV, cursp(), sym));
+      push();
+    }
+    break;
+
+  case NODE_CONST:
+    {
+      int sym = new_sym(s, sym(tree));
+
+      genop(s, MKOP_ABx(OP_GETCONST, cursp(), sym));
+      push();
+    }
+    break;
+
+  case NODE_DEFINED:
+    codegen(s, tree, VAL);
+    break;
+
+  case NODE_BACK_REF:
+    {
+      char buf[2] = { '$' };
+      mrb_value str;
+      int sym;
+
+      buf[1] = (char)(intptr_t)tree;
+      str = mrb_str_new(s->mrb, buf, 2);
+      sym = new_sym(s, mrb_intern_str(s->mrb, str));
+      genop(s, MKOP_ABx(OP_GETGLOBAL, cursp(), sym));
+      push();
+    }
+    break;
+
+  case NODE_NTH_REF:
+    {
+      int sym;
+      mrb_state *mrb = s->mrb;
+      mrb_value fix = mrb_fixnum_value((intptr_t)tree);
+      mrb_value str = mrb_str_buf_new(mrb, 4);
+
+      mrb_str_cat_lit(mrb, str, "$");
+      mrb_str_cat_str(mrb, str, mrb_fixnum_to_str(mrb, fix, 10));
+      sym = new_sym(s, mrb_intern_str(mrb, str));
+      genop(s, MKOP_ABx(OP_GETGLOBAL, cursp(), sym));
+      push();
+    }
+    break;
+
+  case NODE_ARG:
+    /* should not happen */
+    break;
+
+  case NODE_BLOCK_ARG:
+    codegen(s, tree, VAL);
+    break;
+
+  case NODE_INT:
+    if (val) {
+      char *p = (char*)tree->car;
+      int base = (intptr_t)tree->cdr->car;
+      mrb_int i;
+      mrb_code co;
+      mrb_bool overflow;
+
+      i = readint_mrb_int(s, p, base, FALSE, &overflow);
+      if (overflow) {
+        double f = readint_float(s, p, base);
+        int off = new_lit(s, mrb_float_value(s->mrb, f));
+
+        genop(s, MKOP_ABx(OP_LOADL, cursp(), off));
+      }
+      else {
+        if (i < MAXARG_sBx && i > -MAXARG_sBx) {
+          co = MKOP_AsBx(OP_LOADI, cursp(), i);
+        }
+        else {
+          int off = new_lit(s, mrb_fixnum_value(i));
+          co = MKOP_ABx(OP_LOADL, cursp(), off);
+        }
+        genop(s, co);
+      }
+      push();
+    }
+    break;
+
+  case NODE_FLOAT:
+    if (val) {
+      char *p = (char*)tree;
+      mrb_float f = str_to_mrb_float(p);
+      int off = new_lit(s, mrb_float_value(s->mrb, f));
+
+      genop(s, MKOP_ABx(OP_LOADL, cursp(), off));
+      push();
+    }
+    break;
+
+  case NODE_NEGATE:
+    {
+      nt = (intptr_t)tree->car;
+      tree = tree->cdr;
+      switch (nt) {
+      case NODE_FLOAT:
+        {
+          char *p = (char*)tree;
+          mrb_float f = str_to_mrb_float(p);
+          int off = new_lit(s, mrb_float_value(s->mrb, -f));
+
+          genop(s, MKOP_ABx(OP_LOADL, cursp(), off));
+          push();
+        }
+        break;
+
+      case NODE_INT:
+        {
+          char *p = (char*)tree->car;
+          int base = (intptr_t)tree->cdr->car;
+          mrb_int i;
+          mrb_code co;
+          mrb_bool overflow;
+
+          i = readint_mrb_int(s, p, base, TRUE, &overflow);
+          if (overflow) {
+            double f = readint_float(s, p, base);
+            int off = new_lit(s, mrb_float_value(s->mrb, -f));
+
+            genop(s, MKOP_ABx(OP_LOADL, cursp(), off));
+          }
+          else {
+            if (i < MAXARG_sBx && i > -MAXARG_sBx) {
+              co = MKOP_AsBx(OP_LOADI, cursp(), i);
+            }
+            else {
+              int off = new_lit(s, mrb_fixnum_value(i));
+              co = MKOP_ABx(OP_LOADL, cursp(), off);
+            }
+            genop(s, co);
+          }
+          push();
+        }
+        break;
+
+      default:
+        {
+          int sym = new_msym(s, mrb_intern_lit(s->mrb, "-"));
+
+          genop(s, MKOP_ABx(OP_LOADI, cursp(), 0));
+          push();
+          codegen(s, tree, VAL);
+          pop(); pop();
+          genop(s, MKOP_ABC(OP_SUB, cursp(), sym, 2));
+        }
+        break;
+      }
+    }
+    break;
+
+  case NODE_STR:
+    if (val) {
+      char *p = (char*)tree->car;
+      size_t len = (intptr_t)tree->cdr;
+      int ai = mrb_gc_arena_save(s->mrb);
+      int off = new_lit(s, mrb_str_new(s->mrb, p, len));
+
+      mrb_gc_arena_restore(s->mrb, ai);
+      genop(s, MKOP_ABx(OP_STRING, cursp(), off));
+      push();
+    }
+    break;
+
+  case NODE_HEREDOC:
+    tree = ((struct mrb_parser_heredoc_info *)tree)->doc;
+    /* fall through */
+  case NODE_DSTR:
+    if (val) {
+      node *n = tree;
+
+      codegen(s, n->car, VAL);
+      n = n->cdr;
+      while (n) {
+        codegen(s, n->car, VAL);
+        pop(); pop();
+        genop_peep(s, MKOP_AB(OP_STRCAT, cursp(), cursp()+1), VAL);
+        push();
+        n = n->cdr;
+      }
+    }
+    else {
+      node *n = tree;
+
+      while (n) {
+        if ((intptr_t)n->car->car != NODE_STR) {
+          codegen(s, n->car, NOVAL);
+        }
+        n = n->cdr;
+      }
+    }
+    break;
+
+  case NODE_WORDS:
+    gen_literal_array(s, tree, FALSE, val);
+    break;
+
+  case NODE_SYMBOLS:
+    gen_literal_array(s, tree, TRUE, val);
+    break;
+
+  case NODE_DXSTR:
+    {
+      node *n;
+      int ai = mrb_gc_arena_save(s->mrb);
+      int sym = new_sym(s, mrb_intern_lit(s->mrb, "Kernel"));
+
+      if (val == NOVAL) { push(); }
+      genop(s, MKOP_A(OP_OCLASS, cursp()));
+      genop(s, MKOP_ABx(OP_GETMCNST, cursp(), sym));
+      push();
+      codegen(s, tree->car, VAL);
+      n = tree->cdr;
+      while (n) {
+        if ((intptr_t)n->car->car == NODE_XSTR) {
+          n->car->car = (struct mrb_ast_node*)(intptr_t)NODE_STR;
+          mrb_assert(!n->cdr); /* must be the end */
+        }
+        codegen(s, n->car, VAL);
+        pop(); pop();
+        genop_peep(s, MKOP_AB(OP_STRCAT, cursp(), cursp()+1), VAL);
+        push();
+        n = n->cdr;
+      }
+      pop();
+      pop();
+      sym = new_sym(s, mrb_intern_lit(s->mrb, "`"));
+      genop(s, MKOP_ABC(OP_SEND, cursp(), sym, 1));
+      if (val == NOVAL) { pop(); }
+      else { push(); }
+      mrb_gc_arena_restore(s->mrb, ai);
+    }
+    break;
+
+  case NODE_XSTR:
+    {
+      char *p = (char*)tree->car;
+      size_t len = (intptr_t)tree->cdr;
+      int ai = mrb_gc_arena_save(s->mrb);
+      int sym = new_sym(s, mrb_intern_lit(s->mrb, "Kernel"));
+      int off = new_lit(s, mrb_str_new(s->mrb, p, len));
+
+      if (val == NOVAL) { push(); }
+      genop(s, MKOP_A(OP_OCLASS, cursp()));
+      genop(s, MKOP_ABx(OP_GETMCNST, cursp(), sym));
+      push();
+      genop(s, MKOP_ABx(OP_STRING, cursp(), off));
+      pop();
+      sym = new_sym(s, mrb_intern_lit(s->mrb, "`"));
+      genop(s, MKOP_ABC(OP_SEND, cursp(), sym, 1));
+      if (val == NOVAL) { pop(); }
+      else { push(); }
+      mrb_gc_arena_restore(s->mrb, ai);
+    }
+    break;
+
+  case NODE_REGX:
+    if (val) {
+      char *p1 = (char*)tree->car;
+      char *p2 = (char*)tree->cdr;
+      int ai = mrb_gc_arena_save(s->mrb);
+      int sym = new_sym(s, mrb_intern_lit(s->mrb, REGEXP_CLASS));
+      int off = new_lit(s, mrb_str_new_cstr(s->mrb, p1));
+      int argc = 1;
+
+      genop(s, MKOP_A(OP_OCLASS, cursp()));
+      genop(s, MKOP_ABx(OP_GETMCNST, cursp(), sym));
+      push();
+      genop(s, MKOP_ABx(OP_STRING, cursp(), off));
+      if (p2) {
+        push();
+        off = new_lit(s, mrb_str_new_cstr(s->mrb, p2));
+        genop(s, MKOP_ABx(OP_STRING, cursp(), off));
+        argc++;
+        pop();
+      }
+      pop();
+      sym = new_sym(s, mrb_intern_lit(s->mrb, "compile"));
+      genop(s, MKOP_ABC(OP_SEND, cursp(), sym, argc));
+      mrb_gc_arena_restore(s->mrb, ai);
+      push();
+    }
+    break;
+
+  case NODE_DREGX:
+    if (val) {
+      node *n = tree->car;
+      int ai = mrb_gc_arena_save(s->mrb);
+      int sym = new_sym(s, mrb_intern_lit(s->mrb, REGEXP_CLASS));
+      int argc = 1;
+      int off;
+      char *p;
+
+      genop(s, MKOP_A(OP_OCLASS, cursp()));
+      genop(s, MKOP_ABx(OP_GETMCNST, cursp(), sym));
+      push();
+      codegen(s, n->car, VAL);
+      n = n->cdr;
+      while (n) {
+        codegen(s, n->car, VAL);
+        pop(); pop();
+        genop_peep(s, MKOP_AB(OP_STRCAT, cursp(), cursp()+1), VAL);
+        push();
+        n = n->cdr;
+      }
+      n = tree->cdr->cdr;
+      if (n->car) {
+        p = (char*)n->car;
+        off = new_lit(s, mrb_str_new_cstr(s->mrb, p));
+        codegen(s, tree->car, VAL);
+        genop(s, MKOP_ABx(OP_STRING, cursp(), off));
+        pop();
+        genop_peep(s, MKOP_AB(OP_STRCAT, cursp(), cursp()+1), VAL);
+      }
+      if (n->cdr) {
+        char *p2 = (char*)n->cdr;
+
+        push();
+        off = new_lit(s, mrb_str_new_cstr(s->mrb, p2));
+        genop(s, MKOP_ABx(OP_STRING, cursp(), off));
+        argc++;
+        pop();
+      }
+      pop();
+      sym = new_sym(s, mrb_intern_lit(s->mrb, "compile"));
+      genop(s, MKOP_ABC(OP_SEND, cursp(), sym, argc));
+      mrb_gc_arena_restore(s->mrb, ai);
+      push();
+    }
+    else {
+      node *n = tree->car;
+
+      while (n) {
+        if ((intptr_t)n->car->car != NODE_STR) {
+          codegen(s, n->car, NOVAL);
+        }
+        n = n->cdr;
+      }
+    }
+    break;
+
+  case NODE_SYM:
+    if (val) {
+      int sym = new_sym(s, sym(tree));
+
+      genop(s, MKOP_ABx(OP_LOADSYM, cursp(), sym));
+      push();
+    }
+    break;
+
+  case NODE_DSYM:
+    codegen(s, tree, val);
+    if (val) {
+      gen_send_intern(s);
+    }
+    break;
+
+  case NODE_SELF:
+    if (val) {
+      genop(s, MKOP_A(OP_LOADSELF, cursp()));
+      push();
+    }
+    break;
+
+  case NODE_NIL:
+    if (val) {
+      genop(s, MKOP_A(OP_LOADNIL, cursp()));
+      push();
+    }
+    break;
+
+  case NODE_TRUE:
+    if (val) {
+      genop(s, MKOP_A(OP_LOADT, cursp()));
+      push();
+    }
+    break;
+
+  case NODE_FALSE:
+    if (val) {
+      genop(s, MKOP_A(OP_LOADF, cursp()));
+      push();
+    }
+    break;
+
+  case NODE_ALIAS:
+    {
+      int a = new_msym(s, sym(tree->car));
+      int b = new_msym(s, sym(tree->cdr));
+      int c = new_msym(s, mrb_intern_lit(s->mrb, "alias_method"));
+
+      genop(s, MKOP_A(OP_TCLASS, cursp()));
+      push();
+      genop(s, MKOP_ABx(OP_LOADSYM, cursp(), a));
+      push();
+      genop(s, MKOP_ABx(OP_LOADSYM, cursp(), b));
+      push();
+      genop(s, MKOP_A(OP_LOADNIL, cursp()));
+      pop_n(3);
+      genop(s, MKOP_ABC(OP_SEND, cursp(), c, 2));
+      if (val) {
+        push();
+      }
+    }
+   break;
+
+  case NODE_UNDEF:
+    {
+      int undef = new_msym(s, mrb_intern_lit(s->mrb, "undef_method"));
+      int num = 0;
+      node *t = tree;
+
+      genop(s, MKOP_A(OP_TCLASS, cursp()));
+      push();
+      while (t) {
+        int symbol = new_msym(s, sym(t->car));
+        genop(s, MKOP_ABx(OP_LOADSYM, cursp(), symbol));
+        push();
+        t = t->cdr;
+        num++;
+      }
+      pop_n(num + 1);
+      genop(s, MKOP_ABC(OP_SEND, cursp(), undef, num));
+      if (val) {
+        push();
+      }
+    }
+    break;
+
+  case NODE_CLASS:
+    {
+      int idx;
+
+      if (tree->car->car == (node*)0) {
+        genop(s, MKOP_A(OP_LOADNIL, cursp()));
+        push();
+      }
+      else if (tree->car->car == (node*)1) {
+        genop(s, MKOP_A(OP_OCLASS, cursp()));
+        push();
+      }
+      else {
+        codegen(s, tree->car->car, VAL);
+      }
+      if (tree->cdr->car) {
+        codegen(s, tree->cdr->car, VAL);
+      }
+      else {
+        genop(s, MKOP_A(OP_LOADNIL, cursp()));
+        push();
+      }
+      pop(); pop();
+      idx = new_msym(s, sym(tree->car->cdr));
+      genop(s, MKOP_AB(OP_CLASS, cursp(), idx));
+      idx = scope_body(s, tree->cdr->cdr->car, val);
+      genop(s, MKOP_ABx(OP_EXEC, cursp(), idx));
+      if (val) {
+        push();
+      }
+    }
+    break;
+
+  case NODE_MODULE:
+    {
+      int idx;
+
+      if (tree->car->car == (node*)0) {
+        genop(s, MKOP_A(OP_LOADNIL, cursp()));
+        push();
+      }
+      else if (tree->car->car == (node*)1) {
+        genop(s, MKOP_A(OP_OCLASS, cursp()));
+        push();
+      }
+      else {
+        codegen(s, tree->car->car, VAL);
+      }
+      pop();
+      idx = new_msym(s, sym(tree->car->cdr));
+      genop(s, MKOP_AB(OP_MODULE, cursp(), idx));
+      idx = scope_body(s, tree->cdr->car, val);
+      genop(s, MKOP_ABx(OP_EXEC, cursp(), idx));
+      if (val) {
+        push();
+      }
+    }
+    break;
+
+  case NODE_SCLASS:
+    {
+      int idx;
+
+      codegen(s, tree->car, VAL);
+      pop();
+      genop(s, MKOP_AB(OP_SCLASS, cursp(), cursp()));
+      idx = scope_body(s, tree->cdr->car, val);
+      genop(s, MKOP_ABx(OP_EXEC, cursp(), idx));
+      if (val) {
+        push();
+      }
+    }
+    break;
+
+  case NODE_DEF:
+    {
+      int sym = new_msym(s, sym(tree->car));
+      int idx = lambda_body(s, tree->cdr, 0);
+
+      genop(s, MKOP_A(OP_TCLASS, cursp()));
+      push();
+      genop(s, MKOP_Abc(OP_LAMBDA, cursp(), idx, OP_L_METHOD));
+      push(); pop();
+      pop();
+      genop(s, MKOP_AB(OP_METHOD, cursp(), sym));
+      if (val) {
+        genop(s, MKOP_ABx(OP_LOADSYM, cursp(), sym));
+        push();
+      }
+    }
+    break;
+
+  case NODE_SDEF:
+    {
+      node *recv = tree->car;
+      int sym = new_msym(s, sym(tree->cdr->car));
+      int idx = lambda_body(s, tree->cdr->cdr, 0);
+
+      codegen(s, recv, VAL);
+      pop();
+      genop(s, MKOP_AB(OP_SCLASS, cursp(), cursp()));
+      push();
+      genop(s, MKOP_Abc(OP_LAMBDA, cursp(), idx, OP_L_METHOD));
+      pop();
+      genop(s, MKOP_AB(OP_METHOD, cursp(), sym));
+      if (val) {
+        genop(s, MKOP_ABx(OP_LOADSYM, cursp(), sym));
+        push();
+      }
+    }
+    break;
+
+  case NODE_POSTEXE:
+    codegen(s, tree, NOVAL);
+    break;
+
+  default:
+    break;
+  }
+}
+
+static void
+scope_add_irep(codegen_scope *s, mrb_irep *irep)
+{
+  if (s->irep == NULL) {
+    s->irep = irep;
+    return;
+  }
+  if (s->irep->rlen == s->rcapa) {
+    s->rcapa *= 2;
+    s->irep->reps = (mrb_irep**)codegen_realloc(s, s->irep->reps, sizeof(mrb_irep*)*s->rcapa);
+  }
+  s->irep->reps[s->irep->rlen] = irep;
+  s->irep->rlen++;
+}
+
+static codegen_scope*
+scope_new(mrb_state *mrb, codegen_scope *prev, node *lv)
+{
+  static const codegen_scope codegen_scope_zero = { 0 };
+  mrb_pool *pool = mrb_pool_open(mrb);
+  codegen_scope *p = (codegen_scope *)mrb_pool_alloc(pool, sizeof(codegen_scope));
+
+  if (!p) return NULL;
+  *p = codegen_scope_zero;
+  p->mrb = mrb;
+  p->mpool = pool;
+  if (!prev) return p;
+  p->prev = prev;
+  p->ainfo = -1;
+  p->mscope = 0;
+
+  p->irep = mrb_add_irep(mrb);
+  scope_add_irep(prev, p->irep);
+
+  p->rcapa = 8;
+  p->irep->reps = (mrb_irep**)mrb_malloc(mrb, sizeof(mrb_irep*)*p->rcapa);
+
+  p->icapa = 1024;
+  p->iseq = (mrb_code*)mrb_malloc(mrb, sizeof(mrb_code)*p->icapa);
+  p->irep->iseq = p->iseq;
+
+  p->pcapa = 32;
+  p->irep->pool = (mrb_value*)mrb_malloc(mrb, sizeof(mrb_value)*p->pcapa);
+  p->irep->plen = 0;
+
+  p->scapa = 256;
+  p->irep->syms = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym)*p->scapa);
+  p->irep->slen = 0;
+
+  p->lv = lv;
+  p->sp += node_len(lv)+1;        /* add self */
+  p->nlocals = p->sp;
+  if (lv) {
+    node *n = lv;
+    size_t i = 0;
+
+    p->irep->lv = (struct mrb_locals*)mrb_malloc(mrb, sizeof(struct mrb_locals) * (p->nlocals - 1));
+    for (i=0, n=lv; n; i++,n=n->cdr) {
+      p->irep->lv[i].name = lv_name(n);
+      if (lv_name(n)) {
+        p->irep->lv[i].r = lv_idx(p, lv_name(n));
+      }
+      else {
+        p->irep->lv[i].r = 0;
+      }
+    }
+    mrb_assert(i + 1 == p->nlocals);
+  }
+  p->ai = mrb_gc_arena_save(mrb);
+
+  p->filename = prev->filename;
+  if (p->filename) {
+    p->lines = (uint16_t*)mrb_malloc(mrb, sizeof(short)*p->icapa);
+  }
+  p->lineno = prev->lineno;
+
+  /* debug setting */
+  p->debug_start_pos = 0;
+  if (p->filename) {
+    mrb_debug_info_alloc(mrb, p->irep);
+    p->irep->filename = p->filename;
+    p->irep->lines = p->lines;
+  }
+  else {
+    p->irep->debug_info = NULL;
+  }
+  p->parser = prev->parser;
+  p->filename_index = prev->filename_index;
+
+  return p;
+}
+
+static void
+scope_finish(codegen_scope *s)
+{
+  mrb_state *mrb = s->mrb;
+  mrb_irep *irep = s->irep;
+  size_t fname_len;
+  char *fname;
+
+  irep->flags = 0;
+  if (s->iseq) {
+    irep->iseq = (mrb_code *)codegen_realloc(s, s->iseq, sizeof(mrb_code)*s->pc);
+    irep->ilen = s->pc;
+    if (s->lines) {
+      irep->lines = (uint16_t *)codegen_realloc(s, s->lines, sizeof(uint16_t)*s->pc);
+    }
+    else {
+      irep->lines = 0;
+    }
+  }
+  irep->pool = (mrb_value*)codegen_realloc(s, irep->pool, sizeof(mrb_value)*irep->plen);
+  irep->syms = (mrb_sym*)codegen_realloc(s, irep->syms, sizeof(mrb_sym)*irep->slen);
+  irep->reps = (mrb_irep**)codegen_realloc(s, irep->reps, sizeof(mrb_irep*)*irep->rlen);
+  if (s->filename) {
+    s->irep->filename = mrb_parser_get_filename(s->parser, s->filename_index);
+    mrb_debug_info_append_file(mrb, s->irep, s->debug_start_pos, s->pc);
+
+    fname_len = strlen(s->filename);
+    fname = (char*)codegen_malloc(s, fname_len + 1);
+    memcpy(fname, s->filename, fname_len);
+    fname[fname_len] = '\0';
+    irep->filename = fname;
+  }
+
+  irep->nlocals = s->nlocals;
+  irep->nregs = s->nregs;
+
+  mrb_gc_arena_restore(mrb, s->ai);
+  mrb_pool_close(s->mpool);
+}
+
+static struct loopinfo*
+loop_push(codegen_scope *s, enum looptype t)
+{
+  struct loopinfo *p = (struct loopinfo *)codegen_palloc(s, sizeof(struct loopinfo));
+
+  p->type = t;
+  p->pc1 = p->pc2 = p->pc3 = 0;
+  p->prev = s->loop;
+  p->ensure_level = s->ensure_level;
+  p->acc = cursp();
+  s->loop = p;
+
+  return p;
+}
+
+static void
+loop_break(codegen_scope *s, node *tree)
+{
+  if (!s->loop) {
+    codegen(s, tree, NOVAL);
+    raise_error(s, "unexpected break");
+  }
+  else {
+    struct loopinfo *loop;
+
+    if (tree) {
+      codegen(s, tree, VAL);
+      pop();
+    }
+
+    loop = s->loop;
+    while (loop->type == LOOP_BEGIN) {
+      genop_peep(s, MKOP_A(OP_POPERR, 1), NOVAL);
+      loop = loop->prev;
+    }
+    while (loop->type == LOOP_RESCUE) {
+      loop = loop->prev;
+    }
+    if (loop->type == LOOP_NORMAL) {
+      int tmp;
+
+      if (s->ensure_level > s->loop->ensure_level) {
+        genop_peep(s, MKOP_A(OP_EPOP, s->ensure_level - s->loop->ensure_level), NOVAL);
+      }
+      if (tree) {
+        genop_peep(s, MKOP_AB(OP_MOVE, loop->acc, cursp()), NOVAL);
+      }
+      tmp = genop(s, MKOP_sBx(OP_JMP, loop->pc3));
+      loop->pc3 = tmp;
+    }
+    else {
+      genop(s, MKOP_AB(OP_RETURN, cursp(), OP_R_BREAK));
+    }
+  }
+}
+
+static void
+loop_pop(codegen_scope *s, int val)
+{
+  if (val) {
+    genop(s, MKOP_A(OP_LOADNIL, cursp()));
+  }
+  dispatch_linked(s, s->loop->pc3);
+  s->loop = s->loop->prev;
+  if (val) push();
+}
+
+#ifdef ENABLE_STDIO
+static int
+print_r(mrb_state *mrb, mrb_irep *irep, size_t n, int pre)
+{
+  size_t i;
+
+  if (n == 0) return 0;
+
+  for (i=0; i+1<irep->nlocals; i++) {
+    if (irep->lv[i].r == n) {
+      mrb_sym sym = irep->lv[i].name;
+      if (pre) printf(" ");
+      printf("R%d:%s", (int)n, mrb_sym2name(mrb, sym));
+      return 1;
+    }
+  }
+  return 0;
+}
+
+#define RA  1
+#define RB  2
+#define RAB 3
+
+static void
+print_lv(mrb_state *mrb, mrb_irep *irep, mrb_code c, int r)
+{
+  int pre = 0;
+
+  if (!irep->lv
+      || ((!(r & RA) || GETARG_A(c) >= irep->nlocals)
+       && (!(r & RB) || GETARG_B(c) >= irep->nlocals))) {
+    printf("\n");
+    return;
+  }
+  printf("\t; ");
+  if (r & RA) {
+    pre = print_r(mrb, irep, GETARG_A(c), 0);
+  }
+  if (r & RB) {
+    print_r(mrb, irep, GETARG_B(c), pre);
+  }
+  printf("\n");
+}
+#endif
+
+static void
+codedump(mrb_state *mrb, mrb_irep *irep)
+{
+#ifdef ENABLE_STDIO
+  int i;
+  int ai;
+  mrb_code c;
+  const char *file = NULL, *next_file;
+  int32_t line;
+
+  if (!irep) return;
+  printf("irep %p nregs=%d nlocals=%d pools=%d syms=%d reps=%d\n", (void*)irep,
+         irep->nregs, irep->nlocals, (int)irep->plen, (int)irep->slen, (int)irep->rlen);
+
+  for (i = 0; i < (int)irep->ilen; i++) {
+    ai = mrb_gc_arena_save(mrb);
+
+    next_file = mrb_debug_get_filename(irep, i);
+    if (next_file && file != next_file) {
+      printf("file: %s\n", next_file);
+      file = next_file;
+    }
+    line = mrb_debug_get_line(irep, i);
+    if (line < 0) {
+      printf("      ");
+    }
+    else {
+      printf("%5d ", line);
+    }
+
+    printf("%03d ", i);
+    c = irep->iseq[i];
+    switch (GET_OPCODE(c)) {
+    case OP_NOP:
+      printf("OP_NOP\n");
+      break;
+    case OP_MOVE:
+      printf("OP_MOVE\tR%d\tR%d", GETARG_A(c), GETARG_B(c));
+      print_lv(mrb, irep, c, RAB);
+      break;
+    case OP_LOADL:
+      {
+        mrb_value v = irep->pool[GETARG_Bx(c)];
+        mrb_value s = mrb_inspect(mrb, v);
+        printf("OP_LOADL\tR%d\tL(%d)\t; %s", GETARG_A(c), GETARG_Bx(c), RSTRING_PTR(s));
+      }
+      print_lv(mrb, irep, c, RA);
+      break;
+    case OP_LOADI:
+      printf("OP_LOADI\tR%d\t%d", GETARG_A(c), GETARG_sBx(c));
+      print_lv(mrb, irep, c, RA);
+      break;
+    case OP_LOADSYM:
+      printf("OP_LOADSYM\tR%d\t:%s", GETARG_A(c),
+             mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]));
+      print_lv(mrb, irep, c, RA);
+      break;
+    case OP_LOADNIL:
+      printf("OP_LOADNIL\tR%d\t", GETARG_A(c));
+      print_lv(mrb, irep, c, RA);
+      break;
+    case OP_LOADSELF:
+      printf("OP_LOADSELF\tR%d\t", GETARG_A(c));
+      print_lv(mrb, irep, c, RA);
+      break;
+    case OP_LOADT:
+      printf("OP_LOADT\tR%d\t", GETARG_A(c));
+      print_lv(mrb, irep, c, RA);
+      break;
+    case OP_LOADF:
+      printf("OP_LOADF\tR%d\t", GETARG_A(c));
+      print_lv(mrb, irep, c, RA);
+      break;
+    case OP_GETGLOBAL:
+      printf("OP_GETGLOBAL\tR%d\t:%s", GETARG_A(c),
+             mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]));
+      print_lv(mrb, irep, c, RA);
+      break;
+    case OP_SETGLOBAL:
+      printf("OP_SETGLOBAL\t:%s\tR%d",
+             mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]),
+             GETARG_A(c));
+      print_lv(mrb, irep, c, RA);
+      break;
+    case OP_GETCONST:
+      printf("OP_GETCONST\tR%d\t:%s", GETARG_A(c),
+             mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]));
+      print_lv(mrb, irep, c, RA);
+      break;
+    case OP_SETCONST:
+      printf("OP_SETCONST\t:%s\tR%d",
+             mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]),
+             GETARG_A(c));
+      print_lv(mrb, irep, c, RA);
+      break;
+    case OP_GETMCNST:
+      printf("OP_GETMCNST\tR%d\tR%d::%s", GETARG_A(c), GETARG_A(c),
+             mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]));
+      print_lv(mrb, irep, c, RAB);
+      break;
+    case OP_SETMCNST:
+      printf("OP_SETMCNST\tR%d::%s\tR%d", GETARG_A(c)+1,
+             mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]),
+             GETARG_A(c));
+      print_lv(mrb, irep, c, RA);
+      break;
+    case OP_GETIV:
+      printf("OP_GETIV\tR%d\t%s", GETARG_A(c),
+             mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]));
+      print_lv(mrb, irep, c, RA);
+      break;
+    case OP_SETIV:
+      printf("OP_SETIV\t%s\tR%d",
+             mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]),
+             GETARG_A(c));
+      print_lv(mrb, irep, c, RA);
+      break;
+    case OP_GETUPVAR:
+      printf("OP_GETUPVAR\tR%d\t%d\t%d",
+             GETARG_A(c), GETARG_B(c), GETARG_C(c));
+      print_lv(mrb, irep, c, RA);
+      break;
+    case OP_SETUPVAR:
+      printf("OP_SETUPVAR\tR%d\t%d\t%d",
+             GETARG_A(c), GETARG_B(c), GETARG_C(c));
+      print_lv(mrb, irep, c, RA);
+      break;
+    case OP_GETCV:
+      printf("OP_GETCV\tR%d\t%s", GETARG_A(c),
+             mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]));
+      print_lv(mrb, irep, c, RA);
+      break;
+    case OP_SETCV:
+      printf("OP_SETCV\t%s\tR%d",
+             mrb_sym2name(mrb, irep->syms[GETARG_Bx(c)]),
+             GETARG_A(c));
+      print_lv(mrb, irep, c, RA);
+      break;
+    case OP_JMP:
+      printf("OP_JMP\t\t%03d\n", i+GETARG_sBx(c));
+      break;
+    case OP_JMPIF:
+      printf("OP_JMPIF\tR%d\t%03d\n", GETARG_A(c), i+GETARG_sBx(c));
+      break;
+    case OP_JMPNOT:
+      printf("OP_JMPNOT\tR%d\t%03d\n", GETARG_A(c), i+GETARG_sBx(c));
+      break;
+    case OP_SEND:
+      printf("OP_SEND\tR%d\t:%s\t%d\n", GETARG_A(c),
+             mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
+             GETARG_C(c));
+      break;
+    case OP_SENDB:
+      printf("OP_SENDB\tR%d\t:%s\t%d\n", GETARG_A(c),
+             mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
+             GETARG_C(c));
+      break;
+    case OP_TAILCALL:
+      printf("OP_TAILCALL\tR%d\t:%s\t%d\n", GETARG_A(c),
+             mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
+             GETARG_C(c));
+      break;
+    case OP_SUPER:
+      printf("OP_SUPER\tR%d\t%d\n", GETARG_A(c),
+             GETARG_C(c));
+      break;
+    case OP_ARGARY:
+      printf("OP_ARGARY\tR%d\t%d:%d:%d:%d", GETARG_A(c),
+             (GETARG_Bx(c)>>10)&0x3f,
+             (GETARG_Bx(c)>>9)&0x1,
+             (GETARG_Bx(c)>>4)&0x1f,
+             (GETARG_Bx(c)>>0)&0xf);
+      print_lv(mrb, irep, c, RA);
+      break;
+
+    case OP_ENTER:
+      printf("OP_ENTER\t%d:%d:%d:%d:%d:%d:%d\n",
+             (GETARG_Ax(c)>>18)&0x1f,
+             (GETARG_Ax(c)>>13)&0x1f,
+             (GETARG_Ax(c)>>12)&0x1,
+             (GETARG_Ax(c)>>7)&0x1f,
+             (GETARG_Ax(c)>>2)&0x1f,
+             (GETARG_Ax(c)>>1)&0x1,
+             GETARG_Ax(c) & 0x1);
+      break;
+    case OP_RETURN:
+      printf("OP_RETURN\tR%d", GETARG_A(c));
+      switch (GETARG_B(c)) {
+      case OP_R_NORMAL:
+      case OP_R_RETURN:
+        printf("\treturn"); break;
+      case OP_R_BREAK:
+        printf("\tbreak"); break;
+      default:
+        printf("\tbroken"); break;
+        break;
+      }
+      print_lv(mrb, irep, c, RA);
+      break;
+    case OP_BLKPUSH:
+      printf("OP_BLKPUSH\tR%d\t%d:%d:%d:%d", GETARG_A(c),
+             (GETARG_Bx(c)>>10)&0x3f,
+             (GETARG_Bx(c)>>9)&0x1,
+             (GETARG_Bx(c)>>4)&0x1f,
+             (GETARG_Bx(c)>>0)&0xf);
+      print_lv(mrb, irep, c, RA);
+      break;
+
+    case OP_LAMBDA:
+      printf("OP_LAMBDA\tR%d\tI(%+d)\t%d", GETARG_A(c), GETARG_b(c)+1, GETARG_c(c));
+      print_lv(mrb, irep, c, RA);
+      break;
+    case OP_RANGE:
+      printf("OP_RANGE\tR%d\tR%d\t%d", GETARG_A(c), GETARG_B(c), GETARG_C(c));
+      print_lv(mrb, irep, c, RAB);
+      break;
+    case OP_METHOD:
+      printf("OP_METHOD\tR%d\t:%s", GETARG_A(c),
+             mrb_sym2name(mrb, irep->syms[GETARG_B(c)]));
+      print_lv(mrb, irep, c, RA);
+      break;
+
+    case OP_ADD:
+      printf("OP_ADD\tR%d\t:%s\t%d\n", GETARG_A(c),
+             mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
+             GETARG_C(c));
+      break;
+    case OP_ADDI:
+      printf("OP_ADDI\tR%d\t:%s\t%d\n", GETARG_A(c),
+             mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
+             GETARG_C(c));
+      break;
+    case OP_SUB:
+      printf("OP_SUB\tR%d\t:%s\t%d\n", GETARG_A(c),
+             mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
+             GETARG_C(c));
+      break;
+    case OP_SUBI:
+      printf("OP_SUBI\tR%d\t:%s\t%d\n", GETARG_A(c),
+             mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
+             GETARG_C(c));
+      break;
+    case OP_MUL:
+      printf("OP_MUL\tR%d\t:%s\t%d\n", GETARG_A(c),
+             mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
+             GETARG_C(c));
+      break;
+    case OP_DIV:
+      printf("OP_DIV\tR%d\t:%s\t%d\n", GETARG_A(c),
+             mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
+             GETARG_C(c));
+      break;
+    case OP_LT:
+      printf("OP_LT\tR%d\t:%s\t%d\n", GETARG_A(c),
+             mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
+             GETARG_C(c));
+      break;
+    case OP_LE:
+      printf("OP_LE\tR%d\t:%s\t%d\n", GETARG_A(c),
+             mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
+             GETARG_C(c));
+      break;
+    case OP_GT:
+      printf("OP_GT\tR%d\t:%s\t%d\n", GETARG_A(c),
+             mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
+             GETARG_C(c));
+      break;
+    case OP_GE:
+      printf("OP_GE\tR%d\t:%s\t%d\n", GETARG_A(c),
+             mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
+             GETARG_C(c));
+      break;
+    case OP_EQ:
+      printf("OP_EQ\tR%d\t:%s\t%d\n", GETARG_A(c),
+             mrb_sym2name(mrb, irep->syms[GETARG_B(c)]),
+             GETARG_C(c));
+      break;
+
+    case OP_STOP:
+      printf("OP_STOP\n");
+      break;
+
+    case OP_ARRAY:
+      printf("OP_ARRAY\tR%d\tR%d\t%d", GETARG_A(c), GETARG_B(c), GETARG_C(c));
+      print_lv(mrb, irep, c, RAB);
+      break;
+    case OP_ARYCAT:
+      printf("OP_ARYCAT\tR%d\tR%d", GETARG_A(c), GETARG_B(c));
+      print_lv(mrb, irep, c, RAB);
+      break;
+    case OP_ARYPUSH:
+      printf("OP_ARYPUSH\tR%d\tR%d", GETARG_A(c), GETARG_B(c));
+      print_lv(mrb, irep, c, RAB);
+      break;
+    case OP_AREF:
+      printf("OP_AREF\tR%d\tR%d\t%d", GETARG_A(c), GETARG_B(c), GETARG_C(c));
+      print_lv(mrb, irep, c, RAB);
+      break;
+    case OP_APOST:
+      printf("OP_APOST\tR%d\t%d\t%d", GETARG_A(c), GETARG_B(c), GETARG_C(c));
+      print_lv(mrb, irep, c, RAB);
+      break;
+    case OP_STRING:
+      {
+        mrb_value v = irep->pool[GETARG_Bx(c)];
+        mrb_value s = mrb_str_dump(mrb, mrb_str_new(mrb, RSTRING_PTR(v), RSTRING_LEN(v)));
+        printf("OP_STRING\tR%d\tL(%d)\t; %s", GETARG_A(c), GETARG_Bx(c), RSTRING_PTR(s));
+      }
+      print_lv(mrb, irep, c, RA);
+      break;
+    case OP_STRCAT:
+      printf("OP_STRCAT\tR%d\tR%d", GETARG_A(c), GETARG_B(c));
+      print_lv(mrb, irep, c, RAB);
+      break;
+    case OP_HASH:
+      printf("OP_HASH\tR%d\tR%d\t%d", GETARG_A(c), GETARG_B(c), GETARG_C(c));
+      print_lv(mrb, irep, c, RAB);
+      break;
+
+    case OP_OCLASS:
+      printf("OP_OCLASS\tR%d", GETARG_A(c));
+      print_lv(mrb, irep, c, RA);
+      break;
+    case OP_CLASS:
+      printf("OP_CLASS\tR%d\t:%s", GETARG_A(c),
+             mrb_sym2name(mrb, irep->syms[GETARG_B(c)]));
+      print_lv(mrb, irep, c, RA);
+      break;
+    case OP_MODULE:
+      printf("OP_MODULE\tR%d\t:%s", GETARG_A(c),
+             mrb_sym2name(mrb, irep->syms[GETARG_B(c)]));
+      print_lv(mrb, irep, c, RA);
+      break;
+    case OP_EXEC:
+      printf("OP_EXEC\tR%d\tI(%+d)", GETARG_A(c), GETARG_Bx(c)+1);
+      print_lv(mrb, irep, c, RA);
+      break;
+    case OP_SCLASS:
+      printf("OP_SCLASS\tR%d\tR%d", GETARG_A(c), GETARG_B(c));
+      print_lv(mrb, irep, c, RAB);
+      break;
+    case OP_TCLASS:
+      printf("OP_TCLASS\tR%d", GETARG_A(c));
+      print_lv(mrb, irep, c, RA);
+      break;
+    case OP_ERR:
+      {
+        mrb_value v = irep->pool[GETARG_Bx(c)];
+        mrb_value s = mrb_str_dump(mrb, mrb_str_new(mrb, RSTRING_PTR(v), RSTRING_LEN(v)));
+        printf("OP_ERR\t%s\n", RSTRING_PTR(s));
+      }
+      break;
+    case OP_EPUSH:
+      printf("OP_EPUSH\t:I(%+d)\n", GETARG_Bx(c)+1);
+      break;
+    case OP_ONERR:
+      printf("OP_ONERR\t%03d\n", i+GETARG_sBx(c));
+      break;
+    case OP_RESCUE:
+      printf("OP_RESCUE\tR%d", GETARG_A(c));
+      print_lv(mrb, irep, c, RA);
+      break;
+    case OP_RAISE:
+      printf("OP_RAISE\tR%d", GETARG_A(c));
+      print_lv(mrb, irep, c, RA);
+      break;
+    case OP_POPERR:
+      printf("OP_POPERR\t%d", GETARG_A(c));
+      print_lv(mrb, irep, c, RA);
+      break;
+    case OP_EPOP:
+      printf("OP_EPOP\t%d\n", GETARG_A(c));
+      break;
+
+    default:
+      printf("OP_unknown %d\t%d\t%d\t%d\n", GET_OPCODE(c),
+             GETARG_A(c), GETARG_B(c), GETARG_C(c));
+      break;
+    }
+    mrb_gc_arena_restore(mrb, ai);
+  }
+  printf("\n");
+#endif
+}
+
+static void
+codedump_recur(mrb_state *mrb, mrb_irep *irep)
+{
+  size_t i;
+
+  codedump(mrb, irep);
+  for (i=0; i<irep->rlen; i++) {
+    codedump_recur(mrb, irep->reps[i]);
+  }
+}
+
+void
+mrb_codedump_all(mrb_state *mrb, struct RProc *proc)
+{
+  codedump_recur(mrb, proc->body.irep);
+}
+
+MRB_API struct RProc*
+mrb_generate_code(mrb_state *mrb, parser_state *p)
+{
+  codegen_scope *scope = scope_new(mrb, 0, 0);
+  struct RProc *proc;
+
+  if (!scope) {
+    return NULL;
+  }
+  scope->mrb = mrb;
+  scope->parser = p;
+  scope->filename = p->filename;
+  scope->filename_index = p->current_filename_index;
+
+  MRB_TRY(&scope->jmp) {
+    /* prepare irep */
+    codegen(scope, p->tree, NOVAL);
+    proc = mrb_proc_new(mrb, scope->irep);
+    mrb_irep_decref(mrb, scope->irep);
+    mrb_pool_close(scope->mpool);
+    return proc;
+  }
+  MRB_CATCH(&scope->jmp) {
+    if (scope->filename == scope->irep->filename) {
+      scope->irep->filename = NULL;
+    }
+    mrb_irep_decref(mrb, scope->irep);
+    mrb_pool_close(scope->mpool);
+    return NULL;
+  }
+  MRB_END_EXC(&scope->jmp);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/compar.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,14 @@
+/*
+** compar.c - Comparable module
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+
+void
+mrb_init_comparable(mrb_state *mrb)
+{
+  mrb_define_module(mrb, "Comparable");  /* 15.3.3 */
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/crc.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,40 @@
+/*
+** crc.c - calculate CRC
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <limits.h>
+#include <stdint.h>
+#include <stddef.h>
+
+/* Calculate CRC (CRC-16-CCITT)
+**
+**  0000_0000_0000_0000_0000_0000_0000_0000
+**          ^|------- CRC -------|- work --|
+**        carry
+*/
+#define  CRC_16_CCITT       0x11021ul        /* x^16+x^12+x^5+1 */
+#define  CRC_XOR_PATTERN    (CRC_16_CCITT << 8)
+#define  CRC_CARRY_BIT      (0x01000000)
+
+uint16_t
+calc_crc_16_ccitt(const uint8_t *src, size_t nbytes, uint16_t crc)
+{
+  size_t ibyte;
+  uint32_t ibit;
+  uint32_t crcwk = crc << 8;
+
+  for (ibyte = 0; ibyte < nbytes; ibyte++) {
+    crcwk |= *src++;
+    for (ibit = 0; ibit < CHAR_BIT; ibit++) {
+      crcwk <<= 1;
+      if (crcwk & CRC_CARRY_BIT) {
+        crcwk ^= CRC_XOR_PATTERN;
+      }
+    }
+  }
+  return (uint16_t)(crcwk >> 8);
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/debug.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,216 @@
+#include <string.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include "mruby/debug.h"
+
+static mrb_irep_debug_info_file *
+get_file(mrb_irep_debug_info *info, uint32_t pc)
+{
+  mrb_irep_debug_info_file **ret;
+  int32_t count;
+
+  if (pc >= info->pc_count) { return NULL; }
+  /* get upper bound */
+  ret = info->files;
+  count =  info->flen;
+  while (count > 0) {
+    int32_t step = count / 2;
+    mrb_irep_debug_info_file **it = ret + step;
+    if (!(pc < (*it)->start_pos)) {
+      ret = it + 1;
+      count -= step + 1;
+    } else { count = step; }
+  }
+
+  --ret;
+
+  /* check returning file exists inside debug info */
+  mrb_assert(info->files <= ret && ret < (info->files + info->flen));
+  /* check pc is within the range of returning file */
+  mrb_assert((*ret)->start_pos <= pc &&
+             pc < (((ret + 1 - info->files) < info->flen)
+                   ? (*(ret+1))->start_pos : info->pc_count));
+
+  return *ret;
+}
+
+static mrb_debug_line_type
+select_line_type(const uint16_t *lines, size_t lines_len)
+{
+  size_t line_count = 0;
+  int prev_line = -1;
+  size_t i;
+  for (i = 0; i < lines_len; ++i) {
+    if (lines[i] != prev_line) {
+      ++line_count;
+    }
+  }
+  return (sizeof(uint16_t) * lines_len) <= (sizeof(mrb_irep_debug_info_line) * line_count)
+      ? mrb_debug_line_ary : mrb_debug_line_flat_map;
+}
+
+MRB_API char const*
+mrb_debug_get_filename(mrb_irep *irep, uint32_t pc)
+{
+  if (irep && pc < irep->ilen) {
+    mrb_irep_debug_info_file* f = NULL;
+    if (!irep->debug_info) { return irep->filename; }
+    else if ((f = get_file(irep->debug_info, pc))) {
+      return f->filename;
+    }
+  }
+  return NULL;
+}
+
+MRB_API int32_t
+mrb_debug_get_line(mrb_irep *irep, uint32_t pc)
+{
+  if (irep && pc < irep->ilen) {
+    mrb_irep_debug_info_file* f = NULL;
+    if (!irep->debug_info) {
+      return irep->lines? irep->lines[pc] : -1;
+    }
+    else if ((f = get_file(irep->debug_info, pc))) {
+      switch (f->line_type) {
+        case mrb_debug_line_ary:
+          mrb_assert(f->start_pos <= pc && pc < (f->start_pos + f->line_entry_count));
+          return f->lines.ary[pc - f->start_pos];
+
+        case mrb_debug_line_flat_map: {
+          /* get upper bound */
+          mrb_irep_debug_info_line *ret = f->lines.flat_map;
+          uint32_t count = f->line_entry_count;
+          while (count > 0) {
+            int32_t step = count / 2;
+            mrb_irep_debug_info_line *it = ret + step;
+            if (!(pc < it->start_pos)) {
+              ret = it + 1;
+              count -= step + 1;
+            } else { count = step; }
+          }
+
+          --ret;
+
+          /* check line entry pointer range */
+          mrb_assert(f->lines.flat_map <= ret && ret < (f->lines.flat_map + f->line_entry_count));
+          /* check pc range */
+          mrb_assert(ret->start_pos <= pc &&
+                     pc < (((uint32_t)(ret + 1 - f->lines.flat_map) < f->line_entry_count)
+                           ? (ret+1)->start_pos : irep->debug_info->pc_count));
+
+          return ret->line;
+        }
+      }
+    }
+  }
+  return -1;
+}
+
+MRB_API mrb_irep_debug_info *
+mrb_debug_info_alloc(mrb_state *mrb, mrb_irep *irep)
+{
+  static const mrb_irep_debug_info initial = { 0, 0, NULL };
+  mrb_irep_debug_info *ret;
+
+  mrb_assert(!irep->debug_info);
+  ret = (mrb_irep_debug_info *)mrb_malloc(mrb, sizeof(*ret));
+  *ret = initial;
+  irep->debug_info = ret;
+  return ret;
+}
+
+MRB_API mrb_irep_debug_info_file *
+mrb_debug_info_append_file(mrb_state *mrb, mrb_irep *irep,
+                           uint32_t start_pos, uint32_t end_pos)
+{
+  mrb_irep_debug_info *info;
+  mrb_irep_debug_info_file *ret;
+  uint32_t file_pc_count;
+  size_t fn_len;
+  mrb_int len;
+  uint32_t i;
+
+  if (!irep->debug_info) { return NULL; }
+
+  mrb_assert(irep->filename);
+  mrb_assert(irep->lines);
+
+  info = irep->debug_info;
+
+  if (info->flen > 0 && strcmp(irep->filename, info->files[info->flen - 1]->filename) == 0) {
+    return NULL;
+  }
+
+  ret = (mrb_irep_debug_info_file *)mrb_malloc(mrb, sizeof(*ret));
+  info->files =
+      (mrb_irep_debug_info_file**)(
+          info->files
+          ? mrb_realloc(mrb, info->files, sizeof(mrb_irep_debug_info_file*) * (info->flen + 1))
+          : mrb_malloc(mrb, sizeof(mrb_irep_debug_info_file*)));
+  info->files[info->flen++] = ret;
+
+  file_pc_count = end_pos - start_pos;
+
+  ret->start_pos = start_pos;
+  info->pc_count = end_pos;
+
+  fn_len = strlen(irep->filename);
+  ret->filename_sym = mrb_intern(mrb, irep->filename, fn_len);
+  len = 0;
+  ret->filename = mrb_sym2name_len(mrb, ret->filename_sym, &len);
+
+  ret->line_type = select_line_type(irep->lines + start_pos, end_pos - start_pos);
+  ret->lines.ptr = NULL;
+
+  switch (ret->line_type) {
+    case mrb_debug_line_ary:
+      ret->line_entry_count = file_pc_count;
+      ret->lines.ary = (uint16_t*)mrb_malloc(mrb, sizeof(uint16_t) * file_pc_count);
+      for (i = 0; i < file_pc_count; ++i) {
+        ret->lines.ary[i] = irep->lines[start_pos + i];
+      }
+      break;
+
+    case mrb_debug_line_flat_map: {
+      uint16_t prev_line = 0;
+      mrb_irep_debug_info_line m;
+      ret->lines.flat_map = (mrb_irep_debug_info_line*)mrb_malloc(mrb, sizeof(mrb_irep_debug_info_line) * 1);
+      ret->line_entry_count = 0;
+      for (i = 0; i < file_pc_count; ++i) {
+        if (irep->lines[start_pos + i] == prev_line) { continue; }
+
+        ret->lines.flat_map = (mrb_irep_debug_info_line*)mrb_realloc(
+            mrb, ret->lines.flat_map,
+            sizeof(mrb_irep_debug_info_line) * (ret->line_entry_count + 1));
+        m.start_pos = start_pos + i;
+        m.line = irep->lines[start_pos + i];
+        ret->lines.flat_map[ret->line_entry_count] = m;
+
+        /* update */
+        ++ret->line_entry_count;
+        prev_line = irep->lines[start_pos + i];
+      }
+    } break;
+
+    default: mrb_assert(0); break;
+  }
+
+  return ret;
+}
+
+MRB_API void
+mrb_debug_info_free(mrb_state *mrb, mrb_irep_debug_info *d)
+{
+  uint32_t i;
+
+  if (!d) { return; }
+
+  for (i = 0; i < d->flen; ++i) {
+    mrb_assert(d->files[i]);
+    mrb_free(mrb, d->files[i]->lines.ptr);
+    mrb_free(mrb, d->files[i]);
+  }
+  mrb_free(mrb, d->files);
+  mrb_free(mrb, d);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/dump.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,1070 @@
+/*
+** dump.c - mruby binary dumper (mrbc binary format)
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <ctype.h>
+#include <string.h>
+#include <limits.h>
+#include "mruby/dump.h"
+#include "mruby/string.h"
+#include "mruby/irep.h"
+#include "mruby/numeric.h"
+#include "mruby/debug.h"
+
+#define FLAG_BYTEORDER_NATIVE 2
+#define FLAG_BYTEORDER_NONATIVE 0
+
+#ifdef ENABLE_STDIO
+
+static size_t get_irep_record_size_1(mrb_state *mrb, mrb_irep *irep);
+
+#if UINT32_MAX > SIZE_MAX
+# error This code cannot be built on your environment.
+#endif
+
+static size_t
+write_padding(uint8_t *buf)
+{
+  const size_t align = MRB_DUMP_ALIGNMENT;
+  size_t pad_len = -(intptr_t)buf & (align-1);
+  if (pad_len > 0) {
+    memset(buf, 0, pad_len);
+  }
+  return pad_len;
+}
+
+static size_t
+get_irep_header_size(mrb_state *mrb)
+{
+  size_t size = 0;
+
+  size += sizeof(uint32_t) * 1;
+  size += sizeof(uint16_t) * 3;
+
+  return size;
+}
+
+static ptrdiff_t
+write_irep_header(mrb_state *mrb, mrb_irep *irep, uint8_t *buf)
+{
+  uint8_t *cur = buf;
+
+  cur += uint32_to_bin(get_irep_record_size_1(mrb, irep), cur);  /* record size */
+  cur += uint16_to_bin((uint16_t)irep->nlocals, cur);  /* number of local variable */
+  cur += uint16_to_bin((uint16_t)irep->nregs, cur);  /* number of register variable */
+  cur += uint16_to_bin((uint16_t)irep->rlen, cur);  /* number of child irep */
+
+  return cur - buf;
+}
+
+
+static size_t
+get_iseq_block_size(mrb_state *mrb, mrb_irep *irep)
+{
+  size_t size = 0;
+
+  size += sizeof(uint32_t); /* ilen */
+  size += sizeof(uint32_t); /* max padding */
+  size += sizeof(uint32_t) * irep->ilen; /* iseq(n) */
+
+  return size;
+}
+
+static ptrdiff_t
+write_iseq_block(mrb_state *mrb, mrb_irep *irep, uint8_t *buf, uint8_t flags)
+{
+  uint8_t *cur = buf;
+  uint32_t iseq_no;
+
+  cur += uint32_to_bin(irep->ilen, cur); /* number of opcode */
+  cur += write_padding(cur);
+  if (flags & FLAG_BYTEORDER_NATIVE) {
+    memcpy(cur, irep->iseq, irep->ilen * sizeof(mrb_code));
+    cur += irep->ilen * sizeof(mrb_code);
+  }
+  else {
+    for (iseq_no = 0; iseq_no < irep->ilen; iseq_no++) {
+      cur += uint32_to_bin(irep->iseq[iseq_no], cur); /* opcode */
+    }
+  }
+
+  return cur - buf;
+}
+
+
+static size_t
+get_pool_block_size(mrb_state *mrb, mrb_irep *irep)
+{
+  size_t size = 0;
+  size_t pool_no;
+  mrb_value str;
+  char buf[32];
+
+  size += sizeof(uint32_t); /* plen */
+  size += irep->plen * (sizeof(uint8_t) + sizeof(uint16_t)); /* len(n) */
+
+  for (pool_no = 0; pool_no < irep->plen; pool_no++) {
+    int ai = mrb_gc_arena_save(mrb);
+
+    switch (mrb_type(irep->pool[pool_no])) {
+    case MRB_TT_FIXNUM:
+      str = mrb_fixnum_to_str(mrb, irep->pool[pool_no], 10);
+      {
+        mrb_int len = RSTRING_LEN(str);
+        mrb_assert_int_fit(mrb_int, len, size_t, SIZE_MAX);
+        size += (size_t)len;
+      }
+      break;
+
+    case MRB_TT_FLOAT:
+      {
+        int len;
+        len = mrb_float_to_str(buf, mrb_float(irep->pool[pool_no]));
+        mrb_assert_int_fit(mrb_int, len, size_t, SIZE_MAX);
+        size += (size_t)len;
+      }
+      break;
+
+    case MRB_TT_STRING:
+      {
+        mrb_int len = RSTRING_LEN(irep->pool[pool_no]);
+        mrb_assert_int_fit(mrb_int, len, size_t, SIZE_MAX);
+        size += (size_t)len;
+      }
+      break;
+
+    default:
+      break;
+    }
+    mrb_gc_arena_restore(mrb, ai);
+  }
+
+  return size;
+}
+
+static ptrdiff_t
+write_pool_block(mrb_state *mrb, mrb_irep *irep, uint8_t *buf)
+{
+  size_t pool_no;
+  uint8_t *cur = buf;
+  uint16_t len;
+  mrb_value str;
+  const char *char_ptr;
+  char char_buf[30];
+
+  cur += uint32_to_bin(irep->plen, cur); /* number of pool */
+
+  for (pool_no = 0; pool_no < irep->plen; pool_no++) {
+    int ai = mrb_gc_arena_save(mrb);
+
+    switch (mrb_type(irep->pool[pool_no])) {
+    case MRB_TT_FIXNUM:
+      cur += uint8_to_bin(IREP_TT_FIXNUM, cur); /* data type */
+      str = mrb_fixnum_to_str(mrb, irep->pool[pool_no], 10);
+      char_ptr = RSTRING_PTR(str);
+      {
+        mrb_int tlen;
+
+        tlen = RSTRING_LEN(str);
+        mrb_assert_int_fit(mrb_int, tlen, uint16_t, UINT16_MAX);
+        len = (uint16_t)tlen;
+      }
+      break;
+
+    case MRB_TT_FLOAT:
+      cur += uint8_to_bin(IREP_TT_FLOAT, cur); /* data type */
+      {
+        int tlen;
+        tlen = mrb_float_to_str(char_buf, mrb_float(irep->pool[pool_no]));
+        mrb_assert_int_fit(int, tlen, uint16_t, UINT16_MAX);
+        len = (uint16_t)tlen;
+      }
+      char_ptr = &char_buf[0];
+      break;
+
+    case MRB_TT_STRING:
+      cur += uint8_to_bin(IREP_TT_STRING, cur); /* data type */
+      char_ptr = RSTRING_PTR(irep->pool[pool_no]);
+      {
+        mrb_int tlen;
+
+        tlen = RSTRING_LEN(irep->pool[pool_no]);
+        mrb_assert_int_fit(mrb_int, tlen, uint16_t, UINT16_MAX);
+        len = (uint16_t)tlen;
+      }
+      break;
+
+    default:
+      continue;
+    }
+
+    cur += uint16_to_bin(len, cur); /* data length */
+    memcpy(cur, char_ptr, (size_t)len);
+    cur += len;
+
+    mrb_gc_arena_restore(mrb, ai);
+  }
+
+  return cur - buf;
+}
+
+
+static size_t
+get_syms_block_size(mrb_state *mrb, mrb_irep *irep)
+{
+  size_t size = 0;
+  uint32_t sym_no;
+  mrb_int len;
+
+  size += sizeof(uint32_t); /* slen */
+  for (sym_no = 0; sym_no < irep->slen; sym_no++) {
+    size += sizeof(uint16_t); /* snl(n) */
+    if (irep->syms[sym_no] != 0) {
+      mrb_sym2name_len(mrb, irep->syms[sym_no], &len);
+      size += len + 1; /* sn(n) + null char */
+    }
+  }
+
+  return size;
+}
+
+static ptrdiff_t
+write_syms_block(mrb_state *mrb, mrb_irep *irep, uint8_t *buf)
+{
+  uint32_t sym_no;
+  uint8_t *cur = buf;
+  const char *name;
+
+  cur += uint32_to_bin(irep->slen, cur); /* number of symbol */
+
+  for (sym_no = 0; sym_no < irep->slen; sym_no++) {
+    if (irep->syms[sym_no] != 0) {
+      mrb_int len;
+
+      name = mrb_sym2name_len(mrb, irep->syms[sym_no], &len);
+
+      mrb_assert_int_fit(mrb_int, len, uint16_t, UINT16_MAX);
+      cur += uint16_to_bin((uint16_t)len, cur); /* length of symbol name */
+      memcpy(cur, name, len); /* symbol name */
+      cur += (uint16_t)len;
+      *cur++ = '\0';
+    }
+    else {
+      cur += uint16_to_bin(MRB_DUMP_NULL_SYM_LEN, cur); /* length of symbol name */
+    }
+  }
+
+  return cur - buf;
+}
+
+static size_t
+get_irep_record_size_1(mrb_state *mrb, mrb_irep *irep)
+{
+  size_t size = 0;
+
+  size += get_irep_header_size(mrb);
+  size += get_iseq_block_size(mrb, irep);
+  size += get_pool_block_size(mrb, irep);
+  size += get_syms_block_size(mrb, irep);
+  return size;
+}
+
+static size_t
+get_irep_record_size(mrb_state *mrb, mrb_irep *irep)
+{
+  size_t size = 0;
+  size_t irep_no;
+
+  size = get_irep_record_size_1(mrb, irep);
+  for (irep_no = 0; irep_no < irep->rlen; irep_no++) {
+    size += get_irep_record_size(mrb, irep->reps[irep_no]);
+  }
+  return size;
+}
+
+static int
+write_irep_record(mrb_state *mrb, mrb_irep *irep, uint8_t *bin, size_t *irep_record_size, uint8_t flags)
+{
+  uint32_t i;
+  uint8_t *src = bin;
+
+  if (irep == NULL) {
+    return MRB_DUMP_INVALID_IREP;
+  }
+
+  *irep_record_size = get_irep_record_size_1(mrb, irep);
+  if (*irep_record_size == 0) {
+    return MRB_DUMP_GENERAL_FAILURE;
+  }
+
+  bin += write_irep_header(mrb, irep, bin);
+  bin += write_iseq_block(mrb, irep, bin, flags);
+  bin += write_pool_block(mrb, irep, bin);
+  bin += write_syms_block(mrb, irep, bin);
+
+  for (i = 0; i < irep->rlen; i++) {
+    int result;
+    size_t rsize;
+
+    result = write_irep_record(mrb, irep->reps[i], bin, &rsize, flags);
+    if (result != MRB_DUMP_OK) {
+      return result;
+    }
+    bin += rsize;
+  }
+  *irep_record_size = bin - src;
+  return MRB_DUMP_OK;
+}
+
+static uint32_t
+write_footer(mrb_state *mrb, uint8_t *bin)
+{
+  struct rite_binary_footer footer;
+
+  memcpy(footer.section_identify, RITE_BINARY_EOF, sizeof(footer.section_identify));
+  uint32_to_bin(sizeof(struct rite_binary_footer), footer.section_size);
+  memcpy(bin, &footer, sizeof(struct rite_binary_footer));
+
+  return sizeof(struct rite_binary_footer);
+}
+
+
+static int
+write_section_irep_header(mrb_state *mrb, size_t section_size, uint8_t *bin)
+{
+  struct rite_section_irep_header *header = (struct rite_section_irep_header*)bin;
+
+  memcpy(header->section_identify, RITE_SECTION_IREP_IDENTIFIER, sizeof(header->section_identify));
+
+  mrb_assert_int_fit(size_t, section_size, uint32_t, UINT32_MAX);
+  uint32_to_bin((uint32_t)section_size, header->section_size);
+  memcpy(header->rite_version, RITE_VM_VER, sizeof(header->rite_version));
+
+  return MRB_DUMP_OK;
+}
+
+static int
+write_section_irep(mrb_state *mrb, mrb_irep *irep, uint8_t *bin, size_t *len_p, uint8_t flags)
+{
+  int result;
+  size_t rsize = 0;
+  uint8_t *cur = bin;
+
+  if (mrb == NULL || bin == NULL) {
+    return MRB_DUMP_INVALID_ARGUMENT;
+  }
+
+  cur += sizeof(struct rite_section_irep_header);
+
+  result = write_irep_record(mrb, irep, cur, &rsize, flags);
+  if (result != MRB_DUMP_OK) {
+    return result;
+  }
+  *len_p = cur - bin + rsize;
+  write_section_irep_header(mrb, *len_p, bin);
+
+  return MRB_DUMP_OK;
+}
+
+static int
+write_section_lineno_header(mrb_state *mrb, size_t section_size, uint8_t *bin)
+{
+  struct rite_section_lineno_header *header = (struct rite_section_lineno_header*)bin;
+
+  memcpy(header->section_identify, RITE_SECTION_LINENO_IDENTIFIER, sizeof(header->section_identify));
+  uint32_to_bin((uint32_t)section_size, header->section_size);
+
+  return MRB_DUMP_OK;
+}
+
+static size_t
+get_lineno_record_size(mrb_state *mrb, mrb_irep *irep)
+{
+  size_t size = 0;
+
+  size += sizeof(uint32_t); /* record size */
+  size += sizeof(uint16_t); /* filename size */
+  if (irep->filename) {
+    size += strlen(irep->filename); /* filename */
+  }
+  size += sizeof(uint32_t); /* niseq */
+  if (irep->lines) {
+    size += sizeof(uint16_t) * irep->ilen; /* lineno */
+  }
+
+  return size;
+}
+
+static size_t
+write_lineno_record_1(mrb_state *mrb, mrb_irep *irep, uint8_t* bin)
+{
+  uint8_t *cur = bin;
+  size_t iseq_no;
+  size_t filename_len;
+  ptrdiff_t diff;
+
+  cur += sizeof(uint32_t); /* record size */
+
+  if (irep->filename) {
+    filename_len = strlen(irep->filename);
+  } else {
+    filename_len = 0;
+  }
+  mrb_assert_int_fit(size_t, filename_len, uint16_t, UINT16_MAX);
+  cur += uint16_to_bin((uint16_t)filename_len, cur); /* filename size */
+
+  if (filename_len) {
+    memcpy(cur, irep->filename, filename_len);
+    cur += filename_len; /* filename */
+  }
+
+  if (irep->lines) {
+    mrb_assert_int_fit(size_t, irep->ilen, uint32_t, UINT32_MAX);
+    cur += uint32_to_bin((uint32_t)(irep->ilen), cur); /* niseq */
+    for (iseq_no = 0; iseq_no < irep->ilen; iseq_no++) {
+      cur += uint16_to_bin(irep->lines[iseq_no], cur); /* opcode */
+    }
+  }
+  else {
+    cur += uint32_to_bin(0, cur); /* niseq */
+  }
+
+  diff = cur - bin;
+  mrb_assert_int_fit(ptrdiff_t, diff, uint32_t, UINT32_MAX);
+
+  uint32_to_bin((uint32_t)diff, bin); /* record size */
+
+  mrb_assert_int_fit(ptrdiff_t, diff, size_t, SIZE_MAX);
+  return (size_t)diff;
+}
+
+static size_t
+write_lineno_record(mrb_state *mrb, mrb_irep *irep, uint8_t* bin)
+{
+  size_t i;
+  size_t rlen, size = 0;
+
+  rlen = write_lineno_record_1(mrb, irep, bin);
+  bin += rlen;
+  size += rlen;
+  for (i=0; i<irep->rlen; i++) {
+    rlen = write_lineno_record(mrb, irep, bin);
+    bin += rlen;
+    size += rlen;
+  }
+  return size;
+}
+
+static int
+write_section_lineno(mrb_state *mrb, mrb_irep *irep, uint8_t *bin)
+{
+  size_t section_size = 0;
+  size_t rlen = 0; /* size of irep record */
+  uint8_t *cur = bin;
+
+  if (mrb == NULL || bin == NULL) {
+    return MRB_DUMP_INVALID_ARGUMENT;
+  }
+
+  cur += sizeof(struct rite_section_lineno_header);
+  section_size += sizeof(struct rite_section_lineno_header);
+
+  rlen = write_lineno_record(mrb, irep, cur);
+  section_size += rlen;
+
+  write_section_lineno_header(mrb, section_size, bin);
+
+  return MRB_DUMP_OK;
+}
+
+static size_t
+get_debug_record_size(mrb_state *mrb, mrb_irep *irep)
+{
+  size_t ret = 0;
+  uint16_t f_idx;
+  size_t i;
+
+  ret += sizeof(uint32_t); /* record size */
+  ret += sizeof(uint16_t); /* file count */
+
+  for (f_idx = 0; f_idx < irep->debug_info->flen; ++f_idx) {
+    mrb_irep_debug_info_file const* file = irep->debug_info->files[f_idx];
+
+    ret += sizeof(uint32_t); /* position */
+    ret += sizeof(uint16_t); /* filename index */
+
+    /* lines */
+    ret += sizeof(uint32_t); /* entry count */
+    ret += sizeof(uint8_t); /* line type */
+    switch (file->line_type) {
+      case mrb_debug_line_ary:
+        ret += sizeof(uint16_t) * (size_t)(file->line_entry_count);
+        break;
+
+      case mrb_debug_line_flat_map:
+        ret += (sizeof(uint32_t) + sizeof(uint16_t)) * (size_t)(file->line_entry_count);
+        break;
+
+      default: mrb_assert(0); break;
+    }
+  }
+  for (i=0; i<irep->rlen; i++) {
+    ret += get_debug_record_size(mrb, irep->reps[i]);
+  }
+
+  return ret;
+}
+
+static int
+find_filename_index(const mrb_sym *ary, int ary_len, mrb_sym s)
+{
+  int i;
+
+  for (i = 0; i < ary_len; ++i) {
+    if (ary[i] == s) { return i; }
+  }
+  return -1;
+}
+
+static size_t
+get_filename_table_size(mrb_state *mrb, mrb_irep *irep, mrb_sym **fp, uint16_t *lp)
+{
+  mrb_sym *filenames = *fp;
+  size_t i, size = 0;
+  mrb_irep_debug_info *di = irep->debug_info;
+
+  mrb_assert(lp);
+  for (i = 0; i < di->flen; ++i) {
+    mrb_irep_debug_info_file *file;
+    mrb_int filename_len;
+
+    file = di->files[i];
+    if (find_filename_index(filenames, *lp, file->filename_sym) == -1) {
+      /* register filename */
+      *lp += 1;
+      *fp = filenames = (mrb_sym *)mrb_realloc(mrb, filenames, sizeof(mrb_sym) * (*lp));
+      filenames[*lp - 1] = file->filename_sym;
+
+      /* filename */
+      mrb_sym2name_len(mrb, file->filename_sym, &filename_len);
+      size += sizeof(uint16_t) + (size_t)filename_len;
+    }
+  }
+  for (i=0; i<irep->rlen; i++) {
+    size += get_filename_table_size(mrb, irep->reps[i], fp, lp);
+  }
+  return size;
+}
+
+static size_t
+write_debug_record_1(mrb_state *mrb, mrb_irep *irep, uint8_t *bin, mrb_sym const* filenames, uint16_t filenames_len)
+{
+  uint8_t *cur;
+  uint16_t f_idx;
+  ptrdiff_t ret;
+
+  cur = bin + sizeof(uint32_t); /* skip record size */
+  cur += uint16_to_bin(irep->debug_info->flen, cur); /* file count */
+
+  for (f_idx = 0; f_idx < irep->debug_info->flen; ++f_idx) {
+    int filename_idx;
+    const mrb_irep_debug_info_file *file = irep->debug_info->files[f_idx];
+
+    /* position */
+    cur += uint32_to_bin(file->start_pos, cur);
+
+    /* filename index */
+    filename_idx = find_filename_index(filenames, filenames_len,
+                                                  file->filename_sym);
+    mrb_assert_int_fit(int, filename_idx, uint16_t, UINT16_MAX);
+    cur += uint16_to_bin((uint16_t)filename_idx, cur);
+
+    /* lines */
+    cur += uint32_to_bin(file->line_entry_count, cur);
+    cur += uint8_to_bin(file->line_type, cur);
+    switch (file->line_type) {
+      case mrb_debug_line_ary: {
+        uint32_t l;
+        for (l = 0; l < file->line_entry_count; ++l) {
+          cur += uint16_to_bin(file->lines.ary[l], cur);
+        }
+      } break;
+
+      case mrb_debug_line_flat_map: {
+        uint32_t line;
+        for (line = 0; line < file->line_entry_count; ++line) {
+          cur += uint32_to_bin(file->lines.flat_map[line].start_pos, cur);
+          cur += uint16_to_bin(file->lines.flat_map[line].line, cur);
+        }
+      } break;
+
+      default: mrb_assert(0); break;
+    }
+  }
+
+  ret = cur - bin;
+  mrb_assert_int_fit(ptrdiff_t, ret, uint32_t, UINT32_MAX);
+  uint32_to_bin(ret, bin);
+
+  mrb_assert_int_fit(ptrdiff_t, ret, size_t, SIZE_MAX);
+  return (size_t)ret;
+}
+
+static size_t
+write_debug_record(mrb_state *mrb, mrb_irep *irep, uint8_t *bin, mrb_sym const* filenames, uint16_t filenames_len)
+{
+  size_t size, len;
+  size_t irep_no;
+
+  size = len = write_debug_record_1(mrb, irep, bin, filenames, filenames_len);
+  bin += len;
+  for (irep_no = 0; irep_no < irep->rlen; irep_no++) {
+    len = write_debug_record(mrb, irep->reps[irep_no], bin, filenames, filenames_len);
+    bin += len;
+    size += len;
+  }
+
+  mrb_assert(size == get_debug_record_size(mrb, irep));
+  return size;
+}
+
+static int
+write_section_debug(mrb_state *mrb, mrb_irep *irep, uint8_t *cur, mrb_sym const *filenames, uint16_t filenames_len)
+{
+  size_t section_size = 0;
+  const uint8_t *bin = cur;
+  struct rite_section_debug_header *header;
+  size_t dlen;
+  uint16_t i;
+  char const *sym; mrb_int sym_len;
+
+  if (mrb == NULL || cur == NULL) {
+    return MRB_DUMP_INVALID_ARGUMENT;
+  }
+
+  header = (struct rite_section_debug_header *)bin;
+  cur += sizeof(struct rite_section_debug_header);
+  section_size += sizeof(struct rite_section_debug_header);
+
+  /* filename table */
+  cur += uint16_to_bin(filenames_len, cur);
+  section_size += sizeof(uint16_t);
+  for (i = 0; i < filenames_len; ++i) {
+    sym = mrb_sym2name_len(mrb, filenames[i], &sym_len);
+    mrb_assert(sym);
+    cur += uint16_to_bin(sym_len, cur);
+    memcpy(cur, sym, sym_len);
+    cur += sym_len;
+    section_size += sizeof(uint16_t) + sym_len;
+  }
+
+  /* debug records */
+  dlen = write_debug_record(mrb, irep, cur, filenames, filenames_len);
+  section_size += dlen;
+
+  memcpy(header->section_identify, RITE_SECTION_DEBUG_IDENTIFIER, sizeof(header->section_identify));
+  mrb_assert(section_size <= INT32_MAX);
+  uint32_to_bin(section_size, header->section_size);
+
+  return MRB_DUMP_OK;
+}
+
+static void
+create_lv_sym_table(mrb_state *mrb, const mrb_irep *irep, mrb_sym **syms, uint32_t *syms_len)
+{
+  size_t i;
+
+  if (*syms == NULL) {
+    *syms = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym) * 1);
+  }
+
+  for (i = 0; i + 1 < irep->nlocals; ++i) {
+    mrb_sym const name = irep->lv[i].name;
+    if (name == 0) continue;
+    if (find_filename_index(*syms, *syms_len, name) != -1) continue;
+
+    ++(*syms_len);
+    *syms = (mrb_sym*)mrb_realloc(mrb, *syms, sizeof(mrb_sym) * (*syms_len));
+    (*syms)[*syms_len - 1] = name;
+  }
+
+  for (i = 0; i < irep->rlen; ++i) {
+    create_lv_sym_table(mrb, irep->reps[i], syms, syms_len);
+  }
+}
+
+static int
+write_lv_sym_table(mrb_state *mrb, uint8_t **start, mrb_sym const *syms, uint32_t syms_len)
+{
+  uint8_t *cur = *start;
+  uint32_t i;
+  const char *str;
+  mrb_int str_len;
+
+  cur += uint32_to_bin(syms_len, cur);
+
+  for (i = 0; i < syms_len; ++i) {
+    str = mrb_sym2name_len(mrb, syms[i], &str_len);
+    cur += uint16_to_bin(str_len, cur);
+    memcpy(cur, str, str_len);
+    cur += str_len;
+  }
+
+  *start = cur;
+
+  return MRB_DUMP_OK;
+}
+
+static int
+write_lv_record(mrb_state *mrb, const mrb_irep *irep, uint8_t **start, mrb_sym const *syms, uint32_t syms_len)
+{
+  uint8_t *cur = *start;
+  size_t i;
+
+  for (i = 0; i + 1 < irep->nlocals; ++i) {
+    if (irep->lv[i].name == 0) {
+      cur += uint16_to_bin(RITE_LV_NULL_MARK, cur);
+      cur += uint16_to_bin(0, cur);
+    }
+    else {
+      int const sym_idx = find_filename_index(syms, syms_len, irep->lv[i].name);
+      mrb_assert(sym_idx != -1); /* local variable name must be in syms */
+
+      cur += uint16_to_bin(sym_idx, cur);
+      cur += uint16_to_bin(irep->lv[i].r, cur);
+    }
+  }
+
+  for (i = 0; i < irep->rlen; ++i) {
+    write_lv_record(mrb, irep->reps[i], &cur, syms, syms_len);
+  }
+
+  *start = cur;
+
+  return MRB_DUMP_OK;
+}
+
+static size_t
+get_lv_record_size(mrb_state *mrb, mrb_irep *irep)
+{
+  size_t ret = 0, i;
+
+  ret += (sizeof(uint16_t) + sizeof(uint16_t)) * (irep->nlocals - 1);
+
+  for (i = 0; i < irep->rlen; ++i) {
+    ret += get_lv_record_size(mrb, irep->reps[i]);
+  }
+
+  return ret;
+}
+
+static size_t
+get_lv_section_size(mrb_state *mrb, mrb_irep *irep, mrb_sym const *syms, uint32_t syms_len)
+{
+  size_t ret = 0, i;
+
+  ret += sizeof(uint32_t); /* syms_len */
+  ret += sizeof(uint16_t) * syms_len; /* symbol name lengths */
+  for (i = 0; i < syms_len; ++i) {
+    mrb_int str_len;
+    mrb_sym2name_len(mrb, syms[i], &str_len);
+    ret += str_len;
+  }
+
+  ret += get_lv_record_size(mrb, irep);
+
+  return ret;
+}
+
+static int
+write_section_lv(mrb_state *mrb, mrb_irep *irep, uint8_t *start, mrb_sym const *syms, uint32_t const syms_len)
+{
+  uint8_t *cur = start;
+  struct rite_section_lv_header *header;
+  ptrdiff_t diff;
+  int result = MRB_DUMP_OK;
+
+  if (mrb == NULL || cur == NULL) {
+    return MRB_DUMP_INVALID_ARGUMENT;
+  }
+
+  header = (struct rite_section_lv_header*)cur;
+  cur += sizeof(struct rite_section_lv_header);
+
+  result = write_lv_sym_table(mrb, &cur, syms, syms_len);
+  if (result != MRB_DUMP_OK) {
+    goto lv_section_exit;
+  }
+
+  result = write_lv_record(mrb, irep, &cur, syms, syms_len);
+  if (result != MRB_DUMP_OK) {
+    goto lv_section_exit;
+  }
+
+  memcpy(header->section_identify, RITE_SECTION_LV_IDENTIFIER, sizeof(header->section_identify));
+
+  diff = cur - start;
+  mrb_assert_int_fit(ptrdiff_t, diff, size_t, SIZE_MAX);
+  uint32_to_bin(diff, header->section_size);
+
+lv_section_exit:
+  return result;
+}
+
+static int
+write_rite_binary_header(mrb_state *mrb, size_t binary_size, uint8_t *bin, uint8_t flags)
+{
+  struct rite_binary_header *header = (struct rite_binary_header *)bin;
+  uint16_t crc;
+  uint32_t offset;
+
+  if (flags & FLAG_BYTEORDER_NATIVE) {
+    uint32_t ident = 0;
+    size_t i;
+
+    for(i=0; i<sizeof(ident); i++) {
+      ident<<=8;
+      ident|=RITE_BINARY_IDENTIFIER[i];
+    }
+    memcpy(header->binary_identify, (char*)&ident, sizeof(uint32_t));
+  }
+  else {
+    memcpy(header->binary_identify, RITE_BINARY_IDENTIFIER, sizeof(header->binary_identify));
+  }
+  memcpy(header->binary_version, RITE_BINARY_FORMAT_VER, sizeof(header->binary_version));
+  memcpy(header->compiler_name, RITE_COMPILER_NAME, sizeof(header->compiler_name));
+  memcpy(header->compiler_version, RITE_COMPILER_VERSION, sizeof(header->compiler_version));
+  mrb_assert(binary_size <= UINT32_MAX);
+  uint32_to_bin((uint32_t)binary_size, header->binary_size);
+
+  offset = (&(header->binary_crc[0]) - bin) + sizeof(uint16_t);
+  crc = calc_crc_16_ccitt(bin + offset, binary_size - offset, 0);
+  uint16_to_bin(crc, header->binary_crc);
+
+  return MRB_DUMP_OK;
+}
+
+static mrb_bool
+is_debug_info_defined(mrb_irep *irep)
+{
+  size_t i;
+
+  if (!irep->debug_info) return FALSE;
+  for (i=0; i<irep->rlen; i++) {
+    if (!is_debug_info_defined(irep->reps[i])) return FALSE;
+  }
+  return TRUE;
+}
+
+static mrb_bool
+is_lv_defined(mrb_irep *irep)
+{
+  size_t i;
+
+  if (irep->lv) { return TRUE; }
+
+  for (i = 0; i < irep->rlen; ++i) {
+    if (is_lv_defined(irep->reps[i])) { return TRUE; }
+  }
+
+  return FALSE;
+}
+
+static int
+dump_irep(mrb_state *mrb, mrb_irep *irep, int debug_info, uint8_t **bin, size_t *bin_size, uint8_t flags)
+{
+  int result = MRB_DUMP_GENERAL_FAILURE;
+  size_t malloc_size;
+  size_t section_irep_size;
+  size_t section_lineno_size = 0, section_lv_size = 0;
+  uint8_t *cur = NULL;
+  mrb_bool const debug_info_defined = is_debug_info_defined(irep), lv_defined = is_lv_defined(irep);
+  mrb_sym *lv_syms = NULL; uint32_t lv_syms_len = 0;
+  mrb_sym *filenames = NULL; uint16_t filenames_len = 0;
+
+  if (mrb == NULL) {
+    *bin = NULL;
+    return MRB_DUMP_GENERAL_FAILURE;
+  }
+
+  section_irep_size = sizeof(struct rite_section_irep_header);
+  section_irep_size += get_irep_record_size(mrb, irep);
+
+  /* DEBUG section size */
+  if (debug_info) {
+    if (debug_info_defined) {
+      section_lineno_size += sizeof(struct rite_section_debug_header);
+      /* filename table */
+      filenames = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym) + 1);
+
+      /* filename table size */
+      section_lineno_size += sizeof(uint16_t);
+      section_lineno_size += get_filename_table_size(mrb, irep, &filenames, &filenames_len);
+
+      section_lineno_size += get_debug_record_size(mrb, irep);
+    }
+    else {
+      section_lineno_size += sizeof(struct rite_section_lineno_header);
+      section_lineno_size += get_lineno_record_size(mrb, irep);
+    }
+  }
+
+  if (lv_defined) {
+    section_lv_size += sizeof(struct rite_section_lv_header);
+    create_lv_sym_table(mrb, irep, &lv_syms, &lv_syms_len);
+    section_lv_size += get_lv_section_size(mrb, irep, lv_syms, lv_syms_len);
+  }
+
+  malloc_size = sizeof(struct rite_binary_header) +
+                section_irep_size + section_lineno_size + section_lv_size +
+                sizeof(struct rite_binary_footer);
+  cur = *bin = (uint8_t*)mrb_malloc(mrb, malloc_size);
+  cur += sizeof(struct rite_binary_header);
+
+  result = write_section_irep(mrb, irep, cur, &section_irep_size, flags);
+  if (result != MRB_DUMP_OK) {
+    goto error_exit;
+  }
+  cur += section_irep_size;
+  *bin_size = sizeof(struct rite_binary_header) +
+              section_irep_size + section_lineno_size + section_lv_size +
+              sizeof(struct rite_binary_footer);
+
+  /* write DEBUG section */
+  if (debug_info) {
+    if (debug_info_defined) {
+      result = write_section_debug(mrb, irep, cur, filenames, filenames_len);
+    }
+    else {
+      result = write_section_lineno(mrb, irep, cur);
+    }
+    if (result != MRB_DUMP_OK) {
+      goto error_exit;
+    }
+    cur += section_lineno_size;
+  }
+
+  if (lv_defined) {
+    result = write_section_lv(mrb, irep, cur, lv_syms, lv_syms_len);
+    if (result != MRB_DUMP_OK) {
+      goto error_exit;
+    }
+    cur += section_lv_size;
+  }
+
+  write_footer(mrb, cur);
+  write_rite_binary_header(mrb, *bin_size, *bin, flags);
+
+error_exit:
+  if (result != MRB_DUMP_OK) {
+    mrb_free(mrb, *bin);
+    *bin = NULL;
+  }
+  if (lv_syms) {
+    mrb_free(mrb, lv_syms);
+  }
+  if (filenames) {
+    mrb_free(mrb, filenames);
+  }
+  return result;
+}
+
+int
+mrb_dump_irep(mrb_state *mrb, mrb_irep *irep, int debug_info, uint8_t **bin, size_t *bin_size)
+{
+  return dump_irep(mrb, irep, debug_info, bin, bin_size, FLAG_BYTEORDER_NONATIVE);
+}
+
+int
+mrb_dump_irep_binary(mrb_state *mrb, mrb_irep *irep, int debug_info, FILE* fp)
+{
+  uint8_t *bin = NULL;
+  size_t bin_size = 0;
+  int result;
+
+  if (fp == NULL) {
+    return MRB_DUMP_INVALID_ARGUMENT;
+  }
+
+  result = dump_irep(mrb, irep, debug_info, &bin, &bin_size, FLAG_BYTEORDER_NONATIVE);
+  if (result == MRB_DUMP_OK) {
+    if (fwrite(bin, sizeof(bin[0]), bin_size, fp) != bin_size) {
+      result = MRB_DUMP_WRITE_FAULT;
+    }
+  }
+
+  mrb_free(mrb, bin);
+  return result;
+}
+
+static mrb_bool
+is_valid_c_symbol_name(const char *name)
+{
+   const char *c = NULL;
+
+   if (name == NULL || name[0] == '\0') return FALSE;
+   if (!ISALPHA(name[0]) && name[0] != '_') return FALSE;
+
+   c = &name[1];
+   for (; *c != '\0'; ++c) {
+     if (!ISALNUM(*c) && *c != '_') return FALSE;
+   }
+
+   return TRUE;
+}
+
+int
+mrb_dump_irep_cfunc(mrb_state *mrb, mrb_irep *irep, int debug_info, FILE *fp, const char *initname)
+{
+  uint8_t *bin = NULL;
+  size_t bin_size = 0, bin_idx = 0;
+  int result;
+
+  if (fp == NULL || initname == NULL || !is_valid_c_symbol_name(initname)) {
+    return MRB_DUMP_INVALID_ARGUMENT;
+  }
+
+  result = dump_irep(mrb, irep, debug_info, &bin, &bin_size, FLAG_BYTEORDER_NATIVE);
+  if (result == MRB_DUMP_OK) {
+    if (fprintf(fp, "#include <stdint.h>\n") < 0) { /* for uint8_t under at least Darwin */
+      mrb_free(mrb, bin);
+      return MRB_DUMP_WRITE_FAULT;
+    }
+    if (fprintf(fp,
+          "const uint8_t\n"
+          "#if defined __GNUC__\n"
+          "__attribute__((aligned(%u)))\n"
+          "#elif defined _MSC_VER\n"
+          "__declspec(align(%u))\n"
+          "#endif\n"
+          "%s[] = {",
+          (uint16_t)MRB_DUMP_ALIGNMENT, (uint16_t)MRB_DUMP_ALIGNMENT, initname) < 0) {
+      mrb_free(mrb, bin);
+      return MRB_DUMP_WRITE_FAULT;
+    }
+    while (bin_idx < bin_size) {
+      if (bin_idx % 16 == 0) {
+        if (fputs("\n", fp) == EOF) {
+          mrb_free(mrb, bin);
+          return MRB_DUMP_WRITE_FAULT;
+        }
+      }
+      if (fprintf(fp, "0x%02x,", bin[bin_idx++]) < 0) {
+        mrb_free(mrb, bin);
+        return MRB_DUMP_WRITE_FAULT;
+      }
+    }
+    if (fputs("\n};\n", fp) == EOF) {
+      mrb_free(mrb, bin);
+      return MRB_DUMP_WRITE_FAULT;
+    }
+  }
+
+  mrb_free(mrb, bin);
+  return result;
+}
+
+#endif /* ENABLE_STDIO */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/enum.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,15 @@
+/*
+** enum.c - Enumerable module
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+
+void
+mrb_init_enumerable(mrb_state *mrb)
+{
+  mrb_define_module(mrb, "Enumerable");  /* 15.3.2 */
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/error.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,462 @@
+/*
+** error.c - Exception class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/irep.h"
+#include "mruby/proc.h"
+#include "mruby/string.h"
+#include "mruby/variable.h"
+#include "mruby/debug.h"
+#include "mruby/error.h"
+#include "mruby/class.h"
+#include "mrb_throw.h"
+
+MRB_API mrb_value
+mrb_exc_new(mrb_state *mrb, struct RClass *c, const char *ptr, long len)
+{
+  mrb_value arg = mrb_str_new(mrb, ptr, len);
+  return mrb_obj_new(mrb, c, 1, &arg);
+}
+
+MRB_API mrb_value
+mrb_exc_new_str(mrb_state *mrb, struct RClass* c, mrb_value str)
+{
+  str = mrb_str_to_str(mrb, str);
+  return mrb_obj_new(mrb, c, 1, &str);
+}
+
+/*
+ * call-seq:
+ *    Exception.new(msg = nil)   ->  exception
+ *
+ *  Construct a new Exception object, optionally passing in
+ *  a message.
+ */
+
+static mrb_value
+exc_initialize(mrb_state *mrb, mrb_value exc)
+{
+  mrb_value mesg;
+
+  if (mrb_get_args(mrb, "|o", &mesg) == 1) {
+    mrb_iv_set(mrb, exc, mrb_intern_lit(mrb, "mesg"), mesg);
+  }
+  return exc;
+}
+
+/*
+ *  Document-method: exception
+ *
+ *  call-seq:
+ *     exc.exception(string)  ->  an_exception or exc
+ *
+ *  With no argument, or if the argument is the same as the receiver,
+ *  return the receiver. Otherwise, create a new
+ *  exception object of the same class as the receiver, but with a
+ *  message equal to <code>string.to_str</code>.
+ *
+ */
+
+static mrb_value
+exc_exception(mrb_state *mrb, mrb_value self)
+{
+  mrb_value exc;
+  mrb_value a;
+  int argc;
+
+  argc = mrb_get_args(mrb, "|o", &a);
+  if (argc == 0) return self;
+  if (mrb_obj_equal(mrb, self, a)) return self;
+  exc = mrb_obj_clone(mrb, self);
+  mrb_iv_set(mrb, exc, mrb_intern_lit(mrb, "mesg"), a);
+
+  return exc;
+}
+
+/*
+ * call-seq:
+ *   exception.to_s   ->  string
+ *
+ * Returns exception's message (or the name of the exception if
+ * no message is set).
+ */
+
+static mrb_value
+exc_to_s(mrb_state *mrb, mrb_value exc)
+{
+  mrb_value mesg = mrb_attr_get(mrb, exc, mrb_intern_lit(mrb, "mesg"));
+  struct RObject *p;
+
+  if (!mrb_string_p(mesg)) {
+    return mrb_str_new_cstr(mrb, mrb_obj_classname(mrb, exc));
+  }
+  p = mrb_obj_ptr(mesg);
+  if (!p->c) {
+    p->c = mrb->string_class;
+  }
+  return mesg;
+}
+
+/*
+ * call-seq:
+ *   exception.message   ->  string
+ *
+ * Returns the result of invoking <code>exception.to_s</code>.
+ * Normally this returns the exception's message or name. By
+ * supplying a to_str method, exceptions are agreeing to
+ * be used where Strings are expected.
+ */
+
+static mrb_value
+exc_message(mrb_state *mrb, mrb_value exc)
+{
+  return mrb_funcall(mrb, exc, "to_s", 0);
+}
+
+/*
+ * call-seq:
+ *   exception.inspect   -> string
+ *
+ * Returns this exception's file name, line number,
+ * message and class name.
+ * If file name or line number is not set,
+ * returns message and class name.
+ */
+
+static mrb_value
+exc_inspect(mrb_state *mrb, mrb_value exc)
+{
+  mrb_value str, mesg, file, line;
+  mrb_bool append_mesg;
+
+  mesg = mrb_attr_get(mrb, exc, mrb_intern_lit(mrb, "mesg"));
+  file = mrb_attr_get(mrb, exc, mrb_intern_lit(mrb, "file"));
+  line = mrb_attr_get(mrb, exc, mrb_intern_lit(mrb, "line"));
+
+  append_mesg = !mrb_nil_p(mesg);
+  if (append_mesg) {
+    mesg = mrb_obj_as_string(mrb, mesg);
+    append_mesg = RSTRING_LEN(mesg) > 0;
+  }
+
+  if (!mrb_nil_p(file) && !mrb_nil_p(line)) {
+    str = mrb_str_dup(mrb, file);
+    mrb_str_cat_lit(mrb, str, ":");
+    mrb_str_append(mrb, str, line);
+    mrb_str_cat_lit(mrb, str, ": ");
+    if (append_mesg) {
+      mrb_str_append(mrb, str, mesg);
+      mrb_str_cat_lit(mrb, str, " (");
+    }
+    mrb_str_cat_cstr(mrb, str, mrb_obj_classname(mrb, exc));
+    if (append_mesg) {
+      mrb_str_cat_lit(mrb, str, ")");
+    }
+  }
+  else {
+    const char *cname = mrb_obj_classname(mrb, exc);
+    str = mrb_str_new_cstr(mrb, cname);
+    mrb_str_cat_lit(mrb, str, ": ");
+    if (append_mesg) {
+      mrb_str_append(mrb, str, mesg);
+    }
+    else {
+      mrb_str_cat_cstr(mrb, str, cname);
+    }
+  }
+  return str;
+}
+
+
+static void
+exc_debug_info(mrb_state *mrb, struct RObject *exc)
+{
+  mrb_callinfo *ci = mrb->c->ci;
+  mrb_code *pc = ci->pc;
+
+  mrb_obj_iv_set(mrb, exc, mrb_intern_lit(mrb, "ciidx"), mrb_fixnum_value((mrb_int)(ci - mrb->c->cibase)));
+  while (ci >= mrb->c->cibase) {
+    mrb_code *err = ci->err;
+
+    if (!err && pc) err = pc - 1;
+    if (err && ci->proc && !MRB_PROC_CFUNC_P(ci->proc)) {
+      mrb_irep *irep = ci->proc->body.irep;
+
+      int32_t const line = mrb_debug_get_line(irep, (uint32_t)(err - irep->iseq));
+      char const* file = mrb_debug_get_filename(irep, (uint32_t)(err - irep->iseq));
+      if (line != -1 && file) {
+        mrb_obj_iv_set(mrb, exc, mrb_intern_lit(mrb, "file"), mrb_str_new_cstr(mrb, file));
+        mrb_obj_iv_set(mrb, exc, mrb_intern_lit(mrb, "line"), mrb_fixnum_value(line));
+        return;
+      }
+    }
+    pc = ci->pc;
+    ci--;
+  }
+}
+
+MRB_API mrb_noreturn void
+mrb_exc_raise(mrb_state *mrb, mrb_value exc)
+{
+  mrb->exc = mrb_obj_ptr(exc);
+  if (!mrb->out_of_memory) {
+    exc_debug_info(mrb, mrb->exc);
+  }
+  if (!mrb->jmp) {
+    mrb_p(mrb, exc);
+    abort();
+  }
+  MRB_THROW(mrb->jmp);
+}
+
+MRB_API mrb_noreturn void
+mrb_raise(mrb_state *mrb, struct RClass *c, const char *msg)
+{
+  mrb_value mesg;
+  mesg = mrb_str_new_cstr(mrb, msg);
+  mrb_exc_raise(mrb, mrb_exc_new_str(mrb, c, mesg));
+}
+
+MRB_API mrb_value
+mrb_vformat(mrb_state *mrb, const char *format, va_list ap)
+{
+  const char *p = format;
+  const char *b = p;
+  ptrdiff_t size;
+  mrb_value ary = mrb_ary_new_capa(mrb, 4);
+
+  while (*p) {
+    const char c = *p++;
+
+    if (c == '%') {
+      if (*p == 'S') {
+        size = p - b - 1;
+        mrb_ary_push(mrb, ary, mrb_str_new(mrb, b, size));
+        mrb_ary_push(mrb, ary, va_arg(ap, mrb_value));
+        b = p + 1;
+      }
+    }
+    else if (c == '\\') {
+      if (*p) {
+        size = p - b - 1;
+        mrb_ary_push(mrb, ary, mrb_str_new(mrb, b, size));
+        mrb_ary_push(mrb, ary, mrb_str_new(mrb, p, 1));
+        b = ++p;
+      }
+      else {
+        break;
+      }
+    }
+  }
+  if (b == format) {
+    return mrb_str_new_cstr(mrb, format);
+  }
+  else {
+    size = p - b;
+    mrb_ary_push(mrb, ary, mrb_str_new(mrb, b, size));
+    return mrb_ary_join(mrb, ary, mrb_str_new(mrb, NULL, 0));
+  }
+}
+
+MRB_API mrb_value
+mrb_format(mrb_state *mrb, const char *format, ...)
+{
+  va_list ap;
+  mrb_value str;
+
+  va_start(ap, format);
+  str = mrb_vformat(mrb, format, ap);
+  va_end(ap);
+
+  return str;
+}
+
+MRB_API mrb_noreturn void
+mrb_raisef(mrb_state *mrb, struct RClass *c, const char *fmt, ...)
+{
+  va_list args;
+  mrb_value mesg;
+
+  va_start(args, fmt);
+  mesg = mrb_vformat(mrb, fmt, args);
+  va_end(args);
+  mrb_exc_raise(mrb, mrb_exc_new_str(mrb, c, mesg));
+}
+
+MRB_API mrb_noreturn void
+mrb_name_error(mrb_state *mrb, mrb_sym id, const char *fmt, ...)
+{
+  mrb_value exc;
+  mrb_value argv[2];
+  va_list args;
+
+  va_start(args, fmt);
+  argv[0] = mrb_vformat(mrb, fmt, args);
+  va_end(args);
+
+  argv[1] = mrb_symbol_value(id);
+  exc = mrb_obj_new(mrb, E_NAME_ERROR, 2, argv);
+  mrb_exc_raise(mrb, exc);
+}
+
+MRB_API void
+mrb_warn(mrb_state *mrb, const char *fmt, ...)
+{
+#ifdef ENABLE_STDIO
+  va_list ap;
+  mrb_value str;
+
+  va_start(ap, fmt);
+  str = mrb_vformat(mrb, fmt, ap);
+  fputs("warning: ", stderr);
+  fwrite(RSTRING_PTR(str), RSTRING_LEN(str), 1, stderr);
+  va_end(ap);
+#endif
+}
+
+MRB_API mrb_noreturn void
+mrb_bug(mrb_state *mrb, const char *fmt, ...)
+{
+#ifdef ENABLE_STDIO
+  va_list ap;
+  mrb_value str;
+
+  va_start(ap, fmt);
+  str = mrb_vformat(mrb, fmt, ap);
+  fputs("bug: ", stderr);
+  fwrite(RSTRING_PTR(str), RSTRING_LEN(str), 1, stderr);
+  va_end(ap);
+#endif
+  exit(EXIT_FAILURE);
+}
+
+static void
+set_backtrace(mrb_state *mrb, mrb_value info, mrb_value bt)
+{
+  mrb_funcall(mrb, info, "set_backtrace", 1, bt);
+}
+
+static mrb_value
+make_exception(mrb_state *mrb, int argc, const mrb_value *argv, mrb_bool isstr)
+{
+  mrb_value mesg;
+  int n;
+
+  mesg = mrb_nil_value();
+  switch (argc) {
+    case 0:
+    break;
+    case 1:
+      if (mrb_nil_p(argv[0]))
+        break;
+      if (isstr) {
+        mesg = mrb_check_string_type(mrb, argv[0]);
+        if (!mrb_nil_p(mesg)) {
+          mesg = mrb_exc_new_str(mrb, E_RUNTIME_ERROR, mesg);
+          break;
+        }
+      }
+      n = 0;
+      goto exception_call;
+
+    case 2:
+    case 3:
+      n = 1;
+exception_call:
+      {
+        mrb_sym exc = mrb_intern_lit(mrb, "exception");
+        if (mrb_respond_to(mrb, argv[0], exc)) {
+          mesg = mrb_funcall_argv(mrb, argv[0], exc, n, argv+1);
+        }
+        else {
+          /* undef */
+          mrb_raise(mrb, E_TYPE_ERROR, "exception class/object expected");
+        }
+      }
+
+      break;
+    default:
+      mrb_raisef(mrb, E_ARGUMENT_ERROR, "wrong number of arguments (%S for 0..3)", mrb_fixnum_value(argc));
+      break;
+  }
+  if (argc > 0) {
+    if (!mrb_obj_is_kind_of(mrb, mesg, mrb->eException_class))
+      mrb_raise(mrb, E_TYPE_ERROR, "exception object expected");
+    if (argc > 2)
+        set_backtrace(mrb, mesg, argv[2]);
+  }
+
+  return mesg;
+}
+
+MRB_API mrb_value
+mrb_make_exception(mrb_state *mrb, int argc, const mrb_value *argv)
+{
+  return make_exception(mrb, argc, argv, TRUE);
+}
+
+MRB_API void
+mrb_sys_fail(mrb_state *mrb, const char *mesg)
+{
+  struct RClass *sce;
+  mrb_int no;
+
+  no = (mrb_int)errno;
+  if (mrb_class_defined(mrb, "SystemCallError")) {
+    sce = mrb_class_get(mrb, "SystemCallError");
+    if (mesg != NULL) {
+      mrb_funcall(mrb, mrb_obj_value(sce), "_sys_fail", 2, mrb_fixnum_value(no), mrb_str_new_cstr(mrb, mesg));
+    }
+    else {
+      mrb_funcall(mrb, mrb_obj_value(sce), "_sys_fail", 1, mrb_fixnum_value(no));
+    }
+  }
+  else {
+    mrb_raise(mrb, E_RUNTIME_ERROR, mesg);
+  }
+}
+
+MRB_API mrb_noreturn void
+mrb_no_method_error(mrb_state *mrb, mrb_sym id, mrb_int argc, const mrb_value *argv, char const* fmt, ...)
+{
+  mrb_value exc;
+  va_list ap;
+
+  va_start(ap, fmt);
+  exc = mrb_funcall(mrb, mrb_obj_value(E_NOMETHOD_ERROR), "new", 3,
+                    mrb_vformat(mrb, fmt, ap), mrb_symbol_value(id),
+                    mrb_ary_new_from_values(mrb, argc, argv));
+  va_end(ap);
+  mrb_exc_raise(mrb, exc);
+}
+
+void
+mrb_init_exception(mrb_state *mrb)
+{
+  struct RClass *exception, *runtime_error, *script_error;
+
+  mrb->eException_class = exception = mrb_define_class(mrb, "Exception", mrb->object_class); /* 15.2.22 */
+  MRB_SET_INSTANCE_TT(exception, MRB_TT_EXCEPTION);
+  mrb_define_class_method(mrb, exception, "exception", mrb_instance_new,  MRB_ARGS_ANY());
+  mrb_define_method(mrb, exception, "exception",       exc_exception,     MRB_ARGS_ANY());
+  mrb_define_method(mrb, exception, "initialize",      exc_initialize,    MRB_ARGS_ANY());
+  mrb_define_method(mrb, exception, "to_s",            exc_to_s,          MRB_ARGS_NONE());
+  mrb_define_method(mrb, exception, "message",         exc_message,       MRB_ARGS_NONE());
+  mrb_define_method(mrb, exception, "inspect",         exc_inspect,       MRB_ARGS_NONE());
+  mrb_define_method(mrb, exception, "backtrace",       mrb_exc_backtrace, MRB_ARGS_NONE());
+
+  mrb->eStandardError_class = mrb_define_class(mrb, "StandardError", mrb->eException_class); /* 15.2.23 */
+  runtime_error = mrb_define_class(mrb, "RuntimeError", mrb->eStandardError_class);          /* 15.2.28 */
+  mrb->nomem_err = mrb_obj_ptr(mrb_exc_new_str(mrb, runtime_error, mrb_str_new_lit(mrb, "Out of memory")));
+  script_error = mrb_define_class(mrb, "ScriptError", mrb->eException_class);                /* 15.2.37 */
+  mrb_define_class(mrb, "SyntaxError", script_error);                                        /* 15.2.38 */
+  mrb_define_class(mrb, "SystemStackError", exception);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/error.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,4 @@
+/* this header file is to be removed soon.
+   added for compatibility purpose (1.0.0) */
+#include "mruby/error.h"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/etc.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,223 @@
+/*
+** etc.c -
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+#include "mruby/string.h"
+#include "mruby/data.h"
+#include "mruby/class.h"
+#include "mruby/re.h"
+#include "mruby/irep.h"
+
+MRB_API struct RData*
+mrb_data_object_alloc(mrb_state *mrb, struct RClass *klass, void *ptr, const mrb_data_type *type)
+{
+  struct RData *data;
+
+  data = (struct RData*)mrb_obj_alloc(mrb, MRB_TT_DATA, klass);
+  data->data = ptr;
+  data->type = type;
+
+  return data;
+}
+
+MRB_API void
+mrb_data_check_type(mrb_state *mrb, mrb_value obj, const mrb_data_type *type)
+{
+  if (mrb_immediate_p(obj) || (mrb_type(obj) != MRB_TT_DATA)) {
+    mrb_check_type(mrb, obj, MRB_TT_DATA);
+  }
+  if (DATA_TYPE(obj) != type) {
+    const mrb_data_type *t2 = DATA_TYPE(obj);
+
+    if (t2) {
+      mrb_raisef(mrb, E_TYPE_ERROR, "wrong argument type %S (expected %S)",
+                 mrb_str_new_cstr(mrb, t2->struct_name), mrb_str_new_cstr(mrb, type->struct_name));
+    }
+    else {
+      struct RClass *c = mrb_class(mrb, obj);
+
+      mrb_raisef(mrb, E_TYPE_ERROR, "uninitialized %S (expected %S)",
+                 mrb_obj_value(c), mrb_str_new_cstr(mrb, type->struct_name));
+    }
+  }
+}
+
+MRB_API void*
+mrb_data_check_get_ptr(mrb_state *mrb, mrb_value obj, const mrb_data_type *type)
+{
+  if (mrb_immediate_p(obj) || (mrb_type(obj) != MRB_TT_DATA)) {
+    return NULL;
+  }
+  if (DATA_TYPE(obj) != type) {
+    return NULL;
+  }
+  return DATA_PTR(obj);
+}
+
+MRB_API void*
+mrb_data_get_ptr(mrb_state *mrb, mrb_value obj, const mrb_data_type *type)
+{
+  mrb_data_check_type(mrb, obj, type);
+  return DATA_PTR(obj);
+}
+
+MRB_API mrb_sym
+mrb_obj_to_sym(mrb_state *mrb, mrb_value name)
+{
+  mrb_value tmp;
+  mrb_sym id;
+
+  switch (mrb_type(name)) {
+    default:
+      tmp = mrb_check_string_type(mrb, name);
+      if (mrb_nil_p(tmp)) {
+        tmp = mrb_inspect(mrb, name);
+        mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a symbol", tmp);
+      }
+      name = tmp;
+      /* fall through */
+    case MRB_TT_STRING:
+      name = mrb_str_intern(mrb, name);
+      /* fall through */
+    case MRB_TT_SYMBOL:
+      id = mrb_symbol(name);
+  }
+  return id;
+}
+
+MRB_API mrb_int
+mrb_float_id(mrb_float f)
+{
+  const char *p = (const char*)&f;
+  int len = sizeof(f);
+  mrb_int id = 0;
+
+  while (len--) {
+    id = id*65599 + *p;
+    p++;
+  }
+  id = id + (id>>5);
+
+  return id;
+}
+
+MRB_API mrb_int
+mrb_obj_id(mrb_value obj)
+{
+  mrb_int tt = mrb_type(obj);
+
+#define MakeID2(p,t) (mrb_int)(((intptr_t)(p))^(t))
+#define MakeID(p)    MakeID2(p,tt)
+
+  switch (tt) {
+  case MRB_TT_FREE:
+  case MRB_TT_UNDEF:
+    return MakeID(0); /* not define */
+  case MRB_TT_FALSE:
+    if (mrb_nil_p(obj))
+      return MakeID(1);
+    return MakeID(0);
+  case MRB_TT_TRUE:
+    return MakeID(1);
+  case MRB_TT_SYMBOL:
+    return MakeID(mrb_symbol(obj));
+  case MRB_TT_FIXNUM:
+    return MakeID2(mrb_float_id((mrb_float)mrb_fixnum(obj)), MRB_TT_FLOAT);
+  case MRB_TT_FLOAT:
+    return MakeID(mrb_float_id(mrb_float(obj)));
+  case MRB_TT_STRING:
+  case MRB_TT_OBJECT:
+  case MRB_TT_CLASS:
+  case MRB_TT_MODULE:
+  case MRB_TT_ICLASS:
+  case MRB_TT_SCLASS:
+  case MRB_TT_PROC:
+  case MRB_TT_ARRAY:
+  case MRB_TT_HASH:
+  case MRB_TT_RANGE:
+  case MRB_TT_EXCEPTION:
+  case MRB_TT_FILE:
+  case MRB_TT_DATA:
+  default:
+    return MakeID(mrb_ptr(obj));
+  }
+}
+
+#ifdef MRB_WORD_BOXING
+MRB_API mrb_value
+mrb_word_boxing_float_value(mrb_state *mrb, mrb_float f)
+{
+  mrb_value v;
+
+  v.value.p = mrb_obj_alloc(mrb, MRB_TT_FLOAT, mrb->float_class);
+  v.value.fp->f = f;
+  return v;
+}
+
+MRB_API mrb_value
+mrb_word_boxing_float_pool(mrb_state *mrb, mrb_float f)
+{
+  struct RFloat *nf = (struct RFloat *)mrb_malloc(mrb, sizeof(struct RFloat));
+  nf->tt = MRB_TT_FLOAT;
+  nf->c = mrb->float_class;
+  nf->f = f;
+  return mrb_obj_value(nf);
+}
+
+MRB_API mrb_value
+mrb_word_boxing_cptr_value(mrb_state *mrb, void *p)
+{
+  mrb_value v;
+
+  v.value.p = mrb_obj_alloc(mrb, MRB_TT_CPTR, mrb->object_class);
+  v.value.vp->p = p;
+  return v;
+}
+#endif  /* MRB_WORD_BOXING */
+
+MRB_API mrb_bool
+mrb_regexp_p(mrb_state *mrb, mrb_value v)
+{
+  return mrb_class_defined(mrb, REGEXP_CLASS) && mrb_obj_is_kind_of(mrb, v, mrb_class_get(mrb, REGEXP_CLASS));
+}
+
+#if defined _MSC_VER && _MSC_VER < 1900
+
+#ifndef va_copy
+static void
+mrb_msvc_va_copy(va_list *dest, va_list src)
+{
+  *dest = src;
+}
+#define va_copy(dest, src) mrb_msvc_va_copy(&(dest), src)
+#endif
+
+MRB_API int
+mrb_msvc_vsnprintf(char *s, size_t n, const char *format, va_list arg)
+{
+  int cnt;
+  va_list argcp;
+  va_copy(argcp, arg);
+  if (n == 0 || (cnt = _vsnprintf_s(s, n, _TRUNCATE, format, argcp)) < 0) {
+    cnt = _vscprintf(format, arg);
+  }
+  va_end(argcp);
+  return cnt;
+}
+
+MRB_API int
+mrb_msvc_snprintf(char *s, size_t n, const char *format, ...)
+{
+  va_list arg;
+  int ret;
+  va_start(arg, format);
+  ret = mrb_msvc_vsnprintf(s, n, format, arg);
+  va_end(arg);
+  return ret;
+}
+
+#endif  /* defined _MSC_VER && _MSC_VER < 1900 */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/gc.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,1618 @@
+/*
+** gc.c - garbage collector for mruby
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <string.h>
+#include <stdlib.h>
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/class.h"
+#include "mruby/data.h"
+#include "mruby/hash.h"
+#include "mruby/proc.h"
+#include "mruby/range.h"
+#include "mruby/string.h"
+#include "mruby/variable.h"
+#include "mruby/gc.h"
+#include "mruby/error.h"
+
+/*
+  = Tri-color Incremental Garbage Collection
+
+  mruby's GC is Tri-color Incremental GC with Mark & Sweep.
+  Algorithm details are omitted.
+  Instead, the implementation part is described below.
+
+  == Object's Color
+
+  Each object can be painted in three colors:
+
+    * White - Unmarked.
+    * Gray - Marked, But the child objects are unmarked.
+    * Black - Marked, the child objects are also marked.
+
+  == Two White Types
+
+  There're two white color types in a flip-flop fashion: White-A and White-B,
+  which respectively represent the Current White color (the newly allocated
+  objects in the current GC cycle) and the Sweep Target White color (the
+  dead objects to be swept).
+
+  A and B will be switched just at the beginning of the next GC cycle. At
+  that time, all the dead objects have been swept, while the newly created
+  objects in the current GC cycle which finally remains White are now
+  regarded as dead objects. Instead of traversing all the White-A objects and
+  painting them as White-B, just switch the meaning of White-A and White-B as
+  this will be much cheaper.
+
+  As a result, the objects we sweep in the current GC cycle are always
+  left from the previous GC cycle. This allows us to sweep objects
+  incrementally, without the disturbance of the newly created objects.
+
+  == Execution Timing
+
+  GC Execution Time and Each step interval are decided by live objects count.
+  List of Adjustment API:
+
+    * gc_interval_ratio_set
+    * gc_step_ratio_set
+
+  For details, see the comments for each function.
+
+  == Write Barrier
+
+  mruby implementer and C extension library writer must insert a write
+  barrier when updating a reference from a field of an object.
+  When updating a reference from a field of object A to object B, 
+  two different types of write barrier are available:
+
+    * mrb_field_write_barrier - target B object for a mark.
+    * mrb_write_barrier       - target A object for a mark.
+
+  == Generational Mode
+
+  mruby's GC offers an Generational Mode while re-using the tri-color GC
+  infrastructure. It will treat the Black objects as Old objects after each
+  sweep phase, instead of painting them White. The key ideas are still the same
+  as traditional generational GC:
+
+    * Minor GC - just traverse the Young objects (Gray objects) in the mark
+                 phase, then only sweep the newly created objects, and leave
+                 the Old objects live.
+
+    * Major GC - same as a full regular GC cycle.
+
+  The difference from "traditional" generational GC is, that the major GC
+  in mruby is triggered incrementally in a tri-color manner.
+
+
+  For details, see the comments for each function.
+
+*/
+
+struct free_obj {
+  MRB_OBJECT_HEADER;
+  struct RBasic *next;
+};
+
+typedef struct {
+  union {
+    struct free_obj free;
+    struct RBasic basic;
+    struct RObject object;
+    struct RClass klass;
+    struct RString string;
+    struct RArray array;
+    struct RHash hash;
+    struct RRange range;
+    struct RData data;
+    struct RProc proc;
+    struct RException exc;
+#ifdef MRB_WORD_BOXING
+    struct RFloat floatv;
+    struct RCptr cptr;
+#endif
+  } as;
+} RVALUE;
+
+#ifdef GC_PROFILE
+#include <stdio.h>
+#include <sys/time.h>
+
+static double program_invoke_time = 0;
+static double gc_time = 0;
+static double gc_total_time = 0;
+
+static double
+gettimeofday_time(void)
+{
+  struct timeval tv;
+  gettimeofday(&tv, NULL);
+  return tv.tv_sec + tv.tv_usec * 1e-6;
+}
+
+#define GC_INVOKE_TIME_REPORT(with) do {\
+  fprintf(stderr, "%s\n", with);\
+  fprintf(stderr, "gc_invoke: %19.3f\n", gettimeofday_time() - program_invoke_time);\
+  fprintf(stderr, "is_generational: %d\n", is_generational(mrb));\
+  fprintf(stderr, "is_major_gc: %d\n", is_major_gc(mrb));\
+} while(0)
+
+#define GC_TIME_START do {\
+  gc_time = gettimeofday_time();\
+} while(0)
+
+#define GC_TIME_STOP_AND_REPORT do {\
+  gc_time = gettimeofday_time() - gc_time;\
+  gc_total_time += gc_time;\
+  fprintf(stderr, "gc_state: %d\n", mrb->gc_state);\
+  fprintf(stderr, "live: %zu\n", mrb->live);\
+  fprintf(stderr, "majorgc_old_threshold: %zu\n", mrb->majorgc_old_threshold);\
+  fprintf(stderr, "gc_threshold: %zu\n", mrb->gc_threshold);\
+  fprintf(stderr, "gc_time: %30.20f\n", gc_time);\
+  fprintf(stderr, "gc_total_time: %30.20f\n\n", gc_total_time);\
+} while(0)
+#else
+#define GC_INVOKE_TIME_REPORT(s)
+#define GC_TIME_START
+#define GC_TIME_STOP_AND_REPORT
+#endif
+
+#ifdef GC_DEBUG
+#define DEBUG(x) (x)
+#else
+#define DEBUG(x)
+#endif
+
+#define GC_STEP_SIZE 1024
+
+
+MRB_API void*
+mrb_realloc_simple(mrb_state *mrb, void *p,  size_t len)
+{
+  void *p2;
+
+  p2 = (mrb->allocf)(mrb, p, len, mrb->allocf_ud);
+  if (!p2 && len > 0 && mrb->heaps) {
+    mrb_full_gc(mrb);
+    p2 = (mrb->allocf)(mrb, p, len, mrb->allocf_ud);
+  }
+
+  return p2;
+}
+
+
+MRB_API void*
+mrb_realloc(mrb_state *mrb, void *p, size_t len)
+{
+  void *p2;
+
+  p2 = mrb_realloc_simple(mrb, p, len);
+  if (!p2 && len) {
+    if (mrb->out_of_memory) {
+      /* mrb_panic(mrb); */
+    }
+    else {
+      mrb->out_of_memory = TRUE;
+      mrb_exc_raise(mrb, mrb_obj_value(mrb->nomem_err));
+    }
+  }
+  else {
+    mrb->out_of_memory = FALSE;
+  }
+
+  return p2;
+}
+
+MRB_API void*
+mrb_malloc(mrb_state *mrb, size_t len)
+{
+  return mrb_realloc(mrb, 0, len);
+}
+
+MRB_API void*
+mrb_malloc_simple(mrb_state *mrb, size_t len)
+{
+  return mrb_realloc_simple(mrb, 0, len);
+}
+
+MRB_API void*
+mrb_calloc(mrb_state *mrb, size_t nelem, size_t len)
+{
+  void *p;
+
+  if (nelem > 0 && len > 0 &&
+      nelem <= SIZE_MAX / len) {
+    size_t size;
+    size = nelem * len;
+    p = mrb_malloc(mrb, size);
+
+    memset(p, 0, size);
+  }
+  else {
+    p = NULL;
+  }
+
+  return p;
+}
+
+MRB_API void
+mrb_free(mrb_state *mrb, void *p)
+{
+  (mrb->allocf)(mrb, p, 0, mrb->allocf_ud);
+}
+
+#ifndef MRB_HEAP_PAGE_SIZE
+#define MRB_HEAP_PAGE_SIZE 1024
+#endif
+
+struct heap_page {
+  struct RBasic *freelist;
+  struct heap_page *prev;
+  struct heap_page *next;
+  struct heap_page *free_next;
+  struct heap_page *free_prev;
+  mrb_bool old:1;
+  RVALUE objects[MRB_HEAP_PAGE_SIZE];
+};
+
+static void
+link_heap_page(mrb_state *mrb, struct heap_page *page)
+{
+  page->next = mrb->heaps;
+  if (mrb->heaps)
+    mrb->heaps->prev = page;
+  mrb->heaps = page;
+}
+
+static void
+unlink_heap_page(mrb_state *mrb, struct heap_page *page)
+{
+  if (page->prev)
+    page->prev->next = page->next;
+  if (page->next)
+    page->next->prev = page->prev;
+  if (mrb->heaps == page)
+    mrb->heaps = page->next;
+  page->prev = NULL;
+  page->next = NULL;
+}
+
+static void
+link_free_heap_page(mrb_state *mrb, struct heap_page *page)
+{
+  page->free_next = mrb->free_heaps;
+  if (mrb->free_heaps) {
+    mrb->free_heaps->free_prev = page;
+  }
+  mrb->free_heaps = page;
+}
+
+static void
+unlink_free_heap_page(mrb_state *mrb, struct heap_page *page)
+{
+  if (page->free_prev)
+    page->free_prev->free_next = page->free_next;
+  if (page->free_next)
+    page->free_next->free_prev = page->free_prev;
+  if (mrb->free_heaps == page)
+    mrb->free_heaps = page->free_next;
+  page->free_prev = NULL;
+  page->free_next = NULL;
+}
+
+static void
+add_heap(mrb_state *mrb)
+{
+  struct heap_page *page = (struct heap_page *)mrb_calloc(mrb, 1, sizeof(struct heap_page));
+  RVALUE *p, *e;
+  struct RBasic *prev = NULL;
+
+  for (p = page->objects, e=p+MRB_HEAP_PAGE_SIZE; p<e; p++) {
+    p->as.free.tt = MRB_TT_FREE;
+    p->as.free.next = prev;
+    prev = &p->as.basic;
+  }
+  page->freelist = prev;
+
+  link_heap_page(mrb, page);
+  link_free_heap_page(mrb, page);
+}
+
+#define DEFAULT_GC_INTERVAL_RATIO 200
+#define DEFAULT_GC_STEP_RATIO 200
+#define DEFAULT_MAJOR_GC_INC_RATIO 200
+#define is_generational(mrb) ((mrb)->is_generational_gc_mode)
+#define is_major_gc(mrb) (is_generational(mrb) && (mrb)->gc_full)
+#define is_minor_gc(mrb) (is_generational(mrb) && !(mrb)->gc_full)
+
+void
+mrb_init_heap(mrb_state *mrb)
+{
+  mrb->heaps = NULL;
+  mrb->free_heaps = NULL;
+  add_heap(mrb);
+  mrb->gc_interval_ratio = DEFAULT_GC_INTERVAL_RATIO;
+  mrb->gc_step_ratio = DEFAULT_GC_STEP_RATIO;
+#ifndef MRB_GC_TURN_OFF_GENERATIONAL
+  mrb->is_generational_gc_mode = TRUE;
+  mrb->gc_full = TRUE;
+#endif
+
+#ifdef GC_PROFILE
+  program_invoke_time = gettimeofday_time();
+#endif
+}
+
+static void obj_free(mrb_state *mrb, struct RBasic *obj);
+
+void
+mrb_free_heap(mrb_state *mrb)
+{
+  struct heap_page *page = mrb->heaps;
+  struct heap_page *tmp;
+  RVALUE *p, *e;
+
+  while (page) {
+    tmp = page;
+    page = page->next;
+    for (p = tmp->objects, e=p+MRB_HEAP_PAGE_SIZE; p<e; p++) {
+      if (p->as.free.tt != MRB_TT_FREE)
+        obj_free(mrb, &p->as.basic);
+    }
+    mrb_free(mrb, tmp);
+  }
+}
+
+static void
+gc_protect(mrb_state *mrb, struct RBasic *p)
+{
+#ifdef MRB_GC_FIXED_ARENA
+  if (mrb->arena_idx >= MRB_GC_ARENA_SIZE) {
+    /* arena overflow error */
+    mrb->arena_idx = MRB_GC_ARENA_SIZE - 4; /* force room in arena */
+    mrb_raise(mrb, E_RUNTIME_ERROR, "arena overflow error");
+  }
+#else
+  if (mrb->arena_idx >= mrb->arena_capa) {
+    /* extend arena */
+    mrb->arena_capa = (int)(mrb->arena_capa * 1.5);
+    mrb->arena = (struct RBasic**)mrb_realloc(mrb, mrb->arena, sizeof(struct RBasic*)*mrb->arena_capa);
+  }
+#endif
+  mrb->arena[mrb->arena_idx++] = p;
+}
+
+MRB_API void
+mrb_gc_protect(mrb_state *mrb, mrb_value obj)
+{
+  if (mrb_immediate_p(obj)) return;
+  gc_protect(mrb, mrb_basic_ptr(obj));
+}
+
+MRB_API struct RBasic*
+mrb_obj_alloc(mrb_state *mrb, enum mrb_vtype ttype, struct RClass *cls)
+{
+  struct RBasic *p;
+  static const RVALUE RVALUE_zero = { { { MRB_TT_FALSE } } };
+
+#ifdef MRB_GC_STRESS
+  mrb_full_gc(mrb);
+#endif
+  if (mrb->gc_threshold < mrb->live) {
+    mrb_incremental_gc(mrb);
+  }
+  if (mrb->free_heaps == NULL) {
+    add_heap(mrb);
+  }
+
+  p = mrb->free_heaps->freelist;
+  mrb->free_heaps->freelist = ((struct free_obj*)p)->next;
+  if (mrb->free_heaps->freelist == NULL) {
+    unlink_free_heap_page(mrb, mrb->free_heaps);
+  }
+
+  mrb->live++;
+  gc_protect(mrb, p);
+  *(RVALUE *)p = RVALUE_zero;
+  p->tt = ttype;
+  p->c = cls;
+  paint_partial_white(mrb, p);
+  return p;
+}
+
+static inline void
+add_gray_list(mrb_state *mrb, struct RBasic *obj)
+{
+#ifdef MRB_GC_STRESS
+  if (obj->tt > MRB_TT_MAXDEFINE) {
+    abort();
+  }
+#endif
+  paint_gray(obj);
+  obj->gcnext = mrb->gray_list;
+  mrb->gray_list = obj;
+}
+
+static void
+mark_context_stack(mrb_state *mrb, struct mrb_context *c)
+{
+  size_t i;
+  size_t e;
+
+  e = c->stack - c->stbase;
+  if (c->ci) e += c->ci->nregs;
+  if (c->stbase + e > c->stend) e = c->stend - c->stbase;
+  for (i=0; i<e; i++) {
+    mrb_value v = c->stbase[i];
+
+    if (!mrb_immediate_p(v)) {
+      if (mrb_basic_ptr(v)->tt == MRB_TT_FREE) {
+        c->stbase[i] = mrb_nil_value();
+      }
+      else {
+        mrb_gc_mark(mrb, mrb_basic_ptr(v));
+      }
+    }
+  }
+}
+
+static void
+mark_context(mrb_state *mrb, struct mrb_context *c)
+{
+  int i, e = 0;
+  mrb_callinfo *ci;
+
+  /* mark stack */
+  mark_context_stack(mrb, c);
+
+  /* mark VM stack */
+  if (c->cibase) {
+    for (ci = c->cibase; ci <= c->ci; ci++) {
+      if (ci->eidx > e) {
+        e = ci->eidx;
+      }
+      mrb_gc_mark(mrb, (struct RBasic*)ci->env);
+      mrb_gc_mark(mrb, (struct RBasic*)ci->proc);
+      mrb_gc_mark(mrb, (struct RBasic*)ci->target_class);
+    }
+  }
+  /* mark ensure stack */
+  for (i=0; i<e; i++) {
+    mrb_gc_mark(mrb, (struct RBasic*)c->ensure[i]);
+  }
+  /* mark fibers */
+  if (c->prev && c->prev->fib) {
+    mrb_gc_mark(mrb, (struct RBasic*)c->prev->fib);
+  }
+}
+
+static void
+gc_mark_children(mrb_state *mrb, struct RBasic *obj)
+{
+  mrb_assert(is_gray(obj));
+  paint_black(obj);
+  mrb->gray_list = obj->gcnext;
+  mrb_gc_mark(mrb, (struct RBasic*)obj->c);
+  switch (obj->tt) {
+  case MRB_TT_ICLASS:
+    mrb_gc_mark(mrb, (struct RBasic*)((struct RClass*)obj)->super);
+    break;
+
+  case MRB_TT_CLASS:
+  case MRB_TT_MODULE:
+  case MRB_TT_SCLASS:
+    {
+      struct RClass *c = (struct RClass*)obj;
+
+      mrb_gc_mark_mt(mrb, c);
+      mrb_gc_mark(mrb, (struct RBasic*)c->super);
+    }
+    /* fall through */
+
+  case MRB_TT_OBJECT:
+  case MRB_TT_DATA:
+  case MRB_TT_EXCEPTION:
+    mrb_gc_mark_iv(mrb, (struct RObject*)obj);
+    break;
+
+  case MRB_TT_PROC:
+    {
+      struct RProc *p = (struct RProc*)obj;
+
+      mrb_gc_mark(mrb, (struct RBasic*)p->env);
+      mrb_gc_mark(mrb, (struct RBasic*)p->target_class);
+    }
+    break;
+
+  case MRB_TT_ENV:
+    {
+      struct REnv *e = (struct REnv*)obj;
+
+      if (!MRB_ENV_STACK_SHARED_P(e)) {
+        mrb_int i, len;
+
+        len = MRB_ENV_STACK_LEN(e);
+        for (i=0; i<len; i++) {
+          mrb_gc_mark_value(mrb, e->stack[i]);
+        }
+      }
+    }
+    break;
+
+  case MRB_TT_FIBER:
+    {
+      struct mrb_context *c = ((struct RFiber*)obj)->cxt;
+
+      if (c) mark_context(mrb, c);
+    }
+    break;
+
+  case MRB_TT_ARRAY:
+    {
+      struct RArray *a = (struct RArray*)obj;
+      size_t i, e;
+
+      for (i=0,e=a->len; i<e; i++) {
+        mrb_gc_mark_value(mrb, a->ptr[i]);
+      }
+    }
+    break;
+
+  case MRB_TT_HASH:
+    mrb_gc_mark_iv(mrb, (struct RObject*)obj);
+    mrb_gc_mark_hash(mrb, (struct RHash*)obj);
+    break;
+
+  case MRB_TT_STRING:
+    break;
+
+  case MRB_TT_RANGE:
+    {
+      struct RRange *r = (struct RRange*)obj;
+
+      if (r->edges) {
+        mrb_gc_mark_value(mrb, r->edges->beg);
+        mrb_gc_mark_value(mrb, r->edges->end);
+      }
+    }
+    break;
+
+  default:
+    break;
+  }
+}
+
+MRB_API void
+mrb_gc_mark(mrb_state *mrb, struct RBasic *obj)
+{
+  if (obj == 0) return;
+  if (!is_white(obj)) return;
+  mrb_assert((obj)->tt != MRB_TT_FREE);
+  add_gray_list(mrb, obj);
+}
+
+static void
+obj_free(mrb_state *mrb, struct RBasic *obj)
+{
+  DEBUG(printf("obj_free(%p,tt=%d)\n",obj,obj->tt));
+  switch (obj->tt) {
+    /* immediate - no mark */
+  case MRB_TT_TRUE:
+  case MRB_TT_FIXNUM:
+  case MRB_TT_SYMBOL:
+    /* cannot happen */
+    return;
+
+  case MRB_TT_FLOAT:
+#ifdef MRB_WORD_BOXING
+    break;
+#else
+    return;
+#endif
+
+  case MRB_TT_OBJECT:
+  case MRB_TT_EXCEPTION:
+    mrb_gc_free_iv(mrb, (struct RObject*)obj);
+    break;
+
+  case MRB_TT_CLASS:
+  case MRB_TT_MODULE:
+  case MRB_TT_SCLASS:
+    mrb_gc_free_mt(mrb, (struct RClass*)obj);
+    mrb_gc_free_iv(mrb, (struct RObject*)obj);
+    break;
+
+  case MRB_TT_ENV:
+    {
+      struct REnv *e = (struct REnv*)obj;
+
+      if (!MRB_ENV_STACK_SHARED_P(e)) {
+        mrb_free(mrb, e->stack);
+        e->stack = NULL;
+      }
+    }
+    break;
+
+  case MRB_TT_FIBER:
+    {
+      struct mrb_context *c = ((struct RFiber*)obj)->cxt;
+
+      if (c != mrb->root_c)
+        mrb_free_context(mrb, c);
+    }
+    break;
+
+  case MRB_TT_ARRAY:
+    if (ARY_SHARED_P(obj))
+      mrb_ary_decref(mrb, ((struct RArray*)obj)->aux.shared);
+    else
+      mrb_free(mrb, ((struct RArray*)obj)->ptr);
+    break;
+
+  case MRB_TT_HASH:
+    mrb_gc_free_iv(mrb, (struct RObject*)obj);
+    mrb_gc_free_hash(mrb, (struct RHash*)obj);
+    break;
+
+  case MRB_TT_STRING:
+    mrb_gc_free_str(mrb, (struct RString*)obj);
+    break;
+
+  case MRB_TT_PROC:
+    {
+      struct RProc *p = (struct RProc*)obj;
+
+      if (!MRB_PROC_CFUNC_P(p) && p->body.irep) {
+        mrb_irep_decref(mrb, p->body.irep);
+      }
+    }
+    break;
+
+  case MRB_TT_RANGE:
+    mrb_free(mrb, ((struct RRange*)obj)->edges);
+    break;
+
+  case MRB_TT_DATA:
+    {
+      struct RData *d = (struct RData*)obj;
+      if (d->type && d->type->dfree) {
+        d->type->dfree(mrb, d->data);
+      }
+      mrb_gc_free_iv(mrb, (struct RObject*)obj);
+    }
+    break;
+
+  default:
+    break;
+  }
+  obj->tt = MRB_TT_FREE;
+}
+
+static void
+root_scan_phase(mrb_state *mrb)
+{
+  size_t i, e;
+
+  if (!is_minor_gc(mrb)) {
+    mrb->gray_list = NULL;
+    mrb->atomic_gray_list = NULL;
+  }
+
+  mrb_gc_mark_gv(mrb);
+  /* mark arena */
+  for (i=0,e=mrb->arena_idx; i<e; i++) {
+    mrb_gc_mark(mrb, mrb->arena[i]);
+  }
+  /* mark class hierarchy */
+  mrb_gc_mark(mrb, (struct RBasic*)mrb->object_class);
+  /* mark top_self */
+  mrb_gc_mark(mrb, (struct RBasic*)mrb->top_self);
+  /* mark exception */
+  mrb_gc_mark(mrb, (struct RBasic*)mrb->exc);
+  /* mark pre-allocated exception */
+  mrb_gc_mark(mrb, (struct RBasic*)mrb->nomem_err);
+
+  mark_context(mrb, mrb->root_c);
+  if (mrb->root_c->fib) {
+    mrb_gc_mark(mrb, (struct RBasic*)mrb->root_c->fib);
+  }
+  if (mrb->root_c != mrb->c) {
+    mark_context(mrb, mrb->c);
+  }
+}
+
+static size_t
+gc_gray_mark(mrb_state *mrb, struct RBasic *obj)
+{
+  size_t children = 0;
+
+  gc_mark_children(mrb, obj);
+
+  switch (obj->tt) {
+  case MRB_TT_ICLASS:
+    children++;
+    break;
+
+  case MRB_TT_CLASS:
+  case MRB_TT_SCLASS:
+  case MRB_TT_MODULE:
+    {
+      struct RClass *c = (struct RClass*)obj;
+
+      children += mrb_gc_mark_iv_size(mrb, (struct RObject*)obj);
+      children += mrb_gc_mark_mt_size(mrb, c);
+      children++;
+    }
+    break;
+
+  case MRB_TT_OBJECT:
+  case MRB_TT_DATA:
+  case MRB_TT_EXCEPTION:
+    children += mrb_gc_mark_iv_size(mrb, (struct RObject*)obj);
+    break;
+
+  case MRB_TT_ENV:
+    children += (int)obj->flags;
+    break;
+
+  case MRB_TT_FIBER:
+    {
+      struct mrb_context *c = ((struct RFiber*)obj)->cxt;
+      size_t i;
+      mrb_callinfo *ci;
+
+      if (!c) break;
+      /* mark stack */
+      i = c->stack - c->stbase;
+      if (c->ci) i += c->ci->nregs;
+      if (c->stbase + i > c->stend) i = c->stend - c->stbase;
+      children += i;
+
+      /* mark ensure stack */
+      children += (c->ci) ? c->ci->eidx : 0;
+
+      /* mark closure */
+      if (c->cibase) {
+        for (i=0, ci = c->cibase; ci <= c->ci; i++, ci++)
+          ;
+      }
+      children += i;
+    }
+    break;
+
+  case MRB_TT_ARRAY:
+    {
+      struct RArray *a = (struct RArray*)obj;
+      children += a->len;
+    }
+    break;
+
+  case MRB_TT_HASH:
+    children += mrb_gc_mark_iv_size(mrb, (struct RObject*)obj);
+    children += mrb_gc_mark_hash_size(mrb, (struct RHash*)obj);
+    break;
+
+  case MRB_TT_PROC:
+  case MRB_TT_RANGE:
+    children+=2;
+    break;
+
+  default:
+    break;
+  }
+  return children;
+}
+
+
+static void
+gc_mark_gray_list(mrb_state *mrb) {
+  while (mrb->gray_list) {
+    if (is_gray(mrb->gray_list))
+      gc_mark_children(mrb, mrb->gray_list);
+    else
+      mrb->gray_list = mrb->gray_list->gcnext;
+  }
+}
+
+
+static size_t
+incremental_marking_phase(mrb_state *mrb, size_t limit)
+{
+  size_t tried_marks = 0;
+
+  while (mrb->gray_list && tried_marks < limit) {
+    tried_marks += gc_gray_mark(mrb, mrb->gray_list);
+  }
+
+  return tried_marks;
+}
+
+static void
+final_marking_phase(mrb_state *mrb)
+{
+  mark_context_stack(mrb, mrb->root_c);
+  gc_mark_gray_list(mrb);
+  mrb_assert(mrb->gray_list == NULL);
+  mrb->gray_list = mrb->atomic_gray_list;
+  mrb->atomic_gray_list = NULL;
+  gc_mark_gray_list(mrb);
+  mrb_assert(mrb->gray_list == NULL);
+}
+
+static void
+prepare_incremental_sweep(mrb_state *mrb)
+{
+  mrb->gc_state = GC_STATE_SWEEP;
+  mrb->sweeps = mrb->heaps;
+  mrb->gc_live_after_mark = mrb->live;
+}
+
+static size_t
+incremental_sweep_phase(mrb_state *mrb, size_t limit)
+{
+  struct heap_page *page = mrb->sweeps;
+  size_t tried_sweep = 0;
+
+  while (page && (tried_sweep < limit)) {
+    RVALUE *p = page->objects;
+    RVALUE *e = p + MRB_HEAP_PAGE_SIZE;
+    size_t freed = 0;
+    mrb_bool dead_slot = TRUE;
+    mrb_bool full = (page->freelist == NULL);
+
+    if (is_minor_gc(mrb) && page->old) {
+      /* skip a slot which doesn't contain any young object */
+      p = e;
+      dead_slot = FALSE;
+    }
+    while (p<e) {
+      if (is_dead(mrb, &p->as.basic)) {
+        if (p->as.basic.tt != MRB_TT_FREE) {
+          obj_free(mrb, &p->as.basic);
+          p->as.free.next = page->freelist;
+          page->freelist = (struct RBasic*)p;
+          freed++;
+        }
+      }
+      else {
+        if (!is_generational(mrb))
+          paint_partial_white(mrb, &p->as.basic); /* next gc target */
+        dead_slot = 0;
+      }
+      p++;
+    }
+
+    /* free dead slot */
+    if (dead_slot && freed < MRB_HEAP_PAGE_SIZE) {
+      struct heap_page *next = page->next;
+
+      unlink_heap_page(mrb, page);
+      unlink_free_heap_page(mrb, page);
+      mrb_free(mrb, page);
+      page = next;
+    }
+    else {
+      if (full && freed > 0) {
+        link_free_heap_page(mrb, page);
+      }
+      if (page->freelist == NULL && is_minor_gc(mrb))
+        page->old = TRUE;
+      else
+        page->old = FALSE;
+      page = page->next;
+    }
+    tried_sweep += MRB_HEAP_PAGE_SIZE;
+    mrb->live -= freed;
+    mrb->gc_live_after_mark -= freed;
+  }
+  mrb->sweeps = page;
+  return tried_sweep;
+}
+
+static size_t
+incremental_gc(mrb_state *mrb, size_t limit)
+{
+  switch (mrb->gc_state) {
+  case GC_STATE_ROOT:
+    root_scan_phase(mrb);
+    mrb->gc_state = GC_STATE_MARK;
+    flip_white_part(mrb);
+    return 0;
+  case GC_STATE_MARK:
+    if (mrb->gray_list) {
+      return incremental_marking_phase(mrb, limit);
+    }
+    else {
+      final_marking_phase(mrb);
+      prepare_incremental_sweep(mrb);
+      return 0;
+    }
+  case GC_STATE_SWEEP: {
+     size_t tried_sweep = 0;
+     tried_sweep = incremental_sweep_phase(mrb, limit);
+     if (tried_sweep == 0)
+       mrb->gc_state = GC_STATE_ROOT;
+     return tried_sweep;
+  }
+  default:
+    /* unknown state */
+    mrb_assert(0);
+    return 0;
+  }
+}
+
+static void
+incremental_gc_until(mrb_state *mrb, enum gc_state to_state)
+{
+  do {
+    incremental_gc(mrb, SIZE_MAX);
+  } while (mrb->gc_state != to_state);
+}
+
+static void
+incremental_gc_step(mrb_state *mrb)
+{
+  size_t limit = 0, result = 0;
+  limit = (GC_STEP_SIZE/100) * mrb->gc_step_ratio;
+  while (result < limit) {
+    result += incremental_gc(mrb, limit);
+    if (mrb->gc_state == GC_STATE_ROOT)
+      break;
+  }
+
+  mrb->gc_threshold = mrb->live + GC_STEP_SIZE;
+}
+
+static void
+clear_all_old(mrb_state *mrb)
+{
+  mrb_bool origin_mode = mrb->is_generational_gc_mode;
+
+  mrb_assert(is_generational(mrb));
+  if (is_major_gc(mrb)) {
+    /* finish the half baked GC */
+    incremental_gc_until(mrb, GC_STATE_ROOT);
+  }
+
+  /* Sweep the dead objects, then reset all the live objects
+   * (including all the old objects, of course) to white. */
+  mrb->is_generational_gc_mode = FALSE;
+  prepare_incremental_sweep(mrb);
+  incremental_gc_until(mrb, GC_STATE_ROOT);
+  mrb->is_generational_gc_mode = origin_mode;
+
+  /* The gray objects have already been painted as white */
+  mrb->atomic_gray_list = mrb->gray_list = NULL;
+}
+
+MRB_API void
+mrb_incremental_gc(mrb_state *mrb)
+{
+  if (mrb->gc_disabled) return;
+
+  GC_INVOKE_TIME_REPORT("mrb_incremental_gc()");
+  GC_TIME_START;
+
+  if (is_minor_gc(mrb)) {
+    incremental_gc_until(mrb, GC_STATE_ROOT);
+  }
+  else {
+    incremental_gc_step(mrb);
+  }
+
+  if (mrb->gc_state == GC_STATE_ROOT) {
+    mrb_assert(mrb->live >= mrb->gc_live_after_mark);
+    mrb->gc_threshold = (mrb->gc_live_after_mark/100) * mrb->gc_interval_ratio;
+    if (mrb->gc_threshold < GC_STEP_SIZE) {
+      mrb->gc_threshold = GC_STEP_SIZE;
+    }
+
+    if (is_major_gc(mrb)) {
+      mrb->majorgc_old_threshold = mrb->gc_live_after_mark/100 * DEFAULT_MAJOR_GC_INC_RATIO;
+      mrb->gc_full = FALSE;
+    }
+    else if (is_minor_gc(mrb)) {
+      if (mrb->live > mrb->majorgc_old_threshold) {
+        clear_all_old(mrb);
+        mrb->gc_full = TRUE;
+      }
+    }
+  }
+
+  GC_TIME_STOP_AND_REPORT;
+}
+
+/* Perform a full gc cycle */
+MRB_API void
+mrb_full_gc(mrb_state *mrb)
+{
+  if (mrb->gc_disabled) return;
+  GC_INVOKE_TIME_REPORT("mrb_full_gc()");
+  GC_TIME_START;
+
+  if (is_generational(mrb)) {
+    /* clear all the old objects back to young */
+    clear_all_old(mrb);
+    mrb->gc_full = TRUE;
+  }
+  else if (mrb->gc_state != GC_STATE_ROOT) {
+    /* finish half baked GC cycle */
+    incremental_gc_until(mrb, GC_STATE_ROOT);
+  }
+
+  incremental_gc_until(mrb, GC_STATE_ROOT);
+  mrb->gc_threshold = (mrb->gc_live_after_mark/100) * mrb->gc_interval_ratio;
+
+  if (is_generational(mrb)) {
+    mrb->majorgc_old_threshold = mrb->gc_live_after_mark/100 * DEFAULT_MAJOR_GC_INC_RATIO;
+    mrb->gc_full = FALSE;
+  }
+
+  GC_TIME_STOP_AND_REPORT;
+}
+
+MRB_API void
+mrb_garbage_collect(mrb_state *mrb)
+{
+  mrb_full_gc(mrb);
+}
+
+MRB_API int
+mrb_gc_arena_save(mrb_state *mrb)
+{
+  return mrb->arena_idx;
+}
+
+MRB_API void
+mrb_gc_arena_restore(mrb_state *mrb, int idx)
+{
+#ifndef MRB_GC_FIXED_ARENA
+  int capa = mrb->arena_capa;
+
+  if (idx < capa / 2) {
+    capa = (int)(capa * 0.66);
+    if (capa < MRB_GC_ARENA_SIZE) {
+      capa = MRB_GC_ARENA_SIZE;
+    }
+    if (capa != mrb->arena_capa) {
+      mrb->arena = (struct RBasic**)mrb_realloc(mrb, mrb->arena, sizeof(struct RBasic*)*capa);
+      mrb->arena_capa = capa;
+    }
+  }
+#endif
+  mrb->arena_idx = idx;
+}
+
+/*
+ * Field write barrier
+ *   Paint obj(Black) -> value(White) to obj(Black) -> value(Gray).
+ */
+
+MRB_API void
+mrb_field_write_barrier(mrb_state *mrb, struct RBasic *obj, struct RBasic *value)
+{
+  if (!is_black(obj)) return;
+  if (!is_white(value)) return;
+
+  mrb_assert(!is_dead(mrb, value) && !is_dead(mrb, obj));
+  mrb_assert(is_generational(mrb) || mrb->gc_state != GC_STATE_ROOT);
+
+  if (is_generational(mrb) || mrb->gc_state == GC_STATE_MARK) {
+    add_gray_list(mrb, value);
+  }
+  else {
+    mrb_assert(mrb->gc_state == GC_STATE_SWEEP);
+    paint_partial_white(mrb, obj); /* for never write barriers */
+  }
+}
+
+/*
+ * Write barrier
+ *   Paint obj(Black) to obj(Gray).
+ *
+ *   The object that is painted gray will be traversed atomically in final
+ *   mark phase. So you use this write barrier if it's frequency written spot.
+ *   e.g. Set element on Array.
+ */
+
+MRB_API void
+mrb_write_barrier(mrb_state *mrb, struct RBasic *obj)
+{
+  if (!is_black(obj)) return;
+
+  mrb_assert(!is_dead(mrb, obj));
+  mrb_assert(is_generational(mrb) || mrb->gc_state != GC_STATE_ROOT);
+  paint_gray(obj);
+  obj->gcnext = mrb->atomic_gray_list;
+  mrb->atomic_gray_list = obj;
+}
+
+/*
+ *  call-seq:
+ *     GC.start                     -> nil
+ *
+ *  Initiates full garbage collection.
+ *
+ */
+
+static mrb_value
+gc_start(mrb_state *mrb, mrb_value obj)
+{
+  mrb_full_gc(mrb);
+  return mrb_nil_value();
+}
+
+/*
+ *  call-seq:
+ *     GC.enable    -> true or false
+ *
+ *  Enables garbage collection, returning <code>true</code> if garbage
+ *  collection was previously disabled.
+ *
+ *     GC.disable   #=> false
+ *     GC.enable    #=> true
+ *     GC.enable    #=> false
+ *
+ */
+
+static mrb_value
+gc_enable(mrb_state *mrb, mrb_value obj)
+{
+  mrb_bool old = mrb->gc_disabled;
+
+  mrb->gc_disabled = FALSE;
+
+  return mrb_bool_value(old);
+}
+
+/*
+ *  call-seq:
+ *     GC.disable    -> true or false
+ *
+ *  Disables garbage collection, returning <code>true</code> if garbage
+ *  collection was already disabled.
+ *
+ *     GC.disable   #=> false
+ *     GC.disable   #=> true
+ *
+ */
+
+static mrb_value
+gc_disable(mrb_state *mrb, mrb_value obj)
+{
+  mrb_bool old = mrb->gc_disabled;
+
+  mrb->gc_disabled = TRUE;
+
+  return mrb_bool_value(old);
+}
+
+/*
+ *  call-seq:
+ *     GC.interval_ratio      -> fixnum
+ *
+ *  Returns ratio of GC interval. Default value is 200(%).
+ *
+ */
+
+static mrb_value
+gc_interval_ratio_get(mrb_state *mrb, mrb_value obj)
+{
+  return mrb_fixnum_value(mrb->gc_interval_ratio);
+}
+
+/*
+ *  call-seq:
+ *     GC.interval_ratio = fixnum    -> nil
+ *
+ *  Updates ratio of GC interval. Default value is 200(%).
+ *  GC start as soon as after end all step of GC if you set 100(%).
+ *
+ */
+
+static mrb_value
+gc_interval_ratio_set(mrb_state *mrb, mrb_value obj)
+{
+  mrb_int ratio;
+
+  mrb_get_args(mrb, "i", &ratio);
+  mrb->gc_interval_ratio = ratio;
+  return mrb_nil_value();
+}
+
+/*
+ *  call-seq:
+ *     GC.step_ratio    -> fixnum
+ *
+ *  Returns step span ratio of Incremental GC. Default value is 200(%).
+ *
+ */
+
+static mrb_value
+gc_step_ratio_get(mrb_state *mrb, mrb_value obj)
+{
+  return mrb_fixnum_value(mrb->gc_step_ratio);
+}
+
+/*
+ *  call-seq:
+ *     GC.step_ratio = fixnum   -> nil
+ *
+ *  Updates step span ratio of Incremental GC. Default value is 200(%).
+ *  1 step of incrementalGC becomes long if a rate is big.
+ *
+ */
+
+static mrb_value
+gc_step_ratio_set(mrb_state *mrb, mrb_value obj)
+{
+  mrb_int ratio;
+
+  mrb_get_args(mrb, "i", &ratio);
+  mrb->gc_step_ratio = ratio;
+  return mrb_nil_value();
+}
+
+static void
+change_gen_gc_mode(mrb_state *mrb, mrb_bool enable)
+{
+  if (is_generational(mrb) && !enable) {
+    clear_all_old(mrb);
+    mrb_assert(mrb->gc_state == GC_STATE_ROOT);
+    mrb->gc_full = FALSE;
+  }
+  else if (!is_generational(mrb) && enable) {
+    incremental_gc_until(mrb, GC_STATE_ROOT);
+    mrb->majorgc_old_threshold = mrb->gc_live_after_mark/100 * DEFAULT_MAJOR_GC_INC_RATIO;
+    mrb->gc_full = FALSE;
+  }
+  mrb->is_generational_gc_mode = enable;
+}
+
+/*
+ *  call-seq:
+ *     GC.generational_mode -> true or false
+ *
+ *  Returns generational or normal gc mode.
+ *
+ */
+
+static mrb_value
+gc_generational_mode_get(mrb_state *mrb, mrb_value self)
+{
+  return mrb_bool_value(mrb->is_generational_gc_mode);
+}
+
+/*
+ *  call-seq:
+ *     GC.generational_mode = true or false -> true or false
+ *
+ *  Changes to generational or normal gc mode.
+ *
+ */
+
+static mrb_value
+gc_generational_mode_set(mrb_state *mrb, mrb_value self)
+{
+  mrb_bool enable;
+
+  mrb_get_args(mrb, "b", &enable);
+  if (mrb->is_generational_gc_mode != enable)
+    change_gen_gc_mode(mrb, enable);
+
+  return mrb_bool_value(enable);
+}
+
+void
+mrb_objspace_each_objects(mrb_state *mrb, mrb_each_object_callback *callback, void *data)
+{
+  struct heap_page* page = mrb->heaps;
+
+  while (page != NULL) {
+    RVALUE *p, *pend;
+
+    p = page->objects;
+    pend = p + MRB_HEAP_PAGE_SIZE;
+    for (;p < pend; p++) {
+      (*callback)(mrb, &p->as.basic, data);
+    }
+
+    page = page->next;
+  }
+}
+
+#ifdef GC_TEST
+#ifdef GC_DEBUG
+static mrb_value gc_test(mrb_state *, mrb_value);
+#endif
+#endif
+
+void
+mrb_init_gc(mrb_state *mrb)
+{
+  struct RClass *gc;
+
+  gc = mrb_define_module(mrb, "GC");
+
+  mrb_define_class_method(mrb, gc, "start", gc_start, MRB_ARGS_NONE());
+  mrb_define_class_method(mrb, gc, "enable", gc_enable, MRB_ARGS_NONE());
+  mrb_define_class_method(mrb, gc, "disable", gc_disable, MRB_ARGS_NONE());
+  mrb_define_class_method(mrb, gc, "interval_ratio", gc_interval_ratio_get, MRB_ARGS_NONE());
+  mrb_define_class_method(mrb, gc, "interval_ratio=", gc_interval_ratio_set, MRB_ARGS_REQ(1));
+  mrb_define_class_method(mrb, gc, "step_ratio", gc_step_ratio_get, MRB_ARGS_NONE());
+  mrb_define_class_method(mrb, gc, "step_ratio=", gc_step_ratio_set, MRB_ARGS_REQ(1));
+  mrb_define_class_method(mrb, gc, "generational_mode=", gc_generational_mode_set, MRB_ARGS_REQ(1));
+  mrb_define_class_method(mrb, gc, "generational_mode", gc_generational_mode_get, MRB_ARGS_NONE());
+#ifdef GC_TEST
+#ifdef GC_DEBUG
+  mrb_define_class_method(mrb, gc, "test", gc_test, MRB_ARGS_NONE());
+#endif
+#endif
+}
+
+#ifdef GC_TEST
+#ifdef GC_DEBUG
+void
+test_mrb_field_write_barrier(void)
+{
+  mrb_state *mrb = mrb_open();
+  struct RBasic *obj, *value;
+
+  puts("test_mrb_field_write_barrier");
+  mrb->is_generational_gc_mode = FALSE;
+  obj = mrb_basic_ptr(mrb_ary_new(mrb));
+  value = mrb_basic_ptr(mrb_str_new_lit(mrb, "value"));
+  paint_black(obj);
+  paint_partial_white(mrb, value);
+
+
+  puts("  in GC_STATE_MARK");
+  mrb->gc_state = GC_STATE_MARK;
+  mrb_field_write_barrier(mrb, obj, value);
+
+  mrb_assert(is_gray(value));
+
+
+  puts("  in GC_STATE_SWEEP");
+  paint_partial_white(mrb, value);
+  mrb->gc_state = GC_STATE_SWEEP;
+  mrb_field_write_barrier(mrb, obj, value);
+
+  mrb_assert(obj->color & mrb->current_white_part);
+  mrb_assert(value->color & mrb->current_white_part);
+
+
+  puts("  fail with black");
+  mrb->gc_state = GC_STATE_MARK;
+  paint_white(obj);
+  paint_partial_white(mrb, value);
+  mrb_field_write_barrier(mrb, obj, value);
+
+  mrb_assert(obj->color & mrb->current_white_part);
+
+
+  puts("  fail with gray");
+  mrb->gc_state = GC_STATE_MARK;
+  paint_black(obj);
+  paint_gray(value);
+  mrb_field_write_barrier(mrb, obj, value);
+
+  mrb_assert(is_gray(value));
+
+
+  {
+    puts("test_mrb_field_write_barrier_value");
+    obj = mrb_basic_ptr(mrb_ary_new(mrb));
+    mrb_value value = mrb_str_new_lit(mrb, "value");
+    paint_black(obj);
+    paint_partial_white(mrb, mrb_basic_ptr(value));
+
+    mrb->gc_state = GC_STATE_MARK;
+    mrb_field_write_barrier_value(mrb, obj, value);
+
+    mrb_assert(is_gray(mrb_basic_ptr(value)));
+  }
+
+  mrb_close(mrb);
+}
+
+void
+test_mrb_write_barrier(void)
+{
+  mrb_state *mrb = mrb_open();
+  struct RBasic *obj;
+
+  puts("test_mrb_write_barrier");
+  obj = mrb_basic_ptr(mrb_ary_new(mrb));
+  paint_black(obj);
+
+  puts("  in GC_STATE_MARK");
+  mrb->gc_state = GC_STATE_MARK;
+  mrb_write_barrier(mrb, obj);
+
+  mrb_assert(is_gray(obj));
+  mrb_assert(mrb->atomic_gray_list == obj);
+
+
+  puts("  fail with gray");
+  paint_gray(obj);
+  mrb_write_barrier(mrb, obj);
+
+  mrb_assert(is_gray(obj));
+
+  mrb_close(mrb);
+}
+
+void
+test_add_gray_list(void)
+{
+  mrb_state *mrb = mrb_open();
+  struct RBasic *obj1, *obj2;
+
+  puts("test_add_gray_list");
+  change_gen_gc_mode(mrb, FALSE);
+  mrb_assert(mrb->gray_list == NULL);
+  obj1 = mrb_basic_ptr(mrb_str_new_lit(mrb, "test"));
+  add_gray_list(mrb, obj1);
+  mrb_assert(mrb->gray_list == obj1);
+  mrb_assert(is_gray(obj1));
+
+  obj2 = mrb_basic_ptr(mrb_str_new_lit(mrb, "test"));
+  add_gray_list(mrb, obj2);
+  mrb_assert(mrb->gray_list == obj2);
+  mrb_assert(mrb->gray_list->gcnext == obj1);
+  mrb_assert(is_gray(obj2));
+
+  mrb_close(mrb);
+}
+
+void
+test_gc_gray_mark(void)
+{
+  mrb_state *mrb = mrb_open();
+  mrb_value obj_v, value_v;
+  struct RBasic *obj;
+  size_t gray_num = 0;
+
+  puts("test_gc_gray_mark");
+
+  puts("  in MRB_TT_CLASS");
+  obj = (struct RBasic*)mrb->object_class;
+  paint_gray(obj);
+  gray_num = gc_gray_mark(mrb, obj);
+  mrb_assert(is_black(obj));
+  mrb_assert(gray_num > 1);
+
+  puts("  in MRB_TT_ARRAY");
+  obj_v = mrb_ary_new(mrb);
+  value_v = mrb_str_new_lit(mrb, "test");
+  paint_gray(mrb_basic_ptr(obj_v));
+  paint_partial_white(mrb, mrb_basic_ptr(value_v));
+  mrb_ary_push(mrb, obj_v, value_v);
+  gray_num = gc_gray_mark(mrb, mrb_basic_ptr(obj_v));
+  mrb_assert(is_black(mrb_basic_ptr(obj_v)));
+  mrb_assert(is_gray(mrb_basic_ptr(value_v)));
+  mrb_assert(gray_num == 1);
+
+  mrb_close(mrb);
+}
+
+void
+test_incremental_gc(void)
+{
+  mrb_state *mrb = mrb_open();
+  size_t max = ~0, live = 0, total = 0, freed = 0;
+  RVALUE *free;
+  struct heap_page *page;
+
+  puts("test_incremental_gc");
+  change_gen_gc_mode(mrb, FALSE);
+
+  puts("  in mrb_full_gc");
+  mrb_full_gc(mrb);
+
+  mrb_assert(mrb->gc_state == GC_STATE_ROOT);
+  puts("  in GC_STATE_ROOT");
+  incremental_gc(mrb, max);
+  mrb_assert(mrb->gc_state == GC_STATE_MARK);
+  puts("  in GC_STATE_MARK");
+  incremental_gc_until(mrb, GC_STATE_SWEEP);
+  mrb_assert(mrb->gc_state == GC_STATE_SWEEP);
+
+  puts("  in GC_STATE_SWEEP");
+  page = mrb->heaps;
+  while (page) {
+    RVALUE *p = page->objects;
+    RVALUE *e = p + MRB_HEAP_PAGE_SIZE;
+    while (p<e) {
+      if (is_black(&p->as.basic)) {
+        live++;
+      }
+      if (is_gray(&p->as.basic) && !is_dead(mrb, &p->as.basic)) {
+        printf("%p\n", &p->as.basic);
+      }
+      p++;
+    }
+    page = page->next;
+    total += MRB_HEAP_PAGE_SIZE;
+  }
+
+  mrb_assert(mrb->gray_list == NULL);
+
+  incremental_gc(mrb, max);
+  mrb_assert(mrb->gc_state == GC_STATE_SWEEP);
+
+  incremental_gc(mrb, max);
+  mrb_assert(mrb->gc_state == GC_STATE_ROOT);
+
+  free = (RVALUE*)mrb->heaps->freelist;
+  while (free) {
+   freed++;
+   free = (RVALUE*)free->as.free.next;
+  }
+
+  mrb_assert(mrb->live == live);
+  mrb_assert(mrb->live == total-freed);
+
+  puts("test_incremental_gc(gen)");
+  incremental_gc_until(mrb, GC_STATE_SWEEP);
+  change_gen_gc_mode(mrb, TRUE);
+
+  mrb_assert(mrb->gc_full == FALSE);
+  mrb_assert(mrb->gc_state == GC_STATE_ROOT);
+
+  puts("  in minor");
+  mrb_assert(is_minor_gc(mrb));
+  mrb_assert(mrb->majorgc_old_threshold > 0);
+  mrb->majorgc_old_threshold = 0;
+  mrb_incremental_gc(mrb);
+  mrb_assert(mrb->gc_full == TRUE);
+  mrb_assert(mrb->gc_state == GC_STATE_ROOT);
+
+  puts("  in major");
+  mrb_assert(is_major_gc(mrb));
+  do {
+    mrb_incremental_gc(mrb);
+  } while (mrb->gc_state != GC_STATE_ROOT);
+  mrb_assert(mrb->gc_full == FALSE);
+
+  mrb_close(mrb);
+}
+
+void
+test_incremental_sweep_phase(void)
+{
+  mrb_state *mrb = mrb_open();
+
+  puts("test_incremental_sweep_phase");
+
+  add_heap(mrb);
+  mrb->sweeps = mrb->heaps;
+
+  mrb_assert(mrb->heaps->next->next == NULL);
+  mrb_assert(mrb->free_heaps->next->next == NULL);
+  incremental_sweep_phase(mrb, MRB_HEAP_PAGE_SIZE*3);
+
+  mrb_assert(mrb->heaps->next == NULL);
+  mrb_assert(mrb->heaps == mrb->free_heaps);
+
+  mrb_close(mrb);
+}
+
+static mrb_value
+gc_test(mrb_state *mrb, mrb_value self)
+{
+  test_mrb_field_write_barrier();
+  test_mrb_write_barrier();
+  test_add_gray_list();
+  test_gc_gray_mark();
+  test_incremental_gc();
+  test_incremental_sweep_phase();
+  return mrb_nil_value();
+}
+#endif  /* GC_DEBUG */
+#endif  /* GC_TEST */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hash.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,858 @@
+/*
+** hash.c - Hash class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/class.h"
+#include "mruby/hash.h"
+#include "mruby/khash.h"
+#include "mruby/string.h"
+#include "mruby/variable.h"
+
+/* a function to get hash value of a float number */
+mrb_int mrb_float_id(mrb_float f);
+
+static inline khint_t
+mrb_hash_ht_hash_func(mrb_state *mrb, mrb_value key)
+{
+  enum mrb_vtype t = mrb_type(key);
+  mrb_value hv;
+  const char *p;
+  mrb_int i, len;
+  khint_t h;
+
+  switch (t) {
+  case MRB_TT_STRING:
+    p = RSTRING_PTR(key);
+    len = RSTRING_LEN(key);
+    h = 0;
+    for (i=0; i<len; i++) {
+      h = (h << 5) - h + *p++;
+    }
+    return h;
+
+  case MRB_TT_SYMBOL:
+    h = (khint_t)mrb_symbol(key);
+    return kh_int_hash_func(mrb, h);
+
+  case MRB_TT_FIXNUM:
+    h = (khint_t)mrb_float_id((mrb_float)mrb_fixnum(key));
+    return kh_int_hash_func(mrb, h);
+
+  case MRB_TT_FLOAT:
+    h = (khint_t)mrb_float_id(mrb_float(key));
+    return kh_int_hash_func(mrb, h);
+
+  default:
+    hv = mrb_funcall(mrb, key, "hash", 0);
+    h = (khint_t)t ^ mrb_fixnum(hv);
+    return kh_int_hash_func(mrb, h);
+  }
+}
+
+static inline khint_t
+mrb_hash_ht_hash_equal(mrb_state *mrb, mrb_value a, mrb_value b)
+{
+  enum mrb_vtype t = mrb_type(a);
+
+  switch (t) {
+  case MRB_TT_STRING:
+    return mrb_str_equal(mrb, a, b);
+
+  case MRB_TT_SYMBOL:
+    if (mrb_type(b) != MRB_TT_SYMBOL) return FALSE;
+    return mrb_symbol(a) == mrb_symbol(b);
+
+  case MRB_TT_FIXNUM:
+    switch (mrb_type(b)) {
+    case MRB_TT_FIXNUM:
+      return mrb_fixnum(a) == mrb_fixnum(b);
+    case MRB_TT_FLOAT:
+      return (mrb_float)mrb_fixnum(a) == mrb_float(b);
+    default:
+      return FALSE;
+    }
+
+  case MRB_TT_FLOAT:
+    switch (mrb_type(b)) {
+    case MRB_TT_FIXNUM:
+      return mrb_float(a) == (mrb_float)mrb_fixnum(b);
+    case MRB_TT_FLOAT:
+      return mrb_float(a) == mrb_float(b);
+    default:
+      return FALSE;
+    }
+
+  default:
+    return mrb_eql(mrb, a, b);
+  }
+}
+
+typedef struct {
+  mrb_value v;
+  mrb_int n;
+} mrb_hash_value;
+
+KHASH_DECLARE(ht, mrb_value, mrb_hash_value, TRUE)
+KHASH_DEFINE (ht, mrb_value, mrb_hash_value, TRUE, mrb_hash_ht_hash_func, mrb_hash_ht_hash_equal)
+
+static void mrb_hash_modify(mrb_state *mrb, mrb_value hash);
+
+static inline mrb_value
+mrb_hash_ht_key(mrb_state *mrb, mrb_value key)
+{
+  if (mrb_string_p(key))
+    return mrb_str_dup(mrb, key);
+  else
+    return key;
+}
+
+#define KEY(key) mrb_hash_ht_key(mrb, key)
+
+void
+mrb_gc_mark_hash(mrb_state *mrb, struct RHash *hash)
+{
+  khiter_t k;
+  khash_t(ht) *h = hash->ht;
+
+  if (!h) return;
+  for (k = kh_begin(h); k != kh_end(h); k++) {
+    if (kh_exist(h, k)) {
+      mrb_value key = kh_key(h, k);
+      mrb_value val = kh_value(h, k).v;
+
+      mrb_gc_mark_value(mrb, key);
+      mrb_gc_mark_value(mrb, val);
+    }
+  }
+}
+
+size_t
+mrb_gc_mark_hash_size(mrb_state *mrb, struct RHash *hash)
+{
+  if (!hash->ht) return 0;
+  return kh_size(hash->ht)*2;
+}
+
+void
+mrb_gc_free_hash(mrb_state *mrb, struct RHash *hash)
+{
+  if (hash->ht) kh_destroy(ht, mrb, hash->ht);
+}
+
+
+MRB_API mrb_value
+mrb_hash_new_capa(mrb_state *mrb, int capa)
+{
+  struct RHash *h;
+
+  h = (struct RHash*)mrb_obj_alloc(mrb, MRB_TT_HASH, mrb->hash_class);
+  h->ht = kh_init(ht, mrb);
+  if (capa > 0) {
+    kh_resize(ht, mrb, h->ht, capa);
+  }
+  h->iv = 0;
+  return mrb_obj_value(h);
+}
+
+MRB_API mrb_value
+mrb_hash_new(mrb_state *mrb)
+{
+  return mrb_hash_new_capa(mrb, 0);
+}
+
+MRB_API mrb_value
+mrb_hash_get(mrb_state *mrb, mrb_value hash, mrb_value key)
+{
+  khash_t(ht) *h = RHASH_TBL(hash);
+  khiter_t k;
+
+  if (h) {
+    k = kh_get(ht, mrb, h, key);
+    if (k != kh_end(h))
+      return kh_value(h, k).v;
+  }
+
+  /* not found */
+  if (MRB_RHASH_PROCDEFAULT_P(hash)) {
+    return mrb_funcall(mrb, RHASH_PROCDEFAULT(hash), "call", 2, hash, key);
+  }
+  return RHASH_IFNONE(hash);
+}
+
+MRB_API mrb_value
+mrb_hash_fetch(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value def)
+{
+  khash_t(ht) *h = RHASH_TBL(hash);
+  khiter_t k;
+
+  if (h) {
+    k = kh_get(ht, mrb, h, key);
+    if (k != kh_end(h))
+      return kh_value(h, k).v;
+  }
+
+  /* not found */
+  return def;
+}
+
+MRB_API void
+mrb_hash_set(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value val)
+{
+  khash_t(ht) *h;
+  khiter_t k;
+  int r;
+
+  mrb_hash_modify(mrb, hash);
+  h = RHASH_TBL(hash);
+
+  if (!h) h = RHASH_TBL(hash) = kh_init(ht, mrb);
+  k = kh_put2(ht, mrb, h, key, &r);
+  kh_value(h, k).v = val;
+
+  if (r != 0) {
+    /* expand */
+    int ai = mrb_gc_arena_save(mrb);
+    key = kh_key(h, k) = KEY(key);
+    mrb_gc_arena_restore(mrb, ai);
+    kh_value(h, k).n = kh_size(h)-1;
+  }
+
+  mrb_field_write_barrier_value(mrb, (struct RBasic*)RHASH(hash), key);
+  mrb_field_write_barrier_value(mrb, (struct RBasic*)RHASH(hash), val);
+  return;
+}
+
+static mrb_value
+mrb_hash_dup(mrb_state *mrb, mrb_value hash)
+{
+  struct RHash* ret;
+  khash_t(ht) *h, *ret_h;
+  khiter_t k, ret_k;
+
+  h = RHASH_TBL(hash);
+  ret = (struct RHash*)mrb_obj_alloc(mrb, MRB_TT_HASH, mrb->hash_class);
+  ret->ht = kh_init(ht, mrb);
+
+  if (kh_size(h) > 0) {
+    ret_h = ret->ht;
+
+    for (k = kh_begin(h); k != kh_end(h); k++) {
+      if (kh_exist(h, k)) {
+        int ai = mrb_gc_arena_save(mrb);
+        ret_k = kh_put(ht, mrb, ret_h, KEY(kh_key(h, k)));
+        mrb_gc_arena_restore(mrb, ai);
+        kh_val(ret_h, ret_k) = kh_val(h, k);
+      }
+    }
+  }
+
+  return mrb_obj_value(ret);
+}
+
+MRB_API mrb_value
+mrb_check_hash_type(mrb_state *mrb, mrb_value hash)
+{
+  return mrb_check_convert_type(mrb, hash, MRB_TT_HASH, "Hash", "to_hash");
+}
+
+MRB_API khash_t(ht)*
+mrb_hash_tbl(mrb_state *mrb, mrb_value hash)
+{
+  khash_t(ht) *h = RHASH_TBL(hash);
+
+  if (!h) {
+    return RHASH_TBL(hash) = kh_init(ht, mrb);
+  }
+  return h;
+}
+
+static void
+mrb_hash_modify(mrb_state *mrb, mrb_value hash)
+{
+  mrb_hash_tbl(mrb, hash);
+}
+
+/* 15.2.13.4.16 */
+/*
+ *  call-seq:
+ *     Hash.new                          -> new_hash
+ *     Hash.new(obj)                     -> new_hash
+ *     Hash.new {|hash, key| block }     -> new_hash
+ *
+ *  Returns a new, empty hash. If this hash is subsequently accessed by
+ *  a key that doesn't correspond to a hash entry, the value returned
+ *  depends on the style of <code>new</code> used to create the hash. In
+ *  the first form, the access returns <code>nil</code>. If
+ *  <i>obj</i> is specified, this single object will be used for
+ *  all <em>default values</em>. If a block is specified, it will be
+ *  called with the hash object and the key, and should return the
+ *  default value. It is the block's responsibility to store the value
+ *  in the hash if required.
+ *
+ *     h = Hash.new("Go Fish")
+ *     h["a"] = 100
+ *     h["b"] = 200
+ *     h["a"]           #=> 100
+ *     h["c"]           #=> "Go Fish"
+ *     # The following alters the single default object
+ *     h["c"].upcase!   #=> "GO FISH"
+ *     h["d"]           #=> "GO FISH"
+ *     h.keys           #=> ["a", "b"]
+ *
+ *     # While this creates a new default object each time
+ *     h = Hash.new { |hash, key| hash[key] = "Go Fish: #{key}" }
+ *     h["c"]           #=> "Go Fish: c"
+ *     h["c"].upcase!   #=> "GO FISH: C"
+ *     h["d"]           #=> "Go Fish: d"
+ *     h.keys           #=> ["c", "d"]
+ *
+ */
+
+static mrb_value
+mrb_hash_init(mrb_state *mrb, mrb_value hash)
+{
+  mrb_value block, ifnone;
+  mrb_bool ifnone_p;
+
+  ifnone = mrb_nil_value();
+  mrb_get_args(mrb, "&|o?", &block, &ifnone, &ifnone_p);
+  mrb_hash_modify(mrb, hash);
+  if (!mrb_nil_p(block)) {
+    if (ifnone_p) {
+      mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments");
+    }
+    RHASH(hash)->flags |= MRB_HASH_PROC_DEFAULT;
+    ifnone = block;
+  }
+  mrb_iv_set(mrb, hash, mrb_intern_lit(mrb, "ifnone"), ifnone);
+  return hash;
+}
+
+/* 15.2.13.4.2  */
+/*
+ *  call-seq:
+ *     hsh[key]    ->  value
+ *
+ *  Element Reference---Retrieves the <i>value</i> object corresponding
+ *  to the <i>key</i> object. If not found, returns the default value (see
+ *  <code>Hash::new</code> for details).
+ *
+ *     h = { "a" => 100, "b" => 200 }
+ *     h["a"]   #=> 100
+ *     h["c"]   #=> nil
+ *
+ */
+static mrb_value
+mrb_hash_aget(mrb_state *mrb, mrb_value self)
+{
+  mrb_value key;
+
+  mrb_get_args(mrb, "o", &key);
+  return mrb_hash_get(mrb, self, key);
+}
+
+/* 15.2.13.4.5  */
+/*
+ *  call-seq:
+ *     hsh.default(key=nil)   -> obj
+ *
+ *  Returns the default value, the value that would be returned by
+ *  <i>hsh</i>[<i>key</i>] if <i>key</i> did not exist in <i>hsh</i>.
+ *  See also <code>Hash::new</code> and <code>Hash#default=</code>.
+ *
+ *     h = Hash.new                            #=> {}
+ *     h.default                               #=> nil
+ *     h.default(2)                            #=> nil
+ *
+ *     h = Hash.new("cat")                     #=> {}
+ *     h.default                               #=> "cat"
+ *     h.default(2)                            #=> "cat"
+ *
+ *     h = Hash.new {|h,k| h[k] = k.to_i*10}   #=> {}
+ *     h.default                               #=> nil
+ *     h.default(2)                            #=> 20
+ */
+
+static mrb_value
+mrb_hash_default(mrb_state *mrb, mrb_value hash)
+{
+  mrb_value key;
+  mrb_bool given;
+
+  mrb_get_args(mrb, "|o?", &key, &given);
+  if (MRB_RHASH_PROCDEFAULT_P(hash)) {
+    if (!given) return mrb_nil_value();
+    return mrb_funcall(mrb, RHASH_PROCDEFAULT(hash), "call", 2, hash, key);
+  }
+  else {
+    return RHASH_IFNONE(hash);
+  }
+}
+
+/* 15.2.13.4.6  */
+/*
+ *  call-seq:
+ *     hsh.default = obj     -> obj
+ *
+ *  Sets the default value, the value returned for a key that does not
+ *  exist in the hash. It is not possible to set the default to a
+ *  <code>Proc</code> that will be executed on each key lookup.
+ *
+ *     h = { "a" => 100, "b" => 200 }
+ *     h.default = "Go fish"
+ *     h["a"]     #=> 100
+ *     h["z"]     #=> "Go fish"
+ *     # This doesn't do what you might hope...
+ *     h.default = proc do |hash, key|
+ *       hash[key] = key + key
+ *     end
+ *     h[2]       #=> #<Proc:0x401b3948@-:6>
+ *     h["cat"]   #=> #<Proc:0x401b3948@-:6>
+ */
+
+static mrb_value
+mrb_hash_set_default(mrb_state *mrb, mrb_value hash)
+{
+  mrb_value ifnone;
+
+  mrb_get_args(mrb, "o", &ifnone);
+  mrb_hash_modify(mrb, hash);
+  mrb_iv_set(mrb, hash, mrb_intern_lit(mrb, "ifnone"), ifnone);
+  RHASH(hash)->flags &= ~(MRB_HASH_PROC_DEFAULT);
+
+  return ifnone;
+}
+
+/* 15.2.13.4.7  */
+/*
+ *  call-seq:
+ *     hsh.default_proc -> anObject
+ *
+ *  If <code>Hash::new</code> was invoked with a block, return that
+ *  block, otherwise return <code>nil</code>.
+ *
+ *     h = Hash.new {|h,k| h[k] = k*k }   #=> {}
+ *     p = h.default_proc                 #=> #<Proc:0x401b3d08@-:1>
+ *     a = []                             #=> []
+ *     p.call(a, 2)
+ *     a                                  #=> [nil, nil, 4]
+ */
+
+
+static mrb_value
+mrb_hash_default_proc(mrb_state *mrb, mrb_value hash)
+{
+  if (MRB_RHASH_PROCDEFAULT_P(hash)) {
+    return RHASH_PROCDEFAULT(hash);
+  }
+  return mrb_nil_value();
+}
+
+/*
+ *  call-seq:
+ *     hsh.default_proc = proc_obj     -> proc_obj
+ *
+ *  Sets the default proc to be executed on each key lookup.
+ *
+ *     h.default_proc = proc do |hash, key|
+ *       hash[key] = key + key
+ *     end
+ *     h[2]       #=> 4
+ *     h["cat"]   #=> "catcat"
+ */
+
+static mrb_value
+mrb_hash_set_default_proc(mrb_state *mrb, mrb_value hash)
+{
+  mrb_value ifnone;
+
+  mrb_get_args(mrb, "o", &ifnone);
+  mrb_hash_modify(mrb, hash);
+  mrb_iv_set(mrb, hash, mrb_intern_lit(mrb, "ifnone"), ifnone);
+  RHASH(hash)->flags |= MRB_HASH_PROC_DEFAULT;
+
+  return ifnone;
+}
+
+MRB_API mrb_value
+mrb_hash_delete_key(mrb_state *mrb, mrb_value hash, mrb_value key)
+{
+  khash_t(ht) *h = RHASH_TBL(hash);
+  khiter_t k;
+  mrb_value delVal;
+  mrb_int n;
+
+  if (h) {
+    k = kh_get(ht, mrb, h, key);
+    if (k != kh_end(h)) {
+      delVal = kh_value(h, k).v;
+      n = kh_value(h, k).n;
+      kh_del(ht, mrb, h, k);
+      for (k = kh_begin(h); k != kh_end(h); k++) {
+        if (!kh_exist(h, k)) continue;
+        if (kh_value(h, k).n > n) kh_value(h, k).n--;
+      }
+      return delVal;
+    }
+  }
+
+  /* not found */
+  return mrb_nil_value();
+}
+
+/* 15.2.13.4.8  */
+/*
+ *  call-seq:
+ *     hsh.delete(key)                   -> value
+ *     hsh.delete(key) {| key | block }  -> value
+ *
+ *  Deletes and returns a key-value pair from <i>hsh</i> whose key is
+ *  equal to <i>key</i>. If the key is not found, returns the
+ *  <em>default value</em>. If the optional code block is given and the
+ *  key is not found, pass in the key and return the result of
+ *  <i>block</i>.
+ *
+ *     h = { "a" => 100, "b" => 200 }
+ *     h.delete("a")                              #=> 100
+ *     h.delete("z")                              #=> nil
+ *     h.delete("z") { |el| "#{el} not found" }   #=> "z not found"
+ *
+ */
+static mrb_value
+mrb_hash_delete(mrb_state *mrb, mrb_value self)
+{
+  mrb_value key;
+
+  mrb_get_args(mrb, "o", &key);
+  return mrb_hash_delete_key(mrb, self, key);
+}
+
+/* 15.2.13.4.24 */
+/*
+ *  call-seq:
+ *     hsh.shift -> anArray or obj
+ *
+ *  Removes a key-value pair from <i>hsh</i> and returns it as the
+ *  two-item array <code>[</code> <i>key, value</i> <code>]</code>, or
+ *  the hash's default value if the hash is empty.
+ *
+ *     h = { 1 => "a", 2 => "b", 3 => "c" }
+ *     h.shift   #=> [1, "a"]
+ *     h         #=> {2=>"b", 3=>"c"}
+ */
+
+static mrb_value
+mrb_hash_shift(mrb_state *mrb, mrb_value hash)
+{
+  khash_t(ht) *h = RHASH_TBL(hash);
+  khiter_t k;
+  mrb_value delKey, delVal;
+
+  mrb_hash_modify(mrb, hash);
+  if (h && kh_size(h) > 0) {
+    for (k = kh_begin(h); k != kh_end(h); k++) {
+      if (!kh_exist(h, k)) continue;
+
+      delKey = kh_key(h, k);
+      mrb_gc_protect(mrb, delKey);
+      delVal = mrb_hash_delete_key(mrb, hash, delKey);
+      mrb_gc_protect(mrb, delVal);
+
+      return mrb_assoc_new(mrb, delKey, delVal);
+    }
+  }
+
+  if (MRB_RHASH_PROCDEFAULT_P(hash)) {
+    return mrb_funcall(mrb, RHASH_PROCDEFAULT(hash), "call", 2, hash, mrb_nil_value());
+  }
+  else {
+    return RHASH_IFNONE(hash);
+  }
+}
+
+/* 15.2.13.4.4  */
+/*
+ *  call-seq:
+ *     hsh.clear -> hsh
+ *
+ *  Removes all key-value pairs from <i>hsh</i>.
+ *
+ *     h = { "a" => 100, "b" => 200 }   #=> {"a"=>100, "b"=>200}
+ *     h.clear                          #=> {}
+ *
+ */
+
+MRB_API mrb_value
+mrb_hash_clear(mrb_state *mrb, mrb_value hash)
+{
+  khash_t(ht) *h = RHASH_TBL(hash);
+
+  if (h) kh_clear(ht, mrb, h);
+  return hash;
+}
+
+/* 15.2.13.4.3  */
+/* 15.2.13.4.26 */
+/*
+ *  call-seq:
+ *     hsh[key] = value        -> value
+ *     hsh.store(key, value)   -> value
+ *
+ *  Element Assignment---Associates the value given by
+ *  <i>value</i> with the key given by <i>key</i>.
+ *  <i>key</i> should not have its value changed while it is in
+ *  use as a key (a <code>String</code> passed as a key will be
+ *  duplicated and frozen).
+ *
+ *     h = { "a" => 100, "b" => 200 }
+ *     h["a"] = 9
+ *     h["c"] = 4
+ *     h   #=> {"a"=>9, "b"=>200, "c"=>4}
+ *
+ */
+static mrb_value
+mrb_hash_aset(mrb_state *mrb, mrb_value self)
+{
+  mrb_value key, val;
+
+  mrb_get_args(mrb, "oo", &key, &val);
+  mrb_hash_set(mrb, self, key, val);
+  return val;
+}
+
+/* 15.2.13.4.20 */
+/* 15.2.13.4.25 */
+/*
+ *  call-seq:
+ *     hsh.length    ->  fixnum
+ *     hsh.size      ->  fixnum
+ *
+ *  Returns the number of key-value pairs in the hash.
+ *
+ *     h = { "d" => 100, "a" => 200, "v" => 300, "e" => 400 }
+ *     h.length        #=> 4
+ *     h.delete("a")   #=> 200
+ *     h.length        #=> 3
+ */
+static mrb_value
+mrb_hash_size_m(mrb_state *mrb, mrb_value self)
+{
+  khash_t(ht) *h = RHASH_TBL(self);
+
+  if (!h) return mrb_fixnum_value(0);
+  return mrb_fixnum_value(kh_size(h));
+}
+
+/* 15.2.13.4.12 */
+/*
+ *  call-seq:
+ *     hsh.empty?    -> true or false
+ *
+ *  Returns <code>true</code> if <i>hsh</i> contains no key-value pairs.
+ *
+ *     {}.empty?   #=> true
+ *
+ */
+MRB_API mrb_value
+mrb_hash_empty_p(mrb_state *mrb, mrb_value self)
+{
+  khash_t(ht) *h = RHASH_TBL(self);
+
+  if (h) return mrb_bool_value(kh_size(h) == 0);
+  return mrb_true_value();
+}
+
+/* 15.2.13.4.29 (x)*/
+/*
+ * call-seq:
+ *    hsh.to_hash   => hsh
+ *
+ * Returns +self+.
+ */
+
+static mrb_value
+mrb_hash_to_hash(mrb_state *mrb, mrb_value hash)
+{
+  return hash;
+}
+
+/* 15.2.13.4.19 */
+/*
+ *  call-seq:
+ *     hsh.keys    -> array
+ *
+ *  Returns a new array populated with the keys from this hash. See also
+ *  <code>Hash#values</code>.
+ *
+ *     h = { "a" => 100, "b" => 200, "c" => 300, "d" => 400 }
+ *     h.keys   #=> ["a", "b", "c", "d"]
+ *
+ */
+
+MRB_API mrb_value
+mrb_hash_keys(mrb_state *mrb, mrb_value hash)
+{
+  khash_t(ht) *h = RHASH_TBL(hash);
+  khiter_t k;
+  mrb_value ary;
+  mrb_value *p;
+
+  if (!h || kh_size(h) == 0) return mrb_ary_new(mrb);
+  ary = mrb_ary_new_capa(mrb, kh_size(h));
+  mrb_ary_set(mrb, ary, kh_size(h)-1, mrb_nil_value());
+  p = mrb_ary_ptr(ary)->ptr;
+  for (k = kh_begin(h); k != kh_end(h); k++) {
+    if (kh_exist(h, k)) {
+      mrb_value kv = kh_key(h, k);
+      mrb_hash_value hv = kh_value(h, k);
+
+      p[hv.n] = kv;
+    }
+  }
+  return ary;
+}
+
+/* 15.2.13.4.28 */
+/*
+ *  call-seq:
+ *     hsh.values    -> array
+ *
+ *  Returns a new array populated with the values from <i>hsh</i>. See
+ *  also <code>Hash#keys</code>.
+ *
+ *     h = { "a" => 100, "b" => 200, "c" => 300 }
+ *     h.values   #=> [100, 200, 300]
+ *
+ */
+
+static mrb_value
+mrb_hash_values(mrb_state *mrb, mrb_value hash)
+{
+  khash_t(ht) *h = RHASH_TBL(hash);
+  khiter_t k;
+  mrb_value ary;
+
+  if (!h) return mrb_ary_new(mrb);
+  ary = mrb_ary_new_capa(mrb, kh_size(h));
+  for (k = kh_begin(h); k != kh_end(h); k++) {
+    if (kh_exist(h, k)) {
+      mrb_hash_value hv = kh_value(h, k);
+
+      mrb_ary_set(mrb, ary, hv.n, hv.v);
+    }
+  }
+  return ary;
+}
+
+/* 15.2.13.4.13 */
+/* 15.2.13.4.15 */
+/* 15.2.13.4.18 */
+/* 15.2.13.4.21 */
+/*
+ *  call-seq:
+ *     hsh.has_key?(key)    -> true or false
+ *     hsh.include?(key)    -> true or false
+ *     hsh.key?(key)        -> true or false
+ *     hsh.member?(key)     -> true or false
+ *
+ *  Returns <code>true</code> if the given key is present in <i>hsh</i>.
+ *
+ *     h = { "a" => 100, "b" => 200 }
+ *     h.has_key?("a")   #=> true
+ *     h.has_key?("z")   #=> false
+ *
+ */
+
+static mrb_value
+mrb_hash_has_key(mrb_state *mrb, mrb_value hash)
+{
+  mrb_value key;
+  khash_t(ht) *h;
+  khiter_t k;
+
+  mrb_get_args(mrb, "o", &key);
+
+  h = RHASH_TBL(hash);
+  if (h) {
+    k = kh_get(ht, mrb, h, key);
+    return mrb_bool_value(k != kh_end(h));
+  }
+  return mrb_false_value();
+}
+
+/* 15.2.13.4.14 */
+/* 15.2.13.4.27 */
+/*
+ *  call-seq:
+ *     hsh.has_value?(value)    -> true or false
+ *     hsh.value?(value)        -> true or false
+ *
+ *  Returns <code>true</code> if the given value is present for some key
+ *  in <i>hsh</i>.
+ *
+ *     h = { "a" => 100, "b" => 200 }
+ *     h.has_value?(100)   #=> true
+ *     h.has_value?(999)   #=> false
+ */
+
+static mrb_value
+mrb_hash_has_value(mrb_state *mrb, mrb_value hash)
+{
+  mrb_value val;
+  khash_t(ht) *h;
+  khiter_t k;
+
+  mrb_get_args(mrb, "o", &val);
+  h = RHASH_TBL(hash);
+
+  if (h) {
+    for (k = kh_begin(h); k != kh_end(h); k++) {
+      if (!kh_exist(h, k)) continue;
+
+      if (mrb_equal(mrb, kh_value(h, k).v, val)) {
+        return mrb_true_value();
+      }
+    }
+  }
+  return mrb_false_value();
+}
+
+void
+mrb_init_hash(mrb_state *mrb)
+{
+  struct RClass *h;
+
+  h = mrb->hash_class = mrb_define_class(mrb, "Hash", mrb->object_class);              /* 15.2.13 */
+  MRB_SET_INSTANCE_TT(h, MRB_TT_HASH);
+
+  mrb_define_method(mrb, h, "[]",              mrb_hash_aget,        MRB_ARGS_REQ(1)); /* 15.2.13.4.2  */
+  mrb_define_method(mrb, h, "[]=",             mrb_hash_aset,        MRB_ARGS_REQ(2)); /* 15.2.13.4.3  */
+  mrb_define_method(mrb, h, "clear",           mrb_hash_clear,       MRB_ARGS_NONE()); /* 15.2.13.4.4  */
+  mrb_define_method(mrb, h, "default",         mrb_hash_default,     MRB_ARGS_ANY());  /* 15.2.13.4.5  */
+  mrb_define_method(mrb, h, "default=",        mrb_hash_set_default, MRB_ARGS_REQ(1)); /* 15.2.13.4.6  */
+  mrb_define_method(mrb, h, "default_proc",    mrb_hash_default_proc,MRB_ARGS_NONE()); /* 15.2.13.4.7  */
+  mrb_define_method(mrb, h, "default_proc=",   mrb_hash_set_default_proc,MRB_ARGS_REQ(1)); /* 15.2.13.4.7  */
+  mrb_define_method(mrb, h, "__delete",        mrb_hash_delete,      MRB_ARGS_REQ(1)); /* core of 15.2.13.4.8  */
+  mrb_define_method(mrb, h, "empty?",          mrb_hash_empty_p,     MRB_ARGS_NONE()); /* 15.2.13.4.12 */
+  mrb_define_method(mrb, h, "has_key?",        mrb_hash_has_key,     MRB_ARGS_REQ(1)); /* 15.2.13.4.13 */
+  mrb_define_method(mrb, h, "has_value?",      mrb_hash_has_value,   MRB_ARGS_REQ(1)); /* 15.2.13.4.14 */
+  mrb_define_method(mrb, h, "include?",        mrb_hash_has_key,     MRB_ARGS_REQ(1)); /* 15.2.13.4.15 */
+  mrb_define_method(mrb, h, "initialize",      mrb_hash_init,        MRB_ARGS_OPT(1)); /* 15.2.13.4.16 */
+  mrb_define_method(mrb, h, "key?",            mrb_hash_has_key,     MRB_ARGS_REQ(1)); /* 15.2.13.4.18 */
+  mrb_define_method(mrb, h, "keys",            mrb_hash_keys,        MRB_ARGS_NONE()); /* 15.2.13.4.19 */
+  mrb_define_method(mrb, h, "length",          mrb_hash_size_m,      MRB_ARGS_NONE()); /* 15.2.13.4.20 */
+  mrb_define_method(mrb, h, "member?",         mrb_hash_has_key,     MRB_ARGS_REQ(1)); /* 15.2.13.4.21 */
+  mrb_define_method(mrb, h, "shift",           mrb_hash_shift,       MRB_ARGS_NONE()); /* 15.2.13.4.24 */
+  mrb_define_method(mrb, h, "dup",             mrb_hash_dup,         MRB_ARGS_NONE());
+  mrb_define_method(mrb, h, "size",            mrb_hash_size_m,      MRB_ARGS_NONE()); /* 15.2.13.4.25 */
+  mrb_define_method(mrb, h, "store",           mrb_hash_aset,        MRB_ARGS_REQ(2)); /* 15.2.13.4.26 */
+  mrb_define_method(mrb, h, "value?",          mrb_hash_has_value,   MRB_ARGS_REQ(1)); /* 15.2.13.4.27 */
+  mrb_define_method(mrb, h, "values",          mrb_hash_values,      MRB_ARGS_NONE()); /* 15.2.13.4.28 */
+
+  mrb_define_method(mrb, h, "to_hash",         mrb_hash_to_hash,     MRB_ARGS_NONE()); /* 15.2.13.4.29 (x)*/
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/init.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,52 @@
+/*
+** init.c - initialize mruby core
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+
+void mrb_init_symtbl(mrb_state*);
+void mrb_init_class(mrb_state*);
+void mrb_init_object(mrb_state*);
+void mrb_init_kernel(mrb_state*);
+void mrb_init_comparable(mrb_state*);
+void mrb_init_enumerable(mrb_state*);
+void mrb_init_symbol(mrb_state*);
+void mrb_init_exception(mrb_state*);
+void mrb_init_proc(mrb_state*);
+void mrb_init_string(mrb_state*);
+void mrb_init_array(mrb_state*);
+void mrb_init_hash(mrb_state*);
+void mrb_init_numeric(mrb_state*);
+void mrb_init_range(mrb_state*);
+void mrb_init_gc(mrb_state*);
+void mrb_init_math(mrb_state*);
+void mrb_init_version(mrb_state*);
+void mrb_init_mrblib(mrb_state*);
+
+#define DONE mrb_gc_arena_restore(mrb, 0);
+void
+mrb_init_core(mrb_state *mrb)
+{
+  mrb_init_symtbl(mrb); DONE;
+
+  mrb_init_class(mrb); DONE;
+  mrb_init_object(mrb); DONE;
+  mrb_init_kernel(mrb); DONE;
+  mrb_init_comparable(mrb); DONE;
+  mrb_init_enumerable(mrb); DONE;
+
+  mrb_init_symbol(mrb); DONE;
+  mrb_init_exception(mrb); DONE;
+  mrb_init_proc(mrb); DONE;
+  mrb_init_string(mrb); DONE;
+  mrb_init_array(mrb); DONE;
+  mrb_init_hash(mrb); DONE;
+  mrb_init_numeric(mrb); DONE;
+  mrb_init_range(mrb); DONE;
+  mrb_init_gc(mrb); DONE;
+  mrb_init_version(mrb); DONE;
+  mrb_init_mrblib(mrb); DONE;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/kernel.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,1119 @@
+/*
+** kernel.c - Kernel module
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/class.h"
+#include "mruby/proc.h"
+#include "mruby/string.h"
+#include "mruby/variable.h"
+#include "mruby/error.h"
+
+typedef enum {
+  NOEX_PUBLIC    = 0x00,
+  NOEX_NOSUPER   = 0x01,
+  NOEX_PRIVATE   = 0x02,
+  NOEX_PROTECTED = 0x04,
+  NOEX_MASK      = 0x06,
+  NOEX_BASIC     = 0x08,
+  NOEX_UNDEF     = NOEX_NOSUPER,
+  NOEX_MODFUNC   = 0x12,
+  NOEX_SUPER     = 0x20,
+  NOEX_VCALL     = 0x40,
+  NOEX_RESPONDS  = 0x80
+} mrb_method_flag_t;
+
+static mrb_bool
+mrb_obj_basic_to_s_p(mrb_state *mrb, mrb_value obj)
+{
+  struct RProc *me = mrb_method_search(mrb, mrb_class(mrb, obj), mrb_intern_lit(mrb, "to_s"));
+  if (MRB_PROC_CFUNC_P(me) && (me->body.func == mrb_any_to_s))
+    return TRUE;
+  return FALSE;
+}
+
+/* 15.3.1.3.17 */
+/*
+ *  call-seq:
+ *     obj.inspect   -> string
+ *
+ *  Returns a string containing a human-readable representation of
+ *  <i>obj</i>. If not overridden and no instance variables, uses the
+ *  <code>to_s</code> method to generate the string.
+ *  <i>obj</i>.  If not overridden, uses the <code>to_s</code> method to
+ *  generate the string.
+ *
+ *     [ 1, 2, 3..4, 'five' ].inspect   #=> "[1, 2, 3..4, \"five\"]"
+ *     Time.new.inspect                 #=> "2008-03-08 19:43:39 +0900"
+ */
+MRB_API mrb_value
+mrb_obj_inspect(mrb_state *mrb, mrb_value obj)
+{
+  if ((mrb_type(obj) == MRB_TT_OBJECT) && mrb_obj_basic_to_s_p(mrb, obj)) {
+    return mrb_obj_iv_inspect(mrb, mrb_obj_ptr(obj));
+  }
+  return mrb_any_to_s(mrb, obj);
+}
+
+/* 15.3.1.3.1  */
+/* 15.3.1.3.10 */
+/* 15.3.1.3.11 */
+/*
+ *  call-seq:
+ *     obj == other        -> true or false
+ *     obj.equal?(other)   -> true or false
+ *     obj.eql?(other)     -> true or false
+ *
+ *  Equality---At the <code>Object</code> level, <code>==</code> returns
+ *  <code>true</code> only if <i>obj</i> and <i>other</i> are the
+ *  same object. Typically, this method is overridden in descendant
+ *  classes to provide class-specific meaning.
+ *
+ *  Unlike <code>==</code>, the <code>equal?</code> method should never be
+ *  overridden by subclasses: it is used to determine object identity
+ *  (that is, <code>a.equal?(b)</code> iff <code>a</code> is the same
+ *  object as <code>b</code>).
+ *
+ *  The <code>eql?</code> method returns <code>true</code> if
+ *  <i>obj</i> and <i>anObject</i> have the same value. Used by
+ *  <code>Hash</code> to test members for equality.  For objects of
+ *  class <code>Object</code>, <code>eql?</code> is synonymous with
+ *  <code>==</code>. Subclasses normally continue this tradition, but
+ *  there are exceptions. <code>Numeric</code> types, for example,
+ *  perform type conversion across <code>==</code>, but not across
+ *  <code>eql?</code>, so:
+ *
+ *     1 == 1.0     #=> true
+ *     1.eql? 1.0   #=> false
+ */
+static mrb_value
+mrb_obj_equal_m(mrb_state *mrb, mrb_value self)
+{
+  mrb_value arg;
+
+  mrb_get_args(mrb, "o", &arg);
+  return mrb_bool_value(mrb_obj_equal(mrb, self, arg));
+}
+
+static mrb_value
+mrb_obj_not_equal_m(mrb_state *mrb, mrb_value self)
+{
+  mrb_value arg;
+
+  mrb_get_args(mrb, "o", &arg);
+  return mrb_bool_value(!mrb_equal(mrb, self, arg));
+}
+
+/* 15.3.1.3.2  */
+/*
+ *  call-seq:
+ *     obj === other   -> true or false
+ *
+ *  Case Equality---For class <code>Object</code>, effectively the same
+ *  as calling  <code>#==</code>, but typically overridden by descendants
+ *  to provide meaningful semantics in <code>case</code> statements.
+ */
+static mrb_value
+mrb_equal_m(mrb_state *mrb, mrb_value self)
+{
+  mrb_value arg;
+
+  mrb_get_args(mrb, "o", &arg);
+  return mrb_bool_value(mrb_equal(mrb, self, arg));
+}
+
+/* 15.3.1.3.3  */
+/* 15.3.1.3.33 */
+/*
+ *  Document-method: __id__
+ *  Document-method: object_id
+ *
+ *  call-seq:
+ *     obj.__id__       -> fixnum
+ *     obj.object_id    -> fixnum
+ *
+ *  Returns an integer identifier for <i>obj</i>. The same number will
+ *  be returned on all calls to <code>id</code> for a given object, and
+ *  no two active objects will share an id.
+ *  <code>Object#object_id</code> is a different concept from the
+ *  <code>:name</code> notation, which returns the symbol id of
+ *  <code>name</code>. Replaces the deprecated <code>Object#id</code>.
+ */
+static mrb_value
+mrb_obj_id_m(mrb_state *mrb, mrb_value self)
+{
+  return mrb_fixnum_value(mrb_obj_id(self));
+}
+
+/* 15.3.1.2.2  */
+/* 15.3.1.2.5  */
+/* 15.3.1.3.6  */
+/* 15.3.1.3.25 */
+/*
+ *  call-seq:
+ *     block_given?   -> true or false
+ *     iterator?      -> true or false
+ *
+ *  Returns <code>true</code> if <code>yield</code> would execute a
+ *  block in the current context. The <code>iterator?</code> form
+ *  is mildly deprecated.
+ *
+ *     def try
+ *       if block_given?
+ *         yield
+ *       else
+ *         "no block"
+ *       end
+ *     end
+ *     try                  #=> "no block"
+ *     try { "hello" }      #=> "hello"
+ *     try do "hello" end   #=> "hello"
+ */
+static mrb_value
+mrb_f_block_given_p_m(mrb_state *mrb, mrb_value self)
+{
+  mrb_callinfo *ci = mrb->c->ci;
+  mrb_value *bp;
+  mrb_bool given_p;
+
+  bp = ci->stackent + 1;
+  ci--;
+  if (ci <= mrb->c->cibase) {
+    given_p = FALSE;
+  }
+  else {
+    /* block_given? called within block; check upper scope */
+    if (ci->proc->env && ci->proc->env->stack) {
+      given_p = !(ci->proc->env->stack == mrb->c->stbase ||
+                  mrb_nil_p(ci->proc->env->stack[1]));
+    }
+    else {
+      if (ci->argc > 0) {
+        bp += ci->argc;
+      }
+      given_p = !mrb_nil_p(*bp);
+    }
+  }
+
+  return mrb_bool_value(given_p);
+}
+
+/* 15.3.1.3.7  */
+/*
+ *  call-seq:
+ *     obj.class    -> class
+ *
+ *  Returns the class of <i>obj</i>. This method must always be
+ *  called with an explicit receiver, as <code>class</code> is also a
+ *  reserved word in Ruby.
+ *
+ *     1.class      #=> Fixnum
+ *     self.class   #=> Object
+ */
+static mrb_value
+mrb_obj_class_m(mrb_state *mrb, mrb_value self)
+{
+  return mrb_obj_value(mrb_obj_class(mrb, self));
+}
+
+static struct RClass*
+mrb_singleton_class_clone(mrb_state *mrb, mrb_value obj)
+{
+  struct RClass *klass = mrb_basic_ptr(obj)->c;
+
+  if (klass->tt != MRB_TT_SCLASS)
+    return klass;
+  else {
+    /* copy singleton(unnamed) class */
+    struct RClass *clone = (struct RClass*)mrb_obj_alloc(mrb, klass->tt, mrb->class_class);
+
+    if ((mrb_type(obj) == MRB_TT_CLASS) ||
+      (mrb_type(obj) == MRB_TT_SCLASS)) { /* BUILTIN_TYPE(obj) == T_CLASS */
+      clone->c = clone;
+    }
+    else {
+      clone->c = mrb_singleton_class_clone(mrb, mrb_obj_value(klass));
+    }
+
+    clone->super = klass->super;
+    if (klass->iv) {
+      mrb_iv_copy(mrb, mrb_obj_value(clone), mrb_obj_value(klass));
+      mrb_obj_iv_set(mrb, (struct RObject*)clone, mrb_intern_lit(mrb, "__attached__"), obj);
+    }
+    if (klass->mt) {
+      clone->mt = kh_copy(mt, mrb, klass->mt);
+    }
+    else {
+      clone->mt = kh_init(mt, mrb);
+    }
+    clone->tt = MRB_TT_SCLASS;
+    return clone;
+  }
+}
+
+static void
+copy_class(mrb_state *mrb, mrb_value dst, mrb_value src)
+{
+  struct RClass *dc = mrb_class_ptr(dst);
+  struct RClass *sc = mrb_class_ptr(src);
+  dc->mt = kh_copy(mt, mrb, sc->mt);
+  dc->super = sc->super;
+}
+
+static void
+init_copy(mrb_state *mrb, mrb_value dest, mrb_value obj)
+{
+  switch (mrb_type(obj)) {
+    case MRB_TT_CLASS:
+    case MRB_TT_MODULE:
+      copy_class(mrb, dest, obj);
+      /* fall through */
+    case MRB_TT_OBJECT:
+    case MRB_TT_SCLASS:
+    case MRB_TT_HASH:
+    case MRB_TT_DATA:
+    case MRB_TT_EXCEPTION:
+      mrb_iv_copy(mrb, dest, obj);
+      break;
+
+    default:
+      break;
+  }
+  mrb_funcall(mrb, dest, "initialize_copy", 1, obj);
+}
+
+/* 15.3.1.3.8  */
+/*
+ *  call-seq:
+ *     obj.clone -> an_object
+ *
+ *  Produces a shallow copy of <i>obj</i>---the instance variables of
+ *  <i>obj</i> are copied, but not the objects they reference. Copies
+ *  the frozen state of <i>obj</i>. See also the discussion
+ *  under <code>Object#dup</code>.
+ *
+ *     class Klass
+ *        attr_accessor :str
+ *     end
+ *     s1 = Klass.new      #=> #<Klass:0x401b3a38>
+ *     s1.str = "Hello"    #=> "Hello"
+ *     s2 = s1.clone       #=> #<Klass:0x401b3998 @str="Hello">
+ *     s2.str[1,4] = "i"   #=> "i"
+ *     s1.inspect          #=> "#<Klass:0x401b3a38 @str=\"Hi\">"
+ *     s2.inspect          #=> "#<Klass:0x401b3998 @str=\"Hi\">"
+ *
+ *  This method may have class-specific behavior.  If so, that
+ *  behavior will be documented under the #+initialize_copy+ method of
+ *  the class.
+ *
+ *  Some Class(True False Nil Symbol Fixnum Float) Object  cannot clone.
+ */
+MRB_API mrb_value
+mrb_obj_clone(mrb_state *mrb, mrb_value self)
+{
+  struct RObject *p;
+  mrb_value clone;
+
+  if (mrb_immediate_p(self)) {
+    mrb_raisef(mrb, E_TYPE_ERROR, "can't clone %S", self);
+  }
+  p = (struct RObject*)mrb_obj_alloc(mrb, mrb_type(self), mrb_obj_class(mrb, self));
+  p->c = mrb_singleton_class_clone(mrb, self);
+  clone = mrb_obj_value(p);
+  init_copy(mrb, clone, self);
+
+  return clone;
+}
+
+/* 15.3.1.3.9  */
+/*
+ *  call-seq:
+ *     obj.dup -> an_object
+ *
+ *  Produces a shallow copy of <i>obj</i>---the instance variables of
+ *  <i>obj</i> are copied, but not the objects they reference.
+ *  <code>dup</code> copies the frozen state of <i>obj</i>. See also
+ *  the discussion under <code>Object#clone</code>. In general,
+ *  <code>clone</code> and <code>dup</code> may have different semantics
+ *  in descendant classes. While <code>clone</code> is used to duplicate
+ *  an object, including its internal state, <code>dup</code> typically
+ *  uses the class of the descendant object to create the new instance.
+ *
+ *  This method may have class-specific behavior.  If so, that
+ *  behavior will be documented under the #+initialize_copy+ method of
+ *  the class.
+ */
+
+MRB_API mrb_value
+mrb_obj_dup(mrb_state *mrb, mrb_value obj)
+{
+  struct RBasic *p;
+  mrb_value dup;
+
+  if (mrb_immediate_p(obj)) {
+    mrb_raisef(mrb, E_TYPE_ERROR, "can't dup %S", obj);
+  }
+  p = mrb_obj_alloc(mrb, mrb_type(obj), mrb_obj_class(mrb, obj));
+  dup = mrb_obj_value(p);
+  init_copy(mrb, dup, obj);
+
+  return dup;
+}
+
+static mrb_value
+mrb_obj_extend(mrb_state *mrb, mrb_int argc, mrb_value *argv, mrb_value obj)
+{
+  mrb_int i;
+
+  if (argc == 0) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments (at least 1)");
+  }
+  for (i = 0; i < argc; i++) {
+    mrb_check_type(mrb, argv[i], MRB_TT_MODULE);
+  }
+  while (argc--) {
+    mrb_funcall(mrb, argv[argc], "extend_object", 1, obj);
+    mrb_funcall(mrb, argv[argc], "extended", 1, obj);
+  }
+  return obj;
+}
+
+/* 15.3.1.3.13 */
+/*
+ *  call-seq:
+ *     obj.extend(module, ...)    -> obj
+ *
+ *  Adds to _obj_ the instance methods from each module given as a
+ *  parameter.
+ *
+ *     module Mod
+ *       def hello
+ *         "Hello from Mod.\n"
+ *       end
+ *     end
+ *
+ *     class Klass
+ *       def hello
+ *         "Hello from Klass.\n"
+ *       end
+ *     end
+ *
+ *     k = Klass.new
+ *     k.hello         #=> "Hello from Klass.\n"
+ *     k.extend(Mod)   #=> #<Klass:0x401b3bc8>
+ *     k.hello         #=> "Hello from Mod.\n"
+ */
+static mrb_value
+mrb_obj_extend_m(mrb_state *mrb, mrb_value self)
+{
+  mrb_value *argv;
+  mrb_int argc;
+
+  mrb_get_args(mrb, "*", &argv, &argc);
+  return mrb_obj_extend(mrb, argc, argv, self);
+}
+
+/* 15.3.1.3.15 */
+/*
+ *  call-seq:
+ *     obj.hash    -> fixnum
+ *
+ *  Generates a <code>Fixnum</code> hash value for this object. This
+ *  function must have the property that <code>a.eql?(b)</code> implies
+ *  <code>a.hash == b.hash</code>. The hash value is used by class
+ *  <code>Hash</code>. Any hash value that exceeds the capacity of a
+ *  <code>Fixnum</code> will be truncated before being used.
+ */
+MRB_API mrb_value
+mrb_obj_hash(mrb_state *mrb, mrb_value self)
+{
+  return mrb_fixnum_value(mrb_obj_id(self));
+}
+
+/* 15.3.1.3.16 */
+static mrb_value
+mrb_obj_init_copy(mrb_state *mrb, mrb_value self)
+{
+  mrb_value orig;
+
+  mrb_get_args(mrb, "o", &orig);
+  if (mrb_obj_equal(mrb, self, orig)) return self;
+  if ((mrb_type(self) != mrb_type(orig)) || (mrb_obj_class(mrb, self) != mrb_obj_class(mrb, orig))) {
+      mrb_raise(mrb, E_TYPE_ERROR, "initialize_copy should take same class object");
+  }
+  return self;
+}
+
+
+/* implementation of instance_eval */
+mrb_value mrb_obj_instance_eval(mrb_state*, mrb_value);
+
+MRB_API mrb_bool
+mrb_obj_is_instance_of(mrb_state *mrb, mrb_value obj, struct RClass* c)
+{
+  if (mrb_obj_class(mrb, obj) == c) return TRUE;
+  return FALSE;
+}
+
+/* 15.3.1.3.19 */
+/*
+ *  call-seq:
+ *     obj.instance_of?(class)    -> true or false
+ *
+ *  Returns <code>true</code> if <i>obj</i> is an instance of the given
+ *  class. See also <code>Object#kind_of?</code>.
+ */
+static mrb_value
+obj_is_instance_of(mrb_state *mrb, mrb_value self)
+{
+  mrb_value arg;
+
+  mrb_get_args(mrb, "C", &arg);
+
+  return mrb_bool_value(mrb_obj_is_instance_of(mrb, self, mrb_class_ptr(arg)));
+}
+
+/* 15.3.1.3.20 */
+/*
+ *  call-seq:
+ *     obj.instance_variable_defined?(symbol)    -> true or false
+ *
+ *  Returns <code>true</code> if the given instance variable is
+ *  defined in <i>obj</i>.
+ *
+ *     class Fred
+ *       def initialize(p1, p2)
+ *         @a, @b = p1, p2
+ *       end
+ *     end
+ *     fred = Fred.new('cat', 99)
+ *     fred.instance_variable_defined?(:@a)    #=> true
+ *     fred.instance_variable_defined?("@b")   #=> true
+ *     fred.instance_variable_defined?("@c")   #=> false
+ */
+static mrb_value
+mrb_obj_ivar_defined(mrb_state *mrb, mrb_value self)
+{
+  mrb_sym sym;
+
+  mrb_get_args(mrb, "n", &sym);
+  mrb_iv_check(mrb, sym);
+  return mrb_bool_value(mrb_iv_defined(mrb, self, sym));
+}
+
+/* 15.3.1.3.21 */
+/*
+ *  call-seq:
+ *     obj.instance_variable_get(symbol)    -> obj
+ *
+ *  Returns the value of the given instance variable, or nil if the
+ *  instance variable is not set. The <code>@</code> part of the
+ *  variable name should be included for regular instance
+ *  variables. Throws a <code>NameError</code> exception if the
+ *  supplied symbol is not valid as an instance variable name.
+ *
+ *     class Fred
+ *       def initialize(p1, p2)
+ *         @a, @b = p1, p2
+ *       end
+ *     end
+ *     fred = Fred.new('cat', 99)
+ *     fred.instance_variable_get(:@a)    #=> "cat"
+ *     fred.instance_variable_get("@b")   #=> 99
+ */
+static mrb_value
+mrb_obj_ivar_get(mrb_state *mrb, mrb_value self)
+{
+  mrb_sym iv_name;
+
+  mrb_get_args(mrb, "n", &iv_name);
+  mrb_iv_check(mrb, iv_name);
+  return mrb_iv_get(mrb, self, iv_name);
+}
+
+/* 15.3.1.3.22 */
+/*
+ *  call-seq:
+ *     obj.instance_variable_set(symbol, obj)    -> obj
+ *
+ *  Sets the instance variable names by <i>symbol</i> to
+ *  <i>object</i>, thereby frustrating the efforts of the class's
+ *  author to attempt to provide proper encapsulation. The variable
+ *  did not have to exist prior to this call.
+ *
+ *     class Fred
+ *       def initialize(p1, p2)
+ *         @a, @b = p1, p2
+ *       end
+ *     end
+ *     fred = Fred.new('cat', 99)
+ *     fred.instance_variable_set(:@a, 'dog')   #=> "dog"
+ *     fred.instance_variable_set(:@c, 'cat')   #=> "cat"
+ *     fred.inspect                             #=> "#<Fred:0x401b3da8 @a=\"dog\", @b=99, @c=\"cat\">"
+ */
+static mrb_value
+mrb_obj_ivar_set(mrb_state *mrb, mrb_value self)
+{
+  mrb_sym iv_name;
+  mrb_value val;
+
+  mrb_get_args(mrb, "no", &iv_name, &val);
+  mrb_iv_check(mrb, iv_name);
+  mrb_iv_set(mrb, self, iv_name, val);
+  return val;
+}
+
+/* 15.3.1.3.24 */
+/* 15.3.1.3.26 */
+/*
+ *  call-seq:
+ *     obj.is_a?(class)       -> true or false
+ *     obj.kind_of?(class)    -> true or false
+ *
+ *  Returns <code>true</code> if <i>class</i> is the class of
+ *  <i>obj</i>, or if <i>class</i> is one of the superclasses of
+ *  <i>obj</i> or modules included in <i>obj</i>.
+ *
+ *     module M;    end
+ *     class A
+ *       include M
+ *     end
+ *     class B < A; end
+ *     class C < B; end
+ *     b = B.new
+ *     b.instance_of? A   #=> false
+ *     b.instance_of? B   #=> true
+ *     b.instance_of? C   #=> false
+ *     b.instance_of? M   #=> false
+ *     b.kind_of? A       #=> true
+ *     b.kind_of? B       #=> true
+ *     b.kind_of? C       #=> false
+ *     b.kind_of? M       #=> true
+ */
+static mrb_value
+mrb_obj_is_kind_of_m(mrb_state *mrb, mrb_value self)
+{
+  mrb_value arg;
+
+  mrb_get_args(mrb, "C", &arg);
+
+  return mrb_bool_value(mrb_obj_is_kind_of(mrb, self, mrb_class_ptr(arg)));
+}
+
+KHASH_DECLARE(st, mrb_sym, char, FALSE)
+KHASH_DEFINE(st, mrb_sym, char, FALSE, kh_int_hash_func, kh_int_hash_equal)
+
+static void
+method_entry_loop(mrb_state *mrb, struct RClass* klass, khash_t(st)* set)
+{
+  khint_t i;
+
+  khash_t(mt) *h = klass->mt;
+  if (!h) return;
+  for (i=0;i<kh_end(h);i++) {
+    if (kh_exist(h, i) && kh_value(h, i)) {
+      kh_put(st, mrb, set, kh_key(h, i));
+    }
+  }
+}
+
+mrb_value
+mrb_class_instance_method_list(mrb_state *mrb, mrb_bool recur, struct RClass* klass, int obj)
+{
+  khint_t i;
+  mrb_value ary;
+  struct RClass* oldklass;
+  khash_t(st)* set = kh_init(st, mrb);
+
+  oldklass = 0;
+  while (klass && (klass != oldklass)) {
+    method_entry_loop(mrb, klass, set);
+    if ((klass->tt == MRB_TT_ICLASS) ||
+        (klass->tt == MRB_TT_SCLASS)) {
+    }
+    else {
+      if (!recur) break;
+    }
+    oldklass = klass;
+    klass = klass->super;
+  }
+
+  ary = mrb_ary_new(mrb);
+  for (i=0;i<kh_end(set);i++) {
+    if (kh_exist(set, i)) {
+      mrb_ary_push(mrb, ary, mrb_symbol_value(kh_key(set, i)));
+    }
+  }
+  kh_destroy(st, mrb, set);
+
+  return ary;
+}
+
+static mrb_value
+mrb_obj_singleton_methods(mrb_state *mrb, mrb_bool recur, mrb_value obj)
+{
+  khint_t i;
+  mrb_value ary;
+  struct RClass* klass;
+  khash_t(st)* set = kh_init(st, mrb);
+
+  klass = mrb_class(mrb, obj);
+
+  if (klass && (klass->tt == MRB_TT_SCLASS)) {
+      method_entry_loop(mrb, klass, set);
+      klass = klass->super;
+  }
+  if (recur) {
+      while (klass && ((klass->tt == MRB_TT_SCLASS) || (klass->tt == MRB_TT_ICLASS))) {
+        method_entry_loop(mrb, klass, set);
+        klass = klass->super;
+      }
+  }
+
+  ary = mrb_ary_new(mrb);
+  for (i=0;i<kh_end(set);i++) {
+    if (kh_exist(set, i)) {
+      mrb_ary_push(mrb, ary, mrb_symbol_value(kh_key(set, i)));
+    }
+  }
+  kh_destroy(st, mrb, set);
+
+  return ary;
+}
+
+static mrb_value
+mrb_obj_methods(mrb_state *mrb, mrb_bool recur, mrb_value obj, mrb_method_flag_t flag)
+{
+  if (recur)
+    return mrb_class_instance_method_list(mrb, recur, mrb_class(mrb, obj), 0);
+  return mrb_obj_singleton_methods(mrb, recur, obj);
+}
+/* 15.3.1.3.31 */
+/*
+ *  call-seq:
+ *     obj.methods    -> array
+ *
+ *  Returns a list of the names of methods publicly accessible in
+ *  <i>obj</i>. This will include all the methods accessible in
+ *  <i>obj</i>'s ancestors.
+ *
+ *     class Klass
+ *       def kMethod()
+ *       end
+ *     end
+ *     k = Klass.new
+ *     k.methods[0..9]    #=> [:kMethod, :respond_to?, :nil?, :is_a?,
+ *                        #    :class, :instance_variable_set,
+ *                        #    :methods, :extend, :__send__, :instance_eval]
+ *     k.methods.length   #=> 42
+ */
+static mrb_value
+mrb_obj_methods_m(mrb_state *mrb, mrb_value self)
+{
+  mrb_bool recur = TRUE;
+  mrb_get_args(mrb, "|b", &recur);
+  return mrb_obj_methods(mrb, recur, self, (mrb_method_flag_t)0); /* everything but private */
+}
+
+/* 15.3.1.3.32 */
+/*
+ * call_seq:
+ *   nil.nil?               -> true
+ *   <anything_else>.nil?   -> false
+ *
+ * Only the object <i>nil</i> responds <code>true</code> to <code>nil?</code>.
+ */
+static mrb_value
+mrb_false(mrb_state *mrb, mrb_value self)
+{
+  return mrb_false_value();
+}
+
+/* 15.3.1.3.36 */
+/*
+ *  call-seq:
+ *     obj.private_methods(all=true)   -> array
+ *
+ *  Returns the list of private methods accessible to <i>obj</i>. If
+ *  the <i>all</i> parameter is set to <code>false</code>, only those methods
+ *  in the receiver will be listed.
+ */
+static mrb_value
+mrb_obj_private_methods(mrb_state *mrb, mrb_value self)
+{
+  mrb_bool recur = TRUE;
+  mrb_get_args(mrb, "|b", &recur);
+  return mrb_obj_methods(mrb, recur, self, NOEX_PRIVATE); /* private attribute not define */
+}
+
+/* 15.3.1.3.37 */
+/*
+ *  call-seq:
+ *     obj.protected_methods(all=true)   -> array
+ *
+ *  Returns the list of protected methods accessible to <i>obj</i>. If
+ *  the <i>all</i> parameter is set to <code>false</code>, only those methods
+ *  in the receiver will be listed.
+ */
+static mrb_value
+mrb_obj_protected_methods(mrb_state *mrb, mrb_value self)
+{
+  mrb_bool recur = TRUE;
+  mrb_get_args(mrb, "|b", &recur);
+  return mrb_obj_methods(mrb, recur, self, NOEX_PROTECTED); /* protected attribute not define */
+}
+
+/* 15.3.1.3.38 */
+/*
+ *  call-seq:
+ *     obj.public_methods(all=true)   -> array
+ *
+ *  Returns the list of public methods accessible to <i>obj</i>. If
+ *  the <i>all</i> parameter is set to <code>false</code>, only those methods
+ *  in the receiver will be listed.
+ */
+static mrb_value
+mrb_obj_public_methods(mrb_state *mrb, mrb_value self)
+{
+  mrb_bool recur = TRUE;
+  mrb_get_args(mrb, "|b", &recur);
+  return mrb_obj_methods(mrb, recur, self, NOEX_PUBLIC); /* public attribute not define */
+}
+
+/* 15.3.1.2.12  */
+/* 15.3.1.3.40 */
+/*
+ *  call-seq:
+ *     raise
+ *     raise(string)
+ *     raise(exception [, string])
+ *
+ *  With no arguments, raises a <code>RuntimeError</code>
+ *  With a single +String+ argument, raises a
+ *  +RuntimeError+ with the string as a message. Otherwise,
+ *  the first parameter should be the name of an +Exception+
+ *  class (or an object that returns an +Exception+ object when sent
+ *  an +exception+ message). The optional second parameter sets the
+ *  message associated with the exception, and the third parameter is an
+ *  array of callback information. Exceptions are caught by the
+ *  +rescue+ clause of <code>begin...end</code> blocks.
+ *
+ *     raise "Failed to create socket"
+ *     raise ArgumentError, "No parameters", caller
+ */
+MRB_API mrb_value
+mrb_f_raise(mrb_state *mrb, mrb_value self)
+{
+  mrb_value a[2], exc;
+  int argc;
+
+
+  argc = mrb_get_args(mrb, "|oo", &a[0], &a[1]);
+  switch (argc) {
+  case 0:
+    mrb_raise(mrb, E_RUNTIME_ERROR, "");
+    break;
+  case 1:
+    a[1] = mrb_check_string_type(mrb, a[0]);
+    if (!mrb_nil_p(a[1])) {
+      argc = 2;
+      a[0] = mrb_obj_value(E_RUNTIME_ERROR);
+    }
+    /* fall through */
+  default:
+    exc = mrb_make_exception(mrb, argc, a);
+    mrb_obj_iv_set(mrb, mrb_obj_ptr(exc), mrb_intern_lit(mrb, "lastpc"), mrb_cptr_value(mrb, mrb->c->ci->pc));
+    mrb_exc_raise(mrb, exc);
+    break;
+  }
+  return mrb_nil_value();            /* not reached */
+}
+
+/* 15.3.1.3.41 */
+/*
+ *  call-seq:
+ *     obj.remove_instance_variable(symbol)    -> obj
+ *
+ *  Removes the named instance variable from <i>obj</i>, returning that
+ *  variable's value.
+ *
+ *     class Dummy
+ *       attr_reader :var
+ *       def initialize
+ *         @var = 99
+ *       end
+ *       def remove
+ *         remove_instance_variable(:@var)
+ *       end
+ *     end
+ *     d = Dummy.new
+ *     d.var      #=> 99
+ *     d.remove   #=> 99
+ *     d.var      #=> nil
+ */
+static mrb_value
+mrb_obj_remove_instance_variable(mrb_state *mrb, mrb_value self)
+{
+  mrb_sym sym;
+  mrb_value val;
+
+  mrb_get_args(mrb, "n", &sym);
+  mrb_iv_check(mrb, sym);
+  val = mrb_iv_remove(mrb, self, sym);
+  if (mrb_undef_p(val)) {
+    mrb_name_error(mrb, sym, "instance variable %S not defined", mrb_sym2str(mrb, sym));
+  }
+  return val;
+}
+
+static inline mrb_bool
+basic_obj_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym id, int pub)
+{
+  return mrb_respond_to(mrb, obj, id);
+}
+/* 15.3.1.3.43 */
+/*
+ *  call-seq:
+ *     obj.respond_to?(symbol, include_private=false) -> true or false
+ *
+ *  Returns +true+ if _obj_ responds to the given
+ *  method. Private methods are included in the search only if the
+ *  optional second parameter evaluates to +true+.
+ *
+ *  If the method is not implemented,
+ *  as Process.fork on Windows, File.lchmod on GNU/Linux, etc.,
+ *  false is returned.
+ *
+ *  If the method is not defined, <code>respond_to_missing?</code>
+ *  method is called and the result is returned.
+ */
+static mrb_value
+obj_respond_to(mrb_state *mrb, mrb_value self)
+{
+  mrb_value mid;
+  mrb_sym id, rtm_id;
+  mrb_bool priv = FALSE, respond_to_p = TRUE;
+
+  mrb_get_args(mrb, "o|b", &mid, &priv);
+
+  if (mrb_symbol_p(mid)) {
+    id = mrb_symbol(mid);
+  }
+  else {
+    mrb_value tmp;
+    if (!mrb_string_p(mid)) {
+      tmp = mrb_check_string_type(mrb, mid);
+      if (mrb_nil_p(tmp)) {
+        tmp = mrb_inspect(mrb, mid);
+        mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a symbol", tmp);
+      }
+    }
+    tmp = mrb_check_intern_str(mrb, mid);
+    if (mrb_nil_p(tmp)) {
+      respond_to_p = FALSE;
+    }
+    else {
+      id = mrb_symbol(tmp);
+    }
+  }
+
+  if (respond_to_p) {
+    respond_to_p = basic_obj_respond_to(mrb, self, id, !priv);
+  }
+
+  if (!respond_to_p) {
+    rtm_id = mrb_intern_lit(mrb, "respond_to_missing?");
+    if (basic_obj_respond_to(mrb, self, rtm_id, !priv)) {
+      mrb_value args[2];
+      args[0] = mid;
+      args[1] = mrb_bool_value(priv);
+      return mrb_funcall_argv(mrb, self, rtm_id, 2, args);
+    }
+  }
+  return mrb_bool_value(respond_to_p);
+}
+
+/* 15.3.1.3.45 */
+/*
+ *  call-seq:
+ *     obj.singleton_methods(all=true)    -> array
+ *
+ *  Returns an array of the names of singleton methods for <i>obj</i>.
+ *  If the optional <i>all</i> parameter is true, the list will include
+ *  methods in modules included in <i>obj</i>.
+ *  Only public and protected singleton methods are returned.
+ *
+ *     module Other
+ *       def three() end
+ *     end
+ *
+ *     class Single
+ *       def Single.four() end
+ *     end
+ *
+ *     a = Single.new
+ *
+ *     def a.one()
+ *     end
+ *
+ *     class << a
+ *       include Other
+ *       def two()
+ *       end
+ *     end
+ *
+ *     Single.singleton_methods    #=> [:four]
+ *     a.singleton_methods(false)  #=> [:two, :one]
+ *     a.singleton_methods         #=> [:two, :one, :three]
+ */
+static mrb_value
+mrb_obj_singleton_methods_m(mrb_state *mrb, mrb_value self)
+{
+  mrb_bool recur = TRUE;
+  mrb_get_args(mrb, "|b", &recur);
+  return mrb_obj_singleton_methods(mrb, recur, self);
+}
+
+static mrb_value
+mod_define_singleton_method(mrb_state *mrb, mrb_value self)
+{
+  struct RProc *p;
+  mrb_sym mid;
+  mrb_value blk = mrb_nil_value();
+
+  mrb_get_args(mrb, "n&", &mid, &blk);
+  if (mrb_nil_p(blk)) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");
+  }
+  p = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb->proc_class);
+  mrb_proc_copy(p, mrb_proc_ptr(blk));
+  p->flags |= MRB_PROC_STRICT;
+  mrb_define_method_raw(mrb, mrb_class_ptr(mrb_singleton_class(mrb, self)), mid, p);
+  return mrb_symbol_value(mid);
+}
+
+static mrb_value
+mrb_obj_ceqq(mrb_state *mrb, mrb_value self)
+{
+  mrb_value v;
+  mrb_int i, len;
+  mrb_sym eqq = mrb_intern_lit(mrb, "===");
+  mrb_value ary = mrb_ary_splat(mrb, self);
+
+  mrb_get_args(mrb, "o", &v);
+  len = RARRAY_LEN(ary);
+  for (i=0; i<len; i++) {
+    mrb_value c = mrb_funcall_argv(mrb, mrb_ary_entry(ary, i), eqq, 1, &v);
+    if (mrb_test(c)) return mrb_true_value();
+  }
+  return mrb_false_value();
+}
+
+static mrb_value
+mrb_local_variables(mrb_state *mrb, mrb_value self)
+{
+  mrb_value ret;
+  struct RProc *proc;
+  struct mrb_irep *irep;
+  size_t i;
+
+  proc = mrb->c->ci[-1].proc;
+
+  if (MRB_PROC_CFUNC_P(proc)) {
+    return mrb_ary_new(mrb);
+  }
+
+  irep = proc->body.irep;
+  if (!irep->lv) {
+    return mrb_ary_new(mrb);
+  }
+  ret = mrb_ary_new_capa(mrb, irep->nlocals - 1);
+  for (i = 0; i + 1 < irep->nlocals; ++i) {
+    if (irep->lv[i].name) {
+      mrb_ary_push(mrb, ret, mrb_symbol_value(irep->lv[i].name));
+    }
+  }
+  if (proc->env) {
+    struct REnv *e = proc->env;
+
+    while (e) {
+      if (!MRB_PROC_CFUNC_P(mrb->c->cibase[e->cioff].proc)) {
+        irep = mrb->c->cibase[e->cioff].proc->body.irep;
+        if (irep->lv) {
+          for (i = 0; i + 1 < irep->nlocals; ++i) {
+            if (irep->lv[i].name) {
+              mrb_ary_push(mrb, ret, mrb_symbol_value(irep->lv[i].name));
+            }
+          }
+        }
+      }
+      e = (struct REnv*)e->c;
+    }
+  }
+
+  return ret;
+}
+
+void
+mrb_init_kernel(mrb_state *mrb)
+{
+  struct RClass *krn;
+
+  krn = mrb->kernel_module = mrb_define_module(mrb, "Kernel");                                                    /* 15.3.1 */
+  mrb_define_class_method(mrb, krn, "block_given?",         mrb_f_block_given_p_m,           MRB_ARGS_NONE());    /* 15.3.1.2.2  */
+  mrb_define_class_method(mrb, krn, "global_variables",     mrb_f_global_variables,          MRB_ARGS_NONE());    /* 15.3.1.2.4  */
+  mrb_define_class_method(mrb, krn, "iterator?",            mrb_f_block_given_p_m,           MRB_ARGS_NONE());    /* 15.3.1.2.5  */
+  mrb_define_class_method(mrb, krn, "local_variables",      mrb_local_variables,             MRB_ARGS_NONE());    /* 15.3.1.2.7  */
+;     /* 15.3.1.2.11 */
+  mrb_define_class_method(mrb, krn, "raise",                mrb_f_raise,                     MRB_ARGS_OPT(2));    /* 15.3.1.2.12 */
+
+  mrb_define_method(mrb, krn, "singleton_class",            mrb_singleton_class,             MRB_ARGS_NONE());
+
+  mrb_define_method(mrb, krn, "==",                         mrb_obj_equal_m,                 MRB_ARGS_REQ(1));    /* 15.3.1.3.1  */
+  mrb_define_method(mrb, krn, "!=",                         mrb_obj_not_equal_m,             MRB_ARGS_REQ(1));
+  mrb_define_method(mrb, krn, "===",                        mrb_equal_m,                     MRB_ARGS_REQ(1));    /* 15.3.1.3.2  */
+  mrb_define_method(mrb, krn, "__id__",                     mrb_obj_id_m,                    MRB_ARGS_NONE());    /* 15.3.1.3.3  */
+  mrb_define_method(mrb, krn, "__send__",                   mrb_f_send,                      MRB_ARGS_ANY());     /* 15.3.1.3.4  */
+  mrb_define_method(mrb, krn, "block_given?",               mrb_f_block_given_p_m,           MRB_ARGS_NONE());    /* 15.3.1.3.6  */
+  mrb_define_method(mrb, krn, "class",                      mrb_obj_class_m,                 MRB_ARGS_NONE());    /* 15.3.1.3.7  */
+  mrb_define_method(mrb, krn, "clone",                      mrb_obj_clone,                   MRB_ARGS_NONE());    /* 15.3.1.3.8  */
+  mrb_define_method(mrb, krn, "dup",                        mrb_obj_dup,                     MRB_ARGS_NONE());    /* 15.3.1.3.9  */
+  mrb_define_method(mrb, krn, "eql?",                       mrb_obj_equal_m,                 MRB_ARGS_REQ(1));    /* 15.3.1.3.10 */
+  mrb_define_method(mrb, krn, "equal?",                     mrb_obj_equal_m,                 MRB_ARGS_REQ(1));    /* 15.3.1.3.11 */
+  mrb_define_method(mrb, krn, "extend",                     mrb_obj_extend_m,                MRB_ARGS_ANY());     /* 15.3.1.3.13 */
+  mrb_define_method(mrb, krn, "global_variables",           mrb_f_global_variables,          MRB_ARGS_NONE());    /* 15.3.1.3.14 */
+  mrb_define_method(mrb, krn, "hash",                       mrb_obj_hash,                    MRB_ARGS_NONE());    /* 15.3.1.3.15 */
+  mrb_define_method(mrb, krn, "initialize_copy",            mrb_obj_init_copy,               MRB_ARGS_REQ(1));    /* 15.3.1.3.16 */
+  mrb_define_method(mrb, krn, "inspect",                    mrb_obj_inspect,                 MRB_ARGS_NONE());    /* 15.3.1.3.17 */
+  mrb_define_method(mrb, krn, "instance_eval",              mrb_obj_instance_eval,           MRB_ARGS_ANY());     /* 15.3.1.3.18 */
+  mrb_define_method(mrb, krn, "instance_of?",               obj_is_instance_of,              MRB_ARGS_REQ(1));    /* 15.3.1.3.19 */
+  mrb_define_method(mrb, krn, "instance_variable_defined?", mrb_obj_ivar_defined,            MRB_ARGS_REQ(1));    /* 15.3.1.3.20 */
+  mrb_define_method(mrb, krn, "instance_variable_get",      mrb_obj_ivar_get,                MRB_ARGS_REQ(1));    /* 15.3.1.3.21 */
+  mrb_define_method(mrb, krn, "instance_variable_set",      mrb_obj_ivar_set,                MRB_ARGS_REQ(2));    /* 15.3.1.3.22 */
+  mrb_define_method(mrb, krn, "instance_variables",         mrb_obj_instance_variables,      MRB_ARGS_NONE());    /* 15.3.1.3.23 */
+  mrb_define_method(mrb, krn, "is_a?",                      mrb_obj_is_kind_of_m,            MRB_ARGS_REQ(1));    /* 15.3.1.3.24 */
+  mrb_define_method(mrb, krn, "iterator?",                  mrb_f_block_given_p_m,           MRB_ARGS_NONE());    /* 15.3.1.3.25 */
+  mrb_define_method(mrb, krn, "kind_of?",                   mrb_obj_is_kind_of_m,            MRB_ARGS_REQ(1));    /* 15.3.1.3.26 */
+  mrb_define_method(mrb, krn, "local_variables",            mrb_local_variables,             MRB_ARGS_NONE());    /* 15.3.1.3.28 */
+  mrb_define_method(mrb, krn, "methods",                    mrb_obj_methods_m,               MRB_ARGS_OPT(1));    /* 15.3.1.3.31 */
+  mrb_define_method(mrb, krn, "nil?",                       mrb_false,                       MRB_ARGS_NONE());    /* 15.3.1.3.32 */
+  mrb_define_method(mrb, krn, "object_id",                  mrb_obj_id_m,                    MRB_ARGS_NONE());    /* 15.3.1.3.33 */
+  mrb_define_method(mrb, krn, "private_methods",            mrb_obj_private_methods,         MRB_ARGS_OPT(1));    /* 15.3.1.3.36 */
+  mrb_define_method(mrb, krn, "protected_methods",          mrb_obj_protected_methods,       MRB_ARGS_OPT(1));    /* 15.3.1.3.37 */
+  mrb_define_method(mrb, krn, "public_methods",             mrb_obj_public_methods,          MRB_ARGS_OPT(1));    /* 15.3.1.3.38 */
+  mrb_define_method(mrb, krn, "raise",                      mrb_f_raise,                     MRB_ARGS_ANY());     /* 15.3.1.3.40 */
+  mrb_define_method(mrb, krn, "remove_instance_variable",   mrb_obj_remove_instance_variable,MRB_ARGS_REQ(1));    /* 15.3.1.3.41 */
+  mrb_define_method(mrb, krn, "respond_to?",                obj_respond_to,                  MRB_ARGS_ANY());     /* 15.3.1.3.43 */
+  mrb_define_method(mrb, krn, "send",                       mrb_f_send,                      MRB_ARGS_ANY());     /* 15.3.1.3.44 */
+  mrb_define_method(mrb, krn, "singleton_methods",          mrb_obj_singleton_methods_m,     MRB_ARGS_OPT(1));    /* 15.3.1.3.45 */
+  mrb_define_method(mrb, krn, "define_singleton_method",    mod_define_singleton_method,     MRB_ARGS_ANY());
+  mrb_define_method(mrb, krn, "to_s",                       mrb_any_to_s,                    MRB_ARGS_NONE());    /* 15.3.1.3.46 */
+  mrb_define_method(mrb, krn, "__case_eqq",                 mrb_obj_ceqq,                    MRB_ARGS_REQ(1));    /* internal */
+
+  mrb_include_module(mrb, mrb->object_class, mrb->kernel_module);
+  mrb_alias_method(mrb, mrb->module_class, mrb_intern_lit(mrb, "dup"), mrb_intern_lit(mrb, "clone"));
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lex.def	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,213 @@
+/* ANSI-C code produced by gperf version 3.0.3 */
+/* Command-line: gperf -L ANSI-C -C -p -j1 -i 1 -g -o -t -N mrb_reserved_word -k'1,3,$' src/keywords  */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646.  */
+#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
+#endif
+
+#line 1 "src/keywords"
+
+struct kwtable {const char *name; int id[2]; enum mrb_lex_state_enum state;};
+const struct kwtable *mrb_reserved_word(const char *, unsigned int);
+static const struct kwtable *reserved_word(const char *, unsigned int);
+#define mrb_reserved_word(str, len) reserved_word(str, len)
+#line 8 "src/keywords"
+struct kwtable;
+
+#define TOTAL_KEYWORDS 40
+#define MIN_WORD_LENGTH 2
+#define MAX_WORD_LENGTH 12
+#define MIN_HASH_VALUE 8
+#define MAX_HASH_VALUE 50
+/* maximum key range = 43, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static unsigned int
+hash (register const char *str, register unsigned int len)
+{
+  static const unsigned char asso_values[] =
+    {
+      51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+      51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+      51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+      51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+      51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+      51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+      51, 51, 51, 51, 51, 51, 14, 51, 16,  8,
+      11, 13, 51, 51, 51, 51, 10, 51, 13, 51,
+      51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+      51, 51, 51, 51, 51, 11, 51, 13,  1, 26,
+       4,  1,  8, 28, 51, 23, 51,  1,  1, 27,
+       5, 19, 21, 51,  8,  3,  3, 11, 51, 21,
+      24, 16, 51, 51, 51, 51, 51, 51, 51, 51,
+      51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+      51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+      51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+      51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+      51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+      51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+      51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+      51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+      51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+      51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+      51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+      51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+      51, 51, 51, 51, 51, 51
+    };
+  register int hval = len;
+
+  switch (hval)
+    {
+      default:
+        hval += asso_values[(unsigned char)str[2]];
+      /*FALLTHROUGH*/
+      case 2:
+      case 1:
+        hval += asso_values[(unsigned char)str[0]];
+        break;
+    }
+  return hval + asso_values[(unsigned char)str[len - 1]];
+}
+
+#ifdef __GNUC__
+__inline
+#ifdef __GNUC_STDC_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
+#endif
+const struct kwtable *
+mrb_reserved_word (register const char *str, register unsigned int len)
+{
+  static const struct kwtable wordlist[] =
+    {
+      {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
+#line 18 "src/keywords"
+      {"break",        {keyword_break,       keyword_break},       EXPR_MID},
+#line 23 "src/keywords"
+      {"else",         {keyword_else,        keyword_else},        EXPR_BEG},
+#line 33 "src/keywords"
+      {"nil",          {keyword_nil,         keyword_nil},         EXPR_END},
+#line 26 "src/keywords"
+      {"ensure",       {keyword_ensure,      keyword_ensure},      EXPR_BEG},
+#line 25 "src/keywords"
+      {"end",          {keyword_end,         keyword_end},         EXPR_END},
+#line 42 "src/keywords"
+      {"then",         {keyword_then,        keyword_then},        EXPR_BEG},
+#line 34 "src/keywords"
+      {"not",          {keyword_not,         keyword_not},         EXPR_ARG},
+#line 27 "src/keywords"
+      {"false",        {keyword_false,       keyword_false},       EXPR_END},
+#line 40 "src/keywords"
+      {"self",         {keyword_self,        keyword_self},        EXPR_END},
+#line 24 "src/keywords"
+      {"elsif",        {keyword_elsif,       keyword_elsif},       EXPR_VALUE},
+#line 37 "src/keywords"
+      {"rescue",       {keyword_rescue,      modifier_rescue},     EXPR_MID},
+#line 43 "src/keywords"
+      {"true",         {keyword_true,        keyword_true},        EXPR_END},
+#line 46 "src/keywords"
+      {"until",        {keyword_until,       modifier_until},      EXPR_VALUE},
+#line 45 "src/keywords"
+      {"unless",       {keyword_unless,      modifier_unless},     EXPR_VALUE},
+#line 39 "src/keywords"
+      {"return",       {keyword_return,      keyword_return},      EXPR_MID},
+#line 21 "src/keywords"
+      {"def",          {keyword_def,         keyword_def},         EXPR_FNAME},
+#line 16 "src/keywords"
+      {"and",          {keyword_and,         keyword_and},         EXPR_VALUE},
+#line 22 "src/keywords"
+      {"do",           {keyword_do,          keyword_do},          EXPR_BEG},
+#line 49 "src/keywords"
+      {"yield",        {keyword_yield,       keyword_yield},       EXPR_ARG},
+#line 28 "src/keywords"
+      {"for",          {keyword_for,         keyword_for},         EXPR_VALUE},
+#line 44 "src/keywords"
+      {"undef",        {keyword_undef,       keyword_undef},       EXPR_FNAME},
+#line 35 "src/keywords"
+      {"or",           {keyword_or,          keyword_or},          EXPR_VALUE},
+#line 30 "src/keywords"
+      {"in",           {keyword_in,          keyword_in},          EXPR_VALUE},
+#line 47 "src/keywords"
+      {"when",         {keyword_when,        keyword_when},        EXPR_VALUE},
+#line 38 "src/keywords"
+      {"retry",        {keyword_retry,       keyword_retry},       EXPR_END},
+#line 29 "src/keywords"
+      {"if",           {keyword_if,          modifier_if},         EXPR_VALUE},
+#line 19 "src/keywords"
+      {"case",         {keyword_case,        keyword_case},        EXPR_VALUE},
+#line 36 "src/keywords"
+      {"redo",         {keyword_redo,        keyword_redo},        EXPR_END},
+#line 32 "src/keywords"
+      {"next",         {keyword_next,        keyword_next},        EXPR_MID},
+#line 41 "src/keywords"
+      {"super",        {keyword_super,       keyword_super},       EXPR_ARG},
+#line 31 "src/keywords"
+      {"module",       {keyword_module,      keyword_module},      EXPR_VALUE},
+#line 17 "src/keywords"
+      {"begin",        {keyword_begin,       keyword_begin},       EXPR_BEG},
+#line 12 "src/keywords"
+      {"__LINE__",     {keyword__LINE__,     keyword__LINE__},     EXPR_END},
+#line 11 "src/keywords"
+      {"__FILE__",     {keyword__FILE__,     keyword__FILE__},     EXPR_END},
+#line 10 "src/keywords"
+      {"__ENCODING__", {keyword__ENCODING__, keyword__ENCODING__}, EXPR_END},
+#line 14 "src/keywords"
+      {"END",          {keyword_END,         keyword_END},         EXPR_END},
+#line 15 "src/keywords"
+      {"alias",        {keyword_alias,       keyword_alias},       EXPR_FNAME},
+#line 13 "src/keywords"
+      {"BEGIN",        {keyword_BEGIN,       keyword_BEGIN},       EXPR_END},
+      {""},
+#line 20 "src/keywords"
+      {"class",        {keyword_class,       keyword_class},       EXPR_CLASS},
+      {""}, {""},
+#line 48 "src/keywords"
+      {"while",        {keyword_while,       modifier_while},      EXPR_VALUE}
+    };
+
+  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+    {
+      register int key = hash (str, len);
+
+      if (key <= MAX_HASH_VALUE && key >= 0)
+        {
+          register const char *s = wordlist[key].name;
+
+          if (*str == *s && !strcmp (str + 1, s + 1))
+            return &wordlist[key];
+        }
+    }
+  return 0;
+}
+#line 50 "src/keywords"
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/load.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,715 @@
+/*
+** load.c - mruby binary loader
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mruby/dump.h"
+#include "mruby/irep.h"
+#include "mruby/proc.h"
+#include "mruby/string.h"
+#include "mruby/debug.h"
+#include "mruby/error.h"
+
+#define FLAG_BYTEORDER_NATIVE 2
+#define FLAG_BYTEORDER_NONATIVE 0
+#define FLAG_SRC_MALLOC 1
+#define FLAG_SRC_STATIC 0
+
+#if !defined(_WIN32) && SIZE_MAX < UINT32_MAX
+# define SIZE_ERROR_MUL(x, y) ((x) > SIZE_MAX / (y))
+# define SIZE_ERROR(x) ((x) > SIZE_MAX)
+#else
+# define SIZE_ERROR_MUL(x, y) (0)
+# define SIZE_ERROR(x) (0)
+#endif
+
+#if UINT32_MAX > SIZE_MAX
+# error This code cannot be built on your environment.
+#endif
+
+static size_t
+skip_padding(const uint8_t *buf)
+{
+  const size_t align = MRB_DUMP_ALIGNMENT;
+  return -(intptr_t)buf & (align-1);
+}
+
+static size_t
+offset_crc_body(void)
+{
+  struct rite_binary_header header;
+  return ((uint8_t *)header.binary_crc - (uint8_t *)&header) + sizeof(header.binary_crc);
+}
+
+static mrb_irep*
+read_irep_record_1(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flags)
+{
+  size_t i;
+  const uint8_t *src = bin;
+  ptrdiff_t diff;
+  uint16_t tt, pool_data_len, snl;
+  size_t plen;
+  int ai = mrb_gc_arena_save(mrb);
+  mrb_irep *irep = mrb_add_irep(mrb);
+
+  /* skip record size */
+  src += sizeof(uint32_t);
+
+  /* number of local variable */
+  irep->nlocals = bin_to_uint16(src);
+  src += sizeof(uint16_t);
+
+  /* number of register variable */
+  irep->nregs = bin_to_uint16(src);
+  src += sizeof(uint16_t);
+
+  /* number of child irep */
+  irep->rlen = (size_t)bin_to_uint16(src);
+  src += sizeof(uint16_t);
+
+  /* Binary Data Section */
+  /* ISEQ BLOCK */
+  irep->ilen = (size_t)bin_to_uint32(src);
+  src += sizeof(uint32_t);
+  src += skip_padding(src);
+
+  if (irep->ilen > 0) {
+    if (SIZE_ERROR_MUL(sizeof(mrb_code), irep->ilen)) {
+      return NULL;
+    }
+    if ((flags & FLAG_SRC_MALLOC) == 0 &&
+        (flags & FLAG_BYTEORDER_NATIVE)) {
+      irep->iseq = (mrb_code*)src;
+      src += sizeof(uint32_t) * irep->ilen;
+      irep->flags |= MRB_ISEQ_NO_FREE;
+    }
+    else {
+      irep->iseq = (mrb_code *)mrb_malloc(mrb, sizeof(mrb_code) * irep->ilen);
+      if (flags & FLAG_BYTEORDER_NATIVE) {
+        memcpy(irep->iseq, src, sizeof(uint32_t) * irep->ilen);
+        src += sizeof(uint32_t) * irep->ilen;
+      }
+      else {
+        for (i = 0; i < irep->ilen; i++) {
+          irep->iseq[i] = (mrb_code)bin_to_uint32(src);     /* iseq */
+          src += sizeof(uint32_t);
+        }
+      }
+    }
+  }
+
+  /* POOL BLOCK */
+  plen = (size_t)bin_to_uint32(src); /* number of pool */
+  src += sizeof(uint32_t);
+  if (plen > 0) {
+    if (SIZE_ERROR_MUL(sizeof(mrb_value), plen)) {
+      return NULL;
+    }
+    irep->pool = (mrb_value*)mrb_malloc(mrb, sizeof(mrb_value) * plen);
+
+    for (i = 0; i < plen; i++) {
+      mrb_value s;
+
+      tt = *src++; /* pool TT */
+      pool_data_len = bin_to_uint16(src); /* pool data length */
+      src += sizeof(uint16_t);
+      if (flags & FLAG_SRC_MALLOC) {
+        s = mrb_str_new(mrb, (char *)src, pool_data_len);
+      }
+      else {
+        s = mrb_str_new_static(mrb, (char *)src, pool_data_len);
+      }
+      src += pool_data_len;
+      switch (tt) { /* pool data */
+      case IREP_TT_FIXNUM:
+        irep->pool[i] = mrb_str_to_inum(mrb, s, 10, FALSE);
+        break;
+
+      case IREP_TT_FLOAT:
+        irep->pool[i] = mrb_float_pool(mrb, mrb_str_to_dbl(mrb, s, FALSE));
+        break;
+
+      case IREP_TT_STRING:
+        irep->pool[i] = mrb_str_pool(mrb, s);
+        break;
+
+      default:
+        /* should not happen */
+        irep->pool[i] = mrb_nil_value();
+        break;
+      }
+      irep->plen++;
+      mrb_gc_arena_restore(mrb, ai);
+    }
+  }
+
+  /* SYMS BLOCK */
+  irep->slen = (size_t)bin_to_uint32(src);  /* syms length */
+  src += sizeof(uint32_t);
+  if (irep->slen > 0) {
+    if (SIZE_ERROR_MUL(sizeof(mrb_sym), irep->slen)) {
+      return NULL;
+    }
+    irep->syms = (mrb_sym *)mrb_malloc(mrb, sizeof(mrb_sym) * irep->slen);
+
+    for (i = 0; i < irep->slen; i++) {
+      snl = bin_to_uint16(src);               /* symbol name length */
+      src += sizeof(uint16_t);
+
+      if (snl == MRB_DUMP_NULL_SYM_LEN) {
+        irep->syms[i] = 0;
+        continue;
+      }
+
+      if (flags & FLAG_SRC_MALLOC) {
+        irep->syms[i] = mrb_intern(mrb, (char *)src, snl);
+      }
+      else {
+        irep->syms[i] = mrb_intern_static(mrb, (char *)src, snl);
+      }
+      src += snl + 1;
+
+      mrb_gc_arena_restore(mrb, ai);
+    }
+  }
+
+  irep->reps = (mrb_irep**)mrb_malloc(mrb, sizeof(mrb_irep*)*irep->rlen);
+
+  diff = src - bin;
+  mrb_assert_int_fit(ptrdiff_t, diff, size_t, SIZE_MAX);
+  *len = (size_t)diff;
+
+  return irep;
+}
+
+static mrb_irep*
+read_irep_record(mrb_state *mrb, const uint8_t *bin, size_t *len, uint8_t flags)
+{
+  mrb_irep *irep = read_irep_record_1(mrb, bin, len, flags);
+  size_t i;
+
+  if (irep == NULL) {
+    return NULL;
+  }
+
+  bin += *len;
+  for (i=0; i<irep->rlen; i++) {
+    size_t rlen;
+
+    irep->reps[i] = read_irep_record(mrb, bin, &rlen, flags);
+    if (irep->reps[i] == NULL) {
+      return NULL;
+    }
+    bin += rlen;
+    *len += rlen;
+  }
+  return irep;
+}
+
+static mrb_irep*
+read_section_irep(mrb_state *mrb, const uint8_t *bin, uint8_t flags)
+{
+  size_t len;
+
+  bin += sizeof(struct rite_section_irep_header);
+  return read_irep_record(mrb, bin, &len, flags);
+}
+
+static int
+read_lineno_record_1(mrb_state *mrb, const uint8_t *bin, mrb_irep *irep, size_t *len)
+{
+  size_t i, fname_len, niseq;
+  char *fname;
+  uint16_t *lines;
+
+  *len = 0;
+  bin += sizeof(uint32_t); /* record size */
+  *len += sizeof(uint32_t);
+  fname_len = bin_to_uint16(bin);
+  bin += sizeof(uint16_t);
+  *len += sizeof(uint16_t);
+  if (SIZE_ERROR(fname_len + 1)) {
+    return MRB_DUMP_GENERAL_FAILURE;
+  }
+  fname = (char *)mrb_malloc(mrb, fname_len + 1);
+  memcpy(fname, bin, fname_len);
+  fname[fname_len] = '\0';
+  bin += fname_len;
+  *len += fname_len;
+
+  niseq = (size_t)bin_to_uint32(bin);
+  bin += sizeof(uint32_t); /* niseq */
+  *len += sizeof(uint32_t);
+
+  if (SIZE_ERROR_MUL(niseq, sizeof(uint16_t))) {
+    return MRB_DUMP_GENERAL_FAILURE;
+  }
+  lines = (uint16_t *)mrb_malloc(mrb, niseq * sizeof(uint16_t));
+  for (i = 0; i < niseq; i++) {
+    lines[i] = bin_to_uint16(bin);
+    bin += sizeof(uint16_t); /* niseq */
+    *len += sizeof(uint16_t);
+  }
+
+  irep->filename = fname;
+  irep->lines = lines;
+  return MRB_DUMP_OK;
+}
+
+static int
+read_lineno_record(mrb_state *mrb, const uint8_t *bin, mrb_irep *irep, size_t *lenp)
+{
+  int result = read_lineno_record_1(mrb, bin, irep, lenp);
+  size_t i;
+
+  if (result != MRB_DUMP_OK) return result;
+  for (i = 0; i < irep->rlen; i++) {
+    size_t len;
+
+    result = read_lineno_record(mrb, bin, irep->reps[i], &len);
+    if (result != MRB_DUMP_OK) break;
+    bin += len;
+    *lenp += len;
+  }
+  return result;
+}
+
+static int
+read_section_lineno(mrb_state *mrb, const uint8_t *bin, mrb_irep *irep)
+{
+  size_t len;
+
+  len = 0;
+  bin += sizeof(struct rite_section_lineno_header);
+
+  /* Read Binary Data Section */
+  return read_lineno_record(mrb, bin, irep, &len);
+}
+
+static int
+read_debug_record(mrb_state *mrb, const uint8_t *start, mrb_irep* irep, size_t *record_len, const mrb_sym *filenames, size_t filenames_len)
+{
+  const uint8_t *bin = start;
+  ptrdiff_t diff;
+  size_t record_size, i;
+  uint16_t f_idx;
+
+  if (irep->debug_info) { return MRB_DUMP_INVALID_IREP; }
+
+  irep->debug_info = (mrb_irep_debug_info*)mrb_malloc(mrb, sizeof(mrb_irep_debug_info));
+  irep->debug_info->pc_count = irep->ilen;
+
+  record_size = (size_t)bin_to_uint32(bin);
+  bin += sizeof(uint32_t);
+
+  irep->debug_info->flen = bin_to_uint16(bin);
+  irep->debug_info->files = (mrb_irep_debug_info_file**)mrb_malloc(mrb, sizeof(mrb_irep_debug_info*) * irep->debug_info->flen);
+  bin += sizeof(uint16_t);
+
+  for (f_idx = 0; f_idx < irep->debug_info->flen; ++f_idx) {
+    mrb_irep_debug_info_file *file;
+    uint16_t filename_idx;
+    mrb_int len;
+
+    file = (mrb_irep_debug_info_file *)mrb_malloc(mrb, sizeof(*file));
+    irep->debug_info->files[f_idx] = file;
+
+    file->start_pos = bin_to_uint32(bin);
+    bin += sizeof(uint32_t);
+
+    /* filename */
+    filename_idx = bin_to_uint16(bin);
+    bin += sizeof(uint16_t);
+    mrb_assert(filename_idx < filenames_len);
+    file->filename_sym = filenames[filename_idx];
+    len = 0;
+    file->filename = mrb_sym2name_len(mrb, file->filename_sym, &len);
+
+    file->line_entry_count = bin_to_uint32(bin);
+    bin += sizeof(uint32_t);
+    file->line_type = (mrb_debug_line_type)bin_to_uint8(bin);
+    bin += sizeof(uint8_t);
+    switch (file->line_type) {
+      case mrb_debug_line_ary: {
+        uint32_t l;
+
+        file->lines.ary = (uint16_t *)mrb_malloc(mrb, sizeof(uint16_t) * (size_t)(file->line_entry_count));
+        for (l = 0; l < file->line_entry_count; ++l) {
+          file->lines.ary[l] = bin_to_uint16(bin);
+          bin += sizeof(uint16_t);
+        }
+      } break;
+
+      case mrb_debug_line_flat_map: {
+        uint32_t l;
+
+        file->lines.flat_map = (mrb_irep_debug_info_line*)mrb_malloc(
+            mrb, sizeof(mrb_irep_debug_info_line) * (size_t)(file->line_entry_count));
+        for (l = 0; l < file->line_entry_count; ++l) {
+          file->lines.flat_map[l].start_pos = bin_to_uint32(bin);
+          bin += sizeof(uint32_t);
+          file->lines.flat_map[l].line = bin_to_uint16(bin);
+          bin += sizeof(uint16_t);
+        }
+      } break;
+
+      default: return MRB_DUMP_GENERAL_FAILURE;
+    }
+  }
+
+  diff = bin - start;
+  mrb_assert_int_fit(ptrdiff_t, diff, size_t, SIZE_MAX);
+
+  if (record_size != (size_t)diff) {
+    return MRB_DUMP_GENERAL_FAILURE;
+  }
+
+  for (i = 0; i < irep->rlen; i++) {
+    size_t len;
+    int ret;
+
+    ret = read_debug_record(mrb, bin, irep->reps[i], &len, filenames, filenames_len);
+    if (ret != MRB_DUMP_OK) return ret;
+    bin += len;
+  }
+
+  diff = bin - start;
+  mrb_assert_int_fit(ptrdiff_t, diff, size_t, SIZE_MAX);
+  *record_len = (size_t)diff;
+
+  return MRB_DUMP_OK;
+}
+
+static int
+read_section_debug(mrb_state *mrb, const uint8_t *start, mrb_irep *irep, uint8_t flags)
+{
+  const uint8_t *bin;
+  ptrdiff_t diff;
+  struct rite_section_debug_header *header;
+  uint16_t i;
+  size_t len = 0;
+  int result;
+  uint16_t filenames_len;
+  mrb_sym *filenames;
+
+  bin = start;
+  header = (struct rite_section_debug_header *)bin;
+  bin += sizeof(struct rite_section_debug_header);
+
+  filenames_len = bin_to_uint16(bin);
+  bin += sizeof(uint16_t);
+  filenames = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym) * (size_t)filenames_len);
+  for (i = 0; i < filenames_len; ++i) {
+    uint16_t f_len = bin_to_uint16(bin);
+    bin += sizeof(uint16_t);
+    if (flags & FLAG_SRC_MALLOC) {
+      filenames[i] = mrb_intern(mrb, (const char *)bin, (size_t)f_len);
+    }
+    else {
+      filenames[i] = mrb_intern_static(mrb, (const char *)bin, (size_t)f_len);
+    }
+    bin += f_len;
+  }
+
+  result = read_debug_record(mrb, bin, irep, &len, filenames, filenames_len);
+  if (result != MRB_DUMP_OK) goto debug_exit;
+
+  bin += len;
+  diff = bin - start;
+  mrb_assert_int_fit(ptrdiff_t, diff, size_t, SIZE_MAX);
+  if ((uint32_t)diff != bin_to_uint32(header->section_size)) {
+    result = MRB_DUMP_GENERAL_FAILURE;
+  }
+
+debug_exit:
+  mrb_free(mrb, filenames);
+  return result;
+}
+
+static int
+read_lv_record(mrb_state *mrb, const uint8_t *start, mrb_irep *irep, size_t *record_len, mrb_sym const *syms, uint32_t syms_len)
+{
+  const uint8_t *bin = start;
+  size_t i;
+  ptrdiff_t diff;
+
+  irep->lv = (struct mrb_locals*)mrb_malloc(mrb, sizeof(struct mrb_locals) * (irep->nlocals - 1));
+
+  for (i = 0; i + 1< irep->nlocals; ++i) {
+    uint16_t const sym_idx = bin_to_uint16(bin);
+    bin += sizeof(uint16_t);
+    if (sym_idx == RITE_LV_NULL_MARK) {
+      irep->lv[i].name = 0;
+      irep->lv[i].r = 0;
+    }
+    else {
+      if (sym_idx >= syms_len) {
+        return MRB_DUMP_GENERAL_FAILURE;
+      }
+      irep->lv[i].name = syms[sym_idx];
+
+      irep->lv[i].r = bin_to_uint16(bin);
+    }
+    bin += sizeof(uint16_t);
+  }
+
+  for (i = 0; i < irep->rlen; ++i) {
+    size_t len;
+    int ret;
+
+    ret = read_lv_record(mrb, bin, irep->reps[i], &len, syms, syms_len);
+    if (ret != MRB_DUMP_OK) return ret;
+    bin += len;
+  }
+
+  diff = bin - start;
+  mrb_assert_int_fit(ptrdiff_t, diff, size_t, SIZE_MAX);
+  *record_len = (size_t)diff;
+
+  return MRB_DUMP_OK;
+}
+
+static int
+read_section_lv(mrb_state *mrb, const uint8_t *start, mrb_irep *irep, uint8_t flags)
+{
+  const uint8_t *bin;
+  ptrdiff_t diff;
+  struct rite_section_lv_header const *header;
+  uint32_t i;
+  size_t len = 0;
+  int result;
+  uint32_t syms_len;
+  mrb_sym *syms;
+  mrb_sym (*intern_func)(mrb_state*, const char*, size_t) =
+    (flags & FLAG_SRC_MALLOC)? mrb_intern : mrb_intern_static;
+
+  bin = start;
+  header = (struct rite_section_lv_header const*)bin;
+  bin += sizeof(struct rite_section_lv_header);
+
+  syms_len = bin_to_uint32(bin);
+  bin += sizeof(uint32_t);
+  syms = (mrb_sym*)mrb_malloc(mrb, sizeof(mrb_sym) * (size_t)syms_len);
+  for (i = 0; i < syms_len; ++i) {
+    uint16_t const str_len = bin_to_uint16(bin);
+    bin += sizeof(uint16_t);
+
+    syms[i] = intern_func(mrb, (const char*)bin, str_len);
+    bin += str_len;
+  }
+
+  result = read_lv_record(mrb, bin, irep, &len, syms, syms_len);
+  if (result != MRB_DUMP_OK) goto lv_exit;
+
+  bin += len;
+  diff = bin - start;
+  mrb_assert_int_fit(ptrdiff_t, diff, size_t, SIZE_MAX);
+  if ((uint32_t)diff != bin_to_uint32(header->section_size)) {
+    result = MRB_DUMP_GENERAL_FAILURE;
+  }
+
+lv_exit:
+  mrb_free(mrb, syms);
+  return result;
+}
+
+static int
+read_binary_header(const uint8_t *bin, size_t *bin_size, uint16_t *crc, uint8_t *flags)
+{
+  const struct rite_binary_header *header = (const struct rite_binary_header *)bin;
+  uint32_t ident = 0;
+  size_t i;
+
+  /* create native byteorder version of RITE_BINARY_IDENTIFIER */
+  for(i=0; i<sizeof(ident); i++) {
+    ident<<=8;
+    ident|=RITE_BINARY_IDENTIFIER[i];
+  }
+  if (memcmp(header->binary_identify, &ident, sizeof(header->binary_identify)) == 0) {
+    *flags |= FLAG_BYTEORDER_NATIVE;
+  }
+  else if (memcmp(header->binary_identify, RITE_BINARY_IDENTIFIER, sizeof(header->binary_identify)) != 0) {
+    return MRB_DUMP_INVALID_FILE_HEADER;
+  }
+
+  if (memcmp(header->binary_version, RITE_BINARY_FORMAT_VER, sizeof(header->binary_version)) != 0) {
+    return MRB_DUMP_INVALID_FILE_HEADER;
+  }
+
+  if (crc) {
+    *crc = bin_to_uint16(header->binary_crc);
+  }
+  *bin_size = (size_t)bin_to_uint32(header->binary_size);
+
+  return MRB_DUMP_OK;
+}
+
+MRB_API mrb_irep*
+read_irep(mrb_state *mrb, const uint8_t *bin, uint8_t flags)
+{
+  int result;
+  mrb_irep *irep = NULL;
+  const struct rite_section_header *section_header;
+  uint16_t crc;
+  size_t bin_size = 0;
+  size_t n;
+
+  if ((mrb == NULL) || (bin == NULL)) {
+    return NULL;
+  }
+
+  result = read_binary_header(bin, &bin_size, &crc, &flags);
+  if (result != MRB_DUMP_OK) {
+    return NULL;
+  }
+
+  n = offset_crc_body();
+  if (crc != calc_crc_16_ccitt(bin + n, bin_size - n, 0)) {
+    return NULL;
+  }
+
+  bin += sizeof(struct rite_binary_header);
+  do {
+    section_header = (const struct rite_section_header *)bin;
+    if (memcmp(section_header->section_identify, RITE_SECTION_IREP_IDENTIFIER, sizeof(section_header->section_identify)) == 0) {
+      irep = read_section_irep(mrb, bin, flags);
+      if (!irep) return NULL;
+    }
+    else if (memcmp(section_header->section_identify, RITE_SECTION_LINENO_IDENTIFIER, sizeof(section_header->section_identify)) == 0) {
+      if (!irep) return NULL;   /* corrupted data */
+      result = read_section_lineno(mrb, bin, irep);
+      if (result < MRB_DUMP_OK) {
+        return NULL;
+      }
+    }
+    else if (memcmp(section_header->section_identify, RITE_SECTION_DEBUG_IDENTIFIER, sizeof(section_header->section_identify)) == 0) {
+      if (!irep) return NULL;   /* corrupted data */
+      result = read_section_debug(mrb, bin, irep, flags);
+      if (result < MRB_DUMP_OK) {
+        return NULL;
+      }
+    }
+    else if (memcmp(section_header->section_identify, RITE_SECTION_LV_IDENTIFIER, sizeof(section_header->section_identify)) == 0) {
+      if (!irep) return NULL;
+      result = read_section_lv(mrb, bin, irep, flags);
+      if (result < MRB_DUMP_OK) {
+        return NULL;
+      }
+    }
+    bin += bin_to_uint32(section_header->section_size);
+  } while (memcmp(section_header->section_identify, RITE_BINARY_EOF, sizeof(section_header->section_identify)) != 0);
+
+  return irep;
+}
+
+MRB_API mrb_irep*
+mrb_read_irep(mrb_state *mrb, const uint8_t *bin)
+{
+#ifdef MRB_USE_ETEXT_EDATA
+  uint8_t flags = mrb_ro_data_p((char*)bin) ? FLAG_SRC_STATIC : FLAG_SRC_MALLOC;
+#else
+  uint8_t flags = FLAG_SRC_STATIC;
+#endif
+
+  return read_irep(mrb, bin, flags);
+}
+
+static void
+irep_error(mrb_state *mrb)
+{
+  mrb->exc = mrb_obj_ptr(mrb_exc_new_str_lit(mrb, E_SCRIPT_ERROR, "irep load error"));
+}
+
+MRB_API mrb_value
+mrb_load_irep_cxt(mrb_state *mrb, const uint8_t *bin, mrbc_context *c)
+{
+  mrb_irep *irep = mrb_read_irep(mrb, bin);
+  struct RProc *proc;
+
+  if (!irep) {
+    irep_error(mrb);
+    return mrb_nil_value();
+  }
+  proc = mrb_proc_new(mrb, irep);
+  mrb_irep_decref(mrb, irep);
+  if (c && c->no_exec) return mrb_obj_value(proc);
+  return mrb_toplevel_run(mrb, proc);
+}
+
+MRB_API mrb_value
+mrb_load_irep(mrb_state *mrb, const uint8_t *bin)
+{
+  return mrb_load_irep_cxt(mrb, bin, NULL);
+}
+
+#ifdef ENABLE_STDIO
+
+MRB_API mrb_irep*
+mrb_read_irep_file(mrb_state *mrb, FILE* fp)
+{
+  mrb_irep *irep = NULL;
+  uint8_t *buf;
+  const size_t header_size = sizeof(struct rite_binary_header);
+  size_t buf_size = 0;
+  uint8_t flags;
+  int result;
+
+  if ((mrb == NULL) || (fp == NULL)) {
+    return NULL;
+  }
+
+  /* You don't need use SIZE_ERROR as buf_size is enough small. */
+  buf = (uint8_t*)mrb_malloc(mrb, header_size);
+  if (fread(buf, header_size, 1, fp) == 0) {
+    mrb_free(mrb, buf);
+    return NULL;
+  }
+  result = read_binary_header(buf, &buf_size, NULL, &flags);
+  if (result != MRB_DUMP_OK) {
+    mrb_free(mrb, buf);
+    return NULL;
+  }
+
+  buf = (uint8_t*)mrb_realloc(mrb, buf, buf_size);
+  if (fread(buf+header_size, buf_size-header_size, 1, fp) == 0) {
+    mrb_free(mrb, buf);
+    return NULL;
+  }
+  irep = read_irep(mrb, buf, FLAG_SRC_MALLOC);
+  mrb_free(mrb, buf);
+
+  return irep;
+}
+
+void mrb_codedump_all(mrb_state*, struct RProc*);
+
+MRB_API mrb_value
+mrb_load_irep_file_cxt(mrb_state *mrb, FILE* fp, mrbc_context *c)
+{
+  mrb_irep *irep = mrb_read_irep_file(mrb, fp);
+  mrb_value val;
+  struct RProc *proc;
+
+  if (!irep) {
+    irep_error(mrb);
+    return mrb_nil_value();
+  }
+  proc = mrb_proc_new(mrb, irep);
+  mrb_irep_decref(mrb, irep);
+  if (c && c->dump_result) mrb_codedump_all(mrb, proc);
+  if (c && c->no_exec) return mrb_obj_value(proc);
+  val = mrb_toplevel_run(mrb, proc);
+  return val;
+}
+
+MRB_API mrb_value
+mrb_load_irep_file(mrb_state *mrb, FILE* fp)
+{
+  return mrb_load_irep_file_cxt(mrb, fp, NULL);
+}
+#endif /* ENABLE_STDIO */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mrb_throw.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,42 @@
+/*
+** mrb_throw.h - mruby exception throwing handler
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef MRB_THROW_H
+#define MRB_THROW_H
+
+#ifdef MRB_ENABLE_CXX_EXCEPTION
+
+#define MRB_TRY(buf) do { try {
+#define MRB_CATCH(buf) } catch(mrb_jmpbuf_impl e) { if (e != (buf)->impl) { throw e; }
+#define MRB_END_EXC(buf)  } } while(0)
+
+#define MRB_THROW(buf) throw((buf)->impl)
+typedef mrb_int mrb_jmpbuf_impl;
+
+#else
+
+#include <setjmp.h>
+
+#define MRB_TRY(buf) do { if (setjmp((buf)->impl) == 0) {
+#define MRB_CATCH(buf) } else {
+#define MRB_END_EXC(buf) } } while(0)
+
+#define MRB_THROW(buf) longjmp((buf)->impl, 1);
+#define mrb_jmpbuf_impl jmp_buf
+
+#endif
+
+struct mrb_jmpbuf {
+  mrb_jmpbuf_impl impl;
+
+#ifdef MRB_ENABLE_CXX_EXCEPTION
+  static mrb_int jmpbuf_id;
+  mrb_jmpbuf() : impl(jmpbuf_id++) {}
+#endif
+};
+
+#endif  /* MRB_THROW_H */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/node.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,118 @@
+/*
+** node.h - nodes of abstract syntax tree
+**
+** See Copyright Notice in mruby.h
+*/
+
+#ifndef NODE_H
+#define NODE_H
+
+enum node_type {
+  NODE_METHOD,
+  NODE_FBODY,
+  NODE_CFUNC,
+  NODE_SCOPE,
+  NODE_BLOCK,
+  NODE_IF,
+  NODE_CASE,
+  NODE_WHEN,
+  NODE_OPT_N,
+  NODE_WHILE,
+  NODE_UNTIL,
+  NODE_ITER,
+  NODE_FOR,
+  NODE_BREAK,
+  NODE_NEXT,
+  NODE_REDO,
+  NODE_RETRY,
+  NODE_BEGIN,
+  NODE_RESCUE,
+  NODE_ENSURE,
+  NODE_AND,
+  NODE_OR,
+  NODE_NOT,
+  NODE_MASGN,
+  NODE_ASGN,
+  NODE_CDECL,
+  NODE_CVASGN,
+  NODE_CVDECL,
+  NODE_OP_ASGN,
+  NODE_CALL,
+  NODE_FCALL,
+  NODE_VCALL,
+  NODE_SUPER,
+  NODE_ZSUPER,
+  NODE_ARRAY,
+  NODE_ZARRAY,
+  NODE_HASH,
+  NODE_RETURN,
+  NODE_YIELD,
+  NODE_LVAR,
+  NODE_DVAR,
+  NODE_GVAR,
+  NODE_IVAR,
+  NODE_CONST,
+  NODE_CVAR,
+  NODE_NTH_REF,
+  NODE_BACK_REF,
+  NODE_MATCH,
+  NODE_MATCH2,
+  NODE_MATCH3,
+  NODE_INT,
+  NODE_FLOAT,
+  NODE_NEGATE,
+  NODE_LAMBDA,
+  NODE_SYM,
+  NODE_STR,
+  NODE_DSTR,
+  NODE_XSTR,
+  NODE_DXSTR,
+  NODE_REGX,
+  NODE_DREGX,
+  NODE_DREGX_ONCE,
+  NODE_LIST,
+  NODE_ARG,
+  NODE_ARGSCAT,
+  NODE_ARGSPUSH,
+  NODE_SPLAT,
+  NODE_TO_ARY,
+  NODE_SVALUE,
+  NODE_BLOCK_ARG,
+  NODE_DEF,
+  NODE_SDEF,
+  NODE_ALIAS,
+  NODE_UNDEF,
+  NODE_CLASS,
+  NODE_MODULE,
+  NODE_SCLASS,
+  NODE_COLON2,
+  NODE_COLON3,
+  NODE_CREF,
+  NODE_DOT2,
+  NODE_DOT3,
+  NODE_FLIP2,
+  NODE_FLIP3,
+  NODE_ATTRSET,
+  NODE_SELF,
+  NODE_NIL,
+  NODE_TRUE,
+  NODE_FALSE,
+  NODE_DEFINED,
+  NODE_NEWLINE,
+  NODE_POSTEXE,
+  NODE_ALLOCA,
+  NODE_DMETHOD,
+  NODE_BMETHOD,
+  NODE_MEMO,
+  NODE_IFUNC,
+  NODE_DSYM,
+  NODE_ATTRASGN,
+  NODE_HEREDOC,
+  NODE_LITERAL_DELIM,
+  NODE_WORDS,
+  NODE_SYMBOLS,
+  NODE_LAST
+};
+
+#endif  /* NODE_H */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/numeric.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,1348 @@
+/*
+** numeric.c - Numeric, Integer, Float, Fixnum class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <float.h>
+#include <limits.h>
+#include <math.h>
+#include <stdlib.h>
+
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/numeric.h"
+#include "mruby/string.h"
+
+#ifdef MRB_USE_FLOAT
+#define floor(f) floorf(f)
+#define ceil(f) ceilf(f)
+#define fmod(x,y) fmodf(x,y)
+#define FLO_MAX_DIGITS 7
+#define FLO_MAX_SIGN_LENGTH 3
+#define FLO_EPSILON FLT_EPSILON
+#else
+#define FLO_MAX_DIGITS 14
+#define FLO_MAX_SIGN_LENGTH 10
+#define FLO_EPSILON DBL_EPSILON
+#endif
+
+MRB_API mrb_float
+mrb_to_flo(mrb_state *mrb, mrb_value val)
+{
+  switch (mrb_type(val)) {
+  case MRB_TT_FIXNUM:
+    return (mrb_float)mrb_fixnum(val);
+  case MRB_TT_FLOAT:
+    break;
+  default:
+    mrb_raise(mrb, E_TYPE_ERROR, "non float value");
+  }
+  return mrb_float(val);
+}
+
+/*
+ * call-seq:
+ *
+ *  num ** other  ->  num
+ *
+ * Raises <code>num</code> the <code>other</code> power.
+ *
+ *    2.0**3      #=> 8.0
+ */
+static mrb_value
+num_pow(mrb_state *mrb, mrb_value x)
+{
+  mrb_value y;
+  mrb_float d, yv;
+
+  mrb_get_args(mrb, "o", &y);
+  yv = mrb_to_flo(mrb, y);
+  d = pow(mrb_to_flo(mrb, x), yv);
+  if (mrb_fixnum_p(x) && mrb_fixnum_p(y) && FIXABLE(d) && yv > 0)
+    return mrb_fixnum_value((mrb_int)d);
+  return mrb_float_value(mrb, d);
+}
+
+/* 15.2.8.3.4  */
+/* 15.2.9.3.4  */
+/*
+ * call-seq:
+ *   num / other  ->  num
+ *
+ * Performs division: the class of the resulting object depends on
+ * the class of <code>num</code> and on the magnitude of the
+ * result.
+ */
+
+mrb_value
+mrb_num_div(mrb_state *mrb, mrb_value x, mrb_value y)
+{
+  return mrb_float_value(mrb, mrb_to_flo(mrb, x) / mrb_to_flo(mrb, y));
+}
+
+/* 15.2.9.3.19(x) */
+/*
+ *  call-seq:
+ *     num.quo(numeric)  ->  real
+ *
+ *  Returns most exact division.
+ */
+
+static mrb_value
+num_div(mrb_state *mrb, mrb_value x)
+{
+  mrb_float y;
+
+  mrb_get_args(mrb, "f", &y);
+  return mrb_float_value(mrb, mrb_to_flo(mrb, x) / y);
+}
+
+/********************************************************************
+ *
+ * Document-class: Float
+ *
+ *  <code>Float</code> objects represent inexact real numbers using
+ *  the native architecture's double-precision floating point
+ *  representation.
+ */
+
+static mrb_value
+mrb_flo_to_str(mrb_state *mrb, mrb_float flo)
+{
+  double n = (double)flo;
+  int max_digits = FLO_MAX_DIGITS;
+
+  if (isnan(n)) {
+    return mrb_str_new_lit(mrb, "NaN");
+  }
+  else if (isinf(n)) {
+    if (n < 0) {
+      return mrb_str_new_lit(mrb, "-inf");
+    }
+    else {
+      return mrb_str_new_lit(mrb, "inf");
+    }
+  }
+  else {
+    int digit;
+    int m = 0;
+    int exp;
+    mrb_bool e = FALSE;
+    char s[48];
+    char *c = &s[0];
+    int length = 0;
+
+    if (signbit(n)) {
+      n = -n;
+      *(c++) = '-';
+    }
+
+    if (n != 0.0) {
+      if (n > 1.0) {
+        exp = (int)floor(log10(n));
+      }
+      else {
+        exp = (int)-ceil(-log10(n));
+      }
+    }
+    else {
+      exp = 0;
+    }
+
+    /* preserve significands */
+    if (exp < 0) {
+      int i, beg = -1, end = 0;
+      double f = n;
+      double fd = 0;
+      for (i = 0; i < FLO_MAX_DIGITS; ++i) {
+        f = (f - fd) * 10.0;
+        fd = floor(f + FLO_EPSILON);
+        if (fd != 0) {
+          if (beg < 0) beg = i;
+          end = i + 1;
+        }
+      }
+      if (beg >= 0) length = end - beg;
+      if (length > FLO_MAX_SIGN_LENGTH) length = FLO_MAX_SIGN_LENGTH;
+    }
+
+    if (abs(exp) + length >= FLO_MAX_DIGITS) {
+      /* exponent representation */
+      e = TRUE;
+      n = n / pow(10.0, exp);
+      if (isinf(n)) {
+        if (s < c) {            /* s[0] == '-' */
+          return mrb_str_new_lit(mrb, "-0.0");
+        }
+        else {
+          return mrb_str_new_lit(mrb, "0.0");
+        }
+      }
+    }
+    else {
+      /* un-exponent (normal) representation */
+      if (exp > 0) {
+        m = exp;
+      }
+    }
+
+    /* puts digits */
+    while (max_digits >= 0) {
+      double weight = (m < 0) ? 0.0 : pow(10.0, m);
+      double fdigit = (m < 0) ? n * 10.0 : n / weight;
+
+      if (fdigit < 0) fdigit = n = 0;
+      if (m < -1 && fdigit < FLO_EPSILON) {
+        if (e || exp > 0 || m <= -abs(exp)) {
+          break;
+        }
+      }
+      digit = (int)floor(fdigit + FLO_EPSILON);
+      if (m == 0 && digit > 9) {
+        n /= 10.0;
+        exp++;
+        continue;
+      }
+      *(c++) = '0' + digit;
+      n = (m < 0) ? n * 10.0 - digit : n - (digit * weight);
+      max_digits--;
+      if (m-- == 0) {
+        *(c++) = '.';
+      }
+    }
+    if (c[-1] == '0') {
+      while (&s[0] < c && c[-1] == '0') {
+        c--;
+      }
+      c++;
+    }
+
+    if (e) {
+      *(c++) = 'e';
+      if (exp > 0) {
+        *(c++) = '+';
+      }
+      else {
+        *(c++) = '-';
+        exp = -exp;
+      }
+
+      if (exp >= 100) {
+        *(c++) = '0' + exp / 100;
+        exp -= exp / 100 * 100;
+      }
+
+      *(c++) = '0' + exp / 10;
+      *(c++) = '0' + exp % 10;
+    }
+
+    *c = '\0';
+
+    return mrb_str_new(mrb, &s[0], c - &s[0]);
+  }
+}
+
+/* 15.2.9.3.16(x) */
+/*
+ *  call-seq:
+ *     flt.to_s  ->  string
+ *
+ *  Returns a string containing a representation of self. As well as a
+ *  fixed or exponential form of the number, the call may return
+ *  ``<code>NaN</code>'', ``<code>Infinity</code>'', and
+ *  ``<code>-Infinity</code>''.
+ */
+
+static mrb_value
+flo_to_s(mrb_state *mrb, mrb_value flt)
+{
+  return mrb_flo_to_str(mrb, mrb_float(flt));
+}
+
+/* 15.2.9.3.2  */
+/*
+ * call-seq:
+ *   float - other  ->  float
+ *
+ * Returns a new float which is the difference of <code>float</code>
+ * and <code>other</code>.
+ */
+
+static mrb_value
+flo_minus(mrb_state *mrb, mrb_value x)
+{
+  mrb_value y;
+
+  mrb_get_args(mrb, "o", &y);
+  return mrb_float_value(mrb, mrb_float(x) - mrb_to_flo(mrb, y));
+}
+
+/* 15.2.9.3.3  */
+/*
+ * call-seq:
+ *   float * other  ->  float
+ *
+ * Returns a new float which is the product of <code>float</code>
+ * and <code>other</code>.
+ */
+
+static mrb_value
+flo_mul(mrb_state *mrb, mrb_value x)
+{
+  mrb_value y;
+
+  mrb_get_args(mrb, "o", &y);
+  return mrb_float_value(mrb, mrb_float(x) * mrb_to_flo(mrb, y));
+}
+
+static void
+flodivmod(mrb_state *mrb, mrb_float x, mrb_float y, mrb_float *divp, mrb_float *modp)
+{
+  mrb_float div;
+  mrb_float mod;
+
+  if (y == 0.0) {
+    div = INFINITY;
+    mod = NAN;
+  }
+  else {
+    mod = fmod(x, y);
+    if (isinf(x) && isfinite(y))
+      div = x;
+    else
+      div = (x - mod) / y;
+    if (y*mod < 0) {
+      mod += y;
+      div -= 1.0;
+    }
+  }
+
+  if (modp) *modp = mod;
+  if (divp) *divp = div;
+}
+
+/* 15.2.9.3.5  */
+/*
+ *  call-seq:
+ *     flt % other        ->  float
+ *     flt.modulo(other)  ->  float
+ *
+ *  Return the modulo after division of <code>flt</code> by <code>other</code>.
+ *
+ *     6543.21.modulo(137)      #=> 104.21
+ *     6543.21.modulo(137.24)   #=> 92.9299999999996
+ */
+
+static mrb_value
+flo_mod(mrb_state *mrb, mrb_value x)
+{
+  mrb_value y;
+  mrb_float mod;
+
+  mrb_get_args(mrb, "o", &y);
+
+  flodivmod(mrb, mrb_float(x), mrb_to_flo(mrb, y), 0, &mod);
+  return mrb_float_value(mrb, mod);
+}
+
+/* 15.2.8.3.16 */
+/*
+ *  call-seq:
+ *     num.eql?(numeric)  ->  true or false
+ *
+ *  Returns <code>true</code> if <i>num</i> and <i>numeric</i> are the
+ *  same type and have equal values.
+ *
+ *     1 == 1.0          #=> true
+ *     1.eql?(1.0)       #=> false
+ *     (1.0).eql?(1.0)   #=> true
+ */
+static mrb_value
+fix_eql(mrb_state *mrb, mrb_value x)
+{
+  mrb_value y;
+
+  mrb_get_args(mrb, "o", &y);
+  if (!mrb_fixnum_p(y)) return mrb_false_value();
+  return mrb_bool_value(mrb_fixnum(x) == mrb_fixnum(y));
+}
+
+static mrb_value
+flo_eql(mrb_state *mrb, mrb_value x)
+{
+  mrb_value y;
+
+  mrb_get_args(mrb, "o", &y);
+  if (!mrb_float_p(y)) return mrb_false_value();
+  return mrb_bool_value(mrb_float(x) == (mrb_float)mrb_fixnum(y));
+}
+
+/* 15.2.9.3.7  */
+/*
+ *  call-seq:
+ *     flt == obj  ->  true or false
+ *
+ *  Returns <code>true</code> only if <i>obj</i> has the same value
+ *  as <i>flt</i>. Contrast this with <code>Float#eql?</code>, which
+ *  requires <i>obj</i> to be a <code>Float</code>.
+ *
+ *     1.0 == 1   #=> true
+ *
+ */
+
+static mrb_value
+flo_eq(mrb_state *mrb, mrb_value x)
+{
+  mrb_value y;
+  mrb_get_args(mrb, "o", &y);
+
+  switch (mrb_type(y)) {
+  case MRB_TT_FIXNUM:
+    return mrb_bool_value(mrb_float(x) == (mrb_float)mrb_fixnum(y));
+  case MRB_TT_FLOAT:
+    return mrb_bool_value(mrb_float(x) == mrb_float(y));
+  default:
+    return mrb_false_value();
+  }
+}
+
+/* 15.2.8.3.18 */
+/*
+ * call-seq:
+ *   flt.hash  ->  integer
+ *
+ * Returns a hash code for this float.
+ */
+static mrb_value
+flo_hash(mrb_state *mrb, mrb_value num)
+{
+  mrb_float d;
+  char *c;
+  size_t i;
+  int hash;
+
+  d = (mrb_float)mrb_fixnum(num);
+  /* normalize -0.0 to 0.0 */
+  if (d == 0) d = 0.0;
+  c = (char*)&d;
+  for (hash=0, i=0; i<sizeof(mrb_float);i++) {
+    hash = (hash * 971) ^ (unsigned char)c[i];
+  }
+  if (hash < 0) hash = -hash;
+  return mrb_fixnum_value(hash);
+}
+
+/* 15.2.9.3.13 */
+/*
+ * call-seq:
+ *   flt.to_f  ->  self
+ *
+ * As <code>flt</code> is already a float, returns +self+.
+ */
+
+static mrb_value
+flo_to_f(mrb_state *mrb, mrb_value num)
+{
+  return num;
+}
+
+/* 15.2.9.3.11 */
+/*
+ *  call-seq:
+ *     flt.infinite?  ->  nil, -1, +1
+ *
+ *  Returns <code>nil</code>, -1, or +1 depending on whether <i>flt</i>
+ *  is finite, -infinity, or +infinity.
+ *
+ *     (0.0).infinite?        #=> nil
+ *     (-1.0/0.0).infinite?   #=> -1
+ *     (+1.0/0.0).infinite?   #=> 1
+ */
+
+static mrb_value
+flo_infinite_p(mrb_state *mrb, mrb_value num)
+{
+  mrb_float value = mrb_float(num);
+
+  if (isinf(value)) {
+    return mrb_fixnum_value(value < 0 ? -1 : 1);
+  }
+  return mrb_nil_value();
+}
+
+/* 15.2.9.3.9  */
+/*
+ *  call-seq:
+ *     flt.finite?  ->  true or false
+ *
+ *  Returns <code>true</code> if <i>flt</i> is a valid IEEE floating
+ *  point number (it is not infinite, and <code>nan?</code> is
+ *  <code>false</code>).
+ *
+ */
+
+static mrb_value
+flo_finite_p(mrb_state *mrb, mrb_value num)
+{
+  return mrb_bool_value(isfinite(mrb_float(num)));
+}
+
+/* 15.2.9.3.10 */
+/*
+ *  call-seq:
+ *     flt.floor  ->  integer
+ *
+ *  Returns the largest integer less than or equal to <i>flt</i>.
+ *
+ *     1.2.floor      #=> 1
+ *     2.0.floor      #=> 2
+ *     (-1.2).floor   #=> -2
+ *     (-2.0).floor   #=> -2
+ */
+
+static mrb_value
+flo_floor(mrb_state *mrb, mrb_value num)
+{
+  mrb_float f = floor(mrb_float(num));
+
+  if (!FIXABLE(f)) {
+    return mrb_float_value(mrb, f);
+  }
+  return mrb_fixnum_value((mrb_int)f);
+}
+
+/* 15.2.9.3.8  */
+/*
+ *  call-seq:
+ *     flt.ceil  ->  integer
+ *
+ *  Returns the smallest <code>Integer</code> greater than or equal to
+ *  <i>flt</i>.
+ *
+ *     1.2.ceil      #=> 2
+ *     2.0.ceil      #=> 2
+ *     (-1.2).ceil   #=> -1
+ *     (-2.0).ceil   #=> -2
+ */
+
+static mrb_value
+flo_ceil(mrb_state *mrb, mrb_value num)
+{
+  mrb_float f = ceil(mrb_float(num));
+
+  if (!FIXABLE(f)) {
+    return mrb_float_value(mrb, f);
+  }
+  return mrb_fixnum_value((mrb_int)f);
+}
+
+/* 15.2.9.3.12 */
+/*
+ *  call-seq:
+ *     flt.round([ndigits])  ->  integer or float
+ *
+ *  Rounds <i>flt</i> to a given precision in decimal digits (default 0 digits).
+ *  Precision may be negative.  Returns a floating point number when ndigits
+ *  is more than zero.
+ *
+ *     1.4.round      #=> 1
+ *     1.5.round      #=> 2
+ *     1.6.round      #=> 2
+ *     (-1.5).round   #=> -2
+ *
+ *     1.234567.round(2)  #=> 1.23
+ *     1.234567.round(3)  #=> 1.235
+ *     1.234567.round(4)  #=> 1.2346
+ *     1.234567.round(5)  #=> 1.23457
+ *
+ *     34567.89.round(-5) #=> 0
+ *     34567.89.round(-4) #=> 30000
+ *     34567.89.round(-3) #=> 35000
+ *     34567.89.round(-2) #=> 34600
+ *     34567.89.round(-1) #=> 34570
+ *     34567.89.round(0)  #=> 34568
+ *     34567.89.round(1)  #=> 34567.9
+ *     34567.89.round(2)  #=> 34567.89
+ *     34567.89.round(3)  #=> 34567.89
+ *
+ */
+
+static mrb_value
+flo_round(mrb_state *mrb, mrb_value num)
+{
+  double number, f;
+  mrb_int ndigits = 0;
+  int i;
+
+  mrb_get_args(mrb, "|i", &ndigits);
+  number = mrb_float(num);
+
+  if (isinf(number)) {
+    if (0 < ndigits) return num;
+    else mrb_raise(mrb, E_FLOATDOMAIN_ERROR, number < 0 ? "-Infinity" : "Infinity");
+  }
+  if (isnan(number)) {
+    if (0 < ndigits) return num;
+    else mrb_raise(mrb, E_FLOATDOMAIN_ERROR, "NaN");
+  }
+
+  f = 1.0;
+  i = abs(ndigits);
+  while  (--i >= 0)
+    f = f*10.0;
+
+  if (isinf(f)) {
+    if (ndigits < 0) number = 0;
+  }
+  else {
+    double d;
+
+    if (ndigits < 0) number /= f;
+    else number *= f;
+
+    /* home-made inline implementation of round(3) */
+    if (number > 0.0) {
+      d = floor(number);
+      number = d + (number - d >= 0.5);
+    }
+    else if (number < 0.0) {
+      d = ceil(number);
+      number = d - (d - number >= 0.5);
+    }
+
+    if (ndigits < 0) number *= f;
+    else number /= f;
+  }
+
+  if (ndigits > 0) {
+    if (!isfinite(number)) return num;
+    return mrb_float_value(mrb, number);
+  }
+  return mrb_fixnum_value((mrb_int)number);
+}
+
+/* 15.2.9.3.14 */
+/* 15.2.9.3.15 */
+/*
+ *  call-seq:
+ *     flt.to_i      ->  integer
+ *     flt.to_int    ->  integer
+ *     flt.truncate  ->  integer
+ *
+ *  Returns <i>flt</i> truncated to an <code>Integer</code>.
+ */
+
+static mrb_value
+flo_truncate(mrb_state *mrb, mrb_value num)
+{
+  mrb_float f = mrb_float(num);
+
+  if (f > 0.0) f = floor(f);
+  if (f < 0.0) f = ceil(f);
+
+  if (!FIXABLE(f)) {
+    return mrb_float_value(mrb, f);
+  }
+  return mrb_fixnum_value((mrb_int)f);
+}
+
+static mrb_value
+flo_nan_p(mrb_state *mrb, mrb_value num)
+{
+  return mrb_bool_value(isnan(mrb_float(num)));
+}
+
+/*
+ * Document-class: Integer
+ *
+ *  <code>Integer</code> is the basis for the two concrete classes that
+ *  hold whole numbers, <code>Bignum</code> and <code>Fixnum</code>.
+ *
+ */
+
+
+/*
+ *  call-seq:
+ *     int.to_i      ->  integer
+ *     int.to_int    ->  integer
+ *
+ *  As <i>int</i> is already an <code>Integer</code>, all these
+ *  methods simply return the receiver.
+ */
+
+static mrb_value
+int_to_i(mrb_state *mrb, mrb_value num)
+{
+  return num;
+}
+
+/*tests if N*N would overflow*/
+#define SQRT_INT_MAX ((mrb_int)1<<((MRB_INT_BIT-1-MRB_FIXNUM_SHIFT)/2))
+#define FIT_SQRT_INT(n) (((n)<SQRT_INT_MAX)&&((n)>=-SQRT_INT_MAX))
+
+mrb_value
+mrb_fixnum_mul(mrb_state *mrb, mrb_value x, mrb_value y)
+{
+  mrb_int a;
+
+  a = mrb_fixnum(x);
+  if (mrb_fixnum_p(y)) {
+    mrb_float c;
+    mrb_int b;
+
+    if (a == 0) return x;
+    b = mrb_fixnum(y);
+    if (FIT_SQRT_INT(a) && FIT_SQRT_INT(b))
+      return mrb_fixnum_value(a*b);
+    c = a * b;
+    if ((a != 0 && c/a != b) || !FIXABLE(c)) {
+      return mrb_float_value(mrb, (mrb_float)a*(mrb_float)b);
+    }
+    return mrb_fixnum_value((mrb_int)c);
+  }
+  return mrb_float_value(mrb, (mrb_float)a * mrb_to_flo(mrb, y));
+}
+
+/* 15.2.8.3.3  */
+/*
+ * call-seq:
+ *   fix * numeric  ->  numeric_result
+ *
+ * Performs multiplication: the class of the resulting object depends on
+ * the class of <code>numeric</code> and on the magnitude of the
+ * result.
+ */
+
+static mrb_value
+fix_mul(mrb_state *mrb, mrb_value x)
+{
+  mrb_value y;
+
+  mrb_get_args(mrb, "o", &y);
+  return mrb_fixnum_mul(mrb, x, y);
+}
+
+static void
+fixdivmod(mrb_state *mrb, mrb_int x, mrb_int y, mrb_int *divp, mrb_int *modp)
+{
+  mrb_int div, mod;
+
+  /* TODO: add mrb_assert(y != 0) to make sure */
+
+  if (y < 0) {
+    if (x < 0)
+      div = -x / -y;
+    else
+      div = - (x / -y);
+  }
+  else {
+    if (x < 0)
+      div = - (-x / y);
+    else
+      div = x / y;
+  }
+  mod = x - div*y;
+  if ((mod < 0 && y > 0) || (mod > 0 && y < 0)) {
+    mod += y;
+    div -= 1;
+  }
+  if (divp) *divp = div;
+  if (modp) *modp = mod;
+}
+
+/* 15.2.8.3.5  */
+/*
+ *  call-seq:
+ *    fix % other        ->  real
+ *    fix.modulo(other)  ->  real
+ *
+ *  Returns <code>fix</code> modulo <code>other</code>.
+ *  See <code>numeric.divmod</code> for more information.
+ */
+
+static mrb_value
+fix_mod(mrb_state *mrb, mrb_value x)
+{
+  mrb_value y;
+  mrb_int a;
+
+  mrb_get_args(mrb, "o", &y);
+  a = mrb_fixnum(x);
+  if (mrb_fixnum_p(y)) {
+    mrb_int b, mod;
+
+    if ((b=mrb_fixnum(y)) == 0) {
+      return mrb_float_value(mrb, NAN);
+    }
+    fixdivmod(mrb, a, b, 0, &mod);
+    return mrb_fixnum_value(mod);
+  }
+  else {
+    mrb_float mod;
+
+    flodivmod(mrb, (mrb_float)a, mrb_to_flo(mrb, y), 0, &mod);
+    return mrb_float_value(mrb, mod);
+  }
+}
+
+/*
+ *  call-seq:
+ *     fix.divmod(numeric)  ->  array
+ *
+ *  See <code>Numeric#divmod</code>.
+ */
+static mrb_value
+fix_divmod(mrb_state *mrb, mrb_value x)
+{
+  mrb_value y;
+
+  mrb_get_args(mrb, "o", &y);
+
+  if (mrb_fixnum_p(y)) {
+    mrb_int div, mod;
+
+    if (mrb_fixnum(y) == 0) {
+      return mrb_assoc_new(mrb, mrb_float_value(mrb, INFINITY),
+        mrb_float_value(mrb, NAN));
+    }
+    fixdivmod(mrb, mrb_fixnum(x), mrb_fixnum(y), &div, &mod);
+    return mrb_assoc_new(mrb, mrb_fixnum_value(div), mrb_fixnum_value(mod));
+  }
+  else {
+    mrb_float div, mod;
+    mrb_value a, b;
+
+    flodivmod(mrb, (mrb_float)mrb_fixnum(x), mrb_to_flo(mrb, y), &div, &mod);
+    a = mrb_float_value(mrb, (mrb_int)div);
+    b = mrb_float_value(mrb, mod);
+    return mrb_assoc_new(mrb, a, b);
+  }
+}
+
+static mrb_value
+flo_divmod(mrb_state *mrb, mrb_value x)
+{
+  mrb_value y;
+  mrb_float div, mod;
+  mrb_value a, b;
+
+  mrb_get_args(mrb, "o", &y);
+
+  flodivmod(mrb, mrb_float(x), mrb_to_flo(mrb, y), &div, &mod);
+  a = mrb_float_value(mrb, (mrb_int)div);
+  b = mrb_float_value(mrb, mod);
+  return mrb_assoc_new(mrb, a, b);
+}
+
+/* 15.2.8.3.7  */
+/*
+ * call-seq:
+ *   fix == other  ->  true or false
+ *
+ * Return <code>true</code> if <code>fix</code> equals <code>other</code>
+ * numerically.
+ *
+ *   1 == 2      #=> false
+ *   1 == 1.0    #=> true
+ */
+
+static mrb_value
+fix_equal(mrb_state *mrb, mrb_value x)
+{
+  mrb_value y;
+
+  mrb_get_args(mrb, "o", &y);
+  switch (mrb_type(y)) {
+  case MRB_TT_FIXNUM:
+    return mrb_bool_value(mrb_fixnum(x) == mrb_fixnum(y));
+  case MRB_TT_FLOAT:
+    return mrb_bool_value((mrb_float)mrb_fixnum(x) == mrb_float(y));
+  default:
+    return mrb_false_value();
+  }
+}
+
+/* 15.2.8.3.8  */
+/*
+ * call-seq:
+ *   ~fix  ->  integer
+ *
+ * One's complement: returns a number where each bit is flipped.
+ *   ex.0---00001 (1)-> 1---11110 (-2)
+ *   ex.0---00010 (2)-> 1---11101 (-3)
+ *   ex.0---00100 (4)-> 1---11011 (-5)
+ */
+
+static mrb_value
+fix_rev(mrb_state *mrb, mrb_value num)
+{
+  mrb_int val = mrb_fixnum(num);
+
+  return mrb_fixnum_value(~val);
+}
+
+static mrb_value
+bit_coerce(mrb_state *mrb, mrb_value x)
+{
+  while (!mrb_fixnum_p(x)) {
+    if (mrb_float_p(x)) {
+      mrb_raise(mrb, E_TYPE_ERROR, "can't convert Float into Integer");
+    }
+    x = mrb_to_int(mrb, x);
+  }
+  return x;
+}
+
+/* 15.2.8.3.9  */
+/*
+ * call-seq:
+ *   fix & integer  ->  integer_result
+ *
+ * Bitwise AND.
+ */
+
+static mrb_value
+fix_and(mrb_state *mrb, mrb_value x)
+{
+  mrb_value y;
+
+  mrb_get_args(mrb, "o", &y);
+
+  y = bit_coerce(mrb, y);
+  return mrb_fixnum_value(mrb_fixnum(x) & mrb_fixnum(y));
+}
+
+/* 15.2.8.3.10 */
+/*
+ * call-seq:
+ *   fix | integer  ->  integer_result
+ *
+ * Bitwise OR.
+ */
+
+static mrb_value
+fix_or(mrb_state *mrb, mrb_value x)
+{
+  mrb_value y;
+
+  mrb_get_args(mrb, "o", &y);
+
+  y = bit_coerce(mrb, y);
+  return mrb_fixnum_value(mrb_fixnum(x) | mrb_fixnum(y));
+}
+
+/* 15.2.8.3.11 */
+/*
+ * call-seq:
+ *   fix ^ integer  ->  integer_result
+ *
+ * Bitwise EXCLUSIVE OR.
+ */
+
+static mrb_value
+fix_xor(mrb_state *mrb, mrb_value x)
+{
+  mrb_value y;
+
+  mrb_get_args(mrb, "o", &y);
+
+  y = bit_coerce(mrb, y);
+  return mrb_fixnum_value(mrb_fixnum(x) ^ mrb_fixnum(y));
+}
+
+#define NUMERIC_SHIFT_WIDTH_MAX (MRB_INT_BIT-1)
+
+static mrb_value
+lshift(mrb_state *mrb, mrb_int val, mrb_int width)
+{
+  mrb_assert(width >= 0);
+  if (width > NUMERIC_SHIFT_WIDTH_MAX) {
+    mrb_raisef(mrb, E_RANGE_ERROR, "width(%S) > (%S:MRB_INT_BIT-1)",
+               mrb_fixnum_value(width),
+               mrb_fixnum_value(NUMERIC_SHIFT_WIDTH_MAX));
+  }
+  return mrb_fixnum_value(val << width);
+}
+
+static mrb_value
+rshift(mrb_int val, mrb_int width)
+{
+  mrb_assert(width >= 0);
+  if (width >= NUMERIC_SHIFT_WIDTH_MAX) {
+    if (val < 0) {
+      return mrb_fixnum_value(-1);
+    }
+    return mrb_fixnum_value(0);
+  }
+  return mrb_fixnum_value(val >> width);
+}
+
+static inline void
+fix_shift_get_width(mrb_state *mrb, mrb_int *width)
+{
+  mrb_value y;
+
+  mrb_get_args(mrb, "o", &y);
+  *width = mrb_fixnum(bit_coerce(mrb, y));
+}
+
+/* 15.2.8.3.12 */
+/*
+ * call-seq:
+ *   fix << count  ->  integer
+ *
+ * Shifts _fix_ left _count_ positions (right if _count_ is negative).
+ */
+
+static mrb_value
+fix_lshift(mrb_state *mrb, mrb_value x)
+{
+  mrb_int width, val;
+
+  fix_shift_get_width(mrb, &width);
+
+  if (width == 0) {
+    return x;
+  }
+  val = mrb_fixnum(x);
+  if (width < 0) {
+    return rshift(val, -width);
+  }
+  return lshift(mrb, val, width);
+}
+
+/* 15.2.8.3.13 */
+/*
+ * call-seq:
+ *   fix >> count  ->  integer
+ *
+ * Shifts _fix_ right _count_ positions (left if _count_ is negative).
+ */
+
+static mrb_value
+fix_rshift(mrb_state *mrb, mrb_value x)
+{
+  mrb_int width, val;
+
+  fix_shift_get_width(mrb, &width);
+
+  if (width == 0) {
+    return x;
+  }
+  val = mrb_fixnum(x);
+  if (width < 0) {
+    return lshift(mrb, val, -width);
+  }
+  return rshift(val, width);
+}
+
+/* 15.2.8.3.23 */
+/*
+ *  call-seq:
+ *     fix.to_f  ->  float
+ *
+ *  Converts <i>fix</i> to a <code>Float</code>.
+ *
+ */
+
+static mrb_value
+fix_to_f(mrb_state *mrb, mrb_value num)
+{
+  return mrb_float_value(mrb, (mrb_float)mrb_fixnum(num));
+}
+
+/*
+ *  Document-class: FloatDomainError
+ *
+ *  Raised when attempting to convert special float values
+ *  (in particular infinite or NaN)
+ *  to numerical classes which don't support them.
+ *
+ *     Float::INFINITY.to_r
+ *
+ *  <em>raises the exception:</em>
+ *
+ *     FloatDomainError: Infinity
+ */
+/* ------------------------------------------------------------------------*/
+MRB_API mrb_value
+mrb_flo_to_fixnum(mrb_state *mrb, mrb_value x)
+{
+  mrb_int z;
+
+  if (!mrb_float_p(x)) {
+    mrb_raise(mrb, E_TYPE_ERROR, "non float value");
+    z = 0; /* not reached. just suppress warnings. */
+  }
+  else {
+    mrb_float d = mrb_float(x);
+
+    if (isinf(d)) {
+      mrb_raise(mrb, E_FLOATDOMAIN_ERROR, d < 0 ? "-Infinity" : "Infinity");
+    }
+    if (isnan(d)) {
+      mrb_raise(mrb, E_FLOATDOMAIN_ERROR, "NaN");
+    }
+    z = (mrb_int)d;
+  }
+  return mrb_fixnum_value(z);
+}
+
+mrb_value
+mrb_fixnum_plus(mrb_state *mrb, mrb_value x, mrb_value y)
+{
+  mrb_int a;
+
+  a = mrb_fixnum(x);
+  if (mrb_fixnum_p(y)) {
+    mrb_int b, c;
+
+    if (a == 0) return y;
+    b = mrb_fixnum(y);
+    if (mrb_int_add_overflow(a, b, &c)) {
+      return mrb_float_value(mrb, (mrb_float)a + (mrb_float)b);
+    }
+    return mrb_fixnum_value(c);
+  }
+  return mrb_float_value(mrb, (mrb_float)a + mrb_to_flo(mrb, y));
+}
+
+/* 15.2.8.3.1  */
+/*
+ * call-seq:
+ *   fix + numeric  ->  numeric_result
+ *
+ * Performs addition: the class of the resulting object depends on
+ * the class of <code>numeric</code> and on the magnitude of the
+ * result.
+ */
+static mrb_value
+fix_plus(mrb_state *mrb, mrb_value self)
+{
+  mrb_value other;
+
+  mrb_get_args(mrb, "o", &other);
+  return mrb_fixnum_plus(mrb, self, other);
+}
+
+mrb_value
+mrb_fixnum_minus(mrb_state *mrb, mrb_value x, mrb_value y)
+{
+  mrb_int a;
+
+  a = mrb_fixnum(x);
+  if (mrb_fixnum_p(y)) {
+    mrb_int b, c;
+
+    b = mrb_fixnum(y);
+    if (mrb_int_sub_overflow(a, b, &c)) {
+      return mrb_float_value(mrb, (mrb_float)a - (mrb_float)b);
+    }
+    return mrb_fixnum_value(c);
+  }
+  return mrb_float_value(mrb, (mrb_float)a - mrb_to_flo(mrb, y));
+}
+
+/* 15.2.8.3.2  */
+/* 15.2.8.3.16 */
+/*
+ * call-seq:
+ *   fix - numeric  ->  numeric_result
+ *
+ * Performs subtraction: the class of the resulting object depends on
+ * the class of <code>numeric</code> and on the magnitude of the
+ * result.
+ */
+static mrb_value
+fix_minus(mrb_state *mrb, mrb_value self)
+{
+  mrb_value other;
+
+  mrb_get_args(mrb, "o", &other);
+  return mrb_fixnum_minus(mrb, self, other);
+}
+
+
+MRB_API mrb_value
+mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, int base)
+{
+  char buf[MRB_INT_BIT+1];
+  char *b = buf + sizeof buf;
+  mrb_int val = mrb_fixnum(x);
+
+  if (base < 2 || 36 < base) {
+    mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid radix %S", mrb_fixnum_value(base));
+  }
+
+  if (val == 0) {
+    *--b = '0';
+  }
+  else if (val < 0) {
+    do {
+      *--b = mrb_digitmap[-(val % base)];
+    } while (val /= base);
+    *--b = '-';
+  }
+  else {
+    do {
+      *--b = mrb_digitmap[(int)(val % base)];
+    } while (val /= base);
+  }
+
+  return mrb_str_new(mrb, b, buf + sizeof(buf) - b);
+}
+
+/* 15.2.8.3.25 */
+/*
+ *  call-seq:
+ *     fix.to_s(base=10)  ->  string
+ *
+ *  Returns a string containing the representation of <i>fix</i> radix
+ *  <i>base</i> (between 2 and 36).
+ *
+ *     12345.to_s       #=> "12345"
+ *     12345.to_s(2)    #=> "11000000111001"
+ *     12345.to_s(8)    #=> "30071"
+ *     12345.to_s(10)   #=> "12345"
+ *     12345.to_s(16)   #=> "3039"
+ *     12345.to_s(36)   #=> "9ix"
+ *
+ */
+static mrb_value
+fix_to_s(mrb_state *mrb, mrb_value self)
+{
+  mrb_int base = 10;
+
+  mrb_get_args(mrb, "|i", &base);
+  return mrb_fixnum_to_str(mrb, self, base);
+}
+
+/* 15.2.9.3.6  */
+/*
+ * call-seq:
+ *     self.f <=> other.f    => -1, 0, +1
+ *             <  => -1
+ *             =  =>  0
+ *             >  => +1
+ *  Comparison---Returns -1, 0, or +1 depending on whether <i>fix</i> is
+ *  less than, equal to, or greater than <i>numeric</i>. This is the
+ *  basis for the tests in <code>Comparable</code>.
+ */
+static mrb_value
+num_cmp(mrb_state *mrb, mrb_value self)
+{
+  mrb_value other;
+  mrb_float x, y;
+
+  mrb_get_args(mrb, "o", &other);
+
+  x = mrb_to_flo(mrb, self);
+  switch (mrb_type(other)) {
+  case MRB_TT_FIXNUM:
+    y = (mrb_float)mrb_fixnum(other);
+    break;
+  case MRB_TT_FLOAT:
+    y = mrb_float(other);
+    break;
+  default:
+    return mrb_nil_value();
+  }
+  if (x > y)
+    return mrb_fixnum_value(1);
+  else {
+    if (x < y)
+      return mrb_fixnum_value(-1);
+    return mrb_fixnum_value(0);
+  }
+}
+
+/* 15.2.9.3.1  */
+/*
+ * call-seq:
+ *   float + other  ->  float
+ *
+ * Returns a new float which is the sum of <code>float</code>
+ * and <code>other</code>.
+ */
+static mrb_value
+flo_plus(mrb_state *mrb, mrb_value x)
+{
+  mrb_value y;
+
+  mrb_get_args(mrb, "o", &y);
+  return mrb_float_value(mrb, mrb_float(x) + mrb_to_flo(mrb, y));
+}
+
+/* ------------------------------------------------------------------------*/
+void
+mrb_init_numeric(mrb_state *mrb)
+{
+  struct RClass *numeric, *integer, *fixnum, *fl;
+
+  /* Numeric Class */
+  numeric = mrb_define_class(mrb, "Numeric",  mrb->object_class);                /* 15.2.7 */
+
+  mrb_define_method(mrb, numeric, "**",       num_pow,        MRB_ARGS_REQ(1));
+  mrb_define_method(mrb, numeric, "/",        num_div,        MRB_ARGS_REQ(1));  /* 15.2.8.3.4  */
+  mrb_define_method(mrb, numeric, "quo",      num_div,        MRB_ARGS_REQ(1));  /* 15.2.7.4.5 (x) */
+  mrb_define_method(mrb, numeric, "<=>",      num_cmp,        MRB_ARGS_REQ(1));  /* 15.2.9.3.6  */
+
+  /* Integer Class */
+  integer = mrb_define_class(mrb, "Integer",  numeric);                          /* 15.2.8 */
+  mrb_undef_class_method(mrb, integer, "new");
+  mrb_define_method(mrb, integer, "to_i", int_to_i, MRB_ARGS_NONE());            /* 15.2.8.3.24 */
+  mrb_define_method(mrb, integer, "to_int", int_to_i, MRB_ARGS_NONE());
+
+  /* Fixnum Class */
+  fixnum = mrb->fixnum_class = mrb_define_class(mrb, "Fixnum", integer);
+  mrb_define_method(mrb, fixnum,  "+",        fix_plus,          MRB_ARGS_REQ(1)); /* 15.2.8.3.1  */
+  mrb_define_method(mrb, fixnum,  "-",        fix_minus,         MRB_ARGS_REQ(1)); /* 15.2.8.3.2  */
+  mrb_define_method(mrb, fixnum,  "*",        fix_mul,           MRB_ARGS_REQ(1)); /* 15.2.8.3.3  */
+  mrb_define_method(mrb, fixnum,  "%",        fix_mod,           MRB_ARGS_REQ(1)); /* 15.2.8.3.5  */
+  mrb_define_method(mrb, fixnum,  "==",       fix_equal,         MRB_ARGS_REQ(1)); /* 15.2.8.3.7  */
+  mrb_define_method(mrb, fixnum,  "~",        fix_rev,           MRB_ARGS_NONE()); /* 15.2.8.3.8  */
+  mrb_define_method(mrb, fixnum,  "&",        fix_and,           MRB_ARGS_REQ(1)); /* 15.2.8.3.9  */
+  mrb_define_method(mrb, fixnum,  "|",        fix_or,            MRB_ARGS_REQ(1)); /* 15.2.8.3.10 */
+  mrb_define_method(mrb, fixnum,  "^",        fix_xor,           MRB_ARGS_REQ(1)); /* 15.2.8.3.11 */
+  mrb_define_method(mrb, fixnum,  "<<",       fix_lshift,        MRB_ARGS_REQ(1)); /* 15.2.8.3.12 */
+  mrb_define_method(mrb, fixnum,  ">>",       fix_rshift,        MRB_ARGS_REQ(1)); /* 15.2.8.3.13 */
+  mrb_define_method(mrb, fixnum,  "eql?",     fix_eql,           MRB_ARGS_REQ(1)); /* 15.2.8.3.16 */
+  mrb_define_method(mrb, fixnum,  "hash",     flo_hash,          MRB_ARGS_NONE()); /* 15.2.8.3.18 */
+  mrb_define_method(mrb, fixnum,  "to_f",     fix_to_f,          MRB_ARGS_NONE()); /* 15.2.8.3.23 */
+  mrb_define_method(mrb, fixnum,  "to_s",     fix_to_s,          MRB_ARGS_NONE()); /* 15.2.8.3.25 */
+  mrb_define_method(mrb, fixnum,  "inspect",  fix_to_s,          MRB_ARGS_NONE());
+  mrb_define_method(mrb, fixnum,  "divmod",   fix_divmod,        MRB_ARGS_REQ(1)); /* 15.2.8.3.30 (x) */
+
+  /* Float Class */
+  fl = mrb->float_class = mrb_define_class(mrb, "Float", numeric);                 /* 15.2.9 */
+  mrb_undef_class_method(mrb,  fl, "new");
+  mrb_define_method(mrb, fl,      "+",         flo_plus,         MRB_ARGS_REQ(1)); /* 15.2.9.3.1  */
+  mrb_define_method(mrb, fl,      "-",         flo_minus,        MRB_ARGS_REQ(1)); /* 15.2.9.3.2  */
+  mrb_define_method(mrb, fl,      "*",         flo_mul,          MRB_ARGS_REQ(1)); /* 15.2.9.3.3  */
+  mrb_define_method(mrb, fl,      "%",         flo_mod,          MRB_ARGS_REQ(1)); /* 15.2.9.3.5  */
+  mrb_define_method(mrb, fl,      "==",        flo_eq,           MRB_ARGS_REQ(1)); /* 15.2.9.3.7  */
+  mrb_define_method(mrb, fl,      "ceil",      flo_ceil,         MRB_ARGS_NONE()); /* 15.2.9.3.8  */
+  mrb_define_method(mrb, fl,      "finite?",   flo_finite_p,     MRB_ARGS_NONE()); /* 15.2.9.3.9  */
+  mrb_define_method(mrb, fl,      "floor",     flo_floor,        MRB_ARGS_NONE()); /* 15.2.9.3.10 */
+  mrb_define_method(mrb, fl,      "infinite?", flo_infinite_p,   MRB_ARGS_NONE()); /* 15.2.9.3.11 */
+  mrb_define_method(mrb, fl,      "round",     flo_round,        MRB_ARGS_OPT(1)); /* 15.2.9.3.12 */
+  mrb_define_method(mrb, fl,      "to_f",      flo_to_f,         MRB_ARGS_NONE()); /* 15.2.9.3.13 */
+  mrb_define_method(mrb, fl,      "to_i",      flo_truncate,     MRB_ARGS_NONE()); /* 15.2.9.3.14 */
+  mrb_define_method(mrb, fl,      "to_int",    flo_truncate,     MRB_ARGS_NONE());
+  mrb_define_method(mrb, fl,      "truncate",  flo_truncate,     MRB_ARGS_NONE()); /* 15.2.9.3.15 */
+  mrb_define_method(mrb, fl,      "divmod",    flo_divmod,       MRB_ARGS_REQ(1));
+  mrb_define_method(mrb, fl,      "eql?",      flo_eql,          MRB_ARGS_REQ(1)); /* 15.2.8.3.16 */
+
+  mrb_define_method(mrb, fl,      "to_s",      flo_to_s,         MRB_ARGS_NONE()); /* 15.2.9.3.16(x) */
+  mrb_define_method(mrb, fl,      "inspect",   flo_to_s,         MRB_ARGS_NONE());
+  mrb_define_method(mrb, fl,      "nan?",      flo_nan_p,        MRB_ARGS_NONE());
+
+#ifdef INFINITY
+  mrb_define_const(mrb, fl, "INFINITY", mrb_float_value(mrb, INFINITY));
+#endif
+#ifdef NAN
+  mrb_define_const(mrb, fl, "NAN", mrb_float_value(mrb, NAN));
+#endif
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/object.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,601 @@
+/*
+** object.c - Object, NilClass, TrueClass, FalseClass class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+#include "mruby/class.h"
+#include "mruby/numeric.h"
+#include "mruby/string.h"
+
+MRB_API mrb_bool
+mrb_obj_eq(mrb_state *mrb, mrb_value v1, mrb_value v2)
+{
+  if (mrb_type(v1) != mrb_type(v2)) return FALSE;
+  switch (mrb_type(v1)) {
+  case MRB_TT_TRUE:
+    return TRUE;
+
+  case MRB_TT_FALSE:
+  case MRB_TT_FIXNUM:
+    return (mrb_fixnum(v1) == mrb_fixnum(v2));
+  case MRB_TT_SYMBOL:
+    return (mrb_symbol(v1) == mrb_symbol(v2));
+
+  case MRB_TT_FLOAT:
+    return (mrb_float(v1) == mrb_float(v2));
+
+  default:
+    return (mrb_ptr(v1) == mrb_ptr(v2));
+  }
+}
+
+MRB_API mrb_bool
+mrb_obj_equal(mrb_state *mrb, mrb_value v1, mrb_value v2)
+{
+  /* temporary definition */
+  return mrb_obj_eq(mrb, v1, v2);
+}
+
+MRB_API mrb_bool
+mrb_equal(mrb_state *mrb, mrb_value obj1, mrb_value obj2)
+{
+  mrb_value result;
+
+  if (mrb_obj_eq(mrb, obj1, obj2)) return TRUE;
+  result = mrb_funcall(mrb, obj1, "==", 1, obj2);
+  if (mrb_test(result)) return TRUE;
+  return FALSE;
+}
+
+/*
+ * Document-class: NilClass
+ *
+ *  The class of the singleton object <code>nil</code>.
+ */
+
+/* 15.2.4.3.4  */
+/*
+ * call_seq:
+ *   nil.nil?               -> true
+ *
+ * Only the object <i>nil</i> responds <code>true</code> to <code>nil?</code>.
+ */
+
+static mrb_value
+mrb_true(mrb_state *mrb, mrb_value obj)
+{
+  return mrb_true_value();
+}
+
+/* 15.2.4.3.5  */
+/*
+ *  call-seq:
+ *     nil.to_s    -> ""
+ *
+ *  Always returns the empty string.
+ */
+
+static mrb_value
+nil_to_s(mrb_state *mrb, mrb_value obj)
+{
+  return mrb_str_new(mrb, 0, 0);
+}
+
+static mrb_value
+nil_inspect(mrb_state *mrb, mrb_value obj)
+{
+  return mrb_str_new_lit(mrb, "nil");
+}
+
+/***********************************************************************
+ *  Document-class: TrueClass
+ *
+ *  The global value <code>true</code> is the only instance of class
+ *  <code>TrueClass</code> and represents a logically true value in
+ *  boolean expressions. The class provides operators allowing
+ *  <code>true</code> to be used in logical expressions.
+ */
+
+/* 15.2.5.3.1  */
+/*
+ *  call-seq:
+ *     true & obj    -> true or false
+ *
+ *  And---Returns <code>false</code> if <i>obj</i> is
+ *  <code>nil</code> or <code>false</code>, <code>true</code> otherwise.
+ */
+
+static mrb_value
+true_and(mrb_state *mrb, mrb_value obj)
+{
+  mrb_bool obj2;
+
+  mrb_get_args(mrb, "b", &obj2);
+
+  return mrb_bool_value(obj2);
+}
+
+/* 15.2.5.3.2  */
+/*
+ *  call-seq:
+ *     true ^ obj   -> !obj
+ *
+ *  Exclusive Or---Returns <code>true</code> if <i>obj</i> is
+ *  <code>nil</code> or <code>false</code>, <code>false</code>
+ *  otherwise.
+ */
+
+static mrb_value
+true_xor(mrb_state *mrb, mrb_value obj)
+{
+  mrb_bool obj2;
+
+  mrb_get_args(mrb, "b", &obj2);
+  return mrb_bool_value(!obj2);
+}
+
+/* 15.2.5.3.3  */
+/*
+ * call-seq:
+ *   true.to_s   ->  "true"
+ *
+ * The string representation of <code>true</code> is "true".
+ */
+
+static mrb_value
+true_to_s(mrb_state *mrb, mrb_value obj)
+{
+  return mrb_str_new_lit(mrb, "true");
+}
+
+/* 15.2.5.3.4  */
+/*
+ *  call-seq:
+ *     true | obj   -> true
+ *
+ *  Or---Returns <code>true</code>. As <i>anObject</i> is an argument to
+ *  a method call, it is always evaluated; there is no short-circuit
+ *  evaluation in this case.
+ *
+ *     true |  puts("or")
+ *     true || puts("logical or")
+ *
+ *  <em>produces:</em>
+ *
+ *     or
+ */
+
+static mrb_value
+true_or(mrb_state *mrb, mrb_value obj)
+{
+  return mrb_true_value();
+}
+
+/*
+ *  Document-class: FalseClass
+ *
+ *  The global value <code>false</code> is the only instance of class
+ *  <code>FalseClass</code> and represents a logically false value in
+ *  boolean expressions. The class provides operators allowing
+ *  <code>false</code> to participate correctly in logical expressions.
+ *
+ */
+
+/* 15.2.4.3.1  */
+/* 15.2.6.3.1  */
+/*
+ *  call-seq:
+ *     false & obj   -> false
+ *     nil & obj     -> false
+ *
+ *  And---Returns <code>false</code>. <i>obj</i> is always
+ *  evaluated as it is the argument to a method call---there is no
+ *  short-circuit evaluation in this case.
+ */
+
+static mrb_value
+false_and(mrb_state *mrb, mrb_value obj)
+{
+  return mrb_false_value();
+}
+
+/* 15.2.4.3.2  */
+/* 15.2.6.3.2  */
+/*
+ *  call-seq:
+ *     false ^ obj    -> true or false
+ *     nil   ^ obj    -> true or false
+ *
+ *  Exclusive Or---If <i>obj</i> is <code>nil</code> or
+ *  <code>false</code>, returns <code>false</code>; otherwise, returns
+ *  <code>true</code>.
+ *
+ */
+
+static mrb_value
+false_xor(mrb_state *mrb, mrb_value obj)
+{
+  mrb_bool obj2;
+
+  mrb_get_args(mrb, "b", &obj2);
+  return mrb_bool_value(obj2);
+}
+
+/* 15.2.4.3.3  */
+/* 15.2.6.3.4  */
+/*
+ *  call-seq:
+ *     false | obj   ->   true or false
+ *     nil   | obj   ->   true or false
+ *
+ *  Or---Returns <code>false</code> if <i>obj</i> is
+ *  <code>nil</code> or <code>false</code>; <code>true</code> otherwise.
+ */
+
+static mrb_value
+false_or(mrb_state *mrb, mrb_value obj)
+{
+  mrb_bool obj2;
+
+  mrb_get_args(mrb, "b", &obj2);
+  return mrb_bool_value(obj2);
+}
+
+/* 15.2.6.3.3  */
+/*
+ * call-seq:
+ *   false.to_s   ->  "false"
+ *
+ * 'nuf said...
+ */
+
+static mrb_value
+false_to_s(mrb_state *mrb, mrb_value obj)
+{
+  return mrb_str_new_lit(mrb, "false");
+}
+
+void
+mrb_init_object(mrb_state *mrb)
+{
+  struct RClass *n;
+  struct RClass *t;
+  struct RClass *f;
+
+  n = mrb->nil_class   = mrb_define_class(mrb, "NilClass",   mrb->object_class);
+  mrb_undef_class_method(mrb, n, "new");
+  mrb_define_method(mrb, n, "&",    false_and,      MRB_ARGS_REQ(1));  /* 15.2.4.3.1  */
+  mrb_define_method(mrb, n, "^",    false_xor,      MRB_ARGS_REQ(1));  /* 15.2.4.3.2  */
+  mrb_define_method(mrb, n, "|",    false_or,       MRB_ARGS_REQ(1));  /* 15.2.4.3.3  */
+  mrb_define_method(mrb, n, "nil?", mrb_true,       MRB_ARGS_NONE());  /* 15.2.4.3.4  */
+  mrb_define_method(mrb, n, "to_s", nil_to_s,       MRB_ARGS_NONE());  /* 15.2.4.3.5  */
+  mrb_define_method(mrb, n, "inspect", nil_inspect, MRB_ARGS_NONE());
+
+  t = mrb->true_class  = mrb_define_class(mrb, "TrueClass",  mrb->object_class);
+  mrb_undef_class_method(mrb, t, "new");
+  mrb_define_method(mrb, t, "&",    true_and,       MRB_ARGS_REQ(1));  /* 15.2.5.3.1  */
+  mrb_define_method(mrb, t, "^",    true_xor,       MRB_ARGS_REQ(1));  /* 15.2.5.3.2  */
+  mrb_define_method(mrb, t, "to_s", true_to_s,      MRB_ARGS_NONE());  /* 15.2.5.3.3  */
+  mrb_define_method(mrb, t, "|",    true_or,        MRB_ARGS_REQ(1));  /* 15.2.5.3.4  */
+  mrb_define_method(mrb, t, "inspect", true_to_s,   MRB_ARGS_NONE());
+
+  f = mrb->false_class = mrb_define_class(mrb, "FalseClass", mrb->object_class);
+  mrb_undef_class_method(mrb, f, "new");
+  mrb_define_method(mrb, f, "&",    false_and,      MRB_ARGS_REQ(1));  /* 15.2.6.3.1  */
+  mrb_define_method(mrb, f, "^",    false_xor,      MRB_ARGS_REQ(1));  /* 15.2.6.3.2  */
+  mrb_define_method(mrb, f, "to_s", false_to_s,     MRB_ARGS_NONE());  /* 15.2.6.3.3  */
+  mrb_define_method(mrb, f, "|",    false_or,       MRB_ARGS_REQ(1));  /* 15.2.6.3.4  */
+  mrb_define_method(mrb, f, "inspect", false_to_s,  MRB_ARGS_NONE());
+}
+
+static mrb_value
+inspect_type(mrb_state *mrb, mrb_value val)
+{
+  if (mrb_type(val) == MRB_TT_FALSE || mrb_type(val) == MRB_TT_TRUE) {
+    return mrb_inspect(mrb, val);
+  }
+  else {
+    return mrb_str_new_cstr(mrb, mrb_obj_classname(mrb, val));
+  }
+}
+
+static mrb_value
+convert_type(mrb_state *mrb, mrb_value val, const char *tname, const char *method, mrb_bool raise)
+{
+  mrb_sym m = 0;
+
+  m = mrb_intern_cstr(mrb, method);
+  if (!mrb_respond_to(mrb, val, m)) {
+    if (raise) {
+      mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %S into %S", inspect_type(mrb, val), mrb_str_new_cstr(mrb, tname));
+    }
+    return mrb_nil_value();
+  }
+  return mrb_funcall_argv(mrb, val, m, 0, 0);
+}
+
+MRB_API mrb_value
+mrb_check_to_integer(mrb_state *mrb, mrb_value val, const char *method)
+{
+  mrb_value v;
+
+  if (mrb_fixnum_p(val)) return val;
+  v = convert_type(mrb, val, "Integer", method, FALSE);
+  if (mrb_nil_p(v) || !mrb_fixnum_p(v)) {
+    return mrb_nil_value();
+  }
+  return v;
+}
+
+MRB_API mrb_value
+mrb_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, const char *tname, const char *method)
+{
+  mrb_value v;
+
+  if (mrb_type(val) == type) return val;
+  v = convert_type(mrb, val, tname, method, TRUE);
+  if (mrb_type(v) != type) {
+    mrb_raisef(mrb, E_TYPE_ERROR, "%S cannot be converted to %S by #%S", val,
+               mrb_str_new_cstr(mrb, tname), mrb_str_new_cstr(mrb, method));
+  }
+  return v;
+}
+
+MRB_API mrb_value
+mrb_check_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, const char *tname, const char *method)
+{
+  mrb_value v;
+
+  if (mrb_type(val) == type && type != MRB_TT_DATA) return val;
+  v = convert_type(mrb, val, tname, method, FALSE);
+  if (mrb_nil_p(v) || mrb_type(v) != type) return mrb_nil_value();
+  return v;
+}
+
+static const struct types {
+  unsigned char type;
+  const char *name;
+} builtin_types[] = {
+/*    {MRB_TT_NIL,  "nil"}, */
+  {MRB_TT_FALSE,  "false"},
+  {MRB_TT_TRUE,   "true"},
+  {MRB_TT_FIXNUM, "Fixnum"},
+  {MRB_TT_SYMBOL, "Symbol"},  /* :symbol */
+  {MRB_TT_MODULE, "Module"},
+  {MRB_TT_OBJECT, "Object"},
+  {MRB_TT_CLASS,  "Class"},
+  {MRB_TT_ICLASS, "iClass"},  /* internal use: mixed-in module holder */
+  {MRB_TT_SCLASS, "SClass"},
+  {MRB_TT_PROC,   "Proc"},
+  {MRB_TT_FLOAT,  "Float"},
+  {MRB_TT_ARRAY,  "Array"},
+  {MRB_TT_HASH,   "Hash"},
+  {MRB_TT_STRING, "String"},
+  {MRB_TT_RANGE,  "Range"},
+/*    {MRB_TT_BIGNUM,  "Bignum"}, */
+  {MRB_TT_FILE,   "File"},
+  {MRB_TT_DATA,   "Data"},  /* internal use: wrapped C pointers */
+/*    {MRB_TT_VARMAP,  "Varmap"}, */ /* internal use: dynamic variables */
+/*    {MRB_TT_NODE,  "Node"}, */ /* internal use: syntax tree node */
+/*    {MRB_TT_UNDEF,  "undef"}, */ /* internal use: #undef; should not happen */
+    {-1,  0}
+};
+
+MRB_API void
+mrb_check_type(mrb_state *mrb, mrb_value x, enum mrb_vtype t)
+{
+  const struct types *type = builtin_types;
+  enum mrb_vtype xt;
+
+  xt = mrb_type(x);
+  if ((xt != t) || (xt == MRB_TT_DATA)) {
+    while (type->type < MRB_TT_MAXDEFINE) {
+      if (type->type == t) {
+        const char *etype;
+
+        if (mrb_nil_p(x)) {
+          etype = "nil";
+        }
+        else if (mrb_fixnum_p(x)) {
+          etype = "Fixnum";
+        }
+        else if (mrb_type(x) == MRB_TT_SYMBOL) {
+          etype = "Symbol";
+        }
+        else if (mrb_immediate_p(x)) {
+          etype = RSTRING_PTR(mrb_obj_as_string(mrb, x));
+        }
+        else {
+          etype = mrb_obj_classname(mrb, x);
+        }
+        mrb_raisef(mrb, E_TYPE_ERROR, "wrong argument type %S (expected %S)",
+                   mrb_str_new_cstr(mrb, etype), mrb_str_new_cstr(mrb, type->name));
+      }
+      type++;
+    }
+    mrb_raisef(mrb, E_TYPE_ERROR, "unknown type %S (%S given)",
+               mrb_fixnum_value(t), mrb_fixnum_value(mrb_type(x)));
+  }
+}
+
+/* 15.3.1.3.46 */
+/*
+ *  call-seq:
+ *     obj.to_s    => string
+ *
+ *  Returns a string representing <i>obj</i>. The default
+ *  <code>to_s</code> prints the object's class and an encoding of the
+ *  object id. As a special case, the top-level object that is the
+ *  initial execution context of Ruby programs returns ``main.''
+ */
+
+MRB_API mrb_value
+mrb_any_to_s(mrb_state *mrb, mrb_value obj)
+{
+  mrb_value str = mrb_str_buf_new(mrb, 20);
+  const char *cname = mrb_obj_classname(mrb, obj);
+
+  mrb_str_cat_lit(mrb, str, "#<");
+  mrb_str_cat_cstr(mrb, str, cname);
+  mrb_str_cat_lit(mrb, str, ":");
+  mrb_str_concat(mrb, str, mrb_ptr_to_str(mrb, mrb_cptr(obj)));
+  mrb_str_cat_lit(mrb, str, ">");
+
+  return str;
+}
+
+/*
+ *  call-seq:
+ *     obj.is_a?(class)       => true or false
+ *     obj.kind_of?(class)    => true or false
+ *
+ *  Returns <code>true</code> if <i>class</i> is the class of
+ *  <i>obj</i>, or if <i>class</i> is one of the superclasses of
+ *  <i>obj</i> or modules included in <i>obj</i>.
+ *
+ *     module M;    end
+ *     class A
+ *       include M
+ *     end
+ *     class B < A; end
+ *     class C < B; end
+ *     b = B.new
+ *     b.instance_of? A   #=> false
+ *     b.instance_of? B   #=> true
+ *     b.instance_of? C   #=> false
+ *     b.instance_of? M   #=> false
+ *     b.kind_of? A       #=> true
+ *     b.kind_of? B       #=> true
+ *     b.kind_of? C       #=> false
+ *     b.kind_of? M       #=> true
+ */
+
+MRB_API mrb_bool
+mrb_obj_is_kind_of(mrb_state *mrb, mrb_value obj, struct RClass *c)
+{
+  struct RClass *cl = mrb_class(mrb, obj);
+
+  switch (c->tt) {
+    case MRB_TT_MODULE:
+    case MRB_TT_CLASS:
+    case MRB_TT_ICLASS:
+      break;
+
+    default:
+      mrb_raise(mrb, E_TYPE_ERROR, "class or module required");
+  }
+
+  while (cl) {
+    if (cl == c || cl->mt == c->mt)
+      return TRUE;
+    cl = cl->super;
+  }
+  return FALSE;
+}
+
+static mrb_value
+mrb_to_integer(mrb_state *mrb, mrb_value val, const char *method)
+{
+  mrb_value v;
+
+  if (mrb_fixnum_p(val)) return val;
+  v = convert_type(mrb, val, "Integer", method, TRUE);
+  if (!mrb_obj_is_kind_of(mrb, v, mrb->fixnum_class)) {
+    mrb_value type = inspect_type(mrb, val);
+    mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %S to Integer (%S#%S gives %S)",
+               type, type, mrb_str_new_cstr(mrb, method), inspect_type(mrb, v));
+  }
+  return v;
+}
+
+MRB_API mrb_value
+mrb_to_int(mrb_state *mrb, mrb_value val)
+{
+  return mrb_to_integer(mrb, val, "to_int");
+}
+
+MRB_API mrb_value
+mrb_convert_to_integer(mrb_state *mrb, mrb_value val, int base)
+{
+  mrb_value tmp;
+
+  if (mrb_nil_p(val)) {
+    if (base != 0) goto arg_error;
+      mrb_raise(mrb, E_TYPE_ERROR, "can't convert nil into Integer");
+  }
+  switch (mrb_type(val)) {
+    case MRB_TT_FLOAT:
+      if (base != 0) goto arg_error;
+      if (FIXABLE(mrb_float(val))) {
+        break;
+      }
+      return mrb_flo_to_fixnum(mrb, val);
+
+    case MRB_TT_FIXNUM:
+      if (base != 0) goto arg_error;
+      return val;
+
+    case MRB_TT_STRING:
+    string_conv:
+      return mrb_str_to_inum(mrb, val, base, TRUE);
+
+    default:
+      break;
+  }
+  if (base != 0) {
+    tmp = mrb_check_string_type(mrb, val);
+    if (!mrb_nil_p(tmp)) {
+      goto string_conv;
+    }
+arg_error:
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "base specified for non string value");
+  }
+  tmp = convert_type(mrb, val, "Integer", "to_int", FALSE);
+  if (mrb_nil_p(tmp)) {
+    return mrb_to_integer(mrb, val, "to_i");
+  }
+  return tmp;
+}
+
+MRB_API mrb_value
+mrb_Integer(mrb_state *mrb, mrb_value val)
+{
+  return mrb_convert_to_integer(mrb, val, 0);
+}
+
+MRB_API mrb_value
+mrb_Float(mrb_state *mrb, mrb_value val)
+{
+  if (mrb_nil_p(val)) {
+    mrb_raise(mrb, E_TYPE_ERROR, "can't convert nil into Float");
+  }
+  switch (mrb_type(val)) {
+    case MRB_TT_FIXNUM:
+      return mrb_float_value(mrb, (mrb_float)mrb_fixnum(val));
+
+    case MRB_TT_FLOAT:
+      return val;
+
+    case MRB_TT_STRING:
+      return mrb_float_value(mrb, mrb_str_to_dbl(mrb, val, TRUE));
+
+    default:
+      return mrb_convert_type(mrb, val, MRB_TT_FLOAT, "Float", "to_f");
+  }
+}
+
+MRB_API mrb_value
+mrb_inspect(mrb_state *mrb, mrb_value obj)
+{
+  return mrb_obj_as_string(mrb, mrb_funcall(mrb, obj, "inspect", 0));
+}
+
+MRB_API mrb_bool
+mrb_eql(mrb_state *mrb, mrb_value obj1, mrb_value obj2)
+{
+  if (mrb_obj_eq(mrb, obj1, obj2)) return TRUE;
+  return mrb_test(mrb_funcall(mrb, obj1, "eql?", 1, obj2));
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/opcode.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,3 @@
+/* this header file is to be removed soon. */
+#include "mruby/opcode.h"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/parse.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,12601 @@
+/* A Bison parser, made by GNU Bison 2.4.2.  */
+
+/* Skeleton implementation for Bison's Yacc-like parsers in C
+   
+      Copyright (C) 1984, 1989-1990, 2000-2006, 2009-2010 Free Software
+   Foundation, Inc.
+   
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 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, see <http://www.gnu.org/licenses/>.  */
+
+/* As a special exception, you may create a larger work that contains
+   part or all of the Bison parser skeleton and distribute that work
+   under terms of your choice, so long as that work isn't itself a
+   parser generator using the skeleton or a modified version thereof
+   as a parser skeleton.  Alternatively, if you modify or redistribute
+   the parser skeleton itself, you may (at your option) remove this
+   special exception, which will cause the skeleton and the resulting
+   Bison output files to be licensed under the GNU General Public
+   License without this special exception.
+   
+   This special exception was added by the Free Software Foundation in
+   version 2.2 of Bison.  */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+   simplifying the original so-called "semantic" parser.  */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+   infringing on user name space.  This should be done even for local
+   variables, as they might otherwise be expanded by user macros.
+   There are some unavoidable exceptions within include files to
+   define necessary library symbols; they are noted "INFRINGES ON
+   USER NAME SPACE" below.  */
+
+/* Identify Bison output.  */
+#define YYBISON 1
+
+/* Bison version.  */
+#define YYBISON_VERSION "2.4.2"
+
+/* Skeleton name.  */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers.  */
+#define YYPURE 1
+
+/* Push parsers.  */
+#define YYPUSH 0
+
+/* Pull parsers.  */
+#define YYPULL 1
+
+/* Using locations.  */
+#define YYLSP_NEEDED 0
+
+
+
+/* Copy the first part of user declarations.  */
+
+/* Line 189 of yacc.c  */
+#line 7 "src/parse.y"
+
+#undef PARSER_DEBUG
+
+#define YYDEBUG 1
+#define YYERROR_VERBOSE 1
+/*
+ * Force yacc to use our memory management.  This is a little evil because
+ * the macros assume that "parser_state *p" is in scope
+ */
+#define YYMALLOC(n)    mrb_malloc(p->mrb, (n))
+#define YYFREE(o)      mrb_free(p->mrb, (o))
+#define YYSTACK_USE_ALLOCA 0
+
+#include <ctype.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mruby.h"
+#include "mruby/compile.h"
+#include "mruby/proc.h"
+#include "mruby/error.h"
+#include "node.h"
+#include "mrb_throw.h"
+
+#define YYLEX_PARAM p
+
+typedef mrb_ast_node node;
+typedef struct mrb_parser_state parser_state;
+typedef struct mrb_parser_heredoc_info parser_heredoc_info;
+
+static int yyparse(parser_state *p);
+static int yylex(void *lval, parser_state *p);
+static void yyerror(parser_state *p, const char *s);
+static void yywarn(parser_state *p, const char *s);
+static void yywarning(parser_state *p, const char *s);
+static void backref_error(parser_state *p, node *n);
+static void tokadd(parser_state *p, int32_t c);
+
+#define identchar(c) (ISALNUM(c) || (c) == '_' || !ISASCII(c))
+
+typedef unsigned int stack_type;
+
+#define BITSTACK_PUSH(stack, n) ((stack) = ((stack)<<1)|((n)&1))
+#define BITSTACK_POP(stack)     ((stack) = (stack) >> 1)
+#define BITSTACK_LEXPOP(stack)  ((stack) = ((stack) >> 1) | ((stack) & 1))
+#define BITSTACK_SET_P(stack)   ((stack)&1)
+
+#define COND_PUSH(n)    BITSTACK_PUSH(p->cond_stack, (n))
+#define COND_POP()      BITSTACK_POP(p->cond_stack)
+#define COND_LEXPOP()   BITSTACK_LEXPOP(p->cond_stack)
+#define COND_P()        BITSTACK_SET_P(p->cond_stack)
+
+#define CMDARG_PUSH(n)  BITSTACK_PUSH(p->cmdarg_stack, (n))
+#define CMDARG_POP()    BITSTACK_POP(p->cmdarg_stack)
+#define CMDARG_LEXPOP() BITSTACK_LEXPOP(p->cmdarg_stack)
+#define CMDARG_P()      BITSTACK_SET_P(p->cmdarg_stack)
+
+#define SET_LINENO(c,n) ((c)->lineno = (n))
+#define NODE_LINENO(c,n) do {\
+  if (n) {\
+     (c)->filename_index = (n)->filename_index;\
+     (c)->lineno = (n)->lineno;\
+  }\
+} while (0)
+
+#define sym(x) ((mrb_sym)(intptr_t)(x))
+#define nsym(x) ((node*)(intptr_t)(x))
+
+static inline mrb_sym
+intern_cstr_gen(parser_state *p, const char *s)
+{
+  return mrb_intern_cstr(p->mrb, s);
+}
+#define intern_cstr(s) intern_cstr_gen(p,(s))
+
+static inline mrb_sym
+intern_gen(parser_state *p, const char *s, size_t len)
+{
+  return mrb_intern(p->mrb, s, len);
+}
+#define intern(s,len) intern_gen(p,(s),(len))
+
+static inline mrb_sym
+intern_gen_c(parser_state *p, const char c)
+{
+  return mrb_intern(p->mrb, &c, 1);
+}
+#define intern_c(c) intern_gen_c(p,(c))
+
+static void
+cons_free_gen(parser_state *p, node *cons)
+{
+  cons->cdr = p->cells;
+  p->cells = cons;
+}
+#define cons_free(c) cons_free_gen(p, (c))
+
+static void*
+parser_palloc(parser_state *p, size_t size)
+{
+  void *m = mrb_pool_alloc(p->pool, size);
+
+  if (!m) {
+    MRB_THROW(p->jmp);
+  }
+  return m;
+}
+
+static node*
+cons_gen(parser_state *p, node *car, node *cdr)
+{
+  node *c;
+
+  if (p->cells) {
+    c = p->cells;
+    p->cells = p->cells->cdr;
+  }
+  else {
+    c = (node *)parser_palloc(p, sizeof(mrb_ast_node));
+  }
+
+  c->car = car;
+  c->cdr = cdr;
+  c->lineno = p->lineno;
+  c->filename_index = p->current_filename_index;
+  return c;
+}
+#define cons(a,b) cons_gen(p,(a),(b))
+
+static node*
+list1_gen(parser_state *p, node *a)
+{
+  return cons(a, 0);
+}
+#define list1(a) list1_gen(p, (a))
+
+static node*
+list2_gen(parser_state *p, node *a, node *b)
+{
+  return cons(a, cons(b,0));
+}
+#define list2(a,b) list2_gen(p, (a),(b))
+
+static node*
+list3_gen(parser_state *p, node *a, node *b, node *c)
+{
+  return cons(a, cons(b, cons(c,0)));
+}
+#define list3(a,b,c) list3_gen(p, (a),(b),(c))
+
+static node*
+list4_gen(parser_state *p, node *a, node *b, node *c, node *d)
+{
+  return cons(a, cons(b, cons(c, cons(d, 0))));
+}
+#define list4(a,b,c,d) list4_gen(p, (a),(b),(c),(d))
+
+static node*
+list5_gen(parser_state *p, node *a, node *b, node *c, node *d, node *e)
+{
+  return cons(a, cons(b, cons(c, cons(d, cons(e, 0)))));
+}
+#define list5(a,b,c,d,e) list5_gen(p, (a),(b),(c),(d),(e))
+
+static node*
+list6_gen(parser_state *p, node *a, node *b, node *c, node *d, node *e, node *f)
+{
+  return cons(a, cons(b, cons(c, cons(d, cons(e, cons(f, 0))))));
+}
+#define list6(a,b,c,d,e,f) list6_gen(p, (a),(b),(c),(d),(e),(f))
+
+static node*
+append_gen(parser_state *p, node *a, node *b)
+{
+  node *c = a;
+
+  if (!a) return b;
+  while (c->cdr) {
+    c = c->cdr;
+  }
+  if (b) {
+    c->cdr = b;
+  }
+  return a;
+}
+#define append(a,b) append_gen(p,(a),(b))
+#define push(a,b) append_gen(p,(a),list1(b))
+
+static char*
+parser_strndup(parser_state *p, const char *s, size_t len)
+{
+  char *b = (char *)parser_palloc(p, len+1);
+
+  memcpy(b, s, len);
+  b[len] = '\0';
+  return b;
+}
+#define strndup(s,len) parser_strndup(p, s, len)
+
+static char*
+parser_strdup(parser_state *p, const char *s)
+{
+  return parser_strndup(p, s, strlen(s));
+}
+#undef strdup
+#define strdup(s) parser_strdup(p, s)
+
+/* xxx ----------------------------- */
+
+static node*
+local_switch(parser_state *p)
+{
+  node *prev = p->locals;
+
+  p->locals = cons(0, 0);
+  return prev;
+}
+
+static void
+local_resume(parser_state *p, node *prev)
+{
+  p->locals = prev;
+}
+
+static void
+local_nest(parser_state *p)
+{
+  p->locals = cons(0, p->locals);
+}
+
+static void
+local_unnest(parser_state *p)
+{
+  p->locals = p->locals->cdr;
+}
+
+static mrb_bool
+local_var_p(parser_state *p, mrb_sym sym)
+{
+  node *l = p->locals;
+
+  while (l) {
+    node *n = l->car;
+    while (n) {
+      if (sym(n->car) == sym) return TRUE;
+      n = n->cdr;
+    }
+    l = l->cdr;
+  }
+  return FALSE;
+}
+
+static void
+local_add_f(parser_state *p, mrb_sym sym)
+{
+  p->locals->car = push(p->locals->car, nsym(sym));
+}
+
+static void
+local_add(parser_state *p, mrb_sym sym)
+{
+  if (!local_var_p(p, sym)) {
+    local_add_f(p, sym);
+  }
+}
+
+/* (:scope (vars..) (prog...)) */
+static node*
+new_scope(parser_state *p, node *body)
+{
+  return cons((node*)NODE_SCOPE, cons(p->locals->car, body));
+}
+
+/* (:begin prog...) */
+static node*
+new_begin(parser_state *p, node *body)
+{
+  if (body) {
+    return list2((node*)NODE_BEGIN, body);
+  }
+  return cons((node*)NODE_BEGIN, 0);
+}
+
+#define newline_node(n) (n)
+
+/* (:rescue body rescue else) */
+static node*
+new_rescue(parser_state *p, node *body, node *resq, node *els)
+{
+  return list4((node*)NODE_RESCUE, body, resq, els);
+}
+
+/* (:ensure body ensure) */
+static node*
+new_ensure(parser_state *p, node *a, node *b)
+{
+  return cons((node*)NODE_ENSURE, cons(a, cons(0, b)));
+}
+
+/* (:nil) */
+static node*
+new_nil(parser_state *p)
+{
+  return list1((node*)NODE_NIL);
+}
+
+/* (:true) */
+static node*
+new_true(parser_state *p)
+{
+  return list1((node*)NODE_TRUE);
+}
+
+/* (:false) */
+static node*
+new_false(parser_state *p)
+{
+  return list1((node*)NODE_FALSE);
+}
+
+/* (:alias new old) */
+static node*
+new_alias(parser_state *p, mrb_sym a, mrb_sym b)
+{
+  return cons((node*)NODE_ALIAS, cons(nsym(a), nsym(b)));
+}
+
+/* (:if cond then else) */
+static node*
+new_if(parser_state *p, node *a, node *b, node *c)
+{
+  return list4((node*)NODE_IF, a, b, c);
+}
+
+/* (:unless cond then else) */
+static node*
+new_unless(parser_state *p, node *a, node *b, node *c)
+{
+  return list4((node*)NODE_IF, a, c, b);
+}
+
+/* (:while cond body) */
+static node*
+new_while(parser_state *p, node *a, node *b)
+{
+  return cons((node*)NODE_WHILE, cons(a, b));
+}
+
+/* (:until cond body) */
+static node*
+new_until(parser_state *p, node *a, node *b)
+{
+  return cons((node*)NODE_UNTIL, cons(a, b));
+}
+
+/* (:for var obj body) */
+static node*
+new_for(parser_state *p, node *v, node *o, node *b)
+{
+  return list4((node*)NODE_FOR, v, o, b);
+}
+
+/* (:case a ((when ...) body) ((when...) body)) */
+static node*
+new_case(parser_state *p, node *a, node *b)
+{
+  node *n = list2((node*)NODE_CASE, a);
+  node *n2 = n;
+
+  while (n2->cdr) {
+    n2 = n2->cdr;
+  }
+  n2->cdr = b;
+  return n;
+}
+
+/* (:postexe a) */
+static node*
+new_postexe(parser_state *p, node *a)
+{
+  return cons((node*)NODE_POSTEXE, a);
+}
+
+/* (:self) */
+static node*
+new_self(parser_state *p)
+{
+  return list1((node*)NODE_SELF);
+}
+
+/* (:call a b c) */
+static node*
+new_call(parser_state *p, node *a, mrb_sym b, node *c)
+{
+  node *n = list4((node*)NODE_CALL, a, nsym(b), c);
+  NODE_LINENO(n, a);
+  return n;
+}
+
+/* (:fcall self mid args) */
+static node*
+new_fcall(parser_state *p, mrb_sym b, node *c)
+{
+  node *n = new_self(p);
+  NODE_LINENO(n, c);
+  n = list4((node*)NODE_FCALL, n, nsym(b), c);
+  NODE_LINENO(n, c);
+  return n;
+}
+
+/* (:super . c) */
+static node*
+new_super(parser_state *p, node *c)
+{
+  return cons((node*)NODE_SUPER, c);
+}
+
+/* (:zsuper) */
+static node*
+new_zsuper(parser_state *p)
+{
+  return list1((node*)NODE_ZSUPER);
+}
+
+/* (:yield . c) */
+static node*
+new_yield(parser_state *p, node *c)
+{
+  if (c) {
+    if (c->cdr) {
+      yyerror(p, "both block arg and actual block given");
+    }
+    return cons((node*)NODE_YIELD, c->car);
+  }
+  return cons((node*)NODE_YIELD, 0);
+}
+
+/* (:return . c) */
+static node*
+new_return(parser_state *p, node *c)
+{
+  return cons((node*)NODE_RETURN, c);
+}
+
+/* (:break . c) */
+static node*
+new_break(parser_state *p, node *c)
+{
+  return cons((node*)NODE_BREAK, c);
+}
+
+/* (:next . c) */
+static node*
+new_next(parser_state *p, node *c)
+{
+  return cons((node*)NODE_NEXT, c);
+}
+
+/* (:redo) */
+static node*
+new_redo(parser_state *p)
+{
+  return list1((node*)NODE_REDO);
+}
+
+/* (:retry) */
+static node*
+new_retry(parser_state *p)
+{
+  return list1((node*)NODE_RETRY);
+}
+
+/* (:dot2 a b) */
+static node*
+new_dot2(parser_state *p, node *a, node *b)
+{
+  return cons((node*)NODE_DOT2, cons(a, b));
+}
+
+/* (:dot3 a b) */
+static node*
+new_dot3(parser_state *p, node *a, node *b)
+{
+  return cons((node*)NODE_DOT3, cons(a, b));
+}
+
+/* (:colon2 b c) */
+static node*
+new_colon2(parser_state *p, node *b, mrb_sym c)
+{
+  return cons((node*)NODE_COLON2, cons(b, nsym(c)));
+}
+
+/* (:colon3 . c) */
+static node*
+new_colon3(parser_state *p, mrb_sym c)
+{
+  return cons((node*)NODE_COLON3, nsym(c));
+}
+
+/* (:and a b) */
+static node*
+new_and(parser_state *p, node *a, node *b)
+{
+  return cons((node*)NODE_AND, cons(a, b));
+}
+
+/* (:or a b) */
+static node*
+new_or(parser_state *p, node *a, node *b)
+{
+  return cons((node*)NODE_OR, cons(a, b));
+}
+
+/* (:array a...) */
+static node*
+new_array(parser_state *p, node *a)
+{
+  return cons((node*)NODE_ARRAY, a);
+}
+
+/* (:splat . a) */
+static node*
+new_splat(parser_state *p, node *a)
+{
+  return cons((node*)NODE_SPLAT, a);
+}
+
+/* (:hash (k . v) (k . v)...) */
+static node*
+new_hash(parser_state *p, node *a)
+{
+  return cons((node*)NODE_HASH, a);
+}
+
+/* (:sym . a) */
+static node*
+new_sym(parser_state *p, mrb_sym sym)
+{
+  return cons((node*)NODE_SYM, nsym(sym));
+}
+
+static mrb_sym
+new_strsym(parser_state *p, node* str)
+{
+  const char *s = (const char*)str->cdr->car;
+  size_t len = (size_t)str->cdr->cdr;
+
+  return mrb_intern(p->mrb, s, len);
+}
+
+/* (:lvar . a) */
+static node*
+new_lvar(parser_state *p, mrb_sym sym)
+{
+  return cons((node*)NODE_LVAR, nsym(sym));
+}
+
+/* (:gvar . a) */
+static node*
+new_gvar(parser_state *p, mrb_sym sym)
+{
+  return cons((node*)NODE_GVAR, nsym(sym));
+}
+
+/* (:ivar . a) */
+static node*
+new_ivar(parser_state *p, mrb_sym sym)
+{
+  return cons((node*)NODE_IVAR, nsym(sym));
+}
+
+/* (:cvar . a) */
+static node*
+new_cvar(parser_state *p, mrb_sym sym)
+{
+  return cons((node*)NODE_CVAR, nsym(sym));
+}
+
+/* (:const . a) */
+static node*
+new_const(parser_state *p, mrb_sym sym)
+{
+  return cons((node*)NODE_CONST, nsym(sym));
+}
+
+/* (:undef a...) */
+static node*
+new_undef(parser_state *p, mrb_sym sym)
+{
+  return list2((node*)NODE_UNDEF, nsym(sym));
+}
+
+/* (:class class super body) */
+static node*
+new_class(parser_state *p, node *c, node *s, node *b)
+{
+  return list4((node*)NODE_CLASS, c, s, cons(p->locals->car, b));
+}
+
+/* (:sclass obj body) */
+static node*
+new_sclass(parser_state *p, node *o, node *b)
+{
+  return list3((node*)NODE_SCLASS, o, cons(p->locals->car, b));
+}
+
+/* (:module module body) */
+static node*
+new_module(parser_state *p, node *m, node *b)
+{
+  return list3((node*)NODE_MODULE, m, cons(p->locals->car, b));
+}
+
+/* (:def m lv (arg . body)) */
+static node*
+new_def(parser_state *p, mrb_sym m, node *a, node *b)
+{
+  return list5((node*)NODE_DEF, nsym(m), p->locals->car, a, b);
+}
+
+/* (:sdef obj m lv (arg . body)) */
+static node*
+new_sdef(parser_state *p, node *o, mrb_sym m, node *a, node *b)
+{
+  return list6((node*)NODE_SDEF, o, nsym(m), p->locals->car, a, b);
+}
+
+/* (:arg . sym) */
+static node*
+new_arg(parser_state *p, mrb_sym sym)
+{
+  return cons((node*)NODE_ARG, nsym(sym));
+}
+
+/* (m o r m2 b) */
+/* m: (a b c) */
+/* o: ((a . e1) (b . e2)) */
+/* r: a */
+/* m2: (a b c) */
+/* b: a */
+static node*
+new_args(parser_state *p, node *m, node *opt, mrb_sym rest, node *m2, mrb_sym blk)
+{
+  node *n;
+
+  n = cons(m2, nsym(blk));
+  n = cons(nsym(rest), n);
+  n = cons(opt, n);
+  return cons(m, n);
+}
+
+/* (:block_arg . a) */
+static node*
+new_block_arg(parser_state *p, node *a)
+{
+  return cons((node*)NODE_BLOCK_ARG, a);
+}
+
+/* (:block arg body) */
+static node*
+new_block(parser_state *p, node *a, node *b)
+{
+  return list4((node*)NODE_BLOCK, p->locals->car, a, b);
+}
+
+/* (:lambda arg body) */
+static node*
+new_lambda(parser_state *p, node *a, node *b)
+{
+  return list4((node*)NODE_LAMBDA, p->locals->car, a, b);
+}
+
+/* (:asgn lhs rhs) */
+static node*
+new_asgn(parser_state *p, node *a, node *b)
+{
+  return cons((node*)NODE_ASGN, cons(a, b));
+}
+
+/* (:masgn mlhs=(pre rest post)  mrhs) */
+static node*
+new_masgn(parser_state *p, node *a, node *b)
+{
+  return cons((node*)NODE_MASGN, cons(a, b));
+}
+
+/* (:asgn lhs rhs) */
+static node*
+new_op_asgn(parser_state *p, node *a, mrb_sym op, node *b)
+{
+  return list4((node*)NODE_OP_ASGN, a, nsym(op), b);
+}
+
+/* (:int . i) */
+static node*
+new_int(parser_state *p, const char *s, int base)
+{
+  return list3((node*)NODE_INT, (node*)strdup(s), (node*)(intptr_t)base);
+}
+
+/* (:float . i) */
+static node*
+new_float(parser_state *p, const char *s)
+{
+  return cons((node*)NODE_FLOAT, (node*)strdup(s));
+}
+
+/* (:str . (s . len)) */
+static node*
+new_str(parser_state *p, const char *s, int len)
+{
+  return cons((node*)NODE_STR, cons((node*)strndup(s, len), (node*)(intptr_t)len));
+}
+
+/* (:dstr . a) */
+static node*
+new_dstr(parser_state *p, node *a)
+{
+  return cons((node*)NODE_DSTR, a);
+}
+
+/* (:str . (s . len)) */
+static node*
+new_xstr(parser_state *p, const char *s, int len)
+{
+  return cons((node*)NODE_XSTR, cons((node*)strndup(s, len), (node*)(intptr_t)len));
+}
+
+/* (:xstr . a) */
+static node*
+new_dxstr(parser_state *p, node *a)
+{
+  return cons((node*)NODE_DXSTR, a);
+}
+
+/* (:dsym . a) */
+static node*
+new_dsym(parser_state *p, node *a)
+{
+  return cons((node*)NODE_DSYM, new_dstr(p, a));
+}
+
+/* (:str . (a . a)) */
+static node*
+new_regx(parser_state *p, const char *p1, const char* p2)
+{
+  return cons((node*)NODE_REGX, cons((node*)p1, (node*)p2));
+}
+
+/* (:dregx . a) */
+static node*
+new_dregx(parser_state *p, node *a, node *b)
+{
+  return cons((node*)NODE_DREGX, cons(a, b));
+}
+
+/* (:backref . n) */
+static node*
+new_back_ref(parser_state *p, int n)
+{
+  return cons((node*)NODE_BACK_REF, (node*)(intptr_t)n);
+}
+
+/* (:nthref . n) */
+static node*
+new_nth_ref(parser_state *p, int n)
+{
+  return cons((node*)NODE_NTH_REF, (node*)(intptr_t)n);
+}
+
+/* (:heredoc . a) */
+static node*
+new_heredoc(parser_state *p)
+{
+  parser_heredoc_info *inf = (parser_heredoc_info *)parser_palloc(p, sizeof(parser_heredoc_info));
+  return cons((node*)NODE_HEREDOC, (node*)inf);
+}
+
+static void
+new_bv(parser_state *p, mrb_sym id)
+{
+}
+
+static node*
+new_literal_delim(parser_state *p)
+{
+  return cons((node*)NODE_LITERAL_DELIM, 0);
+}
+
+/* (:words . a) */
+static node*
+new_words(parser_state *p, node *a)
+{
+  return cons((node*)NODE_WORDS, a);
+}
+
+/* (:symbols . a) */
+static node*
+new_symbols(parser_state *p, node *a)
+{
+  return cons((node*)NODE_SYMBOLS, a);
+}
+
+/* xxx ----------------------------- */
+
+/* (:call a op) */
+static node*
+call_uni_op(parser_state *p, node *recv, const char *m)
+{
+  return new_call(p, recv, intern_cstr(m), 0);
+}
+
+/* (:call a op b) */
+static node*
+call_bin_op(parser_state *p, node *recv, const char *m, node *arg1)
+{
+  return new_call(p, recv, intern_cstr(m), list1(list1(arg1)));
+}
+
+static void
+args_with_block(parser_state *p, node *a, node *b)
+{
+  if (b) {
+    if (a->cdr) {
+      yyerror(p, "both block arg and actual block given");
+    }
+    a->cdr = b;
+  }
+}
+
+static void
+call_with_block(parser_state *p, node *a, node *b)
+{
+  node *n;
+
+  if (a->car == (node*)NODE_SUPER ||
+      a->car == (node*)NODE_ZSUPER) {
+    if (!a->cdr) a->cdr = cons(0, b);
+    else {
+      args_with_block(p, a->cdr, b);
+    }
+  }
+  else {
+    n = a->cdr->cdr->cdr;
+    if (!n->car) n->car = cons(0, b);
+    else {
+      args_with_block(p, n->car, b);
+    }
+  }
+}
+
+static node*
+negate_lit(parser_state *p, node *n)
+{
+  return cons((node*)NODE_NEGATE, n);
+}
+
+static node*
+cond(node *n)
+{
+  return n;
+}
+
+static node*
+ret_args(parser_state *p, node *n)
+{
+  if (n->cdr) {
+    yyerror(p, "block argument should not be given");
+    return NULL;
+  }
+  if (!n->car->cdr) return n->car->car;
+  return new_array(p, n->car);
+}
+
+static void
+assignable(parser_state *p, node *lhs)
+{
+  if ((int)(intptr_t)lhs->car == NODE_LVAR) {
+    local_add(p, sym(lhs->cdr));
+  }
+}
+
+static node*
+var_reference(parser_state *p, node *lhs)
+{
+  node *n;
+
+  if ((int)(intptr_t)lhs->car == NODE_LVAR) {
+    if (!local_var_p(p, sym(lhs->cdr))) {
+      n = new_fcall(p, sym(lhs->cdr), 0);
+      cons_free(lhs);
+      return n;
+    }
+  }
+
+  return lhs;
+}
+
+typedef enum mrb_string_type  string_type;
+
+static node*
+new_strterm(parser_state *p, string_type type, int term, int paren)
+{
+  return cons((node*)(intptr_t)type, cons((node*)0, cons((node*)(intptr_t)paren, (node*)(intptr_t)term)));
+}
+
+static void
+end_strterm(parser_state *p)
+{
+  cons_free(p->lex_strterm->cdr->cdr);
+  cons_free(p->lex_strterm->cdr);
+  cons_free(p->lex_strterm);
+  p->lex_strterm = NULL;
+}
+
+static parser_heredoc_info *
+parsing_heredoc_inf(parser_state *p)
+{
+  node *nd = p->parsing_heredoc;
+  if (nd == NULL)
+    return NULL;
+  /* mrb_assert(nd->car->car == NODE_HEREDOC); */
+  return (parser_heredoc_info*)nd->car->cdr;
+}
+
+static void
+heredoc_treat_nextline(parser_state *p)
+{
+  if (p->heredocs_from_nextline == NULL)
+    return;
+  if (p->parsing_heredoc == NULL) {
+    node *n;
+    p->parsing_heredoc = p->heredocs_from_nextline;
+    p->lex_strterm_before_heredoc = p->lex_strterm;
+    p->lex_strterm = new_strterm(p, parsing_heredoc_inf(p)->type, 0, 0);
+    n = p->all_heredocs;
+    if (n) {
+      while (n->cdr)
+        n = n->cdr;
+      n->cdr = p->parsing_heredoc;
+    }
+    else {
+      p->all_heredocs = p->parsing_heredoc;
+    }
+  }
+  else {
+    node *n, *m;
+    m = p->heredocs_from_nextline;
+    while (m->cdr)
+      m = m->cdr;
+    n = p->all_heredocs;
+    mrb_assert(n != NULL);
+    if (n == p->parsing_heredoc) {
+      m->cdr = n;
+      p->all_heredocs = p->heredocs_from_nextline;
+      p->parsing_heredoc = p->heredocs_from_nextline;
+    }
+    else {
+      while (n->cdr != p->parsing_heredoc) {
+        n = n->cdr;
+        mrb_assert(n != NULL);
+      }
+      m->cdr = n->cdr;
+      n->cdr = p->heredocs_from_nextline;
+      p->parsing_heredoc = p->heredocs_from_nextline;
+    }
+  }
+  p->heredocs_from_nextline = NULL;
+}
+
+static void
+heredoc_end(parser_state *p)
+{
+  p->parsing_heredoc = p->parsing_heredoc->cdr;
+  if (p->parsing_heredoc == NULL) {
+    p->lstate = EXPR_BEG;
+    p->cmd_start = TRUE;
+    end_strterm(p);
+    p->lex_strterm = p->lex_strterm_before_heredoc;
+    p->lex_strterm_before_heredoc = NULL;
+    p->heredoc_end_now = TRUE;
+  }
+  else {
+    /* next heredoc */
+    p->lex_strterm->car = (node*)(intptr_t)parsing_heredoc_inf(p)->type;
+  }
+}
+#define is_strterm_type(p,str_func) ((int)(intptr_t)((p)->lex_strterm->car) & (str_func))
+
+/* xxx ----------------------------- */
+
+
+
+/* Line 189 of yacc.c  */
+#line 1067 "C:/Users/matsuzaki.takuya/work/daily/20150106/mruby-1.1.0/build/ARMCA9/src/y.tab.c"
+
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+/* Enabling verbose error messages.  */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+/* Enabling the token table.  */
+#ifndef YYTOKEN_TABLE
+# define YYTOKEN_TABLE 0
+#endif
+
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     keyword_class = 258,
+     keyword_module = 259,
+     keyword_def = 260,
+     keyword_begin = 261,
+     keyword_if = 262,
+     keyword_unless = 263,
+     keyword_while = 264,
+     keyword_until = 265,
+     keyword_for = 266,
+     keyword_undef = 267,
+     keyword_rescue = 268,
+     keyword_ensure = 269,
+     keyword_end = 270,
+     keyword_then = 271,
+     keyword_elsif = 272,
+     keyword_else = 273,
+     keyword_case = 274,
+     keyword_when = 275,
+     keyword_break = 276,
+     keyword_next = 277,
+     keyword_redo = 278,
+     keyword_retry = 279,
+     keyword_in = 280,
+     keyword_do = 281,
+     keyword_do_cond = 282,
+     keyword_do_block = 283,
+     keyword_do_LAMBDA = 284,
+     keyword_return = 285,
+     keyword_yield = 286,
+     keyword_super = 287,
+     keyword_self = 288,
+     keyword_nil = 289,
+     keyword_true = 290,
+     keyword_false = 291,
+     keyword_and = 292,
+     keyword_or = 293,
+     keyword_not = 294,
+     modifier_if = 295,
+     modifier_unless = 296,
+     modifier_while = 297,
+     modifier_until = 298,
+     modifier_rescue = 299,
+     keyword_alias = 300,
+     keyword_BEGIN = 301,
+     keyword_END = 302,
+     keyword__LINE__ = 303,
+     keyword__FILE__ = 304,
+     keyword__ENCODING__ = 305,
+     tIDENTIFIER = 306,
+     tFID = 307,
+     tGVAR = 308,
+     tIVAR = 309,
+     tCONSTANT = 310,
+     tCVAR = 311,
+     tLABEL = 312,
+     tINTEGER = 313,
+     tFLOAT = 314,
+     tCHAR = 315,
+     tXSTRING = 316,
+     tREGEXP = 317,
+     tSTRING = 318,
+     tSTRING_PART = 319,
+     tSTRING_MID = 320,
+     tNTH_REF = 321,
+     tBACK_REF = 322,
+     tREGEXP_END = 323,
+     tUPLUS = 324,
+     tUMINUS = 325,
+     tPOW = 326,
+     tCMP = 327,
+     tEQ = 328,
+     tEQQ = 329,
+     tNEQ = 330,
+     tGEQ = 331,
+     tLEQ = 332,
+     tANDOP = 333,
+     tOROP = 334,
+     tMATCH = 335,
+     tNMATCH = 336,
+     tDOT2 = 337,
+     tDOT3 = 338,
+     tAREF = 339,
+     tASET = 340,
+     tLSHFT = 341,
+     tRSHFT = 342,
+     tCOLON2 = 343,
+     tCOLON3 = 344,
+     tOP_ASGN = 345,
+     tASSOC = 346,
+     tLPAREN = 347,
+     tLPAREN_ARG = 348,
+     tRPAREN = 349,
+     tLBRACK = 350,
+     tLBRACE = 351,
+     tLBRACE_ARG = 352,
+     tSTAR = 353,
+     tAMPER = 354,
+     tLAMBDA = 355,
+     tSYMBEG = 356,
+     tREGEXP_BEG = 357,
+     tWORDS_BEG = 358,
+     tSYMBOLS_BEG = 359,
+     tSTRING_BEG = 360,
+     tXSTRING_BEG = 361,
+     tSTRING_DVAR = 362,
+     tLAMBEG = 363,
+     tHEREDOC_BEG = 364,
+     tHEREDOC_END = 365,
+     tLITERAL_DELIM = 366,
+     tHD_LITERAL_DELIM = 367,
+     tHD_STRING_PART = 368,
+     tHD_STRING_MID = 369,
+     tLOWEST = 370,
+     tUMINUS_NUM = 371,
+     idNULL = 372,
+     idRespond_to = 373,
+     idIFUNC = 374,
+     idCFUNC = 375,
+     id_core_set_method_alias = 376,
+     id_core_set_variable_alias = 377,
+     id_core_undef_method = 378,
+     id_core_define_method = 379,
+     id_core_define_singleton_method = 380,
+     id_core_set_postexe = 381,
+     tLAST_TOKEN = 382
+   };
+#endif
+
+
+
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef union YYSTYPE
+{
+
+/* Line 214 of yacc.c  */
+#line 1005 "src/parse.y"
+
+    node *nd;
+    mrb_sym id;
+    int num;
+    stack_type stack;
+    const struct vtable *vars;
+
+
+
+/* Line 214 of yacc.c  */
+#line 1240 "C:/Users/matsuzaki.takuya/work/daily/20150106/mruby-1.1.0/build/ARMCA9/src/y.tab.c"
+} YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+/* Copy the second part of user declarations.  */
+
+
+/* Line 264 of yacc.c  */
+#line 1252 "C:/Users/matsuzaki.takuya/work/daily/20150106/mruby-1.1.0/build/ARMCA9/src/y.tab.c"
+
+#ifdef short
+# undef short
+#endif
+
+#ifdef YYTYPE_UINT8
+typedef YYTYPE_UINT8 yytype_uint8;
+#else
+typedef unsigned char yytype_uint8;
+#endif
+
+#ifdef YYTYPE_INT8
+typedef YYTYPE_INT8 yytype_int8;
+#elif (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+typedef signed char yytype_int8;
+#else
+typedef short int yytype_int8;
+#endif
+
+#ifdef YYTYPE_UINT16
+typedef YYTYPE_UINT16 yytype_uint16;
+#else
+typedef unsigned short int yytype_uint16;
+#endif
+
+#ifdef YYTYPE_INT16
+typedef YYTYPE_INT16 yytype_int16;
+#else
+typedef short int yytype_int16;
+#endif
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+#  define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+#  define YYSIZE_T size_t
+# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYSIZE_T size_t
+# else
+#  define YYSIZE_T unsigned int
+# endif
+#endif
+
+#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
+
+#ifndef YY_
+# if defined YYENABLE_NLS && YYENABLE_NLS
+#  if ENABLE_NLS
+#   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+#   define YY_(msgid) dgettext ("bison-runtime", msgid)
+#  endif
+# endif
+# ifndef YY_
+#  define YY_(msgid) msgid
+# endif
+#endif
+
+/* Suppress unused-variable warnings by "using" E.  */
+#if ! defined lint || defined __GNUC__
+# define YYUSE(e) ((void) (e))
+#else
+# define YYUSE(e) /* empty */
+#endif
+
+/* Identity function, used to suppress warnings about constant conditions.  */
+#ifndef lint
+# define YYID(n) (n)
+#else
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static int
+YYID (int yyi)
+#else
+static int
+YYID (yyi)
+    int yyi;
+#endif
+{
+  return yyi;
+}
+#endif
+
+#if ! defined yyoverflow || YYERROR_VERBOSE
+
+/* The parser invokes alloca or malloc; define the necessary symbols.  */
+
+# ifdef YYSTACK_USE_ALLOCA
+#  if YYSTACK_USE_ALLOCA
+#   ifdef __GNUC__
+#    define YYSTACK_ALLOC __builtin_alloca
+#   elif defined __BUILTIN_VA_ARG_INCR
+#    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+#   elif defined _AIX
+#    define YYSTACK_ALLOC __alloca
+#   elif defined _MSC_VER
+#    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+#    define alloca _alloca
+#   else
+#    define YYSTACK_ALLOC alloca
+#    if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+#     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#     ifndef _STDLIB_H
+#      define _STDLIB_H 1
+#     endif
+#    endif
+#   endif
+#  endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+   /* Pacify GCC's `empty if-body' warning.  */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
+#  ifndef YYSTACK_ALLOC_MAXIMUM
+    /* The OS might guarantee only one guard page at the bottom of the stack,
+       and a page size can be as small as 4096 bytes.  So we cannot safely
+       invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
+       to allow for a few compiler-allocated temporary stack slots.  */
+#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
+#  endif
+# else
+#  define YYSTACK_ALLOC YYMALLOC
+#  define YYSTACK_FREE YYFREE
+#  ifndef YYSTACK_ALLOC_MAXIMUM
+#   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
+#  endif
+#  if (defined __cplusplus && ! defined _STDLIB_H \
+       && ! ((defined YYMALLOC || defined malloc) \
+	     && (defined YYFREE || defined free)))
+#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#   ifndef _STDLIB_H
+#    define _STDLIB_H 1
+#   endif
+#  endif
+#  ifndef YYMALLOC
+#   define YYMALLOC malloc
+#   if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+#   endif
+#  endif
+#  ifndef YYFREE
+#   define YYFREE free
+#   if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+void free (void *); /* INFRINGES ON USER NAME SPACE */
+#   endif
+#  endif
+# endif
+#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
+
+
+#if (! defined yyoverflow \
+     && (! defined __cplusplus \
+	 || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member.  */
+union yyalloc
+{
+  yytype_int16 yyss_alloc;
+  YYSTYPE yyvs_alloc;
+};
+
+/* The size of the maximum gap between one aligned stack and the next.  */
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+   N elements.  */
+# define YYSTACK_BYTES(N) \
+     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
+      + YYSTACK_GAP_MAXIMUM)
+
+/* Copy COUNT objects from FROM to TO.  The source and destination do
+   not overlap.  */
+# ifndef YYCOPY
+#  if defined __GNUC__ && 1 < __GNUC__
+#   define YYCOPY(To, From, Count) \
+      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+#  else
+#   define YYCOPY(To, From, Count)		\
+      do					\
+	{					\
+	  YYSIZE_T yyi;				\
+	  for (yyi = 0; yyi < (Count); yyi++)	\
+	    (To)[yyi] = (From)[yyi];		\
+	}					\
+      while (YYID (0))
+#  endif
+# endif
+
+/* Relocate STACK from its old location to the new one.  The
+   local variables YYSIZE and YYSTACKSIZE give the old and new number of
+   elements in the stack, and YYPTR gives the new location of the
+   stack.  Advance YYPTR to a properly aligned location for the next
+   stack.  */
+# define YYSTACK_RELOCATE(Stack_alloc, Stack)				\
+    do									\
+      {									\
+	YYSIZE_T yynewbytes;						\
+	YYCOPY (&yyptr->Stack_alloc, Stack, yysize);			\
+	Stack = &yyptr->Stack_alloc;					\
+	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+	yyptr += yynewbytes / sizeof (*yyptr);				\
+      }									\
+    while (YYID (0))
+
+#endif
+
+/* YYFINAL -- State number of the termination state.  */
+#define YYFINAL  3
+/* YYLAST -- Last index in YYTABLE.  */
+#define YYLAST   10941
+
+/* YYNTOKENS -- Number of terminals.  */
+#define YYNTOKENS  154
+/* YYNNTS -- Number of nonterminals.  */
+#define YYNNTS  160
+/* YYNRULES -- Number of rules.  */
+#define YYNRULES  555
+/* YYNRULES -- Number of states.  */
+#define YYNSTATES  970
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
+#define YYUNDEFTOK  2
+#define YYMAXUTOK   382
+
+#define YYTRANSLATE(YYX)						\
+  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
+static const yytype_uint8 yytranslate[] =
+{
+       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     153,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,   130,     2,     2,     2,   128,   123,     2,
+     149,   150,   126,   124,   147,   125,   146,   127,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,   118,   152,
+     120,   116,   119,   117,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,   145,     2,   151,   122,     2,   148,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,   143,   121,   144,   131,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
+      65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
+      75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
+      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
+      95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
+     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
+     115,   129,   132,   133,   134,   135,   136,   137,   138,   139,
+     140,   141,   142
+};
+
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+   YYRHS.  */
+static const yytype_uint16 yyprhs[] =
+{
+       0,     0,     3,     4,     7,    10,    12,    14,    18,    21,
+      23,    24,    30,    35,    38,    40,    42,    46,    49,    50,
+      55,    58,    62,    66,    70,    74,    78,    83,    85,    89,
+      93,   100,   106,   112,   118,   124,   128,   132,   136,   140,
+     142,   146,   150,   152,   156,   160,   164,   167,   169,   171,
+     173,   175,   177,   182,   183,   189,   192,   196,   201,   207,
+     212,   218,   221,   224,   227,   230,   233,   235,   239,   241,
+     245,   247,   250,   254,   260,   263,   268,   271,   276,   278,
+     282,   284,   288,   291,   295,   297,   300,   302,   307,   311,
+     315,   319,   323,   326,   328,   330,   335,   339,   343,   347,
+     351,   354,   356,   358,   360,   363,   365,   369,   371,   373,
+     375,   377,   379,   381,   383,   385,   386,   391,   393,   395,
+     397,   399,   401,   403,   405,   407,   409,   411,   413,   415,
+     417,   419,   421,   423,   425,   427,   429,   431,   433,   435,
+     437,   439,   441,   443,   445,   447,   449,   451,   453,   455,
+     457,   459,   461,   463,   465,   467,   469,   471,   473,   475,
+     477,   479,   481,   483,   485,   487,   489,   491,   493,   495,
+     497,   499,   501,   503,   505,   507,   509,   511,   513,   515,
+     517,   519,   521,   523,   525,   527,   529,   533,   539,   543,
+     549,   556,   562,   568,   574,   580,   585,   589,   593,   597,
+     601,   605,   609,   613,   617,   621,   626,   631,   634,   637,
+     641,   645,   649,   653,   657,   661,   665,   669,   673,   677,
+     681,   685,   689,   692,   695,   699,   703,   707,   711,   718,
+     720,   722,   724,   727,   732,   735,   739,   741,   743,   745,
+     747,   750,   755,   758,   760,   763,   766,   771,   773,   774,
+     777,   780,   783,   785,   787,   790,   794,   799,   804,   810,
+     814,   819,   822,   824,   826,   828,   830,   832,   834,   836,
+     838,   839,   844,   845,   846,   852,   853,   857,   861,   865,
+     868,   872,   876,   878,   883,   887,   889,   894,   898,   901,
+     903,   906,   907,   912,   919,   926,   927,   928,   936,   937,
+     938,   946,   952,   957,   958,   959,   969,   970,   977,   978,
+     979,   988,   989,   995,   996,   997,  1005,  1006,  1007,  1017,
+    1019,  1021,  1023,  1025,  1027,  1029,  1031,  1034,  1036,  1038,
+    1040,  1046,  1048,  1051,  1053,  1055,  1057,  1061,  1063,  1067,
+    1069,  1074,  1081,  1085,  1091,  1094,  1099,  1101,  1105,  1112,
+    1121,  1126,  1133,  1138,  1141,  1148,  1151,  1156,  1163,  1166,
+    1171,  1174,  1179,  1181,  1183,  1185,  1189,  1191,  1196,  1198,
+    1203,  1205,  1209,  1211,  1213,  1218,  1220,  1224,  1228,  1229,
+    1235,  1238,  1243,  1249,  1255,  1258,  1263,  1268,  1272,  1276,
+    1280,  1283,  1285,  1290,  1291,  1297,  1298,  1304,  1310,  1312,
+    1314,  1321,  1323,  1325,  1327,  1329,  1332,  1334,  1337,  1339,
+    1341,  1343,  1345,  1347,  1349,  1351,  1354,  1358,  1360,  1363,
+    1365,  1366,  1371,  1373,  1376,  1379,  1383,  1386,  1390,  1392,
+    1393,  1395,  1397,  1400,  1402,  1405,  1407,  1410,  1412,  1413,
+    1418,  1421,  1425,  1427,  1432,  1435,  1437,  1439,  1441,  1443,
+    1445,  1448,  1451,  1455,  1457,  1459,  1462,  1465,  1467,  1469,
+    1471,  1473,  1475,  1477,  1479,  1481,  1483,  1485,  1487,  1489,
+    1491,  1493,  1495,  1497,  1498,  1503,  1506,  1510,  1513,  1520,
+    1529,  1534,  1541,  1546,  1553,  1556,  1561,  1568,  1571,  1576,
+    1579,  1584,  1586,  1587,  1589,  1591,  1593,  1595,  1597,  1599,
+    1601,  1605,  1607,  1611,  1614,  1617,  1620,  1622,  1626,  1628,
+    1632,  1634,  1636,  1639,  1641,  1643,  1645,  1648,  1651,  1653,
+    1655,  1656,  1661,  1663,  1666,  1668,  1672,  1676,  1679,  1681,
+    1683,  1685,  1687,  1689,  1691,  1693,  1695,  1697,  1699,  1701,
+    1703,  1704,  1706,  1707,  1709,  1712,  1715,  1716,  1718,  1720,
+    1722,  1724,  1725,  1729,  1731,  1734
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
+static const yytype_int16 yyrhs[] =
+{
+     155,     0,    -1,    -1,   156,   157,    -1,   158,   304,    -1,
+     313,    -1,   159,    -1,   158,   312,   159,    -1,     1,   159,
+      -1,   164,    -1,    -1,    46,   160,   143,   157,   144,    -1,
+     162,   249,   227,   252,    -1,   163,   304,    -1,   313,    -1,
+     164,    -1,   163,   312,   164,    -1,     1,   164,    -1,    -1,
+      45,   185,   165,   185,    -1,    12,   186,    -1,   164,    40,
+     168,    -1,   164,    41,   168,    -1,   164,    42,   168,    -1,
+     164,    43,   168,    -1,   164,    44,   164,    -1,    47,   143,
+     162,   144,    -1,   166,    -1,   174,   116,   169,    -1,   274,
+      90,   169,    -1,   223,   145,   195,   307,    90,   169,    -1,
+     223,   146,    51,    90,   169,    -1,   223,   146,    55,    90,
+     169,    -1,   223,    88,    55,    90,   169,    -1,   223,    88,
+      51,    90,   169,    -1,   276,    90,   169,    -1,   181,   116,
+     202,    -1,   174,   116,   191,    -1,   174,   116,   202,    -1,
+     167,    -1,   181,   116,   169,    -1,   181,   116,   166,    -1,
+     169,    -1,   167,    37,   167,    -1,   167,    38,   167,    -1,
+      39,   305,   167,    -1,   130,   169,    -1,   190,    -1,   167,
+      -1,   173,    -1,   170,    -1,   242,    -1,   242,   303,   301,
+     197,    -1,    -1,    97,   172,   233,   162,   144,    -1,   300,
+     197,    -1,   300,   197,   171,    -1,   223,   146,   301,   197,
+      -1,   223,   146,   301,   197,   171,    -1,   223,    88,   301,
+     197,    -1,   223,    88,   301,   197,   171,    -1,    32,   197,
+      -1,    31,   197,    -1,    30,   196,    -1,    21,   196,    -1,
+      22,   196,    -1,   176,    -1,    92,   175,   306,    -1,   176,
+      -1,    92,   175,   306,    -1,   178,    -1,   178,   177,    -1,
+     178,    98,   180,    -1,   178,    98,   180,   147,   179,    -1,
+     178,    98,    -1,   178,    98,   147,   179,    -1,    98,   180,
+      -1,    98,   180,   147,   179,    -1,    98,    -1,    98,   147,
+     179,    -1,   180,    -1,    92,   175,   306,    -1,   177,   147,
+      -1,   178,   177,   147,    -1,   177,    -1,   178,   177,    -1,
+     273,    -1,   223,   145,   195,   307,    -1,   223,   146,    51,
+      -1,   223,    88,    51,    -1,   223,   146,    55,    -1,   223,
+      88,    55,    -1,    89,    55,    -1,   276,    -1,   273,    -1,
+     223,   145,   195,   307,    -1,   223,   146,    51,    -1,   223,
+      88,    51,    -1,   223,   146,    55,    -1,   223,    88,    55,
+      -1,    89,    55,    -1,   276,    -1,    51,    -1,    55,    -1,
+      89,   182,    -1,   182,    -1,   223,    88,   182,    -1,    51,
+      -1,    55,    -1,    52,    -1,   188,    -1,   189,    -1,   184,
+      -1,   269,    -1,   185,    -1,    -1,   186,   147,   187,   185,
+      -1,   121,    -1,   122,    -1,   123,    -1,    72,    -1,    73,
+      -1,    74,    -1,    80,    -1,    81,    -1,   119,    -1,    76,
+      -1,   120,    -1,    77,    -1,    75,    -1,    86,    -1,    87,
+      -1,   124,    -1,   125,    -1,   126,    -1,    98,    -1,   127,
+      -1,   128,    -1,    71,    -1,   130,    -1,   131,    -1,    69,
+      -1,    70,    -1,    84,    -1,    85,    -1,   148,    -1,    48,
+      -1,    49,    -1,    50,    -1,    46,    -1,    47,    -1,    45,
+      -1,    37,    -1,     6,    -1,    21,    -1,    19,    -1,     3,
+      -1,     5,    -1,    26,    -1,    18,    -1,    17,    -1,    15,
+      -1,    14,    -1,    36,    -1,    11,    -1,    25,    -1,     4,
+      -1,    22,    -1,    34,    -1,    39,    -1,    38,    -1,    23,
+      -1,    13,    -1,    24,    -1,    30,    -1,    33,    -1,    32,
+      -1,    16,    -1,    35,    -1,    12,    -1,    20,    -1,    31,
+      -1,     7,    -1,     8,    -1,     9,    -1,    10,    -1,   181,
+     116,   190,    -1,   181,   116,   190,    44,   190,    -1,   274,
+      90,   190,    -1,   274,    90,   190,    44,   190,    -1,   223,
+     145,   195,   307,    90,   190,    -1,   223,   146,    51,    90,
+     190,    -1,   223,   146,    55,    90,   190,    -1,   223,    88,
+      51,    90,   190,    -1,   223,    88,    55,    90,   190,    -1,
+      89,    55,    90,   190,    -1,   276,    90,   190,    -1,   190,
+      82,   190,    -1,   190,    83,   190,    -1,   190,   124,   190,
+      -1,   190,   125,   190,    -1,   190,   126,   190,    -1,   190,
+     127,   190,    -1,   190,   128,   190,    -1,   190,    71,   190,
+      -1,   129,    58,    71,   190,    -1,   129,    59,    71,   190,
+      -1,    69,   190,    -1,    70,   190,    -1,   190,   121,   190,
+      -1,   190,   122,   190,    -1,   190,   123,   190,    -1,   190,
+      72,   190,    -1,   190,   119,   190,    -1,   190,    76,   190,
+      -1,   190,   120,   190,    -1,   190,    77,   190,    -1,   190,
+      73,   190,    -1,   190,    74,   190,    -1,   190,    75,   190,
+      -1,   190,    80,   190,    -1,   190,    81,   190,    -1,   130,
+     190,    -1,   131,   190,    -1,   190,    86,   190,    -1,   190,
+      87,   190,    -1,   190,    78,   190,    -1,   190,    79,   190,
+      -1,   190,   117,   190,   305,   118,   190,    -1,   203,    -1,
+     190,    -1,   313,    -1,   201,   308,    -1,   201,   147,   298,
+     308,    -1,   298,   308,    -1,   149,   195,   306,    -1,   313,
+      -1,   193,    -1,   313,    -1,   196,    -1,   201,   147,    -1,
+     201,   147,   298,   147,    -1,   298,   147,    -1,   173,    -1,
+     201,   200,    -1,   298,   200,    -1,   201,   147,   298,   200,
+      -1,   199,    -1,    -1,   198,   196,    -1,    99,   191,    -1,
+     147,   199,    -1,   313,    -1,   191,    -1,    98,   191,    -1,
+     201,   147,   191,    -1,   201,   147,    98,   191,    -1,   201,
+     147,   262,   191,    -1,   201,   147,   262,    98,   191,    -1,
+     201,   147,   191,    -1,   201,   147,    98,   191,    -1,    98,
+     191,    -1,   253,    -1,   254,    -1,   258,    -1,   259,    -1,
+     260,    -1,   275,    -1,   276,    -1,    52,    -1,    -1,     6,
+     204,   161,    15,    -1,    -1,    -1,    93,   205,   167,   206,
+     306,    -1,    -1,    93,   207,   306,    -1,    92,   162,   150,
+      -1,   223,    88,    55,    -1,    89,    55,    -1,    95,   192,
+     151,    -1,    96,   297,   144,    -1,    30,    -1,    31,   149,
+     196,   306,    -1,    31,   149,   306,    -1,    31,    -1,    39,
+     149,   167,   306,    -1,    39,   149,   306,    -1,   300,   244,
+      -1,   243,    -1,   243,   244,    -1,    -1,   100,   208,   238,
+     239,    -1,     7,   168,   224,   162,   226,    15,    -1,     8,
+     168,   224,   162,   227,    15,    -1,    -1,    -1,     9,   209,
+     168,   225,   210,   162,    15,    -1,    -1,    -1,    10,   211,
+     168,   225,   212,   162,    15,    -1,    19,   168,   304,   247,
+      15,    -1,    19,   304,   247,    15,    -1,    -1,    -1,    11,
+     228,    25,   213,   168,   225,   214,   162,    15,    -1,    -1,
+       3,   183,   277,   215,   161,    15,    -1,    -1,    -1,     3,
+      86,   167,   216,   309,   217,   161,    15,    -1,    -1,     4,
+     183,   218,   161,    15,    -1,    -1,    -1,     5,   184,   219,
+     220,   279,   161,    15,    -1,    -1,    -1,     5,   295,   303,
+     221,   184,   222,   279,   161,    15,    -1,    21,    -1,    22,
+      -1,    23,    -1,    24,    -1,   203,    -1,   309,    -1,    16,
+      -1,   309,    16,    -1,   309,    -1,    27,    -1,   227,    -1,
+      17,   168,   224,   162,   226,    -1,   313,    -1,    18,   162,
+      -1,   181,    -1,   174,    -1,   282,    -1,    92,   231,   306,
+      -1,   229,    -1,   230,   147,   229,    -1,   230,    -1,   230,
+     147,    98,   282,    -1,   230,   147,    98,   282,   147,   230,
+      -1,   230,   147,    98,    -1,   230,   147,    98,   147,   230,
+      -1,    98,   282,    -1,    98,   282,   147,   230,    -1,    98,
+      -1,    98,   147,   230,    -1,   284,   147,   288,   147,   291,
+     294,    -1,   284,   147,   288,   147,   291,   147,   284,   294,
+      -1,   284,   147,   288,   294,    -1,   284,   147,   288,   147,
+     284,   294,    -1,   284,   147,   291,   294,    -1,   284,   147,
+      -1,   284,   147,   291,   147,   284,   294,    -1,   284,   294,
+      -1,   288,   147,   291,   294,    -1,   288,   147,   291,   147,
+     284,   294,    -1,   288,   294,    -1,   288,   147,   284,   294,
+      -1,   291,   294,    -1,   291,   147,   284,   294,    -1,   293,
+      -1,   313,    -1,   234,    -1,   121,   235,   121,    -1,    79,
+      -1,   121,   232,   235,   121,    -1,   305,    -1,   305,   152,
+     236,   305,    -1,   237,    -1,   236,   147,   237,    -1,    51,
+      -1,   281,    -1,   149,   280,   235,   150,    -1,   280,    -1,
+     108,   162,   144,    -1,    29,   162,    15,    -1,    -1,    28,
+     241,   233,   162,    15,    -1,   173,   240,    -1,   242,   303,
+     301,   194,    -1,   242,   303,   301,   194,   244,    -1,   242,
+     303,   301,   197,   240,    -1,   300,   193,    -1,   223,   146,
+     301,   194,    -1,   223,    88,   301,   193,    -1,   223,    88,
+     302,    -1,   223,   146,   193,    -1,   223,    88,   193,    -1,
+      32,   193,    -1,    32,    -1,   223,   145,   195,   307,    -1,
+      -1,   143,   245,   233,   162,   144,    -1,    -1,    26,   246,
+     233,   162,    15,    -1,    20,   201,   224,   162,   248,    -1,
+     227,    -1,   247,    -1,    13,   250,   251,   224,   162,   249,
+      -1,   313,    -1,   191,    -1,   202,    -1,   313,    -1,    91,
+     181,    -1,   313,    -1,    14,   162,    -1,   313,    -1,   272,
+      -1,   268,    -1,   267,    -1,   271,    -1,    60,    -1,    63,
+      -1,   105,    63,    -1,   105,   255,    63,    -1,   256,    -1,
+     255,   256,    -1,    65,    -1,    -1,    64,   257,   162,   144,
+      -1,   111,    -1,   112,   262,    -1,   106,    61,    -1,   106,
+     255,    61,    -1,   102,    62,    -1,   102,   255,    62,    -1,
+     109,    -1,    -1,   262,    -1,   263,    -1,   262,   263,    -1,
+     110,    -1,   264,   110,    -1,   265,    -1,   264,   265,    -1,
+     114,    -1,    -1,   113,   266,   162,   144,    -1,   103,    63,
+      -1,   103,   255,    63,    -1,   269,    -1,   101,   105,   256,
+      63,    -1,   101,   270,    -1,   184,    -1,    54,    -1,    53,
+      -1,    56,    -1,    63,    -1,   105,    63,    -1,   104,    63,
+      -1,   104,   255,    63,    -1,    58,    -1,    59,    -1,   129,
+      58,    -1,   129,    59,    -1,    51,    -1,    54,    -1,    53,
+      -1,    56,    -1,    55,    -1,   273,    -1,   273,    -1,    34,
+      -1,    33,    -1,    35,    -1,    36,    -1,    49,    -1,    48,
+      -1,    66,    -1,    67,    -1,   309,    -1,    -1,   120,   278,
+     168,   309,    -1,     1,   309,    -1,   149,   280,   306,    -1,
+     280,   309,    -1,   284,   147,   289,   147,   291,   294,    -1,
+     284,   147,   289,   147,   291,   147,   284,   294,    -1,   284,
+     147,   289,   294,    -1,   284,   147,   289,   147,   284,   294,
+      -1,   284,   147,   291,   294,    -1,   284,   147,   291,   147,
+     284,   294,    -1,   284,   294,    -1,   289,   147,   291,   294,
+      -1,   289,   147,   291,   147,   284,   294,    -1,   289,   294,
+      -1,   289,   147,   284,   294,    -1,   291,   294,    -1,   291,
+     147,   284,   294,    -1,   293,    -1,    -1,    55,    -1,    54,
+      -1,    53,    -1,    56,    -1,   281,    -1,    51,    -1,   282,
+      -1,    92,   231,   306,    -1,   283,    -1,   284,   147,   283,
+      -1,    51,   116,    -1,   285,   191,    -1,   285,   223,    -1,
+     287,    -1,   288,   147,   287,    -1,   286,    -1,   289,   147,
+     286,    -1,   126,    -1,    98,    -1,   290,    51,    -1,   290,
+      -1,   123,    -1,    99,    -1,   292,    51,    -1,   147,   293,
+      -1,   313,    -1,   275,    -1,    -1,   149,   296,   167,   306,
+      -1,   313,    -1,   298,   308,    -1,   299,    -1,   298,   147,
+     299,    -1,   191,    91,   191,    -1,    57,   191,    -1,    51,
+      -1,    55,    -1,    52,    -1,    51,    -1,    55,    -1,    52,
+      -1,   188,    -1,    51,    -1,    52,    -1,   188,    -1,   146,
+      -1,    88,    -1,    -1,   312,    -1,    -1,   310,    -1,   305,
+     150,    -1,   305,   151,    -1,    -1,   310,    -1,   147,    -1,
+     152,    -1,   310,    -1,    -1,   153,   311,   261,    -1,   309,
+      -1,   312,   152,    -1,    -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
+static const yytype_uint16 yyrline[] =
+{
+       0,  1166,  1166,  1166,  1177,  1183,  1187,  1192,  1196,  1202,
+    1204,  1203,  1215,  1242,  1248,  1252,  1257,  1261,  1267,  1267,
+    1271,  1275,  1279,  1283,  1287,  1291,  1295,  1300,  1301,  1305,
+    1309,  1313,  1317,  1321,  1326,  1330,  1335,  1339,  1343,  1347,
+    1350,  1354,  1361,  1362,  1366,  1370,  1374,  1378,  1381,  1388,
+    1389,  1392,  1393,  1397,  1396,  1409,  1413,  1418,  1422,  1427,
+    1431,  1436,  1440,  1444,  1448,  1452,  1458,  1462,  1468,  1469,
+    1475,  1479,  1483,  1487,  1491,  1495,  1499,  1503,  1507,  1511,
+    1517,  1518,  1524,  1528,  1534,  1538,  1544,  1548,  1552,  1556,
+    1560,  1564,  1570,  1576,  1583,  1587,  1591,  1595,  1599,  1603,
+    1609,  1615,  1622,  1626,  1629,  1633,  1637,  1643,  1644,  1645,
+    1646,  1651,  1658,  1659,  1662,  1666,  1666,  1672,  1673,  1674,
+    1675,  1676,  1677,  1678,  1679,  1680,  1681,  1682,  1683,  1684,
+    1685,  1686,  1687,  1688,  1689,  1690,  1691,  1692,  1693,  1694,
+    1695,  1696,  1697,  1698,  1699,  1700,  1703,  1703,  1703,  1704,
+    1704,  1705,  1705,  1705,  1706,  1706,  1706,  1706,  1707,  1707,
+    1707,  1708,  1708,  1708,  1709,  1709,  1709,  1709,  1710,  1710,
+    1710,  1710,  1711,  1711,  1711,  1711,  1712,  1712,  1712,  1712,
+    1713,  1713,  1713,  1713,  1714,  1714,  1717,  1721,  1725,  1729,
+    1733,  1737,  1741,  1745,  1749,  1754,  1759,  1764,  1768,  1772,
+    1776,  1780,  1784,  1788,  1792,  1796,  1800,  1804,  1808,  1812,
+    1816,  1820,  1824,  1828,  1832,  1836,  1840,  1844,  1848,  1852,
+    1856,  1860,  1864,  1868,  1872,  1876,  1880,  1884,  1888,  1892,
+    1898,  1905,  1906,  1911,  1915,  1922,  1928,  1929,  1932,  1933,
+    1934,  1939,  1944,  1951,  1956,  1961,  1966,  1971,  1978,  1978,
+    1989,  1995,  1999,  2005,  2010,  2015,  2019,  2023,  2027,  2033,
+    2037,  2041,  2047,  2048,  2049,  2050,  2051,  2052,  2053,  2054,
+    2059,  2058,  2070,  2074,  2069,  2079,  2079,  2083,  2087,  2091,
+    2095,  2100,  2105,  2109,  2113,  2117,  2121,  2125,  2129,  2133,
+    2134,  2140,  2139,  2152,  2160,  2168,  2168,  2168,  2175,  2175,
+    2175,  2182,  2188,  2193,  2195,  2192,  2204,  2202,  2218,  2223,
+    2216,  2238,  2236,  2251,  2255,  2250,  2270,  2276,  2269,  2291,
+    2295,  2299,  2303,  2309,  2316,  2317,  2318,  2321,  2322,  2325,
+    2326,  2334,  2335,  2341,  2345,  2348,  2352,  2358,  2362,  2368,
+    2372,  2376,  2380,  2384,  2388,  2392,  2396,  2400,  2406,  2410,
+    2414,  2418,  2422,  2426,  2430,  2434,  2438,  2442,  2446,  2450,
+    2454,  2458,  2462,  2468,  2469,  2476,  2480,  2484,  2491,  2495,
+    2501,  2502,  2505,  2510,  2513,  2517,  2523,  2527,  2534,  2533,
+    2546,  2556,  2560,  2565,  2572,  2576,  2580,  2584,  2588,  2592,
+    2596,  2600,  2604,  2611,  2610,  2623,  2622,  2636,  2644,  2653,
+    2656,  2663,  2666,  2670,  2671,  2674,  2678,  2681,  2685,  2688,
+    2689,  2690,  2691,  2694,  2695,  2696,  2700,  2706,  2707,  2713,
+    2718,  2717,  2728,  2732,  2738,  2742,  2748,  2752,  2758,  2761,
+    2762,  2765,  2766,  2769,  2775,  2781,  2782,  2785,  2792,  2791,
+    2805,  2809,  2816,  2820,  2827,  2834,  2835,  2836,  2837,  2838,
+    2842,  2848,  2852,  2858,  2859,  2860,  2864,  2870,  2874,  2878,
+    2882,  2886,  2892,  2898,  2902,  2906,  2910,  2914,  2918,  2925,
+    2934,  2935,  2938,  2943,  2942,  2951,  2958,  2964,  2970,  2974,
+    2978,  2982,  2986,  2990,  2994,  2998,  3002,  3006,  3010,  3014,
+    3018,  3022,  3027,  3033,  3038,  3043,  3048,  3055,  3059,  3066,
+    3070,  3076,  3080,  3086,  3093,  3099,  3105,  3109,  3115,  3119,
+    3125,  3126,  3129,  3134,  3141,  3142,  3145,  3152,  3156,  3163,
+    3168,  3168,  3193,  3194,  3200,  3205,  3211,  3215,  3221,  3222,
+    3223,  3226,  3227,  3228,  3229,  3232,  3233,  3234,  3237,  3238,
+    3241,  3242,  3245,  3246,  3249,  3252,  3255,  3256,  3257,  3260,
+    3261,  3265,  3264,  3271,  3272,  3276
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
+static const char *const yytname[] =
+{
+  "$end", "error", "$undefined", "keyword_class", "keyword_module",
+  "keyword_def", "keyword_begin", "keyword_if", "keyword_unless",
+  "keyword_while", "keyword_until", "keyword_for", "keyword_undef",
+  "keyword_rescue", "keyword_ensure", "keyword_end", "keyword_then",
+  "keyword_elsif", "keyword_else", "keyword_case", "keyword_when",
+  "keyword_break", "keyword_next", "keyword_redo", "keyword_retry",
+  "keyword_in", "keyword_do", "keyword_do_cond", "keyword_do_block",
+  "keyword_do_LAMBDA", "keyword_return", "keyword_yield", "keyword_super",
+  "keyword_self", "keyword_nil", "keyword_true", "keyword_false",
+  "keyword_and", "keyword_or", "keyword_not", "modifier_if",
+  "modifier_unless", "modifier_while", "modifier_until", "modifier_rescue",
+  "keyword_alias", "keyword_BEGIN", "keyword_END", "keyword__LINE__",
+  "keyword__FILE__", "keyword__ENCODING__", "tIDENTIFIER", "tFID", "tGVAR",
+  "tIVAR", "tCONSTANT", "tCVAR", "tLABEL", "tINTEGER", "tFLOAT", "tCHAR",
+  "tXSTRING", "tREGEXP", "tSTRING", "tSTRING_PART", "tSTRING_MID",
+  "tNTH_REF", "tBACK_REF", "tREGEXP_END", "tUPLUS", "tUMINUS", "tPOW",
+  "tCMP", "tEQ", "tEQQ", "tNEQ", "tGEQ", "tLEQ", "tANDOP", "tOROP",
+  "tMATCH", "tNMATCH", "tDOT2", "tDOT3", "tAREF", "tASET", "tLSHFT",
+  "tRSHFT", "tCOLON2", "tCOLON3", "tOP_ASGN", "tASSOC", "tLPAREN",
+  "tLPAREN_ARG", "tRPAREN", "tLBRACK", "tLBRACE", "tLBRACE_ARG", "tSTAR",
+  "tAMPER", "tLAMBDA", "tSYMBEG", "tREGEXP_BEG", "tWORDS_BEG",
+  "tSYMBOLS_BEG", "tSTRING_BEG", "tXSTRING_BEG", "tSTRING_DVAR", "tLAMBEG",
+  "tHEREDOC_BEG", "tHEREDOC_END", "tLITERAL_DELIM", "tHD_LITERAL_DELIM",
+  "tHD_STRING_PART", "tHD_STRING_MID", "tLOWEST", "'='", "'?'", "':'",
+  "'>'", "'<'", "'|'", "'^'", "'&'", "'+'", "'-'", "'*'", "'/'", "'%'",
+  "tUMINUS_NUM", "'!'", "'~'", "idNULL", "idRespond_to", "idIFUNC",
+  "idCFUNC", "id_core_set_method_alias", "id_core_set_variable_alias",
+  "id_core_undef_method", "id_core_define_method",
+  "id_core_define_singleton_method", "id_core_set_postexe", "tLAST_TOKEN",
+  "'{'", "'}'", "'['", "'.'", "','", "'`'", "'('", "')'", "']'", "';'",
+  "'\\n'", "$accept", "program", "$@1", "top_compstmt", "top_stmts",
+  "top_stmt", "@2", "bodystmt", "compstmt", "stmts", "stmt", "$@3",
+  "command_asgn", "expr", "expr_value", "command_call", "block_command",
+  "cmd_brace_block", "$@4", "command", "mlhs", "mlhs_inner", "mlhs_basic",
+  "mlhs_item", "mlhs_list", "mlhs_post", "mlhs_node", "lhs", "cname",
+  "cpath", "fname", "fsym", "undef_list", "$@5", "op", "reswords", "arg",
+  "arg_value", "aref_args", "paren_args", "opt_paren_args",
+  "opt_call_args", "call_args", "command_args", "@6", "block_arg",
+  "opt_block_arg", "args", "mrhs", "primary", "@7", "@8", "$@9", "$@10",
+  "@11", "$@12", "$@13", "$@14", "$@15", "$@16", "$@17", "@18", "@19",
+  "@20", "@21", "@22", "@23", "@24", "@25", "primary_value", "then", "do",
+  "if_tail", "opt_else", "for_var", "f_marg", "f_marg_list", "f_margs",
+  "block_param", "opt_block_param", "block_param_def", "opt_bv_decl",
+  "bv_decls", "bvar", "f_larglist", "lambda_body", "do_block", "$@26",
+  "block_call", "method_call", "brace_block", "@27", "@28", "case_body",
+  "cases", "opt_rescue", "exc_list", "exc_var", "opt_ensure", "literal",
+  "string", "string_rep", "string_interp", "@29", "xstring", "regexp",
+  "heredoc", "opt_heredoc_bodies", "heredoc_bodies", "heredoc_body",
+  "heredoc_string_rep", "heredoc_string_interp", "@30", "words", "symbol",
+  "basic_symbol", "sym", "symbols", "numeric", "variable", "var_lhs",
+  "var_ref", "backref", "superclass", "$@31", "f_arglist", "f_args",
+  "f_bad_arg", "f_norm_arg", "f_arg_item", "f_arg", "f_opt_asgn", "f_opt",
+  "f_block_opt", "f_block_optarg", "f_optarg", "restarg_mark",
+  "f_rest_arg", "blkarg_mark", "f_block_arg", "opt_f_block_arg",
+  "singleton", "$@32", "assoc_list", "assocs", "assoc", "operation",
+  "operation2", "operation3", "dot_or_colon", "opt_terms", "opt_nl",
+  "rparen", "rbracket", "trailer", "term", "nl", "$@33", "terms", "none", 0
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+   token YYLEX-NUM.  */
+static const yytype_uint16 yytoknum[] =
+{
+       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
+     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
+     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,   298,   299,   300,   301,   302,   303,   304,
+     305,   306,   307,   308,   309,   310,   311,   312,   313,   314,
+     315,   316,   317,   318,   319,   320,   321,   322,   323,   324,
+     325,   326,   327,   328,   329,   330,   331,   332,   333,   334,
+     335,   336,   337,   338,   339,   340,   341,   342,   343,   344,
+     345,   346,   347,   348,   349,   350,   351,   352,   353,   354,
+     355,   356,   357,   358,   359,   360,   361,   362,   363,   364,
+     365,   366,   367,   368,   369,   370,    61,    63,    58,    62,
+      60,   124,    94,    38,    43,    45,    42,    47,    37,   371,
+      33,   126,   372,   373,   374,   375,   376,   377,   378,   379,
+     380,   381,   382,   123,   125,    91,    46,    44,    96,    40,
+      41,    93,    59,    10
+};
+# endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
+static const yytype_uint16 yyr1[] =
+{
+       0,   154,   156,   155,   157,   158,   158,   158,   158,   159,
+     160,   159,   161,   162,   163,   163,   163,   163,   165,   164,
+     164,   164,   164,   164,   164,   164,   164,   164,   164,   164,
+     164,   164,   164,   164,   164,   164,   164,   164,   164,   164,
+     166,   166,   167,   167,   167,   167,   167,   167,   168,   169,
+     169,   170,   170,   172,   171,   173,   173,   173,   173,   173,
+     173,   173,   173,   173,   173,   173,   174,   174,   175,   175,
+     176,   176,   176,   176,   176,   176,   176,   176,   176,   176,
+     177,   177,   178,   178,   179,   179,   180,   180,   180,   180,
+     180,   180,   180,   180,   181,   181,   181,   181,   181,   181,
+     181,   181,   182,   182,   183,   183,   183,   184,   184,   184,
+     184,   184,   185,   185,   186,   187,   186,   188,   188,   188,
+     188,   188,   188,   188,   188,   188,   188,   188,   188,   188,
+     188,   188,   188,   188,   188,   188,   188,   188,   188,   188,
+     188,   188,   188,   188,   188,   188,   189,   189,   189,   189,
+     189,   189,   189,   189,   189,   189,   189,   189,   189,   189,
+     189,   189,   189,   189,   189,   189,   189,   189,   189,   189,
+     189,   189,   189,   189,   189,   189,   189,   189,   189,   189,
+     189,   189,   189,   189,   189,   189,   190,   190,   190,   190,
+     190,   190,   190,   190,   190,   190,   190,   190,   190,   190,
+     190,   190,   190,   190,   190,   190,   190,   190,   190,   190,
+     190,   190,   190,   190,   190,   190,   190,   190,   190,   190,
+     190,   190,   190,   190,   190,   190,   190,   190,   190,   190,
+     191,   192,   192,   192,   192,   193,   194,   194,   195,   195,
+     195,   195,   195,   196,   196,   196,   196,   196,   198,   197,
+     199,   200,   200,   201,   201,   201,   201,   201,   201,   202,
+     202,   202,   203,   203,   203,   203,   203,   203,   203,   203,
+     204,   203,   205,   206,   203,   207,   203,   203,   203,   203,
+     203,   203,   203,   203,   203,   203,   203,   203,   203,   203,
+     203,   208,   203,   203,   203,   209,   210,   203,   211,   212,
+     203,   203,   203,   213,   214,   203,   215,   203,   216,   217,
+     203,   218,   203,   219,   220,   203,   221,   222,   203,   203,
+     203,   203,   203,   223,   224,   224,   224,   225,   225,   226,
+     226,   227,   227,   228,   228,   229,   229,   230,   230,   231,
+     231,   231,   231,   231,   231,   231,   231,   231,   232,   232,
+     232,   232,   232,   232,   232,   232,   232,   232,   232,   232,
+     232,   232,   232,   233,   233,   234,   234,   234,   235,   235,
+     236,   236,   237,   237,   238,   238,   239,   239,   241,   240,
+     242,   242,   242,   242,   243,   243,   243,   243,   243,   243,
+     243,   243,   243,   245,   244,   246,   244,   247,   248,   248,
+     249,   249,   250,   250,   250,   251,   251,   252,   252,   253,
+     253,   253,   253,   254,   254,   254,   254,   255,   255,   256,
+     257,   256,   256,   256,   258,   258,   259,   259,   260,   261,
+     261,   262,   262,   263,   263,   264,   264,   265,   266,   265,
+     267,   267,   268,   268,   269,   270,   270,   270,   270,   270,
+     270,   271,   271,   272,   272,   272,   272,   273,   273,   273,
+     273,   273,   274,   275,   275,   275,   275,   275,   275,   275,
+     276,   276,   277,   278,   277,   277,   279,   279,   280,   280,
+     280,   280,   280,   280,   280,   280,   280,   280,   280,   280,
+     280,   280,   280,   281,   281,   281,   281,   282,   282,   283,
+     283,   284,   284,   285,   286,   287,   288,   288,   289,   289,
+     290,   290,   291,   291,   292,   292,   293,   294,   294,   295,
+     296,   295,   297,   297,   298,   298,   299,   299,   300,   300,
+     300,   301,   301,   301,   301,   302,   302,   302,   303,   303,
+     304,   304,   305,   305,   306,   307,   308,   308,   308,   309,
+     309,   311,   310,   312,   312,   313
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
+static const yytype_uint8 yyr2[] =
+{
+       0,     2,     0,     2,     2,     1,     1,     3,     2,     1,
+       0,     5,     4,     2,     1,     1,     3,     2,     0,     4,
+       2,     3,     3,     3,     3,     3,     4,     1,     3,     3,
+       6,     5,     5,     5,     5,     3,     3,     3,     3,     1,
+       3,     3,     1,     3,     3,     3,     2,     1,     1,     1,
+       1,     1,     4,     0,     5,     2,     3,     4,     5,     4,
+       5,     2,     2,     2,     2,     2,     1,     3,     1,     3,
+       1,     2,     3,     5,     2,     4,     2,     4,     1,     3,
+       1,     3,     2,     3,     1,     2,     1,     4,     3,     3,
+       3,     3,     2,     1,     1,     4,     3,     3,     3,     3,
+       2,     1,     1,     1,     2,     1,     3,     1,     1,     1,
+       1,     1,     1,     1,     1,     0,     4,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     3,     5,     3,     5,
+       6,     5,     5,     5,     5,     4,     3,     3,     3,     3,
+       3,     3,     3,     3,     3,     4,     4,     2,     2,     3,
+       3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+       3,     3,     2,     2,     3,     3,     3,     3,     6,     1,
+       1,     1,     2,     4,     2,     3,     1,     1,     1,     1,
+       2,     4,     2,     1,     2,     2,     4,     1,     0,     2,
+       2,     2,     1,     1,     2,     3,     4,     4,     5,     3,
+       4,     2,     1,     1,     1,     1,     1,     1,     1,     1,
+       0,     4,     0,     0,     5,     0,     3,     3,     3,     2,
+       3,     3,     1,     4,     3,     1,     4,     3,     2,     1,
+       2,     0,     4,     6,     6,     0,     0,     7,     0,     0,
+       7,     5,     4,     0,     0,     9,     0,     6,     0,     0,
+       8,     0,     5,     0,     0,     7,     0,     0,     9,     1,
+       1,     1,     1,     1,     1,     1,     2,     1,     1,     1,
+       5,     1,     2,     1,     1,     1,     3,     1,     3,     1,
+       4,     6,     3,     5,     2,     4,     1,     3,     6,     8,
+       4,     6,     4,     2,     6,     2,     4,     6,     2,     4,
+       2,     4,     1,     1,     1,     3,     1,     4,     1,     4,
+       1,     3,     1,     1,     4,     1,     3,     3,     0,     5,
+       2,     4,     5,     5,     2,     4,     4,     3,     3,     3,
+       2,     1,     4,     0,     5,     0,     5,     5,     1,     1,
+       6,     1,     1,     1,     1,     2,     1,     2,     1,     1,
+       1,     1,     1,     1,     1,     2,     3,     1,     2,     1,
+       0,     4,     1,     2,     2,     3,     2,     3,     1,     0,
+       1,     1,     2,     1,     2,     1,     2,     1,     0,     4,
+       2,     3,     1,     4,     2,     1,     1,     1,     1,     1,
+       2,     2,     3,     1,     1,     2,     2,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     0,     4,     2,     3,     2,     6,     8,
+       4,     6,     4,     6,     2,     4,     6,     2,     4,     2,
+       4,     1,     0,     1,     1,     1,     1,     1,     1,     1,
+       3,     1,     3,     2,     2,     2,     1,     3,     1,     3,
+       1,     1,     2,     1,     1,     1,     2,     2,     1,     1,
+       0,     4,     1,     2,     1,     3,     3,     2,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       0,     1,     0,     1,     2,     2,     0,     1,     1,     1,
+       1,     0,     3,     1,     2,     0
+};
+
+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
+   means the default is an error.  */
+static const yytype_uint16 yydefact[] =
+{
+       2,     0,     0,     1,     0,     0,     0,     0,   270,     0,
+       0,   295,   298,     0,     0,   540,   319,   320,   321,   322,
+     282,   248,   248,   465,   464,   466,   467,   542,     0,    10,
+       0,   469,   468,   457,   530,   459,   458,   461,   460,   453,
+     454,   413,   414,   470,   471,     0,     0,     0,     0,   272,
+     555,   555,    78,   291,     0,     0,     0,     0,     0,     0,
+     428,     0,     0,     0,     3,   540,     6,     9,    27,    39,
+      42,    50,    49,     0,    66,     0,    70,    80,     0,    47,
+     229,     0,    51,   289,   262,   263,   264,   265,   266,   411,
+     410,   442,   412,   409,   463,     0,   267,   268,   248,     5,
+       8,   319,   320,   282,   285,   391,     0,   102,   103,     0,
+       0,     0,     0,   105,     0,   323,     0,   463,   268,     0,
+     311,   156,   166,   157,   153,   182,   183,   184,   185,   164,
+     179,   172,   162,   161,   177,   160,   159,   155,   180,   154,
+     167,   171,   173,   165,   158,   174,   181,   176,   175,   168,
+     178,   163,   152,   170,   169,   151,   149,   150,   146,   147,
+     148,   107,   109,   108,   141,   142,   138,   120,   121,   122,
+     129,   126,   128,   123,   124,   143,   144,   130,   131,   135,
+     125,   127,   117,   118,   119,   132,   133,   134,   136,   137,
+     139,   140,   145,   520,   313,   110,   111,   519,     0,     0,
+       0,    48,     0,     0,     0,   463,     0,   268,     0,     0,
+       0,     0,   334,   333,     0,     0,   463,   268,   175,   168,
+     178,   163,   146,   147,   107,   108,     0,   112,   114,    20,
+     113,   549,   551,   540,     0,   553,   550,   541,     0,     0,
+       0,     0,   243,   230,   253,    64,   247,   555,   555,   524,
+      65,    63,   542,    62,     0,   555,   390,    61,   542,     0,
+     543,    18,     0,     0,   207,     0,   208,   279,     0,     0,
+       0,   540,    15,   542,    68,    14,     0,   542,     0,   546,
+     546,   231,     0,     0,   546,   522,     0,     0,    76,     0,
+      86,    93,   492,   447,   446,   448,   449,     0,   445,   444,
+     426,   420,   419,   422,     0,     0,   417,   440,     0,   451,
+       0,   415,     0,   424,     0,   455,   456,    46,   222,   223,
+       4,   541,     0,     0,     0,     0,     0,     0,     0,   378,
+     380,     0,    82,     0,    74,    71,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   555,     0,   539,   538,     0,   395,
+     393,   290,     0,     0,   384,    55,   288,   308,   102,   103,
+     104,   455,   456,     0,   473,   306,   472,     0,   555,     0,
+       0,     0,   314,   316,     0,   555,   279,   325,     0,   324,
+       0,     0,   555,     0,     0,     0,     0,     0,     0,   279,
+       0,   555,     0,   303,     0,   115,   429,     0,     0,     0,
+     554,   527,   254,   250,     0,     0,   244,   252,     0,   245,
+     542,     0,   284,   249,   542,   239,   555,   555,   238,   542,
+     287,    45,     0,     0,     0,     0,     0,     0,    17,   542,
+     277,    13,   541,    67,   273,   276,   280,   548,   232,   547,
+     548,   234,   281,   523,    92,    84,     0,    79,     0,     0,
+     555,     0,   498,   495,   494,   493,   496,     0,   511,   515,
+     514,   510,   492,     0,   375,   497,   499,   501,   555,     0,
+     508,   555,   513,   555,     0,   491,   450,     0,     0,   433,
+     438,   437,   423,   431,     0,   435,   427,   418,   441,   452,
+     416,   425,     0,     0,     7,    21,    22,    23,    24,    25,
+      43,    44,   555,     0,    28,    37,     0,    38,   542,     0,
+      72,    83,    41,    40,     0,   186,   253,    36,   204,   212,
+     217,   218,   219,   214,   216,   226,   227,   220,   221,   197,
+     198,   224,   225,   542,   213,   215,   209,   210,   211,   199,
+     200,   201,   202,   203,   531,   536,   532,   537,   389,   248,
+     387,   542,   531,   533,   532,   534,   388,   248,   531,   532,
+     248,   555,   555,    29,   188,    35,   196,    53,    56,     0,
+     475,     0,     0,   102,   103,   106,     0,   542,   555,     0,
+     542,   492,     0,   271,   555,   555,   401,   555,   326,   186,
+     535,   532,   542,   531,   532,   555,   328,   296,   327,   299,
+     535,   278,   542,   531,   532,     0,     0,   552,   430,     0,
+       0,   302,   526,     0,   255,   251,     0,   555,   525,   283,
+     544,   235,   240,   242,   286,    19,     0,    26,   195,    69,
+      16,   542,   546,    85,    77,    89,    91,   542,   531,   532,
+     503,   498,     0,   346,   337,   339,   542,   335,   542,     0,
+       0,   292,     0,   484,   518,   504,     0,   487,   512,     0,
+     489,   516,   443,     0,     0,   432,   434,   436,   205,   206,
+     366,   542,     0,   364,   363,   261,     0,    81,    75,     0,
+       0,     0,     0,     0,     0,   386,    59,     0,   392,     0,
+       0,   237,   385,    57,   236,   381,    52,     0,     0,     0,
+     555,   309,     0,     0,   392,   312,   521,   492,     0,     0,
+     317,   402,   403,   555,   404,     0,   555,   331,     0,     0,
+     329,     0,     0,   392,     0,     0,     0,     0,     0,   392,
+       0,   116,   301,     0,     0,   256,     0,   257,   246,   555,
+      11,   274,   233,    87,   542,     0,   344,     0,   500,     0,
+     368,     0,     0,   502,   555,   555,   517,   555,   509,   555,
+     555,   421,     0,   542,     0,   555,     0,   506,   555,   555,
+     362,     0,     0,   259,    73,   187,     0,    34,   193,    33,
+     194,    60,   545,     0,    31,   191,    32,   192,    58,   382,
+     383,     0,     0,   189,     0,     0,   474,   307,   542,     0,
+     477,   492,     0,     0,   406,   332,     0,    12,   408,     0,
+     293,     0,   294,     0,     0,   304,   255,   555,   258,   241,
+     336,   347,     0,   342,   338,   374,     0,   377,   376,     0,
+     480,     0,   482,     0,   488,     0,   485,   490,   439,     0,
+     365,   353,   355,     0,   505,     0,   358,     0,   360,   379,
+     260,   228,    30,   190,   396,   394,     0,     0,   476,   315,
+       0,     0,   405,     0,    94,   101,     0,   407,     0,   297,
+     300,     0,   398,   399,   397,     0,   345,     0,   340,   372,
+     542,   370,   373,   555,   555,   555,   555,   367,   555,   555,
+     279,     0,   555,   507,   555,   555,    54,   310,     0,   100,
+       0,   555,     0,   555,   555,     0,   343,     0,     0,   369,
+     481,     0,   478,   483,   486,     0,   350,     0,   352,   535,
+     278,   359,     0,   356,   361,   318,   535,    99,   542,   531,
+     532,   400,   330,   305,   341,   371,   555,   555,   555,   555,
+     555,   392,   479,   351,     0,   348,   354,   357,   555,   349
+};
+
+/* YYDEFGOTO[NTERM-NUM].  */
+static const yytype_int16 yydefgoto[] =
+{
+      -1,     1,     2,    64,    65,    66,   262,   394,   395,   271,
+     272,   442,    68,    69,   202,    70,    71,   588,   720,    72,
+      73,   273,    74,    75,    76,   467,    77,   203,   113,   114,
+     227,   228,   229,   626,   195,   196,    79,   244,   278,   568,
+     712,   434,   435,   253,   254,   246,   426,   436,   527,    80,
+     199,   276,   651,   277,   292,   209,   747,   210,   748,   625,
+     891,   592,   589,   815,   390,   392,   601,   602,   821,   265,
+     398,   617,   739,   740,   215,   664,   665,   666,   783,   692,
+     693,   769,   900,   901,   483,   671,   330,   522,    82,    83,
+     376,   582,   581,   419,   894,   605,   733,   823,   827,    84,
+      85,   305,   306,   498,    86,    87,    88,   627,   636,   503,
+     504,   505,   684,    89,    90,    91,   299,    92,    93,   205,
+     206,    96,   207,   385,   591,   728,   729,   485,   486,   487,
+     488,   489,   490,   787,   788,   491,   492,   493,   494,   776,
+     673,   198,   391,   283,   437,   249,   119,   596,   570,   368,
+     234,   431,   432,   708,   458,   399,   260,   416,   237,   275
+};
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+   STATE-NUM.  */
+#define YYPACT_NINF -763
+static const yytype_int16 yypact[] =
+{
+    -763,   120,  2670,  -763,  7298,  9106,  9433,  5605,  -763,  8767,
+    8767,  -763,  -763,  9215,  6691,  5113,  7976,  7976,  -763,  -763,
+    7976,  3331,  2908,  -763,  -763,  -763,  -763,    26,  6691,  -763,
+       9,  -763,  -763,  5736,  3049,  -763,  -763,  5865,  -763,  -763,
+    -763,  -763,  -763,  -763,  -763,  8880,  8880,    90,  4462,   -22,
+    8089,  8315,  6967,  -763,  6399,   584,   717,   907,   943,   659,
+    -763,   272,  8993,  8880,  -763,   197,  -763,  1023,  -763,   519,
+    -763,  -763,   119,    45,  -763,    11,  9324,  -763,   115,  3169,
+     173,   228,    28,    81,  -763,  -763,  -763,  -763,  -763,  -763,
+    -763,  -763,  -763,  -763,   398,    87,  -763,   439,    44,  -763,
+    -763,  -763,  -763,  -763,    21,    85,   100,   350,   394,  8767,
+     278,  4597,   540,  -763,    58,  -763,   271,  -763,  -763,    44,
+    -763,  -763,  -763,  -763,  -763,  -763,  -763,  -763,  -763,  -763,
+    -763,  -763,  -763,  -763,  -763,  -763,  -763,  -763,  -763,  -763,
+    -763,  -763,  -763,  -763,  -763,  -763,  -763,  -763,    38,    49,
+      54,    61,  -763,  -763,  -763,  -763,  -763,  -763,    97,   198,
+    -763,   218,  -763,   232,  -763,  -763,  -763,  -763,  -763,  -763,
+    -763,  -763,  -763,  -763,  -763,  -763,  -763,  -763,  -763,  -763,
+    -763,  -763,  -763,  -763,  -763,  -763,  -763,  -763,  -763,  -763,
+    -763,  -763,  -763,  -763,  -763,  -763,  -763,  -763,    28,  3668,
+      99,   519,    74,   138,   320,    24,   203,    40,    74,  8767,
+    8767,   262,  -763,  -763,   331,   317,    52,    68,  -763,  -763,
+    -763,  -763,  -763,  -763,  -763,  -763,  6545,  -763,  -763,   225,
+    -763,  -763,  -763,   197,   325,  -763,  -763,   229,  8880,  8880,
+    8880,  8880,  -763,  3169,   292,  -763,  -763,   243,   250,  -763,
+    -763,  -763,  5000,  -763,  7976,  7976,  -763,  -763,  5228,  8767,
+    -763,  -763,   256,  4732,  -763,   361,   330,   445,  7524,  4462,
+     280,   197,  1023,   268,   326,  -763,  8767,   268,   304,   174,
+     179,  -763,   292,   319,   179,  -763,   415,  9542,   334,   363,
+     366,   379,   748,  -763,  -763,  -763,  -763,   971,  -763,  -763,
+    -763,  -763,  -763,  -763,   370,   625,  -763,  -763,   975,  -763,
+     982,  -763,  1039,  -763,   733,   419,   421,  -763,  -763,  -763,
+    -763,  5341,  8767,  8767,  8767,  8767,  7524,  8767,  8767,  -763,
+    -763,  8428,  -763,  4462,  7076,   338,  8428,  8880,  8880,  8880,
+    8880,  8880,  8880,  8880,  8880,  8880,  8880,  8880,  8880,  8880,
+    8880,  8880,  8880,  8880,  8880,  8880,  8880,  8880,  8880,  8880,
+    8880,  8880,  8880,  2210,  7976,  9821,  -763,  -763, 10793,  -763,
+    -763,  -763,  8993,  8993,  -763,   400,  -763,   519,  -763,   387,
+    -763,  -763,  -763,   197,  -763,  -763,  -763,  9902,  7976,  9983,
+    3668,  8767,  -763,  -763,   486,   490,    65,  -763,  3807,   497,
+    8880, 10064,  7976, 10145,  8880,  8880,  4079,    60,    60,   104,
+   10226,  7976, 10307,  -763,   452,  -763,   370,   325,  8541,   503,
+    -763,  -763,  -763,  -763,  8880,  7185,  -763,  -763,  8202,  -763,
+     268,   371,  -763,  -763,   268,  -763,   376,   389,  -763,   129,
+    -763,  -763,  6691,  4194,   382, 10064, 10145,  8880,  1023,   268,
+    -763,  -763,  5455,   391,   519,  -763,  -763,  7411,  -763,  -763,
+    8315,  -763,  -763,  -763,   387,    11,  9542,  -763,  9542, 10388,
+    7976, 10469,   425,  -763,  -763,  -763,  -763,   797,  -763,  -763,
+    -763,  -763,   757,    80,  -763,  -763,  -763,  -763,   397,  8880,
+    -763,   401,   514,   429,   518,  -763,  -763,   525,  4732,  -763,
+    -763,  -763,   370,  -763,   480,  -763,  -763,  -763,  -763,  -763,
+    -763,  -763,  8880,  8880,  -763,  -763,  -763,  -763,  -763,  -763,
+    -763,  -763,    29,  8880,  -763,   434,   448,  -763,   268,  9542,
+     453,  -763,  -763,  -763,   509,  2107,  -763,  -763,   330,  1778,
+    1778,  1778,  1778,  1278,  1278,  6710,  1338,  1778,  1778,  9758,
+    9758,   583,   583,  2455,  1278,  1278,   735,   735,   813,    64,
+      64,   330,   330,   330,  3423,  6123,  3515,  6252,  -763,    85,
+    -763,   268,   524,  -763,   537,  -763,  -763,  3190,  -763,  -763,
+    1238,    29,    29,  -763,  2887,  -763,  3169,  -763,  -763,   197,
+    -763,  8767,  3668,   496,    37,  -763,    85,   268,    85,   632,
+     129,   997,  6837,  -763,  8654,   618,  -763,   674,  -763,  3028,
+    5994,  2767,   268,   279,   294,   618,  -763,  -763,  -763,  -763,
+     140,   147,   268,   132,   151,  8767,  6691,  -763,   370,   643,
+      67,  -763,  -763,  8880,   292,  -763,  7637,   250,  -763,  -763,
+    -763,  -763,  7185,  8202,  -763,  -763,   516,  -763,  3169,    -6,
+    1023,   268,   179,   338,  -763,   496,    37,   268,   238,   309,
+    -763,  -763,   797,   556,  -763,   517,   268,  -763,   268,  4885,
+    4732,  -763,   757,  -763,  -763,  -763,   757,  -763,  -763,   877,
+    -763,  -763,  -763,   534,  4732,  -763,  -763,  -763,   330,   330,
+    -763,   837,  4885,  -763,  -763,   522,  7750,  -763,  -763,  9542,
+    8993,  8880,   562,  8993,  8993,  -763,   400,   531,   547,  8993,
+    8993,  -763,  -763,   400,  -763,    81,   119,  4885,  4732,  8880,
+      29,  -763,   197,   673,  -763,  -763,  -763,   757,  3668,   197,
+    -763,   434,  -763,   609,  -763,  4347,   688,  -763,  8767,   702,
+    -763,  8880,  8880,   353,  8880,  8880,   704,  4885,  4885,   155,
+      60,  -763,  -763,  7863,  3943,  -763,  8880,  -763,  -763,   574,
+    -763,  -763,  -763,   315,   268,   896,   575,  1139,  -763,   576,
+     573,   712,   586,  -763,   585,   592,  -763,   593,  -763,   595,
+     593,  -763,   601,   268,   629,   599,  9651,  -763,   605,   606,
+    -763,   739,  8880,   612,  -763,  3169,  8880,  -763,  3169,  -763,
+    3169,  -763,  -763,  8993,  -763,  3169,  -763,  3169,  -763,  -763,
+    -763,   741,   616,  3169,  4732,  3668,  -763,  -763,   268,   747,
+    -763,   997,  9760,    74,  -763,  -763,  4885,  -763,  -763,    74,
+    -763,  8880,  -763,   749,   751,  -763,  -763,    93,  -763,  8202,
+    -763,   620,   896,   621,  -763,  -763,  1073,  -763,  -763,   757,
+    -763,   877,  -763,   877,  -763,   877,  -763,  -763,  -763,   655,
+    -763,   757,  -763,   724,   414,   757,  -763,   877,  -763,  -763,
+     637,  3169,  -763,  3169,  -763,  -763,   641,   773,  -763,  -763,
+    3668,   737,  -763,   422,   366,   379,  3668,  -763,  3807,  -763,
+    -763,  4885,  -763,  -763,  -763,   896,   620,   896,   642,  -763,
+     213,  -763,  -763,   593,   653,   593,   593,  -763,   658,   662,
+    -763, 10550,   593,  -763,   667,   593,  -763,  -763,   775,   387,
+   10631,  7976, 10712,   490,   674,   800,   620,   896,  1073,  -763,
+    -763,   877,  -763,  -763,  -763,   757,  -763,   877,  -763,   668,
+     670,  -763,   877,  -763,  -763,  -763,   128,    37,   268,    84,
+     103,  -763,  -763,  -763,   620,  -763,   593,   593,   669,   593,
+     593,   118,  -763,  -763,   877,  -763,  -763,  -763,   593,  -763
+};
+
+/* YYPGOTO[NTERM-NUM].  */
+static const yytype_int16 yypgoto[] =
+{
+    -763,  -763,  -763,   380,  -763,    42,  -763,  -363,   -19,  -763,
+      35,  -763,  -293,   734,    13,   -48,  -763,  -570,  -763,   -13,
+     817,  -170,     7,   -55,  -270,  -414,   -11,  1771,   -59,   828,
+      -1,   -20,  -763,  -763,  -241,  -763,  1317,   894,  -763,    -7,
+     257,  -338,    55,    -3,  -763,  -395,  -243,   101,  -291,     5,
+    -763,  -763,  -763,  -763,  -763,  -763,  -763,  -763,  -763,  -763,
+    -763,  -763,  -763,  -763,  -763,  -763,  -763,  -763,  -763,   295,
+    -199,  -370,   -86,  -553,  -763,  -699,  -689,   177,  -763,  -480,
+    -763,  -594,  -763,   -87,  -763,  -763,   126,  -763,  -763,  -763,
+     -82,  -763,  -763,  -401,  -763,   -69,  -763,  -763,  -763,  -763,
+    -763,   656,   903,  -763,  -763,  -763,  -763,  -763,  -198,  -364,
+    -763,   364,  -763,  -763,  -763,     8,  -763,  -763,  -763,  1109,
+    1870,   850,  1678,  -763,  -763,    56,  -280,  -760,  -397,  -593,
+     305,  -644,  -616,  -762,    48,   193,  -763,  -587,  -763,  -279,
+     388,  -763,  -763,  -763,    15,  -386,   816,  -307,  -763,   672,
+       2,   -25,  -233,  -534,  -260,    19,   144,  -763,     4,    -2
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
+   positive, shift that token.  If negative, reduce the rule which
+   number is the opposite.  If zero, do what YYDEFACT says.
+   If YYTABLE_NINF, syntax error.  */
+#define YYTABLE_NINF -556
+static const yytype_int16 yytable[] =
+{
+      99,   371,   259,   242,   242,   429,   194,   242,   261,   406,
+     115,   115,   484,   495,   317,   256,   629,   466,   115,   257,
+     461,   335,   230,   208,   463,   440,   571,   599,   233,   270,
+     635,   248,   248,   635,   235,   248,   230,    67,   619,    67,
+     453,   288,   638,   532,   455,   537,   100,   786,   281,   285,
+     597,   380,   736,   298,   654,   274,   569,   115,   577,   383,
+     778,   580,   746,   724,   612,   280,   284,   320,   844,   321,
+     369,   245,   250,   622,   638,   251,   841,   -94,   743,   773,
+     667,   115,   598,   397,   235,   775,   902,   616,   749,   779,
+     397,   374,   270,  -101,   569,   375,   577,   784,   256,   449,
+     -96,   717,   718,   913,   789,   598,   502,   369,   690,   669,
+     -67,   735,   374,   418,  -462,   698,   366,   247,   247,   -98,
+       3,   247,   567,   763,   575,  -278,  -465,   575,  -275,  -100,
+     405,  -275,   657,   386,   -95,   337,   801,  -464,   685,   598,
+     -94,   -81,  -466,   808,   -97,   267,   567,   329,   575,  -467,
+     691,   279,   263,   896,   396,   447,  -101,   -96,   332,   236,
+     567,   331,   575,   528,   598,   -97,   327,   328,   902,   567,
+     252,   575,   -99,   913,   367,   258,   -98,   372,   384,   232,
+     -95,  -100,  -278,  -278,  -465,  -469,  -532,   370,   670,   859,
+     360,   361,   362,   255,   429,  -464,   844,   639,   466,   -86,
+    -466,   641,   668,   495,   567,   575,   644,  -467,   926,   236,
+     231,   232,   231,   232,   753,   -93,   649,   786,   628,   231,
+     232,   786,   407,   408,   370,   298,   231,   232,   567,   723,
+     575,   336,   465,   778,   255,   417,   -96,   -96,   954,   242,
+     814,   242,   242,  -469,   444,   427,   427,   635,   635,   258,
+     270,   -92,   235,   438,   400,   -98,   -98,   638,   236,   466,
+     773,  -323,   904,   -88,   685,   667,   766,   248,   773,   248,
+     -95,   -95,   685,   451,   909,   452,   274,  -531,   914,   -88,
+     -97,   -97,   232,   524,   892,   794,  -468,   -89,   533,  -531,
+     235,   786,   115,   404,   -91,   697,  -532,    81,   -90,    81,
+     116,   116,   -87,   448,   204,   204,  -457,   430,   214,   433,
+     204,   204,   204,   732,   270,   204,   363,   409,  -323,  -323,
+    -461,   457,   495,   530,   583,   585,   460,   232,   595,   378,
+     315,   316,   232,   379,   -90,   515,   516,   517,   518,   115,
+     274,  -392,   413,    81,  -468,   418,   236,   289,   958,   231,
+     232,   242,   236,   247,   -88,   247,    67,   204,   576,   387,
+     928,   519,   438,   514,  -457,   819,   232,   726,   667,   744,
+     667,   289,   415,   364,   365,   242,  -528,   236,  -461,   607,
+     835,   420,   576,   424,   745,   -88,   438,   615,   -88,   242,
+     425,   -88,   762,   606,   758,   -96,   576,   428,   242,   443,
+     438,   337,   590,  -392,   204,   576,    81,   532,   401,   438,
+     -98,   653,   790,   465,   961,   236,   388,   389,   761,   410,
+    -529,   232,   645,   459,   459,   -90,   618,   618,   459,   466,
+     450,   754,   526,   768,   427,   427,   893,   526,  -457,   576,
+     637,    99,   -66,   831,   635,   667,   898,   818,   495,   445,
+     230,   469,   877,   638,  -463,   456,   -90,   242,  -392,   -90,
+    -392,  -392,   -90,   462,   576,   402,   403,  -268,   438,   -95,
+     464,   115,   652,   115,   465,  -279,   411,   412,    67,   683,
+     499,   468,  -461,   500,   501,   531,   674,   650,  -462,   674,
+     512,   674,   513,  -528,    81,  -457,  -457,   587,   667,  -528,
+     667,   603,   911,   604,   204,   204,   402,   446,   470,   471,
+     920,  -463,  -463,   608,   -94,   496,   758,   918,   631,   630,
+     694,   640,  -535,   642,  -268,  -268,   647,   236,   702,   373,
+     667,   840,  -279,  -279,   115,   447,   643,  -529,   -81,  -461,
+    -461,   660,   495,  -529,   672,   -86,   707,   204,   676,   204,
+     204,   236,   236,   204,   204,  -101,   327,   328,    81,   388,
+     389,  -100,   705,    81,    81,   678,   706,   921,   922,   681,
+     711,   204,   707,   711,   713,   714,   679,   716,   714,   694,
+     694,  -253,   289,   948,  -535,   878,   -93,   707,   682,   705,
+     686,   711,   -92,   500,   501,   696,   714,   707,   381,   382,
+     699,   730,   734,   737,   722,   737,   751,   661,   721,   473,
+     474,   475,   476,   737,   709,   598,    81,   204,   204,   204,
+     204,    81,   204,   204,   886,   700,   204,   710,    81,   289,
+     888,   204,   707,   809,   230,   427,   735,   803,   750,  -535,
+     -96,  -535,  -535,   770,   465,  -531,   300,   725,   301,   302,
+     771,   772,   533,   -98,   337,   797,   799,   759,   752,   204,
+     760,   804,   806,   -95,   767,   782,   770,   204,   204,  -254,
+     567,   -88,   661,   791,   473,   474,   475,   476,   781,   567,
+     796,   575,   802,   204,   -90,    81,   204,   506,   817,   301,
+     302,   738,   735,    81,   -87,   303,   304,   204,   811,   812,
+     822,    81,   826,   765,   115,   526,   204,   358,   359,   360,
+     361,   362,   308,   310,   312,   314,   825,   830,   694,   832,
+     313,   839,   842,   301,   302,   846,   845,   847,   833,   834,
+     848,   824,   849,   236,   828,   837,   303,   304,    81,   851,
+     853,   816,   855,   201,   201,   858,   861,    81,   820,   201,
+     860,   829,   865,   867,   869,   872,   874,   427,   770,  -255,
+     875,   289,   879,   289,   889,   204,   890,   895,   897,   618,
+     303,   304,   674,   674,   236,   674,   907,   674,   674,   910,
+     307,   301,   302,   674,  -256,   916,   674,   674,   917,   927,
+     945,   115,   919,    81,   511,   876,   459,   301,   302,   472,
+     931,   473,   474,   475,   476,   935,   337,   887,   472,   937,
+     473,   474,   475,   476,   942,   953,   964,  -531,    98,  -532,
+      98,   350,   351,   646,   289,    98,    98,   115,   303,   304,
+     212,    98,    98,    98,   120,   737,    98,   715,   952,   764,
+     477,   955,   810,   377,   303,   304,   478,   479,   661,   477,
+     473,   474,   475,   476,   951,   478,   479,   197,   357,   358,
+     359,   360,   361,   362,    98,   774,   236,   923,   687,   924,
+     393,   480,   925,   236,   481,   929,     0,   880,    98,   677,
+     480,   680,     0,   481,   337,     0,   204,    81,   472,   662,
+     473,   474,   475,   476,   236,   663,     0,   482,     0,   350,
+     351,   674,   674,   674,   674,     0,   674,   674,   242,   908,
+     674,     0,   674,   674,     0,   576,     0,     0,     0,   438,
+     204,   606,   737,   707,     0,    98,     0,    98,   661,   477,
+     473,   474,   475,   476,     0,   478,   479,   358,   359,   360,
+     361,   362,     0,   201,   201,   282,     0,   661,     0,   473,
+     474,   475,   476,     0,   674,   674,   674,   674,   674,     0,
+     480,     0,     0,   481,    81,    81,   674,   236,     0,   477,
+     309,   301,   302,   236,     0,     0,   479,     0,     0,    81,
+       0,   777,     0,     0,   780,     0,     0,    81,   662,     0,
+     232,     0,   439,   441,   289,   204,   785,     0,   204,   204,
+     480,     0,     0,     0,   204,   204,   311,   301,   302,     0,
+     454,     0,    81,    81,     0,    98,     0,     0,   303,   304,
+       0,     0,     0,    81,     0,    98,    98,     0,     0,     0,
+      81,     0,     0,   204,   496,   301,   302,     0,   508,   301,
+     302,     0,    81,    81,     0,   509,   301,   302,   472,    81,
+     473,   474,   475,   476,   303,   304,   201,   201,   201,   201,
+       0,   520,   521,   322,   323,   324,   325,   326,    98,     0,
+      98,    98,     0,     0,    98,    98,     0,     0,     0,    98,
+       0,   864,   303,   304,    98,    98,   303,   304,     0,   477,
+       0,     0,    98,   303,   304,   478,   479,     0,   204,     0,
+       0,     0,   510,   301,   302,     0,     0,     0,     0,    81,
+      81,    94,     0,    94,   117,   117,   117,   883,     0,     0,
+     480,    81,   216,   481,   899,   600,   473,   474,   475,   476,
+       0,     0,   421,   422,   423,     0,     0,    98,    98,    98,
+      98,    98,    98,    98,    98,     0,   727,    98,     0,    98,
+     303,   304,    98,     0,   903,     0,   905,    94,     0,     0,
+     906,   290,   850,   852,     0,   854,     0,   856,   857,     0,
+     912,     0,   915,   862,     0,    81,   866,   868,     0,     0,
+      98,    81,     0,    81,     0,   290,    81,     0,    98,    98,
+     661,     0,   473,   474,   475,   476,     0,     0,     0,     0,
+     497,     0,     0,     0,    98,     0,    98,    98,   507,     0,
+       0,   507,     0,   507,    98,   507,   204,   507,    98,     0,
+      94,     0,    98,     0,     0,   525,     0,    98,     0,     0,
+     536,   662,     0,     0,     0,     0,   956,   843,  -555,     0,
+     957,     0,   959,     0,     0,     0,     0,   960,     0,     0,
+       0,  -555,  -555,  -555,  -555,  -555,  -555,     0,  -555,    98,
+       0,     0,     0,     0,  -555,  -555,     0,     0,    98,   968,
+       0,     0,     0,     0,     0,  -555,  -555,     0,  -555,  -555,
+    -555,  -555,  -555,     0,     0,     0,    98,     0,     0,     0,
+       0,   930,   932,   933,   934,     0,   936,   938,     0,     0,
+     941,     0,   943,   944,     0,     0,     0,     0,    94,     0,
+       0,     0,   536,     0,    98,     0,     0,     0,   632,   634,
+       0,     0,   282,     0,     0,   201,  -555,     0,     0,     0,
+       0,     0,     0,   243,   243,     0,     0,   243,     0,     0,
+       0,     0,     0,     0,   962,   963,   965,   966,   967,   337,
+       0,   634,     0,     0,   282,     0,   969,     0,     0,   201,
+       0,     0,   264,   266,   350,   351,     0,   243,   243,     0,
+       0,     0,    94,     0,     0,     0,     0,    94,    94,   318,
+     319,  -555,  -555,   675,  -555,     0,     0,   255,  -555,     0,
+    -555,  -555,     0,     0,     0,     0,   290,     0,     0,   355,
+     356,   357,   358,   359,   360,   361,   362,    98,    98,   337,
+     338,   339,   340,   341,   342,   343,   344,   695,   346,   347,
+       0,     0,     0,     0,   350,   351,     0,     0,     0,     0,
+      94,     0,     0,     0,     0,    94,     0,     0,     0,     0,
+       0,    98,    94,   290,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   353,   354,   355,
+     356,   357,   358,   359,   360,   361,   362,     0,     0,     0,
+       0,     0,   201,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    98,    98,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   731,    94,
+      98,     0,     0,     0,     0,     0,     0,    94,    98,     0,
+       0,     0,     0,     0,     0,    94,    98,     0,     0,    98,
+      98,     0,     0,     0,     0,    98,    98,   755,     0,     0,
+     757,     0,     0,    98,    98,     0,   634,   282,     0,     0,
+       0,     0,     0,     0,    98,     0,     0,     0,     0,     0,
+       0,    98,    94,     0,    98,   243,   243,   243,   318,     0,
+       0,    94,     0,    98,    98,     0,     0,     0,     0,   243,
+      98,   243,   243,     0,     0,   290,     0,   290,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     793,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    94,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    98,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      98,    98,     0,     0,     0,     0,     0,     0,   290,     0,
+       0,     0,    98,     0,     0,     0,     0,   836,   243,     0,
+     838,     0,     0,   535,   538,   539,   540,   541,   542,   543,
+     544,   545,   546,   547,   548,   549,   550,   551,   552,   553,
+     554,   555,   556,   557,   558,   559,   560,   561,   562,   563,
+      97,   243,    97,   118,   118,     0,   870,     0,     0,   584,
+     586,   217,     0,     0,     0,     0,    98,     0,     0,     0,
+       0,    94,    98,     0,    98,   243,     0,    98,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   609,     0,   243,
+       0,   584,   586,     0,     0,     0,    97,     0,   243,     0,
+     291,     0,     0,   282,     0,   243,     0,    98,     0,     0,
+       0,   243,   243,     0,     0,   243,     0,     0,     0,     0,
+       0,     0,     0,     0,   291,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   648,     0,     0,     0,     0,     0,
+       0,     0,     0,    78,   243,    78,     0,   243,    94,    94,
+       0,     0,     0,     0,   213,     0,     0,   243,     0,    97,
+       0,     0,     0,    94,     0,     0,     0,     0,     0,     0,
+       0,    94,     0,     0,     0,     0,   243,     0,   290,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    78,
+       0,     0,     0,     0,     0,     0,    94,    94,     0,   688,
+     689,     0,     0,     0,     0,     0,     0,    94,     0,     0,
+     243,     0,     0,     0,    94,     0,     0,     0,     0,   337,
+    -556,  -556,  -556,  -556,   342,   343,    94,    94,  -556,  -556,
+       0,     0,     0,    94,   350,   351,     0,     0,     0,     0,
+       0,     0,    95,     0,    95,     0,     0,    97,     0,     0,
+       0,     0,    78,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   117,     0,   353,   354,   355,
+     356,   357,   358,   359,   360,   361,   362,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    95,     0,
+       0,   243,     0,    94,    94,     0,     0,     0,     0,     0,
+       0,   884,     0,     0,     0,    94,     0,     0,     0,     0,
+       0,    97,     0,     0,     0,     0,    97,    97,     0,     0,
+     243,     0,     0,   243,     0,     0,     0,     0,     0,   243,
+     243,     0,     0,     0,     0,   291,     0,     0,     0,     0,
+      78,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    95,     0,     0,     0,     0,     0,     0,     0,    94,
+       0,     0,     0,     0,     0,    94,     0,    94,     0,    97,
+      94,     0,     0,     0,    97,     0,     0,     0,     0,     0,
+       0,    97,   291,   243,     0,     0,     0,   609,   795,     0,
+     798,   800,     0,     0,     0,     0,   805,   807,     0,     0,
+       0,     0,     0,     0,    78,     0,   813,     0,     0,    78,
+      78,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   798,   800,
+       0,   805,   807,     0,     0,     0,     0,     0,    97,    95,
+     243,     0,     0,   243,     0,     0,    97,     0,     0,     0,
+       0,     0,     0,     0,    97,     0,     0,     0,     0,     0,
+       0,     0,    78,     0,     0,     0,     0,    78,     0,     0,
+       0,     0,     0,     0,    78,     0,     0,   534,     0,   243,
+       0,     0,     0,   871,     0,     0,     0,     0,     0,     0,
+     873,    97,     0,     0,     0,     0,     0,     0,     0,     0,
+      97,     0,     0,    95,     0,     0,     0,     0,    95,    95,
+       0,     0,     0,     0,   291,     0,   291,     0,   873,     0,
+       0,   701,     0,     0,     0,     0,   243,     0,     0,     0,
+       0,    78,     0,     0,     0,     0,     0,     0,     0,    78,
+       0,     0,     0,     0,     0,     0,    97,    78,   337,   338,
+     339,   340,   341,   342,   343,   344,   345,   346,   347,   348,
+     349,    95,     0,   350,   351,     0,    95,     0,     0,     0,
+       0,     0,     0,    95,     0,     0,     0,   291,     0,     0,
+       0,     0,     0,     0,    78,     0,     0,     0,     0,     0,
+       0,     0,     0,    78,   352,     0,   353,   354,   355,   356,
+     357,   358,   359,   360,   361,   362,     0,     0,   243,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,  -230,     0,     0,     0,     0,     0,
+      95,   564,   565,     0,     0,   566,     0,     0,    95,    78,
+      97,     0,     0,     0,     0,     0,    95,     0,     0,   164,
+     165,   166,   167,   168,   169,   170,   171,   172,     0,     0,
+     173,   174,     0,     0,   175,   176,   177,   178,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   179,     0,
+       0,     0,     0,    95,     0,     0,     0,     0,     0,     0,
+       0,     0,    95,     0,     0,     0,     0,     0,     0,   180,
+     181,   182,   183,   184,   185,   186,   187,   188,   189,     0,
+     190,   191,     0,     0,     0,     0,     0,    97,    97,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   192,   255,
+       0,     0,    97,    78,     0,     0,     0,     0,    95,     0,
+      97,     0,     0,     0,     0,     0,     0,   291,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    97,    97,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    97,     0,     0,     0,
+       0,     0,     0,    97,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    97,    97,     0,     0,     0,
+       0,     0,    97,     0,     0,     0,     0,     0,     0,     0,
+      78,    78,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    78,     0,     0,     0,     0,
+       0,     0,    95,    78,   118,     0,     0,     0,     0,     0,
+       0,   534,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    78,    78,
+       0,     0,    97,    97,     0,     0,     0,     0,     0,    78,
+     885,     0,     0,     0,    97,     0,    78,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    78,    78,
+       0,     0,     0,     0,     0,    78,   337,   338,   339,   340,
+     341,   342,   343,   344,   345,   346,   347,   348,   349,    95,
+      95,   350,   351,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    95,     0,     0,     0,    97,     0,
+       0,     0,    95,     0,    97,     0,    97,     0,     0,    97,
+       0,     0,   352,     0,   353,   354,   355,   356,   357,   358,
+     359,   360,   361,   362,     0,    78,    78,    95,    95,     0,
+       0,     0,     0,   882,     0,     0,     0,    78,    95,     0,
+       0,     0,     0,     0,     0,    95,     0,     0,   232,     0,
+       0,     0,     0,     0,     0,     0,     0,    95,    95,     0,
+       0,     0,     0,     0,    95,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    78,     0,     0,     0,     0,     0,    78,     0,    78,
+       0,     0,    78,     0,     0,     0,     0,     0,     0,     0,
+    -555,     4,     0,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,     0,    95,    95,     0,     0,     0,    15,
+       0,    16,    17,    18,    19,     0,    95,     0,     0,     0,
+      20,    21,    22,    23,    24,    25,    26,     0,     0,    27,
+       0,     0,     0,     0,     0,    28,    29,    30,    31,    32,
+       0,    33,    34,    35,    36,    37,    38,     0,    39,    40,
+      41,     0,     0,    42,     0,     0,    43,    44,     0,    45,
+      46,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      95,     0,     0,     0,     0,     0,    95,     0,    95,    47,
+       0,    95,    48,    49,     0,    50,    51,  -278,    52,     0,
+      53,    54,    55,    56,    57,    58,    59,     0,     0,    60,
+    -278,  -278,  -278,  -278,  -278,  -278,     0,  -278,     0,     0,
+       0,     0,     0,     0,  -278,  -278,  -278,     0,     0,    61,
+      62,    63,     0,     0,  -278,  -278,     0,  -278,  -278,  -278,
+    -278,  -278,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,  -555,  -555,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,  -278,  -278,
+    -278,  -278,  -278,  -278,  -278,  -278,  -278,  -278,  -278,  -278,
+    -278,     0,     0,  -278,  -278,  -278,     0,   742,  -278,     0,
+       0,     0,     0,     0,  -278,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,  -278,     0,     0,     0,     0,
+       0,     0,     0,   -99,  -278,  -278,  -278,  -278,  -278,  -278,
+    -278,  -278,  -278,  -278,  -278,  -278,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,  -391,     0,
+       0,  -278,  -278,  -278,  -278,     0,     0,  -278,  -278,  -278,
+    -278,  -391,  -391,  -391,  -391,  -391,  -391,     0,  -391,     0,
+       0,   719,     0,     0,  -391,  -391,  -391,     0,     0,     0,
+       0,     0,     0,     0,     0,  -391,  -391,     0,  -391,  -391,
+    -391,  -391,  -391,     0,     0,     0,     0,     0,   337,   338,
+     339,   340,   341,   342,   343,   344,   345,   346,   347,   348,
+     349,     0,     0,   350,   351,     0,     0,     0,     0,  -391,
+    -391,  -391,  -391,  -391,  -391,  -391,  -391,  -391,  -391,  -391,
+    -391,  -391,     0,     0,  -391,  -391,  -391,     0,     0,  -391,
+       0,     0,     0,     0,   352,  -391,   353,   354,   355,   356,
+     357,   358,   359,   360,   361,   362,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,  -391,     0,  -391,  -391,  -391,
+    -391,  -391,  -391,  -391,  -391,  -391,  -391,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,  -269,
+       0,  -391,  -391,  -391,  -391,  -391,     0,   255,  -391,  -391,
+    -391,  -391,  -269,  -269,  -269,  -269,  -269,  -269,     0,  -269,
+       0,     0,   701,     0,     0,     0,  -269,  -269,  -269,     0,
+       0,     0,     0,     0,     0,     0,  -269,  -269,     0,  -269,
+    -269,  -269,  -269,  -269,     0,     0,     0,     0,     0,   337,
+     338,   339,   340,   341,   342,   343,   344,   345,   346,   347,
+     348,   349,     0,     0,   350,   351,     0,     0,     0,     0,
+    -269,  -269,  -269,  -269,  -269,  -269,  -269,  -269,  -269,  -269,
+    -269,  -269,  -269,     0,     0,  -269,  -269,  -269,     0,     0,
+    -269,     0,     0,     0,     0,   352,  -269,   353,   354,   355,
+     356,   357,   358,   359,   360,   361,   362,  -269,     0,     0,
+       0,     0,     0,     0,     0,     0,  -269,  -269,  -269,  -269,
+    -269,  -269,  -269,  -269,  -269,  -269,  -269,  -269,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+    -555,     0,     0,  -269,  -269,  -269,  -269,     0,     0,  -269,
+    -269,  -269,  -269,  -555,  -555,  -555,  -555,  -555,  -555,     0,
+    -555,     0,     0,     0,     0,     0,  -555,  -555,  -555,     0,
+       0,     0,     0,     0,     0,     0,     0,  -555,  -555,     0,
+    -555,  -555,  -555,  -555,  -555,     0,     0,     0,     0,     0,
+     337,   338,   339,   340,   341,   342,   343,   344,   345,   346,
+     347,   348,   349,     0,     0,   350,   351,     0,     0,     0,
+       0,  -555,  -555,  -555,  -555,  -555,  -555,  -555,  -555,  -555,
+    -555,  -555,  -555,  -555,     0,     0,  -555,  -555,  -555,     0,
+       0,  -555,     0,     0,     0,     0,   352,  -555,   353,   354,
+     355,   356,   357,   358,   359,   360,   361,   362,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,  -555,     0,  -555,
+    -555,  -555,  -555,  -555,  -555,  -555,  -555,  -555,  -555,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,  -285,     0,  -555,  -555,  -555,  -555,  -555,     0,   255,
+    -555,  -555,  -555,  -555,  -285,  -285,  -285,  -285,  -285,  -285,
+       0,  -285,     0,     0,     0,     0,     0,     0,  -285,  -285,
+       0,     0,     0,     0,     0,     0,     0,     0,  -285,  -285,
+       0,  -285,  -285,  -285,  -285,  -285,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,  -285,  -285,  -285,  -285,  -285,  -285,  -285,  -285,
+    -285,  -285,  -285,  -285,  -285,     0,     0,  -285,  -285,  -285,
+       0,     0,  -285,  -535,     0,     0,     0,     0,  -285,     0,
+       0,     0,     0,     0,     0,     0,  -535,  -535,  -535,     0,
+    -535,  -535,     0,  -535,     0,     0,     0,     0,  -285,  -535,
+    -285,  -285,  -285,  -285,  -285,  -285,  -285,  -285,  -285,  -285,
+    -535,  -535,     0,  -535,  -535,  -535,  -535,  -535,     0,     0,
+       0,     0,     0,     0,     0,  -285,  -285,  -285,  -285,     0,
+     252,  -285,  -285,  -285,  -285,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,  -535,  -535,  -535,  -535,  -535,  -535,
+    -535,  -535,  -535,  -535,  -535,  -535,  -535,     0,     0,  -535,
+    -535,  -535,     0,   703,     0,  -278,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,  -278,  -278,
+    -278,     0,  -278,  -278,     0,  -278,     0,     0,     0,   -97,
+    -535,     0,  -535,  -535,  -535,  -535,  -535,  -535,  -535,  -535,
+    -535,  -535,  -278,  -278,     0,  -278,  -278,  -278,  -278,  -278,
+       0,     0,     0,     0,     0,     0,  -535,  -535,  -535,  -535,
+     -89,     0,     0,  -535,     0,  -535,  -535,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,  -278,  -278,  -278,  -278,
+    -278,  -278,  -278,  -278,  -278,  -278,  -278,  -278,  -278,     0,
+       0,  -278,  -278,  -278,     0,   704,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   -99,  -278,     0,  -278,  -278,  -278,  -278,  -278,  -278,
+    -278,  -278,  -278,  -278,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,  -278,
+    -278,  -278,   -91,     0,     0,  -278,     0,  -278,  -278,   268,
+       0,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+      14,  -555,  -555,  -555,     0,     0,  -555,    15,     0,    16,
+      17,    18,    19,     0,     0,     0,     0,     0,    20,    21,
+      22,    23,    24,    25,    26,     0,     0,    27,     0,     0,
+       0,     0,     0,    28,     0,    30,    31,    32,     0,    33,
+      34,    35,    36,    37,    38,     0,    39,    40,    41,     0,
+       0,    42,     0,     0,    43,    44,     0,    45,    46,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    47,     0,     0,
+      48,    49,     0,    50,    51,     0,    52,     0,    53,    54,
+      55,    56,    57,    58,    59,     0,     0,    60,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    61,    62,    63,
+       0,     0,     0,     0,     0,     0,     0,     0,   268,     0,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+    -555,  -555,  -555,     0,  -555,  -555,    15,     0,    16,    17,
+      18,    19,     0,     0,     0,     0,     0,    20,    21,    22,
+      23,    24,    25,    26,     0,     0,    27,     0,     0,     0,
+       0,     0,    28,     0,    30,    31,    32,     0,    33,    34,
+      35,    36,    37,    38,     0,    39,    40,    41,     0,     0,
+      42,     0,     0,    43,    44,     0,    45,    46,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    47,     0,     0,    48,
+      49,     0,    50,    51,     0,    52,     0,    53,    54,    55,
+      56,    57,    58,    59,     0,     0,    60,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    61,    62,    63,     0,
+       0,     0,     0,     0,   268,     0,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,     0,     0,  -555,  -555,
+    -555,  -555,    15,  -555,    16,    17,    18,    19,     0,     0,
+       0,     0,     0,    20,    21,    22,    23,    24,    25,    26,
+       0,     0,    27,     0,     0,     0,     0,     0,    28,     0,
+      30,    31,    32,     0,    33,    34,    35,    36,    37,    38,
+       0,    39,    40,    41,     0,     0,    42,     0,     0,    43,
+      44,     0,    45,    46,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    47,     0,     0,    48,    49,     0,    50,    51,
+       0,    52,     0,    53,    54,    55,    56,    57,    58,    59,
+       0,     0,    60,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    61,    62,    63,     0,     0,     0,     0,     0,
+     268,     0,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,     0,     0,  -555,  -555,  -555,  -555,    15,     0,
+      16,    17,    18,    19,     0,     0,     0,     0,     0,    20,
+      21,    22,    23,    24,    25,    26,     0,     0,    27,     0,
+       0,     0,     0,     0,    28,     0,    30,    31,    32,     0,
+      33,    34,    35,    36,    37,    38,     0,    39,    40,    41,
+       0,     0,    42,     0,     0,    43,    44,     0,    45,    46,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    47,     0,
+       0,    48,    49,     0,    50,    51,     0,    52,     0,    53,
+      54,    55,    56,    57,    58,    59,     0,     0,    60,     0,
+       0,     0,     0,     0,     0,     4,     0,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,     0,    61,    62,
+      63,     0,     0,    15,     0,    16,    17,    18,    19,     0,
+       0,     0,     0,     0,    20,    21,    22,    23,    24,    25,
+      26,  -555,  -555,    27,     0,     0,     0,     0,     0,    28,
+      29,    30,    31,    32,     0,    33,    34,    35,    36,    37,
+      38,     0,    39,    40,    41,     0,     0,    42,     0,     0,
+      43,    44,     0,    45,    46,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    47,     0,     0,    48,    49,     0,    50,
+      51,     0,    52,     0,    53,    54,    55,    56,    57,    58,
+      59,     0,     0,    60,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    61,    62,    63,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,  -555,     0,
+       0,     0,     0,     0,     0,     0,  -555,  -555,   268,     0,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+       0,  -555,  -555,     0,     0,     0,    15,     0,    16,    17,
+      18,    19,     0,     0,     0,     0,     0,    20,    21,    22,
+      23,    24,    25,    26,     0,     0,    27,     0,     0,     0,
+       0,     0,    28,     0,    30,    31,    32,     0,    33,    34,
+      35,    36,    37,    38,     0,    39,    40,    41,     0,     0,
+      42,     0,     0,    43,    44,     0,    45,    46,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    47,     0,     0,    48,
+      49,     0,    50,    51,     0,    52,     0,    53,    54,    55,
+      56,    57,    58,    59,     0,     0,    60,     0,     0,     0,
+       0,     0,     0,   268,     0,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    14,     0,    61,    62,    63,     0,
+       0,    15,     0,    16,    17,    18,    19,     0,     0,     0,
+       0,     0,    20,    21,    22,    23,    24,    25,    26,  -555,
+    -555,    27,     0,     0,     0,     0,     0,    28,     0,    30,
+      31,    32,     0,    33,    34,    35,    36,    37,    38,     0,
+      39,    40,    41,     0,     0,    42,     0,     0,    43,    44,
+       0,    45,    46,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    47,     0,     0,   269,    49,     0,    50,    51,     0,
+      52,     0,    53,    54,    55,    56,    57,    58,    59,     0,
+       0,    60,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    61,    62,    63,     0,     0,     0,     0,   268,     0,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+       0,     0,  -555,     0,  -555,  -555,    15,     0,    16,    17,
+      18,    19,     0,     0,     0,     0,     0,    20,    21,    22,
+      23,    24,    25,    26,     0,     0,    27,     0,     0,     0,
+       0,     0,    28,     0,    30,    31,    32,     0,    33,    34,
+      35,    36,    37,    38,     0,    39,    40,    41,     0,     0,
+      42,     0,     0,    43,    44,     0,    45,    46,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    47,     0,     0,    48,
+      49,     0,    50,    51,     0,    52,     0,    53,    54,    55,
+      56,    57,    58,    59,     0,     0,    60,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    61,    62,    63,     0,
+       0,     0,     0,   268,     0,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    14,     0,     0,  -555,     0,  -555,
+    -555,    15,     0,    16,    17,    18,    19,     0,     0,     0,
+       0,     0,    20,    21,    22,    23,    24,    25,    26,     0,
+       0,    27,     0,     0,     0,     0,     0,    28,     0,    30,
+      31,    32,     0,    33,    34,    35,    36,    37,    38,     0,
+      39,    40,    41,     0,     0,    42,     0,     0,    43,    44,
+       0,    45,    46,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    47,     0,     0,    48,    49,     0,    50,    51,     0,
+      52,     0,    53,    54,    55,    56,    57,    58,    59,     0,
+       0,    60,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    61,    62,    63,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,  -555,     0,     0,     0,
+       0,     0,     0,     0,  -555,  -555,   268,     0,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,     0,     0,
+    -555,     0,     0,     0,    15,     0,    16,    17,    18,    19,
+       0,     0,     0,     0,     0,    20,    21,    22,    23,    24,
+      25,    26,     0,     0,    27,     0,     0,     0,     0,     0,
+      28,     0,    30,    31,    32,     0,    33,    34,    35,    36,
+      37,    38,     0,    39,    40,    41,     0,     0,    42,     0,
+       0,    43,    44,     0,    45,    46,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    47,     0,     0,    48,    49,     0,
+      50,    51,     0,    52,     0,    53,    54,    55,    56,    57,
+      58,    59,     0,     0,    60,     0,     0,     0,     0,     0,
+       0,     0,     0,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,     0,     0,    61,    62,    63,     0,     0,    15,
+       0,    16,    17,    18,    19,     0,     0,     0,     0,     0,
+      20,    21,    22,    23,    24,    25,    26,  -555,  -555,   106,
+       0,     0,     0,     0,     0,     0,     0,     0,    31,    32,
+       0,    33,    34,    35,    36,    37,    38,   238,    39,    40,
+      41,     0,     0,    42,     0,     0,    43,    44,     0,    45,
+      46,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   200,
+       0,     0,   111,    49,     0,    50,    51,     0,   239,   240,
+      53,    54,    55,    56,    57,    58,    59,     0,     0,    60,
+       0,     0,     0,     0,     0,     0,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,     0,     0,     0,     0,    61,
+     241,    63,    15,     0,    16,    17,    18,    19,     0,     0,
+       0,     0,     0,    20,    21,    22,    23,    24,    25,    26,
+       0,     0,    27,   232,     0,     0,     0,     0,     0,     0,
+       0,    31,    32,     0,    33,    34,    35,    36,    37,    38,
+       0,    39,    40,    41,     0,     0,    42,     0,     0,    43,
+      44,     0,    45,    46,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   200,     0,     0,   111,    49,     0,    50,    51,
+       0,     0,     0,    53,    54,    55,    56,    57,    58,    59,
+       0,     0,    60,     0,     0,     0,     0,     0,     0,     0,
+       0,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+       0,     0,    61,    62,    63,     0,     0,    15,     0,    16,
+      17,    18,    19,     0,     0,     0,     0,     0,    20,    21,
+      22,    23,    24,    25,    26,   231,   232,    27,     0,     0,
+       0,     0,     0,     0,     0,     0,    31,    32,     0,    33,
+      34,    35,    36,    37,    38,     0,    39,    40,    41,     0,
+       0,    42,     0,     0,    43,    44,     0,    45,    46,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   200,     0,     0,
+     111,    49,     0,    50,    51,     0,     0,     0,    53,    54,
+      55,    56,    57,    58,    59,     0,     0,    60,     0,     0,
+       0,     0,     0,     0,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,     0,     0,     0,    61,    62,    63,
+      15,     0,    16,    17,    18,    19,     0,     0,     0,     0,
+       0,    20,    21,    22,    23,    24,    25,    26,     0,     0,
+      27,   232,     0,     0,     0,     0,    28,    29,    30,    31,
+      32,     0,    33,    34,    35,    36,    37,    38,     0,    39,
+      40,    41,     0,     0,    42,     0,     0,    43,    44,     0,
+      45,    46,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      47,     0,     0,    48,    49,     0,    50,    51,     0,    52,
+       0,    53,    54,    55,    56,    57,    58,    59,     0,     0,
+      60,     0,     0,     0,     0,     0,     0,     0,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,     0,     0,
+      61,    62,    63,     0,    15,     0,    16,    17,    18,    19,
+       0,     0,     0,     0,     0,    20,    21,    22,    23,    24,
+      25,    26,     0,   420,    27,     0,     0,     0,     0,     0,
+      28,     0,    30,    31,    32,     0,    33,    34,    35,    36,
+      37,    38,     0,    39,    40,    41,     0,     0,    42,     0,
+       0,    43,    44,     0,    45,    46,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    47,     0,     0,    48,    49,     0,
+      50,    51,     0,    52,     0,    53,    54,    55,    56,    57,
+      58,    59,     0,     0,    60,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    61,    62,    63,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   420,   121,   122,
+     123,   124,   125,   126,   127,   128,   129,   130,   131,   132,
+     133,   134,   135,   136,   137,   138,   139,   140,   141,   142,
+     143,   144,     0,     0,     0,   145,   146,   147,   148,   149,
+     150,   151,   152,   153,   154,     0,     0,     0,     0,     0,
+     155,   156,   157,   158,   159,   160,   161,   162,    35,    36,
+     163,    38,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   164,   165,   166,   167,   168,   169,
+     170,   171,   172,     0,     0,   173,   174,     0,     0,   175,
+     176,   177,   178,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   179,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   180,   181,   182,   183,   184,   185,
+     186,   187,   188,   189,     0,   190,   191,     0,     0,  -528,
+    -528,  -528,  -528,  -528,  -528,  -528,  -528,  -528,     0,     0,
+       0,     0,     0,   192,   193,  -528,     0,  -528,  -528,  -528,
+    -528,     0,  -528,     0,     0,     0,  -528,  -528,  -528,  -528,
+    -528,  -528,  -528,     0,     0,  -528,     0,     0,     0,     0,
+       0,     0,     0,     0,  -528,  -528,     0,  -528,  -528,  -528,
+    -528,  -528,  -528,  -528,  -528,  -528,  -528,     0,     0,  -528,
+       0,     0,  -528,  -528,     0,  -528,  -528,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,  -528,     0,     0,  -528,  -528,
+       0,  -528,  -528,     0,  -528,  -528,  -528,  -528,  -528,  -528,
+    -528,  -528,  -528,     0,     0,  -528,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,  -528,  -528,  -528,  -529,  -529,
+    -529,  -529,  -529,  -529,  -529,  -529,  -529,     0,     0,  -528,
+       0,     0,     0,     0,  -529,  -528,  -529,  -529,  -529,  -529,
+       0,  -529,     0,     0,     0,  -529,  -529,  -529,  -529,  -529,
+    -529,  -529,     0,     0,  -529,     0,     0,     0,     0,     0,
+       0,     0,     0,  -529,  -529,     0,  -529,  -529,  -529,  -529,
+    -529,  -529,  -529,  -529,  -529,  -529,     0,     0,  -529,     0,
+       0,  -529,  -529,     0,  -529,  -529,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,  -529,     0,     0,  -529,  -529,     0,
+    -529,  -529,     0,  -529,  -529,  -529,  -529,  -529,  -529,  -529,
+    -529,  -529,     0,     0,  -529,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,  -529,  -529,  -529,  -531,  -531,  -531,
+    -531,  -531,  -531,  -531,  -531,  -531,     0,     0,  -529,     0,
+       0,     0,     0,  -531,  -529,  -531,  -531,  -531,  -531,     0,
+       0,     0,     0,     0,  -531,  -531,  -531,  -531,  -531,  -531,
+    -531,     0,     0,  -531,     0,     0,     0,     0,     0,     0,
+       0,     0,  -531,  -531,     0,  -531,  -531,  -531,  -531,  -531,
+    -531,  -531,  -531,  -531,  -531,     0,     0,  -531,     0,     0,
+    -531,  -531,     0,  -531,  -531,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,  -531,   741,     0,  -531,  -531,     0,  -531,
+    -531,     0,  -531,  -531,  -531,  -531,  -531,  -531,  -531,  -531,
+    -531,     0,     0,  -531,     0,     0,     0,     0,     0,     0,
+     -97,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,  -531,  -531,  -531,  -533,  -533,  -533,  -533,
+    -533,  -533,  -533,  -533,  -533,     0,     0,     0,     0,     0,
+       0,     0,  -533,  -531,  -533,  -533,  -533,  -533,     0,     0,
+       0,     0,     0,  -533,  -533,  -533,  -533,  -533,  -533,  -533,
+       0,     0,  -533,     0,     0,     0,     0,     0,     0,     0,
+       0,  -533,  -533,     0,  -533,  -533,  -533,  -533,  -533,  -533,
+    -533,  -533,  -533,  -533,     0,     0,  -533,     0,     0,  -533,
+    -533,     0,  -533,  -533,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,  -533,     0,     0,  -533,  -533,     0,  -533,  -533,
+       0,  -533,  -533,  -533,  -533,  -533,  -533,  -533,  -533,  -533,
+       0,     0,  -533,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,  -533,  -533,  -533,  -534,  -534,  -534,  -534,  -534,
+    -534,  -534,  -534,  -534,     0,     0,     0,     0,     0,     0,
+       0,  -534,  -533,  -534,  -534,  -534,  -534,     0,     0,     0,
+       0,     0,  -534,  -534,  -534,  -534,  -534,  -534,  -534,     0,
+       0,  -534,     0,     0,     0,     0,     0,     0,     0,     0,
+    -534,  -534,     0,  -534,  -534,  -534,  -534,  -534,  -534,  -534,
+    -534,  -534,  -534,     0,     0,  -534,     0,     0,  -534,  -534,
+       0,  -534,  -534,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,  -534,     0,     0,  -534,  -534,     0,  -534,  -534,     0,
+    -534,  -534,  -534,  -534,  -534,  -534,  -534,  -534,  -534,     0,
+       0,  -534,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,  -534,  -534,  -534,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,  -534,   121,   122,   123,   124,   125,   126,   127,   128,
+     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
+     139,   140,   141,   142,   143,   144,     0,     0,     0,   145,
+     146,   147,   218,   219,   220,   221,   152,   153,   154,     0,
+       0,     0,     0,     0,   155,   156,   157,   222,   223,   160,
+     224,   162,   293,   294,   225,   295,     0,     0,     0,     0,
+       0,     0,   296,     0,     0,     0,     0,     0,   164,   165,
+     166,   167,   168,   169,   170,   171,   172,     0,     0,   173,
+     174,     0,     0,   175,   176,   177,   178,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   179,     0,     0,
+       0,     0,     0,     0,   297,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   180,   181,
+     182,   183,   184,   185,   186,   187,   188,   189,     0,   190,
+     191,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   192,   121,   122,
+     123,   124,   125,   126,   127,   128,   129,   130,   131,   132,
+     133,   134,   135,   136,   137,   138,   139,   140,   141,   142,
+     143,   144,     0,     0,     0,   145,   146,   147,   218,   219,
+     220,   221,   152,   153,   154,     0,     0,     0,     0,     0,
+     155,   156,   157,   222,   223,   160,   224,   162,   293,   294,
+     225,   295,     0,     0,     0,     0,     0,     0,   296,     0,
+       0,     0,     0,     0,   164,   165,   166,   167,   168,   169,
+     170,   171,   172,     0,     0,   173,   174,     0,     0,   175,
+     176,   177,   178,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   179,     0,     0,     0,     0,     0,     0,
+     414,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   180,   181,   182,   183,   184,   185,
+     186,   187,   188,   189,     0,   190,   191,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   192,   121,   122,   123,   124,   125,   126,
+     127,   128,   129,   130,   131,   132,   133,   134,   135,   136,
+     137,   138,   139,   140,   141,   142,   143,   144,     0,     0,
+       0,   145,   146,   147,   218,   219,   220,   221,   152,   153,
+     154,     0,     0,     0,     0,     0,   155,   156,   157,   222,
+     223,   160,   224,   162,     0,     0,   225,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     164,   165,   166,   167,   168,   169,   170,   171,   172,     0,
+       0,   173,   174,     0,     0,   175,   176,   177,   178,     0,
+       0,   337,   338,   339,   340,   341,   342,   343,     0,   179,
+     346,   347,   226,     0,     0,     0,   350,   351,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     180,   181,   182,   183,   184,   185,   186,   187,   188,   189,
+       0,   190,   191,     0,     0,     0,     0,     0,     0,   353,
+     354,   355,   356,   357,   358,   359,   360,   361,   362,   192,
+     121,   122,   123,   124,   125,   126,   127,   128,   129,   130,
+     131,   132,   133,   134,   135,   136,   137,   138,   139,   140,
+     141,   142,   143,   144,     0,     0,     0,   145,   146,   147,
+     218,   219,   220,   221,   152,   153,   154,     0,     0,     0,
+       0,     0,   155,   156,   157,   222,   223,   160,   224,   162,
+       0,     0,   225,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   164,   165,   166,   167,
+     168,   169,   170,   171,   172,     0,     0,   173,   174,     0,
+       0,   175,   176,   177,   178,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   179,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   180,   181,   182,   183,
+     184,   185,   186,   187,   188,   189,     0,   190,   191,     0,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,     0,
+       0,     0,     0,     0,     0,   192,    15,     0,   101,   102,
+      18,    19,     0,     0,     0,     0,     0,   103,   104,   105,
+      23,    24,    25,    26,     0,     0,   106,     0,     0,     0,
+       0,     0,     0,     0,     0,    31,    32,     0,    33,    34,
+      35,    36,    37,    38,     0,    39,    40,    41,     0,     0,
+      42,     0,     0,    43,    44,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   286,     0,     0,   111,
+      49,     0,    50,    51,     0,     0,     0,    53,    54,    55,
+      56,    57,    58,    59,     0,     0,    60,     0,     0,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,     0,     0,
+       0,     0,     0,     0,     0,    15,   112,   101,   102,    18,
+      19,     0,     0,     0,     0,     0,   103,   104,   105,    23,
+      24,    25,    26,     0,   287,   106,     0,     0,     0,     0,
+       0,     0,     0,     0,    31,    32,     0,    33,    34,    35,
+      36,    37,    38,     0,    39,    40,    41,     0,     0,    42,
+       0,     0,    43,    44,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   286,     0,     0,   111,    49,
+       0,    50,    51,     0,     0,     0,    53,    54,    55,    56,
+      57,    58,    59,     0,     0,    60,     0,     0,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,     0,     0,     0,
+       0,     0,     0,     0,    15,   112,   101,   102,    18,    19,
+       0,     0,     0,     0,     0,   103,   104,   105,    23,    24,
+      25,    26,     0,   529,   106,     0,     0,     0,     0,     0,
+       0,     0,     0,    31,    32,     0,    33,    34,    35,    36,
+      37,    38,   238,    39,    40,    41,     0,     0,    42,     0,
+       0,    43,    44,     0,    45,    46,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   200,     0,     0,   111,    49,     0,
+      50,    51,     0,   633,   240,    53,    54,    55,    56,    57,
+      58,    59,     0,     0,    60,   499,     0,     0,   500,   501,
+       0,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+      14,     0,     0,     0,    61,   241,    63,    15,     0,    16,
+      17,    18,    19,     0,     0,     0,     0,     0,    20,    21,
+      22,    23,    24,    25,    26,     0,     0,    27,     0,     0,
+       0,     0,     0,    28,    29,    30,    31,    32,     0,    33,
+      34,    35,    36,    37,    38,     0,    39,    40,    41,     0,
+       0,    42,     0,     0,    43,    44,     0,    45,    46,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    47,     0,     0,
+      48,    49,     0,    50,    51,     0,    52,     0,    53,    54,
+      55,    56,    57,    58,    59,     0,     0,    60,     0,     0,
+       0,     0,     0,     0,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,     0,     0,     0,     0,    61,    62,    63,
+      15,     0,   101,   102,    18,    19,     0,     0,     0,     0,
+       0,   103,   104,   105,    23,    24,    25,    26,     0,     0,
+     106,     0,     0,     0,     0,     0,     0,     0,     0,    31,
+      32,     0,    33,    34,    35,    36,    37,    38,   238,    39,
+      40,    41,     0,     0,    42,     0,     0,    43,    44,     0,
+      45,    46,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     200,     0,     0,   111,    49,     0,    50,    51,     0,   633,
+       0,    53,    54,    55,    56,    57,    58,    59,     0,     0,
+      60,   499,     0,     0,   500,   501,     0,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,     0,     0,     0,
+      61,   241,    63,    15,     0,    16,    17,    18,    19,     0,
+       0,     0,     0,     0,    20,    21,    22,    23,    24,    25,
+      26,     0,     0,    27,     0,     0,     0,     0,     0,    28,
+       0,    30,    31,    32,     0,    33,    34,    35,    36,    37,
+      38,     0,    39,    40,    41,     0,     0,    42,     0,     0,
+      43,    44,     0,    45,    46,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    47,     0,     0,    48,    49,     0,    50,
+      51,     0,    52,     0,    53,    54,    55,    56,    57,    58,
+      59,     0,     0,    60,     0,     0,     0,     0,     0,     0,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,     0,
+       0,     0,     0,    61,    62,    63,    15,     0,   101,   102,
+      18,    19,     0,     0,     0,     0,     0,   103,   104,   105,
+      23,    24,    25,    26,     0,     0,   106,     0,     0,     0,
+       0,     0,     0,     0,     0,    31,    32,     0,    33,    34,
+      35,    36,    37,    38,     0,    39,    40,    41,     0,     0,
+      42,     0,     0,    43,    44,     0,    45,    46,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   200,     0,     0,   111,
+      49,     0,    50,    51,     0,   756,     0,    53,    54,    55,
+      56,    57,    58,    59,     0,     0,    60,   499,     0,     0,
+     500,   501,     0,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,     0,     0,     0,     0,    61,   241,    63,    15,
+       0,   101,   102,    18,    19,     0,     0,     0,     0,     0,
+     103,   104,   105,    23,    24,    25,    26,     0,     0,   106,
+       0,     0,     0,     0,     0,     0,     0,     0,    31,    32,
+       0,    33,    34,    35,    36,    37,    38,     0,    39,    40,
+      41,     0,     0,    42,     0,     0,    43,    44,     0,    45,
+      46,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   200,
+       0,     0,   111,    49,     0,    50,    51,     0,   792,     0,
+      53,    54,    55,    56,    57,    58,    59,     0,     0,    60,
+     499,     0,     0,   500,   501,     0,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,     0,     0,     0,     0,    61,
+     241,    63,    15,     0,   101,   102,    18,    19,     0,     0,
+       0,     0,     0,   103,   104,   105,    23,    24,    25,    26,
+       0,     0,   106,     0,     0,     0,     0,     0,     0,     0,
+       0,    31,    32,     0,    33,    34,    35,    36,    37,    38,
+       0,    39,    40,    41,     0,     0,    42,     0,     0,    43,
+      44,     0,    45,    46,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   200,     0,     0,   111,    49,     0,    50,    51,
+       0,   633,     0,    53,    54,    55,    56,    57,    58,    59,
+       0,     0,    60,   499,     0,     0,   500,   501,     0,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,     0,     0,
+       0,     0,    61,   241,    63,    15,     0,    16,    17,    18,
+      19,     0,     0,     0,     0,     0,    20,    21,    22,    23,
+      24,    25,    26,     0,     0,   106,     0,     0,     0,     0,
+       0,     0,     0,     0,    31,    32,     0,    33,    34,    35,
+      36,    37,    38,   238,    39,    40,    41,     0,     0,    42,
+       0,     0,    43,    44,     0,    45,    46,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   200,     0,     0,   111,    49,
+       0,    50,    51,     0,   239,   240,    53,    54,    55,    56,
+      57,    58,    59,     0,     0,    60,     0,     0,     0,     0,
+       0,     0,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,     0,     0,     0,     0,    61,   241,    63,    15,     0,
+     101,   102,    18,    19,     0,     0,     0,     0,     0,   103,
+     104,   105,    23,    24,    25,    26,     0,     0,   106,     0,
+       0,     0,     0,     0,     0,     0,     0,    31,    32,     0,
+      33,    34,    35,    36,    37,    38,   238,    39,    40,    41,
+       0,     0,    42,     0,     0,    43,    44,     0,    45,    46,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   200,     0,
+       0,   111,    49,     0,    50,    51,     0,   239,     0,    53,
+      54,    55,    56,    57,    58,    59,     0,     0,    60,     0,
+       0,     0,     0,     0,     0,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,     0,     0,     0,     0,    61,   241,
+      63,    15,     0,   101,   102,    18,    19,     0,     0,     0,
+       0,     0,   103,   104,   105,    23,    24,    25,    26,     0,
+       0,   106,     0,     0,     0,     0,     0,     0,     0,     0,
+      31,    32,     0,    33,    34,    35,    36,    37,    38,   238,
+      39,    40,    41,     0,     0,    42,     0,     0,    43,    44,
+       0,    45,    46,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   200,     0,     0,   111,    49,     0,    50,    51,     0,
+       0,   240,    53,    54,    55,    56,    57,    58,    59,     0,
+       0,    60,     0,     0,     0,     0,     0,     0,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,     0,     0,     0,
+       0,    61,   241,    63,    15,     0,   101,   102,    18,    19,
+       0,     0,     0,     0,     0,   103,   104,   105,    23,    24,
+      25,    26,     0,     0,   106,     0,     0,     0,     0,     0,
+       0,     0,     0,    31,    32,     0,    33,    34,    35,    36,
+      37,    38,   238,    39,    40,    41,     0,     0,    42,     0,
+       0,    43,    44,     0,    45,    46,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   200,     0,     0,   111,    49,     0,
+      50,    51,     0,     0,     0,    53,    54,    55,    56,    57,
+      58,    59,     0,     0,    60,     0,     0,     0,     0,     0,
+       0,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+       0,     0,     0,     0,    61,   241,    63,    15,     0,    16,
+      17,    18,    19,     0,     0,     0,     0,     0,    20,    21,
+      22,    23,    24,    25,    26,     0,     0,   106,     0,     0,
+       0,     0,     0,     0,     0,     0,    31,    32,     0,    33,
+      34,    35,    36,    37,    38,     0,    39,    40,    41,     0,
+       0,    42,     0,     0,    43,    44,     0,    45,    46,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   200,     0,     0,
+     111,    49,     0,    50,    51,     0,   523,     0,    53,    54,
+      55,    56,    57,    58,    59,     0,     0,    60,     0,     0,
+       0,     0,     0,     0,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,     0,     0,     0,     0,    61,   241,    63,
+      15,     0,   101,   102,    18,    19,     0,     0,     0,     0,
+       0,   103,   104,   105,    23,    24,    25,    26,     0,     0,
+     106,     0,     0,     0,     0,     0,     0,     0,     0,    31,
+      32,     0,    33,    34,    35,    36,    37,    38,     0,    39,
+      40,    41,     0,     0,    42,     0,     0,    43,    44,     0,
+      45,    46,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     200,     0,     0,   111,    49,     0,    50,    51,     0,   239,
+       0,    53,    54,    55,    56,    57,    58,    59,     0,     0,
+      60,     0,     0,     0,     0,     0,     0,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,     0,     0,     0,     0,
+      61,   241,    63,    15,     0,   101,   102,    18,    19,     0,
+       0,     0,     0,     0,   103,   104,   105,    23,    24,    25,
+      26,     0,     0,   106,     0,     0,     0,     0,     0,     0,
+       0,     0,    31,    32,     0,    33,    34,    35,    36,    37,
+      38,     0,    39,    40,    41,     0,     0,    42,     0,     0,
+      43,    44,     0,    45,    46,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   200,     0,     0,   111,    49,     0,    50,
+      51,     0,   523,     0,    53,    54,    55,    56,    57,    58,
+      59,     0,     0,    60,     0,     0,     0,     0,     0,     0,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,     0,
+       0,     0,     0,    61,   241,    63,    15,     0,    16,    17,
+      18,    19,     0,     0,     0,     0,     0,    20,    21,    22,
+      23,    24,    25,    26,     0,     0,    27,     0,     0,     0,
+       0,     0,     0,     0,     0,    31,    32,     0,    33,    34,
+      35,    36,    37,    38,     0,    39,    40,    41,     0,     0,
+      42,     0,     0,    43,    44,     0,    45,    46,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   200,     0,     0,   111,
+      49,     0,    50,    51,     0,     0,     0,    53,    54,    55,
+      56,    57,    58,    59,     0,     0,    60,     0,     0,     0,
+       0,     0,     0,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,     0,     0,     0,     0,    61,    62,    63,    15,
+       0,   101,   102,    18,    19,     0,     0,     0,     0,     0,
+     103,   104,   105,    23,    24,    25,    26,     0,     0,   106,
+       0,     0,     0,     0,     0,     0,     0,     0,    31,    32,
+       0,    33,    34,    35,    36,    37,    38,     0,    39,    40,
+      41,     0,     0,    42,     0,     0,    43,    44,     0,    45,
+      46,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   200,
+       0,     0,   111,    49,     0,    50,    51,     0,     0,     0,
+      53,    54,    55,    56,    57,    58,    59,     0,     0,    60,
+       0,     0,     0,     0,     0,     0,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,     0,     0,     0,     0,    61,
+     241,    63,    15,     0,    16,    17,    18,    19,     0,     0,
+       0,     0,     0,    20,    21,    22,    23,    24,    25,    26,
+       0,     0,   106,     0,     0,     0,     0,     0,     0,     0,
+       0,    31,    32,     0,    33,    34,    35,    36,    37,    38,
+       0,    39,    40,    41,     0,     0,    42,     0,     0,    43,
+      44,     0,    45,    46,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   200,     0,     0,   111,    49,     0,    50,    51,
+       0,     0,     0,    53,    54,    55,    56,    57,    58,    59,
+       0,     0,    60,     0,     0,     0,     0,     0,     0,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,     0,     0,
+       0,     0,    61,   241,    63,    15,     0,   101,   102,    18,
+      19,     0,     0,     0,     0,     0,   103,   104,   105,    23,
+      24,    25,    26,     0,     0,   106,     0,     0,     0,     0,
+       0,     0,     0,     0,    31,    32,     0,   107,    34,    35,
+      36,   108,    38,     0,    39,    40,    41,     0,     0,    42,
+       0,     0,    43,    44,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   109,     0,     0,   110,     0,     0,   111,    49,
+       0,    50,    51,     0,     0,     0,    53,    54,    55,    56,
+      57,    58,    59,     0,     0,    60,     0,     0,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,     0,     0,     0,
+       0,     0,     0,     0,    15,   112,   101,   102,    18,    19,
+       0,     0,     0,     0,     0,   103,   104,   105,    23,    24,
+      25,    26,     0,     0,   106,     0,     0,     0,     0,     0,
+       0,     0,     0,    31,    32,     0,    33,    34,    35,    36,
+      37,    38,     0,    39,    40,    41,     0,     0,    42,     0,
+       0,    43,    44,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   211,     0,     0,    48,    49,     0,
+      50,    51,     0,    52,     0,    53,    54,    55,    56,    57,
+      58,    59,     0,     0,    60,     0,     0,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,     0,     0,     0,     0,
+       0,     0,     0,    15,   112,   101,   102,    18,    19,     0,
+       0,     0,     0,     0,   103,   104,   105,    23,    24,    25,
+      26,     0,     0,   106,     0,     0,     0,     0,     0,     0,
+       0,     0,    31,    32,     0,    33,    34,    35,    36,    37,
+      38,     0,    39,    40,    41,     0,     0,    42,     0,     0,
+      43,    44,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   286,     0,     0,   333,    49,     0,    50,
+      51,     0,   334,     0,    53,    54,    55,    56,    57,    58,
+      59,     0,     0,    60,     0,     0,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,     0,     0,     0,     0,     0,
+       0,     0,    15,   112,   101,   102,    18,    19,     0,     0,
+       0,     0,     0,   103,   104,   105,    23,    24,    25,    26,
+       0,     0,   106,     0,     0,     0,     0,     0,     0,     0,
+       0,    31,    32,     0,   107,    34,    35,    36,   108,    38,
+       0,    39,    40,    41,     0,     0,    42,     0,     0,    43,
+      44,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   110,     0,     0,   111,    49,     0,    50,    51,
+       0,     0,     0,    53,    54,    55,    56,    57,    58,    59,
+       0,     0,    60,     0,     0,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,     0,     0,     0,     0,     0,     0,
+       0,    15,   112,   101,   102,    18,    19,     0,     0,     0,
+       0,     0,   103,   104,   105,    23,    24,    25,    26,     0,
+       0,   106,     0,     0,     0,     0,     0,     0,     0,     0,
+      31,    32,     0,    33,    34,    35,    36,    37,    38,     0,
+      39,    40,    41,     0,     0,    42,     0,     0,    43,    44,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   286,     0,     0,   333,    49,     0,    50,    51,     0,
+       0,     0,    53,    54,    55,    56,    57,    58,    59,     0,
+       0,    60,     0,     0,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,     0,     0,     0,     0,     0,     0,     0,
+      15,   112,   101,   102,    18,    19,     0,     0,     0,     0,
+       0,   103,   104,   105,    23,    24,    25,    26,     0,     0,
+     106,     0,     0,     0,     0,     0,     0,     0,     0,    31,
+      32,     0,    33,    34,    35,    36,    37,    38,     0,    39,
+      40,    41,     0,     0,    42,     0,     0,    43,    44,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     863,     0,     0,   111,    49,     0,    50,    51,     0,     0,
+       0,    53,    54,    55,    56,    57,    58,    59,     0,     0,
+      60,     0,     0,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,     0,     0,     0,     0,     0,     0,     0,    15,
+     112,   101,   102,    18,    19,     0,     0,     0,     0,     0,
+     103,   104,   105,    23,    24,    25,    26,     0,     0,   106,
+       0,     0,     0,     0,     0,     0,     0,     0,    31,    32,
+       0,    33,    34,    35,    36,    37,    38,     0,    39,    40,
+      41,     0,     0,    42,     0,     0,    43,    44,     0,   337,
+     338,   339,   340,   341,   342,   343,   344,   345,   346,   347,
+    -556,  -556,     0,     0,   350,   351,     0,     0,     0,   881,
+       0,     0,   111,    49,     0,    50,    51,     0,     0,     0,
+      53,    54,    55,    56,    57,    58,    59,     0,     0,    60,
+       0,     0,   572,   573,     0,     0,   574,   353,   354,   355,
+     356,   357,   358,   359,   360,   361,   362,     0,     0,   112,
+     164,   165,   166,   167,   168,   169,   170,   171,   172,     0,
+       0,   173,   174,     0,     0,   175,   176,   177,   178,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   179,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     180,   181,   182,   183,   184,   185,   186,   187,   188,   189,
+       0,   190,   191,   593,   565,     0,     0,   594,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   192,
+     255,   164,   165,   166,   167,   168,   169,   170,   171,   172,
+       0,     0,   173,   174,     0,     0,   175,   176,   177,   178,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     179,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   180,   181,   182,   183,   184,   185,   186,   187,   188,
+     189,     0,   190,   191,   578,   573,     0,     0,   579,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     192,   255,   164,   165,   166,   167,   168,   169,   170,   171,
+     172,     0,     0,   173,   174,     0,     0,   175,   176,   177,
+     178,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   179,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   180,   181,   182,   183,   184,   185,   186,   187,
+     188,   189,     0,   190,   191,   610,   565,     0,     0,   611,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   192,   255,   164,   165,   166,   167,   168,   169,   170,
+     171,   172,     0,     0,   173,   174,     0,     0,   175,   176,
+     177,   178,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   179,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   180,   181,   182,   183,   184,   185,   186,
+     187,   188,   189,     0,   190,   191,   613,   573,     0,     0,
+     614,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   192,   255,   164,   165,   166,   167,   168,   169,
+     170,   171,   172,     0,     0,   173,   174,     0,     0,   175,
+     176,   177,   178,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   179,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   180,   181,   182,   183,   184,   185,
+     186,   187,   188,   189,     0,   190,   191,   620,   565,     0,
+       0,   621,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   192,   255,   164,   165,   166,   167,   168,
+     169,   170,   171,   172,     0,     0,   173,   174,     0,     0,
+     175,   176,   177,   178,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   179,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   180,   181,   182,   183,   184,
+     185,   186,   187,   188,   189,     0,   190,   191,   623,   573,
+       0,     0,   624,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   192,   255,   164,   165,   166,   167,
+     168,   169,   170,   171,   172,     0,     0,   173,   174,     0,
+       0,   175,   176,   177,   178,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   179,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   180,   181,   182,   183,
+     184,   185,   186,   187,   188,   189,     0,   190,   191,   655,
+     565,     0,     0,   656,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   192,   255,   164,   165,   166,
+     167,   168,   169,   170,   171,   172,     0,     0,   173,   174,
+       0,     0,   175,   176,   177,   178,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   179,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   180,   181,   182,
+     183,   184,   185,   186,   187,   188,   189,     0,   190,   191,
+     658,   573,     0,     0,   659,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   192,   255,   164,   165,
+     166,   167,   168,   169,   170,   171,   172,     0,     0,   173,
+     174,     0,     0,   175,   176,   177,   178,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   179,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   180,   181,
+     182,   183,   184,   185,   186,   187,   188,   189,     0,   190,
+     191,   939,   565,     0,     0,   940,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   192,   255,   164,
+     165,   166,   167,   168,   169,   170,   171,   172,     0,     0,
+     173,   174,     0,     0,   175,   176,   177,   178,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   179,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   180,
+     181,   182,   183,   184,   185,   186,   187,   188,   189,     0,
+     190,   191,   946,   565,     0,     0,   947,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   192,   255,
+     164,   165,   166,   167,   168,   169,   170,   171,   172,     0,
+       0,   173,   174,     0,     0,   175,   176,   177,   178,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   179,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     180,   181,   182,   183,   184,   185,   186,   187,   188,   189,
+       0,   190,   191,   949,   573,     0,     0,   950,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   192,
+     255,   164,   165,   166,   167,   168,   169,   170,   171,   172,
+       0,     0,   173,   174,     0,     0,   175,   176,   177,   178,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     179,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   180,   181,   182,   183,   184,   185,   186,   187,   188,
+     189,     0,   190,   191,   578,   573,     0,     0,   579,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     192,   255,   164,   165,   166,   167,   168,   169,   170,   171,
+     172,     0,     0,   173,   174,     0,     0,   175,   176,   177,
+     178,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   179,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   180,   181,   182,   183,   184,   185,   186,   187,
+     188,   189,     0,   190,   191,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   192
+};
+
+static const yytype_int16 yycheck[] =
+{
+       2,    83,    27,    16,    17,   248,     7,    20,    28,   208,
+       5,     6,   292,   292,    62,    22,   417,   287,    13,    22,
+     280,    76,    14,    10,   284,   258,   364,   390,    15,    48,
+     425,    16,    17,   428,    15,    20,    28,     2,   408,     4,
+     273,    52,   428,   336,   277,   336,     4,   691,    50,    51,
+     388,   110,   605,    54,   468,    48,   363,    52,   365,     1,
+     676,   368,   615,   597,   402,    50,    51,    65,   767,    65,
+      26,    16,    17,   411,   460,    20,   765,    25,   612,   672,
+     477,    76,   389,    16,    65,   672,   846,    27,   622,   676,
+      16,    98,   111,    25,   401,    98,   403,   691,   105,   269,
+      16,   581,   582,   865,   691,   412,   304,    26,    79,    29,
+     116,    18,   119,    20,    90,   529,    88,    16,    17,    16,
+       0,    20,   363,   657,   365,    88,    88,   368,   150,    25,
+      90,   153,   470,   114,    16,    71,   706,    88,   502,   446,
+     116,   147,    88,   713,    16,    55,   387,    28,   389,    88,
+     121,    50,   143,   842,    55,    90,   116,    25,   147,    15,
+     401,   116,   403,   333,   471,    25,    37,    38,   928,   410,
+     149,   412,    25,   935,   146,   149,    25,    90,   120,   153,
+      25,   116,   145,   146,   146,    88,   149,   143,   108,   783,
+     126,   127,   128,   149,   437,   146,   895,   430,   468,   147,
+     146,   434,   482,   482,   445,   446,   439,   146,   897,    65,
+     152,   153,   152,   153,   147,   147,   449,   861,   416,   152,
+     153,   865,   209,   210,   143,   226,   152,   153,   469,   592,
+     471,   116,   287,   849,   149,   233,   152,   153,   927,   252,
+     720,   254,   255,   146,   263,   247,   248,   642,   643,   149,
+     269,   147,   233,   255,   116,   152,   153,   643,   114,   529,
+     853,    88,   849,    25,   628,   662,   663,   252,   861,   254,
+     152,   153,   636,   271,   861,   271,   269,   149,   865,   147,
+     152,   153,   153,   331,   837,   699,    88,   147,   336,   149,
+     271,   935,   287,    90,   147,   528,   149,     2,   147,     4,
+       5,     6,   147,   268,     9,    10,    88,   252,    13,   254,
+      15,    16,    17,   604,   333,    20,    88,    55,   145,   146,
+      88,   147,   601,   334,   372,   373,   147,   153,   387,    51,
+      58,    59,   153,    55,    25,   322,   323,   324,   325,   334,
+     333,    26,    25,    48,   146,    20,   202,    52,   935,   152,
+     153,   364,   208,   252,   116,   254,   321,    62,   365,    88,
+     147,   326,   364,   321,   146,   728,   153,   600,   765,    90,
+     767,    76,   147,   145,   146,   388,    26,   233,   146,   398,
+     750,   152,   389,    91,    90,   147,   388,   406,   150,   402,
+     147,   153,   652,   395,   637,   116,   403,   147,   411,   143,
+     402,    71,   383,    88,   109,   412,   111,   700,    88,   411,
+     116,   466,   691,   468,   948,   271,   145,   146,   651,    88,
+      26,   153,   442,   279,   280,   116,   407,   408,   284,   699,
+     150,   630,   331,   666,   436,   437,   837,   336,    88,   446,
+     425,   443,   116,    90,   839,   842,   843,   727,   727,    88,
+     442,    88,   815,   839,    88,   151,   147,   470,   143,   150,
+     145,   146,   153,   144,   471,   145,   146,    88,   470,   116,
+      55,   466,   457,   468,   529,    88,   145,   146,   443,   498,
+     110,   147,    88,   113,   114,   147,   488,   452,    90,   491,
+      71,   493,    71,   143,   199,   145,   146,    97,   895,   149,
+     897,    15,    88,    13,   209,   210,   145,   146,   145,   146,
+      88,   145,   146,    16,   116,    63,   759,   880,    15,   418,
+     522,   150,    26,   147,   145,   146,   144,   383,   553,    90,
+     927,   764,   145,   146,   529,    90,   147,   143,   147,   145,
+     146,   116,   821,   149,   147,   147,   571,   252,   147,   254,
+     255,   407,   408,   258,   259,   116,    37,    38,   263,   145,
+     146,   116,   569,   268,   269,    51,   569,   145,   146,    51,
+     577,   276,   597,   580,   577,   577,   147,   580,   580,   581,
+     582,   147,   287,   921,    88,   818,   147,   612,    63,   596,
+     110,   598,   147,   113,   114,   147,   598,   622,    58,    59,
+     147,   602,   604,   605,   591,   607,   626,    51,   589,    53,
+      54,    55,    56,   615,    90,   922,   321,   322,   323,   324,
+     325,   326,   327,   328,   823,   116,   331,    90,   333,   334,
+     829,   336,   657,   715,   626,   637,    18,    90,   625,   143,
+     116,   145,   146,   668,   699,   149,    62,    15,    64,    65,
+     669,   670,   700,   116,    71,   703,   704,   642,    15,   364,
+     144,   709,   710,   116,   147,   684,   691,   372,   373,   147,
+     911,   147,    51,   692,    53,    54,    55,    56,   144,   920,
+     118,   922,   151,   388,   147,   390,   391,    62,    15,    64,
+      65,    17,    18,   398,   147,   111,   112,   402,   717,   718,
+      91,   406,    14,   147,   699,   604,   411,   124,   125,   126,
+     127,   128,    56,    57,    58,    59,   735,    15,   720,    15,
+      61,   147,   147,    64,    65,   152,   150,    15,   747,   748,
+     144,   733,   147,   589,   736,   754,   111,   112,   443,   147,
+     147,   722,   147,     9,    10,   144,   147,   452,   729,    15,
+     121,   738,   147,   147,    15,   803,    15,   759,   783,   147,
+     144,   466,    15,   468,    15,   470,    15,   147,   147,   750,
+     111,   112,   774,   775,   630,   777,   121,   779,   780,    55,
+      63,    64,    65,   785,   147,   144,   788,   789,    15,   147,
+      15,   786,    55,   498,    61,   814,   652,    64,    65,    51,
+     147,    53,    54,    55,    56,   147,    71,   826,    51,   147,
+      53,    54,    55,    56,   147,    15,   147,   149,     2,   149,
+       4,    86,    87,   443,   529,     9,    10,   822,   111,   112,
+      13,    15,    16,    17,     6,   837,    20,   580,   924,   662,
+      92,   928,   716,   109,   111,   112,    98,    99,    51,    92,
+      53,    54,    55,    56,   923,    98,    99,     7,   123,   124,
+     125,   126,   127,   128,    48,   672,   722,   886,   504,   888,
+     198,   123,   891,   729,   126,   900,    -1,   821,    62,   491,
+     123,   493,    -1,   126,    71,    -1,   591,   592,    51,    92,
+      53,    54,    55,    56,   750,    98,    -1,   149,    -1,    86,
+      87,   903,   904,   905,   906,    -1,   908,   909,   921,   861,
+     912,    -1,   914,   915,    -1,   922,    -1,    -1,    -1,   921,
+     625,   923,   924,   948,    -1,   109,    -1,   111,    51,    92,
+      53,    54,    55,    56,    -1,    98,    99,   124,   125,   126,
+     127,   128,    -1,   209,   210,    51,    -1,    51,    -1,    53,
+      54,    55,    56,    -1,   956,   957,   958,   959,   960,    -1,
+     123,    -1,    -1,   126,   669,   670,   968,   823,    -1,    92,
+      63,    64,    65,   829,    -1,    -1,    99,    -1,    -1,   684,
+      -1,   676,    -1,    -1,   679,    -1,    -1,   692,    92,    -1,
+     153,    -1,   258,   259,   699,   700,   691,    -1,   703,   704,
+     123,    -1,    -1,    -1,   709,   710,    63,    64,    65,    -1,
+     276,    -1,   717,   718,    -1,   199,    -1,    -1,   111,   112,
+      -1,    -1,    -1,   728,    -1,   209,   210,    -1,    -1,    -1,
+     735,    -1,    -1,   738,    63,    64,    65,    -1,    63,    64,
+      65,    -1,   747,   748,    -1,    63,    64,    65,    51,   754,
+      53,    54,    55,    56,   111,   112,   322,   323,   324,   325,
+      -1,   327,   328,    40,    41,    42,    43,    44,   252,    -1,
+     254,   255,    -1,    -1,   258,   259,    -1,    -1,    -1,   263,
+      -1,   786,   111,   112,   268,   269,   111,   112,    -1,    92,
+      -1,    -1,   276,   111,   112,    98,    99,    -1,   803,    -1,
+      -1,    -1,    63,    64,    65,    -1,    -1,    -1,    -1,   814,
+     815,     2,    -1,     4,     5,     6,     7,   822,    -1,    -1,
+     123,   826,    13,   126,    51,   391,    53,    54,    55,    56,
+      -1,    -1,   238,   239,   240,    -1,    -1,   321,   322,   323,
+     324,   325,   326,   327,   328,    -1,   149,   331,    -1,   333,
+     111,   112,   336,    -1,   849,    -1,   851,    48,    -1,    -1,
+     855,    52,   774,   775,    -1,   777,    -1,   779,   780,    -1,
+     865,    -1,   867,   785,    -1,   880,   788,   789,    -1,    -1,
+     364,   886,    -1,   888,    -1,    76,   891,    -1,   372,   373,
+      51,    -1,    53,    54,    55,    56,    -1,    -1,    -1,    -1,
+     297,    -1,    -1,    -1,   388,    -1,   390,   391,   305,    -1,
+      -1,   308,    -1,   310,   398,   312,   921,   314,   402,    -1,
+     111,    -1,   406,    -1,    -1,   331,    -1,   411,    -1,    -1,
+     336,    92,    -1,    -1,    -1,    -1,   931,    98,     0,    -1,
+     935,    -1,   937,    -1,    -1,    -1,    -1,   942,    -1,    -1,
+      -1,    13,    14,    15,    16,    17,    18,    -1,    20,   443,
+      -1,    -1,    -1,    -1,    26,    27,    -1,    -1,   452,   964,
+      -1,    -1,    -1,    -1,    -1,    37,    38,    -1,    40,    41,
+      42,    43,    44,    -1,    -1,    -1,   470,    -1,    -1,    -1,
+      -1,   903,   904,   905,   906,    -1,   908,   909,    -1,    -1,
+     912,    -1,   914,   915,    -1,    -1,    -1,    -1,   199,    -1,
+      -1,    -1,   418,    -1,   498,    -1,    -1,    -1,   424,   425,
+      -1,    -1,   428,    -1,    -1,   591,    88,    -1,    -1,    -1,
+      -1,    -1,    -1,    16,    17,    -1,    -1,    20,    -1,    -1,
+      -1,    -1,    -1,    -1,   956,   957,   958,   959,   960,    71,
+      -1,   457,    -1,    -1,   460,    -1,   968,    -1,    -1,   625,
+      -1,    -1,    45,    46,    86,    87,    -1,    50,    51,    -1,
+      -1,    -1,   263,    -1,    -1,    -1,    -1,   268,   269,    62,
+      63,   143,   144,   489,   146,    -1,    -1,   149,   150,    -1,
+     152,   153,    -1,    -1,    -1,    -1,   287,    -1,    -1,   121,
+     122,   123,   124,   125,   126,   127,   128,   591,   592,    71,
+      72,    73,    74,    75,    76,    77,    78,   523,    80,    81,
+      -1,    -1,    -1,    -1,    86,    87,    -1,    -1,    -1,    -1,
+     321,    -1,    -1,    -1,    -1,   326,    -1,    -1,    -1,    -1,
+      -1,   625,   333,   334,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   119,   120,   121,
+     122,   123,   124,   125,   126,   127,   128,    -1,    -1,    -1,
+      -1,    -1,   738,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   669,   670,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   604,   390,
+     684,    -1,    -1,    -1,    -1,    -1,    -1,   398,   692,    -1,
+      -1,    -1,    -1,    -1,    -1,   406,   700,    -1,    -1,   703,
+     704,    -1,    -1,    -1,    -1,   709,   710,   633,    -1,    -1,
+     636,    -1,    -1,   717,   718,    -1,   642,   643,    -1,    -1,
+      -1,    -1,    -1,    -1,   728,    -1,    -1,    -1,    -1,    -1,
+      -1,   735,   443,    -1,   738,   238,   239,   240,   241,    -1,
+      -1,   452,    -1,   747,   748,    -1,    -1,    -1,    -1,   252,
+     754,   254,   255,    -1,    -1,   466,    -1,   468,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     696,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   498,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   803,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     814,   815,    -1,    -1,    -1,    -1,    -1,    -1,   529,    -1,
+      -1,    -1,   826,    -1,    -1,    -1,    -1,   753,   331,    -1,
+     756,    -1,    -1,   336,   337,   338,   339,   340,   341,   342,
+     343,   344,   345,   346,   347,   348,   349,   350,   351,   352,
+     353,   354,   355,   356,   357,   358,   359,   360,   361,   362,
+       2,   364,     4,     5,     6,    -1,   792,    -1,    -1,   372,
+     373,    13,    -1,    -1,    -1,    -1,   880,    -1,    -1,    -1,
+      -1,   592,   886,    -1,   888,   388,    -1,   891,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   400,    -1,   402,
+      -1,   404,   405,    -1,    -1,    -1,    48,    -1,   411,    -1,
+      52,    -1,    -1,   839,    -1,   418,    -1,   921,    -1,    -1,
+      -1,   424,   425,    -1,    -1,   428,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    76,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   447,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,     2,   457,     4,    -1,   460,   669,   670,
+      -1,    -1,    -1,    -1,    13,    -1,    -1,   470,    -1,   111,
+      -1,    -1,    -1,   684,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   692,    -1,    -1,    -1,    -1,   489,    -1,   699,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    48,
+      -1,    -1,    -1,    -1,    -1,    -1,   717,   718,    -1,   512,
+     513,    -1,    -1,    -1,    -1,    -1,    -1,   728,    -1,    -1,
+     523,    -1,    -1,    -1,   735,    -1,    -1,    -1,    -1,    71,
+      72,    73,    74,    75,    76,    77,   747,   748,    80,    81,
+      -1,    -1,    -1,   754,    86,    87,    -1,    -1,    -1,    -1,
+      -1,    -1,     2,    -1,     4,    -1,    -1,   199,    -1,    -1,
+      -1,    -1,   111,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   786,    -1,   119,   120,   121,
+     122,   123,   124,   125,   126,   127,   128,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    48,    -1,
+      -1,   604,    -1,   814,   815,    -1,    -1,    -1,    -1,    -1,
+      -1,   822,    -1,    -1,    -1,   826,    -1,    -1,    -1,    -1,
+      -1,   263,    -1,    -1,    -1,    -1,   268,   269,    -1,    -1,
+     633,    -1,    -1,   636,    -1,    -1,    -1,    -1,    -1,   642,
+     643,    -1,    -1,    -1,    -1,   287,    -1,    -1,    -1,    -1,
+     199,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   111,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   880,
+      -1,    -1,    -1,    -1,    -1,   886,    -1,   888,    -1,   321,
+     891,    -1,    -1,    -1,   326,    -1,    -1,    -1,    -1,    -1,
+      -1,   333,   334,   696,    -1,    -1,    -1,   700,   701,    -1,
+     703,   704,    -1,    -1,    -1,    -1,   709,   710,    -1,    -1,
+      -1,    -1,    -1,    -1,   263,    -1,   719,    -1,    -1,   268,
+     269,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   741,   742,
+      -1,   744,   745,    -1,    -1,    -1,    -1,    -1,   390,   199,
+     753,    -1,    -1,   756,    -1,    -1,   398,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   406,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   321,    -1,    -1,    -1,    -1,   326,    -1,    -1,
+      -1,    -1,    -1,    -1,   333,    -1,    -1,   336,    -1,   792,
+      -1,    -1,    -1,   796,    -1,    -1,    -1,    -1,    -1,    -1,
+     803,   443,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     452,    -1,    -1,   263,    -1,    -1,    -1,    -1,   268,   269,
+      -1,    -1,    -1,    -1,   466,    -1,   468,    -1,   831,    -1,
+      -1,    44,    -1,    -1,    -1,    -1,   839,    -1,    -1,    -1,
+      -1,   390,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   398,
+      -1,    -1,    -1,    -1,    -1,    -1,   498,   406,    71,    72,
+      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+      83,   321,    -1,    86,    87,    -1,   326,    -1,    -1,    -1,
+      -1,    -1,    -1,   333,    -1,    -1,    -1,   529,    -1,    -1,
+      -1,    -1,    -1,    -1,   443,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   452,   117,    -1,   119,   120,   121,   122,
+     123,   124,   125,   126,   127,   128,    -1,    -1,   921,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   147,    -1,    -1,    -1,    -1,    -1,
+     390,    51,    52,    -1,    -1,    55,    -1,    -1,   398,   498,
+     592,    -1,    -1,    -1,    -1,    -1,   406,    -1,    -1,    69,
+      70,    71,    72,    73,    74,    75,    76,    77,    -1,    -1,
+      80,    81,    -1,    -1,    84,    85,    86,    87,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    98,    -1,
+      -1,    -1,    -1,   443,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   452,    -1,    -1,    -1,    -1,    -1,    -1,   119,
+     120,   121,   122,   123,   124,   125,   126,   127,   128,    -1,
+     130,   131,    -1,    -1,    -1,    -1,    -1,   669,   670,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   148,   149,
+      -1,    -1,   684,   592,    -1,    -1,    -1,    -1,   498,    -1,
+     692,    -1,    -1,    -1,    -1,    -1,    -1,   699,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   717,   718,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   728,    -1,    -1,    -1,
+      -1,    -1,    -1,   735,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   747,   748,    -1,    -1,    -1,
+      -1,    -1,   754,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     669,   670,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   684,    -1,    -1,    -1,    -1,
+      -1,    -1,   592,   692,   786,    -1,    -1,    -1,    -1,    -1,
+      -1,   700,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   717,   718,
+      -1,    -1,   814,   815,    -1,    -1,    -1,    -1,    -1,   728,
+     822,    -1,    -1,    -1,   826,    -1,   735,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   747,   748,
+      -1,    -1,    -1,    -1,    -1,   754,    71,    72,    73,    74,
+      75,    76,    77,    78,    79,    80,    81,    82,    83,   669,
+     670,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   684,    -1,    -1,    -1,   880,    -1,
+      -1,    -1,   692,    -1,   886,    -1,   888,    -1,    -1,   891,
+      -1,    -1,   117,    -1,   119,   120,   121,   122,   123,   124,
+     125,   126,   127,   128,    -1,   814,   815,   717,   718,    -1,
+      -1,    -1,    -1,   822,    -1,    -1,    -1,   826,   728,    -1,
+      -1,    -1,    -1,    -1,    -1,   735,    -1,    -1,   153,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   747,   748,    -1,
+      -1,    -1,    -1,    -1,   754,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   880,    -1,    -1,    -1,    -1,    -1,   886,    -1,   888,
+      -1,    -1,   891,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       0,     1,    -1,     3,     4,     5,     6,     7,     8,     9,
+      10,    11,    12,    -1,   814,   815,    -1,    -1,    -1,    19,
+      -1,    21,    22,    23,    24,    -1,   826,    -1,    -1,    -1,
+      30,    31,    32,    33,    34,    35,    36,    -1,    -1,    39,
+      -1,    -1,    -1,    -1,    -1,    45,    46,    47,    48,    49,
+      -1,    51,    52,    53,    54,    55,    56,    -1,    58,    59,
+      60,    -1,    -1,    63,    -1,    -1,    66,    67,    -1,    69,
+      70,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     880,    -1,    -1,    -1,    -1,    -1,   886,    -1,   888,    89,
+      -1,   891,    92,    93,    -1,    95,    96,     0,    98,    -1,
+     100,   101,   102,   103,   104,   105,   106,    -1,    -1,   109,
+      13,    14,    15,    16,    17,    18,    -1,    20,    -1,    -1,
+      -1,    -1,    -1,    -1,    27,    28,    29,    -1,    -1,   129,
+     130,   131,    -1,    -1,    37,    38,    -1,    40,    41,    42,
+      43,    44,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   152,   153,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    71,    72,
+      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+      83,    -1,    -1,    86,    87,    88,    -1,    90,    91,    -1,
+      -1,    -1,    -1,    -1,    97,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   108,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   116,   117,   118,   119,   120,   121,   122,
+     123,   124,   125,   126,   127,   128,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     0,    -1,
+      -1,   144,   145,   146,   147,    -1,    -1,   150,   151,   152,
+     153,    13,    14,    15,    16,    17,    18,    -1,    20,    -1,
+      -1,    44,    -1,    -1,    26,    27,    28,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    37,    38,    -1,    40,    41,
+      42,    43,    44,    -1,    -1,    -1,    -1,    -1,    71,    72,
+      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+      83,    -1,    -1,    86,    87,    -1,    -1,    -1,    -1,    71,
+      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
+      82,    83,    -1,    -1,    86,    87,    88,    -1,    -1,    91,
+      -1,    -1,    -1,    -1,   117,    97,   119,   120,   121,   122,
+     123,   124,   125,   126,   127,   128,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   117,    -1,   119,   120,   121,
+     122,   123,   124,   125,   126,   127,   128,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     0,
+      -1,   143,   144,   145,   146,   147,    -1,   149,   150,   151,
+     152,   153,    13,    14,    15,    16,    17,    18,    -1,    20,
+      -1,    -1,    44,    -1,    -1,    -1,    27,    28,    29,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    37,    38,    -1,    40,
+      41,    42,    43,    44,    -1,    -1,    -1,    -1,    -1,    71,
+      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
+      82,    83,    -1,    -1,    86,    87,    -1,    -1,    -1,    -1,
+      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+      81,    82,    83,    -1,    -1,    86,    87,    88,    -1,    -1,
+      91,    -1,    -1,    -1,    -1,   117,    97,   119,   120,   121,
+     122,   123,   124,   125,   126,   127,   128,   108,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   117,   118,   119,   120,
+     121,   122,   123,   124,   125,   126,   127,   128,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+       0,    -1,    -1,   144,   145,   146,   147,    -1,    -1,   150,
+     151,   152,   153,    13,    14,    15,    16,    17,    18,    -1,
+      20,    -1,    -1,    -1,    -1,    -1,    26,    27,    28,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    37,    38,    -1,
+      40,    41,    42,    43,    44,    -1,    -1,    -1,    -1,    -1,
+      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+      81,    82,    83,    -1,    -1,    86,    87,    -1,    -1,    -1,
+      -1,    71,    72,    73,    74,    75,    76,    77,    78,    79,
+      80,    81,    82,    83,    -1,    -1,    86,    87,    88,    -1,
+      -1,    91,    -1,    -1,    -1,    -1,   117,    97,   119,   120,
+     121,   122,   123,   124,   125,   126,   127,   128,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   117,    -1,   119,
+     120,   121,   122,   123,   124,   125,   126,   127,   128,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,     0,    -1,   143,   144,   145,   146,   147,    -1,   149,
+     150,   151,   152,   153,    13,    14,    15,    16,    17,    18,
+      -1,    20,    -1,    -1,    -1,    -1,    -1,    -1,    27,    28,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    37,    38,
+      -1,    40,    41,    42,    43,    44,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    71,    72,    73,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    -1,    -1,    86,    87,    88,
+      -1,    -1,    91,     0,    -1,    -1,    -1,    -1,    97,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    13,    14,    15,    -1,
+      17,    18,    -1,    20,    -1,    -1,    -1,    -1,   117,    26,
+     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
+      37,    38,    -1,    40,    41,    42,    43,    44,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   144,   145,   146,   147,    -1,
+     149,   150,   151,   152,   153,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    71,    72,    73,    74,    75,    76,
+      77,    78,    79,    80,    81,    82,    83,    -1,    -1,    86,
+      87,    88,    -1,    90,    -1,     0,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    13,    14,
+      15,    -1,    17,    18,    -1,    20,    -1,    -1,    -1,   116,
+     117,    -1,   119,   120,   121,   122,   123,   124,   125,   126,
+     127,   128,    37,    38,    -1,    40,    41,    42,    43,    44,
+      -1,    -1,    -1,    -1,    -1,    -1,   143,   144,   145,   146,
+     147,    -1,    -1,   150,    -1,   152,   153,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    71,    72,    73,    74,
+      75,    76,    77,    78,    79,    80,    81,    82,    83,    -1,
+      -1,    86,    87,    88,    -1,    90,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   116,   117,    -1,   119,   120,   121,   122,   123,   124,
+     125,   126,   127,   128,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   144,
+     145,   146,   147,    -1,    -1,   150,    -1,   152,   153,     1,
+      -1,     3,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    -1,    -1,    18,    19,    -1,    21,
+      22,    23,    24,    -1,    -1,    -1,    -1,    -1,    30,    31,
+      32,    33,    34,    35,    36,    -1,    -1,    39,    -1,    -1,
+      -1,    -1,    -1,    45,    -1,    47,    48,    49,    -1,    51,
+      52,    53,    54,    55,    56,    -1,    58,    59,    60,    -1,
+      -1,    63,    -1,    -1,    66,    67,    -1,    69,    70,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    89,    -1,    -1,
+      92,    93,    -1,    95,    96,    -1,    98,    -1,   100,   101,
+     102,   103,   104,   105,   106,    -1,    -1,   109,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   129,   130,   131,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     1,    -1,
+       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+     152,   153,    15,    -1,    17,    18,    19,    -1,    21,    22,
+      23,    24,    -1,    -1,    -1,    -1,    -1,    30,    31,    32,
+      33,    34,    35,    36,    -1,    -1,    39,    -1,    -1,    -1,
+      -1,    -1,    45,    -1,    47,    48,    49,    -1,    51,    52,
+      53,    54,    55,    56,    -1,    58,    59,    60,    -1,    -1,
+      63,    -1,    -1,    66,    67,    -1,    69,    70,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    89,    -1,    -1,    92,
+      93,    -1,    95,    96,    -1,    98,    -1,   100,   101,   102,
+     103,   104,   105,   106,    -1,    -1,   109,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   129,   130,   131,    -1,
+      -1,    -1,    -1,    -1,     1,    -1,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    -1,    -1,    15,   152,
+     153,    18,    19,    20,    21,    22,    23,    24,    -1,    -1,
+      -1,    -1,    -1,    30,    31,    32,    33,    34,    35,    36,
+      -1,    -1,    39,    -1,    -1,    -1,    -1,    -1,    45,    -1,
+      47,    48,    49,    -1,    51,    52,    53,    54,    55,    56,
+      -1,    58,    59,    60,    -1,    -1,    63,    -1,    -1,    66,
+      67,    -1,    69,    70,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    89,    -1,    -1,    92,    93,    -1,    95,    96,
+      -1,    98,    -1,   100,   101,   102,   103,   104,   105,   106,
+      -1,    -1,   109,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   129,   130,   131,    -1,    -1,    -1,    -1,    -1,
+       1,    -1,     3,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    -1,    -1,    15,   152,   153,    18,    19,    -1,
+      21,    22,    23,    24,    -1,    -1,    -1,    -1,    -1,    30,
+      31,    32,    33,    34,    35,    36,    -1,    -1,    39,    -1,
+      -1,    -1,    -1,    -1,    45,    -1,    47,    48,    49,    -1,
+      51,    52,    53,    54,    55,    56,    -1,    58,    59,    60,
+      -1,    -1,    63,    -1,    -1,    66,    67,    -1,    69,    70,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    89,    -1,
+      -1,    92,    93,    -1,    95,    96,    -1,    98,    -1,   100,
+     101,   102,   103,   104,   105,   106,    -1,    -1,   109,    -1,
+      -1,    -1,    -1,    -1,    -1,     1,    -1,     3,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    -1,   129,   130,
+     131,    -1,    -1,    19,    -1,    21,    22,    23,    24,    -1,
+      -1,    -1,    -1,    -1,    30,    31,    32,    33,    34,    35,
+      36,   152,   153,    39,    -1,    -1,    -1,    -1,    -1,    45,
+      46,    47,    48,    49,    -1,    51,    52,    53,    54,    55,
+      56,    -1,    58,    59,    60,    -1,    -1,    63,    -1,    -1,
+      66,    67,    -1,    69,    70,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    89,    -1,    -1,    92,    93,    -1,    95,
+      96,    -1,    98,    -1,   100,   101,   102,   103,   104,   105,
+     106,    -1,    -1,   109,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   129,   130,   131,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   144,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   152,   153,     1,    -1,
+       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      -1,    14,    15,    -1,    -1,    -1,    19,    -1,    21,    22,
+      23,    24,    -1,    -1,    -1,    -1,    -1,    30,    31,    32,
+      33,    34,    35,    36,    -1,    -1,    39,    -1,    -1,    -1,
+      -1,    -1,    45,    -1,    47,    48,    49,    -1,    51,    52,
+      53,    54,    55,    56,    -1,    58,    59,    60,    -1,    -1,
+      63,    -1,    -1,    66,    67,    -1,    69,    70,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    89,    -1,    -1,    92,
+      93,    -1,    95,    96,    -1,    98,    -1,   100,   101,   102,
+     103,   104,   105,   106,    -1,    -1,   109,    -1,    -1,    -1,
+      -1,    -1,    -1,     1,    -1,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    -1,   129,   130,   131,    -1,
+      -1,    19,    -1,    21,    22,    23,    24,    -1,    -1,    -1,
+      -1,    -1,    30,    31,    32,    33,    34,    35,    36,   152,
+     153,    39,    -1,    -1,    -1,    -1,    -1,    45,    -1,    47,
+      48,    49,    -1,    51,    52,    53,    54,    55,    56,    -1,
+      58,    59,    60,    -1,    -1,    63,    -1,    -1,    66,    67,
+      -1,    69,    70,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    89,    -1,    -1,    92,    93,    -1,    95,    96,    -1,
+      98,    -1,   100,   101,   102,   103,   104,   105,   106,    -1,
+      -1,   109,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   129,   130,   131,    -1,    -1,    -1,    -1,     1,    -1,
+       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      -1,    -1,   150,    -1,   152,   153,    19,    -1,    21,    22,
+      23,    24,    -1,    -1,    -1,    -1,    -1,    30,    31,    32,
+      33,    34,    35,    36,    -1,    -1,    39,    -1,    -1,    -1,
+      -1,    -1,    45,    -1,    47,    48,    49,    -1,    51,    52,
+      53,    54,    55,    56,    -1,    58,    59,    60,    -1,    -1,
+      63,    -1,    -1,    66,    67,    -1,    69,    70,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    89,    -1,    -1,    92,
+      93,    -1,    95,    96,    -1,    98,    -1,   100,   101,   102,
+     103,   104,   105,   106,    -1,    -1,   109,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   129,   130,   131,    -1,
+      -1,    -1,    -1,     1,    -1,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    -1,    -1,   150,    -1,   152,
+     153,    19,    -1,    21,    22,    23,    24,    -1,    -1,    -1,
+      -1,    -1,    30,    31,    32,    33,    34,    35,    36,    -1,
+      -1,    39,    -1,    -1,    -1,    -1,    -1,    45,    -1,    47,
+      48,    49,    -1,    51,    52,    53,    54,    55,    56,    -1,
+      58,    59,    60,    -1,    -1,    63,    -1,    -1,    66,    67,
+      -1,    69,    70,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    89,    -1,    -1,    92,    93,    -1,    95,    96,    -1,
+      98,    -1,   100,   101,   102,   103,   104,   105,   106,    -1,
+      -1,   109,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   129,   130,   131,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   144,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   152,   153,     1,    -1,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    -1,    -1,
+      15,    -1,    -1,    -1,    19,    -1,    21,    22,    23,    24,
+      -1,    -1,    -1,    -1,    -1,    30,    31,    32,    33,    34,
+      35,    36,    -1,    -1,    39,    -1,    -1,    -1,    -1,    -1,
+      45,    -1,    47,    48,    49,    -1,    51,    52,    53,    54,
+      55,    56,    -1,    58,    59,    60,    -1,    -1,    63,    -1,
+      -1,    66,    67,    -1,    69,    70,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    89,    -1,    -1,    92,    93,    -1,
+      95,    96,    -1,    98,    -1,   100,   101,   102,   103,   104,
+     105,   106,    -1,    -1,   109,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,     3,     4,     5,     6,     7,     8,     9,
+      10,    11,    -1,    -1,   129,   130,   131,    -1,    -1,    19,
+      -1,    21,    22,    23,    24,    -1,    -1,    -1,    -1,    -1,
+      30,    31,    32,    33,    34,    35,    36,   152,   153,    39,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    48,    49,
+      -1,    51,    52,    53,    54,    55,    56,    57,    58,    59,
+      60,    -1,    -1,    63,    -1,    -1,    66,    67,    -1,    69,
+      70,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    89,
+      -1,    -1,    92,    93,    -1,    95,    96,    -1,    98,    99,
+     100,   101,   102,   103,   104,   105,   106,    -1,    -1,   109,
+      -1,    -1,    -1,    -1,    -1,    -1,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    -1,    -1,    -1,    -1,   129,
+     130,   131,    19,    -1,    21,    22,    23,    24,    -1,    -1,
+      -1,    -1,    -1,    30,    31,    32,    33,    34,    35,    36,
+      -1,    -1,    39,   153,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    48,    49,    -1,    51,    52,    53,    54,    55,    56,
+      -1,    58,    59,    60,    -1,    -1,    63,    -1,    -1,    66,
+      67,    -1,    69,    70,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    89,    -1,    -1,    92,    93,    -1,    95,    96,
+      -1,    -1,    -1,   100,   101,   102,   103,   104,   105,   106,
+      -1,    -1,   109,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,     3,     4,     5,     6,     7,     8,     9,    10,    11,
+      -1,    -1,   129,   130,   131,    -1,    -1,    19,    -1,    21,
+      22,    23,    24,    -1,    -1,    -1,    -1,    -1,    30,    31,
+      32,    33,    34,    35,    36,   152,   153,    39,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    48,    49,    -1,    51,
+      52,    53,    54,    55,    56,    -1,    58,    59,    60,    -1,
+      -1,    63,    -1,    -1,    66,    67,    -1,    69,    70,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    89,    -1,    -1,
+      92,    93,    -1,    95,    96,    -1,    -1,    -1,   100,   101,
+     102,   103,   104,   105,   106,    -1,    -1,   109,    -1,    -1,
+      -1,    -1,    -1,    -1,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    -1,    -1,    -1,   129,   130,   131,
+      19,    -1,    21,    22,    23,    24,    -1,    -1,    -1,    -1,
+      -1,    30,    31,    32,    33,    34,    35,    36,    -1,    -1,
+      39,   153,    -1,    -1,    -1,    -1,    45,    46,    47,    48,
+      49,    -1,    51,    52,    53,    54,    55,    56,    -1,    58,
+      59,    60,    -1,    -1,    63,    -1,    -1,    66,    67,    -1,
+      69,    70,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      89,    -1,    -1,    92,    93,    -1,    95,    96,    -1,    98,
+      -1,   100,   101,   102,   103,   104,   105,   106,    -1,    -1,
+     109,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    -1,    -1,
+     129,   130,   131,    -1,    19,    -1,    21,    22,    23,    24,
+      -1,    -1,    -1,    -1,    -1,    30,    31,    32,    33,    34,
+      35,    36,    -1,   152,    39,    -1,    -1,    -1,    -1,    -1,
+      45,    -1,    47,    48,    49,    -1,    51,    52,    53,    54,
+      55,    56,    -1,    58,    59,    60,    -1,    -1,    63,    -1,
+      -1,    66,    67,    -1,    69,    70,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    89,    -1,    -1,    92,    93,    -1,
+      95,    96,    -1,    98,    -1,   100,   101,   102,   103,   104,
+     105,   106,    -1,    -1,   109,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   129,   130,   131,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   152,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    -1,    -1,    -1,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    -1,    -1,    -1,    -1,    -1,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,    56,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    69,    70,    71,    72,    73,    74,
+      75,    76,    77,    -1,    -1,    80,    81,    -1,    -1,    84,
+      85,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    98,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   119,   120,   121,   122,   123,   124,
+     125,   126,   127,   128,    -1,   130,   131,    -1,    -1,     3,
+       4,     5,     6,     7,     8,     9,    10,    11,    -1,    -1,
+      -1,    -1,    -1,   148,   149,    19,    -1,    21,    22,    23,
+      24,    -1,    26,    -1,    -1,    -1,    30,    31,    32,    33,
+      34,    35,    36,    -1,    -1,    39,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    48,    49,    -1,    51,    52,    53,
+      54,    55,    56,    57,    58,    59,    60,    -1,    -1,    63,
+      -1,    -1,    66,    67,    -1,    69,    70,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    89,    -1,    -1,    92,    93,
+      -1,    95,    96,    -1,    98,    99,   100,   101,   102,   103,
+     104,   105,   106,    -1,    -1,   109,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   129,   130,   131,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    -1,    -1,   143,
+      -1,    -1,    -1,    -1,    19,   149,    21,    22,    23,    24,
+      -1,    26,    -1,    -1,    -1,    30,    31,    32,    33,    34,
+      35,    36,    -1,    -1,    39,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    48,    49,    -1,    51,    52,    53,    54,
+      55,    56,    57,    58,    59,    60,    -1,    -1,    63,    -1,
+      -1,    66,    67,    -1,    69,    70,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    89,    -1,    -1,    92,    93,    -1,
+      95,    96,    -1,    98,    99,   100,   101,   102,   103,   104,
+     105,   106,    -1,    -1,   109,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   129,   130,   131,     3,     4,     5,
+       6,     7,     8,     9,    10,    11,    -1,    -1,   143,    -1,
+      -1,    -1,    -1,    19,   149,    21,    22,    23,    24,    -1,
+      -1,    -1,    -1,    -1,    30,    31,    32,    33,    34,    35,
+      36,    -1,    -1,    39,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    48,    49,    -1,    51,    52,    53,    54,    55,
+      56,    57,    58,    59,    60,    -1,    -1,    63,    -1,    -1,
+      66,    67,    -1,    69,    70,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    89,    90,    -1,    92,    93,    -1,    95,
+      96,    -1,    98,    99,   100,   101,   102,   103,   104,   105,
+     106,    -1,    -1,   109,    -1,    -1,    -1,    -1,    -1,    -1,
+     116,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   129,   130,   131,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    19,   149,    21,    22,    23,    24,    -1,    -1,
+      -1,    -1,    -1,    30,    31,    32,    33,    34,    35,    36,
+      -1,    -1,    39,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    48,    49,    -1,    51,    52,    53,    54,    55,    56,
+      57,    58,    59,    60,    -1,    -1,    63,    -1,    -1,    66,
+      67,    -1,    69,    70,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    89,    -1,    -1,    92,    93,    -1,    95,    96,
+      -1,    98,    99,   100,   101,   102,   103,   104,   105,   106,
+      -1,    -1,   109,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   129,   130,   131,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    19,   149,    21,    22,    23,    24,    -1,    -1,    -1,
+      -1,    -1,    30,    31,    32,    33,    34,    35,    36,    -1,
+      -1,    39,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      48,    49,    -1,    51,    52,    53,    54,    55,    56,    57,
+      58,    59,    60,    -1,    -1,    63,    -1,    -1,    66,    67,
+      -1,    69,    70,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    89,    -1,    -1,    92,    93,    -1,    95,    96,    -1,
+      98,    99,   100,   101,   102,   103,   104,   105,   106,    -1,
+      -1,   109,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   129,   130,   131,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   149,     3,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    -1,    -1,    -1,    30,
+      31,    32,    33,    34,    35,    36,    37,    38,    39,    -1,
+      -1,    -1,    -1,    -1,    45,    46,    47,    48,    49,    50,
+      51,    52,    53,    54,    55,    56,    -1,    -1,    -1,    -1,
+      -1,    -1,    63,    -1,    -1,    -1,    -1,    -1,    69,    70,
+      71,    72,    73,    74,    75,    76,    77,    -1,    -1,    80,
+      81,    -1,    -1,    84,    85,    86,    87,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    98,    -1,    -1,
+      -1,    -1,    -1,    -1,   105,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   119,   120,
+     121,   122,   123,   124,   125,   126,   127,   128,    -1,   130,
+     131,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   148,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    -1,    -1,    -1,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    -1,    -1,    -1,    -1,    -1,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      55,    56,    -1,    -1,    -1,    -1,    -1,    -1,    63,    -1,
+      -1,    -1,    -1,    -1,    69,    70,    71,    72,    73,    74,
+      75,    76,    77,    -1,    -1,    80,    81,    -1,    -1,    84,
+      85,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    98,    -1,    -1,    -1,    -1,    -1,    -1,
+     105,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   119,   120,   121,   122,   123,   124,
+     125,   126,   127,   128,    -1,   130,   131,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   148,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,    26,    -1,    -1,
+      -1,    30,    31,    32,    33,    34,    35,    36,    37,    38,
+      39,    -1,    -1,    -1,    -1,    -1,    45,    46,    47,    48,
+      49,    50,    51,    52,    -1,    -1,    55,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      69,    70,    71,    72,    73,    74,    75,    76,    77,    -1,
+      -1,    80,    81,    -1,    -1,    84,    85,    86,    87,    -1,
+      -1,    71,    72,    73,    74,    75,    76,    77,    -1,    98,
+      80,    81,   101,    -1,    -1,    -1,    86,    87,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
+      -1,   130,   131,    -1,    -1,    -1,    -1,    -1,    -1,   119,
+     120,   121,   122,   123,   124,   125,   126,   127,   128,   148,
+       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    -1,    -1,    -1,    30,    31,    32,
+      33,    34,    35,    36,    37,    38,    39,    -1,    -1,    -1,
+      -1,    -1,    45,    46,    47,    48,    49,    50,    51,    52,
+      -1,    -1,    55,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    69,    70,    71,    72,
+      73,    74,    75,    76,    77,    -1,    -1,    80,    81,    -1,
+      -1,    84,    85,    86,    87,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    98,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   119,   120,   121,   122,
+     123,   124,   125,   126,   127,   128,    -1,   130,   131,    -1,
+       3,     4,     5,     6,     7,     8,     9,    10,    11,    -1,
+      -1,    -1,    -1,    -1,    -1,   148,    19,    -1,    21,    22,
+      23,    24,    -1,    -1,    -1,    -1,    -1,    30,    31,    32,
+      33,    34,    35,    36,    -1,    -1,    39,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    48,    49,    -1,    51,    52,
+      53,    54,    55,    56,    -1,    58,    59,    60,    -1,    -1,
+      63,    -1,    -1,    66,    67,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    89,    -1,    -1,    92,
+      93,    -1,    95,    96,    -1,    -1,    -1,   100,   101,   102,
+     103,   104,   105,   106,    -1,    -1,   109,    -1,    -1,     3,
+       4,     5,     6,     7,     8,     9,    10,    11,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    19,   129,    21,    22,    23,
+      24,    -1,    -1,    -1,    -1,    -1,    30,    31,    32,    33,
+      34,    35,    36,    -1,   147,    39,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    48,    49,    -1,    51,    52,    53,
+      54,    55,    56,    -1,    58,    59,    60,    -1,    -1,    63,
+      -1,    -1,    66,    67,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    89,    -1,    -1,    92,    93,
+      -1,    95,    96,    -1,    -1,    -1,   100,   101,   102,   103,
+     104,   105,   106,    -1,    -1,   109,    -1,    -1,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    19,   129,    21,    22,    23,    24,
+      -1,    -1,    -1,    -1,    -1,    30,    31,    32,    33,    34,
+      35,    36,    -1,   147,    39,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    48,    49,    -1,    51,    52,    53,    54,
+      55,    56,    57,    58,    59,    60,    -1,    -1,    63,    -1,
+      -1,    66,    67,    -1,    69,    70,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    89,    -1,    -1,    92,    93,    -1,
+      95,    96,    -1,    98,    99,   100,   101,   102,   103,   104,
+     105,   106,    -1,    -1,   109,   110,    -1,    -1,   113,   114,
+      -1,     3,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,    -1,    -1,    -1,   129,   130,   131,    19,    -1,    21,
+      22,    23,    24,    -1,    -1,    -1,    -1,    -1,    30,    31,
+      32,    33,    34,    35,    36,    -1,    -1,    39,    -1,    -1,
+      -1,    -1,    -1,    45,    46,    47,    48,    49,    -1,    51,
+      52,    53,    54,    55,    56,    -1,    58,    59,    60,    -1,
+      -1,    63,    -1,    -1,    66,    67,    -1,    69,    70,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    89,    -1,    -1,
+      92,    93,    -1,    95,    96,    -1,    98,    -1,   100,   101,
+     102,   103,   104,   105,   106,    -1,    -1,   109,    -1,    -1,
+      -1,    -1,    -1,    -1,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    -1,    -1,    -1,    -1,   129,   130,   131,
+      19,    -1,    21,    22,    23,    24,    -1,    -1,    -1,    -1,
+      -1,    30,    31,    32,    33,    34,    35,    36,    -1,    -1,
+      39,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    48,
+      49,    -1,    51,    52,    53,    54,    55,    56,    57,    58,
+      59,    60,    -1,    -1,    63,    -1,    -1,    66,    67,    -1,
+      69,    70,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      89,    -1,    -1,    92,    93,    -1,    95,    96,    -1,    98,
+      -1,   100,   101,   102,   103,   104,   105,   106,    -1,    -1,
+     109,   110,    -1,    -1,   113,   114,    -1,     3,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    -1,    -1,    -1,
+     129,   130,   131,    19,    -1,    21,    22,    23,    24,    -1,
+      -1,    -1,    -1,    -1,    30,    31,    32,    33,    34,    35,
+      36,    -1,    -1,    39,    -1,    -1,    -1,    -1,    -1,    45,
+      -1,    47,    48,    49,    -1,    51,    52,    53,    54,    55,
+      56,    -1,    58,    59,    60,    -1,    -1,    63,    -1,    -1,
+      66,    67,    -1,    69,    70,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    89,    -1,    -1,    92,    93,    -1,    95,
+      96,    -1,    98,    -1,   100,   101,   102,   103,   104,   105,
+     106,    -1,    -1,   109,    -1,    -1,    -1,    -1,    -1,    -1,
+       3,     4,     5,     6,     7,     8,     9,    10,    11,    -1,
+      -1,    -1,    -1,   129,   130,   131,    19,    -1,    21,    22,
+      23,    24,    -1,    -1,    -1,    -1,    -1,    30,    31,    32,
+      33,    34,    35,    36,    -1,    -1,    39,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    48,    49,    -1,    51,    52,
+      53,    54,    55,    56,    -1,    58,    59,    60,    -1,    -1,
+      63,    -1,    -1,    66,    67,    -1,    69,    70,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    89,    -1,    -1,    92,
+      93,    -1,    95,    96,    -1,    98,    -1,   100,   101,   102,
+     103,   104,   105,   106,    -1,    -1,   109,   110,    -1,    -1,
+     113,   114,    -1,     3,     4,     5,     6,     7,     8,     9,
+      10,    11,    -1,    -1,    -1,    -1,   129,   130,   131,    19,
+      -1,    21,    22,    23,    24,    -1,    -1,    -1,    -1,    -1,
+      30,    31,    32,    33,    34,    35,    36,    -1,    -1,    39,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    48,    49,
+      -1,    51,    52,    53,    54,    55,    56,    -1,    58,    59,
+      60,    -1,    -1,    63,    -1,    -1,    66,    67,    -1,    69,
+      70,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    89,
+      -1,    -1,    92,    93,    -1,    95,    96,    -1,    98,    -1,
+     100,   101,   102,   103,   104,   105,   106,    -1,    -1,   109,
+     110,    -1,    -1,   113,   114,    -1,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    -1,    -1,    -1,    -1,   129,
+     130,   131,    19,    -1,    21,    22,    23,    24,    -1,    -1,
+      -1,    -1,    -1,    30,    31,    32,    33,    34,    35,    36,
+      -1,    -1,    39,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    48,    49,    -1,    51,    52,    53,    54,    55,    56,
+      -1,    58,    59,    60,    -1,    -1,    63,    -1,    -1,    66,
+      67,    -1,    69,    70,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    89,    -1,    -1,    92,    93,    -1,    95,    96,
+      -1,    98,    -1,   100,   101,   102,   103,   104,   105,   106,
+      -1,    -1,   109,   110,    -1,    -1,   113,   114,    -1,     3,
+       4,     5,     6,     7,     8,     9,    10,    11,    -1,    -1,
+      -1,    -1,   129,   130,   131,    19,    -1,    21,    22,    23,
+      24,    -1,    -1,    -1,    -1,    -1,    30,    31,    32,    33,
+      34,    35,    36,    -1,    -1,    39,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    48,    49,    -1,    51,    52,    53,
+      54,    55,    56,    57,    58,    59,    60,    -1,    -1,    63,
+      -1,    -1,    66,    67,    -1,    69,    70,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    89,    -1,    -1,    92,    93,
+      -1,    95,    96,    -1,    98,    99,   100,   101,   102,   103,
+     104,   105,   106,    -1,    -1,   109,    -1,    -1,    -1,    -1,
+      -1,    -1,     3,     4,     5,     6,     7,     8,     9,    10,
+      11,    -1,    -1,    -1,    -1,   129,   130,   131,    19,    -1,
+      21,    22,    23,    24,    -1,    -1,    -1,    -1,    -1,    30,
+      31,    32,    33,    34,    35,    36,    -1,    -1,    39,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    48,    49,    -1,
+      51,    52,    53,    54,    55,    56,    57,    58,    59,    60,
+      -1,    -1,    63,    -1,    -1,    66,    67,    -1,    69,    70,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    89,    -1,
+      -1,    92,    93,    -1,    95,    96,    -1,    98,    -1,   100,
+     101,   102,   103,   104,   105,   106,    -1,    -1,   109,    -1,
+      -1,    -1,    -1,    -1,    -1,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    -1,    -1,    -1,    -1,   129,   130,
+     131,    19,    -1,    21,    22,    23,    24,    -1,    -1,    -1,
+      -1,    -1,    30,    31,    32,    33,    34,    35,    36,    -1,
+      -1,    39,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      48,    49,    -1,    51,    52,    53,    54,    55,    56,    57,
+      58,    59,    60,    -1,    -1,    63,    -1,    -1,    66,    67,
+      -1,    69,    70,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    89,    -1,    -1,    92,    93,    -1,    95,    96,    -1,
+      -1,    99,   100,   101,   102,   103,   104,   105,   106,    -1,
+      -1,   109,    -1,    -1,    -1,    -1,    -1,    -1,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    -1,    -1,    -1,
+      -1,   129,   130,   131,    19,    -1,    21,    22,    23,    24,
+      -1,    -1,    -1,    -1,    -1,    30,    31,    32,    33,    34,
+      35,    36,    -1,    -1,    39,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    48,    49,    -1,    51,    52,    53,    54,
+      55,    56,    57,    58,    59,    60,    -1,    -1,    63,    -1,
+      -1,    66,    67,    -1,    69,    70,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    89,    -1,    -1,    92,    93,    -1,
+      95,    96,    -1,    -1,    -1,   100,   101,   102,   103,   104,
+     105,   106,    -1,    -1,   109,    -1,    -1,    -1,    -1,    -1,
+      -1,     3,     4,     5,     6,     7,     8,     9,    10,    11,
+      -1,    -1,    -1,    -1,   129,   130,   131,    19,    -1,    21,
+      22,    23,    24,    -1,    -1,    -1,    -1,    -1,    30,    31,
+      32,    33,    34,    35,    36,    -1,    -1,    39,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    48,    49,    -1,    51,
+      52,    53,    54,    55,    56,    -1,    58,    59,    60,    -1,
+      -1,    63,    -1,    -1,    66,    67,    -1,    69,    70,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    89,    -1,    -1,
+      92,    93,    -1,    95,    96,    -1,    98,    -1,   100,   101,
+     102,   103,   104,   105,   106,    -1,    -1,   109,    -1,    -1,
+      -1,    -1,    -1,    -1,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    -1,    -1,    -1,    -1,   129,   130,   131,
+      19,    -1,    21,    22,    23,    24,    -1,    -1,    -1,    -1,
+      -1,    30,    31,    32,    33,    34,    35,    36,    -1,    -1,
+      39,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    48,
+      49,    -1,    51,    52,    53,    54,    55,    56,    -1,    58,
+      59,    60,    -1,    -1,    63,    -1,    -1,    66,    67,    -1,
+      69,    70,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      89,    -1,    -1,    92,    93,    -1,    95,    96,    -1,    98,
+      -1,   100,   101,   102,   103,   104,   105,   106,    -1,    -1,
+     109,    -1,    -1,    -1,    -1,    -1,    -1,     3,     4,     5,
+       6,     7,     8,     9,    10,    11,    -1,    -1,    -1,    -1,
+     129,   130,   131,    19,    -1,    21,    22,    23,    24,    -1,
+      -1,    -1,    -1,    -1,    30,    31,    32,    33,    34,    35,
+      36,    -1,    -1,    39,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    48,    49,    -1,    51,    52,    53,    54,    55,
+      56,    -1,    58,    59,    60,    -1,    -1,    63,    -1,    -1,
+      66,    67,    -1,    69,    70,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    89,    -1,    -1,    92,    93,    -1,    95,
+      96,    -1,    98,    -1,   100,   101,   102,   103,   104,   105,
+     106,    -1,    -1,   109,    -1,    -1,    -1,    -1,    -1,    -1,
+       3,     4,     5,     6,     7,     8,     9,    10,    11,    -1,
+      -1,    -1,    -1,   129,   130,   131,    19,    -1,    21,    22,
+      23,    24,    -1,    -1,    -1,    -1,    -1,    30,    31,    32,
+      33,    34,    35,    36,    -1,    -1,    39,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    48,    49,    -1,    51,    52,
+      53,    54,    55,    56,    -1,    58,    59,    60,    -1,    -1,
+      63,    -1,    -1,    66,    67,    -1,    69,    70,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    89,    -1,    -1,    92,
+      93,    -1,    95,    96,    -1,    -1,    -1,   100,   101,   102,
+     103,   104,   105,   106,    -1,    -1,   109,    -1,    -1,    -1,
+      -1,    -1,    -1,     3,     4,     5,     6,     7,     8,     9,
+      10,    11,    -1,    -1,    -1,    -1,   129,   130,   131,    19,
+      -1,    21,    22,    23,    24,    -1,    -1,    -1,    -1,    -1,
+      30,    31,    32,    33,    34,    35,    36,    -1,    -1,    39,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    48,    49,
+      -1,    51,    52,    53,    54,    55,    56,    -1,    58,    59,
+      60,    -1,    -1,    63,    -1,    -1,    66,    67,    -1,    69,
+      70,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    89,
+      -1,    -1,    92,    93,    -1,    95,    96,    -1,    -1,    -1,
+     100,   101,   102,   103,   104,   105,   106,    -1,    -1,   109,
+      -1,    -1,    -1,    -1,    -1,    -1,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    -1,    -1,    -1,    -1,   129,
+     130,   131,    19,    -1,    21,    22,    23,    24,    -1,    -1,
+      -1,    -1,    -1,    30,    31,    32,    33,    34,    35,    36,
+      -1,    -1,    39,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    48,    49,    -1,    51,    52,    53,    54,    55,    56,
+      -1,    58,    59,    60,    -1,    -1,    63,    -1,    -1,    66,
+      67,    -1,    69,    70,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    89,    -1,    -1,    92,    93,    -1,    95,    96,
+      -1,    -1,    -1,   100,   101,   102,   103,   104,   105,   106,
+      -1,    -1,   109,    -1,    -1,    -1,    -1,    -1,    -1,     3,
+       4,     5,     6,     7,     8,     9,    10,    11,    -1,    -1,
+      -1,    -1,   129,   130,   131,    19,    -1,    21,    22,    23,
+      24,    -1,    -1,    -1,    -1,    -1,    30,    31,    32,    33,
+      34,    35,    36,    -1,    -1,    39,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    48,    49,    -1,    51,    52,    53,
+      54,    55,    56,    -1,    58,    59,    60,    -1,    -1,    63,
+      -1,    -1,    66,    67,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    86,    -1,    -1,    89,    -1,    -1,    92,    93,
+      -1,    95,    96,    -1,    -1,    -1,   100,   101,   102,   103,
+     104,   105,   106,    -1,    -1,   109,    -1,    -1,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    19,   129,    21,    22,    23,    24,
+      -1,    -1,    -1,    -1,    -1,    30,    31,    32,    33,    34,
+      35,    36,    -1,    -1,    39,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    48,    49,    -1,    51,    52,    53,    54,
+      55,    56,    -1,    58,    59,    60,    -1,    -1,    63,    -1,
+      -1,    66,    67,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    89,    -1,    -1,    92,    93,    -1,
+      95,    96,    -1,    98,    -1,   100,   101,   102,   103,   104,
+     105,   106,    -1,    -1,   109,    -1,    -1,     3,     4,     5,
+       6,     7,     8,     9,    10,    11,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    19,   129,    21,    22,    23,    24,    -1,
+      -1,    -1,    -1,    -1,    30,    31,    32,    33,    34,    35,
+      36,    -1,    -1,    39,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    48,    49,    -1,    51,    52,    53,    54,    55,
+      56,    -1,    58,    59,    60,    -1,    -1,    63,    -1,    -1,
+      66,    67,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    89,    -1,    -1,    92,    93,    -1,    95,
+      96,    -1,    98,    -1,   100,   101,   102,   103,   104,   105,
+     106,    -1,    -1,   109,    -1,    -1,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    19,   129,    21,    22,    23,    24,    -1,    -1,
+      -1,    -1,    -1,    30,    31,    32,    33,    34,    35,    36,
+      -1,    -1,    39,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    48,    49,    -1,    51,    52,    53,    54,    55,    56,
+      -1,    58,    59,    60,    -1,    -1,    63,    -1,    -1,    66,
+      67,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    89,    -1,    -1,    92,    93,    -1,    95,    96,
+      -1,    -1,    -1,   100,   101,   102,   103,   104,   105,   106,
+      -1,    -1,   109,    -1,    -1,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    19,   129,    21,    22,    23,    24,    -1,    -1,    -1,
+      -1,    -1,    30,    31,    32,    33,    34,    35,    36,    -1,
+      -1,    39,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      48,    49,    -1,    51,    52,    53,    54,    55,    56,    -1,
+      58,    59,    60,    -1,    -1,    63,    -1,    -1,    66,    67,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    89,    -1,    -1,    92,    93,    -1,    95,    96,    -1,
+      -1,    -1,   100,   101,   102,   103,   104,   105,   106,    -1,
+      -1,   109,    -1,    -1,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      19,   129,    21,    22,    23,    24,    -1,    -1,    -1,    -1,
+      -1,    30,    31,    32,    33,    34,    35,    36,    -1,    -1,
+      39,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    48,
+      49,    -1,    51,    52,    53,    54,    55,    56,    -1,    58,
+      59,    60,    -1,    -1,    63,    -1,    -1,    66,    67,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      89,    -1,    -1,    92,    93,    -1,    95,    96,    -1,    -1,
+      -1,   100,   101,   102,   103,   104,   105,   106,    -1,    -1,
+     109,    -1,    -1,     3,     4,     5,     6,     7,     8,     9,
+      10,    11,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    19,
+     129,    21,    22,    23,    24,    -1,    -1,    -1,    -1,    -1,
+      30,    31,    32,    33,    34,    35,    36,    -1,    -1,    39,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    48,    49,
+      -1,    51,    52,    53,    54,    55,    56,    -1,    58,    59,
+      60,    -1,    -1,    63,    -1,    -1,    66,    67,    -1,    71,
+      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
+      82,    83,    -1,    -1,    86,    87,    -1,    -1,    -1,    89,
+      -1,    -1,    92,    93,    -1,    95,    96,    -1,    -1,    -1,
+     100,   101,   102,   103,   104,   105,   106,    -1,    -1,   109,
+      -1,    -1,    51,    52,    -1,    -1,    55,   119,   120,   121,
+     122,   123,   124,   125,   126,   127,   128,    -1,    -1,   129,
+      69,    70,    71,    72,    73,    74,    75,    76,    77,    -1,
+      -1,    80,    81,    -1,    -1,    84,    85,    86,    87,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    98,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
+      -1,   130,   131,    51,    52,    -1,    -1,    55,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   148,
+     149,    69,    70,    71,    72,    73,    74,    75,    76,    77,
+      -1,    -1,    80,    81,    -1,    -1,    84,    85,    86,    87,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      98,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   119,   120,   121,   122,   123,   124,   125,   126,   127,
+     128,    -1,   130,   131,    51,    52,    -1,    -1,    55,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     148,   149,    69,    70,    71,    72,    73,    74,    75,    76,
+      77,    -1,    -1,    80,    81,    -1,    -1,    84,    85,    86,
+      87,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    98,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   119,   120,   121,   122,   123,   124,   125,   126,
+     127,   128,    -1,   130,   131,    51,    52,    -1,    -1,    55,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   148,   149,    69,    70,    71,    72,    73,    74,    75,
+      76,    77,    -1,    -1,    80,    81,    -1,    -1,    84,    85,
+      86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    98,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   119,   120,   121,   122,   123,   124,   125,
+     126,   127,   128,    -1,   130,   131,    51,    52,    -1,    -1,
+      55,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   148,   149,    69,    70,    71,    72,    73,    74,
+      75,    76,    77,    -1,    -1,    80,    81,    -1,    -1,    84,
+      85,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    98,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   119,   120,   121,   122,   123,   124,
+     125,   126,   127,   128,    -1,   130,   131,    51,    52,    -1,
+      -1,    55,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   148,   149,    69,    70,    71,    72,    73,
+      74,    75,    76,    77,    -1,    -1,    80,    81,    -1,    -1,
+      84,    85,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    98,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   119,   120,   121,   122,   123,
+     124,   125,   126,   127,   128,    -1,   130,   131,    51,    52,
+      -1,    -1,    55,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   148,   149,    69,    70,    71,    72,
+      73,    74,    75,    76,    77,    -1,    -1,    80,    81,    -1,
+      -1,    84,    85,    86,    87,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    98,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   119,   120,   121,   122,
+     123,   124,   125,   126,   127,   128,    -1,   130,   131,    51,
+      52,    -1,    -1,    55,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   148,   149,    69,    70,    71,
+      72,    73,    74,    75,    76,    77,    -1,    -1,    80,    81,
+      -1,    -1,    84,    85,    86,    87,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    98,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   119,   120,   121,
+     122,   123,   124,   125,   126,   127,   128,    -1,   130,   131,
+      51,    52,    -1,    -1,    55,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   148,   149,    69,    70,
+      71,    72,    73,    74,    75,    76,    77,    -1,    -1,    80,
+      81,    -1,    -1,    84,    85,    86,    87,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    98,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   119,   120,
+     121,   122,   123,   124,   125,   126,   127,   128,    -1,   130,
+     131,    51,    52,    -1,    -1,    55,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   148,   149,    69,
+      70,    71,    72,    73,    74,    75,    76,    77,    -1,    -1,
+      80,    81,    -1,    -1,    84,    85,    86,    87,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    98,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   119,
+     120,   121,   122,   123,   124,   125,   126,   127,   128,    -1,
+     130,   131,    51,    52,    -1,    -1,    55,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   148,   149,
+      69,    70,    71,    72,    73,    74,    75,    76,    77,    -1,
+      -1,    80,    81,    -1,    -1,    84,    85,    86,    87,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    98,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
+      -1,   130,   131,    51,    52,    -1,    -1,    55,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   148,
+     149,    69,    70,    71,    72,    73,    74,    75,    76,    77,
+      -1,    -1,    80,    81,    -1,    -1,    84,    85,    86,    87,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      98,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   119,   120,   121,   122,   123,   124,   125,   126,   127,
+     128,    -1,   130,   131,    51,    52,    -1,    -1,    55,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     148,   149,    69,    70,    71,    72,    73,    74,    75,    76,
+      77,    -1,    -1,    80,    81,    -1,    -1,    84,    85,    86,
+      87,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    98,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   119,   120,   121,   122,   123,   124,   125,   126,
+     127,   128,    -1,   130,   131,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   148
+};
+
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+   symbol of state STATE-NUM.  */
+static const yytype_uint16 yystos[] =
+{
+       0,   155,   156,     0,     1,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    19,    21,    22,    23,    24,
+      30,    31,    32,    33,    34,    35,    36,    39,    45,    46,
+      47,    48,    49,    51,    52,    53,    54,    55,    56,    58,
+      59,    60,    63,    66,    67,    69,    70,    89,    92,    93,
+      95,    96,    98,   100,   101,   102,   103,   104,   105,   106,
+     109,   129,   130,   131,   157,   158,   159,   164,   166,   167,
+     169,   170,   173,   174,   176,   177,   178,   180,   181,   190,
+     203,   223,   242,   243,   253,   254,   258,   259,   260,   267,
+     268,   269,   271,   272,   273,   274,   275,   276,   300,   313,
+     159,    21,    22,    30,    31,    32,    39,    51,    55,    86,
+      89,    92,   129,   182,   183,   203,   223,   273,   276,   300,
+     183,     3,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    45,    46,    47,    48,    49,
+      50,    51,    52,    55,    69,    70,    71,    72,    73,    74,
+      75,    76,    77,    80,    81,    84,    85,    86,    87,    98,
+     119,   120,   121,   122,   123,   124,   125,   126,   127,   128,
+     130,   131,   148,   149,   184,   188,   189,   275,   295,   204,
+      89,   167,   168,   181,   223,   273,   274,   276,   168,   209,
+     211,    89,   174,   181,   223,   228,   273,   276,    33,    34,
+      35,    36,    48,    49,    51,    55,   101,   184,   185,   186,
+     269,   152,   153,   168,   304,   309,   310,   312,    57,    98,
+      99,   130,   173,   190,   191,   196,   199,   201,   298,   299,
+     196,   196,   149,   197,   198,   149,   193,   197,   149,   305,
+     310,   185,   160,   143,   190,   223,   190,    55,     1,    92,
+     162,   163,   164,   175,   176,   313,   205,   207,   192,   201,
+     298,   313,   191,   297,   298,   313,    89,   147,   180,   223,
+     273,   276,   208,    53,    54,    56,    63,   105,   184,   270,
+      62,    64,    65,   111,   112,   255,   256,    63,   255,    63,
+     255,    63,   255,    61,   255,    58,    59,   169,   190,   190,
+     304,   312,    40,    41,    42,    43,    44,    37,    38,    28,
+     240,   116,   147,    92,    98,   177,   116,    71,    72,    73,
+      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
+      86,    87,   117,   119,   120,   121,   122,   123,   124,   125,
+     126,   127,   128,    88,   145,   146,    88,   146,   303,    26,
+     143,   244,    90,    90,   193,   197,   244,   167,    51,    55,
+     182,    58,    59,     1,   120,   277,   309,    88,   145,   146,
+     218,   296,   219,   303,   161,   162,    55,    16,   224,   309,
+     116,    88,   145,   146,    90,    90,   224,   168,   168,    55,
+      88,   145,   146,    25,   105,   147,   311,   304,    20,   247,
+     152,   191,   191,   191,    91,   147,   200,   313,   147,   200,
+     196,   305,   306,   196,   195,   196,   201,   298,   313,   167,
+     306,   167,   165,   143,   162,    88,   146,    90,   164,   175,
+     150,   304,   312,   306,   167,   306,   151,   147,   308,   310,
+     147,   308,   144,   308,    55,   177,   178,   179,   147,    88,
+     145,   146,    51,    53,    54,    55,    56,    92,    98,    99,
+     123,   126,   149,   238,   280,   281,   282,   283,   284,   285,
+     286,   289,   290,   291,   292,   293,    63,   256,   257,   110,
+     113,   114,   262,   263,   264,   265,    62,   256,    63,    63,
+      63,    61,    71,    71,   159,   168,   168,   168,   168,   164,
+     167,   167,   241,    98,   169,   191,   201,   202,   175,   147,
+     180,   147,   166,   169,   181,   190,   191,   202,   190,   190,
+     190,   190,   190,   190,   190,   190,   190,   190,   190,   190,
+     190,   190,   190,   190,   190,   190,   190,   190,   190,   190,
+     190,   190,   190,   190,    51,    52,    55,   188,   193,   301,
+     302,   195,    51,    52,    55,   188,   193,   301,    51,    55,
+     301,   246,   245,   169,   190,   169,   190,    97,   171,   216,
+     309,   278,   215,    51,    55,   182,   301,   195,   301,   161,
+     167,   220,   221,    15,    13,   249,   313,   162,    16,   190,
+      51,    55,   195,    51,    55,   162,    27,   225,   309,   225,
+      51,    55,   195,    51,    55,   213,   187,   261,   262,   247,
+     201,    15,   191,    98,   191,   199,   262,   298,   299,   306,
+     150,   306,   147,   147,   306,   185,   157,   144,   190,   306,
+     164,   206,   298,   177,   179,    51,    55,   195,    51,    55,
+     116,    51,    92,    98,   229,   230,   231,   282,   280,    29,
+     108,   239,   147,   294,   313,   191,   147,   294,    51,   147,
+     294,    51,    63,   162,   266,   263,   110,   265,   190,   190,
+      79,   121,   233,   234,   313,   191,   147,   306,   179,   147,
+     116,    44,   305,    90,    90,   193,   197,   305,   307,    90,
+      90,   193,   194,   197,   313,   194,   197,   233,   233,    44,
+     172,   309,   168,   161,   307,    15,   306,   149,   279,   280,
+     184,   191,   202,   250,   313,    18,   227,   313,    17,   226,
+     227,    90,    90,   307,    90,    90,   227,   210,   212,   307,
+     168,   185,    15,   147,   224,   191,    98,   191,   200,   298,
+     144,   306,   308,   307,   231,   147,   282,   147,   306,   235,
+     305,   162,   162,   283,   289,   291,   293,   284,   286,   291,
+     284,   144,   162,   232,   235,   284,   285,   287,   288,   291,
+     293,   162,    98,   191,   179,   190,   118,   169,   190,   169,
+     190,   171,   151,    90,   169,   190,   169,   190,   171,   244,
+     240,   162,   162,   190,   233,   217,   309,    15,   280,   161,
+     309,   222,    91,   251,   313,   162,    14,   252,   313,   168,
+      15,    90,    15,   162,   162,   225,   191,   162,   191,   147,
+     306,   230,   147,    98,   229,   150,   152,    15,   144,   147,
+     294,   147,   294,   147,   294,   147,   294,   294,   144,   235,
+     121,   147,   294,    89,   223,   147,   294,   147,   294,    15,
+     191,   190,   169,   190,    15,   144,   162,   161,   306,    15,
+     279,    89,   181,   223,   273,   276,   224,   162,   224,    15,
+      15,   214,   227,   247,   248,   147,   230,   147,   282,    51,
+     236,   237,   281,   284,   291,   284,   284,   121,   288,   291,
+      55,    88,   284,   287,   291,   284,   144,    15,   161,    55,
+      88,   145,   146,   162,   162,   162,   230,   147,   147,   305,
+     294,   147,   294,   294,   294,   147,   294,   147,   294,    51,
+      55,   294,   147,   294,   294,    15,    51,    55,   195,    51,
+      55,   249,   226,    15,   230,   237,   284,   284,   291,   284,
+     284,   307,   294,   294,   147,   294,   294,   294,   284,   294
+};
+
+#define yyerrok		(yyerrstatus = 0)
+#define yyclearin	(yychar = YYEMPTY)
+#define YYEMPTY		(-2)
+#define YYEOF		0
+
+#define YYACCEPT	goto yyacceptlab
+#define YYABORT		goto yyabortlab
+#define YYERROR		goto yyerrorlab
+
+
+/* Like YYERROR except do call yyerror.  This remains here temporarily
+   to ease the transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  However,
+   YYFAIL appears to be in use.  Nevertheless, it is formally deprecated
+   in Bison 2.4.2's NEWS entry, where a plan to phase it out is
+   discussed.  */
+
+#define YYFAIL		goto yyerrlab
+#if defined YYFAIL
+  /* This is here to suppress warnings from the GCC cpp's
+     -Wunused-macros.  Normally we don't worry about that warning, but
+     some users do, and we want to make it easy for users to remove
+     YYFAIL uses, which will produce warnings from Bison 2.5.  */
+#endif
+
+#define YYRECOVERING()  (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value)					\
+do								\
+  if (yychar == YYEMPTY && yylen == 1)				\
+    {								\
+      yychar = (Token);						\
+      yylval = (Value);						\
+      yytoken = YYTRANSLATE (yychar);				\
+      YYPOPSTACK (1);						\
+      goto yybackup;						\
+    }								\
+  else								\
+    {								\
+      yyerror (p, YY_("syntax error: cannot back up")); \
+      YYERROR;							\
+    }								\
+while (YYID (0))
+
+
+#define YYTERROR	1
+#define YYERRCODE	256
+
+
+/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
+   If N is 0, then set CURRENT to the empty location which ends
+   the previous symbol: RHS[0] (always defined).  */
+
+#define YYRHSLOC(Rhs, K) ((Rhs)[K])
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N)				\
+    do									\
+      if (YYID (N))                                                    \
+	{								\
+	  (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;	\
+	  (Current).first_column = YYRHSLOC (Rhs, 1).first_column;	\
+	  (Current).last_line    = YYRHSLOC (Rhs, N).last_line;		\
+	  (Current).last_column  = YYRHSLOC (Rhs, N).last_column;	\
+	}								\
+      else								\
+	{								\
+	  (Current).first_line   = (Current).last_line   =		\
+	    YYRHSLOC (Rhs, 0).last_line;				\
+	  (Current).first_column = (Current).last_column =		\
+	    YYRHSLOC (Rhs, 0).last_column;				\
+	}								\
+    while (YYID (0))
+#endif
+
+
+/* YY_LOCATION_PRINT -- Print the location on the stream.
+   This macro was not mandated originally: define only if we know
+   we won't break user code: when these are the locations we know.  */
+
+#ifndef YY_LOCATION_PRINT
+# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
+#  define YY_LOCATION_PRINT(File, Loc)			\
+     fprintf (File, "%d.%d-%d.%d",			\
+	      (Loc).first_line, (Loc).first_column,	\
+	      (Loc).last_line,  (Loc).last_column)
+# else
+#  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+# endif
+#endif
+
+
+/* YYLEX -- calling `yylex' with the right arguments.  */
+
+#ifdef YYLEX_PARAM
+# define YYLEX yylex (&yylval, YYLEX_PARAM)
+#else
+# define YYLEX yylex (&yylval, p)
+#endif
+
+/* Enable debugging if requested.  */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args)			\
+do {						\
+  if (yydebug)					\
+    YYFPRINTF Args;				\
+} while (YYID (0))
+
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)			  \
+do {									  \
+  if (yydebug)								  \
+    {									  \
+      YYFPRINTF (stderr, "%s ", Title);					  \
+      yy_symbol_print (stderr,						  \
+		  Type, Value, p); \
+      YYFPRINTF (stderr, "\n");						  \
+    }									  \
+} while (YYID (0))
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, parser_state *p)
+#else
+static void
+yy_symbol_value_print (yyoutput, yytype, yyvaluep, p)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE const * const yyvaluep;
+    parser_state *p;
+#endif
+{
+  if (!yyvaluep)
+    return;
+  YYUSE (p);
+# ifdef YYPRINT
+  if (yytype < YYNTOKENS)
+    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# else
+  YYUSE (yyoutput);
+# endif
+  switch (yytype)
+    {
+      default:
+	break;
+    }
+}
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, parser_state *p)
+#else
+static void
+yy_symbol_print (yyoutput, yytype, yyvaluep, p)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE const * const yyvaluep;
+    parser_state *p;
+#endif
+{
+  if (yytype < YYNTOKENS)
+    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+  else
+    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+  yy_symbol_value_print (yyoutput, yytype, yyvaluep, p);
+  YYFPRINTF (yyoutput, ")");
+}
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included).                                                   |
+`------------------------------------------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
+#else
+static void
+yy_stack_print (yybottom, yytop)
+    yytype_int16 *yybottom;
+    yytype_int16 *yytop;
+#endif
+{
+  YYFPRINTF (stderr, "Stack now");
+  for (; yybottom <= yytop; yybottom++)
+    {
+      int yybot = *yybottom;
+      YYFPRINTF (stderr, " %d", yybot);
+    }
+  YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top)				\
+do {								\
+  if (yydebug)							\
+    yy_stack_print ((Bottom), (Top));				\
+} while (YYID (0))
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced.  |
+`------------------------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_reduce_print (YYSTYPE *yyvsp, int yyrule, parser_state *p)
+#else
+static void
+yy_reduce_print (yyvsp, yyrule, p)
+    YYSTYPE *yyvsp;
+    int yyrule;
+    parser_state *p;
+#endif
+{
+  int yynrhs = yyr2[yyrule];
+  int yyi;
+  unsigned long int yylno = yyrline[yyrule];
+  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
+	     yyrule - 1, yylno);
+  /* The symbols being reduced.  */
+  for (yyi = 0; yyi < yynrhs; yyi++)
+    {
+      YYFPRINTF (stderr, "   $%d = ", yyi + 1);
+      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
+		       &(yyvsp[(yyi + 1) - (yynrhs)])
+		       		       , p);
+      YYFPRINTF (stderr, "\n");
+    }
+}
+
+# define YY_REDUCE_PRINT(Rule)		\
+do {					\
+  if (yydebug)				\
+    yy_reduce_print (yyvsp, Rule, p); \
+} while (YYID (0))
+
+/* Nonzero means print parse trace.  It is left uninitialized so that
+   multiple parsers can coexist.  */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks.  */
+#ifndef	YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+   if the built-in stack extension method is used).
+
+   Do not make this value too large; the results are undefined if
+   YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+   evaluated with infinite-precision integer arithmetic.  */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+#  if defined __GLIBC__ && defined _STRING_H
+#   define yystrlen strlen
+#  else
+/* Return the length of YYSTR.  */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static YYSIZE_T
+yystrlen (const char *yystr)
+#else
+static YYSIZE_T
+yystrlen (yystr)
+    const char *yystr;
+#endif
+{
+  YYSIZE_T yylen;
+  for (yylen = 0; yystr[yylen]; yylen++)
+    continue;
+  return yylen;
+}
+#  endif
+# endif
+
+# ifndef yystpcpy
+#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
+#   define yystpcpy stpcpy
+#  else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+   YYDEST.  */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static char *
+yystpcpy (char *yydest, const char *yysrc)
+#else
+static char *
+yystpcpy (yydest, yysrc)
+    char *yydest;
+    const char *yysrc;
+#endif
+{
+  char *yyd = yydest;
+  const char *yys = yysrc;
+
+  while ((*yyd++ = *yys++) != '\0')
+    continue;
+
+  return yyd - 1;
+}
+#  endif
+# endif
+
+# ifndef yytnamerr
+/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
+   quotes and backslashes, so that it's suitable for yyerror.  The
+   heuristic is that double-quoting is unnecessary unless the string
+   contains an apostrophe, a comma, or backslash (other than
+   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
+   null, do not copy; instead, return the length of what the result
+   would have been.  */
+static YYSIZE_T
+yytnamerr (char *yyres, const char *yystr)
+{
+  if (*yystr == '"')
+    {
+      YYSIZE_T yyn = 0;
+      char const *yyp = yystr;
+
+      for (;;)
+	switch (*++yyp)
+	  {
+	  case '\'':
+	  case ',':
+	    goto do_not_strip_quotes;
+
+	  case '\\':
+	    if (*++yyp != '\\')
+	      goto do_not_strip_quotes;
+	    /* Fall through.  */
+	  default:
+	    if (yyres)
+	      yyres[yyn] = *yyp;
+	    yyn++;
+	    break;
+
+	  case '"':
+	    if (yyres)
+	      yyres[yyn] = '\0';
+	    return yyn;
+	  }
+    do_not_strip_quotes: ;
+    }
+
+  if (! yyres)
+    return yystrlen (yystr);
+
+  return yystpcpy (yyres, yystr) - yyres;
+}
+# endif
+
+/* Copy into YYRESULT an error message about the unexpected token
+   YYCHAR while in state YYSTATE.  Return the number of bytes copied,
+   including the terminating null byte.  If YYRESULT is null, do not
+   copy anything; just return the number of bytes that would be
+   copied.  As a special case, return 0 if an ordinary "syntax error"
+   message will do.  Return YYSIZE_MAXIMUM if overflow occurs during
+   size calculation.  */
+static YYSIZE_T
+yysyntax_error (char *yyresult, int yystate, int yychar)
+{
+  int yyn = yypact[yystate];
+
+  if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
+    return 0;
+  else
+    {
+      int yytype = YYTRANSLATE (yychar);
+      YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
+      YYSIZE_T yysize = yysize0;
+      YYSIZE_T yysize1;
+      int yysize_overflow = 0;
+      enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
+      char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+      int yyx;
+
+# if 0
+      /* This is so xgettext sees the translatable formats that are
+	 constructed on the fly.  */
+      YY_("syntax error, unexpected %s");
+      YY_("syntax error, unexpected %s, expecting %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s or %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
+# endif
+      char *yyfmt;
+      char const *yyf;
+      static char const yyunexpected[] = "syntax error, unexpected %s";
+      static char const yyexpecting[] = ", expecting %s";
+      static char const yyor[] = " or %s";
+      char yyformat[sizeof yyunexpected
+		    + sizeof yyexpecting - 1
+		    + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
+		       * (sizeof yyor - 1))];
+      char const *yyprefix = yyexpecting;
+
+      /* Start YYX at -YYN if negative to avoid negative indexes in
+	 YYCHECK.  */
+      int yyxbegin = yyn < 0 ? -yyn : 0;
+
+      /* Stay within bounds of both yycheck and yytname.  */
+      int yychecklim = YYLAST - yyn + 1;
+      int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+      int yycount = 1;
+
+      yyarg[0] = yytname[yytype];
+      yyfmt = yystpcpy (yyformat, yyunexpected);
+
+      for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+	if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+	  {
+	    if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+	      {
+		yycount = 1;
+		yysize = yysize0;
+		yyformat[sizeof yyunexpected - 1] = '\0';
+		break;
+	      }
+	    yyarg[yycount++] = yytname[yyx];
+	    yysize1 = yysize + yytnamerr (0, yytname[yyx]);
+	    yysize_overflow |= (yysize1 < yysize);
+	    yysize = yysize1;
+	    yyfmt = yystpcpy (yyfmt, yyprefix);
+	    yyprefix = yyor;
+	  }
+
+      yyf = YY_(yyformat);
+      yysize1 = yysize + yystrlen (yyf);
+      yysize_overflow |= (yysize1 < yysize);
+      yysize = yysize1;
+
+      if (yysize_overflow)
+	return YYSIZE_MAXIMUM;
+
+      if (yyresult)
+	{
+	  /* Avoid sprintf, as that infringes on the user's name space.
+	     Don't have undefined behavior even if the translation
+	     produced a string with the wrong number of "%s"s.  */
+	  char *yyp = yyresult;
+	  int yyi = 0;
+	  while ((*yyp = *yyf) != '\0')
+	    {
+	      if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
+		{
+		  yyp += yytnamerr (yyp, yyarg[yyi++]);
+		  yyf += 2;
+		}
+	      else
+		{
+		  yyp++;
+		  yyf++;
+		}
+	    }
+	}
+      return yysize;
+    }
+}
+#endif /* YYERROR_VERBOSE */
+
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol.  |
+`-----------------------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, parser_state *p)
+#else
+static void
+yydestruct (yymsg, yytype, yyvaluep, p)
+    const char *yymsg;
+    int yytype;
+    YYSTYPE *yyvaluep;
+    parser_state *p;
+#endif
+{
+  YYUSE (yyvaluep);
+  YYUSE (p);
+
+  if (!yymsg)
+    yymsg = "Deleting";
+  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
+
+  switch (yytype)
+    {
+
+      default:
+	break;
+    }
+}
+
+/* Prevent warnings from -Wmissing-prototypes.  */
+#ifdef YYPARSE_PARAM
+#if defined __STDC__ || defined __cplusplus
+int yyparse (void *YYPARSE_PARAM);
+#else
+int yyparse ();
+#endif
+#else /* ! YYPARSE_PARAM */
+#if defined __STDC__ || defined __cplusplus
+int yyparse (parser_state *p);
+#else
+int yyparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
+
+
+
+
+
+/*-------------------------.
+| yyparse or yypush_parse.  |
+`-------------------------*/
+
+#ifdef YYPARSE_PARAM
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (void *YYPARSE_PARAM)
+#else
+int
+yyparse (YYPARSE_PARAM)
+    void *YYPARSE_PARAM;
+#endif
+#else /* ! YYPARSE_PARAM */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (parser_state *p)
+#else
+int
+yyparse (p)
+    parser_state *p;
+#endif
+#endif
+{
+/* The lookahead symbol.  */
+int yychar;
+
+/* The semantic value of the lookahead symbol.  */
+YYSTYPE yylval;
+
+    /* Number of syntax errors so far.  */
+    int yynerrs;
+
+    int yystate;
+    /* Number of tokens to shift before error messages enabled.  */
+    int yyerrstatus;
+
+    /* The stacks and their tools:
+       `yyss': related to states.
+       `yyvs': related to semantic values.
+
+       Refer to the stacks thru separate pointers, to allow yyoverflow
+       to reallocate them elsewhere.  */
+
+    /* The state stack.  */
+    yytype_int16 yyssa[YYINITDEPTH];
+    yytype_int16 *yyss;
+    yytype_int16 *yyssp;
+
+    /* The semantic value stack.  */
+    YYSTYPE yyvsa[YYINITDEPTH];
+    YYSTYPE *yyvs;
+    YYSTYPE *yyvsp;
+
+    YYSIZE_T yystacksize;
+
+  int yyn;
+  int yyresult;
+  /* Lookahead token as an internal (translated) token number.  */
+  int yytoken;
+  /* The variables used to return semantic value and location from the
+     action routines.  */
+  YYSTYPE yyval;
+
+#if YYERROR_VERBOSE
+  /* Buffer for error messages, and its allocated size.  */
+  char yymsgbuf[128];
+  char *yymsg = yymsgbuf;
+  YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
+#endif
+
+#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))
+
+  /* The number of symbols on the RHS of the reduced rule.
+     Keep to zero when no symbol should be popped.  */
+  int yylen = 0;
+
+  yytoken = 0;
+  yyss = yyssa;
+  yyvs = yyvsa;
+  yystacksize = YYINITDEPTH;
+
+  YYDPRINTF ((stderr, "Starting parse\n"));
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY; /* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+  yyssp = yyss;
+  yyvsp = yyvs;
+
+  goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate.  |
+`------------------------------------------------------------*/
+ yynewstate:
+  /* In all cases, when you get here, the value and location stacks
+     have just been pushed.  So pushing a state here evens the stacks.  */
+  yyssp++;
+
+ yysetstate:
+  *yyssp = yystate;
+
+  if (yyss + yystacksize - 1 <= yyssp)
+    {
+      /* Get the current used size of the three stacks, in elements.  */
+      YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      {
+	/* Give user a chance to reallocate the stack.  Use copies of
+	   these so that the &'s don't force the real ones into
+	   memory.  */
+	YYSTYPE *yyvs1 = yyvs;
+	yytype_int16 *yyss1 = yyss;
+
+	/* Each stack pointer address is followed by the size of the
+	   data in use in that stack, in bytes.  This used to be a
+	   conditional around just the two extra args, but that might
+	   be undefined if yyoverflow is a macro.  */
+	yyoverflow (YY_("memory exhausted"),
+		    &yyss1, yysize * sizeof (*yyssp),
+		    &yyvs1, yysize * sizeof (*yyvsp),
+		    &yystacksize);
+
+	yyss = yyss1;
+	yyvs = yyvs1;
+      }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+      goto yyexhaustedlab;
+# else
+      /* Extend the stack our own way.  */
+      if (YYMAXDEPTH <= yystacksize)
+	goto yyexhaustedlab;
+      yystacksize *= 2;
+      if (YYMAXDEPTH < yystacksize)
+	yystacksize = YYMAXDEPTH;
+
+      {
+	yytype_int16 *yyss1 = yyss;
+	union yyalloc *yyptr =
+	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+	if (! yyptr)
+	  goto yyexhaustedlab;
+	YYSTACK_RELOCATE (yyss_alloc, yyss);
+	YYSTACK_RELOCATE (yyvs_alloc, yyvs);
+#  undef YYSTACK_RELOCATE
+	if (yyss1 != yyssa)
+	  YYSTACK_FREE (yyss1);
+      }
+# endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + yysize - 1;
+      yyvsp = yyvs + yysize - 1;
+
+      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+		  (unsigned long int) yystacksize));
+
+      if (yyss + yystacksize - 1 <= yyssp)
+	YYABORT;
+    }
+
+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+  if (yystate == YYFINAL)
+    YYACCEPT;
+
+  goto yybackup;
+
+/*-----------.
+| yybackup.  |
+`-----------*/
+yybackup:
+
+  /* Do appropriate processing given the current state.  Read a
+     lookahead token if we need one and don't already have one.  */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+  yyn = yypact[yystate];
+  if (yyn == YYPACT_NINF)
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
+  if (yychar == YYEMPTY)
+    {
+      YYDPRINTF ((stderr, "Reading a token: "));
+      yychar = YYLEX;
+    }
+
+  if (yychar <= YYEOF)
+    {
+      yychar = yytoken = YYEOF;
+      YYDPRINTF ((stderr, "Now at end of input.\n"));
+    }
+  else
+    {
+      yytoken = YYTRANSLATE (yychar);
+      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+    }
+
+  /* If the proper action on seeing token YYTOKEN is to reduce or to
+     detect an error, take that action.  */
+  yyn += yytoken;
+  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+    goto yydefault;
+  yyn = yytable[yyn];
+  if (yyn <= 0)
+    {
+      if (yyn == 0 || yyn == YYTABLE_NINF)
+	goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+
+  /* Count tokens shifted since error; after three, turn off error
+     status.  */
+  if (yyerrstatus)
+    yyerrstatus--;
+
+  /* Shift the lookahead token.  */
+  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+
+  /* Discard the shifted token.  */
+  yychar = YYEMPTY;
+
+  yystate = yyn;
+  *++yyvsp = yylval;
+
+  goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state.  |
+`-----------------------------------------------------------*/
+yydefault:
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+  goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction.  |
+`-----------------------------*/
+yyreduce:
+  /* yyn is the number of a rule to reduce with.  */
+  yylen = yyr2[yyn];
+
+  /* If YYLEN is nonzero, implement the default value of the action:
+     `$$ = $1'.
+
+     Otherwise, the following line sets YYVAL to garbage.
+     This behavior is undocumented and Bison
+     users should not rely upon it.  Assigning to YYVAL
+     unconditionally makes the parser a bit smaller, and it avoids a
+     GCC warning that YYVAL may be used uninitialized.  */
+  yyval = yyvsp[1-yylen];
+
+
+  YY_REDUCE_PRINT (yyn);
+  switch (yyn)
+    {
+        case 2:
+
+/* Line 1464 of yacc.c  */
+#line 1166 "src/parse.y"
+    {
+                      p->lstate = EXPR_BEG;
+                      if (!p->locals) p->locals = cons(0,0);
+                    ;}
+    break;
+
+  case 3:
+
+/* Line 1464 of yacc.c  */
+#line 1171 "src/parse.y"
+    {
+                      p->tree = new_scope(p, (yyvsp[(2) - (2)].nd));
+                      NODE_LINENO(p->tree, (yyvsp[(2) - (2)].nd));
+                    ;}
+    break;
+
+  case 4:
+
+/* Line 1464 of yacc.c  */
+#line 1178 "src/parse.y"
+    {
+                      (yyval.nd) = (yyvsp[(1) - (2)].nd);
+                    ;}
+    break;
+
+  case 5:
+
+/* Line 1464 of yacc.c  */
+#line 1184 "src/parse.y"
+    {
+                      (yyval.nd) = new_begin(p, 0);
+                    ;}
+    break;
+
+  case 6:
+
+/* Line 1464 of yacc.c  */
+#line 1188 "src/parse.y"
+    {
+                      (yyval.nd) = new_begin(p, (yyvsp[(1) - (1)].nd));
+                      NODE_LINENO((yyval.nd), (yyvsp[(1) - (1)].nd));
+                    ;}
+    break;
+
+  case 7:
+
+/* Line 1464 of yacc.c  */
+#line 1193 "src/parse.y"
+    {
+                      (yyval.nd) = push((yyvsp[(1) - (3)].nd), newline_node((yyvsp[(3) - (3)].nd)));
+                    ;}
+    break;
+
+  case 8:
+
+/* Line 1464 of yacc.c  */
+#line 1197 "src/parse.y"
+    {
+                      (yyval.nd) = new_begin(p, 0);
+                    ;}
+    break;
+
+  case 10:
+
+/* Line 1464 of yacc.c  */
+#line 1204 "src/parse.y"
+    {
+                      (yyval.nd) = local_switch(p);
+                    ;}
+    break;
+
+  case 11:
+
+/* Line 1464 of yacc.c  */
+#line 1208 "src/parse.y"
+    {
+                      yyerror(p, "BEGIN not supported");
+                      local_resume(p, (yyvsp[(2) - (5)].nd));
+                      (yyval.nd) = 0;
+                    ;}
+    break;
+
+  case 12:
+
+/* Line 1464 of yacc.c  */
+#line 1219 "src/parse.y"
+    {
+                      if ((yyvsp[(2) - (4)].nd)) {
+                        (yyval.nd) = new_rescue(p, (yyvsp[(1) - (4)].nd), (yyvsp[(2) - (4)].nd), (yyvsp[(3) - (4)].nd));
+                        NODE_LINENO((yyval.nd), (yyvsp[(1) - (4)].nd));
+                      }
+                      else if ((yyvsp[(3) - (4)].nd)) {
+                        yywarn(p, "else without rescue is useless");
+                        (yyval.nd) = push((yyvsp[(1) - (4)].nd), (yyvsp[(3) - (4)].nd));
+                      }
+                      else {
+                        (yyval.nd) = (yyvsp[(1) - (4)].nd);
+                      }
+                      if ((yyvsp[(4) - (4)].nd)) {
+                        if ((yyval.nd)) {
+                          (yyval.nd) = new_ensure(p, (yyval.nd), (yyvsp[(4) - (4)].nd));
+                        }
+                        else {
+                          (yyval.nd) = push((yyvsp[(4) - (4)].nd), new_nil(p));
+                        }
+                      }
+                    ;}
+    break;
+
+  case 13:
+
+/* Line 1464 of yacc.c  */
+#line 1243 "src/parse.y"
+    {
+                      (yyval.nd) = (yyvsp[(1) - (2)].nd);
+                    ;}
+    break;
+
+  case 14:
+
+/* Line 1464 of yacc.c  */
+#line 1249 "src/parse.y"
+    {
+                      (yyval.nd) = new_begin(p, 0);
+                    ;}
+    break;
+
+  case 15:
+
+/* Line 1464 of yacc.c  */
+#line 1253 "src/parse.y"
+    {
+                      (yyval.nd) = new_begin(p, (yyvsp[(1) - (1)].nd));
+                      NODE_LINENO((yyval.nd), (yyvsp[(1) - (1)].nd));
+                    ;}
+    break;
+
+  case 16:
+
+/* Line 1464 of yacc.c  */
+#line 1258 "src/parse.y"
+    {
+                      (yyval.nd) = push((yyvsp[(1) - (3)].nd), newline_node((yyvsp[(3) - (3)].nd)));
+                    ;}
+    break;
+
+  case 17:
+
+/* Line 1464 of yacc.c  */
+#line 1262 "src/parse.y"
+    {
+                      (yyval.nd) = new_begin(p, (yyvsp[(2) - (2)].nd));
+                    ;}
+    break;
+
+  case 18:
+
+/* Line 1464 of yacc.c  */
+#line 1267 "src/parse.y"
+    {p->lstate = EXPR_FNAME;;}
+    break;
+
+  case 19:
+
+/* Line 1464 of yacc.c  */
+#line 1268 "src/parse.y"
+    {
+                      (yyval.nd) = new_alias(p, (yyvsp[(2) - (4)].id), (yyvsp[(4) - (4)].id));
+                    ;}
+    break;
+
+  case 20:
+
+/* Line 1464 of yacc.c  */
+#line 1272 "src/parse.y"
+    {
+                      (yyval.nd) = (yyvsp[(2) - (2)].nd);
+                    ;}
+    break;
+
+  case 21:
+
+/* Line 1464 of yacc.c  */
+#line 1276 "src/parse.y"
+    {
+                      (yyval.nd) = new_if(p, cond((yyvsp[(3) - (3)].nd)), (yyvsp[(1) - (3)].nd), 0);
+                    ;}
+    break;
+
+  case 22:
+
+/* Line 1464 of yacc.c  */
+#line 1280 "src/parse.y"
+    {
+                      (yyval.nd) = new_unless(p, cond((yyvsp[(3) - (3)].nd)), (yyvsp[(1) - (3)].nd), 0);
+                    ;}
+    break;
+
+  case 23:
+
+/* Line 1464 of yacc.c  */
+#line 1284 "src/parse.y"
+    {
+                      (yyval.nd) = new_while(p, cond((yyvsp[(3) - (3)].nd)), (yyvsp[(1) - (3)].nd));
+                    ;}
+    break;
+
+  case 24:
+
+/* Line 1464 of yacc.c  */
+#line 1288 "src/parse.y"
+    {
+                      (yyval.nd) = new_until(p, cond((yyvsp[(3) - (3)].nd)), (yyvsp[(1) - (3)].nd));
+                    ;}
+    break;
+
+  case 25:
+
+/* Line 1464 of yacc.c  */
+#line 1292 "src/parse.y"
+    {
+                      (yyval.nd) = new_rescue(p, (yyvsp[(1) - (3)].nd), list1(list3(0, 0, (yyvsp[(3) - (3)].nd))), 0);
+                    ;}
+    break;
+
+  case 26:
+
+/* Line 1464 of yacc.c  */
+#line 1296 "src/parse.y"
+    {
+                      yyerror(p, "END not suported");
+                      (yyval.nd) = new_postexe(p, (yyvsp[(3) - (4)].nd));
+                    ;}
+    break;
+
+  case 28:
+
+/* Line 1464 of yacc.c  */
+#line 1302 "src/parse.y"
+    {
+                      (yyval.nd) = new_masgn(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 29:
+
+/* Line 1464 of yacc.c  */
+#line 1306 "src/parse.y"
+    {
+                      (yyval.nd) = new_op_asgn(p, (yyvsp[(1) - (3)].nd), (yyvsp[(2) - (3)].id), (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 30:
+
+/* Line 1464 of yacc.c  */
+#line 1310 "src/parse.y"
+    {
+                      (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[(1) - (6)].nd), intern("[]",2), (yyvsp[(3) - (6)].nd)), (yyvsp[(5) - (6)].id), (yyvsp[(6) - (6)].nd));
+                    ;}
+    break;
+
+  case 31:
+
+/* Line 1464 of yacc.c  */
+#line 1314 "src/parse.y"
+    {
+                      (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[(1) - (5)].nd), (yyvsp[(3) - (5)].id), 0), (yyvsp[(4) - (5)].id), (yyvsp[(5) - (5)].nd));
+                    ;}
+    break;
+
+  case 32:
+
+/* Line 1464 of yacc.c  */
+#line 1318 "src/parse.y"
+    {
+                      (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[(1) - (5)].nd), (yyvsp[(3) - (5)].id), 0), (yyvsp[(4) - (5)].id), (yyvsp[(5) - (5)].nd));
+                    ;}
+    break;
+
+  case 33:
+
+/* Line 1464 of yacc.c  */
+#line 1322 "src/parse.y"
+    {
+                      yyerror(p, "constant re-assignment");
+                      (yyval.nd) = 0;
+                    ;}
+    break;
+
+  case 34:
+
+/* Line 1464 of yacc.c  */
+#line 1327 "src/parse.y"
+    {
+                      (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[(1) - (5)].nd), (yyvsp[(3) - (5)].id), 0), (yyvsp[(4) - (5)].id), (yyvsp[(5) - (5)].nd));
+                    ;}
+    break;
+
+  case 35:
+
+/* Line 1464 of yacc.c  */
+#line 1331 "src/parse.y"
+    {
+                      backref_error(p, (yyvsp[(1) - (3)].nd));
+                      (yyval.nd) = new_begin(p, 0);
+                    ;}
+    break;
+
+  case 36:
+
+/* Line 1464 of yacc.c  */
+#line 1336 "src/parse.y"
+    {
+                      (yyval.nd) = new_asgn(p, (yyvsp[(1) - (3)].nd), new_array(p, (yyvsp[(3) - (3)].nd)));
+                    ;}
+    break;
+
+  case 37:
+
+/* Line 1464 of yacc.c  */
+#line 1340 "src/parse.y"
+    {
+                      (yyval.nd) = new_masgn(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 38:
+
+/* Line 1464 of yacc.c  */
+#line 1344 "src/parse.y"
+    {
+                      (yyval.nd) = new_masgn(p, (yyvsp[(1) - (3)].nd), new_array(p, (yyvsp[(3) - (3)].nd)));
+                    ;}
+    break;
+
+  case 40:
+
+/* Line 1464 of yacc.c  */
+#line 1351 "src/parse.y"
+    {
+                      (yyval.nd) = new_asgn(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 41:
+
+/* Line 1464 of yacc.c  */
+#line 1355 "src/parse.y"
+    {
+                      (yyval.nd) = new_asgn(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 43:
+
+/* Line 1464 of yacc.c  */
+#line 1363 "src/parse.y"
+    {
+                      (yyval.nd) = new_and(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 44:
+
+/* Line 1464 of yacc.c  */
+#line 1367 "src/parse.y"
+    {
+                      (yyval.nd) = new_or(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 45:
+
+/* Line 1464 of yacc.c  */
+#line 1371 "src/parse.y"
+    {
+                      (yyval.nd) = call_uni_op(p, cond((yyvsp[(3) - (3)].nd)), "!");
+                    ;}
+    break;
+
+  case 46:
+
+/* Line 1464 of yacc.c  */
+#line 1375 "src/parse.y"
+    {
+                      (yyval.nd) = call_uni_op(p, cond((yyvsp[(2) - (2)].nd)), "!");
+                    ;}
+    break;
+
+  case 48:
+
+/* Line 1464 of yacc.c  */
+#line 1382 "src/parse.y"
+    {
+                      if (!(yyvsp[(1) - (1)].nd)) (yyval.nd) = new_nil(p);
+                      else (yyval.nd) = (yyvsp[(1) - (1)].nd);
+                    ;}
+    break;
+
+  case 53:
+
+/* Line 1464 of yacc.c  */
+#line 1397 "src/parse.y"
+    {
+                      local_nest(p);
+                    ;}
+    break;
+
+  case 54:
+
+/* Line 1464 of yacc.c  */
+#line 1403 "src/parse.y"
+    {
+                      (yyval.nd) = new_block(p, (yyvsp[(3) - (5)].nd), (yyvsp[(4) - (5)].nd));
+                      local_unnest(p);
+                    ;}
+    break;
+
+  case 55:
+
+/* Line 1464 of yacc.c  */
+#line 1410 "src/parse.y"
+    {
+                      (yyval.nd) = new_fcall(p, (yyvsp[(1) - (2)].id), (yyvsp[(2) - (2)].nd));
+                    ;}
+    break;
+
+  case 56:
+
+/* Line 1464 of yacc.c  */
+#line 1414 "src/parse.y"
+    {
+                      args_with_block(p, (yyvsp[(2) - (3)].nd), (yyvsp[(3) - (3)].nd));
+                      (yyval.nd) = new_fcall(p, (yyvsp[(1) - (3)].id), (yyvsp[(2) - (3)].nd));
+                    ;}
+    break;
+
+  case 57:
+
+/* Line 1464 of yacc.c  */
+#line 1419 "src/parse.y"
+    {
+                      (yyval.nd) = new_call(p, (yyvsp[(1) - (4)].nd), (yyvsp[(3) - (4)].id), (yyvsp[(4) - (4)].nd));
+                    ;}
+    break;
+
+  case 58:
+
+/* Line 1464 of yacc.c  */
+#line 1423 "src/parse.y"
+    {
+                      args_with_block(p, (yyvsp[(4) - (5)].nd), (yyvsp[(5) - (5)].nd));
+                      (yyval.nd) = new_call(p, (yyvsp[(1) - (5)].nd), (yyvsp[(3) - (5)].id), (yyvsp[(4) - (5)].nd));
+                   ;}
+    break;
+
+  case 59:
+
+/* Line 1464 of yacc.c  */
+#line 1428 "src/parse.y"
+    {
+                      (yyval.nd) = new_call(p, (yyvsp[(1) - (4)].nd), (yyvsp[(3) - (4)].id), (yyvsp[(4) - (4)].nd));
+                    ;}
+    break;
+
+  case 60:
+
+/* Line 1464 of yacc.c  */
+#line 1432 "src/parse.y"
+    {
+                      args_with_block(p, (yyvsp[(4) - (5)].nd), (yyvsp[(5) - (5)].nd));
+                      (yyval.nd) = new_call(p, (yyvsp[(1) - (5)].nd), (yyvsp[(3) - (5)].id), (yyvsp[(4) - (5)].nd));
+                    ;}
+    break;
+
+  case 61:
+
+/* Line 1464 of yacc.c  */
+#line 1437 "src/parse.y"
+    {
+                      (yyval.nd) = new_super(p, (yyvsp[(2) - (2)].nd));
+                    ;}
+    break;
+
+  case 62:
+
+/* Line 1464 of yacc.c  */
+#line 1441 "src/parse.y"
+    {
+                      (yyval.nd) = new_yield(p, (yyvsp[(2) - (2)].nd));
+                    ;}
+    break;
+
+  case 63:
+
+/* Line 1464 of yacc.c  */
+#line 1445 "src/parse.y"
+    {
+                      (yyval.nd) = new_return(p, ret_args(p, (yyvsp[(2) - (2)].nd)));
+                    ;}
+    break;
+
+  case 64:
+
+/* Line 1464 of yacc.c  */
+#line 1449 "src/parse.y"
+    {
+                      (yyval.nd) = new_break(p, ret_args(p, (yyvsp[(2) - (2)].nd)));
+                    ;}
+    break;
+
+  case 65:
+
+/* Line 1464 of yacc.c  */
+#line 1453 "src/parse.y"
+    {
+                      (yyval.nd) = new_next(p, ret_args(p, (yyvsp[(2) - (2)].nd)));
+                    ;}
+    break;
+
+  case 66:
+
+/* Line 1464 of yacc.c  */
+#line 1459 "src/parse.y"
+    {
+                      (yyval.nd) = (yyvsp[(1) - (1)].nd);
+                    ;}
+    break;
+
+  case 67:
+
+/* Line 1464 of yacc.c  */
+#line 1463 "src/parse.y"
+    {
+                      (yyval.nd) = (yyvsp[(2) - (3)].nd);
+                    ;}
+    break;
+
+  case 69:
+
+/* Line 1464 of yacc.c  */
+#line 1470 "src/parse.y"
+    {
+                      (yyval.nd) = list1((yyvsp[(2) - (3)].nd));
+                    ;}
+    break;
+
+  case 70:
+
+/* Line 1464 of yacc.c  */
+#line 1476 "src/parse.y"
+    {
+                      (yyval.nd) = list1((yyvsp[(1) - (1)].nd));
+                    ;}
+    break;
+
+  case 71:
+
+/* Line 1464 of yacc.c  */
+#line 1480 "src/parse.y"
+    {
+                      (yyval.nd) = list1(push((yyvsp[(1) - (2)].nd),(yyvsp[(2) - (2)].nd)));
+                    ;}
+    break;
+
+  case 72:
+
+/* Line 1464 of yacc.c  */
+#line 1484 "src/parse.y"
+    {
+                      (yyval.nd) = list2((yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 73:
+
+/* Line 1464 of yacc.c  */
+#line 1488 "src/parse.y"
+    {
+                      (yyval.nd) = list3((yyvsp[(1) - (5)].nd), (yyvsp[(3) - (5)].nd), (yyvsp[(5) - (5)].nd));
+                    ;}
+    break;
+
+  case 74:
+
+/* Line 1464 of yacc.c  */
+#line 1492 "src/parse.y"
+    {
+                      (yyval.nd) = list2((yyvsp[(1) - (2)].nd), new_nil(p));
+                    ;}
+    break;
+
+  case 75:
+
+/* Line 1464 of yacc.c  */
+#line 1496 "src/parse.y"
+    {
+                      (yyval.nd) = list3((yyvsp[(1) - (4)].nd), new_nil(p), (yyvsp[(4) - (4)].nd));
+                    ;}
+    break;
+
+  case 76:
+
+/* Line 1464 of yacc.c  */
+#line 1500 "src/parse.y"
+    {
+                      (yyval.nd) = list2(0, (yyvsp[(2) - (2)].nd));
+                    ;}
+    break;
+
+  case 77:
+
+/* Line 1464 of yacc.c  */
+#line 1504 "src/parse.y"
+    {
+                      (yyval.nd) = list3(0, (yyvsp[(2) - (4)].nd), (yyvsp[(4) - (4)].nd));
+                    ;}
+    break;
+
+  case 78:
+
+/* Line 1464 of yacc.c  */
+#line 1508 "src/parse.y"
+    {
+                      (yyval.nd) = list2(0, new_nil(p));
+                    ;}
+    break;
+
+  case 79:
+
+/* Line 1464 of yacc.c  */
+#line 1512 "src/parse.y"
+    {
+                      (yyval.nd) = list3(0, new_nil(p), (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 81:
+
+/* Line 1464 of yacc.c  */
+#line 1519 "src/parse.y"
+    {
+                      (yyval.nd) = (yyvsp[(2) - (3)].nd);
+                    ;}
+    break;
+
+  case 82:
+
+/* Line 1464 of yacc.c  */
+#line 1525 "src/parse.y"
+    {
+                      (yyval.nd) = list1((yyvsp[(1) - (2)].nd));
+                    ;}
+    break;
+
+  case 83:
+
+/* Line 1464 of yacc.c  */
+#line 1529 "src/parse.y"
+    {
+                      (yyval.nd) = push((yyvsp[(1) - (3)].nd), (yyvsp[(2) - (3)].nd));
+                    ;}
+    break;
+
+  case 84:
+
+/* Line 1464 of yacc.c  */
+#line 1535 "src/parse.y"
+    {
+                      (yyval.nd) = list1((yyvsp[(1) - (1)].nd));
+                    ;}
+    break;
+
+  case 85:
+
+/* Line 1464 of yacc.c  */
+#line 1539 "src/parse.y"
+    {
+                      (yyval.nd) = push((yyvsp[(1) - (2)].nd), (yyvsp[(2) - (2)].nd));
+                    ;}
+    break;
+
+  case 86:
+
+/* Line 1464 of yacc.c  */
+#line 1545 "src/parse.y"
+    {
+                      assignable(p, (yyvsp[(1) - (1)].nd));
+                    ;}
+    break;
+
+  case 87:
+
+/* Line 1464 of yacc.c  */
+#line 1549 "src/parse.y"
+    {
+                      (yyval.nd) = new_call(p, (yyvsp[(1) - (4)].nd), intern("[]",2), (yyvsp[(3) - (4)].nd));
+                    ;}
+    break;
+
+  case 88:
+
+/* Line 1464 of yacc.c  */
+#line 1553 "src/parse.y"
+    {
+                      (yyval.nd) = new_call(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].id), 0);
+                    ;}
+    break;
+
+  case 89:
+
+/* Line 1464 of yacc.c  */
+#line 1557 "src/parse.y"
+    {
+                      (yyval.nd) = new_call(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].id), 0);
+                    ;}
+    break;
+
+  case 90:
+
+/* Line 1464 of yacc.c  */
+#line 1561 "src/parse.y"
+    {
+                      (yyval.nd) = new_call(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].id), 0);
+                    ;}
+    break;
+
+  case 91:
+
+/* Line 1464 of yacc.c  */
+#line 1565 "src/parse.y"
+    {
+                      if (p->in_def || p->in_single)
+                        yyerror(p, "dynamic constant assignment");
+                      (yyval.nd) = new_colon2(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].id));
+                    ;}
+    break;
+
+  case 92:
+
+/* Line 1464 of yacc.c  */
+#line 1571 "src/parse.y"
+    {
+                      if (p->in_def || p->in_single)
+                        yyerror(p, "dynamic constant assignment");
+                      (yyval.nd) = new_colon3(p, (yyvsp[(2) - (2)].id));
+                    ;}
+    break;
+
+  case 93:
+
+/* Line 1464 of yacc.c  */
+#line 1577 "src/parse.y"
+    {
+                      backref_error(p, (yyvsp[(1) - (1)].nd));
+                      (yyval.nd) = 0;
+                    ;}
+    break;
+
+  case 94:
+
+/* Line 1464 of yacc.c  */
+#line 1584 "src/parse.y"
+    {
+                      assignable(p, (yyvsp[(1) - (1)].nd));
+                    ;}
+    break;
+
+  case 95:
+
+/* Line 1464 of yacc.c  */
+#line 1588 "src/parse.y"
+    {
+                      (yyval.nd) = new_call(p, (yyvsp[(1) - (4)].nd), intern("[]",2), (yyvsp[(3) - (4)].nd));
+                    ;}
+    break;
+
+  case 96:
+
+/* Line 1464 of yacc.c  */
+#line 1592 "src/parse.y"
+    {
+                      (yyval.nd) = new_call(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].id), 0);
+                    ;}
+    break;
+
+  case 97:
+
+/* Line 1464 of yacc.c  */
+#line 1596 "src/parse.y"
+    {
+                      (yyval.nd) = new_call(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].id), 0);
+                    ;}
+    break;
+
+  case 98:
+
+/* Line 1464 of yacc.c  */
+#line 1600 "src/parse.y"
+    {
+                      (yyval.nd) = new_call(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].id), 0);
+                    ;}
+    break;
+
+  case 99:
+
+/* Line 1464 of yacc.c  */
+#line 1604 "src/parse.y"
+    {
+                      if (p->in_def || p->in_single)
+                        yyerror(p, "dynamic constant assignment");
+                      (yyval.nd) = new_colon2(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].id));
+                    ;}
+    break;
+
+  case 100:
+
+/* Line 1464 of yacc.c  */
+#line 1610 "src/parse.y"
+    {
+                      if (p->in_def || p->in_single)
+                        yyerror(p, "dynamic constant assignment");
+                      (yyval.nd) = new_colon3(p, (yyvsp[(2) - (2)].id));
+                    ;}
+    break;
+
+  case 101:
+
+/* Line 1464 of yacc.c  */
+#line 1616 "src/parse.y"
+    {
+                      backref_error(p, (yyvsp[(1) - (1)].nd));
+                      (yyval.nd) = 0;
+                    ;}
+    break;
+
+  case 102:
+
+/* Line 1464 of yacc.c  */
+#line 1623 "src/parse.y"
+    {
+                      yyerror(p, "class/module name must be CONSTANT");
+                    ;}
+    break;
+
+  case 104:
+
+/* Line 1464 of yacc.c  */
+#line 1630 "src/parse.y"
+    {
+                      (yyval.nd) = cons((node*)1, nsym((yyvsp[(2) - (2)].id)));
+                    ;}
+    break;
+
+  case 105:
+
+/* Line 1464 of yacc.c  */
+#line 1634 "src/parse.y"
+    {
+                      (yyval.nd) = cons((node*)0, nsym((yyvsp[(1) - (1)].id)));
+                    ;}
+    break;
+
+  case 106:
+
+/* Line 1464 of yacc.c  */
+#line 1638 "src/parse.y"
+    {
+                      (yyval.nd) = cons((yyvsp[(1) - (3)].nd), nsym((yyvsp[(3) - (3)].id)));
+                    ;}
+    break;
+
+  case 110:
+
+/* Line 1464 of yacc.c  */
+#line 1647 "src/parse.y"
+    {
+                      p->lstate = EXPR_ENDFN;
+                      (yyval.id) = (yyvsp[(1) - (1)].id);
+                    ;}
+    break;
+
+  case 111:
+
+/* Line 1464 of yacc.c  */
+#line 1652 "src/parse.y"
+    {
+                      p->lstate = EXPR_ENDFN;
+                      (yyval.id) = (yyvsp[(1) - (1)].id);
+                    ;}
+    break;
+
+  case 114:
+
+/* Line 1464 of yacc.c  */
+#line 1663 "src/parse.y"
+    {
+                      (yyval.nd) = new_undef(p, (yyvsp[(1) - (1)].id));
+                    ;}
+    break;
+
+  case 115:
+
+/* Line 1464 of yacc.c  */
+#line 1666 "src/parse.y"
+    {p->lstate = EXPR_FNAME;;}
+    break;
+
+  case 116:
+
+/* Line 1464 of yacc.c  */
+#line 1667 "src/parse.y"
+    {
+                      (yyval.nd) = push((yyvsp[(1) - (4)].nd), nsym((yyvsp[(4) - (4)].id)));
+                    ;}
+    break;
+
+  case 117:
+
+/* Line 1464 of yacc.c  */
+#line 1672 "src/parse.y"
+    { (yyval.id) = intern_c('|');   ;}
+    break;
+
+  case 118:
+
+/* Line 1464 of yacc.c  */
+#line 1673 "src/parse.y"
+    { (yyval.id) = intern_c('^');   ;}
+    break;
+
+  case 119:
+
+/* Line 1464 of yacc.c  */
+#line 1674 "src/parse.y"
+    { (yyval.id) = intern_c('&');   ;}
+    break;
+
+  case 120:
+
+/* Line 1464 of yacc.c  */
+#line 1675 "src/parse.y"
+    { (yyval.id) = intern("<=>",3); ;}
+    break;
+
+  case 121:
+
+/* Line 1464 of yacc.c  */
+#line 1676 "src/parse.y"
+    { (yyval.id) = intern("==",2);  ;}
+    break;
+
+  case 122:
+
+/* Line 1464 of yacc.c  */
+#line 1677 "src/parse.y"
+    { (yyval.id) = intern("===",3); ;}
+    break;
+
+  case 123:
+
+/* Line 1464 of yacc.c  */
+#line 1678 "src/parse.y"
+    { (yyval.id) = intern("=~",2);  ;}
+    break;
+
+  case 124:
+
+/* Line 1464 of yacc.c  */
+#line 1679 "src/parse.y"
+    { (yyval.id) = intern("!~",2);  ;}
+    break;
+
+  case 125:
+
+/* Line 1464 of yacc.c  */
+#line 1680 "src/parse.y"
+    { (yyval.id) = intern_c('>');   ;}
+    break;
+
+  case 126:
+
+/* Line 1464 of yacc.c  */
+#line 1681 "src/parse.y"
+    { (yyval.id) = intern(">=",2);  ;}
+    break;
+
+  case 127:
+
+/* Line 1464 of yacc.c  */
+#line 1682 "src/parse.y"
+    { (yyval.id) = intern_c('<');   ;}
+    break;
+
+  case 128:
+
+/* Line 1464 of yacc.c  */
+#line 1683 "src/parse.y"
+    { (yyval.id) = intern("<=",2);  ;}
+    break;
+
+  case 129:
+
+/* Line 1464 of yacc.c  */
+#line 1684 "src/parse.y"
+    { (yyval.id) = intern("!=",2);  ;}
+    break;
+
+  case 130:
+
+/* Line 1464 of yacc.c  */
+#line 1685 "src/parse.y"
+    { (yyval.id) = intern("<<",2);  ;}
+    break;
+
+  case 131:
+
+/* Line 1464 of yacc.c  */
+#line 1686 "src/parse.y"
+    { (yyval.id) = intern(">>",2);  ;}
+    break;
+
+  case 132:
+
+/* Line 1464 of yacc.c  */
+#line 1687 "src/parse.y"
+    { (yyval.id) = intern_c('+');   ;}
+    break;
+
+  case 133:
+
+/* Line 1464 of yacc.c  */
+#line 1688 "src/parse.y"
+    { (yyval.id) = intern_c('-');   ;}
+    break;
+
+  case 134:
+
+/* Line 1464 of yacc.c  */
+#line 1689 "src/parse.y"
+    { (yyval.id) = intern_c('*');   ;}
+    break;
+
+  case 135:
+
+/* Line 1464 of yacc.c  */
+#line 1690 "src/parse.y"
+    { (yyval.id) = intern_c('*');   ;}
+    break;
+
+  case 136:
+
+/* Line 1464 of yacc.c  */
+#line 1691 "src/parse.y"
+    { (yyval.id) = intern_c('/');   ;}
+    break;
+
+  case 137:
+
+/* Line 1464 of yacc.c  */
+#line 1692 "src/parse.y"
+    { (yyval.id) = intern_c('%');   ;}
+    break;
+
+  case 138:
+
+/* Line 1464 of yacc.c  */
+#line 1693 "src/parse.y"
+    { (yyval.id) = intern("**",2);  ;}
+    break;
+
+  case 139:
+
+/* Line 1464 of yacc.c  */
+#line 1694 "src/parse.y"
+    { (yyval.id) = intern_c('!');   ;}
+    break;
+
+  case 140:
+
+/* Line 1464 of yacc.c  */
+#line 1695 "src/parse.y"
+    { (yyval.id) = intern_c('~');   ;}
+    break;
+
+  case 141:
+
+/* Line 1464 of yacc.c  */
+#line 1696 "src/parse.y"
+    { (yyval.id) = intern("+@",2);  ;}
+    break;
+
+  case 142:
+
+/* Line 1464 of yacc.c  */
+#line 1697 "src/parse.y"
+    { (yyval.id) = intern("-@",2);  ;}
+    break;
+
+  case 143:
+
+/* Line 1464 of yacc.c  */
+#line 1698 "src/parse.y"
+    { (yyval.id) = intern("[]",2);  ;}
+    break;
+
+  case 144:
+
+/* Line 1464 of yacc.c  */
+#line 1699 "src/parse.y"
+    { (yyval.id) = intern("[]=",3); ;}
+    break;
+
+  case 145:
+
+/* Line 1464 of yacc.c  */
+#line 1700 "src/parse.y"
+    { (yyval.id) = intern_c('`');   ;}
+    break;
+
+  case 186:
+
+/* Line 1464 of yacc.c  */
+#line 1718 "src/parse.y"
+    {
+                      (yyval.nd) = new_asgn(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 187:
+
+/* Line 1464 of yacc.c  */
+#line 1722 "src/parse.y"
+    {
+                      (yyval.nd) = new_asgn(p, (yyvsp[(1) - (5)].nd), new_rescue(p, (yyvsp[(3) - (5)].nd), list1(list3(0, 0, (yyvsp[(5) - (5)].nd))), 0));
+                    ;}
+    break;
+
+  case 188:
+
+/* Line 1464 of yacc.c  */
+#line 1726 "src/parse.y"
+    {
+                      (yyval.nd) = new_op_asgn(p, (yyvsp[(1) - (3)].nd), (yyvsp[(2) - (3)].id), (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 189:
+
+/* Line 1464 of yacc.c  */
+#line 1730 "src/parse.y"
+    {
+                      (yyval.nd) = new_op_asgn(p, (yyvsp[(1) - (5)].nd), (yyvsp[(2) - (5)].id), new_rescue(p, (yyvsp[(3) - (5)].nd), list1(list3(0, 0, (yyvsp[(5) - (5)].nd))), 0));
+                    ;}
+    break;
+
+  case 190:
+
+/* Line 1464 of yacc.c  */
+#line 1734 "src/parse.y"
+    {
+                      (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[(1) - (6)].nd), intern("[]",2), (yyvsp[(3) - (6)].nd)), (yyvsp[(5) - (6)].id), (yyvsp[(6) - (6)].nd));
+                    ;}
+    break;
+
+  case 191:
+
+/* Line 1464 of yacc.c  */
+#line 1738 "src/parse.y"
+    {
+                      (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[(1) - (5)].nd), (yyvsp[(3) - (5)].id), 0), (yyvsp[(4) - (5)].id), (yyvsp[(5) - (5)].nd));
+                    ;}
+    break;
+
+  case 192:
+
+/* Line 1464 of yacc.c  */
+#line 1742 "src/parse.y"
+    {
+                      (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[(1) - (5)].nd), (yyvsp[(3) - (5)].id), 0), (yyvsp[(4) - (5)].id), (yyvsp[(5) - (5)].nd));
+                    ;}
+    break;
+
+  case 193:
+
+/* Line 1464 of yacc.c  */
+#line 1746 "src/parse.y"
+    {
+                      (yyval.nd) = new_op_asgn(p, new_call(p, (yyvsp[(1) - (5)].nd), (yyvsp[(3) - (5)].id), 0), (yyvsp[(4) - (5)].id), (yyvsp[(5) - (5)].nd));
+                    ;}
+    break;
+
+  case 194:
+
+/* Line 1464 of yacc.c  */
+#line 1750 "src/parse.y"
+    {
+                      yyerror(p, "constant re-assignment");
+                      (yyval.nd) = new_begin(p, 0);
+                    ;}
+    break;
+
+  case 195:
+
+/* Line 1464 of yacc.c  */
+#line 1755 "src/parse.y"
+    {
+                      yyerror(p, "constant re-assignment");
+                      (yyval.nd) = new_begin(p, 0);
+                    ;}
+    break;
+
+  case 196:
+
+/* Line 1464 of yacc.c  */
+#line 1760 "src/parse.y"
+    {
+                      backref_error(p, (yyvsp[(1) - (3)].nd));
+                      (yyval.nd) = new_begin(p, 0);
+                    ;}
+    break;
+
+  case 197:
+
+/* Line 1464 of yacc.c  */
+#line 1765 "src/parse.y"
+    {
+                      (yyval.nd) = new_dot2(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 198:
+
+/* Line 1464 of yacc.c  */
+#line 1769 "src/parse.y"
+    {
+                      (yyval.nd) = new_dot3(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 199:
+
+/* Line 1464 of yacc.c  */
+#line 1773 "src/parse.y"
+    {
+                      (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "+", (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 200:
+
+/* Line 1464 of yacc.c  */
+#line 1777 "src/parse.y"
+    {
+                      (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "-", (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 201:
+
+/* Line 1464 of yacc.c  */
+#line 1781 "src/parse.y"
+    {
+                      (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "*", (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 202:
+
+/* Line 1464 of yacc.c  */
+#line 1785 "src/parse.y"
+    {
+                      (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "/", (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 203:
+
+/* Line 1464 of yacc.c  */
+#line 1789 "src/parse.y"
+    {
+                      (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "%", (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 204:
+
+/* Line 1464 of yacc.c  */
+#line 1793 "src/parse.y"
+    {
+                      (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "**", (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 205:
+
+/* Line 1464 of yacc.c  */
+#line 1797 "src/parse.y"
+    {
+                      (yyval.nd) = call_uni_op(p, call_bin_op(p, (yyvsp[(2) - (4)].nd), "**", (yyvsp[(4) - (4)].nd)), "-@");
+                    ;}
+    break;
+
+  case 206:
+
+/* Line 1464 of yacc.c  */
+#line 1801 "src/parse.y"
+    {
+                      (yyval.nd) = call_uni_op(p, call_bin_op(p, (yyvsp[(2) - (4)].nd), "**", (yyvsp[(4) - (4)].nd)), "-@");
+                    ;}
+    break;
+
+  case 207:
+
+/* Line 1464 of yacc.c  */
+#line 1805 "src/parse.y"
+    {
+                      (yyval.nd) = call_uni_op(p, (yyvsp[(2) - (2)].nd), "+@");
+                    ;}
+    break;
+
+  case 208:
+
+/* Line 1464 of yacc.c  */
+#line 1809 "src/parse.y"
+    {
+                      (yyval.nd) = call_uni_op(p, (yyvsp[(2) - (2)].nd), "-@");
+                    ;}
+    break;
+
+  case 209:
+
+/* Line 1464 of yacc.c  */
+#line 1813 "src/parse.y"
+    {
+                      (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "|", (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 210:
+
+/* Line 1464 of yacc.c  */
+#line 1817 "src/parse.y"
+    {
+                      (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "^", (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 211:
+
+/* Line 1464 of yacc.c  */
+#line 1821 "src/parse.y"
+    {
+                      (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "&", (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 212:
+
+/* Line 1464 of yacc.c  */
+#line 1825 "src/parse.y"
+    {
+                      (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "<=>", (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 213:
+
+/* Line 1464 of yacc.c  */
+#line 1829 "src/parse.y"
+    {
+                      (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), ">", (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 214:
+
+/* Line 1464 of yacc.c  */
+#line 1833 "src/parse.y"
+    {
+                      (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), ">=", (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 215:
+
+/* Line 1464 of yacc.c  */
+#line 1837 "src/parse.y"
+    {
+                      (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "<", (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 216:
+
+/* Line 1464 of yacc.c  */
+#line 1841 "src/parse.y"
+    {
+                      (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "<=", (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 217:
+
+/* Line 1464 of yacc.c  */
+#line 1845 "src/parse.y"
+    {
+                      (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "==", (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 218:
+
+/* Line 1464 of yacc.c  */
+#line 1849 "src/parse.y"
+    {
+                      (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "===", (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 219:
+
+/* Line 1464 of yacc.c  */
+#line 1853 "src/parse.y"
+    {
+                      (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "!=", (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 220:
+
+/* Line 1464 of yacc.c  */
+#line 1857 "src/parse.y"
+    {
+                      (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "=~", (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 221:
+
+/* Line 1464 of yacc.c  */
+#line 1861 "src/parse.y"
+    {
+                      (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "!~", (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 222:
+
+/* Line 1464 of yacc.c  */
+#line 1865 "src/parse.y"
+    {
+                      (yyval.nd) = call_uni_op(p, cond((yyvsp[(2) - (2)].nd)), "!");
+                    ;}
+    break;
+
+  case 223:
+
+/* Line 1464 of yacc.c  */
+#line 1869 "src/parse.y"
+    {
+                      (yyval.nd) = call_uni_op(p, cond((yyvsp[(2) - (2)].nd)), "~");
+                    ;}
+    break;
+
+  case 224:
+
+/* Line 1464 of yacc.c  */
+#line 1873 "src/parse.y"
+    {
+                      (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), "<<", (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 225:
+
+/* Line 1464 of yacc.c  */
+#line 1877 "src/parse.y"
+    {
+                      (yyval.nd) = call_bin_op(p, (yyvsp[(1) - (3)].nd), ">>", (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 226:
+
+/* Line 1464 of yacc.c  */
+#line 1881 "src/parse.y"
+    {
+                      (yyval.nd) = new_and(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 227:
+
+/* Line 1464 of yacc.c  */
+#line 1885 "src/parse.y"
+    {
+                      (yyval.nd) = new_or(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 228:
+
+/* Line 1464 of yacc.c  */
+#line 1889 "src/parse.y"
+    {
+                      (yyval.nd) = new_if(p, cond((yyvsp[(1) - (6)].nd)), (yyvsp[(3) - (6)].nd), (yyvsp[(6) - (6)].nd));
+                    ;}
+    break;
+
+  case 229:
+
+/* Line 1464 of yacc.c  */
+#line 1893 "src/parse.y"
+    {
+                      (yyval.nd) = (yyvsp[(1) - (1)].nd);
+                    ;}
+    break;
+
+  case 230:
+
+/* Line 1464 of yacc.c  */
+#line 1899 "src/parse.y"
+    {
+                      (yyval.nd) = (yyvsp[(1) - (1)].nd);
+                      if (!(yyval.nd)) (yyval.nd) = new_nil(p);
+                    ;}
+    break;
+
+  case 232:
+
+/* Line 1464 of yacc.c  */
+#line 1907 "src/parse.y"
+    {
+                      (yyval.nd) = (yyvsp[(1) - (2)].nd);
+                      NODE_LINENO((yyval.nd), (yyvsp[(1) - (2)].nd));
+                    ;}
+    break;
+
+  case 233:
+
+/* Line 1464 of yacc.c  */
+#line 1912 "src/parse.y"
+    {
+                      (yyval.nd) = push((yyvsp[(1) - (4)].nd), new_hash(p, (yyvsp[(3) - (4)].nd)));
+                    ;}
+    break;
+
+  case 234:
+
+/* Line 1464 of yacc.c  */
+#line 1916 "src/parse.y"
+    {
+                      (yyval.nd) = cons(new_hash(p, (yyvsp[(1) - (2)].nd)), 0);
+                      NODE_LINENO((yyval.nd), (yyvsp[(1) - (2)].nd));
+                    ;}
+    break;
+
+  case 235:
+
+/* Line 1464 of yacc.c  */
+#line 1923 "src/parse.y"
+    {
+                      (yyval.nd) = (yyvsp[(2) - (3)].nd);
+                    ;}
+    break;
+
+  case 240:
+
+/* Line 1464 of yacc.c  */
+#line 1935 "src/parse.y"
+    {
+                      (yyval.nd) = cons((yyvsp[(1) - (2)].nd),0);
+                      NODE_LINENO((yyval.nd), (yyvsp[(1) - (2)].nd));
+                    ;}
+    break;
+
+  case 241:
+
+/* Line 1464 of yacc.c  */
+#line 1940 "src/parse.y"
+    {
+                      (yyval.nd) = cons(push((yyvsp[(1) - (4)].nd), new_hash(p, (yyvsp[(3) - (4)].nd))), 0);
+                      NODE_LINENO((yyval.nd), (yyvsp[(1) - (4)].nd));
+                    ;}
+    break;
+
+  case 242:
+
+/* Line 1464 of yacc.c  */
+#line 1945 "src/parse.y"
+    {
+                      (yyval.nd) = cons(list1(new_hash(p, (yyvsp[(1) - (2)].nd))), 0);
+                      NODE_LINENO((yyval.nd), (yyvsp[(1) - (2)].nd));
+                    ;}
+    break;
+
+  case 243:
+
+/* Line 1464 of yacc.c  */
+#line 1952 "src/parse.y"
+    {
+                      (yyval.nd) = cons(list1((yyvsp[(1) - (1)].nd)), 0);
+                      NODE_LINENO((yyval.nd), (yyvsp[(1) - (1)].nd));
+                    ;}
+    break;
+
+  case 244:
+
+/* Line 1464 of yacc.c  */
+#line 1957 "src/parse.y"
+    {
+                      (yyval.nd) = cons((yyvsp[(1) - (2)].nd), (yyvsp[(2) - (2)].nd));
+                      NODE_LINENO((yyval.nd), (yyvsp[(1) - (2)].nd));
+                    ;}
+    break;
+
+  case 245:
+
+/* Line 1464 of yacc.c  */
+#line 1962 "src/parse.y"
+    {
+                      (yyval.nd) = cons(list1(new_hash(p, (yyvsp[(1) - (2)].nd))), (yyvsp[(2) - (2)].nd));
+                      NODE_LINENO((yyval.nd), (yyvsp[(1) - (2)].nd));
+                    ;}
+    break;
+
+  case 246:
+
+/* Line 1464 of yacc.c  */
+#line 1967 "src/parse.y"
+    {
+                      (yyval.nd) = cons(push((yyvsp[(1) - (4)].nd), new_hash(p, (yyvsp[(3) - (4)].nd))), (yyvsp[(4) - (4)].nd));
+                      NODE_LINENO((yyval.nd), (yyvsp[(1) - (4)].nd));
+                    ;}
+    break;
+
+  case 247:
+
+/* Line 1464 of yacc.c  */
+#line 1972 "src/parse.y"
+    {
+                      (yyval.nd) = cons(0, (yyvsp[(1) - (1)].nd));
+                      NODE_LINENO((yyval.nd), (yyvsp[(1) - (1)].nd));
+                    ;}
+    break;
+
+  case 248:
+
+/* Line 1464 of yacc.c  */
+#line 1978 "src/parse.y"
+    {
+                      (yyval.stack) = p->cmdarg_stack;
+                      CMDARG_PUSH(1);
+                    ;}
+    break;
+
+  case 249:
+
+/* Line 1464 of yacc.c  */
+#line 1983 "src/parse.y"
+    {
+                      p->cmdarg_stack = (yyvsp[(1) - (2)].stack);
+                      (yyval.nd) = (yyvsp[(2) - (2)].nd);
+                    ;}
+    break;
+
+  case 250:
+
+/* Line 1464 of yacc.c  */
+#line 1990 "src/parse.y"
+    {
+                      (yyval.nd) = new_block_arg(p, (yyvsp[(2) - (2)].nd));
+                    ;}
+    break;
+
+  case 251:
+
+/* Line 1464 of yacc.c  */
+#line 1996 "src/parse.y"
+    {
+                      (yyval.nd) = (yyvsp[(2) - (2)].nd);
+                    ;}
+    break;
+
+  case 252:
+
+/* Line 1464 of yacc.c  */
+#line 2000 "src/parse.y"
+    {
+                      (yyval.nd) = 0;
+                    ;}
+    break;
+
+  case 253:
+
+/* Line 1464 of yacc.c  */
+#line 2006 "src/parse.y"
+    {
+                      (yyval.nd) = cons((yyvsp[(1) - (1)].nd), 0);
+                      NODE_LINENO((yyval.nd), (yyvsp[(1) - (1)].nd));
+                    ;}
+    break;
+
+  case 254:
+
+/* Line 1464 of yacc.c  */
+#line 2011 "src/parse.y"
+    {
+                      (yyval.nd) = cons(new_splat(p, (yyvsp[(2) - (2)].nd)), 0);
+                      NODE_LINENO((yyval.nd), (yyvsp[(2) - (2)].nd));
+                    ;}
+    break;
+
+  case 255:
+
+/* Line 1464 of yacc.c  */
+#line 2016 "src/parse.y"
+    {
+                      (yyval.nd) = push((yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 256:
+
+/* Line 1464 of yacc.c  */
+#line 2020 "src/parse.y"
+    {
+                      (yyval.nd) = push((yyvsp[(1) - (4)].nd), new_splat(p, (yyvsp[(4) - (4)].nd)));
+                    ;}
+    break;
+
+  case 257:
+
+/* Line 1464 of yacc.c  */
+#line 2024 "src/parse.y"
+    {
+                      (yyval.nd) = push((yyvsp[(1) - (4)].nd), (yyvsp[(4) - (4)].nd));
+                    ;}
+    break;
+
+  case 258:
+
+/* Line 1464 of yacc.c  */
+#line 2028 "src/parse.y"
+    {
+                      (yyval.nd) = push((yyvsp[(1) - (5)].nd), new_splat(p, (yyvsp[(5) - (5)].nd)));
+                    ;}
+    break;
+
+  case 259:
+
+/* Line 1464 of yacc.c  */
+#line 2034 "src/parse.y"
+    {
+                      (yyval.nd) = push((yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 260:
+
+/* Line 1464 of yacc.c  */
+#line 2038 "src/parse.y"
+    {
+                      (yyval.nd) = push((yyvsp[(1) - (4)].nd), new_splat(p, (yyvsp[(4) - (4)].nd)));
+                    ;}
+    break;
+
+  case 261:
+
+/* Line 1464 of yacc.c  */
+#line 2042 "src/parse.y"
+    {
+                      (yyval.nd) = list1(new_splat(p, (yyvsp[(2) - (2)].nd)));
+                    ;}
+    break;
+
+  case 269:
+
+/* Line 1464 of yacc.c  */
+#line 2055 "src/parse.y"
+    {
+                      (yyval.nd) = new_fcall(p, (yyvsp[(1) - (1)].id), 0);
+                    ;}
+    break;
+
+  case 270:
+
+/* Line 1464 of yacc.c  */
+#line 2059 "src/parse.y"
+    {
+                      (yyval.stack) = p->cmdarg_stack;
+                      p->cmdarg_stack = 0;
+                    ;}
+    break;
+
+  case 271:
+
+/* Line 1464 of yacc.c  */
+#line 2065 "src/parse.y"
+    {
+                      p->cmdarg_stack = (yyvsp[(2) - (4)].stack);
+                      (yyval.nd) = (yyvsp[(3) - (4)].nd);
+                    ;}
+    break;
+
+  case 272:
+
+/* Line 1464 of yacc.c  */
+#line 2070 "src/parse.y"
+    {
+                      (yyval.stack) = p->cmdarg_stack;
+                      p->cmdarg_stack = 0;
+                    ;}
+    break;
+
+  case 273:
+
+/* Line 1464 of yacc.c  */
+#line 2074 "src/parse.y"
+    {p->lstate = EXPR_ENDARG;;}
+    break;
+
+  case 274:
+
+/* Line 1464 of yacc.c  */
+#line 2075 "src/parse.y"
+    {
+                      p->cmdarg_stack = (yyvsp[(2) - (5)].stack);
+                      (yyval.nd) = (yyvsp[(3) - (5)].nd);
+                    ;}
+    break;
+
+  case 275:
+
+/* Line 1464 of yacc.c  */
+#line 2079 "src/parse.y"
+    {p->lstate = EXPR_ENDARG;;}
+    break;
+
+  case 276:
+
+/* Line 1464 of yacc.c  */
+#line 2080 "src/parse.y"
+    {
+                      (yyval.nd) = 0;
+                    ;}
+    break;
+
+  case 277:
+
+/* Line 1464 of yacc.c  */
+#line 2084 "src/parse.y"
+    {
+                      (yyval.nd) = (yyvsp[(2) - (3)].nd);
+                    ;}
+    break;
+
+  case 278:
+
+/* Line 1464 of yacc.c  */
+#line 2088 "src/parse.y"
+    {
+                      (yyval.nd) = new_colon2(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].id));
+                    ;}
+    break;
+
+  case 279:
+
+/* Line 1464 of yacc.c  */
+#line 2092 "src/parse.y"
+    {
+                      (yyval.nd) = new_colon3(p, (yyvsp[(2) - (2)].id));
+                    ;}
+    break;
+
+  case 280:
+
+/* Line 1464 of yacc.c  */
+#line 2096 "src/parse.y"
+    {
+                      (yyval.nd) = new_array(p, (yyvsp[(2) - (3)].nd));
+                      NODE_LINENO((yyval.nd), (yyvsp[(2) - (3)].nd));
+                    ;}
+    break;
+
+  case 281:
+
+/* Line 1464 of yacc.c  */
+#line 2101 "src/parse.y"
+    {
+                      (yyval.nd) = new_hash(p, (yyvsp[(2) - (3)].nd));
+                      NODE_LINENO((yyval.nd), (yyvsp[(2) - (3)].nd));
+                    ;}
+    break;
+
+  case 282:
+
+/* Line 1464 of yacc.c  */
+#line 2106 "src/parse.y"
+    {
+                      (yyval.nd) = new_return(p, 0);
+                    ;}
+    break;
+
+  case 283:
+
+/* Line 1464 of yacc.c  */
+#line 2110 "src/parse.y"
+    {
+                      (yyval.nd) = new_yield(p, (yyvsp[(3) - (4)].nd));
+                    ;}
+    break;
+
+  case 284:
+
+/* Line 1464 of yacc.c  */
+#line 2114 "src/parse.y"
+    {
+                      (yyval.nd) = new_yield(p, 0);
+                    ;}
+    break;
+
+  case 285:
+
+/* Line 1464 of yacc.c  */
+#line 2118 "src/parse.y"
+    {
+                      (yyval.nd) = new_yield(p, 0);
+                    ;}
+    break;
+
+  case 286:
+
+/* Line 1464 of yacc.c  */
+#line 2122 "src/parse.y"
+    {
+                      (yyval.nd) = call_uni_op(p, cond((yyvsp[(3) - (4)].nd)), "!");
+                    ;}
+    break;
+
+  case 287:
+
+/* Line 1464 of yacc.c  */
+#line 2126 "src/parse.y"
+    {
+                      (yyval.nd) = call_uni_op(p, new_nil(p), "!");
+                    ;}
+    break;
+
+  case 288:
+
+/* Line 1464 of yacc.c  */
+#line 2130 "src/parse.y"
+    {
+                      (yyval.nd) = new_fcall(p, (yyvsp[(1) - (2)].id), cons(0, (yyvsp[(2) - (2)].nd)));
+                    ;}
+    break;
+
+  case 290:
+
+/* Line 1464 of yacc.c  */
+#line 2135 "src/parse.y"
+    {
+                      call_with_block(p, (yyvsp[(1) - (2)].nd), (yyvsp[(2) - (2)].nd));
+                      (yyval.nd) = (yyvsp[(1) - (2)].nd);
+                    ;}
+    break;
+
+  case 291:
+
+/* Line 1464 of yacc.c  */
+#line 2140 "src/parse.y"
+    {
+                      local_nest(p);
+                      (yyval.num) = p->lpar_beg;
+                      p->lpar_beg = ++p->paren_nest;
+                    ;}
+    break;
+
+  case 292:
+
+/* Line 1464 of yacc.c  */
+#line 2147 "src/parse.y"
+    {
+                      p->lpar_beg = (yyvsp[(2) - (4)].num);
+                      (yyval.nd) = new_lambda(p, (yyvsp[(3) - (4)].nd), (yyvsp[(4) - (4)].nd));
+                      local_unnest(p);
+                    ;}
+    break;
+
+  case 293:
+
+/* Line 1464 of yacc.c  */
+#line 2156 "src/parse.y"
+    {
+                      (yyval.nd) = new_if(p, cond((yyvsp[(2) - (6)].nd)), (yyvsp[(4) - (6)].nd), (yyvsp[(5) - (6)].nd));
+                      SET_LINENO((yyval.nd), (yyvsp[(1) - (6)].num));
+                    ;}
+    break;
+
+  case 294:
+
+/* Line 1464 of yacc.c  */
+#line 2164 "src/parse.y"
+    {
+                      (yyval.nd) = new_unless(p, cond((yyvsp[(2) - (6)].nd)), (yyvsp[(4) - (6)].nd), (yyvsp[(5) - (6)].nd));
+                      SET_LINENO((yyval.nd), (yyvsp[(1) - (6)].num));
+                    ;}
+    break;
+
+  case 295:
+
+/* Line 1464 of yacc.c  */
+#line 2168 "src/parse.y"
+    {COND_PUSH(1);;}
+    break;
+
+  case 296:
+
+/* Line 1464 of yacc.c  */
+#line 2168 "src/parse.y"
+    {COND_POP();;}
+    break;
+
+  case 297:
+
+/* Line 1464 of yacc.c  */
+#line 2171 "src/parse.y"
+    {
+                      (yyval.nd) = new_while(p, cond((yyvsp[(3) - (7)].nd)), (yyvsp[(6) - (7)].nd));
+                      SET_LINENO((yyval.nd), (yyvsp[(1) - (7)].num));
+                    ;}
+    break;
+
+  case 298:
+
+/* Line 1464 of yacc.c  */
+#line 2175 "src/parse.y"
+    {COND_PUSH(1);;}
+    break;
+
+  case 299:
+
+/* Line 1464 of yacc.c  */
+#line 2175 "src/parse.y"
+    {COND_POP();;}
+    break;
+
+  case 300:
+
+/* Line 1464 of yacc.c  */
+#line 2178 "src/parse.y"
+    {
+                      (yyval.nd) = new_until(p, cond((yyvsp[(3) - (7)].nd)), (yyvsp[(6) - (7)].nd));
+                      SET_LINENO((yyval.nd), (yyvsp[(1) - (7)].num));
+                    ;}
+    break;
+
+  case 301:
+
+/* Line 1464 of yacc.c  */
+#line 2185 "src/parse.y"
+    {
+                      (yyval.nd) = new_case(p, (yyvsp[(2) - (5)].nd), (yyvsp[(4) - (5)].nd));
+                    ;}
+    break;
+
+  case 302:
+
+/* Line 1464 of yacc.c  */
+#line 2189 "src/parse.y"
+    {
+                      (yyval.nd) = new_case(p, 0, (yyvsp[(3) - (4)].nd));
+                    ;}
+    break;
+
+  case 303:
+
+/* Line 1464 of yacc.c  */
+#line 2193 "src/parse.y"
+    {COND_PUSH(1);;}
+    break;
+
+  case 304:
+
+/* Line 1464 of yacc.c  */
+#line 2195 "src/parse.y"
+    {COND_POP();;}
+    break;
+
+  case 305:
+
+/* Line 1464 of yacc.c  */
+#line 2198 "src/parse.y"
+    {
+                      (yyval.nd) = new_for(p, (yyvsp[(2) - (9)].nd), (yyvsp[(5) - (9)].nd), (yyvsp[(8) - (9)].nd));
+                      SET_LINENO((yyval.nd), (yyvsp[(1) - (9)].num));
+                    ;}
+    break;
+
+  case 306:
+
+/* Line 1464 of yacc.c  */
+#line 2204 "src/parse.y"
+    {
+                      if (p->in_def || p->in_single)
+                        yyerror(p, "class definition in method body");
+                      (yyval.nd) = local_switch(p);
+                    ;}
+    break;
+
+  case 307:
+
+/* Line 1464 of yacc.c  */
+#line 2211 "src/parse.y"
+    {
+                      (yyval.nd) = new_class(p, (yyvsp[(2) - (6)].nd), (yyvsp[(3) - (6)].nd), (yyvsp[(5) - (6)].nd));
+                      SET_LINENO((yyval.nd), (yyvsp[(1) - (6)].num));
+                      local_resume(p, (yyvsp[(4) - (6)].nd));
+                    ;}
+    break;
+
+  case 308:
+
+/* Line 1464 of yacc.c  */
+#line 2218 "src/parse.y"
+    {
+                      (yyval.num) = p->in_def;
+                      p->in_def = 0;
+                    ;}
+    break;
+
+  case 309:
+
+/* Line 1464 of yacc.c  */
+#line 2223 "src/parse.y"
+    {
+                      (yyval.nd) = cons(local_switch(p), (node*)(intptr_t)p->in_single);
+                      p->in_single = 0;
+                    ;}
+    break;
+
+  case 310:
+
+/* Line 1464 of yacc.c  */
+#line 2229 "src/parse.y"
+    {
+                      (yyval.nd) = new_sclass(p, (yyvsp[(3) - (8)].nd), (yyvsp[(7) - (8)].nd));
+                      SET_LINENO((yyval.nd), (yyvsp[(1) - (8)].num));
+                      local_resume(p, (yyvsp[(6) - (8)].nd)->car);
+                      p->in_def = (yyvsp[(4) - (8)].num);
+                      p->in_single = (int)(intptr_t)(yyvsp[(6) - (8)].nd)->cdr;
+                    ;}
+    break;
+
+  case 311:
+
+/* Line 1464 of yacc.c  */
+#line 2238 "src/parse.y"
+    {
+                      if (p->in_def || p->in_single)
+                        yyerror(p, "module definition in method body");
+                      (yyval.nd) = local_switch(p);
+                    ;}
+    break;
+
+  case 312:
+
+/* Line 1464 of yacc.c  */
+#line 2245 "src/parse.y"
+    {
+                      (yyval.nd) = new_module(p, (yyvsp[(2) - (5)].nd), (yyvsp[(4) - (5)].nd));
+                      SET_LINENO((yyval.nd), (yyvsp[(1) - (5)].num));
+                      local_resume(p, (yyvsp[(3) - (5)].nd));
+                    ;}
+    break;
+
+  case 313:
+
+/* Line 1464 of yacc.c  */
+#line 2251 "src/parse.y"
+    {
+                      (yyval.stack) = p->cmdarg_stack;
+                      p->cmdarg_stack = 0;
+                    ;}
+    break;
+
+  case 314:
+
+/* Line 1464 of yacc.c  */
+#line 2255 "src/parse.y"
+    {
+                      p->in_def++;
+                      (yyval.nd) = local_switch(p);
+                    ;}
+    break;
+
+  case 315:
+
+/* Line 1464 of yacc.c  */
+#line 2262 "src/parse.y"
+    {
+                      (yyval.nd) = new_def(p, (yyvsp[(2) - (7)].id), (yyvsp[(5) - (7)].nd), (yyvsp[(6) - (7)].nd));
+                      SET_LINENO((yyval.nd), (yyvsp[(1) - (7)].num));
+                      local_resume(p, (yyvsp[(4) - (7)].nd));
+                      p->in_def--;
+                      p->cmdarg_stack = (yyvsp[(3) - (7)].stack);
+                    ;}
+    break;
+
+  case 316:
+
+/* Line 1464 of yacc.c  */
+#line 2270 "src/parse.y"
+    {
+                      p->lstate = EXPR_FNAME;
+                      (yyval.stack) = p->cmdarg_stack;
+                      p->cmdarg_stack = 0;
+                    ;}
+    break;
+
+  case 317:
+
+/* Line 1464 of yacc.c  */
+#line 2276 "src/parse.y"
+    {
+                      p->in_single++;
+                      p->lstate = EXPR_ENDFN; /* force for args */
+                      (yyval.nd) = local_switch(p);
+                    ;}
+    break;
+
+  case 318:
+
+/* Line 1464 of yacc.c  */
+#line 2284 "src/parse.y"
+    {
+                      (yyval.nd) = new_sdef(p, (yyvsp[(2) - (9)].nd), (yyvsp[(5) - (9)].id), (yyvsp[(7) - (9)].nd), (yyvsp[(8) - (9)].nd));
+                      SET_LINENO((yyval.nd), (yyvsp[(1) - (9)].num));
+                      local_resume(p, (yyvsp[(6) - (9)].nd));
+                      p->in_single--;
+                      p->cmdarg_stack = (yyvsp[(4) - (9)].stack);
+                    ;}
+    break;
+
+  case 319:
+
+/* Line 1464 of yacc.c  */
+#line 2292 "src/parse.y"
+    {
+                      (yyval.nd) = new_break(p, 0);
+                    ;}
+    break;
+
+  case 320:
+
+/* Line 1464 of yacc.c  */
+#line 2296 "src/parse.y"
+    {
+                      (yyval.nd) = new_next(p, 0);
+                    ;}
+    break;
+
+  case 321:
+
+/* Line 1464 of yacc.c  */
+#line 2300 "src/parse.y"
+    {
+                      (yyval.nd) = new_redo(p);
+                    ;}
+    break;
+
+  case 322:
+
+/* Line 1464 of yacc.c  */
+#line 2304 "src/parse.y"
+    {
+                      (yyval.nd) = new_retry(p);
+                    ;}
+    break;
+
+  case 323:
+
+/* Line 1464 of yacc.c  */
+#line 2310 "src/parse.y"
+    {
+                      (yyval.nd) = (yyvsp[(1) - (1)].nd);
+                      if (!(yyval.nd)) (yyval.nd) = new_nil(p);
+                    ;}
+    break;
+
+  case 330:
+
+/* Line 1464 of yacc.c  */
+#line 2329 "src/parse.y"
+    {
+                      (yyval.nd) = new_if(p, cond((yyvsp[(2) - (5)].nd)), (yyvsp[(4) - (5)].nd), (yyvsp[(5) - (5)].nd));
+                    ;}
+    break;
+
+  case 332:
+
+/* Line 1464 of yacc.c  */
+#line 2336 "src/parse.y"
+    {
+                      (yyval.nd) = (yyvsp[(2) - (2)].nd);
+                    ;}
+    break;
+
+  case 333:
+
+/* Line 1464 of yacc.c  */
+#line 2342 "src/parse.y"
+    {
+                      (yyval.nd) = list1(list1((yyvsp[(1) - (1)].nd)));
+                    ;}
+    break;
+
+  case 335:
+
+/* Line 1464 of yacc.c  */
+#line 2349 "src/parse.y"
+    {
+                      (yyval.nd) = new_arg(p, (yyvsp[(1) - (1)].id));
+                    ;}
+    break;
+
+  case 336:
+
+/* Line 1464 of yacc.c  */
+#line 2353 "src/parse.y"
+    {
+                      (yyval.nd) = new_masgn(p, (yyvsp[(2) - (3)].nd), 0);
+                    ;}
+    break;
+
+  case 337:
+
+/* Line 1464 of yacc.c  */
+#line 2359 "src/parse.y"
+    {
+                      (yyval.nd) = list1((yyvsp[(1) - (1)].nd));
+                    ;}
+    break;
+
+  case 338:
+
+/* Line 1464 of yacc.c  */
+#line 2363 "src/parse.y"
+    {
+                      (yyval.nd) = push((yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 339:
+
+/* Line 1464 of yacc.c  */
+#line 2369 "src/parse.y"
+    {
+                      (yyval.nd) = list3((yyvsp[(1) - (1)].nd),0,0);
+                    ;}
+    break;
+
+  case 340:
+
+/* Line 1464 of yacc.c  */
+#line 2373 "src/parse.y"
+    {
+                      (yyval.nd) = list3((yyvsp[(1) - (4)].nd), new_arg(p, (yyvsp[(4) - (4)].id)), 0);
+                    ;}
+    break;
+
+  case 341:
+
+/* Line 1464 of yacc.c  */
+#line 2377 "src/parse.y"
+    {
+                      (yyval.nd) = list3((yyvsp[(1) - (6)].nd), new_arg(p, (yyvsp[(4) - (6)].id)), (yyvsp[(6) - (6)].nd));
+                    ;}
+    break;
+
+  case 342:
+
+/* Line 1464 of yacc.c  */
+#line 2381 "src/parse.y"
+    {
+                      (yyval.nd) = list3((yyvsp[(1) - (3)].nd), (node*)-1, 0);
+                    ;}
+    break;
+
+  case 343:
+
+/* Line 1464 of yacc.c  */
+#line 2385 "src/parse.y"
+    {
+                      (yyval.nd) = list3((yyvsp[(1) - (5)].nd), (node*)-1, (yyvsp[(5) - (5)].nd));
+                    ;}
+    break;
+
+  case 344:
+
+/* Line 1464 of yacc.c  */
+#line 2389 "src/parse.y"
+    {
+                      (yyval.nd) = list3(0, new_arg(p, (yyvsp[(2) - (2)].id)), 0);
+                    ;}
+    break;
+
+  case 345:
+
+/* Line 1464 of yacc.c  */
+#line 2393 "src/parse.y"
+    {
+                      (yyval.nd) = list3(0, new_arg(p, (yyvsp[(2) - (4)].id)), (yyvsp[(4) - (4)].nd));
+                    ;}
+    break;
+
+  case 346:
+
+/* Line 1464 of yacc.c  */
+#line 2397 "src/parse.y"
+    {
+                      (yyval.nd) = list3(0, (node*)-1, 0);
+                    ;}
+    break;
+
+  case 347:
+
+/* Line 1464 of yacc.c  */
+#line 2401 "src/parse.y"
+    {
+                      (yyval.nd) = list3(0, (node*)-1, (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 348:
+
+/* Line 1464 of yacc.c  */
+#line 2407 "src/parse.y"
+    {
+                      (yyval.nd) = new_args(p, (yyvsp[(1) - (6)].nd), (yyvsp[(3) - (6)].nd), (yyvsp[(5) - (6)].id), 0, (yyvsp[(6) - (6)].id));
+                    ;}
+    break;
+
+  case 349:
+
+/* Line 1464 of yacc.c  */
+#line 2411 "src/parse.y"
+    {
+                      (yyval.nd) = new_args(p, (yyvsp[(1) - (8)].nd), (yyvsp[(3) - (8)].nd), (yyvsp[(5) - (8)].id), (yyvsp[(7) - (8)].nd), (yyvsp[(8) - (8)].id));
+                    ;}
+    break;
+
+  case 350:
+
+/* Line 1464 of yacc.c  */
+#line 2415 "src/parse.y"
+    {
+                      (yyval.nd) = new_args(p, (yyvsp[(1) - (4)].nd), (yyvsp[(3) - (4)].nd), 0, 0, (yyvsp[(4) - (4)].id));
+                    ;}
+    break;
+
+  case 351:
+
+/* Line 1464 of yacc.c  */
+#line 2419 "src/parse.y"
+    {
+                      (yyval.nd) = new_args(p, (yyvsp[(1) - (6)].nd), (yyvsp[(3) - (6)].nd), 0, (yyvsp[(5) - (6)].nd), (yyvsp[(6) - (6)].id));
+                    ;}
+    break;
+
+  case 352:
+
+/* Line 1464 of yacc.c  */
+#line 2423 "src/parse.y"
+    {
+                      (yyval.nd) = new_args(p, (yyvsp[(1) - (4)].nd), 0, (yyvsp[(3) - (4)].id), 0, (yyvsp[(4) - (4)].id));
+                    ;}
+    break;
+
+  case 353:
+
+/* Line 1464 of yacc.c  */
+#line 2427 "src/parse.y"
+    {
+                      (yyval.nd) = new_args(p, (yyvsp[(1) - (2)].nd), 0, 1, 0, 0);
+                    ;}
+    break;
+
+  case 354:
+
+/* Line 1464 of yacc.c  */
+#line 2431 "src/parse.y"
+    {
+                      (yyval.nd) = new_args(p, (yyvsp[(1) - (6)].nd), 0, (yyvsp[(3) - (6)].id), (yyvsp[(5) - (6)].nd), (yyvsp[(6) - (6)].id));
+                    ;}
+    break;
+
+  case 355:
+
+/* Line 1464 of yacc.c  */
+#line 2435 "src/parse.y"
+    {
+                      (yyval.nd) = new_args(p, (yyvsp[(1) - (2)].nd), 0, 0, 0, (yyvsp[(2) - (2)].id));
+                    ;}
+    break;
+
+  case 356:
+
+/* Line 1464 of yacc.c  */
+#line 2439 "src/parse.y"
+    {
+                      (yyval.nd) = new_args(p, 0, (yyvsp[(1) - (4)].nd), (yyvsp[(3) - (4)].id), 0, (yyvsp[(4) - (4)].id));
+                    ;}
+    break;
+
+  case 357:
+
+/* Line 1464 of yacc.c  */
+#line 2443 "src/parse.y"
+    {
+                      (yyval.nd) = new_args(p, 0, (yyvsp[(1) - (6)].nd), (yyvsp[(3) - (6)].id), (yyvsp[(5) - (6)].nd), (yyvsp[(6) - (6)].id));
+                    ;}
+    break;
+
+  case 358:
+
+/* Line 1464 of yacc.c  */
+#line 2447 "src/parse.y"
+    {
+                      (yyval.nd) = new_args(p, 0, (yyvsp[(1) - (2)].nd), 0, 0, (yyvsp[(2) - (2)].id));
+                    ;}
+    break;
+
+  case 359:
+
+/* Line 1464 of yacc.c  */
+#line 2451 "src/parse.y"
+    {
+                      (yyval.nd) = new_args(p, 0, (yyvsp[(1) - (4)].nd), 0, (yyvsp[(3) - (4)].nd), (yyvsp[(4) - (4)].id));
+                    ;}
+    break;
+
+  case 360:
+
+/* Line 1464 of yacc.c  */
+#line 2455 "src/parse.y"
+    {
+                      (yyval.nd) = new_args(p, 0, 0, (yyvsp[(1) - (2)].id), 0, (yyvsp[(2) - (2)].id));
+                    ;}
+    break;
+
+  case 361:
+
+/* Line 1464 of yacc.c  */
+#line 2459 "src/parse.y"
+    {
+                      (yyval.nd) = new_args(p, 0, 0, (yyvsp[(1) - (4)].id), (yyvsp[(3) - (4)].nd), (yyvsp[(4) - (4)].id));
+                    ;}
+    break;
+
+  case 362:
+
+/* Line 1464 of yacc.c  */
+#line 2463 "src/parse.y"
+    {
+                      (yyval.nd) = new_args(p, 0, 0, 0, 0, (yyvsp[(1) - (1)].id));
+                    ;}
+    break;
+
+  case 364:
+
+/* Line 1464 of yacc.c  */
+#line 2470 "src/parse.y"
+    {
+                      p->cmd_start = TRUE;
+                      (yyval.nd) = (yyvsp[(1) - (1)].nd);
+                    ;}
+    break;
+
+  case 365:
+
+/* Line 1464 of yacc.c  */
+#line 2477 "src/parse.y"
+    {
+                      (yyval.nd) = 0;
+                    ;}
+    break;
+
+  case 366:
+
+/* Line 1464 of yacc.c  */
+#line 2481 "src/parse.y"
+    {
+                      (yyval.nd) = 0;
+                    ;}
+    break;
+
+  case 367:
+
+/* Line 1464 of yacc.c  */
+#line 2485 "src/parse.y"
+    {
+                      (yyval.nd) = (yyvsp[(2) - (4)].nd);
+                    ;}
+    break;
+
+  case 368:
+
+/* Line 1464 of yacc.c  */
+#line 2492 "src/parse.y"
+    {
+                      (yyval.nd) = 0;
+                    ;}
+    break;
+
+  case 369:
+
+/* Line 1464 of yacc.c  */
+#line 2496 "src/parse.y"
+    {
+                      (yyval.nd) = 0;
+                    ;}
+    break;
+
+  case 372:
+
+/* Line 1464 of yacc.c  */
+#line 2506 "src/parse.y"
+    {
+                      local_add_f(p, (yyvsp[(1) - (1)].id));
+                      new_bv(p, (yyvsp[(1) - (1)].id));
+                    ;}
+    break;
+
+  case 374:
+
+/* Line 1464 of yacc.c  */
+#line 2514 "src/parse.y"
+    {
+                      (yyval.nd) = (yyvsp[(2) - (4)].nd);
+                    ;}
+    break;
+
+  case 375:
+
+/* Line 1464 of yacc.c  */
+#line 2518 "src/parse.y"
+    {
+                      (yyval.nd) = (yyvsp[(1) - (1)].nd);
+                    ;}
+    break;
+
+  case 376:
+
+/* Line 1464 of yacc.c  */
+#line 2524 "src/parse.y"
+    {
+                      (yyval.nd) = (yyvsp[(2) - (3)].nd);
+                    ;}
+    break;
+
+  case 377:
+
+/* Line 1464 of yacc.c  */
+#line 2528 "src/parse.y"
+    {
+                      (yyval.nd) = (yyvsp[(2) - (3)].nd);
+                    ;}
+    break;
+
+  case 378:
+
+/* Line 1464 of yacc.c  */
+#line 2534 "src/parse.y"
+    {
+                      local_nest(p);
+                    ;}
+    break;
+
+  case 379:
+
+/* Line 1464 of yacc.c  */
+#line 2540 "src/parse.y"
+    {
+                      (yyval.nd) = new_block(p,(yyvsp[(3) - (5)].nd),(yyvsp[(4) - (5)].nd));
+                      local_unnest(p);
+                    ;}
+    break;
+
+  case 380:
+
+/* Line 1464 of yacc.c  */
+#line 2547 "src/parse.y"
+    {
+                      if ((yyvsp[(1) - (2)].nd)->car == (node*)NODE_YIELD) {
+                        yyerror(p, "block given to yield");
+                      }
+                      else {
+                        call_with_block(p, (yyvsp[(1) - (2)].nd), (yyvsp[(2) - (2)].nd));
+                      }
+                      (yyval.nd) = (yyvsp[(1) - (2)].nd);
+                    ;}
+    break;
+
+  case 381:
+
+/* Line 1464 of yacc.c  */
+#line 2557 "src/parse.y"
+    {
+                      (yyval.nd) = new_call(p, (yyvsp[(1) - (4)].nd), (yyvsp[(3) - (4)].id), (yyvsp[(4) - (4)].nd));
+                    ;}
+    break;
+
+  case 382:
+
+/* Line 1464 of yacc.c  */
+#line 2561 "src/parse.y"
+    {
+                      (yyval.nd) = new_call(p, (yyvsp[(1) - (5)].nd), (yyvsp[(3) - (5)].id), (yyvsp[(4) - (5)].nd));
+                      call_with_block(p, (yyval.nd), (yyvsp[(5) - (5)].nd));
+                    ;}
+    break;
+
+  case 383:
+
+/* Line 1464 of yacc.c  */
+#line 2566 "src/parse.y"
+    {
+                      (yyval.nd) = new_call(p, (yyvsp[(1) - (5)].nd), (yyvsp[(3) - (5)].id), (yyvsp[(4) - (5)].nd));
+                      call_with_block(p, (yyval.nd), (yyvsp[(5) - (5)].nd));
+                    ;}
+    break;
+
+  case 384:
+
+/* Line 1464 of yacc.c  */
+#line 2573 "src/parse.y"
+    {
+                      (yyval.nd) = new_fcall(p, (yyvsp[(1) - (2)].id), (yyvsp[(2) - (2)].nd));
+                    ;}
+    break;
+
+  case 385:
+
+/* Line 1464 of yacc.c  */
+#line 2577 "src/parse.y"
+    {
+                      (yyval.nd) = new_call(p, (yyvsp[(1) - (4)].nd), (yyvsp[(3) - (4)].id), (yyvsp[(4) - (4)].nd));
+                    ;}
+    break;
+
+  case 386:
+
+/* Line 1464 of yacc.c  */
+#line 2581 "src/parse.y"
+    {
+                      (yyval.nd) = new_call(p, (yyvsp[(1) - (4)].nd), (yyvsp[(3) - (4)].id), (yyvsp[(4) - (4)].nd));
+                    ;}
+    break;
+
+  case 387:
+
+/* Line 1464 of yacc.c  */
+#line 2585 "src/parse.y"
+    {
+                      (yyval.nd) = new_call(p, (yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].id), 0);
+                    ;}
+    break;
+
+  case 388:
+
+/* Line 1464 of yacc.c  */
+#line 2589 "src/parse.y"
+    {
+                      (yyval.nd) = new_call(p, (yyvsp[(1) - (3)].nd), intern("call",4), (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 389:
+
+/* Line 1464 of yacc.c  */
+#line 2593 "src/parse.y"
+    {
+                      (yyval.nd) = new_call(p, (yyvsp[(1) - (3)].nd), intern("call",4), (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 390:
+
+/* Line 1464 of yacc.c  */
+#line 2597 "src/parse.y"
+    {
+                      (yyval.nd) = new_super(p, (yyvsp[(2) - (2)].nd));
+                    ;}
+    break;
+
+  case 391:
+
+/* Line 1464 of yacc.c  */
+#line 2601 "src/parse.y"
+    {
+                      (yyval.nd) = new_zsuper(p);
+                    ;}
+    break;
+
+  case 392:
+
+/* Line 1464 of yacc.c  */
+#line 2605 "src/parse.y"
+    {
+                      (yyval.nd) = new_call(p, (yyvsp[(1) - (4)].nd), intern("[]",2), (yyvsp[(3) - (4)].nd));
+                    ;}
+    break;
+
+  case 393:
+
+/* Line 1464 of yacc.c  */
+#line 2611 "src/parse.y"
+    {
+                      local_nest(p);
+                      (yyval.num) = p->lineno;
+                    ;}
+    break;
+
+  case 394:
+
+/* Line 1464 of yacc.c  */
+#line 2617 "src/parse.y"
+    {
+                      (yyval.nd) = new_block(p,(yyvsp[(3) - (5)].nd),(yyvsp[(4) - (5)].nd));
+                      SET_LINENO((yyval.nd), (yyvsp[(2) - (5)].num));
+                      local_unnest(p);
+                    ;}
+    break;
+
+  case 395:
+
+/* Line 1464 of yacc.c  */
+#line 2623 "src/parse.y"
+    {
+                      local_nest(p);
+                      (yyval.num) = p->lineno;
+                    ;}
+    break;
+
+  case 396:
+
+/* Line 1464 of yacc.c  */
+#line 2629 "src/parse.y"
+    {
+                      (yyval.nd) = new_block(p,(yyvsp[(3) - (5)].nd),(yyvsp[(4) - (5)].nd));
+                      SET_LINENO((yyval.nd), (yyvsp[(2) - (5)].num));
+                      local_unnest(p);
+                    ;}
+    break;
+
+  case 397:
+
+/* Line 1464 of yacc.c  */
+#line 2639 "src/parse.y"
+    {
+                      (yyval.nd) = cons(cons((yyvsp[(2) - (5)].nd), (yyvsp[(4) - (5)].nd)), (yyvsp[(5) - (5)].nd));
+                    ;}
+    break;
+
+  case 398:
+
+/* Line 1464 of yacc.c  */
+#line 2645 "src/parse.y"
+    {
+                      if ((yyvsp[(1) - (1)].nd)) {
+                        (yyval.nd) = cons(cons(0, (yyvsp[(1) - (1)].nd)), 0);
+                      }
+                      else {
+                        (yyval.nd) = 0;
+                      }
+                    ;}
+    break;
+
+  case 400:
+
+/* Line 1464 of yacc.c  */
+#line 2659 "src/parse.y"
+    {
+                      (yyval.nd) = list1(list3((yyvsp[(2) - (6)].nd), (yyvsp[(3) - (6)].nd), (yyvsp[(5) - (6)].nd)));
+                      if ((yyvsp[(6) - (6)].nd)) (yyval.nd) = append((yyval.nd), (yyvsp[(6) - (6)].nd));
+                    ;}
+    break;
+
+  case 402:
+
+/* Line 1464 of yacc.c  */
+#line 2667 "src/parse.y"
+    {
+                        (yyval.nd) = list1((yyvsp[(1) - (1)].nd));
+                    ;}
+    break;
+
+  case 405:
+
+/* Line 1464 of yacc.c  */
+#line 2675 "src/parse.y"
+    {
+                      (yyval.nd) = (yyvsp[(2) - (2)].nd);
+                    ;}
+    break;
+
+  case 407:
+
+/* Line 1464 of yacc.c  */
+#line 2682 "src/parse.y"
+    {
+                      (yyval.nd) = (yyvsp[(2) - (2)].nd);
+                    ;}
+    break;
+
+  case 415:
+
+/* Line 1464 of yacc.c  */
+#line 2697 "src/parse.y"
+    {
+                      (yyval.nd) = (yyvsp[(2) - (2)].nd);
+                    ;}
+    break;
+
+  case 416:
+
+/* Line 1464 of yacc.c  */
+#line 2701 "src/parse.y"
+    {
+                      (yyval.nd) = new_dstr(p, push((yyvsp[(2) - (3)].nd), (yyvsp[(3) - (3)].nd)));
+                    ;}
+    break;
+
+  case 418:
+
+/* Line 1464 of yacc.c  */
+#line 2708 "src/parse.y"
+    {
+                      (yyval.nd) = append((yyvsp[(1) - (2)].nd), (yyvsp[(2) - (2)].nd));
+                    ;}
+    break;
+
+  case 419:
+
+/* Line 1464 of yacc.c  */
+#line 2714 "src/parse.y"
+    {
+                      (yyval.nd) = list1((yyvsp[(1) - (1)].nd));
+                    ;}
+    break;
+
+  case 420:
+
+/* Line 1464 of yacc.c  */
+#line 2718 "src/parse.y"
+    {
+                      (yyval.nd) = p->lex_strterm;
+                      p->lex_strterm = NULL;
+                    ;}
+    break;
+
+  case 421:
+
+/* Line 1464 of yacc.c  */
+#line 2724 "src/parse.y"
+    {
+                      p->lex_strterm = (yyvsp[(2) - (4)].nd);
+                      (yyval.nd) = list2((yyvsp[(1) - (4)].nd), (yyvsp[(3) - (4)].nd));
+                    ;}
+    break;
+
+  case 422:
+
+/* Line 1464 of yacc.c  */
+#line 2729 "src/parse.y"
+    {
+                      (yyval.nd) = list1(new_literal_delim(p));
+                    ;}
+    break;
+
+  case 423:
+
+/* Line 1464 of yacc.c  */
+#line 2733 "src/parse.y"
+    {
+                      (yyval.nd) = list1(new_literal_delim(p));
+                    ;}
+    break;
+
+  case 424:
+
+/* Line 1464 of yacc.c  */
+#line 2739 "src/parse.y"
+    {
+                        (yyval.nd) = (yyvsp[(2) - (2)].nd);
+                    ;}
+    break;
+
+  case 425:
+
+/* Line 1464 of yacc.c  */
+#line 2743 "src/parse.y"
+    {
+                      (yyval.nd) = new_dxstr(p, push((yyvsp[(2) - (3)].nd), (yyvsp[(3) - (3)].nd)));
+                    ;}
+    break;
+
+  case 426:
+
+/* Line 1464 of yacc.c  */
+#line 2749 "src/parse.y"
+    {
+                        (yyval.nd) = (yyvsp[(2) - (2)].nd);
+                    ;}
+    break;
+
+  case 427:
+
+/* Line 1464 of yacc.c  */
+#line 2753 "src/parse.y"
+    {
+                      (yyval.nd) = new_dregx(p, (yyvsp[(2) - (3)].nd), (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 433:
+
+/* Line 1464 of yacc.c  */
+#line 2770 "src/parse.y"
+    {
+                      parser_heredoc_info * inf = parsing_heredoc_inf(p);
+                      inf->doc = push(inf->doc, new_str(p, "", 0));
+                      heredoc_end(p);
+                    ;}
+    break;
+
+  case 434:
+
+/* Line 1464 of yacc.c  */
+#line 2776 "src/parse.y"
+    {
+                      heredoc_end(p);
+                    ;}
+    break;
+
+  case 437:
+
+/* Line 1464 of yacc.c  */
+#line 2786 "src/parse.y"
+    {
+                      parser_heredoc_info * inf = parsing_heredoc_inf(p);
+                      inf->doc = push(inf->doc, (yyvsp[(1) - (1)].nd));
+                      heredoc_treat_nextline(p);
+                    ;}
+    break;
+
+  case 438:
+
+/* Line 1464 of yacc.c  */
+#line 2792 "src/parse.y"
+    {
+                      (yyval.nd) = p->lex_strterm;
+                      p->lex_strterm = NULL;
+                    ;}
+    break;
+
+  case 439:
+
+/* Line 1464 of yacc.c  */
+#line 2798 "src/parse.y"
+    {
+                      parser_heredoc_info * inf = parsing_heredoc_inf(p);
+                      p->lex_strterm = (yyvsp[(2) - (4)].nd);
+                      inf->doc = push(push(inf->doc, (yyvsp[(1) - (4)].nd)), (yyvsp[(3) - (4)].nd));
+                    ;}
+    break;
+
+  case 440:
+
+/* Line 1464 of yacc.c  */
+#line 2806 "src/parse.y"
+    {
+                      (yyval.nd) = new_words(p, list1((yyvsp[(2) - (2)].nd)));
+                    ;}
+    break;
+
+  case 441:
+
+/* Line 1464 of yacc.c  */
+#line 2810 "src/parse.y"
+    {
+                      (yyval.nd) = new_words(p, push((yyvsp[(2) - (3)].nd), (yyvsp[(3) - (3)].nd)));
+                    ;}
+    break;
+
+  case 442:
+
+/* Line 1464 of yacc.c  */
+#line 2817 "src/parse.y"
+    {
+                      (yyval.nd) = new_sym(p, (yyvsp[(1) - (1)].id));
+                    ;}
+    break;
+
+  case 443:
+
+/* Line 1464 of yacc.c  */
+#line 2821 "src/parse.y"
+    {
+                      p->lstate = EXPR_END;
+                      (yyval.nd) = new_dsym(p, push((yyvsp[(3) - (4)].nd), (yyvsp[(4) - (4)].nd)));
+                    ;}
+    break;
+
+  case 444:
+
+/* Line 1464 of yacc.c  */
+#line 2828 "src/parse.y"
+    {
+                      p->lstate = EXPR_END;
+                      (yyval.id) = (yyvsp[(2) - (2)].id);
+                    ;}
+    break;
+
+  case 449:
+
+/* Line 1464 of yacc.c  */
+#line 2839 "src/parse.y"
+    {
+                      (yyval.id) = new_strsym(p, (yyvsp[(1) - (1)].nd));
+                    ;}
+    break;
+
+  case 450:
+
+/* Line 1464 of yacc.c  */
+#line 2843 "src/parse.y"
+    {
+                      (yyval.id) = new_strsym(p, (yyvsp[(2) - (2)].nd));
+                    ;}
+    break;
+
+  case 451:
+
+/* Line 1464 of yacc.c  */
+#line 2849 "src/parse.y"
+    {
+                      (yyval.nd) = new_symbols(p, list1((yyvsp[(2) - (2)].nd)));
+                    ;}
+    break;
+
+  case 452:
+
+/* Line 1464 of yacc.c  */
+#line 2853 "src/parse.y"
+    {
+                      (yyval.nd) = new_symbols(p, push((yyvsp[(2) - (3)].nd), (yyvsp[(3) - (3)].nd)));
+                    ;}
+    break;
+
+  case 455:
+
+/* Line 1464 of yacc.c  */
+#line 2861 "src/parse.y"
+    {
+                      (yyval.nd) = negate_lit(p, (yyvsp[(2) - (2)].nd));
+                    ;}
+    break;
+
+  case 456:
+
+/* Line 1464 of yacc.c  */
+#line 2865 "src/parse.y"
+    {
+                      (yyval.nd) = negate_lit(p, (yyvsp[(2) - (2)].nd));
+                    ;}
+    break;
+
+  case 457:
+
+/* Line 1464 of yacc.c  */
+#line 2871 "src/parse.y"
+    {
+                      (yyval.nd) = new_lvar(p, (yyvsp[(1) - (1)].id));
+                    ;}
+    break;
+
+  case 458:
+
+/* Line 1464 of yacc.c  */
+#line 2875 "src/parse.y"
+    {
+                      (yyval.nd) = new_ivar(p, (yyvsp[(1) - (1)].id));
+                    ;}
+    break;
+
+  case 459:
+
+/* Line 1464 of yacc.c  */
+#line 2879 "src/parse.y"
+    {
+                      (yyval.nd) = new_gvar(p, (yyvsp[(1) - (1)].id));
+                    ;}
+    break;
+
+  case 460:
+
+/* Line 1464 of yacc.c  */
+#line 2883 "src/parse.y"
+    {
+                      (yyval.nd) = new_cvar(p, (yyvsp[(1) - (1)].id));
+                    ;}
+    break;
+
+  case 461:
+
+/* Line 1464 of yacc.c  */
+#line 2887 "src/parse.y"
+    {
+                      (yyval.nd) = new_const(p, (yyvsp[(1) - (1)].id));
+                    ;}
+    break;
+
+  case 462:
+
+/* Line 1464 of yacc.c  */
+#line 2893 "src/parse.y"
+    {
+                      assignable(p, (yyvsp[(1) - (1)].nd));
+                    ;}
+    break;
+
+  case 463:
+
+/* Line 1464 of yacc.c  */
+#line 2899 "src/parse.y"
+    {
+                      (yyval.nd) = var_reference(p, (yyvsp[(1) - (1)].nd));
+                    ;}
+    break;
+
+  case 464:
+
+/* Line 1464 of yacc.c  */
+#line 2903 "src/parse.y"
+    {
+                      (yyval.nd) = new_nil(p);
+                    ;}
+    break;
+
+  case 465:
+
+/* Line 1464 of yacc.c  */
+#line 2907 "src/parse.y"
+    {
+                      (yyval.nd) = new_self(p);
+                    ;}
+    break;
+
+  case 466:
+
+/* Line 1464 of yacc.c  */
+#line 2911 "src/parse.y"
+    {
+                      (yyval.nd) = new_true(p);
+                    ;}
+    break;
+
+  case 467:
+
+/* Line 1464 of yacc.c  */
+#line 2915 "src/parse.y"
+    {
+                      (yyval.nd) = new_false(p);
+                    ;}
+    break;
+
+  case 468:
+
+/* Line 1464 of yacc.c  */
+#line 2919 "src/parse.y"
+    {
+                      if (!p->filename) {
+                        p->filename = "(null)";
+                      }
+                      (yyval.nd) = new_str(p, p->filename, strlen(p->filename));
+                    ;}
+    break;
+
+  case 469:
+
+/* Line 1464 of yacc.c  */
+#line 2926 "src/parse.y"
+    {
+                      char buf[16];
+
+                      snprintf(buf, sizeof(buf), "%d", p->lineno);
+                      (yyval.nd) = new_int(p, buf, 10);
+                    ;}
+    break;
+
+  case 472:
+
+/* Line 1464 of yacc.c  */
+#line 2939 "src/parse.y"
+    {
+                      (yyval.nd) = 0;
+                    ;}
+    break;
+
+  case 473:
+
+/* Line 1464 of yacc.c  */
+#line 2943 "src/parse.y"
+    {
+                      p->lstate = EXPR_BEG;
+                      p->cmd_start = TRUE;
+                    ;}
+    break;
+
+  case 474:
+
+/* Line 1464 of yacc.c  */
+#line 2948 "src/parse.y"
+    {
+                      (yyval.nd) = (yyvsp[(3) - (4)].nd);
+                    ;}
+    break;
+
+  case 475:
+
+/* Line 1464 of yacc.c  */
+#line 2952 "src/parse.y"
+    {
+                      yyerrok;
+                      (yyval.nd) = 0;
+                    ;}
+    break;
+
+  case 476:
+
+/* Line 1464 of yacc.c  */
+#line 2959 "src/parse.y"
+    {
+                      (yyval.nd) = (yyvsp[(2) - (3)].nd);
+                      p->lstate = EXPR_BEG;
+                      p->cmd_start = TRUE;
+                    ;}
+    break;
+
+  case 477:
+
+/* Line 1464 of yacc.c  */
+#line 2965 "src/parse.y"
+    {
+                      (yyval.nd) = (yyvsp[(1) - (2)].nd);
+                    ;}
+    break;
+
+  case 478:
+
+/* Line 1464 of yacc.c  */
+#line 2971 "src/parse.y"
+    {
+                      (yyval.nd) = new_args(p, (yyvsp[(1) - (6)].nd), (yyvsp[(3) - (6)].nd), (yyvsp[(5) - (6)].id), 0, (yyvsp[(6) - (6)].id));
+                    ;}
+    break;
+
+  case 479:
+
+/* Line 1464 of yacc.c  */
+#line 2975 "src/parse.y"
+    {
+                      (yyval.nd) = new_args(p, (yyvsp[(1) - (8)].nd), (yyvsp[(3) - (8)].nd), (yyvsp[(5) - (8)].id), (yyvsp[(7) - (8)].nd), (yyvsp[(8) - (8)].id));
+                    ;}
+    break;
+
+  case 480:
+
+/* Line 1464 of yacc.c  */
+#line 2979 "src/parse.y"
+    {
+                      (yyval.nd) = new_args(p, (yyvsp[(1) - (4)].nd), (yyvsp[(3) - (4)].nd), 0, 0, (yyvsp[(4) - (4)].id));
+                    ;}
+    break;
+
+  case 481:
+
+/* Line 1464 of yacc.c  */
+#line 2983 "src/parse.y"
+    {
+                      (yyval.nd) = new_args(p, (yyvsp[(1) - (6)].nd), (yyvsp[(3) - (6)].nd), 0, (yyvsp[(5) - (6)].nd), (yyvsp[(6) - (6)].id));
+                    ;}
+    break;
+
+  case 482:
+
+/* Line 1464 of yacc.c  */
+#line 2987 "src/parse.y"
+    {
+                      (yyval.nd) = new_args(p, (yyvsp[(1) - (4)].nd), 0, (yyvsp[(3) - (4)].id), 0, (yyvsp[(4) - (4)].id));
+                    ;}
+    break;
+
+  case 483:
+
+/* Line 1464 of yacc.c  */
+#line 2991 "src/parse.y"
+    {
+                      (yyval.nd) = new_args(p, (yyvsp[(1) - (6)].nd), 0, (yyvsp[(3) - (6)].id), (yyvsp[(5) - (6)].nd), (yyvsp[(6) - (6)].id));
+                    ;}
+    break;
+
+  case 484:
+
+/* Line 1464 of yacc.c  */
+#line 2995 "src/parse.y"
+    {
+                      (yyval.nd) = new_args(p, (yyvsp[(1) - (2)].nd), 0, 0, 0, (yyvsp[(2) - (2)].id));
+                    ;}
+    break;
+
+  case 485:
+
+/* Line 1464 of yacc.c  */
+#line 2999 "src/parse.y"
+    {
+                      (yyval.nd) = new_args(p, 0, (yyvsp[(1) - (4)].nd), (yyvsp[(3) - (4)].id), 0, (yyvsp[(4) - (4)].id));
+                    ;}
+    break;
+
+  case 486:
+
+/* Line 1464 of yacc.c  */
+#line 3003 "src/parse.y"
+    {
+                      (yyval.nd) = new_args(p, 0, (yyvsp[(1) - (6)].nd), (yyvsp[(3) - (6)].id), (yyvsp[(5) - (6)].nd), (yyvsp[(6) - (6)].id));
+                    ;}
+    break;
+
+  case 487:
+
+/* Line 1464 of yacc.c  */
+#line 3007 "src/parse.y"
+    {
+                      (yyval.nd) = new_args(p, 0, (yyvsp[(1) - (2)].nd), 0, 0, (yyvsp[(2) - (2)].id));
+                    ;}
+    break;
+
+  case 488:
+
+/* Line 1464 of yacc.c  */
+#line 3011 "src/parse.y"
+    {
+                      (yyval.nd) = new_args(p, 0, (yyvsp[(1) - (4)].nd), 0, (yyvsp[(3) - (4)].nd), (yyvsp[(4) - (4)].id));
+                    ;}
+    break;
+
+  case 489:
+
+/* Line 1464 of yacc.c  */
+#line 3015 "src/parse.y"
+    {
+                      (yyval.nd) = new_args(p, 0, 0, (yyvsp[(1) - (2)].id), 0, (yyvsp[(2) - (2)].id));
+                    ;}
+    break;
+
+  case 490:
+
+/* Line 1464 of yacc.c  */
+#line 3019 "src/parse.y"
+    {
+                      (yyval.nd) = new_args(p, 0, 0, (yyvsp[(1) - (4)].id), (yyvsp[(3) - (4)].nd), (yyvsp[(4) - (4)].id));
+                    ;}
+    break;
+
+  case 491:
+
+/* Line 1464 of yacc.c  */
+#line 3023 "src/parse.y"
+    {
+                      (yyval.nd) = new_args(p, 0, 0, 0, 0, (yyvsp[(1) - (1)].id));
+                    ;}
+    break;
+
+  case 492:
+
+/* Line 1464 of yacc.c  */
+#line 3027 "src/parse.y"
+    {
+                      local_add_f(p, 0);
+                      (yyval.nd) = new_args(p, 0, 0, 0, 0, 0);
+                    ;}
+    break;
+
+  case 493:
+
+/* Line 1464 of yacc.c  */
+#line 3034 "src/parse.y"
+    {
+                      yyerror(p, "formal argument cannot be a constant");
+                      (yyval.nd) = 0;
+                    ;}
+    break;
+
+  case 494:
+
+/* Line 1464 of yacc.c  */
+#line 3039 "src/parse.y"
+    {
+                      yyerror(p, "formal argument cannot be an instance variable");
+                      (yyval.nd) = 0;
+                    ;}
+    break;
+
+  case 495:
+
+/* Line 1464 of yacc.c  */
+#line 3044 "src/parse.y"
+    {
+                      yyerror(p, "formal argument cannot be a global variable");
+                      (yyval.nd) = 0;
+                    ;}
+    break;
+
+  case 496:
+
+/* Line 1464 of yacc.c  */
+#line 3049 "src/parse.y"
+    {
+                      yyerror(p, "formal argument cannot be a class variable");
+                      (yyval.nd) = 0;
+                    ;}
+    break;
+
+  case 497:
+
+/* Line 1464 of yacc.c  */
+#line 3056 "src/parse.y"
+    {
+                      (yyval.id) = 0;
+                    ;}
+    break;
+
+  case 498:
+
+/* Line 1464 of yacc.c  */
+#line 3060 "src/parse.y"
+    {
+                      local_add_f(p, (yyvsp[(1) - (1)].id));
+                      (yyval.id) = (yyvsp[(1) - (1)].id);
+                    ;}
+    break;
+
+  case 499:
+
+/* Line 1464 of yacc.c  */
+#line 3067 "src/parse.y"
+    {
+                      (yyval.nd) = new_arg(p, (yyvsp[(1) - (1)].id));
+                    ;}
+    break;
+
+  case 500:
+
+/* Line 1464 of yacc.c  */
+#line 3071 "src/parse.y"
+    {
+                      (yyval.nd) = new_masgn(p, (yyvsp[(2) - (3)].nd), 0);
+                    ;}
+    break;
+
+  case 501:
+
+/* Line 1464 of yacc.c  */
+#line 3077 "src/parse.y"
+    {
+                      (yyval.nd) = list1((yyvsp[(1) - (1)].nd));
+                    ;}
+    break;
+
+  case 502:
+
+/* Line 1464 of yacc.c  */
+#line 3081 "src/parse.y"
+    {
+                      (yyval.nd) = push((yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 503:
+
+/* Line 1464 of yacc.c  */
+#line 3087 "src/parse.y"
+    {
+                      local_add_f(p, (yyvsp[(1) - (2)].id));
+                      (yyval.id) = (yyvsp[(1) - (2)].id);
+                    ;}
+    break;
+
+  case 504:
+
+/* Line 1464 of yacc.c  */
+#line 3094 "src/parse.y"
+    {
+                      (yyval.nd) = cons(nsym((yyvsp[(1) - (2)].id)), (yyvsp[(2) - (2)].nd));
+                    ;}
+    break;
+
+  case 505:
+
+/* Line 1464 of yacc.c  */
+#line 3100 "src/parse.y"
+    {
+                      (yyval.nd) = cons(nsym((yyvsp[(1) - (2)].id)), (yyvsp[(2) - (2)].nd));
+                    ;}
+    break;
+
+  case 506:
+
+/* Line 1464 of yacc.c  */
+#line 3106 "src/parse.y"
+    {
+                      (yyval.nd) = list1((yyvsp[(1) - (1)].nd));
+                    ;}
+    break;
+
+  case 507:
+
+/* Line 1464 of yacc.c  */
+#line 3110 "src/parse.y"
+    {
+                      (yyval.nd) = push((yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 508:
+
+/* Line 1464 of yacc.c  */
+#line 3116 "src/parse.y"
+    {
+                      (yyval.nd) = list1((yyvsp[(1) - (1)].nd));
+                    ;}
+    break;
+
+  case 509:
+
+/* Line 1464 of yacc.c  */
+#line 3120 "src/parse.y"
+    {
+                      (yyval.nd) = push((yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 512:
+
+/* Line 1464 of yacc.c  */
+#line 3130 "src/parse.y"
+    {
+                      local_add_f(p, (yyvsp[(2) - (2)].id));
+                      (yyval.id) = (yyvsp[(2) - (2)].id);
+                    ;}
+    break;
+
+  case 513:
+
+/* Line 1464 of yacc.c  */
+#line 3135 "src/parse.y"
+    {
+                      local_add_f(p, 0);
+                      (yyval.id) = -1;
+                    ;}
+    break;
+
+  case 516:
+
+/* Line 1464 of yacc.c  */
+#line 3146 "src/parse.y"
+    {
+                      local_add_f(p, (yyvsp[(2) - (2)].id));
+                      (yyval.id) = (yyvsp[(2) - (2)].id);
+                    ;}
+    break;
+
+  case 517:
+
+/* Line 1464 of yacc.c  */
+#line 3153 "src/parse.y"
+    {
+                      (yyval.id) = (yyvsp[(2) - (2)].id);
+                    ;}
+    break;
+
+  case 518:
+
+/* Line 1464 of yacc.c  */
+#line 3157 "src/parse.y"
+    {
+                      local_add_f(p, 0);
+                      (yyval.id) = 0;
+                    ;}
+    break;
+
+  case 519:
+
+/* Line 1464 of yacc.c  */
+#line 3164 "src/parse.y"
+    {
+                      (yyval.nd) = (yyvsp[(1) - (1)].nd);
+                      if (!(yyval.nd)) (yyval.nd) = new_nil(p);
+                    ;}
+    break;
+
+  case 520:
+
+/* Line 1464 of yacc.c  */
+#line 3168 "src/parse.y"
+    {p->lstate = EXPR_BEG;;}
+    break;
+
+  case 521:
+
+/* Line 1464 of yacc.c  */
+#line 3169 "src/parse.y"
+    {
+                      if ((yyvsp[(3) - (4)].nd) == 0) {
+                        yyerror(p, "can't define singleton method for ().");
+                      }
+                      else {
+                        switch ((enum node_type)(int)(intptr_t)(yyvsp[(3) - (4)].nd)->car) {
+                        case NODE_STR:
+                        case NODE_DSTR:
+                        case NODE_XSTR:
+                        case NODE_DXSTR:
+                        case NODE_DREGX:
+                        case NODE_MATCH:
+                        case NODE_FLOAT:
+                        case NODE_ARRAY:
+                        case NODE_HEREDOC:
+                          yyerror(p, "can't define singleton method for literals");
+                        default:
+                          break;
+                        }
+                      }
+                      (yyval.nd) = (yyvsp[(3) - (4)].nd);
+                    ;}
+    break;
+
+  case 523:
+
+/* Line 1464 of yacc.c  */
+#line 3195 "src/parse.y"
+    {
+                      (yyval.nd) = (yyvsp[(1) - (2)].nd);
+                    ;}
+    break;
+
+  case 524:
+
+/* Line 1464 of yacc.c  */
+#line 3201 "src/parse.y"
+    {
+                      (yyval.nd) = list1((yyvsp[(1) - (1)].nd));
+                      NODE_LINENO((yyval.nd), (yyvsp[(1) - (1)].nd));
+                    ;}
+    break;
+
+  case 525:
+
+/* Line 1464 of yacc.c  */
+#line 3206 "src/parse.y"
+    {
+                      (yyval.nd) = push((yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 526:
+
+/* Line 1464 of yacc.c  */
+#line 3212 "src/parse.y"
+    {
+                      (yyval.nd) = cons((yyvsp[(1) - (3)].nd), (yyvsp[(3) - (3)].nd));
+                    ;}
+    break;
+
+  case 527:
+
+/* Line 1464 of yacc.c  */
+#line 3216 "src/parse.y"
+    {
+                      (yyval.nd) = cons(new_sym(p, (yyvsp[(1) - (2)].id)), (yyvsp[(2) - (2)].nd));
+                    ;}
+    break;
+
+  case 549:
+
+/* Line 1464 of yacc.c  */
+#line 3260 "src/parse.y"
+    {yyerrok;;}
+    break;
+
+  case 551:
+
+/* Line 1464 of yacc.c  */
+#line 3265 "src/parse.y"
+    {
+                      p->lineno++;
+                      p->column = 0;
+                    ;}
+    break;
+
+  case 554:
+
+/* Line 1464 of yacc.c  */
+#line 3272 "src/parse.y"
+    {yyerrok;;}
+    break;
+
+  case 555:
+
+/* Line 1464 of yacc.c  */
+#line 3276 "src/parse.y"
+    {
+                      (yyval.nd) = 0;
+                    ;}
+    break;
+
+
+
+/* Line 1464 of yacc.c  */
+#line 9260 "C:/Users/matsuzaki.takuya/work/daily/20150106/mruby-1.1.0/build/ARMCA9/src/y.tab.c"
+      default: break;
+    }
+  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
+
+  YYPOPSTACK (yylen);
+  yylen = 0;
+  YY_STACK_PRINT (yyss, yyssp);
+
+  *++yyvsp = yyval;
+
+  /* Now `shift' the result of the reduction.  Determine what state
+     that goes to, based on the state we popped back to and the rule
+     number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTOKENS];
+
+  goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+  /* If not already recovering from an error, report this error.  */
+  if (!yyerrstatus)
+    {
+      ++yynerrs;
+#if ! YYERROR_VERBOSE
+      yyerror (p, YY_("syntax error"));
+#else
+      {
+	YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
+	if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
+	  {
+	    YYSIZE_T yyalloc = 2 * yysize;
+	    if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
+	      yyalloc = YYSTACK_ALLOC_MAXIMUM;
+	    if (yymsg != yymsgbuf)
+	      YYSTACK_FREE (yymsg);
+	    yymsg = (char *) YYSTACK_ALLOC (yyalloc);
+	    if (yymsg)
+	      yymsg_alloc = yyalloc;
+	    else
+	      {
+		yymsg = yymsgbuf;
+		yymsg_alloc = sizeof yymsgbuf;
+	      }
+	  }
+
+	if (0 < yysize && yysize <= yymsg_alloc)
+	  {
+	    (void) yysyntax_error (yymsg, yystate, yychar);
+	    yyerror (p, yymsg);
+	  }
+	else
+	  {
+	    yyerror (p, YY_("syntax error"));
+	    if (yysize != 0)
+	      goto yyexhaustedlab;
+	  }
+      }
+#endif
+    }
+
+
+
+  if (yyerrstatus == 3)
+    {
+      /* If just tried and failed to reuse lookahead token after an
+	 error, discard it.  */
+
+      if (yychar <= YYEOF)
+	{
+	  /* Return failure if at end of input.  */
+	  if (yychar == YYEOF)
+	    YYABORT;
+	}
+      else
+	{
+	  yydestruct ("Error: discarding",
+		      yytoken, &yylval, p);
+	  yychar = YYEMPTY;
+	}
+    }
+
+  /* Else will try to reuse lookahead token after shifting the error
+     token.  */
+  goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR.  |
+`---------------------------------------------------*/
+yyerrorlab:
+
+  /* Pacify compilers like GCC when the user code never invokes
+     YYERROR and the label yyerrorlab therefore never appears in user
+     code.  */
+  if (/*CONSTCOND*/ 0)
+     goto yyerrorlab;
+
+  /* Do not reclaim the symbols of the rule which action triggered
+     this YYERROR.  */
+  YYPOPSTACK (yylen);
+  yylen = 0;
+  YY_STACK_PRINT (yyss, yyssp);
+  yystate = *yyssp;
+  goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR.  |
+`-------------------------------------------------------------*/
+yyerrlab1:
+  yyerrstatus = 3;	/* Each real token shifted decrements this.  */
+
+  for (;;)
+    {
+      yyn = yypact[yystate];
+      if (yyn != YYPACT_NINF)
+	{
+	  yyn += YYTERROR;
+	  if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+	    {
+	      yyn = yytable[yyn];
+	      if (0 < yyn)
+		break;
+	    }
+	}
+
+      /* Pop the current state because it cannot handle the error token.  */
+      if (yyssp == yyss)
+	YYABORT;
+
+
+      yydestruct ("Error: popping",
+		  yystos[yystate], yyvsp, p);
+      YYPOPSTACK (1);
+      yystate = *yyssp;
+      YY_STACK_PRINT (yyss, yyssp);
+    }
+
+  *++yyvsp = yylval;
+
+
+  /* Shift the error token.  */
+  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here.  |
+`-------------------------------------*/
+yyacceptlab:
+  yyresult = 0;
+  goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here.  |
+`-----------------------------------*/
+yyabortlab:
+  yyresult = 1;
+  goto yyreturn;
+
+#if !defined(yyoverflow) || YYERROR_VERBOSE
+/*-------------------------------------------------.
+| yyexhaustedlab -- memory exhaustion comes here.  |
+`-------------------------------------------------*/
+yyexhaustedlab:
+  yyerror (p, YY_("memory exhausted"));
+  yyresult = 2;
+  /* Fall through.  */
+#endif
+
+yyreturn:
+  if (yychar != YYEMPTY)
+     yydestruct ("Cleanup: discarding lookahead",
+		 yytoken, &yylval, p);
+  /* Do not reclaim the symbols of the rule which action triggered
+     this YYABORT or YYACCEPT.  */
+  YYPOPSTACK (yylen);
+  YY_STACK_PRINT (yyss, yyssp);
+  while (yyssp != yyss)
+    {
+      yydestruct ("Cleanup: popping",
+		  yystos[*yyssp], yyvsp, p);
+      YYPOPSTACK (1);
+    }
+#ifndef yyoverflow
+  if (yyss != yyssa)
+    YYSTACK_FREE (yyss);
+#endif
+#if YYERROR_VERBOSE
+  if (yymsg != yymsgbuf)
+    YYSTACK_FREE (yymsg);
+#endif
+  /* Make sure YYID is used.  */
+  return YYID (yyresult);
+}
+
+
+
+/* Line 1684 of yacc.c  */
+#line 3280 "src/parse.y"
+
+#define yylval  (*((YYSTYPE*)(p->ylval)))
+
+static void
+yyerror(parser_state *p, const char *s)
+{
+  char* c;
+  int n;
+
+  if (! p->capture_errors) {
+#ifdef ENABLE_STDIO
+    if (p->filename) {
+      fprintf(stderr, "%s:%d:%d: %s\n", p->filename, p->lineno, p->column, s);
+    }
+    else {
+      fprintf(stderr, "line %d:%d: %s\n", p->lineno, p->column, s);
+    }
+#endif
+  }
+  else if (p->nerr < sizeof(p->error_buffer) / sizeof(p->error_buffer[0])) {
+    n = strlen(s);
+    c = (char *)parser_palloc(p, n + 1);
+    memcpy(c, s, n + 1);
+    p->error_buffer[p->nerr].message = c;
+    p->error_buffer[p->nerr].lineno = p->lineno;
+    p->error_buffer[p->nerr].column = p->column;
+  }
+  p->nerr++;
+}
+
+static void
+yyerror_i(parser_state *p, const char *fmt, int i)
+{
+  char buf[256];
+
+  snprintf(buf, sizeof(buf), fmt, i);
+  yyerror(p, buf);
+}
+
+static void
+yywarn(parser_state *p, const char *s)
+{
+  char* c;
+  int n;
+
+  if (! p->capture_errors) {
+#ifdef ENABLE_STDIO
+    if (p->filename) {
+      fprintf(stderr, "%s:%d:%d: %s\n", p->filename, p->lineno, p->column, s);
+    }
+    else {
+      fprintf(stderr, "line %d:%d: %s\n", p->lineno, p->column, s);
+    }
+#endif
+  }
+  else if (p->nwarn < sizeof(p->warn_buffer) / sizeof(p->warn_buffer[0])) {
+    n = strlen(s);
+    c = (char *)parser_palloc(p, n + 1);
+    memcpy(c, s, n + 1);
+    p->warn_buffer[p->nwarn].message = c;
+    p->warn_buffer[p->nwarn].lineno = p->lineno;
+    p->warn_buffer[p->nwarn].column = p->column;
+  }
+  p->nwarn++;
+}
+
+static void
+yywarning(parser_state *p, const char *s)
+{
+  yywarn(p, s);
+}
+
+static void
+yywarning_s(parser_state *p, const char *fmt, const char *s)
+{
+  char buf[256];
+
+  snprintf(buf, sizeof(buf), fmt, s);
+  yywarning(p, buf);
+}
+
+static void
+backref_error(parser_state *p, node *n)
+{
+  int c;
+
+  c = (int)(intptr_t)n->car;
+
+  if (c == NODE_NTH_REF) {
+    yyerror_i(p, "can't set variable $%d", (int)(intptr_t)n->cdr);
+  }
+  else if (c == NODE_BACK_REF) {
+    yyerror_i(p, "can't set variable $%c", (int)(intptr_t)n->cdr);
+  }
+  else {
+    mrb_bug(p->mrb, "Internal error in backref_error() : n=>car == %S", mrb_fixnum_value(c));
+  }
+}
+
+static void pushback(parser_state *p, int c);
+static mrb_bool peeks(parser_state *p, const char *s);
+static mrb_bool skips(parser_state *p, const char *s);
+
+static inline int
+nextc(parser_state *p)
+{
+  int c;
+
+  if (p->pb) {
+    node *tmp;
+
+    c = (int)(intptr_t)p->pb->car;
+    tmp = p->pb;
+    p->pb = p->pb->cdr;
+    cons_free(tmp);
+  }
+  else {
+#ifdef ENABLE_STDIO
+    if (p->f) {
+      if (feof(p->f)) goto eof;
+      c = fgetc(p->f);
+      if (c == EOF) goto eof;
+    }
+    else
+#endif
+      if (!p->s || p->s >= p->send) {
+        goto eof;
+      }
+      else {
+        c = (unsigned char)*p->s++;
+      }
+  }
+  if (c >= 0) {
+    p->column++;
+  }
+  if (c == '\r') {
+    c = nextc(p);
+    if (c != '\n') {
+      pushback(p, c);
+      return '\r';
+    }
+    return c;
+  }
+  return c;
+
+  eof:
+  if (!p->cxt) return -1;
+  else {
+    if (p->cxt->partial_hook(p) < 0)
+      return -1;                /* end of program(s) */
+    return -2;                  /* end of a file in the program files */
+  }
+}
+
+static void
+pushback(parser_state *p, int c)
+{
+  if (c >= 0) {
+    p->column--;
+  }
+  p->pb = cons((node*)(intptr_t)c, p->pb);
+}
+
+static void
+skip(parser_state *p, char term)
+{
+  int c;
+
+  for (;;) {
+    c = nextc(p);
+    if (c < 0) break;
+    if (c == term) break;
+  }
+}
+
+static int
+peekc_n(parser_state *p, int n)
+{
+  node *list = 0;
+  int c0;
+
+  do {
+    c0 = nextc(p);
+    if (c0 == -1) return c0;    /* do not skip partial EOF */
+    list = push(list, (node*)(intptr_t)c0);
+  } while(n--);
+  if (p->pb) {
+    p->pb = append((node*)list, p->pb);
+  }
+  else {
+    p->pb = list;
+  }
+  return c0;
+}
+
+static mrb_bool
+peek_n(parser_state *p, int c, int n)
+{
+  return peekc_n(p, n) == c && c >= 0;
+}
+#define peek(p,c) peek_n((p), (c), 0)
+
+static mrb_bool
+peeks(parser_state *p, const char *s)
+{
+  int len = strlen(s);
+
+#ifdef ENABLE_STDIO
+  if (p->f) {
+    int n = 0;
+    while (*s) {
+      if (!peek_n(p, *s++, n++)) return FALSE;
+    }
+    return TRUE;
+  }
+  else
+#endif
+    if (p->s && p->s + len <= p->send) {
+      if (memcmp(p->s, s, len) == 0) return TRUE;
+    }
+  return FALSE;
+}
+
+static mrb_bool
+skips(parser_state *p, const char *s)
+{
+  int c;
+
+  for (;;) {
+    /* skip until first char */
+    for (;;) {
+      c = nextc(p);
+      if (c < 0) return c;
+      if (c == '\n') {
+        p->lineno++;
+        p->column = 0;
+      }
+      if (c == *s) break;
+    }
+    s++;
+    if (peeks(p, s)) {
+      int len = strlen(s);
+
+      while (len--) {
+        if (nextc(p) == '\n') {
+          p->lineno++;
+          p->column = 0;
+        }
+      }
+      return TRUE;
+    }
+    else{
+      s--;
+    }
+  }
+  return FALSE;
+}
+
+
+static int
+newtok(parser_state *p)
+{
+  p->bidx = 0;
+  return p->column - 1;
+}
+
+static void
+tokadd(parser_state *p, int32_t c)
+{
+  char utf8[4];
+  unsigned len;
+
+  /* mrb_assert(-0x10FFFF <= c && c <= 0xFF); */
+  if (c >= 0) {
+    /* Single byte from source or non-Unicode escape */
+    utf8[0] = (char)c;
+    len = 1;
+  }
+  else {
+    /* Unicode character */
+    c = -c;
+    if (c < 0x80) {
+      utf8[0] = (char)c;
+      len = 1;
+    }
+    else if (c < 0x800) {
+      utf8[0] = (char)(0xC0 | (c >> 6));
+      utf8[1] = (char)(0x80 | (c & 0x3F));
+      len = 2;
+    }
+    else if (c < 0x10000) {
+      utf8[0] = (char)(0xE0 |  (c >> 12)        );
+      utf8[1] = (char)(0x80 | ((c >>  6) & 0x3F));
+      utf8[2] = (char)(0x80 | ( c        & 0x3F));
+      len = 3;
+    }
+    else {
+      utf8[0] = (char)(0xF0 |  (c >> 18)        );
+      utf8[1] = (char)(0x80 | ((c >> 12) & 0x3F));
+      utf8[2] = (char)(0x80 | ((c >>  6) & 0x3F));
+      utf8[3] = (char)(0x80 | ( c        & 0x3F));
+      len = 4;
+    }
+  }
+  if (p->bidx+len <= MRB_PARSER_BUF_SIZE) {
+    unsigned i;
+    for (i = 0; i < len; i++) {
+      p->buf[p->bidx++] = utf8[i];
+    }
+  }
+}
+
+static int
+toklast(parser_state *p)
+{
+  return p->buf[p->bidx-1];
+}
+
+static void
+tokfix(parser_state *p)
+{
+  if (p->bidx >= MRB_PARSER_BUF_SIZE) {
+    yyerror(p, "string too long (truncated)");
+  }
+  p->buf[p->bidx] = '\0';
+}
+
+static const char*
+tok(parser_state *p)
+{
+  return p->buf;
+}
+
+static int
+toklen(parser_state *p)
+{
+  return p->bidx;
+}
+
+#define IS_ARG() (p->lstate == EXPR_ARG || p->lstate == EXPR_CMDARG)
+#define IS_END() (p->lstate == EXPR_END || p->lstate == EXPR_ENDARG || p->lstate == EXPR_ENDFN)
+#define IS_BEG() (p->lstate == EXPR_BEG || p->lstate == EXPR_MID || p->lstate == EXPR_VALUE || p->lstate == EXPR_CLASS)
+#define IS_SPCARG(c) (IS_ARG() && space_seen && !ISSPACE(c))
+#define IS_LABEL_POSSIBLE() ((p->lstate == EXPR_BEG && !cmd_state) || IS_ARG())
+#define IS_LABEL_SUFFIX(n) (peek_n(p, ':',(n)) && !peek_n(p, ':', (n)+1))
+
+static int
+scan_oct(const int *start, int len, int *retlen)
+{
+  const int *s = start;
+  int retval = 0;
+
+  /* mrb_assert(len <= 3) */
+  while (len-- && *s >= '0' && *s <= '7') {
+    retval <<= 3;
+    retval |= *s++ - '0';
+  }
+  *retlen = s - start;
+
+  return retval;
+}
+
+static int32_t
+scan_hex(const int *start, int len, int *retlen)
+{
+  static const char hexdigit[] = "0123456789abcdef0123456789ABCDEF";
+  const int *s = start;
+  int32_t retval = 0;
+  char *tmp;
+
+  /* mrb_assert(len <= 8) */
+  while (len-- && *s && (tmp = (char*)strchr(hexdigit, *s))) {
+    retval <<= 4;
+    retval |= (tmp - hexdigit) & 15;
+    s++;
+  }
+  *retlen = s - start;
+
+  return retval;
+}
+
+/* Return negative to indicate Unicode code point */
+static int32_t
+read_escape(parser_state *p)
+{
+  int32_t c;
+
+  switch (c = nextc(p)) {
+  case '\\':/* Backslash */
+    return c;
+
+  case 'n':/* newline */
+    return '\n';
+
+  case 't':/* horizontal tab */
+    return '\t';
+
+  case 'r':/* carriage-return */
+    return '\r';
+
+  case 'f':/* form-feed */
+    return '\f';
+
+  case 'v':/* vertical tab */
+    return '\13';
+
+  case 'a':/* alarm(bell) */
+    return '\007';
+
+  case 'e':/* escape */
+    return 033;
+
+  case '0': case '1': case '2': case '3': /* octal constant */
+  case '4': case '5': case '6': case '7':
+  {
+    int buf[3];
+    int i;
+
+    buf[0] = c;
+    for (i=1; i<3; i++) {
+      buf[i] = nextc(p);
+      if (buf[i] < 0) goto eof;
+      if (buf[i] < '0' || '7' < buf[i]) {
+        pushback(p, buf[i]);
+        break;
+      }
+    }
+    c = scan_oct(buf, i, &i);
+  }
+  return c;
+
+  case 'x':     /* hex constant */
+  {
+    int buf[2];
+    int i;
+
+    for (i=0; i<2; i++) {
+      buf[i] = nextc(p);
+      if (buf[i] < 0) goto eof;
+      if (!ISXDIGIT(buf[i])) {
+        pushback(p, buf[i]);
+        break;
+      }
+    }
+    c = scan_hex(buf, i, &i);
+    if (i == 0) {
+      yyerror(p, "Invalid escape character syntax");
+      return 0;
+    }
+  }
+  return c;
+
+  case 'u':     /* Unicode */
+  {
+    int buf[9];
+    int i;
+
+    /* Look for opening brace */
+    i = 0;
+    buf[0] = nextc(p);
+    if (buf[0] < 0) goto eof;
+    if (buf[0] == '{') {
+      /* \u{xxxxxxxx} form */
+      for (i=0; i<9; i++) {
+        buf[i] = nextc(p);
+        if (buf[i] < 0) goto eof;
+        if (buf[i] == '}') {
+          break;
+        }
+        else if (!ISXDIGIT(buf[i])) {
+          yyerror(p, "Invalid escape character syntax");
+          pushback(p, buf[i]);
+          return 0;
+        }
+      }
+    }
+    else if (ISXDIGIT(buf[0])) {
+      /* \uxxxx form */
+      for (i=1; i<4; i++) {
+        buf[i] = nextc(p);
+        if (buf[i] < 0) goto eof;
+        if (!ISXDIGIT(buf[i])) {
+          pushback(p, buf[i]);
+          break;
+        }
+      }
+    }
+    else {
+      pushback(p, buf[0]);
+    }
+    c = scan_hex(buf, i, &i);
+    if (i == 0) {
+      yyerror(p, "Invalid escape character syntax");
+      return 0;
+    }
+    if (c < 0 || c > 0x10FFFF || (c & 0xFFFFF800) == 0xD800) {
+      yyerror(p, "Invalid Unicode code point");
+      return 0;
+    }
+  }
+  return -c;
+
+  case 'b':/* backspace */
+    return '\010';
+
+  case 's':/* space */
+    return ' ';
+
+  case 'M':
+    if ((c = nextc(p)) != '-') {
+      yyerror(p, "Invalid escape character syntax");
+      pushback(p, c);
+      return '\0';
+    }
+    if ((c = nextc(p)) == '\\') {
+      return read_escape(p) | 0x80;
+    }
+    else if (c < 0) goto eof;
+    else {
+      return ((c & 0xff) | 0x80);
+    }
+
+  case 'C':
+    if ((c = nextc(p)) != '-') {
+      yyerror(p, "Invalid escape character syntax");
+      pushback(p, c);
+      return '\0';
+    }
+  case 'c':
+    if ((c = nextc(p))== '\\') {
+      c = read_escape(p);
+    }
+    else if (c == '?')
+      return 0177;
+    else if (c < 0) goto eof;
+    return c & 0x9f;
+
+    eof:
+  case -1:
+  case -2:                      /* end of a file */
+    yyerror(p, "Invalid escape character syntax");
+    return '\0';
+
+  default:
+    return c;
+  }
+}
+
+static int
+parse_string(parser_state *p)
+{
+  int c;
+  string_type type = (string_type)(intptr_t)p->lex_strterm->car;
+  int nest_level = (intptr_t)p->lex_strterm->cdr->car;
+  int beg = (intptr_t)p->lex_strterm->cdr->cdr->car;
+  int end = (intptr_t)p->lex_strterm->cdr->cdr->cdr;
+  parser_heredoc_info *hinf = (type & STR_FUNC_HEREDOC) ? parsing_heredoc_inf(p) : NULL;
+
+  newtok(p);
+  while ((c = nextc(p)) != end || nest_level != 0) {
+    if (hinf && (c == '\n' || c < 0)) {
+      mrb_bool line_head;
+      tokadd(p, '\n');
+      tokfix(p);
+      p->lineno++;
+      p->column = 0;
+      line_head = hinf->line_head;
+      hinf->line_head = TRUE;
+      if (line_head) {
+        /* check whether end of heredoc */
+        const char *s = tok(p);
+        int len = toklen(p);
+        if (hinf->allow_indent) {
+          while (ISSPACE(*s) && len > 0) {
+            ++s;
+            --len;
+          }
+        }
+        if ((len-1 == hinf->term_len) && (strncmp(s, hinf->term, len-1) == 0)) {
+          return tHEREDOC_END;
+        }
+      }
+      if (c < 0) {
+        char buf[256];
+        snprintf(buf, sizeof(buf), "can't find heredoc delimiter \"%s\" anywhere before EOF", hinf->term);
+        yyerror(p, buf);
+        return 0;
+      }
+      yylval.nd = new_str(p, tok(p), toklen(p));
+      return tHD_STRING_MID;
+    }
+    if (c < 0) {
+      yyerror(p, "unterminated string meets end of file");
+      return 0;
+    }
+    else if (c == beg) {
+      nest_level++;
+      p->lex_strterm->cdr->car = (node*)(intptr_t)nest_level;
+    }
+    else if (c == end) {
+      nest_level--;
+      p->lex_strterm->cdr->car = (node*)(intptr_t)nest_level;
+    }
+    else if (c == '\\') {
+      c = nextc(p);
+      if (type & STR_FUNC_EXPAND) {
+        if (c == end || c == beg) {
+          tokadd(p, c);
+        }
+        else if (c == '\n') {
+          p->lineno++;
+          p->column = 0;
+          if (type & STR_FUNC_ARRAY) {
+            tokadd(p, '\n');
+          }
+        }
+        else if (type & STR_FUNC_REGEXP) {
+          tokadd(p, '\\');
+          tokadd(p, c);
+        }
+        else {
+          pushback(p, c);
+          tokadd(p, read_escape(p));
+          if (hinf)
+            hinf->line_head = FALSE;
+        }
+      }
+      else {
+        if (c != beg && c != end) {
+          if (c == '\n') {
+            p->lineno++;
+            p->column = 0;
+          }
+          if (!(c == '\\' || ((type & STR_FUNC_ARRAY) && ISSPACE(c)))) {
+            tokadd(p, '\\');
+          }
+        }
+        tokadd(p, c);
+      }
+      continue;
+    }
+    else if ((c == '#') && (type & STR_FUNC_EXPAND)) {
+      c = nextc(p);
+      if (c == '{') {
+        tokfix(p);
+        p->lstate = EXPR_BEG;
+        p->cmd_start = TRUE;
+        yylval.nd = new_str(p, tok(p), toklen(p));
+        if (hinf) {
+          hinf->line_head = FALSE;
+          return tHD_STRING_PART;
+        }
+        return tSTRING_PART;
+      }
+      tokadd(p, '#');
+      pushback(p, c);
+      continue;
+    }
+    if ((type & STR_FUNC_ARRAY) && ISSPACE(c)) {
+      if (toklen(p) == 0) {
+        do {
+          if (c == '\n') {
+            p->lineno++;
+            p->column = 0;
+            heredoc_treat_nextline(p);
+            if (p->parsing_heredoc != NULL) {
+              return tHD_LITERAL_DELIM;
+            }
+          }
+          c = nextc(p);
+        } while (ISSPACE(c));
+        pushback(p, c);
+        return tLITERAL_DELIM;
+      }
+      else {
+        pushback(p, c);
+        tokfix(p);
+        yylval.nd = new_str(p, tok(p), toklen(p));
+        return tSTRING_MID;
+      }
+    }
+    tokadd(p, c);
+  }
+
+  tokfix(p);
+  p->lstate = EXPR_END;
+  end_strterm(p);
+
+  if (type & STR_FUNC_XQUOTE) {
+    yylval.nd = new_xstr(p, tok(p), toklen(p));
+    return tXSTRING;
+  }
+
+  if (type & STR_FUNC_REGEXP) {
+    int f = 0;
+    int re_opt;
+    char *s = strndup(tok(p), toklen(p));
+    char flags[3];
+    char *flag = flags;
+    char *dup;
+
+    newtok(p);
+    while (re_opt = nextc(p), re_opt >= 0 && ISALPHA(re_opt)) {
+      switch (re_opt) {
+      case 'i': f |= 1; break;
+      case 'x': f |= 2; break;
+      case 'm': f |= 4; break;
+      default: tokadd(p, re_opt); break;
+      }
+    }
+    pushback(p, re_opt);
+    if (toklen(p)) {
+      char msg[128];
+      tokfix(p);
+      snprintf(msg, sizeof(msg), "unknown regexp option%s - %s",
+          toklen(p) > 1 ? "s" : "", tok(p));
+      yyerror(p, msg);
+    }
+    if (f != 0) {
+      if (f & 1) *flag++ = 'i';
+      if (f & 2) *flag++ = 'x';
+      if (f & 4) *flag++ = 'm';
+      dup = strndup(flags, (size_t)(flag - flags));
+    }
+    else {
+      dup = NULL;
+    }
+    yylval.nd = new_regx(p, s, dup);
+
+    return tREGEXP;
+  }
+
+  yylval.nd = new_str(p, tok(p), toklen(p));
+  return tSTRING;
+}
+
+
+static int
+heredoc_identifier(parser_state *p)
+{
+  int c;
+  int type = str_heredoc;
+  mrb_bool indent = FALSE;
+  mrb_bool quote = FALSE;
+  node *newnode;
+  parser_heredoc_info *info;
+
+  c = nextc(p);
+  if (ISSPACE(c) || c == '=') {
+    pushback(p, c);
+    return 0;
+  }
+  if (c == '-') {
+    indent = TRUE;
+    c = nextc(p);
+  }
+  if (c == '\'' || c == '"') {
+    int term = c;
+    if (c == '\'')
+      quote = TRUE;
+    newtok(p);
+    while ((c = nextc(p)) >= 0 && c != term) {
+      if (c == '\n') {
+        c = -1;
+        break;
+      }
+      tokadd(p, c);
+    }
+    if (c < 0) {
+      yyerror(p, "unterminated here document identifier");
+      return 0;
+    }
+  }
+  else {
+    if (c < 0) {
+      return 0;                 /* missing here document identifier */
+    }
+    if (! identchar(c)) {
+      pushback(p, c);
+      if (indent) pushback(p, '-');
+      return 0;
+    }
+    newtok(p);
+    do {
+      tokadd(p, c);
+    } while ((c = nextc(p)) >= 0 && identchar(c));
+    pushback(p, c);
+  }
+  tokfix(p);
+  newnode = new_heredoc(p);
+  info = (parser_heredoc_info*)newnode->cdr;
+  info->term = strndup(tok(p), toklen(p));
+  info->term_len = toklen(p);
+  if (! quote)
+    type |= STR_FUNC_EXPAND;
+  info->type = (string_type)type;
+  info->allow_indent = indent;
+  info->line_head = TRUE;
+  info->doc = NULL;
+  p->heredocs_from_nextline = push(p->heredocs_from_nextline, newnode);
+  p->lstate = EXPR_END;
+
+  yylval.nd = newnode;
+  return tHEREDOC_BEG;
+}
+
+static int
+arg_ambiguous(parser_state *p)
+{
+  yywarning(p, "ambiguous first argument; put parentheses or even spaces");
+  return 1;
+}
+
+#include "lex.def"
+
+static int
+parser_yylex(parser_state *p)
+{
+  int32_t c;
+  int space_seen = 0;
+  int cmd_state;
+  enum mrb_lex_state_enum last_state;
+  int token_column;
+
+  if (p->lex_strterm) {
+    if (is_strterm_type(p, STR_FUNC_HEREDOC)) {
+      if (p->parsing_heredoc != NULL)
+        return parse_string(p);
+    }
+    else
+      return parse_string(p);
+  }
+  cmd_state = p->cmd_start;
+  p->cmd_start = FALSE;
+  retry:
+  last_state = p->lstate;
+  switch (c = nextc(p)) {
+  case '\0':    /* NUL */
+  case '\004':  /* ^D */
+  case '\032':  /* ^Z */
+    return 0;
+  case -1:      /* end of script. */
+    if (p->heredocs_from_nextline)
+      goto maybe_heredoc;
+    return 0;
+
+  /* white spaces */
+  case ' ': case '\t': case '\f': case '\r':
+  case '\13':   /* '\v' */
+    space_seen = 1;
+    goto retry;
+
+  case '#':     /* it's a comment */
+    skip(p, '\n');
+    /* fall through */
+  case -2:      /* end of a file */
+  case '\n':
+    maybe_heredoc:
+    heredoc_treat_nextline(p);
+  switch (p->lstate) {
+  case EXPR_BEG:
+  case EXPR_FNAME:
+  case EXPR_DOT:
+  case EXPR_CLASS:
+  case EXPR_VALUE:
+    p->lineno++;
+    p->column = 0;
+    if (p->parsing_heredoc != NULL) {
+      return parse_string(p);
+    }
+    goto retry;
+  default:
+    break;
+  }
+  if (p->parsing_heredoc != NULL) {
+    return '\n';
+  }
+  while ((c = nextc(p))) {
+    switch (c) {
+    case ' ': case '\t': case '\f': case '\r':
+    case '\13': /* '\v' */
+      space_seen = 1;
+      break;
+    case '.':
+      if ((c = nextc(p)) != '.') {
+        pushback(p, c);
+        pushback(p, '.');
+        goto retry;
+      }
+    case -1:                  /* EOF */
+    case -2:                  /* end of a file */
+      goto normal_newline;
+    default:
+      pushback(p, c);
+      goto normal_newline;
+    }
+  }
+  normal_newline:
+  p->cmd_start = TRUE;
+  p->lstate = EXPR_BEG;
+  return '\n';
+
+  case '*':
+    if ((c = nextc(p)) == '*') {
+      if ((c = nextc(p)) == '=') {
+        yylval.id = intern("**",2);
+        p->lstate = EXPR_BEG;
+        return tOP_ASGN;
+      }
+      pushback(p, c);
+      c = tPOW;
+    }
+    else {
+      if (c == '=') {
+        yylval.id = intern_c('*');
+        p->lstate = EXPR_BEG;
+        return tOP_ASGN;
+      }
+      pushback(p, c);
+      if (IS_SPCARG(c)) {
+        yywarning(p, "`*' interpreted as argument prefix");
+        c = tSTAR;
+      }
+      else if (IS_BEG()) {
+        c = tSTAR;
+      }
+      else {
+        c = '*';
+      }
+    }
+    if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+      p->lstate = EXPR_ARG;
+    }
+    else {
+      p->lstate = EXPR_BEG;
+    }
+    return c;
+
+  case '!':
+    c = nextc(p);
+    if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+      p->lstate = EXPR_ARG;
+      if (c == '@') {
+        return '!';
+      }
+    }
+    else {
+      p->lstate = EXPR_BEG;
+    }
+    if (c == '=') {
+      return tNEQ;
+    }
+    if (c == '~') {
+      return tNMATCH;
+    }
+    pushback(p, c);
+    return '!';
+
+  case '=':
+    if (p->column == 1) {
+      static const char begin[] = "begin";
+      static const char end[] = "\n=end";
+      if (peeks(p, begin)) {
+        c = peekc_n(p, sizeof(begin)-1);
+        if (c < 0 || ISSPACE(c)) {
+          do {
+            if (!skips(p, end)) {
+              yyerror(p, "embedded document meets end of file");
+              return 0;
+            }
+            c = nextc(p);
+          } while (!(c < 0 || ISSPACE(c)));
+          if (c != '\n') skip(p, '\n');
+          p->lineno++;
+          p->column = 0;
+          goto retry;
+        }
+      }
+    }
+    if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+      p->lstate = EXPR_ARG;
+    }
+    else {
+      p->lstate = EXPR_BEG;
+    }
+    if ((c = nextc(p)) == '=') {
+      if ((c = nextc(p)) == '=') {
+        return tEQQ;
+      }
+      pushback(p, c);
+      return tEQ;
+    }
+    if (c == '~') {
+      return tMATCH;
+    }
+    else if (c == '>') {
+      return tASSOC;
+    }
+    pushback(p, c);
+    return '=';
+
+  case '<':
+    c = nextc(p);
+    if (c == '<' &&
+        p->lstate != EXPR_DOT &&
+        p->lstate != EXPR_CLASS &&
+        !IS_END() &&
+        (!IS_ARG() || space_seen)) {
+      int token = heredoc_identifier(p);
+      if (token)
+        return token;
+    }
+    if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+      p->lstate = EXPR_ARG;
+    }
+    else {
+      p->lstate = EXPR_BEG;
+      if (p->lstate == EXPR_CLASS) {
+        p->cmd_start = TRUE;
+      }
+    }
+    if (c == '=') {
+      if ((c = nextc(p)) == '>') {
+        return tCMP;
+      }
+      pushback(p, c);
+      return tLEQ;
+    }
+    if (c == '<') {
+      if ((c = nextc(p)) == '=') {
+        yylval.id = intern("<<",2);
+        p->lstate = EXPR_BEG;
+        return tOP_ASGN;
+      }
+      pushback(p, c);
+      return tLSHFT;
+    }
+    pushback(p, c);
+    return '<';
+
+  case '>':
+    if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+      p->lstate = EXPR_ARG;
+    }
+    else {
+      p->lstate = EXPR_BEG;
+    }
+    if ((c = nextc(p)) == '=') {
+      return tGEQ;
+    }
+    if (c == '>') {
+      if ((c = nextc(p)) == '=') {
+        yylval.id = intern(">>",2);
+        p->lstate = EXPR_BEG;
+        return tOP_ASGN;
+      }
+      pushback(p, c);
+      return tRSHFT;
+    }
+    pushback(p, c);
+    return '>';
+
+  case '"':
+    p->lex_strterm = new_strterm(p, str_dquote, '"', 0);
+    return tSTRING_BEG;
+
+  case '\'':
+    p->lex_strterm = new_strterm(p, str_squote, '\'', 0);
+    return parse_string(p);
+
+  case '`':
+    if (p->lstate == EXPR_FNAME) {
+      p->lstate = EXPR_ENDFN;
+      return '`';
+    }
+    if (p->lstate == EXPR_DOT) {
+      if (cmd_state)
+        p->lstate = EXPR_CMDARG;
+      else
+        p->lstate = EXPR_ARG;
+      return '`';
+    }
+    p->lex_strterm = new_strterm(p, str_xquote, '`', 0);
+    return tXSTRING_BEG;
+
+  case '?':
+    if (IS_END()) {
+      p->lstate = EXPR_VALUE;
+      return '?';
+    }
+    c = nextc(p);
+    if (c < 0) {
+      yyerror(p, "incomplete character syntax");
+      return 0;
+    }
+    if (ISSPACE(c)) {
+      if (!IS_ARG()) {
+        int c2;
+        switch (c) {
+        case ' ':
+          c2 = 's';
+          break;
+        case '\n':
+          c2 = 'n';
+          break;
+        case '\t':
+          c2 = 't';
+          break;
+        case '\v':
+          c2 = 'v';
+          break;
+        case '\r':
+          c2 = 'r';
+          break;
+        case '\f':
+          c2 = 'f';
+          break;
+        default:
+          c2 = 0;
+          break;
+        }
+        if (c2) {
+          char buf[256];
+          snprintf(buf, sizeof(buf), "invalid character syntax; use ?\\%c", c2);
+          yyerror(p, buf);
+        }
+      }
+      ternary:
+      pushback(p, c);
+      p->lstate = EXPR_VALUE;
+      return '?';
+    }
+    newtok(p);
+    /* need support UTF-8 if configured */
+    if ((isalnum(c) || c == '_')) {
+      int c2 = nextc(p);
+      pushback(p, c2);
+      if ((isalnum(c2) || c2 == '_')) {
+        goto ternary;
+      }
+    }
+    if (c == '\\') {
+      c = read_escape(p);
+      tokadd(p, c);
+    }
+    else {
+      tokadd(p, c);
+    }
+    tokfix(p);
+    yylval.nd = new_str(p, tok(p), toklen(p));
+    p->lstate = EXPR_END;
+    return tCHAR;
+
+  case '&':
+    if ((c = nextc(p)) == '&') {
+      p->lstate = EXPR_BEG;
+      if ((c = nextc(p)) == '=') {
+        yylval.id = intern("&&",2);
+        p->lstate = EXPR_BEG;
+        return tOP_ASGN;
+      }
+      pushback(p, c);
+      return tANDOP;
+    }
+    else if (c == '=') {
+      yylval.id = intern_c('&');
+      p->lstate = EXPR_BEG;
+      return tOP_ASGN;
+    }
+    pushback(p, c);
+    if (IS_SPCARG(c)) {
+      yywarning(p, "`&' interpreted as argument prefix");
+      c = tAMPER;
+    }
+    else if (IS_BEG()) {
+      c = tAMPER;
+    }
+    else {
+      c = '&';
+    }
+    if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+      p->lstate = EXPR_ARG;
+    }
+    else {
+      p->lstate = EXPR_BEG;
+    }
+    return c;
+
+  case '|':
+    if ((c = nextc(p)) == '|') {
+      p->lstate = EXPR_BEG;
+      if ((c = nextc(p)) == '=') {
+        yylval.id = intern("||",2);
+        p->lstate = EXPR_BEG;
+        return tOP_ASGN;
+      }
+      pushback(p, c);
+      return tOROP;
+    }
+    if (c == '=') {
+      yylval.id = intern_c('|');
+      p->lstate = EXPR_BEG;
+      return tOP_ASGN;
+    }
+    if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+      p->lstate = EXPR_ARG;
+    }
+    else {
+      p->lstate = EXPR_BEG;
+    }
+    pushback(p, c);
+    return '|';
+
+  case '+':
+    c = nextc(p);
+    if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+      p->lstate = EXPR_ARG;
+      if (c == '@') {
+        return tUPLUS;
+      }
+      pushback(p, c);
+      return '+';
+    }
+    if (c == '=') {
+      yylval.id = intern_c('+');
+      p->lstate = EXPR_BEG;
+      return tOP_ASGN;
+    }
+    if (IS_BEG() || (IS_SPCARG(c) && arg_ambiguous(p))) {
+      p->lstate = EXPR_BEG;
+      pushback(p, c);
+      if (c >= 0 && ISDIGIT(c)) {
+        c = '+';
+        goto start_num;
+      }
+      return tUPLUS;
+    }
+    p->lstate = EXPR_BEG;
+    pushback(p, c);
+    return '+';
+
+  case '-':
+    c = nextc(p);
+    if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+      p->lstate = EXPR_ARG;
+      if (c == '@') {
+        return tUMINUS;
+      }
+      pushback(p, c);
+      return '-';
+    }
+    if (c == '=') {
+      yylval.id = intern_c('-');
+      p->lstate = EXPR_BEG;
+      return tOP_ASGN;
+    }
+    if (c == '>') {
+      p->lstate = EXPR_ENDFN;
+      return tLAMBDA;
+    }
+    if (IS_BEG() || (IS_SPCARG(c) && arg_ambiguous(p))) {
+      p->lstate = EXPR_BEG;
+      pushback(p, c);
+      if (c >= 0 && ISDIGIT(c)) {
+        return tUMINUS_NUM;
+      }
+      return tUMINUS;
+    }
+    p->lstate = EXPR_BEG;
+    pushback(p, c);
+    return '-';
+
+  case '.':
+    p->lstate = EXPR_BEG;
+    if ((c = nextc(p)) == '.') {
+      if ((c = nextc(p)) == '.') {
+        return tDOT3;
+      }
+      pushback(p, c);
+      return tDOT2;
+    }
+    pushback(p, c);
+    if (c >= 0 && ISDIGIT(c)) {
+      yyerror(p, "no .<digit> floating literal anymore; put 0 before dot");
+    }
+    p->lstate = EXPR_DOT;
+    return '.';
+
+    start_num:
+  case '0': case '1': case '2': case '3': case '4':
+  case '5': case '6': case '7': case '8': case '9':
+  {
+    int is_float, seen_point, seen_e, nondigit;
+
+    is_float = seen_point = seen_e = nondigit = 0;
+    p->lstate = EXPR_END;
+    newtok(p);
+    if (c == '-' || c == '+') {
+      tokadd(p, c);
+      c = nextc(p);
+    }
+    if (c == '0') {
+#define no_digits() do {yyerror(p,"numeric literal without digits"); return 0;} while (0)
+      int start = toklen(p);
+      c = nextc(p);
+      if (c == 'x' || c == 'X') {
+        /* hexadecimal */
+        c = nextc(p);
+        if (c >= 0 && ISXDIGIT(c)) {
+          do {
+            if (c == '_') {
+              if (nondigit) break;
+              nondigit = c;
+              continue;
+            }
+            if (!ISXDIGIT(c)) break;
+            nondigit = 0;
+            tokadd(p, tolower(c));
+          } while ((c = nextc(p)) >= 0);
+        }
+        pushback(p, c);
+        tokfix(p);
+        if (toklen(p) == start) {
+          no_digits();
+        }
+        else if (nondigit) goto trailing_uc;
+        yylval.nd = new_int(p, tok(p), 16);
+        return tINTEGER;
+      }
+      if (c == 'b' || c == 'B') {
+        /* binary */
+        c = nextc(p);
+        if (c == '0' || c == '1') {
+          do {
+            if (c == '_') {
+              if (nondigit) break;
+              nondigit = c;
+              continue;
+            }
+            if (c != '0' && c != '1') break;
+            nondigit = 0;
+            tokadd(p, c);
+          } while ((c = nextc(p)) >= 0);
+        }
+        pushback(p, c);
+        tokfix(p);
+        if (toklen(p) == start) {
+          no_digits();
+        }
+        else if (nondigit) goto trailing_uc;
+        yylval.nd = new_int(p, tok(p), 2);
+        return tINTEGER;
+      }
+      if (c == 'd' || c == 'D') {
+        /* decimal */
+        c = nextc(p);
+        if (c >= 0 && ISDIGIT(c)) {
+          do {
+            if (c == '_') {
+              if (nondigit) break;
+              nondigit = c;
+              continue;
+            }
+            if (!ISDIGIT(c)) break;
+            nondigit = 0;
+            tokadd(p, c);
+          } while ((c = nextc(p)) >= 0);
+        }
+        pushback(p, c);
+        tokfix(p);
+        if (toklen(p) == start) {
+          no_digits();
+        }
+        else if (nondigit) goto trailing_uc;
+        yylval.nd = new_int(p, tok(p), 10);
+        return tINTEGER;
+      }
+      if (c == '_') {
+        /* 0_0 */
+        goto octal_number;
+      }
+      if (c == 'o' || c == 'O') {
+        /* prefixed octal */
+        c = nextc(p);
+        if (c < 0 || c == '_' || !ISDIGIT(c)) {
+          no_digits();
+        }
+      }
+      if (c >= '0' && c <= '7') {
+        /* octal */
+        octal_number:
+        do {
+          if (c == '_') {
+            if (nondigit) break;
+            nondigit = c;
+            continue;
+          }
+          if (c < '0' || c > '9') break;
+          if (c > '7') goto invalid_octal;
+          nondigit = 0;
+          tokadd(p, c);
+        } while ((c = nextc(p)) >= 0);
+
+        if (toklen(p) > start) {
+          pushback(p, c);
+          tokfix(p);
+          if (nondigit) goto trailing_uc;
+          yylval.nd = new_int(p, tok(p), 8);
+          return tINTEGER;
+        }
+        if (nondigit) {
+          pushback(p, c);
+          goto trailing_uc;
+        }
+      }
+      if (c > '7' && c <= '9') {
+        invalid_octal:
+        yyerror(p, "Invalid octal digit");
+      }
+      else if (c == '.' || c == 'e' || c == 'E') {
+        tokadd(p, '0');
+      }
+      else {
+        pushback(p, c);
+        yylval.nd = new_int(p, "0", 10);
+        return tINTEGER;
+      }
+    }
+
+    for (;;) {
+      switch (c) {
+      case '0': case '1': case '2': case '3': case '4':
+      case '5': case '6': case '7': case '8': case '9':
+        nondigit = 0;
+        tokadd(p, c);
+        break;
+
+      case '.':
+        if (nondigit) goto trailing_uc;
+        if (seen_point || seen_e) {
+          goto decode_num;
+        }
+        else {
+          int c0 = nextc(p);
+          if (c0 < 0 || !ISDIGIT(c0)) {
+            pushback(p, c0);
+            goto decode_num;
+          }
+          c = c0;
+        }
+        tokadd(p, '.');
+        tokadd(p, c);
+        is_float++;
+        seen_point++;
+        nondigit = 0;
+        break;
+
+      case 'e':
+      case 'E':
+        if (nondigit) {
+          pushback(p, c);
+          c = nondigit;
+          goto decode_num;
+        }
+        if (seen_e) {
+          goto decode_num;
+        }
+        tokadd(p, c);
+        seen_e++;
+        is_float++;
+        nondigit = c;
+        c = nextc(p);
+        if (c != '-' && c != '+') continue;
+        tokadd(p, c);
+        nondigit = c;
+        break;
+
+      case '_':       /* `_' in number just ignored */
+        if (nondigit) goto decode_num;
+        nondigit = c;
+        break;
+
+      default:
+        goto decode_num;
+      }
+      c = nextc(p);
+    }
+
+    decode_num:
+    pushback(p, c);
+    if (nondigit) {
+      trailing_uc:
+      yyerror_i(p, "trailing `%c' in number", nondigit);
+    }
+    tokfix(p);
+    if (is_float) {
+      double d;
+      char *endp;
+
+      errno = 0;
+      d = strtod(tok(p), &endp);
+      if (d == 0 && endp == tok(p)) {
+        yywarning_s(p, "corrupted float value %s", tok(p));
+      }
+      else if (errno == ERANGE) {
+        yywarning_s(p, "float %s out of range", tok(p));
+        errno = 0;
+      }
+      yylval.nd = new_float(p, tok(p));
+      return tFLOAT;
+    }
+    yylval.nd = new_int(p, tok(p), 10);
+    return tINTEGER;
+  }
+
+  case ')':
+  case ']':
+    p->paren_nest--;
+  case '}':
+    COND_LEXPOP();
+    CMDARG_LEXPOP();
+    if (c == ')')
+      p->lstate = EXPR_ENDFN;
+    else
+      p->lstate = EXPR_ENDARG;
+    return c;
+
+  case ':':
+    c = nextc(p);
+    if (c == ':') {
+      if (IS_BEG() || p->lstate == EXPR_CLASS || IS_SPCARG(-1)) {
+        p->lstate = EXPR_BEG;
+        return tCOLON3;
+      }
+      p->lstate = EXPR_DOT;
+      return tCOLON2;
+    }
+    if (IS_END() || ISSPACE(c)) {
+      pushback(p, c);
+      p->lstate = EXPR_BEG;
+      return ':';
+    }
+    pushback(p, c);
+    p->lstate = EXPR_FNAME;
+    return tSYMBEG;
+
+  case '/':
+    if (IS_BEG()) {
+      p->lex_strterm = new_strterm(p, str_regexp, '/', 0);
+      return tREGEXP_BEG;
+    }
+    if ((c = nextc(p)) == '=') {
+      yylval.id = intern_c('/');
+      p->lstate = EXPR_BEG;
+      return tOP_ASGN;
+    }
+    pushback(p, c);
+    if (IS_SPCARG(c)) {
+      p->lex_strterm = new_strterm(p, str_regexp, '/', 0);
+      return tREGEXP_BEG;
+    }
+    if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+      p->lstate = EXPR_ARG;
+    }
+    else {
+      p->lstate = EXPR_BEG;
+    }
+    return '/';
+
+  case '^':
+    if ((c = nextc(p)) == '=') {
+      yylval.id = intern_c('^');
+      p->lstate = EXPR_BEG;
+      return tOP_ASGN;
+    }
+    if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+      p->lstate = EXPR_ARG;
+    }
+    else {
+      p->lstate = EXPR_BEG;
+    }
+    pushback(p, c);
+    return '^';
+
+  case ';':
+    p->lstate = EXPR_BEG;
+    return ';';
+
+  case ',':
+    p->lstate = EXPR_BEG;
+    return ',';
+
+  case '~':
+    if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+      if ((c = nextc(p)) != '@') {
+        pushback(p, c);
+      }
+      p->lstate = EXPR_ARG;
+    }
+    else {
+      p->lstate = EXPR_BEG;
+    }
+    return '~';
+
+  case '(':
+    if (IS_BEG()) {
+      c = tLPAREN;
+    }
+    else if (IS_SPCARG(-1)) {
+      c = tLPAREN_ARG;
+    }
+    p->paren_nest++;
+    COND_PUSH(0);
+    CMDARG_PUSH(0);
+    p->lstate = EXPR_BEG;
+    return c;
+
+  case '[':
+    p->paren_nest++;
+    if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+      p->lstate = EXPR_ARG;
+      if ((c = nextc(p)) == ']') {
+        if ((c = nextc(p)) == '=') {
+          return tASET;
+        }
+        pushback(p, c);
+        return tAREF;
+      }
+      pushback(p, c);
+      return '[';
+    }
+    else if (IS_BEG()) {
+      c = tLBRACK;
+    }
+    else if (IS_ARG() && space_seen) {
+      c = tLBRACK;
+    }
+    p->lstate = EXPR_BEG;
+    COND_PUSH(0);
+    CMDARG_PUSH(0);
+    return c;
+
+  case '{':
+    if (p->lpar_beg && p->lpar_beg == p->paren_nest) {
+      p->lstate = EXPR_BEG;
+      p->lpar_beg = 0;
+      p->paren_nest--;
+      COND_PUSH(0);
+      CMDARG_PUSH(0);
+      return tLAMBEG;
+    }
+    if (IS_ARG() || p->lstate == EXPR_END || p->lstate == EXPR_ENDFN)
+      c = '{';          /* block (primary) */
+    else if (p->lstate == EXPR_ENDARG)
+      c = tLBRACE_ARG;  /* block (expr) */
+    else
+      c = tLBRACE;      /* hash */
+    COND_PUSH(0);
+    CMDARG_PUSH(0);
+    p->lstate = EXPR_BEG;
+    return c;
+
+  case '\\':
+    c = nextc(p);
+    if (c == '\n') {
+      p->lineno++;
+      p->column = 0;
+      space_seen = 1;
+      goto retry; /* skip \\n */
+    }
+    pushback(p, c);
+    return '\\';
+
+  case '%':
+    if (IS_BEG()) {
+      int term;
+      int paren;
+
+      c = nextc(p);
+      quotation:
+      if (c < 0 || !ISALNUM(c)) {
+        term = c;
+        c = 'Q';
+      }
+      else {
+        term = nextc(p);
+        if (isalnum(term)) {
+          yyerror(p, "unknown type of %string");
+          return 0;
+        }
+      }
+      if (c < 0 || term < 0) {
+        yyerror(p, "unterminated quoted string meets end of file");
+        return 0;
+      }
+      paren = term;
+      if (term == '(') term = ')';
+      else if (term == '[') term = ']';
+      else if (term == '{') term = '}';
+      else if (term == '<') term = '>';
+      else paren = 0;
+
+      switch (c) {
+      case 'Q':
+        p->lex_strterm = new_strterm(p, str_dquote, term, paren);
+        return tSTRING_BEG;
+
+      case 'q':
+        p->lex_strterm = new_strterm(p, str_squote, term, paren);
+        return parse_string(p);
+
+      case 'W':
+        p->lex_strterm = new_strterm(p, str_dword, term, paren);
+        return tWORDS_BEG;
+
+      case 'w':
+        p->lex_strterm = new_strterm(p, str_sword, term, paren);
+        return tWORDS_BEG;
+
+      case 'x':
+        p->lex_strterm = new_strterm(p, str_xquote, term, paren);
+        return tXSTRING_BEG;
+
+      case 'r':
+        p->lex_strterm = new_strterm(p, str_regexp, term, paren);
+        return tREGEXP_BEG;
+
+      case 's':
+        p->lex_strterm = new_strterm(p, str_ssym, term, paren);
+        return tSYMBEG;
+
+      case 'I':
+        p->lex_strterm = new_strterm(p, str_dsymbols, term, paren);
+        return tSYMBOLS_BEG;
+
+      case 'i':
+        p->lex_strterm = new_strterm(p, str_ssymbols, term, paren);
+        return tSYMBOLS_BEG;
+
+      default:
+        yyerror(p, "unknown type of %string");
+        return 0;
+      }
+    }
+    if ((c = nextc(p)) == '=') {
+      yylval.id = intern_c('%');
+      p->lstate = EXPR_BEG;
+      return tOP_ASGN;
+    }
+    if (IS_SPCARG(c)) {
+      goto quotation;
+    }
+    if (p->lstate == EXPR_FNAME || p->lstate == EXPR_DOT) {
+      p->lstate = EXPR_ARG;
+    }
+    else {
+      p->lstate = EXPR_BEG;
+    }
+    pushback(p, c);
+    return '%';
+
+  case '$':
+    p->lstate = EXPR_END;
+    token_column = newtok(p);
+    c = nextc(p);
+    if (c < 0) {
+      yyerror(p, "incomplete global variable syntax");
+      return 0;
+    }
+    switch (c) {
+    case '_':     /* $_: last read line string */
+      c = nextc(p);
+      if (c >= 0 && identchar(c)) { /* if there is more after _ it is a variable */
+        tokadd(p, '$');
+        tokadd(p, c);
+        break;
+      }
+      pushback(p, c);
+      c = '_';
+      /* fall through */
+    case '~':     /* $~: match-data */
+    case '*':     /* $*: argv */
+    case '$':     /* $$: pid */
+    case '?':     /* $?: last status */
+    case '!':     /* $!: error string */
+    case '@':     /* $@: error position */
+    case '/':     /* $/: input record separator */
+    case '\\':    /* $\: output record separator */
+    case ';':     /* $;: field separator */
+    case ',':     /* $,: output field separator */
+    case '.':     /* $.: last read line number */
+    case '=':     /* $=: ignorecase */
+    case ':':     /* $:: load path */
+    case '<':     /* $<: reading filename */
+    case '>':     /* $>: default output handle */
+    case '\"':    /* $": already loaded files */
+      tokadd(p, '$');
+      tokadd(p, c);
+      tokfix(p);
+      yylval.id = intern_cstr(tok(p));
+      return tGVAR;
+
+    case '-':
+      tokadd(p, '$');
+      tokadd(p, c);
+      c = nextc(p);
+      pushback(p, c);
+      gvar:
+      tokfix(p);
+      yylval.id = intern_cstr(tok(p));
+      return tGVAR;
+
+    case '&':     /* $&: last match */
+    case '`':     /* $`: string before last match */
+    case '\'':    /* $': string after last match */
+    case '+':     /* $+: string matches last pattern */
+      if (last_state == EXPR_FNAME) {
+        tokadd(p, '$');
+        tokadd(p, c);
+        goto gvar;
+      }
+      yylval.nd = new_back_ref(p, c);
+      return tBACK_REF;
+
+    case '1': case '2': case '3':
+    case '4': case '5': case '6':
+    case '7': case '8': case '9':
+      do {
+        tokadd(p, c);
+        c = nextc(p);
+      } while (c >= 0 && isdigit(c));
+      pushback(p, c);
+      if (last_state == EXPR_FNAME) goto gvar;
+      tokfix(p);
+      yylval.nd = new_nth_ref(p, atoi(tok(p)));
+      return tNTH_REF;
+
+    default:
+      if (!identchar(c)) {
+        pushback(p,  c);
+        return '$';
+      }
+    case '0':
+      tokadd(p, '$');
+    }
+    break;
+
+    case '@':
+      c = nextc(p);
+      token_column = newtok(p);
+      tokadd(p, '@');
+      if (c == '@') {
+        tokadd(p, '@');
+        c = nextc(p);
+      }
+      if (c < 0) {
+        if (p->bidx == 1) {
+          yyerror(p, "incomplete instance variable syntax");
+        }
+        else {
+          yyerror(p, "incomplete class variable syntax");
+        }
+        return 0;
+      }
+      else if (isdigit(c)) {
+        if (p->bidx == 1) {
+          yyerror_i(p, "`@%c' is not allowed as an instance variable name", c);
+        }
+        else {
+          yyerror_i(p, "`@@%c' is not allowed as a class variable name", c);
+        }
+        return 0;
+      }
+      if (!identchar(c)) {
+        pushback(p, c);
+        return '@';
+      }
+      break;
+
+    case '_':
+      token_column = newtok(p);
+      break;
+
+    default:
+      if (!identchar(c)) {
+        yyerror_i(p,  "Invalid char `\\x%02X' in expression", c);
+        goto retry;
+      }
+
+      token_column = newtok(p);
+      break;
+  }
+
+  do {
+    tokadd(p, c);
+    c = nextc(p);
+    if (c < 0) break;
+  } while (identchar(c));
+  if (token_column == 0 && toklen(p) == 7 && (c < 0 || c == '\n') &&
+      strncmp(tok(p), "__END__", toklen(p)) == 0)
+    return -1;
+
+  switch (tok(p)[0]) {
+  case '@': case '$':
+    pushback(p, c);
+    break;
+  default:
+    if ((c == '!' || c == '?') && !peek(p, '=')) {
+      tokadd(p, c);
+    }
+    else {
+      pushback(p, c);
+    }
+  }
+  tokfix(p);
+  {
+    int result = 0;
+
+    switch (tok(p)[0]) {
+    case '$':
+      p->lstate = EXPR_END;
+      result = tGVAR;
+      break;
+    case '@':
+      p->lstate = EXPR_END;
+      if (tok(p)[1] == '@')
+        result = tCVAR;
+      else
+        result = tIVAR;
+      break;
+
+    default:
+      if (toklast(p) == '!' || toklast(p) == '?') {
+        result = tFID;
+      }
+      else {
+        if (p->lstate == EXPR_FNAME) {
+          if ((c = nextc(p)) == '=' && !peek(p, '~') && !peek(p, '>') &&
+              (!peek(p, '=') || (peek_n(p, '>', 1)))) {
+            result = tIDENTIFIER;
+            tokadd(p, c);
+            tokfix(p);
+          }
+          else {
+            pushback(p, c);
+          }
+        }
+        if (result == 0 && ISUPPER(tok(p)[0])) {
+          result = tCONSTANT;
+        }
+        else {
+          result = tIDENTIFIER;
+        }
+      }
+
+      if (IS_LABEL_POSSIBLE()) {
+        if (IS_LABEL_SUFFIX(0)) {
+          p->lstate = EXPR_BEG;
+          nextc(p);
+          tokfix(p);
+          yylval.id = intern_cstr(tok(p));
+          return tLABEL;
+        }
+      }
+      if (p->lstate != EXPR_DOT) {
+        const struct kwtable *kw;
+
+        /* See if it is a reserved word.  */
+        kw = mrb_reserved_word(tok(p), toklen(p));
+        if (kw) {
+          enum mrb_lex_state_enum state = p->lstate;
+          yylval.num = p->lineno;
+          p->lstate = kw->state;
+          if (state == EXPR_FNAME) {
+            yylval.id = intern_cstr(kw->name);
+            return kw->id[0];
+          }
+          if (p->lstate == EXPR_BEG) {
+            p->cmd_start = TRUE;
+          }
+          if (kw->id[0] == keyword_do) {
+            if (p->lpar_beg && p->lpar_beg == p->paren_nest) {
+              p->lpar_beg = 0;
+              p->paren_nest--;
+              return keyword_do_LAMBDA;
+            }
+            if (COND_P()) return keyword_do_cond;
+            if (CMDARG_P() && state != EXPR_CMDARG)
+              return keyword_do_block;
+            if (state == EXPR_ENDARG || state == EXPR_BEG)
+              return keyword_do_block;
+            return keyword_do;
+          }
+          if (state == EXPR_BEG || state == EXPR_VALUE)
+            return kw->id[0];
+          else {
+            if (kw->id[0] != kw->id[1])
+              p->lstate = EXPR_BEG;
+            return kw->id[1];
+          }
+        }
+      }
+
+      if (IS_BEG() || p->lstate == EXPR_DOT || IS_ARG()) {
+        if (cmd_state) {
+          p->lstate = EXPR_CMDARG;
+        }
+        else {
+          p->lstate = EXPR_ARG;
+        }
+      }
+      else if (p->lstate == EXPR_FNAME) {
+        p->lstate = EXPR_ENDFN;
+      }
+      else {
+        p->lstate = EXPR_END;
+      }
+    }
+    {
+      mrb_sym ident = intern_cstr(tok(p));
+
+      yylval.id = ident;
+#if 0
+      if (last_state != EXPR_DOT && islower(tok(p)[0]) && lvar_defined(ident)) {
+        p->lstate = EXPR_END;
+      }
+#endif
+    }
+    return result;
+  }
+}
+
+static int
+yylex(void *lval, parser_state *p)
+{
+  p->ylval = lval;
+  return parser_yylex(p);
+}
+
+static void
+parser_init_cxt(parser_state *p, mrbc_context *cxt)
+{
+  if (!cxt) return;
+  if (cxt->filename) mrb_parser_set_filename(p, cxt->filename);
+  if (cxt->lineno) p->lineno = cxt->lineno;
+  if (cxt->syms) {
+    int i;
+
+    p->locals = cons(0,0);
+    for (i=0; i<cxt->slen; i++) {
+      local_add_f(p, cxt->syms[i]);
+    }
+  }
+  p->capture_errors = cxt->capture_errors;
+  p->no_optimize = cxt->no_optimize;
+  if (cxt->partial_hook) {
+    p->cxt = cxt;
+  }
+}
+
+static void
+parser_update_cxt(parser_state *p, mrbc_context *cxt)
+{
+  node *n, *n0;
+  int i = 0;
+
+  if (!cxt) return;
+  if ((int)(intptr_t)p->tree->car != NODE_SCOPE) return;
+  n0 = n = p->tree->cdr->car;
+  while (n) {
+    i++;
+    n = n->cdr;
+  }
+  cxt->syms = (mrb_sym *)mrb_realloc(p->mrb, cxt->syms, i*sizeof(mrb_sym));
+  cxt->slen = i;
+  for (i=0, n=n0; n; i++,n=n->cdr) {
+    cxt->syms[i] = sym(n->car);
+  }
+}
+
+void mrb_codedump_all(mrb_state*, struct RProc*);
+void mrb_parser_dump(mrb_state *mrb, node *tree, int offset);
+
+MRB_API void
+mrb_parser_parse(parser_state *p, mrbc_context *c)
+{
+  struct mrb_jmpbuf buf;
+  p->jmp = &buf;
+
+  MRB_TRY(p->jmp) {
+
+    p->cmd_start = TRUE;
+    p->in_def = p->in_single = 0;
+    p->nerr = p->nwarn = 0;
+    p->lex_strterm = NULL;
+
+    parser_init_cxt(p, c);
+    yyparse(p);
+    if (!p->tree) {
+      p->tree = new_nil(p);
+    }
+    parser_update_cxt(p, c);
+    if (c && c->dump_result) {
+      mrb_parser_dump(p->mrb, p->tree, 0);
+    }
+
+  }
+  MRB_CATCH(p->jmp) {
+    yyerror(p, "memory allocation error");
+    p->nerr++;
+    p->tree = 0;
+    return;
+  }
+  MRB_END_EXC(p->jmp);
+}
+
+MRB_API parser_state*
+mrb_parser_new(mrb_state *mrb)
+{
+  mrb_pool *pool;
+  parser_state *p;
+  static const parser_state parser_state_zero = { 0 };
+
+  pool = mrb_pool_open(mrb);
+  if (!pool) return NULL;
+  p = (parser_state *)mrb_pool_alloc(pool, sizeof(parser_state));
+  if (!p) return NULL;
+
+  *p = parser_state_zero;
+  p->mrb = mrb;
+  p->pool = pool;
+
+  p->s = p->send = NULL;
+#ifdef ENABLE_STDIO
+  p->f = NULL;
+#endif
+
+  p->cmd_start = TRUE;
+  p->in_def = p->in_single = 0;
+
+  p->capture_errors = FALSE;
+  p->lineno = 1;
+  p->column = 0;
+#if defined(PARSER_TEST) || defined(PARSER_DEBUG)
+  yydebug = 1;
+#endif
+
+  p->lex_strterm = NULL;
+  p->all_heredocs = p->parsing_heredoc = NULL;
+  p->lex_strterm_before_heredoc = NULL;
+
+  p->current_filename_index = -1;
+  p->filename_table = NULL;
+  p->filename_table_length = 0;
+
+  return p;
+}
+
+MRB_API void
+mrb_parser_free(parser_state *p) {
+  mrb_pool_close(p->pool);
+}
+
+MRB_API mrbc_context*
+mrbc_context_new(mrb_state *mrb)
+{
+  return (mrbc_context *)mrb_calloc(mrb, 1, sizeof(mrbc_context));
+}
+
+MRB_API void
+mrbc_context_free(mrb_state *mrb, mrbc_context *cxt)
+{
+  mrb_free(mrb, cxt->syms);
+  mrb_free(mrb, cxt);
+}
+
+MRB_API const char*
+mrbc_filename(mrb_state *mrb, mrbc_context *c, const char *s)
+{
+  if (s) {
+    int len = strlen(s);
+    char *p = (char *)mrb_alloca(mrb, len + 1);
+
+    memcpy(p, s, len + 1);
+    c->filename = p;
+  }
+  return c->filename;
+}
+
+MRB_API void
+mrbc_partial_hook(mrb_state *mrb, mrbc_context *c, int (*func)(struct mrb_parser_state*), void *data)
+{
+  c->partial_hook = func;
+  c->partial_data = data;
+}
+
+MRB_API void
+mrb_parser_set_filename(struct mrb_parser_state *p, const char *f)
+{
+  mrb_sym sym;
+  size_t i;
+  mrb_sym* new_table;
+
+  sym = mrb_intern_cstr(p->mrb, f);
+  p->filename = mrb_sym2name_len(p->mrb, sym, NULL);
+  p->lineno = (p->filename_table_length > 0)? 0 : 1;
+
+  for (i = 0; i < p->filename_table_length; ++i) {
+    if (p->filename_table[i] == sym) {
+      p->current_filename_index = i;
+      return;
+    }
+  }
+
+  p->current_filename_index = p->filename_table_length++;
+
+  new_table = (mrb_sym*)parser_palloc(p, sizeof(mrb_sym) * p->filename_table_length);
+  if (p->filename_table) {
+    memmove(new_table, p->filename_table, sizeof(mrb_sym) * p->filename_table_length);
+  }
+  p->filename_table = new_table;
+  p->filename_table[p->filename_table_length - 1] = sym;
+}
+
+MRB_API char const*
+mrb_parser_get_filename(struct mrb_parser_state* p, uint16_t idx) {
+  if (idx >= p->filename_table_length) { return NULL; }
+  else {
+    return mrb_sym2name_len(p->mrb, p->filename_table[idx], NULL);
+  }
+}
+
+#ifdef ENABLE_STDIO
+MRB_API parser_state*
+mrb_parse_file(mrb_state *mrb, FILE *f, mrbc_context *c)
+{
+  parser_state *p;
+
+  p = mrb_parser_new(mrb);
+  if (!p) return NULL;
+  p->s = p->send = NULL;
+  p->f = f;
+
+  mrb_parser_parse(p, c);
+  return p;
+}
+#endif
+
+MRB_API parser_state*
+mrb_parse_nstring(mrb_state *mrb, const char *s, int len, mrbc_context *c)
+{
+  parser_state *p;
+
+  p = mrb_parser_new(mrb);
+  if (!p) return NULL;
+  p->s = s;
+  p->send = s + len;
+
+  mrb_parser_parse(p, c);
+  return p;
+}
+
+MRB_API parser_state*
+mrb_parse_string(mrb_state *mrb, const char *s, mrbc_context *c)
+{
+  return mrb_parse_nstring(mrb, s, strlen(s), c);
+}
+
+static mrb_value
+load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c)
+{
+  struct RClass *target = mrb->object_class;
+  struct RProc *proc;
+  mrb_value v;
+  unsigned int keep = 0;
+
+  if (!p) {
+    return mrb_undef_value();
+  }
+  if (!p->tree || p->nerr) {
+    if (p->capture_errors) {
+      char buf[256];
+      int n;
+
+      n = snprintf(buf, sizeof(buf), "line %d: %s\n",
+          p->error_buffer[0].lineno, p->error_buffer[0].message);
+      mrb->exc = mrb_obj_ptr(mrb_exc_new(mrb, E_SYNTAX_ERROR, buf, n));
+      mrb_parser_free(p);
+      return mrb_undef_value();
+    }
+    else {
+      mrb->exc = mrb_obj_ptr(mrb_exc_new_str_lit(mrb, E_SYNTAX_ERROR, "syntax error"));
+      mrb_parser_free(p);
+      return mrb_undef_value();
+    }
+  }
+  proc = mrb_generate_code(mrb, p);
+  mrb_parser_free(p);
+  if (proc == NULL) {
+    mrb->exc = mrb_obj_ptr(mrb_exc_new_str_lit(mrb, E_SCRIPT_ERROR, "codegen error"));
+    return mrb_undef_value();
+  }
+  if (c) {
+    if (c->dump_result) mrb_codedump_all(mrb, proc);
+    if (c->no_exec) return mrb_obj_value(proc);
+    if (c->target_class) {
+      target = c->target_class;
+    }
+    if (c->keep_lv) {
+      keep = c->slen + 1;
+    }
+    else {
+      c->keep_lv = TRUE;
+    }
+  }
+  proc->target_class = target;
+  if (mrb->c->ci) {
+    mrb->c->ci->target_class = target;
+  }
+  v = mrb_toplevel_run_keep(mrb, proc, keep);
+  if (mrb->exc) return mrb_nil_value();
+  return v;
+}
+
+#ifdef ENABLE_STDIO
+MRB_API mrb_value
+mrb_load_file_cxt(mrb_state *mrb, FILE *f, mrbc_context *c)
+{
+  return load_exec(mrb, mrb_parse_file(mrb, f, c), c);
+}
+
+MRB_API mrb_value
+mrb_load_file(mrb_state *mrb, FILE *f)
+{
+  return mrb_load_file_cxt(mrb, f, NULL);
+}
+#endif
+
+MRB_API mrb_value
+mrb_load_nstring_cxt(mrb_state *mrb, const char *s, int len, mrbc_context *c)
+{
+  return load_exec(mrb, mrb_parse_nstring(mrb, s, len, c), c);
+}
+
+MRB_API mrb_value
+mrb_load_nstring(mrb_state *mrb, const char *s, int len)
+{
+  return mrb_load_nstring_cxt(mrb, s, len, NULL);
+}
+
+MRB_API mrb_value
+mrb_load_string_cxt(mrb_state *mrb, const char *s, mrbc_context *c)
+{
+  return mrb_load_nstring_cxt(mrb, s, strlen(s), c);
+}
+
+MRB_API mrb_value
+mrb_load_string(mrb_state *mrb, const char *s)
+{
+  return mrb_load_string_cxt(mrb, s, NULL);
+}
+
+#ifdef ENABLE_STDIO
+
+static void
+dump_prefix(node *tree, int offset)
+{
+  printf("%05d ", tree->lineno);
+  while (offset--) {
+    putc(' ', stdout);
+    putc(' ', stdout);
+  }
+}
+
+static void
+dump_recur(mrb_state *mrb, node *tree, int offset)
+{
+  while (tree) {
+    mrb_parser_dump(mrb, tree->car, offset);
+    tree = tree->cdr;
+  }
+}
+
+#endif
+
+void
+mrb_parser_dump(mrb_state *mrb, node *tree, int offset)
+{
+#ifdef ENABLE_STDIO
+  int nodetype;
+
+  if (!tree) return;
+  again:
+  dump_prefix(tree, offset);
+  nodetype = (int)(intptr_t)tree->car;
+  tree = tree->cdr;
+  switch (nodetype) {
+  case NODE_BEGIN:
+    printf("NODE_BEGIN:\n");
+    dump_recur(mrb, tree, offset+1);
+    break;
+
+  case NODE_RESCUE:
+    printf("NODE_RESCUE:\n");
+    if (tree->car) {
+      dump_prefix(tree, offset+1);
+      printf("body:\n");
+      mrb_parser_dump(mrb, tree->car, offset+2);
+    }
+    tree = tree->cdr;
+    if (tree->car) {
+      node *n2 = tree->car;
+
+      dump_prefix(n2, offset+1);
+      printf("rescue:\n");
+      while (n2) {
+        node *n3 = n2->car;
+        if (n3->car) {
+          dump_prefix(n2, offset+2);
+          printf("handle classes:\n");
+          dump_recur(mrb, n3->car, offset+3);
+        }
+        if (n3->cdr->car) {
+          dump_prefix(n3, offset+2);
+          printf("exc_var:\n");
+          mrb_parser_dump(mrb, n3->cdr->car, offset+3);
+        }
+        if (n3->cdr->cdr->car) {
+          dump_prefix(n3, offset+2);
+          printf("rescue body:\n");
+          mrb_parser_dump(mrb, n3->cdr->cdr->car, offset+3);
+        }
+        n2 = n2->cdr;
+      }
+    }
+    tree = tree->cdr;
+    if (tree->car) {
+      dump_prefix(tree, offset+1);
+      printf("else:\n");
+      mrb_parser_dump(mrb, tree->car, offset+2);
+    }
+    break;
+
+  case NODE_ENSURE:
+    printf("NODE_ENSURE:\n");
+    dump_prefix(tree, offset+1);
+    printf("body:\n");
+    mrb_parser_dump(mrb, tree->car, offset+2);
+    dump_prefix(tree, offset+1);
+    printf("ensure:\n");
+    mrb_parser_dump(mrb, tree->cdr->cdr, offset+2);
+    break;
+
+  case NODE_LAMBDA:
+    printf("NODE_BLOCK:\n");
+    goto block;
+
+  case NODE_BLOCK:
+    block:
+    printf("NODE_BLOCK:\n");
+    tree = tree->cdr;
+    if (tree->car) {
+      node *n = tree->car;
+
+      if (n->car) {
+        dump_prefix(n, offset+1);
+        printf("mandatory args:\n");
+        dump_recur(mrb, n->car, offset+2);
+      }
+      n = n->cdr;
+      if (n->car) {
+        dump_prefix(n, offset+1);
+        printf("optional args:\n");
+        {
+          node *n2 = n->car;
+
+          while (n2) {
+            dump_prefix(n2, offset+2);
+            printf("%s=", mrb_sym2name(mrb, sym(n2->car->car)));
+            mrb_parser_dump(mrb, n2->car->cdr, 0);
+            n2 = n2->cdr;
+          }
+        }
+      }
+      n = n->cdr;
+      if (n->car) {
+        dump_prefix(n, offset+1);
+        printf("rest=*%s\n", mrb_sym2name(mrb, sym(n->car)));
+      }
+      n = n->cdr;
+      if (n->car) {
+        dump_prefix(n, offset+1);
+        printf("post mandatory args:\n");
+        dump_recur(mrb, n->car, offset+2);
+      }
+      n = n->cdr;
+      if (n) {
+        dump_prefix(n, offset+1);
+        printf("blk=&%s\n", mrb_sym2name(mrb, sym(n)));
+      }
+    }
+    dump_prefix(tree, offset+1);
+    printf("body:\n");
+    mrb_parser_dump(mrb, tree->cdr->car, offset+2);
+    break;
+
+  case NODE_IF:
+    printf("NODE_IF:\n");
+    dump_prefix(tree, offset+1);
+    printf("cond:\n");
+    mrb_parser_dump(mrb, tree->car, offset+2);
+    dump_prefix(tree, offset+1);
+    printf("then:\n");
+    mrb_parser_dump(mrb, tree->cdr->car, offset+2);
+    if (tree->cdr->cdr->car) {
+      dump_prefix(tree, offset+1);
+      printf("else:\n");
+      mrb_parser_dump(mrb, tree->cdr->cdr->car, offset+2);
+    }
+    break;
+
+  case NODE_AND:
+    printf("NODE_AND:\n");
+    mrb_parser_dump(mrb, tree->car, offset+1);
+    mrb_parser_dump(mrb, tree->cdr, offset+1);
+    break;
+
+  case NODE_OR:
+    printf("NODE_OR:\n");
+    mrb_parser_dump(mrb, tree->car, offset+1);
+    mrb_parser_dump(mrb, tree->cdr, offset+1);
+    break;
+
+  case NODE_CASE:
+    printf("NODE_CASE:\n");
+    if (tree->car) {
+      mrb_parser_dump(mrb, tree->car, offset+1);
+    }
+    tree = tree->cdr;
+    while (tree) {
+      dump_prefix(tree, offset+1);
+      printf("case:\n");
+      dump_recur(mrb, tree->car->car, offset+2);
+      dump_prefix(tree, offset+1);
+      printf("body:\n");
+      mrb_parser_dump(mrb, tree->car->cdr, offset+2);
+      tree = tree->cdr;
+    }
+    break;
+
+  case NODE_WHILE:
+    printf("NODE_WHILE:\n");
+    dump_prefix(tree, offset+1);
+    printf("cond:\n");
+    mrb_parser_dump(mrb, tree->car, offset+2);
+    dump_prefix(tree, offset+1);
+    printf("body:\n");
+    mrb_parser_dump(mrb, tree->cdr, offset+2);
+    break;
+
+  case NODE_UNTIL:
+    printf("NODE_UNTIL:\n");
+    dump_prefix(tree, offset+1);
+    printf("cond:\n");
+    mrb_parser_dump(mrb, tree->car, offset+2);
+    dump_prefix(tree, offset+1);
+    printf("body:\n");
+    mrb_parser_dump(mrb, tree->cdr, offset+2);
+    break;
+
+  case NODE_FOR:
+    printf("NODE_FOR:\n");
+    dump_prefix(tree, offset+1);
+    printf("var:\n");
+    {
+      node *n2 = tree->car;
+
+      if (n2->car) {
+        dump_prefix(n2, offset+2);
+        printf("pre:\n");
+        dump_recur(mrb, n2->car, offset+3);
+      }
+      n2 = n2->cdr;
+      if (n2) {
+        if (n2->car) {
+          dump_prefix(n2, offset+2);
+          printf("rest:\n");
+          mrb_parser_dump(mrb, n2->car, offset+3);
+        }
+        n2 = n2->cdr;
+        if (n2) {
+          if (n2->car) {
+            dump_prefix(n2, offset+2);
+            printf("post:\n");
+            dump_recur(mrb, n2->car, offset+3);
+          }
+        }
+      }
+    }
+    tree = tree->cdr;
+    dump_prefix(tree, offset+1);
+    printf("in:\n");
+    mrb_parser_dump(mrb, tree->car, offset+2);
+    tree = tree->cdr;
+    dump_prefix(tree, offset+1);
+    printf("do:\n");
+    mrb_parser_dump(mrb, tree->car, offset+2);
+    break;
+
+  case NODE_SCOPE:
+    printf("NODE_SCOPE:\n");
+    {
+      node *n2 = tree->car;
+      mrb_bool first_lval = TRUE;
+
+      if (n2 && (n2->car || n2->cdr)) {
+        dump_prefix(n2, offset+1);
+        printf("local variables:\n");
+        dump_prefix(n2, offset+2);
+        while (n2) {
+          if (n2->car) {
+            if (!first_lval) printf(", ");
+            printf("%s", mrb_sym2name(mrb, sym(n2->car)));
+            first_lval = FALSE;
+          }
+          n2 = n2->cdr;
+        }
+        printf("\n");
+      }
+    }
+    tree = tree->cdr;
+    offset++;
+    goto again;
+
+  case NODE_FCALL:
+  case NODE_CALL:
+    printf("NODE_CALL:\n");
+    mrb_parser_dump(mrb, tree->car, offset+1);
+    dump_prefix(tree, offset+1);
+    printf("method='%s' (%d)\n",
+        mrb_sym2name(mrb, sym(tree->cdr->car)),
+        (int)(intptr_t)tree->cdr->car);
+    tree = tree->cdr->cdr->car;
+    if (tree) {
+      dump_prefix(tree, offset+1);
+      printf("args:\n");
+      dump_recur(mrb, tree->car, offset+2);
+      if (tree->cdr) {
+        dump_prefix(tree, offset+1);
+        printf("block:\n");
+        mrb_parser_dump(mrb, tree->cdr, offset+2);
+      }
+    }
+    break;
+
+  case NODE_DOT2:
+    printf("NODE_DOT2:\n");
+    mrb_parser_dump(mrb, tree->car, offset+1);
+    mrb_parser_dump(mrb, tree->cdr, offset+1);
+    break;
+
+  case NODE_DOT3:
+    printf("NODE_DOT3:\n");
+    mrb_parser_dump(mrb, tree->car, offset+1);
+    mrb_parser_dump(mrb, tree->cdr, offset+1);
+    break;
+
+  case NODE_COLON2:
+    printf("NODE_COLON2:\n");
+    mrb_parser_dump(mrb, tree->car, offset+1);
+    dump_prefix(tree, offset+1);
+    printf("::%s\n", mrb_sym2name(mrb, sym(tree->cdr)));
+    break;
+
+  case NODE_COLON3:
+    printf("NODE_COLON3:\n");
+    dump_prefix(tree, offset+1);
+    printf("::%s\n", mrb_sym2name(mrb, sym(tree)));
+    break;
+
+  case NODE_ARRAY:
+    printf("NODE_ARRAY:\n");
+    dump_recur(mrb, tree, offset+1);
+    break;
+
+  case NODE_HASH:
+    printf("NODE_HASH:\n");
+    while (tree) {
+      dump_prefix(tree, offset+1);
+      printf("key:\n");
+      mrb_parser_dump(mrb, tree->car->car, offset+2);
+      dump_prefix(tree, offset+1);
+      printf("value:\n");
+      mrb_parser_dump(mrb, tree->car->cdr, offset+2);
+      tree = tree->cdr;
+    }
+    break;
+
+  case NODE_SPLAT:
+    printf("NODE_SPLAT:\n");
+    mrb_parser_dump(mrb, tree, offset+1);
+    break;
+
+  case NODE_ASGN:
+    printf("NODE_ASGN:\n");
+    dump_prefix(tree, offset+1);
+    printf("lhs:\n");
+    mrb_parser_dump(mrb, tree->car, offset+2);
+    dump_prefix(tree, offset+1);
+    printf("rhs:\n");
+    mrb_parser_dump(mrb, tree->cdr, offset+2);
+    break;
+
+  case NODE_MASGN:
+    printf("NODE_MASGN:\n");
+    dump_prefix(tree, offset+1);
+    printf("mlhs:\n");
+    {
+      node *n2 = tree->car;
+
+      if (n2->car) {
+        dump_prefix(tree, offset+2);
+        printf("pre:\n");
+        dump_recur(mrb, n2->car, offset+3);
+      }
+      n2 = n2->cdr;
+      if (n2) {
+        if (n2->car) {
+          dump_prefix(n2, offset+2);
+          printf("rest:\n");
+          if (n2->car == (node*)-1) {
+            dump_prefix(n2, offset+2);
+            printf("(empty)\n");
+          }
+          else {
+            mrb_parser_dump(mrb, n2->car, offset+3);
+          }
+        }
+        n2 = n2->cdr;
+        if (n2) {
+          if (n2->car) {
+            dump_prefix(n2, offset+2);
+            printf("post:\n");
+            dump_recur(mrb, n2->car, offset+3);
+          }
+        }
+      }
+    }
+    dump_prefix(tree, offset+1);
+    printf("rhs:\n");
+    mrb_parser_dump(mrb, tree->cdr, offset+2);
+    break;
+
+  case NODE_OP_ASGN:
+    printf("NODE_OP_ASGN:\n");
+    dump_prefix(tree, offset+1);
+    printf("lhs:\n");
+    mrb_parser_dump(mrb, tree->car, offset+2);
+    tree = tree->cdr;
+    dump_prefix(tree, offset+1);
+    printf("op='%s' (%d)\n", mrb_sym2name(mrb, sym(tree->car)), (int)(intptr_t)tree->car);
+    tree = tree->cdr;
+    mrb_parser_dump(mrb, tree->car, offset+1);
+    break;
+
+  case NODE_SUPER:
+    printf("NODE_SUPER:\n");
+    if (tree) {
+      dump_prefix(tree, offset+1);
+      printf("args:\n");
+      dump_recur(mrb, tree->car, offset+2);
+      if (tree->cdr) {
+        dump_prefix(tree, offset+1);
+        printf("block:\n");
+        mrb_parser_dump(mrb, tree->cdr, offset+2);
+      }
+    }
+    break;
+
+  case NODE_ZSUPER:
+    printf("NODE_ZSUPER\n");
+    break;
+
+  case NODE_RETURN:
+    printf("NODE_RETURN:\n");
+    mrb_parser_dump(mrb, tree, offset+1);
+    break;
+
+  case NODE_YIELD:
+    printf("NODE_YIELD:\n");
+    dump_recur(mrb, tree, offset+1);
+    break;
+
+  case NODE_BREAK:
+    printf("NODE_BREAK:\n");
+    mrb_parser_dump(mrb, tree, offset+1);
+    break;
+
+  case NODE_NEXT:
+    printf("NODE_NEXT:\n");
+    mrb_parser_dump(mrb, tree, offset+1);
+    break;
+
+  case NODE_REDO:
+    printf("NODE_REDO\n");
+    break;
+
+  case NODE_RETRY:
+    printf("NODE_RETRY\n");
+    break;
+
+  case NODE_LVAR:
+    printf("NODE_LVAR %s\n", mrb_sym2name(mrb, sym(tree)));
+    break;
+
+  case NODE_GVAR:
+    printf("NODE_GVAR %s\n", mrb_sym2name(mrb, sym(tree)));
+    break;
+
+  case NODE_IVAR:
+    printf("NODE_IVAR %s\n", mrb_sym2name(mrb, sym(tree)));
+    break;
+
+  case NODE_CVAR:
+    printf("NODE_CVAR %s\n", mrb_sym2name(mrb, sym(tree)));
+    break;
+
+  case NODE_CONST:
+    printf("NODE_CONST %s\n", mrb_sym2name(mrb, sym(tree)));
+    break;
+
+  case NODE_MATCH:
+    printf("NODE_MATCH:\n");
+    dump_prefix(tree, offset + 1);
+    printf("lhs:\n");
+    mrb_parser_dump(mrb, tree->car, offset + 2);
+    dump_prefix(tree, offset + 1);
+    printf("rhs:\n");
+    mrb_parser_dump(mrb, tree->cdr, offset + 2);
+    break;
+
+  case NODE_BACK_REF:
+    printf("NODE_BACK_REF: $%c\n", (int)(intptr_t)tree);
+    break;
+
+  case NODE_NTH_REF:
+    printf("NODE_NTH_REF: $%d\n", (int)(intptr_t)tree);
+    break;
+
+  case NODE_ARG:
+    printf("NODE_ARG %s\n", mrb_sym2name(mrb, sym(tree)));
+    break;
+
+  case NODE_BLOCK_ARG:
+    printf("NODE_BLOCK_ARG:\n");
+    mrb_parser_dump(mrb, tree, offset+1);
+    break;
+
+  case NODE_INT:
+    printf("NODE_INT %s base %d\n", (char*)tree->car, (int)(intptr_t)tree->cdr->car);
+    break;
+
+  case NODE_FLOAT:
+    printf("NODE_FLOAT %s\n", (char*)tree);
+    break;
+
+  case NODE_NEGATE:
+    printf("NODE_NEGATE\n");
+    mrb_parser_dump(mrb, tree, offset+1);
+    break;
+
+  case NODE_STR:
+    printf("NODE_STR \"%s\" len %d\n", (char*)tree->car, (int)(intptr_t)tree->cdr);
+    break;
+
+  case NODE_DSTR:
+    printf("NODE_DSTR\n");
+    dump_recur(mrb, tree, offset+1);
+    break;
+
+  case NODE_XSTR:
+    printf("NODE_XSTR \"%s\" len %d\n", (char*)tree->car, (int)(intptr_t)tree->cdr);
+    break;
+
+  case NODE_DXSTR:
+    printf("NODE_DXSTR\n");
+    dump_recur(mrb, tree, offset+1);
+    break;
+
+  case NODE_REGX:
+    printf("NODE_REGX /%s/%s\n", (char*)tree->car, (char*)tree->cdr);
+    break;
+
+  case NODE_DREGX:
+    printf("NODE_DREGX\n");
+    dump_recur(mrb, tree->car, offset+1);
+    dump_prefix(tree, offset);
+    printf("tail: %s\n", (char*)tree->cdr->cdr->car);
+    dump_prefix(tree, offset);
+    printf("opt: %s\n", (char*)tree->cdr->cdr->cdr);
+    break;
+
+  case NODE_SYM:
+    printf("NODE_SYM :%s\n", mrb_sym2name(mrb, sym(tree)));
+    break;
+
+  case NODE_SELF:
+    printf("NODE_SELF\n");
+    break;
+
+  case NODE_NIL:
+    printf("NODE_NIL\n");
+    break;
+
+  case NODE_TRUE:
+    printf("NODE_TRUE\n");
+    break;
+
+  case NODE_FALSE:
+    printf("NODE_FALSE\n");
+    break;
+
+  case NODE_ALIAS:
+    printf("NODE_ALIAS %s %s:\n",
+        mrb_sym2name(mrb, sym(tree->car)),
+        mrb_sym2name(mrb, sym(tree->cdr)));
+    break;
+
+  case NODE_UNDEF:
+    printf("NODE_UNDEF");
+    {
+      node *t = tree;
+      while (t) {
+        printf(" %s", mrb_sym2name(mrb, sym(t->car)));
+        t = t->cdr;
+      }
+    }
+    printf(":\n");
+    break;
+
+  case NODE_CLASS:
+    printf("NODE_CLASS:\n");
+    if (tree->car->car == (node*)0) {
+      dump_prefix(tree, offset+1);
+      printf(":%s\n", mrb_sym2name(mrb, sym(tree->car->cdr)));
+    }
+    else if (tree->car->car == (node*)1) {
+      dump_prefix(tree, offset+1);
+      printf("::%s\n", mrb_sym2name(mrb, sym(tree->car->cdr)));
+    }
+    else {
+      mrb_parser_dump(mrb, tree->car->car, offset+1);
+      dump_prefix(tree, offset+1);
+      printf("::%s\n", mrb_sym2name(mrb, sym(tree->car->cdr)));
+    }
+    if (tree->cdr->car) {
+      dump_prefix(tree, offset+1);
+      printf("super:\n");
+      mrb_parser_dump(mrb, tree->cdr->car, offset+2);
+    }
+    dump_prefix(tree, offset+1);
+    printf("body:\n");
+    mrb_parser_dump(mrb, tree->cdr->cdr->car->cdr, offset+2);
+    break;
+
+  case NODE_MODULE:
+    printf("NODE_MODULE:\n");
+    if (tree->car->car == (node*)0) {
+      dump_prefix(tree, offset+1);
+      printf(":%s\n", mrb_sym2name(mrb, sym(tree->car->cdr)));
+    }
+    else if (tree->car->car == (node*)1) {
+      dump_prefix(tree, offset+1);
+      printf("::%s\n", mrb_sym2name(mrb, sym(tree->car->cdr)));
+    }
+    else {
+      mrb_parser_dump(mrb, tree->car->car, offset+1);
+      dump_prefix(tree, offset+1);
+      printf("::%s\n", mrb_sym2name(mrb, sym(tree->car->cdr)));
+    }
+    dump_prefix(tree, offset+1);
+    printf("body:\n");
+    mrb_parser_dump(mrb, tree->cdr->car->cdr, offset+2);
+    break;
+
+  case NODE_SCLASS:
+    printf("NODE_SCLASS:\n");
+    mrb_parser_dump(mrb, tree->car, offset+1);
+    dump_prefix(tree, offset+1);
+    printf("body:\n");
+    mrb_parser_dump(mrb, tree->cdr->car->cdr, offset+2);
+    break;
+
+  case NODE_DEF:
+    printf("NODE_DEF:\n");
+    dump_prefix(tree, offset+1);
+    printf("%s\n", mrb_sym2name(mrb, sym(tree->car)));
+    tree = tree->cdr;
+    {
+      node *n2 = tree->car;
+      mrb_bool first_lval = TRUE;
+
+      if (n2 && (n2->car || n2->cdr)) {
+        dump_prefix(n2, offset+1);
+        printf("local variables:\n");
+        dump_prefix(n2, offset+2);
+        while (n2) {
+          if (n2->car) {
+            if (!first_lval) printf(", ");
+            printf("%s", mrb_sym2name(mrb, sym(n2->car)));
+            first_lval = FALSE;
+          }
+          n2 = n2->cdr;
+        }
+        printf("\n");
+      }
+    }
+    tree = tree->cdr;
+    if (tree->car) {
+      node *n = tree->car;
+
+      if (n->car) {
+        dump_prefix(n, offset+1);
+        printf("mandatory args:\n");
+        dump_recur(mrb, n->car, offset+2);
+      }
+      n = n->cdr;
+      if (n->car) {
+        dump_prefix(n, offset+1);
+        printf("optional args:\n");
+        {
+          node *n2 = n->car;
+
+          while (n2) {
+            dump_prefix(n2, offset+2);
+            printf("%s=", mrb_sym2name(mrb, sym(n2->car->car)));
+            mrb_parser_dump(mrb, n2->car->cdr, 0);
+            n2 = n2->cdr;
+          }
+        }
+      }
+      n = n->cdr;
+      if (n->car) {
+        dump_prefix(n, offset+1);
+        printf("rest=*%s\n", mrb_sym2name(mrb, sym(n->car)));
+      }
+      n = n->cdr;
+      if (n->car) {
+        dump_prefix(n, offset+1);
+        printf("post mandatory args:\n");
+        dump_recur(mrb, n->car, offset+2);
+      }
+      n = n->cdr;
+      if (n) {
+        dump_prefix(n, offset+1);
+        printf("blk=&%s\n", mrb_sym2name(mrb, sym(n)));
+      }
+    }
+    mrb_parser_dump(mrb, tree->cdr->car, offset+1);
+    break;
+
+  case NODE_SDEF:
+    printf("NODE_SDEF:\n");
+    mrb_parser_dump(mrb, tree->car, offset+1);
+    tree = tree->cdr;
+    dump_prefix(tree, offset+1);
+    printf(":%s\n", mrb_sym2name(mrb, sym(tree->car)));
+    tree = tree->cdr->cdr;
+    if (tree->car) {
+      node *n = tree->car;
+
+      if (n->car) {
+        dump_prefix(n, offset+1);
+        printf("mandatory args:\n");
+        dump_recur(mrb, n->car, offset+2);
+      }
+      n = n->cdr;
+      if (n->car) {
+        dump_prefix(n, offset+1);
+        printf("optional args:\n");
+        {
+          node *n2 = n->car;
+
+          while (n2) {
+            dump_prefix(n2, offset+2);
+            printf("%s=", mrb_sym2name(mrb, sym(n2->car->car)));
+            mrb_parser_dump(mrb, n2->car->cdr, 0);
+            n2 = n2->cdr;
+          }
+        }
+      }
+      n = n->cdr;
+      if (n->car) {
+        dump_prefix(n, offset+1);
+        printf("rest=*%s\n", mrb_sym2name(mrb, sym(n->car)));
+      }
+      n = n->cdr;
+      if (n->car) {
+        dump_prefix(n, offset+1);
+        printf("post mandatory args:\n");
+        dump_recur(mrb, n->car, offset+2);
+      }
+      n = n->cdr;
+      if (n) {
+        dump_prefix(n, offset+1);
+        printf("blk=&%s\n", mrb_sym2name(mrb, sym(n)));
+      }
+    }
+    tree = tree->cdr;
+    mrb_parser_dump(mrb, tree->car, offset+1);
+    break;
+
+  case NODE_POSTEXE:
+    printf("NODE_POSTEXE:\n");
+    mrb_parser_dump(mrb, tree, offset+1);
+    break;
+
+  case NODE_HEREDOC:
+    printf("NODE_HEREDOC:\n");
+    mrb_parser_dump(mrb, ((parser_heredoc_info*)tree)->doc, offset+1);
+    break;
+
+  default:
+    printf("node type: %d (0x%x)\n", nodetype, (unsigned)nodetype);
+    break;
+  }
+#endif
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pool.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,195 @@
+/*
+** pool.c - memory pool
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <stddef.h>
+#include <stdint.h>
+#include <string.h>
+#include "mruby.h"
+
+/* configuration section */
+/* allocated memory address should be multiple of POOL_ALIGNMENT */
+/* or undef it if alignment does not matter */
+#ifndef POOL_ALIGNMENT
+#define POOL_ALIGNMENT 4
+#endif
+/* page size of memory pool */
+#ifndef POOL_PAGE_SIZE
+#define POOL_PAGE_SIZE 16000
+#endif
+/* end of configuration section */
+
+struct mrb_pool_page {
+  struct mrb_pool_page *next;
+  size_t offset;
+  size_t len;
+  void *last;
+  char page[];
+};
+
+struct mrb_pool {
+  mrb_state *mrb;
+  struct mrb_pool_page *pages;
+};
+
+#undef TEST_POOL
+#ifdef TEST_POOL
+
+#define mrb_malloc_simple(m,s) malloc(s)
+#define mrb_free(m,p) free(p)
+#endif
+
+#ifdef POOL_ALIGNMENT
+#  define ALIGN_PADDING(x) ((SIZE_MAX - (x) + 1) & (POOL_ALIGNMENT - 1))
+#else
+#  define ALIGN_PADDING(x) (0)
+#endif
+
+MRB_API mrb_pool*
+mrb_pool_open(mrb_state *mrb)
+{
+  mrb_pool *pool = (mrb_pool *)mrb_malloc_simple(mrb, sizeof(mrb_pool));
+
+  if (pool) {
+    pool->mrb = mrb;
+    pool->pages = NULL;
+  }
+
+  return pool;
+}
+
+MRB_API void
+mrb_pool_close(mrb_pool *pool)
+{
+  struct mrb_pool_page *page, *tmp;
+
+  if (!pool) return;
+  page = pool->pages;
+  while (page) {
+    tmp = page;
+    page = page->next;
+    mrb_free(pool->mrb, tmp);
+  }
+  mrb_free(pool->mrb, pool);
+}
+
+static struct mrb_pool_page*
+page_alloc(mrb_pool *pool, size_t len)
+{
+  struct mrb_pool_page *page;
+
+  if (len < POOL_PAGE_SIZE)
+    len = POOL_PAGE_SIZE;
+  page = (struct mrb_pool_page *)mrb_malloc_simple(pool->mrb, sizeof(struct mrb_pool_page)+len);
+  if (page) {
+    page->offset = 0;
+    page->len = len;
+  }
+
+  return page;
+}
+
+MRB_API void*
+mrb_pool_alloc(mrb_pool *pool, size_t len)
+{
+  struct mrb_pool_page *page;
+  size_t n;
+
+  if (!pool) return NULL;
+  len += ALIGN_PADDING(len);
+  page = pool->pages;
+  while (page) {
+    if (page->offset + len <= page->len) {
+      n = page->offset;
+      page->offset += len;
+      page->last = (char*)page->page+n;
+      return page->last;
+    }
+    page = page->next;
+  }
+  page = page_alloc(pool, len);
+  if (!page) return NULL;
+  page->offset = len;
+  page->next = pool->pages;
+  pool->pages = page;
+
+  page->last = (void*)page->page;
+  return page->last;
+}
+
+MRB_API mrb_bool
+mrb_pool_can_realloc(mrb_pool *pool, void *p, size_t len)
+{
+  struct mrb_pool_page *page;
+
+  if (!pool) return FALSE;
+  len += ALIGN_PADDING(len);
+  page = pool->pages;
+  while (page) {
+    if (page->last == p) {
+      size_t beg;
+
+      beg = (char*)p - page->page;
+      if (beg + len > page->len) return FALSE;
+      return TRUE;
+    }
+    page = page->next;
+  }
+  return FALSE;
+}
+
+MRB_API void*
+mrb_pool_realloc(mrb_pool *pool, void *p, size_t oldlen, size_t newlen)
+{
+  struct mrb_pool_page *page;
+  void *np;
+
+  if (!pool) return NULL;
+  oldlen += ALIGN_PADDING(oldlen);
+  newlen += ALIGN_PADDING(newlen);
+  page = pool->pages;
+  while (page) {
+    if (page->last == p) {
+      size_t beg;
+
+      beg = (char*)p - page->page;
+      if (beg + oldlen != page->offset) break;
+      if (beg + newlen > page->len) {
+        page->offset = beg;
+        break;
+      }
+      page->offset = beg + newlen;
+      return p;
+    }
+    page = page->next;
+  }
+  np = mrb_pool_alloc(pool, newlen);
+  if (np == NULL) {
+    return NULL;
+  }
+  memcpy(np, p, oldlen);
+  return np;
+}
+
+#ifdef TEST_POOL
+int
+main(void)
+{
+  int i, len = 250;
+  mrb_pool *pool;
+  void *p;
+
+  pool = mrb_pool_open(NULL);
+  p = mrb_pool_alloc(pool, len);
+  for (i=1; i<20; i++) {
+    printf("%p (len=%d) %ud\n", p, len, mrb_pool_can_realloc(pool, p, len*2));
+    p = mrb_pool_realloc(pool, p, len, len*2);
+    len *= 2;
+  }
+  mrb_pool_close(pool);
+  return 0;
+}
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/print.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,70 @@
+/*
+** print.c - Kernel.#p
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+#include "mruby/string.h"
+#include "mruby/variable.h"
+
+static void
+printstr(mrb_state *mrb, mrb_value obj)
+{
+#ifdef ENABLE_STDIO
+  char *s;
+  int len;
+
+  if (mrb_string_p(obj)) {
+    s = RSTRING_PTR(obj);
+    len = RSTRING_LEN(obj);
+    fwrite(s, len, 1, stdout);
+  }
+#endif
+}
+
+MRB_API void
+mrb_p(mrb_state *mrb, mrb_value obj)
+{
+#ifdef ENABLE_STDIO
+  obj = mrb_funcall(mrb, obj, "inspect", 0);
+  printstr(mrb, obj);
+  putc('\n', stdout);
+#endif
+}
+
+MRB_API void
+mrb_print_error(mrb_state *mrb)
+{
+#ifdef ENABLE_STDIO
+  mrb_value s;
+
+  mrb_print_backtrace(mrb);
+  s = mrb_funcall(mrb, mrb_obj_value(mrb->exc), "inspect", 0);
+  if (mrb_string_p(s)) {
+    fwrite(RSTRING_PTR(s), RSTRING_LEN(s), 1, stderr);
+    putc('\n', stderr);
+  }
+#endif
+}
+
+MRB_API void
+mrb_show_version(mrb_state *mrb)
+{
+  mrb_value msg;
+
+  msg = mrb_const_get(mrb, mrb_obj_value(mrb->object_class), mrb_intern_lit(mrb, "MRUBY_DESCRIPTION"));
+  printstr(mrb, msg);
+  printstr(mrb, mrb_str_new_lit(mrb, "\n"));
+}
+
+MRB_API void
+mrb_show_copyright(mrb_state *mrb)
+{
+  mrb_value msg;
+
+  msg = mrb_const_get(mrb, mrb_obj_value(mrb->object_class), mrb_intern_lit(mrb, "MRUBY_COPYRIGHT"));
+  printstr(mrb, msg);
+  printstr(mrb, mrb_str_new_lit(mrb, "\n"));
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/proc.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,276 @@
+/*
+** proc.c - Proc class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+#include "mruby/class.h"
+#include "mruby/proc.h"
+#include "mruby/opcode.h"
+
+static mrb_code call_iseq[] = {
+  MKOP_A(OP_CALL, 0),
+};
+
+struct RProc *
+mrb_proc_new(mrb_state *mrb, mrb_irep *irep)
+{
+  struct RProc *p;
+  mrb_callinfo *ci = mrb->c->ci;
+
+  p = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb->proc_class);
+  p->target_class = 0;
+  if (ci) {
+    if (ci->proc)
+      p->target_class = ci->proc->target_class;
+    if (!p->target_class)
+      p->target_class = ci->target_class;
+  }
+  p->body.irep = irep;
+  p->env = 0;
+  mrb_irep_incref(mrb, irep);
+
+  return p;
+}
+
+static struct REnv*
+env_new(mrb_state *mrb, int nlocals)
+{
+  struct REnv *e;
+
+  e = (struct REnv*)mrb_obj_alloc(mrb, MRB_TT_ENV, (struct RClass*)mrb->c->ci->proc->env);
+  MRB_SET_ENV_STACK_LEN(e, nlocals);
+  e->mid = mrb->c->ci->mid;
+  e->cioff = mrb->c->ci - mrb->c->cibase;
+  e->stack = mrb->c->stack;
+
+  return e;
+}
+
+static void
+closure_setup(mrb_state *mrb, struct RProc *p, int nlocals)
+{
+  struct REnv *e;
+
+  if (!mrb->c->ci->env) {
+    e = env_new(mrb, nlocals);
+    mrb->c->ci->env = e;
+  }
+  else {
+    e = mrb->c->ci->env;
+  }
+  p->env = e;
+}
+
+struct RProc *
+mrb_closure_new(mrb_state *mrb, mrb_irep *irep)
+{
+  struct RProc *p = mrb_proc_new(mrb, irep);
+
+  closure_setup(mrb, p, mrb->c->ci->proc->body.irep->nlocals);
+  return p;
+}
+
+MRB_API struct RProc *
+mrb_proc_new_cfunc(mrb_state *mrb, mrb_func_t func)
+{
+  struct RProc *p;
+
+  p = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb->proc_class);
+  p->body.func = func;
+  p->flags |= MRB_PROC_CFUNC;
+  p->env = 0;
+
+  return p;
+}
+
+MRB_API struct RProc *
+mrb_proc_new_cfunc_with_env(mrb_state *mrb, mrb_func_t func, mrb_int argc, const mrb_value *argv)
+{
+  struct RProc *p = mrb_proc_new_cfunc(mrb, func);
+  struct REnv *e;
+  int i;
+
+  p->env = e = env_new(mrb, argc);
+  MRB_ENV_UNSHARE_STACK(e);
+  e->stack = (mrb_value*)mrb_malloc(mrb, sizeof(mrb_value) * argc);
+  if (argv) {
+    for (i = 0; i < argc; ++i) {
+      e->stack[i] = argv[i];
+    }
+  }
+  else {
+    for (i = 0; i < argc; ++i) {
+      SET_NIL_VALUE(e->stack[i]);
+    }
+  }
+  return p;
+}
+
+MRB_API struct RProc *
+mrb_closure_new_cfunc(mrb_state *mrb, mrb_func_t func, int nlocals)
+{
+  return mrb_proc_new_cfunc_with_env(mrb, func, nlocals, NULL);
+}
+
+MRB_API mrb_value
+mrb_proc_cfunc_env_get(mrb_state *mrb, mrb_int idx)
+{
+  struct RProc *p = mrb->c->ci->proc;
+  struct REnv *e = p->env;
+
+  if (!MRB_PROC_CFUNC_P(p)) {
+    mrb_raise(mrb, E_TYPE_ERROR, "Can't get cfunc env from non-cfunc proc.");
+  }
+  if (!e) {
+    mrb_raise(mrb, E_TYPE_ERROR, "Can't get cfunc env from cfunc Proc without REnv.");
+  }
+  if (idx < 0 || MRB_ENV_STACK_LEN(e) <= idx) {
+    mrb_raisef(mrb, E_INDEX_ERROR, "Env index out of range: %S (expected: 0 <= index < %S)",
+               mrb_fixnum_value(idx), mrb_fixnum_value(MRB_ENV_STACK_LEN(e)));
+  }
+
+  return e->stack[idx];
+}
+
+MRB_API void
+mrb_proc_copy(struct RProc *a, struct RProc *b)
+{
+  a->flags = b->flags;
+  a->body = b->body;
+  if (!MRB_PROC_CFUNC_P(a)) {
+    a->body.irep->refcnt++;
+  }
+  a->target_class = b->target_class;
+  a->env = b->env;
+}
+
+static mrb_value
+mrb_proc_initialize(mrb_state *mrb, mrb_value self)
+{
+  mrb_value blk;
+
+  mrb_get_args(mrb, "&", &blk);
+  if (mrb_nil_p(blk)) {
+    /* Calling Proc.new without a block is not implemented yet */
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "tried to create Proc object without a block");
+  }
+  else {
+    mrb_proc_copy(mrb_proc_ptr(self), mrb_proc_ptr(blk));
+  }
+  return self;
+}
+
+static mrb_value
+mrb_proc_init_copy(mrb_state *mrb, mrb_value self)
+{
+  mrb_value proc;
+
+  mrb_get_args(mrb, "o", &proc);
+  if (mrb_type(proc) != MRB_TT_PROC) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "not a proc");
+  }
+  mrb_proc_copy(mrb_proc_ptr(self), mrb_proc_ptr(proc));
+  return self;
+}
+
+int
+mrb_proc_cfunc_p(struct RProc *p)
+{
+  return MRB_PROC_CFUNC_P(p);
+}
+
+mrb_value
+mrb_proc_call_cfunc(mrb_state *mrb, struct RProc *p, mrb_value self)
+{
+  return (p->body.func)(mrb, self);
+}
+
+mrb_code*
+mrb_proc_iseq(mrb_state *mrb, struct RProc *p)
+{
+  return p->body.irep->iseq;
+}
+
+/* 15.2.17.4.2 */
+static mrb_value
+mrb_proc_arity(mrb_state *mrb, mrb_value self)
+{
+  struct RProc *p = mrb_proc_ptr(self);
+  mrb_code *iseq = mrb_proc_iseq(mrb, p);
+  mrb_aspec aspec;
+  int ma, ra, pa, arity;
+
+  if (MRB_PROC_CFUNC_P(p)) {
+    /* TODO cfunc aspec not implemented yet */
+    return mrb_fixnum_value(-1);
+  }
+
+  /* arity is depend on OP_ENTER */
+  if (GET_OPCODE(*iseq) != OP_ENTER) {
+    return mrb_fixnum_value(0);
+  }
+
+  aspec = GETARG_Ax(*iseq);
+  ma = MRB_ASPEC_REQ(aspec);
+  ra = MRB_ASPEC_REST(aspec);
+  pa = MRB_ASPEC_POST(aspec);
+  arity = ra ? -(ma + pa + 1) : ma + pa;
+
+  return mrb_fixnum_value(arity);
+}
+
+/* 15.3.1.2.6  */
+/* 15.3.1.3.27 */
+/*
+ * call-seq:
+ *   lambda { |...| block }  -> a_proc
+ *
+ * Equivalent to <code>Proc.new</code>, except the resulting Proc objects
+ * check the number of parameters passed when called.
+ */
+static mrb_value
+proc_lambda(mrb_state *mrb, mrb_value self)
+{
+  mrb_value blk;
+  struct RProc *p;
+
+  mrb_get_args(mrb, "&", &blk);
+  if (mrb_nil_p(blk)) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "tried to create Proc object without a block");
+  }
+  p = mrb_proc_ptr(blk);
+  if (!MRB_PROC_STRICT_P(p)) {
+    struct RProc *p2 = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, p->c);
+    mrb_proc_copy(p2, p);
+    p2->flags |= MRB_PROC_STRICT;
+    return mrb_obj_value(p2);
+  }
+  return blk;
+}
+
+void
+mrb_init_proc(mrb_state *mrb)
+{
+  struct RProc *m;
+  mrb_irep *call_irep = (mrb_irep *)mrb_malloc(mrb, sizeof(mrb_irep));
+  static const mrb_irep mrb_irep_zero = { 0 };
+
+  *call_irep = mrb_irep_zero;
+  call_irep->flags = MRB_ISEQ_NO_FREE;
+  call_irep->iseq = call_iseq;
+  call_irep->ilen = 1;
+
+  mrb_define_method(mrb, mrb->proc_class, "initialize", mrb_proc_initialize, MRB_ARGS_NONE());
+  mrb_define_method(mrb, mrb->proc_class, "initialize_copy", mrb_proc_init_copy, MRB_ARGS_REQ(1));
+  mrb_define_method(mrb, mrb->proc_class, "arity", mrb_proc_arity, MRB_ARGS_NONE());
+
+  m = mrb_proc_new(mrb, call_irep);
+  mrb_define_method_raw(mrb, mrb->proc_class, mrb_intern_lit(mrb, "call"), m);
+  mrb_define_method_raw(mrb, mrb->proc_class, mrb_intern_lit(mrb, "[]"), m);
+
+  mrb_define_class_method(mrb, mrb->kernel_module, "lambda", proc_lambda, MRB_ARGS_NONE()); /* 15.3.1.2.6  */
+  mrb_define_method(mrb, mrb->kernel_module,       "lambda", proc_lambda, MRB_ARGS_NONE()); /* 15.3.1.3.27 */
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/range.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,435 @@
+/*
+** range.c - Range class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include "mruby.h"
+#include "mruby/class.h"
+#include "mruby/range.h"
+#include "mruby/string.h"
+#include "mruby/array.h"
+
+#define RANGE_CLASS (mrb_class_get(mrb, "Range"))
+
+static void
+range_check(mrb_state *mrb, mrb_value a, mrb_value b)
+{
+  mrb_value ans;
+  enum mrb_vtype ta;
+  enum mrb_vtype tb;
+
+  ta = mrb_type(a);
+  tb = mrb_type(b);
+  if ((ta == MRB_TT_FIXNUM || ta == MRB_TT_FLOAT) &&
+      (tb == MRB_TT_FIXNUM || tb == MRB_TT_FLOAT)) {
+    return;
+  }
+
+  ans =  mrb_funcall(mrb, a, "<=>", 1, b);
+  if (mrb_nil_p(ans)) {
+    /* can not be compared */
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "bad value for range");
+  }
+}
+
+MRB_API mrb_value
+mrb_range_new(mrb_state *mrb, mrb_value beg, mrb_value end, mrb_bool excl)
+{
+  struct RRange *r;
+
+  range_check(mrb, beg, end);
+  r = (struct RRange*)mrb_obj_alloc(mrb, MRB_TT_RANGE, RANGE_CLASS);
+  r->edges = (mrb_range_edges *)mrb_malloc(mrb, sizeof(mrb_range_edges));
+  r->edges->beg = beg;
+  r->edges->end = end;
+  r->excl = excl;
+  return mrb_range_value(r);
+}
+
+/*
+ *  call-seq:
+ *     rng.first    => obj
+ *     rng.begin    => obj
+ *
+ *  Returns the first object in <i>rng</i>.
+ */
+mrb_value
+mrb_range_beg(mrb_state *mrb, mrb_value range)
+{
+  struct RRange *r = mrb_range_ptr(range);
+
+  return r->edges->beg;
+}
+
+/*
+ *  call-seq:
+ *     rng.end    => obj
+ *     rng.last   => obj
+ *
+ *  Returns the object that defines the end of <i>rng</i>.
+ *
+ *     (1..10).end    #=> 10
+ *     (1...10).end   #=> 10
+ */
+
+mrb_value
+mrb_range_end(mrb_state *mrb, mrb_value range)
+{
+  struct RRange *r = mrb_range_ptr(range);
+
+  return r->edges->end;
+}
+
+/*
+ *  call-seq:
+ *     range.exclude_end?    => true or false
+ *
+ *  Returns <code>true</code> if <i>range</i> excludes its end value.
+ */
+mrb_value
+mrb_range_excl(mrb_state *mrb, mrb_value range)
+{
+  struct RRange *r = mrb_range_ptr(range);
+
+  return mrb_bool_value(r->excl);
+}
+
+static void
+range_init(mrb_state *mrb, mrb_value range, mrb_value beg, mrb_value end, mrb_bool exclude_end)
+{
+  struct RRange *r = mrb_range_ptr(range);
+
+  range_check(mrb, beg, end);
+  r->excl = exclude_end;
+  if (!r->edges) {
+    r->edges = (mrb_range_edges *)mrb_malloc(mrb, sizeof(mrb_range_edges));
+  }
+  r->edges->beg = beg;
+  r->edges->end = end;
+}
+/*
+ *  call-seq:
+ *     Range.new(start, end, exclusive=false)    => range
+ *
+ *  Constructs a range using the given <i>start</i> and <i>end</i>. If the third
+ *  parameter is omitted or is <code>false</code>, the <i>range</i> will include
+ *  the end object; otherwise, it will be excluded.
+ */
+
+mrb_value
+mrb_range_initialize(mrb_state *mrb, mrb_value range)
+{
+  mrb_value beg, end;
+  mrb_bool exclusive;
+  int n;
+
+  n = mrb_get_args(mrb, "oo|b", &beg, &end, &exclusive);
+  if (n != 3) {
+    exclusive = FALSE;
+  }
+  /* Ranges are immutable, so that they should be initialized only once. */
+  range_init(mrb, range, beg, end, exclusive);
+  return range;
+}
+/*
+ *  call-seq:
+ *     range == obj    => true or false
+ *
+ *  Returns <code>true</code> only if
+ *  1) <i>obj</i> is a Range,
+ *  2) <i>obj</i> has equivalent beginning and end items (by comparing them with <code>==</code>),
+ *  3) <i>obj</i> has the same #exclude_end? setting as <i>rng</t>.
+ *
+ *    (0..2) == (0..2)            #=> true
+ *    (0..2) == Range.new(0,2)    #=> true
+ *    (0..2) == (0...2)           #=> false
+ *
+ */
+
+mrb_value
+mrb_range_eq(mrb_state *mrb, mrb_value range)
+{
+  struct RRange *rr;
+  struct RRange *ro;
+  mrb_value obj;
+
+  mrb_get_args(mrb, "o", &obj);
+
+  if (mrb_obj_equal(mrb, range, obj)) return mrb_true_value();
+  if (!mrb_obj_is_instance_of(mrb, obj, mrb_obj_class(mrb, range))) { /* same class? */
+    return mrb_false_value();
+  }
+
+  rr = mrb_range_ptr(range);
+  ro = mrb_range_ptr(obj);
+  if (!mrb_bool(mrb_funcall(mrb, rr->edges->beg, "==", 1, ro->edges->beg)) ||
+      !mrb_bool(mrb_funcall(mrb, rr->edges->end, "==", 1, ro->edges->end)) ||
+      rr->excl != ro->excl) {
+    return mrb_false_value();
+  }
+  return mrb_true_value();
+}
+
+static mrb_bool
+r_le(mrb_state *mrb, mrb_value a, mrb_value b)
+{
+  mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b); /* compare result */
+  /* output :a < b => -1, a = b =>  0, a > b => +1 */
+
+  if (mrb_fixnum_p(r)) {
+    mrb_int c = mrb_fixnum(r);
+    if (c == 0 || c == -1) return TRUE;
+  }
+
+  return FALSE;
+}
+
+static mrb_bool
+r_gt(mrb_state *mrb, mrb_value a, mrb_value b)
+{
+  mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b);
+  /* output :a < b => -1, a = b =>  0, a > b => +1 */
+
+  return mrb_fixnum_p(r) && mrb_fixnum(r) == 1;
+}
+
+static mrb_bool
+r_ge(mrb_state *mrb, mrb_value a, mrb_value b)
+{
+  mrb_value r = mrb_funcall(mrb, a, "<=>", 1, b); /* compare result */
+  /* output :a < b => -1, a = b =>  0, a > b => +1 */
+
+  if (mrb_fixnum_p(r)) {
+    mrb_int c = mrb_fixnum(r);
+    if (c == 0 || c == 1) return TRUE;
+  }
+
+  return FALSE;
+}
+
+/*
+ *  call-seq:
+ *     range === obj       =>  true or false
+ *     range.member?(val)  =>  true or false
+ *     range.include?(val) =>  true or false
+ *
+ */
+mrb_value
+mrb_range_include(mrb_state *mrb, mrb_value range)
+{
+  mrb_value val;
+  struct RRange *r = mrb_range_ptr(range);
+  mrb_value beg, end;
+  mrb_bool include_p;
+
+  mrb_get_args(mrb, "o", &val);
+
+  beg = r->edges->beg;
+  end = r->edges->end;
+  include_p = r_le(mrb, beg, val) && /* beg <= val */
+              ((r->excl && r_gt(mrb, end, val)) || /* end >  val */
+              (r_ge(mrb, end, val))); /* end >= val */
+
+  return mrb_bool_value(include_p);
+}
+
+static mrb_bool
+range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len, mrb_bool trunc)
+{
+  mrb_int beg, end;
+  struct RRange *r = mrb_range_ptr(range);
+
+  if (mrb_type(range) != MRB_TT_RANGE) return FALSE;
+
+  beg = mrb_int(mrb, r->edges->beg);
+  end = mrb_int(mrb, r->edges->end);
+
+  if (beg < 0) {
+    beg += len;
+    if (beg < 0) return FALSE;
+  }
+
+  if (trunc) {
+    if (beg > len) return FALSE;
+    if (end > len) end = len;
+  }
+
+  if (end < 0) end += len;
+  if (!r->excl && (!trunc || end < len))
+    end++;                      /* include end point */
+  len = end - beg;
+  if (len < 0) len = 0;
+
+  *begp = beg;
+  *lenp = len;
+  return TRUE;
+}
+
+MRB_API mrb_bool
+mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len)
+{
+  return range_beg_len(mrb, range, begp, lenp, len, TRUE);
+}
+
+/* 15.2.14.4.12(x) */
+/*
+ * call-seq:
+ *   rng.to_s   -> string
+ *
+ * Convert this range object to a printable form.
+ */
+
+static mrb_value
+range_to_s(mrb_state *mrb, mrb_value range)
+{
+  mrb_value str, str2;
+  struct RRange *r = mrb_range_ptr(range);
+
+  str  = mrb_obj_as_string(mrb, r->edges->beg);
+  str2 = mrb_obj_as_string(mrb, r->edges->end);
+  str  = mrb_str_dup(mrb, str);
+  mrb_str_cat(mrb, str, "...", r->excl ? 3 : 2);
+  mrb_str_append(mrb, str, str2);
+
+  return str;
+}
+
+/* 15.2.14.4.13(x) */
+/*
+ * call-seq:
+ *   rng.inspect  -> string
+ *
+ * Convert this range object to a printable form (using
+ * <code>inspect</code> to convert the start and end
+ * objects).
+ */
+
+static mrb_value
+range_inspect(mrb_state *mrb, mrb_value range)
+{
+  mrb_value str, str2;
+  struct RRange *r = mrb_range_ptr(range);
+
+  str  = mrb_inspect(mrb, r->edges->beg);
+  str2 = mrb_inspect(mrb, r->edges->end);
+  str  = mrb_str_dup(mrb, str);
+  mrb_str_cat(mrb, str, "...", r->excl ? 3 : 2);
+  mrb_str_append(mrb, str, str2);
+
+  return str;
+}
+
+/* 15.2.14.4.14(x) */
+/*
+ *  call-seq:
+ *     rng.eql?(obj)    -> true or false
+ *
+ *  Returns <code>true</code> only if <i>obj</i> is a Range, has equivalent
+ *  beginning and end items (by comparing them with #eql?), and has the same
+ *  #exclude_end? setting as <i>rng</i>.
+ *
+ *    (0..2).eql?(0..2)            #=> true
+ *    (0..2).eql?(Range.new(0,2))  #=> true
+ *    (0..2).eql?(0...2)           #=> false
+ *
+ */
+
+static mrb_value
+range_eql(mrb_state *mrb, mrb_value range)
+{
+  mrb_value obj;
+  struct RRange *r, *o;
+
+  mrb_get_args(mrb, "o", &obj);
+
+  if (mrb_obj_equal(mrb, range, obj)) return mrb_true_value();
+  if (!mrb_obj_is_kind_of(mrb, obj, RANGE_CLASS)) {
+    return mrb_false_value();
+  }
+  if (mrb_type(obj) != MRB_TT_RANGE) return mrb_false_value();
+
+  r = mrb_range_ptr(range);
+  o = mrb_range_ptr(obj);
+  if (!mrb_eql(mrb, r->edges->beg, o->edges->beg) ||
+      !mrb_eql(mrb, r->edges->end, o->edges->end) ||
+      (r->excl != o->excl)) {
+    return mrb_false_value();
+  }
+  return mrb_true_value();
+}
+
+/* 15.2.14.4.15(x) */
+static mrb_value
+range_initialize_copy(mrb_state *mrb, mrb_value copy)
+{
+  mrb_value src;
+  struct RRange *r;
+
+  mrb_get_args(mrb, "o", &src);
+
+  if (mrb_obj_equal(mrb, copy, src)) return copy;
+  if (!mrb_obj_is_instance_of(mrb, src, mrb_obj_class(mrb, copy))) {
+    mrb_raise(mrb, E_TYPE_ERROR, "wrong argument class");
+  }
+
+  r = mrb_range_ptr(src);
+  range_init(mrb, copy, r->edges->beg, r->edges->end, r->excl);
+
+  return copy;
+}
+
+mrb_value
+mrb_get_values_at(mrb_state *mrb, mrb_value obj, mrb_int olen, mrb_int argc, const mrb_value *argv, mrb_value (*func)(mrb_state*, mrb_value, mrb_int))
+{
+  mrb_int i, j, beg, len;
+  mrb_value result;
+  result = mrb_ary_new(mrb);
+
+  for (i = 0; i < argc; ++i) {
+    if (mrb_fixnum_p(argv[i])) {
+      mrb_ary_push(mrb, result, func(mrb, obj, mrb_fixnum(argv[i])));
+    }
+    else if (range_beg_len(mrb, argv[i], &beg, &len, olen, FALSE)) {
+      mrb_int const end = olen < beg + len ? olen : beg + len;
+      for (j = beg; j < end; ++j) {
+        mrb_ary_push(mrb, result, func(mrb, obj, j));
+      }
+
+      for (; j < beg + len; ++j) {
+        mrb_ary_push(mrb, result, mrb_nil_value());
+      }
+    }
+    else {
+      mrb_raisef(mrb, E_TYPE_ERROR, "invalid values selector: %S", argv[i]);
+    }
+  }
+
+  return result;
+}
+
+void
+mrb_init_range(mrb_state *mrb)
+{
+  struct RClass *r;
+
+  r = mrb_define_class(mrb, "Range", mrb->object_class);                                /* 15.2.14 */
+  MRB_SET_INSTANCE_TT(r, MRB_TT_RANGE);
+
+  mrb_define_method(mrb, r, "begin",           mrb_range_beg,         MRB_ARGS_NONE()); /* 15.2.14.4.3  */
+  mrb_define_method(mrb, r, "end",             mrb_range_end,         MRB_ARGS_NONE()); /* 15.2.14.4.5  */
+  mrb_define_method(mrb, r, "==",              mrb_range_eq,          MRB_ARGS_REQ(1)); /* 15.2.14.4.1  */
+  mrb_define_method(mrb, r, "===",             mrb_range_include,     MRB_ARGS_REQ(1)); /* 15.2.14.4.2  */
+  mrb_define_method(mrb, r, "exclude_end?",    mrb_range_excl,        MRB_ARGS_NONE()); /* 15.2.14.4.6  */
+  mrb_define_method(mrb, r, "first",           mrb_range_beg,         MRB_ARGS_NONE()); /* 15.2.14.4.7  */
+  mrb_define_method(mrb, r, "include?",        mrb_range_include,     MRB_ARGS_REQ(1)); /* 15.2.14.4.8  */
+  mrb_define_method(mrb, r, "initialize",      mrb_range_initialize,  MRB_ARGS_ANY());  /* 15.2.14.4.9  */
+  mrb_define_method(mrb, r, "last",            mrb_range_end,         MRB_ARGS_NONE()); /* 15.2.14.4.10 */
+  mrb_define_method(mrb, r, "member?",         mrb_range_include,     MRB_ARGS_REQ(1)); /* 15.2.14.4.11 */
+
+  mrb_define_method(mrb, r, "to_s",            range_to_s,            MRB_ARGS_NONE()); /* 15.2.14.4.12(x) */
+  mrb_define_method(mrb, r, "inspect",         range_inspect,         MRB_ARGS_NONE()); /* 15.2.14.4.13(x) */
+  mrb_define_method(mrb, r, "eql?",            range_eql,             MRB_ARGS_REQ(1)); /* 15.2.14.4.14(x) */
+  mrb_define_method(mrb, r, "initialize_copy", range_initialize_copy, MRB_ARGS_REQ(1)); /* 15.2.14.4.15(x) */
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/state.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,303 @@
+/*
+** state.c - mrb_state open/close functions
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <stdlib.h>
+#include <string.h>
+#include "mruby.h"
+#include "mruby/irep.h"
+#include "mruby/variable.h"
+#include "mruby/debug.h"
+#include "mruby/string.h"
+
+void mrb_init_heap(mrb_state*);
+void mrb_init_core(mrb_state*);
+void mrb_init_mrbgems(mrb_state*);
+
+static mrb_value
+inspect_main(mrb_state *mrb, mrb_value mod)
+{
+  return mrb_str_new_lit(mrb, "main");
+}
+
+MRB_API mrb_state*
+mrb_open_core(mrb_allocf f, void *ud)
+{
+  static const mrb_state mrb_state_zero = { 0 };
+  static const struct mrb_context mrb_context_zero = { 0 };
+  mrb_state *mrb;
+
+  mrb = (mrb_state *)(f)(NULL, NULL, sizeof(mrb_state), ud);
+  if (mrb == NULL) return NULL;
+
+  *mrb = mrb_state_zero;
+  mrb->allocf_ud = ud;
+  mrb->allocf = f;
+  mrb->current_white_part = MRB_GC_WHITE_A;
+  mrb->atexit_stack_len = 0;
+
+#ifndef MRB_GC_FIXED_ARENA
+  mrb->arena = (struct RBasic**)mrb_malloc(mrb, sizeof(struct RBasic*)*MRB_GC_ARENA_SIZE);
+  mrb->arena_capa = MRB_GC_ARENA_SIZE;
+#endif
+
+  mrb_init_heap(mrb);
+  mrb->c = (struct mrb_context*)mrb_malloc(mrb, sizeof(struct mrb_context));
+  *mrb->c = mrb_context_zero;
+  mrb->root_c = mrb->c;
+
+  mrb_init_core(mrb);
+
+  return mrb;
+}
+
+void*
+mrb_default_allocf(mrb_state *mrb, void *p, size_t size, void *ud)
+{
+  if (size == 0) {
+    free(p);
+    return NULL;
+  }
+  else {
+    return realloc(p, size);
+  }
+}
+
+struct alloca_header {
+  struct alloca_header *next;
+  char buf[];
+};
+
+MRB_API void*
+mrb_alloca(mrb_state *mrb, size_t size)
+{
+  struct alloca_header *p;
+
+  p = (struct alloca_header*) mrb_malloc(mrb, sizeof(struct alloca_header)+size);
+  p->next = mrb->mems;
+  mrb->mems = p;
+  return (void*)p->buf;
+}
+
+static void
+mrb_alloca_free(mrb_state *mrb)
+{
+  struct alloca_header *p;
+  struct alloca_header *tmp;
+
+  if (mrb == NULL) return;
+  p = mrb->mems;
+
+  while (p) {
+    tmp = p;
+    p = p->next;
+    mrb_free(mrb, tmp);
+  }
+}
+
+MRB_API mrb_state*
+mrb_open(void)
+{
+  mrb_state *mrb = mrb_open_allocf(mrb_default_allocf, NULL);
+
+  return mrb;
+}
+
+MRB_API mrb_state*
+mrb_open_allocf(mrb_allocf f, void *ud)
+{
+  mrb_state *mrb = mrb_open_core(f, ud);
+
+  if (mrb == NULL) {
+    return NULL;
+  }
+
+#ifndef DISABLE_GEMS
+  mrb_init_mrbgems(mrb);
+  mrb_gc_arena_restore(mrb, 0);
+#endif
+  return mrb;
+}
+
+void mrb_free_symtbl(mrb_state *mrb);
+void mrb_free_heap(mrb_state *mrb);
+
+void
+mrb_irep_incref(mrb_state *mrb, mrb_irep *irep)
+{
+  irep->refcnt++;
+}
+
+void
+mrb_irep_decref(mrb_state *mrb, mrb_irep *irep)
+{
+  irep->refcnt--;
+  if (irep->refcnt == 0) {
+    mrb_irep_free(mrb, irep);
+  }
+}
+
+void
+mrb_irep_free(mrb_state *mrb, mrb_irep *irep)
+{
+  size_t i;
+
+  if (!(irep->flags & MRB_ISEQ_NO_FREE))
+    mrb_free(mrb, irep->iseq);
+  for (i=0; i<irep->plen; i++) {
+    if (mrb_type(irep->pool[i]) == MRB_TT_STRING) {
+      mrb_gc_free_str(mrb, RSTRING(irep->pool[i]));
+      mrb_free(mrb, mrb_obj_ptr(irep->pool[i]));
+    }
+#ifdef MRB_WORD_BOXING
+    else if (mrb_type(irep->pool[i]) == MRB_TT_FLOAT) {
+      mrb_free(mrb, mrb_obj_ptr(irep->pool[i]));
+    }
+#endif
+  }
+  mrb_free(mrb, irep->pool);
+  mrb_free(mrb, irep->syms);
+  for (i=0; i<irep->rlen; i++) {
+    mrb_irep_decref(mrb, irep->reps[i]);
+  }
+  mrb_free(mrb, irep->reps);
+  mrb_free(mrb, irep->lv);
+  mrb_free(mrb, (void *)irep->filename);
+  mrb_free(mrb, irep->lines);
+  mrb_debug_info_free(mrb, irep->debug_info);
+  mrb_free(mrb, irep);
+}
+
+mrb_value
+mrb_str_pool(mrb_state *mrb, mrb_value str)
+{
+  struct RString *s = mrb_str_ptr(str);
+  struct RString *ns;
+  char *ptr;
+  mrb_int len;
+
+  ns = (struct RString *)mrb_malloc(mrb, sizeof(struct RString));
+  ns->tt = MRB_TT_STRING;
+  ns->c = mrb->string_class;
+
+  if (RSTR_NOFREE_P(s)) {
+    ns->flags = MRB_STR_NOFREE;
+    ns->as.heap.ptr = s->as.heap.ptr;
+    ns->as.heap.len = s->as.heap.len;
+    ns->as.heap.aux.capa = 0;
+  }
+  else {
+    ns->flags = 0;
+    if (RSTR_EMBED_P(s)) {
+      ptr = s->as.ary;
+      len = RSTR_EMBED_LEN(s);
+    }
+    else {
+      ptr = s->as.heap.ptr;
+      len = s->as.heap.len;
+    }
+
+    if (len < RSTRING_EMBED_LEN_MAX) {
+      RSTR_SET_EMBED_FLAG(ns);
+      RSTR_SET_EMBED_LEN(ns, len);
+      if (ptr) {
+        memcpy(ns->as.ary, ptr, len);
+      }
+      ns->as.ary[len] = '\0';
+    }
+    else {
+      ns->as.heap.ptr = (char *)mrb_malloc(mrb, (size_t)len+1);
+      ns->as.heap.len = len;
+      ns->as.heap.aux.capa = len;
+      if (ptr) {
+        memcpy(ns->as.heap.ptr, ptr, len);
+      }
+      ns->as.heap.ptr[len] = '\0';
+    }
+  }
+  return mrb_obj_value(ns);
+}
+
+MRB_API void
+mrb_free_context(mrb_state *mrb, struct mrb_context *c)
+{
+  if (!c) return;
+  mrb_free(mrb, c->stbase);
+  mrb_free(mrb, c->cibase);
+  mrb_free(mrb, c->rescue);
+  mrb_free(mrb, c->ensure);
+  mrb_free(mrb, c);
+}
+
+MRB_API void
+mrb_close(mrb_state *mrb)
+{
+  if (mrb->atexit_stack_len > 0) {
+    mrb_int i;
+    for (i = mrb->atexit_stack_len; i > 0; --i) {
+      mrb->atexit_stack[i - 1](mrb);
+    }
+#ifndef MRB_FIXED_STATE_ATEXIT_STACK
+    mrb_free(mrb, mrb->atexit_stack);
+#endif
+  }
+
+  /* free */
+  mrb_gc_free_gv(mrb);
+  mrb_free_context(mrb, mrb->root_c);
+  mrb_free_symtbl(mrb);
+  mrb_free_heap(mrb);
+  mrb_alloca_free(mrb);
+#ifndef MRB_GC_FIXED_ARENA
+  mrb_free(mrb, mrb->arena);
+#endif
+  mrb_free(mrb, mrb);
+}
+
+MRB_API mrb_irep*
+mrb_add_irep(mrb_state *mrb)
+{
+  static const mrb_irep mrb_irep_zero = { 0 };
+  mrb_irep *irep;
+
+  irep = (mrb_irep *)mrb_malloc(mrb, sizeof(mrb_irep));
+  *irep = mrb_irep_zero;
+  irep->refcnt = 1;
+
+  return irep;
+}
+
+MRB_API mrb_value
+mrb_top_self(mrb_state *mrb)
+{
+  if (!mrb->top_self) {
+    mrb->top_self = (struct RObject*)mrb_obj_alloc(mrb, MRB_TT_OBJECT, mrb->object_class);
+    mrb_define_singleton_method(mrb, mrb->top_self, "inspect", inspect_main, MRB_ARGS_NONE());
+    mrb_define_singleton_method(mrb, mrb->top_self, "to_s", inspect_main, MRB_ARGS_NONE());
+  }
+  return mrb_obj_value(mrb->top_self);
+}
+
+MRB_API void
+mrb_state_atexit(mrb_state *mrb, mrb_atexit_func f)
+{
+#ifdef MRB_FIXED_STATE_ATEXIT_STACK
+  if (mrb->atexit_stack_len + 1 > MRB_FIXED_STATE_ATEXIT_STACK_SIZE) {
+    mrb_raise(mrb, E_RUNTIME_ERROR, "exceeded fixed state atexit stack limit");
+  }
+#else
+  size_t stack_size;
+
+  stack_size = sizeof(mrb_atexit_func) * (mrb->atexit_stack_len + 1);
+  if (mrb->atexit_stack_len == 0) {
+    mrb->atexit_stack = (mrb_atexit_func*)mrb_malloc(mrb, stack_size);
+  } else {
+    mrb->atexit_stack = (mrb_atexit_func*)mrb_realloc(mrb, mrb->atexit_stack, stack_size);
+  }
+#endif
+
+  mrb->atexit_stack[mrb->atexit_stack_len++] = f;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/string.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,2524 @@
+/*
+** string.c - String class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <ctype.h>
+#include <float.h>
+#include <limits.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/class.h"
+#include "mruby/range.h"
+#include "mruby/string.h"
+#include "mruby/re.h"
+
+const char mrb_digitmap[] = "0123456789abcdefghijklmnopqrstuvwxyz";
+
+typedef struct mrb_shared_string {
+  mrb_bool nofree : 1;
+  int refcnt;
+  char *ptr;
+  mrb_int len;
+} mrb_shared_string;
+
+static mrb_value str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2);
+static mrb_value mrb_str_subseq(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len);
+
+MRB_API mrb_int
+mrb_str_strlen(mrb_state *mrb, struct RString *s)
+{
+  mrb_int i, max = RSTR_LEN(s);
+  char *p = RSTR_PTR(s);
+
+  if (!p) return 0;
+  for (i=0; i<max; i++) {
+    if (p[i] == '\0') {
+      mrb_raise(mrb, E_ARGUMENT_ERROR, "string contains null byte");
+    }
+  }
+  return max;
+}
+
+static inline void
+resize_capa(mrb_state *mrb, struct RString *s, mrb_int capacity)
+{
+  if (RSTR_EMBED_P(s)) {
+    if (RSTRING_EMBED_LEN_MAX < capacity) {
+      char *const tmp = (char *)mrb_malloc(mrb, capacity+1);
+      const mrb_int len = RSTR_EMBED_LEN(s);
+      memcpy(tmp, s->as.ary, len);
+      RSTR_UNSET_EMBED_FLAG(s);
+      s->as.heap.ptr = tmp;
+      s->as.heap.len = len;
+      s->as.heap.aux.capa = capacity;
+    }
+  }
+  else {
+    s->as.heap.ptr = (char *)mrb_realloc(mrb, RSTR_PTR(s), capacity+1);
+    s->as.heap.aux.capa = capacity;
+  }
+}
+
+static void
+str_decref(mrb_state *mrb, mrb_shared_string *shared)
+{
+  shared->refcnt--;
+  if (shared->refcnt == 0) {
+    if (!shared->nofree) {
+      mrb_free(mrb, shared->ptr);
+    }
+    mrb_free(mrb, shared);
+  }
+}
+
+MRB_API void
+mrb_str_modify(mrb_state *mrb, struct RString *s)
+{
+  if (RSTR_SHARED_P(s)) {
+    mrb_shared_string *shared = s->as.heap.aux.shared;
+
+    if (shared->refcnt == 1 && s->as.heap.ptr == shared->ptr) {
+      s->as.heap.ptr = shared->ptr;
+      s->as.heap.aux.capa = shared->len;
+      RSTR_PTR(s)[s->as.heap.len] = '\0';
+      mrb_free(mrb, shared);
+    }
+    else {
+      char *ptr, *p;
+      mrb_int len;
+
+      p = RSTR_PTR(s);
+      len = s->as.heap.len;
+      ptr = (char *)mrb_malloc(mrb, (size_t)len + 1);
+      if (p) {
+        memcpy(ptr, p, len);
+      }
+      ptr[len] = '\0';
+      s->as.heap.ptr = ptr;
+      s->as.heap.aux.capa = len;
+      str_decref(mrb, shared);
+    }
+    RSTR_UNSET_SHARED_FLAG(s);
+    return;
+  }
+  if (RSTR_NOFREE_P(s)) {
+    char *p = s->as.heap.ptr;
+
+    s->as.heap.ptr = (char *)mrb_malloc(mrb, (size_t)s->as.heap.len+1);
+    if (p) {
+      memcpy(RSTR_PTR(s), p, s->as.heap.len);
+    }
+    RSTR_PTR(s)[s->as.heap.len] = '\0';
+    s->as.heap.aux.capa = s->as.heap.len;
+    RSTR_UNSET_NOFREE_FLAG(s);
+    return;
+  }
+}
+
+MRB_API mrb_value
+mrb_str_resize(mrb_state *mrb, mrb_value str, mrb_int len)
+{
+  mrb_int slen;
+  struct RString *s = mrb_str_ptr(str);
+
+  mrb_str_modify(mrb, s);
+  slen = RSTR_LEN(s);
+  if (len != slen) {
+    if (slen < len || slen - len > 256) {
+      resize_capa(mrb, s, len);
+    }
+    RSTR_SET_LEN(s, len);
+    RSTR_PTR(s)[len] = '\0';   /* sentinel */
+  }
+  return str;
+}
+
+#define mrb_obj_alloc_string(mrb) ((struct RString*)mrb_obj_alloc((mrb), MRB_TT_STRING, (mrb)->string_class))
+
+static struct RString*
+str_new_static(mrb_state *mrb, const char *p, size_t len)
+{
+  struct RString *s;
+
+  if (len >= MRB_INT_MAX) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "string size too big");
+  }
+  s = mrb_obj_alloc_string(mrb);
+  s->as.heap.len = len;
+  s->as.heap.aux.capa = 0;             /* nofree */
+  s->as.heap.ptr = (char *)p;
+  s->flags = MRB_STR_NOFREE;
+
+  return s;
+}
+
+static struct RString*
+str_new(mrb_state *mrb, const char *p, size_t len)
+{
+  struct RString *s;
+
+  if (mrb_ro_data_p(p)) {
+    return str_new_static(mrb, p, len);
+  }
+  s = mrb_obj_alloc_string(mrb);
+  if (len < RSTRING_EMBED_LEN_MAX) {
+    RSTR_SET_EMBED_FLAG(s);
+    RSTR_SET_EMBED_LEN(s, len);
+    if (p) {
+      memcpy(s->as.ary, p, len);
+    }
+  } else {
+    if (len >= MRB_INT_MAX) {
+      mrb_raise(mrb, E_ARGUMENT_ERROR, "string size too big");
+    }
+    s->as.heap.len = len;
+    s->as.heap.aux.capa = len;
+    s->as.heap.ptr = (char *)mrb_malloc(mrb, len+1);
+    if (p) {
+      memcpy(s->as.heap.ptr, p, len);
+    }
+  }
+  RSTR_PTR(s)[len] = '\0';
+  return s;
+}
+
+static inline void
+str_with_class(mrb_state *mrb, struct RString *s, mrb_value obj)
+{
+  s->c = mrb_str_ptr(obj)->c;
+}
+
+static mrb_value
+mrb_str_new_empty(mrb_state *mrb, mrb_value str)
+{
+  struct RString *s = str_new(mrb, 0, 0);
+
+  str_with_class(mrb, s, str);
+  return mrb_obj_value(s);
+}
+
+#ifndef MRB_STR_BUF_MIN_SIZE
+# define MRB_STR_BUF_MIN_SIZE 128
+#endif
+
+MRB_API mrb_value
+mrb_str_buf_new(mrb_state *mrb, size_t capa)
+{
+  struct RString *s;
+
+  s = mrb_obj_alloc_string(mrb);
+
+  if (capa >= MRB_INT_MAX) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "string capacity size too big");
+  }
+  if (capa < MRB_STR_BUF_MIN_SIZE) {
+    capa = MRB_STR_BUF_MIN_SIZE;
+  }
+  s->as.heap.len = 0;
+  s->as.heap.aux.capa = capa;
+  s->as.heap.ptr = (char *)mrb_malloc(mrb, capa+1);
+  RSTR_PTR(s)[0] = '\0';
+
+  return mrb_obj_value(s);
+}
+
+static void
+str_buf_cat(mrb_state *mrb, struct RString *s, const char *ptr, size_t len)
+{
+  size_t capa;
+  size_t total;
+  ptrdiff_t off = -1;
+
+  if (len == 0) return;
+  mrb_str_modify(mrb, s);
+  if (ptr >= RSTR_PTR(s) && ptr <= RSTR_PTR(s) + (size_t)RSTR_LEN(s)) {
+      off = ptr - RSTR_PTR(s);
+  }
+
+  if (RSTR_EMBED_P(s))
+    capa = RSTRING_EMBED_LEN_MAX;
+  else
+    capa = s->as.heap.aux.capa;
+
+  if (RSTR_LEN(s) >= MRB_INT_MAX - (mrb_int)len) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "string size too big");
+  }
+  total = RSTR_LEN(s)+len;
+  if (capa <= total) {
+    while (total > capa) {
+      if (capa + 1 >= MRB_INT_MAX / 2) {
+        capa = (total + 4095) / 4096;
+        break;
+      }
+      capa = (capa + 1) * 2;
+    }
+    resize_capa(mrb, s, capa);
+  }
+  if (off != -1) {
+      ptr = RSTR_PTR(s) + off;
+  }
+  memcpy(RSTR_PTR(s) + RSTR_LEN(s), ptr, len);
+  mrb_assert_int_fit(size_t, total, mrb_int, MRB_INT_MAX);
+  RSTR_SET_LEN(s, total);
+  RSTR_PTR(s)[total] = '\0';   /* sentinel */
+}
+
+MRB_API mrb_value
+mrb_str_new(mrb_state *mrb, const char *p, size_t len)
+{
+  return mrb_obj_value(str_new(mrb, p, len));
+}
+
+/*
+ *  call-seq: (Caution! NULL string)
+ *     String.new(str="")   => new_str
+ *
+ *  Returns a new string object containing a copy of <i>str</i>.
+ */
+
+MRB_API mrb_value
+mrb_str_new_cstr(mrb_state *mrb, const char *p)
+{
+  struct RString *s;
+  size_t len;
+
+  if (p) {
+    len = strlen(p);
+  }
+  else {
+    len = 0;
+  }
+
+  s = str_new(mrb, p, len);
+
+  return mrb_obj_value(s);
+}
+
+MRB_API mrb_value
+mrb_str_new_static(mrb_state *mrb, const char *p, size_t len)
+{
+  struct RString *s = str_new_static(mrb, p, len);
+  return mrb_obj_value(s);
+}
+
+void
+mrb_gc_free_str(mrb_state *mrb, struct RString *str)
+{
+  if (RSTR_EMBED_P(str))
+    /* no code */;
+  else if (RSTR_SHARED_P(str))
+    str_decref(mrb, str->as.heap.aux.shared);
+  else if (!RSTR_NOFREE_P(str))
+    mrb_free(mrb, str->as.heap.ptr);
+}
+
+MRB_API char*
+mrb_str_to_cstr(mrb_state *mrb, mrb_value str0)
+{
+  struct RString *s;
+
+  if (!mrb_string_p(str0)) {
+    mrb_raise(mrb, E_TYPE_ERROR, "expected String");
+  }
+
+  s = str_new(mrb, RSTRING_PTR(str0), RSTRING_LEN(str0));
+  if ((strlen(RSTR_PTR(s)) ^ RSTR_LEN(s)) != 0) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "string contains null byte");
+  }
+  return RSTR_PTR(s);
+}
+
+static void
+str_make_shared(mrb_state *mrb, struct RString *s)
+{
+  if (!RSTR_SHARED_P(s)) {
+    mrb_shared_string *shared = (mrb_shared_string *)mrb_malloc(mrb, sizeof(mrb_shared_string));
+
+    shared->refcnt = 1;
+    if (RSTR_EMBED_P(s)) {
+      const mrb_int len = RSTR_EMBED_LEN(s);
+      char *const tmp = (char *)mrb_malloc(mrb, len+1);
+      memcpy(tmp, s->as.ary, len);
+      tmp[len] = '\0';
+      RSTR_UNSET_EMBED_FLAG(s);
+      s->as.heap.ptr = tmp;
+      s->as.heap.len = len;
+      shared->nofree = FALSE;
+      shared->ptr = s->as.heap.ptr;
+    }
+    else if (RSTR_NOFREE_P(s)) {
+      shared->nofree = TRUE;
+      shared->ptr = s->as.heap.ptr;
+      RSTR_UNSET_NOFREE_FLAG(s);
+    }
+    else {
+      shared->nofree = FALSE;
+      if (s->as.heap.aux.capa > s->as.heap.len) {
+        s->as.heap.ptr = shared->ptr = (char *)mrb_realloc(mrb, s->as.heap.ptr, s->as.heap.len+1);
+      }
+      else {
+        shared->ptr = s->as.heap.ptr;
+      }
+    }
+    shared->len = s->as.heap.len;
+    s->as.heap.aux.shared = shared;
+    RSTR_SET_SHARED_FLAG(s);
+  }
+}
+
+/*
+ *  call-seq: (Caution! String("abcd") change)
+ *     String("abcdefg") = String("abcd") + String("efg")
+ *
+ *  Returns a new string object containing a copy of <i>str</i>.
+ */
+MRB_API void
+mrb_str_concat(mrb_state *mrb, mrb_value self, mrb_value other)
+{
+  struct RString *s1 = mrb_str_ptr(self), *s2;
+  mrb_int len;
+
+  mrb_str_modify(mrb, s1);
+  if (!mrb_string_p(other)) {
+    other = mrb_str_to_str(mrb, other);
+  }
+  s2 = mrb_str_ptr(other);
+  len = RSTR_LEN(s1) + RSTR_LEN(s2);
+
+  if (RSTRING_CAPA(self) < len) {
+    resize_capa(mrb, s1, len);
+  }
+  memcpy(RSTR_PTR(s1)+RSTR_LEN(s1), RSTR_PTR(s2), RSTR_LEN(s2));
+  RSTR_SET_LEN(s1, len);
+  RSTR_PTR(s1)[len] = '\0';
+}
+
+/*
+ *  call-seq: (Caution! String("abcd") remain)
+ *     String("abcdefg") = String("abcd") + String("efg")
+ *
+ *  Returns a new string object containing a copy of <i>str</i>.
+ */
+MRB_API mrb_value
+mrb_str_plus(mrb_state *mrb, mrb_value a, mrb_value b)
+{
+  struct RString *s = mrb_str_ptr(a);
+  struct RString *s2 = mrb_str_ptr(b);
+  struct RString *t;
+
+  t = str_new(mrb, 0, RSTR_LEN(s) + RSTR_LEN(s2));
+  memcpy(RSTR_PTR(t), RSTR_PTR(s), RSTR_LEN(s));
+  memcpy(RSTR_PTR(t) + RSTR_LEN(s), RSTR_PTR(s2), RSTR_LEN(s2));
+
+  return mrb_obj_value(t);
+}
+
+/* 15.2.10.5.2  */
+
+/*
+ *  call-seq: (Caution! String("abcd") remain) for stack_argument
+ *     String("abcdefg") = String("abcd") + String("efg")
+ *
+ *  Returns a new string object containing a copy of <i>str</i>.
+ */
+static mrb_value
+mrb_str_plus_m(mrb_state *mrb, mrb_value self)
+{
+  mrb_value str;
+
+  mrb_get_args(mrb, "S", &str);
+  return mrb_str_plus(mrb, self, str);
+}
+
+/* 15.2.10.5.26 */
+/* 15.2.10.5.33 */
+/*
+ *  call-seq:
+ *     len = strlen(String("abcd"))
+ *
+ *  Returns the length of string.
+ */
+static mrb_value
+mrb_str_size(mrb_state *mrb, mrb_value self)
+{
+  struct RString *s = mrb_str_ptr(self);
+  return mrb_fixnum_value(RSTR_LEN(s));
+}
+
+/* 15.2.10.5.1  */
+/*
+ *  call-seq:
+ *     str * integer   => new_str
+ *
+ *  Copy---Returns a new <code>String</code> containing <i>integer</i> copies of
+ *  the receiver.
+ *
+ *     "Ho! " * 3   #=> "Ho! Ho! Ho! "
+ */
+static mrb_value
+mrb_str_times(mrb_state *mrb, mrb_value self)
+{
+  mrb_int n,len,times;
+  struct RString *str2;
+  char *p;
+
+  mrb_get_args(mrb, "i", &times);
+  if (times < 0) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "negative argument");
+  }
+  if (times && MRB_INT_MAX / times < RSTRING_LEN(self)) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "argument too big");
+  }
+
+  len = RSTRING_LEN(self)*times;
+  str2 = str_new(mrb, 0, len);
+  str_with_class(mrb, str2, self);
+  p = RSTR_PTR(str2);
+  if (len > 0) {
+    n = RSTRING_LEN(self);
+    memcpy(p, RSTRING_PTR(self), n);
+    while (n <= len/2) {
+      memcpy(p + n, p, n);
+      n *= 2;
+    }
+    memcpy(p + n, p, len-n);
+  }
+  p[RSTR_LEN(str2)] = '\0';
+
+  return mrb_obj_value(str2);
+}
+/* -------------------------------------------------------------- */
+
+#define lesser(a,b) (((a)>(b))?(b):(a))
+
+/* ---------------------------*/
+/*
+ *  call-seq:
+ *     mrb_value str1 <=> mrb_value str2   => int
+ *                     >  1
+ *                     =  0
+ *                     <  -1
+ */
+MRB_API int
+mrb_str_cmp(mrb_state *mrb, mrb_value str1, mrb_value str2)
+{
+  mrb_int len;
+  mrb_int retval;
+  struct RString *s1 = mrb_str_ptr(str1);
+  struct RString *s2 = mrb_str_ptr(str2);
+
+  len = lesser(RSTR_LEN(s1), RSTR_LEN(s2));
+  retval = memcmp(RSTR_PTR(s1), RSTR_PTR(s2), len);
+  if (retval == 0) {
+    if (RSTR_LEN(s1) == RSTR_LEN(s2)) return 0;
+    if (RSTR_LEN(s1) > RSTR_LEN(s2))  return 1;
+    return -1;
+  }
+  if (retval > 0) return 1;
+  return -1;
+}
+
+/* 15.2.10.5.3  */
+
+/*
+ *  call-seq:
+ *     str <=> other_str   => -1, 0, +1
+ *
+ *  Comparison---Returns -1 if <i>other_str</i> is less than, 0 if
+ *  <i>other_str</i> is equal to, and +1 if <i>other_str</i> is greater than
+ *  <i>str</i>. If the strings are of different lengths, and the strings are
+ *  equal when compared up to the shortest length, then the longer string is
+ *  considered greater than the shorter one. If the variable <code>$=</code> is
+ *  <code>false</code>, the comparison is based on comparing the binary values
+ *  of each character in the string. In older versions of Ruby, setting
+ *  <code>$=</code> allowed case-insensitive comparisons; this is now deprecated
+ *  in favor of using <code>String#casecmp</code>.
+ *
+ *  <code><=></code> is the basis for the methods <code><</code>,
+ *  <code><=</code>, <code>></code>, <code>>=</code>, and <code>between?</code>,
+ *  included from module <code>Comparable</code>.  The method
+ *  <code>String#==</code> does not use <code>Comparable#==</code>.
+ *
+ *     "abcdef" <=> "abcde"     #=> 1
+ *     "abcdef" <=> "abcdef"    #=> 0
+ *     "abcdef" <=> "abcdefg"   #=> -1
+ *     "abcdef" <=> "ABCDEF"    #=> 1
+ */
+static mrb_value
+mrb_str_cmp_m(mrb_state *mrb, mrb_value str1)
+{
+  mrb_value str2;
+  mrb_int result;
+
+  mrb_get_args(mrb, "o", &str2);
+  if (!mrb_string_p(str2)) {
+    if (!mrb_respond_to(mrb, str2, mrb_intern_lit(mrb, "to_s"))) {
+      return mrb_nil_value();
+    }
+    else if (!mrb_respond_to(mrb, str2, mrb_intern_lit(mrb, "<=>"))) {
+      return mrb_nil_value();
+    }
+    else {
+      mrb_value tmp = mrb_funcall(mrb, str2, "<=>", 1, str1);
+
+      if (mrb_nil_p(tmp)) return mrb_nil_value();
+      if (!mrb_fixnum(tmp)) {
+        return mrb_funcall(mrb, mrb_fixnum_value(0), "-", 1, tmp);
+      }
+      result = -mrb_fixnum(tmp);
+    }
+  }
+  else {
+    result = mrb_str_cmp(mrb, str1, str2);
+  }
+  return mrb_fixnum_value(result);
+}
+
+static mrb_bool
+str_eql(mrb_state *mrb, const mrb_value str1, const mrb_value str2)
+{
+  const mrb_int len = RSTRING_LEN(str1);
+
+  if (len != RSTRING_LEN(str2)) return FALSE;
+  if (memcmp(RSTRING_PTR(str1), RSTRING_PTR(str2), (size_t)len) == 0)
+    return TRUE;
+  return FALSE;
+}
+
+MRB_API mrb_bool
+mrb_str_equal(mrb_state *mrb, mrb_value str1, mrb_value str2)
+{
+  if (mrb_immediate_p(str2)) return FALSE;
+  if (!mrb_string_p(str2)) {
+    if (mrb_nil_p(str2)) return FALSE;
+    if (!mrb_respond_to(mrb, str2, mrb_intern_lit(mrb, "to_str"))) {
+      return FALSE;
+    }
+    str2 = mrb_funcall(mrb, str2, "to_str", 0);
+    return mrb_equal(mrb, str2, str1);
+  }
+  return str_eql(mrb, str1, str2);
+}
+
+/* 15.2.10.5.4  */
+/*
+ *  call-seq:
+ *     str == obj   => true or false
+ *
+ *  Equality---
+ *  If <i>obj</i> is not a <code>String</code>, returns <code>false</code>.
+ *  Otherwise, returns <code>false</code> or <code>true</code>
+ *
+ *   caution:if <i>str</i> <code><=></code> <i>obj</i> returns zero.
+ */
+static mrb_value
+mrb_str_equal_m(mrb_state *mrb, mrb_value str1)
+{
+  mrb_value str2;
+
+  mrb_get_args(mrb, "o", &str2);
+
+  return mrb_bool_value(mrb_str_equal(mrb, str1, str2));
+}
+/* ---------------------------------- */
+MRB_API mrb_value
+mrb_str_to_str(mrb_state *mrb, mrb_value str)
+{
+  mrb_value s;
+
+  if (!mrb_string_p(str)) {
+    s = mrb_check_convert_type(mrb, str, MRB_TT_STRING, "String", "to_str");
+    if (mrb_nil_p(s)) {
+      s = mrb_convert_type(mrb, str, MRB_TT_STRING, "String", "to_s");
+    }
+    return s;
+  }
+  return str;
+}
+
+MRB_API const char*
+mrb_string_value_ptr(mrb_state *mrb, mrb_value ptr)
+{
+  mrb_value str = mrb_str_to_str(mrb, ptr);
+  return RSTRING_PTR(str);
+}
+
+void
+mrb_noregexp(mrb_state *mrb, mrb_value self)
+{
+  mrb_raise(mrb, E_NOTIMP_ERROR, "Regexp class not implemented");
+}
+
+void
+mrb_regexp_check(mrb_state *mrb, mrb_value obj)
+{
+  if (mrb_regexp_p(mrb, obj)) {
+    mrb_noregexp(mrb, obj);
+  }
+}
+
+static inline mrb_int
+mrb_memsearch_qs(const unsigned char *xs, mrb_int m, const unsigned char *ys, mrb_int n)
+{
+  const unsigned char *x = xs, *xe = xs + m;
+  const unsigned char *y = ys;
+  int i, qstable[256];
+
+  /* Preprocessing */
+  for (i = 0; i < 256; ++i)
+    qstable[i] = m + 1;
+  for (; x < xe; ++x)
+    qstable[*x] = xe - x;
+  /* Searching */
+  for (; y + m <= ys + n; y += *(qstable + y[m])) {
+    if (*xs == *y && memcmp(xs, y, m) == 0)
+        return y - ys;
+  }
+  return -1;
+}
+
+static mrb_int
+mrb_memsearch(const void *x0, mrb_int m, const void *y0, mrb_int n)
+{
+  const unsigned char *x = (const unsigned char *)x0, *y = (const unsigned char *)y0;
+
+  if (m > n) return -1;
+  else if (m == n) {
+    return memcmp(x0, y0, m) == 0 ? 0 : -1;
+  }
+  else if (m < 1) {
+    return 0;
+  }
+  else if (m == 1) {
+    const unsigned char *ys = y, *ye = ys + n;
+    for (; y < ye; ++y) {
+      if (*x == *y)
+        return y - ys;
+    }
+    return -1;
+  }
+  return mrb_memsearch_qs((const unsigned char *)x0, m, (const unsigned char *)y0, n);
+}
+
+static mrb_int
+mrb_str_index(mrb_state *mrb, mrb_value str, mrb_value sub, mrb_int offset)
+{
+  mrb_int pos;
+  char *s, *sptr;
+  mrb_int len, slen;
+
+  len = RSTRING_LEN(str);
+  slen = RSTRING_LEN(sub);
+  if (offset < 0) {
+    offset += len;
+    if (offset < 0) return -1;
+  }
+  if (len - offset < slen) return -1;
+  s = RSTRING_PTR(str);
+  if (offset) {
+    s += offset;
+  }
+  if (slen == 0) return offset;
+  /* need proceed one character at a time */
+  sptr = RSTRING_PTR(sub);
+  slen = RSTRING_LEN(sub);
+  len = RSTRING_LEN(str) - offset;
+  pos = mrb_memsearch(sptr, slen, s, len);
+  if (pos < 0) return pos;
+  return pos + offset;
+}
+
+MRB_API mrb_value
+mrb_str_dup(mrb_state *mrb, mrb_value str)
+{
+  struct RString *s = mrb_str_ptr(str);
+  struct RString *dup = str_new(mrb, 0, 0);
+
+  str_with_class(mrb, dup, str);
+  return str_replace(mrb, dup, s);
+}
+
+static mrb_value
+mrb_str_aref(mrb_state *mrb, mrb_value str, mrb_value indx)
+{
+  mrb_int idx;
+
+  mrb_regexp_check(mrb, indx);
+  switch (mrb_type(indx)) {
+    case MRB_TT_FIXNUM:
+      idx = mrb_fixnum(indx);
+
+num_index:
+      str = mrb_str_substr(mrb, str, idx, 1);
+      if (!mrb_nil_p(str) && RSTRING_LEN(str) == 0) return mrb_nil_value();
+      return str;
+
+    case MRB_TT_STRING:
+      if (mrb_str_index(mrb, str, indx, 0) != -1)
+        return mrb_str_dup(mrb, indx);
+      return mrb_nil_value();
+
+    case MRB_TT_RANGE:
+      /* check if indx is Range */
+      {
+        mrb_int beg, len;
+
+        len = RSTRING_LEN(str);
+        if (mrb_range_beg_len(mrb, indx, &beg, &len, len)) {
+          return mrb_str_subseq(mrb, str, beg, len);
+        }
+        else {
+          return mrb_nil_value();
+        }
+      }
+    default:
+      idx = mrb_fixnum(indx);
+      goto num_index;
+  }
+  return mrb_nil_value();    /* not reached */
+}
+
+/* 15.2.10.5.6  */
+/* 15.2.10.5.34 */
+/*
+ *  call-seq:
+ *     str[fixnum]                 => fixnum or nil
+ *     str[fixnum, fixnum]         => new_str or nil
+ *     str[range]                  => new_str or nil
+ *     str[regexp]                 => new_str or nil
+ *     str[regexp, fixnum]         => new_str or nil
+ *     str[other_str]              => new_str or nil
+ *     str.slice(fixnum)           => fixnum or nil
+ *     str.slice(fixnum, fixnum)   => new_str or nil
+ *     str.slice(range)            => new_str or nil
+ *     str.slice(other_str)        => new_str or nil
+ *
+ *  Element Reference---If passed a single <code>Fixnum</code>, returns the code
+ *  of the character at that position. If passed two <code>Fixnum</code>
+ *  objects, returns a substring starting at the offset given by the first, and
+ *  a length given by the second. If given a range, a substring containing
+ *  characters at offsets given by the range is returned. In all three cases, if
+ *  an offset is negative, it is counted from the end of <i>str</i>. Returns
+ *  <code>nil</code> if the initial offset falls outside the string, the length
+ *  is negative, or the beginning of the range is greater than the end.
+ *
+ *  If a <code>String</code> is given, that string is returned if it occurs in
+ *  <i>str</i>. In both cases, <code>nil</code> is returned if there is no
+ *  match.
+ *
+ *     a = "hello there"
+ *     a[1]                   #=> 101(1.8.7) "e"(1.9.2)
+ *     a[1,3]                 #=> "ell"
+ *     a[1..3]                #=> "ell"
+ *     a[-3,2]                #=> "er"
+ *     a[-4..-2]              #=> "her"
+ *     a[12..-1]              #=> nil
+ *     a[-2..-4]              #=> ""
+ *     a["lo"]                #=> "lo"
+ *     a["bye"]               #=> nil
+ */
+static mrb_value
+mrb_str_aref_m(mrb_state *mrb, mrb_value str)
+{
+  mrb_value a1, a2;
+  int argc;
+
+  argc = mrb_get_args(mrb, "o|o", &a1, &a2);
+  if (argc == 2) {
+    mrb_regexp_check(mrb, a1);
+    return mrb_str_substr(mrb, str, mrb_fixnum(a1), mrb_fixnum(a2));
+  }
+  if (argc != 1) {
+    mrb_raisef(mrb, E_ARGUMENT_ERROR, "wrong number of arguments (%S for 1)", mrb_fixnum_value(argc));
+  }
+  return mrb_str_aref(mrb, str, a1);
+}
+
+/* 15.2.10.5.8  */
+/*
+ *  call-seq:
+ *     str.capitalize!   => str or nil
+ *
+ *  Modifies <i>str</i> by converting the first character to uppercase and the
+ *  remainder to lowercase. Returns <code>nil</code> if no changes are made.
+ *
+ *     a = "hello"
+ *     a.capitalize!   #=> "Hello"
+ *     a               #=> "Hello"
+ *     a.capitalize!   #=> nil
+ */
+static mrb_value
+mrb_str_capitalize_bang(mrb_state *mrb, mrb_value str)
+{
+  char *p, *pend;
+  mrb_bool modify = FALSE;
+  struct RString *s = mrb_str_ptr(str);
+
+  mrb_str_modify(mrb, s);
+  if (RSTR_LEN(s) == 0 || !RSTR_PTR(s)) return mrb_nil_value();
+  p = RSTR_PTR(s); pend = RSTR_PTR(s) + RSTR_LEN(s);
+  if (ISLOWER(*p)) {
+    *p = TOUPPER(*p);
+    modify = TRUE;
+  }
+  while (++p < pend) {
+    if (ISUPPER(*p)) {
+      *p = TOLOWER(*p);
+      modify = TRUE;
+    }
+  }
+  if (modify) return str;
+  return mrb_nil_value();
+}
+
+/* 15.2.10.5.7  */
+/*
+ *  call-seq:
+ *     str.capitalize   => new_str
+ *
+ *  Returns a copy of <i>str</i> with the first character converted to uppercase
+ *  and the remainder to lowercase.
+ *
+ *     "hello".capitalize    #=> "Hello"
+ *     "HELLO".capitalize    #=> "Hello"
+ *     "123ABC".capitalize   #=> "123abc"
+ */
+static mrb_value
+mrb_str_capitalize(mrb_state *mrb, mrb_value self)
+{
+  mrb_value str;
+
+  str = mrb_str_dup(mrb, self);
+  mrb_str_capitalize_bang(mrb, str);
+  return str;
+}
+
+/* 15.2.10.5.10  */
+/*
+ *  call-seq:
+ *     str.chomp!(separator=$/)   => str or nil
+ *
+ *  Modifies <i>str</i> in place as described for <code>String#chomp</code>,
+ *  returning <i>str</i>, or <code>nil</code> if no modifications were made.
+ */
+static mrb_value
+mrb_str_chomp_bang(mrb_state *mrb, mrb_value str)
+{
+  mrb_value rs;
+  mrb_int newline;
+  char *p, *pp;
+  mrb_int rslen;
+  mrb_int len;
+  struct RString *s = mrb_str_ptr(str);
+
+  mrb_str_modify(mrb, s);
+  len = RSTR_LEN(s);
+  if (mrb_get_args(mrb, "|S", &rs) == 0) {
+    if (len == 0) return mrb_nil_value();
+  smart_chomp:
+    if (RSTR_PTR(s)[len-1] == '\n') {
+      RSTR_SET_LEN(s, RSTR_LEN(s) - 1);
+      if (RSTR_LEN(s) > 0 &&
+          RSTR_PTR(s)[RSTR_LEN(s)-1] == '\r') {
+        RSTR_SET_LEN(s, RSTR_LEN(s) - 1);
+      }
+    }
+    else if (RSTR_PTR(s)[len-1] == '\r') {
+      RSTR_SET_LEN(s, RSTR_LEN(s) - 1);
+    }
+    else {
+      return mrb_nil_value();
+    }
+    RSTR_PTR(s)[RSTR_LEN(s)] = '\0';
+    return str;
+  }
+
+  if (len == 0 || mrb_nil_p(rs)) return mrb_nil_value();
+  p = RSTR_PTR(s);
+  rslen = RSTRING_LEN(rs);
+  if (rslen == 0) {
+    while (len>0 && p[len-1] == '\n') {
+      len--;
+      if (len>0 && p[len-1] == '\r')
+        len--;
+    }
+    if (len < RSTR_LEN(s)) {
+      RSTR_SET_LEN(s, len);
+      p[len] = '\0';
+      return str;
+    }
+    return mrb_nil_value();
+  }
+  if (rslen > len) return mrb_nil_value();
+  newline = RSTRING_PTR(rs)[rslen-1];
+  if (rslen == 1 && newline == '\n')
+    newline = RSTRING_PTR(rs)[rslen-1];
+  if (rslen == 1 && newline == '\n')
+    goto smart_chomp;
+
+  pp = p + len - rslen;
+  if (p[len-1] == newline &&
+     (rslen <= 1 ||
+     memcmp(RSTRING_PTR(rs), pp, rslen) == 0)) {
+    RSTR_SET_LEN(s, len - rslen);
+    p[RSTR_LEN(s)] = '\0';
+    return str;
+  }
+  return mrb_nil_value();
+}
+
+/* 15.2.10.5.9  */
+/*
+ *  call-seq:
+ *     str.chomp(separator=$/)   => new_str
+ *
+ *  Returns a new <code>String</code> with the given record separator removed
+ *  from the end of <i>str</i> (if present). If <code>$/</code> has not been
+ *  changed from the default Ruby record separator, then <code>chomp</code> also
+ *  removes carriage return characters (that is it will remove <code>\n</code>,
+ *  <code>\r</code>, and <code>\r\n</code>).
+ *
+ *     "hello".chomp            #=> "hello"
+ *     "hello\n".chomp          #=> "hello"
+ *     "hello\r\n".chomp        #=> "hello"
+ *     "hello\n\r".chomp        #=> "hello\n"
+ *     "hello\r".chomp          #=> "hello"
+ *     "hello \n there".chomp   #=> "hello \n there"
+ *     "hello".chomp("llo")     #=> "he"
+ */
+static mrb_value
+mrb_str_chomp(mrb_state *mrb, mrb_value self)
+{
+  mrb_value str;
+
+  str = mrb_str_dup(mrb, self);
+  mrb_str_chomp_bang(mrb, str);
+  return str;
+}
+
+/* 15.2.10.5.12 */
+/*
+ *  call-seq:
+ *     str.chop!   => str or nil
+ *
+ *  Processes <i>str</i> as for <code>String#chop</code>, returning <i>str</i>,
+ *  or <code>nil</code> if <i>str</i> is the empty string.  See also
+ *  <code>String#chomp!</code>.
+ */
+static mrb_value
+mrb_str_chop_bang(mrb_state *mrb, mrb_value str)
+{
+  struct RString *s = mrb_str_ptr(str);
+
+  mrb_str_modify(mrb, s);
+  if (RSTR_LEN(s) > 0) {
+    mrb_int len;
+    len = RSTR_LEN(s) - 1;
+    if (RSTR_PTR(s)[len] == '\n') {
+      if (len > 0 &&
+          RSTR_PTR(s)[len-1] == '\r') {
+        len--;
+      }
+    }
+    RSTR_SET_LEN(s, len);
+    RSTR_PTR(s)[len] = '\0';
+    return str;
+  }
+  return mrb_nil_value();
+}
+
+/* 15.2.10.5.11 */
+/*
+ *  call-seq:
+ *     str.chop   => new_str
+ *
+ *  Returns a new <code>String</code> with the last character removed.  If the
+ *  string ends with <code>\r\n</code>, both characters are removed. Applying
+ *  <code>chop</code> to an empty string returns an empty
+ *  string. <code>String#chomp</code> is often a safer alternative, as it leaves
+ *  the string unchanged if it doesn't end in a record separator.
+ *
+ *     "string\r\n".chop   #=> "string"
+ *     "string\n\r".chop   #=> "string\n"
+ *     "string\n".chop     #=> "string"
+ *     "string".chop       #=> "strin"
+ *     "x".chop            #=> ""
+ */
+static mrb_value
+mrb_str_chop(mrb_state *mrb, mrb_value self)
+{
+  mrb_value str;
+  str = mrb_str_dup(mrb, self);
+  mrb_str_chop_bang(mrb, str);
+  return str;
+}
+
+/* 15.2.10.5.14 */
+/*
+ *  call-seq:
+ *     str.downcase!   => str or nil
+ *
+ *  Downcases the contents of <i>str</i>, returning <code>nil</code> if no
+ *  changes were made.
+ */
+static mrb_value
+mrb_str_downcase_bang(mrb_state *mrb, mrb_value str)
+{
+  char *p, *pend;
+  mrb_bool modify = FALSE;
+  struct RString *s = mrb_str_ptr(str);
+
+  mrb_str_modify(mrb, s);
+  p = RSTR_PTR(s);
+  pend = RSTR_PTR(s) + RSTR_LEN(s);
+  while (p < pend) {
+    if (ISUPPER(*p)) {
+      *p = TOLOWER(*p);
+      modify = TRUE;
+    }
+    p++;
+  }
+
+  if (modify) return str;
+  return mrb_nil_value();
+}
+
+/* 15.2.10.5.13 */
+/*
+ *  call-seq:
+ *     str.downcase   => new_str
+ *
+ *  Returns a copy of <i>str</i> with all uppercase letters replaced with their
+ *  lowercase counterparts. The operation is locale insensitive---only
+ *  characters ``A'' to ``Z'' are affected.
+ *
+ *     "hEllO".downcase   #=> "hello"
+ */
+static mrb_value
+mrb_str_downcase(mrb_state *mrb, mrb_value self)
+{
+  mrb_value str;
+
+  str = mrb_str_dup(mrb, self);
+  mrb_str_downcase_bang(mrb, str);
+  return str;
+}
+
+/* 15.2.10.5.16 */
+/*
+ *  call-seq:
+ *     str.empty?   => true or false
+ *
+ *  Returns <code>true</code> if <i>str</i> has a length of zero.
+ *
+ *     "hello".empty?   #=> false
+ *     "".empty?        #=> true
+ */
+static mrb_value
+mrb_str_empty_p(mrb_state *mrb, mrb_value self)
+{
+  struct RString *s = mrb_str_ptr(self);
+
+  return mrb_bool_value(RSTR_LEN(s) == 0);
+}
+
+/* 15.2.10.5.17 */
+/*
+ * call-seq:
+ *   str.eql?(other)   => true or false
+ *
+ * Two strings are equal if the have the same length and content.
+ */
+static mrb_value
+mrb_str_eql(mrb_state *mrb, mrb_value self)
+{
+  mrb_value str2;
+  mrb_bool eql_p;
+
+  mrb_get_args(mrb, "o", &str2);
+  eql_p = (mrb_type(str2) == MRB_TT_STRING) && str_eql(mrb, self, str2);
+
+  return mrb_bool_value(eql_p);
+}
+
+static mrb_value
+mrb_str_subseq(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len)
+{
+  struct RString *orig, *s;
+  mrb_shared_string *shared;
+
+  orig = mrb_str_ptr(str);
+  if (RSTR_EMBED_P(orig)) {
+    s = str_new(mrb, orig->as.ary+beg, len);
+  } else {
+    str_make_shared(mrb, orig);
+    shared = orig->as.heap.aux.shared;
+    s = mrb_obj_alloc_string(mrb);
+    s->as.heap.ptr = orig->as.heap.ptr + beg;
+    s->as.heap.len = len;
+    s->as.heap.aux.shared = shared;
+    RSTR_SET_SHARED_FLAG(s);
+    shared->refcnt++;
+  }
+
+  return mrb_obj_value(s);
+}
+
+MRB_API mrb_value
+mrb_str_substr(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len)
+{
+  if (len < 0) return mrb_nil_value();
+  if (!RSTRING_LEN(str)) {
+    len = 0;
+  }
+  if (beg > RSTRING_LEN(str)) return mrb_nil_value();
+  if (beg < 0) {
+    beg += RSTRING_LEN(str);
+    if (beg < 0) return mrb_nil_value();
+  }
+  if (beg + len > RSTRING_LEN(str))
+    len = RSTRING_LEN(str) - beg;
+  if (len <= 0) {
+    len = 0;
+  }
+  return mrb_str_subseq(mrb, str, beg, len);
+}
+
+mrb_int
+mrb_str_hash(mrb_state *mrb, mrb_value str)
+{
+  /* 1-8-7 */
+  struct RString *s = mrb_str_ptr(str);
+  mrb_int len = RSTR_LEN(s);
+  char *p = RSTR_PTR(s);
+  mrb_int key = 0;
+
+  while (len--) {
+    key = key*65599 + *p;
+    p++;
+  }
+  return key + (key>>5);
+}
+
+/* 15.2.10.5.20 */
+/*
+ * call-seq:
+ *    str.hash   => fixnum
+ *
+ * Return a hash based on the string's length and content.
+ */
+static mrb_value
+mrb_str_hash_m(mrb_state *mrb, mrb_value self)
+{
+  mrb_int key = mrb_str_hash(mrb, self);
+  return mrb_fixnum_value(key);
+}
+
+/* 15.2.10.5.21 */
+/*
+ *  call-seq:
+ *     str.include? other_str   => true or false
+ *     str.include? fixnum      => true or false
+ *
+ *  Returns <code>true</code> if <i>str</i> contains the given string or
+ *  character.
+ *
+ *     "hello".include? "lo"   #=> true
+ *     "hello".include? "ol"   #=> false
+ *     "hello".include? ?h     #=> true
+ */
+static mrb_value
+mrb_str_include(mrb_state *mrb, mrb_value self)
+{
+  mrb_int i;
+  mrb_value str2;
+  mrb_bool include_p;
+
+  mrb_get_args(mrb, "o", &str2);
+  if (mrb_fixnum_p(str2)) {
+    include_p = (memchr(RSTRING_PTR(self), mrb_fixnum(str2), RSTRING_LEN(self)) != NULL);
+  }
+  else {
+    str2 = mrb_str_to_str(mrb, str2);
+    i = mrb_str_index(mrb, self, str2, 0);
+
+    include_p = (i != -1);
+  }
+
+  return mrb_bool_value(include_p);
+}
+
+/* 15.2.10.5.22 */
+/*
+ *  call-seq:
+ *     str.index(substring [, offset])   => fixnum or nil
+ *     str.index(fixnum [, offset])      => fixnum or nil
+ *     str.index(regexp [, offset])      => fixnum or nil
+ *
+ *  Returns the index of the first occurrence of the given
+ *  <i>substring</i>,
+ *  character (<i>fixnum</i>), or pattern (<i>regexp</i>) in <i>str</i>.
+ *  Returns
+ *  <code>nil</code> if not found.
+ *  If the second parameter is present, it
+ *  specifies the position in the string to begin the search.
+ *
+ *     "hello".index('e')             #=> 1
+ *     "hello".index('lo')            #=> 3
+ *     "hello".index('a')             #=> nil
+ *     "hello".index(101)             #=> 1(101=0x65='e')
+ *     "hello".index(/[aeiou]/, -3)   #=> 4
+ */
+static mrb_value
+mrb_str_index_m(mrb_state *mrb, mrb_value str)
+{
+  mrb_value *argv;
+  mrb_int argc;
+  mrb_value sub;
+  mrb_int pos;
+
+  mrb_get_args(mrb, "*", &argv, &argc);
+  if (argc == 2) {
+    pos = mrb_fixnum(argv[1]);
+    sub = argv[0];
+  }
+  else {
+    pos = 0;
+    if (argc > 0)
+      sub = argv[0];
+    else
+      sub = mrb_nil_value();
+  }
+  mrb_regexp_check(mrb, sub);
+  if (pos < 0) {
+    pos += RSTRING_LEN(str);
+    if (pos < 0) {
+      return mrb_nil_value();
+    }
+  }
+
+  switch (mrb_type(sub)) {
+    case MRB_TT_FIXNUM: {
+      int c = mrb_fixnum(sub);
+      mrb_int len = RSTRING_LEN(str);
+      unsigned char *p = (unsigned char*)RSTRING_PTR(str);
+
+      for (;pos<len;pos++) {
+        if (p[pos] == c) return mrb_fixnum_value(pos);
+      }
+      return mrb_nil_value();
+    }
+
+    default: {
+      mrb_value tmp;
+
+      tmp = mrb_check_string_type(mrb, sub);
+      if (mrb_nil_p(tmp)) {
+        mrb_raisef(mrb, E_TYPE_ERROR, "type mismatch: %S given", sub);
+      }
+      sub = tmp;
+    }
+    /* fall through */
+    case MRB_TT_STRING:
+      pos = mrb_str_index(mrb, str, sub, pos);
+      break;
+  }
+
+  if (pos == -1) return mrb_nil_value();
+  return mrb_fixnum_value(pos);
+}
+
+#define STR_REPLACE_SHARED_MIN 10
+
+static mrb_value
+str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2)
+{
+  long len;
+
+  len = RSTR_LEN(s2);
+  if (RSTR_SHARED_P(s1)) {
+    str_decref(mrb, s1->as.heap.aux.shared);
+  }
+  else if (!RSTR_EMBED_P(s1) && !RSTR_NOFREE_P(s1)) {
+    mrb_free(mrb, s1->as.heap.ptr);
+  }
+
+  RSTR_UNSET_NOFREE_FLAG(s1);
+
+  if (RSTR_SHARED_P(s2)) {
+L_SHARE:
+    RSTR_UNSET_EMBED_FLAG(s1);
+    s1->as.heap.ptr = s2->as.heap.ptr;
+    s1->as.heap.len = len;
+    s1->as.heap.aux.shared = s2->as.heap.aux.shared;
+    RSTR_SET_SHARED_FLAG(s1);
+    s1->as.heap.aux.shared->refcnt++;
+  }
+  else {
+    if (len <= RSTRING_EMBED_LEN_MAX) {
+      RSTR_UNSET_SHARED_FLAG(s1);
+      RSTR_SET_EMBED_FLAG(s1);
+      memcpy(s1->as.ary, RSTR_PTR(s2), len);
+      RSTR_SET_EMBED_LEN(s1, len);
+    }
+    else {
+      str_make_shared(mrb, s2);
+      goto L_SHARE;
+    }
+  }
+
+  return mrb_obj_value(s1);
+}
+
+/* 15.2.10.5.24 */
+/* 15.2.10.5.28 */
+/*
+ *  call-seq:
+ *     str.replace(other_str)   => str
+ *
+ *     s = "hello"         #=> "hello"
+ *     s.replace "world"   #=> "world"
+ */
+static mrb_value
+mrb_str_replace(mrb_state *mrb, mrb_value str)
+{
+  mrb_value str2;
+
+  mrb_get_args(mrb, "S", &str2);
+  return str_replace(mrb, mrb_str_ptr(str), mrb_str_ptr(str2));
+}
+
+/* 15.2.10.5.23 */
+/*
+ *  call-seq:
+ *     String.new(str="")   => new_str
+ *
+ *  Returns a new string object containing a copy of <i>str</i>.
+ */
+static mrb_value
+mrb_str_init(mrb_state *mrb, mrb_value self)
+{
+  mrb_value str2;
+
+  if (mrb_get_args(mrb, "|S", &str2) == 1) {
+    str_replace(mrb, mrb_str_ptr(self), mrb_str_ptr(str2));
+  }
+  return self;
+}
+
+/* 15.2.10.5.25 */
+/* 15.2.10.5.41 */
+/*
+ *  call-seq:
+ *     str.intern   => symbol
+ *     str.to_sym   => symbol
+ *
+ *  Returns the <code>Symbol</code> corresponding to <i>str</i>, creating the
+ *  symbol if it did not previously exist. See <code>Symbol#id2name</code>.
+ *
+ *     "Koala".intern         #=> :Koala
+ *     s = 'cat'.to_sym       #=> :cat
+ *     s == :cat              #=> true
+ *     s = '@cat'.to_sym      #=> :@cat
+ *     s == :@cat             #=> true
+ *
+ *  This can also be used to create symbols that cannot be represented using the
+ *  <code>:xxx</code> notation.
+ *
+ *     'cat and dog'.to_sym   #=> :"cat and dog"
+ */
+MRB_API mrb_value
+mrb_str_intern(mrb_state *mrb, mrb_value self)
+{
+  return mrb_symbol_value(mrb_intern_str(mrb, self));
+}
+/* ---------------------------------- */
+MRB_API mrb_value
+mrb_obj_as_string(mrb_state *mrb, mrb_value obj)
+{
+  mrb_value str;
+
+  if (mrb_string_p(obj)) {
+    return obj;
+  }
+  str = mrb_funcall(mrb, obj, "to_s", 0);
+  if (!mrb_string_p(str))
+    return mrb_any_to_s(mrb, obj);
+  return str;
+}
+
+MRB_API mrb_value
+mrb_ptr_to_str(mrb_state *mrb, void *p)
+{
+  struct RString *p_str;
+  char *p1;
+  char *p2;
+  uintptr_t n = (uintptr_t)p;
+
+  p_str = str_new(mrb, NULL, 2 + sizeof(uintptr_t) * CHAR_BIT / 4);
+  p1 = RSTR_PTR(p_str);
+  *p1++ = '0';
+  *p1++ = 'x';
+  p2 = p1;
+
+  do {
+    *p2++ = mrb_digitmap[n % 16];
+    n /= 16;
+  } while (n > 0);
+  *p2 = '\0';
+  RSTR_SET_LEN(p_str, (mrb_int)(p2 - RSTR_PTR(p_str)));
+
+  while (p1 < p2) {
+    const char  c = *p1;
+    *p1++ = *--p2;
+    *p2 = c;
+  }
+
+  return mrb_obj_value(p_str);
+}
+
+MRB_API mrb_value
+mrb_string_type(mrb_state *mrb, mrb_value str)
+{
+  return mrb_convert_type(mrb, str, MRB_TT_STRING, "String", "to_str");
+}
+
+MRB_API mrb_value
+mrb_check_string_type(mrb_state *mrb, mrb_value str)
+{
+  return mrb_check_convert_type(mrb, str, MRB_TT_STRING, "String", "to_str");
+}
+
+/* ---------------------------------- */
+/* 15.2.10.5.29 */
+/*
+ *  call-seq:
+ *     str.reverse   => new_str
+ *
+ *  Returns a new string with the characters from <i>str</i> in reverse order.
+ *
+ *     "stressed".reverse   #=> "desserts"
+ */
+static mrb_value
+mrb_str_reverse(mrb_state *mrb, mrb_value str)
+{
+  struct RString *s2;
+  char *s, *e, *p;
+
+  if (RSTRING_LEN(str) <= 1) return mrb_str_dup(mrb, str);
+
+  s2 = str_new(mrb, 0, RSTRING_LEN(str));
+  str_with_class(mrb, s2, str);
+  s = RSTRING_PTR(str); e = RSTRING_END(str) - 1;
+  p = RSTR_PTR(s2);
+
+  while (e >= s) {
+    *p++ = *e--;
+  }
+  return mrb_obj_value(s2);
+}
+
+/* 15.2.10.5.30 */
+/*
+ *  call-seq:
+ *     str.reverse!   => str
+ *
+ *  Reverses <i>str</i> in place.
+ */
+static mrb_value
+mrb_str_reverse_bang(mrb_state *mrb, mrb_value str)
+{
+  struct RString *s = mrb_str_ptr(str);
+  char *p, *e;
+  char c;
+
+  mrb_str_modify(mrb, s);
+  if (RSTR_LEN(s) > 1) {
+    p = RSTR_PTR(s);
+    e = p + RSTR_LEN(s) - 1;
+    while (p < e) {
+      c = *p;
+      *p++ = *e;
+      *e-- = c;
+    }
+  }
+  return str;
+}
+
+/*
+ *  call-seq:
+ *     str.rindex(substring [, fixnum])   => fixnum or nil
+ *     str.rindex(fixnum [, fixnum])   => fixnum or nil
+ *     str.rindex(regexp [, fixnum])   => fixnum or nil
+ *
+ *  Returns the index of the last occurrence of the given <i>substring</i>,
+ *  character (<i>fixnum</i>), or pattern (<i>regexp</i>) in <i>str</i>. Returns
+ *  <code>nil</code> if not found. If the second parameter is present, it
+ *  specifies the position in the string to end the search---characters beyond
+ *  this point will not be considered.
+ *
+ *     "hello".rindex('e')             #=> 1
+ *     "hello".rindex('l')             #=> 3
+ *     "hello".rindex('a')             #=> nil
+ *     "hello".rindex(101)             #=> 1
+ *     "hello".rindex(/[aeiou]/, -2)   #=> 1
+ */
+static mrb_int
+mrb_str_rindex(mrb_state *mrb, mrb_value str, mrb_value sub, mrb_int pos)
+{
+  char *s, *sbeg, *t;
+  struct RString *ps = mrb_str_ptr(str);
+  mrb_int len = RSTRING_LEN(sub);
+
+  /* substring longer than string */
+  if (RSTR_LEN(ps) < len) return -1;
+  if (RSTR_LEN(ps) - pos < len) {
+    pos = RSTR_LEN(ps) - len;
+  }
+  sbeg = RSTR_PTR(ps);
+  s = RSTR_PTR(ps) + pos;
+  t = RSTRING_PTR(sub);
+  if (len) {
+    while (sbeg <= s) {
+      if (memcmp(s, t, len) == 0) {
+        return s - RSTR_PTR(ps);
+      }
+      s--;
+    }
+    return -1;
+  }
+  else {
+    return pos;
+  }
+}
+
+/* 15.2.10.5.31 */
+/*
+ *  call-seq:
+ *     str.rindex(substring [, fixnum])   => fixnum or nil
+ *     str.rindex(fixnum [, fixnum])   => fixnum or nil
+ *     str.rindex(regexp [, fixnum])   => fixnum or nil
+ *
+ *  Returns the index of the last occurrence of the given <i>substring</i>,
+ *  character (<i>fixnum</i>), or pattern (<i>regexp</i>) in <i>str</i>. Returns
+ *  <code>nil</code> if not found. If the second parameter is present, it
+ *  specifies the position in the string to end the search---characters beyond
+ *  this point will not be considered.
+ *
+ *     "hello".rindex('e')             #=> 1
+ *     "hello".rindex('l')             #=> 3
+ *     "hello".rindex('a')             #=> nil
+ *     "hello".rindex(101)             #=> 1
+ *     "hello".rindex(/[aeiou]/, -2)   #=> 1
+ */
+static mrb_value
+mrb_str_rindex_m(mrb_state *mrb, mrb_value str)
+{
+  mrb_value *argv;
+  mrb_int argc;
+  mrb_value sub;
+  mrb_value vpos;
+  mrb_int pos, len = RSTRING_LEN(str);
+
+  mrb_get_args(mrb, "*", &argv, &argc);
+  if (argc == 2) {
+    sub = argv[0];
+    vpos = argv[1];
+    pos = mrb_fixnum(vpos);
+    if (pos < 0) {
+      pos += len;
+      if (pos < 0) {
+        mrb_regexp_check(mrb, sub);
+        return mrb_nil_value();
+      }
+    }
+    if (pos > len) pos = len;
+  }
+  else {
+    pos = len;
+    if (argc > 0)
+      sub = argv[0];
+    else
+      sub = mrb_nil_value();
+  }
+  mrb_regexp_check(mrb, sub);
+
+  switch (mrb_type(sub)) {
+    case MRB_TT_FIXNUM: {
+      int c = mrb_fixnum(sub);
+      unsigned char *p = (unsigned char*)RSTRING_PTR(str);
+
+      for (pos=len-1;pos>=0;pos--) {
+        if (p[pos] == c) return mrb_fixnum_value(pos);
+      }
+      return mrb_nil_value();
+    }
+
+    default: {
+      mrb_value tmp;
+
+      tmp = mrb_check_string_type(mrb, sub);
+      if (mrb_nil_p(tmp)) {
+        mrb_raisef(mrb, E_TYPE_ERROR, "type mismatch: %S given", sub);
+      }
+      sub = tmp;
+    }
+     /* fall through */
+    case MRB_TT_STRING:
+      pos = mrb_str_rindex(mrb, str, sub, pos);
+      if (pos >= 0) return mrb_fixnum_value(pos);
+      break;
+
+  } /* end of switch (TYPE(sub)) */
+  return mrb_nil_value();
+}
+
+/* 15.2.10.5.35 */
+
+/*
+ *  call-seq:
+ *     str.split(pattern=$;, [limit])   => anArray
+ *
+ *  Divides <i>str</i> into substrings based on a delimiter, returning an array
+ *  of these substrings.
+ *
+ *  If <i>pattern</i> is a <code>String</code>, then its contents are used as
+ *  the delimiter when splitting <i>str</i>. If <i>pattern</i> is a single
+ *  space, <i>str</i> is split on whitespace, with leading whitespace and runs
+ *  of contiguous whitespace characters ignored.
+ *
+ *  If <i>pattern</i> is a <code>Regexp</code>, <i>str</i> is divided where the
+ *  pattern matches. Whenever the pattern matches a zero-length string,
+ *  <i>str</i> is split into individual characters.
+ *
+ *  If <i>pattern</i> is omitted, the value of <code>$;</code> is used.  If
+ *  <code>$;</code> is <code>nil</code> (which is the default), <i>str</i> is
+ *  split on whitespace as if ` ' were specified.
+ *
+ *  If the <i>limit</i> parameter is omitted, trailing null fields are
+ *  suppressed. If <i>limit</i> is a positive number, at most that number of
+ *  fields will be returned (if <i>limit</i> is <code>1</code>, the entire
+ *  string is returned as the only entry in an array). If negative, there is no
+ *  limit to the number of fields returned, and trailing null fields are not
+ *  suppressed.
+ *
+ *     " now's  the time".split        #=> ["now's", "the", "time"]
+ *     " now's  the time".split(' ')   #=> ["now's", "the", "time"]
+ *     " now's  the time".split(/ /)   #=> ["", "now's", "", "the", "time"]
+ *     "1, 2.34,56, 7".split(%r{,\s*}) #=> ["1", "2.34", "56", "7"]
+ *     "hello".split(//)               #=> ["h", "e", "l", "l", "o"]
+ *     "hello".split(//, 3)            #=> ["h", "e", "llo"]
+ *     "hi mom".split(%r{\s*})         #=> ["h", "i", "m", "o", "m"]
+ *
+ *     "mellow yellow".split("ello")   #=> ["m", "w y", "w"]
+ *     "1,2,,3,4,,".split(',')         #=> ["1", "2", "", "3", "4"]
+ *     "1,2,,3,4,,".split(',', 4)      #=> ["1", "2", "", "3,4,,"]
+ *     "1,2,,3,4,,".split(',', -4)     #=> ["1", "2", "", "3", "4", "", ""]
+ */
+
+static mrb_value
+mrb_str_split_m(mrb_state *mrb, mrb_value str)
+{
+  int argc;
+  mrb_value spat = mrb_nil_value();
+  enum {awk, string, regexp} split_type = string;
+  long i = 0, lim_p;
+  mrb_int beg;
+  mrb_int end;
+  mrb_int lim = 0;
+  mrb_value result, tmp;
+
+  argc = mrb_get_args(mrb, "|oi", &spat, &lim);
+  lim_p = (lim > 0 && argc == 2);
+  if (argc == 2) {
+    if (lim == 1) {
+      if (RSTRING_LEN(str) == 0)
+        return mrb_ary_new_capa(mrb, 0);
+      return mrb_ary_new_from_values(mrb, 1, &str);
+    }
+    i = 1;
+  }
+
+  if (argc == 0 || mrb_nil_p(spat)) {
+    split_type = awk;
+  }
+  else {
+    if (mrb_string_p(spat)) {
+      split_type = string;
+      if (RSTRING_LEN(spat) == 1 && RSTRING_PTR(spat)[0] == ' ') {
+          split_type = awk;
+      }
+    }
+    else {
+      mrb_noregexp(mrb, str);
+    }
+  }
+
+  result = mrb_ary_new(mrb);
+  beg = 0;
+  if (split_type == awk) {
+    char *ptr = RSTRING_PTR(str);
+    char *eptr = RSTRING_END(str);
+    char *bptr = ptr;
+    mrb_bool skip = TRUE;
+    unsigned int c;
+
+    end = beg;
+    while (ptr < eptr) {
+      int ai = mrb_gc_arena_save(mrb);
+      c = (unsigned char)*ptr++;
+      if (skip) {
+        if (ISSPACE(c)) {
+          beg = ptr - bptr;
+        }
+        else {
+          end = ptr - bptr;
+          skip = FALSE;
+          if (lim_p && lim <= i) break;
+        }
+      }
+      else if (ISSPACE(c)) {
+        mrb_ary_push(mrb, result, mrb_str_subseq(mrb, str, beg, end-beg));
+        mrb_gc_arena_restore(mrb, ai);
+        skip = TRUE;
+        beg = ptr - bptr;
+        if (lim_p) ++i;
+      }
+      else {
+        end = ptr - bptr;
+      }
+    }
+  }
+  else if (split_type == string) {
+    char *ptr = RSTRING_PTR(str); /* s->as.ary */
+    char *temp = ptr;
+    char *eptr = RSTRING_END(str);
+    mrb_int slen = RSTRING_LEN(spat);
+
+    if (slen == 0) {
+      int ai = mrb_gc_arena_save(mrb);
+      while (ptr < eptr) {
+        mrb_ary_push(mrb, result, mrb_str_subseq(mrb, str, ptr-temp, 1));
+        mrb_gc_arena_restore(mrb, ai);
+        ptr++;
+        if (lim_p && lim <= ++i) break;
+      }
+    }
+    else {
+      char *sptr = RSTRING_PTR(spat);
+      int ai = mrb_gc_arena_save(mrb);
+
+      while (ptr < eptr &&
+        (end = mrb_memsearch(sptr, slen, ptr, eptr - ptr)) >= 0) {
+        mrb_ary_push(mrb, result, mrb_str_subseq(mrb, str, ptr - temp, end));
+        mrb_gc_arena_restore(mrb, ai);
+        ptr += end + slen;
+        if (lim_p && lim <= ++i) break;
+      }
+    }
+    beg = ptr - temp;
+  }
+  else {
+    mrb_noregexp(mrb, str);
+  }
+  if (RSTRING_LEN(str) > 0 && (lim_p || RSTRING_LEN(str) > beg || lim < 0)) {
+    if (RSTRING_LEN(str) == beg) {
+      tmp = mrb_str_new_empty(mrb, str);
+    }
+    else {
+      tmp = mrb_str_subseq(mrb, str, beg, RSTRING_LEN(str)-beg);
+    }
+    mrb_ary_push(mrb, result, tmp);
+  }
+  if (!lim_p && lim == 0) {
+    mrb_int len;
+    while ((len = RARRAY_LEN(result)) > 0 &&
+           (tmp = RARRAY_PTR(result)[len-1], RSTRING_LEN(tmp) == 0))
+      mrb_ary_pop(mrb, result);
+  }
+
+  return result;
+}
+
+MRB_API mrb_value
+mrb_cstr_to_inum(mrb_state *mrb, const char *str, int base, int badcheck)
+{
+  const char *p;
+  char sign = 1;
+  int c, uscore;
+  unsigned long n = 0;
+  mrb_int val;
+
+#define conv_digit(c) \
+    (ISDIGIT(c) ? ((c) - '0') : \
+     ISLOWER(c) ? ((c) - 'a' + 10) : \
+     ISUPPER(c) ? ((c) - 'A' + 10) : \
+     -1)
+
+  if (!str) {
+    if (badcheck) goto bad;
+    return mrb_fixnum_value(0);
+  }
+  while (ISSPACE(*str)) str++;
+
+  if (str[0] == '+') {
+    str++;
+  }
+  else if (str[0] == '-') {
+    str++;
+    sign = 0;
+  }
+  if (str[0] == '+' || str[0] == '-') {
+    if (badcheck) goto bad;
+    return mrb_fixnum_value(0);
+  }
+  if (base <= 0) {
+    if (str[0] == '0') {
+      switch (str[1]) {
+        case 'x': case 'X':
+          base = 16;
+          break;
+        case 'b': case 'B':
+          base = 2;
+          break;
+        case 'o': case 'O':
+          base = 8;
+          break;
+        case 'd': case 'D':
+          base = 10;
+          break;
+        default:
+          base = 8;
+      }
+    }
+    else if (base < -1) {
+      base = -base;
+    }
+    else {
+      base = 10;
+    }
+  }
+  switch (base) {
+    case 2:
+      if (str[0] == '0' && (str[1] == 'b'||str[1] == 'B')) {
+        str += 2;
+      }
+      break;
+    case 3:
+      break;
+    case 8:
+      if (str[0] == '0' && (str[1] == 'o'||str[1] == 'O')) {
+        str += 2;
+      }
+    case 4: case 5: case 6: case 7:
+      break;
+    case 10:
+      if (str[0] == '0' && (str[1] == 'd'||str[1] == 'D')) {
+        str += 2;
+      }
+    case 9: case 11: case 12: case 13: case 14: case 15:
+      break;
+    case 16:
+      if (str[0] == '0' && (str[1] == 'x'||str[1] == 'X')) {
+        str += 2;
+      }
+      break;
+    default:
+      if (base < 2 || 36 < base) {
+        mrb_raisef(mrb, E_ARGUMENT_ERROR, "illegal radix %S", mrb_fixnum_value(base));
+      }
+      break;
+  } /* end of switch (base) { */
+  if (*str == '0') {    /* squeeze preceeding 0s */
+    uscore = 0;
+    while ((c = *++str) == '0' || c == '_') {
+      if (c == '_') {
+        if (++uscore >= 2)
+          break;
+      }
+      else
+        uscore = 0;
+    }
+    if (!(c = *str) || ISSPACE(c)) --str;
+  }
+  c = *str;
+  c = conv_digit(c);
+  if (c < 0 || c >= base) {
+    if (badcheck) goto bad;
+    return mrb_fixnum_value(0);
+  }
+
+  uscore = 0;
+  for (p=str;*p;p++) {
+    if (*p == '_') {
+      if (uscore == 0) {
+        uscore++;
+        continue;
+      }
+      if (badcheck) goto bad;
+      break;
+    }
+    uscore = 0;
+    c = conv_digit(*p);
+    if (c < 0 || c >= base) {
+      if (badcheck) goto bad;
+      break;
+    }
+    n *= base;
+    n += c;
+  }
+  if (n > MRB_INT_MAX) {
+    mrb_raisef(mrb, E_ARGUMENT_ERROR, "string (%S) too big for integer", mrb_str_new_cstr(mrb, str));
+  }
+  val = n;
+  if (badcheck) {
+    if (p == str) goto bad; /* no number */
+    while (*p && ISSPACE(*p)) p++;
+    if (*p) goto bad;           /* trailing garbage */
+  }
+
+  return mrb_fixnum_value(sign ? val : -val);
+bad:
+  mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid string for number(%S)", mrb_str_new_cstr(mrb, str));
+  /* not reached */
+  return mrb_fixnum_value(0);
+}
+
+MRB_API const char*
+mrb_string_value_cstr(mrb_state *mrb, mrb_value *ptr)
+{
+  struct RString *ps = mrb_str_ptr(*ptr);
+  mrb_int len = mrb_str_strlen(mrb, ps);
+  char *p = RSTR_PTR(ps);
+
+  if (!p || p[len] != '\0') {
+    mrb_str_modify(mrb, ps);
+    return RSTR_PTR(ps);
+  }
+  return p;
+}
+
+MRB_API mrb_value
+mrb_str_to_inum(mrb_state *mrb, mrb_value str, mrb_int base, mrb_bool badcheck)
+{
+  const char *s;
+  mrb_int len;
+
+  str = mrb_str_to_str(mrb, str);
+  if (badcheck) {
+    s = mrb_string_value_cstr(mrb, &str);
+  }
+  else {
+    s = RSTRING_PTR(str);
+  }
+  if (s) {
+    len = RSTRING_LEN(str);
+    if (s[len]) {    /* no sentinel somehow */
+      struct RString *temp_str = str_new(mrb, s, len);
+      s = RSTR_PTR(temp_str);
+    }
+  }
+  return mrb_cstr_to_inum(mrb, s, base, badcheck);
+}
+
+/* 15.2.10.5.38 */
+/*
+ *  call-seq:
+ *     str.to_i(base=10)   => integer
+ *
+ *  Returns the result of interpreting leading characters in <i>str</i> as an
+ *  integer base <i>base</i> (between 2 and 36). Extraneous characters past the
+ *  end of a valid number are ignored. If there is not a valid number at the
+ *  start of <i>str</i>, <code>0</code> is returned. This method never raises an
+ *  exception.
+ *
+ *     "12345".to_i             #=> 12345
+ *     "99 red balloons".to_i   #=> 99
+ *     "0a".to_i                #=> 0
+ *     "0a".to_i(16)            #=> 10
+ *     "hello".to_i             #=> 0
+ *     "1100101".to_i(2)        #=> 101
+ *     "1100101".to_i(8)        #=> 294977
+ *     "1100101".to_i(10)       #=> 1100101
+ *     "1100101".to_i(16)       #=> 17826049
+ */
+static mrb_value
+mrb_str_to_i(mrb_state *mrb, mrb_value self)
+{
+  mrb_int base = 10;
+
+  mrb_get_args(mrb, "|i", &base);
+  if (base < 0) {
+    mrb_raisef(mrb, E_ARGUMENT_ERROR, "illegal radix %S", mrb_fixnum_value(base));
+  }
+  return mrb_str_to_inum(mrb, self, base, FALSE);
+}
+
+MRB_API double
+mrb_cstr_to_dbl(mrb_state *mrb, const char * p, mrb_bool badcheck)
+{
+  char *end;
+  double d;
+
+  enum {max_width = 20};
+
+  if (!p) return 0.0;
+  while (ISSPACE(*p)) p++;
+
+  if (!badcheck && p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) {
+    return 0.0;
+  }
+  d = strtod(p, &end);
+  if (p == end) {
+    if (badcheck) {
+bad:
+      mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid string for float(%S)", mrb_str_new_cstr(mrb, p));
+      /* not reached */
+    }
+    return d;
+  }
+  if (*end) {
+    char buf[DBL_DIG * 4 + 10];
+    char *n = buf;
+    char *e = buf + sizeof(buf) - 1;
+    char prev = 0;
+
+    while (p < end && n < e) prev = *n++ = *p++;
+    while (*p) {
+      if (*p == '_') {
+        /* remove underscores between digits */
+        if (badcheck) {
+          if (n == buf || !ISDIGIT(prev)) goto bad;
+          ++p;
+          if (!ISDIGIT(*p)) goto bad;
+        }
+        else {
+          while (*++p == '_');
+          continue;
+        }
+      }
+      prev = *p++;
+      if (n < e) *n++ = prev;
+    }
+    *n = '\0';
+    p = buf;
+
+    if (!badcheck && p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) {
+      return 0.0;
+    }
+
+    d = strtod(p, &end);
+    if (badcheck) {
+      if (!end || p == end) goto bad;
+      while (*end && ISSPACE(*end)) end++;
+      if (*end) goto bad;
+    }
+  }
+  return d;
+}
+
+MRB_API double
+mrb_str_to_dbl(mrb_state *mrb, mrb_value str, mrb_bool badcheck)
+{
+  char *s;
+  mrb_int len;
+
+  str = mrb_str_to_str(mrb, str);
+  s = RSTRING_PTR(str);
+  len = RSTRING_LEN(str);
+  if (s) {
+    if (badcheck && memchr(s, '\0', len)) {
+      mrb_raise(mrb, E_ARGUMENT_ERROR, "string for Float contains null byte");
+    }
+    if (s[len]) {    /* no sentinel somehow */
+      struct RString *temp_str = str_new(mrb, s, len);
+      s = RSTR_PTR(temp_str);
+    }
+  }
+  return mrb_cstr_to_dbl(mrb, s, badcheck);
+}
+
+/* 15.2.10.5.39 */
+/*
+ *  call-seq:
+ *     str.to_f   => float
+ *
+ *  Returns the result of interpreting leading characters in <i>str</i> as a
+ *  floating point number. Extraneous characters past the end of a valid number
+ *  are ignored. If there is not a valid number at the start of <i>str</i>,
+ *  <code>0.0</code> is returned. This method never raises an exception.
+ *
+ *     "123.45e1".to_f        #=> 1234.5
+ *     "45.67 degrees".to_f   #=> 45.67
+ *     "thx1138".to_f         #=> 0.0
+ */
+static mrb_value
+mrb_str_to_f(mrb_state *mrb, mrb_value self)
+{
+  return mrb_float_value(mrb, mrb_str_to_dbl(mrb, self, FALSE));
+}
+
+/* 15.2.10.5.40 */
+/*
+ *  call-seq:
+ *     str.to_s     => str
+ *     str.to_str   => str
+ *
+ *  Returns the receiver.
+ */
+static mrb_value
+mrb_str_to_s(mrb_state *mrb, mrb_value self)
+{
+  if (mrb_obj_class(mrb, self) != mrb->string_class) {
+    return mrb_str_dup(mrb, self);
+  }
+  return self;
+}
+
+/* 15.2.10.5.43 */
+/*
+ *  call-seq:
+ *     str.upcase!   => str or nil
+ *
+ *  Upcases the contents of <i>str</i>, returning <code>nil</code> if no changes
+ *  were made.
+ */
+static mrb_value
+mrb_str_upcase_bang(mrb_state *mrb, mrb_value str)
+{
+  struct RString *s = mrb_str_ptr(str);
+  char *p, *pend;
+  mrb_bool modify = FALSE;
+
+  mrb_str_modify(mrb, s);
+  p = RSTRING_PTR(str);
+  pend = RSTRING_END(str);
+  while (p < pend) {
+    if (ISLOWER(*p)) {
+      *p = TOUPPER(*p);
+      modify = TRUE;
+    }
+    p++;
+  }
+
+  if (modify) return str;
+  return mrb_nil_value();
+}
+
+/* 15.2.10.5.42 */
+/*
+ *  call-seq:
+ *     str.upcase   => new_str
+ *
+ *  Returns a copy of <i>str</i> with all lowercase letters replaced with their
+ *  uppercase counterparts. The operation is locale insensitive---only
+ *  characters ``a'' to ``z'' are affected.
+ *
+ *     "hEllO".upcase   #=> "HELLO"
+ */
+static mrb_value
+mrb_str_upcase(mrb_state *mrb, mrb_value self)
+{
+  mrb_value str;
+
+  str = mrb_str_dup(mrb, self);
+  mrb_str_upcase_bang(mrb, str);
+  return str;
+}
+
+#define IS_EVSTR(p,e) ((p) < (e) && (*(p) == '$' || *(p) == '@' || *(p) == '{'))
+
+/*
+ *  call-seq:
+ *     str.dump   -> new_str
+ *
+ *  Produces a version of <i>str</i> with all nonprinting characters replaced by
+ *  <code>\nnn</code> notation and all special characters escaped.
+ */
+mrb_value
+mrb_str_dump(mrb_state *mrb, mrb_value str)
+{
+  mrb_int len;
+  const char *p, *pend;
+  char *q;
+  struct RString *result;
+
+  len = 2;                  /* "" */
+  p = RSTRING_PTR(str); pend = p + RSTRING_LEN(str);
+  while (p < pend) {
+    unsigned char c = *p++;
+    switch (c) {
+      case '"':  case '\\':
+      case '\n': case '\r':
+      case '\t': case '\f':
+      case '\013': case '\010': case '\007': case '\033':
+        len += 2;
+        break;
+
+      case '#':
+        len += IS_EVSTR(p, pend) ? 2 : 1;
+        break;
+
+      default:
+        if (ISPRINT(c)) {
+          len++;
+        }
+        else {
+          len += 4;                /* \NNN */
+        }
+        break;
+    }
+  }
+
+  result = str_new(mrb, 0, len);
+  str_with_class(mrb, result, str);
+  p = RSTRING_PTR(str); pend = p + RSTRING_LEN(str);
+  q = RSTR_PTR(result);
+  *q++ = '"';
+  while (p < pend) {
+    unsigned char c = *p++;
+
+    switch (c) {
+      case '"':
+      case '\\':
+        *q++ = '\\';
+        *q++ = c;
+        break;
+
+      case '\n':
+        *q++ = '\\';
+        *q++ = 'n';
+        break;
+
+      case '\r':
+        *q++ = '\\';
+        *q++ = 'r';
+        break;
+
+      case '\t':
+        *q++ = '\\';
+        *q++ = 't';
+        break;
+
+      case '\f':
+        *q++ = '\\';
+        *q++ = 'f';
+        break;
+
+      case '\013':
+        *q++ = '\\';
+        *q++ = 'v';
+        break;
+
+      case '\010':
+        *q++ = '\\';
+        *q++ = 'b';
+        break;
+
+      case '\007':
+        *q++ = '\\';
+        *q++ = 'a';
+        break;
+
+      case '\033':
+        *q++ = '\\';
+        *q++ = 'e';
+        break;
+
+      case '#':
+        if (IS_EVSTR(p, pend)) *q++ = '\\';
+        *q++ = '#';
+        break;
+
+      default:
+        if (ISPRINT(c)) {
+          *q++ = c;
+        }
+        else {
+          *q++ = '\\';
+          q[2] = '0' + c % 8; c /= 8;
+          q[1] = '0' + c % 8; c /= 8;
+          q[0] = '0' + c % 8;
+          q += 3;
+        }
+    }
+  }
+  *q = '"';
+  return mrb_obj_value(result);
+}
+
+MRB_API mrb_value
+mrb_str_cat(mrb_state *mrb, mrb_value str, const char *ptr, size_t len)
+{
+  str_buf_cat(mrb, mrb_str_ptr(str), ptr, len);
+  return str;
+}
+
+MRB_API mrb_value
+mrb_str_cat_cstr(mrb_state *mrb, mrb_value str, const char *ptr)
+{
+  return mrb_str_cat(mrb, str, ptr, strlen(ptr));
+}
+
+MRB_API mrb_value
+mrb_str_cat_str(mrb_state *mrb, mrb_value str, mrb_value str2)
+{
+  return mrb_str_cat(mrb, str, RSTRING_PTR(str2), RSTRING_LEN(str2));
+}
+
+MRB_API mrb_value
+mrb_str_append(mrb_state *mrb, mrb_value str, mrb_value str2)
+{
+  str2 = mrb_str_to_str(mrb, str2);
+  return mrb_str_cat_str(mrb, str, str2);
+}
+
+#define CHAR_ESC_LEN 13 /* sizeof(\x{ hex of 32bit unsigned int } \0) */
+
+/*
+ * call-seq:
+ *   str.inspect   -> string
+ *
+ * Returns a printable version of _str_, surrounded by quote marks,
+ * with special characters escaped.
+ *
+ *    str = "hello"
+ *    str[3] = "\b"
+ *    str.inspect       #=> "\"hel\\bo\""
+ */
+mrb_value
+mrb_str_inspect(mrb_state *mrb, mrb_value str)
+{
+  const char *p, *pend;
+  char buf[CHAR_ESC_LEN + 1];
+  mrb_value result = mrb_str_new_lit(mrb, "\"");
+
+  p = RSTRING_PTR(str); pend = RSTRING_END(str);
+  for (;p < pend; p++) {
+    unsigned char c, cc;
+
+    c = *p;
+    if (c == '"'|| c == '\\' || (c == '#' && IS_EVSTR(p, pend))) {
+      buf[0] = '\\'; buf[1] = c;
+      mrb_str_cat(mrb, result, buf, 2);
+      continue;
+    }
+    if (ISPRINT(c)) {
+      buf[0] = c;
+      mrb_str_cat(mrb, result, buf, 1);
+      continue;
+    }
+    switch (c) {
+      case '\n': cc = 'n'; break;
+      case '\r': cc = 'r'; break;
+      case '\t': cc = 't'; break;
+      case '\f': cc = 'f'; break;
+      case '\013': cc = 'v'; break;
+      case '\010': cc = 'b'; break;
+      case '\007': cc = 'a'; break;
+      case 033: cc = 'e'; break;
+      default: cc = 0; break;
+    }
+    if (cc) {
+      buf[0] = '\\';
+      buf[1] = (char)cc;
+      mrb_str_cat(mrb, result, buf, 2);
+      continue;
+    }
+    else {
+      buf[0] = '\\';
+      buf[3] = '0' + c % 8; c /= 8;
+      buf[2] = '0' + c % 8; c /= 8;
+      buf[1] = '0' + c % 8;
+      mrb_str_cat(mrb, result, buf, 4);
+      continue;
+    }
+  }
+  mrb_str_cat_lit(mrb, result, "\"");
+
+  return result;
+}
+
+/*
+ * call-seq:
+ *   str.bytes   -> array of fixnums
+ *
+ * Returns an array of bytes in _str_.
+ *
+ *    str = "hello"
+ *    str.bytes       #=> [104, 101, 108, 108, 111]
+ */
+static mrb_value
+mrb_str_bytes(mrb_state *mrb, mrb_value str)
+{
+  struct RString *s = mrb_str_ptr(str);
+  mrb_value a = mrb_ary_new_capa(mrb, RSTR_LEN(s));
+  unsigned char *p = (unsigned char *)(RSTR_PTR(s)), *pend = p + RSTR_LEN(s);
+
+  while (p < pend) {
+    mrb_ary_push(mrb, a, mrb_fixnum_value(p[0]));
+    p++;
+  }
+  return a;
+}
+
+/* ---------------------------*/
+void
+mrb_init_string(mrb_state *mrb)
+{
+  struct RClass *s;
+
+  mrb_static_assert(RSTRING_EMBED_LEN_MAX < (1 << 5), "pointer size too big for embedded string");
+
+  s = mrb->string_class = mrb_define_class(mrb, "String", mrb->object_class);             /* 15.2.10 */
+  MRB_SET_INSTANCE_TT(s, MRB_TT_STRING);
+
+  mrb_define_method(mrb, s, "bytesize",        mrb_str_size,            MRB_ARGS_NONE());
+
+  mrb_define_method(mrb, s, "<=>",             mrb_str_cmp_m,           MRB_ARGS_REQ(1)); /* 15.2.10.5.1  */
+  mrb_define_method(mrb, s, "==",              mrb_str_equal_m,         MRB_ARGS_REQ(1)); /* 15.2.10.5.2  */
+  mrb_define_method(mrb, s, "+",               mrb_str_plus_m,          MRB_ARGS_REQ(1)); /* 15.2.10.5.4  */
+  mrb_define_method(mrb, s, "*",               mrb_str_times,           MRB_ARGS_REQ(1)); /* 15.2.10.5.5  */
+  mrb_define_method(mrb, s, "[]",              mrb_str_aref_m,          MRB_ARGS_ANY());  /* 15.2.10.5.6  */
+  mrb_define_method(mrb, s, "capitalize",      mrb_str_capitalize,      MRB_ARGS_NONE()); /* 15.2.10.5.7  */
+  mrb_define_method(mrb, s, "capitalize!",     mrb_str_capitalize_bang, MRB_ARGS_NONE()); /* 15.2.10.5.8  */
+  mrb_define_method(mrb, s, "chomp",           mrb_str_chomp,           MRB_ARGS_ANY());  /* 15.2.10.5.9  */
+  mrb_define_method(mrb, s, "chomp!",          mrb_str_chomp_bang,      MRB_ARGS_ANY());  /* 15.2.10.5.10 */
+  mrb_define_method(mrb, s, "chop",            mrb_str_chop,            MRB_ARGS_REQ(1)); /* 15.2.10.5.11 */
+  mrb_define_method(mrb, s, "chop!",           mrb_str_chop_bang,       MRB_ARGS_REQ(1)); /* 15.2.10.5.12 */
+  mrb_define_method(mrb, s, "downcase",        mrb_str_downcase,        MRB_ARGS_NONE()); /* 15.2.10.5.13 */
+  mrb_define_method(mrb, s, "downcase!",       mrb_str_downcase_bang,   MRB_ARGS_NONE()); /* 15.2.10.5.14 */
+  mrb_define_method(mrb, s, "empty?",          mrb_str_empty_p,         MRB_ARGS_NONE()); /* 15.2.10.5.16 */
+  mrb_define_method(mrb, s, "eql?",            mrb_str_eql,             MRB_ARGS_REQ(1)); /* 15.2.10.5.17 */
+
+  mrb_define_method(mrb, s, "hash",            mrb_str_hash_m,          MRB_ARGS_NONE()); /* 15.2.10.5.20 */
+  mrb_define_method(mrb, s, "include?",        mrb_str_include,         MRB_ARGS_REQ(1)); /* 15.2.10.5.21 */
+  mrb_define_method(mrb, s, "index",           mrb_str_index_m,         MRB_ARGS_ANY());  /* 15.2.10.5.22 */
+  mrb_define_method(mrb, s, "initialize",      mrb_str_init,            MRB_ARGS_REQ(1)); /* 15.2.10.5.23 */
+  mrb_define_method(mrb, s, "initialize_copy", mrb_str_replace,         MRB_ARGS_REQ(1)); /* 15.2.10.5.24 */
+  mrb_define_method(mrb, s, "intern",          mrb_str_intern,          MRB_ARGS_NONE()); /* 15.2.10.5.25 */
+  mrb_define_method(mrb, s, "length",          mrb_str_size,            MRB_ARGS_NONE()); /* 15.2.10.5.26 */
+  mrb_define_method(mrb, s, "replace",         mrb_str_replace,         MRB_ARGS_REQ(1)); /* 15.2.10.5.28 */
+  mrb_define_method(mrb, s, "reverse",         mrb_str_reverse,         MRB_ARGS_NONE()); /* 15.2.10.5.29 */
+  mrb_define_method(mrb, s, "reverse!",        mrb_str_reverse_bang,    MRB_ARGS_NONE()); /* 15.2.10.5.30 */
+  mrb_define_method(mrb, s, "rindex",          mrb_str_rindex_m,        MRB_ARGS_ANY());  /* 15.2.10.5.31 */
+  mrb_define_method(mrb, s, "size",            mrb_str_size,            MRB_ARGS_NONE()); /* 15.2.10.5.33 */
+  mrb_define_method(mrb, s, "slice",           mrb_str_aref_m,          MRB_ARGS_ANY());  /* 15.2.10.5.34 */
+  mrb_define_method(mrb, s, "split",           mrb_str_split_m,         MRB_ARGS_ANY());  /* 15.2.10.5.35 */
+
+  mrb_define_method(mrb, s, "to_f",            mrb_str_to_f,            MRB_ARGS_NONE()); /* 15.2.10.5.38 */
+  mrb_define_method(mrb, s, "to_i",            mrb_str_to_i,            MRB_ARGS_ANY());  /* 15.2.10.5.39 */
+  mrb_define_method(mrb, s, "to_s",            mrb_str_to_s,            MRB_ARGS_NONE()); /* 15.2.10.5.40 */
+  mrb_define_method(mrb, s, "to_str",          mrb_str_to_s,            MRB_ARGS_NONE());
+  mrb_define_method(mrb, s, "to_sym",          mrb_str_intern,          MRB_ARGS_NONE()); /* 15.2.10.5.41 */
+  mrb_define_method(mrb, s, "upcase",          mrb_str_upcase,          MRB_ARGS_NONE()); /* 15.2.10.5.42 */
+  mrb_define_method(mrb, s, "upcase!",         mrb_str_upcase_bang,     MRB_ARGS_NONE()); /* 15.2.10.5.43 */
+  mrb_define_method(mrb, s, "inspect",         mrb_str_inspect,         MRB_ARGS_NONE()); /* 15.2.10.5.46(x) */
+  mrb_define_method(mrb, s, "bytes",           mrb_str_bytes,           MRB_ARGS_NONE());
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/symbol.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,491 @@
+/*
+** symbol.c - Symbol class
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <ctype.h>
+#include <limits.h>
+#include <string.h>
+#include "mruby.h"
+#include "mruby/khash.h"
+#include "mruby/string.h"
+#include "mruby/dump.h"
+
+/* ------------------------------------------------------ */
+typedef struct symbol_name {
+  mrb_bool lit : 1;
+  uint16_t len;
+  const char *name;
+} symbol_name;
+
+static inline khint_t
+sym_hash_func(mrb_state *mrb, mrb_sym s)
+{
+  khint_t h = 0;
+  size_t i, len = mrb->symtbl[s].len;
+  const char *p = mrb->symtbl[s].name;
+
+  for (i=0; i<len; i++) {
+    h = (h << 5) - h + *p++;
+  }
+  return h;
+}
+#define sym_hash_equal(mrb,a, b) (mrb->symtbl[a].len == mrb->symtbl[b].len && memcmp(mrb->symtbl[a].name, mrb->symtbl[b].name, mrb->symtbl[a].len) == 0)
+
+KHASH_DECLARE(n2s, mrb_sym, mrb_sym, FALSE)
+KHASH_DEFINE (n2s, mrb_sym, mrb_sym, FALSE, sym_hash_func, sym_hash_equal)
+/* ------------------------------------------------------ */
+
+static void
+sym_validate_len(mrb_state *mrb, size_t len)
+{
+  if (len >= RITE_LV_NULL_MARK) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "symbol length too long");
+  }
+}
+
+static mrb_sym
+sym_intern(mrb_state *mrb, const char *name, size_t len, mrb_bool lit)
+{
+  khash_t(n2s) *h = mrb->name2sym;
+  symbol_name *sname = mrb->symtbl; /* symtbl[0] for working memory */
+  khiter_t k;
+  mrb_sym sym;
+  char *p;
+
+  sym_validate_len(mrb, len);
+  if (sname) {
+    sname->lit = lit;
+    sname->len = (uint16_t)len;
+    sname->name = name;
+    k = kh_get(n2s, mrb, h, 0);
+    if (k != kh_end(h))
+      return kh_key(h, k);
+  }
+
+  /* registering a new symbol */
+  sym = ++mrb->symidx;
+  if (mrb->symcapa < sym) {
+    if (mrb->symcapa == 0) mrb->symcapa = 100;
+    else mrb->symcapa = (size_t)(mrb->symcapa * 1.2);
+    mrb->symtbl = (symbol_name*)mrb_realloc(mrb, mrb->symtbl, sizeof(symbol_name)*(mrb->symcapa+1));
+  }
+  sname = &mrb->symtbl[sym];
+  sname->len = (uint16_t)len;
+  if (lit || mrb_ro_data_p(name)) {
+    sname->name = name;
+    sname->lit = TRUE;
+  }
+  else {
+    p = (char *)mrb_malloc(mrb, len+1);
+    memcpy(p, name, len);
+    p[len] = 0;
+    sname->name = (const char*)p;
+    sname->lit = FALSE;
+  }
+  kh_put(n2s, mrb, h, sym);
+
+  return sym;
+}
+
+MRB_API mrb_sym
+mrb_intern(mrb_state *mrb, const char *name, size_t len)
+{
+  return sym_intern(mrb, name, len, FALSE);
+}
+
+MRB_API mrb_sym
+mrb_intern_static(mrb_state *mrb, const char *name, size_t len)
+{
+  return sym_intern(mrb, name, len, TRUE);
+}
+
+MRB_API mrb_sym
+mrb_intern_cstr(mrb_state *mrb, const char *name)
+{
+  return mrb_intern(mrb, name, strlen(name));
+}
+
+MRB_API mrb_sym
+mrb_intern_str(mrb_state *mrb, mrb_value str)
+{
+  return mrb_intern(mrb, RSTRING_PTR(str), RSTRING_LEN(str));
+}
+
+MRB_API mrb_value
+mrb_check_intern(mrb_state *mrb, const char *name, size_t len)
+{
+  khash_t(n2s) *h = mrb->name2sym;
+  symbol_name *sname = mrb->symtbl;
+  khiter_t k;
+
+  sym_validate_len(mrb, len);
+  sname->len = (uint16_t)len;
+  sname->name = name;
+
+  k = kh_get(n2s, mrb, h, 0);
+  if (k != kh_end(h)) {
+    return mrb_symbol_value(kh_key(h, k));
+  }
+  return mrb_nil_value();
+}
+
+MRB_API mrb_value
+mrb_check_intern_cstr(mrb_state *mrb, const char *name)
+{
+  return mrb_check_intern(mrb, name, (mrb_int)strlen(name));
+}
+
+MRB_API mrb_value
+mrb_check_intern_str(mrb_state *mrb, mrb_value str)
+{
+  return mrb_check_intern(mrb, RSTRING_PTR(str), RSTRING_LEN(str));
+}
+
+/* lenp must be a pointer to a size_t variable */
+MRB_API const char*
+mrb_sym2name_len(mrb_state *mrb, mrb_sym sym, mrb_int *lenp)
+{
+  if (sym == 0 || mrb->symidx < sym) {
+    if (lenp) *lenp = 0;
+    return NULL;
+  }
+
+  if (lenp) *lenp = mrb->symtbl[sym].len;
+  return mrb->symtbl[sym].name;
+}
+
+void
+mrb_free_symtbl(mrb_state *mrb)
+{
+  mrb_sym i, lim;
+
+  for (i=1, lim=mrb->symidx+1; i<lim; i++) {
+    if (!mrb->symtbl[i].lit) {
+      mrb_free(mrb, (char*)mrb->symtbl[i].name);
+    }
+  }
+  mrb_free(mrb, mrb->symtbl);
+  kh_destroy(n2s, mrb, mrb->name2sym);
+}
+
+void
+mrb_init_symtbl(mrb_state *mrb)
+{
+  mrb->name2sym = kh_init(n2s, mrb);
+}
+
+/**********************************************************************
+ * Document-class: Symbol
+ *
+ *  <code>Symbol</code> objects represent names and some strings
+ *  inside the Ruby
+ *  interpreter. They are generated using the <code>:name</code> and
+ *  <code>:"string"</code> literals
+ *  syntax, and by the various <code>to_sym</code> methods. The same
+ *  <code>Symbol</code> object will be created for a given name or string
+ *  for the duration of a program's execution, regardless of the context
+ *  or meaning of that name. Thus if <code>Fred</code> is a constant in
+ *  one context, a method in another, and a class in a third, the
+ *  <code>Symbol</code> <code>:Fred</code> will be the same object in
+ *  all three contexts.
+ *
+ *     module One
+ *       class Fred
+ *       end
+ *       $f1 = :Fred
+ *     end
+ *     module Two
+ *       Fred = 1
+ *       $f2 = :Fred
+ *     end
+ *     def Fred()
+ *     end
+ *     $f3 = :Fred
+ *     $f1.object_id   #=> 2514190
+ *     $f2.object_id   #=> 2514190
+ *     $f3.object_id   #=> 2514190
+ *
+ */
+
+
+/* 15.2.11.3.1  */
+/*
+ *  call-seq:
+ *     sym == obj   -> true or false
+ *
+ *  Equality---If <i>sym</i> and <i>obj</i> are exactly the same
+ *  symbol, returns <code>true</code>.
+ */
+
+static mrb_value
+sym_equal(mrb_state *mrb, mrb_value sym1)
+{
+  mrb_value sym2;
+
+  mrb_get_args(mrb, "o", &sym2);
+
+  return mrb_bool_value(mrb_obj_equal(mrb, sym1, sym2));
+}
+
+/* 15.2.11.3.2  */
+/* 15.2.11.3.3  */
+/*
+ *  call-seq:
+ *     sym.id2name   -> string
+ *     sym.to_s      -> string
+ *
+ *  Returns the name or string corresponding to <i>sym</i>.
+ *
+ *     :fred.id2name   #=> "fred"
+ */
+static mrb_value
+mrb_sym_to_s(mrb_state *mrb, mrb_value sym)
+{
+  mrb_sym id = mrb_symbol(sym);
+  const char *p;
+  mrb_int len;
+
+  p = mrb_sym2name_len(mrb, id, &len);
+  return mrb_str_new_static(mrb, p, len);
+}
+
+/* 15.2.11.3.4  */
+/*
+ * call-seq:
+ *   sym.to_sym   -> sym
+ *   sym.intern   -> sym
+ *
+ * In general, <code>to_sym</code> returns the <code>Symbol</code> corresponding
+ * to an object. As <i>sym</i> is already a symbol, <code>self</code> is returned
+ * in this case.
+ */
+
+static mrb_value
+sym_to_sym(mrb_state *mrb, mrb_value sym)
+{
+  return sym;
+}
+
+/* 15.2.11.3.5(x)  */
+/*
+ *  call-seq:
+ *     sym.inspect    -> string
+ *
+ *  Returns the representation of <i>sym</i> as a symbol literal.
+ *
+ *     :fred.inspect   #=> ":fred"
+ */
+
+#if __STDC__
+# define SIGN_EXTEND_CHAR(c) ((signed char)(c))
+#else  /* not __STDC__ */
+/* As in Harbison and Steele.  */
+# define SIGN_EXTEND_CHAR(c) ((((unsigned char)(c)) ^ 128) - 128)
+#endif
+#define is_identchar(c) (SIGN_EXTEND_CHAR(c)!=-1&&(ISALNUM(c) || (c) == '_'))
+
+static mrb_bool
+is_special_global_name(const char* m)
+{
+  switch (*m) {
+    case '~': case '*': case '$': case '?': case '!': case '@':
+    case '/': case '\\': case ';': case ',': case '.': case '=':
+    case ':': case '<': case '>': case '\"':
+    case '&': case '`': case '\'': case '+':
+    case '0':
+      ++m;
+      break;
+    case '-':
+      ++m;
+      if (is_identchar(*m)) m += 1;
+      break;
+    default:
+      if (!ISDIGIT(*m)) return FALSE;
+      do ++m; while (ISDIGIT(*m));
+      break;
+  }
+  return !*m;
+}
+
+static mrb_bool
+symname_p(const char *name)
+{
+  const char *m = name;
+  mrb_bool localid = FALSE;
+
+  if (!m) return FALSE;
+  switch (*m) {
+    case '\0':
+      return FALSE;
+
+    case '$':
+      if (is_special_global_name(++m)) return TRUE;
+      goto id;
+
+    case '@':
+      if (*++m == '@') ++m;
+      goto id;
+
+    case '<':
+      switch (*++m) {
+        case '<': ++m; break;
+        case '=': if (*++m == '>') ++m; break;
+        default: break;
+      }
+      break;
+
+    case '>':
+      switch (*++m) {
+        case '>': case '=': ++m; break;
+        default: break;
+      }
+      break;
+
+    case '=':
+      switch (*++m) {
+        case '~': ++m; break;
+        case '=': if (*++m == '=') ++m; break;
+        default: return FALSE;
+      }
+      break;
+
+    case '*':
+      if (*++m == '*') ++m;
+      break;
+    case '!':
+      if (*++m == '=') ++m;
+      break;
+    case '+': case '-':
+      if (*++m == '@') ++m;
+      break;
+    case '|':
+      if (*++m == '|') ++m;
+      break;
+    case '&':
+      if (*++m == '&') ++m;
+      break;
+
+    case '^': case '/': case '%': case '~': case '`':
+      ++m;
+      break;
+
+    case '[':
+      if (*++m != ']') return FALSE;
+      if (*++m == '=') ++m;
+      break;
+
+    default:
+      localid = !ISUPPER(*m);
+id:
+      if (*m != '_' && !ISALPHA(*m)) return FALSE;
+      while (is_identchar(*m)) m += 1;
+      if (localid) {
+        switch (*m) {
+          case '!': case '?': case '=': ++m;
+          default: break;
+            }
+        }
+      break;
+  }
+  return *m ? FALSE : TRUE;
+}
+
+static mrb_value
+sym_inspect(mrb_state *mrb, mrb_value sym)
+{
+  mrb_value str;
+  const char *name;
+  mrb_int len;
+  mrb_sym id = mrb_symbol(sym);
+  char *sp;
+
+  name = mrb_sym2name_len(mrb, id, &len);
+  str = mrb_str_new(mrb, 0, len+1);
+  sp = RSTRING_PTR(str);
+  RSTRING_PTR(str)[0] = ':';
+  memcpy(sp+1, name, len);
+  mrb_assert_int_fit(mrb_int, len, size_t, SIZE_MAX);
+  if (!symname_p(name) || strlen(name) != (size_t)len) {
+    str = mrb_str_dump(mrb, str);
+    sp = RSTRING_PTR(str);
+    sp[0] = ':';
+    sp[1] = '"';
+  }
+  return str;
+}
+
+MRB_API mrb_value
+mrb_sym2str(mrb_state *mrb, mrb_sym sym)
+{
+  mrb_int len;
+  const char *name = mrb_sym2name_len(mrb, sym, &len);
+
+  if (!name) return mrb_undef_value(); /* can't happen */
+  return mrb_str_new_static(mrb, name, len);
+}
+
+MRB_API const char*
+mrb_sym2name(mrb_state *mrb, mrb_sym sym)
+{
+  mrb_int len;
+  const char *name = mrb_sym2name_len(mrb, sym, &len);
+
+  if (!name) return NULL;
+  if (symname_p(name) && strlen(name) == (size_t)len) {
+    return name;
+  }
+  else {
+    mrb_value str = mrb_str_dump(mrb, mrb_str_new_static(mrb, name, len));
+    return RSTRING_PTR(str);
+  }
+}
+
+#define lesser(a,b) (((a)>(b))?(b):(a))
+
+static mrb_value
+sym_cmp(mrb_state *mrb, mrb_value s1)
+{
+  mrb_value s2;
+  mrb_sym sym1, sym2;
+
+  mrb_get_args(mrb, "o", &s2);
+  if (mrb_type(s2) != MRB_TT_SYMBOL) return mrb_nil_value();
+  sym1 = mrb_symbol(s1);
+  sym2 = mrb_symbol(s2);
+  if (sym1 == sym2) return mrb_fixnum_value(0);
+  else {
+    const char *p1, *p2;
+    int retval;
+    mrb_int len, len1, len2;
+
+    p1 = mrb_sym2name_len(mrb, sym1, &len1);
+    p2 = mrb_sym2name_len(mrb, sym2, &len2);
+    len = lesser(len1, len2);
+    retval = memcmp(p1, p2, len);
+    if (retval == 0) {
+      if (len1 == len2) return mrb_fixnum_value(0);
+      if (len1 > len2)  return mrb_fixnum_value(1);
+      return mrb_fixnum_value(-1);
+    }
+    if (retval > 0) return mrb_fixnum_value(1);
+    return mrb_fixnum_value(-1);
+  }
+}
+
+void
+mrb_init_symbol(mrb_state *mrb)
+{
+  struct RClass *sym;
+
+  sym = mrb->symbol_class = mrb_define_class(mrb, "Symbol", mrb->object_class);                 /* 15.2.11 */
+
+  mrb_define_method(mrb, sym, "===",             sym_equal,      MRB_ARGS_REQ(1));              /* 15.2.11.3.1  */
+  mrb_define_method(mrb, sym, "id2name",         mrb_sym_to_s,   MRB_ARGS_NONE());              /* 15.2.11.3.2  */
+  mrb_define_method(mrb, sym, "to_s",            mrb_sym_to_s,   MRB_ARGS_NONE());              /* 15.2.11.3.3  */
+  mrb_define_method(mrb, sym, "to_sym",          sym_to_sym,     MRB_ARGS_NONE());              /* 15.2.11.3.4  */
+  mrb_define_method(mrb, sym, "inspect",         sym_inspect,    MRB_ARGS_NONE());              /* 15.2.11.3.5(x)  */
+  mrb_define_method(mrb, sym, "<=>",             sym_cmp,        MRB_ARGS_REQ(1));
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/value_array.h	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,28 @@
+#ifndef MRB_VALUE_ARRAY_H__
+#define MRB_VALUE_ARRAY_H__
+
+#include "mruby.h"
+
+static inline void
+value_move(mrb_value *s1, const mrb_value *s2, size_t n)
+{
+  if (s1 > s2 && s1 < s2 + n)
+  {
+    s1 += n;
+    s2 += n;
+    while (n-- > 0) {
+      *--s1 = *--s2;
+    }
+  }
+  else if (s1 != s2) {
+    while (n-- > 0) {
+      *s1++ = *s2++;
+    }
+  }
+  else {
+    /* nothing to do. */
+  }
+}
+
+#endif /* MRB_VALUE_ARRAY_H__ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/variable.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,1163 @@
+/*
+** variable.c - mruby variables
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <ctype.h>
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/class.h"
+#include "mruby/proc.h"
+#include "mruby/string.h"
+
+typedef int (iv_foreach_func)(mrb_state*,mrb_sym,mrb_value,void*);
+
+#ifdef MRB_USE_IV_SEGLIST
+
+#ifndef MRB_SEGMENT_SIZE
+#define MRB_SEGMENT_SIZE 4
+#endif
+
+typedef struct segment {
+  mrb_sym key[MRB_SEGMENT_SIZE];
+  mrb_value val[MRB_SEGMENT_SIZE];
+  struct segment *next;
+} segment;
+
+/* Instance variable table structure */
+typedef struct iv_tbl {
+  segment *rootseg;
+  size_t size;
+  size_t last_len;
+} iv_tbl;
+
+/*
+ * Creates the instance variable table.
+ *
+ * Parameters
+ *   mrb
+ * Returns
+ *   the instance variable table.
+ */
+static iv_tbl*
+iv_new(mrb_state *mrb)
+{
+  iv_tbl *t;
+
+  t = mrb_malloc(mrb, sizeof(iv_tbl));
+  t->size = 0;
+  t->rootseg =  NULL;
+  t->last_len = 0;
+
+  return t;
+}
+
+/*
+ * Set the value for the symbol in the instance variable table.
+ *
+ * Parameters
+ *   mrb
+ *   t     the instance variable table to be set in.
+ *   sym   the symbol to be used as the key.
+ *   val   the value to be set.
+ */
+static void
+iv_put(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value val)
+{
+  segment *seg = t->rootseg;
+  segment *prev = NULL;
+  segment *matched_seg = NULL;
+  size_t matched_idx = 0;
+  size_t i;
+
+  while (seg) {
+    for (i=0; i<MRB_SEGMENT_SIZE; i++) {
+      mrb_sym key = seg->key[i];
+      /* Found room in last segment after last_len */
+      if (!seg->next && i >= t->last_len) {
+        seg->key[i] = sym;
+        seg->val[i] = val;
+        t->last_len = i+1;
+        t->size++;
+        return;
+      }
+      if (!matched_seg && key == 0) {
+        matched_seg = seg;
+        matched_idx = i;
+      }
+      else if (key == sym) {
+        seg->val[i] = val;
+        return;
+      }
+    }
+    prev = seg;
+    seg = seg->next;
+  }
+
+  /* Not found */
+  t->size++;
+  if (matched_seg) {
+    matched_seg->key[matched_idx] = sym;
+    matched_seg->val[matched_idx] = val;
+    return;
+  }
+
+  seg = mrb_malloc(mrb, sizeof(segment));
+  if (!seg) return;
+  seg->next = NULL;
+  seg->key[0] = sym;
+  seg->val[0] = val;
+  t->last_len = 1;
+  if (prev) {
+    prev->next = seg;
+  }
+  else {
+    t->rootseg = seg;
+  }
+}
+
+/*
+ * Get a value for a symbol from the instance variable table.
+ *
+ * Parameters
+ *   mrb
+ *   t     the variable table to be searched.
+ *   sym   the symbol to be used as the key.
+ *   vp    the value pointer. Receives the value if the specified symbol is
+ *         contained in the instance variable table.
+ * Returns
+ *   true if the specified symbol is contained in the instance variable table.
+ */
+static mrb_bool
+iv_get(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value *vp)
+{
+  segment *seg;
+  size_t i;
+
+  seg = t->rootseg;
+  while (seg) {
+    for (i=0; i<MRB_SEGMENT_SIZE; i++) {
+      mrb_sym key = seg->key[i];
+
+      if (!seg->next && i >= t->last_len) {
+        return FALSE;
+      }
+      if (key == sym) {
+        if (vp) *vp = seg->val[i];
+        return TRUE;
+      }
+    }
+    seg = seg->next;
+  }
+  return FALSE;
+}
+
+/*
+ * Deletes the value for the symbol from the instance variable table.
+ *
+ * Parameters
+ *   t    the variable table to be searched.
+ *   sym  the symbol to be used as the key.
+ *   vp   the value pointer. Receive the deleted value if the symbol is
+ *        contained in the instance variable table.
+ * Returns
+ *   true if the specified symbol is contained in the instance variable table.
+ */
+static mrb_bool
+iv_del(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value *vp)
+{
+  segment *seg;
+  size_t i;
+
+  seg = t->rootseg;
+  while (seg) {
+    for (i=0; i<MRB_SEGMENT_SIZE; i++) {
+      mrb_sym key = seg->key[i];
+
+      if (!seg->next && i >= t->last_len) {
+        return FALSE;
+      }
+      if (key == sym) {
+        t->size--;
+        seg->key[i] = 0;
+        if (vp) *vp = seg->val[i];
+        return TRUE;
+      }
+    }
+    seg = seg->next;
+  }
+  return FALSE;
+}
+
+static mrb_bool
+iv_foreach(mrb_state *mrb, iv_tbl *t, iv_foreach_func *func, void *p)
+{
+  segment *seg;
+  size_t i;
+  int n;
+
+  seg = t->rootseg;
+  while (seg) {
+    for (i=0; i<MRB_SEGMENT_SIZE; i++) {
+      mrb_sym key = seg->key[i];
+
+      /* no value in last segment after last_len */
+      if (!seg->next && i >= t->last_len) {
+        return FALSE;
+      }
+      if (key != 0) {
+        n =(*func)(mrb, key, seg->val[i], p);
+        if (n > 0) return FALSE;
+        if (n < 0) {
+          t->size--;
+          seg->key[i] = 0;
+        }
+      }
+    }
+    seg = seg->next;
+  }
+  return TRUE;
+}
+
+static size_t
+iv_size(mrb_state *mrb, iv_tbl *t)
+{
+  segment *seg;
+  size_t size = 0;
+
+  if (!t) return 0;
+  if (t->size > 0) return t->size;
+  seg = t->rootseg;
+  while (seg) {
+    if (seg->next == NULL) {
+      size += t->last_len;
+      return size;
+    }
+    seg = seg->next;
+    size += MRB_SEGMENT_SIZE;
+  }
+  /* empty iv_tbl */
+  return 0;
+}
+
+static iv_tbl*
+iv_copy(mrb_state *mrb, iv_tbl *t)
+{
+  segment *seg;
+  iv_tbl *t2;
+
+  size_t i;
+
+  seg = t->rootseg;
+  t2 = iv_new(mrb);
+
+  while (seg != NULL) {
+    for (i=0; i<MRB_SEGMENT_SIZE; i++) {
+      mrb_sym key = seg->key[i];
+      mrb_value val = seg->val[i];
+
+      if ((seg->next == NULL) && (i >= t->last_len)) {
+        return t2;
+      }
+      iv_put(mrb, t2, key, val);
+    }
+    seg = seg->next;
+  }
+  return t2;
+}
+
+static void
+iv_free(mrb_state *mrb, iv_tbl *t)
+{
+  segment *seg;
+
+  seg = t->rootseg;
+  while (seg) {
+    segment *p = seg;
+    seg = seg->next;
+    mrb_free(mrb, p);
+  }
+  mrb_free(mrb, t);
+}
+
+#else
+
+#include "mruby/khash.h"
+
+#ifndef MRB_IVHASH_INIT_SIZE
+#define MRB_IVHASH_INIT_SIZE 8
+#endif
+
+KHASH_DECLARE(iv, mrb_sym, mrb_value, TRUE)
+KHASH_DEFINE(iv, mrb_sym, mrb_value, TRUE, kh_int_hash_func, kh_int_hash_equal)
+
+typedef struct iv_tbl {
+  khash_t(iv) h;
+} iv_tbl;
+
+static iv_tbl*
+iv_new(mrb_state *mrb)
+{
+  return (iv_tbl*)kh_init_size(iv, mrb, MRB_IVHASH_INIT_SIZE);
+}
+
+static void
+iv_put(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value val)
+{
+  khash_t(iv) *h = &t->h;
+  khiter_t k;
+
+  k = kh_put(iv, mrb, h, sym);
+  kh_value(h, k) = val;
+}
+
+static mrb_bool
+iv_get(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value *vp)
+{
+  khash_t(iv) *h = &t->h;
+  khiter_t k;
+
+  k = kh_get(iv, mrb, h, sym);
+  if (k != kh_end(h)) {
+    if (vp) *vp = kh_value(h, k);
+    return TRUE;
+  }
+  return FALSE;
+}
+
+static mrb_bool
+iv_del(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value *vp)
+{
+  khash_t(iv) *h = &t->h;
+  khiter_t k;
+
+  if (h) {
+    k = kh_get(iv, mrb, h, sym);
+    if (k != kh_end(h)) {
+      mrb_value val = kh_value(h, k);
+      kh_del(iv, mrb, h, k);
+      if (vp) *vp = val;
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+
+static mrb_bool
+iv_foreach(mrb_state *mrb, iv_tbl *t, iv_foreach_func *func, void *p)
+{
+  khash_t(iv) *h = &t->h;
+  khiter_t k;
+  int n;
+
+  if (h) {
+    for (k = kh_begin(h); k != kh_end(h); k++) {
+      if (kh_exist(h, k)) {
+        n = (*func)(mrb, kh_key(h, k), kh_value(h, k), p);
+        if (n > 0) return FALSE;
+        if (n < 0) {
+          kh_del(iv, mrb, h, k);
+        }
+      }
+    }
+  }
+  return TRUE;
+}
+
+static size_t
+iv_size(mrb_state *mrb, iv_tbl *t)
+{
+  khash_t(iv) *h;
+
+  if (t && (h = &t->h)) {
+    return kh_size(h);
+  }
+  return 0;
+}
+
+static iv_tbl*
+iv_copy(mrb_state *mrb, iv_tbl *t)
+{
+  return (iv_tbl*)kh_copy(iv, mrb, &t->h);
+}
+
+static void
+iv_free(mrb_state *mrb, iv_tbl *t)
+{
+  kh_destroy(iv, mrb, &t->h);
+}
+
+#endif
+
+static int
+iv_mark_i(mrb_state *mrb, mrb_sym sym, mrb_value v, void *p)
+{
+  mrb_gc_mark_value(mrb, v);
+  return 0;
+}
+
+static void
+mark_tbl(mrb_state *mrb, iv_tbl *t)
+{
+  if (t) {
+    iv_foreach(mrb, t, iv_mark_i, 0);
+  }
+}
+
+void
+mrb_gc_mark_gv(mrb_state *mrb)
+{
+  mark_tbl(mrb, mrb->globals);
+}
+
+void
+mrb_gc_free_gv(mrb_state *mrb)
+{
+  if (mrb->globals)
+    iv_free(mrb, mrb->globals);
+}
+
+void
+mrb_gc_mark_iv(mrb_state *mrb, struct RObject *obj)
+{
+  mark_tbl(mrb, obj->iv);
+}
+
+size_t
+mrb_gc_mark_iv_size(mrb_state *mrb, struct RObject *obj)
+{
+  return iv_size(mrb, obj->iv);
+}
+
+void
+mrb_gc_free_iv(mrb_state *mrb, struct RObject *obj)
+{
+  if (obj->iv) {
+    iv_free(mrb, obj->iv);
+  }
+}
+
+mrb_value
+mrb_vm_special_get(mrb_state *mrb, mrb_sym i)
+{
+  return mrb_fixnum_value(0);
+}
+
+void
+mrb_vm_special_set(mrb_state *mrb, mrb_sym i, mrb_value v)
+{
+}
+
+static mrb_bool
+obj_iv_p(mrb_value obj)
+{
+  switch (mrb_type(obj)) {
+    case MRB_TT_OBJECT:
+    case MRB_TT_CLASS:
+    case MRB_TT_MODULE:
+    case MRB_TT_SCLASS:
+    case MRB_TT_HASH:
+    case MRB_TT_DATA:
+    case MRB_TT_EXCEPTION:
+      return TRUE;
+    default:
+      return FALSE;
+  }
+}
+
+MRB_API mrb_value
+mrb_obj_iv_get(mrb_state *mrb, struct RObject *obj, mrb_sym sym)
+{
+  mrb_value v;
+
+  if (obj->iv && iv_get(mrb, obj->iv, sym, &v))
+    return v;
+  return mrb_nil_value();
+}
+
+MRB_API mrb_value
+mrb_iv_get(mrb_state *mrb, mrb_value obj, mrb_sym sym)
+{
+  if (obj_iv_p(obj)) {
+    return mrb_obj_iv_get(mrb, mrb_obj_ptr(obj), sym);
+  }
+  return mrb_nil_value();
+}
+
+MRB_API void
+mrb_obj_iv_set(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value v)
+{
+  iv_tbl *t = obj->iv;
+
+  if (!t) {
+    t = obj->iv = iv_new(mrb);
+  }
+  mrb_write_barrier(mrb, (struct RBasic*)obj);
+  iv_put(mrb, t, sym, v);
+}
+
+MRB_API void
+mrb_obj_iv_ifnone(mrb_state *mrb, struct RObject *obj, mrb_sym sym, mrb_value v)
+{
+  iv_tbl *t = obj->iv;
+
+  if (!t) {
+    t = obj->iv = iv_new(mrb);
+  }
+  else if (iv_get(mrb, t, sym, &v)) {
+    return;
+  }
+  mrb_write_barrier(mrb, (struct RBasic*)obj);
+  iv_put(mrb, t, sym, v);
+}
+
+MRB_API void
+mrb_iv_set(mrb_state *mrb, mrb_value obj, mrb_sym sym, mrb_value v)
+{
+  if (obj_iv_p(obj)) {
+    mrb_obj_iv_set(mrb, mrb_obj_ptr(obj), sym, v);
+  }
+  else {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "cannot set instance variable");
+  }
+}
+
+MRB_API mrb_bool
+mrb_obj_iv_defined(mrb_state *mrb, struct RObject *obj, mrb_sym sym)
+{
+  iv_tbl *t;
+
+  t = obj->iv;
+  if (t) {
+    return iv_get(mrb, t, sym, NULL);
+  }
+  return FALSE;
+}
+
+MRB_API mrb_bool
+mrb_iv_defined(mrb_state *mrb, mrb_value obj, mrb_sym sym)
+{
+  if (!obj_iv_p(obj)) return FALSE;
+  return mrb_obj_iv_defined(mrb, mrb_obj_ptr(obj), sym);
+}
+
+#define identchar(c) (ISALNUM(c) || (c) == '_' || !ISASCII(c))
+
+MRB_API mrb_bool
+mrb_iv_p(mrb_state *mrb, mrb_sym iv_name)
+{
+  const char *s;
+  mrb_int i, len;
+
+  s = mrb_sym2name_len(mrb, iv_name, &len);
+  if (len < 2) return FALSE;
+  if (s[0] != '@') return FALSE;
+  if (s[1] == '@') return FALSE;
+  for (i=1; i<len; i++) {
+    if (!identchar(s[i])) return FALSE;
+  }
+  return TRUE;
+}
+
+MRB_API void
+mrb_iv_check(mrb_state *mrb, mrb_sym iv_name)
+{
+  if (!mrb_iv_p(mrb, iv_name)) {
+    mrb_name_error(mrb, iv_name, "`%S' is not allowed as an instance variable name", mrb_sym2str(mrb, iv_name));
+  }
+}
+
+MRB_API void
+mrb_iv_copy(mrb_state *mrb, mrb_value dest, mrb_value src)
+{
+  struct RObject *d = mrb_obj_ptr(dest);
+  struct RObject *s = mrb_obj_ptr(src);
+
+  if (d->iv) {
+    iv_free(mrb, d->iv);
+    d->iv = 0;
+  }
+  if (s->iv) {
+    mrb_write_barrier(mrb, (struct RBasic*)d);
+    d->iv = iv_copy(mrb, s->iv);
+  }
+}
+
+static int
+inspect_i(mrb_state *mrb, mrb_sym sym, mrb_value v, void *p)
+{
+  mrb_value str = *(mrb_value*)p;
+  const char *s;
+  mrb_int len;
+  mrb_value ins;
+  char *sp = RSTRING_PTR(str);
+
+  /* need not to show internal data */
+  if (sp[0] == '-') { /* first element */
+    sp[0] = '#';
+    mrb_str_cat_lit(mrb, str, " ");
+  }
+  else {
+    mrb_str_cat_lit(mrb, str, ", ");
+  }
+  s = mrb_sym2name_len(mrb, sym, &len);
+  mrb_str_cat(mrb, str, s, len);
+  mrb_str_cat_lit(mrb, str, "=");
+  if (mrb_type(v) == MRB_TT_OBJECT) {
+    ins = mrb_any_to_s(mrb, v);
+  }
+  else {
+    ins = mrb_inspect(mrb, v);
+  }
+  mrb_str_append(mrb, str, ins);
+  return 0;
+}
+
+mrb_value
+mrb_obj_iv_inspect(mrb_state *mrb, struct RObject *obj)
+{
+  iv_tbl *t = obj->iv;
+  size_t len = iv_size(mrb, t);
+
+  if (len > 0) {
+    const char *cn = mrb_obj_classname(mrb, mrb_obj_value(obj));
+    mrb_value str = mrb_str_buf_new(mrb, 30);
+
+    mrb_str_cat_lit(mrb, str, "-<");
+    mrb_str_cat_cstr(mrb, str, cn);
+    mrb_str_cat_lit(mrb, str, ":");
+    mrb_str_concat(mrb, str, mrb_ptr_to_str(mrb, obj));
+
+    iv_foreach(mrb, t, inspect_i, &str);
+    mrb_str_cat_lit(mrb, str, ">");
+    return str;
+  }
+  return mrb_any_to_s(mrb, mrb_obj_value(obj));
+}
+
+MRB_API mrb_value
+mrb_iv_remove(mrb_state *mrb, mrb_value obj, mrb_sym sym)
+{
+  if (obj_iv_p(obj)) {
+    iv_tbl *t = mrb_obj_ptr(obj)->iv;
+    mrb_value val;
+
+    if (t && iv_del(mrb, t, sym, &val)) {
+      return val;
+    }
+  }
+  return mrb_undef_value();
+}
+
+mrb_value
+mrb_vm_iv_get(mrb_state *mrb, mrb_sym sym)
+{
+  /* get self */
+  return mrb_iv_get(mrb, mrb->c->stack[0], sym);
+}
+
+void
+mrb_vm_iv_set(mrb_state *mrb, mrb_sym sym, mrb_value v)
+{
+  /* get self */
+  mrb_iv_set(mrb, mrb->c->stack[0], sym, v);
+}
+
+static int
+iv_i(mrb_state *mrb, mrb_sym sym, mrb_value v, void *p)
+{
+  mrb_value ary;
+  const char* s;
+  mrb_int len;
+
+  ary = *(mrb_value*)p;
+  s = mrb_sym2name_len(mrb, sym, &len);
+  if (len > 1 && s[0] == '@' && s[1] != '@') {
+    mrb_ary_push(mrb, ary, mrb_symbol_value(sym));
+  }
+  return 0;
+}
+
+/* 15.3.1.3.23 */
+/*
+ *  call-seq:
+ *     obj.instance_variables    -> array
+ *
+ *  Returns an array of instance variable names for the receiver. Note
+ *  that simply defining an accessor does not create the corresponding
+ *  instance variable.
+ *
+ *     class Fred
+ *       attr_accessor :a1
+ *       def initialize
+ *         @iv = 3
+ *       end
+ *     end
+ *     Fred.new.instance_variables   #=> [:@iv]
+ */
+mrb_value
+mrb_obj_instance_variables(mrb_state *mrb, mrb_value self)
+{
+  mrb_value ary;
+
+  ary = mrb_ary_new(mrb);
+  if (obj_iv_p(self) && mrb_obj_ptr(self)->iv) {
+    iv_foreach(mrb, mrb_obj_ptr(self)->iv, iv_i, &ary);
+  }
+  return ary;
+}
+
+static int
+cv_i(mrb_state *mrb, mrb_sym sym, mrb_value v, void *p)
+{
+  mrb_value ary;
+  const char* s;
+  mrb_int len;
+
+  ary = *(mrb_value*)p;
+  s = mrb_sym2name_len(mrb, sym, &len);
+  if (len > 2 && s[0] == '@' && s[1] == '@') {
+    mrb_ary_push(mrb, ary, mrb_symbol_value(sym));
+  }
+  return 0;
+}
+
+/* 15.2.2.4.19 */
+/*
+ *  call-seq:
+ *     mod.class_variables   -> array
+ *
+ *  Returns an array of the names of class variables in <i>mod</i>.
+ *
+ *     class One
+ *       @@var1 = 1
+ *     end
+ *     class Two < One
+ *       @@var2 = 2
+ *     end
+ *     One.class_variables   #=> [:@@var1]
+ *     Two.class_variables   #=> [:@@var2]
+ */
+mrb_value
+mrb_mod_class_variables(mrb_state *mrb, mrb_value mod)
+{
+  mrb_value ary;
+  struct RClass *c;
+
+  ary = mrb_ary_new(mrb);
+  c = mrb_class_ptr(mod);
+  while (c) {
+    if (c->iv) {
+      iv_foreach(mrb, c->iv, cv_i, &ary);
+    }
+    c = c->super;
+  }
+  return ary;
+}
+
+MRB_API mrb_value
+mrb_mod_cv_get(mrb_state *mrb, struct RClass * c, mrb_sym sym)
+{
+  struct RClass * cls = c;
+
+  while (c) {
+    if (c->iv) {
+      iv_tbl *t = c->iv;
+      mrb_value v;
+
+      if (iv_get(mrb, t, sym, &v))
+        return v;
+    }
+    c = c->super;
+  }
+  mrb_name_error(mrb, sym, "uninitialized class variable %S in %S",
+                 mrb_sym2str(mrb, sym), mrb_obj_value(cls));
+  /* not reached */
+  return mrb_nil_value();
+}
+
+MRB_API mrb_value
+mrb_cv_get(mrb_state *mrb, mrb_value mod, mrb_sym sym)
+{
+  return mrb_mod_cv_get(mrb, mrb_class_ptr(mod), sym);
+}
+
+MRB_API void
+mrb_mod_cv_set(mrb_state *mrb, struct RClass *c, mrb_sym sym, mrb_value v)
+{
+  struct RClass * cls = c;
+
+  while (c) {
+    if (c->iv) {
+      iv_tbl *t = c->iv;
+
+      if (iv_get(mrb, t, sym, NULL)) {
+        mrb_write_barrier(mrb, (struct RBasic*)c);
+        iv_put(mrb, t, sym, v);
+        return;
+      }
+    }
+    c = c->super;
+  }
+
+  if (!cls->iv) {
+    cls->iv = iv_new(mrb);
+  }
+
+  mrb_write_barrier(mrb, (struct RBasic*)cls);
+  iv_put(mrb, cls->iv, sym, v);
+}
+
+MRB_API void
+mrb_cv_set(mrb_state *mrb, mrb_value mod, mrb_sym sym, mrb_value v)
+{
+  mrb_mod_cv_set(mrb, mrb_class_ptr(mod), sym, v);
+}
+
+MRB_API mrb_bool
+mrb_mod_cv_defined(mrb_state *mrb, struct RClass * c, mrb_sym sym)
+{
+  while (c) {
+    if (c->iv) {
+      iv_tbl *t = c->iv;
+      if (iv_get(mrb, t, sym, NULL)) return TRUE;
+    }
+    c = c->super;
+  }
+
+  return FALSE;
+}
+
+MRB_API mrb_bool
+mrb_cv_defined(mrb_state *mrb, mrb_value mod, mrb_sym sym)
+{
+  return mrb_mod_cv_defined(mrb, mrb_class_ptr(mod), sym);
+}
+
+mrb_value
+mrb_vm_cv_get(mrb_state *mrb, mrb_sym sym)
+{
+  struct RClass *c = mrb->c->ci->proc->target_class;
+
+  if (!c) c = mrb->c->ci->target_class;
+
+  return mrb_mod_cv_get(mrb, c, sym);
+}
+
+void
+mrb_vm_cv_set(mrb_state *mrb, mrb_sym sym, mrb_value v)
+{
+  struct RClass *c = mrb->c->ci->proc->target_class;
+
+  if (!c) c = mrb->c->ci->target_class;
+  mrb_mod_cv_set(mrb, c, sym, v);
+}
+
+static void
+mod_const_check(mrb_state *mrb, mrb_value mod)
+{
+  switch (mrb_type(mod)) {
+  case MRB_TT_CLASS:
+  case MRB_TT_MODULE:
+  case MRB_TT_SCLASS:
+    break;
+  default:
+    mrb_raise(mrb, E_TYPE_ERROR, "constant look-up for non class/module");
+    break;
+  }
+}
+
+static mrb_value
+const_get(mrb_state *mrb, struct RClass *base, mrb_sym sym)
+{
+  struct RClass *c = base;
+  mrb_value v;
+  iv_tbl *t;
+  mrb_bool retry = FALSE;
+  mrb_value name;
+
+L_RETRY:
+  while (c) {
+    if (c->iv) {
+      t = c->iv;
+      if (iv_get(mrb, t, sym, &v))
+        return v;
+    }
+    c = c->super;
+  }
+  if (!retry && base && base->tt == MRB_TT_MODULE) {
+    c = mrb->object_class;
+    retry = TRUE;
+    goto L_RETRY;
+  }
+  name = mrb_symbol_value(sym);
+  return mrb_funcall_argv(mrb, mrb_obj_value(base), mrb_intern_lit(mrb, "const_missing"), 1, &name);
+}
+
+MRB_API mrb_value
+mrb_const_get(mrb_state *mrb, mrb_value mod, mrb_sym sym)
+{
+  mod_const_check(mrb, mod);
+  return const_get(mrb, mrb_class_ptr(mod), sym);
+}
+
+mrb_value
+mrb_vm_const_get(mrb_state *mrb, mrb_sym sym)
+{
+  struct RClass *c = mrb->c->ci->proc->target_class;
+
+  if (!c) c = mrb->c->ci->target_class;
+  if (c) {
+    struct RClass *c2;
+    mrb_value v;
+
+    if (c->iv && iv_get(mrb, c->iv, sym, &v)) {
+      return v;
+    }
+    c2 = c;
+    for (;;) {
+      c2 = mrb_class_outer_module(mrb, c2);
+      if (!c2) break;
+      if (c2->iv && iv_get(mrb, c2->iv, sym, &v)) {
+        return v;
+      }
+    }
+  }
+  return const_get(mrb, c, sym);
+}
+
+MRB_API void
+mrb_const_set(mrb_state *mrb, mrb_value mod, mrb_sym sym, mrb_value v)
+{
+  mod_const_check(mrb, mod);
+  mrb_iv_set(mrb, mod, sym, v);
+}
+
+void
+mrb_vm_const_set(mrb_state *mrb, mrb_sym sym, mrb_value v)
+{
+  struct RClass *c = mrb->c->ci->proc->target_class;
+
+  if (!c) c = mrb->c->ci->target_class;
+  mrb_obj_iv_set(mrb, (struct RObject*)c, sym, v);
+}
+
+MRB_API void
+mrb_const_remove(mrb_state *mrb, mrb_value mod, mrb_sym sym)
+{
+  mod_const_check(mrb, mod);
+  mrb_iv_remove(mrb, mod, sym);
+}
+
+MRB_API void
+mrb_define_const(mrb_state *mrb, struct RClass *mod, const char *name, mrb_value v)
+{
+  mrb_obj_iv_set(mrb, (struct RObject*)mod, mrb_intern_cstr(mrb, name), v);
+}
+
+MRB_API void
+mrb_define_global_const(mrb_state *mrb, const char *name, mrb_value val)
+{
+  mrb_define_const(mrb, mrb->object_class, name, val);
+}
+
+static int
+const_i(mrb_state *mrb, mrb_sym sym, mrb_value v, void *p)
+{
+  mrb_value ary;
+  const char* s;
+  mrb_int len;
+
+  ary = *(mrb_value*)p;
+  s = mrb_sym2name_len(mrb, sym, &len);
+  if (len >= 1 && ISUPPER(s[0])) {
+    mrb_ary_push(mrb, ary, mrb_symbol_value(sym));
+  }
+  return 0;
+}
+
+/* 15.2.2.4.24 */
+/*
+ *  call-seq:
+ *     mod.constants    -> array
+ *
+ *  Returns an array of all names of contants defined in the receiver.
+ */
+mrb_value
+mrb_mod_constants(mrb_state *mrb, mrb_value mod)
+{
+  mrb_value ary;
+  mrb_bool inherit = TRUE;
+  struct RClass *c = mrb_class_ptr(mod);
+
+  mrb_get_args(mrb, "|b", &inherit);
+  ary = mrb_ary_new(mrb);
+  while (c) {
+    if (c->iv) {
+      iv_foreach(mrb, c->iv, const_i, &ary);
+    }
+    if (!inherit) break;
+    c = c->super;
+    if (c == mrb->object_class) break;
+  }
+  return ary;
+}
+
+MRB_API mrb_value
+mrb_gv_get(mrb_state *mrb, mrb_sym sym)
+{
+  mrb_value v;
+
+  if (!mrb->globals) {
+    return mrb_nil_value();
+  }
+  if (iv_get(mrb, mrb->globals, sym, &v))
+    return v;
+  return mrb_nil_value();
+}
+
+MRB_API void
+mrb_gv_set(mrb_state *mrb, mrb_sym sym, mrb_value v)
+{
+  iv_tbl *t;
+
+  if (!mrb->globals) {
+    t = mrb->globals = iv_new(mrb);
+  }
+  else {
+    t = mrb->globals;
+  }
+  iv_put(mrb, t, sym, v);
+}
+
+MRB_API void
+mrb_gv_remove(mrb_state *mrb, mrb_sym sym)
+{
+  if (!mrb->globals) {
+    return;
+  }
+  iv_del(mrb, mrb->globals, sym, NULL);
+}
+
+static int
+gv_i(mrb_state *mrb, mrb_sym sym, mrb_value v, void *p)
+{
+  mrb_value ary;
+
+  ary = *(mrb_value*)p;
+  mrb_ary_push(mrb, ary, mrb_symbol_value(sym));
+  return 0;
+}
+
+/* 15.3.1.2.4  */
+/* 15.3.1.3.14 */
+/*
+ *  call-seq:
+ *     global_variables    -> array
+ *
+ *  Returns an array of the names of global variables.
+ *
+ *     global_variables.grep /std/   #=> [:$stdin, :$stdout, :$stderr]
+ */
+mrb_value
+mrb_f_global_variables(mrb_state *mrb, mrb_value self)
+{
+  iv_tbl *t = mrb->globals;
+  mrb_value ary = mrb_ary_new(mrb);
+  size_t i;
+  char buf[3];
+
+  if (t) {
+    iv_foreach(mrb, t, gv_i, &ary);
+  }
+  buf[0] = '$';
+  buf[2] = 0;
+  for (i = 1; i <= 9; ++i) {
+    buf[1] = (char)(i + '0');
+    mrb_ary_push(mrb, ary, mrb_symbol_value(mrb_intern(mrb, buf, 2)));
+  }
+  return ary;
+}
+
+static mrb_bool
+mrb_const_defined_0(mrb_state *mrb, mrb_value mod, mrb_sym id, mrb_bool exclude, mrb_bool recurse)
+{
+  struct RClass *klass = mrb_class_ptr(mod);
+  struct RClass *tmp;
+  mrb_bool mod_retry = 0;
+
+  tmp = klass;
+retry:
+  while (tmp) {
+    if (tmp->iv && iv_get(mrb, tmp->iv, id, NULL)) {
+      return TRUE;
+    }
+    if (!recurse && (klass != mrb->object_class)) break;
+    tmp = tmp->super;
+  }
+  if (!exclude && !mod_retry && (klass->tt == MRB_TT_MODULE)) {
+    mod_retry = 1;
+    tmp = mrb->object_class;
+    goto retry;
+  }
+  return FALSE;
+}
+
+MRB_API mrb_bool
+mrb_const_defined(mrb_state *mrb, mrb_value mod, mrb_sym id)
+{
+  return mrb_const_defined_0(mrb, mod, id, TRUE, TRUE);
+}
+
+MRB_API mrb_bool
+mrb_const_defined_at(mrb_state *mrb, mrb_value mod, mrb_sym id)
+{
+  return mrb_const_defined_0(mrb, mod, id, TRUE, FALSE);
+}
+
+MRB_API mrb_value
+mrb_attr_get(mrb_state *mrb, mrb_value obj, mrb_sym id)
+{
+  return mrb_iv_get(mrb, obj, id);
+}
+
+struct csym_arg {
+  struct RClass *c;
+  mrb_sym sym;
+};
+
+static int
+csym_i(mrb_state *mrb, mrb_sym sym, mrb_value v, void *p)
+{
+  struct csym_arg *a = (struct csym_arg*)p;
+  struct RClass *c = a->c;
+
+  if (mrb_type(v) == c->tt && mrb_class_ptr(v) == c) {
+    a->sym = sym;
+    return 1;     /* stop iteration */
+  }
+  return 0;
+}
+
+mrb_sym
+mrb_class_sym(mrb_state *mrb, struct RClass *c, struct RClass *outer)
+{
+  mrb_value name;
+
+  name = mrb_obj_iv_get(mrb, (struct RObject*)c, mrb_intern_lit(mrb, "__classid__"));
+  if (mrb_nil_p(name)) {
+
+    if (!outer) return 0;
+    else {
+      struct csym_arg arg;
+
+      arg.c = c;
+      arg.sym = 0;
+      iv_foreach(mrb, outer->iv, csym_i, &arg);
+      return arg.sym;
+    }
+  }
+  return mrb_symbol(name);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/version.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,14 @@
+#include "mruby.h"
+#include "mruby/variable.h"
+
+void
+mrb_init_version(mrb_state* mrb)
+{
+  mrb_define_global_const(mrb, "RUBY_VERSION", mrb_str_new_lit(mrb, MRUBY_RUBY_VERSION));
+  mrb_define_global_const(mrb, "RUBY_ENGINE", mrb_str_new_lit(mrb, MRUBY_RUBY_ENGINE));
+  mrb_define_global_const(mrb, "MRUBY_VERSION", mrb_str_new_lit(mrb, MRUBY_VERSION));
+  mrb_define_global_const(mrb, "MRUBY_RELEASE_DATE", mrb_str_new_lit(mrb, MRUBY_RELEASE_DATE));
+  mrb_define_global_const(mrb, "MRUBY_DESCRIPTION", mrb_str_new_lit(mrb, MRUBY_DESCRIPTION));
+  mrb_define_global_const(mrb, "MRUBY_COPYRIGHT", mrb_str_new_lit(mrb, MRUBY_COPYRIGHT));
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/vm.c	Wed Mar 25 17:36:16 2015 +0000
@@ -0,0 +1,2403 @@
+/*
+** vm.c - virtual machine for mruby
+**
+** See Copyright Notice in mruby.h
+*/
+
+#include <stddef.h>
+#include <stdarg.h>
+#include <math.h>
+#include "mruby.h"
+#include "mruby/array.h"
+#include "mruby/class.h"
+#include "mruby/hash.h"
+#include "mruby/irep.h"
+#include "mruby/numeric.h"
+#include "mruby/proc.h"
+#include "mruby/range.h"
+#include "mruby/string.h"
+#include "mruby/variable.h"
+#include "mruby/error.h"
+#include "mruby/opcode.h"
+#include "value_array.h"
+#include "mrb_throw.h"
+
+#ifndef ENABLE_STDIO
+#if defined(__cplusplus)
+extern "C" {
+#endif
+void abort(void);
+#if defined(__cplusplus)
+}  /* extern "C" { */
+#endif
+#endif
+
+#define STACK_INIT_SIZE 128
+#define CALLINFO_INIT_SIZE 32
+
+/* Define amount of linear stack growth. */
+#ifndef MRB_STACK_GROWTH
+#define MRB_STACK_GROWTH 128
+#endif
+
+/* Maximum stack depth. Should be set lower on memory constrained systems.
+The value below allows about 60000 recursive calls in the simplest case. */
+#ifndef MRB_STACK_MAX
+#define MRB_STACK_MAX (0x40000 - MRB_STACK_GROWTH)
+#endif
+
+#ifdef VM_DEBUG
+# define DEBUG(x) (x)
+#else
+# define DEBUG(x)
+#endif
+
+#define ARENA_RESTORE(mrb,ai) (mrb)->arena_idx = (ai)
+
+static inline void
+stack_clear(mrb_value *from, size_t count)
+{
+#ifndef MRB_NAN_BOXING
+  const mrb_value mrb_value_zero = { { 0 } };
+
+  while (count-- > 0) {
+    *from++ = mrb_value_zero;
+  }
+#else
+  while (count-- > 0) {
+    SET_NIL_VALUE(*from);
+    from++;
+  }
+#endif
+}
+
+static inline void
+stack_copy(mrb_value *dst, const mrb_value *src, size_t size)
+{
+  while (size-- > 0) {
+    *dst++ = *src++;
+  }
+}
+
+static void
+stack_init(mrb_state *mrb)
+{
+  struct mrb_context *c = mrb->c;
+
+  /* mrb_assert(mrb->stack == NULL); */
+  c->stbase = (mrb_value *)mrb_calloc(mrb, STACK_INIT_SIZE, sizeof(mrb_value));
+  c->stend = c->stbase + STACK_INIT_SIZE;
+  c->stack = c->stbase;
+
+  /* mrb_assert(ci == NULL); */
+  c->cibase = (mrb_callinfo *)mrb_calloc(mrb, CALLINFO_INIT_SIZE, sizeof(mrb_callinfo));
+  c->ciend = c->cibase + CALLINFO_INIT_SIZE;
+  c->ci = c->cibase;
+  c->ci->target_class = mrb->object_class;
+  c->ci->stackent = c->stack;
+}
+
+static inline void
+envadjust(mrb_state *mrb, mrb_value *oldbase, mrb_value *newbase)
+{
+  mrb_callinfo *ci = mrb->c->cibase;
+
+  if (newbase == oldbase) return;
+  while (ci <= mrb->c->ci) {
+    struct REnv *e = ci->env;
+    if (e && MRB_ENV_STACK_SHARED_P(e)) {
+      ptrdiff_t off = e->stack - oldbase;
+
+      e->stack = newbase + off;
+    }
+    ci->stackent = newbase + (ci->stackent - oldbase);
+    ci++;
+  }
+}
+
+static inline void
+init_new_stack_space(mrb_state *mrb, int room, int keep)
+{
+  if (room > keep) {
+    /* do not leave uninitialized malloc region */
+    stack_clear(&(mrb->c->stack[keep]), room - keep);
+  }
+}
+
+/** def rec ; $deep =+ 1 ; if $deep > 1000 ; return 0 ; end ; rec ; end  */
+
+static void
+stack_extend_alloc(mrb_state *mrb, int room, int keep)
+{
+  mrb_value *oldbase = mrb->c->stbase;
+  int size = mrb->c->stend - mrb->c->stbase;
+  int off = mrb->c->stack - mrb->c->stbase;
+
+#ifdef MRB_STACK_EXTEND_DOUBLING
+  if (room <= size)
+    size *= 2;
+  else
+    size += room;
+#else
+  /* Use linear stack growth.
+     It is slightly slower than doubling the stack space,
+     but it saves memory on small devices. */
+  if (room <= MRB_STACK_GROWTH)
+    size += MRB_STACK_GROWTH;
+  else
+    size += room;
+#endif
+
+  mrb->c->stbase = (mrb_value *)mrb_realloc(mrb, mrb->c->stbase, sizeof(mrb_value) * size);
+  mrb->c->stack = mrb->c->stbase + off;
+  mrb->c->stend = mrb->c->stbase + size;
+  envadjust(mrb, oldbase, mrb->c->stbase);
+
+  /* Raise an exception if the new stack size will be too large,
+     to prevent infinite recursion. However, do this only after resizing the stack, so mrb_raise has stack space to work with. */
+  if (size > MRB_STACK_MAX) {
+    init_new_stack_space(mrb, room, keep);
+    mrb_raise(mrb, E_SYSSTACK_ERROR, "stack level too deep. (limit=" MRB_STRINGIZE(MRB_STACK_MAX) ")");
+  }
+}
+
+static inline void
+stack_extend(mrb_state *mrb, int room, int keep)
+{
+  if (mrb->c->stack + room >= mrb->c->stend) {
+    stack_extend_alloc(mrb, room, keep);
+  }
+  init_new_stack_space(mrb, room, keep);
+}
+
+static inline struct REnv*
+uvenv(mrb_state *mrb, int up)
+{
+  struct REnv *e = mrb->c->ci->proc->env;
+
+  while (up--) {
+    if (!e) return NULL;
+    e = (struct REnv*)e->c;
+  }
+  return e;
+}
+
+static inline mrb_bool
+is_strict(mrb_state *mrb, struct REnv *e)
+{
+  int cioff = e->cioff;
+
+  if (MRB_ENV_STACK_SHARED_P(e) && mrb->c->cibase[cioff].proc &&
+      MRB_PROC_STRICT_P(mrb->c->cibase[cioff].proc)) {
+    return TRUE;
+  }
+  return FALSE;
+}
+
+static inline struct REnv*
+top_env(mrb_state *mrb, struct RProc *proc)
+{
+  struct REnv *e = proc->env;
+
+  if (is_strict(mrb, e)) return e;
+  while (e->c) {
+    e = (struct REnv*)e->c;
+    if (is_strict(mrb, e)) return e;
+  }
+  return e;
+}
+
+#define CI_ACC_SKIP    -1
+#define CI_ACC_DIRECT  -2
+
+static mrb_callinfo*
+cipush(mrb_state *mrb)
+{
+  struct mrb_context *c = mrb->c;
+  mrb_callinfo *ci = c->ci;
+
+  int eidx = ci->eidx;
+  int ridx = ci->ridx;
+
+  if (ci + 1 == c->ciend) {
+    size_t size = ci - c->cibase;
+
+    c->cibase = (mrb_callinfo *)mrb_realloc(mrb, c->cibase, sizeof(mrb_callinfo)*size*2);
+    c->ci = c->cibase + size;
+    c->ciend = c->cibase + size * 2;
+  }
+  ci = ++c->ci;
+  ci->eidx = eidx;
+  ci->ridx = ridx;
+  ci->env = 0;
+  ci->pc = 0;
+  ci->err = 0;
+  ci->proc = 0;
+
+  return ci;
+}
+
+static void
+cipop(mrb_state *mrb)
+{
+  struct mrb_context *c = mrb->c;
+
+  if (c->ci->env) {
+    struct REnv *e = c->ci->env;
+    size_t len = (size_t)MRB_ENV_STACK_LEN(e);
+    mrb_value *p = (mrb_value *)mrb_malloc(mrb, sizeof(mrb_value)*len);
+
+    MRB_ENV_UNSHARE_STACK(e);
+    if (len > 0) {
+      stack_copy(p, e->stack, len);
+    }
+    e->stack = p;
+    mrb_write_barrier(mrb, (struct RBasic *)e);
+  }
+
+  c->ci--;
+}
+
+static void
+ecall(mrb_state *mrb, int i)
+{
+  struct RProc *p;
+  mrb_callinfo *ci;
+  mrb_value *self = mrb->c->stack;
+  struct RObject *exc;
+
+  p = mrb->c->ensure[i];
+  if (!p) return;
+  if (mrb->c->ci->eidx > i)
+    mrb->c->ci->eidx = i;
+  ci = cipush(mrb);
+  ci->stackent = mrb->c->stack;
+  ci->mid = ci[-1].mid;
+  ci->acc = CI_ACC_SKIP;
+  ci->argc = 0;
+  ci->proc = p;
+  ci->nregs = p->body.irep->nregs;
+  ci->target_class = p->target_class;
+  mrb->c->stack = mrb->c->stack + ci[-1].nregs;
+  exc = mrb->exc; mrb->exc = 0;
+  mrb_run(mrb, p, *self);
+  mrb->c->ensure[i] = NULL;
+  if (!mrb->exc) mrb->exc = exc;
+}
+
+#ifndef MRB_FUNCALL_ARGC_MAX
+#define MRB_FUNCALL_ARGC_MAX 16
+#endif
+
+MRB_API mrb_value
+mrb_funcall(mrb_state *mrb, mrb_value self, const char *name, mrb_int argc, ...)
+{
+  mrb_value argv[MRB_FUNCALL_ARGC_MAX];
+  va_list ap;
+  mrb_int i;
+  mrb_sym mid = mrb_intern_cstr(mrb, name);
+
+  if (argc > MRB_FUNCALL_ARGC_MAX) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "Too long arguments. (limit=" MRB_STRINGIZE(MRB_FUNCALL_ARGC_MAX) ")");
+  }
+
+  va_start(ap, argc);
+  for (i = 0; i < argc; i++) {
+    argv[i] = va_arg(ap, mrb_value);
+  }
+  va_end(ap);
+  return mrb_funcall_argv(mrb, self, mid, argc, argv);
+}
+
+MRB_API mrb_value
+mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc, const mrb_value *argv, mrb_value blk)
+{
+  mrb_value val;
+
+  if (!mrb->jmp) {
+    struct mrb_jmpbuf c_jmp;
+    mrb_callinfo *old_ci = mrb->c->ci;
+
+    MRB_TRY(&c_jmp) {
+      mrb->jmp = &c_jmp;
+      /* recursive call */
+      val = mrb_funcall_with_block(mrb, self, mid, argc, argv, blk);
+      mrb->jmp = 0;
+    }
+    MRB_CATCH(&c_jmp) { /* error */
+      while (old_ci != mrb->c->ci) {
+        mrb->c->stack = mrb->c->ci->stackent;
+        cipop(mrb);
+      }
+      mrb->jmp = 0;
+      val = mrb_obj_value(mrb->exc);
+    }
+    MRB_END_EXC(&c_jmp);
+  }
+  else {
+    struct RProc *p;
+    struct RClass *c;
+    mrb_sym undef = 0;
+    mrb_callinfo *ci;
+    int n;
+
+    if (!mrb->c->stack) {
+      stack_init(mrb);
+    }
+    n = mrb->c->ci->nregs;
+    if (argc < 0) {
+      mrb_raisef(mrb, E_ARGUMENT_ERROR, "negative argc for funcall (%S)", mrb_fixnum_value(argc));
+    }
+    c = mrb_class(mrb, self);
+    p = mrb_method_search_vm(mrb, &c, mid);
+    if (!p) {
+      undef = mid;
+      mid = mrb_intern_lit(mrb, "method_missing");
+      p = mrb_method_search_vm(mrb, &c, mid);
+      n++; argc++;
+    }
+    ci = cipush(mrb);
+    ci->mid = mid;
+    ci->proc = p;
+    ci->stackent = mrb->c->stack;
+    ci->argc = argc;
+    ci->target_class = c;
+    mrb->c->stack = mrb->c->stack + n;
+    if (MRB_PROC_CFUNC_P(p)) {
+      ci->nregs = argc + 2;
+      stack_extend(mrb, ci->nregs, 0);
+    }
+    else {
+      ci->nregs = p->body.irep->nregs + n;
+      stack_extend(mrb, ci->nregs, argc+2);
+    }
+    mrb->c->stack[0] = self;
+    if (undef) {
+      mrb->c->stack[1] = mrb_symbol_value(undef);
+      if (argc > 1) {
+        stack_copy(mrb->c->stack+2, argv, argc-1);
+      }
+    }
+    else if (argc > 0) {
+      stack_copy(mrb->c->stack+1, argv, argc);
+    }
+    mrb->c->stack[argc+1] = blk;
+
+    if (MRB_PROC_CFUNC_P(p)) {
+      int ai = mrb_gc_arena_save(mrb);
+
+      ci->acc = CI_ACC_DIRECT;
+      val = p->body.func(mrb, self);
+      mrb->c->stack = mrb->c->ci->stackent;
+      cipop(mrb);
+      mrb_gc_arena_restore(mrb, ai);
+    }
+    else {
+      ci->acc = CI_ACC_SKIP;
+      val = mrb_run(mrb, p, self);
+    }
+  }
+  mrb_gc_protect(mrb, val);
+  return val;
+}
+
+MRB_API mrb_value
+mrb_funcall_argv(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc, const mrb_value *argv)
+{
+  return mrb_funcall_with_block(mrb, self, mid, argc, argv, mrb_nil_value());
+}
+
+/* 15.3.1.3.4  */
+/* 15.3.1.3.44 */
+/*
+ *  call-seq:
+ *     obj.send(symbol [, args...])        -> obj
+ *     obj.__send__(symbol [, args...])      -> obj
+ *
+ *  Invokes the method identified by _symbol_, passing it any
+ *  arguments specified. You can use <code>__send__</code> if the name
+ *  +send+ clashes with an existing method in _obj_.
+ *
+ *     class Klass
+ *       def hello(*args)
+ *         "Hello " + args.join(' ')
+ *       end
+ *     end
+ *     k = Klass.new
+ *     k.send :hello, "gentle", "readers"   #=> "Hello gentle readers"
+ */
+MRB_API mrb_value
+mrb_f_send(mrb_state *mrb, mrb_value self)
+{
+  mrb_sym name;
+  mrb_value block, *argv, *regs;
+  mrb_int argc, i, len;
+  struct RProc *p;
+  struct RClass *c;
+  mrb_callinfo *ci;
+
+  mrb_get_args(mrb, "n*&", &name, &argv, &argc, &block);
+
+  c = mrb_class(mrb, self);
+  p = mrb_method_search_vm(mrb, &c, name);
+
+  if (!p) {                     /* call method_mising */
+    return mrb_funcall_with_block(mrb, self, name, argc, argv, block);
+  }
+
+  ci = mrb->c->ci;
+  ci->mid = name;
+  ci->target_class = c;
+  ci->proc = p;
+  regs = mrb->c->stack+1;
+  /* remove first symbol from arguments */
+  if (ci->argc >= 0) {
+    for (i=0,len=ci->argc; i<len; i++) {
+      regs[i] = regs[i+1];
+    }
+    ci->argc--;
+  }
+  else {                     /* variable length arguments */
+    mrb_ary_shift(mrb, regs[0]);
+  }
+
+  if (MRB_PROC_CFUNC_P(p)) {
+    return p->body.func(mrb, self);
+  }
+
+  ci->nregs = p->body.irep->nregs;
+  ci = cipush(mrb);
+  ci->nregs = 0;
+  ci->target_class = 0;
+  ci->pc = p->body.irep->iseq;
+  ci->stackent = mrb->c->stack;
+  ci->acc = 0;
+
+  return self;
+}
+
+static mrb_value
+eval_under(mrb_state *mrb, mrb_value self, mrb_value blk, struct RClass *c)
+{
+  struct RProc *p;
+  mrb_callinfo *ci;
+
+  if (mrb_nil_p(blk)) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");
+  }
+  ci = mrb->c->ci;
+  if (ci->acc == CI_ACC_DIRECT) {
+    return mrb_yield_with_class(mrb, blk, 0, 0, self, c);
+  }
+  ci->target_class = c;
+  p = mrb_proc_ptr(blk);
+  ci->proc = p;
+  if (MRB_PROC_CFUNC_P(p)) {
+    return p->body.func(mrb, self);
+  }
+  ci->nregs = p->body.irep->nregs;
+  ci = cipush(mrb);
+  ci->nregs = 0;
+  ci->target_class = 0;
+  ci->pc = p->body.irep->iseq;
+  ci->stackent = mrb->c->stack;
+  ci->acc = 0;
+
+  return self;
+}
+
+/* 15.2.2.4.35 */
+/*
+ *  call-seq:
+ *     mod.class_eval {| | block }  -> obj
+ *     mod.module_eval {| | block } -> obj
+ *
+ *  Evaluates block in the context of _mod_. This can
+ *  be used to add methods to a class. <code>module_eval</code> returns
+ *  the result of evaluating its argument.
+ */
+mrb_value
+mrb_mod_module_eval(mrb_state *mrb, mrb_value mod)
+{
+  mrb_value a, b;
+
+  if (mrb_get_args(mrb, "|S&", &a, &b) == 1) {
+    mrb_raise(mrb, E_NOTIMP_ERROR, "module_eval/class_eval with string not implemented");
+  }
+  return eval_under(mrb, mod, b, mrb_class_ptr(mod));
+}
+
+/* 15.3.1.3.18 */
+/*
+ *  call-seq:
+ *     obj.instance_eval {| | block }                       -> obj
+ *
+ *  Evaluates the given block,within  the context of the receiver (_obj_).
+ *  In order to set the context, the variable +self+ is set to _obj_ while
+ *  the code is executing, giving the code access to _obj_'s
+ *  instance variables. In the version of <code>instance_eval</code>
+ *  that takes a +String+, the optional second and third
+ *  parameters supply a filename and starting line number that are used
+ *  when reporting compilation errors.
+ *
+ *     class KlassWithSecret
+ *       def initialize
+ *         @secret = 99
+ *       end
+ *     end
+ *     k = KlassWithSecret.new
+ *     k.instance_eval { @secret }   #=> 99
+ */
+mrb_value
+mrb_obj_instance_eval(mrb_state *mrb, mrb_value self)
+{
+  mrb_value a, b;
+  mrb_value cv;
+  struct RClass *c;
+
+  if (mrb_get_args(mrb, "|S&", &a, &b) == 1) {
+    mrb_raise(mrb, E_NOTIMP_ERROR, "instance_eval with string not implemented");
+  }
+  switch (mrb_type(self)) {
+  case MRB_TT_SYMBOL:
+  case MRB_TT_FIXNUM:
+  case MRB_TT_FLOAT:
+    c = 0;
+    break;
+  default:
+    cv = mrb_singleton_class(mrb, self);
+    c = mrb_class_ptr(cv);
+    break;
+  }
+  return eval_under(mrb, self, b, c);
+}
+
+MRB_API mrb_value
+mrb_yield_with_class(mrb_state *mrb, mrb_value b, mrb_int argc, const mrb_value *argv, mrb_value self, struct RClass *c)
+{
+  struct RProc *p;
+  mrb_sym mid = mrb->c->ci->mid;
+  mrb_callinfo *ci;
+  int n = mrb->c->ci->nregs;
+  mrb_value val;
+
+  if (mrb_nil_p(b)) {
+    mrb_raise(mrb, E_ARGUMENT_ERROR, "no block given");
+  }
+  p = mrb_proc_ptr(b);
+  ci = cipush(mrb);
+  ci->mid = mid;
+  ci->proc = p;
+  ci->stackent = mrb->c->stack;
+  ci->argc = argc;
+  ci->target_class = c;
+  ci->acc = CI_ACC_SKIP;
+  mrb->c->stack = mrb->c->stack + n;
+  if (MRB_PROC_CFUNC_P(p)) {
+    ci->nregs = argc + 2;
+    stack_extend(mrb, ci->nregs, 0);
+  }
+  else {
+    ci->nregs = p->body.irep->nregs;
+    stack_extend(mrb, ci->nregs, argc+2);
+  }
+
+  mrb->c->stack[0] = self;
+  if (argc > 0) {
+    stack_copy(mrb->c->stack+1, argv, argc);
+  }
+  mrb->c->stack[argc+1] = mrb_nil_value();
+
+  if (MRB_PROC_CFUNC_P(p)) {
+    val = p->body.func(mrb, self);
+    mrb->c->stack = mrb->c->ci->stackent;
+    cipop(mrb);
+  }
+  else {
+    val = mrb_run(mrb, p, self);
+  }
+  return val;
+}
+
+MRB_API mrb_value
+mrb_yield_argv(mrb_state *mrb, mrb_value b, mrb_int argc, const mrb_value *argv)
+{
+  struct RProc *p = mrb_proc_ptr(b);
+
+  return mrb_yield_with_class(mrb, b, argc, argv, p->env->stack[0], p->target_class);
+}
+
+MRB_API mrb_value
+mrb_yield(mrb_state *mrb, mrb_value b, mrb_value arg)
+{
+  struct RProc *p = mrb_proc_ptr(b);
+
+  return mrb_yield_with_class(mrb, b, 1, &arg, p->env->stack[0], p->target_class);
+}
+
+typedef enum {
+  LOCALJUMP_ERROR_RETURN = 0,
+  LOCALJUMP_ERROR_BREAK = 1,
+  LOCALJUMP_ERROR_YIELD = 2
+} localjump_error_kind;
+
+static void
+localjump_error(mrb_state *mrb, localjump_error_kind kind)
+{
+  char kind_str[3][7] = { "return", "break", "yield" };
+  char kind_str_len[] = { 6, 5, 5 };
+  static const char lead[] = "unexpected ";
+  mrb_value msg;
+  mrb_value exc;
+
+  msg = mrb_str_buf_new(mrb, sizeof(lead) + 7);
+  mrb_str_cat(mrb, msg, lead, sizeof(lead) - 1);
+  mrb_str_cat(mrb, msg, kind_str[kind], kind_str_len[kind]);
+  exc = mrb_exc_new_str(mrb, E_LOCALJUMP_ERROR, msg);
+  mrb->exc = mrb_obj_ptr(exc);
+}
+
+static void
+argnum_error(mrb_state *mrb, mrb_int num)
+{
+  mrb_value exc;
+  mrb_value str;
+
+  if (mrb->c->ci->mid) {
+    str = mrb_format(mrb, "'%S': wrong number of arguments (%S for %S)",
+                  mrb_sym2str(mrb, mrb->c->ci->mid),
+                  mrb_fixnum_value(mrb->c->ci->argc), mrb_fixnum_value(num));
+  }
+  else {
+    str = mrb_format(mrb, "wrong number of arguments (%S for %S)",
+                  mrb_fixnum_value(mrb->c->ci->argc), mrb_fixnum_value(num));
+  }
+  exc = mrb_exc_new_str(mrb, E_ARGUMENT_ERROR, str);
+  mrb->exc = mrb_obj_ptr(exc);
+}
+
+#define ERR_PC_SET(mrb, pc) mrb->c->ci->err = pc;
+#define ERR_PC_CLR(mrb)     mrb->c->ci->err = 0;
+#ifdef ENABLE_DEBUG
+#define CODE_FETCH_HOOK(mrb, irep, pc, regs) if ((mrb)->code_fetch_hook) (mrb)->code_fetch_hook((mrb), (irep), (pc), (regs));
+#else
+#define CODE_FETCH_HOOK(mrb, irep, pc, regs)
+#endif
+
+#if defined __GNUC__ || defined __clang__ || defined __INTEL_COMPILER
+#define DIRECT_THREADED
+#endif
+
+#ifndef DIRECT_THREADED
+
+#define INIT_DISPATCH for (;;) { i = *pc; CODE_FETCH_HOOK(mrb, irep, pc, regs); switch (GET_OPCODE(i)) {
+#define CASE(op) case op:
+#define NEXT pc++; break
+#define JUMP break
+#define END_DISPATCH }}
+
+#else
+
+#define INIT_DISPATCH JUMP; return mrb_nil_value();
+#define CASE(op) L_ ## op:
+#define NEXT i=*++pc; CODE_FETCH_HOOK(mrb, irep, pc, regs); goto *optable[GET_OPCODE(i)]
+#define JUMP i=*pc; CODE_FETCH_HOOK(mrb, irep, pc, regs); goto *optable[GET_OPCODE(i)]
+
+#define END_DISPATCH
+
+#endif
+
+mrb_value mrb_gv_val_get(mrb_state *mrb, mrb_sym sym);
+void mrb_gv_val_set(mrb_state *mrb, mrb_sym sym, mrb_value val);
+
+#define CALL_MAXARGS 127
+
+MRB_API mrb_value
+mrb_context_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stack_keep)
+{
+  /* mrb_assert(mrb_proc_cfunc_p(proc)) */
+  mrb_irep *irep = proc->body.irep;
+  mrb_code *pc = irep->iseq;
+  mrb_value *pool = irep->pool;
+  mrb_sym *syms = irep->syms;
+  mrb_value *regs = NULL;
+  mrb_code i;
+  int ai = mrb_gc_arena_save(mrb);
+  struct mrb_jmpbuf *prev_jmp = mrb->jmp;
+  struct mrb_jmpbuf c_jmp;
+
+#ifdef DIRECT_THREADED
+  static void *optable[] = {
+    &&L_OP_NOP, &&L_OP_MOVE,
+    &&L_OP_LOADL, &&L_OP_LOADI, &&L_OP_LOADSYM, &&L_OP_LOADNIL,
+    &&L_OP_LOADSELF, &&L_OP_LOADT, &&L_OP_LOADF,
+    &&L_OP_GETGLOBAL, &&L_OP_SETGLOBAL, &&L_OP_GETSPECIAL, &&L_OP_SETSPECIAL,
+    &&L_OP_GETIV, &&L_OP_SETIV, &&L_OP_GETCV, &&L_OP_SETCV,
+    &&L_OP_GETCONST, &&L_OP_SETCONST, &&L_OP_GETMCNST, &&L_OP_SETMCNST,
+    &&L_OP_GETUPVAR, &&L_OP_SETUPVAR,
+    &&L_OP_JMP, &&L_OP_JMPIF, &&L_OP_JMPNOT,
+    &&L_OP_ONERR, &&L_OP_RESCUE, &&L_OP_POPERR, &&L_OP_RAISE, &&L_OP_EPUSH, &&L_OP_EPOP,
+    &&L_OP_SEND, &&L_OP_SENDB, &&L_OP_FSEND,
+    &&L_OP_CALL, &&L_OP_SUPER, &&L_OP_ARGARY, &&L_OP_ENTER,
+    &&L_OP_KARG, &&L_OP_KDICT, &&L_OP_RETURN, &&L_OP_TAILCALL, &&L_OP_BLKPUSH,
+    &&L_OP_ADD, &&L_OP_ADDI, &&L_OP_SUB, &&L_OP_SUBI, &&L_OP_MUL, &&L_OP_DIV,
+    &&L_OP_EQ, &&L_OP_LT, &&L_OP_LE, &&L_OP_GT, &&L_OP_GE,
+    &&L_OP_ARRAY, &&L_OP_ARYCAT, &&L_OP_ARYPUSH, &&L_OP_AREF, &&L_OP_ASET, &&L_OP_APOST,
+    &&L_OP_STRING, &&L_OP_STRCAT, &&L_OP_HASH,
+    &&L_OP_LAMBDA, &&L_OP_RANGE, &&L_OP_OCLASS,
+    &&L_OP_CLASS, &&L_OP_MODULE, &&L_OP_EXEC,
+    &&L_OP_METHOD, &&L_OP_SCLASS, &&L_OP_TCLASS,
+    &&L_OP_DEBUG, &&L_OP_STOP, &&L_OP_ERR,
+  };
+#endif
+
+  mrb_bool exc_catched = FALSE;
+RETRY_TRY_BLOCK:
+
+  MRB_TRY(&c_jmp) {
+
+  if (exc_catched) {
+    exc_catched = FALSE;
+    goto L_RAISE;
+  }
+  mrb->jmp = &c_jmp;
+  if (!mrb->c->stack) {
+    stack_init(mrb);
+  }
+  stack_extend(mrb, irep->nregs, stack_keep);
+  mrb->c->ci->proc = proc;
+  mrb->c->ci->nregs = irep->nregs;
+  regs = mrb->c->stack;
+  regs[0] = self;
+
+  INIT_DISPATCH {
+    CASE(OP_NOP) {
+      /* do nothing */
+      NEXT;
+    }
+
+    CASE(OP_MOVE) {
+      /* A B    R(A) := R(B) */
+      regs[GETARG_A(i)] = regs[GETARG_B(i)];
+      NEXT;
+    }
+
+    CASE(OP_LOADL) {
+      /* A Bx   R(A) := Pool(Bx) */
+      regs[GETARG_A(i)] = pool[GETARG_Bx(i)];
+      NEXT;
+    }
+
+    CASE(OP_LOADI) {
+      /* A sBx  R(A) := sBx */
+      SET_INT_VALUE(regs[GETARG_A(i)], GETARG_sBx(i));
+      NEXT;
+    }
+
+    CASE(OP_LOADSYM) {
+      /* A Bx   R(A) := Syms(Bx) */
+      SET_SYM_VALUE(regs[GETARG_A(i)], syms[GETARG_Bx(i)]);
+      NEXT;
+    }
+
+    CASE(OP_LOADSELF) {
+      /* A      R(A) := self */
+      regs[GETARG_A(i)] = regs[0];
+      NEXT;
+    }
+
+    CASE(OP_LOADT) {
+      /* A      R(A) := true */
+      SET_TRUE_VALUE(regs[GETARG_A(i)]);
+      NEXT;
+    }
+
+    CASE(OP_LOADF) {
+      /* A      R(A) := false */
+      SET_FALSE_VALUE(regs[GETARG_A(i)]);
+      NEXT;
+    }
+
+    CASE(OP_GETGLOBAL) {
+      /* A Bx   R(A) := getglobal(Syms(Bx)) */
+      regs[GETARG_A(i)] = mrb_gv_get(mrb, syms[GETARG_Bx(i)]);
+      NEXT;
+    }
+
+    CASE(OP_SETGLOBAL) {
+      /* setglobal(Syms(Bx), R(A)) */
+      mrb_gv_set(mrb, syms[GETARG_Bx(i)], regs[GETARG_A(i)]);
+      NEXT;
+    }
+
+    CASE(OP_GETSPECIAL) {
+      /* A Bx   R(A) := Special[Bx] */
+      regs[GETARG_A(i)] = mrb_vm_special_get(mrb, GETARG_Bx(i));
+      NEXT;
+    }
+
+    CASE(OP_SETSPECIAL) {
+      /* A Bx   Special[Bx] := R(A) */
+      mrb_vm_special_set(mrb, GETARG_Bx(i), regs[GETARG_A(i)]);
+      NEXT;
+    }
+
+    CASE(OP_GETIV) {
+      /* A Bx   R(A) := ivget(Bx) */
+      regs[GETARG_A(i)] = mrb_vm_iv_get(mrb, syms[GETARG_Bx(i)]);
+      NEXT;
+    }
+
+    CASE(OP_SETIV) {
+      /* ivset(Syms(Bx),R(A)) */
+      mrb_vm_iv_set(mrb, syms[GETARG_Bx(i)], regs[GETARG_A(i)]);
+      NEXT;
+    }
+
+    CASE(OP_GETCV) {
+      /* A Bx   R(A) := cvget(Syms(Bx)) */
+      ERR_PC_SET(mrb, pc);
+      regs[GETARG_A(i)] = mrb_vm_cv_get(mrb, syms[GETARG_Bx(i)]);
+      ERR_PC_CLR(mrb);
+      NEXT;
+    }
+
+    CASE(OP_SETCV) {
+      /* cvset(Syms(Bx),R(A)) */
+      mrb_vm_cv_set(mrb, syms[GETARG_Bx(i)], regs[GETARG_A(i)]);
+      NEXT;
+    }
+
+    CASE(OP_GETCONST) {
+      /* A Bx    R(A) := constget(Syms(Bx)) */
+      mrb_value val;
+
+      ERR_PC_SET(mrb, pc);
+      val = mrb_vm_const_get(mrb, syms[GETARG_Bx(i)]);
+      ERR_PC_CLR(mrb);
+      regs = mrb->c->stack;
+      regs[GETARG_A(i)] = val;
+      NEXT;
+    }
+
+    CASE(OP_SETCONST) {
+      /* A Bx   constset(Syms(Bx),R(A)) */
+      mrb_vm_const_set(mrb, syms[GETARG_Bx(i)], regs[GETARG_A(i)]);
+      NEXT;
+    }
+
+    CASE(OP_GETMCNST) {
+      /* A Bx   R(A) := R(A)::Syms(Bx) */
+      mrb_value val;
+      int a = GETARG_A(i);
+
+      ERR_PC_SET(mrb, pc);
+      val = mrb_const_get(mrb, regs[a], syms[GETARG_Bx(i)]);
+      ERR_PC_CLR(mrb);
+      regs = mrb->c->stack;
+      regs[a] = val;
+      NEXT;
+    }
+
+    CASE(OP_SETMCNST) {
+      /* A Bx    R(A+1)::Syms(Bx) := R(A) */
+      int a = GETARG_A(i);
+
+      mrb_const_set(mrb, regs[a+1], syms[GETARG_Bx(i)], regs[a]);
+      NEXT;
+    }
+
+    CASE(OP_GETUPVAR) {
+      /* A B C  R(A) := uvget(B,C) */
+      mrb_value *regs_a = regs + GETARG_A(i);
+      int up = GETARG_C(i);
+
+      struct REnv *e = uvenv(mrb, up);
+
+      if (!e) {
+        *regs_a = mrb_nil_value();
+      }
+      else {
+        int idx = GETARG_B(i);
+        *regs_a = e->stack[idx];
+      }
+      NEXT;
+    }
+
+    CASE(OP_SETUPVAR) {
+      /* A B C  uvset(B,C,R(A)) */
+      int up = GETARG_C(i);
+
+      struct REnv *e = uvenv(mrb, up);
+
+      if (e) {
+        mrb_value *regs_a = regs + GETARG_A(i);
+        int idx = GETARG_B(i);
+        e->stack[idx] = *regs_a;
+        mrb_write_barrier(mrb, (struct RBasic*)e);
+      }
+      NEXT;
+    }
+
+    CASE(OP_JMP) {
+      /* sBx    pc+=sBx */
+      pc += GETARG_sBx(i);
+      JUMP;
+    }
+
+    CASE(OP_JMPIF) {
+      /* A sBx  if R(A) pc+=sBx */
+      if (mrb_test(regs[GETARG_A(i)])) {
+        pc += GETARG_sBx(i);
+        JUMP;
+      }
+      NEXT;
+    }
+
+    CASE(OP_JMPNOT) {
+      /* A sBx  if !R(A) pc+=sBx */
+      if (!mrb_test(regs[GETARG_A(i)])) {
+        pc += GETARG_sBx(i);
+        JUMP;
+      }
+      NEXT;
+    }
+
+    CASE(OP_ONERR) {
+      /* sBx    pc+=sBx on exception */
+      if (mrb->c->rsize <= mrb->c->ci->ridx) {
+        if (mrb->c->rsize == 0) mrb->c->rsize = 16;
+        else mrb->c->rsize *= 2;
+        mrb->c->rescue = (mrb_code **)mrb_realloc(mrb, mrb->c->rescue, sizeof(mrb_code*) * mrb->c->rsize);
+      }
+      mrb->c->rescue[mrb->c->ci->ridx++] = pc + GETARG_sBx(i);
+      NEXT;
+    }
+
+    CASE(OP_RESCUE) {
+      /* A      R(A) := exc; clear(exc) */
+      SET_OBJ_VALUE(regs[GETARG_A(i)], mrb->exc);
+      mrb->exc = 0;
+      NEXT;
+    }
+
+    CASE(OP_POPERR) {
+      /* A      A.times{rescue_pop()} */
+      int a = GETARG_A(i);
+
+      while (a--) {
+        mrb->c->ci->ridx--;
+      }
+      NEXT;
+    }
+
+    CASE(OP_RAISE) {
+      /* A      raise(R(A)) */
+      mrb->exc = mrb_obj_ptr(regs[GETARG_A(i)]);
+      goto L_RAISE;
+    }
+
+    CASE(OP_EPUSH) {
+      /* Bx     ensure_push(SEQ[Bx]) */
+      struct RProc *p;
+
+      p = mrb_closure_new(mrb, irep->reps[GETARG_Bx(i)]);
+      /* push ensure_stack */
+      if (mrb->c->esize <= mrb->c->ci->eidx) {
+        if (mrb->c->esize == 0) mrb->c->esize = 16;
+        else mrb->c->esize *= 2;
+        mrb->c->ensure = (struct RProc **)mrb_realloc(mrb, mrb->c->ensure, sizeof(struct RProc*) * mrb->c->esize);
+      }
+      mrb->c->ensure[mrb->c->ci->eidx++] = p;
+      ARENA_RESTORE(mrb, ai);
+      NEXT;
+    }
+
+    CASE(OP_EPOP) {
+      /* A      A.times{ensure_pop().call} */
+      int a = GETARG_A(i);
+      mrb_callinfo *ci = mrb->c->ci;
+      int n, eidx = ci->eidx;
+
+      for (n=0; n<a && eidx > ci[-1].eidx; n++) {
+        ecall(mrb, --eidx);
+        ARENA_RESTORE(mrb, ai);
+      }
+      NEXT;
+    }
+
+    CASE(OP_LOADNIL) {
+      /* A     R(A) := nil */
+      int a = GETARG_A(i);
+
+      SET_NIL_VALUE(regs[a]);
+      NEXT;
+    }
+
+    CASE(OP_SENDB) {
+      /* A B C  R(A) := call(R(A),Syms(B),R(A+1),...,R(A+C),&R(A+C+1))*/
+      /* fall through */
+    };
+
+  L_SEND:
+    CASE(OP_SEND) {
+      /* A B C  R(A) := call(R(A),Syms(B),R(A+1),...,R(A+C)) */
+      int a = GETARG_A(i);
+      int n = GETARG_C(i);
+      struct RProc *m;
+      struct RClass *c;
+      mrb_callinfo *ci;
+      mrb_value recv, result;
+      mrb_sym mid = syms[GETARG_B(i)];
+
+      recv = regs[a];
+      if (GET_OPCODE(i) != OP_SENDB) {
+        if (n == CALL_MAXARGS) {
+          SET_NIL_VALUE(regs[a+2]);
+        }
+        else {
+          SET_NIL_VALUE(regs[a+n+1]);
+        }
+      }
+      c = mrb_class(mrb, recv);
+      m = mrb_method_search_vm(mrb, &c, mid);
+      if (!m) {
+        mrb_value sym = mrb_symbol_value(mid);
+
+        mid = mrb_intern_lit(mrb, "method_missing");
+        m = mrb_method_search_vm(mrb, &c, mid);
+        if (n == CALL_MAXARGS) {
+          mrb_ary_unshift(mrb, regs[a+1], sym);
+        }
+        else {
+          value_move(regs+a+2, regs+a+1, ++n);
+          regs[a+1] = sym;
+        }
+      }
+
+      /* push callinfo */
+      ci = cipush(mrb);
+      ci->mid = mid;
+      ci->proc = m;
+      ci->stackent = mrb->c->stack;
+      if (c->tt == MRB_TT_ICLASS) {
+        ci->target_class = c->c;
+      }
+      else {
+        ci->target_class = c;
+      }
+
+      ci->pc = pc + 1;
+      ci->acc = a;
+
+      /* prepare stack */
+      mrb->c->stack += a;
+
+      if (MRB_PROC_CFUNC_P(m)) {
+        if (n == CALL_MAXARGS) {
+          ci->argc = -1;
+          ci->nregs = 3;
+        }
+        else {
+          ci->argc = n;
+          ci->nregs = n + 2;
+        }
+        result = m->body.func(mrb, recv);
+        mrb->c->stack[0] = result;
+        mrb_gc_arena_restore(mrb, ai);
+        if (mrb->exc) goto L_RAISE;
+        /* pop stackpos */
+        ci = mrb->c->ci;
+        if (!ci->target_class) { /* return from context modifying method (resume/yield) */
+          if (!MRB_PROC_CFUNC_P(ci[-1].proc)) {
+            proc = ci[-1].proc;
+            irep = proc->body.irep;
+            pool = irep->pool;
+            syms = irep->syms;
+          }
+        }
+        regs = mrb->c->stack = ci->stackent;
+        pc = ci->pc;
+        cipop(mrb);
+        JUMP;
+      }
+      else {
+        /* setup environment for calling method */
+        proc = mrb->c->ci->proc = m;
+        irep = m->body.irep;
+        pool = irep->pool;
+        syms = irep->syms;
+        ci->nregs = irep->nregs;
+        if (n == CALL_MAXARGS) {
+          ci->argc = -1;
+          stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, 3);
+        }
+        else {
+          ci->argc = n;
+          stack_extend(mrb, irep->nregs,  n+2);
+        }
+        regs = mrb->c->stack;
+        pc = irep->iseq;
+        JUMP;
+      }
+    }
+
+    CASE(OP_FSEND) {
+      /* A B C  R(A) := fcall(R(A),Syms(B),R(A+1),... ,R(A+C-1)) */
+      NEXT;
+    }
+
+    CASE(OP_CALL) {
+      /* A      R(A) := self.call(frame.argc, frame.argv) */
+      mrb_callinfo *ci;
+      mrb_value recv = mrb->c->stack[0];
+      struct RProc *m = mrb_proc_ptr(recv);
+
+      /* replace callinfo */
+      ci = mrb->c->ci;
+      ci->target_class = m->target_class;
+      ci->proc = m;
+      if (m->env) {
+        if (m->env->mid) {
+          ci->mid = m->env->mid;
+        }
+        if (!m->env->stack) {
+          m->env->stack = mrb->c->stack;
+        }
+      }
+
+      /* prepare stack */
+      if (MRB_PROC_CFUNC_P(m)) {
+        recv = m->body.func(mrb, recv);
+        mrb_gc_arena_restore(mrb, ai);
+        if (mrb->exc) goto L_RAISE;
+        /* pop stackpos */
+        ci = mrb->c->ci;
+        regs = mrb->c->stack = ci->stackent;
+        regs[ci->acc] = recv;
+        pc = ci->pc;
+        cipop(mrb);
+        irep = mrb->c->ci->proc->body.irep;
+        pool = irep->pool;
+        syms = irep->syms;
+        JUMP;
+      }
+      else {
+        /* setup environment for calling method */
+        proc = m;
+        irep = m->body.irep;
+        if (!irep) {
+          mrb->c->stack[0] = mrb_nil_value();
+          goto L_RETURN;
+        }
+        pool = irep->pool;
+        syms = irep->syms;
+        ci->nregs = irep->nregs;
+        if (ci->argc < 0) {
+          stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, 3);
+        }
+        else {
+          stack_extend(mrb, irep->nregs, ci->argc+2);
+        }
+        regs = mrb->c->stack;
+        regs[0] = m->env->stack[0];
+        pc = irep->iseq;
+        JUMP;
+      }
+    }
+
+    CASE(OP_SUPER) {
+      /* A C  R(A) := super(R(A+1),... ,R(A+C+1)) */
+      mrb_value recv;
+      mrb_callinfo *ci = mrb->c->ci;
+      struct RProc *m;
+      struct RClass *c;
+      mrb_sym mid = ci->mid;
+      int a = GETARG_A(i);
+      int n = GETARG_C(i);
+
+      recv = regs[0];
+      c = mrb->c->ci->target_class->super;
+      m = mrb_method_search_vm(mrb, &c, mid);
+      if (!m) {
+        mid = mrb_intern_lit(mrb, "method_missing");
+        m = mrb_method_search_vm(mrb, &c, mid);
+        if (n == CALL_MAXARGS) {
+          mrb_ary_unshift(mrb, regs[a+1], mrb_symbol_value(ci->mid));
+        }
+        else {
+          value_move(regs+a+2, regs+a+1, ++n);
+          SET_SYM_VALUE(regs[a+1], ci->mid);
+        }
+      }
+
+      /* push callinfo */
+      ci = cipush(mrb);
+      ci->mid = mid;
+      ci->proc = m;
+      ci->stackent = mrb->c->stack;
+      if (n == CALL_MAXARGS) {
+        ci->argc = -1;
+      }
+      else {
+        ci->argc = n;
+      }
+      ci->target_class = c;
+      ci->pc = pc + 1;
+
+      /* prepare stack */
+      mrb->c->stack += a;
+      mrb->c->stack[0] = recv;
+
+      if (MRB_PROC_CFUNC_P(m)) {
+        ci->nregs = 0;
+        mrb->c->stack[0] = m->body.func(mrb, recv);
+        mrb_gc_arena_restore(mrb, ai);
+        if (mrb->exc) goto L_RAISE;
+        /* pop stackpos */
+        regs = mrb->c->stack = mrb->c->ci->stackent;
+        cipop(mrb);
+        NEXT;
+      }
+      else {
+        /* fill callinfo */
+        ci->acc = a;
+
+        /* setup environment for calling method */
+        ci->proc = m;
+        irep = m->body.irep;
+        pool = irep->pool;
+        syms = irep->syms;
+        ci->nregs = irep->nregs;
+        if (n == CALL_MAXARGS) {
+          stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, 3);
+        }
+        else {
+          stack_extend(mrb, irep->nregs, ci->argc+2);
+        }
+        regs = mrb->c->stack;
+        pc = irep->iseq;
+        JUMP;
+      }
+    }
+
+    CASE(OP_ARGARY) {
+      /* A Bx   R(A) := argument array (16=6:1:5:4) */
+      int a = GETARG_A(i);
+      int bx = GETARG_Bx(i);
+      int m1 = (bx>>10)&0x3f;
+      int r  = (bx>>9)&0x1;
+      int m2 = (bx>>4)&0x1f;
+      int lv = (bx>>0)&0xf;
+      mrb_value *stack;
+
+      if (lv == 0) stack = regs + 1;
+      else {
+        struct REnv *e = uvenv(mrb, lv-1);
+        if (!e) {
+          mrb_value exc;
+          exc = mrb_exc_new_str_lit(mrb, E_NOMETHOD_ERROR, "super called outside of method");
+          mrb->exc = mrb_obj_ptr(exc);
+          goto L_RAISE;
+        }
+        stack = e->stack + 1;
+      }
+      if (r == 0) {
+        regs[a] = mrb_ary_new_from_values(mrb, m1+m2, stack);
+      }
+      else {
+        mrb_value *pp = NULL;
+        struct RArray *rest;
+        int len = 0;
+
+        if (mrb_array_p(stack[m1])) {
+          struct RArray *ary = mrb_ary_ptr(stack[m1]);
+
+          pp = ary->ptr;
+          len = ary->len;
+        }
+        regs[a] = mrb_ary_new_capa(mrb, m1+len+m2);
+        rest = mrb_ary_ptr(regs[a]);
+        if (m1 > 0) {
+          stack_copy(rest->ptr, stack, m1);
+        }
+        if (len > 0) {
+          stack_copy(rest->ptr+m1, pp, len);
+        }
+        if (m2 > 0) {
+          stack_copy(rest->ptr+m1+len, stack+m1+1, m2);
+        }
+        rest->len = m1+len+m2;
+      }
+      regs[a+1] = stack[m1+r+m2];
+      ARENA_RESTORE(mrb, ai);
+      NEXT;
+    }
+
+    CASE(OP_ENTER) {
+      /* Ax             arg setup according to flags (23=5:5:1:5:5:1:1) */
+      /* number of optional arguments times OP_JMP should follow */
+      mrb_aspec ax = GETARG_Ax(i);
+      int m1 = MRB_ASPEC_REQ(ax);
+      int o  = MRB_ASPEC_OPT(ax);
+      int r  = MRB_ASPEC_REST(ax);
+      int m2 = MRB_ASPEC_POST(ax);
+      /* unused
+      int k  = MRB_ASPEC_KEY(ax);
+      int kd = MRB_ASPEC_KDICT(ax);
+      int b  = MRB_ASPEC_BLOCK(ax);
+      */
+      int argc = mrb->c->ci->argc;
+      mrb_value *argv = regs+1;
+      mrb_value *argv0 = argv;
+      int len = m1 + o + r + m2;
+      mrb_value *blk = &argv[argc < 0 ? 1 : argc];
+
+      if (!mrb_nil_p(*blk) && mrb_type(*blk) != MRB_TT_PROC) {
+        *blk = mrb_convert_type(mrb, *blk, MRB_TT_PROC, "Proc", "to_proc");
+      }
+      if (argc < 0) {
+        struct RArray *ary = mrb_ary_ptr(regs[1]);
+        argv = ary->ptr;
+        argc = ary->len;
+        mrb_gc_protect(mrb, regs[1]);
+      }
+      if (mrb->c->ci->proc && MRB_PROC_STRICT_P(mrb->c->ci->proc)) {
+        if (argc >= 0) {
+          if (argc < m1 + m2 || (r == 0 && argc > len)) {
+            argnum_error(mrb, m1+m2);
+            goto L_RAISE;
+          }
+        }
+      }
+      else if (len > 1 && argc == 1 && mrb_array_p(argv[0])) {
+        mrb_gc_protect(mrb, argv[0]);
+        argc = mrb_ary_ptr(argv[0])->len;
+        argv = mrb_ary_ptr(argv[0])->ptr;
+      }
+      mrb->c->ci->argc = len;
+      if (argc < len) {
+        int mlen = m2;
+        if (argc < m1+m2) {
+          if (m1 < argc)
+            mlen = argc - m1;
+          else
+            mlen = 0;
+        }
+        regs[len+1] = *blk; /* move block */
+        SET_NIL_VALUE(regs[argc+1]);
+        if (argv0 != argv) {
+          value_move(&regs[1], argv, argc-mlen); /* m1 + o */
+        }
+        if (mlen) {
+          value_move(&regs[len-m2+1], &argv[argc-mlen], mlen);
+        }
+        if (r) {
+          regs[m1+o+1] = mrb_ary_new_capa(mrb, 0);
+        }
+        if (o == 0 || argc < m1+m2) pc++;
+        else
+          pc += argc - m1 - m2 + 1;
+      }
+      else {
+        int rnum = 0;
+        if (argv0 != argv) {
+          regs[len+1] = *blk; /* move block */
+          value_move(&regs[1], argv, m1+o);
+        }
+        if (r) {
+          rnum = argc-m1-o-m2;
+          regs[m1+o+1] = mrb_ary_new_from_values(mrb, rnum, argv+m1+o);
+        }
+        if (m2) {
+          if (argc-m2 > m1) {
+            value_move(&regs[m1+o+r+1], &argv[m1+o+rnum], m2);
+          }
+        }
+        if (argv0 == argv) {
+          regs[len+1] = *blk; /* move block */
+        }
+        pc += o + 1;
+      }
+      JUMP;
+    }
+
+    CASE(OP_KARG) {
+      /* A B C          R(A) := kdict[Syms(B)]; if C kdict.rm(Syms(B)) */
+      /* if C == 2; raise unless kdict.empty? */
+      /* OP_JMP should follow to skip init code */
+      NEXT;
+    }
+
+    CASE(OP_KDICT) {
+      /* A C            R(A) := kdict */
+      NEXT;
+    }
+
+    L_RETURN:
+      i = MKOP_AB(OP_RETURN, GETARG_A(i), OP_R_NORMAL);
+      /* fall through */
+    CASE(OP_RETURN) {
+      /* A B     return R(A) (B=normal,in-block return/break) */
+      if (mrb->exc) {
+        mrb_callinfo *ci;
+        int eidx;
+
+      L_RAISE:
+        ci = mrb->c->ci;
+        mrb_obj_iv_ifnone(mrb, mrb->exc, mrb_intern_lit(mrb, "lastpc"), mrb_cptr_value(mrb, pc));
+        mrb_obj_iv_ifnone(mrb, mrb->exc, mrb_intern_lit(mrb, "ciidx"), mrb_fixnum_value(ci - mrb->c->cibase));
+        eidx = ci->eidx;
+        if (ci == mrb->c->cibase) {
+          if (ci->ridx == 0) goto L_STOP;
+          goto L_RESCUE;
+        }
+        while (eidx > ci[-1].eidx) {
+          ecall(mrb, --eidx);
+        }
+        while (ci[0].ridx == ci[-1].ridx) {
+          cipop(mrb);
+          ci = mrb->c->ci;
+          mrb->c->stack = ci[1].stackent;
+          if (ci[1].acc == CI_ACC_SKIP && prev_jmp) {
+            mrb->jmp = prev_jmp;
+            MRB_THROW(prev_jmp);
+          }
+          if (ci > mrb->c->cibase) {
+            while (eidx > ci[-1].eidx) {
+              ecall(mrb, --eidx);
+            }
+          }
+          else if (ci == mrb->c->cibase) {
+            if (ci->ridx == 0) {
+              if (mrb->c == mrb->root_c) {
+                regs = mrb->c->stack = mrb->c->stbase;
+                goto L_STOP;
+              }
+              else {
+                struct mrb_context *c = mrb->c;
+
+                mrb->c = c->prev;
+                c->prev = NULL;
+                goto L_RAISE;
+              }
+            }
+            break;
+          }
+        }
+      L_RESCUE:
+        if (ci->ridx == 0) goto L_STOP;
+        proc = ci->proc;
+        irep = proc->body.irep;
+        pool = irep->pool;
+        syms = irep->syms;
+        regs = mrb->c->stack = ci[1].stackent;
+        pc = mrb->c->rescue[--ci->ridx];
+      }
+      else {
+        mrb_callinfo *ci = mrb->c->ci;
+        int acc, eidx = mrb->c->ci->eidx;
+        mrb_value v = regs[GETARG_A(i)];
+
+        switch (GETARG_B(i)) {
+        case OP_R_RETURN:
+          /* Fall through to OP_R_NORMAL otherwise */
+          if (proc->env && !MRB_PROC_STRICT_P(proc)) {
+            struct REnv *e = top_env(mrb, proc);
+
+            if (!MRB_ENV_STACK_SHARED_P(e)) {
+              localjump_error(mrb, LOCALJUMP_ERROR_RETURN);
+              goto L_RAISE;
+            }
+            ci = mrb->c->cibase + e->cioff;
+            if (ci == mrb->c->cibase) {
+              localjump_error(mrb, LOCALJUMP_ERROR_RETURN);
+              goto L_RAISE;
+            }
+            mrb->c->ci = ci;
+            break;
+          }
+        case OP_R_NORMAL:
+          if (ci == mrb->c->cibase) {
+            if (!mrb->c->prev) { /* toplevel return */
+              localjump_error(mrb, LOCALJUMP_ERROR_RETURN);
+              goto L_RAISE;
+            }
+            if (mrb->c->prev->ci == mrb->c->prev->cibase) {
+              mrb_value exc = mrb_exc_new_str_lit(mrb, E_FIBER_ERROR, "double resume");
+              mrb->exc = mrb_obj_ptr(exc);
+              goto L_RAISE;
+            }
+            /* automatic yield at the end */
+            mrb->c->status = MRB_FIBER_TERMINATED;
+            mrb->c = mrb->c->prev;
+            mrb->c->status = MRB_FIBER_RUNNING;
+          }
+          ci = mrb->c->ci;
+          break;
+        case OP_R_BREAK:
+          if (!proc->env || !MRB_ENV_STACK_SHARED_P(proc->env)) {
+            localjump_error(mrb, LOCALJUMP_ERROR_BREAK);
+            goto L_RAISE;
+          }
+          /* break from fiber block */
+          if (mrb->c->ci == mrb->c->cibase && mrb->c->ci->pc) {
+            struct mrb_context *c = mrb->c;
+
+            mrb->c = c->prev;
+            c->prev = NULL;
+          }
+          ci = mrb->c->ci;
+          mrb->c->ci = mrb->c->cibase + proc->env->cioff + 1;
+          while (ci > mrb->c->ci) {
+            if (ci[-1].acc == CI_ACC_SKIP) {
+              mrb->c->ci = ci;
+              break;
+            }
+            ci--;
+          }
+          break;
+        default:
+          /* cannot happen */
+          break;
+        }
+        while (eidx > mrb->c->ci[-1].eidx) {
+          ecall(mrb, --eidx);
+        }
+        cipop(mrb);
+        acc = ci->acc;
+        pc = ci->pc;
+        regs = mrb->c->stack = ci->stackent;
+        if (acc == CI_ACC_SKIP) {
+          mrb->jmp = prev_jmp;
+          return v;
+        }
+        DEBUG(printf("from :%s\n", mrb_sym2name(mrb, ci->mid)));
+        proc = mrb->c->ci->proc;
+        irep = proc->body.irep;
+        pool = irep->pool;
+        syms = irep->syms;
+
+        regs[acc] = v;
+      }
+      JUMP;
+    }
+
+    CASE(OP_TAILCALL) {
+      /* A B C  return call(R(A),Syms(B),R(A+1),... ,R(A+C+1)) */
+      int a = GETARG_A(i);
+      int n = GETARG_C(i);
+      struct RProc *m;
+      struct RClass *c;
+      mrb_callinfo *ci;
+      mrb_value recv;
+      mrb_sym mid = syms[GETARG_B(i)];
+
+      recv = regs[a];
+      c = mrb_class(mrb, recv);
+      m = mrb_method_search_vm(mrb, &c, mid);
+      if (!m) {
+        mrb_value sym = mrb_symbol_value(mid);
+
+        mid = mrb_intern_lit(mrb, "method_missing");
+        m = mrb_method_search_vm(mrb, &c, mid);
+        if (n == CALL_MAXARGS) {
+          mrb_ary_unshift(mrb, regs[a+1], sym);
+        }
+        else {
+          value_move(regs+a+2, regs+a+1, ++n);
+          regs[a+1] = sym;
+        }
+      }
+
+      /* replace callinfo */
+      ci = mrb->c->ci;
+      ci->mid = mid;
+      ci->target_class = c;
+      if (n == CALL_MAXARGS) {
+        ci->argc = -1;
+      }
+      else {
+        ci->argc = n;
+      }
+
+      /* move stack */
+      value_move(mrb->c->stack, &regs[a], ci->argc+1);
+
+      if (MRB_PROC_CFUNC_P(m)) {
+        mrb->c->stack[0] = m->body.func(mrb, recv);
+        mrb_gc_arena_restore(mrb, ai);
+        goto L_RETURN;
+      }
+      else {
+        /* setup environment for calling method */
+        irep = m->body.irep;
+        pool = irep->pool;
+        syms = irep->syms;
+        if (ci->argc < 0) {
+          stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, 3);
+        }
+        else {
+          stack_extend(mrb, irep->nregs, ci->argc+2);
+        }
+        regs = mrb->c->stack;
+        pc = irep->iseq;
+      }
+      JUMP;
+    }
+
+    CASE(OP_BLKPUSH) {
+      /* A Bx   R(A) := block (16=6:1:5:4) */
+      int a = GETARG_A(i);
+      int bx = GETARG_Bx(i);
+      int m1 = (bx>>10)&0x3f;
+      int r  = (bx>>9)&0x1;
+      int m2 = (bx>>4)&0x1f;
+      int lv = (bx>>0)&0xf;
+      mrb_value *stack;
+
+      if (lv == 0) stack = regs + 1;
+      else {
+        struct REnv *e = uvenv(mrb, lv-1);
+        if (!e) {
+          localjump_error(mrb, LOCALJUMP_ERROR_YIELD);
+          goto L_RAISE;
+        }
+        stack = e->stack + 1;
+      }
+      regs[a] = stack[m1+r+m2];
+      NEXT;
+    }
+
+#define TYPES2(a,b) ((((uint16_t)(a))<<8)|(((uint16_t)(b))&0xff))
+#define OP_MATH_BODY(op,v1,v2) do {\
+  v1(regs[a]) = v1(regs[a]) op v2(regs[a+1]);\
+} while(0)
+
+    CASE(OP_ADD) {
+      /* A B C  R(A) := R(A)+R(A+1) (Syms[B]=:+,C=1)*/
+      int a = GETARG_A(i);
+
+      /* need to check if op is overridden */
+      switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) {
+      case TYPES2(MRB_TT_FIXNUM,MRB_TT_FIXNUM):
+        {
+          mrb_int x, y, z;
+          mrb_value *regs_a = regs + a;
+
+          x = mrb_fixnum(regs_a[0]);
+          y = mrb_fixnum(regs_a[1]);
+          if (mrb_int_add_overflow(x, y, &z)) {
+            SET_FLOAT_VALUE(mrb, regs_a[0], (mrb_float)x + (mrb_float)y);
+            break;
+          }
+          SET_INT_VALUE(regs[a], z);
+        }
+        break;
+      case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT):
+        {
+          mrb_int x = mrb_fixnum(regs[a]);
+          mrb_float y = mrb_float(regs[a+1]);
+          SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x + y);
+        }
+        break;
+      case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM):
+#ifdef MRB_WORD_BOXING
+        {
+          mrb_float x = mrb_float(regs[a]);
+          mrb_int y = mrb_fixnum(regs[a+1]);
+          SET_FLOAT_VALUE(mrb, regs[a], x + y);
+        }
+#else
+        OP_MATH_BODY(+,mrb_float,mrb_fixnum);
+#endif
+        break;
+      case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT):
+#ifdef MRB_WORD_BOXING
+        {
+          mrb_float x = mrb_float(regs[a]);
+          mrb_float y = mrb_float(regs[a+1]);
+          SET_FLOAT_VALUE(mrb, regs[a], x + y);
+        }
+#else
+        OP_MATH_BODY(+,mrb_float,mrb_float);
+#endif
+        break;
+      case TYPES2(MRB_TT_STRING,MRB_TT_STRING):
+        regs[a] = mrb_str_plus(mrb, regs[a], regs[a+1]);
+        break;
+      default:
+        goto L_SEND;
+      }
+      ARENA_RESTORE(mrb, ai);
+      NEXT;
+    }
+
+    CASE(OP_SUB) {
+      /* A B C  R(A) := R(A)-R(A+1) (Syms[B]=:-,C=1)*/
+      int a = GETARG_A(i);
+
+      /* need to check if op is overridden */
+      switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) {
+      case TYPES2(MRB_TT_FIXNUM,MRB_TT_FIXNUM):
+        {
+          mrb_int x, y, z;
+
+          x = mrb_fixnum(regs[a]);
+          y = mrb_fixnum(regs[a+1]);
+          if (mrb_int_sub_overflow(x, y, &z)) {
+            SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x - (mrb_float)y);
+            break;
+          }
+          SET_INT_VALUE(regs[a], z);
+        }
+        break;
+      case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT):
+        {
+          mrb_int x = mrb_fixnum(regs[a]);
+          mrb_float y = mrb_float(regs[a+1]);
+          SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x - y);
+        }
+        break;
+      case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM):
+#ifdef MRB_WORD_BOXING
+        {
+          mrb_float x = mrb_float(regs[a]);
+          mrb_int y = mrb_fixnum(regs[a+1]);
+          SET_FLOAT_VALUE(mrb, regs[a], x - y);
+        }
+#else
+        OP_MATH_BODY(-,mrb_float,mrb_fixnum);
+#endif
+        break;
+      case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT):
+#ifdef MRB_WORD_BOXING
+        {
+          mrb_float x = mrb_float(regs[a]);
+          mrb_float y = mrb_float(regs[a+1]);
+          SET_FLOAT_VALUE(mrb, regs[a], x - y);
+        }
+#else
+        OP_MATH_BODY(-,mrb_float,mrb_float);
+#endif
+        break;
+      default:
+        goto L_SEND;
+      }
+      NEXT;
+    }
+
+    CASE(OP_MUL) {
+      /* A B C  R(A) := R(A)*R(A+1) (Syms[B]=:*,C=1)*/
+      int a = GETARG_A(i);
+
+      /* need to check if op is overridden */
+      switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) {
+      case TYPES2(MRB_TT_FIXNUM,MRB_TT_FIXNUM):
+        {
+          mrb_value z;
+
+          z = mrb_fixnum_mul(mrb, regs[a], regs[a+1]);
+
+          switch (mrb_type(z)) {
+          case MRB_TT_FIXNUM:
+            {
+              SET_INT_VALUE(regs[a], mrb_fixnum(z));
+            }
+            break;
+          case MRB_TT_FLOAT:
+            {
+              SET_FLOAT_VALUE(mrb, regs[a], mrb_float(z));
+            }
+            break;
+          default:
+            /* cannot happen */
+            break;
+          }
+        }
+        break;
+      case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT):
+        {
+          mrb_int x = mrb_fixnum(regs[a]);
+          mrb_float y = mrb_float(regs[a+1]);
+          SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x * y);
+        }
+        break;
+      case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM):
+#ifdef MRB_WORD_BOXING
+        {
+          mrb_float x = mrb_float(regs[a]);
+          mrb_int y = mrb_fixnum(regs[a+1]);
+          SET_FLOAT_VALUE(mrb, regs[a], x * y);
+        }
+#else
+        OP_MATH_BODY(*,mrb_float,mrb_fixnum);
+#endif
+        break;
+      case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT):
+#ifdef MRB_WORD_BOXING
+        {
+          mrb_float x = mrb_float(regs[a]);
+          mrb_float y = mrb_float(regs[a+1]);
+          SET_FLOAT_VALUE(mrb, regs[a], x * y);
+        }
+#else
+        OP_MATH_BODY(*,mrb_float,mrb_float);
+#endif
+        break;
+      default:
+        goto L_SEND;
+      }
+      NEXT;
+    }
+
+    CASE(OP_DIV) {
+      /* A B C  R(A) := R(A)/R(A+1) (Syms[B]=:/,C=1)*/
+      int a = GETARG_A(i);
+
+      /* need to check if op is overridden */
+      switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) {
+      case TYPES2(MRB_TT_FIXNUM,MRB_TT_FIXNUM):
+        {
+          mrb_int x = mrb_fixnum(regs[a]);
+          mrb_int y = mrb_fixnum(regs[a+1]);
+          SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x / (mrb_float)y);
+        }
+        break;
+      case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT):
+        {
+          mrb_int x = mrb_fixnum(regs[a]);
+          mrb_float y = mrb_float(regs[a+1]);
+          SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x / y);
+        }
+        break;
+      case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM):
+#ifdef MRB_WORD_BOXING
+        {
+          mrb_float x = mrb_float(regs[a]);
+          mrb_int y = mrb_fixnum(regs[a+1]);
+          SET_FLOAT_VALUE(mrb, regs[a], x / y);
+        }
+#else
+        OP_MATH_BODY(/,mrb_float,mrb_fixnum);
+#endif
+        break;
+      case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT):
+#ifdef MRB_WORD_BOXING
+        {
+          mrb_float x = mrb_float(regs[a]);
+          mrb_float y = mrb_float(regs[a+1]);
+          SET_FLOAT_VALUE(mrb, regs[a], x / y);
+        }
+#else
+        OP_MATH_BODY(/,mrb_float,mrb_float);
+#endif
+        break;
+      default:
+        goto L_SEND;
+      }
+#ifdef MRB_NAN_BOXING
+      if (isnan(mrb_float(regs[a]))) {
+        regs[a] = mrb_float_value(mrb, mrb_float(regs[a]));
+      }
+#endif
+      NEXT;
+    }
+
+    CASE(OP_ADDI) {
+      /* A B C  R(A) := R(A)+C (Syms[B]=:+)*/
+      int a = GETARG_A(i);
+
+      /* need to check if + is overridden */
+      switch (mrb_type(regs[a])) {
+      case MRB_TT_FIXNUM:
+        {
+          mrb_int x = mrb_fixnum(regs[a]);
+          mrb_int y = GETARG_C(i);
+          mrb_int z;
+
+          if (mrb_int_add_overflow(x, y, &z)) {
+            SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x + (mrb_float)y);
+            break;
+          }
+          mrb_fixnum(regs[a]) = z;
+        }
+        break;
+      case MRB_TT_FLOAT:
+#ifdef MRB_WORD_BOXING
+        {
+          mrb_float x = mrb_float(regs[a]);
+          SET_FLOAT_VALUE(mrb, regs[a], x + GETARG_C(i));
+        }
+#else
+        mrb_float(regs[a]) += GETARG_C(i);
+#endif
+        break;
+      default:
+        SET_INT_VALUE(regs[a+1], GETARG_C(i));
+        i = MKOP_ABC(OP_SEND, a, GETARG_B(i), 1);
+        goto L_SEND;
+      }
+      NEXT;
+    }
+
+    CASE(OP_SUBI) {
+      /* A B C  R(A) := R(A)-C (Syms[B]=:-)*/
+      int a = GETARG_A(i);
+      mrb_value *regs_a = regs + a;
+
+      /* need to check if + is overridden */
+      switch (mrb_type(regs_a[0])) {
+      case MRB_TT_FIXNUM:
+        {
+          mrb_int x = mrb_fixnum(regs_a[0]);
+          mrb_int y = GETARG_C(i);
+          mrb_int z;
+
+          if (mrb_int_sub_overflow(x, y, &z)) {
+            SET_FLOAT_VALUE(mrb, regs_a[0], (mrb_float)x - (mrb_float)y);
+          }
+          else {
+            mrb_fixnum(regs_a[0]) = z;
+          }
+        }
+        break;
+      case MRB_TT_FLOAT:
+#ifdef MRB_WORD_BOXING
+        {
+          mrb_float x = mrb_float(regs[a]);
+          SET_FLOAT_VALUE(mrb, regs[a], x - GETARG_C(i));
+        }
+#else
+        mrb_float(regs_a[0]) -= GETARG_C(i);
+#endif
+        break;
+      default:
+        SET_INT_VALUE(regs_a[1], GETARG_C(i));
+        i = MKOP_ABC(OP_SEND, a, GETARG_B(i), 1);
+        goto L_SEND;
+      }
+      NEXT;
+    }
+
+#define OP_CMP_BODY(op,v1,v2) (v1(regs[a]) op v2(regs[a+1]))
+
+#define OP_CMP(op) do {\
+  int result;\
+  /* need to check if - is overridden */\
+  switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) {\
+  case TYPES2(MRB_TT_FIXNUM,MRB_TT_FIXNUM):\
+    result = OP_CMP_BODY(op,mrb_fixnum,mrb_fixnum);\
+    break;\
+  case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT):\
+    result = OP_CMP_BODY(op,mrb_fixnum,mrb_float);\
+    break;\
+  case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM):\
+    result = OP_CMP_BODY(op,mrb_float,mrb_fixnum);\
+    break;\
+  case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT):\
+    result = OP_CMP_BODY(op,mrb_float,mrb_float);\
+    break;\
+  default:\
+    goto L_SEND;\
+  }\
+  if (result) {\
+    SET_TRUE_VALUE(regs[a]);\
+  }\
+  else {\
+    SET_FALSE_VALUE(regs[a]);\
+  }\
+} while(0)
+
+    CASE(OP_EQ) {
+      /* A B C  R(A) := R(A)==R(A+1) (Syms[B]=:==,C=1)*/
+      int a = GETARG_A(i);
+      if (mrb_obj_eq(mrb, regs[a], regs[a+1])) {
+        SET_TRUE_VALUE(regs[a]);
+      }
+      else {
+        OP_CMP(==);
+      }
+      NEXT;
+    }
+
+    CASE(OP_LT) {
+      /* A B C  R(A) := R(A)<R(A+1) (Syms[B]=:<,C=1)*/
+      int a = GETARG_A(i);
+      OP_CMP(<);
+      NEXT;
+    }
+
+    CASE(OP_LE) {
+      /* A B C  R(A) := R(A)<=R(A+1) (Syms[B]=:<=,C=1)*/
+      int a = GETARG_A(i);
+      OP_CMP(<=);
+      NEXT;
+    }
+
+    CASE(OP_GT) {
+      /* A B C  R(A) := R(A)>R(A+1) (Syms[B]=:>,C=1)*/
+      int a = GETARG_A(i);
+      OP_CMP(>);
+      NEXT;
+    }
+
+    CASE(OP_GE) {
+      /* A B C  R(A) := R(A)>=R(A+1) (Syms[B]=:>=,C=1)*/
+      int a = GETARG_A(i);
+      OP_CMP(>=);
+      NEXT;
+    }
+
+    CASE(OP_ARRAY) {
+      /* A B C          R(A) := ary_new(R(B),R(B+1)..R(B+C)) */
+      regs[GETARG_A(i)] = mrb_ary_new_from_values(mrb, GETARG_C(i), &regs[GETARG_B(i)]);
+      ARENA_RESTORE(mrb, ai);
+      NEXT;
+    }
+
+    CASE(OP_ARYCAT) {
+      /* A B            mrb_ary_concat(R(A),R(B)) */
+      mrb_ary_concat(mrb, regs[GETARG_A(i)],
+                     mrb_ary_splat(mrb, regs[GETARG_B(i)]));
+      ARENA_RESTORE(mrb, ai);
+      NEXT;
+    }
+
+    CASE(OP_ARYPUSH) {
+      /* A B            R(A).push(R(B)) */
+      mrb_ary_push(mrb, regs[GETARG_A(i)], regs[GETARG_B(i)]);
+      NEXT;
+    }
+
+    CASE(OP_AREF) {
+      /* A B C          R(A) := R(B)[C] */
+      int a = GETARG_A(i);
+      int c = GETARG_C(i);
+      mrb_value v = regs[GETARG_B(i)];
+
+      if (!mrb_array_p(v)) {
+        if (c == 0) {
+          regs[GETARG_A(i)] = v;
+        }
+        else {
+          SET_NIL_VALUE(regs[a]);
+        }
+      }
+      else {
+        regs[GETARG_A(i)] = mrb_ary_ref(mrb, v, c);
+      }
+      NEXT;
+    }
+
+    CASE(OP_ASET) {
+      /* A B C          R(B)[C] := R(A) */
+      mrb_ary_set(mrb, regs[GETARG_B(i)], GETARG_C(i), regs[GETARG_A(i)]);
+      NEXT;
+    }
+
+    CASE(OP_APOST) {
+      /* A B C  *R(A),R(A+1)..R(A+C) := R(A) */
+      int a = GETARG_A(i);
+      mrb_value v = regs[a];
+      int pre  = GETARG_B(i);
+      int post = GETARG_C(i);
+
+      if (!mrb_array_p(v)) {
+        regs[a++] = mrb_ary_new_capa(mrb, 0);
+        while (post--) {
+          SET_NIL_VALUE(regs[a]);
+          a++;
+        }
+      }
+      else {
+        struct RArray *ary = mrb_ary_ptr(v);
+        int len = ary->len;
+        int idx;
+
+        if (len > pre + post) {
+          regs[a++] = mrb_ary_new_from_values(mrb, len - pre - post, ary->ptr+pre);
+          while (post--) {
+            regs[a++] = ary->ptr[len-post-1];
+          }
+        }
+        else {
+          regs[a++] = mrb_ary_new_capa(mrb, 0);
+          for (idx=0; idx+pre<len; idx++) {
+            regs[a+idx] = ary->ptr[pre+idx];
+          }
+          while (idx < post) {
+            SET_NIL_VALUE(regs[a+idx]);
+            idx++;
+          }
+        }
+      }
+      ARENA_RESTORE(mrb, ai);
+      NEXT;
+    }
+
+    CASE(OP_STRING) {
+      /* A Bx           R(A) := str_new(Lit(Bx)) */
+      regs[GETARG_A(i)] = mrb_str_dup(mrb, pool[GETARG_Bx(i)]);
+      ARENA_RESTORE(mrb, ai);
+      NEXT;
+    }
+
+    CASE(OP_STRCAT) {
+      /* A B    R(A).concat(R(B)) */
+      mrb_str_concat(mrb, regs[GETARG_A(i)], regs[GETARG_B(i)]);
+      NEXT;
+    }
+
+    CASE(OP_HASH) {
+      /* A B C   R(A) := hash_new(R(B),R(B+1)..R(B+C)) */
+      int b = GETARG_B(i);
+      int c = GETARG_C(i);
+      int lim = b+c*2;
+      mrb_value hash = mrb_hash_new_capa(mrb, c);
+
+      while (b < lim) {
+        mrb_hash_set(mrb, hash, regs[b], regs[b+1]);
+        b+=2;
+      }
+      regs[GETARG_A(i)] = hash;
+      ARENA_RESTORE(mrb, ai);
+      NEXT;
+    }
+
+    CASE(OP_LAMBDA) {
+      /* A b c  R(A) := lambda(SEQ[b],c) (b:c = 14:2) */
+      struct RProc *p;
+      int c = GETARG_c(i);
+
+      if (c & OP_L_CAPTURE) {
+        p = mrb_closure_new(mrb, irep->reps[GETARG_b(i)]);
+      }
+      else {
+        p = mrb_proc_new(mrb, irep->reps[GETARG_b(i)]);
+        if (c & OP_L_METHOD) {
+          if (p->target_class->tt == MRB_TT_SCLASS) {
+            mrb_value klass;
+            klass = mrb_obj_iv_get(mrb,
+                                   (struct RObject *)p->target_class,
+                                   mrb_intern_lit(mrb, "__attached__"));
+            p->target_class = mrb_class_ptr(klass);
+          }
+        }
+      }
+      if (c & OP_L_STRICT) p->flags |= MRB_PROC_STRICT;
+      regs[GETARG_A(i)] = mrb_obj_value(p);
+      ARENA_RESTORE(mrb, ai);
+      NEXT;
+    }
+
+    CASE(OP_OCLASS) {
+      /* A      R(A) := ::Object */
+      regs[GETARG_A(i)] = mrb_obj_value(mrb->object_class);
+      NEXT;
+    }
+
+    CASE(OP_CLASS) {
+      /* A B    R(A) := newclass(R(A),Syms(B),R(A+1)) */
+      struct RClass *c = 0;
+      int a = GETARG_A(i);
+      mrb_value base, super;
+      mrb_sym id = syms[GETARG_B(i)];
+
+      base = regs[a];
+      super = regs[a+1];
+      if (mrb_nil_p(base)) {
+        base = mrb_obj_value(mrb->c->ci->target_class);
+      }
+      c = mrb_vm_define_class(mrb, base, super, id);
+      regs[a] = mrb_obj_value(c);
+      ARENA_RESTORE(mrb, ai);
+      NEXT;
+    }
+
+    CASE(OP_MODULE) {
+      /* A B            R(A) := newmodule(R(A),Syms(B)) */
+      struct RClass *c = 0;
+      int a = GETARG_A(i);
+      mrb_value base;
+      mrb_sym id = syms[GETARG_B(i)];
+
+      base = regs[a];
+      if (mrb_nil_p(base)) {
+        base = mrb_obj_value(mrb->c->ci->target_class);
+      }
+      c = mrb_vm_define_module(mrb, base, id);
+      regs[a] = mrb_obj_value(c);
+      ARENA_RESTORE(mrb, ai);
+      NEXT;
+    }
+
+    CASE(OP_EXEC) {
+      /* A Bx   R(A) := blockexec(R(A),SEQ[Bx]) */
+      int a = GETARG_A(i);
+      mrb_callinfo *ci;
+      mrb_value recv = regs[a];
+      struct RProc *p;
+
+      /* prepare stack */
+      ci = cipush(mrb);
+      ci->pc = pc + 1;
+      ci->acc = a;
+      ci->mid = 0;
+      ci->stackent = mrb->c->stack;
+      ci->argc = 0;
+      ci->target_class = mrb_class_ptr(recv);
+
+      /* prepare stack */
+      mrb->c->stack += a;
+
+      p = mrb_proc_new(mrb, irep->reps[GETARG_Bx(i)]);
+      p->target_class = ci->target_class;
+      ci->proc = p;
+
+      if (MRB_PROC_CFUNC_P(p)) {
+        ci->nregs = 0;
+        mrb->c->stack[0] = p->body.func(mrb, recv);
+        mrb_gc_arena_restore(mrb, ai);
+        if (mrb->exc) goto L_RAISE;
+        /* pop stackpos */
+        regs = mrb->c->stack = mrb->c->ci->stackent;
+        cipop(mrb);
+        NEXT;
+      }
+      else {
+        irep = p->body.irep;
+        pool = irep->pool;
+        syms = irep->syms;
+        stack_extend(mrb, irep->nregs, 1);
+        ci->nregs = irep->nregs;
+        regs = mrb->c->stack;
+        pc = irep->iseq;
+        JUMP;
+      }
+    }
+
+    CASE(OP_METHOD) {
+      /* A B            R(A).newmethod(Syms(B),R(A+1)) */
+      int a = GETARG_A(i);
+      struct RClass *c = mrb_class_ptr(regs[a]);
+
+      mrb_define_method_vm(mrb, c, syms[GETARG_B(i)], regs[a+1]);
+      ARENA_RESTORE(mrb, ai);
+      NEXT;
+    }
+
+    CASE(OP_SCLASS) {
+      /* A B    R(A) := R(B).singleton_class */
+      regs[GETARG_A(i)] = mrb_singleton_class(mrb, regs[GETARG_B(i)]);
+      ARENA_RESTORE(mrb, ai);
+      NEXT;
+    }
+
+    CASE(OP_TCLASS) {
+      /* A      R(A) := target_class */
+      if (!mrb->c->ci->target_class) {
+        mrb_value exc = mrb_exc_new_str_lit(mrb, E_TYPE_ERROR, "no target class or module");
+        mrb->exc = mrb_obj_ptr(exc);
+        goto L_RAISE;
+      }
+      regs[GETARG_A(i)] = mrb_obj_value(mrb->c->ci->target_class);
+      NEXT;
+    }
+
+    CASE(OP_RANGE) {
+      /* A B C  R(A) := range_new(R(B),R(B+1),C) */
+      int b = GETARG_B(i);
+      regs[GETARG_A(i)] = mrb_range_new(mrb, regs[b], regs[b+1], GETARG_C(i));
+      ARENA_RESTORE(mrb, ai);
+      NEXT;
+    }
+
+    CASE(OP_DEBUG) {
+      /* A B C    debug print R(A),R(B),R(C) */
+#ifdef ENABLE_DEBUG
+      mrb->debug_op_hook(mrb, irep, pc, regs);
+#else
+#ifdef ENABLE_STDIO
+      printf("OP_DEBUG %d %d %d\n", GETARG_A(i), GETARG_B(i), GETARG_C(i));
+#else
+      abort();
+#endif
+#endif
+      NEXT;
+    }
+
+    CASE(OP_STOP) {
+      /*        stop VM */
+    L_STOP:
+      {
+        int eidx_stop = mrb->c->ci == mrb->c->cibase ? 0 : mrb->c->ci[-1].eidx;
+        int eidx = mrb->c->ci->eidx;
+        while (eidx > eidx_stop) {
+          ecall(mrb, --eidx);
+        }
+      }
+      ERR_PC_CLR(mrb);
+      mrb->jmp = prev_jmp;
+      if (mrb->exc) {
+        return mrb_obj_value(mrb->exc);
+      }
+      return regs[irep->nlocals];
+    }
+
+    CASE(OP_ERR) {
+      /* Bx     raise RuntimeError with message Lit(Bx) */
+      mrb_value msg = mrb_str_dup(mrb, pool[GETARG_Bx(i)]);
+      mrb_value exc;
+
+      if (GETARG_A(i) == 0) {
+        exc = mrb_exc_new_str(mrb, E_RUNTIME_ERROR, msg);
+      }
+      else {
+        exc = mrb_exc_new_str(mrb, E_LOCALJUMP_ERROR, msg);
+      }
+      mrb->exc = mrb_obj_ptr(exc);
+      goto L_RAISE;
+    }
+  }
+  END_DISPATCH;
+
+  }
+  MRB_CATCH(&c_jmp) {
+    exc_catched = TRUE;
+    goto RETRY_TRY_BLOCK;
+  }
+  MRB_END_EXC(&c_jmp);
+}
+
+MRB_API mrb_value
+mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
+{
+  return mrb_context_run(mrb, proc, self, mrb->c->ci->argc + 2); /* argc + 2 (receiver and block) */
+}
+
+MRB_API mrb_value
+mrb_toplevel_run_keep(mrb_state *mrb, struct RProc *proc, unsigned int stack_keep)
+{
+  mrb_callinfo *ci;
+  mrb_value v;
+
+  if (!mrb->c->cibase || mrb->c->ci == mrb->c->cibase) {
+    return mrb_context_run(mrb, proc, mrb_top_self(mrb), stack_keep);
+  }
+  ci = cipush(mrb);
+  ci->nregs = 1;   /* protect the receiver */
+  ci->acc = CI_ACC_SKIP;
+  ci->target_class = mrb->object_class;
+  v = mrb_context_run(mrb, proc, mrb_top_self(mrb), stack_keep);
+  cipop(mrb);
+
+  return v;
+}
+
+MRB_API mrb_value
+mrb_toplevel_run(mrb_state *mrb, struct RProc *proc)
+{
+  return mrb_toplevel_run_keep(mrb, proc, 0);
+}
+