code: def zk_walk(self, root_path, branch_path):
          
          full_path = os.path.join(root_path, branch_path) if branch_path else root_path
  
          try:
              children = self.client.get_children(full_path)
          except NoNodeError:
              children = set()
          except NoAuthError:
              raise AuthError("read children", full_path)
  
          for child in children:
              child_path = os.path.join(branch_path, child) if branch_path else child
  
              try:
                  stat = self.client.exists(os.path.join(root_path, child_path))
              except NoAuthError:
                  raise AuthError("read", child)
  
              if stat is None or stat.ephemeralOwner != 0:
                  continue
              yield child_path
              for new_path in self.zk_walk(root_path, child_path):
                  yield new_path
docs: skip ephemeral znodes since there's no point in copying those