anchor.diff:  
       // Helper functions
       let skipWhitespace() =
  -      while i < s.Length && (s.[i]=' ' || s.[i]='\t' || s.[i]='\r' || s.[i]='\n') do
  -        i <- i + 1    
  +      while i < s.Length && Char.IsWhiteSpace s.[i] do
  +        i <- i + 1
  +    let decimalSeparator = culture.NumberFormat.NumberDecimalSeparator.ToCharArray() |> Seq.exactlyOne
       let isNumChar c = 
  -      Char.IsDigit c || c='.' || c='e' || c='E' || c='+' || c='-'
  +      Char.IsDigit c || c=decimalSeparator || c='e' || c='E' || c='+' || c='-'
       let throw() = 
         let msg = 
           sprintf 
             "Invalid Json starting at character %d, snippet = \n----\n%s\n-----\njson = \n------\n%s\n-------" 
  -          i (jsonText.[(max 0 (i-10)).. (min (jsonText.Length-1) (i+10))]) jsonText      
  +          i (jsonText.[(max 0 (i-10))..(min (jsonText.Length-1) (i+10))]) jsonText      
         raise <| new Exception(msg)
       let ensure cond = 
         if not cond then throw()  
  
positive.code:     /// (assuming that the value is an object)
      member x.Properties = 
        match x with
        | JsonValue.Object map -> Map.toSeq map
        | _ -> failwithf "JSON mismatch: Not an object - %A" x
  
      /// Try get property of a JSON object. Returns None if the value is not
  
negative.code:     member x.GetProperty(propertyName) = 
        match x with
        | JsonValue.Object properties -> 
            match Map.tryFind propertyName properties with 
            | Some res -> res
            | None -> failwithf "JSON mismatch: Didn't find property '%s' in %A" propertyName x
        | _ -> failwithf "JSON mismatch: Not an object - %A" x
  
    /// Get property of a JSON object (assuming that the value is an object)
    let (?) (jsonObject:JsonValue) propertyName = jsonObject.GetProperty(propertyName)
  