






import collections
import json
import os
import re
from typing import TYPE_CHECKING, List, Optional, Tuple

import numpy as np

from ...tokenization_utils_fast import PreTrainedTokenizer
from ...utils import logging


if TYPE_CHECKING:
						from transformers.pipelines.conversational import Conversation


__UpperCamelCase   :   List[Any]      =    logging.get_logger(__name__)

__UpperCamelCase   :   Dict      =    {"""vocab_file""": """vocab.txt""", """emoji_file""": """emoji.json"""}

__UpperCamelCase   :   str      =    {
    """vocab_file""": {
        """abeja/gpt-neox-japanese-2.7b""": """https://huggingface.co/abeja/gpt-neox-japanese-2.7b/resolve/main/vocab.txt""",
    },
    """emoji_file""": {
        """abeja/gpt-neox-japanese-2.7b""": """https://huggingface.co/abeja/gpt-neox-japanese-2.7b/resolve/main/emoji.json""",
    },
}

__UpperCamelCase   :   Dict      =    {
    """abeja/gpt-neox-japanese-2.7b""": 2048,
}





def 					snake_case	(  lowerCamelCase					,	lowerCamelCase       ):




	'''simple docstring'''







	with open(lowerCamelCase					,	"""r"""					,	encoding="""utf-8"""       ) as f:
		__lowercase   							=	json.loads(f.read()       )

	__lowercase   							=	collections.OrderedDict()
	__lowercase   							=	collections.OrderedDict()
	__lowercase   							=	collections.OrderedDict()
	with open(lowerCamelCase					,	"""r"""					,	encoding="""utf-8"""       ) as f:
		__lowercase   							=	f.readlines()
	__lowercase   							=	[[t.rstrip("""\n"""       )] if (t == """,""" or """,""" not in t) else t.rstrip("""\n"""       ).split(""","""       ) for t in token]
	for idx, b in enumerate(lowerCamelCase       ):
		__lowercase   							=	b
		__lowercase   							=	idx
		for wd in b:
			__lowercase   							=	idx

	return vocab, raw_vocab, ids_to_tokens, emoji


