docs: def _show_or_dump(self, dump=False, indent=3, lvl="", label_lvl="", first_call=True):  # noqa: E501
          """
          Internal method that shows or dumps a hierarchical view of a packet.
          Called by show.
  
          :param dump: determine if it prints or returns the string value
          :param int indent: the size of indentation for each layer
          :param str lvl: additional information about the layer lvl
          :param str label_lvl: additional information about the layer fields
          :param first_call: determine if the current function is the first
          :return: return a hierarchical view if dump, else print it
          """
  
          if dump:
              from scapy.themes import AnsiColorTheme
              ct = AnsiColorTheme()  # No color for dump output
          else:
              ct = conf.color_theme
          s = "%s%s %s %s \n" % (label_lvl,
                                 ct.punct("###["),
                                 ct.layer_name(self.name),
                                 ct.punct("]###"))
          for f in self.fields_desc:
              if isinstance(f, ConditionalField) and not f._evalcond(self):
                  continue
              if isinstance(f, Emph) or f in conf.emph:
                  ncol = ct.emph_field_name
                  vcol = ct.emph_field_value
              else:
                  ncol = ct.field_name
                  vcol = ct.field_value
              fvalue = self.getfieldval(f.name)
              if isinstance(fvalue, Packet) or (f.islist and f.holds_packets and isinstance(fvalue, list)):  # noqa: E501
                  s += "%s  \\%-10s\\\n" % (label_lvl + lvl, ncol(f.name))
                  fvalue_gen = SetGen(fvalue, _iterpacket=0)
                  for fvalue in fvalue_gen:
                      s += fvalue._show_or_dump(dump=dump, indent=indent, label_lvl=label_lvl + lvl + "   |", first_call=False)  # noqa: E501
              else:
                  begn = "%s  %-10s%s " % (label_lvl + lvl,
                                           ncol(f.name),
                                           ct.punct("="),)
                  reprval = f.i2repr(self, fvalue)
                  if isinstance(reprval, str):
                      reprval = reprval.replace("\n", "\n" + " " * (len(label_lvl) +  # noqa: E501
                                                                    len(lvl) +
                                                                    len(f.name) +
                                                                    4))
                  s += "%s%s\n" % (begn, vcol(reprval))
          if self.payload:
              s += self.payload._show_or_dump(dump=dump, indent=indent, lvl=lvl + (" " * indent * self.show_indent), label_lvl=label_lvl, first_call=False)  # noqa: E501
  
          if first_call and not dump:
              print(s)
          else:
              return s