docs: def ResolveClientFlowURN(self, client_id, token=None):
      """Resolve a URN of a flow with this id belonging to a given client.
  
      Note that this may need a roundtrip to the datastore. Resolving algorithm
      is the following:
      1.  If the flow id doesn't contain slashes (flow is not nested), we just
          append it to the <client id>/flows.
      2.  If the flow id has slashes (flow is nested), we check if the root
          flow pointed to by <client id>/flows/<flow id> is a symlink.
      2a. If it's a symlink, we append the rest of the flow id to the symlink
          target.
      2b. If it's not a symlink, we just append the whole id to
          <client id>/flows (meaning we do the same as in 1).
  
      Args:
        client_id: Id of a client where this flow is supposed to be found on.
        token: Credentials token.
  
      Returns:
        RDFURN pointing to a flow identified by this flow id and client id.
      Raises:
        ValueError: if this flow id is not initialized.
      """
      if not self._value:
        raise ValueError("Can't call ResolveClientFlowURN on an empty client id.")
  
      components = self.Split()
      if len(components) == 1:
        return self._FlowIdToUrn(self._value, client_id)
      else:
        root_urn = self._FlowIdToUrn(components[0], client_id)
        try:
          flow_symlink = aff4.FACTORY.Open(
              root_urn,
              aff4_type=aff4.AFF4Symlink,
              follow_symlinks=False,
              token=token)
  
          return flow_symlink.Get(flow_symlink.Schema.SYMLINK_TARGET).Add(
              "/".join(components[1:]))
        except aff4.InstantiationError:
          return self._FlowIdToUrn(self._value, client_id)