anchor.diff:  %%  2. IPsIndex has 65536 parts associated with all possible 16-bit IPs
   %%     (from 0.0.*.* to 255.255.*.*). Every part has 4 bytes:
   %%
  -%%  <<BucketStart:16, BucketSize:16>>
  +%%  BucketStart:16, BucketSize:16
   %%
   %%      BucketStart represents the offset of the bucket from PIsBlob associated
   %%      with the target 16-bit IP, and BucketSize represents its size, in bytes.
  
positive.code: %%  1. IPsBlob consists of buckets, each bucket is associated with some
  %%     16-bit IP (M.N.*.*) and contains IP ranges associated with a zone hash:
  %%
  %% <<StartIP_1:8, EndIP_1:8, Zone_1:16, StartIP_2:8, EndIP_2:8, Zone_2:16, ...>>
  %%
  %%      Thus, every IP range uses 4 bytes: 2 bytes for start and end of
  %%      the range and 2 bytes for zone hash.
  
negative.code: split_ips(<<"\n", Rest/binary>>, Acc) ->
      split_ips(Rest, Acc);
  split_ips(<<IP:5/binary, ".0/24;", Rest/binary>>, Acc) ->
      split_ips(Rest, [parse_ip24(IP) | Acc]);
  split_ips(<<IP:6/binary, ".0/24;", Rest/binary>>, Acc) ->
      split_ips(Rest, [parse_ip24(IP) | Acc]);
  split_ips(<<IP:7/binary, ".0/24;", Rest/binary>>, Acc) ->
      split_ips(Rest, [parse_ip24(IP) | Acc]);
  split_ips(<<IP:8/binary, ".0/24;", Rest/binary>>, Acc) ->
      split_ips(Rest, [parse_ip24(IP) | Acc]);
  split_ips(<<IP:9/binary, ".0/24;", Rest/binary>>, Acc) ->
      split_ips(Rest, [parse_ip24(IP) | Acc]);
  split_ips(<<IP:10/binary, ".0/24;", Rest/binary>>, Acc) ->
      split_ips(Rest, [parse_ip24(IP) | Acc]);
  split_ips(<<IP:11/binary, ".0/24;", Rest/binary>>, Acc) ->
      split_ips(Rest, [parse_ip24(IP) | Acc]).
  
  parse_ip24(IP) ->
      [A, B, C] = lists:map(
              fun list_to_integer/1,
              string:tokens(binary_to_list(IP), ".")
  