





import argparse
from collections import defaultdict

import yaml


_snake_case  :   Optional[int]						   =  'docs/source/en/_toctree.yml'

def   a_   (			lowerCAmelCase_				:      Tuple     ):
   __lowerCAmelCase							     =     defaultdict(lowerCAmelCase_     )
   __lowerCAmelCase							     =     []
   __lowerCAmelCase							     =     []
   for doc in doc_list:
      if "local" in doc:
         counts[doc["local"]] += 1

      if doc["title"].lower() == "overview":
         overview_doc.append({'local': doc['local'], 'title': doc['title']}     )
      else:
         new_doc_list.append(lowerCAmelCase_     )

   __lowerCAmelCase							     =     new_doc_list
   __lowerCAmelCase							     =     [key for key, value in counts.items() if value > 1]

   __lowerCAmelCase							     =     []
   for duplicate_key in duplicates:
      __lowerCAmelCase							     =     list({doc['title'] for doc in doc_list if doc['local'] == duplicate_key}     )
      if len(lowerCAmelCase_     ) > 1:
         raise ValueError(
             F"""{duplicate_key} is present several times in the documentation table of content at """
             '`docs/source/en/_toctree.yml` with different *Title* values. Choose one of those and remove the '
             'others.'     )
      # Only add this once
      new_doc.append({'local': duplicate_key, 'title': titles[0]}     )

   # Add none duplicate-keys
   new_doc.extend([doc for doc in doc_list if 'local' not in counts or counts[doc['local']] == 1]     )
   __lowerCAmelCase							     =     sorted(lowerCAmelCase_,     key=lambda lowerCAmelCase_     : s["title"].lower()     )

   # "overview" gets special treatment and is always first
   if len(lowerCAmelCase_     ) > 1:
      raise ValueError('{doc_list} has two \'overview\' docs which is not allowed.'     )

   overview_doc.extend(lowerCAmelCase_     )

   # Sort
   return overview_doc

def   a_   (			lowerCAmelCase_				:      Tuple=False     ):
   with open(lowerCAmelCase_,     encoding='utf-8'     ) as f:
      __lowerCAmelCase							     =     yaml.safe_load(f.read()     )

   # Get to the API doc
   __lowerCAmelCase							     =     0
   while content[api_idx]["title"] != "API":
      api_idx += 1
   __lowerCAmelCase							     =     content[api_idx]['sections']

   # Then to the model doc
   __lowerCAmelCase							     =     0
   while api_doc[scheduler_idx]["title"] != "Schedulers":
      scheduler_idx += 1

   __lowerCAmelCase							     =     api_doc[scheduler_idx]['sections']
   __lowerCAmelCase							     =     clean_doc_toc(lowerCAmelCase_     )

   __lowerCAmelCase							     =     False
   if new_scheduler_doc != scheduler_doc:
      __lowerCAmelCase							     =     True
      if overwrite:
         __lowerCAmelCase							     =     new_scheduler_doc

   if diff:
      if overwrite:
         __lowerCAmelCase							     =     api_doc
         with open(lowerCAmelCase_,     'w',     encoding='utf-8'     ) as f:
            f.write(yaml.dump(lowerCAmelCase_,     allow_unicode=lowerCAmelCase_     )     )
      else:
         raise ValueError(
             'The model doc part of the table of content is not properly sorted, run `make style` to fix this.'     )

def   a_   (			lowerCAmelCase_				:      Dict=False     ):
   with open(lowerCAmelCase_,     encoding='utf-8'     ) as f:
      __lowerCAmelCase							     =     yaml.safe_load(f.read()     )

   # Get to the API doc
   __lowerCAmelCase							     =     0
   while content[api_idx]["title"] != "API":
      api_idx += 1
   __lowerCAmelCase							     =     content[api_idx]['sections']

   # Then to the model doc
   __lowerCAmelCase							     =     0
   while api_doc[pipeline_idx]["title"] != "Pipelines":
      pipeline_idx += 1

   __lowerCAmelCase							     =     False
   __lowerCAmelCase							     =     api_doc[pipeline_idx]['sections']
   __lowerCAmelCase							     =     []

   # sort sub pipeline docs
   for pipeline_doc in pipeline_docs:
      if "section" in pipeline_doc:
         __lowerCAmelCase							     =     pipeline_doc['section']
         __lowerCAmelCase							     =     clean_doc_toc(lowerCAmelCase_     )
         if overwrite:
            __lowerCAmelCase							     =     new_sub_pipeline_doc
      new_pipeline_docs.append(lowerCAmelCase_     )

   # sort overall pipeline doc
   __lowerCAmelCase							     =     clean_doc_toc(lowerCAmelCase_     )

   if new_pipeline_docs != pipeline_docs:
      __lowerCAmelCase							     =     True
      if overwrite:
         __lowerCAmelCase							     =     new_pipeline_docs

   if diff:
      if overwrite:
         __lowerCAmelCase							     =     api_doc
         with open(lowerCAmelCase_,     'w',     encoding='utf-8'     ) as f:
            f.write(yaml.dump(lowerCAmelCase_,     allow_unicode=lowerCAmelCase_     )     )
      else:
         raise ValueError(
             'The model doc part of the table of content is not properly sorted, run `make style` to fix this.'     )


if __name__ == "__main__":
     _snake_case  :   List[str]						   =  argparse.ArgumentParser()
     parser.add_argument('--fix_and_overwrite', action='store_true', help='Whether to fix inconsistencies.')
     _snake_case  :   Union[str, Any]						   =  parser.parse_args()

     check_scheduler_doc(args.fix_and_overwrite)
     check_pipeline_doc(args.fix_and_overwrite)








from functools import lru_cache

@lru_cache
def   a_   (			lowerCAmelCase_				:      int     ):
   if num < 0:
      raise ValueError('Number should not be negative.'     )

   return 1 if num in (0, 1) else num * factorial(num - 1     )


if __name__ == "__main__":
     import doctest

     doctest.testmod()

