functor (J : Parry_common.Job->
  sig
    module JSet :
      sig
        type elt = J.job
        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
    type state = {
      jobs : Parry_server.Server.JSet.t;
      ongoing :
        (string * Cryptokit.RSA.key * J.job * float * float)
        Parry_server.IntMap.t;
      unemployed : float Parry_server.IntMap.t;
      results : J.result;
      newId : int;
      killings : int;
      solved : int;
      authorized_keys : Cryptokit.RSA.key Parry_server.IntMap.t;
      reverse_authorized_keys : int Parry_server.StrMap.t;
    }
    val initial_state :
      J.job list ->
      J.result -> Parry_server.Server.state Pervasives.ref * Mutex.t
    val add_key :
      Parry_server.Server.state Pervasives.ref * Mutex.t ->
      Cryptokit.RSA.key -> unit
    val server : Parry_server.Server.state Pervasives.ref * Mutex.t -> unit
    val webui :
      int -> Parry_server.Server.state Pervasives.ref * Mutex.t -> unit
  end