def METHOD_NAME(self, page_num: int):
    first_block = self.read_int(2)
    cells_num = self.read_int(2)
    cells_pos = self.read_int(2)
    fragmented_free_bytes = self.read_int(1)
    cells_pos = [self.read_int(2) for _ in range(cells_num)]
    rows = []
    for cell_pos in cells_pos:
        self.pos = self.page_size * page_num + cell_pos
        payload_len = self.read_varint()
        rowid = self.read_varint()
        columns_type = []
        payload_pos = self.pos
        header_size = self.read_varint()
        while self.pos < payload_pos + header_size:
            column_type = self.read_varint()
            columns_type.append(column_type)
        cells = []
        for column_type in columns_type:
            if column_type == 0:
                data = rowid
            elif 1 <= column_type <= 4:
                data = self.read_int(column_type)
            elif column_type == 5:
                data = self.read_int(6)
            elif column_type == 6:
                data = self.read_int(8)
            elif column_type == 7:
                # TODO: float
                data = self.read(8)
            elif column_type == 8:
                data = 0
            elif column_type == 9:
                data = 1
            elif column_type >= 12 and column_type % 2 == 0:
                length = int((column_type - 12) / 2)
                data = self.read(length)
            else:
                length = int((column_type - 13) / 2)
                data = self.read(length).decode()
            cells.append(data)
        rows.append(cells)
    return rows