code: def func_envelopes(node, CI=(.25, .5, .95)):
      
  
      if isinstance(node, Variable):
          func_stacks = asarray(node.trace())
      else:
          func_stacks = node
  
      func_stacks = func_stacks.copy()
      func_stacks.sort(axis=0)
  
      envelopes = []
      qsort = sort(CI)
  
      for i in range(len(qsort)):
          envelopes.append(
              centered_envelope(func_stacks,
                                qsort[len(qsort) - i - 1]))
      envelopes.append(centered_envelope(func_stacks, 0.))
  
      return envelopes
docs: func_envelopes(node, CI = (.25, .5, .95))
  
      Returns a list of centered_envelope objects for func_stacks,
      each one corresponding to an element of CI, and one
      corresponding to mass 0 (the median).
  
      :Arguments:
          func_stacks: The samples of the function. func_stacks[i,:]
              gives sample i.
          CI: A list or array containing the probability masses
              the envelopes should enclose.
  
      :Note: The return list of envelopes is sorted from high to low
          enclosing probability masses, so they should be plotted in
          order.
  
      :SeeAlso: centered_envelope, func_quantiles, func_hist, weightplot