anchor.diff:  
       {ok, Series} =
       if
  -        % the amount of higher points that make up one lower point (HigherPoints)
  +        % the amount of higher points that make up one lower point (HigherPointsPerLower)
           % do fit into the higher archive (starting from the current interval/timestamp).
           % this means we can read all required points straight up
           HighFirstOffset < HigherLastOffset ->
               file:read(IO, HigherLastOffset - HighFirstOffset);
           % otherwise we are now basically at the end of the higher archive so that we
  -        % cannot read the required aggregate points (HigherPoints) without exceeding
  +        % cannot read the required aggregate points (HigherPointsPerLower) without exceeding
           % the archive's size.
           % that's why we read until the end of the archive first, followed by the
           % remaining number of required aggregate points from the beginning of the archive
  
positive.code:             Position = get_data_point_offset(Archive, TimeStamp, BaseInterval),
  
              % write data point based on initial data point
              {ok, _} = file:position(IO, {bof, Position}),
              Interval = interval_start(Archive, TimeStamp),
              file:write(IO, data_point(Interval, Value)),
  
              propagate_lower_archives(IO, Header, Interval, Archive, LowerArchives)
      end.
  
negative.code: 
  collect_series_values(Step, Interval, <<TS:32/integer-unsigned-big, Value:64/float-big, Rst/binary>>, Acc, Seen) ->
      if
          % we compare the timestamp of the data point we just read (TS) with
          % the timestamp value we are expecting (Interval)
          % only if these timestamps match up we consider that data point a valid one
          % NOTE: this is *not* an error - the archive may very well contain sparse values
          Interval == TS ->
              collect_series_values(Step, Interval + Step, Rst, [Value | Acc], Seen + 1);
          true ->
  