class_docstr: The ``Feat`` table is used exclusively by the Graphite shaping engine
  to store features and possible settings specified in GDL. Graphite features
  determine what rules are applied to transform a glyph stream.
  
  Not to be confused with ``feat``, or the OpenType Layout tables
  ``GSUB``/``GPOS``.
class_docstr_tok: ["The","``","Feat","``","table","is","used","exclusively","by","the","Graphite","shaping","engine","to","store","features","and","possible","settings","specified","in","GDL",".","Graphite","features","determine","what","rules","are","applied","to","transform","a","glyph","stream",".","Not","to","be","confused","with","``","feat","``",",","or","the","OpenType","Layout","tables","``","GSUB","``","\/","``","GPOS","``","."]
code: def decompile(self, data, ttFont):
      (_, data) = sstruct.unpack2(Feat_hdr_format, data, self)
      self.version = float(
          floatToFixedToStr(self.version, precisionBits=16)
      )
      (numFeats,) = struct.unpack(">H", data[:2])
      data = data[8:]
      allfeats = []
      maxsetting = 0
      for i in range(numFeats):
          if self.version >= 2.0:
              (fid, nums, _, offset, flags, lid) = struct.unpack(
                  ">LHHLHH", data[16 * i : 16 * (i + 1)]
              )
              offset = int((offset - 12 - 16 * numFeats) / 4)
          else:
              (fid, nums, offset, flags, lid) = struct.unpack(
                  ">HHLHH", data[12 * i : 12 * (i + 1)]
              )
              offset = int((offset - 12 - 12 * numFeats) / 4)
          allfeats.append((fid, nums, offset, flags, lid))
          maxsetting = max(maxsetting, offset + nums)
      data = data[16 * numFeats :]
      allsettings = []
      for i in range(maxsetting):
          if len(data) >= 4 * (i + 1):
              (val, lid) = struct.unpack(
                  ">HH", data[4 * i : 4 * (i + 1)]
              )
              allsettings.append((val, lid))
      for i, f in enumerate(allfeats):
          (fid, nums, offset, flags, lid) = f
          fobj = Feature()
          fobj.flags = flags
          fobj.label = lid
          self.features[grUtils.num2tag(fid)] = fobj
          fobj.settings = {}
          fobj.default = None
          fobj.index = i
          for i in range(offset, offset + nums):
              if i >= len(allsettings):
                  continue
              (vid, vlid) = allsettings[i]
              fobj.settings[vid] = vlid
              if fobj.default is None:
                  fobj.default = vid
  
file_path: catboost/contrib/python/fonttools/fontTools/ttLib/tables/F__e_a_t.py
imports: from fontTools.misc import sstruct
  from fontTools.misc.fixedTools import floatToFixedToStr
  from fontTools.misc.textTools import safeEval
  from .None import DefaultTable
  from .None import grUtils
  import struct
label_desc: Use image node_id 2 for calling the table_F__e_a_t obj's underlying member method code with example usage: obj.decompile(data, ttFont) without return types