sig
  module Arg :
    sig
      type spec =
        Arg.spec =
          Unit of (unit -> unit)
        | Bool of (bool -> unit)
        | Set of bool ref
        | Clear of bool ref
        | String of (string -> unit)
        | Set_string of string ref
        | Int of (int -> unit)
        | Set_int of int ref
        | Float of (float -> unit)
        | Set_float of float ref
        | Tuple of spec list
        | Symbol of string list * (string -> unit)
        | Rest of (string -> unit)
      type key = string
      type doc = string
      type usage_msg = string
      type anon_fun = string -> unit
      val parse : (key * spec * doc) list -> anon_fun -> usage_msg -> unit
      val parse_dynamic :
        (string * spec * string) list ref -> anon_fun -> string -> unit
      val parse_argv :
        ?current:int ref ->
        string array ->
        (key * spec * doc) list -> anon_fun -> usage_msg -> unit
      val parse_argv_dynamic :
        ?current:int ref ->
        string array ->
        (string * spec * string) list ref -> anon_fun -> string -> unit
      exception Help of string
      exception Bad of string
      val usage : (key * spec * doc) list -> usage_msg -> unit
      val usage_string : (key * spec * doc) list -> usage_msg -> string
      val align : (key * spec * doc) list -> (key * spec * doc) list
      val current : int ref
    end
  module Array :
    sig
      external length : 'a array -> int = "%array_length"
      external get : 'a array -> int -> 'a = "%array_safe_get"
      external set : 'a array -> int -> '-> unit = "%array_safe_set"
      external make : int -> '-> 'a array = "caml_make_vect"
      external create : int -> '-> 'a array = "caml_make_vect"
      val init : int -> (int -> 'a) -> 'a array
      val make_matrix : int -> int -> '-> 'a array array
      val create_matrix : int -> int -> '-> 'a array array
      val append : 'a array -> 'a array -> 'a array
      val concat : 'a array list -> 'a array
      val sub : 'a array -> int -> int -> 'a array
      val copy : 'a array -> 'a array
      val fill : 'a array -> int -> int -> '-> unit
      val blit : 'a array -> int -> 'a array -> int -> int -> unit
      val to_list : 'a array -> 'a list
      val of_list : 'a list -> 'a array
      val iter : ('-> unit) -> 'a array -> unit
      val map : ('-> 'b) -> 'a array -> 'b array
      val iteri : (int -> '-> unit) -> 'a array -> unit
      val mapi : (int -> '-> 'b) -> 'a array -> 'b array
      val fold_left : ('-> '-> 'a) -> '-> 'b array -> 'a
      val fold_right : ('-> '-> 'a) -> 'b array -> '-> 'a
      val sort : ('-> '-> int) -> 'a array -> unit
      val stable_sort : ('-> '-> int) -> 'a array -> unit
      val fast_sort : ('-> '-> int) -> 'a array -> unit
      external unsafe_get : 'a array -> int -> 'a = "%array_unsafe_get"
      external unsafe_set : 'a array -> int -> '-> unit
        = "%array_unsafe_set"
    end
  module ArrayLabels :
    sig
      external length : 'a array -> int = "%array_length"
      external get : 'a array -> int -> 'a = "%array_safe_get"
      external set : 'a array -> int -> '-> unit = "%array_safe_set"
      external make : int -> '-> 'a array = "caml_make_vect"
      external create : int -> '-> 'a array = "caml_make_vect"
      val init : int -> f:(int -> 'a) -> 'a array
      val make_matrix : dimx:int -> dimy:int -> '-> 'a array array
      val create_matrix : dimx:int -> dimy:int -> '-> 'a array array
      val append : 'a array -> 'a array -> 'a array
      val concat : 'a array list -> 'a array
      val sub : 'a array -> pos:int -> len:int -> 'a array
      val copy : 'a array -> 'a array
      val fill : 'a array -> pos:int -> len:int -> '-> unit
      val blit :
        src:'a array ->
        src_pos:int -> dst:'a array -> dst_pos:int -> len:int -> unit
      val to_list : 'a array -> 'a list
      val of_list : 'a list -> 'a array
      val iter : f:('-> unit) -> 'a array -> unit
      val map : f:('-> 'b) -> 'a array -> 'b array
      val iteri : f:(int -> '-> unit) -> 'a array -> unit
      val mapi : f:(int -> '-> 'b) -> 'a array -> 'b array
      val fold_left : f:('-> '-> 'a) -> init:'-> 'b array -> 'a
      val fold_right : f:('-> '-> 'a) -> 'b array -> init:'-> 'a
      val sort : cmp:('-> '-> int) -> 'a array -> unit
      val stable_sort : cmp:('-> '-> int) -> 'a array -> unit
      val fast_sort : cmp:('-> '-> int) -> 'a array -> unit
      external unsafe_get : 'a array -> int -> 'a = "%array_unsafe_get"
      external unsafe_set : 'a array -> int -> '-> unit
        = "%array_unsafe_set"
    end
  module Buffer :
    sig
      type t = Buffer.t
      val create : int -> t
      val contents : t -> string
      val sub : t -> int -> int -> string
      val blit : t -> int -> string -> int -> int -> unit
      val nth : t -> int -> char
      val length : t -> int
      val clear : t -> unit
      val reset : t -> unit
      val add_char : t -> char -> unit
      val add_string : t -> string -> unit
      val add_substring : t -> string -> int -> int -> unit
      val add_substitute : t -> (string -> string) -> string -> unit
      val add_buffer : t -> t -> unit
      val add_channel : t -> in_channel -> int -> unit
      val output_buffer : out_channel -> t -> unit
    end
  module Callback :
    sig
      val register : string -> '-> unit
      val register_exception : string -> exn -> unit
    end
  module Char :
    sig
      external code : char -> int = "%identity"
      val chr : int -> char
      val escaped : char -> string
      val lowercase : char -> char
      val uppercase : char -> char
      type t = char
      val compare : t -> t -> int
      external unsafe_chr : int -> char = "%identity"
    end
  module Complex :
    sig
      type t = Complex.t = { re : float; im : float; }
      val zero : t
      val one : t
      val i : t
      val neg : t -> t
      val conj : t -> t
      val add : t -> t -> t
      val sub : t -> t -> t
      val mul : t -> t -> t
      val inv : t -> t
      val div : t -> t -> t
      val sqrt : t -> t
      val norm2 : t -> float
      val norm : t -> float
      val arg : t -> float
      val polar : float -> float -> t
      val exp : t -> t
      val log : t -> t
      val pow : t -> t -> t
    end
  module Digest :
    sig
      type t = string
      val compare : t -> t -> int
      val string : string -> t
      val substring : string -> int -> int -> t
      external channel : in_channel -> int -> t = "caml_md5_chan"
      val file : string -> t
      val output : out_channel -> t -> unit
      val input : in_channel -> t
      val to_hex : t -> string
      val from_hex : string -> t
    end
  module Filename :
    sig
      val current_dir_name : string
      val parent_dir_name : string
      val dir_sep : string
      val concat : string -> string -> string
      val is_relative : string -> bool
      val is_implicit : string -> bool
      val check_suffix : string -> string -> bool
      val chop_suffix : string -> string -> string
      val chop_extension : string -> string
      val basename : string -> string
      val dirname : string -> string
      val temp_file : ?temp_dir:string -> string -> string -> string
      val open_temp_file :
        ?mode:open_flag list ->
        ?temp_dir:string -> string -> string -> string * out_channel
      val get_temp_dir_name : unit -> string
      val set_temp_dir_name : string -> unit
      val temp_dir_name : string
      val quote : string -> string
    end
  module Format :
    sig
      val open_box : int -> unit
      val close_box : unit -> unit
      val print_string : string -> unit
      val print_as : int -> string -> unit
      val print_int : int -> unit
      val print_float : float -> unit
      val print_char : char -> unit
      val print_bool : bool -> unit
      val print_space : unit -> unit
      val print_cut : unit -> unit
      val print_break : int -> int -> unit
      val print_flush : unit -> unit
      val print_newline : unit -> unit
      val force_newline : unit -> unit
      val print_if_newline : unit -> unit
      val set_margin : int -> unit
      val get_margin : unit -> int
      val set_max_indent : int -> unit
      val get_max_indent : unit -> int
      val set_max_boxes : int -> unit
      val get_max_boxes : unit -> int
      val over_max_boxes : unit -> bool
      val open_hbox : unit -> unit
      val open_vbox : int -> unit
      val open_hvbox : int -> unit
      val open_hovbox : int -> unit
      val open_tbox : unit -> unit
      val close_tbox : unit -> unit
      val print_tbreak : int -> int -> unit
      val set_tab : unit -> unit
      val print_tab : unit -> unit
      val set_ellipsis_text : string -> unit
      val get_ellipsis_text : unit -> string
      type tag = string
      val open_tag : tag -> unit
      val close_tag : unit -> unit
      val set_tags : bool -> unit
      val set_print_tags : bool -> unit
      val set_mark_tags : bool -> unit
      val get_print_tags : unit -> bool
      val get_mark_tags : unit -> bool
      val set_formatter_out_channel : out_channel -> unit
      val set_formatter_output_functions :
        (string -> int -> int -> unit) -> (unit -> unit) -> unit
      val get_formatter_output_functions :
        unit -> (string -> int -> int -> unit) * (unit -> unit)
      type formatter_out_functions =
        Format.formatter_out_functions = {
        out_string : string -> int -> int -> unit;
        out_flush : unit -> unit;
        out_newline : unit -> unit;
        out_spaces : int -> unit;
      }
      val set_formatter_out_functions : formatter_out_functions -> unit
      val get_formatter_out_functions : unit -> formatter_out_functions
      type formatter_tag_functions =
        Format.formatter_tag_functions = {
        mark_open_tag : tag -> string;
        mark_close_tag : tag -> string;
        print_open_tag : tag -> unit;
        print_close_tag : tag -> unit;
      }
      val set_formatter_tag_functions : formatter_tag_functions -> unit
      val get_formatter_tag_functions : unit -> formatter_tag_functions
      type formatter = Format.formatter
      val formatter_of_out_channel : out_channel -> formatter
      val std_formatter : formatter
      val err_formatter : formatter
      val formatter_of_buffer : Buffer.t -> formatter
      val stdbuf : Buffer.t
      val str_formatter : formatter
      val flush_str_formatter : unit -> string
      val make_formatter :
        (string -> int -> int -> unit) -> (unit -> unit) -> formatter
      val pp_open_hbox : formatter -> unit -> unit
      val pp_open_vbox : formatter -> int -> unit
      val pp_open_hvbox : formatter -> int -> unit
      val pp_open_hovbox : formatter -> int -> unit
      val pp_open_box : formatter -> int -> unit
      val pp_close_box : formatter -> unit -> unit
      val pp_open_tag : formatter -> string -> unit
      val pp_close_tag : formatter -> unit -> unit
      val pp_print_string : formatter -> string -> unit
      val pp_print_as : formatter -> int -> string -> unit
      val pp_print_int : formatter -> int -> unit
      val pp_print_float : formatter -> float -> unit
      val pp_print_char : formatter -> char -> unit
      val pp_print_bool : formatter -> bool -> unit
      val pp_print_break : formatter -> int -> int -> unit
      val pp_print_cut : formatter -> unit -> unit
      val pp_print_space : formatter -> unit -> unit
      val pp_force_newline : formatter -> unit -> unit
      val pp_print_flush : formatter -> unit -> unit
      val pp_print_newline : formatter -> unit -> unit
      val pp_print_if_newline : formatter -> unit -> unit
      val pp_open_tbox : formatter -> unit -> unit
      val pp_close_tbox : formatter -> unit -> unit
      val pp_print_tbreak : formatter -> int -> int -> unit
      val pp_set_tab : formatter -> unit -> unit
      val pp_print_tab : formatter -> unit -> unit
      val pp_set_tags : formatter -> bool -> unit
      val pp_set_print_tags : formatter -> bool -> unit
      val pp_set_mark_tags : formatter -> bool -> unit
      val pp_get_print_tags : formatter -> unit -> bool
      val pp_get_mark_tags : formatter -> unit -> bool
      val pp_set_margin : formatter -> int -> unit
      val pp_get_margin : formatter -> unit -> int
      val pp_set_max_indent : formatter -> int -> unit
      val pp_get_max_indent : formatter -> unit -> int
      val pp_set_max_boxes : formatter -> int -> unit
      val pp_get_max_boxes : formatter -> unit -> int
      val pp_over_max_boxes : formatter -> unit -> bool
      val pp_set_ellipsis_text : formatter -> string -> unit
      val pp_get_ellipsis_text : formatter -> unit -> string
      val pp_set_formatter_out_channel : formatter -> out_channel -> unit
      val pp_set_formatter_output_functions :
        formatter -> (string -> int -> int -> unit) -> (unit -> unit) -> unit
      val pp_get_formatter_output_functions :
        formatter -> unit -> (string -> int -> int -> unit) * (unit -> unit)
      val pp_set_formatter_tag_functions :
        formatter -> formatter_tag_functions -> unit
      val pp_get_formatter_tag_functions :
        formatter -> unit -> formatter_tag_functions
      val pp_set_formatter_out_functions :
        formatter -> formatter_out_functions -> unit
      val pp_get_formatter_out_functions :
        formatter -> unit -> formatter_out_functions
      val fprintf : formatter -> ('a, formatter, unit) format -> 'a
      val printf : ('a, formatter, unit) format -> 'a
      val eprintf : ('a, formatter, unit) format -> 'a
      val sprintf : ('a, unit, string) format -> 'a
      val asprintf : ('a, formatter, unit, string) format4 -> 'a
      val ifprintf : formatter -> ('a, formatter, unit) format -> 'a
      val kfprintf :
        (formatter -> 'a) ->
        formatter -> ('b, formatter, unit, 'a) format4 -> 'b
      val ikfprintf :
        (formatter -> 'a) ->
        formatter -> ('b, formatter, unit, 'a) format4 -> 'b
      val ksprintf : (string -> 'a) -> ('b, unit, string, 'a) format4 -> 'b
      val bprintf : Buffer.t -> ('a, formatter, unit) format -> 'a
      val kprintf : (string -> 'a) -> ('b, unit, string, 'a) format4 -> 'b
      val set_all_formatter_output_functions :
        out:(string -> int -> int -> unit) ->
        flush:(unit -> unit) ->
        newline:(unit -> unit) -> spaces:(int -> unit) -> unit
      val get_all_formatter_output_functions :
        unit ->
        (string -> int -> int -> unit) * (unit -> unit) * (unit -> unit) *
        (int -> unit)
      val pp_set_all_formatter_output_functions :
        formatter ->
        out:(string -> int -> int -> unit) ->
        flush:(unit -> unit) ->
        newline:(unit -> unit) -> spaces:(int -> unit) -> unit
      val pp_get_all_formatter_output_functions :
        formatter ->
        unit ->
        (string -> int -> int -> unit) * (unit -> unit) * (unit -> unit) *
        (int -> unit)
    end
  module Gc :
    sig
      type stat =
        Gc.stat = {
        minor_words : float;
        promoted_words : float;
        major_words : float;
        minor_collections : int;
        major_collections : int;
        heap_words : int;
        heap_chunks : int;
        live_words : int;
        live_blocks : int;
        free_words : int;
        free_blocks : int;
        largest_free : int;
        fragments : int;
        compactions : int;
        top_heap_words : int;
        stack_size : int;
      }
      type control =
        Gc.control = {
        mutable minor_heap_size : int;
        mutable major_heap_increment : int;
        mutable space_overhead : int;
        mutable verbose : int;
        mutable max_overhead : int;
        mutable stack_limit : int;
        mutable allocation_policy : int;
      }
      external stat : unit -> stat = "caml_gc_stat"
      external quick_stat : unit -> stat = "caml_gc_quick_stat"
      external counters : unit -> float * float * float = "caml_gc_counters"
      external get : unit -> control = "caml_gc_get"
      external set : control -> unit = "caml_gc_set"
      external minor : unit -> unit = "caml_gc_minor"
      external major_slice : int -> int = "caml_gc_major_slice"
      external major : unit -> unit = "caml_gc_major"
      external full_major : unit -> unit = "caml_gc_full_major"
      external compact : unit -> unit = "caml_gc_compaction"
      val print_stat : out_channel -> unit
      val allocated_bytes : unit -> float
      val finalise : ('-> unit) -> '-> unit
      val finalise_release : unit -> unit
      type alarm = Gc.alarm
      val create_alarm : (unit -> unit) -> alarm
      val delete_alarm : alarm -> unit
    end
  module Genlex :
    sig
      type token =
        Genlex.token =
          Kwd of string
        | Ident of string
        | Int of int
        | Float of float
        | String of string
        | Char of char
      val make_lexer : string list -> char Stream.t -> token Stream.t
    end
  module Hashtbl :
    sig
      type ('a, 'b) t = ('a, 'b) Hashtbl.t
      val create : ?random:bool -> int -> ('a, 'b) t
      val clear : ('a, 'b) t -> unit
      val reset : ('a, 'b) t -> unit
      val copy : ('a, 'b) t -> ('a, 'b) t
      val add : ('a, 'b) t -> '-> '-> unit
      val find : ('a, 'b) t -> '-> 'b
      val find_all : ('a, 'b) t -> '-> 'b list
      val mem : ('a, 'b) t -> '-> bool
      val remove : ('a, 'b) t -> '-> unit
      val replace : ('a, 'b) t -> '-> '-> unit
      val iter : ('-> '-> unit) -> ('a, 'b) t -> unit
      val fold : ('-> '-> '-> 'c) -> ('a, 'b) t -> '-> 'c
      val length : ('a, 'b) t -> int
      val randomize : unit -> unit
      type statistics =
        Hashtbl.statistics = {
        num_bindings : int;
        num_buckets : int;
        max_bucket_length : int;
        bucket_histogram : int array;
      }
      val stats : ('a, 'b) t -> statistics
      module type HashedType =
        sig type t val equal : t -> t -> bool val hash : t -> int end
      module type S =
        sig
          type key
          type 'a t
          val create : int -> 'a t
          val clear : 'a t -> unit
          val reset : 'a t -> unit
          val copy : 'a t -> 'a t
          val add : 'a t -> key -> '-> unit
          val remove : 'a t -> key -> unit
          val find : 'a t -> key -> 'a
          val find_all : 'a t -> key -> 'a list
          val replace : 'a t -> key -> '-> unit
          val mem : 'a t -> key -> bool
          val iter : (key -> '-> unit) -> 'a t -> unit
          val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
          val length : 'a t -> int
          val stats : 'a t -> statistics
        end
      module Make :
        functor (H : HashedType->
          sig
            type key = H.t
            type 'a t = 'Hashtbl.Make(H).t
            val create : int -> 'a t
            val clear : 'a t -> unit
            val reset : 'a t -> unit
            val copy : 'a t -> 'a t
            val add : 'a t -> key -> '-> unit
            val remove : 'a t -> key -> unit
            val find : 'a t -> key -> 'a
            val find_all : 'a t -> key -> 'a list
            val replace : 'a t -> key -> '-> unit
            val mem : 'a t -> key -> bool
            val iter : (key -> '-> unit) -> 'a t -> unit
            val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
            val length : 'a t -> int
            val stats : 'a t -> statistics
          end
      module type SeededHashedType =
        sig type t val equal : t -> t -> bool val hash : int -> t -> int end
      module type SeededS =
        sig
          type key
          type 'a t
          val create : ?random:bool -> int -> 'a t
          val clear : 'a t -> unit
          val reset : 'a t -> unit
          val copy : 'a t -> 'a t
          val add : 'a t -> key -> '-> unit
          val remove : 'a t -> key -> unit
          val find : 'a t -> key -> 'a
          val find_all : 'a t -> key -> 'a list
          val replace : 'a t -> key -> '-> unit
          val mem : 'a t -> key -> bool
          val iter : (key -> '-> unit) -> 'a t -> unit
          val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
          val length : 'a t -> int
          val stats : 'a t -> statistics
        end
      module MakeSeeded :
        functor (H : SeededHashedType->
          sig
            type key = H.t
            type 'a t = 'Hashtbl.MakeSeeded(H).t
            val create : ?random:bool -> int -> 'a t
            val clear : 'a t -> unit
            val reset : 'a t -> unit
            val copy : 'a t -> 'a t
            val add : 'a t -> key -> '-> unit
            val remove : 'a t -> key -> unit
            val find : 'a t -> key -> 'a
            val find_all : 'a t -> key -> 'a list
            val replace : 'a t -> key -> '-> unit
            val mem : 'a t -> key -> bool
            val iter : (key -> '-> unit) -> 'a t -> unit
            val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
            val length : 'a t -> int
            val stats : 'a t -> statistics
          end
      val hash : '-> int
      val seeded_hash : int -> '-> int
      val hash_param : int -> int -> '-> int
      val seeded_hash_param : int -> int -> int -> '-> int
    end
  module Int32 :
    sig
      val zero : int32
      val one : int32
      val minus_one : int32
      external neg : int32 -> int32 = "%int32_neg"
      external add : int32 -> int32 -> int32 = "%int32_add"
      external sub : int32 -> int32 -> int32 = "%int32_sub"
      external mul : int32 -> int32 -> int32 = "%int32_mul"
      external div : int32 -> int32 -> int32 = "%int32_div"
      external rem : int32 -> int32 -> int32 = "%int32_mod"
      val succ : int32 -> int32
      val pred : int32 -> int32
      val abs : int32 -> int32
      val max_int : int32
      val min_int : int32
      external logand : int32 -> int32 -> int32 = "%int32_and"
      external logor : int32 -> int32 -> int32 = "%int32_or"
      external logxor : int32 -> int32 -> int32 = "%int32_xor"
      val lognot : int32 -> int32
      external shift_left : int32 -> int -> int32 = "%int32_lsl"
      external shift_right : int32 -> int -> int32 = "%int32_asr"
      external shift_right_logical : int32 -> int -> int32 = "%int32_lsr"
      external of_int : int -> int32 = "%int32_of_int"
      external to_int : int32 -> int = "%int32_to_int"
      external of_float : float -> int32 = "caml_int32_of_float"
      external to_float : int32 -> float = "caml_int32_to_float"
      external of_string : string -> int32 = "caml_int32_of_string"
      val to_string : int32 -> string
      external bits_of_float : float -> int32 = "caml_int32_bits_of_float"
      external float_of_bits : int32 -> float = "caml_int32_float_of_bits"
      type t = int32
      val compare : t -> t -> int
      external format : string -> int32 -> string = "caml_int32_format"
    end
  module Int64 :
    sig
      val zero : int64
      val one : int64
      val minus_one : int64
      external neg : int64 -> int64 = "%int64_neg"
      external add : int64 -> int64 -> int64 = "%int64_add"
      external sub : int64 -> int64 -> int64 = "%int64_sub"
      external mul : int64 -> int64 -> int64 = "%int64_mul"
      external div : int64 -> int64 -> int64 = "%int64_div"
      external rem : int64 -> int64 -> int64 = "%int64_mod"
      val succ : int64 -> int64
      val pred : int64 -> int64
      val abs : int64 -> int64
      val max_int : int64
      val min_int : int64
      external logand : int64 -> int64 -> int64 = "%int64_and"
      external logor : int64 -> int64 -> int64 = "%int64_or"
      external logxor : int64 -> int64 -> int64 = "%int64_xor"
      val lognot : int64 -> int64
      external shift_left : int64 -> int -> int64 = "%int64_lsl"
      external shift_right : int64 -> int -> int64 = "%int64_asr"
      external shift_right_logical : int64 -> int -> int64 = "%int64_lsr"
      external of_int : int -> int64 = "%int64_of_int"
      external to_int : int64 -> int = "%int64_to_int"
      external of_float : float -> int64 = "caml_int64_of_float"
      external to_float : int64 -> float = "caml_int64_to_float"
      external of_int32 : int32 -> int64 = "%int64_of_int32"
      external to_int32 : int64 -> int32 = "%int64_to_int32"
      external of_nativeint : nativeint -> int64 = "%int64_of_nativeint"
      external to_nativeint : int64 -> nativeint = "%int64_to_nativeint"
      external of_string : string -> int64 = "caml_int64_of_string"
      val to_string : int64 -> string
      external bits_of_float : float -> int64 = "caml_int64_bits_of_float"
      external float_of_bits : int64 -> float = "caml_int64_float_of_bits"
      type t = int64
      val compare : t -> t -> int
      external format : string -> int64 -> string = "caml_int64_format"
    end
  module Lazy :
    sig
      type 'a t = 'a lazy_t
      exception Undefined
      external force : 'a t -> 'a = "%lazy_force"
      val force_val : 'a t -> 'a
      val from_fun : (unit -> 'a) -> 'a t
      val from_val : '-> 'a t
      val is_val : 'a t -> bool
      val lazy_from_fun : (unit -> 'a) -> 'a t
      val lazy_from_val : '-> 'a t
      val lazy_is_val : 'a t -> bool
    end
  module Lexing :
    sig
      type position =
        Lexing.position = {
        pos_fname : string;
        pos_lnum : int;
        pos_bol : int;
        pos_cnum : int;
      }
      val dummy_pos : position
      type lexbuf =
        Lexing.lexbuf = {
        refill_buff : lexbuf -> unit;
        mutable lex_buffer : string;
        mutable lex_buffer_len : int;
        mutable lex_abs_pos : int;
        mutable lex_start_pos : int;
        mutable lex_curr_pos : int;
        mutable lex_last_pos : int;
        mutable lex_last_action : int;
        mutable lex_eof_reached : bool;
        mutable lex_mem : int array;
        mutable lex_start_p : position;
        mutable lex_curr_p : position;
      }
      val from_channel : in_channel -> lexbuf
      val from_string : string -> lexbuf
      val from_function : (string -> int -> int) -> lexbuf
      val lexeme : lexbuf -> string
      val lexeme_char : lexbuf -> int -> char
      val lexeme_start : lexbuf -> int
      val lexeme_end : lexbuf -> int
      val lexeme_start_p : lexbuf -> position
      val lexeme_end_p : lexbuf -> position
      val new_line : lexbuf -> unit
      val flush_input : lexbuf -> unit
      val sub_lexeme : lexbuf -> int -> int -> string
      val sub_lexeme_opt : lexbuf -> int -> int -> string option
      val sub_lexeme_char : lexbuf -> int -> char
      val sub_lexeme_char_opt : lexbuf -> int -> char option
      type lex_tables =
        Lexing.lex_tables = {
        lex_base : string;
        lex_backtrk : string;
        lex_default : string;
        lex_trans : string;
        lex_check : string;
        lex_base_code : string;
        lex_backtrk_code : string;
        lex_default_code : string;
        lex_trans_code : string;
        lex_check_code : string;
        lex_code : string;
      }
      val engine : lex_tables -> int -> lexbuf -> int
      val new_engine : lex_tables -> int -> lexbuf -> int
    end
  module List :
    sig
      val length : 'a list -> int
      val hd : 'a list -> 'a
      val tl : 'a list -> 'a list
      val nth : 'a list -> int -> 'a
      val rev : 'a list -> 'a list
      val append : 'a list -> 'a list -> 'a list
      val rev_append : 'a list -> 'a list -> 'a list
      val concat : 'a list list -> 'a list
      val flatten : 'a list list -> 'a list
      val iter : ('-> unit) -> 'a list -> unit
      val iteri : (int -> '-> unit) -> 'a list -> unit
      val map : ('-> 'b) -> 'a list -> 'b list
      val mapi : (int -> '-> 'b) -> 'a list -> 'b list
      val rev_map : ('-> 'b) -> 'a list -> 'b list
      val fold_left : ('-> '-> 'a) -> '-> 'b list -> 'a
      val fold_right : ('-> '-> 'b) -> 'a list -> '-> 'b
      val iter2 : ('-> '-> unit) -> 'a list -> 'b list -> unit
      val map2 : ('-> '-> 'c) -> 'a list -> 'b list -> 'c list
      val rev_map2 : ('-> '-> 'c) -> 'a list -> 'b list -> 'c list
      val fold_left2 :
        ('-> '-> '-> 'a) -> '-> 'b list -> 'c list -> 'a
      val fold_right2 :
        ('-> '-> '-> 'c) -> 'a list -> 'b list -> '-> 'c
      val for_all : ('-> bool) -> 'a list -> bool
      val exists : ('-> bool) -> 'a list -> bool
      val for_all2 : ('-> '-> bool) -> 'a list -> 'b list -> bool
      val exists2 : ('-> '-> bool) -> 'a list -> 'b list -> bool
      val mem : '-> 'a list -> bool
      val memq : '-> 'a list -> bool
      val find : ('-> bool) -> 'a list -> 'a
      val filter : ('-> bool) -> 'a list -> 'a list
      val find_all : ('-> bool) -> 'a list -> 'a list
      val partition : ('-> bool) -> 'a list -> 'a list * 'a list
      val assoc : '-> ('a * 'b) list -> 'b
      val assq : '-> ('a * 'b) list -> 'b
      val mem_assoc : '-> ('a * 'b) list -> bool
      val mem_assq : '-> ('a * 'b) list -> bool
      val remove_assoc : '-> ('a * 'b) list -> ('a * 'b) list
      val remove_assq : '-> ('a * 'b) list -> ('a * 'b) list
      val split : ('a * 'b) list -> 'a list * 'b list
      val combine : 'a list -> 'b list -> ('a * 'b) list
      val sort : ('-> '-> int) -> 'a list -> 'a list
      val stable_sort : ('-> '-> int) -> 'a list -> 'a list
      val fast_sort : ('-> '-> int) -> 'a list -> 'a list
      val merge : ('-> '-> int) -> 'a list -> 'a list -> 'a list
    end
  module ListLabels :
    sig
      val length : 'a list -> int
      val hd : 'a list -> 'a
      val tl : 'a list -> 'a list
      val nth : 'a list -> int -> 'a
      val rev : 'a list -> 'a list
      val append : 'a list -> 'a list -> 'a list
      val rev_append : 'a list -> 'a list -> 'a list
      val concat : 'a list list -> 'a list
      val flatten : 'a list list -> 'a list
      val iter : f:('-> unit) -> 'a list -> unit
      val iteri : f:(int -> '-> unit) -> 'a list -> unit
      val map : f:('-> 'b) -> 'a list -> 'b list
      val mapi : f:(int -> '-> 'b) -> 'a list -> 'b list
      val rev_map : f:('-> 'b) -> 'a list -> 'b list
      val fold_left : f:('-> '-> 'a) -> init:'-> 'b list -> 'a
      val fold_right : f:('-> '-> 'b) -> 'a list -> init:'-> 'b
      val iter2 : f:('-> '-> unit) -> 'a list -> 'b list -> unit
      val map2 : f:('-> '-> 'c) -> 'a list -> 'b list -> 'c list
      val rev_map2 : f:('-> '-> 'c) -> 'a list -> 'b list -> 'c list
      val fold_left2 :
        f:('-> '-> '-> 'a) -> init:'-> 'b list -> 'c list -> 'a
      val fold_right2 :
        f:('-> '-> '-> 'c) -> 'a list -> 'b list -> init:'-> 'c
      val for_all : f:('-> bool) -> 'a list -> bool
      val exists : f:('-> bool) -> 'a list -> bool
      val for_all2 : f:('-> '-> bool) -> 'a list -> 'b list -> bool
      val exists2 : f:('-> '-> bool) -> 'a list -> 'b list -> bool
      val mem : '-> set:'a list -> bool
      val memq : '-> set:'a list -> bool
      val find : f:('-> bool) -> 'a list -> 'a
      val filter : f:('-> bool) -> 'a list -> 'a list
      val find_all : f:('-> bool) -> 'a list -> 'a list
      val partition : f:('-> bool) -> 'a list -> 'a list * 'a list
      val assoc : '-> ('a * 'b) list -> 'b
      val assq : '-> ('a * 'b) list -> 'b
      val mem_assoc : '-> map:('a * 'b) list -> bool
      val mem_assq : '-> map:('a * 'b) list -> bool
      val remove_assoc : '-> ('a * 'b) list -> ('a * 'b) list
      val remove_assq : '-> ('a * 'b) list -> ('a * 'b) list
      val split : ('a * 'b) list -> 'a list * 'b list
      val combine : 'a list -> 'b list -> ('a * 'b) list
      val sort : cmp:('-> '-> int) -> 'a list -> 'a list
      val stable_sort : cmp:('-> '-> int) -> 'a list -> 'a list
      val fast_sort : cmp:('-> '-> int) -> 'a list -> 'a list
      val merge : cmp:('-> '-> int) -> 'a list -> 'a list -> 'a list
    end
  module Map :
    sig
      module type OrderedType = sig type t val compare : t -> t -> int end
      module type S =
        sig
          type key
          type +'a t
          val empty : 'a t
          val is_empty : 'a t -> bool
          val mem : key -> 'a t -> bool
          val add : key -> '-> 'a t -> 'a t
          val singleton : key -> '-> 'a t
          val remove : key -> 'a t -> 'a t
          val merge :
            (key -> 'a option -> 'b option -> 'c option) ->
            'a t -> 'b t -> 'c t
          val compare : ('-> '-> int) -> 'a t -> 'a t -> int
          val equal : ('-> '-> bool) -> 'a t -> 'a t -> bool
          val iter : (key -> '-> unit) -> 'a t -> unit
          val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
          val for_all : (key -> '-> bool) -> 'a t -> bool
          val exists : (key -> '-> bool) -> 'a t -> bool
          val filter : (key -> '-> bool) -> 'a t -> 'a t
          val partition : (key -> '-> bool) -> 'a t -> 'a t * 'a t
          val cardinal : 'a t -> int
          val bindings : 'a t -> (key * 'a) list
          val min_binding : 'a t -> key * 'a
          val max_binding : 'a t -> key * 'a
          val choose : 'a t -> key * 'a
          val split : key -> 'a t -> 'a t * 'a option * 'a t
          val find : key -> 'a t -> 'a
          val map : ('-> 'b) -> 'a t -> 'b t
          val mapi : (key -> '-> 'b) -> 'a t -> 'b t
        end
      module Make :
        functor (Ord : OrderedType->
          sig
            type key = Ord.t
            type 'a t = 'Map.Make(Ord).t
            val empty : 'a t
            val is_empty : 'a t -> bool
            val mem : key -> 'a t -> bool
            val add : key -> '-> 'a t -> 'a t
            val singleton : key -> '-> 'a t
            val remove : key -> 'a t -> 'a t
            val merge :
              (key -> 'a option -> 'b option -> 'c option) ->
              'a t -> 'b t -> 'c t
            val compare : ('-> '-> int) -> 'a t -> 'a t -> int
            val equal : ('-> '-> bool) -> 'a t -> 'a t -> bool
            val iter : (key -> '-> unit) -> 'a t -> unit
            val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
            val for_all : (key -> '-> bool) -> 'a t -> bool
            val exists : (key -> '-> bool) -> 'a t -> bool
            val filter : (key -> '-> bool) -> 'a t -> 'a t
            val partition : (key -> '-> bool) -> 'a t -> 'a t * 'a t
            val cardinal : 'a t -> int
            val bindings : 'a t -> (key * 'a) list
            val min_binding : 'a t -> key * 'a
            val max_binding : 'a t -> key * 'a
            val choose : 'a t -> key * 'a
            val split : key -> 'a t -> 'a t * 'a option * 'a t
            val find : key -> 'a t -> 'a
            val map : ('-> 'b) -> 'a t -> 'b t
            val mapi : (key -> '-> 'b) -> 'a t -> 'b t
          end
    end
  module Marshal :
    sig
      type extern_flags =
        Marshal.extern_flags =
          No_sharing
        | Closures
        | Compat_32
      val to_channel : out_channel -> '-> extern_flags list -> unit
      external to_string : '-> extern_flags list -> string
        = "caml_output_value_to_string"
      val to_buffer : string -> int -> int -> '-> extern_flags list -> int
      val from_channel : in_channel -> 'a
      val from_string : string -> int -> 'a
      val header_size : int
      val data_size : string -> int -> int
      val total_size : string -> int -> int
    end
  module MoreLabels :
    sig
      module Hashtbl :
        sig
          type ('a, 'b) t = ('a, 'b) Hashtbl.t
          val create : ?random:bool -> int -> ('a, 'b) t
          val clear : ('a, 'b) t -> unit
          val reset : ('a, 'b) t -> unit
          val copy : ('a, 'b) t -> ('a, 'b) t
          val add : ('a, 'b) t -> key:'-> data:'-> unit
          val find : ('a, 'b) t -> '-> 'b
          val find_all : ('a, 'b) t -> '-> 'b list
          val mem : ('a, 'b) t -> '-> bool
          val remove : ('a, 'b) t -> '-> unit
          val replace : ('a, 'b) t -> key:'-> data:'-> unit
          val iter : f:(key:'-> data:'-> unit) -> ('a, 'b) t -> unit
          val fold :
            f:(key:'-> data:'-> '-> 'c) -> ('a, 'b) t -> init:'-> 'c
          val length : ('a, 'b) t -> int
          val randomize : unit -> unit
          type statistics = Hashtbl.statistics
          val stats : ('a, 'b) t -> statistics
          module type HashedType = Hashtbl.HashedType
          module type SeededHashedType = Hashtbl.SeededHashedType
          module type S =
            sig
              type key
              and 'a t
              val create : int -> 'a t
              val clear : 'a t -> unit
              val reset : 'a t -> unit
              val copy : 'a t -> 'a t
              val add : 'a t -> key:key -> data:'-> unit
              val remove : 'a t -> key -> unit
              val find : 'a t -> key -> 'a
              val find_all : 'a t -> key -> 'a list
              val replace : 'a t -> key:key -> data:'-> unit
              val mem : 'a t -> key -> bool
              val iter : f:(key:key -> data:'-> unit) -> 'a t -> unit
              val fold :
                f:(key:key -> data:'-> '-> 'b) -> 'a t -> init:'-> 'b
              val length : 'a t -> int
              val stats : 'a t -> statistics
            end
          module type SeededS =
            sig
              type key
              and 'a t
              val create : ?random:bool -> int -> 'a t
              val clear : 'a t -> unit
              val reset : 'a t -> unit
              val copy : 'a t -> 'a t
              val add : 'a t -> key:key -> data:'-> unit
              val remove : 'a t -> key -> unit
              val find : 'a t -> key -> 'a
              val find_all : 'a t -> key -> 'a list
              val replace : 'a t -> key:key -> data:'-> unit
              val mem : 'a t -> key -> bool
              val iter : f:(key:key -> data:'-> unit) -> 'a t -> unit
              val fold :
                f:(key:key -> data:'-> '-> 'b) -> 'a t -> init:'-> 'b
              val length : 'a t -> int
              val stats : 'a t -> statistics
            end
          module Make :
            functor (H : HashedType->
              sig
                type key = H.t
                and 'a t = 'MoreLabels.Hashtbl.Make(H).t
                val create : int -> 'a t
                val clear : 'a t -> unit
                val reset : 'a t -> unit
                val copy : 'a t -> 'a t
                val add : 'a t -> key:key -> data:'-> unit
                val remove : 'a t -> key -> unit
                val find : 'a t -> key -> 'a
                val find_all : 'a t -> key -> 'a list
                val replace : 'a t -> key:key -> data:'-> unit
                val mem : 'a t -> key -> bool
                val iter : f:(key:key -> data:'-> unit) -> 'a t -> unit
                val fold :
                  f:(key:key -> data:'-> '-> 'b) -> 'a t -> init:'-> 'b
                val length : 'a t -> int
                val stats : 'a t -> statistics
              end
          module MakeSeeded :
            functor (H : SeededHashedType->
              sig
                type key = H.t
                and 'a t = 'MoreLabels.Hashtbl.MakeSeeded(H).t
                val create : ?random:bool -> int -> 'a t
                val clear : 'a t -> unit
                val reset : 'a t -> unit
                val copy : 'a t -> 'a t
                val add : 'a t -> key:key -> data:'-> unit
                val remove : 'a t -> key -> unit
                val find : 'a t -> key -> 'a
                val find_all : 'a t -> key -> 'a list
                val replace : 'a t -> key:key -> data:'-> unit
                val mem : 'a t -> key -> bool
                val iter : f:(key:key -> data:'-> unit) -> 'a t -> unit
                val fold :
                  f:(key:key -> data:'-> '-> 'b) -> 'a t -> init:'-> 'b
                val length : 'a t -> int
                val stats : 'a t -> statistics
              end
          val hash : '-> int
          val seeded_hash : int -> '-> int
          val hash_param : int -> int -> '-> int
          val seeded_hash_param : int -> int -> int -> '-> int
        end
      module Map :
        sig
          module type OrderedType = Map.OrderedType
          module type S =
            sig
              type key
              and +'a t
              val empty : 'a t
              val is_empty : 'a t -> bool
              val mem : key -> 'a t -> bool
              val add : key:key -> data:'-> 'a t -> 'a t
              val singleton : key -> '-> 'a t
              val remove : key -> 'a t -> 'a t
              val merge :
                f:(key -> 'a option -> 'b option -> 'c option) ->
                'a t -> 'b t -> 'c t
              val compare : cmp:('-> '-> int) -> 'a t -> 'a t -> int
              val equal : cmp:('-> '-> bool) -> 'a t -> 'a t -> bool
              val iter : f:(key:key -> data:'-> unit) -> 'a t -> unit
              val fold :
                f:(key:key -> data:'-> '-> 'b) -> 'a t -> init:'-> 'b
              val for_all : f:(key -> '-> bool) -> 'a t -> bool
              val exists : f:(key -> '-> bool) -> 'a t -> bool
              val filter : f:(key -> '-> bool) -> 'a t -> 'a t
              val partition : f:(key -> '-> bool) -> 'a t -> 'a t * 'a t
              val cardinal : 'a t -> int
              val bindings : 'a t -> (key * 'a) list
              val min_binding : 'a t -> key * 'a
              val max_binding : 'a t -> key * 'a
              val choose : 'a t -> key * 'a
              val split : key -> 'a t -> 'a t * 'a option * 'a t
              val find : key -> 'a t -> 'a
              val map : f:('-> 'b) -> 'a t -> 'b t
              val mapi : f:(key -> '-> 'b) -> 'a t -> 'b t
            end
          module Make :
            functor (Ord : OrderedType->
              sig
                type key = Ord.t
                and 'a t = 'MoreLabels.Map.Make(Ord).t
                val empty : 'a t
                val is_empty : 'a t -> bool
                val mem : key -> 'a t -> bool
                val add : key:key -> data:'-> 'a t -> 'a t
                val singleton : key -> '-> 'a t
                val remove : key -> 'a t -> 'a t
                val merge :
                  f:(key -> 'a option -> 'b option -> 'c option) ->
                  'a t -> 'b t -> 'c t
                val compare : cmp:('-> '-> int) -> 'a t -> 'a t -> int
                val equal : cmp:('-> '-> bool) -> 'a t -> 'a t -> bool
                val iter : f:(key:key -> data:'-> unit) -> 'a t -> unit
                val fold :
                  f:(key:key -> data:'-> '-> 'b) -> 'a t -> init:'-> 'b
                val for_all : f:(key -> '-> bool) -> 'a t -> bool
                val exists : f:(key -> '-> bool) -> 'a t -> bool
                val filter : f:(key -> '-> bool) -> 'a t -> 'a t
                val partition : f:(key -> '-> bool) -> 'a t -> 'a t * 'a t
                val cardinal : 'a t -> int
                val bindings : 'a t -> (key * 'a) list
                val min_binding : 'a t -> key * 'a
                val max_binding : 'a t -> key * 'a
                val choose : 'a t -> key * 'a
                val split : key -> 'a t -> 'a t * 'a option * 'a t
                val find : key -> 'a t -> 'a
                val map : f:('-> 'b) -> 'a t -> 'b t
                val mapi : f:(key -> '-> 'b) -> 'a t -> 'b t
              end
        end
      module Set :
        sig
          module type OrderedType = Set.OrderedType
          module type S =
            sig
              type elt
              and t
              val empty : t
              val is_empty : t -> bool
              val mem : elt -> t -> bool
              val add : elt -> t -> t
              val singleton : elt -> t
              val remove : elt -> t -> t
              val union : t -> t -> t
              val inter : t -> t -> t
              val diff : t -> t -> t
              val compare : t -> t -> int
              val equal : t -> t -> bool
              val subset : t -> t -> bool
              val iter : f:(elt -> unit) -> t -> unit
              val fold : f:(elt -> '-> 'a) -> t -> init:'-> 'a
              val for_all : f:(elt -> bool) -> t -> bool
              val exists : f:(elt -> bool) -> t -> bool
              val filter : f:(elt -> bool) -> t -> t
              val partition : f:(elt -> bool) -> t -> t * t
              val cardinal : t -> int
              val elements : t -> elt list
              val min_elt : t -> elt
              val max_elt : t -> elt
              val choose : t -> elt
              val split : elt -> t -> t * bool * t
              val find : elt -> t -> elt
            end
          module Make :
            functor (Ord : OrderedType->
              sig
                type elt = Ord.t
                and t = MoreLabels.Set.Make(Ord).t
                val empty : t
                val is_empty : t -> bool
                val mem : elt -> t -> bool
                val add : elt -> t -> t
                val singleton : elt -> t
                val remove : elt -> t -> t
                val union : t -> t -> t
                val inter : t -> t -> t
                val diff : t -> t -> t
                val compare : t -> t -> int
                val equal : t -> t -> bool
                val subset : t -> t -> bool
                val iter : f:(elt -> unit) -> t -> unit
                val fold : f:(elt -> '-> 'a) -> t -> init:'-> 'a
                val for_all : f:(elt -> bool) -> t -> bool
                val exists : f:(elt -> bool) -> t -> bool
                val filter : f:(elt -> bool) -> t -> t
                val partition : f:(elt -> bool) -> t -> t * t
                val cardinal : t -> int
                val elements : t -> elt list
                val min_elt : t -> elt
                val max_elt : t -> elt
                val choose : t -> elt
                val split : elt -> t -> t * bool * t
                val find : elt -> t -> elt
              end
        end
    end
  module Nativeint :
    sig
      val zero : nativeint
      val one : nativeint
      val minus_one : nativeint
      external neg : nativeint -> nativeint = "%nativeint_neg"
      external add : nativeint -> nativeint -> nativeint = "%nativeint_add"
      external sub : nativeint -> nativeint -> nativeint = "%nativeint_sub"
      external mul : nativeint -> nativeint -> nativeint = "%nativeint_mul"
      external div : nativeint -> nativeint -> nativeint = "%nativeint_div"
      external rem : nativeint -> nativeint -> nativeint = "%nativeint_mod"
      val succ : nativeint -> nativeint
      val pred : nativeint -> nativeint
      val abs : nativeint -> nativeint
      val size : int
      val max_int : nativeint
      val min_int : nativeint
      external logand : nativeint -> nativeint -> nativeint
        = "%nativeint_and"
      external logor : nativeint -> nativeint -> nativeint = "%nativeint_or"
      external logxor : nativeint -> nativeint -> nativeint
        = "%nativeint_xor"
      val lognot : nativeint -> nativeint
      external shift_left : nativeint -> int -> nativeint = "%nativeint_lsl"
      external shift_right : nativeint -> int -> nativeint = "%nativeint_asr"
      external shift_right_logical : nativeint -> int -> nativeint
        = "%nativeint_lsr"
      external of_int : int -> nativeint = "%nativeint_of_int"
      external to_int : nativeint -> int = "%nativeint_to_int"
      external of_float : float -> nativeint = "caml_nativeint_of_float"
      external to_float : nativeint -> float = "caml_nativeint_to_float"
      external of_int32 : int32 -> nativeint = "%nativeint_of_int32"
      external to_int32 : nativeint -> int32 = "%nativeint_to_int32"
      external of_string : string -> nativeint = "caml_nativeint_of_string"
      val to_string : nativeint -> string
      type t = nativeint
      val compare : t -> t -> int
      external format : string -> nativeint -> string
        = "caml_nativeint_format"
    end
  module Oo :
    sig
      val copy : (< .. > as 'a) -> 'a
      external id : < .. > -> int = "%field1"
      val new_method : string -> CamlinternalOO.tag
      val public_method_label : string -> CamlinternalOO.tag
    end
  module Parsing :
    sig
      val symbol_start : unit -> int
      val symbol_end : unit -> int
      val rhs_start : int -> int
      val rhs_end : int -> int
      val symbol_start_pos : unit -> Lexing.position
      val symbol_end_pos : unit -> Lexing.position
      val rhs_start_pos : int -> Lexing.position
      val rhs_end_pos : int -> Lexing.position
      val clear_parser : unit -> unit
      exception Parse_error
      val set_trace : bool -> bool
      type parser_env = Parsing.parser_env
      type parse_tables =
        Parsing.parse_tables = {
        actions : (parser_env -> Obj.t) array;
        transl_const : int array;
        transl_block : int array;
        lhs : string;
        len : string;
        defred : string;
        dgoto : string;
        sindex : string;
        rindex : string;
        gindex : string;
        tablesize : int;
        table : string;
        check : string;
        error_function : string -> unit;
        names_const : string;
        names_block : string;
      }
      exception YYexit of Obj.t
      val yyparse :
        parse_tables -> int -> (Lexing.lexbuf -> 'a) -> Lexing.lexbuf -> 'b
      val peek_val : parser_env -> int -> 'a
      val is_current_lookahead : '-> bool
      val parse_error : string -> unit
    end
  module Pervasives :
    sig
      external raise : exn -> 'a = "%raise"
      val invalid_arg : string -> 'a
      val failwith : string -> 'a
      exception Exit
      external ( = ) : '-> '-> bool = "%equal"
      external ( <> ) : '-> '-> bool = "%notequal"
      external ( < ) : '-> '-> bool = "%lessthan"
      external ( > ) : '-> '-> bool = "%greaterthan"
      external ( <= ) : '-> '-> bool = "%lessequal"
      external ( >= ) : '-> '-> bool = "%greaterequal"
      external compare : '-> '-> int = "%compare"
      val min : '-> '-> 'a
      val max : '-> '-> 'a
      external ( == ) : '-> '-> bool = "%eq"
      external ( != ) : '-> '-> bool = "%noteq"
      external not : bool -> bool = "%boolnot"
      external ( && ) : bool -> bool -> bool = "%sequand"
      external ( & ) : bool -> bool -> bool = "%sequand"
      external ( || ) : bool -> bool -> bool = "%sequor"
      external ( or ) : bool -> bool -> bool = "%sequor"
      external ( |> ) : '-> ('-> 'b) -> 'b = "%revapply"
      external ( @@ ) : ('-> 'b) -> '-> 'b = "%apply"
      external ( ~- ) : int -> int = "%negint"
      external ( ~+ ) : int -> int = "%identity"
      external succ : int -> int = "%succint"
      external pred : int -> int = "%predint"
      external ( + ) : int -> int -> int = "%addint"
      external ( - ) : int -> int -> int = "%subint"
      external ( * ) : int -> int -> int = "%mulint"
      external ( / ) : int -> int -> int = "%divint"
      external ( mod ) : int -> int -> int = "%modint"
      val abs : int -> int
      val max_int : int
      val min_int : int
      external ( land ) : int -> int -> int = "%andint"
      external ( lor ) : int -> int -> int = "%orint"
      external ( lxor ) : int -> int -> int = "%xorint"
      val lnot : int -> int
      external ( lsl ) : int -> int -> int = "%lslint"
      external ( lsr ) : int -> int -> int = "%lsrint"
      external ( asr ) : int -> int -> int = "%asrint"
      external ( ~-. ) : float -> float = "%negfloat"
      external ( ~+. ) : float -> float = "%identity"
      external ( +. ) : float -> float -> float = "%addfloat"
      external ( -. ) : float -> float -> float = "%subfloat"
      external ( *. ) : float -> float -> float = "%mulfloat"
      external ( /. ) : float -> float -> float = "%divfloat"
      external ( ** ) : float -> float -> float = "caml_power_float" "pow"
        "float"
      external sqrt : float -> float = "caml_sqrt_float" "sqrt" "float"
      external exp : float -> float = "caml_exp_float" "exp" "float"
      external log : float -> float = "caml_log_float" "log" "float"
      external log10 : float -> float = "caml_log10_float" "log10" "float"
      external expm1 : float -> float = "caml_expm1_float" "caml_expm1"
        "float"
      external log1p : float -> float = "caml_log1p_float" "caml_log1p"
        "float"
      external cos : float -> float = "caml_cos_float" "cos" "float"
      external sin : float -> float = "caml_sin_float" "sin" "float"
      external tan : float -> float = "caml_tan_float" "tan" "float"
      external acos : float -> float = "caml_acos_float" "acos" "float"
      external asin : float -> float = "caml_asin_float" "asin" "float"
      external atan : float -> float = "caml_atan_float" "atan" "float"
      external atan2 : float -> float -> float = "caml_atan2_float" "atan2"
        "float"
      external hypot : float -> float -> float = "caml_hypot_float"
        "caml_hypot" "float"
      external cosh : float -> float = "caml_cosh_float" "cosh" "float"
      external sinh : float -> float = "caml_sinh_float" "sinh" "float"
      external tanh : float -> float = "caml_tanh_float" "tanh" "float"
      external ceil : float -> float = "caml_ceil_float" "ceil" "float"
      external floor : float -> float = "caml_floor_float" "floor" "float"
      external abs_float : float -> float = "%absfloat"
      external copysign : float -> float -> float = "caml_copysign_float"
        "caml_copysign" "float"
      external mod_float : float -> float -> float = "caml_fmod_float" "fmod"
        "float"
      external frexp : float -> float * int = "caml_frexp_float"
      external ldexp : float -> int -> float = "caml_ldexp_float"
      external modf : float -> float * float = "caml_modf_float"
      external float : int -> float = "%floatofint"
      external float_of_int : int -> float = "%floatofint"
      external truncate : float -> int = "%intoffloat"
      external int_of_float : float -> int = "%intoffloat"
      val infinity : float
      val neg_infinity : float
      val nan : float
      val max_float : float
      val min_float : float
      val epsilon_float : float
      type fpclass =
        fpclass =
          FP_normal
        | FP_subnormal
        | FP_zero
        | FP_infinite
        | FP_nan
      external classify_float : float -> fpclass = "caml_classify_float"
      val ( ^ ) : string -> string -> string
      external int_of_char : char -> int = "%identity"
      val char_of_int : int -> char
      external ignore : '-> unit = "%ignore"
      val string_of_bool : bool -> string
      val bool_of_string : string -> bool
      val string_of_int : int -> string
      external int_of_string : string -> int = "caml_int_of_string"
      val string_of_float : float -> string
      external float_of_string : string -> float = "caml_float_of_string"
      external fst : 'a * '-> 'a = "%field0"
      external snd : 'a * '-> 'b = "%field1"
      val ( @ ) : 'a list -> 'a list -> 'a list
      type in_channel = in_channel
      type out_channel = out_channel
      val stdin : in_channel
      val stdout : out_channel
      val stderr : out_channel
      val print_char : char -> unit
      val print_string : string -> unit
      val print_int : int -> unit
      val print_float : float -> unit
      val print_endline : string -> unit
      val print_newline : unit -> unit
      val prerr_char : char -> unit
      val prerr_string : string -> unit
      val prerr_int : int -> unit
      val prerr_float : float -> unit
      val prerr_endline : string -> unit
      val prerr_newline : unit -> unit
      val read_line : unit -> string
      val read_int : unit -> int
      val read_float : unit -> float
      type open_flag =
        open_flag =
          Open_rdonly
        | Open_wronly
        | Open_append
        | Open_creat
        | Open_trunc
        | Open_excl
        | Open_binary
        | Open_text
        | Open_nonblock
      val open_out : string -> out_channel
      val open_out_bin : string -> out_channel
      val open_out_gen : open_flag list -> int -> string -> out_channel
      val flush : out_channel -> unit
      val flush_all : unit -> unit
      val output_char : out_channel -> char -> unit
      val output_string : out_channel -> string -> unit
      val output : out_channel -> string -> int -> int -> unit
      val output_byte : out_channel -> int -> unit
      val output_binary_int : out_channel -> int -> unit
      val output_value : out_channel -> '-> unit
      val seek_out : out_channel -> int -> unit
      val pos_out : out_channel -> int
      val out_channel_length : out_channel -> int
      val close_out : out_channel -> unit
      val close_out_noerr : out_channel -> unit
      val set_binary_mode_out : out_channel -> bool -> unit
      val open_in : string -> in_channel
      val open_in_bin : string -> in_channel
      val open_in_gen : open_flag list -> int -> string -> in_channel
      val input_char : in_channel -> char
      val input_line : in_channel -> string
      val input : in_channel -> string -> int -> int -> int
      val really_input : in_channel -> string -> int -> int -> unit
      val input_byte : in_channel -> int
      val input_binary_int : in_channel -> int
      val input_value : in_channel -> 'a
      val seek_in : in_channel -> int -> unit
      val pos_in : in_channel -> int
      val in_channel_length : in_channel -> int
      val close_in : in_channel -> unit
      val close_in_noerr : in_channel -> unit
      val set_binary_mode_in : in_channel -> bool -> unit
      module LargeFile :
        sig
          val seek_out : out_channel -> int64 -> unit
          val pos_out : out_channel -> int64
          val out_channel_length : out_channel -> int64
          val seek_in : in_channel -> int64 -> unit
          val pos_in : in_channel -> int64
          val in_channel_length : in_channel -> int64
        end
      type 'a ref = 'a ref = { mutable contents : 'a; }
      external ref : '-> 'a ref = "%makemutable"
      external ( ! ) : 'a ref -> 'a = "%field0"
      external ( := ) : 'a ref -> '-> unit = "%setfield0"
      external incr : int ref -> unit = "%incr"
      external decr : int ref -> unit = "%decr"
      type ('a, 'b, 'c, 'd) format4 = ('a, 'b, 'c, 'c, 'c, 'd) format6
      type ('a, 'b, 'c) format = ('a, 'b, 'c, 'c) format4
      val string_of_format : ('a, 'b, 'c, 'd, 'e, 'f) format6 -> string
      external format_of_string :
        ('a, 'b, 'c, 'd, 'e, 'f) format6 -> ('a, 'b, 'c, 'd, 'e, 'f) format6
        = "%identity"
      val ( ^^ ) :
        ('a, 'b, 'c, 'd, 'e, 'f) format6 ->
        ('f, 'b, 'c, 'e, 'g, 'h) format6 -> ('a, 'b, 'c, 'd, 'g, 'h) format6
      val exit : int -> 'a
      val at_exit : (unit -> unit) -> unit
      val valid_float_lexem : string -> string
      val unsafe_really_input : in_channel -> string -> int -> int -> unit
      val do_at_exit : unit -> unit
    end
  module Printexc :
    sig
      val to_string : exn -> string
      val print : ('-> 'b) -> '-> 'b
      val catch : ('-> 'b) -> '-> 'b
      val print_backtrace : out_channel -> unit
      val get_backtrace : unit -> string
      val record_backtrace : bool -> unit
      val backtrace_status : unit -> bool
      val register_printer : (exn -> string option) -> unit
      type raw_backtrace = Printexc.raw_backtrace
      val get_raw_backtrace : unit -> raw_backtrace
      val print_raw_backtrace : out_channel -> raw_backtrace -> unit
      val raw_backtrace_to_string : raw_backtrace -> string
      val get_callstack : int -> raw_backtrace
    end
  module Printf :
    sig
      val fprintf : out_channel -> ('a, out_channel, unit) format -> 'a
      val printf : ('a, out_channel, unit) format -> 'a
      val eprintf : ('a, out_channel, unit) format -> 'a
      val sprintf : ('a, unit, string) format -> 'a
      val bprintf : Buffer.t -> ('a, Buffer.t, unit) format -> 'a
      val ifprintf : '-> ('b, 'a, unit) format -> 'b
      val kfprintf :
        (out_channel -> 'a) ->
        out_channel -> ('b, out_channel, unit, 'a) format4 -> 'b
      val ikfprintf :
        (out_channel -> 'a) ->
        out_channel -> ('b, out_channel, unit, 'a) format4 -> 'b
      val ksprintf : (string -> 'a) -> ('b, unit, string, 'a) format4 -> 'b
      val kbprintf :
        (Buffer.t -> 'a) ->
        Buffer.t -> ('b, Buffer.t, unit, 'a) format4 -> 'b
      val kprintf : (string -> 'a) -> ('b, unit, string, 'a) format4 -> 'b
      module CamlinternalPr :
        sig
          module Sformat :
            sig
              type index = Printf.CamlinternalPr.Sformat.index
              val index_of_int : int -> index
              external int_of_index : index -> int = "%identity"
              external unsafe_index_of_int : int -> index = "%identity"
              val succ_index : index -> index
              val add_int_index : int -> index -> index
              val sub :
                ('a, 'b, 'c, 'd, 'e, 'f) format6 -> index -> int -> string
              val to_string : ('a, 'b, 'c, 'd, 'e, 'f) format6 -> string
              external length : ('a, 'b, 'c, 'd, 'e, 'f) format6 -> int
                = "%string_length"
              external get : ('a, 'b, 'c, 'd, 'e, 'f) format6 -> int -> char
                = "%string_safe_get"
              external unsafe_to_string :
                ('a, 'b, 'c, 'd, 'e, 'f) format6 -> string = "%identity"
              external unsafe_get :
                ('a, 'b, 'c, 'd, 'e, 'f) format6 -> int -> char
                = "%string_unsafe_get"
            end
          module Tformat :
            sig
              type ac =
                Printf.CamlinternalPr.Tformat.ac = {
                mutable ac_rglr : int;
                mutable ac_skip : int;
                mutable ac_rdrs : int;
              }
              val ac_of_format : ('a, 'b, 'c, 'd, 'e, 'f) format6 -> ac
              val count_printing_arguments_of_format :
                ('a, 'b, 'c, 'd, 'e, 'f) format6 -> int
              val sub_format :
                (('a, 'b, 'c, 'd, 'e, 'f) format6 -> int) ->
                (('a, 'b, 'c, 'd, 'e, 'f) format6 -> int -> char -> int) ->
                char -> ('a, 'b, 'c, 'd, 'e, 'f) format6 -> int -> int
              val summarize_format_type :
                ('a, 'b, 'c, 'd, 'e, 'f) format6 -> string
              val scan_format :
                ('a, 'b, 'c, 'd, 'e, 'f) format6 ->
                'g array ->
                Sformat.index ->
                int ->
                (Sformat.index -> string -> int -> 'h) ->
                (Sformat.index -> '-> '-> int -> 'h) ->
                (Sformat.index -> '-> int -> 'h) ->
                (Sformat.index -> int -> 'h) ->
                (Sformat.index ->
                 ('l, 'm, 'n, 'o, 'p, 'q) format6 -> int -> 'h) ->
                'h
              val kapr :
                (('a, 'b, 'c, 'd, 'e, 'f) format6 -> Obj.t array -> 'g) ->
                ('a, 'b, 'c, 'd, 'e, 'f) format6 -> 'g
            end
        end
    end
  module Queue :
    sig
      type 'a t = 'Queue.t
      exception Empty
      val create : unit -> 'a t
      val add : '-> 'a t -> unit
      val push : '-> 'a t -> unit
      val take : 'a t -> 'a
      val pop : 'a t -> 'a
      val peek : 'a t -> 'a
      val top : 'a t -> 'a
      val clear : 'a t -> unit
      val copy : 'a t -> 'a t
      val is_empty : 'a t -> bool
      val length : 'a t -> int
      val iter : ('-> unit) -> 'a t -> unit
      val fold : ('-> '-> 'b) -> '-> 'a t -> 'b
      val transfer : 'a t -> 'a t -> unit
    end
  module Random :
    sig
      val init : int -> unit
      val full_init : int array -> unit
      val self_init : unit -> unit
      val bits : unit -> int
      val int : int -> int
      val int32 : Int32.t -> Int32.t
      val nativeint : Nativeint.t -> Nativeint.t
      val int64 : Int64.t -> Int64.t
      val float : float -> float
      val bool : unit -> bool
      module State :
        sig
          type t = Random.State.t
          val make : int array -> t
          val make_self_init : unit -> t
          val copy : t -> t
          val bits : t -> int
          val int : t -> int -> int
          val int32 : t -> Int32.t -> Int32.t
          val nativeint : t -> Nativeint.t -> Nativeint.t
          val int64 : t -> Int64.t -> Int64.t
          val float : t -> float -> float
          val bool : t -> bool
        end
      val get_state : unit -> State.t
      val set_state : State.t -> unit
    end
  module Scanf :
    sig
      module Scanning :
        sig
          type in_channel = Scanf.Scanning.in_channel
          type scanbuf = in_channel
          val stdin : in_channel
          type file_name = string
          val open_in : file_name -> in_channel
          val open_in_bin : file_name -> in_channel
          val close_in : in_channel -> unit
          val from_file : file_name -> in_channel
          val from_file_bin : string -> in_channel
          val from_string : string -> in_channel
          val from_function : (unit -> char) -> in_channel
          val from_channel : in_channel -> in_channel
          val end_of_input : in_channel -> bool
          val beginning_of_input : in_channel -> bool
          val name_of_input : in_channel -> string
          val stdib : in_channel
        end
      type ('a, 'b, 'c, 'd) scanner =
          ('a, Scanning.in_channel, 'b, 'c, '-> 'd, 'd) format6 -> 'c
      exception Scan_failure of string
      val bscanf : Scanning.in_channel -> ('a, 'b, 'c, 'd) scanner
      val fscanf : in_channel -> ('a, 'b, 'c, 'd) scanner
      val sscanf : string -> ('a, 'b, 'c, 'd) scanner
      val scanf : ('a, 'b, 'c, 'd) scanner
      val kscanf :
        Scanning.in_channel ->
        (Scanning.in_channel -> exn -> 'd) -> ('a, 'b, 'c, 'd) scanner
      val bscanf_format :
        Scanning.in_channel ->
        ('a, 'b, 'c, 'd, 'e, 'f) format6 ->
        (('a, 'b, 'c, 'd, 'e, 'f) format6 -> 'g) -> 'g
      val sscanf_format :
        string ->
        ('a, 'b, 'c, 'd, 'e, 'f) format6 ->
        (('a, 'b, 'c, 'd, 'e, 'f) format6 -> 'g) -> 'g
      val format_from_string :
        string ->
        ('a, 'b, 'c, 'd, 'e, 'f) format6 -> ('a, 'b, 'c, 'd, 'e, 'f) format6
      val unescaped : string -> string
    end
  module Set :
    sig
      module type OrderedType = sig type t val compare : t -> t -> int end
      module type S =
        sig
          type elt
          type t
          val empty : t
          val is_empty : t -> bool
          val mem : elt -> t -> bool
          val add : elt -> t -> t
          val singleton : elt -> t
          val remove : elt -> t -> t
          val union : t -> t -> t
          val inter : t -> t -> t
          val diff : t -> t -> t
          val compare : t -> t -> int
          val equal : t -> t -> bool
          val subset : t -> t -> bool
          val iter : (elt -> unit) -> t -> unit
          val fold : (elt -> '-> 'a) -> t -> '-> 'a
          val for_all : (elt -> bool) -> t -> bool
          val exists : (elt -> bool) -> t -> bool
          val filter : (elt -> bool) -> t -> t
          val partition : (elt -> bool) -> t -> t * t
          val cardinal : t -> int
          val elements : t -> elt list
          val min_elt : t -> elt
          val max_elt : t -> elt
          val choose : t -> elt
          val split : elt -> t -> t * bool * t
          val find : elt -> t -> elt
        end
      module Make :
        functor (Ord : OrderedType->
          sig
            type elt = Ord.t
            type t = Set.Make(Ord).t
            val empty : t
            val is_empty : t -> bool
            val mem : elt -> t -> bool
            val add : elt -> t -> t
            val singleton : elt -> t
            val remove : elt -> t -> t
            val union : t -> t -> t
            val inter : t -> t -> t
            val diff : t -> t -> t
            val compare : t -> t -> int
            val equal : t -> t -> bool
            val subset : t -> t -> bool
            val iter : (elt -> unit) -> t -> unit
            val fold : (elt -> '-> 'a) -> t -> '-> 'a
            val for_all : (elt -> bool) -> t -> bool
            val exists : (elt -> bool) -> t -> bool
            val filter : (elt -> bool) -> t -> t
            val partition : (elt -> bool) -> t -> t * t
            val cardinal : t -> int
            val elements : t -> elt list
            val min_elt : t -> elt
            val max_elt : t -> elt
            val choose : t -> elt
            val split : elt -> t -> t * bool * t
            val find : elt -> t -> elt
          end
    end
  module Sort :
    sig
      val list : ('-> '-> bool) -> 'a list -> 'a list
      val array : ('-> '-> bool) -> 'a array -> unit
      val merge : ('-> '-> bool) -> 'a list -> 'a list -> 'a list
    end
  module Stack :
    sig
      type 'a t = 'Stack.t
      exception Empty
      val create : unit -> 'a t
      val push : '-> 'a t -> unit
      val pop : 'a t -> 'a
      val top : 'a t -> 'a
      val clear : 'a t -> unit
      val copy : 'a t -> 'a t
      val is_empty : 'a t -> bool
      val length : 'a t -> int
      val iter : ('-> unit) -> 'a t -> unit
    end
  module StdLabels :
    sig
      module Array :
        sig
          external length : 'a array -> int = "%array_length"
          external get : 'a array -> int -> 'a = "%array_safe_get"
          external set : 'a array -> int -> '-> unit = "%array_safe_set"
          external make : int -> '-> 'a array = "caml_make_vect"
          external create : int -> '-> 'a array = "caml_make_vect"
          val init : int -> f:(int -> 'a) -> 'a array
          val make_matrix : dimx:int -> dimy:int -> '-> 'a array array
          val create_matrix : dimx:int -> dimy:int -> '-> 'a array array
          val append : 'a array -> 'a array -> 'a array
          val concat : 'a array list -> 'a array
          val sub : 'a array -> pos:int -> len:int -> 'a array
          val copy : 'a array -> 'a array
          val fill : 'a array -> pos:int -> len:int -> '-> unit
          val blit :
            src:'a array ->
            src_pos:int -> dst:'a array -> dst_pos:int -> len:int -> unit
          val to_list : 'a array -> 'a list
          val of_list : 'a list -> 'a array
          val iter : f:('-> unit) -> 'a array -> unit
          val map : f:('-> 'b) -> 'a array -> 'b array
          val iteri : f:(int -> '-> unit) -> 'a array -> unit
          val mapi : f:(int -> '-> 'b) -> 'a array -> 'b array
          val fold_left : f:('-> '-> 'a) -> init:'-> 'b array -> 'a
          val fold_right : f:('-> '-> 'b) -> 'a array -> init:'-> 'b
          val sort : cmp:('-> '-> int) -> 'a array -> unit
          val stable_sort : cmp:('-> '-> int) -> 'a array -> unit
          val fast_sort : cmp:('-> '-> int) -> 'a array -> unit
          external unsafe_get : 'a array -> int -> 'a = "%array_unsafe_get"
          external unsafe_set : 'a array -> int -> '-> unit
            = "%array_unsafe_set"
        end
      module List :
        sig
          val length : 'a list -> int
          val hd : 'a list -> 'a
          val tl : 'a list -> 'a list
          val nth : 'a list -> int -> 'a
          val rev : 'a list -> 'a list
          val append : 'a list -> 'a list -> 'a list
          val rev_append : 'a list -> 'a list -> 'a list
          val concat : 'a list list -> 'a list
          val flatten : 'a list list -> 'a list
          val iter : f:('-> unit) -> 'a list -> unit
          val map : f:('-> 'b) -> 'a list -> 'b list
          val rev_map : f:('-> 'b) -> 'a list -> 'b list
          val fold_left : f:('-> '-> 'a) -> init:'-> 'b list -> 'a
          val fold_right : f:('-> '-> 'b) -> 'a list -> init:'-> 'b
          val iter2 : f:('-> '-> unit) -> 'a list -> 'b list -> unit
          val map2 : f:('-> '-> 'c) -> 'a list -> 'b list -> 'c list
          val rev_map2 : f:('-> '-> 'c) -> 'a list -> 'b list -> 'c list
          val fold_left2 :
            f:('-> '-> '-> 'a) -> init:'-> 'b list -> 'c list -> 'a
          val fold_right2 :
            f:('-> '-> '-> 'c) -> 'a list -> 'b list -> init:'-> 'c
          val for_all : f:('-> bool) -> 'a list -> bool
          val exists : f:('-> bool) -> 'a list -> bool
          val for_all2 : f:('-> '-> bool) -> 'a list -> 'b list -> bool
          val exists2 : f:('-> '-> bool) -> 'a list -> 'b list -> bool
          val mem : '-> set:'a list -> bool
          val memq : '-> set:'a list -> bool
          val find : f:('-> bool) -> 'a list -> 'a
          val filter : f:('-> bool) -> 'a list -> 'a list
          val find_all : f:('-> bool) -> 'a list -> 'a list
          val partition : f:('-> bool) -> 'a list -> 'a list * 'a list
          val assoc : '-> ('a * 'b) list -> 'b
          val assq : '-> ('a * 'b) list -> 'b
          val mem_assoc : '-> map:('a * 'b) list -> bool
          val mem_assq : '-> map:('a * 'b) list -> bool
          val remove_assoc : '-> ('a * 'b) list -> ('a * 'b) list
          val remove_assq : '-> ('a * 'b) list -> ('a * 'b) list
          val split : ('a * 'b) list -> 'a list * 'b list
          val combine : 'a list -> 'b list -> ('a * 'b) list
          val sort : cmp:('-> '-> int) -> 'a list -> 'a list
          val stable_sort : cmp:('-> '-> int) -> 'a list -> 'a list
          val fast_sort : cmp:('-> '-> int) -> 'a list -> 'a list
          val merge : cmp:('-> '-> int) -> 'a list -> 'a list -> 'a list
        end
      module String :
        sig
          external length : string -> int = "%string_length"
          external get : string -> int -> char = "%string_safe_get"
          external set : string -> int -> char -> unit = "%string_safe_set"
          external create : int -> string = "caml_create_string"
          val make : int -> char -> string
          val copy : string -> string
          val sub : string -> pos:int -> len:int -> string
          val fill : string -> pos:int -> len:int -> char -> unit
          val blit :
            src:string ->
            src_pos:int -> dst:string -> dst_pos:int -> len:int -> unit
          val concat : sep:string -> string list -> string
          val iter : f:(char -> unit) -> string -> unit
          val iteri : f:(int -> char -> unit) -> string -> unit
          val map : f:(char -> char) -> string -> string
          val trim : string -> string
          val escaped : string -> string
          val index : string -> char -> int
          val rindex : string -> char -> int
          val index_from : string -> int -> char -> int
          val rindex_from : string -> int -> char -> int
          val contains : string -> char -> bool
          val contains_from : string -> int -> char -> bool
          val rcontains_from : string -> int -> char -> bool
          val uppercase : string -> string
          val lowercase : string -> string
          val capitalize : string -> string
          val uncapitalize : string -> string
          type t = string
          val compare : t -> t -> int
          external unsafe_get : string -> int -> char = "%string_unsafe_get"
          external unsafe_set : string -> int -> char -> unit
            = "%string_unsafe_set"
          external unsafe_blit :
            src:string ->
            src_pos:int -> dst:string -> dst_pos:int -> len:int -> unit
            = "caml_blit_string" "noalloc"
          external unsafe_fill : string -> pos:int -> len:int -> char -> unit
            = "caml_fill_string" "noalloc"
        end
    end
  module Stream :
    sig
      type 'a t = 'Stream.t
      exception Failure
      exception Error of string
      val from : (int -> 'a option) -> 'a t
      val of_list : 'a list -> 'a t
      val of_string : string -> char t
      val of_channel : in_channel -> char t
      val iter : ('-> unit) -> 'a t -> unit
      val next : 'a t -> 'a
      val empty : 'a t -> unit
      val peek : 'a t -> 'a option
      val junk : 'a t -> unit
      val count : 'a t -> int
      val npeek : int -> 'a t -> 'a list
      val iapp : 'a t -> 'a t -> 'a t
      val icons : '-> 'a t -> 'a t
      val ising : '-> 'a t
      val lapp : (unit -> 'a t) -> 'a t -> 'a t
      val lcons : (unit -> 'a) -> 'a t -> 'a t
      val lsing : (unit -> 'a) -> 'a t
      val sempty : 'a t
      val slazy : (unit -> 'a t) -> 'a t
      val dump : ('-> unit) -> 'a t -> unit
    end
  module String :
    sig
      external length : string -> int = "%string_length"
      external get : string -> int -> char = "%string_safe_get"
      external set : string -> int -> char -> unit = "%string_safe_set"
      external create : int -> string = "caml_create_string"
      val make : int -> char -> string
      val copy : string -> string
      val sub : string -> int -> int -> string
      val fill : string -> int -> int -> char -> unit
      val blit : string -> int -> string -> int -> int -> unit
      val concat : string -> string list -> string
      val iter : (char -> unit) -> string -> unit
      val iteri : (int -> char -> unit) -> string -> unit
      val map : (char -> char) -> string -> string
      val trim : string -> string
      val escaped : string -> string
      val index : string -> char -> int
      val rindex : string -> char -> int
      val index_from : string -> int -> char -> int
      val rindex_from : string -> int -> char -> int
      val contains : string -> char -> bool
      val contains_from : string -> int -> char -> bool
      val rcontains_from : string -> int -> char -> bool
      val uppercase : string -> string
      val lowercase : string -> string
      val capitalize : string -> string
      val uncapitalize : string -> string
      type t = string
      val compare : t -> t -> int
      external unsafe_get : string -> int -> char = "%string_unsafe_get"
      external unsafe_set : string -> int -> char -> unit
        = "%string_unsafe_set"
      external unsafe_blit : string -> int -> string -> int -> int -> unit
        = "caml_blit_string" "noalloc"
      external unsafe_fill : string -> int -> int -> char -> unit
        = "caml_fill_string" "noalloc"
    end
  module StringLabels :
    sig
      external length : string -> int = "%string_length"
      external get : string -> int -> char = "%string_safe_get"
      external set : string -> int -> char -> unit = "%string_safe_set"
      external create : int -> string = "caml_create_string"
      val make : int -> char -> string
      val copy : string -> string
      val sub : string -> pos:int -> len:int -> string
      val fill : string -> pos:int -> len:int -> char -> unit
      val blit :
        src:string ->
        src_pos:int -> dst:string -> dst_pos:int -> len:int -> unit
      val concat : sep:string -> string list -> string
      val iter : f:(char -> unit) -> string -> unit
      val iteri : f:(int -> char -> unit) -> string -> unit
      val map : f:(char -> char) -> string -> string
      val trim : string -> string
      val escaped : string -> string
      val index : string -> char -> int
      val rindex : string -> char -> int
      val index_from : string -> int -> char -> int
      val rindex_from : string -> int -> char -> int
      val contains : string -> char -> bool
      val contains_from : string -> int -> char -> bool
      val rcontains_from : string -> int -> char -> bool
      val uppercase : string -> string
      val lowercase : string -> string
      val capitalize : string -> string
      val uncapitalize : string -> string
      type t = string
      val compare : t -> t -> int
      external unsafe_get : string -> int -> char = "%string_unsafe_get"
      external unsafe_set : string -> int -> char -> unit
        = "%string_unsafe_set"
      external unsafe_blit :
        src:string ->
        src_pos:int -> dst:string -> dst_pos:int -> len:int -> unit
        = "caml_blit_string" "noalloc"
      external unsafe_fill : string -> pos:int -> len:int -> char -> unit
        = "caml_fill_string" "noalloc"
    end
  module Sys :
    sig
      val argv : string array
      val executable_name : string
      external file_exists : string -> bool = "caml_sys_file_exists"
      external is_directory : string -> bool = "caml_sys_is_directory"
      external remove : string -> unit = "caml_sys_remove"
      external rename : string -> string -> unit = "caml_sys_rename"
      external getenv : string -> string = "caml_sys_getenv"
      external command : string -> int = "caml_sys_system_command"
      external time : unit -> float = "caml_sys_time"
      external chdir : string -> unit = "caml_sys_chdir"
      external getcwd : unit -> string = "caml_sys_getcwd"
      external readdir : string -> string array = "caml_sys_read_directory"
      val interactive : bool ref
      val os_type : string
      val unix : bool
      val win32 : bool
      val cygwin : bool
      val word_size : int
      val big_endian : bool
      val max_string_length : int
      val max_array_length : int
      type signal_behavior =
        Sys.signal_behavior =
          Signal_default
        | Signal_ignore
        | Signal_handle of (int -> unit)
      external signal : int -> signal_behavior -> signal_behavior
        = "caml_install_signal_handler"
      val set_signal : int -> signal_behavior -> unit
      val sigabrt : int
      val sigalrm : int
      val sigfpe : int
      val sighup : int
      val sigill : int
      val sigint : int
      val sigkill : int
      val sigpipe : int
      val sigquit : int
      val sigsegv : int
      val sigterm : int
      val sigusr1 : int
      val sigusr2 : int
      val sigchld : int
      val sigcont : int
      val sigstop : int
      val sigtstp : int
      val sigttin : int
      val sigttou : int
      val sigvtalrm : int
      val sigprof : int
      exception Break
      val catch_break : bool -> unit
      val ocaml_version : string
    end
  module Weak :
    sig
      type 'a t = 'Weak.t
      val create : int -> 'a t
      val length : 'a t -> int
      val set : 'a t -> int -> 'a option -> unit
      val get : 'a t -> int -> 'a option
      val get_copy : 'a t -> int -> 'a option
      val check : 'a t -> int -> bool
      val fill : 'a t -> int -> int -> 'a option -> unit
      val blit : 'a t -> int -> 'a t -> int -> int -> unit
      module type S =
        sig
          type data
          type t
          val create : int -> t
          val clear : t -> unit
          val merge : t -> data -> data
          val add : t -> data -> unit
          val remove : t -> data -> unit
          val find : t -> data -> data
          val find_all : t -> data -> data list
          val mem : t -> data -> bool
          val iter : (data -> unit) -> t -> unit
          val fold : (data -> '-> 'a) -> t -> '-> 'a
          val count : t -> int
          val stats : t -> int * int * int * int * int * int
        end
      module Make :
        functor (H : Hashtbl.HashedType->
          sig
            type data = H.t
            type t = Weak.Make(H).t
            val create : int -> t
            val clear : t -> unit
            val merge : t -> data -> data
            val add : t -> data -> unit
            val remove : t -> data -> unit
            val find : t -> data -> data
            val find_all : t -> data -> data list
            val mem : t -> data -> bool
            val iter : (data -> unit) -> t -> unit
            val fold : (data -> '-> 'a) -> t -> '-> 'a
            val count : t -> int
            val stats : t -> int * int * int * int * int * int
          end
    end
  external raise : exn -> 'a = "%raise"
  val invalid_arg : string -> 'a
  val failwith : string -> 'a
  exception Exit
  external ( = ) : '-> '-> bool = "%equal"
  external ( <> ) : '-> '-> bool = "%notequal"
  external ( < ) : '-> '-> bool = "%lessthan"
  external ( > ) : '-> '-> bool = "%greaterthan"
  external ( <= ) : '-> '-> bool = "%lessequal"
  external ( >= ) : '-> '-> bool = "%greaterequal"
  external compare : '-> '-> int = "%compare"
  val min : '-> '-> 'a
  val max : '-> '-> 'a
  external ( == ) : '-> '-> bool = "%eq"
  external ( != ) : '-> '-> bool = "%noteq"
  external not : bool -> bool = "%boolnot"
  external ( && ) : bool -> bool -> bool = "%sequand"
  external ( & ) : bool -> bool -> bool = "%sequand"
  external ( || ) : bool -> bool -> bool = "%sequor"
  external ( or ) : bool -> bool -> bool = "%sequor"
  external ( |> ) : '-> ('-> 'b) -> 'b = "%revapply"
  external ( @@ ) : ('-> 'b) -> '-> 'b = "%apply"
  external ( ~- ) : int -> int = "%negint"
  external ( ~+ ) : int -> int = "%identity"
  external succ : int -> int = "%succint"
  external pred : int -> int = "%predint"
  external ( + ) : int -> int -> int = "%addint"
  external ( - ) : int -> int -> int = "%subint"
  external ( * ) : int -> int -> int = "%mulint"
  external ( / ) : int -> int -> int = "%divint"
  external ( mod ) : int -> int -> int = "%modint"
  val abs : int -> int
  val max_int : int
  val min_int : int
  external ( land ) : int -> int -> int = "%andint"
  external ( lor ) : int -> int -> int = "%orint"
  external ( lxor ) : int -> int -> int = "%xorint"
  val lnot : int -> int
  external ( lsl ) : int -> int -> int = "%lslint"
  external ( lsr ) : int -> int -> int = "%lsrint"
  external ( asr ) : int -> int -> int = "%asrint"
  external ( ~-. ) : float -> float = "%negfloat"
  external ( ~+. ) : float -> float = "%identity"
  external ( +. ) : float -> float -> float = "%addfloat"
  external ( -. ) : float -> float -> float = "%subfloat"
  external ( *. ) : float -> float -> float = "%mulfloat"
  external ( /. ) : float -> float -> float = "%divfloat"
  external ( ** ) : float -> float -> float = "caml_power_float" "pow"
    "float"
  external sqrt : float -> float = "caml_sqrt_float" "sqrt" "float"
  external exp : float -> float = "caml_exp_float" "exp" "float"
  external log : float -> float = "caml_log_float" "log" "float"
  external log10 : float -> float = "caml_log10_float" "log10" "float"
  external expm1 : float -> float = "caml_expm1_float" "caml_expm1" "float"
  external log1p : float -> float = "caml_log1p_float" "caml_log1p" "float"
  external cos : float -> float = "caml_cos_float" "cos" "float"
  external sin : float -> float = "caml_sin_float" "sin" "float"
  external tan : float -> float = "caml_tan_float" "tan" "float"
  external acos : float -> float = "caml_acos_float" "acos" "float"
  external asin : float -> float = "caml_asin_float" "asin" "float"
  external atan : float -> float = "caml_atan_float" "atan" "float"
  external atan2 : float -> float -> float = "caml_atan2_float" "atan2"
    "float"
  external hypot : float -> float -> float = "caml_hypot_float" "caml_hypot"
    "float"
  external cosh : float -> float = "caml_cosh_float" "cosh" "float"
  external sinh : float -> float = "caml_sinh_float" "sinh" "float"
  external tanh : float -> float = "caml_tanh_float" "tanh" "float"
  external ceil : float -> float = "caml_ceil_float" "ceil" "float"
  external floor : float -> float = "caml_floor_float" "floor" "float"
  external abs_float : float -> float = "%absfloat"
  external copysign : float -> float -> float = "caml_copysign_float"
    "caml_copysign" "float"
  external mod_float : float -> float -> float = "caml_fmod_float" "fmod"
    "float"
  external frexp : float -> float * int = "caml_frexp_float"
  external ldexp : float -> int -> float = "caml_ldexp_float"
  external modf : float -> float * float = "caml_modf_float"
  external float : int -> float = "%floatofint"
  external float_of_int : int -> float = "%floatofint"
  external truncate : float -> int = "%intoffloat"
  external int_of_float : float -> int = "%intoffloat"
  val infinity : float
  val neg_infinity : float
  val nan : float
  val max_float : float
  val min_float : float
  val epsilon_float : float
  type fpclass =
    fpclass =
      FP_normal
    | FP_subnormal
    | FP_zero
    | FP_infinite
    | FP_nan
  external classify_float : float -> fpclass = "caml_classify_float"
  val ( ^ ) : string -> string -> string
  external int_of_char : char -> int = "%identity"
  val char_of_int : int -> char
  external ignore : '-> unit = "%ignore"
  val string_of_bool : bool -> string
  val bool_of_string : string -> bool
  val string_of_int : int -> string
  external int_of_string : string -> int = "caml_int_of_string"
  val string_of_float : float -> string
  external float_of_string : string -> float = "caml_float_of_string"
  external fst : 'a * '-> 'a = "%field0"
  external snd : 'a * '-> 'b = "%field1"
  val ( @ ) : 'a list -> 'a list -> 'a list
  type in_channel = in_channel
  type out_channel = out_channel
  val stdin : in_channel
  val stdout : out_channel
  val stderr : out_channel
  val print_char : char -> unit
  val print_string : string -> unit
  val print_int : int -> unit
  val print_float : float -> unit
  val print_endline : string -> unit
  val print_newline : unit -> unit
  val prerr_char : char -> unit
  val prerr_string : string -> unit
  val prerr_int : int -> unit
  val prerr_float : float -> unit
  val prerr_endline : string -> unit
  val prerr_newline : unit -> unit
  val read_line : unit -> string
  val read_int : unit -> int
  val read_float : unit -> float
  type open_flag =
    open_flag =
      Open_rdonly
    | Open_wronly
    | Open_append
    | Open_creat
    | Open_trunc
    | Open_excl
    | Open_binary
    | Open_text
    | Open_nonblock
  val open_out : string -> out_channel
  val open_out_bin : string -> out_channel
  val open_out_gen : open_flag list -> int -> string -> out_channel
  val flush : out_channel -> unit
  val flush_all : unit -> unit
  val output_char : out_channel -> char -> unit
  val output_string : out_channel -> string -> unit
  val output : out_channel -> string -> int -> int -> unit
  val output_byte : out_channel -> int -> unit
  val output_binary_int : out_channel -> int -> unit
  val output_value : out_channel -> '-> unit
  val seek_out : out_channel -> int -> unit
  val pos_out : out_channel -> int
  val out_channel_length : out_channel -> int
  val close_out : out_channel -> unit
  val close_out_noerr : out_channel -> unit
  val set_binary_mode_out : out_channel -> bool -> unit
  val open_in : string -> in_channel
  val open_in_bin : string -> in_channel
  val open_in_gen : open_flag list -> int -> string -> in_channel
  val input_char : in_channel -> char
  val input_line : in_channel -> string
  val input : in_channel -> string -> int -> int -> int
  val really_input : in_channel -> string -> int -> int -> unit
  val input_byte : in_channel -> int
  val input_binary_int : in_channel -> int
  val input_value : in_channel -> 'a
  val seek_in : in_channel -> int -> unit
  val pos_in : in_channel -> int
  val in_channel_length : in_channel -> int
  val close_in : in_channel -> unit
  val close_in_noerr : in_channel -> unit
  val set_binary_mode_in : in_channel -> bool -> unit
  module LargeFile :
    sig
      val seek_out : out_channel -> int64 -> unit
      val pos_out : out_channel -> int64
      val out_channel_length : out_channel -> int64
      val seek_in : in_channel -> int64 -> unit
      val pos_in : in_channel -> int64
      val in_channel_length : in_channel -> int64
    end
  type 'a ref = 'a ref = { mutable contents : 'a; }
  external ref : '-> 'a ref = "%makemutable"
  external ( ! ) : 'a ref -> 'a = "%field0"
  external ( := ) : 'a ref -> '-> unit = "%setfield0"
  external incr : int ref -> unit = "%incr"
  external decr : int ref -> unit = "%decr"
  type ('a, 'b, 'c, 'd) format4 = ('a, 'b, 'c, 'c, 'c, 'd) format6
  type ('a, 'b, 'c) format = ('a, 'b, 'c, 'c) format4
  val string_of_format : ('a, 'b, 'c, 'd, 'e, 'f) format6 -> string
  external format_of_string :
    ('a, 'b, 'c, 'd, 'e, 'f) format6 -> ('a, 'b, 'c, 'd, 'e, 'f) format6
    = "%identity"
  val ( ^^ ) :
    ('a, 'b, 'c, 'd, 'e, 'f) format6 ->
    ('f, 'b, 'c, 'e, 'g, 'h) format6 -> ('a, 'b, 'c, 'd, 'g, 'h) format6
  val exit : int -> 'a
  val at_exit : (unit -> unit) -> unit
  val valid_float_lexem : string -> string
  val unsafe_really_input : in_channel -> string -> int -> int -> unit
  val do_at_exit : unit -> unit
  module Condition :
    sig
      type t = Condition.t
      val create : unit -> t
      val wait : t -> Mutex.t -> unit
      val signal : t -> unit
      val broadcast : t -> unit
    end
  module Mutex :
    sig
      type t = Mutex.t
      val create : unit -> t
      val lock : t -> unit
      val try_lock : t -> bool
      val unlock : t -> unit
    end
  module Thread :
    sig
      type t = Thread.t
      val create : ('-> 'b) -> '-> t
      val self : unit -> t
      val id : t -> int
      val exit : unit -> unit
      val kill : t -> unit
      val delay : float -> unit
      val join : t -> unit
      val wait_read : Unix.file_descr -> unit
      val wait_write : Unix.file_descr -> unit
      val wait_timed_read : Unix.file_descr -> float -> bool
      val wait_timed_write : Unix.file_descr -> float -> bool
      val select :
        Unix.file_descr list ->
        Unix.file_descr list ->
        Unix.file_descr list ->
        float ->
        Unix.file_descr list * Unix.file_descr list * Unix.file_descr list
      val wait_pid : int -> int * Unix.process_status
      val yield : unit -> unit
      val sigmask : Unix.sigprocmask_command -> int list -> int list
      val wait_signal : int list -> int
    end
  module Unix :
    sig
      type error =
        Unix.error =
          E2BIG
        | EACCES
        | EAGAIN
        | EBADF
        | EBUSY
        | ECHILD
        | EDEADLK
        | EDOM
        | EEXIST
        | EFAULT
        | EFBIG
        | EINTR
        | EINVAL
        | EIO
        | EISDIR
        | EMFILE
        | EMLINK
        | ENAMETOOLONG
        | ENFILE
        | ENODEV
        | ENOENT
        | ENOEXEC
        | ENOLCK
        | ENOMEM
        | ENOSPC
        | ENOSYS
        | ENOTDIR
        | ENOTEMPTY
        | ENOTTY
        | ENXIO
        | EPERM
        | EPIPE
        | ERANGE
        | EROFS
        | ESPIPE
        | ESRCH
        | EXDEV
        | EWOULDBLOCK
        | EINPROGRESS
        | EALREADY
        | ENOTSOCK
        | EDESTADDRREQ
        | EMSGSIZE
        | EPROTOTYPE
        | ENOPROTOOPT
        | EPROTONOSUPPORT
        | ESOCKTNOSUPPORT
        | EOPNOTSUPP
        | EPFNOSUPPORT
        | EAFNOSUPPORT
        | EADDRINUSE
        | EADDRNOTAVAIL
        | ENETDOWN
        | ENETUNREACH
        | ENETRESET
        | ECONNABORTED
        | ECONNRESET
        | ENOBUFS
        | EISCONN
        | ENOTCONN
        | ESHUTDOWN
        | ETOOMANYREFS
        | ETIMEDOUT
        | ECONNREFUSED
        | EHOSTDOWN
        | EHOSTUNREACH
        | ELOOP
        | EOVERFLOW
        | EUNKNOWNERR of int
      exception Unix_error of error * string * string
      val error_message : error -> string
      val handle_unix_error : ('-> 'b) -> '-> 'b
      val environment : unit -> string array
      val getenv : string -> string
      val putenv : string -> string -> unit
      type process_status =
        Unix.process_status =
          WEXITED of int
        | WSIGNALED of int
        | WSTOPPED of int
      type wait_flag = Unix.wait_flag = WNOHANG | WUNTRACED
      val execv : string -> string array -> 'a
      val execve : string -> string array -> string array -> 'a
      val execvp : string -> string array -> 'a
      val execvpe : string -> string array -> string array -> 'a
      val fork : unit -> int
      val wait : unit -> int * process_status
      val waitpid : wait_flag list -> int -> int * process_status
      val system : string -> process_status
      val getpid : unit -> int
      val getppid : unit -> int
      val nice : int -> int
      type file_descr = Unix.file_descr
      val stdin : file_descr
      val stdout : file_descr
      val stderr : file_descr
      type open_flag =
        Unix.open_flag =
          O_RDONLY
        | O_WRONLY
        | O_RDWR
        | O_NONBLOCK
        | O_APPEND
        | O_CREAT
        | O_TRUNC
        | O_EXCL
        | O_NOCTTY
        | O_DSYNC
        | O_SYNC
        | O_RSYNC
        | O_SHARE_DELETE
        | O_CLOEXEC
      type file_perm = int
      val openfile : string -> open_flag list -> file_perm -> file_descr
      val close : file_descr -> unit
      val read : file_descr -> string -> int -> int -> int
      val write : file_descr -> string -> int -> int -> int
      val single_write : file_descr -> string -> int -> int -> int
      val in_channel_of_descr : file_descr -> in_channel
      val out_channel_of_descr : file_descr -> out_channel
      val descr_of_in_channel : in_channel -> file_descr
      val descr_of_out_channel : out_channel -> file_descr
      type seek_command = Unix.seek_command = SEEK_SET | SEEK_CUR | SEEK_END
      val lseek : file_descr -> int -> seek_command -> int
      val truncate : string -> int -> unit
      val ftruncate : file_descr -> int -> unit
      type file_kind =
        Unix.file_kind =
          S_REG
        | S_DIR
        | S_CHR
        | S_BLK
        | S_LNK
        | S_FIFO
        | S_SOCK
      type stats =
        Unix.stats = {
        st_dev : int;
        st_ino : int;
        st_kind : file_kind;
        st_perm : file_perm;
        st_nlink : int;
        st_uid : int;
        st_gid : int;
        st_rdev : int;
        st_size : int;
        st_atime : float;
        st_mtime : float;
        st_ctime : float;
      }
      val stat : string -> stats
      val lstat : string -> stats
      val fstat : file_descr -> stats
      val isatty : file_descr -> bool
      module LargeFile :
        sig
          val lseek : file_descr -> int64 -> seek_command -> int64
          val truncate : string -> int64 -> unit
          val ftruncate : file_descr -> int64 -> unit
          type stats =
            Unix.LargeFile.stats = {
            st_dev : int;
            st_ino : int;
            st_kind : file_kind;
            st_perm : file_perm;
            st_nlink : int;
            st_uid : int;
            st_gid : int;
            st_rdev : int;
            st_size : int64;
            st_atime : float;
            st_mtime : float;
            st_ctime : float;
          }
          val stat : string -> stats
          val lstat : string -> stats
          val fstat : file_descr -> stats
        end
      val unlink : string -> unit
      val rename : string -> string -> unit
      val link : string -> string -> unit
      type access_permission =
        Unix.access_permission =
          R_OK
        | W_OK
        | X_OK
        | F_OK
      val chmod : string -> file_perm -> unit
      val fchmod : file_descr -> file_perm -> unit
      val chown : string -> int -> int -> unit
      val fchown : file_descr -> int -> int -> unit
      val umask : int -> int
      val access : string -> access_permission list -> unit
      val dup : file_descr -> file_descr
      val dup2 : file_descr -> file_descr -> unit
      val set_nonblock : file_descr -> unit
      val clear_nonblock : file_descr -> unit
      val set_close_on_exec : file_descr -> unit
      val clear_close_on_exec : file_descr -> unit
      val mkdir : string -> file_perm -> unit
      val rmdir : string -> unit
      val chdir : string -> unit
      val getcwd : unit -> string
      val chroot : string -> unit
      type dir_handle = Unix.dir_handle
      val opendir : string -> dir_handle
      val readdir : dir_handle -> string
      val rewinddir : dir_handle -> unit
      val closedir : dir_handle -> unit
      val pipe : unit -> file_descr * file_descr
      val mkfifo : string -> file_perm -> unit
      val create_process :
        string ->
        string array -> file_descr -> file_descr -> file_descr -> int
      val create_process_env :
        string ->
        string array ->
        string array -> file_descr -> file_descr -> file_descr -> int
      val open_process_in : string -> in_channel
      val open_process_out : string -> out_channel
      val open_process : string -> in_channel * out_channel
      val open_process_full :
        string -> string array -> in_channel * out_channel * in_channel
      val close_process_in : in_channel -> process_status
      val close_process_out : out_channel -> process_status
      val close_process : in_channel * out_channel -> process_status
      val close_process_full :
        in_channel * out_channel * in_channel -> process_status
      val symlink : string -> string -> unit
      val readlink : string -> string
      val select :
        file_descr list ->
        file_descr list ->
        file_descr list ->
        float -> file_descr list * file_descr list * file_descr list
      type lock_command =
        Unix.lock_command =
          F_ULOCK
        | F_LOCK
        | F_TLOCK
        | F_TEST
        | F_RLOCK
        | F_TRLOCK
      val lockf : file_descr -> lock_command -> int -> unit
      val kill : int -> int -> unit
      type sigprocmask_command =
        Unix.sigprocmask_command =
          SIG_SETMASK
        | SIG_BLOCK
        | SIG_UNBLOCK
      val sigprocmask : sigprocmask_command -> int list -> int list
      val sigpending : unit -> int list
      val sigsuspend : int list -> unit
      val pause : unit -> unit
      type process_times =
        Unix.process_times = {
        tms_utime : float;
        tms_stime : float;
        tms_cutime : float;
        tms_cstime : float;
      }
      type tm =
        Unix.tm = {
        tm_sec : int;
        tm_min : int;
        tm_hour : int;
        tm_mday : int;
        tm_mon : int;
        tm_year : int;
        tm_wday : int;
        tm_yday : int;
        tm_isdst : bool;
      }
      val time : unit -> float
      val gettimeofday : unit -> float
      val gmtime : float -> tm
      val localtime : float -> tm
      val mktime : tm -> float * tm
      val alarm : int -> int
      val sleep : int -> unit
      val times : unit -> process_times
      val utimes : string -> float -> float -> unit
      type interval_timer =
        Unix.interval_timer =
          ITIMER_REAL
        | ITIMER_VIRTUAL
        | ITIMER_PROF
      type interval_timer_status =
        Unix.interval_timer_status = {
        it_interval : float;
        it_value : float;
      }
      val getitimer : interval_timer -> interval_timer_status
      val setitimer :
        interval_timer -> interval_timer_status -> interval_timer_status
      val getuid : unit -> int
      val geteuid : unit -> int
      val setuid : int -> unit
      val getgid : unit -> int
      val getegid : unit -> int
      val setgid : int -> unit
      val getgroups : unit -> int array
      val setgroups : int array -> unit
      val initgroups : string -> int -> unit
      type passwd_entry =
        Unix.passwd_entry = {
        pw_name : string;
        pw_passwd : string;
        pw_uid : int;
        pw_gid : int;
        pw_gecos : string;
        pw_dir : string;
        pw_shell : string;
      }
      type group_entry =
        Unix.group_entry = {
        gr_name : string;
        gr_passwd : string;
        gr_gid : int;
        gr_mem : string array;
      }
      val getlogin : unit -> string
      val getpwnam : string -> passwd_entry
      val getgrnam : string -> group_entry
      val getpwuid : int -> passwd_entry
      val getgrgid : int -> group_entry
      type inet_addr = Unix.inet_addr
      val inet_addr_of_string : string -> inet_addr
      val string_of_inet_addr : inet_addr -> string
      val inet_addr_any : inet_addr
      val inet_addr_loopback : inet_addr
      val inet6_addr_any : inet_addr
      val inet6_addr_loopback : inet_addr
      type socket_domain = Unix.socket_domain = PF_UNIX | PF_INET | PF_INET6
      type socket_type =
        Unix.socket_type =
          SOCK_STREAM
        | SOCK_DGRAM
        | SOCK_RAW
        | SOCK_SEQPACKET
      type sockaddr =
        Unix.sockaddr =
          ADDR_UNIX of string
        | ADDR_INET of inet_addr * int
      val socket : socket_domain -> socket_type -> int -> file_descr
      val domain_of_sockaddr : sockaddr -> socket_domain
      val socketpair :
        socket_domain -> socket_type -> int -> file_descr * file_descr
      val accept : file_descr -> file_descr * sockaddr
      val bind : file_descr -> sockaddr -> unit
      val connect : file_descr -> sockaddr -> unit
      val listen : file_descr -> int -> unit
      type shutdown_command =
        Unix.shutdown_command =
          SHUTDOWN_RECEIVE
        | SHUTDOWN_SEND
        | SHUTDOWN_ALL
      val shutdown : file_descr -> shutdown_command -> unit
      val getsockname : file_descr -> sockaddr
      val getpeername : file_descr -> sockaddr
      type msg_flag = Unix.msg_flag = MSG_OOB | MSG_DONTROUTE | MSG_PEEK
      val recv : file_descr -> string -> int -> int -> msg_flag list -> int
      val recvfrom :
        file_descr -> string -> int -> int -> msg_flag list -> int * sockaddr
      val send : file_descr -> string -> int -> int -> msg_flag list -> int
      val sendto :
        file_descr ->
        string -> int -> int -> msg_flag list -> sockaddr -> int
      type socket_bool_option =
        Unix.socket_bool_option =
          SO_DEBUG
        | SO_BROADCAST
        | SO_REUSEADDR
        | SO_KEEPALIVE
        | SO_DONTROUTE
        | SO_OOBINLINE
        | SO_ACCEPTCONN
        | TCP_NODELAY
        | IPV6_ONLY
      type socket_int_option =
        Unix.socket_int_option =
          SO_SNDBUF
        | SO_RCVBUF
        | SO_ERROR
        | SO_TYPE
        | SO_RCVLOWAT
        | SO_SNDLOWAT
      type socket_optint_option = Unix.socket_optint_option = SO_LINGER
      type socket_float_option =
        Unix.socket_float_option =
          SO_RCVTIMEO
        | SO_SNDTIMEO
      val getsockopt : file_descr -> socket_bool_option -> bool
      val setsockopt : file_descr -> socket_bool_option -> bool -> unit
      val getsockopt_int : file_descr -> socket_int_option -> int
      val setsockopt_int : file_descr -> socket_int_option -> int -> unit
      val getsockopt_optint :
        file_descr -> socket_optint_option -> int option
      val setsockopt_optint :
        file_descr -> socket_optint_option -> int option -> unit
      val getsockopt_float : file_descr -> socket_float_option -> float
      val setsockopt_float :
        file_descr -> socket_float_option -> float -> unit
      val getsockopt_error : file_descr -> error option
      val open_connection : sockaddr -> in_channel * out_channel
      val shutdown_connection : in_channel -> unit
      val establish_server :
        (in_channel -> out_channel -> unit) -> sockaddr -> unit
      type host_entry =
        Unix.host_entry = {
        h_name : string;
        h_aliases : string array;
        h_addrtype : socket_domain;
        h_addr_list : inet_addr array;
      }
      type protocol_entry =
        Unix.protocol_entry = {
        p_name : string;
        p_aliases : string array;
        p_proto : int;
      }
      type service_entry =
        Unix.service_entry = {
        s_name : string;
        s_aliases : string array;
        s_port : int;
        s_proto : string;
      }
      val gethostname : unit -> string
      val gethostbyname : string -> host_entry
      val gethostbyaddr : inet_addr -> host_entry
      val getprotobyname : string -> protocol_entry
      val getprotobynumber : int -> protocol_entry
      val getservbyname : string -> string -> service_entry
      val getservbyport : int -> string -> service_entry
      type addr_info =
        Unix.addr_info = {
        ai_family : socket_domain;
        ai_socktype : socket_type;
        ai_protocol : int;
        ai_addr : sockaddr;
        ai_canonname : string;
      }
      type getaddrinfo_option =
        Unix.getaddrinfo_option =
          AI_FAMILY of socket_domain
        | AI_SOCKTYPE of socket_type
        | AI_PROTOCOL of int
        | AI_NUMERICHOST
        | AI_CANONNAME
        | AI_PASSIVE
      val getaddrinfo :
        string -> string -> getaddrinfo_option list -> addr_info list
      type name_info =
        Unix.name_info = {
        ni_hostname : string;
        ni_service : string;
      }
      type getnameinfo_option =
        Unix.getnameinfo_option =
          NI_NOFQDN
        | NI_NUMERICHOST
        | NI_NAMEREQD
        | NI_NUMERICSERV
        | NI_DGRAM
      val getnameinfo : sockaddr -> getnameinfo_option list -> name_info
      type terminal_io =
        Unix.terminal_io = {
        mutable c_ignbrk : bool;
        mutable c_brkint : bool;
        mutable c_ignpar : bool;
        mutable c_parmrk : bool;
        mutable c_inpck : bool;
        mutable c_istrip : bool;
        mutable c_inlcr : bool;
        mutable c_igncr : bool;
        mutable c_icrnl : bool;
        mutable c_ixon : bool;
        mutable c_ixoff : bool;
        mutable c_opost : bool;
        mutable c_obaud : int;
        mutable c_ibaud : int;
        mutable c_csize : int;
        mutable c_cstopb : int;
        mutable c_cread : bool;
        mutable c_parenb : bool;
        mutable c_parodd : bool;
        mutable c_hupcl : bool;
        mutable c_clocal : bool;
        mutable c_isig : bool;
        mutable c_icanon : bool;
        mutable c_noflsh : bool;
        mutable c_echo : bool;
        mutable c_echoe : bool;
        mutable c_echok : bool;
        mutable c_echonl : bool;
        mutable c_vintr : char;
        mutable c_vquit : char;
        mutable c_verase : char;
        mutable c_vkill : char;
        mutable c_veof : char;
        mutable c_veol : char;
        mutable c_vmin : int;
        mutable c_vtime : int;
        mutable c_vstart : char;
        mutable c_vstop : char;
      }
      val tcgetattr : file_descr -> terminal_io
      type setattr_when = Unix.setattr_when = TCSANOW | TCSADRAIN | TCSAFLUSH
      val tcsetattr : file_descr -> setattr_when -> terminal_io -> unit
      val tcsendbreak : file_descr -> int -> unit
      val tcdrain : file_descr -> unit
      type flush_queue = Unix.flush_queue = TCIFLUSH | TCOFLUSH | TCIOFLUSH
      val tcflush : file_descr -> flush_queue -> unit
      type flow_action = Unix.flow_action = TCOOFF | TCOON | TCIOFF | TCION
      val tcflow : file_descr -> flow_action -> unit
      val setsid : unit -> int
    end
  module UnixLabels :
    sig
      type error =
        Unix.error =
          E2BIG
        | EACCES
        | EAGAIN
        | EBADF
        | EBUSY
        | ECHILD
        | EDEADLK
        | EDOM
        | EEXIST
        | EFAULT
        | EFBIG
        | EINTR
        | EINVAL
        | EIO
        | EISDIR
        | EMFILE
        | EMLINK
        | ENAMETOOLONG
        | ENFILE
        | ENODEV
        | ENOENT
        | ENOEXEC
        | ENOLCK
        | ENOMEM
        | ENOSPC
        | ENOSYS
        | ENOTDIR
        | ENOTEMPTY
        | ENOTTY
        | ENXIO
        | EPERM
        | EPIPE
        | ERANGE
        | EROFS
        | ESPIPE
        | ESRCH
        | EXDEV
        | EWOULDBLOCK
        | EINPROGRESS
        | EALREADY
        | ENOTSOCK
        | EDESTADDRREQ
        | EMSGSIZE
        | EPROTOTYPE
        | ENOPROTOOPT
        | EPROTONOSUPPORT
        | ESOCKTNOSUPPORT
        | EOPNOTSUPP
        | EPFNOSUPPORT
        | EAFNOSUPPORT
        | EADDRINUSE
        | EADDRNOTAVAIL
        | ENETDOWN
        | ENETUNREACH
        | ENETRESET
        | ECONNABORTED
        | ECONNRESET
        | ENOBUFS
        | EISCONN
        | ENOTCONN
        | ESHUTDOWN
        | ETOOMANYREFS
        | ETIMEDOUT
        | ECONNREFUSED
        | EHOSTDOWN
        | EHOSTUNREACH
        | ELOOP
        | EOVERFLOW
        | EUNKNOWNERR of int
      exception Unix_error of error * string * string
      val error_message : error -> string
      val handle_unix_error : ('-> 'b) -> '-> 'b
      val environment : unit -> string array
      val getenv : string -> string
      val putenv : string -> string -> unit
      type process_status =
        Unix.process_status =
          WEXITED of int
        | WSIGNALED of int
        | WSTOPPED of int
      type wait_flag = Unix.wait_flag = WNOHANG | WUNTRACED
      val execv : prog:string -> args:string array -> 'a
      val execve : prog:string -> args:string array -> env:string array -> 'a
      val execvp : prog:string -> args:string array -> 'a
      val execvpe :
        prog:string -> args:string array -> env:string array -> 'a
      val fork : unit -> int
      val wait : unit -> int * process_status
      val waitpid : mode:wait_flag list -> int -> int * process_status
      val system : string -> process_status
      val getpid : unit -> int
      val getppid : unit -> int
      val nice : int -> int
      type file_descr = Unix.file_descr
      val stdin : file_descr
      val stdout : file_descr
      val stderr : file_descr
      type open_flag =
        Unix.open_flag =
          O_RDONLY
        | O_WRONLY
        | O_RDWR
        | O_NONBLOCK
        | O_APPEND
        | O_CREAT
        | O_TRUNC
        | O_EXCL
        | O_NOCTTY
        | O_DSYNC
        | O_SYNC
        | O_RSYNC
        | O_SHARE_DELETE
        | O_CLOEXEC
      type file_perm = int
      val openfile :
        string -> mode:open_flag list -> perm:file_perm -> file_descr
      val close : file_descr -> unit
      val read : file_descr -> buf:string -> pos:int -> len:int -> int
      val write : file_descr -> buf:string -> pos:int -> len:int -> int
      val single_write :
        file_descr -> buf:string -> pos:int -> len:int -> int
      val in_channel_of_descr : file_descr -> in_channel
      val out_channel_of_descr : file_descr -> out_channel
      val descr_of_in_channel : in_channel -> file_descr
      val descr_of_out_channel : out_channel -> file_descr
      type seek_command = Unix.seek_command = SEEK_SET | SEEK_CUR | SEEK_END
      val lseek : file_descr -> int -> mode:seek_command -> int
      val truncate : string -> len:int -> unit
      val ftruncate : file_descr -> len:int -> unit
      type file_kind =
        Unix.file_kind =
          S_REG
        | S_DIR
        | S_CHR
        | S_BLK
        | S_LNK
        | S_FIFO
        | S_SOCK
      type stats =
        Unix.stats = {
        st_dev : int;
        st_ino : int;
        st_kind : file_kind;
        st_perm : file_perm;
        st_nlink : int;
        st_uid : int;
        st_gid : int;
        st_rdev : int;
        st_size : int;
        st_atime : float;
        st_mtime : float;
        st_ctime : float;
      }
      val stat : string -> stats
      val lstat : string -> stats
      val fstat : file_descr -> stats
      val isatty : file_descr -> bool
      module LargeFile :
        sig
          val lseek : file_descr -> int64 -> mode:seek_command -> int64
          val truncate : string -> len:int64 -> unit
          val ftruncate : file_descr -> len:int64 -> unit
          type stats =
            Unix.LargeFile.stats = {
            st_dev : int;
            st_ino : int;
            st_kind : file_kind;
            st_perm : file_perm;
            st_nlink : int;
            st_uid : int;
            st_gid : int;
            st_rdev : int;
            st_size : int64;
            st_atime : float;
            st_mtime : float;
            st_ctime : float;
          }
          val stat : string -> stats
          val lstat : string -> stats
          val fstat : file_descr -> stats
        end
      val unlink : string -> unit
      val rename : src:string -> dst:string -> unit
      val link : src:string -> dst:string -> unit
      type access_permission =
        Unix.access_permission =
          R_OK
        | W_OK
        | X_OK
        | F_OK
      val chmod : string -> perm:file_perm -> unit
      val fchmod : file_descr -> perm:file_perm -> unit
      val chown : string -> uid:int -> gid:int -> unit
      val fchown : file_descr -> uid:int -> gid:int -> unit
      val umask : int -> int
      val access : string -> perm:access_permission list -> unit
      val dup : file_descr -> file_descr
      val dup2 : src:file_descr -> dst:file_descr -> unit
      val set_nonblock : file_descr -> unit
      val clear_nonblock : file_descr -> unit
      val set_close_on_exec : file_descr -> unit
      val clear_close_on_exec : file_descr -> unit
      val mkdir : string -> perm:file_perm -> unit
      val rmdir : string -> unit
      val chdir : string -> unit
      val getcwd : unit -> string
      val chroot : string -> unit
      type dir_handle = Unix.dir_handle
      val opendir : string -> dir_handle
      val readdir : dir_handle -> string
      val rewinddir : dir_handle -> unit
      val closedir : dir_handle -> unit
      val pipe : unit -> file_descr * file_descr
      val mkfifo : string -> perm:file_perm -> unit
      val create_process :
        prog:string ->
        args:string array ->
        stdin:file_descr -> stdout:file_descr -> stderr:file_descr -> int
      val create_process_env :
        prog:string ->
        args:string array ->
        env:string array ->
        stdin:file_descr -> stdout:file_descr -> stderr:file_descr -> int
      val open_process_in : string -> in_channel
      val open_process_out : string -> out_channel
      val open_process : string -> in_channel * out_channel
      val open_process_full :
        string -> env:string array -> in_channel * out_channel * in_channel
      val close_process_in : in_channel -> process_status
      val close_process_out : out_channel -> process_status
      val close_process : in_channel * out_channel -> process_status
      val close_process_full :
        in_channel * out_channel * in_channel -> process_status
      val symlink : src:string -> dst:string -> unit
      val readlink : string -> string
      val select :
        read:file_descr list ->
        write:file_descr list ->
        except:file_descr list ->
        timeout:float -> file_descr list * file_descr list * file_descr list
      type lock_command =
        Unix.lock_command =
          F_ULOCK
        | F_LOCK
        | F_TLOCK
        | F_TEST
        | F_RLOCK
        | F_TRLOCK
      val lockf : file_descr -> mode:lock_command -> len:int -> unit
      val kill : pid:int -> signal:int -> unit
      type sigprocmask_command =
        Unix.sigprocmask_command =
          SIG_SETMASK
        | SIG_BLOCK
        | SIG_UNBLOCK
      val sigprocmask : mode:sigprocmask_command -> int list -> int list
      val sigpending : unit -> int list
      val sigsuspend : int list -> unit
      val pause : unit -> unit
      type process_times =
        Unix.process_times = {
        tms_utime : float;
        tms_stime : float;
        tms_cutime : float;
        tms_cstime : float;
      }
      type tm =
        Unix.tm = {
        tm_sec : int;
        tm_min : int;
        tm_hour : int;
        tm_mday : int;
        tm_mon : int;
        tm_year : int;
        tm_wday : int;
        tm_yday : int;
        tm_isdst : bool;
      }
      val time : unit -> float
      val gettimeofday : unit -> float
      val gmtime : float -> tm
      val localtime : float -> tm
      val mktime : tm -> float * tm
      val alarm : int -> int
      val sleep : int -> unit
      val times : unit -> process_times
      val utimes : string -> access:float -> modif:float -> unit
      type interval_timer =
        Unix.interval_timer =
          ITIMER_REAL
        | ITIMER_VIRTUAL
        | ITIMER_PROF
      type interval_timer_status =
        Unix.interval_timer_status = {
        it_interval : float;
        it_value : float;
      }
      val getitimer : interval_timer -> interval_timer_status
      val setitimer :
        interval_timer -> interval_timer_status -> interval_timer_status
      val getuid : unit -> int
      val geteuid : unit -> int
      val setuid : int -> unit
      val getgid : unit -> int
      val getegid : unit -> int
      val setgid : int -> unit
      val getgroups : unit -> int array
      val setgroups : int array -> unit
      val initgroups : string -> int -> unit
      type passwd_entry =
        Unix.passwd_entry = {
        pw_name : string;
        pw_passwd : string;
        pw_uid : int;
        pw_gid : int;
        pw_gecos : string;
        pw_dir : string;
        pw_shell : string;
      }
      type group_entry =
        Unix.group_entry = {
        gr_name : string;
        gr_passwd : string;
        gr_gid : int;
        gr_mem : string array;
      }
      val getlogin : unit -> string
      val getpwnam : string -> passwd_entry
      val getgrnam : string -> group_entry
      val getpwuid : int -> passwd_entry
      val getgrgid : int -> group_entry
      type inet_addr = Unix.inet_addr
      val inet_addr_of_string : string -> inet_addr
      val string_of_inet_addr : inet_addr -> string
      val inet_addr_any : inet_addr
      val inet_addr_loopback : inet_addr
      val inet6_addr_any : inet_addr
      val inet6_addr_loopback : inet_addr
      type socket_domain = Unix.socket_domain = PF_UNIX | PF_INET | PF_INET6
      type socket_type =
        Unix.socket_type =
          SOCK_STREAM
        | SOCK_DGRAM
        | SOCK_RAW
        | SOCK_SEQPACKET
      type sockaddr =
        Unix.sockaddr =
          ADDR_UNIX of string
        | ADDR_INET of inet_addr * int
      val socket :
        domain:socket_domain ->
        kind:socket_type -> protocol:int -> file_descr
      val domain_of_sockaddr : sockaddr -> socket_domain
      val socketpair :
        domain:socket_domain ->
        kind:socket_type -> protocol:int -> file_descr * file_descr
      val accept : file_descr -> file_descr * sockaddr
      val bind : file_descr -> addr:sockaddr -> unit
      val connect : file_descr -> addr:sockaddr -> unit
      val listen : file_descr -> max:int -> unit
      type shutdown_command =
        Unix.shutdown_command =
          SHUTDOWN_RECEIVE
        | SHUTDOWN_SEND
        | SHUTDOWN_ALL
      val shutdown : file_descr -> mode:shutdown_command -> unit
      val getsockname : file_descr -> sockaddr
      val getpeername : file_descr -> sockaddr
      type msg_flag = Unix.msg_flag = MSG_OOB | MSG_DONTROUTE | MSG_PEEK
      val recv :
        file_descr ->
        buf:string -> pos:int -> len:int -> mode:msg_flag list -> int
      val recvfrom :
        file_descr ->
        buf:string ->
        pos:int -> len:int -> mode:msg_flag list -> int * sockaddr
      val send :
        file_descr ->
        buf:string -> pos:int -> len:int -> mode:msg_flag list -> int
      val sendto :
        file_descr ->
        buf:string ->
        pos:int -> len:int -> mode:msg_flag list -> addr:sockaddr -> int
      type socket_bool_option =
        UnixLabels.socket_bool_option =
          SO_DEBUG
        | SO_BROADCAST
        | SO_REUSEADDR
        | SO_KEEPALIVE
        | SO_DONTROUTE
        | SO_OOBINLINE
        | SO_ACCEPTCONN
        | TCP_NODELAY
        | IPV6_ONLY
      type socket_int_option =
        UnixLabels.socket_int_option =
          SO_SNDBUF
        | SO_RCVBUF
        | SO_ERROR
        | SO_TYPE
        | SO_RCVLOWAT
        | SO_SNDLOWAT
      type socket_optint_option = UnixLabels.socket_optint_option = SO_LINGER
      type socket_float_option =
        UnixLabels.socket_float_option =
          SO_RCVTIMEO
        | SO_SNDTIMEO
      val getsockopt : file_descr -> socket_bool_option -> bool
      val setsockopt : file_descr -> socket_bool_option -> bool -> unit
      val getsockopt_int : file_descr -> socket_int_option -> int
      val setsockopt_int : file_descr -> socket_int_option -> int -> unit
      val getsockopt_optint :
        file_descr -> socket_optint_option -> int option
      val setsockopt_optint :
        file_descr -> socket_optint_option -> int option -> unit
      val getsockopt_float : file_descr -> socket_float_option -> float
      val setsockopt_float :
        file_descr -> socket_float_option -> float -> unit
      val getsockopt_error : file_descr -> error option
      val open_connection : sockaddr -> in_channel * out_channel
      val shutdown_connection : in_channel -> unit
      val establish_server :
        (in_channel -> out_channel -> unit) -> addr:sockaddr -> unit
      type host_entry =
        Unix.host_entry = {
        h_name : string;
        h_aliases : string array;
        h_addrtype : socket_domain;
        h_addr_list : inet_addr array;
      }
      type protocol_entry =
        Unix.protocol_entry = {
        p_name : string;
        p_aliases : string array;
        p_proto : int;
      }
      type service_entry =
        Unix.service_entry = {
        s_name : string;
        s_aliases : string array;
        s_port : int;
        s_proto : string;
      }
      val gethostname : unit -> string
      val gethostbyname : string -> host_entry
      val gethostbyaddr : inet_addr -> host_entry
      val getprotobyname : string -> protocol_entry
      val getprotobynumber : int -> protocol_entry
      val getservbyname : string -> protocol:string -> service_entry
      val getservbyport : int -> protocol:string -> service_entry
      type addr_info =
        UnixLabels.addr_info = {
        ai_family : socket_domain;
        ai_socktype : socket_type;
        ai_protocol : int;
        ai_addr : sockaddr;
        ai_canonname : string;
      }
      type getaddrinfo_option =
        UnixLabels.getaddrinfo_option =
          AI_FAMILY of socket_domain
        | AI_SOCKTYPE of socket_type
        | AI_PROTOCOL of int
        | AI_NUMERICHOST
        | AI_CANONNAME
        | AI_PASSIVE
      val getaddrinfo :
        string -> string -> getaddrinfo_option list -> addr_info list
      type name_info =
        UnixLabels.name_info = {
        ni_hostname : string;
        ni_service : string;
      }
      type getnameinfo_option =
        UnixLabels.getnameinfo_option =
          NI_NOFQDN
        | NI_NUMERICHOST
        | NI_NAMEREQD
        | NI_NUMERICSERV
        | NI_DGRAM
      val getnameinfo : sockaddr -> getnameinfo_option list -> name_info
      type terminal_io =
        Unix.terminal_io = {
        mutable c_ignbrk : bool;
        mutable c_brkint : bool;
        mutable c_ignpar : bool;
        mutable c_parmrk : bool;
        mutable c_inpck : bool;
        mutable c_istrip : bool;
        mutable c_inlcr : bool;
        mutable c_igncr : bool;
        mutable c_icrnl : bool;
        mutable c_ixon : bool;
        mutable c_ixoff : bool;
        mutable c_opost : bool;
        mutable c_obaud : int;
        mutable c_ibaud : int;
        mutable c_csize : int;
        mutable c_cstopb : int;
        mutable c_cread : bool;
        mutable c_parenb : bool;
        mutable c_parodd : bool;
        mutable c_hupcl : bool;
        mutable c_clocal : bool;
        mutable c_isig : bool;
        mutable c_icanon : bool;
        mutable c_noflsh : bool;
        mutable c_echo : bool;
        mutable c_echoe : bool;
        mutable c_echok : bool;
        mutable c_echonl : bool;
        mutable c_vintr : char;
        mutable c_vquit : char;
        mutable c_verase : char;
        mutable c_vkill : char;
        mutable c_veof : char;
        mutable c_veol : char;
        mutable c_vmin : int;
        mutable c_vtime : int;
        mutable c_vstart : char;
        mutable c_vstop : char;
      }
      val tcgetattr : file_descr -> terminal_io
      type setattr_when = Unix.setattr_when = TCSANOW | TCSADRAIN | TCSAFLUSH
      val tcsetattr : file_descr -> mode:setattr_when -> terminal_io -> unit
      val tcsendbreak : file_descr -> duration:int -> unit
      val tcdrain : file_descr -> unit
      type flush_queue = Unix.flush_queue = TCIFLUSH | TCOFLUSH | TCIOFLUSH
      val tcflush : file_descr -> mode:flush_queue -> unit
      type flow_action = Unix.flow_action = TCOOFF | TCOON | TCIOFF | TCION
      val tcflow : file_descr -> mode:flow_action -> unit
      val setsid : unit -> int
    end
end