sig
  module type S =
    sig
      type key
      type img
      type t
      val empty : t
      val is_empty : t -> bool
      val add : key -> img -> t -> t
      val find : key -> t -> img
      val remove : key -> t -> t
      val mem : key -> t -> bool
      val iter : (key -> img -> unit) -> t -> unit
      val map : (img -> img) -> t -> t
      val mapi : (key -> img -> img) -> t -> t
      val fold : (key -> img -> '-> 'a) -> t -> '-> 'a
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val add' : key -> img option -> t -> t
      val find' : key -> t -> img option
      val add_list : (key * img) list -> t -> t
      val to_list : t -> (key * img) list
      val from_list : (key * img) list -> t
      val map_to_list : (key -> img -> 'a) -> t -> 'a list
      val mapi_and_map_to_list : (key -> img -> img * 'a) -> t -> t * 'a list
      val domain : t -> key list
      val fold_two :
        (key -> img option -> img option -> '-> 'a) -> '-> t -> t -> 'a
      val restrict : key list -> t -> t
      val iter_all : ?rev:bool -> (key -> img -> unit) -> t -> unit
      val map_all : ?rev:bool -> (img -> img) -> t -> t
      val mapi_all : ?rev:bool -> (key -> img -> img) -> t -> t
      val fold_all : ?rev:bool -> (key -> img -> '-> 'a) -> t -> '-> 'a
      val to_list_all : ?rev:bool -> t -> (key * img) list
      val compare_all : t -> t -> int
      val equal_all : t -> t -> bool
    end
  module Make :
    functor (Key : OwnMap.OrderedType->
      functor (Img : OwnMap.OrderedType->
        sig
          type key = Key.t
          type img = Img.t
          type t
          val empty : t
          val is_empty : t -> bool
          val add : key -> img -> t -> t
          val find : key -> t -> img
          val remove : key -> t -> t
          val mem : key -> t -> bool
          val iter : (key -> img -> unit) -> t -> unit
          val map : (img -> img) -> t -> t
          val mapi : (key -> img -> img) -> t -> t
          val fold : (key -> img -> '-> 'a) -> t -> '-> 'a
          val compare : t -> t -> int
          val equal : t -> t -> bool
          val add' : key -> img option -> t -> t
          val find' : key -> t -> img option
          val add_list : (key * img) list -> t -> t
          val to_list : t -> (key * img) list
          val from_list : (key * img) list -> t
          val map_to_list : (key -> img -> 'a) -> t -> 'a list
          val mapi_and_map_to_list :
            (key -> img -> img * 'a) -> t -> t * 'a list
          val domain : t -> key list
          val fold_two :
            (key -> img option -> img option -> '-> 'a) ->
            '-> t -> t -> 'a
          val restrict : key list -> t -> t
          val iter_all : ?rev:bool -> (key -> img -> unit) -> t -> unit
          val map_all : ?rev:bool -> (img -> img) -> t -> t
          val mapi_all : ?rev:bool -> (key -> img -> img) -> t -> t
          val fold_all :
            ?rev:bool -> (key -> img -> '-> 'a) -> t -> '-> 'a
          val to_list_all : ?rev:bool -> t -> (key * img) list
          val compare_all : t -> t -> int
          val equal_all : t -> t -> bool
        end
  module type StringOf =
    sig type t val string_of : HistoryMap.StringOf.t -> string end
  module type Custom = sig val sep : string val mapto : string end
  module type S_Str =
    sig
      type key
      type img
      type t
      val empty : t
      val is_empty : t -> bool
      val add : key -> img -> t -> t
      val find : key -> t -> img
      val remove : key -> t -> t
      val mem : key -> t -> bool
      val iter : (key -> img -> unit) -> t -> unit
      val map : (img -> img) -> t -> t
      val mapi : (key -> img -> img) -> t -> t
      val fold : (key -> img -> '-> 'a) -> t -> '-> 'a
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val add' : key -> img option -> t -> t
      val find' : key -> t -> img option
      val add_list : (key * img) list -> t -> t
      val to_list : t -> (key * img) list
      val from_list : (key * img) list -> t
      val map_to_list : (key -> img -> 'a) -> t -> 'a list
      val mapi_and_map_to_list : (key -> img -> img * 'a) -> t -> t * 'a list
      val domain : t -> key list
      val fold_two :
        (key -> img option -> img option -> '-> 'a) -> '-> t -> t -> 'a
      val restrict : key list -> t -> t
      val iter_all : ?rev:bool -> (key -> img -> unit) -> t -> unit
      val map_all : ?rev:bool -> (img -> img) -> t -> t
      val mapi_all : ?rev:bool -> (key -> img -> img) -> t -> t
      val fold_all : ?rev:bool -> (key -> img -> '-> 'a) -> t -> '-> 'a
      val to_list_all : ?rev:bool -> t -> (key * img) list
      val compare_all : t -> t -> int
      val equal_all : t -> t -> bool
      val string_of : t -> string
    end
  module AddString :
    functor (KeyS : StringOf->
      functor (ImgS : StringOf->
        functor (SCustom : Custom->
          functor
            (Map : sig
                     type key = KeyS.t
                     type img = ImgS.t
                     type t
                     val empty : t
                     val is_empty : t -> bool
                     val add : key -> img -> t -> t
                     val find : key -> t -> img
                     val remove : key -> t -> t
                     val mem : key -> t -> bool
                     val iter : (key -> img -> unit) -> t -> unit
                     val map : (img -> img) -> t -> t
                     val mapi : (key -> img -> img) -> t -> t
                     val fold : (key -> img -> '-> 'a) -> t -> '-> 'a
                     val compare : t -> t -> int
                     val equal : t -> t -> bool
                     val add' : key -> img option -> t -> t
                     val find' : key -> t -> img option
                     val add_list : (key * img) list -> t -> t
                     val to_list : t -> (key * img) list
                     val from_list : (key * img) list -> t
                     val map_to_list : (key -> img -> 'a) -> t -> 'a list
                     val mapi_and_map_to_list :
                       (key -> img -> img * 'a) -> t -> t * 'a list
                     val domain : t -> key list
                     val fold_two :
                       (key -> img option -> img option -> '-> 'a) ->
                       '-> t -> t -> 'a
                     val restrict : key list -> t -> t
                     val iter_all :
                       ?rev:bool -> (key -> img -> unit) -> t -> unit
                     val map_all : ?rev:bool -> (img -> img) -> t -> t
                     val mapi_all :
                       ?rev:bool -> (key -> img -> img) -> t -> t
                     val fold_all :
                       ?rev:bool -> (key -> img -> '-> 'a) -> t -> '-> 'a
                     val to_list_all : ?rev:bool -> t -> (key * img) list
                     val compare_all : t -> t -> int
                     val equal_all : t -> t -> bool
                   end->
            sig
              type key = Map.key
              type img = Map.img
              type t
              val empty : t
              val is_empty : t -> bool
              val add : key -> img -> t -> t
              val find : key -> t -> img
              val remove : key -> t -> t
              val mem : key -> t -> bool
              val iter : (key -> img -> unit) -> t -> unit
              val map : (img -> img) -> t -> t
              val mapi : (key -> img -> img) -> t -> t
              val fold : (key -> img -> '-> 'a) -> t -> '-> 'a
              val compare : t -> t -> int
              val equal : t -> t -> bool
              val add' : key -> img option -> t -> t
              val find' : key -> t -> img option
              val add_list : (key * img) list -> t -> t
              val to_list : t -> (key * img) list
              val from_list : (key * img) list -> t
              val map_to_list : (key -> img -> 'a) -> t -> 'a list
              val mapi_and_map_to_list :
                (key -> img -> img * 'a) -> t -> t * 'a list
              val domain : t -> key list
              val fold_two :
                (key -> img option -> img option -> '-> 'a) ->
                '-> t -> t -> 'a
              val restrict : key list -> t -> t
              val iter_all : ?rev:bool -> (key -> img -> unit) -> t -> unit
              val map_all : ?rev:bool -> (img -> img) -> t -> t
              val mapi_all : ?rev:bool -> (key -> img -> img) -> t -> t
              val fold_all :
                ?rev:bool -> (key -> img -> '-> 'a) -> t -> '-> 'a
              val to_list_all : ?rev:bool -> t -> (key * img) list
              val compare_all : t -> t -> int
              val equal_all : t -> t -> bool
              val string_of : t -> string
            end
  module AddS :
    functor (KeyS : StringOf->
      functor (ImgS : StringOf->
        functor
          (Map : sig
                   type key = KeyS.t
                   type img = ImgS.t
                   type t
                   val empty : t
                   val is_empty : t -> bool
                   val add : key -> img -> t -> t
                   val find : key -> t -> img
                   val remove : key -> t -> t
                   val mem : key -> t -> bool
                   val iter : (key -> img -> unit) -> t -> unit
                   val map : (img -> img) -> t -> t
                   val mapi : (key -> img -> img) -> t -> t
                   val fold : (key -> img -> '-> 'a) -> t -> '-> 'a
                   val compare : t -> t -> int
                   val equal : t -> t -> bool
                   val add' : key -> img option -> t -> t
                   val find' : key -> t -> img option
                   val add_list : (key * img) list -> t -> t
                   val to_list : t -> (key * img) list
                   val from_list : (key * img) list -> t
                   val map_to_list : (key -> img -> 'a) -> t -> 'a list
                   val mapi_and_map_to_list :
                     (key -> img -> img * 'a) -> t -> t * 'a list
                   val domain : t -> key list
                   val fold_two :
                     (key -> img option -> img option -> '-> 'a) ->
                     '-> t -> t -> 'a
                   val restrict : key list -> t -> t
                   val iter_all :
                     ?rev:bool -> (key -> img -> unit) -> t -> unit
                   val map_all : ?rev:bool -> (img -> img) -> t -> t
                   val mapi_all : ?rev:bool -> (key -> img -> img) -> t -> t
                   val fold_all :
                     ?rev:bool -> (key -> img -> '-> 'a) -> t -> '-> 'a
                   val to_list_all : ?rev:bool -> t -> (key * img) list
                   val compare_all : t -> t -> int
                   val equal_all : t -> t -> bool
                 end->
          sig
            type key = Map.key
            type img = Map.img
            type t
            val empty : t
            val is_empty : t -> bool
            val add : key -> img -> t -> t
            val find : key -> t -> img
            val remove : key -> t -> t
            val mem : key -> t -> bool
            val iter : (key -> img -> unit) -> t -> unit
            val map : (img -> img) -> t -> t
            val mapi : (key -> img -> img) -> t -> t
            val fold : (key -> img -> '-> 'a) -> t -> '-> 'a
            val compare : t -> t -> int
            val equal : t -> t -> bool
            val add' : key -> img option -> t -> t
            val find' : key -> t -> img option
            val add_list : (key * img) list -> t -> t
            val to_list : t -> (key * img) list
            val from_list : (key * img) list -> t
            val map_to_list : (key -> img -> 'a) -> t -> 'a list
            val mapi_and_map_to_list :
              (key -> img -> img * 'a) -> t -> t * 'a list
            val domain : t -> key list
            val fold_two :
              (key -> img option -> img option -> '-> 'a) ->
              '-> t -> t -> 'a
            val restrict : key list -> t -> t
            val iter_all : ?rev:bool -> (key -> img -> unit) -> t -> unit
            val map_all : ?rev:bool -> (img -> img) -> t -> t
            val mapi_all : ?rev:bool -> (key -> img -> img) -> t -> t
            val fold_all :
              ?rev:bool -> (key -> img -> '-> 'a) -> t -> '-> 'a
            val to_list_all : ?rev:bool -> t -> (key * img) list
            val compare_all : t -> t -> int
            val equal_all : t -> t -> bool
            val string_of : t -> string
          end
end