anchor.diff:                  if not s.Authenticated && (DateTime.Now - s.StartTime).TotalSeconds > 60. then 
                       log Debug "Session %s from %s Timeout." s.SessionID (ipAddress s)
                       s.Close CloseReason.TimeOut)
  +
  +        appServer.add_NewRequestReceived  (RequestHandler<_, _> evtRequest)
  +        appServer.add_NewSessionConnected (SessionHandler<_>    evtLogin  )
  +        appServer.add_SessionClosed       (SessionHandler<_, _> evtLogout )
           let timer = new Timers.Timer 15000.
  -        timer.Elapsed.Add status
  +        timer.Elapsed.Add evtStatus
           timer.Enabled <- true
                   
           base.OnStarted()
positive.code:     member this.CurrentQueueLength with get() = agent.CurrentQueueLength
      member this.post sessionID mbxmsg = agent.Post (sessionID, mbxmsg)
  
  type AntiFloodRule = {RuleId : string; Regex: Regex; Counter: Counter}
  
  type AntiFloodConfig() =
      inherit ConfigurationElement()
      let mutable regex = null
      [<ConfigurationProperty("id"        , IsKey = true , IsRequired = true)>] member this.Id         with get() = base.["id"        ] :?> string and set(value:string) = base.["id"        ] <- value
      [<ConfigurationProperty("subject"   , IsKey = false, IsRequired = true)>] member this.Subject    with get() = base.["subject"   ] :?> string and set(value:string) = base.["subject"   ] <- value
      [<ConfigurationProperty("time"      , IsKey = false, IsRequired = true)>] member this.Time       with get() = base.["time"      ] :?> float  and set(value:float ) = base.["time"      ] <- value
      [<ConfigurationProperty("maxRepeats", IsKey = false, IsRequired = true)>] member this.MaxRepeats with get() = base.["maxRepeats"] :?> int    and set(value:int   ) = base.["maxRepeats"] <- value
      [<ConfigurationProperty("match"     , IsKey = false, IsRequired = true)>] member this.Match      with get() = base.["match"     ] :?> float  and set(value:float ) = base.["match"     ] <- value
      member this.CreateRule() = 
          match regex with null -> regex <- Regex(Regex.Escape(this.Subject).Replace(@"\*", ".*").Replace(@"\?", "."), RegexOptions.Singleline ||| RegexOptions.Compiled) | _ -> ()
          {RuleId = this.Id; Regex = regex; Counter = Counter(this.MaxRepeats, this.Time, this.Match)}
  
negative.code:     override this.GetElementKey(e:ConfigurationElement) = (e :?> AntiFloodConfig).Id :> obj
  
  type AntiFlood() =
      let mutable brokenRule = None
      let agent = MailboxProcessor.Start(fun inbox ->
          let rec loop() = async {
              let! time, rules, msg, cont, stop = inbox.Receive()
              match brokenRule with
              | None ->
                  brokenRule <- rules |> tryFind (fun r -> r.Counter.Update(msg.content, time))
                  match brokenRule with
                  | None      -> cont()
                  | Some rule -> stop rule
  