code: def _encode_secret_part_v2_v3(version, condition, root_key, ns):
      '''Creates a version 2 or version 3 secret part of the third party
      caveat. The returned data is not encrypted.
  
      The format has the following packed binary fields:
      version 2 or 3 [1 byte]
      root key length [n: uvarint]
      root key [n bytes]
      namespace length [n: uvarint] (v3 only)
      namespace [n bytes] (v3 only)
      predicate [rest of message]
      '''
      data = bytearray()
      data.append(version)
      encode_uvarint(len(root_key), data)
      data.extend(root_key)
      if version >= VERSION_3:
          encode_uvarint(len(ns), data)
          data.extend(ns)
      data.extend(condition.encode('utf-8'))
      return bytes(dataf _encode_secret_part_v2_v3(version, condition, root_key, ns):
      '''Creates a version 2 or version 3 secret part of the third party
      caveat. The returned data is not encrypted.
  
      The format has the following packed binary fields:
      version 2 or 3 [1 byte]
      root key length [n: uvarint]
      root key [n bytes]
      namespace length [n: uvarint] (v3 only)
      namespace [n bytes] (v3 only)
      predicate [rest of message]
      '''
      data = bytearray()
      data.append(version)
      encode_uvarint(len(root_key), data)
      data.extend(root_key)
      if version >= VERSION_3:
          encode_uvarint(len(ns), data)
          data.extend(ns)
      data.extend(condition.encode('utf-8'))
      return bytes(data)
docs: Creates a version 2 or version 3 secret part of the third party
      caveat. The returned data is not encrypted.
  
      The format has the following packed binary fields:
      version 2 or 3 [1 byte]
      root key length [n: uvarint]
      root key [n bytes]
      namespace length [n: uvarint] (v3 only)
      namespace [n bytes] (v3 only)
      predicate [rest of message]