sig
  type win_ref = { win_ref_value : int; }
  val fresh_win_ref : unit -> Browser.Impl.win_ref
  type page_ref = { page_ref_value : int; }
  val fresh_page_ref : unit -> Browser.Impl.page_ref
  type node_ref = { node_ref_value : int; }
  val fresh_node_ref : unit -> Browser.Impl.node_ref
  type act_ref = { act_ref_value : int; }
  val fresh_act_ref : unit -> Browser.Impl.act_ref
  type context = {
    context_win : Browser.Impl.win_ref;
    context_act : Browser.Impl.act_ref;
  }
  type inner =
      Scoped_expr of Browser.Impl.context * Browser.Impl.inner Io.expr
    | R of Browser.Impl.rslt
  and rslt =
      Null_value
    | Bool_value of bool
    | Int_value of int
    | String_value of string
    | Url_value of Io.url
    | Type_value of Io.typ
    | Code_value of Io.void Io.expr
    | Win_value of Browser.Impl.win_ref
    | Node_value of Browser.Impl.node_ref
    | Closure of Browser.Impl.context * Io.var * Io.var list *
        Browser.Impl.inner Io.expr
    | Error of string
  val prim1 : string -> Browser.Impl.rslt -> Browser.Impl.rslt
  val prim2 :
    string -> Browser.Impl.rslt -> Browser.Impl.rslt -> Browser.Impl.rslt
  val to_inner_expr : Io.void Io.expr -> Browser.Impl.inner Io.expr
  type node =
      Para_node of Io.elt_id option * string
    | Link_node of Io.elt_id option * Io.url * string
    | Textbox_node of Io.elt_id option * string * Browser.Impl.rslt list
    | Button_node of Io.elt_id option * string * Browser.Impl.rslt list
    | Inl_script_node of Io.elt_id option * Io.void Io.expr * bool
    | Rem_script_node of Io.elt_id option * Io.url * bool
    | Div_node of Io.elt_id option * Browser.Impl.node_ref list
  type queued_expr =
      Known_expr of Browser.Impl.inner Io.expr
    | Unknown_expr of Browser.Impl.node_ref
  type page = {
    page_location : Io.url;
    page_document : Browser.Impl.node_ref option;
    page_environment : Browser.Impl.act_ref;
    page_script_queue : Browser.Impl.queued_expr list;
  }
  type win_name = No_name | Str_name of string
  type win_opener = No_opener | Win_opener of Browser.Impl.win_ref
  type win = {
    win_name : Browser.Impl.win_name;
    win_opener : Browser.Impl.win_opener;
    win_page : Browser.Impl.page_ref;
  }
  type act = {
    act_parent : Browser.Impl.act_ref option;
    act_vars : (Io.var * Browser.Impl.rslt) list;
  }
  type cookie_id = {
    cookie_id_domain : Domain.domain;
    cookie_id_path : Io.path;
    cookie_id_key : string;
  }
  type dst =
      Xhr_dst of Browser.Impl.page_ref * Browser.Impl.rslt
    | Doc_dst of Browser.Impl.win_ref
    | Script_dst of Browser.Impl.page_ref * Browser.Impl.node_ref
  type b = {
    browser_windows : (Browser.Impl.win_ref * Browser.Impl.win) list;
    browser_pages : (Browser.Impl.page_ref * Browser.Impl.page) list;
    browser_nodes : (Browser.Impl.node_ref * Browser.Impl.node) list;
    browser_environments : (Browser.Impl.act_ref * Browser.Impl.act) list;
    browser_cookies : (Browser.Impl.cookie_id * string) list;
    browser_connections :
      (Domain.domain * Io.req_uri * Browser.Impl.dst) list;
  }
  type task = {
    task_win : Browser.Impl.win_ref;
    task_expr : Browser.Impl.inner Io.expr;
  }
  val upd_assoc : '-> '-> ('a * 'b) list -> ('a * 'b) list
  val find_pos : '-> ('a * 'b) list -> int
  val page_valid : Browser.Impl.page_ref -> Browser.Impl.b -> bool
  val page_assoc :
    Browser.Impl.page_ref -> Browser.Impl.b -> Browser.Impl.page option
  val page_assoc_valid :
    Browser.Impl.page_ref -> Browser.Impl.b -> Browser.Impl.page
  val page_update :
    Browser.Impl.page_ref ->
    Browser.Impl.page -> Browser.Impl.b -> Browser.Impl.b
  val page_new :
    Browser.Impl.page ->
    Browser.Impl.b -> Browser.Impl.page_ref * Browser.Impl.b
  val page_remove : Browser.Impl.page_ref -> Browser.Impl.b -> Browser.Impl.b
  val page_win :
    Browser.Impl.page_ref -> Browser.Impl.b -> Browser.Impl.win_ref option
  val win_valid : Browser.Impl.win_ref -> Browser.Impl.b -> bool
  val win_assoc :
    Browser.Impl.win_ref -> Browser.Impl.b -> Browser.Impl.win option
  val win_assoc_valid :
    Browser.Impl.win_ref -> Browser.Impl.b -> Browser.Impl.win
  val win_update :
    Browser.Impl.win_ref ->
    Browser.Impl.win -> Browser.Impl.b -> Browser.Impl.b
  val win_new :
    Browser.Impl.win ->
    Browser.Impl.b -> Browser.Impl.win_ref * Browser.Impl.b
  val win_remove : Browser.Impl.win_ref -> Browser.Impl.b -> Browser.Impl.b
  val win_from_win_name :
    string -> Browser.Impl.b -> Browser.Impl.win_ref option
  val win_from_user_window :
    Io.user_window -> Browser.Impl.b -> Browser.Impl.win_ref option
  val win_to_user_window :
    Browser.Impl.win_ref -> Browser.Impl.b -> Io.user_window
  val node_valid : Browser.Impl.node_ref -> Browser.Impl.b -> bool
  val node_assoc_valid :
    Browser.Impl.node_ref -> Browser.Impl.b -> Browser.Impl.node
  val node_update :
    Browser.Impl.node_ref ->
    Browser.Impl.node -> Browser.Impl.b -> Browser.Impl.b
  val node_new :
    Browser.Impl.node ->
    Browser.Impl.b -> Browser.Impl.node_ref * Browser.Impl.b
  type node_parent =
      No_parent
    | Page_parent of Browser.Impl.page_ref
    | Parent_node of Browser.Impl.node_ref
  val node_parent :
    Browser.Impl.node_ref -> Browser.Impl.b -> Browser.Impl.node_parent
  val node_page :
    Browser.Impl.node_ref -> Browser.Impl.b -> Browser.Impl.page_ref option
  val act_valid : Browser.Impl.act_ref -> Browser.Impl.b -> bool
  val act_assoc_valid :
    Browser.Impl.act_ref -> Browser.Impl.b -> Browser.Impl.act
  val act_update :
    Browser.Impl.act_ref ->
    Browser.Impl.act -> Browser.Impl.b -> Browser.Impl.b
  val act_new :
    Browser.Impl.act ->
    Browser.Impl.b -> Browser.Impl.act_ref * Browser.Impl.b
  val get_var :
    Io.var ->
    Browser.Impl.act_ref -> Browser.Impl.b -> Browser.Impl.rslt option
  val create_var :
    Io.var ->
    Browser.Impl.rslt ->
    Browser.Impl.act_ref -> Browser.Impl.b -> Browser.Impl.b
  val set_var :
    Io.var ->
    Browser.Impl.rslt ->
    Browser.Impl.act_ref -> Browser.Impl.b -> Browser.Impl.b
  val prefix : 'a list -> 'a list -> bool
  val get_site_cookies :
    Domain.domain -> Io.path -> Browser.Impl.b -> (string * string) list
  val del_site_cookie :
    Domain.domain -> Io.path -> string -> Browser.Impl.b -> Browser.Impl.b
  val del_site_cookies :
    Domain.domain ->
    Io.path -> string list -> Browser.Impl.b -> Browser.Impl.b
  val set_site_cookie :
    Domain.domain ->
    Io.path -> string * string -> Browser.Impl.b -> Browser.Impl.b
  val set_site_cookies :
    Domain.domain ->
    Io.path -> (string * string) list -> Browser.Impl.b -> Browser.Impl.b
  val upd_cookies :
    Domain.domain ->
    Io.req_uri -> Io.resp -> Browser.Impl.b -> Browser.Impl.b
  val net_connection_domain_nth :
    Domain.domain ->
    int -> Browser.Impl.b -> (Io.req_uri * Browser.Impl.dst) option
  val net_connection_domain_remove_nth :
    Domain.domain -> int -> Browser.Impl.b -> Browser.Impl.b
  val http_send :
    Domain.domain ->
    Io.req_uri ->
    string ->
    Browser.Impl.dst -> Browser.Impl.b -> Browser.Impl.b * Io.output_event
  val render_doc_as_list :
    Browser.Impl.node_ref -> Browser.Impl.b -> Io.rendered_doc list
  val render_page :
    Browser.Impl.page_ref -> Browser.Impl.b -> Io.rendered_doc option
  val page_update_event :
    Browser.Impl.page_ref -> Browser.Impl.b -> Io.output_event
  val build_win :
    Browser.Impl.win_name ->
    Io.url ->
    Browser.Impl.win_opener ->
    Browser.Impl.node_ref option ->
    Browser.Impl.b -> Browser.Impl.win * Browser.Impl.b
  val fetch_url :
    Io.url ->
    Browser.Impl.win_ref ->
    Browser.Impl.b -> Browser.Impl.b * Io.output_event list
  val open_win :
    Browser.Impl.win_name ->
    Io.url ->
    Browser.Impl.win_opener ->
    Browser.Impl.b ->
    Browser.Impl.win_ref * Browser.Impl.b * Io.output_event list
  val close_doc_request_connections :
    Browser.Impl.win_ref -> Browser.Impl.b -> Browser.Impl.b
  val direct_win :
    Browser.Impl.win_ref ->
    Io.url -> Browser.Impl.b -> Browser.Impl.b * Io.output_event list
  val build_node_tree :
    Io.doc ->
    Browser.Impl.node_ref * (Browser.Impl.node_ref * Browser.Impl.node) list
  val split_queued_exprs :
    Browser.Impl.queued_expr list ->
    Browser.Impl.inner Io.expr list * Browser.Impl.queued_expr list
  val process_node_scripts_aux :
    Browser.Impl.page_ref ->
    Browser.Impl.node_ref ->
    Browser.Impl.b ->
    Browser.Impl.b * Browser.Impl.queued_expr list * Io.output_event list
  val process_node_scripts_list :
    Browser.Impl.page_ref ->
    Browser.Impl.node_ref list ->
    Browser.Impl.b ->
    Browser.Impl.b * Browser.Impl.queued_expr list * Io.output_event list
  val process_node_scripts :
    Browser.Impl.page_ref ->
    Browser.Impl.node_ref ->
    Browser.Impl.b ->
    Browser.Impl.b * Io.output_event list * Browser.Impl.task list
  val textbox_handlers_in_tree :
    Browser.Impl.node_ref ->
    Browser.Impl.b -> (Browser.Impl.node_ref * Browser.Impl.rslt list) list
  val button_handlers_in_tree :
    Browser.Impl.node_ref ->
    Browser.Impl.b -> (Browser.Impl.node_ref * Browser.Impl.rslt list) list
  val textbox_handlers_in_pos :
    Browser.Impl.win_ref ->
    int ->
    Browser.Impl.b -> (Browser.Impl.node_ref * Browser.Impl.rslt list) option
  val button_handlers_in_pos :
    Browser.Impl.win_ref ->
    int ->
    Browser.Impl.b -> (Browser.Impl.node_ref * Browser.Impl.rslt list) option
  val node_remove :
    Browser.Impl.node_ref ->
    Browser.Impl.b -> Browser.Impl.b * Io.output_event list
  val node_descendents :
    bool ->
    Browser.Impl.node_ref -> Browser.Impl.b -> Browser.Impl.node_ref list
  val insert_in_list : '-> 'a list -> int -> 'a list
  val node_insert :
    Browser.Impl.node_ref ->
    Browser.Impl.node_ref ->
    int ->
    Browser.Impl.b ->
    Browser.Impl.b * Io.output_event list * Browser.Impl.task list
  val rslt_to_elt_it_opt : Browser.Impl.rslt -> Io.elt_id option
  val step_expr :
    Browser.Impl.context ->
    Browser.Impl.b ->
    Browser.Impl.inner Io.expr ->
    Browser.Impl.b * Browser.Impl.inner Io.expr * Io.output_event list *
    Browser.Impl.task list
  type waiting = { waiting_state : Browser.Impl.b; }
  type running = {
    running_state : Browser.Impl.b;
    running_task_queue : Browser.Impl.task list;
  }
  type input_event = Io.input_event
  type output_event = Io.output_event
  type state =
      Waiting of Browser.Impl.waiting
    | Running of Browser.Impl.running
  val start : Browser.Impl.state
  val handle_load_in_new_win_event :
    Browser.Impl.win_opener ->
    Browser.Impl.win_name ->
    Io.url ->
    Browser.Impl.b -> Browser.Impl.state * Browser.Impl.output_event list
  val handle_load_in_win_event :
    Browser.Impl.win_ref ->
    Io.url ->
    Browser.Impl.b -> Browser.Impl.state * Browser.Impl.output_event list
  val handle_close_win_event :
    Browser.Impl.win_ref ->
    Browser.Impl.b -> Browser.Impl.state * Browser.Impl.output_event list
  val handle_input_text_event :
    Browser.Impl.win_ref ->
    int ->
    string ->
    Browser.Impl.b -> Browser.Impl.state * Browser.Impl.output_event list
  val handle_click_button_event :
    Browser.Impl.win_ref ->
    int ->
    Browser.Impl.b -> Browser.Impl.state * Browser.Impl.output_event list
  val get_ready_exprs :
    Browser.Impl.win_ref ->
    Browser.Impl.b -> Browser.Impl.task list * Browser.Impl.b
  val handle_network_response_event :
    Io.net_connection ->
    Io.resp ->
    Browser.Impl.b -> Browser.Impl.state * Browser.Impl.output_event list
  val receive :
    Browser.Impl.input_event ->
    Browser.Impl.waiting ->
    Browser.Impl.state * Browser.Impl.output_event list
  val continue :
    Browser.Impl.running ->
    Browser.Impl.state * Browser.Impl.output_event list
end