docs: private ContactBootstrapServiceResponse contactBootstrapService(
                                                                      CredentialType credentialType, ClientAttachProperties cap, ClientConnectionFactory ccf) {
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.entry(tc, "contactBootstrapService", new Object[] { credentialType, cap, ccf });
  
          ClientConnection cc = null;
          TrmClientBootstrapReply cbr = null;
          int rc = TrmConstantsImpl.RETURN_CODE_NOK;
          List<String> uncontactableBootstrapServers = new ArrayList<String>(); //250165
          List<String> failedBootstrapServers = new ArrayList<String>(); //250165
          Exception firstMirroredFailureException = null;
          Exception firstBootstrapFailureException = null;
          boolean goodReply = false;
  
          List endpoints = cap.getProviderEPs();
          Iterator i = endpoints.iterator();
          ProviderEndPoint ep = null;
          while (i.hasNext()) {
              ep = (ProviderEndPoint) i.next();
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                  SibTr.debug(tc, "Making bootstrap request to " + ep.getEndPointInfo());
  
              cc = ccf.createClientConnection();
  
              if (cc != null) {
                  ConnectionProperties cp = new ConnectionProperties(ep);
                  cp.setClientConnectionPropertyMap(cap.getProperties()); // Pass comms the connection property map       LIDB3743
  
                  ClientBootstrapHandler cbh = new ClientBootstrapHandler(cap, credentialType, ep.getChain());
  
                  try {
                      cc.connect(cp, cbh);
  
                      TrmFirstContactMessage fcm = cbh.getReply();
                      cbr = fcm.makeInboundTrmClientBootstrapReply();
  
                      rc = cbr.getReturnCode().intValue();
  
                      // no point checking other bootstrap service if authentication has failed - break out of while loop
                      if (rc == TrmConstantsImpl.RETURN_CODE_SIAuthenticationException) {
                          firstMirroredFailureException = generateException(rc,
                                                                            nls.getFormattedMessage("LIBERTY_FAILED_AUTHENTICATION_CWSIT0128",
                                                                                                    new Object[] { cap.getBusName(), ep.getEndPointInfo(),
                                                                                                                  Utils.getFailureMessage(cbr.getFailureReason()) }, null), null,
                                                                            false);
                          // SIAuthenticationExc is not permitted to have a linked exception, and in basically
                          // all cases the cbh.getException() will be null because it is only set by protocol
                          // exceptions.
  
                          // d347701 - Make sure we tidy up the connection if we aren't going to use it.
                          cc.close();
                          break;
                      }
  
                      // no point checking other bootstrap service if not authorised - break out of while loop
                      if (rc == TrmConstantsImpl.RETURN_CODE_SINotAuthorizedException) {
                          firstMirroredFailureException = generateException(rc,
                                                                            nls.getFormattedMessage("LIBERTY_NOT_AUTHORIZED_CWSIT0129",
                                                                                                    new Object[] { cap.getBusName(), ep.getEndPointInfo(),
                                                                                                                  Utils.getFailureMessage(cbr.getFailureReason()) }, null), null,
                                                                            false);
                          // NotAuthorizedExc is not permitted to have a linked exception, and in basically
                          // all cases the cbh.getException() will be null because it is only set by protocol
                          // exceptions.
  
                          // d347701 - Make sure we tidy up the connection if we aren't going to use it.
                          cc.close();
                          break;
                      }
  
                      if (rc == TrmConstantsImpl.RETURN_CODE_OK) {
                          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                              SibTr.debug(tc, "Made a bootstrap request to "
                                              + ep.getEndPointInfo() + ". Response was "
                                              + (rc == TrmConstantsImpl.RETURN_CODE_OK ? "OK" : "REDIRECT"));
  
                          goodReply = true;
  
        
                          break;
                      } else {
                          Object[] objs = new Object[] {
                                                        ep.getEndPointInfo(), cap.getBusName(), rc == TrmConstantsImpl.RETURN_CODE_REDIRECT ? "REDIRECT TWAS" : Utils.getFailureMessage(cbr.getFailureReason()) };
                          //SibTr.warning(tc, Suppressor.ALL_FOR_A_WHILE_SIMILAR_INSERTS, "LIBERTY_MIRRORED_FAILURE_CWSIT0130", objs);
                          Exception exception = generateException(
                                                                  rc, nls.getFormattedMessage("LIBERTY_MIRRORED_FAILURE_CWSIT0130", objs, null), cbh.getException(), false);
                          SibTr.exception(tc, exception);
                          // store the first Exception of this kind
                          if (null == firstMirroredFailureException) {
                              firstMirroredFailureException = exception;
                          }
                          failedBootstrapServers.add(ep.getEndPointInfo()); //250165
  
                          // d273578 - Close the connection if we decide it is inappropriate to use it.
                          cc.close();
                      }
                  } catch (Exception e) {
                      // No FFDC code needed
                      Object[] objs = new Object[] { ep.getEndPointInfo(), e.toString() };
                      //SibTr.warning(tc, Suppressor.ALL_FOR_A_WHILE_SIMILAR_INSERTS, "LIBERTY_BOOTSTRAP_FAILED_CWSIT0131", objs); //248969
                      SIResourceException sire = new SIResourceException(nls.getFormattedMessage(
                                                                                                 "LIBERTY_BOOTSTRAP_FAILED_CWSIT0131", objs, null), e);
                      SibTr.exception(tc, sire);
                      // store the first Exception of this kind
                      if (null == firstBootstrapFailureException) {
                          firstBootstrapFailureException = sire;
                      }
                      uncontactableBootstrapServers.add(ep.getEndPointInfo()); //250165
                  } // try
  
              } else {
                  throw new SIErrorException(nls.getString("NO_CC_CWSIT0005"));
              } // if (cc != null)
          } // while
  
          // create BootstrapResponse
          ContactBootstrapServiceResponse cbsr = new ContactBootstrapServiceResponse(cc, cbr, rc, uncontactableBootstrapServers, failedBootstrapServers, firstMirroredFailureException, firstBootstrapFailureException, goodReply, ep);
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.exit(tc, "contactBootstrapService", cbsr);
  
          return cbsr;
      }