code: def is_watertight(edges, edges_sorted=None):
      
      # passing edges_sorted is a speedup only
      if edges_sorted is None:
          edges_sorted = np.sort(edges, axis=1)
  
      # group sorted edges
      groups = grouping.group_rows(edges_sorted, require_count=2)
      watertight = bool((len(groups) * 2) == len(edges))
  
      # are opposing edges reversed
      opposing = edges[groups].reshape((-1, 4))[:, 1:3].T
      # wrap the weird numpy bool
      winding = bool(np.equal(*opposing).all())
  
      return watertight, winding
docs: Parameters
      ---------
      edges : (n, 2) int
        List of vertex indices
      edges_sorted : (n, 2) int
        Pass vertex indices sorted on axis 1 as a speedup
  
      Returns
      ---------
      watertight : boolean
        Whether every edge is shared by an even
        number of faces
      winding : boolean
        Whether every shared edge is reversed