class 							__UpperCamelCase     (  _lowerCAmelCase ):
	__snake_case						:int =							VOCAB_FILES_NAMES
	__snake_case						:Optional[Any] =							PRETRAINED_VOCAB_FILES_MAP
	__snake_case						:int =							PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES
	__snake_case						:Any =							['input_ids', 'attention_mask']







	def __init__(	self   :				Dict							,					_lowerCAmelCase   :				Any							,					_lowerCAmelCase   :				List[str]							,					_lowerCAmelCase   :				Any="<|endoftext|>"							,					_lowerCAmelCase   :				int="<|endoftext|>"							,					_lowerCAmelCase   :				Optional[int]="<|startoftext|>"							,					_lowerCAmelCase   :				int="<|endoftext|>"							,					_lowerCAmelCase   :				Dict=False							,					**_lowerCAmelCase   :				Any							,					)		->			Optional[int]:
		"""simple docstring"""







		super().__init__(
		    unk_token=_lowerCAmelCase							,					pad_token=_lowerCAmelCase							,					bos_token=_lowerCAmelCase							,					eos_token=_lowerCAmelCase							,					do_clean_text=_lowerCAmelCase							,					**_lowerCAmelCase							,					)
		if not os.path.isfile(_lowerCAmelCase      ):
			raise ValueError(
			    F'Can\'t find a vocabulary file at path \'{vocab_file}\'. To load the vocabulary from a Google pretrained'
			    """ model use `tokenizer = GPTNeoXJapaneseokenizer.from_pretrained(PRETRAINED_MODEL_NAME)`"""      )
		if not os.path.isfile(_lowerCAmelCase      ):
			raise ValueError(
			    F'Can\'t find a emoji file at path \'{emoji_file}\'. To load the emoji information from a Google'
			    """ pretrained model use `tokenizer = GPTNeoXJapaneseokenizer.from_pretrained(PRETRAINED_MODEL_NAME)`"""      )
		__lowercase   							=	do_clean_text
		__lowercase							,    __lowercase							,    __lowercase							,    __lowercase   							=	load_vocab_and_emoji(_lowerCAmelCase							,					_lowerCAmelCase      )
		__lowercase   							=	SubWordJapaneseTokenizer(
		    vocab=self.vocab							,					ids_to_tokens=self.ids_to_tokens							,					emoji=self.emoji      )







	@property
	def 			_a (	self   :				List[str]      )		->			str:
		"""simple docstring"""







		return len(self.raw_vocab      )







	def 			_a (	self   :				Tuple      )		->			str:
		"""simple docstring"""







		return dict(self.raw_vocab							,					**self.added_tokens_encoder      )







	def 			_a (	self   :				Any							,					_lowerCAmelCase   :				Optional[Any]      )		->			List[str]:
		"""simple docstring"""







		return self.subword_tokenizer.tokenize(_lowerCAmelCase							,					clean=self.do_clean_text      )







	def 			_a (	self   :				Any							,					_lowerCAmelCase   :				Union[str, Any]      )		->			Union[str, Any]:
		"""simple docstring"""







		return self.vocab.get(_lowerCAmelCase							,					self.vocab.get(self.unk_token      )      )







	def 			_a (	self   :				List[Any]							,					_lowerCAmelCase   :				Tuple      )		->			int:
		"""simple docstring"""







		return self.subword_tokenizer.convert_id_to_token(_lowerCAmelCase      )







	def 			_a (	self   :				Union[str, Any]							,					_lowerCAmelCase   :				List[Any]      )		->			Any:
		"""simple docstring"""







		__lowercase   							=	"""""".join(_lowerCAmelCase      ).strip()
		return out_string







	def 			_a (	self   :				str							,					_lowerCAmelCase   :				"Conversation"      )		->			List[int]:
		"""simple docstring"""







		__lowercase   							=	[]
		for is_user, text in conversation.iter_texts():
			input_ids.extend(self.encode(_lowerCAmelCase							,					add_special_tokens=_lowerCAmelCase      ) + [self.eos_token_id]      )

		if len(_lowerCAmelCase      ) > self.model_max_length:
			__lowercase   							=	input_ids[-self.model_max_length :]
		return input_ids







	def 			_a (	self   :				List[str]							,					_lowerCAmelCase   :				str							,					_lowerCAmelCase   :				Optional[str] = None      )		->			Tuple[str]:
		"""simple docstring"""







		__lowercase   							=	0
		if os.path.isdir(_lowerCAmelCase      ):
			__lowercase   							=	os.path.join(
			    _lowerCAmelCase							,					(filename_prefix + """-""" if filename_prefix else """""") + VOCAB_FILES_NAMES["""vocab_file"""]      )
			__lowercase   							=	os.path.join(
			    _lowerCAmelCase							,					(filename_prefix + """-""" if filename_prefix else """""") + VOCAB_FILES_NAMES["""emoji_file"""]      )
		else:
			__lowercase   							=	(
			    (filename_prefix + """-""" if filename_prefix else """""") + save_directory + VOCAB_FILES_NAMES["""vocab_file"""]
			)
			__lowercase   							=	(
			    (filename_prefix + """-""" if filename_prefix else """""") + save_directory + VOCAB_FILES_NAMES["""emoji_file"""]
			)
		with open(_lowerCAmelCase							,					"""w"""							,					encoding="""utf-8"""      ) as writer:
			for token_index, token in self.ids_to_tokens.items():
				if index != token_index:
					logger.warning(
					    F'Saving vocabulary to {vocab_file}: vocabulary indices are not consecutive.'
					    """ Please check that the vocabulary is not corrupted!"""      )
					__lowercase   							=	token_index
				writer.write(""",""".join(_lowerCAmelCase      ) + """\n"""      )
				index += 1
		with open(_lowerCAmelCase							,					"""w"""							,					encoding="""utf-8"""      ) as writer:
			json.dump(self.emoji							,					_lowerCAmelCase      )
		return vocab_file, emoji_file


