code: func (c *Chain) selectRouteFor(addr string) (route *Chain, err error) {
  	if c.IsEmpty() {
  		return newRoute(), nil
  	}
  	if c.isRoute {
  		return c, nil
  	}
  
  	route = newRoute()
  	var nl []Node
  
  	for _, group := range c.nodeGroups {
  		var node Node
  		node, err = group.Next()
  		if err != nil {
  			return
  		}
  
  		if node.Bypass.Contains(addr) {
  			break
  		}
  
  		if node.Client.Transporter.Multiplex() {
  			node.DialOptions = append(node.DialOptions,
  				ChainDialOption(route),
  			)
  			route = newRoute() // cutoff the chain for multiplex node.
  		}
  
  		route.AddNode(node)
  		nl = append(nl, node)
  	}
  
  	route.route = nl
  
  	return
  }
docs: // selectRouteFor selects route with bypass testing.