code: def read_table(self, table_type):
          
  
          if table_type == 'hash':
              entry_class = MPQHashTableEntry
          elif table_type == 'block':
              entry_class = MPQBlockTableEntry
          else:
              raise ValueError("Invalid table type.")
  
          table_offset = self.header['%s_table_offset' % table_type]
          table_entries = self.header['%s_table_entries' % table_type]
          key = self._hash('(%s table)' % table_type, 'TABLE')
  
          self.file.seek(table_offset + self.header['offset'])
          data = self.file.read(table_entries * 16)
          data = self._decrypt(data, key)
  
          def unpack_entry(position):
              entry_data = data[position*16:position*16+16]
              return entry_class._make(
                  struct.unpack(entry_class.struct_format, entry_data))
  
          return [unpack_entry(i) for i in range(table_entries)]
docs: Read either the hash or block table of a MPQ archive.