class 							__UpperCamelCase     (  _lowerCAmelCase ):







	def __init__(	self   :				List[Any]							,					_lowerCAmelCase   :				List[str]							,					_lowerCAmelCase   :				int							,					_lowerCAmelCase   :				Tuple      )		->			List[Any]:
		"""simple docstring"""







		__lowercase   							=	vocab  # same as swe
		__lowercase   							=	ids_to_tokens  # same as bpe
		__lowercase   							=	emoji
		__lowercase   							=	np.max([len(_lowerCAmelCase      ) for w in self.vocab.keys()]      )
		__lowercase   							=	re.compile(r"""(https?|ftp)(:\/\/[-_\.!~*\'()a-zA-Z0-9;\/?:\@&=\+$,%#]+)"""      )
		__lowercase   							=	re.compile(r"""[A-Za-z0-9\._+]*@[\-_0-9A-Za-z]+(\.[A-Za-z]+)*"""      )
		__lowercase   							=	re.compile(r"""[\(]{0,1}[0-9]{2,4}[\)\-\(]{0,1}[0-9]{2,4}[\)\-]{0,1}[0-9]{3,4}"""      )
		__lowercase   							=	re.compile(
		    r"""([12]\d{3}[/\-年])*(0?[1-9]|1[0-2])[/\-月]((0?[1-9]|[12][0-9]|3[01])日?)*(\d{1,2}|:|\d{1,2}時|\d{1,2}分|\(日\)|\(月\)|\(火\)|\(水\)|\(木\)|\(金\)|\(土\)|㈰|㈪|㈫|㈬|㈭|㈮|㈯)*"""      )
		__lowercase   							=	re.compile(
		    r"""(明治|大正|昭和|平成|令和|㍾|㍽|㍼|㍻|\u32ff)\d{1,2}年(0?[1-9]|1[0-2])月(0?[1-9]|[12][0-9]|3[01])日(\d{1,2}|:|\d{1,2}時|\d{1,2}分|\(日\)|\(月\)|\(火\)|\(水\)|\(木\)|\(金\)|\(土\)|㈰|㈪|㈫|㈬|㈭|㈮|㈯)*"""      )
		__lowercase   							=	re.compile(
		    r"""((0|[1-9]\d*|[1-9]\d{0,2}(,\d{3})+)*億)*((0|[1-9]\d*|[1-9]\d{0,2}(,\d{3})+)*万)*((0|[1-9]\d*|[1-9]\d{0,2}(,\d{3})+)*千)*(0|[1-9]\d*|[1-9]\d{0,2}(,\d{3})+)*(千円|万円|千万円|円|千ドル|万ドル|千万ドル|ドル|千ユーロ|万ユーロ|千万ユーロ|ユーロ)+(\(税込\)|\(税抜\)|\+tax)*"""      )
		__lowercase   							=	"""─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋╌╍╎╏═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡╢╣╤╥╦╧╨╩╪╫╬╭╮╯╰╱╲╳╴╵╶╷╸╹╺╻╼╽╾╿"""
		__lowercase   							=	"""▀▁▂▃▄▅▆▇█▉▊▋▌▍▎▏▐░▒▓▔▕▖▗▘▙▚▛▜▝▞▟"""
		__lowercase   							=	str.maketrans({k: """<BLOCK>""" for k in keisen + blocks}      )







	def __len__(	self   :				Optional[Any]      )		->			Tuple:
		"""simple docstring"""







		return len(self.ids_to_tokens      )







	def 			_a (	self   :				Dict							,					_lowerCAmelCase   :				str      )		->			Any:
		"""simple docstring"""







		__lowercase   							=	self.content_repattera.sub("""<URL>"""							,					_lowerCAmelCase      )
		__lowercase   							=	self.content_repattera.sub("""<EMAIL>"""							,					_lowerCAmelCase      )
		__lowercase   							=	self.content_repattera.sub("""<TEL>"""							,					_lowerCAmelCase      )
		__lowercase   							=	self.content_repattera.sub("""<DATE>"""							,					_lowerCAmelCase      )
		__lowercase   							=	self.content_repattera.sub("""<DATE>"""							,					_lowerCAmelCase      )
		__lowercase   							=	self.content_repattera.sub("""<PRICE>"""							,					_lowerCAmelCase      )
		__lowercase   							=	content.translate(self.content_transa      )
		while "<BLOCK><BLOCK>" in content:
			__lowercase   							=	content.replace("""<BLOCK><BLOCK>"""							,					"""<BLOCK>"""      )
		return content







	def 			_a (	self   :				int							,					_lowerCAmelCase   :				Optional[Any]							,					_lowerCAmelCase   :				List[str]=False      )		->			int:
		"""simple docstring"""







		__lowercase   							=	text.replace(""" """							,					"""<SP>"""      )
		__lowercase   							=	text.replace("""　"""							,					"""<SP>"""      )
		__lowercase   							=	text.replace("""\r\n"""							,					"""<BR>"""      )
		__lowercase   							=	text.replace("""\n"""							,					"""<BR>"""      )
		__lowercase   							=	text.replace("""\r"""							,					"""<BR>"""      )
		__lowercase   							=	text.replace("""\t"""							,					"""<TAB>"""      )
		__lowercase   							=	text.replace("""—"""							,					"""ー"""      )
		__lowercase   							=	text.replace("""−"""							,					"""ー"""      )
		for k, v in self.emoji["emoji"].items():
			if k in text:
				__lowercase   							=	text.replace(_lowerCAmelCase							,					_lowerCAmelCase      )
		if clean:
			__lowercase   							=	self.clean_text(_lowerCAmelCase      )

		def check_simbol(_lowerCAmelCase   :				List[Any]      ):
			__lowercase   							=	x.encode()
			if len(_lowerCAmelCase      ) == 1 and len(_lowerCAmelCase      ) == 2:
				__lowercase   							=	(int(e[0]      ) << 8) + int(e[1]      )
				if (
				    (c >= 0Xc2a1 and c <= 0Xc2bf)
				    or (c >= 0Xc780 and c <= 0Xc783)
				    or (c >= 0Xcab9 and c <= 0Xcbbf)
				    or (c >= 0Xcc80 and c <= 0Xcda2)
				):
					return True
			return False

		def checkuae(_lowerCAmelCase   :				int      ):
			__lowercase   							=	x.encode()
			if len(_lowerCAmelCase      ) == 1 and len(_lowerCAmelCase      ) == 3:
				__lowercase   							=	(int(e[0]      ) << 16) + (int(e[1]      ) << 8) + int(e[2]      )
				if c >= 0Xe2_8080 and c <= 0Xe2_b07f:
					return True
			return False

		__lowercase   							=	0
		__lowercase   							=	[]
		while pos < len(_lowerCAmelCase      ):
			__lowercase   							=	min(len(_lowerCAmelCase      )							,					pos + self.maxlen + 1      ) if text[pos] == """<""" else pos + 3
			__lowercase   							=	[]  # (token_id, token, pos)
			for e in range(_lowerCAmelCase							,					_lowerCAmelCase							,					-1      ):
				__lowercase   							=	text[pos:e]
				if wd in self.vocab:
					if wd[0] == "<" and len(_lowerCAmelCase      ) > 2:
						__lowercase   							=	[(self.vocab[wd], wd, e)]
						break
					else:
						candidates.append((self.vocab[wd], wd, e)      )
			if len(_lowerCAmelCase      ) > 0:
				# the smallest token_id is adopted
				__lowercase							,    __lowercase							,    __lowercase   							=	sorted(_lowerCAmelCase							,					key=lambda _lowerCAmelCase      : x[0]      )[0]
				result.append(_lowerCAmelCase      )
				__lowercase   							=	e
			else:
				__lowercase   							=	pos + 1
				__lowercase   							=	text[pos:end]
				if check_simbol(_lowerCAmelCase      ):
					result.append("""<KIGOU>"""      )
				elif checkuae(_lowerCAmelCase      ):
					result.append("""<U2000U2BFF>"""      )
				else:
					for i in wd.encode("""utf-8"""      ):
						result.append("""<|byte%d|>""" % i      )
				__lowercase   							=	end
		return result







	def 			_a (	self   :				Optional[Any]							,					_lowerCAmelCase   :				Any							,					_lowerCAmelCase   :				Optional[int]="\n"      )		->			List[Any]:
		"""simple docstring"""







		__lowercase   							=	[]
		__lowercase   							=	[]
		__lowercase   							=	self.ids_to_tokens[index][0]
		if word[:6] == "<|byte" and word[-2:] == "|>":
			byte_tokens.append(int(word[6:-2]      )      )
		else:
			if len(_lowerCAmelCase      ) > 0:
				words.append(bytearray(_lowerCAmelCase      ).decode("""utf-8"""							,					errors="""replace"""      )      )
				__lowercase   							=	[]
			if word[:7] == "<|emoji" and word[-2:] == "|>":
				words.append(self.emoji["""emoji_inv"""][word]      )
			elif word == "<SP>":
				words.append(""" """      )
			elif word == "<BR>":
				words.append(_lowerCAmelCase      )
			elif word == "<TAB>":
				words.append("""\t"""      )
			elif word == "<BLOCK>":
				words.append("""▀"""      )
			elif word == "<KIGOU>":
				words.append("""ǀ"""      )
			elif word == "<U2000U2BFF>":
				words.append("""‖"""      )
			else:
				words.append(_lowerCAmelCase      )
		if len(_lowerCAmelCase      ) > 0:
			words.append(bytearray(_lowerCAmelCase      ).decode("""utf-8"""							,					errors="""replace"""      )      )
		__lowercase   							=	"""""".join(_lowerCAmelCase      )
		return text








"""simple docstring"""





from packaging import version

from .import_utils import is_accelerate_available


if is_accelerate_available():
							import accelerate



def 					lowerCAmelCase_      (   SCREAMING_SNAKE_CASE							:				str ):


							'''simple docstring'''







							if not is_accelerate_available():
														return method
							__lowerCamelCase   :   Dict       =version.parse(accelerate.__version__ ).base_version
							if version.parse(SCREAMING_SNAKE_CASE ) < version.parse('''0.17.0''' ):
														return method

							def wrapper(self							:				List[Any]     ,    *SCREAMING_SNAKE_CASE							:				Any     ,    **SCREAMING_SNAKE_CASE							:				List[str] ):
														if hasattr(self     ,    '''_hf_hook''' ) and hasattr(self._hf_hook     ,    '''pre_forward''' ):
																					self._hf_hook.pre_forward(self )
														return method(self     ,    *SCREAMING_SNAKE_CASE     ,    **SCREAMING_SNAKE_CASE )

							return wrapper




