anchor.diff:  
   function StreamToString(const AStream: TStream; const AEncoding: TEncoding = nil): string;
   var
  -  LStreamReader: TStreamReader;
  +  LBytes: TBytes;
     LEncoding: TEncoding;
   begin
     Result := '';
  
positive.code:     LEncoding := TEncoding.Default;
  
    AStream.Position := 0;
    LStreamReader := TStreamReader.Create(AStream, LEncoding);
    try
      Result := LStreamReader.ReadToEnd;
    finally
      LStreamReader.Free;
    end;
  end;
  
  procedure StringToStream(const AStream: TStream; const AString: string; const AEncoding: TEncoding = nil);
  var
    LStreamWriter: TStreamWriter;
    LEncoding: TEncoding;
  begin
    if not Assigned(AStream) then
      Exit;
    LEncoding := AEncoding;
    if not Assigned(LEncoding) then
      LEncoding := TEncoding.Default;
    AStream.Position := 0;
    AStream.Size := 0;
    LStreamWriter := TStreamWriter.Create(AStream, LEncoding);
    try
      LStreamWriter.Write(AString);
    finally
      LStreamWriter.Free;
    end;
  end;
  
  function IsMask(const AString: string): Boolean;
  
negative.code: 
  function StreamToJSONValue(const AStream: TStream; const AEncoding: TEncoding): TJSONValue;
  var
    LEncoding: TEncoding;
    LJSONString: string;
  begin
    LEncoding := AEncoding;
    if not Assigned(LEncoding) then
      LEncoding := TEncoding.Default;
  
    LJSONString := LEncoding.GetString(StreamToBytes(AStream));
    Result := TJSONObject.ParseJSONValue(LJSONString);
  end;
  
  procedure JSONValueToStream(const AValue: TJSONValue; const ADestStream: TStream; const AEncoding: TEncoding);
  