code: def _load_relationship_info(self):
          
          mft_entry_size = self.mft_entry_size
          fp = self.file_pointer
          record_n = 0
          #define the minimum amount that needs to be read
          base_struct = struct.Struct("<Q")
          base_struct_offset = 32
          seq_struct = struct.Struct("<H")
          seq_struct_offset = 16
  
          buffer_base = bytearray(base_struct.size)
          buffer_seq = bytearray(seq_struct.size)
          #go over the file using the entry size as setp
          for i in range(0, _get_file_size(self.file_pointer), mft_entry_size):
              record_n = int(i/mft_entry_size)
              fp.seek(i + base_struct_offset)
              fp.readinto(buffer_base)
              base_ref, base_seq = get_file_reference(base_struct.unpack(buffer_base)[0])
              if base_ref:
                  #calculate and prepare to read the sequence number
                  fp.seek((base_ref * mft_entry_size) + seq_struct_offset)
                  fp.readinto(buffer_seq)
                  seq, = seq_struct.unpack(buffer_seq)
                  if seq == base_seq: #entries are related
                      self._entries_parent_child[base_ref].append(record_n)
                      self._entries_child_parent[record_n] = base_ref
                  else:
                      self._number_valid_entries += 1
              else:
                  self._number_valid_entries += 1
docs: Maps parent and child entries in the MFT.
  
          Because the library expects the MFT file to be provided, it doesn't
          have access to anything non-resident. Because of that, if we want all
          the information related to the entry, it is necessary to visit all the
          entries and map the relationship between each of them.
  
          Note:
              Because the data necessary to do this should always happen before
              the first fixup entry, we don't need to apply it.