




'''simple docstring'''


# Author: OMKAR PATHAK, Nwachukwu Chidiebere

# Use a Python dictionary to construct the graph.
from __future__ import annotations

from pprint import pformat
from typing import Generic, TypeVar

_lowercase  =			TypeVar("""T""")
class 						a_				(			Generic[T]						):




	def __init__(       self     :  Optional[Any]       ,		__lowerCAmelCase     :  bool = True      ):
							__snake_case						 =   {}  # dictionary of lists
							__snake_case						 =   directed




	def   lowercase__   (       self     :  str       ,		__lowerCAmelCase     :  T       ,		__lowerCAmelCase     :  T      ):

							if not self.directed:  # For undirected graphs
													# if both source vertex and destination vertex are both present in the
													# adjacency list, add destination vertex to source vertex list of adjacent
													# vertices and add source vertex to destination vertex list of adjacent
													# vertices.
													if source_vertex in self.adj_list and destination_vertex in self.adj_list:
																			self.adj_list[source_vertex].append(__lowerCAmelCase      )
																			self.adj_list[destination_vertex].append(__lowerCAmelCase      )
													# if only source vertex is present in adjacency list, add destination vertex
													# to source vertex list of adjacent vertices, then create a new vertex with
													# destination vertex as key and assign a list containing the source vertex
													# as it's first adjacent vertex.
													elif source_vertex in self.adj_list:
																			self.adj_list[source_vertex].append(__lowerCAmelCase      )
																			__snake_case						 =   [source_vertex]
													# if only destination vertex is present in adjacency list, add source vertex
													# to destination vertex list of adjacent vertices, then create a new vertex
													# with source vertex as key and assign a list containing the source vertex
													# as it's first adjacent vertex.
													elif destination_vertex in self.adj_list:
																			self.adj_list[destination_vertex].append(__lowerCAmelCase      )
																			__snake_case						 =   [destination_vertex]
													# if both source vertex and destination vertex are not present in adjacency
													# list, create a new vertex with source vertex as key and assign a list
													# containing the destination vertex as it's first adjacent vertex also
													# create a new vertex with destination vertex as key and assign a list
													# containing the source vertex as it's first adjacent vertex.
													else:
																			__snake_case						 =   [destination_vertex]
																			__snake_case						 =   [source_vertex]
							else:  # For directed graphs
													# if both source vertex and destination vertex are present in adjacency
													# list, add destination vertex to source vertex list of adjacent vertices.
													if source_vertex in self.adj_list and destination_vertex in self.adj_list:
																			self.adj_list[source_vertex].append(__lowerCAmelCase      )
													# if only source vertex is present in adjacency list, add destination
													# vertex to source vertex list of adjacent vertices and create a new vertex
													# with destination vertex as key, which has no adjacent vertex
													elif source_vertex in self.adj_list:
																			self.adj_list[source_vertex].append(__lowerCAmelCase      )
																			__snake_case						 =   []
													# if only destination vertex is present in adjacency list, create a new
													# vertex with source vertex as key and assign a list containing destination
													# vertex as first adjacent vertex
													elif destination_vertex in self.adj_list:
																			__snake_case						 =   [destination_vertex]
													# if both source vertex and destination vertex are not present in adjacency
													# list, create a new vertex with source vertex as key and a list containing
													# destination vertex as it's first adjacent vertex. Then create a new vertex
													# with destination vertex as key, which has no adjacent vertex
													else:
																			__snake_case						 =   [destination_vertex]
																			__snake_case						 =   []

							return self




	def __repr__(       self     :  str      ):
							return pformat(self.adj_list      )







'''simple docstring'''


def 						lowerCamelCase__   (				a							):
						if not all(x.isalpha() for x in string							):
												raise ValueError('String must only contain alphabetic characters.'							)

						__snake_case						 =   sorted(string.lower()							)
						return len(a							) == len(set(a							)							)


if __name__ == "__main__":
	_lowercase  =			input("""Enter a string """).strip()

	_lowercase  =			is_isogram(input_str)
	print(f'''{input_str} is {'an' if isogram else 'not an'} isogram.''')

