private TransferCapability roleSelection(AAssociateRQ rq, AAssociateAC ac, String asuid) {
    RoleSelection rqrs = rq.getRoleSelectionFor(asuid);
    if (rqrs == null) return getTC(scpTCs, asuid, rq);

    RoleSelection acrs = ac.getRoleSelectionFor(asuid);
    if (acrs != null) return getTC(acrs.isSCU() ? scpTCs : scuTCs, asuid, rq);

    TransferCapability tcscu = null;
    TransferCapability tcscp = null;
    boolean scu = rqrs.isSCU() && (tcscp = getTC(scpTCs, asuid, rq)) != null;
    boolean scp = rqrs.isSCP() && (tcscu = getTC(scuTCs, asuid, rq)) != null;
    ac.addRoleSelection(new RoleSelection(asuid, scu, scp));
    return scu ? tcscp : tcscu;
  }
  protected PresentationContext negotiate(
      AAssociateRQ rq, AAssociateAC ac, PresentationContext rqpc) {
    String as = rqpc.getAbstractSyntax();
    TransferCapability tc = roleSelection(rq, ac, as);
    int pcid = rqpc.getPCID();
    if (tc == null)
      return new PresentationContext(
          pcid, PresentationContext.ABSTRACT_SYNTAX_NOT_SUPPORTED, rqpc.getTransferSyntax());

    for (String ts : rqpc.getTransferSyntaxes())
      if (tc.containsTransferSyntax(ts)) {
        byte[] info = negotiate(rq.getExtNegotiationFor(as), tc);
        if (info != null) ac.addExtendedNegotiation(new ExtendedNegotiation(as, info));
        return new PresentationContext(pcid, PresentationContext.ACCEPTANCE, ts);
      }

    return new PresentationContext(
        pcid, PresentationContext.TRANSFER_SYNTAX_NOT_SUPPORTED, rqpc.getTransferSyntax());
  }