anchor.diff:  %% Which dictionary to use in the clients.
   -define(RFCS, [rfc3588, rfc6733, rfc4005]).
   
  -%% Whether to decode stringish Diameter types to strings, or leave
  -%% them as binary.
  --define(STRING_DECODES, [false, true]).
  -
   %% Which transport protocol to use.
   -define(TRANSPORTS, [tcp, sctp]).
  -
  -%% Send from a dedicated process?
  --define(SENDERS, [true, false]).
  -
  -%% Message callbacks from diameter_{tcp,sctp}?
  --define(CALLBACKS, [true, false]).
   
   -record(group,
           {transport,
  
positive.code: init_per_group(_) ->
      [{timetrap, {seconds, 30}}].
  
  init_per_group(Name, Config)
    when Name == shuffle;
         Name == parallel ->
      start_services(Config),
      add_transports(Config),
      replace({sleep, Name == parallel}, Config);
  
  init_per_group(sctp = Name, Config) ->
      {_, Sctp} = lists:keyfind(Name, 1, Config),
      if Sctp ->
              Config;
         true ->
              {skip, Name}
      end;
  
  init_per_group(Name, Config) ->
      Nas = proplists:get_value(rfc4005, Config, false),
      case ?util:name(Name) of
          [_,R,_,_,_,_,_,_] when R == rfc4005, true /= Nas ->
              {skip, rfc4005};
          [T,R,E,D,S,ST,SS,CS] ->
              G = #group{transport = T,
                         strings = S,
                         encoding = E,
                         client_service = [$C|?util:unique_string()],
                         client_dict = appdict(R),
                         client_sender = CS,
                         server_service = [$S|?util:unique_string()],
                         server_decoding = D,
                         server_sender = SS,
                         server_throttle = ST},
              replace([{group, G}, {runlist, select(T)}], Config);
          _ ->
              Config
      end.
  
  end_per_group(Name, Config)
    when Name == shuffle;
         Name == parallel ->
      remove_transports(Config),
      stop_services(Config);
  
  end_per_group(_, _) ->
      ok.
  
  select(T) ->
      try maps:get(T, ?LIMIT) of
          N ->
              lists:sublist(?util:scramble(tc()), max(5, rand:uniform(N)))
      catch
          error:_ -> ?LIMIT
      end.
  
  %% --------------------
  
  
negative.code: 
  %% ===========================================================================
  
  -define(util, diameter_util).
  
  -define(A, list_to_atom).
  