
import itertools
from dataclasses import dataclass
from typing import Optional

import pyarrow as pa

import datasets
from datasets.table import table_cast


A  :			Optional[int]     				=				datasets.utils.logging.get_logger(__name__)







@dataclass
class     __A(				datasets.BuilderConfig    ):
				snake_case_		     =					None







class     __A(				datasets.ArrowBasedBuilder    ):
				snake_case_		     =					ArrowConfig




				def        SCREAMING_SNAKE_CASE_	(  self       )					->   Dict:


								'''simple docstring'''




								return datasets.DatasetInfo(features=self.config.features       )




				def        SCREAMING_SNAKE_CASE_	(  self	,  _snake_case       )					->   List[str]:


								'''simple docstring'''




								if not self.config.data_files:
												raise ValueError(F"""At least one data file must be specified, but got data_files={self.config.data_files}"""       )
								__a    							=					dl_manager.download_and_extract(self.config.data_files       )
								if isinstance(_snake_case	,  (str, list, tuple)       ):
												__a    							=					data_files
												if isinstance(_snake_case	,  _snake_case       ):
																__a    							=					[files]
												# Use `dl_manager.iter_files` to skip hidden files in an extracted archive
												__a    							=					[dl_manager.iter_files(_snake_case       ) for file in files]
												return [datasets.SplitGenerator(name=datasets.Split.TRAIN	,  gen_kwargs={'''files''': files}       )]
								__a    							=					[]
								for split_name, files in data_files.items():
												if isinstance(_snake_case	,  _snake_case       ):
																__a    							=					[files]
												# Use `dl_manager.iter_files` to skip hidden files in an extracted archive
												__a    							=					[dl_manager.iter_files(_snake_case       ) for file in files]
												# Infer features is they are stoed in the arrow schema
												if self.info.features is None:
																for file in itertools.chain.from_iterable(_snake_case       ):
																				with open(_snake_case	,  '''rb'''       ) as f:
																								__a    							=					datasets.Features.from_arrow_schema(pa.ipc.open_stream(_snake_case       ).schema       )
																				break
												splits.append(datasets.SplitGenerator(name=_snake_case	,  gen_kwargs={'''files''': files}       )       )
								return splits




				def        SCREAMING_SNAKE_CASE_	(  self	,  _snake_case       )					->   pa.Table:


								'''simple docstring'''




								if self.info.features is not None:
												# more expensive cast to support nested features with keys in a different order
												# allows str <-> int/float or str to Audio for example
												__a    							=					table_cast(_snake_case	,  self.info.features.arrow_schema       )
								return pa_table




				def        SCREAMING_SNAKE_CASE_	(  self	,  _snake_case       )					->   Any:


								'''simple docstring'''




								for file_idx, file in enumerate(itertools.chain.from_iterable(_snake_case       )       ):
												with open(_snake_case	,  '''rb'''       ) as f:
																try:
																				for batch_idx, record_batch in enumerate(pa.ipc.open_stream(_snake_case       )       ):
																								__a    							=					pa.Table.from_batches([record_batch]       )
																								# Uncomment for debugging (will print the Arrow table size and elements)
																								# logger.warning(f"pa_table: {pa_table} num rows: {pa_table.num_rows}")
																								# logger.warning('\n'.join(str(pa_table.slice(i, 1).to_pydict()) for i in range(pa_table.num_rows)))
																								yield F"""{file_idx}_{batch_idx}""", self._cast_table(_snake_case       )
																except ValueError as e:
																				logger.error(F"""Failed to read file '{file}' with error {type(_snake_case       )}: {e}"""       )
																				raise

def 					__lowerCAmelCase    (    a__ = 99_8001						) ->						int:
				__a    							=					0
				for i in range(999		,					99		,					-1						):  # 3 digit numbers range from 999 down to 100
								for j in range(999		,					99		,					-1						):
												__a    							=					str(i * j						)
												if product_string == product_string[::-1] and i * j < n:
																__a    							=					max(a__		,					i * j						)
				return answer


if __name__ == "__main__":
					print(F"{solution() = }")