From a5ae82e71cd85ba8a88498597e0a982abe8ed229 Mon Sep 17 00:00:00 2001 From: oestebanbajo Date: Tue, 15 Nov 2022 15:32:09 +0100 Subject: [PATCH 1/4] first commit --- .gitignore | 5 + geesedb/index/__init__.py | 4 +- geesedb/index/cython/process_tools.cpp | 17 + geesedb/index/cython/test.c | 1 + geesedb/index/doc_readers.py | 41 + geesedb/index/indexer.py | 175 + geesedb/index/terms_processor.py | 119 + geesedb/index/utils.py | 28 +- geesedb/resources/__init__.py | 4 +- geesedb/resources/topics.py | 2 +- geesedb/tests/index/test_fulltext_from_csv.py | 11 +- geesedb/tests/utils/__init__.py | 1 + geesedb/tests/utils/utils.py | 47 + geesedb/utils/ciff/to_csv.py | 8 +- requirements.txt | 11 +- setup_cython.cpp | 3306 +++++++++++++++++ setup_cython.py | 9 + 17 files changed, 3764 insertions(+), 25 deletions(-) create mode 100644 geesedb/index/cython/process_tools.cpp create mode 100644 geesedb/index/cython/test.c create mode 100644 geesedb/index/doc_readers.py create mode 100644 geesedb/index/indexer.py create mode 100644 geesedb/index/terms_processor.py create mode 100644 geesedb/tests/utils/utils.py create mode 100644 setup_cython.cpp create mode 100644 setup_cython.py diff --git a/.gitignore b/.gitignore index 582fbdb..b34da57 100644 --- a/.gitignore +++ b/.gitignore @@ -50,6 +50,11 @@ coverage.xml *.py,cover .hypothesis/ .pytest_cache/ +/geesedb/tests/resources/WP +/geesedb/tests/test_script.py +/geesedb/tests/generated_dbs +/geesedb/index/cython/ +/geesedb/resources/nltk_data # Translations *.mo diff --git a/geesedb/index/__init__.py b/geesedb/index/__init__.py index 30d6319..a46d8b3 100644 --- a/geesedb/index/__init__.py +++ b/geesedb/index/__init__.py @@ -2,5 +2,7 @@ from .entities_from_csv import EntitiesFromCSV from .fulltext_from_ciff import FullTextFromCiff from .fulltext_from_csv import FullTextFromCSV +from .indexer import Indexer +from .terms_processor import TermsProcessor -__all__ = ['FullTextFromCSV', 'AuthorsFromCSV', 'FullTextFromCiff', 'EntitiesFromCSV'] +__all__ = ['FullTextFromCSV', 'AuthorsFromCSV', 'FullTextFromCiff', 'EntitiesFromCSV', 'Indexer', 'TermsProcessor'] diff --git a/geesedb/index/cython/process_tools.cpp b/geesedb/index/cython/process_tools.cpp new file mode 100644 index 0000000..06f8b26 --- /dev/null +++ b/geesedb/index/cython/process_tools.cpp @@ -0,0 +1,17 @@ +#include +#include + +#include "english_stem.h" + +namespace stemming{ +stemming::english_stem<> StemEnglish; + +stemming::stemming(string *word){ +this->word = word; +} + +string stemming::stem () { + return StemEnglish(this->word); +} + +} \ No newline at end of file diff --git a/geesedb/index/cython/test.c b/geesedb/index/cython/test.c new file mode 100644 index 0000000..06f2230 --- /dev/null +++ b/geesedb/index/cython/test.c @@ -0,0 +1 @@ +#error Do not use this file, it is the result of a failed Cython compilation. diff --git a/geesedb/index/doc_readers.py b/geesedb/index/doc_readers.py new file mode 100644 index 0000000..81836d0 --- /dev/null +++ b/geesedb/index/doc_readers.py @@ -0,0 +1,41 @@ +from resiliparse.parse.html import HTMLTree +from resiliparse.extract.html2text import extract_plain_text + +doc_general = {'collection_id': None, + 'doc_id': None, + 'title': '', + 'date': '', + 'authors': [], + 'content': '', + 'others': {}} + + +def read_from_WaPo_json(line: {}, doc_id: int, include_links: bool) -> doc_general: + """ + Read input docs from JSONL file and convert it to the general format. + """ + if line['id'] is None: + raise IOError('Missing collection ID') + d: doc_general = {'collection_id': line['id'], 'doc_id': doc_id, 'title': line['title'], + 'date': line['published_date'], 'authors': [author for author in line['author'].split(',')]} + # in case authors are separated by commas + text = '' + if 'contents' in line: + for dict_ in line['contents']: #types: kicker, title, image (fullcaption), byline, sanitized_html + if (dict_ is not None) and ('content' in dict_) and ('type' in dict_): + if dict_['type'] == 'kicker' or dict_['type'] == 'title': + text += str(dict_['content']) + ' ' + elif dict_['type'] == 'sanitized_html': + text += str(extract_plain_text(HTMLTree.parse(dict_['content']), links=include_links, list_bullets=False)) + ' ' + d['content'] = text + elif 'content' in line: + d['content'] = line['content'] + else: + raise IOError('Contents in the .jl file not found.') + + # for any other key not mentioned before, its content goes to others + for k in line.keys(): + if k not in d.keys(): + d['others'] = line[k] + + return d diff --git a/geesedb/index/indexer.py b/geesedb/index/indexer.py new file mode 100644 index 0000000..5314381 --- /dev/null +++ b/geesedb/index/indexer.py @@ -0,0 +1,175 @@ +from .doc_readers import read_from_WaPo_json +from .terms_processor import TermsProcessor +from ..connection import get_connection +from .utils import _create_and_fill_empty_table_with_pd + +import os +import pandas as pd +import json +import pathlib +import time +import sys +from collections import Counter +from typing import Any + + +class Indexer: + """ + Reads, processes and introduces documents of JSONL format in GeeseDB. + + TODO: + most time consuming processing: stemming and then tokenizing + normal 500 docs time: 11-13 s + try doing a dict with words that don't need to be stemmed: 12 s + try using just the c++ stemmer, everything else python + + + idea: introduce data in db every n documents (in case something fails) + """ + + def __init__(self, **kwargs: Any) -> None: + self.arguments = self.get_arguments(kwargs) + self.read = read_from_WaPo_json + self.line = {} + self.db_docs = {self.arguments['columns_names_docs'][0]: [], + self.arguments['columns_names_docs'][1]: [], + self.arguments['columns_names_docs'][2]: []} + self.db_terms = {} + self.db_terms_docs = {self.arguments['columns_names_term_doc'][0]: [], + self.arguments['columns_names_term_doc'][1]: [], + self.arguments['columns_names_term_doc'][2]: []} + db_connection = get_connection(self.arguments['database']) + self.connection = db_connection.connection + self.processor = TermsProcessor(self.arguments) + self.total_time = 0 + + def open_and_run(self) -> None: + self.total_time = time.time() + if pathlib.Path(self.arguments['file']).suffix == '.jl': + with open(self.arguments['file'], encoding=self.arguments['encoding']) as file: + self.run_indexer(file) + else: + raise IOError('Please provide a valid file') + + def run_indexer(self, file) -> None: + t1 = t2 = t3 = t4 = t5 = doc_id = 0 + + for line in file: + self.line = json.loads(line) + start = time.time() + self.line = self.read(self.line, doc_id, self.arguments['include_html_links']) + end = time.time() + t1 += end - start + start = time.time() + self.line['content'] = self.processor.process(self.line['content']) + end = time.time() + t2 += end - start + start = time.time() + self.update_docs_file(doc_id) + end = time.time() + t3 += end - start + start = time.time() + self.update_terms_termsdocs_file() + end = time.time() + t4 += end - start + if doc_id % 100 == 0: + sys.stdout.write('\r') + sys.stdout.write("Processed documents: %d" % doc_id) + sys.stdout.flush() + if doc_id == 500: + sys.stdout.write('\r') + sys.stdout.flush() + break + doc_id += 1 + #sys.stdout.write('\r') + #sys.stdout.flush() + + start = time.time() + df_docs = pd.DataFrame.from_dict(self.db_docs) + new_db_terms = {self.arguments['columns_names_term_dict'][0]: [], + self.arguments['columns_names_term_dict'][1]: [], + self.arguments['columns_names_term_dict'][2]: []} + for item in self.db_terms.items(): + new_db_terms['string'].append(item[0]) + new_db_terms['term_id'].append(item[1][0]) + new_db_terms['df'].append(item[1][1]) + df_terms = pd.DataFrame.from_dict(new_db_terms) + df_terms_docs = pd.DataFrame.from_dict(self.db_terms_docs) + + self.create_and_fill_tables([df_docs, df_terms, df_terms_docs]) + # print(self.connection.execute("show tables;").df()) + # print(self.connection.execute(f"SELECT * FROM docs;").df()) + end = time.time() + t5 += end - start + + if self.arguments['print_times']: + print(f'Running time reading line: {t1} sec') + print(f'Running time processing line: {t2} sec') + print(f'Running time updating docs: {t3} sec') + print(f'Running time updating dictionary and terms_docs: {t4} sec') + print(f'Running time creating and filling DB: {t5} sec') + print(f'Running time: {time.time() - self.total_time} sec') + self.processor.print_times() + + @staticmethod + def get_arguments(kwargs: Any) -> dict: + arguments = { + 'database': None, + 'use_existing_db': False, + 'use_existing_tables': False, + 'create_nltk_data': True, + 'print_times': True, + 'include_html_links': False, + 'tokenization_method': 'syntok', + 'stop_words': 'lucene', + 'stemmer': 'porter', + 'table_names': ['docs', 'term_dict', 'term_doc'], + 'columns_names_docs': ['collection_id', 'doc_id', 'len'], + 'columns_names_term_dict': ['term_id', 'string', 'df'], + 'columns_names_term_doc': ['term_id', 'doc_id', 'tf'], + 'file': 'docs.jl', + 'nltk_path': os.path.dirname(os.path.dirname(__file__)) + '/resources/nltk_data', + 'language': 'english', + 'encoding': 'utf-8', + 'delimiter': '|', + 'delete_chars': ['', '.', ',', "'", '"', '’', '‘', '“', '”', '-', '—', '(', ')', '[', ']', '{', '}', + '<', '>', ':', ';', '?', '!', '/', '\\', '=', '&'] + } + for key, item in arguments.items(): + if kwargs.get(key) is not None: + arguments[key] = kwargs.get(key) + if arguments['database'] is None: + raise IOError('database path needs to be provided') + return arguments + + def create_and_fill_tables(self, dataframe_list: []) -> None: + self.connection.begin() + for table_name, pd_df in zip(self.arguments['table_names'], dataframe_list): + _create_and_fill_empty_table_with_pd(self.connection, table_name, pd_df) + self.connection.commit() + + def update_docs_file(self, doc_id: int) -> None: # input a line, update csv + self.db_docs['collection_id'].append(self.line['collection_id']) + self.db_docs['doc_id'].append(doc_id) + self.db_docs['len'].append(len(self.line['content'])) + + def update_terms_termsdocs_file(self) -> None: + # s = time.time() + temp_words = Counter(self.line['content']).keys() # unique elements + temp_vals = Counter(self.line['content']).values() # counts the elements' frequency + # en = time.time() + # self.d += en-s + # s = time.time() + for w, t in zip(temp_words, temp_vals): + if w not in self.db_terms.keys(): + i = len(self.db_terms) + self.db_terms[w] = [i, 1] # term_id, df + self.db_terms_docs['term_id'].append(i) + else: # find word and update df (once per doc) + self.db_terms[w][1] += 1 + self.db_terms_docs['term_id'].append(self.db_terms[w][0]) # find term id of word w + + self.db_terms_docs['doc_id'].append(self.line['doc_id']) + self.db_terms_docs['tf'].append(t) + # en = time.time() + # self.e += en-s diff --git a/geesedb/index/terms_processor.py b/geesedb/index/terms_processor.py new file mode 100644 index 0000000..c3e4999 --- /dev/null +++ b/geesedb/index/terms_processor.py @@ -0,0 +1,119 @@ +import os +import nltk.data +import spacy +from nltk.corpus import stopwords +from nltk.tokenize import word_tokenize +from nltk.stem.snowball import SnowballStemmer +from nltk.stem import PorterStemmer +from syntok.tokenizer import Tokenizer +from geesedb.index.cython.test import process + +import time + + +class TermsProcessor: + """ + Performs stemming and stop words. + Uses nltk by default with the process method. + Inputs the whole document as a string. + """ + + def __init__(self, arguments): + if arguments['stemmer'] == 'porter': + self.stemmer = PorterStemmer() + elif arguments['stemmer'] == 'snowball': + self.stemmer = SnowballStemmer(arguments['language']) + else: + IOError('Please input a valid stemmer') + self.file_path = arguments['nltk_path'] + self.delete_chars = arguments['delete_chars'] + self.delete_chars_str = ''.join(self.delete_chars) + self.tokenization_method = arguments['tokenization_method'] + if arguments['create_nltk_data']: + self.download_nltk_data() + if arguments['stop_words'] is None: + self.stop_words = set(self.delete_chars) + elif arguments['stop_words'] == 'nltk': + self.stop_words = set(stopwords.words(arguments['language'])) + self.stop_words.update(self.delete_chars) + elif arguments['stop_words'] == 'lucene': + self.stop_words = {"a", "an", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", + "it", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", + "these", "they", "this", "to", "was", "will", "with"} + self.stop_words.update(self.delete_chars) + else: + IOError('Please select a valid option') + self.nlp = spacy.load("en_core_web_sm") + if self.tokenization_method == 'syntok': + self.tokenizer = Tokenizer(emit_hyphen_or_underscore_sep=True) + self.stop_words = list(self.nlp(word) for word in self.stop_words) + elif self.tokenization_method not in ['nltk', 'simple']: + raise IOError('Please select a valid process method') + self.stemmed_tokens = {} + self.a = self.b = self.c = self.d = 0 + + def process(self, line: str) -> str: + if self.tokenization_method == 'syntok': + # filtered_tokens = [self.stemmer.stem(token.value) for token in self.tokenizer.tokenize(line) + # if not token.value.lower() in self.stop_words] + + # tokens = self.tokenizer.tokenize(line) + # filtered_tokens = process(self.nlp, tokens, self.stop_words) + + filtered_tokens = [] + # s = time.time() + # for token in self.tokenizer.tokenize(line): + # self.a += time.time() - s + # s = time.time() + # if not token.value.lower() in self.stop_words: + # self.b += time.time() - s + # s = time.time() + # tok = self.stemmer.stem(token.value) + # self.c += time.time() - s + # s = time.time() + # filtered_tokens.append(tok) + # self.d += time.time() - s + + s = time.time() + for token in self.tokenizer.tokenize(line): + self.a += time.time() - s + # check if the word should be stemmed or not + s = time.time() + if not token.value.lower() in (self.stop_words or self.stemmed_tokens): + self.b += time.time() - s + s = time.time() + tok = self.stemmer.stem(token.value) + self.c += time.time() - s + s = time.time() + self.stemmed_tokens[token.value] = tok + self.d += time.time() - s + filtered_tokens.append(tok) + else: + filtered_tokens.append(self.stemmed_tokens[token.value]) + + elif self.tokenization_method == 'nltk': + word_tokens = word_tokenize(line) + filtered_tokens = [self.stemmer.stem(w) for w in word_tokens if not w.lower() in self.stop_words] + elif self.tokenization_method == 'simple': + word_tokens = line.split() + filtered_tokens = [self.stemmer.stem(w.strip(self.delete_chars_str)) + for w in word_tokens if not w.lower().strip(self.delete_chars_str) in self.stop_words] + # print(filtered_tokens) + return filtered_tokens + + def print_times(self): + print('a: %f' % self.a) + print('b: %f' % self.b) + print('c: %f' % self.c) + print('d: %f' % self.d) + + def download_nltk_data(self) -> None: + # create path to data + if self.file_path not in nltk.data.path: + nltk.data.path.append(self.file_path) + + # create folder and install necessary packages + if not os.path.isdir(self.file_path): + os.mkdir(self.file_path) + os.system(f'py -m nltk.downloader -d {self.file_path} stopwords') + os.system(f'py -m nltk.downloader -d {self.file_path} punkt') diff --git a/geesedb/index/utils.py b/geesedb/index/utils.py index 0a67bfd..e76d8e8 100644 --- a/geesedb/index/utils.py +++ b/geesedb/index/utils.py @@ -1,18 +1,19 @@ from typing import List -from duckdb import DuckDBPyConnection +from duckdb import DuckDBPyConnection, CatalogException def _create_table(connection: DuckDBPyConnection, table_name: str, column_names: List[str], column_types: List[str]) -> None: cursor = connection.cursor() - try: - cursor.execute(f'SELECT * FROM {table_name} LIMIT 1;') - connection.rollback() - raise IOError('Table already exists.') - except RuntimeError: - pass - query = f'CREATE TABLE {table_name} ({", ".join([f"{a} {b}" for a, b in zip(column_names, column_types)])});' + # try: + # cursor.execute(f'SELECT * FROM {table_name} LIMIT 1;') + # connection.rollback() + # raise IOError('Table already exists.') + # except RuntimeError or IOError or CatalogException: + # pass + # query = f'CREATE TABLE {table_name} ({", ".join([f"{a} {b}" for a, b in zip(column_names, column_types)])});' + query = f'CREATE TABLE IF NOT EXISTS {table_name} ({", ".join([f"{a} {b}" for a, b in zip(column_names, column_types)])});' cursor.execute(query) @@ -23,5 +24,16 @@ def _fill_empty_table_with_csv(connection: DuckDBPyConnection, table_name: str, if cursor.fetchone()[0] > 0: connection.rollback() raise IOError('The tables are not empty.') + print(table_name) query = f"COPY {table_name} FROM '{file_name}' WITH DELIMITER '{delimiter}';" cursor.execute(query) + + +def _create_and_fill_empty_table_with_pd(connection: DuckDBPyConnection, table_name: str, pd_dataframe) -> None: + cursor = connection.cursor() + cursor.execute(f'DROP TABLE IF EXISTS {table_name};') + cursor.register(table_name, pd_dataframe) + cursor.execute(f"CREATE TABLE {table_name} AS SELECT * FROM {table_name};") + #cursor.execute(f"SELECT count(*) FROM {table_name}") + #print(cursor.fetchall()) + diff --git a/geesedb/resources/__init__.py b/geesedb/resources/__init__.py index f2867f8..b501136 100644 --- a/geesedb/resources/__init__.py +++ b/geesedb/resources/__init__.py @@ -1,3 +1,3 @@ -from .topics import get_topics_backgroundlinking +from .topics import get_topics_backgroundlinking, get_topics -__all__ = ['get_topics_backgroundlinking'] \ No newline at end of file +__all__ = ['get_topics_backgroundlinking', 'get_topics'] \ No newline at end of file diff --git a/geesedb/resources/topics.py b/geesedb/resources/topics.py index 207f0f8..991eaa5 100644 --- a/geesedb/resources/topics.py +++ b/geesedb/resources/topics.py @@ -1,3 +1,3 @@ def get_topics_backgroundlinking(file_name): with open(file_name) as topics_file: - return [topic.strip().split(':') for topic in topics_file.readlines()] \ No newline at end of file + return [topic.strip().split(':') for topic in topics_file.readlines()] diff --git a/geesedb/tests/index/test_fulltext_from_csv.py b/geesedb/tests/index/test_fulltext_from_csv.py index db979b7..bb135f7 100644 --- a/geesedb/tests/index/test_fulltext_from_csv.py +++ b/geesedb/tests/index/test_fulltext_from_csv.py @@ -1,14 +1,15 @@ from os import path -from ...index import FullTextFromCSV -from ...connection import close_connection +from geesedb.index import FullTextFromCSV +from geesedb.connection import close_connection + def test_load_csv_example_files() -> None: index = FullTextFromCSV(database=':memory:', - docs_file=path.dirname(path.dirname(__file__)) + '/resources/csv/example_docs.csv', + docs_file=path.dirname(path.dirname(__file__)) + '\\resources\\csv\\example_docs.csv', term_dict_file=path.dirname( - path.dirname(__file__)) + '/resources/csv/example_term_dict.csv', - term_doc_file=path.dirname(path.dirname(__file__)) + '/resources/csv/example_term_doc.csv' + path.dirname(__file__)) + '\\resources\\csv\\example_term_dict.csv', + term_doc_file=path.dirname(path.dirname(__file__)) + '\\resources\\csv\\example_term_doc.csv' ) index.load_data() index.connection.execute("SELECT * FROM docs;") diff --git a/geesedb/tests/utils/__init__.py b/geesedb/tests/utils/__init__.py index e69de29..ee7e6dd 100644 --- a/geesedb/tests/utils/__init__.py +++ b/geesedb/tests/utils/__init__.py @@ -0,0 +1 @@ +from .utils import save_run_file, get_topics_wp_trec diff --git a/geesedb/tests/utils/utils.py b/geesedb/tests/utils/utils.py new file mode 100644 index 0000000..ead23f2 --- /dev/null +++ b/geesedb/tests/utils/utils.py @@ -0,0 +1,47 @@ +from geesedb.index import Indexer +from geesedb.search import Searcher + +import pandas as pd +import numpy as np + + +def get_topics_wp_trec(file_name: str): + # return an array with the topic number and string + with open(file_name) as topics_file: + nums = [] + strs = [] + str_file = topics_file.readlines() + for i, line in enumerate(str_file): + if '' in line: + nums.append(line.removeprefix(' Number: ').removesuffix(' \n')) + elif '\n' in line: + strs.append(str_file[i+1].removesuffix(' \n')) + return nums, strs + + +def save_run_file(processor, database: str, topics_file: str, save_loc: str, n: int) -> None: + searcher = Searcher(database=database, n=n) + nums, strs = get_topics_wp_trec(topics_file) + final = {'topic': [], + 'sad': [], + 'id': [], + 'rank': [], + 'score': [], + 'run_tag': []} + q = ['Q0']*n + run_tag = ['geesedb']*n + rank = list(range(n+1)) + del rank[0] + for top, s in zip(nums, strs): + temp = searcher.search_topic(' '.join(processor(s))).to_dict() + print(temp) + final['topic'].extend([top]*n) + final['sad'].extend(q) + final['id'].extend(temp['collection_id'].values()) + final['rank'].extend(rank) + final['score'].extend(temp['score'].values()) + final['run_tag'].extend(run_tag) + #break + + df = pd.DataFrame(final) + np.savetxt(save_loc, df.values, fmt='%s') diff --git a/geesedb/utils/ciff/to_csv.py b/geesedb/utils/ciff/to_csv.py index e8817f7..b2d676b 100755 --- a/geesedb/utils/ciff/to_csv.py +++ b/geesedb/utils/ciff/to_csv.py @@ -65,21 +65,21 @@ def create_csv_files(self) -> None: pos += next_pos # read posting lists - term_dict_writer = open(self.arguments['output_term_dict'], 'w') - term_doc_writer = open(self.arguments['output_term_doc'], 'w') + term_dict_writer = open(self.arguments['output_term_dict'], 'w', encoding="utf-8") + term_doc_writer = open(self.arguments['output_term_doc'], 'w', encoding="utf-8") postings_list = Ciff.PostingsList() for term_id in range(header.num_postings_lists): next_pos, pos = self.decode(data, pos) postings_list.ParseFromString(data[pos:pos+next_pos]) pos += next_pos - term_dict_writer.write(f'{term_id}|{postings_list.df}|{postings_list.term}\n') + term_dict_writer.write(f'{term_id}|{postings_list.term}|{postings_list.df}\n') for posting in postings_list.postings: term_doc_writer.write(f'{term_id}|{posting.docid}|{posting.tf}\n') term_dict_writer.close() term_doc_writer.close() # read doc information - docs_writer = open(self.arguments['output_docs'], 'w') + docs_writer = open(self.arguments['output_docs'], 'w', encoding="utf-8") doc_record = Ciff.DocRecord() for n in range(header.num_docs): next_pos, pos = self.decode(data, pos) diff --git a/requirements.txt b/requirements.txt index fb47ba9..21e8d42 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,9 @@ -duckdb +duckdb~=0.5.0 google>=2 protobuf>=3 -numpy -pandas -git+git://github.com/informagi/pycypher \ No newline at end of file +numpy~=1.23.2 +pandas~=1.4.4 +git+git://github.com/informagi/pycypher +setuptools~=57.0.0 + +nltk~=3.7 diff --git a/setup_cython.cpp b/setup_cython.cpp new file mode 100644 index 0000000..c5b6b42 --- /dev/null +++ b/setup_cython.cpp @@ -0,0 +1,3306 @@ +/* Generated by Cython 0.29.32 */ + +#ifndef PY_SSIZE_T_CLEAN +#define PY_SSIZE_T_CLEAN +#endif /* PY_SSIZE_T_CLEAN */ +#include "Python.h" +#ifndef Py_PYTHON_H + #error Python headers needed to compile C extensions, please install development version of Python. +#elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) + #error Cython requires Python 2.6+ or Python 3.3+. +#else +#define CYTHON_ABI "0_29_32" +#define CYTHON_HEX_VERSION 0x001D20F0 +#define CYTHON_FUTURE_DIVISION 0 +#include <stddef.h> +#ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +#endif +#if !defined(WIN32) && !defined(MS_WINDOWS) + #ifndef __stdcall + #define __stdcall + #endif + #ifndef __cdecl + #define __cdecl + #endif + #ifndef __fastcall + #define __fastcall + #endif +#endif +#ifndef DL_IMPORT + #define DL_IMPORT(t) t +#endif +#ifndef DL_EXPORT + #define DL_EXPORT(t) t +#endif +#define __PYX_COMMA , +#ifndef HAVE_LONG_LONG + #if PY_VERSION_HEX >= 0x02070000 + #define HAVE_LONG_LONG + #endif +#endif +#ifndef PY_LONG_LONG + #define PY_LONG_LONG LONG_LONG +#endif +#ifndef Py_HUGE_VAL + #define Py_HUGE_VAL HUGE_VAL +#endif +#ifdef PYPY_VERSION + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC (PYPY_VERSION_HEX >= 0x07030900) + #endif +#elif defined(PYSTON_VERSION) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif +#elif defined(PY_NOGIL) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_NOGIL 1 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #ifndef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 1 + #endif + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 +#else + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 1 + #define CYTHON_COMPILING_IN_NOGIL 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #if PY_VERSION_HEX < 0x02070000 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #elif !defined(CYTHON_USE_PYTYPE_LOOKUP) + #define CYTHON_USE_PYTYPE_LOOKUP 1 + #endif + #if PY_MAJOR_VERSION < 3 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #if PY_VERSION_HEX < 0x02070000 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #elif !defined(CYTHON_USE_PYLONG_INTERNALS) + #define CYTHON_USE_PYLONG_INTERNALS 1 + #endif + #ifndef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 1 + #endif + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) + #define CYTHON_USE_UNICODE_WRITER 1 + #endif + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #if PY_VERSION_HEX >= 0x030B00A4 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #elif !defined(CYTHON_FAST_THREAD_STATE) + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL (PY_VERSION_HEX < 0x030A0000) + #endif + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) + #endif + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1) + #endif + #ifndef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) + #endif + #if PY_VERSION_HEX >= 0x030B00A4 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #elif !defined(CYTHON_USE_EXC_INFO_STACK) + #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) + #endif + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 + #endif +#endif +#if !defined(CYTHON_FAST_PYCCALL) +#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) +#endif +#if CYTHON_USE_PYLONG_INTERNALS + #if PY_MAJOR_VERSION < 3 + #include "longintrepr.h" + #endif + #undef SHIFT + #undef BASE + #undef MASK + #ifdef SIZEOF_VOID_P + enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; + #endif +#endif +#ifndef __has_attribute + #define __has_attribute(x) 0 +#endif +#ifndef __has_cpp_attribute + #define __has_cpp_attribute(x) 0 +#endif +#ifndef CYTHON_RESTRICT + #if defined(__GNUC__) + #define CYTHON_RESTRICT __restrict__ + #elif defined(_MSC_VER) && _MSC_VER >= 1400 + #define CYTHON_RESTRICT __restrict + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_RESTRICT restrict + #else + #define CYTHON_RESTRICT + #endif +#endif +#ifndef CYTHON_UNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_MAYBE_UNUSED_VAR +# if defined(__cplusplus) + template<class T> void CYTHON_MAYBE_UNUSED_VAR( const T& ) { } +# else +# define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x) +# endif +#endif +#ifndef CYTHON_NCP_UNUSED +# if CYTHON_COMPILING_IN_CPYTHON +# define CYTHON_NCP_UNUSED +# else +# define CYTHON_NCP_UNUSED CYTHON_UNUSED +# endif +#endif +#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) +#ifdef _MSC_VER + #ifndef _MSC_STDINT_H_ + #if _MSC_VER < 1300 + typedef unsigned char uint8_t; + typedef unsigned int uint32_t; + #else + typedef unsigned __int8 uint8_t; + typedef unsigned __int32 uint32_t; + #endif + #endif +#else + #include <stdint.h> +#endif +#ifndef CYTHON_FALLTHROUGH + #if defined(__cplusplus) && __cplusplus >= 201103L + #if __has_cpp_attribute(fallthrough) + #define CYTHON_FALLTHROUGH [[fallthrough]] + #elif __has_cpp_attribute(clang::fallthrough) + #define CYTHON_FALLTHROUGH [[clang::fallthrough]] + #elif __has_cpp_attribute(gnu::fallthrough) + #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_attribute(fallthrough) + #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) + #else + #define CYTHON_FALLTHROUGH + #endif + #endif + #if defined(__clang__ ) && defined(__apple_build_version__) + #if __apple_build_version__ < 7000000 + #undef CYTHON_FALLTHROUGH + #define CYTHON_FALLTHROUGH + #endif + #endif +#endif + +#ifndef __cplusplus + #error "Cython files generated with the C++ option must be compiled with a C++ compiler." +#endif +#ifndef CYTHON_INLINE + #if defined(__clang__) + #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) + #else + #define CYTHON_INLINE inline + #endif +#endif +template<typename T> +void __Pyx_call_destructor(T& x) { + x.~T(); +} +template<typename T> +class __Pyx_FakeReference { + public: + __Pyx_FakeReference() : ptr(NULL) { } + __Pyx_FakeReference(const T& ref) : ptr(const_cast<T*>(&ref)) { } + T *operator->() { return ptr; } + T *operator&() { return ptr; } + operator T&() { return *ptr; } + template<typename U> bool operator ==(U other) { return *ptr == other; } + template<typename U> bool operator !=(U other) { return *ptr != other; } + private: + T *ptr; +}; + +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) + #define Py_OptimizeFlag 0 +#endif +#define __PYX_BUILD_PY_SSIZE_T "n" +#define CYTHON_FORMAT_SSIZE_T "z" +#if PY_MAJOR_VERSION < 3 + #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) + #define __Pyx_DefaultClassType PyClass_Type +#else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" + #define __Pyx_DefaultClassType PyType_Type +#if PY_VERSION_HEX >= 0x030B00A1 + static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int k, int l, int s, int f, + PyObject *code, PyObject *c, PyObject* n, PyObject *v, + PyObject *fv, PyObject *cell, PyObject* fn, + PyObject *name, int fline, PyObject *lnos) { + PyObject *kwds=NULL, *argcount=NULL, *posonlyargcount=NULL, *kwonlyargcount=NULL; + PyObject *nlocals=NULL, *stacksize=NULL, *flags=NULL, *replace=NULL, *call_result=NULL, *empty=NULL; + const char *fn_cstr=NULL; + const char *name_cstr=NULL; + PyCodeObject* co=NULL; + PyObject *type, *value, *traceback; + PyErr_Fetch(&type, &value, &traceback); + if (!(kwds=PyDict_New())) goto end; + if (!(argcount=PyLong_FromLong(a))) goto end; + if (PyDict_SetItemString(kwds, "co_argcount", argcount) != 0) goto end; + if (!(posonlyargcount=PyLong_FromLong(0))) goto end; + if (PyDict_SetItemString(kwds, "co_posonlyargcount", posonlyargcount) != 0) goto end; + if (!(kwonlyargcount=PyLong_FromLong(k))) goto end; + if (PyDict_SetItemString(kwds, "co_kwonlyargcount", kwonlyargcount) != 0) goto end; + if (!(nlocals=PyLong_FromLong(l))) goto end; + if (PyDict_SetItemString(kwds, "co_nlocals", nlocals) != 0) goto end; + if (!(stacksize=PyLong_FromLong(s))) goto end; + if (PyDict_SetItemString(kwds, "co_stacksize", stacksize) != 0) goto end; + if (!(flags=PyLong_FromLong(f))) goto end; + if (PyDict_SetItemString(kwds, "co_flags", flags) != 0) goto end; + if (PyDict_SetItemString(kwds, "co_code", code) != 0) goto end; + if (PyDict_SetItemString(kwds, "co_consts", c) != 0) goto end; + if (PyDict_SetItemString(kwds, "co_names", n) != 0) goto end; + if (PyDict_SetItemString(kwds, "co_varnames", v) != 0) goto end; + if (PyDict_SetItemString(kwds, "co_freevars", fv) != 0) goto end; + if (PyDict_SetItemString(kwds, "co_cellvars", cell) != 0) goto end; + if (PyDict_SetItemString(kwds, "co_linetable", lnos) != 0) goto end; + if (!(fn_cstr=PyUnicode_AsUTF8AndSize(fn, NULL))) goto end; + if (!(name_cstr=PyUnicode_AsUTF8AndSize(name, NULL))) goto end; + if (!(co = PyCode_NewEmpty(fn_cstr, name_cstr, fline))) goto end; + if (!(replace = PyObject_GetAttrString((PyObject*)co, "replace"))) goto cleanup_code_too; + if (!(empty = PyTuple_New(0))) goto cleanup_code_too; // unfortunately __pyx_empty_tuple isn't available here + if (!(call_result = PyObject_Call(replace, empty, kwds))) goto cleanup_code_too; + Py_XDECREF((PyObject*)co); + co = (PyCodeObject*)call_result; + call_result = NULL; + if (0) { + cleanup_code_too: + Py_XDECREF((PyObject*)co); + co = NULL; + } + end: + Py_XDECREF(kwds); + Py_XDECREF(argcount); + Py_XDECREF(posonlyargcount); + Py_XDECREF(kwonlyargcount); + Py_XDECREF(nlocals); + Py_XDECREF(stacksize); + Py_XDECREF(replace); + Py_XDECREF(call_result); + Py_XDECREF(empty); + if (type) { + PyErr_Restore(type, value, traceback); + } + return co; + } +#else + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#endif + #define __Pyx_DefaultClassType PyType_Type +#endif +#ifndef Py_TPFLAGS_CHECKTYPES + #define Py_TPFLAGS_CHECKTYPES 0 +#endif +#ifndef Py_TPFLAGS_HAVE_INDEX + #define Py_TPFLAGS_HAVE_INDEX 0 +#endif +#ifndef Py_TPFLAGS_HAVE_NEWBUFFER + #define Py_TPFLAGS_HAVE_NEWBUFFER 0 +#endif +#ifndef Py_TPFLAGS_HAVE_FINALIZE + #define Py_TPFLAGS_HAVE_FINALIZE 0 +#endif +#ifndef METH_STACKLESS + #define METH_STACKLESS 0 +#endif +#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) + #ifndef METH_FASTCALL + #define METH_FASTCALL 0x80 + #endif + typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); + typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, + Py_ssize_t nargs, PyObject *kwnames); +#else + #define __Pyx_PyCFunctionFast _PyCFunctionFast + #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords +#endif +#if CYTHON_FAST_PYCCALL +#define __Pyx_PyFastCFunction_Check(func)\ + ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))))) +#else +#define __Pyx_PyFastCFunction_Check(func) 0 +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) + #define PyObject_Realloc(p) PyMem_Realloc(p) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030400A1 + #define PyMem_RawMalloc(n) PyMem_Malloc(n) + #define PyMem_RawRealloc(p, n) PyMem_Realloc(p, n) + #define PyMem_RawFree(p) PyMem_Free(p) +#endif +#if CYTHON_COMPILING_IN_PYSTON + #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno) +#else + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) +#endif +#if !CYTHON_FAST_THREAD_STATE || PY_VERSION_HEX < 0x02070000 + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#elif PY_VERSION_HEX >= 0x03060000 + #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() +#elif PY_VERSION_HEX >= 0x03000000 + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#else + #define __Pyx_PyThreadState_Current _PyThreadState_Current +#endif +#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) +#include "pythread.h" +#define Py_tss_NEEDS_INIT 0 +typedef int Py_tss_t; +static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); + return 0; +} +static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { + Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); + *key = Py_tss_NEEDS_INIT; + return key; +} +static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { + PyObject_Free(key); +} +static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { + return *key != Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { + PyThread_delete_key(*key); + *key = Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + return PyThread_set_key_value(*key, value); +} +static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); +} +#endif +#if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) +#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) +#else +#define __Pyx_PyDict_NewPresized(n) PyDict_New() +#endif +#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION + #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) +#else + #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && CYTHON_USE_UNICODE_INTERNALS +#define __Pyx_PyDict_GetItemStr(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) +#else +#define __Pyx_PyDict_GetItemStr(dict, name) PyDict_GetItem(dict, name) +#endif +#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 + #if defined(PyUnicode_IS_READY) + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) + #else + #define __Pyx_PyUnicode_READY(op) (0) + #endif + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) + #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) + #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) + #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) + #if defined(PyUnicode_IS_READY) && defined(PyUnicode_GET_SIZE) + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) + #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) + #endif + #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) + #endif +#else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 + #define PyUnicode_2BYTE_KIND 2 + #define PyUnicode_4BYTE_KIND 4 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111) + #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) + #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) +#else + #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ + PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) + #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check) + #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format) + #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) +#endif +#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) +#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) +#else + #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) +#endif +#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) + #define PyObject_ASCII(o) PyObject_Repr(o) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBaseString_Type PyUnicode_Type + #define PyStringObject PyUnicodeObject + #define PyString_Type PyUnicode_Type + #define PyString_Check PyUnicode_Check + #define PyString_CheckExact PyUnicode_CheckExact +#ifndef PyObject_Unicode + #define PyObject_Unicode PyObject_Str +#endif +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) + #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) +#else + #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) + #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) +#endif +#ifndef PySet_CheckExact + #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) +#endif +#if PY_VERSION_HEX >= 0x030900A4 + #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) +#else + #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) +#endif +#if CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) +#else + #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyIntObject PyLongObject + #define PyInt_Type PyLong_Type + #define PyInt_Check(op) PyLong_Check(op) + #define PyInt_CheckExact(op) PyLong_CheckExact(op) + #define PyInt_FromString PyLong_FromString + #define PyInt_FromUnicode PyLong_FromUnicode + #define PyInt_FromLong PyLong_FromLong + #define PyInt_FromSize_t PyLong_FromSize_t + #define PyInt_FromSsize_t PyLong_FromSsize_t + #define PyInt_AsLong PyLong_AsLong + #define PyInt_AS_LONG PyLong_AS_LONG + #define PyInt_AsSsize_t PyLong_AsSsize_t + #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask + #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask + #define PyNumber_Int PyNumber_Long +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBoolObject PyLongObject +#endif +#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY + #ifndef PyUnicode_InternFromString + #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) + #endif +#endif +#if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong + #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t +#else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t + #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyMethod_New(func, self, klass) ((self) ? ((void)(klass), PyMethod_New(func, self)) : __Pyx_NewRef(func)) +#else + #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) +#endif +#if CYTHON_USE_ASYNC_SLOTS + #if PY_VERSION_HEX >= 0x030500B1 + #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods + #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) + #else + #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) + #endif +#else + #define __Pyx_PyType_AsAsync(obj) NULL +#endif +#ifndef __Pyx_PyAsyncMethodsStruct + typedef struct { + unaryfunc am_await; + unaryfunc am_aiter; + unaryfunc am_anext; + } __Pyx_PyAsyncMethodsStruct; +#endif + +#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) + #if !defined(_USE_MATH_DEFINES) + #define _USE_MATH_DEFINES + #endif +#endif +#include <math.h> +#ifdef NAN +#define __PYX_NAN() ((float) NAN) +#else +static CYTHON_INLINE float __PYX_NAN() { + float value; + memset(&value, 0xFF, sizeof(value)); + return value; +} +#endif +#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) +#define __Pyx_truncl trunc +#else +#define __Pyx_truncl truncl +#endif + +#define __PYX_MARK_ERR_POS(f_index, lineno) \ + { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } +#define __PYX_ERR(f_index, lineno, Ln_error) \ + { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } + +#ifndef __PYX_EXTERN_C + #ifdef __cplusplus + #define __PYX_EXTERN_C extern "C" + #else + #define __PYX_EXTERN_C extern + #endif +#endif + +#define __PYX_HAVE__setup_cython +#define __PYX_HAVE_API__setup_cython +/* Early includes */ +#ifdef _OPENMP +#include <omp.h> +#endif /* _OPENMP */ + +#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) +#define CYTHON_WITHOUT_ASSERTIONS +#endif + +typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; + const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; + +#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) +#define __PYX_DEFAULT_STRING_ENCODING "" +#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString +#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#define __Pyx_uchar_cast(c) ((unsigned char)c) +#define __Pyx_long_cast(x) ((long)x) +#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ + (sizeof(type) < sizeof(Py_ssize_t)) ||\ + (sizeof(type) > sizeof(Py_ssize_t) &&\ + likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX) &&\ + (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ + v == (type)PY_SSIZE_T_MIN))) ||\ + (sizeof(type) == sizeof(Py_ssize_t) &&\ + (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX))) ) +static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { + return (size_t) i < (size_t) limit; +} +#if defined (__cplusplus) && __cplusplus >= 201103L + #include <cstdlib> + #define __Pyx_sst_abs(value) std::abs(value) +#elif SIZEOF_INT >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) abs(value) +#elif SIZEOF_LONG >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) labs(value) +#elif defined (_MSC_VER) + #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define __Pyx_sst_abs(value) llabs(value) +#elif defined (__GNUC__) + #define __Pyx_sst_abs(value) __builtin_llabs(value) +#else + #define __Pyx_sst_abs(value) ((value<0) ? -value : value) +#endif +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); +#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) +#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) +#define __Pyx_PyBytes_FromString PyBytes_FromString +#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#else + #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize +#endif +#define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyObject_AsWritableString(s) ((char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) +#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) +#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) +#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) +#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { + const Py_UNICODE *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) +#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode +#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode +#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) +#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); +#define __Pyx_PySequence_Tuple(obj)\ + (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); +static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); +#if CYTHON_ASSUME_SAFE_MACROS +#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) +#else +#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) +#endif +#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) +#else +#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) +#endif +#define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x)) +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII +static int __Pyx_sys_getdefaultencoding_not_ascii; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + PyObject* ascii_chars_u = NULL; + PyObject* ascii_chars_b = NULL; + const char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + if (strcmp(default_encoding_c, "ascii") == 0) { + __Pyx_sys_getdefaultencoding_not_ascii = 0; + } else { + char ascii_chars[128]; + int c; + for (c = 0; c < 128; c++) { + ascii_chars[c] = c; + } + __Pyx_sys_getdefaultencoding_not_ascii = 1; + ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); + if (!ascii_chars_u) goto bad; + ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); + if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { + PyErr_Format( + PyExc_ValueError, + "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", + default_encoding_c); + goto bad; + } + Py_DECREF(ascii_chars_u); + Py_DECREF(ascii_chars_b); + } + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + Py_XDECREF(ascii_chars_u); + Py_XDECREF(ascii_chars_b); + return -1; +} +#endif +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) +#else +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +static char* __PYX_DEFAULT_STRING_ENCODING; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); + if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; + strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + return -1; +} +#endif +#endif + + +/* Test for GCC > 2.95 */ +#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) + #define likely(x) __builtin_expect(!!(x), 1) + #define unlikely(x) __builtin_expect(!!(x), 0) +#else /* !__GNUC__ or GCC < 2.95 */ + #define likely(x) (x) + #define unlikely(x) (x) +#endif /* __GNUC__ */ +static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } + +static PyObject *__pyx_m = NULL; +static PyObject *__pyx_d; +static PyObject *__pyx_b; +static PyObject *__pyx_cython_runtime = NULL; +static PyObject *__pyx_empty_tuple; +static PyObject *__pyx_empty_bytes; +static PyObject *__pyx_empty_unicode; +static int __pyx_lineno; +static int __pyx_clineno = 0; +static const char * __pyx_cfilenm= __FILE__; +static const char *__pyx_filename; + + +static const char *__pyx_f[] = { + "setup_cython.py", +}; + +/*--- Type declarations ---*/ + +/* --- Runtime support code (head) --- */ +/* Refnanny.proto */ +#ifndef CYTHON_REFNANNY + #define CYTHON_REFNANNY 0 +#endif +#if CYTHON_REFNANNY + typedef struct { + void (*INCREF)(void*, PyObject*, int); + void (*DECREF)(void*, PyObject*, int); + void (*GOTREF)(void*, PyObject*, int); + void (*GIVEREF)(void*, PyObject*, int); + void* (*SetupContext)(const char*, int, const char*); + void (*FinishContext)(void**); + } __Pyx_RefNannyAPIStruct; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); + #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; +#ifdef WITH_THREAD + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + if (acquire_gil) {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ + PyGILState_Release(__pyx_gilstate_save);\ + } else {\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ + } +#else + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) +#endif + #define __Pyx_RefNannyFinishContext()\ + __Pyx_RefNanny->FinishContext(&__pyx_refnanny) + #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) + #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) + #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) + #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) +#else + #define __Pyx_RefNannyDeclarations + #define __Pyx_RefNannySetupContext(name, acquire_gil) + #define __Pyx_RefNannyFinishContext() + #define __Pyx_INCREF(r) Py_INCREF(r) + #define __Pyx_DECREF(r) Py_DECREF(r) + #define __Pyx_GOTREF(r) + #define __Pyx_GIVEREF(r) + #define __Pyx_XINCREF(r) Py_XINCREF(r) + #define __Pyx_XDECREF(r) Py_XDECREF(r) + #define __Pyx_XGOTREF(r) + #define __Pyx_XGIVEREF(r) +#endif +#define __Pyx_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_XDECREF(tmp);\ + } while (0) +#define __Pyx_DECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_DECREF(tmp);\ + } while (0) +#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) +#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) + +/* PyObjectGetAttrStr.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) +#endif + +/* Import.proto */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); + +/* ImportFrom.proto */ +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); + +/* GetBuiltinName.proto */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name); + +/* PyDictVersioning.proto */ +#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) +#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ + (version_var) = __PYX_GET_DICT_VERSION(dict);\ + (cache_var) = (value); +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ + (VAR) = __pyx_dict_cached_value;\ + } else {\ + (VAR) = __pyx_dict_cached_value = (LOOKUP);\ + __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ + }\ +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); +#else +#define __PYX_GET_DICT_VERSION(dict) (0) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); +#endif + +/* GetModuleGlobalName.proto */ +#if CYTHON_USE_DICT_VERSIONS +#define __Pyx_GetModuleGlobalName(var, name) {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ + (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ + __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} +#define __Pyx_GetModuleGlobalNameUncached(var, name) {\ + PY_UINT64_T __pyx_dict_version;\ + PyObject *__pyx_dict_cached_value;\ + (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); +#else +#define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) +#define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); +#endif + +/* PyCFunctionFastCall.proto */ +#if CYTHON_FAST_PYCCALL +static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs); +#else +#define __Pyx_PyCFunction_FastCall(func, args, nargs) (assert(0), NULL) +#endif + +/* PyFunctionFastCall.proto */ +#if CYTHON_FAST_PYCALL +#define __Pyx_PyFunction_FastCall(func, args, nargs)\ + __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) +#if 1 || PY_VERSION_HEX < 0x030600B1 +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); +#else +#define __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs) _PyFunction_FastCallDict(func, args, nargs, kwargs) +#endif +#define __Pyx_BUILD_ASSERT_EXPR(cond)\ + (sizeof(char [1 - 2*!(cond)]) - 1) +#ifndef Py_MEMBER_SIZE +#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) +#endif +#if CYTHON_FAST_PYCALL + static size_t __pyx_pyframe_localsplus_offset = 0; + #include "frameobject.h" +#if PY_VERSION_HEX >= 0x030b00a6 + #ifndef Py_BUILD_CORE + #define Py_BUILD_CORE 1 + #endif + #include "internal/pycore_frame.h" +#endif + #define __Pxy_PyFrame_Initialize_Offsets()\ + ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ + (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) + #define __Pyx_PyFrame_GetLocalsplus(frame)\ + (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) +#endif // CYTHON_FAST_PYCALL +#endif + +/* PyObjectCall.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); +#else +#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) +#endif + +/* PyObjectCallMethO.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); +#endif + +/* PyObjectCallOneArg.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); + +/* PyThreadStateGet.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; +#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; +#define __Pyx_PyErr_Occurred() __pyx_tstate->curexc_type +#else +#define __Pyx_PyThreadState_declare +#define __Pyx_PyThreadState_assign +#define __Pyx_PyErr_Occurred() PyErr_Occurred() +#endif + +/* PyErrFetchRestore.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) +#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) +#else +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#endif +#else +#define __Pyx_PyErr_Clear() PyErr_Clear() +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) +#endif + +/* CLineInTraceback.proto */ +#ifdef CYTHON_CLINE_IN_TRACEBACK +#define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) +#else +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); +#endif + +/* CodeObjectCache.proto */ +typedef struct { + PyCodeObject* code_object; + int code_line; +} __Pyx_CodeObjectCacheEntry; +struct __Pyx_CodeObjectCache { + int count; + int max_count; + __Pyx_CodeObjectCacheEntry* entries; +}; +static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); +static PyCodeObject *__pyx_find_code_object(int code_line); +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); + +/* AddTraceback.proto */ +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename); + +/* GCCDiagnostics.proto */ +#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +#define __Pyx_HAS_GCC_DIAGNOSTIC +#endif + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +/* CIntFromPy.proto */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); + +/* FastTypeChecks.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); +#else +#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) +#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) +#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) +#endif +#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) + +/* CheckBinaryVersion.proto */ +static int __Pyx_check_binary_version(void); + +/* InitStrings.proto */ +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); + + +/* Module declarations from 'setup_cython' */ +#define __Pyx_MODULE_NAME "setup_cython" +extern int __pyx_module_is_main_setup_cython; +int __pyx_module_is_main_setup_cython = 0; + +/* Implementation of 'setup_cython' */ +static const char __pyx_k_main[] = "__main__"; +static const char __pyx_k_name[] = "__name__"; +static const char __pyx_k_test[] = "__test__"; +static const char __pyx_k_setup[] = "setup"; +static const char __pyx_k_import[] = "__import__"; +static const char __pyx_k_name_2[] = "name"; +static const char __pyx_k_Test_app[] = "Test app"; +static const char __pyx_k_zip_safe[] = "zip_safe"; +static const char __pyx_k_Extension[] = "Extension"; +static const char __pyx_k_cythonize[] = "cythonize"; +static const char __pyx_k_setuptools[] = "setuptools"; +static const char __pyx_k_ext_modules[] = "ext_modules"; +static const char __pyx_k_Cython_Build[] = "Cython.Build"; +static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; +static const char __pyx_k_geesedb_index_cython_test_pyx[] = "geesedb/index/cython/test.pyx"; +static PyObject *__pyx_n_s_Cython_Build; +static PyObject *__pyx_n_s_Extension; +static PyObject *__pyx_kp_s_Test_app; +static PyObject *__pyx_n_s_cline_in_traceback; +static PyObject *__pyx_n_s_cythonize; +static PyObject *__pyx_n_s_ext_modules; +static PyObject *__pyx_kp_s_geesedb_index_cython_test_pyx; +static PyObject *__pyx_n_s_import; +static PyObject *__pyx_n_s_main; +static PyObject *__pyx_n_s_name; +static PyObject *__pyx_n_s_name_2; +static PyObject *__pyx_n_s_setup; +static PyObject *__pyx_n_s_setuptools; +static PyObject *__pyx_n_s_test; +static PyObject *__pyx_n_s_zip_safe; +/* Late includes */ + +static PyMethodDef __pyx_methods[] = { + {0, 0, 0, 0} +}; + +#if PY_MAJOR_VERSION >= 3 +#if CYTHON_PEP489_MULTI_PHASE_INIT +static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ +static int __pyx_pymod_exec_setup_cython(PyObject* module); /*proto*/ +static PyModuleDef_Slot __pyx_moduledef_slots[] = { + {Py_mod_create, (void*)__pyx_pymod_create}, + {Py_mod_exec, (void*)__pyx_pymod_exec_setup_cython}, + {0, NULL} +}; +#endif + +static struct PyModuleDef __pyx_moduledef = { + PyModuleDef_HEAD_INIT, + "setup_cython", + 0, /* m_doc */ + #if CYTHON_PEP489_MULTI_PHASE_INIT + 0, /* m_size */ + #else + -1, /* m_size */ + #endif + __pyx_methods /* m_methods */, + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_moduledef_slots, /* m_slots */ + #else + NULL, /* m_reload */ + #endif + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ +}; +#endif +#ifndef CYTHON_SMALL_CODE +#if defined(__clang__) + #define CYTHON_SMALL_CODE +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) + #define CYTHON_SMALL_CODE __attribute__((cold)) +#else + #define CYTHON_SMALL_CODE +#endif +#endif + +static __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_n_s_Cython_Build, __pyx_k_Cython_Build, sizeof(__pyx_k_Cython_Build), 0, 0, 1, 1}, + {&__pyx_n_s_Extension, __pyx_k_Extension, sizeof(__pyx_k_Extension), 0, 0, 1, 1}, + {&__pyx_kp_s_Test_app, __pyx_k_Test_app, sizeof(__pyx_k_Test_app), 0, 0, 1, 0}, + {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, + {&__pyx_n_s_cythonize, __pyx_k_cythonize, sizeof(__pyx_k_cythonize), 0, 0, 1, 1}, + {&__pyx_n_s_ext_modules, __pyx_k_ext_modules, sizeof(__pyx_k_ext_modules), 0, 0, 1, 1}, + {&__pyx_kp_s_geesedb_index_cython_test_pyx, __pyx_k_geesedb_index_cython_test_pyx, sizeof(__pyx_k_geesedb_index_cython_test_pyx), 0, 0, 1, 0}, + {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, + {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, + {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, + {&__pyx_n_s_name_2, __pyx_k_name_2, sizeof(__pyx_k_name_2), 0, 0, 1, 1}, + {&__pyx_n_s_setup, __pyx_k_setup, sizeof(__pyx_k_setup), 0, 0, 1, 1}, + {&__pyx_n_s_setuptools, __pyx_k_setuptools, sizeof(__pyx_k_setuptools), 0, 0, 1, 1}, + {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, + {&__pyx_n_s_zip_safe, __pyx_k_zip_safe, sizeof(__pyx_k_zip_safe), 0, 0, 1, 1}, + {0, 0, 0, 0, 0, 0, 0} +}; +static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { + return 0; +} + +static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); + __Pyx_RefNannyFinishContext(); + return 0; +} + +static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { + if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); + return 0; + __pyx_L1_error:; + return -1; +} + +static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ + +static int __Pyx_modinit_global_init_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); + /*--- Global init code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_variable_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); + /*--- Variable export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); + /*--- Function export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_type_init_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); + /*--- Type init code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_type_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); + /*--- Type import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_variable_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); + /*--- Variable import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); + /*--- Function import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + + +#ifndef CYTHON_NO_PYINIT_EXPORT +#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC +#elif PY_MAJOR_VERSION < 3 +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" void +#else +#define __Pyx_PyMODINIT_FUNC void +#endif +#else +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * +#else +#define __Pyx_PyMODINIT_FUNC PyObject * +#endif +#endif + + +#if PY_MAJOR_VERSION < 3 +__Pyx_PyMODINIT_FUNC initsetup_cython(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC initsetup_cython(void) +#else +__Pyx_PyMODINIT_FUNC PyInit_setup_cython(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC PyInit_setup_cython(void) +#if CYTHON_PEP489_MULTI_PHASE_INIT +{ + return PyModuleDef_Init(&__pyx_moduledef); +} +static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { + #if PY_VERSION_HEX >= 0x030700A1 + static PY_INT64_T main_interpreter_id = -1; + PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); + if (main_interpreter_id == -1) { + main_interpreter_id = current_id; + return (unlikely(current_id == -1)) ? -1 : 0; + } else if (unlikely(main_interpreter_id != current_id)) + #else + static PyInterpreterState *main_interpreter = NULL; + PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; + if (!main_interpreter) { + main_interpreter = current_interpreter; + } else if (unlikely(main_interpreter != current_interpreter)) + #endif + { + PyErr_SetString( + PyExc_ImportError, + "Interpreter change detected - this module can only be loaded into one interpreter per process."); + return -1; + } + return 0; +} +static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) { + PyObject *value = PyObject_GetAttrString(spec, from_name); + int result = 0; + if (likely(value)) { + if (allow_none || value != Py_None) { + result = PyDict_SetItemString(moddict, to_name, value); + } + Py_DECREF(value); + } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); + } else { + result = -1; + } + return result; +} +static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, CYTHON_UNUSED PyModuleDef *def) { + PyObject *module = NULL, *moddict, *modname; + if (__Pyx_check_single_interpreter()) + return NULL; + if (__pyx_m) + return __Pyx_NewRef(__pyx_m); + modname = PyObject_GetAttrString(spec, "name"); + if (unlikely(!modname)) goto bad; + module = PyModule_NewObject(modname); + Py_DECREF(modname); + if (unlikely(!module)) goto bad; + moddict = PyModule_GetDict(module); + if (unlikely(!moddict)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; + return module; +bad: + Py_XDECREF(module); + return NULL; +} + + +static CYTHON_SMALL_CODE int __pyx_pymod_exec_setup_cython(PyObject *__pyx_pyinit_module) +#endif +#endif +{ + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m) { + if (__pyx_m == __pyx_pyinit_module) return 0; + PyErr_SetString(PyExc_RuntimeError, "Module 'setup_cython' has already been imported. Re-initialisation is not supported."); + return -1; + } + #elif PY_MAJOR_VERSION >= 3 + if (__pyx_m) return __Pyx_NewRef(__pyx_m); + #endif + #if CYTHON_REFNANNY +__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); +if (!__Pyx_RefNanny) { + PyErr_Clear(); + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); + if (!__Pyx_RefNanny) + Py_FatalError("failed to import 'refnanny' module"); +} +#endif + __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit_setup_cython(void)", 0); + if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pxy_PyFrame_Initialize_Offsets + __Pxy_PyFrame_Initialize_Offsets(); + #endif + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pyx_CyFunction_USED + if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_FusedFunction_USED + if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Coroutine_USED + if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Generator_USED + if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_AsyncGen_USED + if (__pyx_AsyncGen_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_StopAsyncIteration_USED + if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + /*--- Library function declarations ---*/ + /*--- Threads initialization code ---*/ + #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + PyEval_InitThreads(); + #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; + Py_INCREF(__pyx_m); + #else + #if PY_MAJOR_VERSION < 3 + __pyx_m = Py_InitModule4("setup_cython", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); + #else + __pyx_m = PyModule_Create(&__pyx_moduledef); + #endif + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_d); + __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_b); + __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_cython_runtime); + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); + /*--- Initialize various global constants etc. ---*/ + if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + if (__pyx_module_is_main_setup_cython) { + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + } + #if PY_MAJOR_VERSION >= 3 + { + PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) + if (!PyDict_GetItemString(modules, "setup_cython")) { + if (unlikely(PyDict_SetItemString(modules, "setup_cython", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) + } + } + #endif + /*--- Builtin init code ---*/ + if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Constants init code ---*/ + if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Global type/function init code ---*/ + (void)__Pyx_modinit_global_init_code(); + (void)__Pyx_modinit_variable_export_code(); + (void)__Pyx_modinit_function_export_code(); + (void)__Pyx_modinit_type_init_code(); + (void)__Pyx_modinit_type_import_code(); + (void)__Pyx_modinit_variable_import_code(); + (void)__Pyx_modinit_function_import_code(); + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + + /* "setup_cython.py":1 + * from setuptools import setup, Extension # <<<<<<<<<<<<<< + * from Cython.Build import cythonize + * + */ + __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_s_setup); + __Pyx_GIVEREF(__pyx_n_s_setup); + PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_setup); + __Pyx_INCREF(__pyx_n_s_Extension); + __Pyx_GIVEREF(__pyx_n_s_Extension); + PyList_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_Extension); + __pyx_t_2 = __Pyx_Import(__pyx_n_s_setuptools, __pyx_t_1, -1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_setup); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_setup, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_Extension); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_Extension, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "setup_cython.py":2 + * from setuptools import setup, Extension + * from Cython.Build import cythonize # <<<<<<<<<<<<<< + * + * setup( + */ + __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_s_cythonize); + __Pyx_GIVEREF(__pyx_n_s_cythonize); + PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_cythonize); + __pyx_t_1 = __Pyx_Import(__pyx_n_s_Cython_Build, __pyx_t_2, -1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_cythonize); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_cythonize, __pyx_t_2) < 0) __PYX_ERR(0, 2, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "setup_cython.py":4 + * from Cython.Build import cythonize + * + * setup( # <<<<<<<<<<<<<< + * name='Test app', + * ext_modules=cythonize(["geesedb/index/cython/test.pyx"]), + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_setup); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + + /* "setup_cython.py":5 + * + * setup( + * name='Test app', # <<<<<<<<<<<<<< + * ext_modules=cythonize(["geesedb/index/cython/test.pyx"]), + * zip_safe=False, + */ + __pyx_t_2 = __Pyx_PyDict_NewPresized(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_name_2, __pyx_kp_s_Test_app) < 0) __PYX_ERR(0, 5, __pyx_L1_error) + + /* "setup_cython.py":6 + * setup( + * name='Test app', + * ext_modules=cythonize(["geesedb/index/cython/test.pyx"]), # <<<<<<<<<<<<<< + * zip_safe=False, + * ) + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_cythonize); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyList_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(__pyx_kp_s_geesedb_index_cython_test_pyx); + __Pyx_GIVEREF(__pyx_kp_s_geesedb_index_cython_test_pyx); + PyList_SET_ITEM(__pyx_t_4, 0, __pyx_kp_s_geesedb_index_cython_test_pyx); + __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_ext_modules, __pyx_t_5) < 0) __PYX_ERR(0, 5, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "setup_cython.py":7 + * name='Test app', + * ext_modules=cythonize(["geesedb/index/cython/test.pyx"]), + * zip_safe=False, # <<<<<<<<<<<<<< + * ) + */ + if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_zip_safe, Py_False) < 0) __PYX_ERR(0, 5, __pyx_L1_error) + + /* "setup_cython.py":4 + * from Cython.Build import cythonize + * + * setup( # <<<<<<<<<<<<<< + * name='Test app', + * ext_modules=cythonize(["geesedb/index/cython/test.pyx"]), + */ + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_empty_tuple, __pyx_t_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "setup_cython.py":1 + * from setuptools import setup, Extension # <<<<<<<<<<<<<< + * from Cython.Build import cythonize + * + */ + __pyx_t_5 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_5) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + + /*--- Wrapped vars code ---*/ + + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + if (__pyx_m) { + if (__pyx_d) { + __Pyx_AddTraceback("init setup_cython", __pyx_clineno, __pyx_lineno, __pyx_filename); + } + Py_CLEAR(__pyx_m); + } else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ImportError, "init setup_cython"); + } + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + #if CYTHON_PEP489_MULTI_PHASE_INIT + return (__pyx_m != NULL) ? 0 : -1; + #elif PY_MAJOR_VERSION >= 3 + return __pyx_m; + #else + return; + #endif +} + +/* --- Runtime support code --- */ +/* Refnanny */ +#if CYTHON_REFNANNY +static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { + PyObject *m = NULL, *p = NULL; + void *r = NULL; + m = PyImport_ImportModule(modname); + if (!m) goto end; + p = PyObject_GetAttrString(m, "RefNannyAPI"); + if (!p) goto end; + r = PyLong_AsVoidPtr(p); +end: + Py_XDECREF(p); + Py_XDECREF(m); + return (__Pyx_RefNannyAPIStruct *)r; +} +#endif + +/* PyObjectGetAttrStr */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro)) + return tp->tp_getattro(obj, attr_name); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_getattr)) + return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); +#endif + return PyObject_GetAttr(obj, attr_name); +} +#endif + +/* Import */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { + PyObject *empty_list = 0; + PyObject *module = 0; + PyObject *global_dict = 0; + PyObject *empty_dict = 0; + PyObject *list; + #if PY_MAJOR_VERSION < 3 + PyObject *py_import; + py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); + if (!py_import) + goto bad; + #endif + if (from_list) + list = from_list; + else { + empty_list = PyList_New(0); + if (!empty_list) + goto bad; + list = empty_list; + } + global_dict = PyModule_GetDict(__pyx_m); + if (!global_dict) + goto bad; + empty_dict = PyDict_New(); + if (!empty_dict) + goto bad; + { + #if PY_MAJOR_VERSION >= 3 + if (level == -1) { + if ((1) && (strchr(__Pyx_MODULE_NAME, '.'))) { + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, 1); + if (!module) { + if (!PyErr_ExceptionMatches(PyExc_ImportError)) + goto bad; + PyErr_Clear(); + } + } + level = 0; + } + #endif + if (!module) { + #if PY_MAJOR_VERSION < 3 + PyObject *py_level = PyInt_FromLong(level); + if (!py_level) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, global_dict, empty_dict, list, py_level, (PyObject *)NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, level); + #endif + } + } +bad: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_import); + #endif + Py_XDECREF(empty_list); + Py_XDECREF(empty_dict); + return module; +} + +/* ImportFrom */ +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { + PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); + if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Format(PyExc_ImportError, + #if PY_MAJOR_VERSION < 3 + "cannot import name %.230s", PyString_AS_STRING(name)); + #else + "cannot import name %S", name); + #endif + } + return value; +} + +/* GetBuiltinName */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name) { + PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); + if (unlikely(!result)) { + PyErr_Format(PyExc_NameError, +#if PY_MAJOR_VERSION >= 3 + "name '%U' is not defined", name); +#else + "name '%.200s' is not defined", PyString_AS_STRING(name)); +#endif + } + return result; +} + +/* PyDictVersioning */ +#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { + PyObject **dictptr = NULL; + Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; + if (offset) { +#if CYTHON_COMPILING_IN_CPYTHON + dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); +#else + dictptr = _PyObject_GetDictPtr(obj); +#endif + } + return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; +} +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) + return 0; + return obj_dict_version == __Pyx_get_object_dict_version(obj); +} +#endif + +/* GetModuleGlobalName */ +#if CYTHON_USE_DICT_VERSIONS +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) +#else +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) +#endif +{ + PyObject *result; +#if !CYTHON_AVOID_BORROWED_REFS +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 + result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } else if (unlikely(PyErr_Occurred())) { + return NULL; + } +#else + result = PyDict_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } +#endif +#else + result = PyObject_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } + PyErr_Clear(); +#endif + return __Pyx_GetBuiltinName(name); +} + +/* PyCFunctionFastCall */ +#if CYTHON_FAST_PYCCALL +static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) { + PyCFunctionObject *func = (PyCFunctionObject*)func_obj; + PyCFunction meth = PyCFunction_GET_FUNCTION(func); + PyObject *self = PyCFunction_GET_SELF(func); + int flags = PyCFunction_GET_FLAGS(func); + assert(PyCFunction_Check(func)); + assert(METH_FASTCALL == (flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))); + assert(nargs >= 0); + assert(nargs == 0 || args != NULL); + /* _PyCFunction_FastCallDict() must not be called with an exception set, + because it may clear it (directly or indirectly) and so the + caller loses its exception */ + assert(!PyErr_Occurred()); + if ((PY_VERSION_HEX < 0x030700A0) || unlikely(flags & METH_KEYWORDS)) { + return (*((__Pyx_PyCFunctionFastWithKeywords)(void*)meth)) (self, args, nargs, NULL); + } else { + return (*((__Pyx_PyCFunctionFast)(void*)meth)) (self, args, nargs); + } +} +#endif + +/* PyFunctionFastCall */ +#if CYTHON_FAST_PYCALL +static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, + PyObject *globals) { + PyFrameObject *f; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject **fastlocals; + Py_ssize_t i; + PyObject *result; + assert(globals != NULL); + /* XXX Perhaps we should create a specialized + PyFrame_New() that doesn't take locals, but does + take builtins without sanity checking them. + */ + assert(tstate != NULL); + f = PyFrame_New(tstate, co, globals, NULL); + if (f == NULL) { + return NULL; + } + fastlocals = __Pyx_PyFrame_GetLocalsplus(f); + for (i = 0; i < na; i++) { + Py_INCREF(*args); + fastlocals[i] = *args++; + } + result = PyEval_EvalFrameEx(f,0); + ++tstate->recursion_depth; + Py_DECREF(f); + --tstate->recursion_depth; + return result; +} +#if 1 || PY_VERSION_HEX < 0x030600B1 +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { + PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); + PyObject *globals = PyFunction_GET_GLOBALS(func); + PyObject *argdefs = PyFunction_GET_DEFAULTS(func); + PyObject *closure; +#if PY_MAJOR_VERSION >= 3 + PyObject *kwdefs; +#endif + PyObject *kwtuple, **k; + PyObject **d; + Py_ssize_t nd; + Py_ssize_t nk; + PyObject *result; + assert(kwargs == NULL || PyDict_Check(kwargs)); + nk = kwargs ? PyDict_Size(kwargs) : 0; + if (Py_EnterRecursiveCall((char*)" while calling a Python object")) { + return NULL; + } + if ( +#if PY_MAJOR_VERSION >= 3 + co->co_kwonlyargcount == 0 && +#endif + likely(kwargs == NULL || nk == 0) && + co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { + if (argdefs == NULL && co->co_argcount == nargs) { + result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); + goto done; + } + else if (nargs == 0 && argdefs != NULL + && co->co_argcount == Py_SIZE(argdefs)) { + /* function called with no arguments, but all parameters have + a default value: use default values as arguments .*/ + args = &PyTuple_GET_ITEM(argdefs, 0); + result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); + goto done; + } + } + if (kwargs != NULL) { + Py_ssize_t pos, i; + kwtuple = PyTuple_New(2 * nk); + if (kwtuple == NULL) { + result = NULL; + goto done; + } + k = &PyTuple_GET_ITEM(kwtuple, 0); + pos = i = 0; + while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { + Py_INCREF(k[i]); + Py_INCREF(k[i+1]); + i += 2; + } + nk = i / 2; + } + else { + kwtuple = NULL; + k = NULL; + } + closure = PyFunction_GET_CLOSURE(func); +#if PY_MAJOR_VERSION >= 3 + kwdefs = PyFunction_GET_KW_DEFAULTS(func); +#endif + if (argdefs != NULL) { + d = &PyTuple_GET_ITEM(argdefs, 0); + nd = Py_SIZE(argdefs); + } + else { + d = NULL; + nd = 0; + } +#if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); +#else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, closure); +#endif + Py_XDECREF(kwtuple); +done: + Py_LeaveRecursiveCall(); + return result; +} +#endif +#endif + +/* PyObjectCall */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *result; + ternaryfunc call = Py_TYPE(func)->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + result = (*call)(func, arg, kw); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectCallMethO */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { + PyObject *self, *result; + PyCFunction cfunc; + cfunc = PyCFunction_GET_FUNCTION(func); + self = PyCFunction_GET_SELF(func); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + result = cfunc(self, arg); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectCallOneArg */ +#if CYTHON_COMPILING_IN_CPYTHON +static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *result; + PyObject *args = PyTuple_New(1); + if (unlikely(!args)) return NULL; + Py_INCREF(arg); + PyTuple_SET_ITEM(args, 0, arg); + result = __Pyx_PyObject_Call(func, args, NULL); + Py_DECREF(args); + return result; +} +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { +#if CYTHON_FAST_PYCALL + if (PyFunction_Check(func)) { + return __Pyx_PyFunction_FastCall(func, &arg, 1); + } +#endif + if (likely(PyCFunction_Check(func))) { + if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) { + return __Pyx_PyObject_CallMethO(func, arg); +#if CYTHON_FAST_PYCCALL + } else if (__Pyx_PyFastCFunction_Check(func)) { + return __Pyx_PyCFunction_FastCall(func, &arg, 1); +#endif + } + } + return __Pyx__PyObject_CallOneArg(func, arg); +} +#else +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *result; + PyObject *args = PyTuple_Pack(1, arg); + if (unlikely(!args)) return NULL; + result = __Pyx_PyObject_Call(func, args, NULL); + Py_DECREF(args); + return result; +} +#endif + +/* PyErrFetchRestore */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + tmp_type = tstate->curexc_type; + tmp_value = tstate->curexc_value; + tmp_tb = tstate->curexc_traceback; + tstate->curexc_type = type; + tstate->curexc_value = value; + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +} +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +} +#endif + +/* CLineInTraceback */ +#ifndef CYTHON_CLINE_IN_TRACEBACK +static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; +#if CYTHON_COMPILING_IN_CPYTHON + PyObject **cython_runtime_dict; +#endif + if (unlikely(!__pyx_cython_runtime)) { + return c_line; + } + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); +#if CYTHON_COMPILING_IN_CPYTHON + cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); + if (likely(cython_runtime_dict)) { + __PYX_PY_DICT_LOOKUP_IF_MODIFIED( + use_cline, *cython_runtime_dict, + __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) + } else +#endif + { + PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); + if (use_cline_obj) { + use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; + Py_DECREF(use_cline_obj); + } else { + PyErr_Clear(); + use_cline = NULL; + } + } + if (!use_cline) { + c_line = 0; + (void) PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); + } + else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { + c_line = 0; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + return c_line; +} +#endif + +/* CodeObjectCache */ +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { + int start = 0, mid = 0, end = count - 1; + if (end >= 0 && code_line > entries[end].code_line) { + return count; + } + while (start < end) { + mid = start + (end - start) / 2; + if (code_line < entries[mid].code_line) { + end = mid; + } else if (code_line > entries[mid].code_line) { + start = mid + 1; + } else { + return mid; + } + } + if (code_line <= entries[mid].code_line) { + return mid; + } else { + return mid + 1; + } +} +static PyCodeObject *__pyx_find_code_object(int code_line) { + PyCodeObject* code_object; + int pos; + if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { + return NULL; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { + return NULL; + } + code_object = __pyx_code_cache.entries[pos].code_object; + Py_INCREF(code_object); + return code_object; +} +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + int pos, i; + __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; + if (unlikely(!code_line)) { + return; + } + if (unlikely(!entries)) { + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); + if (likely(entries)) { + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = 64; + __pyx_code_cache.count = 1; + entries[0].code_line = code_line; + entries[0].code_object = code_object; + Py_INCREF(code_object); + } + return; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { + PyCodeObject* tmp = entries[pos].code_object; + entries[pos].code_object = code_object; + Py_DECREF(tmp); + return; + } + if (__pyx_code_cache.count == __pyx_code_cache.max_count) { + int new_max = __pyx_code_cache.max_count + 64; + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( + __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = new_max; + } + for (i=__pyx_code_cache.count; i>pos; i--) { + entries[i] = entries[i-1]; + } + entries[pos].code_line = code_line; + entries[pos].code_object = code_object; + __pyx_code_cache.count++; + Py_INCREF(code_object); +} + +/* AddTraceback */ +#include "compile.h" +#include "frameobject.h" +#include "traceback.h" +#if PY_VERSION_HEX >= 0x030b00a6 + #ifndef Py_BUILD_CORE + #define Py_BUILD_CORE 1 + #endif + #include "internal/pycore_frame.h" +#endif +static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = NULL; + PyObject *py_funcname = NULL; + #if PY_MAJOR_VERSION < 3 + PyObject *py_srcfile = NULL; + py_srcfile = PyString_FromString(filename); + if (!py_srcfile) goto bad; + #endif + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + if (!py_funcname) goto bad; + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + if (!py_funcname) goto bad; + funcname = PyUnicode_AsUTF8(py_funcname); + if (!funcname) goto bad; + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); + if (!py_funcname) goto bad; + #endif + } + #if PY_MAJOR_VERSION < 3 + py_code = __Pyx_PyCode_New( + 0, + 0, + 0, + 0, + 0, + __pyx_empty_bytes, /*PyObject *code,*/ + __pyx_empty_tuple, /*PyObject *consts,*/ + __pyx_empty_tuple, /*PyObject *names,*/ + __pyx_empty_tuple, /*PyObject *varnames,*/ + __pyx_empty_tuple, /*PyObject *freevars,*/ + __pyx_empty_tuple, /*PyObject *cellvars,*/ + py_srcfile, /*PyObject *filename,*/ + py_funcname, /*PyObject *name,*/ + py_line, + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); + #else + py_code = PyCode_NewEmpty(filename, funcname, py_line); + #endif + Py_XDECREF(py_funcname); // XDECREF since it's only set on Py3 if cline + return py_code; +bad: + Py_XDECREF(py_funcname); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_srcfile); + #endif + return NULL; +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject *ptype, *pvalue, *ptraceback; + if (c_line) { + c_line = __Pyx_CLineForTraceback(tstate, c_line); + } + py_code = __pyx_find_code_object(c_line ? -c_line : py_line); + if (!py_code) { + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); + if (!py_code) { + /* If the code object creation fails, then we should clear the + fetched exception references and propagate the new exception */ + Py_XDECREF(ptype); + Py_XDECREF(pvalue); + Py_XDECREF(ptraceback); + goto bad; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( + tstate, /*PyThreadState *tstate,*/ + py_code, /*PyCodeObject *code,*/ + __pyx_d, /*PyObject *globals,*/ + 0 /*PyObject *locals*/ + ); + if (!py_frame) goto bad; + __Pyx_PyFrame_SetLineNumber(py_frame, py_line); + PyTraceBack_Here(py_frame); +bad: + Py_XDECREF(py_code); + Py_XDECREF(py_frame); +} + +/* CIntToPy */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(long) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(long), + little, !is_unsigned); + } +} + +/* CIntFromPyVerify */ +#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) +#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) +#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ + {\ + func_type value = func_value;\ + if (sizeof(target_type) < sizeof(func_type)) {\ + if (unlikely(value != (func_type) (target_type) value)) {\ + func_type zero = 0;\ + if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ + return (target_type) -1;\ + if (is_unsigned && unlikely(value < zero))\ + goto raise_neg_overflow;\ + else\ + goto raise_overflow;\ + }\ + }\ + return (target_type) value;\ + } + +/* CIntFromPy */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(long) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (long) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (long) 0; + case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) + case 2: + if (8 * sizeof(long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { + return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { + return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { + return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(long) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (long) 0; + case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) + case -2: + if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + } +#endif + if (sizeof(long) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + long val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (long) -1; + } + } else { + long val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (long) -1; + val = __Pyx_PyInt_As_long(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to long"); + return (long) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long) -1; +} + +/* CIntFromPy */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(int) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (int) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (int) 0; + case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) + case 2: + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { + return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { + return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { + return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(int) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (int) 0; + case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) + case -2: + if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + } +#endif + if (sizeof(int) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + int val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (int) -1; + } + } else { + int val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (int) -1; + val = __Pyx_PyInt_As_int(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to int"); + return (int) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to int"); + return (int) -1; +} + +/* FastTypeChecks */ +#if CYTHON_COMPILING_IN_CPYTHON +static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { + while (a) { + a = a->tp_base; + if (a == b) + return 1; + } + return b == &PyBaseObject_Type; +} +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (a == b) return 1; + mro = a->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(a, b); +} +#if PY_MAJOR_VERSION == 2 +static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { + PyObject *exception, *value, *tb; + int res; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&exception, &value, &tb); + res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + if (!res) { + res = PyObject_IsSubclass(err, exc_type2); + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + } + __Pyx_ErrRestore(exception, value, tb); + return res; +} +#else +static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { + int res = exc_type1 ? __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type1) : 0; + if (!res) { + res = __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); + } + return res; +} +#endif +static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + assert(PyExceptionClass_Check(exc_type)); + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; i<n; i++) { + if (exc_type == PyTuple_GET_ITEM(tuple, i)) return 1; + } +#endif + for (i=0; i<n; i++) { + PyObject *t = PyTuple_GET_ITEM(tuple, i); + #if PY_MAJOR_VERSION < 3 + if (likely(exc_type == t)) return 1; + #endif + if (likely(PyExceptionClass_Check(t))) { + if (__Pyx_inner_PyErr_GivenExceptionMatches2(exc_type, NULL, t)) return 1; + } else { + } + } + return 0; +} +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject* exc_type) { + if (likely(err == exc_type)) return 1; + if (likely(PyExceptionClass_Check(err))) { + if (likely(PyExceptionClass_Check(exc_type))) { + return __Pyx_inner_PyErr_GivenExceptionMatches2(err, NULL, exc_type); + } else if (likely(PyTuple_Check(exc_type))) { + return __Pyx_PyErr_GivenExceptionMatchesTuple(err, exc_type); + } else { + } + } + return PyErr_GivenExceptionMatches(err, exc_type); +} +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *exc_type1, PyObject *exc_type2) { + assert(PyExceptionClass_Check(exc_type1)); + assert(PyExceptionClass_Check(exc_type2)); + if (likely(err == exc_type1 || err == exc_type2)) return 1; + if (likely(PyExceptionClass_Check(err))) { + return __Pyx_inner_PyErr_GivenExceptionMatches2(err, exc_type1, exc_type2); + } + return (PyErr_GivenExceptionMatches(err, exc_type1) || PyErr_GivenExceptionMatches(err, exc_type2)); +} +#endif + +/* CheckBinaryVersion */ +static int __Pyx_check_binary_version(void) { + char ctversion[5]; + int same=1, i, found_dot; + const char* rt_from_call = Py_GetVersion(); + PyOS_snprintf(ctversion, 5, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); + found_dot = 0; + for (i = 0; i < 4; i++) { + if (!ctversion[i]) { + same = (rt_from_call[i] < '0' || rt_from_call[i] > '9'); + break; + } + if (rt_from_call[i] != ctversion[i]) { + same = 0; + break; + } + } + if (!same) { + char rtversion[5] = {'\0'}; + char message[200]; + for (i=0; i<4; ++i) { + if (rt_from_call[i] == '.') { + if (found_dot) break; + found_dot = 1; + } else if (rt_from_call[i] < '0' || rt_from_call[i] > '9') { + break; + } + rtversion[i] = rt_from_call[i]; + } + PyOS_snprintf(message, sizeof(message), + "compiletime version %s of module '%.100s' " + "does not match runtime version %s", + ctversion, __Pyx_MODULE_NAME, rtversion); + return PyErr_WarnEx(NULL, message, 1); + } + return 0; +} + +/* InitStrings */ +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { + while (t->p) { + #if PY_MAJOR_VERSION < 3 + if (t->is_unicode) { + *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); + } else if (t->intern) { + *t->p = PyString_InternFromString(t->s); + } else { + *t->p = PyString_FromStringAndSize(t->s, t->n - 1); + } + #else + if (t->is_unicode | t->is_str) { + if (t->intern) { + *t->p = PyUnicode_InternFromString(t->s); + } else if (t->encoding) { + *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); + } else { + *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); + } + } else { + *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); + } + #endif + if (!*t->p) + return -1; + if (PyObject_Hash(*t->p) == -1) + return -1; + ++t; + } + return 0; +} + +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { + return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); +} +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { + Py_ssize_t ignore; + return __Pyx_PyObject_AsStringAndSize(o, &ignore); +} +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#if !CYTHON_PEP393_ENABLED +static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + char* defenc_c; + PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); + if (!defenc) return NULL; + defenc_c = PyBytes_AS_STRING(defenc); +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + { + char* end = defenc_c + PyBytes_GET_SIZE(defenc); + char* c; + for (c = defenc_c; c < end; c++) { + if ((unsigned char) (*c) >= 128) { + PyUnicode_AsASCIIString(o); + return NULL; + } + } + } +#endif + *length = PyBytes_GET_SIZE(defenc); + return defenc_c; +} +#else +static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + if (likely(PyUnicode_IS_ASCII(o))) { + *length = PyUnicode_GET_LENGTH(o); + return PyUnicode_AsUTF8(o); + } else { + PyUnicode_AsASCIIString(o); + return NULL; + } +#else + return PyUnicode_AsUTF8AndSize(o, length); +#endif +} +#endif +#endif +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT + if ( +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + __Pyx_sys_getdefaultencoding_not_ascii && +#endif + PyUnicode_Check(o)) { + return __Pyx_PyUnicode_AsStringAndSize(o, length); + } else +#endif +#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + if (PyByteArray_Check(o)) { + *length = PyByteArray_GET_SIZE(o); + return PyByteArray_AS_STRING(o); + } else +#endif + { + char* result; + int r = PyBytes_AsStringAndSize(o, &result, length); + if (unlikely(r < 0)) { + return NULL; + } else { + return result; + } + } +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { + int is_true = x == Py_True; + if (is_true | (x == Py_False) | (x == Py_None)) return is_true; + else return PyObject_IsTrue(x); +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { + int retval; + if (unlikely(!x)) return -1; + retval = __Pyx_PyObject_IsTrue(x); + Py_DECREF(x); + return retval; +} +static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { +#if PY_MAJOR_VERSION >= 3 + if (PyLong_Check(result)) { + if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, + "__int__ returned non-int (type %.200s). " + "The ability to return an instance of a strict subclass of int " + "is deprecated, and may be removed in a future version of Python.", + Py_TYPE(result)->tp_name)) { + Py_DECREF(result); + return NULL; + } + return result; + } +#endif + PyErr_Format(PyExc_TypeError, + "__%.4s__ returned non-%.4s (type %.200s)", + type_name, type_name, Py_TYPE(result)->tp_name); + Py_DECREF(result); + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { +#if CYTHON_USE_TYPE_SLOTS + PyNumberMethods *m; +#endif + const char *name = NULL; + PyObject *res = NULL; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x) || PyLong_Check(x))) +#else + if (likely(PyLong_Check(x))) +#endif + return __Pyx_NewRef(x); +#if CYTHON_USE_TYPE_SLOTS + m = Py_TYPE(x)->tp_as_number; + #if PY_MAJOR_VERSION < 3 + if (m && m->nb_int) { + name = "int"; + res = m->nb_int(x); + } + else if (m && m->nb_long) { + name = "long"; + res = m->nb_long(x); + } + #else + if (likely(m && m->nb_int)) { + name = "int"; + res = m->nb_int(x); + } + #endif +#else + if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { + res = PyNumber_Int(x); + } +#endif + if (likely(res)) { +#if PY_MAJOR_VERSION < 3 + if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { +#else + if (unlikely(!PyLong_CheckExact(res))) { +#endif + return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); + } + } + else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, + "an integer is required"); + } + return res; +} +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_ssize_t ival; + PyObject *x; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(b))) { + if (sizeof(Py_ssize_t) >= sizeof(long)) + return PyInt_AS_LONG(b); + else + return PyInt_AsSsize_t(b); + } +#endif + if (likely(PyLong_CheckExact(b))) { + #if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)b)->ob_digit; + const Py_ssize_t size = Py_SIZE(b); + if (likely(__Pyx_sst_abs(size) <= 1)) { + ival = likely(size) ? digits[0] : 0; + if (size == -1) ival = -ival; + return ival; + } else { + switch (size) { + case 2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + } + } + #endif + return PyLong_AsSsize_t(b); + } + x = PyNumber_Index(b); + if (!x) return -1; + ival = PyInt_AsSsize_t(x); + Py_DECREF(x); + return ival; +} +static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { + if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { + return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); +#if PY_MAJOR_VERSION < 3 + } else if (likely(PyInt_CheckExact(o))) { + return PyInt_AS_LONG(o); +#endif + } else { + Py_ssize_t ival; + PyObject *x; + x = PyNumber_Index(o); + if (!x) return -1; + ival = PyInt_AsLong(x); + Py_DECREF(x); + return ival; + } +} +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { + return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); +} +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { + return PyInt_FromSize_t(ival); +} + + +#endif /* Py_PYTHON_H */ diff --git a/setup_cython.py b/setup_cython.py new file mode 100644 index 0000000..e6f31b9 --- /dev/null +++ b/setup_cython.py @@ -0,0 +1,9 @@ +from setuptools import setup, Extension +from Cython.Build import cythonize + + +setup( + name='Test app', + ext_modules=cythonize("geesedb/index/cython/test.pyx", libraries=["cymem", "spacy"]), + zip_safe=False, +) From f31bc7f4b00a35d246436cd6b0f16271cd69583f Mon Sep 17 00:00:00 2001 From: oestebanbajo <oscar.esba@gmail.com> Date: Tue, 22 Nov 2022 15:31:31 +0100 Subject: [PATCH 2/4] code cleanup and readme update --- .gitignore | 3 +- README.md | 44 + geesedb/index/__init__.py | 8 +- geesedb/index/cython/process_tools.cpp | 17 - geesedb/index/cython/test.c | 1 - geesedb/index/indexer/__init__.py | 0 geesedb/index/{ => indexer}/doc_readers.py | 22 +- geesedb/index/{ => indexer}/indexer.py | 63 +- geesedb/index/indexer/terms_processor.py | 123 + geesedb/index/terms_processor.py | 119 - geesedb/index/utils.py | 6 +- requirements.txt | 2 + setup_cython.cpp | 3306 -------------------- setup_cython.py | 9 - 14 files changed, 206 insertions(+), 3517 deletions(-) delete mode 100644 geesedb/index/cython/process_tools.cpp delete mode 100644 geesedb/index/cython/test.c create mode 100644 geesedb/index/indexer/__init__.py rename geesedb/index/{ => indexer}/doc_readers.py (68%) rename geesedb/index/{ => indexer}/indexer.py (78%) create mode 100644 geesedb/index/indexer/terms_processor.py delete mode 100644 geesedb/index/terms_processor.py delete mode 100644 setup_cython.cpp delete mode 100644 setup_cython.py diff --git a/.gitignore b/.gitignore index b34da57..3d7c36f 100644 --- a/.gitignore +++ b/.gitignore @@ -50,10 +50,11 @@ coverage.xml *.py,cover .hypothesis/ .pytest_cache/ + +# /geesedb/tests/resources/WP /geesedb/tests/test_script.py /geesedb/tests/generated_dbs -/geesedb/index/cython/ /geesedb/resources/nltk_data # Translations diff --git a/README.md b/README.md index fa8912e..79fb290 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ pytest ``` ## How do I index? +### CSV files The fastest way to load text data into GeeseDB is through CSV files. There should be three csv files: one for terms, one for documents, and one that connects the terms to the documents. Small examples of these files can be found in the repository: [docs.csv](./geesedb/tests/resources/csv/example_docs.csv), [terms_dics.csv](./geesedb/tests/resources/csv/example_term_dict.csv), and [term_doc.csv](./geesedb/tests/resources/csv/example_term_doc.csv). These can be generated using the CIFF [to_csv](./geesedb/utils/ciff/to_csv.py) class from [CIFF](https://github.com/osirrc/ciff) collections, or you can create them however you like. The documents can be loaded using the following code: @@ -46,6 +47,49 @@ index = FullTextFromCSV( index.load_data() ``` +### JSONL file +Another way to load data into GeeseDB is through a JSONL file. Currently, only documents with the TREC Washington Post Corpus (found [here](https://trec.nist.gov/data/wapost/)) format are supported. Each line in this file is structured like so: +````python +{ + 'id': str, + 'article_url': str, + 'title': str, + 'author': str, + 'published_date': int, + 'contents': [ + { + 'content': str, + 'type': str, + 'subtype': str, + 'mime': str + } + ] +} +```` +Where relevant ``type`` values include ``title`` and ``kicker``, and ``mime`` can either be ``text/html`` or ``text/plain``, depending on the presence of html in ``content``. + +To index a collection of documents: +````python +from geesedb.index import Indexer + +indexer = Indexer( + database='/path/to/database', + file='/path/to/file' +) +indexer.open_and_run() +```` + +A few options can be chosen such as ``tokenization_method``, which can be set either to ``syntok``, ``nltk`` or any other specified function. The stop words set ``stop_words`` can be initialized with ``nltk``, ``lucene`` or ``None``, in which case only the characters in ``delete_chars`` will be included in the stop word list. The stemmer options are ``porter`` and ``snowball``, and in the case of the last one, the language can be specified in ``language`` from any of the nltk available options. + +From [the nltk documentation](https://www.nltk.org/api/nltk.stem.snowball.html): +```python +>>> from nltk.stem import SnowballStemmer +>>> print(" ".join(SnowballStemmer.languages)) # See which languages are supported +arabic danish dutch english finnish french german hungarian +italian norwegian porter portuguese romanian russian +spanish swedish +``` + ## How do I search? After indexing in the data, it is really easy to construct a first stage ranking using BM25: diff --git a/geesedb/index/__init__.py b/geesedb/index/__init__.py index a46d8b3..2e4d1d6 100644 --- a/geesedb/index/__init__.py +++ b/geesedb/index/__init__.py @@ -2,7 +2,9 @@ from .entities_from_csv import EntitiesFromCSV from .fulltext_from_ciff import FullTextFromCiff from .fulltext_from_csv import FullTextFromCSV -from .indexer import Indexer -from .terms_processor import TermsProcessor +from .indexer.indexer import Indexer +from .indexer.terms_processor import TermsProcessor +from .indexer.doc_readers import read_from_WaPo_json -__all__ = ['FullTextFromCSV', 'AuthorsFromCSV', 'FullTextFromCiff', 'EntitiesFromCSV', 'Indexer', 'TermsProcessor'] +__all__ = ['FullTextFromCSV', 'AuthorsFromCSV', 'FullTextFromCiff', 'EntitiesFromCSV', 'Indexer', 'TermsProcessor', + 'read_from_WaPo_json'] diff --git a/geesedb/index/cython/process_tools.cpp b/geesedb/index/cython/process_tools.cpp deleted file mode 100644 index 06f8b26..0000000 --- a/geesedb/index/cython/process_tools.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include <iostream> -#include <string> - -#include "english_stem.h" - -namespace stemming{ -stemming::english_stem<> StemEnglish; - -stemming::stemming(string *word){ -this->word = word; -} - -string stemming::stem () { - return StemEnglish(this->word); -} - -} \ No newline at end of file diff --git a/geesedb/index/cython/test.c b/geesedb/index/cython/test.c deleted file mode 100644 index 06f2230..0000000 --- a/geesedb/index/cython/test.c +++ /dev/null @@ -1 +0,0 @@ -#error Do not use this file, it is the result of a failed Cython compilation. diff --git a/geesedb/index/indexer/__init__.py b/geesedb/index/indexer/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/geesedb/index/doc_readers.py b/geesedb/index/indexer/doc_readers.py similarity index 68% rename from geesedb/index/doc_readers.py rename to geesedb/index/indexer/doc_readers.py index 81836d0..358cea8 100644 --- a/geesedb/index/doc_readers.py +++ b/geesedb/index/indexer/doc_readers.py @@ -5,28 +5,30 @@ 'doc_id': None, 'title': '', 'date': '', - 'authors': [], + 'authors': '', 'content': '', 'others': {}} def read_from_WaPo_json(line: {}, doc_id: int, include_links: bool) -> doc_general: """ - Read input docs from JSONL file and convert it to the general format. + Read input docs from the JSONL file and convert it to the general format. """ if line['id'] is None: raise IOError('Missing collection ID') d: doc_general = {'collection_id': line['id'], 'doc_id': doc_id, 'title': line['title'], - 'date': line['published_date'], 'authors': [author for author in line['author'].split(',')]} - # in case authors are separated by commas + 'date': line['published_date'], 'authors': line['author']} + # 'authors': [author for author in line['author'].split(',')] text = '' if 'contents' in line: for dict_ in line['contents']: #types: kicker, title, image (fullcaption), byline, sanitized_html if (dict_ is not None) and ('content' in dict_) and ('type' in dict_): - if dict_['type'] == 'kicker' or dict_['type'] == 'title': + if dict_['type'] == 'kicker' or dict_['type'] == 'title' or \ + (dict_['type'] == 'sanitized_html' and dict_['mime'] == 'text/plain'): text += str(dict_['content']) + ' ' - elif dict_['type'] == 'sanitized_html': - text += str(extract_plain_text(HTMLTree.parse(dict_['content']), links=include_links, list_bullets=False)) + ' ' + elif dict_['type'] == 'sanitized_html' and dict_['mime'] == 'text/html': + text += str(extract_plain_text(HTMLTree.parse(dict_['content']), links=include_links, + list_bullets=False)) + ' ' d['content'] = text elif 'content' in line: d['content'] = line['content'] @@ -34,8 +36,8 @@ def read_from_WaPo_json(line: {}, doc_id: int, include_links: bool) -> doc_gener raise IOError('Contents in the .jl file not found.') # for any other key not mentioned before, its content goes to others - for k in line.keys(): - if k not in d.keys(): - d['others'] = line[k] + # for k in line.keys(): + # if k not in d.keys(): + # d['others'] = line[k] return d diff --git a/geesedb/index/indexer.py b/geesedb/index/indexer/indexer.py similarity index 78% rename from geesedb/index/indexer.py rename to geesedb/index/indexer/indexer.py index 5314381..6f29f3b 100644 --- a/geesedb/index/indexer.py +++ b/geesedb/index/indexer/indexer.py @@ -1,7 +1,7 @@ -from .doc_readers import read_from_WaPo_json -from .terms_processor import TermsProcessor -from ..connection import get_connection -from .utils import _create_and_fill_empty_table_with_pd +from ..utils import _create_and_fill_empty_table_with_pd +from ...connection import get_connection +from ..indexer.doc_readers import read_from_WaPo_json +from ..indexer.terms_processor import TermsProcessor import os import pandas as pd @@ -16,15 +16,6 @@ class Indexer: """ Reads, processes and introduces documents of JSONL format in GeeseDB. - - TODO: - most time consuming processing: stemming and then tokenizing - normal 500 docs time: 11-13 s - try doing a dict with words that don't need to be stemmed: 12 s - try using just the c++ stemmer, everything else python - - - idea: introduce data in db every n documents (in case something fails) """ def __init__(self, **kwargs: Any) -> None: @@ -41,10 +32,10 @@ def __init__(self, **kwargs: Any) -> None: db_connection = get_connection(self.arguments['database']) self.connection = db_connection.connection self.processor = TermsProcessor(self.arguments) - self.total_time = 0 + self.init_time = 0 def open_and_run(self) -> None: - self.total_time = time.time() + self.init_time = time.time() if pathlib.Path(self.arguments['file']).suffix == '.jl': with open(self.arguments['file'], encoding=self.arguments['encoding']) as file: self.run_indexer(file) @@ -58,31 +49,21 @@ def run_indexer(self, file) -> None: self.line = json.loads(line) start = time.time() self.line = self.read(self.line, doc_id, self.arguments['include_html_links']) - end = time.time() - t1 += end - start + t1 += time.time() - start start = time.time() self.line['content'] = self.processor.process(self.line['content']) - end = time.time() - t2 += end - start + t2 += time.time() - start start = time.time() self.update_docs_file(doc_id) - end = time.time() - t3 += end - start + t3 += time.time() - start start = time.time() self.update_terms_termsdocs_file() - end = time.time() - t4 += end - start + t4 += time.time() - start if doc_id % 100 == 0: sys.stdout.write('\r') sys.stdout.write("Processed documents: %d" % doc_id) sys.stdout.flush() - if doc_id == 500: - sys.stdout.write('\r') - sys.stdout.flush() - break doc_id += 1 - #sys.stdout.write('\r') - #sys.stdout.flush() start = time.time() df_docs = pd.DataFrame.from_dict(self.db_docs) @@ -97,26 +78,23 @@ def run_indexer(self, file) -> None: df_terms_docs = pd.DataFrame.from_dict(self.db_terms_docs) self.create_and_fill_tables([df_docs, df_terms, df_terms_docs]) - # print(self.connection.execute("show tables;").df()) - # print(self.connection.execute(f"SELECT * FROM docs;").df()) - end = time.time() - t5 += end - start + t5 += time.time() - start if self.arguments['print_times']: print(f'Running time reading line: {t1} sec') print(f'Running time processing line: {t2} sec') + self.processor.print_times() print(f'Running time updating docs: {t3} sec') print(f'Running time updating dictionary and terms_docs: {t4} sec') print(f'Running time creating and filling DB: {t5} sec') - print(f'Running time: {time.time() - self.total_time} sec') - self.processor.print_times() + print(f'Running time: {time.time() - self.init_time} sec') @staticmethod def get_arguments(kwargs: Any) -> dict: arguments = { 'database': None, - 'use_existing_db': False, - 'use_existing_tables': False, + #'use_existing_db': False, + #'use_existing_tables': False, 'create_nltk_data': True, 'print_times': True, 'include_html_links': False, @@ -128,12 +106,12 @@ def get_arguments(kwargs: Any) -> dict: 'columns_names_term_dict': ['term_id', 'string', 'df'], 'columns_names_term_doc': ['term_id', 'doc_id', 'tf'], 'file': 'docs.jl', - 'nltk_path': os.path.dirname(os.path.dirname(__file__)) + '/resources/nltk_data', + 'nltk_path': os.path.dirname(os.path.dirname(os.path.dirname(__file__))) + '\\resources\\nltk_data', 'language': 'english', 'encoding': 'utf-8', 'delimiter': '|', 'delete_chars': ['', '.', ',', "'", '"', '’', '‘', '“', '”', '-', '—', '(', ')', '[', ']', '{', '}', - '<', '>', ':', ';', '?', '!', '/', '\\', '=', '&'] + '<', '>', ':', ';', '?', '!', '/', "\\", '=', '&', '$', '€'] } for key, item in arguments.items(): if kwargs.get(key) is not None: @@ -154,12 +132,8 @@ def update_docs_file(self, doc_id: int) -> None: # input a line, update csv self.db_docs['len'].append(len(self.line['content'])) def update_terms_termsdocs_file(self) -> None: - # s = time.time() temp_words = Counter(self.line['content']).keys() # unique elements temp_vals = Counter(self.line['content']).values() # counts the elements' frequency - # en = time.time() - # self.d += en-s - # s = time.time() for w, t in zip(temp_words, temp_vals): if w not in self.db_terms.keys(): i = len(self.db_terms) @@ -168,8 +142,5 @@ def update_terms_termsdocs_file(self) -> None: else: # find word and update df (once per doc) self.db_terms[w][1] += 1 self.db_terms_docs['term_id'].append(self.db_terms[w][0]) # find term id of word w - self.db_terms_docs['doc_id'].append(self.line['doc_id']) self.db_terms_docs['tf'].append(t) - # en = time.time() - # self.e += en-s diff --git a/geesedb/index/indexer/terms_processor.py b/geesedb/index/indexer/terms_processor.py new file mode 100644 index 0000000..8bdfcde --- /dev/null +++ b/geesedb/index/indexer/terms_processor.py @@ -0,0 +1,123 @@ +import os +import types + +import nltk.data +import time +from nltk.corpus import stopwords +from nltk.tokenize import word_tokenize +from nltk.stem.snowball import SnowballStemmer +from nltk.stem import PorterStemmer +from syntok.tokenizer import Tokenizer + + +class TermsProcessor: + """ + Performs stemming and stop words. + Uses nltk by default with the process method. + Inputs the whole document as a string. + """ + def __init__(self, arguments): + # stemmer + if arguments['stemmer'] == 'porter': + stemmer = PorterStemmer() + self.stemmer_function = stemmer.stem + elif arguments['stemmer'] == 'snowball': + stemmer = SnowballStemmer(arguments['language']) + self.stemmer_function = stemmer.stem + elif isinstance(arguments['stemmer'], types.FunctionType): + self.stemmer_function = arguments['stemmer'] + else: + raise IOError('Please input a valid stemmer') + + # stop words + self.file_path = arguments['nltk_path'] + self.delete_chars = arguments['delete_chars'] + self.delete_chars_str = ''.join(self.delete_chars) + if arguments['create_nltk_data']: + self.download_nltk_data() + if arguments['stop_words'] is None: + self.stop_words = set(self.delete_chars) + elif arguments['stop_words'] == 'nltk': + self.stop_words = set(stopwords.words(arguments['language'])) + self.stop_words.update(self.delete_chars) + elif arguments['stop_words'] == 'lucene': + self.stop_words = {"a", "an", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", + "it", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", + "these", "they", "this", "to", "was", "will", "with"} + self.stop_words.update(self.delete_chars) + else: + raise IOError('Please select a valid option') + + # tokenization + if arguments['tokenization_method'] == 'syntok': + t = Tokenizer(emit_hyphen_or_underscore_sep=True) + self.process = self.process_syntok + self.tokenizer_function = t.tokenize + elif arguments['tokenization_method'] == 'nltk': + self.process = self.process_nltk + self.tokenizer_function = word_tokenize + elif isinstance(arguments['tokenization_method'], types.FunctionType): + self.process = self.process_nltk + self.tokenizer_function = arguments['tokenization_method'] + else: + raise IOError('Please select a valid tokenization method') + + # other inits + self.stemmed_tokens = {} + self.a = self.b = self.c = 0 + + def process_syntok(self, line: str) -> str: + filtered_tokens = [] + s = time.time() + for token in self.tokenizer_function(line): + self.a += time.time() - s + s = time.time() + if not token.value.lower() in self.stop_words: + if token.value not in self.stemmed_tokens: + self.b += time.time() - s + s = time.time() + tok = self.stemmer_function(token.value) + self.c += time.time() - s + self.stemmed_tokens[token.value] = tok + filtered_tokens.append(tok) + else: + filtered_tokens.append(self.stemmed_tokens[token.value]) + # elif self.tokenization_method == 'simple': + # word_tokens = line.split() + # filtered_tokens = [self.stemmer.stem(w.strip(self.delete_chars_str)) + # for w in word_tokens if not w.lower().strip(self.delete_chars_str) in self.stop_words] + return filtered_tokens + + def process_nltk(self, line: str) -> str: + filtered_tokens = [] + s = time.time() + for token in self.tokenizer_function(line): + self.a += time.time() - s + s = time.time() + if not token.lower() in self.stop_words: + if token not in self.stemmed_tokens: + self.b += time.time() - s + s = time.time() + tok = self.stemmer_function(token) + self.c += time.time() - s + self.stemmed_tokens[token] = tok + filtered_tokens.append(tok) + else: + filtered_tokens.append(self.stemmed_tokens[token]) + return filtered_tokens + + def print_times(self): + print(' tokenization: %f sec' % self.a) + print(' selecting word for stemming and stop words: %f sec' % self.b) + print(' stemming: %f sec' % self.c) + + def download_nltk_data(self) -> None: + # create path to data + if self.file_path not in nltk.data.path: + nltk.data.path.append(self.file_path) + + # create folder and install necessary packages + if not os.path.isdir(self.file_path): + os.mkdir(self.file_path) + os.system(f'py -m nltk.downloader -d {self.file_path} stopwords') + os.system(f'py -m nltk.downloader -d {self.file_path} punkt') diff --git a/geesedb/index/terms_processor.py b/geesedb/index/terms_processor.py deleted file mode 100644 index c3e4999..0000000 --- a/geesedb/index/terms_processor.py +++ /dev/null @@ -1,119 +0,0 @@ -import os -import nltk.data -import spacy -from nltk.corpus import stopwords -from nltk.tokenize import word_tokenize -from nltk.stem.snowball import SnowballStemmer -from nltk.stem import PorterStemmer -from syntok.tokenizer import Tokenizer -from geesedb.index.cython.test import process - -import time - - -class TermsProcessor: - """ - Performs stemming and stop words. - Uses nltk by default with the process method. - Inputs the whole document as a string. - """ - - def __init__(self, arguments): - if arguments['stemmer'] == 'porter': - self.stemmer = PorterStemmer() - elif arguments['stemmer'] == 'snowball': - self.stemmer = SnowballStemmer(arguments['language']) - else: - IOError('Please input a valid stemmer') - self.file_path = arguments['nltk_path'] - self.delete_chars = arguments['delete_chars'] - self.delete_chars_str = ''.join(self.delete_chars) - self.tokenization_method = arguments['tokenization_method'] - if arguments['create_nltk_data']: - self.download_nltk_data() - if arguments['stop_words'] is None: - self.stop_words = set(self.delete_chars) - elif arguments['stop_words'] == 'nltk': - self.stop_words = set(stopwords.words(arguments['language'])) - self.stop_words.update(self.delete_chars) - elif arguments['stop_words'] == 'lucene': - self.stop_words = {"a", "an", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", - "it", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", - "these", "they", "this", "to", "was", "will", "with"} - self.stop_words.update(self.delete_chars) - else: - IOError('Please select a valid option') - self.nlp = spacy.load("en_core_web_sm") - if self.tokenization_method == 'syntok': - self.tokenizer = Tokenizer(emit_hyphen_or_underscore_sep=True) - self.stop_words = list(self.nlp(word) for word in self.stop_words) - elif self.tokenization_method not in ['nltk', 'simple']: - raise IOError('Please select a valid process method') - self.stemmed_tokens = {} - self.a = self.b = self.c = self.d = 0 - - def process(self, line: str) -> str: - if self.tokenization_method == 'syntok': - # filtered_tokens = [self.stemmer.stem(token.value) for token in self.tokenizer.tokenize(line) - # if not token.value.lower() in self.stop_words] - - # tokens = self.tokenizer.tokenize(line) - # filtered_tokens = process(self.nlp, tokens, self.stop_words) - - filtered_tokens = [] - # s = time.time() - # for token in self.tokenizer.tokenize(line): - # self.a += time.time() - s - # s = time.time() - # if not token.value.lower() in self.stop_words: - # self.b += time.time() - s - # s = time.time() - # tok = self.stemmer.stem(token.value) - # self.c += time.time() - s - # s = time.time() - # filtered_tokens.append(tok) - # self.d += time.time() - s - - s = time.time() - for token in self.tokenizer.tokenize(line): - self.a += time.time() - s - # check if the word should be stemmed or not - s = time.time() - if not token.value.lower() in (self.stop_words or self.stemmed_tokens): - self.b += time.time() - s - s = time.time() - tok = self.stemmer.stem(token.value) - self.c += time.time() - s - s = time.time() - self.stemmed_tokens[token.value] = tok - self.d += time.time() - s - filtered_tokens.append(tok) - else: - filtered_tokens.append(self.stemmed_tokens[token.value]) - - elif self.tokenization_method == 'nltk': - word_tokens = word_tokenize(line) - filtered_tokens = [self.stemmer.stem(w) for w in word_tokens if not w.lower() in self.stop_words] - elif self.tokenization_method == 'simple': - word_tokens = line.split() - filtered_tokens = [self.stemmer.stem(w.strip(self.delete_chars_str)) - for w in word_tokens if not w.lower().strip(self.delete_chars_str) in self.stop_words] - # print(filtered_tokens) - return filtered_tokens - - def print_times(self): - print('a: %f' % self.a) - print('b: %f' % self.b) - print('c: %f' % self.c) - print('d: %f' % self.d) - - def download_nltk_data(self) -> None: - # create path to data - if self.file_path not in nltk.data.path: - nltk.data.path.append(self.file_path) - - # create folder and install necessary packages - if not os.path.isdir(self.file_path): - os.mkdir(self.file_path) - os.system(f'py -m nltk.downloader -d {self.file_path} stopwords') - os.system(f'py -m nltk.downloader -d {self.file_path} punkt') diff --git a/geesedb/index/utils.py b/geesedb/index/utils.py index e76d8e8..8cb5919 100644 --- a/geesedb/index/utils.py +++ b/geesedb/index/utils.py @@ -1,6 +1,5 @@ from typing import List - -from duckdb import DuckDBPyConnection, CatalogException +from duckdb import DuckDBPyConnection def _create_table(connection: DuckDBPyConnection, table_name: str, column_names: List[str], @@ -34,6 +33,3 @@ def _create_and_fill_empty_table_with_pd(connection: DuckDBPyConnection, table_n cursor.execute(f'DROP TABLE IF EXISTS {table_name};') cursor.register(table_name, pd_dataframe) cursor.execute(f"CREATE TABLE {table_name} AS SELECT * FROM {table_name};") - #cursor.execute(f"SELECT count(*) FROM {table_name}") - #print(cursor.fetchall()) - diff --git a/requirements.txt b/requirements.txt index 21e8d42..a946b8b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,3 +7,5 @@ git+git://github.com/informagi/pycypher setuptools~=57.0.0 nltk~=3.7 +Resiliparse~=0.13.5 +syntok~=1.4.4 \ No newline at end of file diff --git a/setup_cython.cpp b/setup_cython.cpp deleted file mode 100644 index c5b6b42..0000000 --- a/setup_cython.cpp +++ /dev/null @@ -1,3306 +0,0 @@ -/* Generated by Cython 0.29.32 */ - -#ifndef PY_SSIZE_T_CLEAN -#define PY_SSIZE_T_CLEAN -#endif /* PY_SSIZE_T_CLEAN */ -#include "Python.h" -#ifndef Py_PYTHON_H - #error Python headers needed to compile C extensions, please install development version of Python. -#elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) - #error Cython requires Python 2.6+ or Python 3.3+. -#else -#define CYTHON_ABI "0_29_32" -#define CYTHON_HEX_VERSION 0x001D20F0 -#define CYTHON_FUTURE_DIVISION 0 -#include <stddef.h> -#ifndef offsetof - #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) -#endif -#if !defined(WIN32) && !defined(MS_WINDOWS) - #ifndef __stdcall - #define __stdcall - #endif - #ifndef __cdecl - #define __cdecl - #endif - #ifndef __fastcall - #define __fastcall - #endif -#endif -#ifndef DL_IMPORT - #define DL_IMPORT(t) t -#endif -#ifndef DL_EXPORT - #define DL_EXPORT(t) t -#endif -#define __PYX_COMMA , -#ifndef HAVE_LONG_LONG - #if PY_VERSION_HEX >= 0x02070000 - #define HAVE_LONG_LONG - #endif -#endif -#ifndef PY_LONG_LONG - #define PY_LONG_LONG LONG_LONG -#endif -#ifndef Py_HUGE_VAL - #define Py_HUGE_VAL HUGE_VAL -#endif -#ifdef PYPY_VERSION - #define CYTHON_COMPILING_IN_PYPY 1 - #define CYTHON_COMPILING_IN_PYSTON 0 - #define CYTHON_COMPILING_IN_CPYTHON 0 - #define CYTHON_COMPILING_IN_NOGIL 0 - #undef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 0 - #undef CYTHON_USE_PYTYPE_LOOKUP - #define CYTHON_USE_PYTYPE_LOOKUP 0 - #if PY_VERSION_HEX < 0x03050000 - #undef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 0 - #elif !defined(CYTHON_USE_ASYNC_SLOTS) - #define CYTHON_USE_ASYNC_SLOTS 1 - #endif - #undef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 0 - #undef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 0 - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #undef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #undef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 1 - #undef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 0 - #undef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 0 - #undef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 0 - #undef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 0 - #undef CYTHON_PEP489_MULTI_PHASE_INIT - #define CYTHON_PEP489_MULTI_PHASE_INIT 0 - #undef CYTHON_USE_TP_FINALIZE - #define CYTHON_USE_TP_FINALIZE 0 - #undef CYTHON_USE_DICT_VERSIONS - #define CYTHON_USE_DICT_VERSIONS 0 - #undef CYTHON_USE_EXC_INFO_STACK - #define CYTHON_USE_EXC_INFO_STACK 0 - #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC - #define CYTHON_UPDATE_DESCRIPTOR_DOC (PYPY_VERSION_HEX >= 0x07030900) - #endif -#elif defined(PYSTON_VERSION) - #define CYTHON_COMPILING_IN_PYPY 0 - #define CYTHON_COMPILING_IN_PYSTON 1 - #define CYTHON_COMPILING_IN_CPYTHON 0 - #define CYTHON_COMPILING_IN_NOGIL 0 - #ifndef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 1 - #endif - #undef CYTHON_USE_PYTYPE_LOOKUP - #define CYTHON_USE_PYTYPE_LOOKUP 0 - #undef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 0 - #undef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 0 - #ifndef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 1 - #endif - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #undef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #ifndef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 0 - #endif - #ifndef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 1 - #endif - #ifndef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 1 - #endif - #undef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 0 - #undef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 0 - #undef CYTHON_PEP489_MULTI_PHASE_INIT - #define CYTHON_PEP489_MULTI_PHASE_INIT 0 - #undef CYTHON_USE_TP_FINALIZE - #define CYTHON_USE_TP_FINALIZE 0 - #undef CYTHON_USE_DICT_VERSIONS - #define CYTHON_USE_DICT_VERSIONS 0 - #undef CYTHON_USE_EXC_INFO_STACK - #define CYTHON_USE_EXC_INFO_STACK 0 - #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC - #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 - #endif -#elif defined(PY_NOGIL) - #define CYTHON_COMPILING_IN_PYPY 0 - #define CYTHON_COMPILING_IN_PYSTON 0 - #define CYTHON_COMPILING_IN_CPYTHON 0 - #define CYTHON_COMPILING_IN_NOGIL 1 - #ifndef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 1 - #endif - #undef CYTHON_USE_PYTYPE_LOOKUP - #define CYTHON_USE_PYTYPE_LOOKUP 0 - #ifndef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 1 - #endif - #undef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 0 - #ifndef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 1 - #endif - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #undef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #ifndef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 0 - #endif - #ifndef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 1 - #endif - #ifndef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 1 - #endif - #undef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 0 - #undef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 0 - #ifndef CYTHON_PEP489_MULTI_PHASE_INIT - #define CYTHON_PEP489_MULTI_PHASE_INIT 1 - #endif - #ifndef CYTHON_USE_TP_FINALIZE - #define CYTHON_USE_TP_FINALIZE 1 - #endif - #undef CYTHON_USE_DICT_VERSIONS - #define CYTHON_USE_DICT_VERSIONS 0 - #undef CYTHON_USE_EXC_INFO_STACK - #define CYTHON_USE_EXC_INFO_STACK 0 -#else - #define CYTHON_COMPILING_IN_PYPY 0 - #define CYTHON_COMPILING_IN_PYSTON 0 - #define CYTHON_COMPILING_IN_CPYTHON 1 - #define CYTHON_COMPILING_IN_NOGIL 0 - #ifndef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 1 - #endif - #if PY_VERSION_HEX < 0x02070000 - #undef CYTHON_USE_PYTYPE_LOOKUP - #define CYTHON_USE_PYTYPE_LOOKUP 0 - #elif !defined(CYTHON_USE_PYTYPE_LOOKUP) - #define CYTHON_USE_PYTYPE_LOOKUP 1 - #endif - #if PY_MAJOR_VERSION < 3 - #undef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 0 - #elif !defined(CYTHON_USE_ASYNC_SLOTS) - #define CYTHON_USE_ASYNC_SLOTS 1 - #endif - #if PY_VERSION_HEX < 0x02070000 - #undef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #elif !defined(CYTHON_USE_PYLONG_INTERNALS) - #define CYTHON_USE_PYLONG_INTERNALS 1 - #endif - #ifndef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 1 - #endif - #ifndef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 1 - #endif - #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #elif !defined(CYTHON_USE_UNICODE_WRITER) - #define CYTHON_USE_UNICODE_WRITER 1 - #endif - #ifndef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 0 - #endif - #ifndef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 1 - #endif - #ifndef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 1 - #endif - #if PY_VERSION_HEX >= 0x030B00A4 - #undef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 0 - #elif !defined(CYTHON_FAST_THREAD_STATE) - #define CYTHON_FAST_THREAD_STATE 1 - #endif - #ifndef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL (PY_VERSION_HEX < 0x030A0000) - #endif - #ifndef CYTHON_PEP489_MULTI_PHASE_INIT - #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) - #endif - #ifndef CYTHON_USE_TP_FINALIZE - #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1) - #endif - #ifndef CYTHON_USE_DICT_VERSIONS - #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) - #endif - #if PY_VERSION_HEX >= 0x030B00A4 - #undef CYTHON_USE_EXC_INFO_STACK - #define CYTHON_USE_EXC_INFO_STACK 0 - #elif !defined(CYTHON_USE_EXC_INFO_STACK) - #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) - #endif - #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC - #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 - #endif -#endif -#if !defined(CYTHON_FAST_PYCCALL) -#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) -#endif -#if CYTHON_USE_PYLONG_INTERNALS - #if PY_MAJOR_VERSION < 3 - #include "longintrepr.h" - #endif - #undef SHIFT - #undef BASE - #undef MASK - #ifdef SIZEOF_VOID_P - enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; - #endif -#endif -#ifndef __has_attribute - #define __has_attribute(x) 0 -#endif -#ifndef __has_cpp_attribute - #define __has_cpp_attribute(x) 0 -#endif -#ifndef CYTHON_RESTRICT - #if defined(__GNUC__) - #define CYTHON_RESTRICT __restrict__ - #elif defined(_MSC_VER) && _MSC_VER >= 1400 - #define CYTHON_RESTRICT __restrict - #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - #define CYTHON_RESTRICT restrict - #else - #define CYTHON_RESTRICT - #endif -#endif -#ifndef CYTHON_UNUSED -# if defined(__GNUC__) -# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) -# define CYTHON_UNUSED __attribute__ ((__unused__)) -# else -# define CYTHON_UNUSED -# endif -# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) -# define CYTHON_UNUSED __attribute__ ((__unused__)) -# else -# define CYTHON_UNUSED -# endif -#endif -#ifndef CYTHON_MAYBE_UNUSED_VAR -# if defined(__cplusplus) - template<class T> void CYTHON_MAYBE_UNUSED_VAR( const T& ) { } -# else -# define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x) -# endif -#endif -#ifndef CYTHON_NCP_UNUSED -# if CYTHON_COMPILING_IN_CPYTHON -# define CYTHON_NCP_UNUSED -# else -# define CYTHON_NCP_UNUSED CYTHON_UNUSED -# endif -#endif -#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) -#ifdef _MSC_VER - #ifndef _MSC_STDINT_H_ - #if _MSC_VER < 1300 - typedef unsigned char uint8_t; - typedef unsigned int uint32_t; - #else - typedef unsigned __int8 uint8_t; - typedef unsigned __int32 uint32_t; - #endif - #endif -#else - #include <stdint.h> -#endif -#ifndef CYTHON_FALLTHROUGH - #if defined(__cplusplus) && __cplusplus >= 201103L - #if __has_cpp_attribute(fallthrough) - #define CYTHON_FALLTHROUGH [[fallthrough]] - #elif __has_cpp_attribute(clang::fallthrough) - #define CYTHON_FALLTHROUGH [[clang::fallthrough]] - #elif __has_cpp_attribute(gnu::fallthrough) - #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] - #endif - #endif - #ifndef CYTHON_FALLTHROUGH - #if __has_attribute(fallthrough) - #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) - #else - #define CYTHON_FALLTHROUGH - #endif - #endif - #if defined(__clang__ ) && defined(__apple_build_version__) - #if __apple_build_version__ < 7000000 - #undef CYTHON_FALLTHROUGH - #define CYTHON_FALLTHROUGH - #endif - #endif -#endif - -#ifndef __cplusplus - #error "Cython files generated with the C++ option must be compiled with a C++ compiler." -#endif -#ifndef CYTHON_INLINE - #if defined(__clang__) - #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) - #else - #define CYTHON_INLINE inline - #endif -#endif -template<typename T> -void __Pyx_call_destructor(T& x) { - x.~T(); -} -template<typename T> -class __Pyx_FakeReference { - public: - __Pyx_FakeReference() : ptr(NULL) { } - __Pyx_FakeReference(const T& ref) : ptr(const_cast<T*>(&ref)) { } - T *operator->() { return ptr; } - T *operator&() { return ptr; } - operator T&() { return *ptr; } - template<typename U> bool operator ==(U other) { return *ptr == other; } - template<typename U> bool operator !=(U other) { return *ptr != other; } - private: - T *ptr; -}; - -#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) - #define Py_OptimizeFlag 0 -#endif -#define __PYX_BUILD_PY_SSIZE_T "n" -#define CYTHON_FORMAT_SSIZE_T "z" -#if PY_MAJOR_VERSION < 3 - #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" - #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ - PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) - #define __Pyx_DefaultClassType PyClass_Type -#else - #define __Pyx_BUILTIN_MODULE_NAME "builtins" - #define __Pyx_DefaultClassType PyType_Type -#if PY_VERSION_HEX >= 0x030B00A1 - static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int k, int l, int s, int f, - PyObject *code, PyObject *c, PyObject* n, PyObject *v, - PyObject *fv, PyObject *cell, PyObject* fn, - PyObject *name, int fline, PyObject *lnos) { - PyObject *kwds=NULL, *argcount=NULL, *posonlyargcount=NULL, *kwonlyargcount=NULL; - PyObject *nlocals=NULL, *stacksize=NULL, *flags=NULL, *replace=NULL, *call_result=NULL, *empty=NULL; - const char *fn_cstr=NULL; - const char *name_cstr=NULL; - PyCodeObject* co=NULL; - PyObject *type, *value, *traceback; - PyErr_Fetch(&type, &value, &traceback); - if (!(kwds=PyDict_New())) goto end; - if (!(argcount=PyLong_FromLong(a))) goto end; - if (PyDict_SetItemString(kwds, "co_argcount", argcount) != 0) goto end; - if (!(posonlyargcount=PyLong_FromLong(0))) goto end; - if (PyDict_SetItemString(kwds, "co_posonlyargcount", posonlyargcount) != 0) goto end; - if (!(kwonlyargcount=PyLong_FromLong(k))) goto end; - if (PyDict_SetItemString(kwds, "co_kwonlyargcount", kwonlyargcount) != 0) goto end; - if (!(nlocals=PyLong_FromLong(l))) goto end; - if (PyDict_SetItemString(kwds, "co_nlocals", nlocals) != 0) goto end; - if (!(stacksize=PyLong_FromLong(s))) goto end; - if (PyDict_SetItemString(kwds, "co_stacksize", stacksize) != 0) goto end; - if (!(flags=PyLong_FromLong(f))) goto end; - if (PyDict_SetItemString(kwds, "co_flags", flags) != 0) goto end; - if (PyDict_SetItemString(kwds, "co_code", code) != 0) goto end; - if (PyDict_SetItemString(kwds, "co_consts", c) != 0) goto end; - if (PyDict_SetItemString(kwds, "co_names", n) != 0) goto end; - if (PyDict_SetItemString(kwds, "co_varnames", v) != 0) goto end; - if (PyDict_SetItemString(kwds, "co_freevars", fv) != 0) goto end; - if (PyDict_SetItemString(kwds, "co_cellvars", cell) != 0) goto end; - if (PyDict_SetItemString(kwds, "co_linetable", lnos) != 0) goto end; - if (!(fn_cstr=PyUnicode_AsUTF8AndSize(fn, NULL))) goto end; - if (!(name_cstr=PyUnicode_AsUTF8AndSize(name, NULL))) goto end; - if (!(co = PyCode_NewEmpty(fn_cstr, name_cstr, fline))) goto end; - if (!(replace = PyObject_GetAttrString((PyObject*)co, "replace"))) goto cleanup_code_too; - if (!(empty = PyTuple_New(0))) goto cleanup_code_too; // unfortunately __pyx_empty_tuple isn't available here - if (!(call_result = PyObject_Call(replace, empty, kwds))) goto cleanup_code_too; - Py_XDECREF((PyObject*)co); - co = (PyCodeObject*)call_result; - call_result = NULL; - if (0) { - cleanup_code_too: - Py_XDECREF((PyObject*)co); - co = NULL; - } - end: - Py_XDECREF(kwds); - Py_XDECREF(argcount); - Py_XDECREF(posonlyargcount); - Py_XDECREF(kwonlyargcount); - Py_XDECREF(nlocals); - Py_XDECREF(stacksize); - Py_XDECREF(replace); - Py_XDECREF(call_result); - Py_XDECREF(empty); - if (type) { - PyErr_Restore(type, value, traceback); - } - return co; - } -#else - #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ - PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) -#endif - #define __Pyx_DefaultClassType PyType_Type -#endif -#ifndef Py_TPFLAGS_CHECKTYPES - #define Py_TPFLAGS_CHECKTYPES 0 -#endif -#ifndef Py_TPFLAGS_HAVE_INDEX - #define Py_TPFLAGS_HAVE_INDEX 0 -#endif -#ifndef Py_TPFLAGS_HAVE_NEWBUFFER - #define Py_TPFLAGS_HAVE_NEWBUFFER 0 -#endif -#ifndef Py_TPFLAGS_HAVE_FINALIZE - #define Py_TPFLAGS_HAVE_FINALIZE 0 -#endif -#ifndef METH_STACKLESS - #define METH_STACKLESS 0 -#endif -#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) - #ifndef METH_FASTCALL - #define METH_FASTCALL 0x80 - #endif - typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); - typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, - Py_ssize_t nargs, PyObject *kwnames); -#else - #define __Pyx_PyCFunctionFast _PyCFunctionFast - #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords -#endif -#if CYTHON_FAST_PYCCALL -#define __Pyx_PyFastCFunction_Check(func)\ - ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))))) -#else -#define __Pyx_PyFastCFunction_Check(func) 0 -#endif -#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) - #define PyObject_Malloc(s) PyMem_Malloc(s) - #define PyObject_Free(p) PyMem_Free(p) - #define PyObject_Realloc(p) PyMem_Realloc(p) -#endif -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030400A1 - #define PyMem_RawMalloc(n) PyMem_Malloc(n) - #define PyMem_RawRealloc(p, n) PyMem_Realloc(p, n) - #define PyMem_RawFree(p) PyMem_Free(p) -#endif -#if CYTHON_COMPILING_IN_PYSTON - #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co) - #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno) -#else - #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) - #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) -#endif -#if !CYTHON_FAST_THREAD_STATE || PY_VERSION_HEX < 0x02070000 - #define __Pyx_PyThreadState_Current PyThreadState_GET() -#elif PY_VERSION_HEX >= 0x03060000 - #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() -#elif PY_VERSION_HEX >= 0x03000000 - #define __Pyx_PyThreadState_Current PyThreadState_GET() -#else - #define __Pyx_PyThreadState_Current _PyThreadState_Current -#endif -#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) -#include "pythread.h" -#define Py_tss_NEEDS_INIT 0 -typedef int Py_tss_t; -static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { - *key = PyThread_create_key(); - return 0; -} -static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { - Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); - *key = Py_tss_NEEDS_INIT; - return key; -} -static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { - PyObject_Free(key); -} -static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { - return *key != Py_tss_NEEDS_INIT; -} -static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { - PyThread_delete_key(*key); - *key = Py_tss_NEEDS_INIT; -} -static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { - return PyThread_set_key_value(*key, value); -} -static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { - return PyThread_get_key_value(*key); -} -#endif -#if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) -#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) -#else -#define __Pyx_PyDict_NewPresized(n) PyDict_New() -#endif -#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION - #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) - #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) -#else - #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) - #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) -#endif -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && CYTHON_USE_UNICODE_INTERNALS -#define __Pyx_PyDict_GetItemStr(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) -#else -#define __Pyx_PyDict_GetItemStr(dict, name) PyDict_GetItem(dict, name) -#endif -#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) - #define CYTHON_PEP393_ENABLED 1 - #if defined(PyUnicode_IS_READY) - #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ - 0 : _PyUnicode_Ready((PyObject *)(op))) - #else - #define __Pyx_PyUnicode_READY(op) (0) - #endif - #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) - #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) - #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) - #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) - #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) - #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) - #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) - #if defined(PyUnicode_IS_READY) && defined(PyUnicode_GET_SIZE) - #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) - #else - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) - #endif - #else - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) - #endif -#else - #define CYTHON_PEP393_ENABLED 0 - #define PyUnicode_1BYTE_KIND 1 - #define PyUnicode_2BYTE_KIND 2 - #define PyUnicode_4BYTE_KIND 4 - #define __Pyx_PyUnicode_READY(op) (0) - #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) - #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) - #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111) - #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) - #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) - #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) - #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch) - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) -#endif -#if CYTHON_COMPILING_IN_PYPY - #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) - #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) -#else - #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) - #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ - PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) -#endif -#if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) - #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) -#endif -#if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check) - #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) -#endif -#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format) - #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) -#endif -#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) -#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) -#else - #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) -#endif -#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) - #define PyObject_ASCII(o) PyObject_Repr(o) -#endif -#if PY_MAJOR_VERSION >= 3 - #define PyBaseString_Type PyUnicode_Type - #define PyStringObject PyUnicodeObject - #define PyString_Type PyUnicode_Type - #define PyString_Check PyUnicode_Check - #define PyString_CheckExact PyUnicode_CheckExact -#ifndef PyObject_Unicode - #define PyObject_Unicode PyObject_Str -#endif -#endif -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) - #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) -#else - #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) - #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) -#endif -#ifndef PySet_CheckExact - #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) -#endif -#if PY_VERSION_HEX >= 0x030900A4 - #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) - #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) -#else - #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) - #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) -#endif -#if CYTHON_ASSUME_SAFE_MACROS - #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) -#else - #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) -#endif -#if PY_MAJOR_VERSION >= 3 - #define PyIntObject PyLongObject - #define PyInt_Type PyLong_Type - #define PyInt_Check(op) PyLong_Check(op) - #define PyInt_CheckExact(op) PyLong_CheckExact(op) - #define PyInt_FromString PyLong_FromString - #define PyInt_FromUnicode PyLong_FromUnicode - #define PyInt_FromLong PyLong_FromLong - #define PyInt_FromSize_t PyLong_FromSize_t - #define PyInt_FromSsize_t PyLong_FromSsize_t - #define PyInt_AsLong PyLong_AsLong - #define PyInt_AS_LONG PyLong_AS_LONG - #define PyInt_AsSsize_t PyLong_AsSsize_t - #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask - #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask - #define PyNumber_Int PyNumber_Long -#endif -#if PY_MAJOR_VERSION >= 3 - #define PyBoolObject PyLongObject -#endif -#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY - #ifndef PyUnicode_InternFromString - #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) - #endif -#endif -#if PY_VERSION_HEX < 0x030200A4 - typedef long Py_hash_t; - #define __Pyx_PyInt_FromHash_t PyInt_FromLong - #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t -#else - #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t - #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t -#endif -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyMethod_New(func, self, klass) ((self) ? ((void)(klass), PyMethod_New(func, self)) : __Pyx_NewRef(func)) -#else - #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) -#endif -#if CYTHON_USE_ASYNC_SLOTS - #if PY_VERSION_HEX >= 0x030500B1 - #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods - #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) - #else - #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) - #endif -#else - #define __Pyx_PyType_AsAsync(obj) NULL -#endif -#ifndef __Pyx_PyAsyncMethodsStruct - typedef struct { - unaryfunc am_await; - unaryfunc am_aiter; - unaryfunc am_anext; - } __Pyx_PyAsyncMethodsStruct; -#endif - -#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) - #if !defined(_USE_MATH_DEFINES) - #define _USE_MATH_DEFINES - #endif -#endif -#include <math.h> -#ifdef NAN -#define __PYX_NAN() ((float) NAN) -#else -static CYTHON_INLINE float __PYX_NAN() { - float value; - memset(&value, 0xFF, sizeof(value)); - return value; -} -#endif -#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) -#define __Pyx_truncl trunc -#else -#define __Pyx_truncl truncl -#endif - -#define __PYX_MARK_ERR_POS(f_index, lineno) \ - { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } -#define __PYX_ERR(f_index, lineno, Ln_error) \ - { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } - -#ifndef __PYX_EXTERN_C - #ifdef __cplusplus - #define __PYX_EXTERN_C extern "C" - #else - #define __PYX_EXTERN_C extern - #endif -#endif - -#define __PYX_HAVE__setup_cython -#define __PYX_HAVE_API__setup_cython -/* Early includes */ -#ifdef _OPENMP -#include <omp.h> -#endif /* _OPENMP */ - -#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) -#define CYTHON_WITHOUT_ASSERTIONS -#endif - -typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; - const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; - -#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 -#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 -#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) -#define __PYX_DEFAULT_STRING_ENCODING "" -#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString -#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize -#define __Pyx_uchar_cast(c) ((unsigned char)c) -#define __Pyx_long_cast(x) ((long)x) -#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ - (sizeof(type) < sizeof(Py_ssize_t)) ||\ - (sizeof(type) > sizeof(Py_ssize_t) &&\ - likely(v < (type)PY_SSIZE_T_MAX ||\ - v == (type)PY_SSIZE_T_MAX) &&\ - (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ - v == (type)PY_SSIZE_T_MIN))) ||\ - (sizeof(type) == sizeof(Py_ssize_t) &&\ - (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ - v == (type)PY_SSIZE_T_MAX))) ) -static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { - return (size_t) i < (size_t) limit; -} -#if defined (__cplusplus) && __cplusplus >= 201103L - #include <cstdlib> - #define __Pyx_sst_abs(value) std::abs(value) -#elif SIZEOF_INT >= SIZEOF_SIZE_T - #define __Pyx_sst_abs(value) abs(value) -#elif SIZEOF_LONG >= SIZEOF_SIZE_T - #define __Pyx_sst_abs(value) labs(value) -#elif defined (_MSC_VER) - #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) -#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - #define __Pyx_sst_abs(value) llabs(value) -#elif defined (__GNUC__) - #define __Pyx_sst_abs(value) __builtin_llabs(value) -#else - #define __Pyx_sst_abs(value) ((value<0) ? -value : value) -#endif -static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); -static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); -#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) -#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) -#define __Pyx_PyBytes_FromString PyBytes_FromString -#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize -static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); -#if PY_MAJOR_VERSION < 3 - #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString - #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize -#else - #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString - #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize -#endif -#define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyObject_AsWritableString(s) ((char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsWritableSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) -#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) -#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) -#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) -#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) -static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { - const Py_UNICODE *u_end = u; - while (*u_end++) ; - return (size_t)(u_end - u - 1); -} -#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) -#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode -#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode -#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) -#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) -static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); -static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); -static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); -static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); -#define __Pyx_PySequence_Tuple(obj)\ - (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) -static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); -static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); -static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); -#if CYTHON_ASSUME_SAFE_MACROS -#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) -#else -#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) -#endif -#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) -#if PY_MAJOR_VERSION >= 3 -#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) -#else -#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) -#endif -#define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x)) -#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII -static int __Pyx_sys_getdefaultencoding_not_ascii; -static int __Pyx_init_sys_getdefaultencoding_params(void) { - PyObject* sys; - PyObject* default_encoding = NULL; - PyObject* ascii_chars_u = NULL; - PyObject* ascii_chars_b = NULL; - const char* default_encoding_c; - sys = PyImport_ImportModule("sys"); - if (!sys) goto bad; - default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); - Py_DECREF(sys); - if (!default_encoding) goto bad; - default_encoding_c = PyBytes_AsString(default_encoding); - if (!default_encoding_c) goto bad; - if (strcmp(default_encoding_c, "ascii") == 0) { - __Pyx_sys_getdefaultencoding_not_ascii = 0; - } else { - char ascii_chars[128]; - int c; - for (c = 0; c < 128; c++) { - ascii_chars[c] = c; - } - __Pyx_sys_getdefaultencoding_not_ascii = 1; - ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); - if (!ascii_chars_u) goto bad; - ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); - if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { - PyErr_Format( - PyExc_ValueError, - "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", - default_encoding_c); - goto bad; - } - Py_DECREF(ascii_chars_u); - Py_DECREF(ascii_chars_b); - } - Py_DECREF(default_encoding); - return 0; -bad: - Py_XDECREF(default_encoding); - Py_XDECREF(ascii_chars_u); - Py_XDECREF(ascii_chars_b); - return -1; -} -#endif -#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 -#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) -#else -#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) -#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT -static char* __PYX_DEFAULT_STRING_ENCODING; -static int __Pyx_init_sys_getdefaultencoding_params(void) { - PyObject* sys; - PyObject* default_encoding = NULL; - char* default_encoding_c; - sys = PyImport_ImportModule("sys"); - if (!sys) goto bad; - default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); - Py_DECREF(sys); - if (!default_encoding) goto bad; - default_encoding_c = PyBytes_AsString(default_encoding); - if (!default_encoding_c) goto bad; - __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); - if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; - strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); - Py_DECREF(default_encoding); - return 0; -bad: - Py_XDECREF(default_encoding); - return -1; -} -#endif -#endif - - -/* Test for GCC > 2.95 */ -#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) - #define likely(x) __builtin_expect(!!(x), 1) - #define unlikely(x) __builtin_expect(!!(x), 0) -#else /* !__GNUC__ or GCC < 2.95 */ - #define likely(x) (x) - #define unlikely(x) (x) -#endif /* __GNUC__ */ -static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } - -static PyObject *__pyx_m = NULL; -static PyObject *__pyx_d; -static PyObject *__pyx_b; -static PyObject *__pyx_cython_runtime = NULL; -static PyObject *__pyx_empty_tuple; -static PyObject *__pyx_empty_bytes; -static PyObject *__pyx_empty_unicode; -static int __pyx_lineno; -static int __pyx_clineno = 0; -static const char * __pyx_cfilenm= __FILE__; -static const char *__pyx_filename; - - -static const char *__pyx_f[] = { - "setup_cython.py", -}; - -/*--- Type declarations ---*/ - -/* --- Runtime support code (head) --- */ -/* Refnanny.proto */ -#ifndef CYTHON_REFNANNY - #define CYTHON_REFNANNY 0 -#endif -#if CYTHON_REFNANNY - typedef struct { - void (*INCREF)(void*, PyObject*, int); - void (*DECREF)(void*, PyObject*, int); - void (*GOTREF)(void*, PyObject*, int); - void (*GIVEREF)(void*, PyObject*, int); - void* (*SetupContext)(const char*, int, const char*); - void (*FinishContext)(void**); - } __Pyx_RefNannyAPIStruct; - static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; - static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); - #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; -#ifdef WITH_THREAD - #define __Pyx_RefNannySetupContext(name, acquire_gil)\ - if (acquire_gil) {\ - PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ - PyGILState_Release(__pyx_gilstate_save);\ - } else {\ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ - } -#else - #define __Pyx_RefNannySetupContext(name, acquire_gil)\ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) -#endif - #define __Pyx_RefNannyFinishContext()\ - __Pyx_RefNanny->FinishContext(&__pyx_refnanny) - #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) - #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) - #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) - #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) -#else - #define __Pyx_RefNannyDeclarations - #define __Pyx_RefNannySetupContext(name, acquire_gil) - #define __Pyx_RefNannyFinishContext() - #define __Pyx_INCREF(r) Py_INCREF(r) - #define __Pyx_DECREF(r) Py_DECREF(r) - #define __Pyx_GOTREF(r) - #define __Pyx_GIVEREF(r) - #define __Pyx_XINCREF(r) Py_XINCREF(r) - #define __Pyx_XDECREF(r) Py_XDECREF(r) - #define __Pyx_XGOTREF(r) - #define __Pyx_XGIVEREF(r) -#endif -#define __Pyx_XDECREF_SET(r, v) do {\ - PyObject *tmp = (PyObject *) r;\ - r = v; __Pyx_XDECREF(tmp);\ - } while (0) -#define __Pyx_DECREF_SET(r, v) do {\ - PyObject *tmp = (PyObject *) r;\ - r = v; __Pyx_DECREF(tmp);\ - } while (0) -#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) -#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) - -/* PyObjectGetAttrStr.proto */ -#if CYTHON_USE_TYPE_SLOTS -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); -#else -#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) -#endif - -/* Import.proto */ -static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); - -/* ImportFrom.proto */ -static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); - -/* GetBuiltinName.proto */ -static PyObject *__Pyx_GetBuiltinName(PyObject *name); - -/* PyDictVersioning.proto */ -#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS -#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) -#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) -#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ - (version_var) = __PYX_GET_DICT_VERSION(dict);\ - (cache_var) = (value); -#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ - static PY_UINT64_T __pyx_dict_version = 0;\ - static PyObject *__pyx_dict_cached_value = NULL;\ - if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ - (VAR) = __pyx_dict_cached_value;\ - } else {\ - (VAR) = __pyx_dict_cached_value = (LOOKUP);\ - __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ - }\ -} -static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); -static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); -static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); -#else -#define __PYX_GET_DICT_VERSION(dict) (0) -#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) -#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); -#endif - -/* GetModuleGlobalName.proto */ -#if CYTHON_USE_DICT_VERSIONS -#define __Pyx_GetModuleGlobalName(var, name) {\ - static PY_UINT64_T __pyx_dict_version = 0;\ - static PyObject *__pyx_dict_cached_value = NULL;\ - (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ - (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ - __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ -} -#define __Pyx_GetModuleGlobalNameUncached(var, name) {\ - PY_UINT64_T __pyx_dict_version;\ - PyObject *__pyx_dict_cached_value;\ - (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ -} -static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); -#else -#define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) -#define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) -static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); -#endif - -/* PyCFunctionFastCall.proto */ -#if CYTHON_FAST_PYCCALL -static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs); -#else -#define __Pyx_PyCFunction_FastCall(func, args, nargs) (assert(0), NULL) -#endif - -/* PyFunctionFastCall.proto */ -#if CYTHON_FAST_PYCALL -#define __Pyx_PyFunction_FastCall(func, args, nargs)\ - __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) -#if 1 || PY_VERSION_HEX < 0x030600B1 -static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); -#else -#define __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs) _PyFunction_FastCallDict(func, args, nargs, kwargs) -#endif -#define __Pyx_BUILD_ASSERT_EXPR(cond)\ - (sizeof(char [1 - 2*!(cond)]) - 1) -#ifndef Py_MEMBER_SIZE -#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) -#endif -#if CYTHON_FAST_PYCALL - static size_t __pyx_pyframe_localsplus_offset = 0; - #include "frameobject.h" -#if PY_VERSION_HEX >= 0x030b00a6 - #ifndef Py_BUILD_CORE - #define Py_BUILD_CORE 1 - #endif - #include "internal/pycore_frame.h" -#endif - #define __Pxy_PyFrame_Initialize_Offsets()\ - ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ - (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) - #define __Pyx_PyFrame_GetLocalsplus(frame)\ - (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) -#endif // CYTHON_FAST_PYCALL -#endif - -/* PyObjectCall.proto */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); -#else -#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) -#endif - -/* PyObjectCallMethO.proto */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); -#endif - -/* PyObjectCallOneArg.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); - -/* PyThreadStateGet.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; -#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; -#define __Pyx_PyErr_Occurred() __pyx_tstate->curexc_type -#else -#define __Pyx_PyThreadState_declare -#define __Pyx_PyThreadState_assign -#define __Pyx_PyErr_Occurred() PyErr_Occurred() -#endif - -/* PyErrFetchRestore.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) -#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) -#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) -#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) -#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); -static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#if CYTHON_COMPILING_IN_CPYTHON -#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) -#else -#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) -#endif -#else -#define __Pyx_PyErr_Clear() PyErr_Clear() -#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) -#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) -#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) -#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) -#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) -#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) -#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) -#endif - -/* CLineInTraceback.proto */ -#ifdef CYTHON_CLINE_IN_TRACEBACK -#define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) -#else -static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); -#endif - -/* CodeObjectCache.proto */ -typedef struct { - PyCodeObject* code_object; - int code_line; -} __Pyx_CodeObjectCacheEntry; -struct __Pyx_CodeObjectCache { - int count; - int max_count; - __Pyx_CodeObjectCacheEntry* entries; -}; -static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; -static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); -static PyCodeObject *__pyx_find_code_object(int code_line); -static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); - -/* AddTraceback.proto */ -static void __Pyx_AddTraceback(const char *funcname, int c_line, - int py_line, const char *filename); - -/* GCCDiagnostics.proto */ -#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) -#define __Pyx_HAS_GCC_DIAGNOSTIC -#endif - -/* CIntToPy.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); - -/* CIntFromPy.proto */ -static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); - -/* CIntFromPy.proto */ -static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); - -/* FastTypeChecks.proto */ -#if CYTHON_COMPILING_IN_CPYTHON -#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) -static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); -static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); -static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); -#else -#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) -#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) -#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) -#endif -#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) - -/* CheckBinaryVersion.proto */ -static int __Pyx_check_binary_version(void); - -/* InitStrings.proto */ -static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); - - -/* Module declarations from 'setup_cython' */ -#define __Pyx_MODULE_NAME "setup_cython" -extern int __pyx_module_is_main_setup_cython; -int __pyx_module_is_main_setup_cython = 0; - -/* Implementation of 'setup_cython' */ -static const char __pyx_k_main[] = "__main__"; -static const char __pyx_k_name[] = "__name__"; -static const char __pyx_k_test[] = "__test__"; -static const char __pyx_k_setup[] = "setup"; -static const char __pyx_k_import[] = "__import__"; -static const char __pyx_k_name_2[] = "name"; -static const char __pyx_k_Test_app[] = "Test app"; -static const char __pyx_k_zip_safe[] = "zip_safe"; -static const char __pyx_k_Extension[] = "Extension"; -static const char __pyx_k_cythonize[] = "cythonize"; -static const char __pyx_k_setuptools[] = "setuptools"; -static const char __pyx_k_ext_modules[] = "ext_modules"; -static const char __pyx_k_Cython_Build[] = "Cython.Build"; -static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; -static const char __pyx_k_geesedb_index_cython_test_pyx[] = "geesedb/index/cython/test.pyx"; -static PyObject *__pyx_n_s_Cython_Build; -static PyObject *__pyx_n_s_Extension; -static PyObject *__pyx_kp_s_Test_app; -static PyObject *__pyx_n_s_cline_in_traceback; -static PyObject *__pyx_n_s_cythonize; -static PyObject *__pyx_n_s_ext_modules; -static PyObject *__pyx_kp_s_geesedb_index_cython_test_pyx; -static PyObject *__pyx_n_s_import; -static PyObject *__pyx_n_s_main; -static PyObject *__pyx_n_s_name; -static PyObject *__pyx_n_s_name_2; -static PyObject *__pyx_n_s_setup; -static PyObject *__pyx_n_s_setuptools; -static PyObject *__pyx_n_s_test; -static PyObject *__pyx_n_s_zip_safe; -/* Late includes */ - -static PyMethodDef __pyx_methods[] = { - {0, 0, 0, 0} -}; - -#if PY_MAJOR_VERSION >= 3 -#if CYTHON_PEP489_MULTI_PHASE_INIT -static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ -static int __pyx_pymod_exec_setup_cython(PyObject* module); /*proto*/ -static PyModuleDef_Slot __pyx_moduledef_slots[] = { - {Py_mod_create, (void*)__pyx_pymod_create}, - {Py_mod_exec, (void*)__pyx_pymod_exec_setup_cython}, - {0, NULL} -}; -#endif - -static struct PyModuleDef __pyx_moduledef = { - PyModuleDef_HEAD_INIT, - "setup_cython", - 0, /* m_doc */ - #if CYTHON_PEP489_MULTI_PHASE_INIT - 0, /* m_size */ - #else - -1, /* m_size */ - #endif - __pyx_methods /* m_methods */, - #if CYTHON_PEP489_MULTI_PHASE_INIT - __pyx_moduledef_slots, /* m_slots */ - #else - NULL, /* m_reload */ - #endif - NULL, /* m_traverse */ - NULL, /* m_clear */ - NULL /* m_free */ -}; -#endif -#ifndef CYTHON_SMALL_CODE -#if defined(__clang__) - #define CYTHON_SMALL_CODE -#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) - #define CYTHON_SMALL_CODE __attribute__((cold)) -#else - #define CYTHON_SMALL_CODE -#endif -#endif - -static __Pyx_StringTabEntry __pyx_string_tab[] = { - {&__pyx_n_s_Cython_Build, __pyx_k_Cython_Build, sizeof(__pyx_k_Cython_Build), 0, 0, 1, 1}, - {&__pyx_n_s_Extension, __pyx_k_Extension, sizeof(__pyx_k_Extension), 0, 0, 1, 1}, - {&__pyx_kp_s_Test_app, __pyx_k_Test_app, sizeof(__pyx_k_Test_app), 0, 0, 1, 0}, - {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, - {&__pyx_n_s_cythonize, __pyx_k_cythonize, sizeof(__pyx_k_cythonize), 0, 0, 1, 1}, - {&__pyx_n_s_ext_modules, __pyx_k_ext_modules, sizeof(__pyx_k_ext_modules), 0, 0, 1, 1}, - {&__pyx_kp_s_geesedb_index_cython_test_pyx, __pyx_k_geesedb_index_cython_test_pyx, sizeof(__pyx_k_geesedb_index_cython_test_pyx), 0, 0, 1, 0}, - {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, - {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, - {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, - {&__pyx_n_s_name_2, __pyx_k_name_2, sizeof(__pyx_k_name_2), 0, 0, 1, 1}, - {&__pyx_n_s_setup, __pyx_k_setup, sizeof(__pyx_k_setup), 0, 0, 1, 1}, - {&__pyx_n_s_setuptools, __pyx_k_setuptools, sizeof(__pyx_k_setuptools), 0, 0, 1, 1}, - {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, - {&__pyx_n_s_zip_safe, __pyx_k_zip_safe, sizeof(__pyx_k_zip_safe), 0, 0, 1, 1}, - {0, 0, 0, 0, 0, 0, 0} -}; -static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { - return 0; -} - -static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); - __Pyx_RefNannyFinishContext(); - return 0; -} - -static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { - if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); - return 0; - __pyx_L1_error:; - return -1; -} - -static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ - -static int __Pyx_modinit_global_init_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); - /*--- Global init code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_variable_export_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); - /*--- Variable export code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_function_export_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); - /*--- Function export code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_type_init_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); - /*--- Type init code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_type_import_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); - /*--- Type import code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_variable_import_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); - /*--- Variable import code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_function_import_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); - /*--- Function import code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - - -#ifndef CYTHON_NO_PYINIT_EXPORT -#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC -#elif PY_MAJOR_VERSION < 3 -#ifdef __cplusplus -#define __Pyx_PyMODINIT_FUNC extern "C" void -#else -#define __Pyx_PyMODINIT_FUNC void -#endif -#else -#ifdef __cplusplus -#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * -#else -#define __Pyx_PyMODINIT_FUNC PyObject * -#endif -#endif - - -#if PY_MAJOR_VERSION < 3 -__Pyx_PyMODINIT_FUNC initsetup_cython(void) CYTHON_SMALL_CODE; /*proto*/ -__Pyx_PyMODINIT_FUNC initsetup_cython(void) -#else -__Pyx_PyMODINIT_FUNC PyInit_setup_cython(void) CYTHON_SMALL_CODE; /*proto*/ -__Pyx_PyMODINIT_FUNC PyInit_setup_cython(void) -#if CYTHON_PEP489_MULTI_PHASE_INIT -{ - return PyModuleDef_Init(&__pyx_moduledef); -} -static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { - #if PY_VERSION_HEX >= 0x030700A1 - static PY_INT64_T main_interpreter_id = -1; - PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); - if (main_interpreter_id == -1) { - main_interpreter_id = current_id; - return (unlikely(current_id == -1)) ? -1 : 0; - } else if (unlikely(main_interpreter_id != current_id)) - #else - static PyInterpreterState *main_interpreter = NULL; - PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; - if (!main_interpreter) { - main_interpreter = current_interpreter; - } else if (unlikely(main_interpreter != current_interpreter)) - #endif - { - PyErr_SetString( - PyExc_ImportError, - "Interpreter change detected - this module can only be loaded into one interpreter per process."); - return -1; - } - return 0; -} -static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) { - PyObject *value = PyObject_GetAttrString(spec, from_name); - int result = 0; - if (likely(value)) { - if (allow_none || value != Py_None) { - result = PyDict_SetItemString(moddict, to_name, value); - } - Py_DECREF(value); - } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { - PyErr_Clear(); - } else { - result = -1; - } - return result; -} -static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, CYTHON_UNUSED PyModuleDef *def) { - PyObject *module = NULL, *moddict, *modname; - if (__Pyx_check_single_interpreter()) - return NULL; - if (__pyx_m) - return __Pyx_NewRef(__pyx_m); - modname = PyObject_GetAttrString(spec, "name"); - if (unlikely(!modname)) goto bad; - module = PyModule_NewObject(modname); - Py_DECREF(modname); - if (unlikely(!module)) goto bad; - moddict = PyModule_GetDict(module); - if (unlikely(!moddict)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; - return module; -bad: - Py_XDECREF(module); - return NULL; -} - - -static CYTHON_SMALL_CODE int __pyx_pymod_exec_setup_cython(PyObject *__pyx_pyinit_module) -#endif -#endif -{ - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannyDeclarations - #if CYTHON_PEP489_MULTI_PHASE_INIT - if (__pyx_m) { - if (__pyx_m == __pyx_pyinit_module) return 0; - PyErr_SetString(PyExc_RuntimeError, "Module 'setup_cython' has already been imported. Re-initialisation is not supported."); - return -1; - } - #elif PY_MAJOR_VERSION >= 3 - if (__pyx_m) return __Pyx_NewRef(__pyx_m); - #endif - #if CYTHON_REFNANNY -__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); -if (!__Pyx_RefNanny) { - PyErr_Clear(); - __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); - if (!__Pyx_RefNanny) - Py_FatalError("failed to import 'refnanny' module"); -} -#endif - __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit_setup_cython(void)", 0); - if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #ifdef __Pxy_PyFrame_Initialize_Offsets - __Pxy_PyFrame_Initialize_Offsets(); - #endif - __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) - #ifdef __Pyx_CyFunction_USED - if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_FusedFunction_USED - if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_Coroutine_USED - if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_Generator_USED - if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_AsyncGen_USED - if (__pyx_AsyncGen_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_StopAsyncIteration_USED - if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - /*--- Library function declarations ---*/ - /*--- Threads initialization code ---*/ - #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS - PyEval_InitThreads(); - #endif - /*--- Module creation code ---*/ - #if CYTHON_PEP489_MULTI_PHASE_INIT - __pyx_m = __pyx_pyinit_module; - Py_INCREF(__pyx_m); - #else - #if PY_MAJOR_VERSION < 3 - __pyx_m = Py_InitModule4("setup_cython", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); - #else - __pyx_m = PyModule_Create(&__pyx_moduledef); - #endif - if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) - Py_INCREF(__pyx_d); - __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) - Py_INCREF(__pyx_b); - __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) - Py_INCREF(__pyx_cython_runtime); - if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); - /*--- Initialize various global constants etc. ---*/ - if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) - if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - if (__pyx_module_is_main_setup_cython) { - if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) - } - #if PY_MAJOR_VERSION >= 3 - { - PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) - if (!PyDict_GetItemString(modules, "setup_cython")) { - if (unlikely(PyDict_SetItemString(modules, "setup_cython", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) - } - } - #endif - /*--- Builtin init code ---*/ - if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - /*--- Constants init code ---*/ - if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - /*--- Global type/function init code ---*/ - (void)__Pyx_modinit_global_init_code(); - (void)__Pyx_modinit_variable_export_code(); - (void)__Pyx_modinit_function_export_code(); - (void)__Pyx_modinit_type_init_code(); - (void)__Pyx_modinit_type_import_code(); - (void)__Pyx_modinit_variable_import_code(); - (void)__Pyx_modinit_function_import_code(); - /*--- Execution code ---*/ - #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) - if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - - /* "setup_cython.py":1 - * from setuptools import setup, Extension # <<<<<<<<<<<<<< - * from Cython.Build import cythonize - * - */ - __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(__pyx_n_s_setup); - __Pyx_GIVEREF(__pyx_n_s_setup); - PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_setup); - __Pyx_INCREF(__pyx_n_s_Extension); - __Pyx_GIVEREF(__pyx_n_s_Extension); - PyList_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_Extension); - __pyx_t_2 = __Pyx_Import(__pyx_n_s_setuptools, __pyx_t_1, -1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_setup); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_setup, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_Extension); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_Extension, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "setup_cython.py":2 - * from setuptools import setup, Extension - * from Cython.Build import cythonize # <<<<<<<<<<<<<< - * - * setup( - */ - __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_INCREF(__pyx_n_s_cythonize); - __Pyx_GIVEREF(__pyx_n_s_cythonize); - PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_cythonize); - __pyx_t_1 = __Pyx_Import(__pyx_n_s_Cython_Build, __pyx_t_2, -1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_cythonize); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_cythonize, __pyx_t_2) < 0) __PYX_ERR(0, 2, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "setup_cython.py":4 - * from Cython.Build import cythonize - * - * setup( # <<<<<<<<<<<<<< - * name='Test app', - * ext_modules=cythonize(["geesedb/index/cython/test.pyx"]), - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_setup); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 4, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - - /* "setup_cython.py":5 - * - * setup( - * name='Test app', # <<<<<<<<<<<<<< - * ext_modules=cythonize(["geesedb/index/cython/test.pyx"]), - * zip_safe=False, - */ - __pyx_t_2 = __Pyx_PyDict_NewPresized(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 5, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_name_2, __pyx_kp_s_Test_app) < 0) __PYX_ERR(0, 5, __pyx_L1_error) - - /* "setup_cython.py":6 - * setup( - * name='Test app', - * ext_modules=cythonize(["geesedb/index/cython/test.pyx"]), # <<<<<<<<<<<<<< - * zip_safe=False, - * ) - */ - __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_cythonize); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyList_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_INCREF(__pyx_kp_s_geesedb_index_cython_test_pyx); - __Pyx_GIVEREF(__pyx_kp_s_geesedb_index_cython_test_pyx); - PyList_SET_ITEM(__pyx_t_4, 0, __pyx_kp_s_geesedb_index_cython_test_pyx); - __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_ext_modules, __pyx_t_5) < 0) __PYX_ERR(0, 5, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - - /* "setup_cython.py":7 - * name='Test app', - * ext_modules=cythonize(["geesedb/index/cython/test.pyx"]), - * zip_safe=False, # <<<<<<<<<<<<<< - * ) - */ - if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_zip_safe, Py_False) < 0) __PYX_ERR(0, 5, __pyx_L1_error) - - /* "setup_cython.py":4 - * from Cython.Build import cythonize - * - * setup( # <<<<<<<<<<<<<< - * name='Test app', - * ext_modules=cythonize(["geesedb/index/cython/test.pyx"]), - */ - __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_empty_tuple, __pyx_t_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 4, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - - /* "setup_cython.py":1 - * from setuptools import setup, Extension # <<<<<<<<<<<<<< - * from Cython.Build import cythonize - * - */ - __pyx_t_5 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 1, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_5) < 0) __PYX_ERR(0, 1, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - - /*--- Wrapped vars code ---*/ - - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - if (__pyx_m) { - if (__pyx_d) { - __Pyx_AddTraceback("init setup_cython", __pyx_clineno, __pyx_lineno, __pyx_filename); - } - Py_CLEAR(__pyx_m); - } else if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_ImportError, "init setup_cython"); - } - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - #if CYTHON_PEP489_MULTI_PHASE_INIT - return (__pyx_m != NULL) ? 0 : -1; - #elif PY_MAJOR_VERSION >= 3 - return __pyx_m; - #else - return; - #endif -} - -/* --- Runtime support code --- */ -/* Refnanny */ -#if CYTHON_REFNANNY -static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { - PyObject *m = NULL, *p = NULL; - void *r = NULL; - m = PyImport_ImportModule(modname); - if (!m) goto end; - p = PyObject_GetAttrString(m, "RefNannyAPI"); - if (!p) goto end; - r = PyLong_AsVoidPtr(p); -end: - Py_XDECREF(p); - Py_XDECREF(m); - return (__Pyx_RefNannyAPIStruct *)r; -} -#endif - -/* PyObjectGetAttrStr */ -#if CYTHON_USE_TYPE_SLOTS -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { - PyTypeObject* tp = Py_TYPE(obj); - if (likely(tp->tp_getattro)) - return tp->tp_getattro(obj, attr_name); -#if PY_MAJOR_VERSION < 3 - if (likely(tp->tp_getattr)) - return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); -#endif - return PyObject_GetAttr(obj, attr_name); -} -#endif - -/* Import */ -static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { - PyObject *empty_list = 0; - PyObject *module = 0; - PyObject *global_dict = 0; - PyObject *empty_dict = 0; - PyObject *list; - #if PY_MAJOR_VERSION < 3 - PyObject *py_import; - py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); - if (!py_import) - goto bad; - #endif - if (from_list) - list = from_list; - else { - empty_list = PyList_New(0); - if (!empty_list) - goto bad; - list = empty_list; - } - global_dict = PyModule_GetDict(__pyx_m); - if (!global_dict) - goto bad; - empty_dict = PyDict_New(); - if (!empty_dict) - goto bad; - { - #if PY_MAJOR_VERSION >= 3 - if (level == -1) { - if ((1) && (strchr(__Pyx_MODULE_NAME, '.'))) { - module = PyImport_ImportModuleLevelObject( - name, global_dict, empty_dict, list, 1); - if (!module) { - if (!PyErr_ExceptionMatches(PyExc_ImportError)) - goto bad; - PyErr_Clear(); - } - } - level = 0; - } - #endif - if (!module) { - #if PY_MAJOR_VERSION < 3 - PyObject *py_level = PyInt_FromLong(level); - if (!py_level) - goto bad; - module = PyObject_CallFunctionObjArgs(py_import, - name, global_dict, empty_dict, list, py_level, (PyObject *)NULL); - Py_DECREF(py_level); - #else - module = PyImport_ImportModuleLevelObject( - name, global_dict, empty_dict, list, level); - #endif - } - } -bad: - #if PY_MAJOR_VERSION < 3 - Py_XDECREF(py_import); - #endif - Py_XDECREF(empty_list); - Py_XDECREF(empty_dict); - return module; -} - -/* ImportFrom */ -static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { - PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); - if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { - PyErr_Format(PyExc_ImportError, - #if PY_MAJOR_VERSION < 3 - "cannot import name %.230s", PyString_AS_STRING(name)); - #else - "cannot import name %S", name); - #endif - } - return value; -} - -/* GetBuiltinName */ -static PyObject *__Pyx_GetBuiltinName(PyObject *name) { - PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); - if (unlikely(!result)) { - PyErr_Format(PyExc_NameError, -#if PY_MAJOR_VERSION >= 3 - "name '%U' is not defined", name); -#else - "name '%.200s' is not defined", PyString_AS_STRING(name)); -#endif - } - return result; -} - -/* PyDictVersioning */ -#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS -static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { - PyObject *dict = Py_TYPE(obj)->tp_dict; - return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; -} -static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { - PyObject **dictptr = NULL; - Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; - if (offset) { -#if CYTHON_COMPILING_IN_CPYTHON - dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); -#else - dictptr = _PyObject_GetDictPtr(obj); -#endif - } - return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; -} -static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { - PyObject *dict = Py_TYPE(obj)->tp_dict; - if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) - return 0; - return obj_dict_version == __Pyx_get_object_dict_version(obj); -} -#endif - -/* GetModuleGlobalName */ -#if CYTHON_USE_DICT_VERSIONS -static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) -#else -static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) -#endif -{ - PyObject *result; -#if !CYTHON_AVOID_BORROWED_REFS -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 - result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); - __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) - if (likely(result)) { - return __Pyx_NewRef(result); - } else if (unlikely(PyErr_Occurred())) { - return NULL; - } -#else - result = PyDict_GetItem(__pyx_d, name); - __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) - if (likely(result)) { - return __Pyx_NewRef(result); - } -#endif -#else - result = PyObject_GetItem(__pyx_d, name); - __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) - if (likely(result)) { - return __Pyx_NewRef(result); - } - PyErr_Clear(); -#endif - return __Pyx_GetBuiltinName(name); -} - -/* PyCFunctionFastCall */ -#if CYTHON_FAST_PYCCALL -static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) { - PyCFunctionObject *func = (PyCFunctionObject*)func_obj; - PyCFunction meth = PyCFunction_GET_FUNCTION(func); - PyObject *self = PyCFunction_GET_SELF(func); - int flags = PyCFunction_GET_FLAGS(func); - assert(PyCFunction_Check(func)); - assert(METH_FASTCALL == (flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))); - assert(nargs >= 0); - assert(nargs == 0 || args != NULL); - /* _PyCFunction_FastCallDict() must not be called with an exception set, - because it may clear it (directly or indirectly) and so the - caller loses its exception */ - assert(!PyErr_Occurred()); - if ((PY_VERSION_HEX < 0x030700A0) || unlikely(flags & METH_KEYWORDS)) { - return (*((__Pyx_PyCFunctionFastWithKeywords)(void*)meth)) (self, args, nargs, NULL); - } else { - return (*((__Pyx_PyCFunctionFast)(void*)meth)) (self, args, nargs); - } -} -#endif - -/* PyFunctionFastCall */ -#if CYTHON_FAST_PYCALL -static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, - PyObject *globals) { - PyFrameObject *f; - PyThreadState *tstate = __Pyx_PyThreadState_Current; - PyObject **fastlocals; - Py_ssize_t i; - PyObject *result; - assert(globals != NULL); - /* XXX Perhaps we should create a specialized - PyFrame_New() that doesn't take locals, but does - take builtins without sanity checking them. - */ - assert(tstate != NULL); - f = PyFrame_New(tstate, co, globals, NULL); - if (f == NULL) { - return NULL; - } - fastlocals = __Pyx_PyFrame_GetLocalsplus(f); - for (i = 0; i < na; i++) { - Py_INCREF(*args); - fastlocals[i] = *args++; - } - result = PyEval_EvalFrameEx(f,0); - ++tstate->recursion_depth; - Py_DECREF(f); - --tstate->recursion_depth; - return result; -} -#if 1 || PY_VERSION_HEX < 0x030600B1 -static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { - PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); - PyObject *globals = PyFunction_GET_GLOBALS(func); - PyObject *argdefs = PyFunction_GET_DEFAULTS(func); - PyObject *closure; -#if PY_MAJOR_VERSION >= 3 - PyObject *kwdefs; -#endif - PyObject *kwtuple, **k; - PyObject **d; - Py_ssize_t nd; - Py_ssize_t nk; - PyObject *result; - assert(kwargs == NULL || PyDict_Check(kwargs)); - nk = kwargs ? PyDict_Size(kwargs) : 0; - if (Py_EnterRecursiveCall((char*)" while calling a Python object")) { - return NULL; - } - if ( -#if PY_MAJOR_VERSION >= 3 - co->co_kwonlyargcount == 0 && -#endif - likely(kwargs == NULL || nk == 0) && - co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { - if (argdefs == NULL && co->co_argcount == nargs) { - result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); - goto done; - } - else if (nargs == 0 && argdefs != NULL - && co->co_argcount == Py_SIZE(argdefs)) { - /* function called with no arguments, but all parameters have - a default value: use default values as arguments .*/ - args = &PyTuple_GET_ITEM(argdefs, 0); - result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); - goto done; - } - } - if (kwargs != NULL) { - Py_ssize_t pos, i; - kwtuple = PyTuple_New(2 * nk); - if (kwtuple == NULL) { - result = NULL; - goto done; - } - k = &PyTuple_GET_ITEM(kwtuple, 0); - pos = i = 0; - while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { - Py_INCREF(k[i]); - Py_INCREF(k[i+1]); - i += 2; - } - nk = i / 2; - } - else { - kwtuple = NULL; - k = NULL; - } - closure = PyFunction_GET_CLOSURE(func); -#if PY_MAJOR_VERSION >= 3 - kwdefs = PyFunction_GET_KW_DEFAULTS(func); -#endif - if (argdefs != NULL) { - d = &PyTuple_GET_ITEM(argdefs, 0); - nd = Py_SIZE(argdefs); - } - else { - d = NULL; - nd = 0; - } -#if PY_MAJOR_VERSION >= 3 - result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, - args, (int)nargs, - k, (int)nk, - d, (int)nd, kwdefs, closure); -#else - result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, - args, (int)nargs, - k, (int)nk, - d, (int)nd, closure); -#endif - Py_XDECREF(kwtuple); -done: - Py_LeaveRecursiveCall(); - return result; -} -#endif -#endif - -/* PyObjectCall */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { - PyObject *result; - ternaryfunc call = Py_TYPE(func)->tp_call; - if (unlikely(!call)) - return PyObject_Call(func, arg, kw); - if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) - return NULL; - result = (*call)(func, arg, kw); - Py_LeaveRecursiveCall(); - if (unlikely(!result) && unlikely(!PyErr_Occurred())) { - PyErr_SetString( - PyExc_SystemError, - "NULL result without error in PyObject_Call"); - } - return result; -} -#endif - -/* PyObjectCallMethO */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { - PyObject *self, *result; - PyCFunction cfunc; - cfunc = PyCFunction_GET_FUNCTION(func); - self = PyCFunction_GET_SELF(func); - if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) - return NULL; - result = cfunc(self, arg); - Py_LeaveRecursiveCall(); - if (unlikely(!result) && unlikely(!PyErr_Occurred())) { - PyErr_SetString( - PyExc_SystemError, - "NULL result without error in PyObject_Call"); - } - return result; -} -#endif - -/* PyObjectCallOneArg */ -#if CYTHON_COMPILING_IN_CPYTHON -static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) { - PyObject *result; - PyObject *args = PyTuple_New(1); - if (unlikely(!args)) return NULL; - Py_INCREF(arg); - PyTuple_SET_ITEM(args, 0, arg); - result = __Pyx_PyObject_Call(func, args, NULL); - Py_DECREF(args); - return result; -} -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { -#if CYTHON_FAST_PYCALL - if (PyFunction_Check(func)) { - return __Pyx_PyFunction_FastCall(func, &arg, 1); - } -#endif - if (likely(PyCFunction_Check(func))) { - if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) { - return __Pyx_PyObject_CallMethO(func, arg); -#if CYTHON_FAST_PYCCALL - } else if (__Pyx_PyFastCFunction_Check(func)) { - return __Pyx_PyCFunction_FastCall(func, &arg, 1); -#endif - } - } - return __Pyx__PyObject_CallOneArg(func, arg); -} -#else -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { - PyObject *result; - PyObject *args = PyTuple_Pack(1, arg); - if (unlikely(!args)) return NULL; - result = __Pyx_PyObject_Call(func, args, NULL); - Py_DECREF(args); - return result; -} -#endif - -/* PyErrFetchRestore */ -#if CYTHON_FAST_THREAD_STATE -static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { - PyObject *tmp_type, *tmp_value, *tmp_tb; - tmp_type = tstate->curexc_type; - tmp_value = tstate->curexc_value; - tmp_tb = tstate->curexc_traceback; - tstate->curexc_type = type; - tstate->curexc_value = value; - tstate->curexc_traceback = tb; - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); -} -static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - *type = tstate->curexc_type; - *value = tstate->curexc_value; - *tb = tstate->curexc_traceback; - tstate->curexc_type = 0; - tstate->curexc_value = 0; - tstate->curexc_traceback = 0; -} -#endif - -/* CLineInTraceback */ -#ifndef CYTHON_CLINE_IN_TRACEBACK -static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) { - PyObject *use_cline; - PyObject *ptype, *pvalue, *ptraceback; -#if CYTHON_COMPILING_IN_CPYTHON - PyObject **cython_runtime_dict; -#endif - if (unlikely(!__pyx_cython_runtime)) { - return c_line; - } - __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); -#if CYTHON_COMPILING_IN_CPYTHON - cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); - if (likely(cython_runtime_dict)) { - __PYX_PY_DICT_LOOKUP_IF_MODIFIED( - use_cline, *cython_runtime_dict, - __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) - } else -#endif - { - PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); - if (use_cline_obj) { - use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; - Py_DECREF(use_cline_obj); - } else { - PyErr_Clear(); - use_cline = NULL; - } - } - if (!use_cline) { - c_line = 0; - (void) PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); - } - else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { - c_line = 0; - } - __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); - return c_line; -} -#endif - -/* CodeObjectCache */ -static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { - int start = 0, mid = 0, end = count - 1; - if (end >= 0 && code_line > entries[end].code_line) { - return count; - } - while (start < end) { - mid = start + (end - start) / 2; - if (code_line < entries[mid].code_line) { - end = mid; - } else if (code_line > entries[mid].code_line) { - start = mid + 1; - } else { - return mid; - } - } - if (code_line <= entries[mid].code_line) { - return mid; - } else { - return mid + 1; - } -} -static PyCodeObject *__pyx_find_code_object(int code_line) { - PyCodeObject* code_object; - int pos; - if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { - return NULL; - } - pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); - if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { - return NULL; - } - code_object = __pyx_code_cache.entries[pos].code_object; - Py_INCREF(code_object); - return code_object; -} -static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { - int pos, i; - __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; - if (unlikely(!code_line)) { - return; - } - if (unlikely(!entries)) { - entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); - if (likely(entries)) { - __pyx_code_cache.entries = entries; - __pyx_code_cache.max_count = 64; - __pyx_code_cache.count = 1; - entries[0].code_line = code_line; - entries[0].code_object = code_object; - Py_INCREF(code_object); - } - return; - } - pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); - if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { - PyCodeObject* tmp = entries[pos].code_object; - entries[pos].code_object = code_object; - Py_DECREF(tmp); - return; - } - if (__pyx_code_cache.count == __pyx_code_cache.max_count) { - int new_max = __pyx_code_cache.max_count + 64; - entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( - __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); - if (unlikely(!entries)) { - return; - } - __pyx_code_cache.entries = entries; - __pyx_code_cache.max_count = new_max; - } - for (i=__pyx_code_cache.count; i>pos; i--) { - entries[i] = entries[i-1]; - } - entries[pos].code_line = code_line; - entries[pos].code_object = code_object; - __pyx_code_cache.count++; - Py_INCREF(code_object); -} - -/* AddTraceback */ -#include "compile.h" -#include "frameobject.h" -#include "traceback.h" -#if PY_VERSION_HEX >= 0x030b00a6 - #ifndef Py_BUILD_CORE - #define Py_BUILD_CORE 1 - #endif - #include "internal/pycore_frame.h" -#endif -static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( - const char *funcname, int c_line, - int py_line, const char *filename) { - PyCodeObject *py_code = NULL; - PyObject *py_funcname = NULL; - #if PY_MAJOR_VERSION < 3 - PyObject *py_srcfile = NULL; - py_srcfile = PyString_FromString(filename); - if (!py_srcfile) goto bad; - #endif - if (c_line) { - #if PY_MAJOR_VERSION < 3 - py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); - if (!py_funcname) goto bad; - #else - py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); - if (!py_funcname) goto bad; - funcname = PyUnicode_AsUTF8(py_funcname); - if (!funcname) goto bad; - #endif - } - else { - #if PY_MAJOR_VERSION < 3 - py_funcname = PyString_FromString(funcname); - if (!py_funcname) goto bad; - #endif - } - #if PY_MAJOR_VERSION < 3 - py_code = __Pyx_PyCode_New( - 0, - 0, - 0, - 0, - 0, - __pyx_empty_bytes, /*PyObject *code,*/ - __pyx_empty_tuple, /*PyObject *consts,*/ - __pyx_empty_tuple, /*PyObject *names,*/ - __pyx_empty_tuple, /*PyObject *varnames,*/ - __pyx_empty_tuple, /*PyObject *freevars,*/ - __pyx_empty_tuple, /*PyObject *cellvars,*/ - py_srcfile, /*PyObject *filename,*/ - py_funcname, /*PyObject *name,*/ - py_line, - __pyx_empty_bytes /*PyObject *lnotab*/ - ); - Py_DECREF(py_srcfile); - #else - py_code = PyCode_NewEmpty(filename, funcname, py_line); - #endif - Py_XDECREF(py_funcname); // XDECREF since it's only set on Py3 if cline - return py_code; -bad: - Py_XDECREF(py_funcname); - #if PY_MAJOR_VERSION < 3 - Py_XDECREF(py_srcfile); - #endif - return NULL; -} -static void __Pyx_AddTraceback(const char *funcname, int c_line, - int py_line, const char *filename) { - PyCodeObject *py_code = 0; - PyFrameObject *py_frame = 0; - PyThreadState *tstate = __Pyx_PyThreadState_Current; - PyObject *ptype, *pvalue, *ptraceback; - if (c_line) { - c_line = __Pyx_CLineForTraceback(tstate, c_line); - } - py_code = __pyx_find_code_object(c_line ? -c_line : py_line); - if (!py_code) { - __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); - py_code = __Pyx_CreateCodeObjectForTraceback( - funcname, c_line, py_line, filename); - if (!py_code) { - /* If the code object creation fails, then we should clear the - fetched exception references and propagate the new exception */ - Py_XDECREF(ptype); - Py_XDECREF(pvalue); - Py_XDECREF(ptraceback); - goto bad; - } - __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); - __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); - } - py_frame = PyFrame_New( - tstate, /*PyThreadState *tstate,*/ - py_code, /*PyCodeObject *code,*/ - __pyx_d, /*PyObject *globals,*/ - 0 /*PyObject *locals*/ - ); - if (!py_frame) goto bad; - __Pyx_PyFrame_SetLineNumber(py_frame, py_line); - PyTraceBack_Here(py_frame); -bad: - Py_XDECREF(py_code); - Py_XDECREF(py_frame); -} - -/* CIntToPy */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const long neg_one = (long) -1, const_zero = (long) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(long) < sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(long) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { - return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -#endif - } - } else { - if (sizeof(long) <= sizeof(long)) { - return PyInt_FromLong((long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { - return PyLong_FromLongLong((PY_LONG_LONG) value); -#endif - } - } - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; - return _PyLong_FromByteArray(bytes, sizeof(long), - little, !is_unsigned); - } -} - -/* CIntFromPyVerify */ -#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ - __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) -#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ - __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) -#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ - {\ - func_type value = func_value;\ - if (sizeof(target_type) < sizeof(func_type)) {\ - if (unlikely(value != (func_type) (target_type) value)) {\ - func_type zero = 0;\ - if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ - return (target_type) -1;\ - if (is_unsigned && unlikely(value < zero))\ - goto raise_neg_overflow;\ - else\ - goto raise_overflow;\ - }\ - }\ - return (target_type) value;\ - } - -/* CIntFromPy */ -static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const long neg_one = (long) -1, const_zero = (long) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { - if (sizeof(long) < sizeof(long)) { - __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (long) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (long) 0; - case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) - case 2: - if (8 * sizeof(long) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { - return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); - } - } - break; - case 3: - if (8 * sizeof(long) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { - return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); - } - } - break; - case 4: - if (8 * sizeof(long) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { - return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); - } - } - break; - } -#endif -#if CYTHON_COMPILING_IN_CPYTHON - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (long) -1; - if (unlikely(result == 1)) - goto raise_neg_overflow; - } -#endif - if (sizeof(long) <= sizeof(unsigned long)) { - __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif - } - } else { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (long) 0; - case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) - case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) - case -2: - if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { - return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case 2: - if (8 * sizeof(long) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { - return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case -3: - if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { - return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case 3: - if (8 * sizeof(long) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { - return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case -4: - if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { - return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case 4: - if (8 * sizeof(long) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { - return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - } -#endif - if (sizeof(long) <= sizeof(long)) { - __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) -#endif - } - } - { -#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) - PyErr_SetString(PyExc_RuntimeError, - "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); -#else - long val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); - #if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } - #endif - if (likely(v)) { - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - int ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); - Py_DECREF(v); - if (likely(!ret)) - return val; - } -#endif - return (long) -1; - } - } else { - long val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (long) -1; - val = __Pyx_PyInt_As_long(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to long"); - return (long) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to long"); - return (long) -1; -} - -/* CIntFromPy */ -static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const int neg_one = (int) -1, const_zero = (int) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { - if (sizeof(int) < sizeof(long)) { - __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (int) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (int) 0; - case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) - case 2: - if (8 * sizeof(int) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { - return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - case 3: - if (8 * sizeof(int) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { - return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - case 4: - if (8 * sizeof(int) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { - return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - } -#endif -#if CYTHON_COMPILING_IN_CPYTHON - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (int) -1; - if (unlikely(result == 1)) - goto raise_neg_overflow; - } -#endif - if (sizeof(int) <= sizeof(unsigned long)) { - __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif - } - } else { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (int) 0; - case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) - case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) - case -2: - if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { - return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 2: - if (8 * sizeof(int) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { - return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case -3: - if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { - return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 3: - if (8 * sizeof(int) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { - return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case -4: - if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { - return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 4: - if (8 * sizeof(int) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { - return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - } -#endif - if (sizeof(int) <= sizeof(long)) { - __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) -#endif - } - } - { -#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) - PyErr_SetString(PyExc_RuntimeError, - "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); -#else - int val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); - #if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } - #endif - if (likely(v)) { - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - int ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); - Py_DECREF(v); - if (likely(!ret)) - return val; - } -#endif - return (int) -1; - } - } else { - int val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (int) -1; - val = __Pyx_PyInt_As_int(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to int"); - return (int) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to int"); - return (int) -1; -} - -/* FastTypeChecks */ -#if CYTHON_COMPILING_IN_CPYTHON -static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { - while (a) { - a = a->tp_base; - if (a == b) - return 1; - } - return b == &PyBaseObject_Type; -} -static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { - PyObject *mro; - if (a == b) return 1; - mro = a->tp_mro; - if (likely(mro)) { - Py_ssize_t i, n; - n = PyTuple_GET_SIZE(mro); - for (i = 0; i < n; i++) { - if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) - return 1; - } - return 0; - } - return __Pyx_InBases(a, b); -} -#if PY_MAJOR_VERSION == 2 -static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { - PyObject *exception, *value, *tb; - int res; - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ErrFetch(&exception, &value, &tb); - res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; - if (unlikely(res == -1)) { - PyErr_WriteUnraisable(err); - res = 0; - } - if (!res) { - res = PyObject_IsSubclass(err, exc_type2); - if (unlikely(res == -1)) { - PyErr_WriteUnraisable(err); - res = 0; - } - } - __Pyx_ErrRestore(exception, value, tb); - return res; -} -#else -static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { - int res = exc_type1 ? __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type1) : 0; - if (!res) { - res = __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); - } - return res; -} -#endif -static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { - Py_ssize_t i, n; - assert(PyExceptionClass_Check(exc_type)); - n = PyTuple_GET_SIZE(tuple); -#if PY_MAJOR_VERSION >= 3 - for (i=0; i<n; i++) { - if (exc_type == PyTuple_GET_ITEM(tuple, i)) return 1; - } -#endif - for (i=0; i<n; i++) { - PyObject *t = PyTuple_GET_ITEM(tuple, i); - #if PY_MAJOR_VERSION < 3 - if (likely(exc_type == t)) return 1; - #endif - if (likely(PyExceptionClass_Check(t))) { - if (__Pyx_inner_PyErr_GivenExceptionMatches2(exc_type, NULL, t)) return 1; - } else { - } - } - return 0; -} -static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject* exc_type) { - if (likely(err == exc_type)) return 1; - if (likely(PyExceptionClass_Check(err))) { - if (likely(PyExceptionClass_Check(exc_type))) { - return __Pyx_inner_PyErr_GivenExceptionMatches2(err, NULL, exc_type); - } else if (likely(PyTuple_Check(exc_type))) { - return __Pyx_PyErr_GivenExceptionMatchesTuple(err, exc_type); - } else { - } - } - return PyErr_GivenExceptionMatches(err, exc_type); -} -static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *exc_type1, PyObject *exc_type2) { - assert(PyExceptionClass_Check(exc_type1)); - assert(PyExceptionClass_Check(exc_type2)); - if (likely(err == exc_type1 || err == exc_type2)) return 1; - if (likely(PyExceptionClass_Check(err))) { - return __Pyx_inner_PyErr_GivenExceptionMatches2(err, exc_type1, exc_type2); - } - return (PyErr_GivenExceptionMatches(err, exc_type1) || PyErr_GivenExceptionMatches(err, exc_type2)); -} -#endif - -/* CheckBinaryVersion */ -static int __Pyx_check_binary_version(void) { - char ctversion[5]; - int same=1, i, found_dot; - const char* rt_from_call = Py_GetVersion(); - PyOS_snprintf(ctversion, 5, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); - found_dot = 0; - for (i = 0; i < 4; i++) { - if (!ctversion[i]) { - same = (rt_from_call[i] < '0' || rt_from_call[i] > '9'); - break; - } - if (rt_from_call[i] != ctversion[i]) { - same = 0; - break; - } - } - if (!same) { - char rtversion[5] = {'\0'}; - char message[200]; - for (i=0; i<4; ++i) { - if (rt_from_call[i] == '.') { - if (found_dot) break; - found_dot = 1; - } else if (rt_from_call[i] < '0' || rt_from_call[i] > '9') { - break; - } - rtversion[i] = rt_from_call[i]; - } - PyOS_snprintf(message, sizeof(message), - "compiletime version %s of module '%.100s' " - "does not match runtime version %s", - ctversion, __Pyx_MODULE_NAME, rtversion); - return PyErr_WarnEx(NULL, message, 1); - } - return 0; -} - -/* InitStrings */ -static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { - while (t->p) { - #if PY_MAJOR_VERSION < 3 - if (t->is_unicode) { - *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); - } else if (t->intern) { - *t->p = PyString_InternFromString(t->s); - } else { - *t->p = PyString_FromStringAndSize(t->s, t->n - 1); - } - #else - if (t->is_unicode | t->is_str) { - if (t->intern) { - *t->p = PyUnicode_InternFromString(t->s); - } else if (t->encoding) { - *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); - } else { - *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); - } - } else { - *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); - } - #endif - if (!*t->p) - return -1; - if (PyObject_Hash(*t->p) == -1) - return -1; - ++t; - } - return 0; -} - -static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { - return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); -} -static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { - Py_ssize_t ignore; - return __Pyx_PyObject_AsStringAndSize(o, &ignore); -} -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT -#if !CYTHON_PEP393_ENABLED -static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { - char* defenc_c; - PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); - if (!defenc) return NULL; - defenc_c = PyBytes_AS_STRING(defenc); -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - { - char* end = defenc_c + PyBytes_GET_SIZE(defenc); - char* c; - for (c = defenc_c; c < end; c++) { - if ((unsigned char) (*c) >= 128) { - PyUnicode_AsASCIIString(o); - return NULL; - } - } - } -#endif - *length = PyBytes_GET_SIZE(defenc); - return defenc_c; -} -#else -static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { - if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - if (likely(PyUnicode_IS_ASCII(o))) { - *length = PyUnicode_GET_LENGTH(o); - return PyUnicode_AsUTF8(o); - } else { - PyUnicode_AsASCIIString(o); - return NULL; - } -#else - return PyUnicode_AsUTF8AndSize(o, length); -#endif -} -#endif -#endif -static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT - if ( -#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - __Pyx_sys_getdefaultencoding_not_ascii && -#endif - PyUnicode_Check(o)) { - return __Pyx_PyUnicode_AsStringAndSize(o, length); - } else -#endif -#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) - if (PyByteArray_Check(o)) { - *length = PyByteArray_GET_SIZE(o); - return PyByteArray_AS_STRING(o); - } else -#endif - { - char* result; - int r = PyBytes_AsStringAndSize(o, &result, length); - if (unlikely(r < 0)) { - return NULL; - } else { - return result; - } - } -} -static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { - int is_true = x == Py_True; - if (is_true | (x == Py_False) | (x == Py_None)) return is_true; - else return PyObject_IsTrue(x); -} -static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { - int retval; - if (unlikely(!x)) return -1; - retval = __Pyx_PyObject_IsTrue(x); - Py_DECREF(x); - return retval; -} -static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { -#if PY_MAJOR_VERSION >= 3 - if (PyLong_Check(result)) { - if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, - "__int__ returned non-int (type %.200s). " - "The ability to return an instance of a strict subclass of int " - "is deprecated, and may be removed in a future version of Python.", - Py_TYPE(result)->tp_name)) { - Py_DECREF(result); - return NULL; - } - return result; - } -#endif - PyErr_Format(PyExc_TypeError, - "__%.4s__ returned non-%.4s (type %.200s)", - type_name, type_name, Py_TYPE(result)->tp_name); - Py_DECREF(result); - return NULL; -} -static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { -#if CYTHON_USE_TYPE_SLOTS - PyNumberMethods *m; -#endif - const char *name = NULL; - PyObject *res = NULL; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x) || PyLong_Check(x))) -#else - if (likely(PyLong_Check(x))) -#endif - return __Pyx_NewRef(x); -#if CYTHON_USE_TYPE_SLOTS - m = Py_TYPE(x)->tp_as_number; - #if PY_MAJOR_VERSION < 3 - if (m && m->nb_int) { - name = "int"; - res = m->nb_int(x); - } - else if (m && m->nb_long) { - name = "long"; - res = m->nb_long(x); - } - #else - if (likely(m && m->nb_int)) { - name = "int"; - res = m->nb_int(x); - } - #endif -#else - if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { - res = PyNumber_Int(x); - } -#endif - if (likely(res)) { -#if PY_MAJOR_VERSION < 3 - if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { -#else - if (unlikely(!PyLong_CheckExact(res))) { -#endif - return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); - } - } - else if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_TypeError, - "an integer is required"); - } - return res; -} -static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { - Py_ssize_t ival; - PyObject *x; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_CheckExact(b))) { - if (sizeof(Py_ssize_t) >= sizeof(long)) - return PyInt_AS_LONG(b); - else - return PyInt_AsSsize_t(b); - } -#endif - if (likely(PyLong_CheckExact(b))) { - #if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)b)->ob_digit; - const Py_ssize_t size = Py_SIZE(b); - if (likely(__Pyx_sst_abs(size) <= 1)) { - ival = likely(size) ? digits[0] : 0; - if (size == -1) ival = -ival; - return ival; - } else { - switch (size) { - case 2: - if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { - return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case -2: - if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { - return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case 3: - if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { - return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case -3: - if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { - return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case 4: - if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { - return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case -4: - if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { - return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - } - } - #endif - return PyLong_AsSsize_t(b); - } - x = PyNumber_Index(b); - if (!x) return -1; - ival = PyInt_AsSsize_t(x); - Py_DECREF(x); - return ival; -} -static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { - if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { - return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); -#if PY_MAJOR_VERSION < 3 - } else if (likely(PyInt_CheckExact(o))) { - return PyInt_AS_LONG(o); -#endif - } else { - Py_ssize_t ival; - PyObject *x; - x = PyNumber_Index(o); - if (!x) return -1; - ival = PyInt_AsLong(x); - Py_DECREF(x); - return ival; - } -} -static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { - return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); -} -static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { - return PyInt_FromSize_t(ival); -} - - -#endif /* Py_PYTHON_H */ diff --git a/setup_cython.py b/setup_cython.py deleted file mode 100644 index e6f31b9..0000000 --- a/setup_cython.py +++ /dev/null @@ -1,9 +0,0 @@ -from setuptools import setup, Extension -from Cython.Build import cythonize - - -setup( - name='Test app', - ext_modules=cythonize("geesedb/index/cython/test.pyx", libraries=["cymem", "spacy"]), - zip_safe=False, -) From acd78aa478b6aff0186669b073690d0a93a2ee07 Mon Sep 17 00:00:00 2001 From: oestebanbajo <oscar.esba@gmail.com> Date: Tue, 22 Nov 2022 16:12:22 +0100 Subject: [PATCH 3/4] code cleanup --- geesedb/index/indexer/indexer.py | 12 +++++++----- geesedb/index/indexer/terms_processor.py | 4 ++-- geesedb/resources/__init__.py | 4 ++-- geesedb/tests/index/test_fulltext_from_csv.py | 4 ++-- geesedb/tests/utils/utils.py | 10 ++++++---- requirements.txt | 9 ++++----- 6 files changed, 23 insertions(+), 20 deletions(-) diff --git a/geesedb/index/indexer/indexer.py b/geesedb/index/indexer/indexer.py index 6f29f3b..2d09f00 100644 --- a/geesedb/index/indexer/indexer.py +++ b/geesedb/index/indexer/indexer.py @@ -63,6 +63,8 @@ def run_indexer(self, file) -> None: sys.stdout.write('\r') sys.stdout.write("Processed documents: %d" % doc_id) sys.stdout.flush() + if doc_id == 1000: + break doc_id += 1 start = time.time() @@ -81,13 +83,13 @@ def run_indexer(self, file) -> None: t5 += time.time() - start if self.arguments['print_times']: - print(f'Running time reading line: {t1} sec') - print(f'Running time processing line: {t2} sec') + print(f'Running time reading line: {t1} sec') + print(f'Running time processing line: {t2} sec') self.processor.print_times() - print(f'Running time updating docs: {t3} sec') + print(f'Running time updating docs: {t3} sec') print(f'Running time updating dictionary and terms_docs: {t4} sec') - print(f'Running time creating and filling DB: {t5} sec') - print(f'Running time: {time.time() - self.init_time} sec') + print(f'Running time creating and filling DB: {t5} sec') + print(f'Running time: {time.time() - self.init_time} sec') @staticmethod def get_arguments(kwargs: Any) -> dict: diff --git a/geesedb/index/indexer/terms_processor.py b/geesedb/index/indexer/terms_processor.py index 8bdfcde..6f00438 100644 --- a/geesedb/index/indexer/terms_processor.py +++ b/geesedb/index/indexer/terms_processor.py @@ -107,9 +107,9 @@ def process_nltk(self, line: str) -> str: return filtered_tokens def print_times(self): - print(' tokenization: %f sec' % self.a) + print(' tokenization: %f sec' % self.a) print(' selecting word for stemming and stop words: %f sec' % self.b) - print(' stemming: %f sec' % self.c) + print(' stemming: %f sec' % self.c) def download_nltk_data(self) -> None: # create path to data diff --git a/geesedb/resources/__init__.py b/geesedb/resources/__init__.py index b501136..35b8b54 100644 --- a/geesedb/resources/__init__.py +++ b/geesedb/resources/__init__.py @@ -1,3 +1,3 @@ -from .topics import get_topics_backgroundlinking, get_topics +from .topics import get_topics_backgroundlinking -__all__ = ['get_topics_backgroundlinking', 'get_topics'] \ No newline at end of file +__all__ = ['get_topics_backgroundlinking'] diff --git a/geesedb/tests/index/test_fulltext_from_csv.py b/geesedb/tests/index/test_fulltext_from_csv.py index bb135f7..a553c3c 100644 --- a/geesedb/tests/index/test_fulltext_from_csv.py +++ b/geesedb/tests/index/test_fulltext_from_csv.py @@ -1,7 +1,7 @@ from os import path -from geesedb.index import FullTextFromCSV -from geesedb.connection import close_connection +from ...index import FullTextFromCSV +from ...connection import close_connection def test_load_csv_example_files() -> None: diff --git a/geesedb/tests/utils/utils.py b/geesedb/tests/utils/utils.py index ead23f2..f5bf0ae 100644 --- a/geesedb/tests/utils/utils.py +++ b/geesedb/tests/utils/utils.py @@ -1,4 +1,3 @@ -from geesedb.index import Indexer from geesedb.search import Searcher import pandas as pd @@ -6,7 +5,7 @@ def get_topics_wp_trec(file_name: str): - # return an array with the topic number and string + # return an array with topic number and string with open(file_name) as topics_file: nums = [] strs = [] @@ -20,6 +19,10 @@ def get_topics_wp_trec(file_name: str): def save_run_file(processor, database: str, topics_file: str, save_loc: str, n: int) -> None: + """ + Create a file with n first retrieved documents using the provided duckDB database and a topics file (id and string) + according to the TREC format. + """ searcher = Searcher(database=database, n=n) nums, strs = get_topics_wp_trec(topics_file) final = {'topic': [], @@ -34,14 +37,13 @@ def save_run_file(processor, database: str, topics_file: str, save_loc: str, n: del rank[0] for top, s in zip(nums, strs): temp = searcher.search_topic(' '.join(processor(s))).to_dict() - print(temp) + #print(temp) final['topic'].extend([top]*n) final['sad'].extend(q) final['id'].extend(temp['collection_id'].values()) final['rank'].extend(rank) final['score'].extend(temp['score'].values()) final['run_tag'].extend(run_tag) - #break df = pd.DataFrame(final) np.savetxt(save_loc, df.values, fmt='%s') diff --git a/requirements.txt b/requirements.txt index a946b8b..886af18 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,11 +1,10 @@ -duckdb~=0.5.0 +duckdb google>=2 protobuf>=3 -numpy~=1.23.2 -pandas~=1.4.4 +numpy +pandas git+git://github.com/informagi/pycypher setuptools~=57.0.0 - nltk~=3.7 Resiliparse~=0.13.5 -syntok~=1.4.4 \ No newline at end of file +syntok~=1.4.4 From f1a9972537be2370203360e82c6cd254490bc07a Mon Sep 17 00:00:00 2001 From: oestebanbajo <oscar.esba@gmail.com> Date: Tue, 31 Jan 2023 15:41:04 +0100 Subject: [PATCH 4/4] added automatic_schema, modified indexer --- README.md | 32 +--- geesedb/index/automatic_schema/__init__.py | 0 geesedb/index/automatic_schema/schema.py | 187 +++++++++++++++++++++ geesedb/index/indexer/doc_readers.py | 14 +- geesedb/index/indexer/indexer.py | 173 ++++++++++--------- geesedb/index/indexer/terms_processor.py | 17 +- geesedb/index/utils.py | 136 +++++++++++++-- geesedb/resources/schema/names.py | 2 + requirements.txt | 1 + setup.py | 3 +- 10 files changed, 432 insertions(+), 133 deletions(-) create mode 100644 geesedb/index/automatic_schema/__init__.py create mode 100644 geesedb/index/automatic_schema/schema.py create mode 100644 geesedb/resources/schema/names.py diff --git a/README.md b/README.md index 79fb290..832380a 100644 --- a/README.md +++ b/README.md @@ -48,27 +48,7 @@ index.load_data() ``` ### JSONL file -Another way to load data into GeeseDB is through a JSONL file. Currently, only documents with the TREC Washington Post Corpus (found [here](https://trec.nist.gov/data/wapost/)) format are supported. Each line in this file is structured like so: -````python -{ - 'id': str, - 'article_url': str, - 'title': str, - 'author': str, - 'published_date': int, - 'contents': [ - { - 'content': str, - 'type': str, - 'subtype': str, - 'mime': str - } - ] -} -```` -Where relevant ``type`` values include ``title`` and ``kicker``, and ``mime`` can either be ``text/html`` or ``text/plain``, depending on the presence of html in ``content``. - -To index a collection of documents: +Another way to load data into GeeseDB is through a JSONL file. To index a collection of documents: ````python from geesedb.index import Indexer @@ -76,12 +56,16 @@ indexer = Indexer( database='/path/to/database', file='/path/to/file' ) -indexer.open_and_run() +indexer.run() ```` +If nothing else is specified, the category of each key will be automatically inferred, which will be used to create the tables. +This can also be inputted manually while defining the ``Indexer`` with the parameter ``schema_dict``, which can take 4 options: +`<id>` (only one can be defined), `<indexable>` for text used on the retrieval phase, `<metadata>` for keys that can have a separate table, or `<other>` if the data in that key is not relevant for retrieval. +Right now the values of the JSONL file should be of numerical type or strings, as strings are not supported yet. -A few options can be chosen such as ``tokenization_method``, which can be set either to ``syntok``, ``nltk`` or any other specified function. The stop words set ``stop_words`` can be initialized with ``nltk``, ``lucene`` or ``None``, in which case only the characters in ``delete_chars`` will be included in the stop word list. The stemmer options are ``porter`` and ``snowball``, and in the case of the last one, the language can be specified in ``language`` from any of the nltk available options. +A few more parameters can be chosen such as ``tokenization_method``, which can be set either to ``syntok``, ``nltk`` or any other specified function. The stop words set ``stop_words`` can be initialized with ``nltk``, ``lucene`` or ``None``, in which case only the characters in ``delete_chars`` will be included in the stop word list. The stemmer options are ``porter`` and ``snowball``, and in the case of the last one, the language can be specified in ``language`` from any of the nltk available options. -From [the nltk documentation](https://www.nltk.org/api/nltk.stem.snowball.html): +From [nltk documentation](https://www.nltk.org/api/nltk.stem.snowball.html): ```python >>> from nltk.stem import SnowballStemmer >>> print(" ".join(SnowballStemmer.languages)) # See which languages are supported diff --git a/geesedb/index/automatic_schema/__init__.py b/geesedb/index/automatic_schema/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/geesedb/index/automatic_schema/schema.py b/geesedb/index/automatic_schema/schema.py new file mode 100644 index 0000000..a09f97f --- /dev/null +++ b/geesedb/index/automatic_schema/schema.py @@ -0,0 +1,187 @@ +from geesedb.resources.schema.names import names +from ..utils import _get_all_values_from_json_key + +import time +import re +import random +import numpy as np +from typing import Dict, List +from dateutil.parser import parse as parse_time, ParserError +from duckdb import DuckDBPyConnection + + +# ---------------------------------------------------------------------------------------------------------------------- +# Infer variable functions +# ---------------------------------------------------------------------------------------------------------------------- + +def infer_time(date_val, unix_now) -> bool: + try: + parse_time(str(date_val)) + return True + except (OverflowError, ParserError, ValueError) as e: + pass + try: + int(date_val) + except (ValueError, TypeError) as e: + return False + if isinstance(date_val, int) and len(str(date_val)) in {10, 13, 16, 19}: + if 0 < date_val < int(str(unix_now)[:len(str(date_val))]): + return True + else: + return False + + +def infer_name(name_val, tokenizer_function, threshold=0.5) -> bool: + # https://github.com/dangayle/first-name-gender/blob/master/names/names.py + tokens = tokenizer_function(name_val) + count = 0 + token_len = 0 + if isinstance(name_val, str): + for word in tokens: + token_len += 1 + if word.value.lower() in names: + count += 1 + else: + return False + if token_len != 0 and count / token_len >= threshold: + return True + else: + return False + + +def infer_ids(ids_list, std_threshold=1, list_rate=0.3) -> int: + """ + 0: not an id + 1: might be str. id + 2: might be increasing int id + 3: might be another kind of id, but less likely + """ + # check if all values are unique + if len(ids_list) != len(set(ids_list)): + return 0 + + # check the length distribution (better if there's little deviation) + lengths = [] + int_type_count = 0 + ids_random_vals = random.sample(ids_list, int(list_rate * len(ids_list))) + for val in ids_random_vals: + lengths.append(len(val[0])) + if isinstance(val[0], int): + int_type_count += 1 + if int_type_count == 0 and np.std( + lengths) <= std_threshold: # look at distribution if it's str + return 1 + elif int_type_count == len(ids_random_vals) and np.max(ids_list) - np.min(ids_list) == len(ids_list) - 1: + return 2 + else: + return 3 + + +def infer_url(url_val) -> (bool, bool): # is_url, is_string + if isinstance(url_val, str): + regex = r"(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([" \ + r"^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\".,<>?«»“”‘’]))" + url = re.findall(regex, url_val) + if len(url) != 0: + return True, True + else: + return False, True + else: + return False, False + + +# ---------------------------------------------------------------------------------------------------------------------- +# Assess if value is important for the schema creation, an ID, or used for search +# ---------------------------------------------------------------------------------------------------------------------- + +def get_true_percentage(dict_list: List, upper_threshold_list=None, lower_threshold_list=None) -> bool: + if upper_threshold_list is None: + upper_threshold_list = [0.8, 0.8, 0.65] + if lower_threshold_list is None: + lower_threshold_list = [0.05, 0.05, 0.05] + assert len(dict_list) == len(upper_threshold_list) == len(lower_threshold_list) + count = 0 + for d, t_up, t_low in zip(dict_list, upper_threshold_list, lower_threshold_list): + perc = d[True] / (d[True] + d[False]) + if perc >= t_up: + return True + elif perc < t_low: # if all have really low percentages, return True to break loop + count += 1 + if count == len(dict_list): + return True + return False + + +def infer_variable(connection: DuckDBPyConnection, dict_keys: List, tokenizer_function, schema_dict=None, + stop_step: int = 1000, max_step: int = 10000) -> Dict: + """ + Calls all above functions for every variable. + + decisions for schema_dict include: <id>, <indexable>, <metadata>, <other> + """ + unix_now = int(time.time_ns()) + decisions = {} + id_present = False + + for key in dict_keys: + if schema_dict is not None and key in schema_dict: + if schema_dict[key] == '<id>': + if id_present: + raise Exception("An ID has already been specified or inferred!") + decisions[key] = schema_dict[key] + id_present = True + elif schema_dict[key] in ['<indexable>', '<metadata>', '<other>']: + decisions[key] = schema_dict[key] + else: + decisions[key] = '<other>' + continue + + val_list = _get_all_values_from_json_key(connection, key) + url_dict = {True: 0, False: 0} + time_dict = {True: 0, False: 0} + names_dict = {True: 0, False: 0} + is_string = {True: 0, False: 0} + for i, val in enumerate(val_list): + val = val[0][1:-1] # delete quotes from reading from table + is_url, is_string_bool = infer_url(val) + url_dict[is_url] += 1 + is_string[is_string_bool] += 1 + time_dict[infer_time(val, unix_now)] += 1 + names_dict[infer_name(val, tokenizer_function)] += 1 + if i != 0 and i % stop_step == 0 and get_true_percentage([url_dict, time_dict, names_dict]): + break + if i == max_step: + break + url_dec = url_dict[True] / (url_dict[True] + url_dict[False]) + if url_dec >= 0.8: + decisions[key] = '<url>' + continue + + time_dec = time_dict[True] / (time_dict[True] + time_dict[False]) + if time_dec >= 0.8: + decisions[key] = '<other>' + continue + + names_dec = names_dict[True] / (names_dict[True] + names_dict[False]) + if names_dec >= 0.65: + decisions[key] = '<metadata>' + continue + + ids_int = infer_ids(val_list) + if ids_int in [1, 2] and not id_present: + id_present = True + decisions[key] = '<doc_id>' + continue + elif ids_int == 3: + decisions[key] = '<other>' + continue + + is_string_dec = is_string[True] / (is_string[True] + is_string[False]) + if is_string_dec >= 0.95: # not 100 adjusting for potential errors + decisions[key] = '<indexable>' + else: + decisions[key] = '<other>' + + print('Final variable decisions:') + print(decisions) + return decisions diff --git a/geesedb/index/indexer/doc_readers.py b/geesedb/index/indexer/doc_readers.py index 358cea8..d7dcc45 100644 --- a/geesedb/index/indexer/doc_readers.py +++ b/geesedb/index/indexer/doc_readers.py @@ -1,6 +1,9 @@ from resiliparse.parse.html import HTMLTree from resiliparse.extract.html2text import extract_plain_text +from typing import Dict +import pandas as pd + doc_general = {'collection_id': None, 'doc_id': None, 'title': '', @@ -21,7 +24,7 @@ def read_from_WaPo_json(line: {}, doc_id: int, include_links: bool) -> doc_gener # 'authors': [author for author in line['author'].split(',')] text = '' if 'contents' in line: - for dict_ in line['contents']: #types: kicker, title, image (fullcaption), byline, sanitized_html + for dict_ in line['contents']: # types: kicker, title, image (fullcaption), byline, sanitized_html if (dict_ is not None) and ('content' in dict_) and ('type' in dict_): if dict_['type'] == 'kicker' or dict_['type'] == 'title' or \ (dict_['type'] == 'sanitized_html' and dict_['mime'] == 'text/plain'): @@ -41,3 +44,12 @@ def read_from_WaPo_json(line: {}, doc_id: int, include_links: bool) -> doc_gener # d['others'] = line[k] return d + + +def read_raw_json(file_path: str, n_rows: int = 20000) -> Dict: + return pd.read_json(file_path, lines=True, nrows=n_rows).to_dict(orient='list') + + +def read_raw_CSV(file_path: str, sep: str = ',', n_rows: int = 20000) -> Dict: + # sep='\t' for tab separated file + return pd.read_csv(file_path, sep=sep, n_rows=n_rows).to_dict(orient='list') diff --git a/geesedb/index/indexer/indexer.py b/geesedb/index/indexer/indexer.py index 2d09f00..2a05515 100644 --- a/geesedb/index/indexer/indexer.py +++ b/geesedb/index/indexer/indexer.py @@ -1,114 +1,138 @@ -from ..utils import _create_and_fill_empty_table_with_pd +from ..utils import _create_and_fill_metadata_table, _read_json_file, _get_indexable_line, _alter_docs_table, \ + _update_mem_terms_table, _create_final_tables, _create_main_tables from ...connection import get_connection -from ..indexer.doc_readers import read_from_WaPo_json from ..indexer.terms_processor import TermsProcessor +from ..automatic_schema.schema import infer_variable -import os -import pandas as pd import json +import os import pathlib import time import sys -from collections import Counter from typing import Any +import numpy as np +import pandas as pd class Indexer: """ Reads, processes and introduces documents of JSONL format in GeeseDB. """ - def __init__(self, **kwargs: Any) -> None: self.arguments = self.get_arguments(kwargs) - self.read = read_from_WaPo_json - self.line = {} - self.db_docs = {self.arguments['columns_names_docs'][0]: [], - self.arguments['columns_names_docs'][1]: [], - self.arguments['columns_names_docs'][2]: []} - self.db_terms = {} - self.db_terms_docs = {self.arguments['columns_names_term_doc'][0]: [], - self.arguments['columns_names_term_doc'][1]: [], - self.arguments['columns_names_term_doc'][2]: []} + if self.arguments['use_existing_db'] and os.path.isfile(self.arguments['database']) or \ + not self.arguments['use_existing_db'] and not os.path.isfile(self.arguments['database']): + pass + elif not self.arguments['use_existing_db']: + raise IOError('There already exist a file on this path.') db_connection = get_connection(self.arguments['database']) self.connection = db_connection.connection self.processor = TermsProcessor(self.arguments) + self.schema = None self.init_time = 0 - def open_and_run(self) -> None: - self.init_time = time.time() - if pathlib.Path(self.arguments['file']).suffix == '.jl': - with open(self.arguments['file'], encoding=self.arguments['encoding']) as file: - self.run_indexer(file) - else: + def run(self) -> None: + if pathlib.Path(self.arguments['file']).suffix not in ['.jl', '.json']: raise IOError('Please provide a valid file') - def run_indexer(self, file) -> None: - t1 = t2 = t3 = t4 = t5 = doc_id = 0 + t0 = t1 = t2 = t3 = t4 = t5 = 0 + self.init_time = time.time() - for line in file: - self.line = json.loads(line) - start = time.time() - self.line = self.read(self.line, doc_id, self.arguments['include_html_links']) - t1 += time.time() - start - start = time.time() - self.line['content'] = self.processor.process(self.line['content']) - t2 += time.time() - start + doc_rows, raw_dict_line = _read_json_file(self.connection, self.arguments['file']) + self.schema = infer_variable(self.connection, json.loads(raw_dict_line).keys(), + self.processor.tokenizer_function) \ + if (self.arguments['infer_schema'] or self.arguments['schema_dict'] is not None) else None + t0 += time.time() - self.init_time + + if self.schema is None: + raise Exception('Please provide a valid schema or toggle the automatic schema infer parameter on') + collection_id_field_name = None + for k in self.schema.keys(): + if self.schema[k] == '<doc_id>': + collection_id_field_name = k + break + + # create all tables + _create_main_tables(self.connection, collection_id_field_name, doc_rows) + indexable_column_names = "(" + for k in self.schema.keys(): + if self.schema[k] == '<metadata>': + _create_and_fill_metadata_table(self.connection, k) + elif self.schema[k] == '<indexable>': + indexable_column_names += f"json_object.json->>'{k}', ' ', " + if indexable_column_names == "(": + raise IOError("This database does not contain any indexable text or it has not been specified.") + indexable_column_names = indexable_column_names[:-2] + ")" + + doc_id = 1 # starts at 1 because of how it's created in SQL + for i in range(int(np.ceil(doc_rows/self.arguments['batch_size']))): + s = time.time() + lines_list = _get_indexable_line(self.connection, indexable_column_names, self.arguments['batch_size'], i) + t1 += time.time() - s + processed_lines = {'doc_id': [], 'len': [], 'tokens': []} + + for line in lines_list: + # process line, save in memory + start = time.time() + tokens, tokens_str = self.processor.process(line[0]) + tokens_str = tokens_str[:-4] + tokens_str = tokens_str.replace('%doc_id', str(doc_id)) + t2 += time.time() - start + processed_lines['tokens'].append(tokens_str) + processed_lines['doc_id'].append(doc_id) + processed_lines['len'].append(len(tokens)) + + if doc_id % 1000 == 0: + sys.stdout.write('\r') + sys.stdout.write(f"Processed documents: {doc_id}/{doc_rows} " + f"({np.round(doc_id * 100 / doc_rows, 2)}%) " + f"Overall avg. speed: {np.round(doc_id / (time.time() - self.init_time), 2)} " + f"docs/sec") + sys.stdout.flush() + if doc_id == doc_rows: + sys.stdout.write('\r') + + doc_id += 1 + + # update docs and term_docs + df = pd.DataFrame.from_dict(processed_lines) start = time.time() - self.update_docs_file(doc_id) + _alter_docs_table(self.connection, df) t3 += time.time() - start start = time.time() - self.update_terms_termsdocs_file() + _update_mem_terms_table(self.connection, ', '.join(processed_lines['tokens'])) t4 += time.time() - start - if doc_id % 100 == 0: - sys.stdout.write('\r') - sys.stdout.write("Processed documents: %d" % doc_id) - sys.stdout.flush() - if doc_id == 1000: - break - doc_id += 1 start = time.time() - df_docs = pd.DataFrame.from_dict(self.db_docs) - new_db_terms = {self.arguments['columns_names_term_dict'][0]: [], - self.arguments['columns_names_term_dict'][1]: [], - self.arguments['columns_names_term_dict'][2]: []} - for item in self.db_terms.items(): - new_db_terms['string'].append(item[0]) - new_db_terms['term_id'].append(item[1][0]) - new_db_terms['df'].append(item[1][1]) - df_terms = pd.DataFrame.from_dict(new_db_terms) - df_terms_docs = pd.DataFrame.from_dict(self.db_terms_docs) - - self.create_and_fill_tables([df_docs, df_terms, df_terms_docs]) + _create_final_tables(self.connection) t5 += time.time() - start if self.arguments['print_times']: + print(f'Running time schema infer: {t0} sec') print(f'Running time reading line: {t1} sec') print(f'Running time processing line: {t2} sec') self.processor.print_times() print(f'Running time updating docs: {t3} sec') print(f'Running time updating dictionary and terms_docs: {t4} sec') - print(f'Running time creating and filling DB: {t5} sec') + print(f'Running time filling final tables: {t5} sec') print(f'Running time: {time.time() - self.init_time} sec') @staticmethod def get_arguments(kwargs: Any) -> dict: arguments = { 'database': None, - #'use_existing_db': False, - #'use_existing_tables': False, - 'create_nltk_data': True, - 'print_times': True, + 'infer_schema': True, + 'schema_dict': None, + 'use_existing_db': False, + 'create_nltk_data': False, + 'print_times': False, 'include_html_links': False, 'tokenization_method': 'syntok', 'stop_words': 'lucene', 'stemmer': 'porter', - 'table_names': ['docs', 'term_dict', 'term_doc'], - 'columns_names_docs': ['collection_id', 'doc_id', 'len'], - 'columns_names_term_dict': ['term_id', 'string', 'df'], - 'columns_names_term_doc': ['term_id', 'doc_id', 'tf'], + 'batch_size': 1000, 'file': 'docs.jl', - 'nltk_path': os.path.dirname(os.path.dirname(os.path.dirname(__file__))) + '\\resources\\nltk_data', + 'nltk_path': os.path.dirname(os.path.dirname(os.path.dirname(__file__))) + r'\resources\nltk_data', 'language': 'english', 'encoding': 'utf-8', 'delimiter': '|', @@ -121,28 +145,3 @@ def get_arguments(kwargs: Any) -> dict: if arguments['database'] is None: raise IOError('database path needs to be provided') return arguments - - def create_and_fill_tables(self, dataframe_list: []) -> None: - self.connection.begin() - for table_name, pd_df in zip(self.arguments['table_names'], dataframe_list): - _create_and_fill_empty_table_with_pd(self.connection, table_name, pd_df) - self.connection.commit() - - def update_docs_file(self, doc_id: int) -> None: # input a line, update csv - self.db_docs['collection_id'].append(self.line['collection_id']) - self.db_docs['doc_id'].append(doc_id) - self.db_docs['len'].append(len(self.line['content'])) - - def update_terms_termsdocs_file(self) -> None: - temp_words = Counter(self.line['content']).keys() # unique elements - temp_vals = Counter(self.line['content']).values() # counts the elements' frequency - for w, t in zip(temp_words, temp_vals): - if w not in self.db_terms.keys(): - i = len(self.db_terms) - self.db_terms[w] = [i, 1] # term_id, df - self.db_terms_docs['term_id'].append(i) - else: # find word and update df (once per doc) - self.db_terms[w][1] += 1 - self.db_terms_docs['term_id'].append(self.db_terms[w][0]) # find term id of word w - self.db_terms_docs['doc_id'].append(self.line['doc_id']) - self.db_terms_docs['tf'].append(t) diff --git a/geesedb/index/indexer/terms_processor.py b/geesedb/index/indexer/terms_processor.py index 6f00438..4346d16 100644 --- a/geesedb/index/indexer/terms_processor.py +++ b/geesedb/index/indexer/terms_processor.py @@ -1,6 +1,5 @@ import os import types - import nltk.data import time from nltk.corpus import stopwords @@ -12,8 +11,7 @@ class TermsProcessor: """ - Performs stemming and stop words. - Uses nltk by default with the process method. + Performs tokenization and stemming avoiding stop words. Inputs the whole document as a string. """ def __init__(self, arguments): @@ -66,8 +64,9 @@ def __init__(self, arguments): self.stemmed_tokens = {} self.a = self.b = self.c = 0 - def process_syntok(self, line: str) -> str: + def process_syntok(self, line: str): filtered_tokens = [] + filtered_tokens_str = "(" s = time.time() for token in self.tokenizer_function(line): self.a += time.time() - s @@ -80,15 +79,13 @@ def process_syntok(self, line: str) -> str: self.c += time.time() - s self.stemmed_tokens[token.value] = tok filtered_tokens.append(tok) + filtered_tokens_str += "'" + tok.replace("'", "''") + "', %doc_id) , (" else: filtered_tokens.append(self.stemmed_tokens[token.value]) - # elif self.tokenization_method == 'simple': - # word_tokens = line.split() - # filtered_tokens = [self.stemmer.stem(w.strip(self.delete_chars_str)) - # for w in word_tokens if not w.lower().strip(self.delete_chars_str) in self.stop_words] - return filtered_tokens + filtered_tokens_str += "'" + self.stemmed_tokens[token.value].replace("'", "''") + "', %doc_id) , (" + return filtered_tokens, filtered_tokens_str - def process_nltk(self, line: str) -> str: + def process_nltk(self, line: str) -> []: filtered_tokens = [] s = time.time() for token in self.tokenizer_function(line): diff --git a/geesedb/index/utils.py b/geesedb/index/utils.py index 8cb5919..86a1895 100644 --- a/geesedb/index/utils.py +++ b/geesedb/index/utils.py @@ -1,18 +1,18 @@ +import numpy as np from typing import List -from duckdb import DuckDBPyConnection +from duckdb import DuckDBPyConnection, CatalogException def _create_table(connection: DuckDBPyConnection, table_name: str, column_names: List[str], column_types: List[str]) -> None: cursor = connection.cursor() - # try: - # cursor.execute(f'SELECT * FROM {table_name} LIMIT 1;') - # connection.rollback() - # raise IOError('Table already exists.') - # except RuntimeError or IOError or CatalogException: - # pass - # query = f'CREATE TABLE {table_name} ({", ".join([f"{a} {b}" for a, b in zip(column_names, column_types)])});' - query = f'CREATE TABLE IF NOT EXISTS {table_name} ({", ".join([f"{a} {b}" for a, b in zip(column_names, column_types)])});' + try: + cursor.execute(f'SELECT * FROM {table_name} LIMIT 1;') + connection.rollback() + raise IOError('Table already exists.') + except RuntimeError or IOError or CatalogException: + pass + query = f'CREATE TABLE {table_name} ({", ".join([f"{a} {b}" for a, b in zip(column_names, column_types)])});' cursor.execute(query) @@ -30,6 +30,122 @@ def _fill_empty_table_with_csv(connection: DuckDBPyConnection, table_name: str, def _create_and_fill_empty_table_with_pd(connection: DuckDBPyConnection, table_name: str, pd_dataframe) -> None: cursor = connection.cursor() - cursor.execute(f'DROP TABLE IF EXISTS {table_name};') + cursor.execute(f"DROP TABLE IF EXISTS {table_name};") cursor.register(table_name, pd_dataframe) cursor.execute(f"CREATE TABLE {table_name} AS SELECT * FROM {table_name};") + + +def _create_and_fill_metadata_table(connection: DuckDBPyConnection, table_name: str) -> None: + cursor = connection.cursor() + + # create metadata table and insert distinct values + cursor.execute(f'DROP TABLE IF EXISTS {table_name}_table;') + cursor.execute("DROP SEQUENCE IF EXISTS seq_met_id;") + cursor.execute("CREATE SEQUENCE seq_met_id START 1;") + cursor.execute(f"CREATE TABLE {table_name}_table AS " + f"SELECT nextval('seq_met_id') AS '{table_name}_id', a.* " + f"FROM(" + f"SELECT DISTINCT json_object.json->>'{table_name}' AS 'str' " + "FROM json_object) a;") + cursor.execute("DROP SEQUENCE seq_met_id;") + + # update docs table with new id + cursor.execute("ALTER TABLE docs " + f"ADD COLUMN {table_name}_id INT;") + cursor.execute(f"UPDATE docs " + f"SET {table_name}_id = a.{table_name}_id " + f"FROM(" + f"SELECT m.{table_name}_id as '{table_name}_id', j.doc_id as 'doc_id' " + f"FROM (select doc_id, json->>'{table_name}' as {table_name} from json_object) j " + f"INNER JOIN {table_name}_table m ON m.str = j.{table_name}) a " + f"WHERE docs.doc_id = a.doc_id;") + + +def _read_json_file(connection: DuckDBPyConnection, file_path: str) -> (int, {}): + cursor = connection.cursor() + cursor.install_extension('json') + cursor.load_extension('json') + + cursor.execute("DROP TABLE IF EXISTS mem_terms_table;") + cursor.execute("CREATE TABLE mem_terms_table (str VARCHAR, doc_id INT);") + cursor.execute("DROP SEQUENCE IF EXISTS seq_doc_id;") + cursor.execute("CREATE SEQUENCE seq_doc_id START 1;") + cursor.execute("DROP TABLE IF EXISTS json_object;") + cursor.execute(f"CREATE TABLE json_object AS " + f"SELECT nextval('seq_doc_id') as 'doc_id', j.* FROM read_ndjson_objects('{file_path}') j;") + cursor.execute("DROP SEQUENCE seq_doc_id;") + + cursor.execute(f"SELECT COUNT(*) FROM json_object;") + doc_rows = cursor.fetchone() + + cursor.execute(f"SELECT * FROM read_ndjson_objects('{file_path}');") + raw_dict_line = cursor.fetchone() + + return doc_rows[0], raw_dict_line[0] + + +def _create_main_tables(connection: DuckDBPyConnection, doc_rows: int, collection_id_field_name=None) -> None: + cursor = connection.cursor() + + cursor.execute("DROP SEQUENCE IF EXISTS seq_doc_id;") + cursor.execute("CREATE SEQUENCE seq_doc_id START 1;") + cursor.execute("DROP TABLE IF EXISTS docs;") + cursor.execute("CREATE TABLE docs (collection_id VARCHAR, doc_id INT, len INT);") + if collection_id_field_name is not None: + cursor.execute("INSERT INTO docs (collection_id, doc_id)" + f"SELECT j.json->>'{collection_id_field_name}', j.doc_id " + "FROM json_object j;") + else: + inserts = '(' + '), ('.join(map(str, np.arange(1, doc_rows+1))) + ')' + cursor.execute(f"INSERT INTO docs (doc_id) VALUES {inserts};") + cursor.execute("DROP SEQUENCE seq_doc_id;") + + cursor.execute('DROP TABLE IF EXISTS term_dict;') + cursor.execute("CREATE TABLE term_dict (term_id INT not null, str VARCHAR, df INT, PRIMARY KEY (term_id));") + + cursor.execute("DROP SEQUENCE IF EXISTS seq_term_id;") + cursor.execute("CREATE SEQUENCE seq_term_id START 1;") + cursor.execute('DROP TABLE IF EXISTS term_doc;') + cursor.execute("CREATE TABLE term_doc (term_id INT, doc_id INT, tf INT);") + + +def _get_indexable_line(connection: DuckDBPyConnection, indexable_column_names: str, batch_size: int, i: int) -> []: + cursor = connection.cursor() + cursor.execute(f"SELECT CONCAT {indexable_column_names} FROM json_object LIMIT {batch_size} OFFSET {i*batch_size};") + return cursor.fetchall() + + +def _alter_docs_table(connection: DuckDBPyConnection, df) -> None: + cursor = connection.cursor() + cursor.execute("UPDATE docs d " + "SET len = df.len " + "FROM df " + "WHERE d.doc_id = df.doc_id;") + + +def _update_mem_terms_table(connection: DuckDBPyConnection, query: str) -> None: + cursor = connection.cursor() + cursor.execute(f"INSERT INTO mem_terms_table (str, doc_id) VALUES {query};") + # val = [[word, doc_id] for word in words_list] + # cursor.executemany("INSERT INTO mem_terms_table (str, doc_id) VALUES (?, ?)", val) + + +def _create_final_tables(connection: DuckDBPyConnection) -> None: + cursor = connection.cursor() + cursor.execute("INSERT INTO term_dict " + "SELECT nextval('seq_term_id'), m.str, COUNT(*) AS 'df' " + "FROM mem_terms_table m " + "GROUP BY str;") + cursor.execute("INSERT INTO term_doc(term_id, doc_id, tf) " + "SELECT t.term_id, m.doc_id, COUNT(*) " + "FROM mem_terms_table m " + "JOIN term_dict t ON m.str = t.str " + "GROUP BY t.term_id, m.doc_id;") + cursor.execute("DROP TABLE mem_terms_table;") + cursor.execute("DROP TABLE json_object;") + + +def _get_all_values_from_json_key(connection: DuckDBPyConnection, key_name: str) -> []: + cursor = connection.cursor() + cursor.execute(f"SELECT json->'$.{key_name}' FROM json_object;") + return cursor.fetchall() diff --git a/geesedb/resources/schema/names.py b/geesedb/resources/schema/names.py new file mode 100644 index 0000000..644f72a --- /dev/null +++ b/geesedb/resources/schema/names.py @@ -0,0 +1,2 @@ +# from https://github.com/dangayle/first-name-gender +names = {'fawn': 'Female', 'ethelda': 'Female', 'evalyn': 'Female', 'chieko': 'Female', 'sonja': 'Female', 'elvina': 'Female', 'woods': 'Male', 'suzann': 'Female', 'gavan': 'Male', 'francesco': 'Male', 'elva': 'Female', 'francesca': 'Female', 'gabriella': 'Female', 'gabrielle': 'Female', 'cherrie': 'Female', 'lenci': 'Female', 'kione': 'Neutral', 'karlee': 'Female', 'wenona': 'Female', 'kiona': 'Female', 'aileen': 'Female', 'melosa': 'Female', 'lori': 'Female', 'lore': 'Female', 'lora': 'Female', 'karley': 'Female', 'jackelyn': 'Female', 'callie': 'Female', 'callia': 'Female', 'dell': 'Female', 'delu': 'Female', 'lachelle': 'Female', 'oceana': 'Female', 'yulissa': 'Female', 'satchel': 'Male', 'okalik': 'Neutral', 'altagracia': 'Female', 'errol': 'Male', 'marquitta': 'Female', 'jennyfer': 'Female', 'caryl': 'Female', 'caryn': 'Female', 'rusti': 'Neutral', 'kuron': 'Neutral', 'miller': 'Neutral', 'eleanora': 'Female', 'eleanore': 'Female', 'rusty': 'Neutral', 'cary': 'Neutral', 'valiant': 'Neutral', 'jihan': 'Male', 'melvin': 'Neutral', 'roddy': 'Male', 'pooky': 'Neutral', 'naida': 'Female', 'karsyn': 'Female', 'corrinne': 'Female', 'herb': 'Male', 'hera': 'Female', 'eunice': 'Female', 'jasmine': 'Female', 'camren': 'Male', 'dore': 'Female', 'ching': 'Female', 'china': 'Female', 'averi': 'Female', 'lory': 'Female', 'emmerson': 'Neutral', 'aleen': 'Female', 'mahalah': 'Female', 'karis': 'Female', 'yoshino': 'Female', 'barak': 'Male', 'lashawn': 'Female', 'karik': 'Male', 'karim': 'Male', 'karin': 'Female', 'karie': 'Female', 'karif': 'Male', 'golden': 'Female', 'cindie': 'Female', 'lynna': 'Female', 'cholena': 'Female', 'maisie': 'Female', 'lynne': 'Female', 'hamal': 'Male', 'dortha': 'Female', 'mirtha': 'Female', 'loman': 'Neutral', 'bayo': 'Male', 'doretta': 'Female', 'keara': 'Female', 'vanesa': 'Female', 'avongara': 'Female', 'owen': 'Male', 'taneka': 'Female', 'leesa': 'Female', 'lynetta': 'Female', 'holt': 'Male', 'majorie': 'Female', 'nariko': 'Female', 'louetta': 'Female', 'taisha': 'Female', 'isidore': 'Neutral', 'blade': 'Male', 'makenzie': 'Female', 'janene': 'Female', 'addyson': 'Female', 'maximilian': 'Male', 'gershom': 'Male', 'matilde': 'Female', 'matilda': 'Neutral', 'melony': 'Female', 'julissa': 'Female', 'yaritza': 'Female', 'neema': 'Female', 'phaedra': 'Female', 'kraig': 'Male', 'merissa': 'Female', 'damarcus': 'Male', 'hoa': 'Female', 'dimple': 'Female', 'yuk': 'Male', 'archibald': 'Male', 'amiya': 'Female', 'granville': 'Male', 'dannon': 'Male', 'caroun': 'Female', 'audi': 'Female', 'ronnie': 'Neutral', 'cadence': 'Neutral', 'barbra': 'Female', 'flossie': 'Female', 'destiney': 'Female', 'telma': 'Female', 'alline': 'Female', 'seda': 'Female', 'revelin': 'Male', 'destinee': 'Female', 'carolynn': 'Female', 'glenna': 'Female', 'vance': 'Male', 'rosalinda': 'Female', 'merlene': 'Female', 'nasya': 'Female', 'carolyne': 'Female', 'cheri': 'Female', 'sylvain': 'Neutral', 'anoki': 'Male', 'miliani': 'Female', 'chery': 'Female', 'jordy': 'Neutral', 'virgen': 'Female', 'mabel': 'Female', 'vidor': 'Male', 'lorine': 'Female', 'loring': 'Neutral', 'lorina': 'Female', 'aedan': 'Male', 'sarama': 'Female', 'uriah': 'Male', 'tawanda': 'Female', 'conner': 'Male', 'menachem': 'Male', 'enrico': 'Male', 'erlene': 'Female', 'sarita': 'Female', 'silver': 'Male', 'yasmine': 'Female', 'lillian': 'Female', 'lilliam': 'Female', 'barton': 'Male', 'lucero': 'Female', 'arron': 'Male', 'zarina': 'Female', 'andrew': 'Male', 'ingrid': 'Female', 'deshaun': 'Male', 'luann': 'Female', 'luana': 'Female', 'allan': 'Male', 'thelma': 'Female', 'yahaira': 'Female', 'truman': 'Male', 'arielle': 'Female', 'melida': 'Female', 'haben': 'Male', 'mayan': 'Neutral', 'mairead': 'Female', 'mason': 'Neutral', 'villette': 'Female', 'xolani': 'Female', 'abbott': 'Male', 'clarence': 'Male', 'pamelia': 'Female', 'kayla': 'Female', 'jennie': 'Female', 'justyn': 'Male', 'kayli': 'Female', 'stacy': 'Neutral', 'dorinda': 'Female', 'birdie': 'Female', 'makala': 'Female', 'lucina': 'Female', 'lucine': 'Female', 'woody': 'Male', 'nallely': 'Female', 'cheryle': 'Female', 'feoras': 'Male', 'tristin': 'Male', 'cheryll': 'Female', 'tacita': 'Female', 'clarita': 'Female', 'angelic': 'Female', 'angelia': 'Female', 'elmo': 'Male', 'kelda': 'Female', 'elma': 'Female', 'dione': 'Female', 'sandro': 'Male', 'kele': 'Male', 'kayleen': 'Female', 'langston': 'Male', 'roni': 'Female', 'forrester': 'Male', 'rona': 'Female', 'yuliana': 'Female', 'reuben': 'Male', 'cyma': 'Female', 'gilbert': 'Male', 'cael': 'Male', 'glyn': 'Neutral', 'genesis': 'Neutral', 'caitlyn': 'Female', 'geneva': 'Female', 'lucienne': 'Female', 'atalanta': 'Female', 'tamekia': 'Female', 'devan': 'Neutral', 'lavera': 'Female', 'asnee': 'Male', 'carrick': 'Male', 'yenge': 'Neutral', 'ahmed': 'Male', 'pamula': 'Female', 'trey': 'Male', 'zechariah': 'Male', 'matana': 'Female', 'esta': 'Female', 'monserrate': 'Female', 'ilene': 'Female', 'brycen': 'Male', 'shyla': 'Female', 'melaine': 'Female', 'sharita': 'Female', 'kayo': 'Male', 'corbin': 'Male', 'naiya': 'Female', 'kaye': 'Female', 'rudolph': 'Male', 'kaya': 'Female', 'annissa': 'Female', 'amaryllis': 'Female', 'naolin': 'Neutral', 'carolena': 'Female', 'shaniqua': 'Female', 'kinipela': 'Female', 'susie': 'Female', 'shala': 'Female', 'victoria': 'Female', 'gallagher': 'Male', 'leona': 'Female', 'etana': 'Female', 'karri': 'Female', 'plennie': 'Neutral', 'stephnie': 'Female', 'leighanna': 'Female', 'karry': 'Female', 'cami': 'Female', 'armelle': 'Female', 'arlo': 'Male', 'arla': 'Female', 'nerissa': 'Female', 'edeline': 'Female', 'marvel': 'Neutral', 'aran': 'Male', 'franklyn': 'Male', 'terese': 'Female', 'tequila': 'Female', 'teresa': 'Neutral', 'bonnie': 'Female', 'gauge': 'Male', 'keesha': 'Female', 'deedee': 'Female', 'jaylon': 'Male', 'orleans': 'Neutral', 'louisa': 'Female', 'louise': 'Neutral', 'haleigh': 'Female', 'shannan': 'Neutral', 'rico': 'Male', 'karston': 'Male', 'bliss': 'Female', 'rick': 'Male', 'rich': 'Male', 'wonda': 'Female', 'ruggiero': 'Male', 'rylie': 'Neutral', 'jermaine': 'Male', 'mulan': 'Female', 'nelida': 'Female', 'heavynne': 'Female', 'plato': 'Male', 'sheyla': 'Female', 'dorris': 'Female', 'danniell': 'Male', 'randal': 'Male', 'paniga': 'Female', 'asis': 'Female', 'thaddeus': 'Male', 'patch': 'Male', 'jospeh': 'Male', 'cybil': 'Female', 'tavian': 'Male', 'isreal': 'Male', 'lizina': 'Female', 'saul': 'Male', 'bikita': 'Female', 'tasia': 'Female', 'cleo': 'Neutral', 'delores': 'Female', 'bess': 'Female', 'clea': 'Female', 'debbra': 'Female', 'jabari': 'Male', 'delpha': 'Female', 'eudora': 'Female', 'gaynelle': 'Female', 'ringo': 'Male', 'collette': 'Female', 'keisha': 'Female', 'melissa': 'Female', 'louanna': 'Female', 'ira': 'Male', 'lamar': 'Male', 'debi': 'Female', 'nature': 'Neutral', 'dory': 'Female', 'gwyn': 'Female', 'misael': 'Male', 'weylin': 'Male', 'oki': 'Female', 'jeramiah': 'Male', 'dalvin': 'Male', 'argus': 'Male', 'edgar': 'Male', 'shawnda': 'Female', 'maurizio': 'Male', 'normandy': 'Female', 'jarrod': 'Male', 'darian': 'Neutral', 'vail': 'Neutral', 'matty': 'Neutral', 'canyon': 'Male', 'felicidad': 'Female', 'taren': 'Female', 'matti': 'Neutral', 'cailyn': 'Female', 'parley': 'Neutral', 'dori': 'Female', 'lycoris': 'Female', 'zackery': 'Male', 'wyman': 'Male', 'haylie': 'Female', 'konane': 'Neutral', 'michele': 'Female', 'davu': 'Male', 'ariane': 'Female', 'luther': 'Male', 'ariana': 'Female', 'dave': 'Male', 'evelina': 'Female', 'iesha': 'Female', 'eveline': 'Female', 'noland': 'Neutral', 'winifred': 'Female', 'huey': 'Male', 'nerina': 'Female', 'zalman': 'Male', 'lashaun': 'Female', 'milagros': 'Female', 'mitsu': 'Neutral', 'kalila': 'Female', 'elicia': 'Female', 'uday': 'Male', 'elmira': 'Female', 'gaylord': 'Male', 'aydin': 'Male', 'mirabelle': 'Female', 'keegan': 'Male', 'madonna': 'Female', 'oistin': 'Neutral', 'hong': 'Neutral', 'omarion': 'Male', 'eldridge': 'Male', 'adamaris': 'Female', 'harmony': 'Female', 'elliott': 'Male', 'jama': 'Female', 'fairly': 'Neutral', 'kinsley': 'Female', 'issac': 'Male', 'vivien': 'Neutral', 'josef': 'Male', 'anneke': 'Female', 'dorene': 'Female', 'saidi': 'Neutral', 'issay': 'Male', 'lucas': 'Neutral', 'bonny': 'Female', 'maximo': 'Male', 'loughlin': 'Neutral', 'zakary': 'Male', 'maxime': 'Female', 'maxima': 'Female', 'tasida': 'Female', 'tilda': 'Female', 'jalyn': 'Female', 'sheena': 'Female', 'natalee': 'Female', 'tadelesh': 'Male', 'hai': 'Male', 'hal': 'Male', 'ham': 'Male', 'han': 'Female', 'hao': 'Female', 'hae': 'Female', 'wanetta': 'Female', 'aldona': 'Female', 'elanor': 'Female', 'lanie': 'Female', 'manfred': 'Neutral', 'gennie': 'Female', 'dorthy': 'Female', 'torrance': 'Male', 'keeley': 'Female', 'genaro': 'Male', 'laronda': 'Female', 'dagan': 'Neutral', 'smedley': 'Male', 'jenelle': 'Female', 'guinevere': 'Female', 'istas': 'Female', 'unique': 'Female', 'jadyn': 'Neutral', 'desire': 'Female', 'bobby': 'Neutral', 'alica': 'Female', 'alice': 'Female', 'berne': 'Neutral', 'gwendolyn': 'Female', 'bobbi': 'Neutral', 'sebastian': 'Male', 'ardith': 'Female', 'ola': 'Female', 'aarav': 'Male', 'trudie': 'Female', 'devorah': 'Female', 'dorian': 'Neutral', 'flavian': 'Male', 'rheba': 'Female', 'aspen': 'Neutral', 'adamma': 'Female', 'jorja': 'Female', 'myung': 'Female', 'foy': 'Male', 'theresia': 'Female', 'cira': 'Female', 'uma': 'Female', 'natisha': 'Female', 'roslyn': 'Female', 'kadyn': 'Male', 'umi': 'Neutral', 'ciro': 'Male', 'janita': 'Female', 'soffia': 'Female', 'kamella': 'Female', 'nevaeh': 'Female', 'francene': 'Female', 'rhona': 'Female', 'collen': 'Female', 'yoko': 'Female', 'filipina': 'Female', 'emilio': 'Male', 'emilia': 'Female', 'vilma': 'Female', 'corrine': 'Female', 'emilie': 'Female', 'corrina': 'Female', 'tyrell': 'Male', 'kameryn': 'Neutral', 'maxwell': 'Neutral', 'marshall': 'Male', 'sol': 'Male', 'soo': 'Female', 'son': 'Male', 'jeramy': 'Male', 'tami': 'Female', 'devontae': 'Male', 'loreta': 'Female', 'steffanie': 'Female', 'tama': 'Female', 'kavindra': 'Female', 'nova': 'Neutral', 'orville': 'Male', 'jann': 'Female', 'jani': 'Female', 'jane': 'Neutral', 'vernell': 'Female', 'jana': 'Neutral', 'urilla': 'Female', 'ginette': 'Female', 'linore': 'Female', 'lauretta': 'Female', 'laurette': 'Female', 'melanie': 'Neutral', 'melania': 'Female', 'verda': 'Female', 'verdi': 'Female', 'javon': 'Male', 'aniyah': 'Female', 'demetria': 'Female', 'kylah': 'Female', 'kylan': 'Male', 'ovid': 'Male', 'lucila': 'Female', 'lucile': 'Female', 'nichelle': 'Female', 'tefo': 'Male', 'lundy': 'Neutral', 'jaimie': 'Neutral', 'eloy': 'Male', 'frayne': 'Male', 'cassia': 'Female', 'acacia': 'Female', 'dwana': 'Female', 'tamela': 'Female', 'zane': 'Neutral', 'zana': 'Female', 'demonte': 'Male', 'rolf': 'Male', 'tybal': 'Neutral', 'meghan': 'Female', 'bulah': 'Female', 'agnus': 'Female', 'aleshia': 'Female', 'mahdi': 'Neutral', 'devon': 'Neutral', 'palma': 'Female', 'miranda': 'Female', 'tiassale': 'Neutral', 'adrianne': 'Female', 'adrianna': 'Female', 'loren': 'Neutral', 'melba': 'Female', 'domingo': 'Male', 'dominga': 'Female', 'jennipher': 'Female', 'cristie': 'Female', 'azize': 'Neutral', 'ormand': 'Male', 'asli': 'Female', 'cristin': 'Female', 'chaim': 'Male', 'allyssa': 'Female', 'davan': 'Neutral', 'zikomo': 'Male', 'edelmira': 'Female', 'venice': 'Female', 'necole': 'Female', 'kathaleen': 'Female', 'keifer': 'Male', 'lajuana': 'Female', 'jenitia': 'Female', 'vea': 'Female', 'makara': 'Female', 'jeri': 'Female', 'jere': 'Male', 'maygen': 'Female', 'javen': 'Male', 'sonora': 'Female', 'henrietta': 'Female', 'kaleigh': 'Female', 'elenora': 'Female', 'brenna': 'Female', 'ollie': 'Neutral', 'minnie': 'Female', 'porsha': 'Female', 'teal': 'Neutral', 'ilithya': 'Female', 'meadow': 'Female', 'cheree': 'Female', 'magali': 'Female', 'trisha': 'Female', 'sherryl': 'Female', 'jamison': 'Male', 'magaly': 'Female', 'tatyanna': 'Female', 'elton': 'Male', 'denita': 'Female', 'oleg': 'Male', 'cassy': 'Female', 'abdullah': 'Male', 'keitha': 'Female', 'meli': 'Neutral', 'axel': 'Male', 'rochel': 'Female', 'cassi': 'Female', 'mele': 'Neutral', 'annalee': 'Female', 'gladys': 'Female', 'cayden': 'Male', 'galilea': 'Female', 'alona': 'Female', 'perdita': 'Female', 'benson': 'Male', 'terrence': 'Male', 'yevette': 'Female', 'neville': 'Male', 'dusty': 'Neutral', 'cassius': 'Male', 'yetta': 'Female', 'yetty': 'Female', 'dusti': 'Female', 'jammie': 'Female', 'dayami': 'Female', 'love': 'Female', 'stockton': 'Male', 'nicolette': 'Neutral', 'ipo': 'Female', 'caron': 'Female', 'kimiko': 'Female', 'kyong': 'Female', 'darnell': 'Male', 'lencho': 'Male', 'joetta': 'Female', 'aine': 'Female', 'mittie': 'Female', 'sunday': 'Female', 'natesa': 'Female', 'shelbie': 'Female', 'roxanna': 'Female', 'roxanne': 'Female', 'inocencia': 'Female', 'launa': 'Female', 'ivonne': 'Female', 'justa': 'Female', 'clayland': 'Male', 'jola': 'Female', 'claud': 'Male', 'micaela': 'Female', 'jayvion': 'Male', 'kaelin': 'Male', 'genoveva': 'Female', 'vega': 'Female', 'phoebe': 'Female', 'kendrick': 'Male', 'webster': 'Male', 'corene': 'Female', 'enriqueta': 'Female', 'christinia': 'Female', 'amada': 'Female', 'ailene': 'Female', 'locke': 'Neutral', 'stetson': 'Male', 'lakeesha': 'Female', 'evita': 'Female', 'ngan': 'Female', 'caresse': 'Female', 'winter': 'Neutral', 'milda': 'Female', 'kenia': 'Female', 'alessa': 'Female', 'oswaldo': 'Male', 'savon': 'Male', 'coleman': 'Male', 'nicholai': 'Male', 'lavette': 'Female', 'lida': 'Female', 'cielo': 'Male', 'gaille': 'Female', 'loriann': 'Female', 'isaura': 'Female', 'jonnie': 'Female', 'june': 'Female', 'su': 'Female', 'viki': 'Female', 'so': 'Female', 'glynis': 'Female', 'axelle': 'Neutral', 'kanye': 'Male', 'tula': 'Female', 'tora': 'Female', 'solace': 'Female', 'jin': 'Female', 'hedva': 'Female', 'jim': 'Male', 'tori': 'Neutral', 'oakley': 'Neutral', 'aviv': 'Male', 'tiffiny': 'Female', 'allena': 'Female', 'avis': 'Neutral', 'doretha': 'Female', 'ilit': 'Male', 'tory': 'Neutral', 'pleasance': 'Female', 'hoshiko': 'Male', 'thalia': 'Female', 'griselda': 'Female', 'arletha': 'Female', 'winslow': 'Male', 'freya': 'Female', 'brody': 'Male', 'fabian': 'Male', 'kamila': 'Female', 'noleta': 'Female', 'emmalie': 'Female', 'deneen': 'Female', 'davion': 'Male', 'irina': 'Female', 'waneta': 'Neutral', 'isidra': 'Female', 'isidro': 'Male', 'coby': 'Male', 'evangelina': 'Female', 'terrilyn': 'Female', 'evangeline': 'Female', 'jaelyn': 'Female', 'kamryn': 'Neutral', 'palani': 'Neutral', 'cissy': 'Female', 'leanora': 'Female', 'freida': 'Female', 'kalani': 'Male', 'sorcha': 'Female', 'mimi': 'Female', 'eliezer': 'Male', 'lecia': 'Female', 'marla': 'Female', 'leala': 'Female', 'dunne': 'Neutral', 'genevive': 'Female', 'marli': 'Female', 'braylen': 'Male', 'marlo': 'Male', 'mckayla': 'Female', 'ova': 'Female', 'gordon': 'Male', 'marly': 'Female', 'lachlan': 'Neutral', 'oni': 'Female', 'carlyn': 'Female', 'velda': 'Female', 'ona': 'Female', 'mignon': 'Female', 'tamara': 'Female', 'becka': 'Female', 'shandra': 'Female', 'guadalupe': 'Neutral', 'alivia': 'Female', 'urit': 'Female', 'londa': 'Female', 'williams': 'Male', 'chere': 'Female', 'ashby': 'Neutral', 'shawn': 'Neutral', 'syshe': 'Neutral', 'pamila': 'Female', 'kaula': 'Female', 'jeannine': 'Female', 'shreya': 'Female', 'lissa': 'Female', 'sophie': 'Female', 'rehan': 'Female', 'sophia': 'Female', 'phemia': 'Female', 'rainer': 'Male', 'sam': 'Neutral', 'sal': 'Neutral', 'amaya': 'Female', 'nidia': 'Female', 'jewell': 'Female', 'maybell': 'Female', 'allen': 'Male', 'eadoin': 'Male', 'sau': 'Female', 'zoe': 'Female', 'orval': 'Male', 'yosef': 'Male', 'mazie': 'Female', 'zandra': 'Female', 'arleth': 'Female', 'rosina': 'Female', 'malissa': 'Female', 'rosine': 'Female', 'tristen': 'Neutral', 'thersa': 'Female', 'urania': 'Female', 'zoila': 'Female', 'lahela': 'Female', 'radwan': 'Male', 'marijke': 'Female', 'demetrice': 'Female', 'adila': 'Female', 'larya': 'Female', 'nadene': 'Female', 'avaree': 'Female', 'lixue': 'Female', 'ulani': 'Female', 'madison': 'Neutral', 'wynn': 'Neutral', 'eamon': 'Male', 'beckham': 'Male', 'lotus': 'Female', 'meris': 'Neutral', 'amberly': 'Female', 'elan': 'Neutral', 'brandyn': 'Male', 'jaqueline': 'Female', 'meria': 'Female', 'merlin': 'Male', 'erykah': 'Female', 'robt': 'Male', 'otis': 'Male', 'caroline': 'Female', 'carolina': 'Female', 'atticus': 'Male', 'arnita': 'Female', 'rafferty': 'Neutral', 'yulisa': 'Female', 'malvina': 'Female', 'osma': 'Neutral', 'krishna': 'Female', 'yaser': 'Neutral', 'carolann': 'Female', 'primo': 'Male', 'nafuna': 'Female', 'ahmad': 'Male', 'roger': 'Male', 'hasana': 'Female', 'keyshawn': 'Male', 'marlena': 'Female', 'sukey': 'Female', 'marlene': 'Female', 'marnie': 'Female', 'tenesha': 'Female', 'tania': 'Female', 'raeann': 'Female', 'isabel': 'Female', 'jordi': 'Neutral', 'lilia': 'Female', 'dexter': 'Male', 'danille': 'Female', 'teena': 'Female', 'harvey': 'Male', 'yepa': 'Female', 'dionte': 'Male', 'jaeda': 'Female', 'fynn': 'Male', 'marvin': 'Male', 'lettie': 'Female', 'clayton': 'Male', 'marietta': 'Female', 'marvis': 'Female', 'mariette': 'Female', 'cedric': 'Male', 'aryana': 'Female', 'jett': 'Male', 'coligny': 'Female', 'dominque': 'Neutral', 'many': 'Female', 'yardan': 'Male', 'estralita': 'Female', 'mertie': 'Female', 'mana': 'Female', 'belia': 'Female', 'shannen': 'Neutral', 'boaz': 'Male', 'odilia': 'Female', 'prue': 'Female', 'ghislaine': 'Female', 'marquetta': 'Female', 'zetta': 'Female', 'lidia': 'Female', 'carina': 'Female', 'teddy': 'Male', 'conyers': 'Male', 'west': 'Neutral', 'millard': 'Male', 'victorina': 'Female', 'soraya': 'Female', 'bernardine': 'Female', 'bernardina': 'Female', 'tyrese': 'Male', 'sanjuana': 'Female', 'laney': 'Neutral', 'yorick': 'Male', 'myrilla': 'Female', 'kandice': 'Female', 'malana': 'Female', 'polly': 'Female', 'isabella': 'Female', 'loris': 'Female', 'isabelle': 'Female', 'maliyah': 'Female', 'papina': 'Female', 'ilario': 'Male', 'shanta': 'Female', 'shante': 'Female', 'ivey': 'Female', 'alannah': 'Female', 'loise': 'Female', 'iva': 'Female', 'trella': 'Female', 'killian': 'Neutral', 'hertha': 'Female', 'ivi': 'Female', 'milandu': 'Neutral', 'bron': 'Neutral', 'deloras': 'Female', 'ruana': 'Female', 'ivy': 'Female', 'kegan': 'Male', 'fatima': 'Female', 'otto': 'Male', 'damon': 'Male', 'ludwig': 'Male', 'shelagh': 'Female', 'sterling': 'Male', 'makenna': 'Female', 'karoline': 'Female', 'jasiah': 'Male', 'shanelle': 'Female', 'latrice': 'Female', 'josette': 'Female', 'elina': 'Female', 'deidre': 'Female', 'harris': 'Male', 'vevay': 'Female', 'marquerite': 'Female', 'alease': 'Female', 'narcisse': 'Female', 'christene': 'Female', 'christena': 'Female', 'alfredo': 'Male', 'genie': 'Female', 'genia': 'Female', 'nessa': 'Female', 'summer': 'Female', 'haylee': 'Female', 'whitfield': 'Male', 'muoi': 'Female', 'parlan': 'Neutral', 'haden': 'Male', 'chace': 'Male', 'izayah': 'Male', 'darien': 'Male', 'hayley': 'Female', 'ngoc': 'Female', 'twyla': 'Female', 'jarred': 'Male', 'isamar': 'Female', 'jarret': 'Male', 'iridian': 'Female', 'zion': 'Neutral', 'bernardo': 'Male', 'jannie': 'Female', 'catrina': 'Female', 'iphigenia': 'Female', 'camron': 'Male', 'dara': 'Female', 'kyara': 'Female', 'rubye': 'Female', 'lavonia': 'Female', 'rachael': 'Female', 'jacquiline': 'Female', 'clay': 'Neutral', 'beverly': 'Female', 'melisande': 'Female', 'brita': 'Female', 'karrie': 'Female', 'karissa': 'Female', 'lucy': 'Female', 'britt': 'Neutral', 'kole': 'Male', 'nixie': 'Female', 'eusebio': 'Male', 'cristine': 'Female', 'cristina': 'Female', 'divina': 'Female', 'tave': 'Neutral', 'exie': 'Female', 'scottie': 'Male', 'tavi': 'Neutral', 'kathlyn': 'Female', 'lynton': 'Neutral', 'noor': 'Neutral', 'luca': 'Neutral', 'vivian': 'Neutral', 'irmgard': 'Female', 'zanna': 'Female', 'didier': 'Neutral', 'meah': 'Female', 'josie': 'Female', 'demarco': 'Male', 'usha': 'Female', 'stone': 'Male', 'miguelangel': 'Male', 'ace': 'Male', 'tarah': 'Female', 'terica': 'Female', 'rosemary': 'Female', 'niall': 'Neutral', 'luigi': 'Male', 'charmain': 'Female', 'dannie': 'Neutral', 'clarice': 'Female', 'lourana': 'Female', 'noxolo': 'Neutral', 'carey': 'Neutral', 'makai': 'Male', 'burian': 'Male', 'jasper': 'Male', 'charla': 'Female', 'wade': 'Neutral', 'hidalgo': 'Male', 'charli': 'Neutral', 'janiyah': 'Female', 'keelan': 'Male', 'adison': 'Female', 'abiba': 'Female', 'hee': 'Female', 'missy': 'Female', 'berniece': 'Female', 'racquel': 'Female', 'sevinc': 'Neutral', 'mick': 'Male', 'adriene': 'Female', 'mica': 'Female', 'venetta': 'Female', 'marni': 'Female', 'marna': 'Female', 'vania': 'Female', 'treasure': 'Female', 'vanig': 'Male', 'russ': 'Male', 'zaiden': 'Male', 'tripp': 'Male', 'glenda': 'Female', 'laird': 'Male', 'carver': 'Male', 'alethea': 'Female', 'johnny': 'Male', 'ai': 'Female', 'sharika': 'Female', 'al': 'Male', 'an': 'Female', 'elisha': 'Neutral', 'xochitl': 'Female', 'galeno': 'Male', 'johnna': 'Female', 'natane': 'Female', 'angelica': 'Female', 'vasiliki': 'Female', 'collin': 'Male', 'karli': 'Female', 'yogi': 'Neutral', 'hadar': 'Male', 'maire': 'Female', 'tawanna': 'Female', 'shaun': 'Male', 'estell': 'Female', 'terri': 'Neutral', 'miriah': 'Female', 'kairos': 'Female', 'rhett': 'Male', 'miriam': 'Female', 'estela': 'Female', 'terra': 'Female', 'ieshia': 'Female', 'beulah': 'Female', 'terry': 'Neutral', 'rosalyn': 'Female', 'natalie': 'Female', 'thora': 'Female', 'natalia': 'Female', 'ariella': 'Female', 'mireya': 'Female', 'raphael': 'Male', 'nelson': 'Male', 'adan': 'Male', 'lupita': 'Female', 'cocheta': 'Female', 'anette': 'Female', 'nicklaus': 'Male', 'nikita': 'Neutral', 'kaelyn': 'Female', 'ismail': 'Male', 'makaila': 'Female', 'deedra': 'Female', 'kelila': 'Female', 'ty': 'Male', 'ruby': 'Female', 'christion': 'Male', 'tu': 'Female', 'lesha': 'Female', 'nora': 'Female', 'nori': 'Neutral', 'norm': 'Male', 'ta': 'Female', 'candis': 'Female', 'brein': 'Neutral', 'eleni': 'Female', 'lirit': 'Neutral', 'marylynn': 'Female', 'philena': 'Female', 'elena': 'Female', 'zoey': 'Female', 'elene': 'Female', 'shania': 'Female', 'adina': 'Female', 'dextra': 'Female', 'sang': 'Male', 'harry': 'Male', 'nijole': 'Female', 'bracha': 'Female', 'maggie': 'Female', 'tonja': 'Female', 'jayce': 'Male', 'amena': 'Female', 'georgeanna': 'Female', 'melora': 'Female', 'rashaan': 'Male', 'navid': 'Neutral', 'richard': 'Male', 'gitano': 'Male', 'fleur': 'Female', 'tanya': 'Female', 'leia': 'Female', 'leif': 'Male', 'migdana': 'Female', 'mckenzie': 'Neutral', 'barnabas': 'Male', 'teresia': 'Female', 'kerstin': 'Female', 'fergus': 'Male', 'cordelia': 'Female', 'razi': 'Female', 'richelle': 'Female', 'cristen': 'Female', 'emmly': 'Female', 'tyesha': 'Female', 'lekisha': 'Female', 'efrat': 'Male', 'janna': 'Female', 'fiachra': 'Female', 'dallin': 'Neutral', 'byrd': 'Male', 'viv': 'Neutral', 'catarina': 'Female', 'lilka': 'Female', 'kalinda': 'Female', 'finola': 'Female', 'silva': 'Female', 'algeron': 'Male', 'kaitlyn': 'Female', 'onslow': 'Male', 'beula': 'Female', 'germain': 'Female', 'mort': 'Male', 'pearl': 'Female', 'beatris': 'Female', 'rhea': 'Female', 'mora': 'Female', 'beatriz': 'Female', 'more': 'Neutral', 'chailyn': 'Female', 'donnette': 'Female', 'donnetta': 'Female', 'sabastian': 'Male', 'juliette': 'Female', 'julietta': 'Female', 'makana': 'Female', 'kenyon': 'Neutral', 'gudrun': 'Female', 'delphia': 'Female', 'elysia': 'Female', 'damien': 'Male', 'phillip': 'Male', 'phillis': 'Female', 'malo': 'Male', 'morgan': 'Neutral', 'adalberto': 'Male', 'leola': 'Female', 'lavina': 'Female', 'allegra': 'Female', 'nickolas': 'Male', 'margrett': 'Female', 'sika': 'Female', 'jabilo': 'Male', 'bethanie': 'Female', 'aliana': 'Female', 'clint': 'Male', 'pravat': 'Male', 'hugo': 'Male', 'hugh': 'Male', 'isi': 'Female', 'dannielle': 'Female', 'yurem': 'Male', 'perrin': 'Neutral', 'wiley': 'Neutral', 'brett': 'Male', 'gelsey': 'Female', 'amparo': 'Female', 'mendel': 'Neutral', 'jerilyn': 'Female', 'linnie': 'Neutral', 'leroy': 'Male', 'whitley': 'Neutral', 'lashanda': 'Female', 'dolph': 'Male', 'lashawnda': 'Female', 'lenka': 'Female', 'signe': 'Female', 'clemencia': 'Female', 'barnard': 'Male', 'leigh': 'Neutral', 'bryon': 'Male', 'ownah': 'Female', 'ita': 'Female', 'jordana': 'Female', 'jamiya': 'Female', 'scott': 'Male', 'nevina': 'Female', 'farica': 'Female', 'nigel': 'Male', 'bria': 'Female', 'cammie': 'Female', 'vernados': 'Male', 'deadra': 'Female', 'alla': 'Female', 'gerald': 'Male', 'joseline': 'Female', 'isaak': 'Male', 'tomiko': 'Female', 'isaac': 'Male', 'zilli': 'Female', 'tomika': 'Female', 'filia': 'Female', 'lacey': 'Female', 'lowell': 'Male', 'susane': 'Female', 'susann': 'Female', 'katheryn': 'Female', 'rosalind': 'Female', 'rosaline': 'Female', 'olivia': 'Neutral', 'skipper': 'Male', 'rosalina': 'Female', 'dede': 'Female', 'ulric': 'Male', 'denny': 'Male', 'chandra': 'Female', 'denna': 'Female', 'corina': 'Female', 'corine': 'Female', 'shawnna': 'Female', 'lorriane': 'Female', 'montserrat': 'Female', 'zayne': 'Male', 'lynde': 'Neutral', 'gilberto': 'Male', 'mackenzie': 'Neutral', 'tonita': 'Female', 'gilberte': 'Female', 'ernie': 'Male', 'zorina': 'Female', 'lizeth': 'Female', 'garvey': 'Male', 'kian': 'Male', 'darline': 'Female', 'tarana': 'Female', 'jeremiah': 'Male', 'medea': 'Female', 'waltraud': 'Female', 'sinjin': 'Male', 'debby': 'Female', 'jazlyn': 'Female', 'debbi': 'Female', 'mahalia': 'Female', 'chesmu': 'Male', 'bernie': 'Neutral', 'kailyn': 'Female', 'major': 'Male', 'koby': 'Male', 'fedora': 'Female', 'livana': 'Female', 'keiji': 'Male', 'nohemi': 'Female', 'kobe': 'Male', 'tonette': 'Female', 'tovi': 'Female', 'tayshaun': 'Male', 'noma': 'Female', 'fuller': 'Male', 'avel': 'Male', 'benedict': 'Male', 'doreatha': 'Female', 'leighton': 'Neutral', 'sargent': 'Male', 'jeb': 'Male', 'jed': 'Male', 'tahlia': 'Female', 'deiondre': 'Male', 'graece': 'Female', 'jen': 'Female', 'amiyah': 'Female', 'ermin': 'Male', 'kendell': 'Male', 'candra': 'Female', 'jabir': 'Male', 'ernestine': 'Female', 'grace': 'Female', 'ernestina': 'Female', 'delaine': 'Neutral', 'jabulani': 'Male', 'medard': 'Neutral', 'shlomo': 'Male', 'tertullian': 'Male', 'hewitt': 'Male', 'amma': 'Female', 'nikolai': 'Male', 'kavon': 'Male', 'nikolas': 'Male', 'wafa': 'Neutral', 'melva': 'Female', 'tierney': 'Female', 'winnifred': 'Female', 'malorie': 'Female', 'minjonet': 'Female', 'miah': 'Female', 'sherwood': 'Male', 'bobbie': 'Neutral', 'emmaline': 'Female', 'jacinto': 'Male', 'mirella': 'Female', 'cherelle': 'Female', 'brendon': 'Male', 'mendy': 'Female', 'japheth': 'Male', 'ziazan': 'Female', 'brooklyn': 'Neutral', 'saxen': 'Neutral', 'sadira': 'Female', 'gaby': 'Female', 'dunja': 'Female', 'cheche': 'Female', 'crevan': 'Male', 'marisha': 'Female', 'gabi': 'Female', 'aviva': 'Female', 'gabe': 'Male', 'eshe': 'Female', 'ugo': 'Male', 'brigham': 'Male', 'carley': 'Female', 'keila': 'Female', 'naoma': 'Female', 'naomi': 'Female', 'carlee': 'Female', 'ciarra': 'Female', 'kade': 'Male', 'wayne': 'Male', 'maddalyn': 'Female', 'morrisa': 'Female', 'tricia': 'Female', 'keala': 'Female', 'zarifa': 'Female', 'shasa': 'Female', 'sunny': 'Neutral', 'louella': 'Female', 'remedy': 'Neutral', 'gratia': 'Female', 'twila': 'Female', 'sunni': 'Female', 'dustin': 'Male', 'karyme': 'Female', 'mansa': 'Female', 'floretta': 'Female', 'river': 'Neutral', 'esben': 'Male', 'bisbee': 'Male', 'almeda': 'Female', 'matteo': 'Male', 'jade': 'Neutral', 'terena': 'Female', 'byron': 'Male', 'jada': 'Female', 'see': 'Female', 'calida': 'Female', 'krish': 'Male', 'branson': 'Male', 'allie': 'Female', 'joaquina': 'Female', 'rita': 'Female', 'krystle': 'Female', 'tristan': 'Neutral', 'qamar': 'Male', 'lynley': 'Neutral', 'catharine': 'Female', 'kimbery': 'Female', 'aggie': 'Female', 'vickey': 'Female', 'bryn': 'Female', 'olisa': 'Female', 'natala': 'Female', 'colton': 'Male', 'jocelyn': 'Female', 'opal': 'Female', 'patti': 'Neutral', 'thom': 'Male', 'rhianna': 'Female', 'mizell': 'Neutral', 'laree': 'Female', 'bridgette': 'Female', 'tavita': 'Female', 'fermin': 'Male', 'marvella': 'Female', 'nataly': 'Female', 'patty': 'Neutral', 'olli': 'Neutral', 'marilee': 'Female', 'bell': 'Neutral', 'darlena': 'Female', 'loan': 'Female', 'darlene': 'Female', 'leon': 'Male', 'olly': 'Neutral', 'mandisa': 'Female', 'lynda': 'Female', 'merideth': 'Female', 'sammy': 'Neutral', 'keyon': 'Male', 'jacklyn': 'Female', 'devin': 'Neutral', 'fola': 'Female', 'tanisha': 'Female', 'kiros': 'Neutral', 'rianna': 'Female', 'nonnie': 'Neutral', 'toyah': 'Female', 'geoffrey': 'Male', 'marnina': 'Female', 'boston': 'Male', 'stephaine': 'Female', 'sina': 'Female', 'zada': 'Female', 'niles': 'Male', 'sherise': 'Female', 'wheeler': 'Male', 'fritz': 'Male', 'maragaret': 'Female', 'kumiko': 'Female', 'zenobia': 'Female', 'ratana': 'Female', 'hazelle': 'Female', 'dominik': 'Male', 'regena': 'Female', 'deontae': 'Male', 'dominic': 'Male', 'robin': 'Neutral', 'templeton': 'Male', 'lynette': 'Female', 'von': 'Neutral', 'sharyn': 'Female', 'kurtis': 'Male', 'xiao': 'Female', 'jeffry': 'Male', 'despina': 'Female', 'chase': 'Neutral', 'barney': 'Male', 'maida': 'Female', 'dooley': 'Male', 'zita': 'Female', 'halona': 'Female', 'keyla': 'Female', 'joleen': 'Female', 'rabia': 'Neutral', 'eura': 'Female', 'jaleesa': 'Female', 'makale': 'Neutral', 'mavis': 'Female', 'osanna': 'Neutral', 'staci': 'Female', 'kelle': 'Female', 'kelli': 'Female', 'reginald': 'Male', 'marylyn': 'Female', 'belen': 'Female', 'kelly': 'Neutral', 'eilene': 'Female', 'johan': 'Male', 'ozzie': 'Male', 'fritzi': 'Female', 'leone': 'Male', 'jodee': 'Female', 'fabunni': 'Male', 'austyn': 'Male', 'makayla': 'Female', 'lester': 'Male', 'gallia': 'Female', 'sima': 'Female', 'hercules': 'Male', 'drema': 'Female', 'hilaria': 'Female', 'hilario': 'Male', 'chanelle': 'Female', 'forrest': 'Male', 'ranisha': 'Female', 'shirleen': 'Female', 'jayde': 'Female', 'yoland': 'Female', 'lady': 'Female', 'sydnee': 'Neutral', 'erno': 'Male', 'aloha': 'Female', 'shyann': 'Female', 'sydney': 'Neutral', 'courtney': 'Neutral', 'hermelinda': 'Female', 'arden': 'Neutral', 'minerva': 'Female', 'nicholle': 'Female', 'lathrop': 'Male', 'richie': 'Male', 'mykal': 'Male', 'thurman': 'Male', 'aziza': 'Female', 'sebrina': 'Female', 'kennedy': 'Neutral', 'kapila': 'Male', 'marques': 'Male', 'caley': 'Neutral', 'darrius': 'Male', 'ivan': 'Male', 'alexandra': 'Female', 'margorie': 'Female', 'pekelo': 'Male', 'alexandre': 'Male', 'absolom': 'Male', 'fredericka': 'Female', 'dempster': 'Male', 'spring': 'Female', 'kasie': 'Female', 'kasia': 'Female', 'piuta': 'Female', 'kasim': 'Male', 'ursula': 'Female', 'lamia': 'Female', 'gyula': 'Male', 'lamis': 'Female', 'temple': 'Neutral', 'jerrica': 'Female', 'bo': 'Male', 'jerrick': 'Male', 'santa': 'Female', 'santo': 'Male', 'carol': 'Female', 'ardelle': 'Female', 'amado': 'Male', 'ryleigh': 'Female', 'roselani': 'Female', 'gilma': 'Female', 'jaquelin': 'Female', 'rafer': 'Male', 'stuart': 'Male', 'massimo': 'Male', 'kassia': 'Female', 'clinton': 'Male', 'kassie': 'Female', 'zytka': 'Female', 'jonna': 'Female', 'nash': 'Male', 'jonny': 'Male', 'katia': 'Female', 'katie': 'Female', 'izach': 'Male', 'kathleen': 'Female', 'herminia': 'Female', 'chu': 'Female', 'serendipity': 'Female', 'bradford': 'Male', 'johnathon': 'Male', 'tazara': 'Female', 'jacky': 'Neutral', 'lino': 'Male', 'linn': 'Female', 'jarett': 'Male', 'linh': 'Female', 'ling': 'Female', 'talli': 'Neutral', 'lina': 'Female', 'jacki': 'Neutral', 'josiah': 'Neutral', 'erick': 'Male', 'erich': 'Male', 'cid': 'Male', 'fadey': 'Male', 'dom': 'Male', 'erica': 'Female', 'un': 'Female', 'chessa': 'Female', 'ninfa': 'Female', 'alyssia': 'Female', 'elliana': 'Female', 'gertude': 'Female', 'chad': 'Male', 'chae': 'Female', 'chan': 'Female', 'chas': 'Male', 'kristle': 'Female', 'chau': 'Female', 'chaz': 'Male', 'kabira': 'Female', 'tari': 'Female', 'alisyn': 'Female', 'codey': 'Neutral', 'tara': 'Female', 'edwardo': 'Male', 'tucker': 'Male', 'ahanu': 'Male', 'saundra': 'Female', 'laticia': 'Female', 'lucio': 'Male', 'symone': 'Female', 'annamika': 'Female', 'lucie': 'Female', 'akeelah': 'Female', 'lucia': 'Female', 'bianca': 'Female', 'ryann': 'Female', 'lang': 'Neutral', 'lane': 'Neutral', 'lana': 'Female', 'geraldine': 'Neutral', 'lani': 'Neutral', 'sawyer': 'Neutral', 'merrilee': 'Female', 'overton': 'Neutral', 'walker': 'Neutral', 'fransisca': 'Female', 'panfila': 'Female', 'hampton': 'Male', 'ilse': 'Female', 'athur': 'Male', 'codi': 'Neutral', 'bettyann': 'Female', 'jovany': 'Male', 'adilene': 'Female', 'garren': 'Neutral', 'cody': 'Neutral', 'tammera': 'Female', 'kadijah': 'Female', 'carmelia': 'Female', 'sena': 'Female', 'young': 'Neutral', 'shelia': 'Female', 'phuong': 'Female', 'sharri': 'Female', 'travon': 'Male', 'janise': 'Female', 'scarlett': 'Female', 'consuela': 'Female', 'eloisa': 'Female', 'libba': 'Female', 'eloise': 'Female', 'kolten': 'Male', 'consuelo': 'Female', 'carmelita': 'Female', 'mahari': 'Neutral', 'coleton': 'Male', 'libby': 'Female', 'zenevieva': 'Female', 'yakov': 'Male', 'erlinda': 'Female', 'eva': 'Female', 'marry': 'Female', 'moesha': 'Female', 'tre': 'Male', 'eve': 'Female', 'leonarda': 'Female', 'race': 'Male', 'gabriel': 'Neutral', 'keena': 'Female', 'leonardo': 'Male', 'braylon': 'Male', 'keene': 'Male', 'ainsley': 'Neutral', 'kathern': 'Female', 'jeffie': 'Female', 'nitsa': 'Female', 'leeann': 'Female', 'oda': 'Female', 'victor': 'Male', 'erwin': 'Male', 'caridad': 'Female', 'berdine': 'Female', 'morse': 'Male', 'mollie': 'Female', 'anton': 'Male', 'laurence': 'Male', 'skylar': 'Neutral', 'ursa': 'Female', 'clelia': 'Female', 'lea': 'Female', 'gafna': 'Female', 'lee': 'Neutral', 'tyrique': 'Male', 'len': 'Male', 'leo': 'Male', 'laddie': 'Male', 'les': 'Male', 'lex': 'Neutral', 'payten': 'Female', 'bridgett': 'Female', 'dembe': 'Neutral', 'delora': 'Female', 'neena': 'Female', 'sherrell': 'Female', 'vevina': 'Female', 'dyan': 'Female', 'levia': 'Female', 'derby': 'Neutral', 'stephania': 'Female', 'stephanie': 'Female', 'youlanda': 'Female', 'riva': 'Female', 'melina': 'Female', 'altha': 'Female', 'sienna': 'Female', 'refugio': 'Male', 'refugia': 'Female', 'denice': 'Female', 'camdyn': 'Female', 'andreas': 'Male', 'elodia': 'Female', 'lesly': 'Female', 'latricia': 'Female', 'pepin': 'Male', 'verla': 'Female', 'emelina': 'Female', 'emeline': 'Female', 'zia': 'Female', 'lesli': 'Female', 'levana': 'Female', 'baba': 'Female', 'luba': 'Female', 'charita': 'Female', 'katelyn': 'Female', 'stephenie': 'Female', 'elizebeth': 'Female', 'baby': 'Neutral', 'charity': 'Female', 'isabellah': 'Female', 'torn': 'Neutral', 'anika': 'Female', 'joellen': 'Female', 'emerson': 'Neutral', 'harva': 'Female', 'tiffanie': 'Female', 'saba': 'Neutral', 'georgann': 'Female', 'wilford': 'Male', 'lavon': 'Female', 'etta': 'Female', 'rodd': 'Male', 'marchelle': 'Female', 'bena': 'Female', 'kemberly': 'Female', 'latonia': 'Female', 'paley': 'Neutral', 'lanai': 'Female', 'ellema': 'Female', 'cristal': 'Female', 'tien': 'Female', 'sumana': 'Female', 'emanuele': 'Male', 'gonzalo': 'Male', 'ayva': 'Female', 'gardner': 'Male', 'hawa': 'Female', 'yaretzi': 'Female', 'jonathon': 'Male', 'reggie': 'Male', 'iyanna': 'Female', 'katrice': 'Female', 'babara': 'Female', 'platt': 'Neutral', 'delsie': 'Female', 'nanci': 'Female', 'dafne': 'Female', 'greggory': 'Male', 'efren': 'Male', 'efrem': 'Male', 'nancy': 'Female', 'estevan': 'Male', 'yessenia': 'Female', 'clarissa': 'Female', 'houston': 'Male', 'kassandra': 'Female', 'warren': 'Male', 'aleta': 'Female', 'bedros': 'Male', 'jodi': 'Neutral', 'mitsue': 'Female', 'karisa': 'Female', 'romelia': 'Female', 'tyrone': 'Male', 'jody': 'Neutral', 'marlys': 'Female', 'nada': 'Female', 'ziva': 'Female', 'merton': 'Neutral', 'federico': 'Male', 'newman': 'Neutral', 'aiva': 'Female', 'marlyn': 'Female', 'torey': 'Male', 'damian': 'Male', 'hollie': 'Female', 'bette': 'Female', 'tracee': 'Female', 'queenie': 'Female', 'stephon': 'Male', 'hollis': 'Female', 'denzel': 'Male', 'betty': 'Female', 'cedrick': 'Male', 'dafydd': 'Male', 'gurit': 'Female', 'jagger': 'Male', 'alejandro': 'Male', 'meta': 'Female', 'breana': 'Female', 'breann': 'Female', 'audrina': 'Female', 'bay': 'Neutral', 'jethro': 'Male', 'shannon': 'Neutral', 'alejandra': 'Female', 'makoto': 'Male', 'arlyne': 'Female', 'dania': 'Female', 'carita': 'Female', 'mannie': 'Neutral', 'vinson': 'Male', 'kalli': 'Female', 'burke': 'Male', 'danil': 'Male', 'chaeli': 'Female', 'isleen': 'Female', 'cordia': 'Female', 'cordie': 'Female', 'vandalin': 'Neutral', 'indra': 'Female', 'ofer': 'Neutral', 'marketta': 'Female', 'davin': 'Neutral', 'linnea': 'Female', 'lindsa': 'Neutral', 'lancelot': 'Male', 'david': 'Male', 'kelton': 'Male', 'lindsy': 'Female', 'davis': 'Male', 'hussein': 'Male', 'anita': 'Female', 'coleen': 'Female', 'kiora': 'Female', 'matthias': 'Male', 'gisselle': 'Female', 'elyse': 'Female', 'karlyn': 'Female', 'jesus': 'Male', 'milagro': 'Female', 'bjorn': 'Male', 'olene': 'Female', 'faris': 'Male', 'ying': 'Female', 'lolita': 'Female', 'sharon': 'Neutral', 'porfirio': 'Male', 'natosha': 'Female', 'lolovivi': 'Neutral', 'ignatius': 'Male', 'darlita': 'Female', 'zaria': 'Female', 'norton': 'Male', 'jovita': 'Female', 'brunilda': 'Female', 'miyanda': 'Female', 'liang': 'Male', 'seymour': 'Male', 'orpha': 'Female', 'lou': 'Neutral', 'megan': 'Female', 'keandre': 'Male', 'aryan': 'Male', 'elita': 'Female', 'chong': 'Neutral', 'carma': 'Female', 'shanika': 'Female', 'roberta': 'Female', 'mercia': 'Female', 'roberto': 'Male', 'gaye': 'Female', 'gunnar': 'Male', 'avery': 'Neutral', 'gilon': 'Male', 'jonatan': 'Male', 'erika': 'Female', 'chelsia': 'Female', 'chelsie': 'Female', 'tessa': 'Female', 'benecia': 'Female', 'carlita': 'Female', 'aldan': 'Male', 'eryn': 'Female', 'lindy': 'Neutral', 'maritza': 'Female', 'lila': 'Female', 'eryk': 'Male', 'milly': 'Female', 'lilo': 'Male', 'lili': 'Female', 'mikasi': 'Male', 'latina': 'Female', 'linda': 'Female', 'izaak': 'Male', 'lily': 'Female', 'tabatha': 'Female', 'pete': 'Male', 'lashell': 'Female', 'talasi': 'Neutral', 'fidel': 'Male', 'chantell': 'Female', 'madalyn': 'Female', 'johnathan': 'Male', 'kennice': 'Female', 'emiko': 'Female', 'jacie': 'Female', 'manon': 'Neutral', 'kimber': 'Female', 'sanora': 'Female', 'bree': 'Female', 'brea': 'Female', 'kipling': 'Neutral', 'claudine': 'Female', 'bret': 'Male', 'karren': 'Female', 'gazit': 'Female', 'nessan': 'Neutral', 'anibal': 'Male', 'scotty': 'Male', 'lloyd': 'Male', 'brina': 'Female', 'demario': 'Male', 'jax': 'Male', 'jay': 'Male', 'stephine': 'Female', 'jan': 'Neutral', 'tabetha': 'Female', 'avak': 'Male', 'avah': 'Female', 'hiroshi': 'Male', 'sylvia': 'Female', 'jae': 'Male', 'sylvie': 'Female', 'jacqueline': 'Female', 'niabi': 'Neutral', 'rebecka': 'Female', 'lawrencia': 'Female', 'stavros': 'Male', 'citlalli': 'Female', 'jiro': 'Male', 'katharine': 'Female', 'anando': 'Male', 'katharina': 'Female', 'abby': 'Female', 'lalo': 'Male', 'lali': 'Female', 'lale': 'Neutral', 'michon': 'Neutral', 'lala': 'Female', 'darion': 'Male', 'reid': 'Male', 'hosea': 'Male', 'ohio': 'Neutral', 'neona': 'Female', 'benard': 'Male', 'latesha': 'Female', 'cristopher': 'Male', 'travis': 'Male', 'alessandro': 'Male', 'katheleen': 'Female', 'alessandra': 'Female', 'destiny': 'Female', 'cythia': 'Female', 'gabby': 'Neutral', 'fulbright': 'Male', 'yamka': 'Female', 'moriba': 'Female', 'destini': 'Female', 'kaycee': 'Neutral', 'miroslav': 'Male', 'enda': 'Female', 'eun': 'Female', 'belinda': 'Female', 'keely': 'Female', 'ofelia': 'Female', 'marty': 'Neutral', 'suanne': 'Female', 'goldie': 'Female', 'marti': 'Female', 'marth': 'Female', 'honey': 'Female', 'barran': 'Neutral', 'marta': 'Female', 'caylee': 'Female', 'cayleb': 'Male', 'lanelle': 'Female', 'nery': 'Male', 'annamarie': 'Female', 'malcolm': 'Male', 'alek': 'Male', 'annamaria': 'Female', 'lysander': 'Male', 'teigra': 'Female', 'nenet': 'Female', 'brinley': 'Male', 'li': 'Female', 'heloise': 'Female', 'jacquie': 'Female', 'onan': 'Male', 'silvia': 'Female', 'elmer': 'Male', 'farah': 'Female', 'bilal': 'Male', 'rochelle': 'Female', 'feivel': 'Male', 'rhoda': 'Female', 'trinity': 'Female', 'selina': 'Female', 'marcellus': 'Male', 'antwan': 'Male', 'marita': 'Female', 'quanda': 'Female', 'adalynn': 'Female', 'elianna': 'Female', 'sanai': 'Female', 'bradly': 'Male', 'pearlene': 'Female', 'maud': 'Female', 'phylis': 'Female', 'archie': 'Male', 'mayme': 'Female', 'lawerence': 'Male', 'salma': 'Female', 'vi': 'Female', 'miesha': 'Female', 'arabela': 'Female', 'felica': 'Female', 'manica': 'Female', 'felice': 'Female', 'juan': 'Male', 'carsen': 'Male', 'bishop': 'Male', 'paulo': 'Male', 'matthew': 'Male', 'verna': 'Female', 'lauralee': 'Female', 'jaheem': 'Male', 'paula': 'Female', 'larae': 'Female', 'columbia': 'Female', 'sade': 'Female', 'adeline': 'Female', 'adelina': 'Female', 'delicia': 'Female', 'jaclyn': 'Female', 'nyasia': 'Female', 'diata': 'Female', 'reza': 'Female', 'didina': 'Female', 'dinah': 'Female', 'audie': 'Female', 'natsu': 'Neutral', 'ariza': 'Female', 'rocio': 'Neutral', 'powa': 'Male', 'shanon': 'Female', 'samir': 'Male', 'akira': 'Female', 'barbar': 'Female', 'brenton': 'Male', 'shiloh': 'Neutral', 'roza': 'Female', 'diedre': 'Female', 'paul': 'Male', 'paulene': 'Female', 'cleavon': 'Male', 'wei': 'Female', 'nicodemus': 'Male', 'wen': 'Female', 'katriel': 'Female', 'wes': 'Male', 'moriah': 'Female', 'maegan': 'Female', 'chancellor': 'Male', 'darell': 'Male', 'ayana': 'Female', 'cruz': 'Male', 'desi': 'Neutral', 'hettie': 'Female', 'pier': 'Female', 'emma': 'Female', 'emmy': 'Female', 'normand': 'Male', 'myesha': 'Female', 'tesha': 'Female', 'arsenio': 'Male', 'mura': 'Female', 'teshi': 'Neutral', 'larita': 'Female', 'ronia': 'Female', 'tanith': 'Female', 'ronin': 'Male', 'shakira': 'Female', 'tameika': 'Female', 'gabbie': 'Female', 'shona': 'Female', 'dariana': 'Female', 'anabel': 'Female', 'karima': 'Female', 'latham': 'Male', 'jaylyn': 'Female', 'tracey': 'Neutral', 'belay': 'Male', 'iris': 'Female', 'viviana': 'Female', 'hien': 'Female', 'kourtney': 'Female', 'angeles': 'Female', 'marylee': 'Female', 'iria': 'Female', 'lakesha': 'Female', 'avareigh': 'Female', 'tristram': 'Male', 'quintin': 'Male', 'deetta': 'Female', 'burma': 'Female', 'catherina': 'Female', 'rafaela': 'Female', 'catherine': 'Female', 'palmira': 'Female', 'merv': 'Male', 'meri': 'Female', 'luna': 'Female', 'cadee': 'Female', 'camden': 'Neutral', 'hubert': 'Male', 'joyce': 'Female', 'caden': 'Male', 'lovette': 'Female', 'zachery': 'Male', 'lovetta': 'Female', 'yoshie': 'Female', 'annabel': 'Female', 'mykel': 'Neutral', 'tamatha': 'Female', 'mandel': 'Neutral', 'sandee': 'Female', 'annette': 'Female', 'annetta': 'Female', 'flynn': 'Male', 'mathilde': 'Female', 'mathilda': 'Neutral', 'maemi': 'Neutral', 'oriel': 'Neutral', 'tino': 'Male', 'adalyn': 'Female', 'treva': 'Female', 'apollo': 'Male', 'clemmie': 'Female', 'serafina': 'Female', 'marquis': 'Male', 'javion': 'Male', 'maranda': 'Female', 'yuko': 'Female', 'keiran': 'Male', 'yuki': 'Female', 'shemeka': 'Female', 'irish': 'Female', 'azuka': 'Female', 'yannis': 'Male', 'roselee': 'Female', 'jaiden': 'Neutral', 'weston': 'Male', 'jessi': 'Female', 'fisseha': 'Female', 'fennella': 'Female', 'ina': 'Female', 'jesse': 'Neutral', 'sharie': 'Female', 'misha': 'Neutral', 'geraldene': 'Female', 'corey': 'Neutral', 'kerda': 'Female', 'calla': 'Female', 'sharis': 'Female', 'kedma': 'Female', 'termon': 'Male', 'jolette': 'Female', 'francisco': 'Male', 'virgilio': 'Male', 'heremon': 'Male', 'matt': 'Male', 'irving': 'Male', 'chance': 'Neutral', 'calum': 'Male', 'ozella': 'Female', 'avital': 'Male', 'dyllis': 'Female', 'kiarra': 'Female', 'glennie': 'Female', 'elaina': 'Female', 'torrie': 'Female', 'elaine': 'Female', 'dyanne': 'Female', 'torrin': 'Neutral', 'glennis': 'Female', 'zelma': 'Female', 'kayonga': 'Male', 'khalil': 'Male', 'linsey': 'Female', 'cian': 'Male', 'elisabeth': 'Female', 'khalid': 'Male', 'crete': 'Female', 'rangle': 'Male', 'pedro': 'Male', 'hedy': 'Female', 'jalene': 'Female', 'edward': 'Male', 'regan': 'Neutral', 'chill': 'Male', 'jenniffer': 'Female', 'avril': 'Female', 'isaias': 'Male', 'aurora': 'Female', 'kiana': 'Female', 'penny': 'Female', 'aurore': 'Female', 'montel': 'Male', 'rosalba': 'Female', 'manie': 'Female', 'jacob': 'Male', 'cirocco': 'Male', 'vincenza': 'Female', 'deloris': 'Female', 'poppy': 'Neutral', 'vincenzo': 'Male', 'codie': 'Neutral', 'chet': 'Male', 'cher': 'Female', 'diantha': 'Female', 'earlean': 'Female', 'neal': 'Male', 'zander': 'Male', 'chen': 'Neutral', 'huela': 'Female', 'clorinda': 'Female', 'paulette': 'Female', 'apryl': 'Female', 'pauletta': 'Female', 'rosaura': 'Female', 'chaela': 'Female', 'arlean': 'Female', 'lilika': 'Female', 'frank': 'Male', 'petra': 'Female', 'estefani': 'Female', 'taryn': 'Female', 'jaida': 'Female', 'arnetta': 'Female', 'estefany': 'Female', 'arnette': 'Female', 'mitzie': 'Female', 'ashlynn': 'Female', 'danuta': 'Female', 'gerry': 'Neutral', 'michal': 'Neutral', 'jennefer': 'Female', 'audra': 'Female', 'idell': 'Female', 'kateb': 'Male', 'verdie': 'Female', 'juana': 'Female', 'gerri': 'Female', 'vivienne': 'Neutral', 'neola': 'Female', 'jazmyn': 'Female', 'audry': 'Female', 'marianna': 'Female', 'marianne': 'Female', 'mitchel': 'Male', 'khari': 'Male', 'jadiel': 'Male', 'lynsey': 'Female', 'sarah': 'Female', 'sarai': 'Female', 'fionnula': 'Female', 'saran': 'Female', 'naeva': 'Female', 'cana': 'Female', 'lorri': 'Female', 'parkin': 'Neutral', 'elias': 'Male', 'giovanna': 'Female', 'morgana': 'Female', 'marva': 'Female', 'giovanni': 'Male', 'jordyn': 'Neutral', 'mathew': 'Male', 'jadwiga': 'Female', 'giovanny': 'Male', 'debora': 'Female', 'irvin': 'Male', 'jamar': 'Male', 'magen': 'Female', 'myranda': 'Female', 'serita': 'Female', 'keva': 'Female', 'piera': 'Female', 'magee': 'Male', 'boyce': 'Male', 'grover': 'Male', 'era': 'Female', 'kody': 'Male', 'jamal': 'Male', 'mahlah': 'Female', 'eri': 'Male', 'vergie': 'Female', 'omari': 'Male', 'novia': 'Neutral', 'melantha': 'Female', 'hallie': 'Female', 'waverly': 'Neutral', 'angelika': 'Female', 'bennett': 'Male', 'india': 'Female', 'latisha': 'Female', 'fay': 'Female', 'jaycie': 'Female', 'micki': 'Neutral', 'avedis': 'Male', 'skyler': 'Neutral', 'shakir': 'Male', 'delling': 'Neutral', 'yvone': 'Female', 'stanislav': 'Male', 'shakia': 'Female', 'serenity': 'Female', 'lan': 'Female', 'candyce': 'Female', 'lai': 'Female', 'slyvia': 'Female', 'stefani': 'Female', 'olimpia': 'Female', 'deeann': 'Female', 'stefany': 'Female', 'parry': 'Neutral', 'arch': 'Male', 'adin': 'Male', 'tyronica': 'Female', 'tegan': 'Male', 'maximillian': 'Male', 'rolanda': 'Female', 'makya': 'Neutral', 'latrell': 'Male', 'rolande': 'Female', 'angelique': 'Female', 'rivka': 'Female', 'rolando': 'Neutral', 'lindsay': 'Female', 'kendall': 'Neutral', 'modesty': 'Female', 'zea': 'Female', 'zed': 'Male', 'damia': 'Female', 'neta': 'Female', 'debrah': 'Female', 'pascal': 'Male', 'shirely': 'Female', 'modesto': 'Male', 'modesta': 'Female', 'rosita': 'Female', 'charise': 'Female', 'christin': 'Female', 'christia': 'Female', 'christie': 'Female', 'denver': 'Neutral', 'leonidas': 'Male', 'violette': 'Female', 'quant': 'Neutral', 'vern': 'Neutral', 'cristofer': 'Male', 'electra': 'Female', 'theo': 'Neutral', 'laron': 'Male', 'araceli': 'Female', 'gerodi': 'Male', 'thea': 'Female', 'heike': 'Female', 'aracely': 'Female', 'gregorio': 'Male', 'vidal': 'Male', 'rocky': 'Male', 'sharice': 'Female', 'muhammad': 'Male', 'gregoria': 'Female', 'senalda': 'Female', 'anastasia': 'Female', 'ismaela': 'Female', 'kiersten': 'Female', 'shanae': 'Female', 'alexia': 'Female', 'pearlie': 'Female', 'carlos': 'Male', 'lillianna': 'Female', 'laqueta': 'Female', 'roxy': 'Female', 'jillian': 'Female', 'edgardo': 'Male', 'kiril': 'Male', 'vinita': 'Female', 'lankston': 'Male', 'hamlet': 'Male', 'julianna': 'Female', 'nysa': 'Female', 'julianne': 'Female', 'mirian': 'Female', 'amaranth': 'Female', 'daniel': 'Male', 'lanaya': 'Female', 'amaranta': 'Female', 'judith': 'Female', 'amarante': 'Female', 'oskar': 'Male', 'krikor': 'Male', 'veta': 'Female', 'amadeus': 'Male', 'taliesin': 'Neutral', 'asabi': 'Female', 'renee': 'Female', 'topo': 'Male', 'renea': 'Female', 'raisie': 'Female', 'xuxa': 'Female', 'elly': 'Female', 'caprice': 'Female', 'damaris': 'Female', 'errin': 'Female', 'magdalena': 'Female', 'tijuana': 'Female', 'abagail': 'Female', 'raheem': 'Male', 'deonna': 'Female', 'mervyn': 'Male', 'timothy': 'Male', 'amya': 'Female', 'rossie': 'Female', 'inger': 'Female', 'dejuan': 'Male', 'latrisha': 'Female', 'john': 'Male', 'pello': 'Male', 'haines': 'Male', 'meigha': 'Female', 'grayce': 'Female', 'alonso': 'Male', 'albert': 'Male', 'anjanette': 'Female', 'maxim': 'Male', 'leota': 'Female', 'enola': 'Female', 'morgyn': 'Female', 'bebe': 'Female', 'mercy': 'Female', 'timika': 'Female', 'gunther': 'Male', 'sonel': 'Female', 'cristobal': 'Male', 'melvina': 'Female', 'demarcus': 'Male', 'ingeborg': 'Female', 'anahi': 'Female', 'kiyoshi': 'Neutral', 'lulu': 'Female', 'florine': 'Female', 'lula': 'Female', 'chantelle': 'Female', 'ismet': 'Male', 'aolani': 'Female', 'margaux': 'Female', 'terrie': 'Neutral', 'dequan': 'Male', 'rockwell': 'Neutral', 'chrystal': 'Female', 'annora': 'Female', 'terris': 'Neutral', 'rasheed': 'Male', 'lexie': 'Female', 'maddy': 'Neutral', 'mekelle': 'Female', 'maddi': 'Female', 'hanna': 'Female', 'nili': 'Neutral', 'freja': 'Female', 'dorcas': 'Female', 'takako': 'Female', 'maddisyn': 'Female', 'kolya': 'Male', 'zarek': 'Male', 'lewis': 'Male', 'vondra': 'Female', 'zareb': 'Male', 'rowena': 'Female', 'philana': 'Female', 'kimbell': 'Neutral', 'ladarius': 'Male', 'carie': 'Female', 'gaius': 'Male', 'charlott': 'Female', 'skye': 'Neutral', 'cashlin': 'Female', 'carin': 'Female', 'thresa': 'Female', 'aldo': 'Male', 'gideon': 'Male', 'alda': 'Female', 'roseanne': 'Female', 'idalia': 'Female', 'roseanna': 'Female', 'lainey': 'Female', 'iluminada': 'Female', 'meged': 'Neutral', 'izetta': 'Female', 'priscila': 'Female', 'stasia': 'Female', 'johanna': 'Female', 'chanel': 'Female', 'johanne': 'Female', 'valorie': 'Female', 'concha': 'Female', 'ema': 'Female', 'runa': 'Female', 'rune': 'Neutral', 'kalista': 'Female', 'mustafa': 'Male', 'anders': 'Male', 'korbin': 'Male', 'lanette': 'Female', 'westley': 'Male', 'forster': 'Male', 'bobbye': 'Female', 'anfernee': 'Male', 'bayard': 'Male', 'carleigh': 'Female', 'mitch': 'Male', 'quyen': 'Female', 'brewster': 'Male', 'iram': 'Male', 'heba': 'Female', 'jamaal': 'Male', 'josefina': 'Female', 'josefine': 'Female', 'petronella': 'Female', 'wm': 'Male', 'ila': 'Female', 'coy': 'Neutral', 'kason': 'Male', 'lehana': 'Female', 'kanesha': 'Female', 'nelda': 'Female', 'fruma': 'Female', 'courtland': 'Male', 'brad': 'Male', 'bran': 'Male', 'tona': 'Female', 'cascata': 'Female', 'toni': 'Neutral', 'laquan': 'Male', 'serwa': 'Female', 'jaye': 'Female', 'apolonia': 'Female', 'tony': 'Neutral', 'genevieve': 'Female', 'priscilla': 'Female', 'tully': 'Neutral', 'noel': 'Neutral', 'sachi': 'Female', 'sacha': 'Neutral', 'selia': 'Female', 'elvera': 'Female', 'terentia': 'Female', 'jafaru': 'Male', 'analiese': 'Female', 'giacomo': 'Male', 'bluma': 'Female', 'remy': 'Neutral', 'lashaunda': 'Female', 'remi': 'Neutral', 'micheal': 'Male', 'rema': 'Female', 'dionysus': 'Male', 'savanna': 'Female', 'tennille': 'Female', 'audrea': 'Female', 'nitza': 'Female', 'audrey': 'Female', 'ilya': 'Male', 'antonina': 'Female', 'idande': 'Male', 'yoselin': 'Female', 'jerry': 'Neutral', 'cecil': 'Male', 'miyo': 'Female', 'eljah': 'Male', 'yeriel': 'Neutral', 'marjean': 'Female', 'miya': 'Female', 'jerri': 'Neutral', 'hank': 'Male', 'suki': 'Female', 'hanh': 'Female', 'domitila': 'Female', 'horus': 'Male', 'evie': 'Female', 'hana': 'Female', 'nia': 'Female', 'hang': 'Female', 'lyndon': 'Neutral', 'olesia': 'Female', 'hans': 'Male', 'bilen': 'Male', 'niv': 'Neutral', 'darla': 'Female', 'kolton': 'Neutral', 'rebbecca': 'Female', 'kyla': 'Female', 'thu': 'Female', 'min': 'Female', 'kyle': 'Neutral', 'thi': 'Female', 'taina': 'Female', 'pearline': 'Female', 'opa': 'Female', 'kala': 'Female', 'kalb': 'Male', 'ivette': 'Female', 'kali': 'Female', 'newton': 'Male', 'roderick': 'Male', 'reatha': 'Female', 'tinisha': 'Female', 'mohamed': 'Male', 'jose': 'Male', 'veola': 'Female', 'kaloosh': 'Male', 'cornell': 'Male', 'ceana': 'Female', 'josh': 'Male', 'joss': 'Neutral', 'anamaria': 'Female', 'slade': 'Male', 'joeann': 'Female', 'maye': 'Female', 'althea': 'Female', 'maya': 'Female', 'gregg': 'Male', 'devaughn': 'Male', 'aram': 'Male', 'redell': 'Neutral', 'kuniko': 'Female', 'elwanda': 'Female', 'zulema': 'Female', 'athalia': 'Female', 'meghann': 'Female', 'dimitri': 'Male', 'theola': 'Female', 'neva': 'Female', 'pancho': 'Male', 'chenoa': 'Female', 'jeffery': 'Male', 'zaide': 'Female', 'annick': 'Female', 'ikia': 'Female', 'columbus': 'Male', 'hazel': 'Female', 'sadie': 'Female', 'lucille': 'Female', 'lucilla': 'Female', 'azra': 'Neutral', 'posy': 'Female', 'maleah': 'Female', 'coral': 'Female', 'dotty': 'Female', 'jacquez': 'Male', 'cherish': 'Female', 'shantel': 'Female', 'cherise': 'Female', 'jacques': 'Male', 'cathrine': 'Female', 'raiden': 'Male', 'lois': 'Female', 'romaine': 'Female', 'yanni': 'Neutral', 'laval': 'Neutral', 'lewa': 'Female', 'quiana': 'Female', 'wan': 'Female', 'wai': 'Female', 'marcelene': 'Female', 'jaxon': 'Male', 'jinny': 'Female', 'aurelia': 'Female', 'aurelio': 'Male', 'lenita': 'Female', 'bettie': 'Female', 'okoth': 'Neutral', 'weldon': 'Male', 'elenor': 'Female', 'jayvon': 'Male', 'otilia': 'Female', 'leilani': 'Female', 'marrim': 'Neutral', 'zahur': 'Male', 'charlene': 'Female', 'isis': 'Female', 'emil': 'Male', 'mareli': 'Female', 'yardley': 'Neutral', 'kameron': 'Neutral', 'crystal': 'Female', 'maximus': 'Male', 'marely': 'Female', 'wilhelmina': 'Female', 'michiko': 'Female', 'geralyn': 'Female', 'abrianna': 'Female', 'julisa': 'Female', 'najee': 'Male', 'rach': 'Neutral', 'ezekiel': 'Male', 'maile': 'Female', 'octavius': 'Male', 'maili': 'Female', 'doyt': 'Male', 'jona': 'Female', 'kelsie': 'Female', 'jong': 'Female', 'jone': 'Female', 'topper': 'Neutral', 'joni': 'Female', 'tess': 'Female', 'jeremey': 'Male', 'irma': 'Female', 'alfonzo': 'Male', 'welcome': 'Female', 'walton': 'Male', 'yulanda': 'Female', 'omega': 'Neutral', 'dulce': 'Female', 'ethelyn': 'Female', 'daulton': 'Male', 'myah': 'Female', 'loyal': 'Neutral', 'damion': 'Male', 'angelyn': 'Female', 'paige': 'Neutral', 'tulla': 'Female', 'shaunte': 'Female', 'sandie': 'Neutral', 'hedya': 'Female', 'shaunta': 'Female', 'kita': 'Female', 'mandie': 'Neutral', 'anana': 'Female', 'delbert': 'Male', 'obdulia': 'Female', 'dalton': 'Male', 'zona': 'Female', 'dewayne': 'Male', 'fredy': 'Male', 'alani': 'Female', 'librada': 'Female', 'donnel': 'Male', 'melonie': 'Female', 'alana': 'Female', 'hellen': 'Female', 'rosemarie': 'Female', 'zhane': 'Female', 'ronan': 'Neutral', 'hannah': 'Female', 'liluye': 'Female', 'guenevere': 'Female', 'arabella': 'Female', 'hannan': 'Neutral', 'margarito': 'Male', 'berti': 'Neutral', 'elinore': 'Female', 'margarite': 'Female', 'margarita': 'Female', 'brilane': 'Neutral', 'arkadiy': 'Male', 'eden': 'Neutral', 'gus': 'Male', 'gur': 'Male', 'euridice': 'Female', 'guy': 'Male', 'ashely': 'Female', 'ezra': 'Male', 'sulis': 'Female', 'ilda': 'Female', 'jackqueline': 'Female', 'dillian': 'Neutral', 'shemika': 'Female', 'kaspar': 'Male', 'jaidyn': 'Neutral', 'roselia': 'Female', 'rendor': 'Male', 'haru': 'Male', 'barbie': 'Female', 'tekli': 'Female', 'eliza': 'Female', 'celestine': 'Female', 'celestina': 'Female', 'ardis': 'Female', 'sharen': 'Female', 'sharee': 'Female', 'dangelo': 'Male', 'alina': 'Female', 'stefan': 'Male', 'aline': 'Female', 'zelig': 'Male', 'dedra': 'Female', 'blondell': 'Female', 'jerica': 'Female', 'lefty': 'Male', 'giles': 'Male', 'janessa': 'Female', 'kenyatta': 'Female', 'daunte': 'Male', 'pallaton': 'Male', 'shawnta': 'Female', 'buck': 'Male', 'hildegarde': 'Female', 'silvain': 'Male', 'nereida': 'Female', 'nakita': 'Female', 'franklin': 'Neutral', 'kemp': 'Male', 'phyliss': 'Female', 'hamza': 'Male', 'nyoka': 'Neutral', 'nikhil': 'Male', 'markel': 'Male', 'ciel': 'Female', 'nero': 'Male', 'brogan': 'Male', 'mckenna': 'Neutral', 'angelo': 'Male', 'shaylee': 'Female', 'heaven': 'Female', 'angele': 'Female', 'lasandra': 'Female', 'angela': 'Female', 'edmundo': 'Male', 'livi': 'Female', 'shondra': 'Female', 'bellini': 'Female', 'nguyet': 'Female', 'jailyn': 'Female', 'geordi': 'Male', 'carissa': 'Female', 'detra': 'Female', "m'shell": 'Female', 'brayden': 'Neutral', 'abner': 'Male', 'dmitri': 'Male', 'trang': 'Female', 'cai': 'Female', 'hope': 'Female', 'cam': 'Neutral', 'cal': 'Neutral', 'tasya': 'Female', 'fulton': 'Male', 'natasha': 'Female', 'gaston': 'Male', 'ahava': 'Female', 'dashawn': 'Male', 'chip': 'Male', 'carroll': 'Neutral', 'kaiya': 'Female', 'arleen': 'Female', 'earleen': 'Female', 'galen': 'Male', 'hakeem': 'Male', 'toshiko': 'Female', 'fronde': 'Female', 'tiesha': 'Female', 'chia': 'Female', 'domenica': 'Female', 'mckile': 'Neutral', 'josue': 'Male', 'alysa': 'Female', 'alyse': 'Female', 'keshawn': 'Male', 'placido': 'Male', 'osborne': 'Male', 'adem': 'Male', 'jaxson': 'Male', 'aden': 'Male', 'niran': 'Male', 'kuri': 'Male', 'analise': 'Female', 'irwin': 'Male', 'benny': 'Male', 'kura': 'Female', 'morela': 'Female', 'amarion': 'Male', 'jayleen': 'Female', 'eneida': 'Female', 'kurt': 'Male', 'tyrel': 'Male', 'michel': 'Male', 'ulan': 'Female', 'tanja': 'Female', 'colt': 'Male', 'hortensia': 'Female', 'brain': 'Male', 'colm': 'Male', 'tavia': 'Female', 'cole': 'Male', 'rosetta': 'Female', 'jenette': 'Female', 'rosette': 'Female', 'willow': 'Female', 'karlene': 'Female', 'saxon': 'Neutral', 'trilby': 'Neutral', 'tiara': 'Female', 'shayla': 'Female', 'evon': 'Female', 'noe': 'Neutral', 'lyndia': 'Female', 'sherine': 'Female', 'edmond': 'Male', 'flint': 'Male', 'perdy': 'Female', 'keefe': 'Male', 'cyrah': 'Female', 'alisa': 'Female', 'reiko': 'Female', 'alise': 'Female', 'jamey': 'Male', 'january': 'Female', 'kerr': 'Neutral', 'magar': 'Male', 'kern': 'Neutral', 'magan': 'Neutral', 'kyne': 'Male', 'jamel': 'Male', 'keri': 'Neutral', 'kera': 'Female', 'deonta': 'Male', 'ed': 'Male', 'kane': 'Male', 'bradlee': 'Male', 'hildegard': 'Female', 'cecille': 'Female', 'kana': 'Male', 'bradley': 'Male', 'sariah': 'Female', 'micol': 'Female', 'fredrick': 'Male', 'rasha': 'Female', 'aleena': 'Female', 'jemma': 'Female', 'shenna': 'Female', 'lasca': 'Neutral', 'dannette': 'Female', 'jalil': 'Female', 'carr': 'Male', 'shanell': 'Female', 'hiram': 'Male', 'visola': 'Female', 'cari': 'Female', 'carl': 'Male', 'marina': 'Female', 'cara': 'Female', 'marine': 'Female', 'bebhin': 'Female', 'andralyn': 'Female', 'davian': 'Male', 'ardath': 'Female', 'arnaud': 'Male', 'malcom': 'Male', 'terryal': 'Neutral', 'lindsey': 'Female', 'essie': 'Female', 'fondea': 'Female', 'halle': 'Female', 'gella': 'Female', 'adara': 'Female', 'odalis': 'Female', 'rina': 'Female', 'towanda': 'Female', 'gertrud': 'Female', 'twanna': 'Female', 'garrick': 'Male', 'carson': 'Neutral', 'haelie': 'Female', 'joseph': 'Male', 'desmond': 'Male', 'dawne': 'Female', 'dawna': 'Female', 'frasier': 'Male', 'dolan': 'Male', 'colten': 'Male', 'demetrius': 'Male', 'shanel': 'Female', 'soren': 'Male', 'thad': 'Male', 'ordell': 'Neutral', 'colter': 'Male', 'noriko': 'Female', 'thao': 'Female', 'than': 'Male', 'alethia': 'Female', 'sheadon': 'Male', 'kassidy': 'Female', 'maddock': 'Male', 'velva': 'Female', 'delia': 'Female', 'madelene': 'Female', 'angel': 'Neutral', 'donnica': 'Female', 'craig': 'Male', 'marilou': 'Female', 'ladawn': 'Female', 'danial': 'Male', 'alaura': 'Female', 'deliz': 'Female', 'berny': 'Neutral', 'annelle': 'Female', 'leatrice': 'Female', 'tanesha': 'Female', 'berni': 'Neutral', 'shizuko': 'Female', 'berna': 'Female', 'natividad': 'Male', 'santiago': 'Male', 'chelsy': 'Female', 'kyung': 'Female', 'klitos': 'Male', 'anissa': 'Female', 'roxie': 'Female', 'chelsi': 'Female', 'keir': 'Neutral', 'svein': 'Male', 'america': 'Female', 'chelsa': 'Female', 'michelle': 'Neutral', 'renae': 'Female', 'felimy': 'Male', 'renay': 'Female', 'ismael': 'Male', 'abraham': 'Male', 'tallulah': 'Female', 'kenda': 'Female', 'meshal': 'Neutral', 'german': 'Male', 'kendi': 'Neutral', 'lashawna': 'Female', 'fletcher': 'Male', 'julene': 'Female', 'dougal': 'Male', 'renaldo': 'Male', 'mitzi': 'Female', 'september': 'Female', 'evelien': 'Female', 'sierra': 'Female', 'oksana': 'Female', 'loyce': 'Female', 'chantal': 'Female', 'yelena': 'Female', 'cannon': 'Male', 'samuel': 'Male', 'ossian': 'Neutral', 'truly': 'Female', 'chantay': 'Female', 'kiki': 'Female', 'belita': 'Female', 'trula': 'Female', 'sascha': 'Neutral', 'arly': 'Female', 'javonte': 'Male', 'shacher': 'Neutral', 'amanda': 'Female', 'godana': 'Male', 'yamilet': 'Female', 'sidonia': 'Female', 'sidonie': 'Female', 'analu': 'Male', 'lizzette': 'Female', 'yamilex': 'Female', 'danae': 'Female', 'waggoner': 'Male', 'kiele': 'Female', 'yazmin': 'Female', 'herschel': 'Male', 'lonnie': 'Male', 'zola': 'Female', 'willard': 'Male', 'lonnit': 'Neutral', 'elease': 'Female', 'gaylene': 'Female', 'nathaniel': 'Male', 'yuma': 'Male', 'laurinda': 'Female', 'atira': 'Female', 'ricarda': 'Female', 'yaholo': 'Male', 'moana': 'Female', 'meggan': 'Female', 'janeen': 'Female', 'leanna': 'Female', 'randolph': 'Male', 'javier': 'Male', 'jinelle': 'Female', 'izzie': 'Neutral', 'mona': 'Female', 'nila': 'Female', 'shakita': 'Female', 'vui': 'Female', 'aure': 'Neutral', 'aura': 'Female', 'kadence': 'Female', 'chaya': 'Female', 'britni': 'Female', 'lacie': 'Female', 'amina': 'Female', 'britny': 'Female', 'iola': 'Female', 'mariela': 'Female', 'jeane': 'Female', 'callista': 'Female', 'jeana': 'Female', 'jovan': 'Male', 'oliver': 'Neutral', 'hiroko': 'Female', 'idana': 'Female', 'porsche': 'Female', 'madelaine': 'Female', 'claris': 'Female', 'marinda': 'Female', 'caren': 'Female', 'tawnya': 'Female', 'odessa': 'Female', 'amani': 'Female', 'keeya': 'Female', 'amana': 'Female', 'elvis': 'Male', 'rubi': 'Female', 'draven': 'Male', 'elvin': 'Male', 'elvia': 'Female', 'elvie': 'Female', 'jeneva': 'Female', 'keon': 'Male', 'taunya': 'Female', 'merrie': 'Female', 'valeri': 'Female', 'maryam': 'Female', 'valery': 'Female', 'bevis': 'Male', 'bian': 'Female', 'bertille': 'Female', 'kenyi': 'Male', 'yuette': 'Female', 'susy': 'Female', 'kenya': 'Female', 'petunia': 'Female', 'darryl': 'Male', 'esteban': 'Male', 'lelia': 'Female', 'cassie': 'Female', 'tristian': 'Male', 'lita': 'Female', 'noble': 'Male', 'lakin': 'Neutral', 'bradyn': 'Male', 'lakia': 'Female', 'lavelle': 'Female', 'terah': 'Female', 'mafalda': 'Female', 'arnoldo': 'Male', 'moyna': 'Female', 'bryce': 'Male', 'darcey': 'Female', 'lourine': 'Female', 'darcel': 'Female', 'noam': 'Male', 'frankie': 'Neutral', 'noah': 'Male', 'toby': 'Neutral', 'alissa': 'Female', 'semaj': 'Male', 'tobi': 'Female', 'sheldon': 'Neutral', 'lahoma': 'Female', 'gail': 'Female', 'kareen': 'Female', 'xena': 'Female', 'kareem': 'Male', 'ami': 'Female', 'keshaun': 'Male', 'cortney': 'Female', 'read': 'Male', 'selma': 'Female', 'earle': 'Male', 'amy': 'Female', 'earnest': 'Male', 'jerold': 'Male', 'galvin': 'Male', 'reynard': 'Male', 'rebecca': 'Female', 'yasuko': 'Female', 'rebekkah': 'Female', 'velia': 'Female', 'fortune': 'Male', 'miracle': 'Neutral', 'vena': 'Female', 'giuseppe': 'Male', 'ardella': 'Female', 'zackary': 'Male', 'vahe': 'Male', 'myong': 'Female', 'eddie': 'Male', 'zsazsa': 'Female', 'audrie': 'Female', 'guillermo': 'Male', 'osmond': 'Male', 'audria': 'Female', 'ruthe': 'Female', 'regina': 'Female', 'regine': 'Female', 'willis': 'Male', 'debera': 'Female', 'garret': 'Male', 'willia': 'Female', 'willie': 'Neutral', 'sixta': 'Female', 'thron': 'Male', 'shayne': 'Male', 'francie': 'Female', 'shayna': 'Female', 'nissa': 'Female', 'artie': 'Male', 'barrie': 'Female', 'raul': 'Male', 'francis': 'Neutral', 'sherill': 'Female', 'brighton': 'Neutral', 'rodolfo': 'Male', 'aphrodite': 'Female', 'joylyn': 'Female', 'darshan': 'Male', 'sherly': 'Female', 'journey': 'Female', 'parson': 'Neutral', 'loree': 'Female', 'mamie': 'Female', 'nuri': 'Neutral', 'nura': 'Female', 'yanira': 'Female', 'thanos': 'Male', 'nuru': 'Neutral', 'stesha': 'Male', 'bronwyn': 'Female', 'loe': 'Neutral', 'aren': 'Male', 'mircea': 'Female', 'lon': 'Male', 'hertz': 'Male', 'liana': 'Female', 'liane': 'Female', 'herta': 'Female', 'marilu': 'Female', 'starr': 'Female', 'valencia': 'Female', 'cillian': 'Male', 'joanie': 'Female', 'lourie': 'Female', 'wynell': 'Female', 'synthia': 'Female', 'jalon': 'Male', 'freddi': 'Neutral', 'minna': 'Female', 'jayla': 'Female', 'stanford': 'Male', 'fredda': 'Female', 'emelia': 'Female', 'alvera': 'Female', 'tavon': 'Male', 'freddy': 'Neutral', 'miguel': 'Male', 'monita': 'Female', 'braiden': 'Male', 'toney': 'Male', 'lashay': 'Female', 'isaiah': 'Male', 'keahi': 'Neutral', 'mutia': 'Female', 'catrin': 'Female', 'saturnina': 'Female', 'synclair': 'Male', 'arcelia': 'Female', 'knut': 'Male', 'yon': 'Female', 'vickie': 'Female', 'eufemia': 'Female', 'eduardo': 'Male', 'jennessa': 'Female', 'ludie': 'Female', 'okapi': 'Neutral', 'maybelle': 'Female', 'berenice': 'Female', 'shantay': 'Female', 'ileen': 'Female', 'maitland': 'Neutral', 'arianna': 'Female', 'alvina': 'Female', 'arianne': 'Female', 'shantae': 'Female', 'carlie': 'Female', 'isanne': 'Female', 'giorgio': 'Male', 'monte': 'Male', 'donita': 'Female', 'blanche': 'Female', 'marenda': 'Female', 'mireille': 'Female', 'cameron': 'Neutral', 'ryland': 'Neutral', 'aubree': 'Female', 'monty': 'Male', 'antoinette': 'Female', 'griffin': 'Male', 'elian': 'Male', 'destany': 'Female', 'daniella': 'Female', 'foster': 'Male', 'danielle': 'Female', 'daisey': 'Female', 'hortencia': 'Female', 'eulalia': 'Female', 'jensen': 'Neutral', 'augustin': 'Male', 'sasha': 'Neutral', 'vera': 'Female', 'hila': 'Female', 'frederic': 'Male', 'elenka': 'Female', 'candida': 'Female', 'slone': 'Male', 'candide': 'Female', 'shenita': 'Female', 'carlena': 'Female', 'carlene': 'Female', 'louis': 'Neutral', 'sanne': 'Female', 'magdalene': 'Female', 'louie': 'Male', 'alene': 'Female', 'yukio': 'Male', 'alena': 'Female', 'gayle': 'Female', 'gayla': 'Female', 'juandalynn': 'Female', 'nautica': 'Female', 'naima': 'Female', 'lulli': 'Female', 'nani': 'Female', 'catrice': 'Female', 'leora': 'Female', 'nana': 'Female', 'karna': 'Female', 'edana': 'Female', 'bryton': 'Male', 'hateya': 'Female', 'mili': 'Female', 'deborah': 'Female', 'lavonda': 'Female', 'betsey': 'Female', 'melissia': 'Female', 'noelani': 'Female', 'kimi': 'Female', 'kimo': 'Male', 'tandice': 'Female', 'cearo': 'Male', 'hyroniemus': 'Male', 'loma': 'Female', 'starla': 'Female', 'tranquilla': 'Female', 'rori': 'Neutral', 'cathi': 'Female', 'reena': 'Female', 'asa': 'Neutral', 'rory': 'Neutral', 'cathy': 'Female', 'caroyln': 'Female', 'tuwa': 'Female', 'mallie': 'Female', 'virgina': 'Female', 'toya': 'Female', 'agamemnon': 'Male', 'donnie': 'Male', 'sydnie': 'Female', 'thatcher': 'Male', 'gaynell': 'Female', 'aimee': 'Female', 'randall': 'Male', 'zacharie': 'Male', 'simba': 'Male', 'Male': 'Male', 'thalassa': 'Female', 'kittie': 'Female', 'gricelda': 'Female', 'yasmeen': 'Female', 'zora': 'Female', 'petronila': 'Female', 'gaetan': 'Male', 'verena': 'Female', 'macha': 'Neutral', 'markita': 'Female', 'freda': 'Female', 'filiberto': 'Male', 'joselin': 'Female', 'dion': 'Neutral', 'lazaro': 'Male', 'dior': 'Neutral', 'kendra': 'Female', 'georgeann': 'Female', 'lavona': 'Female', 'peale': 'Neutral', 'lavone': 'Female', 'lavonn': 'Female', 'nina': 'Female', 'cathryn': 'Female', 'ronat': 'Female', 'alyssa': 'Female', 'abram': 'Male', 'marget': 'Female', 'alba': 'Female', 'lisabeth': 'Female', 'sharan': 'Female', 'celina': 'Female', 'lawana': 'Female', 'iona': 'Female', 'celine': 'Female', 'ione': 'Female', 'jeanie': 'Female', 'dasia': 'Female', 'kedem': 'Male', 'clarke': 'Male', 'lyre': 'Neutral', 'jalisa': 'Female', 'paloma': 'Female', 'clotilde': 'Female', 'rhoswen': 'Female', 'jarrett': 'Male', 'malka': 'Female', 'fe': 'Female', 'ardice': 'Female', 'ulrike': 'Female', 'xaviera': 'Female', 'angila': 'Female', 'aletha': 'Female', 'jodie': 'Neutral', 'tristessa': 'Female', 'kirstie': 'Female', 'kirstin': 'Female', 'mylee': 'Female', 'penda': 'Female', 'eron': 'Male', 'imanol': 'Male', 'biton': 'Male', 'sook': 'Female', 'philantha': 'Female', 'norene': 'Female', 'soon': 'Female', 'ashanti': 'Female', 'eros': 'Male', 'kordell': 'Neutral', 'kaori': 'Male', 'brittnee': 'Female', 'leticia': 'Female', 'brittney': 'Female', 'katelynn': 'Female', 'jaunita': 'Female', 'yi': 'Female', 'malina': 'Female', 'shaquita': 'Female', 'dyre': 'Neutral', 'elenore': 'Female', 'tamisha': 'Female', 'bernetta': 'Female', 'zimri': 'Female', 'masako': 'Female', 'eugenia': 'Female', 'sharonda': 'Female', 'yu': 'Female', 'henriette': 'Female', 'bryan': 'Male', 'kasey': 'Neutral', 'ife': 'Male', 'fairy': 'Female', 'kasen': 'Male', 'maha': 'Female', 'neil': 'Male', 'khalilah': 'Female', 'haley': 'Female', 'eladia': 'Female', 'todd': 'Male', 'mettabel': 'Neutral', 'halen': 'Male', 'raymond': 'Male', 'shamara': 'Female', 'marcie': 'Female', 'marcia': 'Female', 'robert': 'Male', 'glendora': 'Female', 'douglas': 'Male', 'hayden': 'Neutral', 'haydee': 'Female', 'desiderio': 'Male', 'bast': 'Male', 'dunn': 'Male', 'florance': 'Female', 'matha': 'Female', 'osbaldo': 'Male', 'dung': 'Female', 'kaydence': 'Female', 'spenser': 'Male', 'darius': 'Male', 'johnnie': 'Neutral', 'terisa': 'Female', 'ash': 'Neutral', 'lissette': 'Female', 'bash': 'Male', 'benjy': 'Male', 'phiala': 'Female', 'sondra': 'Female', 'lavinia': 'Female', 'daisy': 'Female', 'carline': 'Female', 'imelda': 'Female', 'clitus': 'Male', 'treasa': 'Female', 'mahon': 'Male', 'tanna': 'Female', 'elden': 'Male', 'yair': 'Neutral', 'misu': 'Neutral', 'miss': 'Female', 'maple': 'Female', 'blondelle': 'Female', 'bakula': 'Neutral', 'darrion': 'Male', 'blossom': 'Female', 'deanne': 'Female', 'edda': 'Female', 'deanna': 'Female', 'leavitt': 'Male', 'cairbre': 'Male', 'eddy': 'Male', 'breanne': 'Female', 'jayden': 'Neutral', 'breanna': 'Female', 'jarvis': 'Male', 'candance': 'Female', 'jamil': 'Male', 'hermila': 'Female', 'rockne': 'Male', 'yasin': 'Neutral', 'bowen': 'Male', 'norma': 'Female', 'jamie': 'Neutral', 'xandy': 'Neutral', 'trapper': 'Neutral', 'lyndel': 'Female', 'jordan': 'Neutral', 'varen': 'Male', 'jamir': 'Male', 'gertie': 'Female', 'dagobert': 'Male', 'kianna': 'Female', 'maricela': 'Female', 'valdemar': 'Male', 'stu': 'Male', 'greg': 'Male', 'fausta': 'Female', 'kishi': 'Neutral', 'fausto': 'Male', 'garrison': 'Male', 'jakson': 'Male', 'kisha': 'Female', 'mickey': 'Neutral', 'charlotte': 'Female', 'kary': 'Female', 'kara': 'Female', 'kare': 'Male', 'kari': 'Female', 'karl': 'Male', 'lia': 'Female', 'lin': 'Female', 'madlyn': 'Female', 'liv': 'Neutral', 'dorla': 'Female', 'averie': 'Female', 'rhodes': 'Neutral', 'giselle': 'Female', 'liz': 'Female', 'kai': 'Neutral', 'kam': 'Female', 'freddie': 'Neutral', 'adonis': 'Male', 'rhiannon': 'Female', 'alpha': 'Female', 'kay': 'Female', 'mack': 'Male', 'tieler': 'Male', 'maci': 'Female', 'corazon': 'Female', 'jayna': 'Female', 'jayne': 'Female', 'totie': 'Female', 'denese': 'Female', 'clarisa': 'Female', 'phailin': 'Female', 'orde': 'Neutral', 'braulio': 'Male', 'ardell': 'Female', 'luyu': 'Female', 'baylie': 'Female', 'yadira': 'Female', 'leandra': 'Female', 'tenen': 'Male', 'leandro': 'Male', 'kinsey': 'Female', 'randi': 'Neutral', 'kaleb': 'Neutral', 'duncan': 'Male', 'kalen': 'Male', 'randa': 'Female', 'chiquita': 'Female', 'kalei': 'Neutral', 'artemus': 'Neutral', 'randy': 'Male', 'colby': 'Male', 'abeni': 'Female', 'lennon': 'Male', 'darwin': 'Male', 'christal': 'Female', 'khalida': 'Female', 'kaley': 'Neutral', 'jacksen': 'Male', 'lonna': 'Female', 'madelynn': 'Female', 'dinos': 'Male', 'williemae': 'Female', 'lonny': 'Male', 'kenzie': 'Neutral', 'julienne': 'Female', 'calliope': 'Female', 'rocco': 'Male', 'abigael': 'Female', 'alexander': 'Male', 'xzavier': 'Male', 'narain': 'Neutral', 'diedra': 'Female', 'brittania': 'Female', 'giona': 'Neutral', 'liora': 'Female', 'egil': 'Male', 'lesa': 'Female', 'charline': 'Female', 'maurice': 'Male', 'konnor': 'Male', 'manning': 'Neutral', 'kiral': 'Neutral', 'gavivi': 'Female', 'jacelyn': 'Female', 'angie': 'Female', 'tatiana': 'Female', 'patrina': 'Female', 'nathalia': 'Female', 'nasnan': 'Female', 'murron': 'Neutral', 'particia': 'Female', 'saniya': 'Female', 'dani': 'Female', 'mikaili': 'Neutral', 'kimberely': 'Female', 'zebulon': 'Male', 'keaton': 'Male', 'ashlie': 'Female', 'emogene': 'Female', 'buzz': 'Male', 'danette': 'Female', 'wilburn': 'Male', 'jeff': 'Male', 'lauryn': 'Female', 'sueann': 'Female', 'derik': 'Male', 'alesha': 'Female', 'tallys': 'Female', 'rudy': 'Neutral', 'eustolia': 'Female', 'orsin': 'Male', 'karla': 'Female', 'nikkolas': 'Male', 'karly': 'Female', 'forbes': 'Male', 'easton': 'Male', 'walter': 'Male', 'pranav': 'Male', 'iman': 'Neutral', 'samual': 'Male', 'elsa': 'Female', 'dulcie': 'Female', 'tracie': 'Female', 'else': 'Female', 'anthony': 'Male', 'elsy': 'Female', 'katherine': 'Female', 'marylou': 'Female', 'elsu': 'Male', 'zaza': 'Female', 'areli': 'Female', 'alika': 'Female', 'leya': 'Female', 'eda-mame': 'Female', 'wyatt': 'Male', 'luanne': 'Female', 'vernita': 'Female', 'kynthia': 'Female', 'zazu': 'Female', 'luanna': 'Female', 'luciana': 'Female', 'guido': 'Male', 'luciano': 'Male', 'paco': 'Male', 'mitchell': 'Male', 'nathanial': 'Male', 'esperanza': 'Female', 'lamonica': 'Female', 'brittny': 'Female', 'curtis': 'Male', 'tevin': 'Male', 'darrell': 'Male', 'fannie': 'Female', 'brittni': 'Female', 'eliana': 'Female', 'albany': 'Female', 'shaw': 'Male', 'grant': 'Male', 'shay': 'Neutral', 'marcelle': 'Female', 'marcella': 'Female', 'shad': 'Male', 'shae': 'Female', 'ester': 'Female', 'marcello': 'Male', 'shan': 'Female', 'allyson': 'Female', 'jacalyn': 'Female', 'blair': 'Neutral', 'monique': 'Female', 'tatum': 'Neutral', 'janean': 'Female', 'oringo': 'Male', 'arturo': 'Male', 'aizza': 'Female', 'zulma': 'Female', 'infinity': 'Neutral', 'chara': 'Female', 'crispin': 'Male', 'jeanelle': 'Female', 'alvin': 'Male', 'raquan': 'Male', 'ephraim': 'Male', 'afra': 'Female', 'teleza': 'Female', 'lynell': 'Female', 'mikkel': 'Neutral', 'carrigan': 'Neutral', 'myrtie': 'Female', 'yesenia': 'Female', 'yeardleigh': 'Neutral', 'nikki': 'Female', 'nikko': 'Male', 'myrtis': 'Female', 'jerod': 'Male', 'clovis': 'Male', 'rebeca': 'Female', 'lashunda': 'Female', 'albina': 'Female', 'marco': 'Male', 'marci': 'Female', 'reita': 'Female', 'trista': 'Female', 'marcy': 'Female', 'winford': 'Male', 'vanda': 'Female', 'jalynn': 'Female', 'amare': 'Male', 'alida': 'Female', 'amara': 'Female', 'hipolito': 'Male', 'katharyn': 'Female', 'auston': 'Male', 'moira': 'Female', 'dillan': 'Male', 'bartholemew': 'Male', 'donny': 'Male', 'asley': 'Female', 'valene': 'Female', 'donna': 'Female', 'vesta': 'Female', 'tokala': 'Male', 'selima': 'Female', 'ashia': 'Female', 'mauve': 'Female', 'erma': 'Female', 'pierre': 'Male', 'erme': 'Female', 'rosamond': 'Female', 'gracia': 'Female', 'kaliyah': 'Female', 'gracie': 'Female', 'jacey': 'Female', 'herma': 'Female', 'desean': 'Male', 'debra': 'Female', 'khiry': 'Neutral', 'lonato': 'Male', 'isiah': 'Male', 'sarahi': 'Female', 'delorse': 'Female', 'nella': 'Female', 'nelle': 'Female', 'laken': 'Female', 'nelly': 'Female', 'step': 'Male', 'macy': 'Female', 'mariyah': 'Female', 'contessa': 'Female', 'faith': 'Female', 'shing': 'Male', 'nabila': 'Female', 'shino': 'Male', 'zoltin': 'Male', 'eydie': 'Female', 'regenia': 'Female', 'hasad': 'Male', 'ide': 'Female', 'peri': 'Female', 'ida': 'Female', 'rollo': 'Male', 'keefer': 'Male', 'natalya': 'Female', 'maudie': 'Female', 'carlton': 'Male', 'aliyah': 'Female', 'mistico': 'Female', "d'estiny": 'Female', 'bendek': 'Male', 'dwayne': 'Male', 'alison': 'Female', 'kaylana': 'Female', 'latasha': 'Female', 'rayford': 'Male', 'zavad': 'Male', 'lakendra': 'Female', 'jennell': 'Female', 'zaila': 'Female', 'duena': 'Female', 'vernie': 'Female', 'selas': 'Neutral', 'vernia': 'Female', 'sherell': 'Female', 'larry': 'Male', 'reed': 'Neutral', 'selah': 'Female', 'paolo': 'Male', 'uta': 'Female', 'chelsey': 'Female', 'ute': 'Female', 'paola': 'Female', 'kenley': 'Neutral', 'deangelo': 'Male', 'velma': 'Female', 'malik': 'Male', 'chelsea': 'Female', 'malia': 'Female', 'willem': 'Male', 'shanice': 'Female', 'kayden': 'Neutral', 'snowy': 'Female', 'rupert': 'Male', 'oberon': 'Neutral', 'theodoros': 'Neutral', 'alastair': 'Male', 'nan': 'Female', 'nam': 'Female', 'beryl': 'Female', 'rosendo': 'Male', 'nat': 'Neutral', 'palti': 'Neutral', 'rosenda': 'Female', 'hayward': 'Male', 'kori': 'Female', 'jettie': 'Female', 'shanequa': 'Female', 'frances': 'Neutral', 'william': 'Male', 'tianna': 'Female', 'willian': 'Male', 'evan': 'Male', 'kory': 'Neutral', 'crissy': 'Female', 'nevan': 'Male', 'loegan': 'Male', 'allisenne': 'Female', 'heath': 'Male', 'tyreek': 'Male', 'ansley': 'Female', 'katy': 'Female', 'timberly': 'Female', 'izzi': 'Neutral', 'hilde': 'Female', 'morey': 'Neutral', 'hilda': 'Female', 'psyche': 'Female', 'kati': 'Female', 'vinnie': 'Male', 'izzy': 'Neutral', 'kato': 'Male', 'kata': 'Female', 'maiya': 'Female', 'kate': 'Female', 'rhonda': 'Female', 'arin': 'Female', 'baron': 'Male', 'oliva': 'Female', 'aria': 'Female', 'arif': 'Male', 'arie': 'Female', 'bronwen': 'Female', 'afton': 'Neutral', 'vaschel': 'Male', 'margene': 'Female', 'natashia': 'Female', 'carlin': 'Neutral', 'nichole': 'Female', 'colman': 'Male', 'dianthe': 'Female', 'kizzy': 'Neutral', 'maat': 'Male', 'wava': 'Female', 'prudence': 'Female', 'ocie': 'Female', 'fermina': 'Female', 'felicity': 'Female', 'randell': 'Male', 'kiandra': 'Female', 'panyin': 'Female', 'olaf': 'Male', 'kamren': 'Male', 'luthando': 'Male', 'kacela': 'Female', 'michael': 'Neutral', 'ryan': 'Neutral', 'gretta': 'Female', 'gualtier': 'Male', 'gwenn': 'Female', 'abigale': 'Female', 'barbara': 'Female', 'orma': 'Female', 'carter': 'Neutral', 'yosefu': 'Male', 'alvaro': 'Male', 'booth': 'Male', 'maragret': 'Female', 'ginata': 'Female', 'diallo': 'Male', 'quillan': 'Neutral', 'anjelita': 'Female', 'nicholas': 'Male', 'jasmyne': 'Female', 'madelia': 'Female', 'carrieann': 'Female', 'gainell': 'Female', 'mellisa': 'Female', 'jenise': 'Female', 'jubal': 'Male', 'ramsey': 'Male', 'ramses': 'Male', 'asuncion': 'Female', 'theressa': 'Female', 'micah': 'Neutral', 'alysha': 'Female', 'gent': 'Male', 'kalea': 'Female', 'corin': 'Female', 'justice': 'Neutral', 'chang': 'Male', 'gene': 'Male', 'chana': 'Female', 'sheilah': 'Female', 'nobuko': 'Female', 'gena': 'Female', 'clark': 'Male', 'clare': 'Female', 'clara': 'Female', 'danika': 'Female', 'devyn': 'Neutral', 'kamil': 'Male', 'darrien': 'Male', 'meliora': 'Female', 'christeen': 'Female', 'konala': 'Male', 'leopold': 'Male', 'hudson': 'Male', 'nodin': 'Male', 'deon': 'Neutral', 'amalie': 'Female', 'concepcion': 'Female', 'jonathan': 'Male', 'cerise': 'Female', 'cosmo': 'Male', 'hezekiah': 'Male', 'arella': 'Female', 'allyn': 'Female', 'isai': 'Male', 'mashaka': 'Neutral', 'greyson': 'Male', 'nyla': 'Female', 'justin': 'Male', 'fedella': 'Female', 'devona': 'Female', 'archer': 'Male', 'almeta': 'Female', 'catheryn': 'Female', 'kenny': 'Male', 'alayna': 'Female', 'vanetta': 'Female', 'pascha': 'Neutral', 'blaine': 'Neutral', 'lenora': 'Female', 'langer': 'Male', 'kenna': 'Female', 'lenore': 'Female', 'lorant': 'Neutral', 'melissan': 'Female', 'kayleigh': 'Female', 'querida': 'Female', 'kiah': 'Neutral', 'chanton': 'Female', 'lesley': 'Neutral', 'londyn': 'Female', 'leslee': 'Female', 'ferdinand': 'Male', 'talan': 'Male', 'nara': 'Female', 'marylouise': 'Female', 'edalene': 'Female', 'kaedan': 'Neutral', 'temima': 'Female', 'ronald': 'Neutral', 'yoshiko': 'Female', 'marylin': 'Female', 'jaali': 'Male', 'delena': 'Female', 'verlee': 'Female', 'jamila': 'Female', 'cassaundra': 'Female', 'kesin': 'Neutral', 'kesia': 'Female', 'shamus': 'Male', 'cinthia': 'Female', 'octavio': 'Male', 'ladon': 'Female', 'jacqui': 'Female', 'dovie': 'Female', 'jacque': 'Female', 'blake': 'Neutral', 'dakoda': 'Male', 'johnetta': 'Female', 'brook': 'Neutral', 'johnette': 'Female', 'kizzie': 'Female', 'topaza': 'Female', 'valarie': 'Female', 'nascha': 'Female', 'gwyneth': 'Female', 'matsu': 'Male', 'jennafer': 'Female', 'iyana': 'Female', 'kyleigh': 'Female', 'zeheb': 'Male', 'daija': 'Female', 'delcie': 'Female', 'ettie': 'Female', 'baxter': 'Male', 'janiece': 'Female', 'sanda': 'Female', 'naveen': 'Neutral', 'debroah': 'Female', 'sydni': 'Female', 'sandi': 'Neutral', 'austen': 'Male', 'emmitt': 'Male', 'britta': 'Female', 'brodie': 'Male', 'winta': 'Female', 'morton': 'Neutral', 'ogima': 'Neutral', 'sandy': 'Neutral', 'dorothea': 'Female', 'calix': 'Male', 'oralia': 'Female', 'braxton': 'Male', 'cleotilde': 'Female', 'nikia': 'Female', 'frye': 'Male', 'ricky': 'Neutral', 'brittanie': 'Female', 'syble': 'Female', 'siena': 'Female', 'jerad': 'Male', 'ricki': 'Female', 'marek': 'Neutral', 'brone': 'Neutral', 'maren': 'Female', 'miniya': 'Female', 'verdell': 'Female', 'torrey': 'Male', 'ianna': 'Female', 'maree': 'Female', 'sanjuanita': 'Female', 'jill': 'Female', 'nisha': 'Female', 'princess': 'Female', 'nishi': 'Female', 'jaquelyn': 'Female', 'kristyn': 'Female', 'kathryne': 'Female', 'florida': 'Female', 'guillermina': 'Female', 'ayanna': 'Female', 'aletta': 'Female', 'humphrey': 'Male', 'austin': 'Neutral', 'cristian': 'Male', 'leonore': 'Female', 'yong': 'Neutral', 'evans': 'Male', 'christoph': 'Neutral', 'evane': 'Male', 'barr': 'Neutral', 'brittnie': 'Female', 'deyanira': 'Female', 'bary': 'Male', 'lynnette': 'Female', 'britany': 'Female', 'pavel': 'Male', 'harmon': 'Male', 'townsend': 'Male', 'rosalva': 'Female', 'trava': 'Female', 'kylia': 'Female', 'joette': 'Female', 'mariana': 'Female', 'greta': 'Female', 'mariann': 'Female', 'irisa': 'Female', 'kozue': 'Neutral', 'joslyn': 'Female', 'machiko': 'Female', 'mellissa': 'Female', 'ben': 'Male', 'bel': 'Neutral', 'shalaidah': 'Female', 'bea': 'Female', 'zenon': 'Neutral', 'alecia': 'Female', 'elnora': 'Female', 'riya': 'Female', 'sharleen': 'Female', 'bev': 'Female', 'kellee': 'Female', 'ebonie': 'Female', 'napua': 'Female', 'julian': 'Neutral', 'kellen': 'Male', 'hermine': 'Female', 'miquel': 'Male', 'bertha': 'Female', 'daxton': 'Male', 'alisia': 'Female', 'kelley': 'Female', 'deasia': 'Female', 'presencia': 'Female', 'fineen': 'Female', 'luisa': 'Female', 'luise': 'Female', 'tomo': 'Male', 'ligia': 'Female', 'edris': 'Female', 'jalila': 'Female', 'jorge': 'Male', 'veronique': 'Female', 'montana': 'Neutral', 'edric': 'Male', 'adiel': 'Male', 'derwin': 'Male', 'wilfredo': 'Male', 'neetee': 'Female', 'pembroke': 'Neutral', 'calvine': 'Female', 'laurent': 'Male', 'hulda': 'Female', 'uri': 'Neutral', 'lanell': 'Female', 'laurena': 'Female', 'laurene': 'Female', 'asalie': 'Female', 'arlynda': 'Female', 'lorna': 'Female', 'parker': 'Neutral', 'chadwick': 'Male', 'lorne': 'Male', 'florentina': 'Female', 'iokina': 'Female', 'yael': 'Neutral', 'belkis': 'Female', 'semira': 'Female', 'florentino': 'Male', 'cyril': 'Male', 'perla': 'Female', 'cicely': 'Female', 'hada': 'Female', 'darby': 'Neutral', 'hector': 'Male', 'okalani': 'Female', 'ethan': 'Male', 'darrick': 'Male', 'aretha': 'Female', 'hastin': 'Male', 'maeryn': 'Neutral', 'boris': 'Male', 'misty': 'Female', 'bonaventure': 'Neutral', 'marvela': 'Female', 'anisha': 'Female', 'pilis': 'Female', 'kiefer': 'Male', 'bibiane': 'Female', 'izola': 'Female', 'emmet': 'Male', 'packard': 'Neutral', 'gray': 'Neutral', 'farrah': 'Female', 'jase': 'Male', 'mohammed': 'Male', 'shoshana': 'Female', 'tolla': 'Female', 'navarro': 'Male', 'felipe': 'Male', 'felipa': 'Female', 'kuper': 'Male', 'fionan': 'Male', 'bibi': 'Female', 'mikaila': 'Female', 'pricilla': 'Female', 'tammie': 'Female', 'tazanna': 'Female', 'luz': 'Female', 'calhoun': 'Male', 'tyra': 'Female', 'marsha': 'Female', 'lue': 'Female', 'elephteria': 'Female', 'joya': 'Female', 'aron': 'Male', 'joye': 'Female', 'dwain': 'Male', 'ken': 'Male', 'leyla': 'Female', 'thady': 'Male', 'merri': 'Female', 'kelan': 'Male', 'koren': 'Female', 'melda': 'Female', 'rueben': 'Male', 'erline': 'Female', 'aryanna': 'Female', 'amador': 'Male', 'merry': 'Female', 'khursten': 'Male', 'precious': 'Female', 'alishia': 'Female', 'olga': 'Female', 'syed': 'Male', 'ciera': 'Female', 'mindi': 'Female', 'davon': 'Male', 'minda': 'Female', 'christel': 'Female', 'christen': 'Female', 'rebekah': 'Female', 'dominique': 'Neutral', 'gita': 'Female', 'tirzah': 'Female', 'tuesday': 'Neutral', 'bronson': 'Male', 'denise': 'Female', 'oria': 'Female', 'johana': 'Female', 'willy': 'Male', 'sari': 'Female', 'sara': 'Female', 'yan': 'Female', 'pia': 'Female', 'willa': 'Female', 'quin': 'Neutral', 'katelin': 'Female', 'kingston': 'Male', 'raelene': 'Female', 'vince': 'Male', 'adsila': 'Female', 'deandrea': 'Female', 'shanton': 'Female', 'tandra': 'Female', 'brittaney': 'Female', 'taniel': 'Female', 'moya': 'Female', 'mickie': 'Neutral', 'heaton': 'Male', 'halley': 'Female', 'marleen': 'Female', 'macey': 'Female', 'heriberto': 'Male', 'kimball': 'Neutral', 'evelyn': 'Female', 'demi': 'Female', 'nilsa': 'Female', 'simone': 'Female', 'faylinn': 'Female', 'simona': 'Female', 'kortney': 'Female', 'yered': 'Male', 'chante': 'Female', 'solange': 'Female', 'oona': 'Female', 'malaya': 'Female', 'linwood': 'Male', 'grazyna': 'Female', 'maximos': 'Male', 'louvenia': 'Female', 'otelia': 'Female', 'lorretta': 'Female', 'pheonix': 'Neutral', 'mordechai': 'Male', 'ashley': 'Neutral', 'shalom': 'Male', 'phila': 'Female', 'shalon': 'Female', 'osric': 'Male', 'ashlee': 'Female', 'lashon': 'Female', 'ashlea': 'Female', 'bazyli': 'Male', 'dollie': 'Female', 'savannah': 'Female', 'sofia': 'Female', 'jamari': 'Male', 'eathan': 'Male', 'aleda': 'Female', 'laurel': 'Female', 'lauren': 'Neutral', 'nardo': 'Male', 'trudi': 'Female', 'vida': 'Female', 'trude': 'Female', 'patricia': 'Female', 'truda': 'Female', 'safara': 'Female', 'trudy': 'Female', 'nate': 'Male', 'kirra': 'Female', 'sonia': 'Female', 'kimbra': 'Female', 'laurine': 'Female', 'livia': 'Female', 'finnegan': 'Male', 'calandra': 'Female', 'hollye': 'Female', 'charlesetta': 'Female', 'lavonne': 'Female', 'eilis': 'Female', 'karmiti': 'Female', 'lavonna': 'Female', 'traelic': 'Neutral', 'denyse': 'Female', 'lincoln': 'Male', 'fernanda': 'Female', 'fernande': 'Female', 'fernando': 'Male', 'candy': 'Female', 'phyllis': 'Female', 'sissy': 'Female', 'dennise': 'Female', 'martin': 'Male', 'alycia': 'Female', 'page': 'Neutral', 'candi': 'Female', 'terrel': 'Male', 'magnar': 'Male', 'gillian': 'Female', 'shea': 'Neutral', 'delinda': 'Female', 'shel': 'Male', 'saige': 'Female', 'lorilee': 'Female', 'cleveland': 'Male', 'annett': 'Female', 'peter': 'Male', 'wendi': 'Female', 'nibal': 'Male', 'denali': 'Female', 'wenda': 'Female', 'christiane': 'Female', 'nibaw': 'Male', 'wendy': 'Female', 'roch': 'Female', 'fanny': 'Female', 'zizi': 'Female', 'nida': 'Neutral', 'annabella': 'Female', 'shakila': 'Female', 'everette': 'Male', 'vallerie': 'Female', 'camila': 'Female', 'myron': 'Male', 'francisca': 'Female', 'edita': 'Female', 'shavonne': 'Female', 'annabelle': 'Female', 'blythe': 'Female', 'addisyn': 'Female', 'jevon': 'Male', 'palila': 'Female', 'tereasa': 'Female', 'roden': 'Male', 'tressie': 'Female', 'rishi': 'Male', 'carolyn': 'Female', 'glenn': 'Neutral', 'sadiki': 'Neutral', 'washington': 'Male', 'madisenne': 'Female', 'terence': 'Neutral', 'raquel': 'Female', 'dunixi': 'Neutral', 'jina': 'Female', 'topaz': 'Neutral', 'dolores': 'Female', 'beaulah': 'Female', 'claral': 'Female', 'moina': 'Neutral', 'daniell': 'Female', 'daniela': 'Female', 'daniele': 'Female', 'aleisha': 'Female', 'elata': 'Female', 'rogelio': 'Male', 'kandi': 'Female', 'ean': 'Male', 'margy': 'Female', 'kande': 'Female', 'maisha': 'Female', 'marge': 'Female', 'kandy': 'Female', 'shirly': 'Female', 'noelia': 'Female', 'ha': 'Female', 'kathie': 'Female', 'brick': 'Male', 'astra': 'Female', 'margo': 'Female', 'pamala': 'Female', 'seoras': 'Male', 'zenaida': 'Female', 'pansy': 'Female', 'destanee': 'Female', 'beata': 'Female', 'beate': 'Male', 'lelah': 'Female', 'beatrice': 'Female', 'eris': 'Female', 'erin': 'Neutral', 'maura': 'Female', 'camryn': 'Neutral', 'conan': 'Male', 'erik': 'Male', 'penni': 'Female', 'eric': 'Male', 'mauro': 'Male', 'diego': 'Male', 'tyme': 'Neutral', 'barto': 'Male', 'mychal': 'Male', 'barth': 'Male', 'germaine': 'Female', 'malachi': 'Male', 'morna': 'Female', 'donagh': 'Male', 'neely': 'Neutral', 'star': 'Female', 'makhi': 'Male', 'rayna': 'Female', 'karolyn': 'Female', 'rayne': 'Female', 'dewei': 'Male', 'stan': 'Male', 'howie': 'Male', 'spence': 'Male', 'dewey': 'Male', 'kaiden': 'Male', 'katherina': 'Female', 'zenia': 'Female', 'quinten': 'Male', 'elsie': 'Female', 'talisa': 'Female', 'imani': 'Female', 'moshe': 'Male', 'dillion': 'Male', 'kymberly': 'Female', 'augustina': 'Female', 'augustine': 'Neutral', 'phung': 'Female', 'aiden': 'Male', 'andre': 'Neutral', 'fredric': 'Male', 'andra': 'Female', 'winfred': 'Male', 'buddy': 'Male', 'marcos': 'Male', 'tobie': 'Female', 'marnin': 'Neutral', 'krysten': 'Female', 'nizana': 'Female', 'tristana': 'Female', 'cailean': 'Female', 'dutch': 'Male', 'dorine': 'Female', 'wilfred': 'Male', 'joren': 'Neutral', 'deeanna': 'Female', 'raymon': 'Male', 'mozell': 'Female', 'waldo': 'Male', 'walda': 'Female', 'herbert': 'Male', 'elissa': 'Female', 'bevan': 'Male', 'lavern': 'Female', 'maurita': 'Female', 'darrian': 'Male', 'cyrstal': 'Female', 'samara': 'Female', 'thandeka': 'Female', 'bryana': 'Female', 'eldon': 'Male', 'savea': 'Female', 'tameka': 'Female', 'cesar': 'Male', 'quito': 'Male', 'nen': 'Male', 'jordon': 'Male', 'krissy': 'Female', 'ned': 'Male', 'briley': 'Female', 'asia': 'Female', 'hajari': 'Male', 'yonah': 'Male', 'kalyca': 'Female', 'maverick': 'Neutral', 'deante': 'Male', 'mee': 'Female', 'meg': 'Female', 'mea': 'Female', 'ossie': 'Male', 'satinka': 'Female', 'filbert': 'Male', 'mel': 'Neutral', 'henrik': 'Male', 'mei': 'Female', 'louanne': 'Female', 'drew': 'Neutral', 'marvene': 'Female', 'ghita': 'Female', 'giuseppina': 'Female', 'velika': 'Female', 'urbain': 'Neutral', 'golda': 'Female', 'cindi': 'Female', 'noya': 'Female', 'leland': 'Male', 'dru': 'Neutral', 'cinda': 'Female', 'jame': 'Male', 'omar': 'Male', 'cindy': 'Female', 'goldy': 'Female', 'jami': 'Female', 'keita': 'Female', 'joshua': 'Male', 'marquita': 'Female', 'reagan': 'Neutral', 'latifah': 'Female', 'moral': 'Neutral', 'janine': 'Female', 'janina': 'Female', 'unnamed': 'Male', 'chavi': 'Female', 'cali': 'Female', 'charlyn': 'Female', 'collene': 'Female', 'teli': 'Female', 'cala': 'Female', 'barke': 'Male', 'cale': 'Male', 'mekhi': 'Male', 'odele': 'Neutral', 'joycelyn': 'Female', 'oscar': 'Male', 'odell': 'Neutral', 'merle': 'Neutral', 'lazarus': 'Male', 'ward': 'Male', 'teofila': 'Female', 'rin': 'Neutral', 'flora': 'Female', 'lilliana': 'Female', 'norwood': 'Neutral', 'jereni': 'Female', 'rohan': 'Male', 'olen': 'Male', 'darleen': 'Female', 'jayda': 'Female', 'guban': 'Male', 'ilyssa': 'Female', 'giva': 'Female', 'twanda': 'Female', 'barbera': 'Female', 'burdette': 'Female', 'karole': 'Female', 'frieda': 'Female', 'joann': 'Female', 'kalene': 'Female', 'satu': 'Neutral', 'joane': 'Female', 'mariatu': 'Neutral', 'joana': 'Female', 'makani': 'Neutral', 'oretha': 'Female', 'allene': 'Female', 'quon': 'Male', 'edama-mae': 'Female', 'meayah': 'Female', 'becky': 'Female', 'kennan': 'Male', 'becki': 'Female', 'jesusita': 'Female', 'natacha': 'Female', 'aniya': 'Female', 'royce': 'Male', 'earnestine': 'Female', 'phyre': 'Neutral', 'janis': 'Female', 'janie': 'Female', 'jania': 'Female', 'ondrea': 'Female', 'macon': 'Male', 'leeanne': 'Female', 'leeanna': 'Female', 'murray': 'Neutral', 'helena': 'Female', 'helene': 'Female', 'oswald': 'Male', 'zachariah': 'Male', 'shawnee': 'Female', 'gitel': 'Female', 'teressa': 'Female', 'dereon': 'Male', 'erland': 'Male', 'eyal': 'Male', 'blodwyn': 'Female', 'terran': 'Neutral', 'jenis': 'Female', 'zohar': 'Male', 'fabiola': 'Female', 'ernesto': 'Male', 'taliyah': 'Female', 'madilynn': 'Female', 'hilzarie': 'Female', 'anaya': 'Female', 'lorena': 'Female', 'yihana': 'Female', 'riona': 'Female', 'lorene': 'Female', 'luce': 'Male', 'kynan': 'Neutral', 'bono': 'Male', 'mead': 'Neutral', 'raylene': 'Female', 'bona': 'Female', 'briana': 'Female', 'bong': 'Female', 'luci': 'Female', 'bond': 'Male', 'payton': 'Neutral', 'domenic': 'Male', 'aida': 'Female', 'charlsie': 'Female', 'aide': 'Female', 'tuari': 'Male', 'milan': 'Neutral', 'dima': 'Male', 'doug': 'Male', 'mikala': 'Female', 'dawn': 'Female', 'kathlene': 'Female', 'velvet': 'Female', 'kiet': 'Male', 'mandy': 'Neutral', 'obert': 'Neutral', 'content': 'Female', 'sparkle': 'Female', 'manda': 'Female', 'talen': 'Neutral', 'mandi': 'Neutral', 'ladonna': 'Female', 'kaeden': 'Male', 'dalva': 'Female', 'tasha': 'Female', 'ramon': 'Male', 'euphemia': 'Female', 'uriel': 'Male', 'harriet': 'Female', 'tyshawn': 'Male', 'leila': 'Female', 'kiley': 'Female', 'isa': 'Female', 'jaydin': 'Male', 'stewart': 'Male', 'andie': 'Neutral', 'justen': 'Male', 'vittorio': 'Male', 'adalia': 'Female', 'kaela': 'Female', 'johnpaul': 'Male', 'grady': 'Male', 'phylicia': 'Female', 'brock': 'Male', 'awilda': 'Female', 'bonita': 'Female', 'pelagia': 'Female', 'peggie': 'Female', 'kierra': 'Female', 'jeannetta': 'Female', 'garry': 'Male', 'agustina': 'Female', 'hailie': 'Female', 'abril': 'Female', 'zedekiah': 'Male', 'neveah': 'Female', 'dorathy': 'Female', 'philomena': 'Female', 'helen': 'Female', 'gretchen': 'Female', 'daina': 'Female', 'daine': 'Female', 'jerusha': 'Female', 'solomon': 'Male', 'minh': 'Male', 'jered': 'Male', 'shonna': 'Female', 'shaniya': 'Female', 'mina': 'Female', 'caleb': 'Male', 'jerel': 'Male', 'ginger': 'Female', 'ming': 'Female', 'amadahy': 'Female', 'sharyl': 'Female', 'catina': 'Female', 'latashia': 'Female', 'floramaria': 'Female', 'latona': 'Female', 'ilana': 'Female', 'gabriela': 'Female', 'gabriele': 'Female', 'thornton': 'Male', 'maryrose': 'Female', 'teagan': 'Neutral', 'deka': 'Neutral', 'corinna': 'Female', 'dessa': 'Female', 'koko': 'Female', 'raimi': 'Male', 'maris': 'Neutral', 'marin': 'Neutral', 'mario': 'Male', 'marie': 'Female', 'maria': 'Female', 'tilden': 'Male', 'doi': 'Neutral', 'don': 'Male', 'kazuko': 'Female', 'tashia': 'Female', 'jolynn': 'Female', 'sheryl': 'Female', 'kirabo': 'Neutral', 'mildred': 'Female', 'kristel': 'Female', 'dot': 'Female', 'kristen': 'Female', 'izak': 'Male', 'lasonya': 'Female', 'donella': 'Female', 'katerina': 'Female', 'liza': 'Female', 'katerine': 'Female', 'nevada': 'Female', 'azriel': 'Neutral', 'sugar': 'Female', 'kaikura': 'Male', 'lennie': 'Female', 'maryann': 'Female', 'monica': 'Female', 'abigayle': 'Female', 'brannon': 'Male', 'nuala': 'Female', 'charleigh': 'Male', 'nubia': 'Female', 'christopher': 'Male', 'monisha': 'Female', 'earl': 'Male', 'izellah': 'Female', 'samella': 'Female', 'ramonita': 'Female', 'kandra': 'Female', 'adelia': 'Female', 'bao': 'Female', 'cleta': 'Female', 'dasan': 'Male', 'adelio': 'Male', 'laquinta': 'Female', 'julien': 'Male', 'kellan': 'Male', 'tommie': 'Neutral', 'claretta': 'Female', 'yoshi': 'Male', 'kayce': 'Female', 'juliet': 'Female', 'deloise': 'Female', 'duff': 'Neutral', 'jessicah': 'Female', 'anevay': 'Female', 'estefana': 'Female', 'ehtel': 'Female', 'huong': 'Female', 'oma': 'Male', 'tynisha': 'Female', 'creda': 'Female', 'buford': 'Male', 'aaliyah': 'Female', 'vernon': 'Male', 'chayton': 'Male', 'giolla': 'Female', 'savana': 'Female', 'coraima': 'Female', 'raelynn': 'Female', 'temika': 'Female', 'una': 'Female', 'argelia': 'Female', 'rossa': 'Female', 'casimir': 'Male', 'umeko': 'Female', 'enzo': 'Male', 'ethen': 'Male', 'gwen': 'Female', 'winnie': 'Female', 'zeroun': 'Male', 'quinn': 'Neutral', 'tiana': 'Female', 'raffaello': 'Male', 'aevaeh': 'Female', 'tiny': 'Female', 'cyrus': 'Male', 'tina': 'Female', 'basil': 'Male', 'jordin': 'Neutral', 'riley': 'Neutral', 'studs': 'Male', 'chun': 'Female', 'chasidy': 'Female', 'sunshine': 'Female', 'maeve': 'Female', 'emmie': 'Female', 'carlota': 'Female', 'appollo': 'Male', 'jerom': 'Male', 'lionel': 'Male', 'mohammad': 'Male', 'tudor': 'Male', 'sheridan': 'Neutral', 'dysis': 'Female', 'charisse': 'Female', 'johnsie': 'Female', 'charissa': 'Female', 'tana': 'Female', 'vikki': 'Female', 'jerald': 'Male', 'latosha': 'Female', 'seven': 'Neutral', 'soila': 'Female', 'tashina': 'Female', 'cheryl': 'Female', 'joshwa': 'Male', 'malaika': 'Female', 'gianna': 'Female', 'jess': 'Neutral', 'lorelai': 'Female', 'in': 'Female', 'gianni': 'Male', 'turner': 'Male', 'quana': 'Female', 'kitra': 'Female', 'quang': 'Neutral', 'belle': 'Female', 'bella': 'Female', 'adell': 'Female', 'jolene': 'Female', 'roland': 'Male', 'aeva': 'Female', 'gaurav': 'Male', 'elli': 'Female', 'ella': 'Female', 'kip': 'Male', 'elle': 'Female', 'kit': 'Female', 'merna': 'Female', 'kin': 'Neutral', 'kim': 'Neutral', 'kia': 'Female', 'clem': 'Male', 'larissa': 'Female', 'honoria': 'Female', 'trory': 'Male', 'reese': 'Neutral', 'pandora': 'Female', 'roma': 'Female', 'amari': 'Neutral', 'andera': 'Female', 'yen': 'Neutral', 'yee': 'Female', 'yareli': 'Female', 'keelia': 'Female', 'mihaly': 'Male', 'ciara': 'Female', 'yer': 'Female', 'nicolas': 'Male', 'lakiesha': 'Female', 'julee': 'Female', 'caiden': 'Male', 'royal': 'Male', 'janeth': 'Female', 'jules': 'Neutral', 'janett': 'Female', 'jefferson': 'Male', 'cleatus': 'Male', 'alexys': 'Female', 'egan': 'Male', 'vanita': 'Female', 'vanessa': 'Female', 'dreama': 'Female', 'rozella': 'Female', 'eboni': 'Female', 'aulii': 'Neutral', 'xi-wang': 'Male', 'margherita': 'Female', 'mayes': 'Neutral', 'orlee': 'Neutral', 'kazi': 'Male', 'birgit': 'Female', 'manual': 'Male', 'macie': 'Female', 'adlai': 'Male', 'clementina': 'Female', 'annice': 'Female', 'clementine': 'Female', 'kazu': 'Male', 'marianela': 'Female', 'lemuel': 'Male', 'dean': 'Male', 'maxie': 'Female', 'jarod': 'Male', 'jaron': 'Male', 'kamron': 'Male', 'monserrat': 'Female', 'lucretia': 'Female', 'veda': 'Female', 'astin': 'Neutral', 'pillan': 'Neutral', 'burl': 'Male', 'lyris': 'Female', 'winona': 'Female', 'burt': 'Male', 'madyson': 'Female', 'zinna': 'Female', 'akilah': 'Female', 'oren': 'Neutral', 'orea': 'Female', 'chumani': 'Female', 'blithe': 'Female', 'haruni': 'Male', 'jenifer': 'Female', 'tyree': 'Neutral', 'analisa': 'Female', 'olinda': 'Female', 'azura': 'Female', 'luam': 'Neutral', 'farrell': 'Male', 'jens': 'Male', 'sergio': 'Male', 'lien': 'Neutral', 'jeni': 'Female', 'madilyn': 'Female', 'lauran': 'Female', 'jena': 'Female', 'jene': 'Female', 'sofea': 'Female', 'annabell': 'Female', 'kamden': 'Male', 'trayvon': 'Male', 'kahlilia': 'Female', 'kennith': 'Male', 'linus': 'Male', 'tennie': 'Female', 'bert': 'Male', 'sutton': 'Male', 'aubrianna': 'Female', 'penney': 'Female', 'meryle': 'Neutral', 'etha': 'Female', 'ford': 'Male', 'berg': 'Male', 'martez': 'Male', 'bern': 'Neutral', 'kioko': 'Female', 'isra': 'Male', 'jesenia': 'Female', 'sapphire': 'Female', 'aisha': 'Female', 'zara': 'Female', 'senaida': 'Female', 'classie': 'Female', 'phil': 'Male', 'shin': 'Female', 'tiaret': 'Female', 'zeno': 'Male', 'natine': 'Neutral', 'zena': 'Female', 'zene': 'Neutral', 'evangelia': 'Female', 'arnav': 'Male', 'adelaida': 'Female', 'kylene': 'Female', 'adelaide': 'Female', 'fidela': 'Female', 'helga': 'Female', 'holli': 'Female', 'brianna': 'Female', 'brianne': 'Female', 'holly': 'Female', 'humberto': 'Male', 'glynn': 'Female', 'tamala': 'Female', 'garland': 'Male', 'lorita': 'Female', 'mervin': 'Male', 'caitlynn': 'Female', 'fell': 'Male', 'sinead': 'Female', 'quinlan': 'Neutral', 'margurite': 'Female', 'janetta': 'Female', 'rossana': 'Female', 'janette': 'Female', 'kailey': 'Female', 'milt': 'Male', 'skip': 'Male', 'laura': 'Female', 'laure': 'Female', 'mila': 'Female', 'lauri': 'Female', 'milo': 'Male', 'arman': 'Male', 'delmar': 'Male', 'paulita': 'Female', 'gael': 'Male', 'marka': 'Female', 'marissa': 'Female', 'laleh': 'Female', 'garron': 'Male', 'landers': 'Male', 'kathey': 'Female', 'latoria': 'Female', 'alexandrea': 'Female', 'daryl': 'Male', 'chaylse': 'Female', 'myles': 'Neutral', 'llewellyn': 'Male', 'jezebel': 'Female', 'jerimiah': 'Male', 'landyn': 'Male', 'lillia': 'Female', 'lynch': 'Neutral', 'maygun': 'Female', 'fredricka': 'Female', 'brinda': 'Female', 'morrigan': 'Neutral', 'tumo': 'Male', 'dia': 'Female', 'wattan': 'Female', 'olympia': 'Female', 'racheal': 'Female', 'radley': 'Male', 'makaio': 'Neutral', 'koda': 'Male', 'cybele': 'Female', 'norris': 'Neutral', 'enedina': 'Female', 'lakenya': 'Female', 'palmer': 'Neutral', 'davina': 'Female', 'chilton': 'Male', 'melchior': 'Male', 'darcie': 'Female', 'larraine': 'Female', 'yajaira': 'Female', 'kefira': 'Female', 'nyako': 'Neutral', 'carmen': 'Neutral', 'alta': 'Female', 'blinda': 'Female', 'pasquale': 'Male', 'bok': 'Female', 'lizette': 'Female', 'gloria': 'Female', 'zoltan': 'Male', 'iolani': 'Female', 'bob': 'Male', 'margot': 'Female', 'micayla': 'Female', 'stew': 'Male', 'kirsi': 'Female', 'aidan': 'Male', 'elidia': 'Female', 'gellert': 'Male', 'daijah': 'Female', 'kyson': 'Male', 'florencia': 'Female', 'layne': 'Neutral', 'franco': 'Male', 'ariel': 'Neutral', 'arien': 'Neutral', 'aya': 'Female', 'florencio': 'Male', 'france': 'Female', 'arlinda': 'Female', 'leopoldo': 'Male', 'kristian': 'Neutral', 'saku': 'Neutral', 'krystal': 'Female', 'rasheeda': 'Female', 'leimomi': 'Female', 'claudette': 'Female', 'kimora': 'Female', 'alohilani': 'Female', 'savion': 'Male', 'olive': 'Neutral', 'amelia': 'Female', 'zaida': 'Female', 'rimca': 'Female', 'lysandra': 'Female', 'treyton': 'Male', 'orion': 'Neutral', 'london': 'Neutral', 'katlyn': 'Female', 'flo': 'Female', 'malory': 'Neutral', 'ula': 'Female', 'ulf': 'Neutral', 'erimentha': 'Female', 'lessie': 'Female', 'beverlee': 'Female', 'arely': 'Female', 'kenneth': 'Male', 'edna': 'Female', 'ganya': 'Female', 'reynold': 'Male', 'winston': 'Male', 'amalia': 'Female', 'ximena': 'Female', 'beverley': 'Female', 'dennis': 'Male', 'manuela': 'Female', 'clair': 'Male', 'nyx': 'Female', 'ping': 'Female', 'eavan': 'Female', 'anneliese': 'Female', 'pura': 'Female', 'raye': 'Female', 'shasta': 'Female', 'nya': 'Female', 'lorinda': 'Female', 'bethel': 'Female', 'tryphena': 'Female', 'may': 'Female', 'max': 'Male', 'mac': 'Male', 'brencis': 'Neutral', 'mae': 'Female', 'mai': 'Female', 'maj': 'Neutral', 'grizelda': 'Female', 'rickey': 'Male', 'mao': 'Female', 'man': 'Male', 'tamica': 'Female', 'johnson': 'Male', 'tivona': 'Female', 'coretta': 'Female', 'jair': 'Male', 'jakayla': 'Female', 'tala': 'Female', 'hassan': 'Male', 'omer': 'Male', 'ayden': 'Male', 'neida': 'Female', 'serge': 'Male', 'shiela': 'Female', 'jonell': 'Female', 'josephine': 'Female', 'josephina': 'Female', 'veasna': 'Female', 'lyric': 'Neutral', 'irena': 'Female', 'irene': 'Female', 'jock': 'Male', 'muliya': 'Female', 'thanh': 'Male', 'josphine': 'Female', 'thane': 'Neutral', 'zoraida': 'Female', 'ricjunette': 'Female', 'maia': 'Female', 'morathi': 'Male', 'hirsi': 'Male', 'maik': 'Neutral', 'nettie': 'Female', 'tonia': 'Female', 'imogene': 'Female', 'tonie': 'Neutral', 'elna': 'Female', 'saxton': 'Neutral', 'gavyn': 'Male', 'xerxes': 'Male', 'ileana': 'Female', 'zain': 'Male', 'joelle': 'Female', 'zaid': 'Male', 'stanislaw': 'Male', 'leda': 'Female', 'tandy': 'Female', 'olin': 'Neutral', 'rock': 'Male', 'deandre': 'Male', 'ellery': 'Neutral', 'deandra': 'Female', 'jannette': 'Female', 'arlette': 'Female', 'arletta': 'Female', 'neka': 'Male', 'vernetta': 'Female', 'lizabeth': 'Female', 'cirila': 'Female', 'margeret': 'Female', 'kristofer': 'Male', 'merritt': 'Neutral', 'matias': 'Neutral', 'olwen': 'Female', 'jackson': 'Neutral', 'pamela': 'Female', 'wendolyn': 'Female', 'sadye': 'Female', 'romana': 'Female', 'bayen': 'Neutral', 'brooks': 'Male', 'tatyana': 'Female', 'ajay': 'Male', 'chava': 'Female', 'yuri': 'Male', 'miley': 'Female', 'brooke': 'Neutral', 'ardelia': 'Female', 'keith': 'Male', 'ora': 'Female', 'ginacarlo': 'Male', 'yuriko': 'Female', 'stillman': 'Male', 'wanita': 'Female', 'lyndsay': 'Female', 'jameson': 'Male', 'thina': 'Female', 'loretta': 'Female', 'aderes': 'Female', 'teva': 'Neutral', 'lorette': 'Female', 'adie': 'Female', 'dereck': 'Male', 'oafe': 'Neutral', 'carri': 'Female', 'rachel': 'Female', 'tadhg': 'Male', 'edyth': 'Female', 'carry': 'Female', 'cris': 'Female', 'britannia': 'Female', 'jenee': 'Female', 'jaeden': 'Male', 'roseline': 'Female', 'rosaria': 'Female', 'bettye': 'Female', 'alfred': 'Male', 'jeannette': 'Female', 'cianna': 'Female', 'roseann': 'Female', 'rosario': 'Female', 'nishan': 'Male', 'hillary': 'Female', 'tessie': 'Female', 'calantha': 'Female', 'abbra': 'Female', 'rosena': 'Female', 'talmai': 'Male', 'olevia': 'Female', 'greer': 'Neutral', 'terrance': 'Male', 'duscha': 'Neutral', 'eda-mae': 'Female', 'fordon': 'Male', 'dugan': 'Male', 'zili': 'Female', 'preston': 'Male', 'talia': 'Female', 'adela': 'Female', 'adele': 'Female', 'cleavant': 'Male', 'vonda': 'Female', 'chika': 'Female', 'ayesha': 'Female', 'kevin': 'Male', 'cassandra': 'Female', 'bailee': 'Female', 'nikole': 'Female', 'elyssa': 'Female', 'danni': 'Neutral', 'criselda': 'Female', 'bailey': 'Neutral', 'lunette': 'Female', 'kaila': 'Female', 'norman': 'Male', 'trace': 'Neutral', 'verona': 'Female', 'loyd': 'Male', 'kaili': 'Neutral', 'traci': 'Female', 'makena': 'Female', 'mehalia': 'Female', 'woodrow': 'Male', 'nolan': 'Neutral', 'kenesha': 'Female', 'nadine': 'Female', 'tracy': 'Neutral', 'beth': 'Female', 'giulio': 'Male', 'chassidy': 'Female', 'nafis': 'Neutral', 'digna': 'Female', 'lenny': 'Male', 'merilyn': 'Female', 'kallie': 'Female', 'citlali': 'Female', 'corrin': 'Female', 'cybill': 'Female', 'corrie': 'Female', 'lenna': 'Female', 'maxine': 'Neutral', 'prema': 'Female', 'adolfo': 'Male', 'nancie': 'Female', 'herbst': 'Male', 'leeto': 'Male', 'shon': 'Male', 'stormy': 'Neutral', 'dick': 'Male', 'helia': 'Female', 'shavonda': 'Female', 'mikal': 'Male', 'lorenzo': 'Male', 'lorenza': 'Female', 'blenda': 'Female', 'muna': 'Female', 'hailey': 'Female', 'hailee': 'Female', 'yvonne': 'Female', 'annamae': 'Female', 'dianna': 'Female', 'menora': 'Female', 'dianne': 'Female', 'milek': 'Male', 'mattie': 'Neutral', 'miles': 'Neutral', 'jonco': 'Male', 'azana': 'Female', 'shalonda': 'Female', 'peony': 'Female', 'coletta': 'Female', 'colette': 'Female', 'sean': 'Neutral', 'kermit': 'Male', 'cathey': 'Female', 'keshia': 'Female', 'felecia': 'Female', 'marlana': 'Female', 'thor': 'Male', 'gage': 'Male', 'karmen': 'Female', 'vanna': 'Female', 'ima': 'Female', 'ceola': 'Female', 'august': 'Neutral', 'kristal': 'Female', 'kristan': 'Female', 'timmy': 'Male', 'jo': 'Female', 'ji': 'Female', 'nadalia': 'Female', 'kirsten': 'Female', 'jc': 'Male', 'jovanna': 'Female', 'haelee': 'Female', 'jovanni': 'Male', 'chezarina': 'Female', 'elijah': 'Male', 'hedia': 'Female', 'shaunda': 'Female', 'edith': 'Female', 'jovanny': 'Male', 'florrie': 'Female', 'earline': 'Female', 'cyndy': 'Female', 'esmerelda': 'Female', 'kiara': 'Female', 'ermelinda': 'Female', 'cyndi': 'Female', 'renita': 'Female', 'shubha': 'Male', 'akeem': 'Male', 'mare': 'Neutral', 'marg': 'Female', 'mara': 'Female', 'lyman': 'Male', 'marc': 'Male', 'arty': 'Male', 'barry': 'Male', 'maro': 'Neutral', 'mari': 'Neutral', 'mark': 'Male', 'lisle': 'Neutral', 'cecelia': 'Female', 'marv': 'Male', 'taber': 'Male', 'dessie': 'Female', 'marx': 'Female', 'mary': 'Female', 'marisa': 'Female', 'roselyn': 'Female', 'lakeshia': 'Female', 'fearghus': 'Male', 'tangela': 'Female', 'vitalis': 'Male', 'rudra': 'Female', 'bryson': 'Male', 'parrish': 'Neutral', 'pattie': 'Neutral', 'ivelisse': 'Female', 'klaus': 'Male', 'margit': 'Female', 'antone': 'Male', 'alva': 'Neutral', 'hattie': 'Female', 'elouise': 'Female', 'antony': 'Male', 'novella': 'Female', 'ferne': 'Female', 'ulysses': 'Male', 'sincere': 'Male', 'marcel': 'Male', 'destin': 'Male', 'thel': 'Neutral', 'sahara': 'Female', 'claretha': 'Female', 'robena': 'Female', 'arica': 'Female', 'pat': 'Neutral', 'lavi': 'Neutral', 'doctor': 'Male', 'paz': 'Female', 'raymonde': 'Female', 'layla': 'Female', 'emele': 'Female', 'mammie': 'Female', 'emely': 'Female', 'lucian': 'Male', 'bijan': 'Male', 'dayna': 'Female', 'brionna': 'Female', 'dayne': 'Male', 'alyce': 'Female', 'shyheim': 'Male', 'jeanmarie': 'Female', 'jeffrey': 'Male', 'keion': 'Male', 'hamlin': 'Male', 'izaiah': 'Male', 'reinaldo': 'Male', 'conor': 'Male', 'markus': 'Male', 'shernita': 'Female', 'gates': 'Male', 'monet': 'Neutral', 'jaslene': 'Female', 'temeka': 'Female', 'jimie': 'Male', 'laveta': 'Female', 'ethyl': 'Female', 'quella': 'Female', 'christoper': 'Male', 'mathias': 'Male', 'larhonda': 'Female', 'vasilis': 'Male', 'joline': 'Female', 'nico': 'Male', 'jake': 'Male', 'vivek': 'Male', 'zula': 'Female', 'tyreke': 'Male', 'mrena': 'Female', 'moises': 'Male', 'crystle': 'Female', 'loraine': 'Female', 'christina': 'Female', 'jestine': 'Female', 'christine': 'Female', 'mayda': 'Female', 'nathen': 'Male', 'halie': 'Female', 'nituna': 'Female', 'naal': 'Neutral', 'delfina': 'Female', 'alexis': 'Female', 'grania': 'Female', 'sommer': 'Female', 'joan': 'Neutral', 'nadda': 'Female', 'lotte': 'Female', 'ellis': 'Neutral', 'lotta': 'Female', 'alem': 'Male', 'charleen': 'Female', 'qiana': 'Female', 'alonzo': 'Male', 'ellie': 'Female', 'kenaz': 'Male', 'brigid': 'Female', 'vernice': 'Female', 'kamilah': 'Female', 'angella': 'Female', 'chloris': 'Female', 'kelis': 'Female', 'jennette': 'Female', 'livvy': 'Female', 'shaquana': 'Female', 'kelii': 'Male', 'magaret': 'Female', 'hermina': 'Female', 'taifa': 'Female', 'leander': 'Male', 'otha': 'Male', 'salley': 'Female', 'yadid': 'Male', 'alejandrina': 'Female', 'borka': 'Male', 'atalo': 'Male', 'zuriel': 'Neutral', 'kalie': 'Female', 'dontae': 'Male', 'kalin': 'Neutral', 'kalil': 'Male', 'wilda': 'Female', 'versie': 'Female', 'gomer': 'Male', 'arvin': 'Male', 'glynnis': 'Female', 'louann': 'Female', 'gussie': 'Female', 'leisha': 'Female', 'diya': 'Female', 'shelly': 'Female', 'cordell': 'Male', 'anisa': 'Female', 'ilori': 'Female', 'erasmo': 'Male', 'shella': 'Female', 'sarki': 'Neutral', 'dayana': 'Female', 'jerrell': 'Male', 'shelli': 'Neutral', 'kacie': 'Female', 'jacquelyn': 'Female', 'delilah': 'Female', 'aoko': 'Neutral', 'jerrie': 'Neutral', 'jazlene': 'Female', 'suzette': 'Female', 'laina': 'Female', 'keira': 'Female', 'laine': 'Female', 'gore': 'Male', 'khloe': 'Female', 'goro': 'Male', 'lorelei': 'Female', 'ronaldo': 'Male', 'benton': 'Male', 'ludlow': 'Male', 'adriane': 'Female', 'adriana': 'Female', 'manuel': 'Male', 'adriano': 'Male', 'lisbeth': 'Female', 'babyboy': 'Male', 'eliot': 'Male', 'genny': 'Female', 'lashonda': 'Female', 'jengo': 'Male', 'lannie': 'Female', 'zelda': 'Female', 'rolland': 'Male', 'genna': 'Female', 'effie': 'Female', 'denzell': 'Male', 'brandi': 'Female', 'kadin': 'Male', 'branda': 'Female', 'aster': 'Female', 'nichol': 'Female', 'brande': 'Female', 'clio': 'Female', 'brandy': 'Female', 'kyros': 'Male', 'chris': 'Neutral', 'delmy': 'Female', 'montrell': 'Male', 'odalys': 'Female', 'cleave': 'Male', 'baylee': 'Female', 'boone': 'Male', 'kaylynn': 'Female', 'oral': 'Neutral', 'oran': 'Neutral', 'rosalee': 'Female', 'emile': 'Male', 'orsen': 'Male', 'deron': 'Male', 'eda': 'Female', 'zina': 'Female', 'lian': 'Female', 'desdemona': 'Female', 'sung': 'Male', 'adena': 'Female', 'emily': 'Female', 'chesna': 'Female', 'zesiro': 'Male', 'demitrius': 'Male', 'immanuel': 'Male', 'hoshi': 'Male', 'felton': 'Male', 'mandell': 'Neutral', 'alberto': 'Male', 'alberta': 'Female', 'sheniece': 'Female', 'lianne': 'Female', 'evanthe': 'Female', 'billie': 'Neutral', 'kyoko': 'Female', 'scout': 'Neutral', 'socorro': 'Female', 'fala': 'Female', 'fale': 'Male', 'marigold': 'Female', 'sharolyn': 'Female', 'hye': 'Female', 'broderick': 'Male', 'worden': 'Male', 'delma': 'Female', 'markell': 'Male', 'hyo': 'Female', 'taline': 'Female', 'donovan': 'Male', 'washi': 'Male', 'kasheena': 'Female', 'colene': 'Female', 'charlize': 'Female', 'tailynn': 'Female', 'cornelia': 'Female', 'andon': 'Male', 'dian': 'Neutral', 'abe': 'Male', 'mercer': 'Neutral', 'cosette': 'Female', 'niamh': 'Neutral', 'valtina': 'Female', 'abu': 'Male', 'garth': 'Male', 'anlon': 'Male', 'jacquline': 'Female', 'jutta': 'Female', 'christi': 'Female', 'vala': 'Female', 'margie': 'Female', 'jasmyn': 'Female', 'twana': 'Female', 'jonah': 'Male', 'ranger': 'Male', 'jonas': 'Male', 'christy': 'Neutral', 'shamika': 'Female', 'asasia': 'Female', 'shanti': 'Female', 'orenda': 'Female', 'mattox': 'Neutral', 'jackie': 'Neutral', 'temira': 'Female', 'stella': 'Female', 'agatha': 'Female', 'ervin': 'Male', 'aric': 'Male', 'brielle': 'Female', 'ksena': 'Female', 'delmer': 'Male', 'jazmine': 'Female', 'qimat': 'Neutral', 'africa': 'Female', 'letitia': 'Female', 'lyde': 'Neutral', 'levon': 'Male', 'lyda': 'Female', 'mylie': 'Female', 'fenella': 'Female', 'trish': 'Female', 'rafi': 'Male', 'asta': 'Female', 'ull': 'Neutral', 'nathanael': 'Male', 'lassie': 'Female', 'brisa': 'Female', 'yolando': 'Female', 'diamond': 'Neutral', 'ramona': 'Female', 'candace': 'Female', 'yolande': 'Female', 'ethelene': 'Female', 'leonard': 'Male', 'yolanda': 'Female', 'landen': 'Neutral', 'upendo': 'Male', 'lareina': 'Female', 'tuan': 'Male', 'nona': 'Female', 'georgina': 'Female', 'georgine': 'Female', 'roosevelt': 'Male', 'del': 'Male', 'jamarion': 'Male', 'deo': 'Male', 'nakisha': 'Female', 'dea': 'Female', 'deb': 'Female', 'dee': 'Neutral', 'jaheim': 'Male', 'shari': 'Female', 'morty': 'Male', 'shara': 'Female', 'kwame': 'Male', 'jerommeke': 'Male', 'cherilyn': 'Female', 'numbers': 'Male', 'janiya': 'Female', 'steffi': 'Female', 'breonna': 'Female', 'ryo': 'Neutral', 'pamella': 'Female', 'khadijah': 'Female', 'willena': 'Female', 'comfort': 'Female', 'latarsha': 'Female', 'willene': 'Female', 'elpida': 'Female', 'felicita': 'Female', 'latoyia': 'Female', 'kitty': 'Female', 'beyla': 'Female', 'rosanne': 'Female', 'zenas': 'Neutral', 'rosanna': 'Female', 'brady': 'Male', 'cutler': 'Male', 'ulema': 'Female', 'steffie': 'Female', 'derron': 'Male', 'edwin': 'Male', 'dayle': 'Female', 'licia': 'Female', 'brygid': 'Female', 'mandelina': 'Female', 'muriel': 'Female', 'gertrudis': 'Female', 'ziraili': 'Female', 'monnie': 'Female', 'mable': 'Female', 'dolly': 'Female', 'kasandra': 'Female', 'rozanne': 'Female', 'oke': 'Neutral', 'wally': 'Male', 'naoll': 'Neutral', 'mostyn': 'Neutral', 'johnie': 'Neutral', 'kaci': 'Female', 'robbie': 'Neutral', 'faviola': 'Female', 'dionna': 'Female', 'robbin': 'Neutral', 'dionne': 'Female', 'asher': 'Male', 'eleanor': 'Female', 'nehemiah': 'Male', 'kacy': 'Female', 'haile': 'Female', 'callum': 'Male', 'fisk': 'Male', 'marybeth': 'Female', 'rachelle': 'Female', 'nalo': 'Neutral', 'flavia': 'Female', 'kamora': 'Female', 'tiffani': 'Female', 'hart': 'Male', 'edra': 'Female', 'flavio': 'Male', 'perry': 'Male', 'quincy': 'Neutral', 'alexandro': 'Male', 'nasha': 'Female', 'sloan': 'Male', 'brynlee': 'Female', 'trenten': 'Male', 'jael': 'Female', 'deidra': 'Female', 'garson': 'Male', 'lawrence': 'Male', 'marquez': 'Male', 'rickie': 'Male', 'aislin': 'Female', 'calder': 'Male', 'kamali': 'Male', 'dorsey': 'Neutral', 'dorset': 'Female', 'bethan': 'Female', 'kamala': 'Female', 'gearldine': 'Female', 'kiesha': 'Female', 'lesia': 'Female', 'cullen': 'Male', 'aydan': 'Male', 'valentino': 'Male', 'cady': 'Female', 'valentina': 'Female', 'kaylyn': 'Female', 'valentine': 'Neutral', 'dona': 'Female', 'cade': 'Neutral', 'dong': 'Male', 'evonne': 'Female', 'donn': 'Male', 'kailee': 'Female', 'elba': 'Female', 'kipp': 'Neutral', 'anabelle': 'Female', 'jetta': 'Female', 'quade': 'Male', 'teresita': 'Female', 'haroun': 'Male', 'honora': 'Female', 'emiliano': 'Male', 'reagen': 'Neutral', 'ellena': 'Female', 'lourdes': 'Female', 'emlyn': 'Female', 'fleta': 'Female', 'cuthbert': 'Male', 'wilhemina': 'Female', 'giancarlo': 'Male', 'aiyana': 'Female', 'blanch': 'Female', 'sonnagh': 'Male', 'garin': 'Neutral', 'shelby': 'Neutral', 'blanca': 'Female', 'pinkie': 'Female', 'chantel': 'Female', 'becca': 'Female', 'isela': 'Female', 'shelbi': 'Female', 'rowen': 'Neutral', 'veronika': 'Female', 'shoushan': 'Female', 'jaquan': 'Male', 'shelba': 'Female', 'mose': 'Male', 'portia': 'Female', 'herlinda': 'Female', 'alfreda': 'Female', 'serena': 'Female', 'ronna': 'Female', 'janae': 'Female', 'chars': 'Male', 'nitis': 'Neutral', 'ronni': 'Neutral', 'janay': 'Female', 'charo': 'Female', 'rosann': 'Female', 'rosana': 'Female', 'stepanie': 'Female', 'laila': 'Female', 'ronny': 'Neutral', 'ka': 'Female', 'clemente': 'Male', 'sibyl': 'Female', 'carmon': 'Female', 'hannelore': 'Female', 'leonila': 'Female', 'maille': 'Female', 'chester': 'Male', 'aysha': 'Female', 'larisa': 'Female', 'tambre': 'Female', 'thomas': 'Male', 'mahala': 'Female', 'tambra': 'Female', 'kellsie': 'Female', 'rachal': 'Female', 'jeanett': 'Female', 'jaret': 'Male', 'saskia': 'Female', 'tamasha': 'Female', 'jaren': 'Male', 'finn': 'Male', 'jared': 'Male', 'letty': 'Female', 'candelaria': 'Female', 'adaline': 'Female', 'jacquelyne': 'Female', 'jenae': 'Female', 'giana': 'Female', 'jacquelynn': 'Female', 'donya': 'Female', 'vallie': 'Female', 'nakia': 'Female', 'luke': 'Male', 'kabili': 'Male', 'luka': 'Male', 'estrella': 'Female', 'suzie': 'Female', 'keran': 'Neutral', 'meir': 'Male', 'bonifacy': 'Male', 'nakeisha': 'Female', 'vartouhi': 'Female', 'onawa': 'Female', 'xenophon': 'Neutral', 'dante': 'Neutral', 'severino': 'Male', 'fiorenza': 'Female', 'procopia': 'Female', 'cosima': 'Female', 'drucilla': 'Female', 'vina': 'Female', 'vine': 'Neutral', 'geoff': 'Male', 'charlette': 'Female', 'leslie': 'Neutral', 'tariq': 'Male', 'trevion': 'Male', 'bethany': 'Female', 'braelyn': 'Female', 'abrienda': 'Female', 'nolen': 'Male', 'donato': 'Male', 'myriam': 'Female', 'keitaro': 'Male', 'rosie': 'Female', 'shamar': 'Male', 'rosia': 'Female', 'brynn': 'Neutral', 'rosio': 'Female', 'leida': 'Female', 'ike': 'Male', 'shaman': 'Male', 'malisa': 'Female', 'marilyn': 'Female', 'sharla': 'Female', 'bowie': 'Male', 'cloris': 'Female', 'edythe': 'Female', 'eliora': 'Female', 'kandis': 'Female', 'elliot': 'Male', 'jolyn': 'Female', 'brianda': 'Female', 'gypsy': 'Female', 'izabella': 'Female', 'izabelle': 'Female', 'jocelin': 'Female', 'kiya': 'Female', 'aundrea': 'Female', 'diedrick': 'Male', 'raisa': 'Female', 'reta': 'Female', 'gerik': 'Male', 'adita': 'Female', 'rasia': 'Female', 'donavan': 'Male', 'reth': 'Male', 'inoke': 'Female', 'meridith': 'Female', 'ireland': 'Female', 'joselyn': 'Female', 'mikel': 'Male', 'terina': 'Female', 'kathy': 'Female', 'addison': 'Neutral', 'shironda': 'Female', 'heller': 'Female', 'gay': 'Female', 'kathi': 'Female', 'ianthe': 'Female', 'whitney': 'Neutral', 'kathe': 'Female', 'pierce': 'Neutral', 'maricruz': 'Female', 'keven': 'Male', 'bill': 'Male', 'latika': 'Female', 'alize': 'Female', 'oralee': 'Female', 'aliza': 'Female', 'sharell': 'Female', 'nimeesha': 'Female', 'sarda': 'Neutral', 'tamesha': 'Female', 'monroe': 'Neutral', 'elane': 'Female', 'salina': 'Female', 'elana': 'Female', 'kaethe': 'Female', 'ewa': 'Female', 'elani': 'Female', 'gazali': 'Male', 'dorethea': 'Female', 'ruth': 'Female', 'nydia': 'Female', 'bernarda': 'Female', 'jesica': 'Female', 'panya': 'Female', 'bryony': 'Female', 'casandra': 'Female', 'doreen': 'Female', 'yahto': 'Male', 'nola': 'Female', 'somer': 'Female', 'salvatore': 'Male', 'howe': 'Male', 'tass': 'Male', 'josefa': 'Female', 'earlene': 'Female', 'alyvia': 'Female', 'euna': 'Female', 'joesph': 'Male', 'dezso': 'Male', 'macayle': 'Female', 'kash': 'Male', 'jocelyne': 'Female', 'melinda': 'Female', 'jocelynn': 'Female', 'mave': 'Female', 'taban': 'Neutral', 'cuc': 'Female', 'dixon': 'Male', 'calista': 'Female', 'lisha': 'Female', 'dard': 'Male', 'easter': 'Female', 'tibor': 'Male', 'bin': 'Male', 'tillie': 'Female', 'mariella': 'Female', 'marielle': 'Female', 'sirvat': 'Female', 'gaetane': 'Female', 'monika': 'Female', 'ambrose': 'Male', 'hardy': 'Male', 'destyneigh': 'Female', 'sema': 'Female', 'gretel': 'Female', 'howell': 'Male', 'ursala': 'Female', 'lucien': 'Male', 'amaris': 'Female', 'hadassah': 'Female', 'brend': 'Neutral', 'brent': 'Male', 'lars': 'Male', 'bruce': 'Male', 'lara': 'Female', 'pei': 'Female', 'lark': 'Female', 'peg': 'Female', 'kahlil': 'Male', 'keiki': 'Female', 'keiko': 'Female', 'shamira': 'Female', 'annalisa': 'Female', 'annalise': 'Female', 'valrie': 'Female', 'delisa': 'Female', 'kael': 'Male', 'camelia': 'Female', 'maude': 'Female', 'ayame': 'Female', 'jazlynn': 'Female', 'sherilyn': 'Female', 'jimmy': 'Male', 'delaney': 'Neutral', 'derora': 'Female', 'daisha': 'Female', 'steven': 'Male', 'lolonyo': 'Male', 'akamu': 'Male', 'kyra': 'Female', 'cassondra': 'Female', 'lexis': 'Female', 'erasmus': 'Male', 'isobel': 'Female', 'boyd': 'Male', 'vivan': 'Female', 'itzel': 'Female', 'murphy': 'Neutral', 'peers': 'Male', 'gyala': 'Male', 'lydie': 'Female', 'sherron': 'Female', 'lydia': 'Female', 'frida': 'Female', 'violeta': 'Female', 'kamari': 'Neutral', 'nayati': 'Neutral', 'kellie': 'Female', 'adair': 'Male', 'gavril': 'Male', 'keanna': 'Female', 'georgetta': 'Female', 'georgette': 'Female', 'curt': 'Male', 'tassos': 'Male', 'zuleika': 'Female', 'verlie': 'Female', 'ashtyn': 'Female', 'scarlet': 'Female', 'eusebia': 'Female', 'lyn': 'Female', 'laszlo': 'Male', 'wynona': 'Female', 'deacon': 'Male', 'elda': 'Female', 'megara': 'Female', 'elayne': 'Female', 'kirk': 'Male', 'kiri': 'Female', 'ellen': 'Female', 'simonne': 'Female', 'kaylene': 'Female', 'kira': 'Female', 'finley': 'Neutral', 'yana': 'Female', 'lena': 'Female', 'katlynn': 'Female', 'suchin': 'Female', 'fisher': 'Male', 'ariadne': 'Female', 'nilda': 'Female', 'jaylynn': 'Female', 'socrates': 'Male', 'sallie': 'Female', 'yank': 'Neutral', 'hazeka': 'Female', 'jason': 'Male', 'cynthia': 'Female', 'shoshanah': 'Female', 'hollace': 'Female', 'wilber': 'Male', 'justise': 'Female', 'zareh': 'Male', 'georgiann': 'Female', 'lilla': 'Female', 'lexiss': 'Neutral', 'lilli': 'Female', 'ruthanne': 'Female', 'georgiana': 'Female', 'maddie': 'Female', 'blaze': 'Neutral', 'zared': 'Male', 'maryland': 'Female', 'lilly': 'Female', 'jakob': 'Male', 'ronli': 'Female', 'sherrill': 'Female', 'ophelia': 'Female', 'avalon': 'Female', 'annika': 'Female', 'maryanna': 'Female', 'maryanne': 'Female', 'clemens': 'Male', 'clement': 'Male', 'maylin': 'Neutral', 'carman': 'Female', 'joel': 'Male', 'nairi': 'Female', 'zyta': 'Female', 'abagale': 'Female', 'joey': 'Male', 'cheyanne': 'Female', 'ashling': 'Neutral', 'evette': 'Female', 'carly': 'Female', 'clive': 'Male', 'carla': 'Female', 'elise': 'Female', 'carli': 'Female', 'carlo': 'Male', 'elisa': 'Female', 'orrick': 'Male', 'edison': 'Male', 'anthea': 'Female', 'maryjo': 'Female', 'piper': 'Neutral', 'susanne': 'Female', 'cherly': 'Female', 'susanna': 'Female', 'mauricio': 'Male', 'shelton': 'Neutral', 'theda': 'Female', 'mitsuko': 'Female', 'laraine': 'Female', 'kaden': 'Neutral', 'peggy': 'Female', 'aracelis': 'Female', 'ashlyn': 'Neutral', 'luis': 'Neutral', 'kolina': 'Female', 'sine': 'Female', 'bode': 'Male', 'vertie': 'Female', 'ledell': 'Female', 'ruthie': 'Female', 'caralee': 'Female', 'adamina': 'Female', 'brigit': 'Female', 'brazil': 'Neutral', 'claude': 'Male', 'manni': 'Neutral', 'yettie': 'Female', 'channon': 'Neutral', 'talon': 'Neutral', 'manny': 'Neutral', 'nitara': 'Female', 'masada': 'Neutral', 'toshia': 'Female', 'sammi': 'Neutral', 'chi': 'Male', 'debbie': 'Female', 'conley': 'Male', 'spyridon': 'Male', 'vonnie': 'Female', 'anila': 'Female', 'taran': 'Neutral', 'jaslyn': 'Female', 'orestes': 'Male', 'teenie': 'Neutral', 'georgene': 'Female', 'sheera': 'Female', 'malakai': 'Male', 'kasha': 'Female', 'yancy': 'Male', 'reynalda': 'Female', 'sharne': 'Female', 'britney': 'Female', 'alia': 'Female', 'reynaldo': 'Male', 'alix': 'Female', 'onella': 'Female', 'jessycka': 'Female', 'umberto': 'Male', 'arnie': 'Male', 'tammi': 'Female', 'feleti': 'Male', 'hesper': 'Female', 'reva': 'Female', 'kenyetta': 'Female', 'mikko': 'Male', 'mikki': 'Female', 'forest': 'Male', 'tasanee': 'Female', 'roan': 'Neutral', 'rihanna': 'Female', 'fran': 'Neutral', 'danton': 'Male', 'tamma': 'Female', 'conchita': 'Female', 'dominick': 'Male', 'jolanda': 'Female', 'rayshawn': 'Male', 'lakeisha': 'Female', 'dominica': 'Female', 'lucinda': 'Female', 'bing': 'Male', 'bina': 'Female', 'gunda': 'Female', 'tallis': 'Female', 'laurie': 'Female', 'lynnea': 'Female', 'jira': 'Female', 'doloris': 'Female', 'alita': 'Female', 'raekwon': 'Male', 'hadley': 'Neutral', 'ivana': 'Female', 'walta': 'Female', 'grayson': 'Male', 'shonda': 'Female', 'metea': 'Female', 'bridger': 'Male', 'lorand': 'Neutral', 'le': 'Female', 'anastacia': 'Female', 'bridget': 'Female', 'madalene': 'Female', 'lu': 'Female', 'venetia': 'Female', 'peyton': 'Neutral', 'wynne': 'Neutral', 'alfredia': 'Female', 'zoan': 'Neutral', 'dan': 'Male', 'gure': 'Male', 'tatianna': 'Female', 'daw': 'Female', 'landan': 'Male', 'charly': 'Neutral', 'dax': 'Male', 'donavon': 'Male', 'nathaly': 'Female', 'jaylene': 'Female', 'remington': 'Male', 'guri': 'Female', 'morrie': 'Male', 'krystina': 'Female', 'samira': 'Female', 'michaela': 'Female', 'aislinn': 'Female', 'michaele': 'Female', 'kalvin': 'Male', 'arlene': 'Female', 'morris': 'Male', 'tarsha': 'Female', 'arlena': 'Female', 'toki': 'Female', 'warner': 'Male', 'marlee': 'Female', 'eula': 'Female', 'dixie': 'Female', 'adli': 'Male', 'trever': 'Male', 'jakobe': 'Male', 'buena': 'Female', 'marlen': 'Female', 'marline': 'Female', 'zariah': 'Female', 'marley': 'Neutral', 'caimile': 'Female', 'marius': 'Neutral', 'seanna': 'Female', 'rex': 'Male', 'rey': 'Neutral', 'laramie': 'Neutral', 'ren': 'Neutral', 'rea': 'Female', 'red': 'Neutral', 'harold': 'Male', 'hestia': 'Female', 'jessica': 'Neutral', 'idella': 'Female', 'lizzie': 'Female', 'charis': 'Female', 'dandre': 'Male', 'coen': 'Male', 'amira': 'Female', 'lajos': 'Male', 'franz': 'Male', 'amiri': 'Neutral', 'shaniece': 'Female', 'anitra': 'Female', 'erinn': 'Female', 'liona': 'Female', 'gamada': 'Female', 'yaro': 'Male', 'marcelo': 'Male', 'marcell': 'Male', 'marcela': 'Female', 'krystin': 'Female', 'collice': 'Female', 'shavon': 'Female', 'dinorah': 'Female', 'justine': 'Neutral', 'justina': 'Female', 'cherlin': 'Female', 'franky': 'Neutral', 'gamal': 'Male', 'thomasina': 'Female', 'hilary': 'Female', 'thomasine': 'Female', 'shanna': 'Female', 'italia': 'Female', 'kiran': 'Female', 'annita': 'Female', 'oriana': 'Female', 'lamont': 'Male', 'hernan': 'Male', 'tajuana': 'Female', 'terweduwe': 'Male', 'dobry': 'Male', 'odin': 'Male', 'danyel': 'Female', 'kynton': 'Male', 'ballard': 'Male', 'keenan': 'Male', 'lovey': 'Female', 'jacqulyn': 'Female', 'shawna': 'Female', 'jariath': 'Male', 'keenen': 'Male', 'layton': 'Male', 'evadne': 'Female', 'emanuel': 'Male', 'musoke': 'Neutral', 'sherita': 'Female', 'mio': 'Male', 'dallas': 'Neutral', 'mia': 'Female', 'dodie': 'Female', 'tomasa': 'Female', 'claire': 'Female', 'montgomery': 'Male', 'baird': 'Male', 'serina': 'Female', 'dayanara': 'Female', 'ketara': 'Female', 'alton': 'Male', 'hassie': 'Female', 'raphaela': 'Female', 'trixie': 'Female', 'loba': 'Neutral', 'dorjan': 'Male', 'bairn': 'Male', 'sherlene': 'Female', 'sally': 'Neutral', 'herman': 'Male', 'ishmael': 'Male', 'sheba': 'Female', 'shakti': 'Female', 'frederica': 'Female', 'frederick': 'Male', 'aidyn': 'Male', 'tamiko': 'Female', 'wyome': 'Neutral', 'tamika': 'Female', 'charley': 'Male', 'catalina': 'Female', 'karyl': 'Female', 'karyn': 'Female', 'charles': 'Male', 'necia': 'Female', 'kayley': 'Female', 'drusilla': 'Female', 'kaylee': 'Female', 'kaylen': 'Female', 'charlee': 'Male', 'arminda': 'Female', 'cherryl': 'Female', 'lilianna': 'Female', 'tyquan': 'Male', 'kyrene': 'Female', 'betsy': 'Female', 'bernard': 'Male', 'affrica': 'Female', 'ramiro': 'Male', 'isha': 'Female', 'lobo': 'Male', 'lela': 'Female', 'beau': 'Male', 'latimer': 'Male', 'miguelina': 'Female', 'reginia': 'Female', 'jazmyne': 'Female', 'morganne': 'Female', 'jeannie': 'Female', 'lave': 'Neutral', 'melodee': 'Female', 'tressa': 'Female', 'cicero': 'Male', 'mercedez': 'Female', 'hartwell': 'Male', 'matrika': 'Female', 'mercedes': 'Female', 'berit': 'Female', 'gerardo': 'Male', 'gibson': 'Male', 'huslu': 'Male', 'dillon': 'Male', 'albertina': 'Female', 'albertine': 'Female', 'eleonore': 'Female', 'asthore': 'Neutral', 'eleonora': 'Female', 'xinavane': 'Female', 'tiarra': 'Female', 'graciela': 'Female', 'karter': 'Male', 'jaquez': 'Male', 'maynard': 'Male', 'cleora': 'Female', 'keturah': 'Female', 'sigrid': 'Female', 'maddox': 'Neutral', 'melvyn': 'Male', 'ralph': 'Male', 'rothrock': 'Male', 'rowan': 'Neutral', 'bruno': 'Male', 'bruna': 'Female', 'jenice': 'Female', 'madelyn': 'Female', 'janet': 'Female', 'janey': 'Female', 'persephone': 'Female', 'tobias': 'Male', 'tamra': 'Female', 'janee': 'Female', 'jerrod': 'Male', 'selena': 'Female', 'janel': 'Female', 'barretta': 'Neutral', 'alaric': 'Male', 'buster': 'Male', 'tovah': 'Female', 'florinda': 'Female', 'jacquetta': 'Female', 'raghnall': 'Male', 'clodia': 'Female', 'brennan': 'Male', 'denis': 'Male', 'ellsworth': 'Male', 'catherin': 'Female', 'darrel': 'Male', 'darren': 'Male', 'nellie': 'Female', 'madra': 'Female', 'niki': 'Female', 'vennie': 'Female', 'hyacinth': 'Female', 'anglea': 'Female', 'aubrey': 'Female', 'reilly': 'Neutral', 'kyria': 'Female', 'keren': 'Female', 'bula': 'Female', 'lindley': 'Neutral', 'napoleon': 'Male', 'homer': 'Male', 'eulalie': 'Female', 'gizi': 'Female', 'augusta': 'Female', 'carsyn': 'Male', 'lanny': 'Male', 'jeanette': 'Female', 'jeanetta': 'Female', 'rashida': 'Female', 'makalo': 'Male', 'salena': 'Female', 'rodrigo': 'Male', 'salene': 'Female', 'juanita': 'Female', 'tayna': 'Female', 'janyce': 'Female', 'sivney': 'Male', 'geovanni': 'Male', 'dakotah': 'Neutral', 'eugenio': 'Male', 'zaccheus': 'Male', 'melynda': 'Female', 'dejon': 'Male', 'eugenie': 'Female', 'osias': 'Neutral', 'lazzaro': 'Male', 'aleida': 'Female', 'kimberlee': 'Female', 'samantha': 'Female', 'ferguson': 'Male', 'ion': 'Male', 'giuliana': 'Female', 'kimberley': 'Female', 'antonia': 'Female', 'donnell': 'Male', 'eurydice': 'Female', 'antonie': 'Female', 'yates': 'Neutral', 'seth': 'Male', 'latoya': 'Female', 'antonio': 'Male', 'connley': 'Male', 'alka': 'Female', 'zakkary': 'Male', 'rashad': 'Male', 'armina': 'Female', 'theron': 'Male', 'mechelle': 'Female', 'liliana': 'Female', 'jeroen': 'Male', 'raymundo': 'Male', 'fumiko': 'Female', 'dakota': 'Neutral', 'briar': 'Neutral', 'hazina': 'Female', 'lake': 'Neutral', 'ady': 'Female', 'ade': 'Male', 'nira': 'Female', 'ada': 'Female', 'aurorette': 'Female', 'raven': 'Neutral', 'marhta': 'Female', 'ericka': 'Female', 'wendell': 'Male', 'doyle': 'Male', 'coreen': 'Female', 'qwin': 'Neutral', 'kaylah': 'Female', 'liko': 'Male', 'braeden': 'Male', 'tish': 'Female', 'armani': 'Neutral', 'chick': 'Male', 'conrad': 'Male', 'chico': 'Male', 'armand': 'Male', 'tawana': 'Female', 'paulina': 'Female', 'haig': 'Male', 'sherika': 'Female', 'pauline': 'Female', 'lawanna': 'Female', 'daron': 'Male', 'madrona': 'Female', 'meriel': 'Female', 'garrett': 'Male', 'leontine': 'Female', 'joachim': 'Male', 'brigitte': 'Female', 'pepper': 'Female', 'kristin': 'Female', 'demetra': 'Female', 'kristie': 'Female', 'alban': 'Male', 'sheree': 'Female', 'demetri': 'Male', 'treena': 'Female', 'mirra': 'Female', 'akuji': 'Male', 'tomi': 'Female', 'glady': 'Female', 'quinton': 'Male', 'thrine': 'Neutral', 'lezlie': 'Female', 'rufina': 'Female', 'conway': 'Male', 'schuyler': 'Neutral', 'marika': 'Female', 'mariko': 'Female', 'celinda': 'Female', 'dondre': 'Male', 'chung': 'Male', 'emory': 'Male', 'joaquin': 'Male', 'rimona': 'Female', 'ivory': 'Neutral', 'rodger': 'Male', 'brand': 'Male', 'amity': 'Female', 'caitlin': 'Female', 'idania': 'Female', 'davida': 'Female', 'brant': 'Male', 'memphis': 'Male', 'bud': 'Male', 'lynn': 'Neutral', 'carolos': 'Male', 'carmella': 'Female', 'glory': 'Female', 'antwon': 'Male', 'misti': 'Female', 'kristoffer': 'Male', 'marcene': 'Female', 'glora': 'Female', 'nedra': 'Female', 'brinly': 'Neutral', 'haiden': 'Male', 'keanu': 'Male', 'lurline': 'Female', 'sulema': 'Female', 'mozelle': 'Female', 'romney': 'Male', 'mozella': 'Female', 'lamya': 'Female', 'dawson': 'Male', 'anjelica': 'Female', 'dominy': 'Male', 'adah': 'Female', 'mortimer': 'Male', 'patsy': 'Female', 'illa': 'Female', 'caterina': 'Female', 'fanchon': 'Female', 'adam': 'Male', 'laisha': 'Female', 'hortense': 'Female', 'christiana': 'Female', 'uba': 'Male', 'nuncio': 'Male', 'pilar': 'Female', 'madalynn': 'Female', 'domani': 'Neutral', 'kaia': 'Female', 'sveta': 'Female', 'trenton': 'Male', 'shenika': 'Female', 'vila': 'Female', 'inari': 'Female', 'inara': 'Female', 'gillespie': 'Male', 'sanford': 'Male', 'flannery': 'Neutral', 'leighann': 'Female', 'geraldo': 'Male', 'paris': 'Neutral', 'loura': 'Female', 'dallon': 'Neutral', 'brilliant': 'Neutral', 'zofia': 'Female', 'zephan': 'Neutral', 'selene': 'Female', 'tomoko': 'Female', 'stanton': 'Male', 'lura': 'Female', 'risa': 'Female', 'jack': 'Male', 'jace': 'Neutral', 'leonor': 'Female', 'zonia': 'Female', 'keyanna': 'Female', 'venus': 'Female', 'fairfax': 'Male', 'eileen': 'Female', 'ellan': 'Female', 'lajuan': 'Male', 'sammie': 'Neutral', 'armandina': 'Female', 'vannessa': 'Female', 'anjali': 'Female', 'enoch': 'Male', 'mabelle': 'Female', 'faye': 'Female', 'liam': 'Male', 'fidelio': 'Male', 'ruben': 'Male', 'blum': 'Neutral', 'sondo': 'Male', 'fidelia': 'Female', 'minta': 'Female', 'liberty': 'Neutral', 'kum': 'Female', 'minty': 'Neutral', 'julieann': 'Female', 'sudie': 'Female', 'jayson': 'Male', 'marquise': 'Male', 'zack': 'Male', 'zach': 'Male', 'zaci': 'Neutral', 'lilith': 'Female', 'nayeli': 'Neutral', 'beck': 'Male', 'yanka': 'Female', 'lera': 'Female', 'liseli': 'Female', 'nayely': 'Female', 'stevie': 'Neutral', 'myla': 'Female', 'berke': 'Male', 'hakan': 'Male', 'cydney': 'Female', 'jaleel': 'Male', 'tait': 'Neutral', 'alexzander': 'Male', 'julio': 'Male', 'kieran': 'Neutral', 'rebbeca': 'Female', 'melany': 'Female', 'ymir': 'Neutral', 'cheney': 'Male', 'julie': 'Female', 'julia': 'Female', 'madge': 'Female', 'patience': 'Female', 'sloane': 'Neutral', 'santino': 'Male', 'melani': 'Female', 'santina': 'Female', 'chimelu': 'Male', 'ebony': 'Female', 'zoie': 'Female', 'jovani': 'Male', 'chalsie': 'Female', 'harland': 'Male', 'octavious': 'Male', 'spike': 'Male', 'sachiko': 'Female', 'katungi': 'Male', 'adonai': 'Male', 'yuonne': 'Female', 'onie': 'Female', 'doda': 'Female', 'ma': 'Female', 'henri': 'Male', 'dylon': 'Male', 'mi': 'Female', 'lukas': 'Male', 'joie': 'Female', 'henry': 'Male', 'kiden': 'Female', 'ernest': 'Male', 'my': 'Female', 'carmel': 'Female', 'zella': 'Female', 'gordy': 'Male', 'pierrette': 'Female', 'lakisha': 'Female', 'chanda': 'Female', 'mohan': 'Neutral', 'ena': 'Female', 'willodean': 'Female', 'santana': 'Neutral', 'iggy': 'Male', 'elbert': 'Male', 'breighanna': 'Female', 'iggi': 'Male', 'quirino': 'Male', 'elizabeth': 'Female', 'haven': 'Neutral', 'lashandra': 'Female', 'tyriq': 'Male', 'jaydon': 'Male', 'montague': 'Male', 'tyrin': 'Male', 'judie': 'Female', 'tyrik': 'Male', 'kiyoko': 'Female', 'nokomis': 'Female', 'lecea': 'Female', 'danny': 'Neutral', 'amie': 'Female', 'yaron': 'Male', 'candie': 'Female', 'harley': 'Neutral', 'allison': 'Female', 'conlan': 'Male', 'aldon': 'Male', 'danna': 'Female', 'seamus': 'Male', 'amir': 'Male', 'glynda': 'Female', 'castel': 'Neutral', 'orane': 'Neutral', 'ophira': 'Female', 'tayler': 'Neutral', 'georgianna': 'Female', 'vito': 'Male', 'georgianne': 'Female', 'vita': 'Female', 'leatha': 'Female', 'leonora': 'Female', 'tisha': 'Female', 'rayya': 'Female', 'kaitlynn': 'Female', 'wilton': 'Male', 'makeda': 'Female', 'sonya': 'Female', 'noemi': 'Female', 'tayla': 'Female', 'osgood': 'Male', 'pennie': 'Female', 'eugena': 'Female', 'eugene': 'Male', 'arnulfo': 'Male', 'roshaun': 'Male', 'tempie': 'Female', 'akili': 'Male', 'lente': 'Neutral', 'hiedi': 'Female', 'alma': 'Female', 'alex': 'Neutral', 'carha': 'Female', 'jairo': 'Male', 'chuck': 'Male', 'sherlyn': 'Female', 'bunny': 'Female', 'sanyu': 'Neutral', 'evelia': 'Female', 'angus': 'Male', 'evelin': 'Female', 'thema': 'Female', 'alec': 'Male', 'neoma': 'Female', 'diann': 'Female', 'diana': 'Female', 'diane': 'Female', 'neomi': 'Female', 'elwood': 'Male', 'evia': 'Female', 'yvette': 'Female', 'voncile': 'Female', 'renetta': 'Female', 'vada': 'Female', 'dewitt': 'Male', 'dyllan': 'Male', 'nyeki': 'Female', 'nita': 'Female', 'creola': 'Neutral', 'aja': 'Neutral', 'everett': 'Male', 'quentin': 'Male', 'ruthann': 'Female', 'sana': 'Female', 'fred': 'Male', 'delphine': 'Female', 'rain': 'Neutral', 'jonie': 'Female', 'maribel': 'Female', 'jonelle': 'Female', 'poria': 'Female', 'fabienne': 'Female', 'hobert': 'Male', 'arline': 'Female', 'korene': 'Female', 'rane': 'Female', 'mashell': 'Female', 'rana': 'Female', 'gazelle': 'Female', 'orson': 'Male', 'marisol': 'Female', 'bridgit': 'Female', 'ryley': 'Male', 'vondila': 'Female', 'thomasena': 'Female', 'enid': 'Female', 'jefferey': 'Male', 'koen': 'Male', 'quinto': 'Male', 'toi': 'Female', 'magda': 'Female', 'anabella': 'Female', 'tom': 'Male', 'ujana': 'Female', 'quinta': 'Female', 'tod': 'Male', 'mistie': 'Female', 'urban': 'Neutral', 'kenton': 'Male', 'bethzy': 'Female', 'pasi': 'Neutral', 'alondra': 'Female', 'shaunna': 'Female', 'babette': 'Female', 'stacee': 'Female', 'karena': 'Female', 'bethann': 'Female', 'laquita': 'Female', 'mirta': 'Female', 'charlie': 'Neutral', 'franchesca': 'Female', 'stacey': 'Female', 'rad': 'Male', 'rae': 'Female', 'cayla': 'Female', 'rashaad': 'Male', 'breckin': 'Neutral', 'nyah': 'Female', 'marlas': 'Neutral', 'beckett': 'Male', 'ray': 'Neutral', 'derex': 'Male', 'harper': 'Neutral', 'snow': 'Female', 'brandon': 'Male', 'mariano': 'Male', 'derek': 'Male', 'rider': 'Male', 'ryne': 'Male', 'waylon': 'Male', 'michale': 'Male', 'khalipha': 'Female', 'shela': 'Female', 'shianne': 'Female', 'jean': 'Neutral', 'floy': 'Female', 'kalkin': 'Male', 'flor': 'Female', 'maimun': 'Neutral', 'philyra': 'Female', 'declan': 'Male', 'lyle': 'Neutral', 'yang': 'Female', 'lyla': 'Female', 'carolin': 'Female', 'dagny': 'Female', 'ulla': 'Female', 'jaycee': 'Female', 'constance': 'Female', 'agnes': 'Female', 'gladis': 'Female', 'toccara': 'Female', 'tahj': 'Male', 'queen': 'Female', 'sage': 'Neutral', 'maribeth': 'Female', 'tavion': 'Male', 'tremaine': 'Male', 'amirah': 'Female', 'kale': 'Male', 'soledad': 'Female', 'lilac': 'Female', 'stephany': 'Female', 'alima': 'Female', 'hyon': 'Female', 'stephane': 'Female', 'vinny': 'Male', 'susana': 'Female', 'stephani': 'Female', 'madaline': 'Female', 'florene': 'Female', 'haracha': 'Female', 'devante': 'Male', 'cecilia': 'Female', 'catalin': 'Female', 'shila': 'Female', 'eitan': 'Male', 'tammy': 'Female', 'quennell': 'Neutral', 'iliana': 'Female', 'sabrina': 'Female', 'trevin': 'Male', 'leverett': 'Male', 'gareth': 'Male', 'kenadia': 'Neutral', 'kenadie': 'Neutral', 'hilma': 'Female', 'garett': 'Male', 'janiah': 'Female', 'agripina': 'Female', 'imala': 'Female', 'robbi': 'Neutral', 'habib': 'Male', 'margarette': 'Female', 'margaretta': 'Female', 'robby': 'Neutral', 'ayako': 'Female', 'bee': 'Female', 'floriane': 'Female', 'brennen': 'Male', 'sherril': 'Female', 'renda': 'Female', 'xanto': 'Male', 'sherrie': 'Female', 'antionette': 'Female', 'krystyna': 'Female', 'mui': 'Female', 'deiter': 'Male', 'kyree': 'Male', 'lupe': 'Female', 'felisha': 'Female', 'rima': 'Female', 'christa': 'Female', 'meredith': 'Neutral', 'terrene': 'Female', 'miyoko': 'Female', 'alanna': 'Female', 'elinor': 'Female', 'karey': 'Female', 'sullivan': 'Male', 'bettina': 'Female', 'semele': 'Female', 'karen': 'Female', 'kaylan': 'Female', 'celestyn': 'Female', 'kiho': 'Neutral', 'katarina': 'Female', 'benen': 'Neutral', 'jadzia': 'Female', 'lucrecia': 'Female', 'hija': 'Female', 'gidget': 'Female', 'genet': 'Male', 'kelsi': 'Female', 'elza': 'Female', 'pallas': 'Neutral', 'yusuf': 'Male', 'gemma': 'Female', 'nataleigh': 'Female', 'raegan': 'Female', 'trini': 'Female', 'fallon': 'Neutral', 'concetta': 'Female', 'abdiel': 'Male', 'elu': 'Neutral', 'ishaan': 'Male', 'della': 'Female', 'veronica': 'Female', 'brayan': 'Male', 'anatole': 'Male', 'anatola': 'Male', 'kendis': 'Neutral', 'lottie': 'Female', 'tresa': 'Female', 'myrta': 'Female', 'nika': 'Female', 'danyelle': 'Female', 'shawanna': 'Female', 'camellia': 'Female', 'niko': 'Male', 'keaira': 'Female', 'lynelle': 'Female', 'millie': 'Female', 'afric': 'Female', 'marjory': 'Female', 'yung': 'Female', 'lizbeth': 'Female', 'kwanita': 'Female', 'theodore': 'Male', 'theodora': 'Female', 'romello': 'Male', 'moke': 'Neutral', 'tyson': 'Male', 'dylan': 'Neutral', 'faustino': 'Male', 'janelle': 'Female', 'faustina': 'Female', 'faustine': 'Female', 'karine': 'Female', 'spencer': 'Male', 'karina': 'Female', 'gilda': 'Female', 'tamya': 'Female', 'britteny': 'Female', 'wasaki': 'Male', 'alexandria': 'Female', 'campbell': 'Neutral', 'gunner': 'Male', 'karleen': 'Female', 'yolonda': 'Female', 'eli': 'Neutral', 'didrika': 'Female', 'cherry': 'Female', 'ela': 'Female', 'keli': 'Female', 'trina': 'Female', 'ely': 'Female', 'petula': 'Female', 'trinh': 'Female', 'cherri': 'Female', 'suzan': 'Female', 'maryln': 'Female', 'anya': 'Female', 'remona': 'Female', 'carisa': 'Female', 'anais': 'Female', 'donat': 'Male', 'reyna': 'Female', 'glinda': 'Female', 'donal': 'Male', 'gracelyn': 'Female', 'rumor': 'Neutral', 'lavey': 'Neutral', 'kesha': 'Female', 'brooklynn': 'Female', 'earlie': 'Female', 'julieta': 'Female', 'soleil': 'Female', 'adria': 'Female', 'mirit': 'Neutral', 'shirlene': 'Female', 'hung': 'Male', 'ennis': 'Neutral', 'ninon': 'Female', 'orlando': 'Male', 'sophya': 'Female', 'jennifer': 'Female', 'rodrick': 'Male', 'donald': 'Male', 'petrina': 'Female', 'finna': 'Female', 'kineta': 'Female', 'setsuko': 'Female', 'sharlene': 'Female', 'malika': 'Female', 'hidi': 'Female', 'cora': 'Female', 'lalasa': 'Female', 'xander': 'Male', 'cori': 'Female', 'junita': 'Female', 'cort': 'Male', 'amos': 'Male', 'kimberlie': 'Female', 'sanjay': 'Neutral', 'cory': 'Neutral', 'isolde': 'Neutral', 'malaki': 'Male', 'jadon': 'Male', 'ronalee': 'Female', 'latrina': 'Female', 'estefania': 'Female', 'pomya': 'Neutral', 'curry': 'Male', 'osborn': 'Male', 'sharda': 'Female', 'duke': 'Male', 'randilyn': 'Female', 'duka': 'Male', 'javan': 'Male', 'fern': 'Female', 'crysta': 'Female', 'taffy': 'Neutral', 'pegeen': 'Female', 'abel': 'Male', 'yeva': 'Female', 'mieko': 'Female', 'anderson': 'Male', 'virgil': 'Male', 'gia': 'Female', 'tisa': 'Female', 'gin': 'Female', 'virgie': 'Female', 'gil': 'Male', 'torri': 'Female', 'dorthey': 'Female', 'dorthea': 'Female', 'bernice': 'Female', 'viva': 'Female', 'beckie': 'Female', 'harriette': 'Female', 'vivi': 'Female', 'madelenne': 'Female', 'adora': 'Female', 'noreen': 'Female', 'melita': 'Female', 'pelham': 'Neutral', 'ayla': 'Female', 'marya': 'Female', 'amandla': 'Female', 'margareta': 'Female', 'landon': 'Male', 'margarete': 'Female', 'sherie': 'Female', 'na': 'Female', 'tip': 'Neutral', 'ajani': 'Male', 'tim': 'Male', 'emerita': 'Female', 'margarett': 'Female', 'sasilvia': 'Female', 'nu': 'Female', 'eternity': 'Female', 'toan': 'Neutral', 'nohely': 'Female', 'adelyn': 'Female', 'phoenix': 'Neutral', 'teranika': 'Female', 'solana': 'Female', 'agueda': 'Female', 'marcelino': 'Male', 'cambria': 'Female', 'maureen': 'Female', 'cooper': 'Neutral', 'marceline': 'Female', 'marcelina': 'Female', 'justus': 'Male', 'ryder': 'Neutral', 'nancee': 'Female', 'cathleen': 'Female', 'yachi': 'Female', 'bambi': 'Female', 'azaria': 'Female', 'ron': 'Male', 'danita': 'Female', 'rob': 'Male', 'jaylan': 'Male', 'rod': 'Male', 'jaylah': 'Female', 'roy': 'Male', 'roz': 'Female', 'marion': 'Neutral', 'balthasar': 'Male', 'colleen': 'Female', 'ros': 'Female', 'brenda': 'Female', 'tosha': 'Female', 'tamasine': 'Male', 'brandie': 'Female', 'kineks': 'Female', 'octavia': 'Female', 'caine': 'Neutral', 'allisson': 'Female', 'lailah': 'Female', 'lurlene': 'Female', 'ibrahim': 'Male', 'derrek': 'Male', 'deirdra': 'Female', 'deirdre': 'Female', 'jebediah': 'Male', 'cathie': 'Female', 'vladimir': 'Male', 'valentin': 'Male', 'edan': 'Male', 'solada': 'Female', 'merlyn': 'Female', 'louvain': 'Neutral', 'yale': 'Neutral', 'shanda': 'Female', 'shandi': 'Female', 'trena': 'Female', 'colin': 'Male', 'trent': 'Male', 'treyvon': 'Male', 'ilea': 'Male', 'lorrine': 'Female', 'simeon': 'Male', 'kandace': 'Female', 'elroy': 'Male', 'cecile': 'Female', 'cecila': 'Female', 'lexine': 'Female', 'shawana': 'Female', 'cecily': 'Female', 'corby': 'Neutral', 'eliseo': 'Male', 'angelina': 'Female', 'kame': 'Male', 'angeline': 'Female', 'kami': 'Male', 'dulcinea': 'Female', 'michi': 'Female', 'shaquille': 'Male', 'olathe': 'Female', 'beauregard': 'Male', 'micha': 'Female', 'nga': 'Female', 'pearly': 'Female', 'jeanine': 'Female', 'dorie': 'Female', 'jorn': 'Male', 'doria': 'Female', 'fabrizio': 'Male', 'cinnamon': 'Female', 'paxton': 'Neutral', 'dorit': 'Female', 'janice': 'Female', 'barclay': 'Male', 'rafael': 'Male', 'ellamae': 'Female', 'pearle': 'Female', 'candice': 'Female', 'shelley': 'Female', 'lovella': 'Female', 'trinidad': 'Neutral', 'andi': 'Neutral', 'russell': 'Male', 'ande': 'Male', 'retha': 'Female', 'andy': 'Neutral', 'onita': 'Female', 'lanita': 'Female', 'dalia': 'Female', 'athena': 'Female', 'milford': 'Male', 'kerry': 'Neutral', 'takisha': 'Female', 'luvenia': 'Female', 'casey': 'Neutral', 'kerri': 'Neutral', 'ranae': 'Neutral', 'autumn': 'Female', 'judi': 'Female', 'malinda': 'Female', 'julius': 'Male', 'roscoe': 'Male', 'jude': 'Neutral', 'judd': 'Male', 'judy': 'Female', 'terrell': 'Male', 'rufus': 'Male', 'kym': 'Female', 'kya': 'Female', 'cherie': 'Female', 'bessie': 'Female', 'alverta': 'Female', 'odetta': 'Female', 'reece': 'Male', 'sidney': 'Neutral', 'jamika': 'Female', 'antoine': 'Male', 'rubin': 'Male', 'da-xia': 'Female', 'rubie': 'Female', 'lanora': 'Female', 'levi': 'Male', 'oleta': 'Female', 'liliha': 'Female', 'tanesia': 'Female', 'calixte': 'Female', 'deva': 'Female', 'kibibe': 'Female', 'yasuo': 'Male', 'devi': 'Female', 'evania': 'Female', 'gerard': 'Male', 'odysseus': 'Male', 'marguerita': 'Female', 'yule': 'Neutral', 'marguerite': 'Female', 'susannah': 'Female', 'tammara': 'Female', 'lucus': 'Male', 'cornelius': 'Male', 'felicia': 'Female', 'ronda': 'Female', 'wallace': 'Male', 'tenisha': 'Female', 'romona': 'Female', 'bibiana': 'Female', 'gwenda': 'Female', 'cheyenne': 'Neutral', 'vanida': 'Female', 'kacey': 'Neutral', 'alaqua': 'Female', 'jocasta': 'Female', 'cutter': 'Male', 'dacia': 'Female', 'lalita': 'Female', 'reyes': 'Male', 'xanthe': 'Neutral', 'damarion': 'Male', 'nicolasa': 'Female', 'shu': 'Female', 'elizbeth': 'Female', 'teri': 'Female', 'nami': 'Female', 'tera': 'Female', 'vanya': 'Female', 'benita': 'Female', 'benito': 'Male', 'kimmy': 'Female', 'donelle': 'Female', 'giada': 'Female', 'suzanne': 'Female', 'suzanna': 'Female', 'kena': 'Female', 'sybil': 'Female', 'celsa': 'Female', 'sha': 'Female', 'kanoa': 'Neutral', 'konner': 'Male', 'darron': 'Male', 'kent': 'Male', 'casimira': 'Female', 'gram': 'Male', 'orinda': 'Female', 'clover': 'Female', 'anwar': 'Male', 'wendie': 'Female', 'infant': 'Neutral', 'ferrol': 'Male', 'maximina': 'Female', 'lucius': 'Male', 'estella': 'Female', 'dirk': 'Male', 'estelle': 'Female', 'osaze': 'Neutral', 'netis': 'Female', 'tommye': 'Female', 'harlan': 'Male', 'raleigh': 'Neutral', 'qabil': 'Male', 'yun': 'Female', 'filomena': 'Female', 'yamin': 'Female', 'nariah': 'Female', 'sumiko': 'Female', 'merrill': 'Neutral', 'ezequiel': 'Male', 'mirabel': 'Female', 'keola': 'Female', 'katina': 'Female', 'george': 'Male', 'raguel': 'Female', 'gertrude': 'Female', 'ian': 'Male', 'eartha': 'Female', 'chastity': 'Female', 'nelia': 'Female', 'almira': 'Female', 'elkan': 'Male', 'holden': 'Male', 'hue': 'Female', 'shirlee': 'Female', 'antranig': 'Male', 'season': 'Female', 'hui': 'Female', 'alan': 'Male', 'danica': 'Female', 'angelena': 'Female', 'shirley': 'Female', 'milton': 'Male', 'maeko': 'Neutral', 'barrington': 'Male', 'nathan': 'Male', 'marinel': 'Neutral', 'bertram': 'Male', 'sherley': 'Female', 'joannie': 'Female', 'sera': 'Female', 'jeanene': 'Female', 'quilla': 'Female', 'rena': 'Female', 'michell': 'Female', 'rene': 'Neutral', 'ana': 'Female', 'chloe': 'Female', 'rowdy': 'Neutral', 'ann': 'Female', 'bennie': 'Neutral', 'anh': 'Female', 'ani': 'Female', 'mateo': 'Neutral', 'armida': 'Female', 'redford': 'Neutral', 'xaria': 'Female', 'ilona': 'Female', 'nerine': 'Female', 'nickole': 'Female', 'thadeus': 'Male', 'hershel': 'Male', 'cathern': 'Female', 'tyanne': 'Female', 'gustavo': 'Male', 'seghen': 'Neutral', 'laureen': 'Female', 'gustave': 'Male', 'kei': 'Neutral', 'lael': 'Female', 'giovani': 'Male', 'elspeth': 'Female', 'genevie': 'Female', 'braedon': 'Male', 'armando': 'Male', 'arvilla': 'Female', 'phindiwe': 'Neutral', 'armande': 'Male', 'sherman': 'Male', 'armanda': 'Female', 'zaniyah': 'Female', 'connor': 'Male', 'kathyrn': 'Female', 'rosalia': 'Female', 'rosalie': 'Female', 'bobette': 'Female', 'lisbet': 'Female', 'cortez': 'Male', 'tena': 'Female', 'taima': 'Female', 'yandel': 'Male', 'raja': 'Female', 'glenys': 'Female', 'akiko': 'Female', 'percy': 'Male', 'troy': 'Male', 'sileas': 'Female', 'signa': 'Female', 'landis': 'Male', 'braydon': 'Male', 'laquanda': 'Female', 'davonta': 'Male', 'cammy': 'Female', 'davonte': 'Male', 'nadie': 'Female', 'wood': 'Male', 'madeline': 'Neutral', 'nadia': 'Female', 'hanley': 'Male', 'landin': 'Male', 'hoyt': 'Male', 'nell': 'Female', 'taya': 'Female', 'talitha': 'Female', 'demarion': 'Male', 'julisha': 'Female', 'stacia': 'Female', 'vannesa': 'Female', 'stacie': 'Female', 'brigida': 'Female', 'alsatia': 'Female', 'shaneka': 'Female', 'dalene': 'Female', 'julinka': 'Female', 'stanley': 'Male', 'braden': 'Male', 'clarine': 'Female', 'cassey': 'Female', 'illias': 'Male', 'rochell': 'Female', 'brie': 'Female', 'prentice': 'Neutral', 'teisha': 'Female', 'dottie': 'Female', 'tylor': 'Male', 'odelia': 'Female', 'carolee': 'Female', 'keb': 'Male', 'ouida': 'Female', 'sirena': 'Female', 'kat': 'Female', 'devaki': 'Neutral', 'jessika': 'Female', 'dora': 'Female', 'daria': 'Female', 'dario': 'Male', 'darin': 'Male', 'jericho': 'Male', 'tarika': 'Female', 'lorie': 'Female', 'nantai': 'Male', 'loria': 'Female', 'berry': 'Male', 'migdalia': 'Female', 'sequina': 'Female', 'lorin': 'Neutral', 'creighton': 'Male', 'jahir': 'Male', 'nicolle': 'Female', 'nanette': 'Female', 'werner': 'Male', 'pok': 'Female', 'polo': 'Male', 'nicola': 'Female', 'nicole': 'Female', 'tonisha': 'Female', 'katlin': 'Female', 'howard': 'Male', 'abdul': 'Male', 'jessenia': 'Female', 'basilia': 'Female', 'edmund': 'Male', 'mairi': 'Female', 'andres': 'Male', 'maira': 'Female', 'nusa': 'Female', 'tamia': 'Female', 'tamie': 'Female', 'penn': 'Neutral', 'dahlia': 'Female', 'andrea': 'Female', 'andree': 'Female', 'case': 'Male', 'cash': 'Male', 'arnold': 'Male', 'sunee': 'Female', 'ally': 'Female', 'cass': 'Neutral', 'kaitlin': 'Female', 'nitesh': 'Male', 'elgin': 'Neutral', 'odis': 'Male', 'ellison': 'Male', 'carmelina': 'Female', 'isla': 'Female', 'leonia': 'Female', 'leonie': 'Female', 'kelvin': 'Male', 'coralia': 'Female', 'coralie': 'Female', 'butterfly': 'Female', 'lisette': 'Female', 'loreen': 'Female', 'mayra': 'Female', 'barabara': 'Female', 'shemar': 'Male', 'marybelle': 'Female', 'rance': 'Male', 'brede': 'Neutral', 'jumoke': 'Male', 'kattie': 'Female', 'mikalah': 'Female', 'antonetta': 'Female', 'antonette': 'Female', 'cloe': 'Female', 'juwan': 'Male', 'gavin': 'Male', 'roxane': 'Female', 'jaliyah': 'Female', 'roxana': 'Female', 'harrison': 'Male', 'yadiel': 'Male', 'roxann': 'Female', 'satin': 'Female', 'xanthus': 'Male', 'leta': 'Female', 'kimberli': 'Female', 'carylon': 'Female', 'rose': 'Female', 'rosa': 'Female', 'tonya': 'Female', 'kimberly': 'Female', 'hina': 'Female', 'rosy': 'Female', 'jaelynn': 'Female', 'seema': 'Female', 'ross': 'Male', 'volleny': 'Neutral', 'abbigail': 'Female', 'yuval': 'Male', 'kirby': 'Neutral', 'jimena': 'Female', 'virginia': 'Female', 'zayn': 'Neutral', 'katherin': 'Female', 'emileigh': 'Female', 'patrica': 'Female', 'patrice': 'Female', 'patrick': 'Male', 'ganit': 'Male', 'tia': 'Female', 'karmina': 'Female', 'kennedi': 'Neutral', 'aurea': 'Female', 'vangie': 'Female', 'meara': 'Female', 'drake': 'Male', 'garnett': 'Female', 'tangia': 'Female', 'malone': 'Neutral', 'yaeko': 'Female', 'serepta': 'Female', 'dudley': 'Male', 'moon': 'Neutral', 'silvana': 'Female', 'shareone': 'Female', 'porter': 'Neutral', 'freed': 'Male', 'letisha': 'Female', 'norberto': 'Male', 'freeda': 'Female', 'kawena': 'Female', 'naiser': 'Neutral', 'venita': 'Female', 'bryanne': 'Female', 'shantelle': 'Female', 'niesha': 'Female', 'ziya': 'Female', 'ok': 'Female', 'jelani': 'Male', 'brittany': 'Female', 'karan': 'Male', 'prunella': 'Female', 'rhys': 'Neutral', 'marisela': 'Female', 'gregory': 'Male', 'brittani': 'Female', 'kristeen': 'Female', 'amber': 'Female', 'garnet': 'Female', 'augustus': 'Male', 'penelope': 'Female', 'corentine': 'Female', 'marjorie': 'Female', 'gary': 'Male', 'burton': 'Male', 'denae': 'Female', 'kindra': 'Female', 'ponce': 'Male', 'ferris': 'Male', 'tiffany': 'Female', 'morrison': 'Neutral', 'vicente': 'Male', 'vicenta': 'Female', 'jud': 'Male', 'montego': 'Male', 'jun': 'Male', 'tyrek': 'Male', 'alair': 'Male', 'margart': 'Female', 'madie': 'Female', 'chrissy': 'Female', 'salome': 'Female', 'laverne': 'Female', 'shauna': 'Female', 'katrina': 'Female', 'laverna': 'Female', 'cassidy': 'Neutral', 'jaser': 'Male', 'ogden': 'Male', 'mallory': 'Female', 'taylor': 'Neutral', 'azucena': 'Female', 'felix': 'Male', 'cheyne': 'Female', 'britain': 'Neutral', 'donahi': 'Male', 'magdalen': 'Female', 'umay': 'Female', 'russel': 'Male', 'vashti': 'Female', 'emmalee': 'Female', 'letha': 'Female', 'heather': 'Female', 'orrin': 'Male', 'lavada': 'Female', 'nancey': 'Female', 'tifany': 'Female', 'dyani': 'Female', 'verne': 'Male', 'alexus': 'Female', 'paddy': 'Male', 'sully': 'Neutral', 'desirae': 'Female', 'jacinda': 'Female', 'kolby': 'Male', 'hwa': 'Female', 'remedios': 'Female', 'flower': 'Female', 'amiah': 'Female', 'jesusa': 'Female', 'dasha': 'Female', 'orien': 'Neutral', 'nayer': 'Neutral', 'domonique': 'Neutral', 'belden': 'Male', 'ewan': 'Male', 'lysa': 'Female', 'tanner': 'Neutral', 'phebe': 'Female', 'derrick': 'Male', 'booker': 'Male', 'shizue': 'Female', 'misae': 'Neutral', 'jeromy': 'Male', 'larue': 'Neutral', 'ali': 'Neutral', 'laci': 'Female', 'mardell': 'Neutral', 'tarra': 'Female', 'lacy': 'Female', 'abia': 'Female', 'jerome': 'Male', 'abie': 'Neutral', 'elfriede': 'Female', 'jessie': 'Neutral', 'elfrieda': 'Female', 'jessia': 'Female', 'paulos': 'Male', 'erminia': 'Female', 'aaron': 'Male', 'kuma': 'Neutral', 'kumi': 'Neutral', 'sona': 'Female', 'esther': 'Female', 'song': 'Female', 'calais': 'Female', 'caleigh': 'Female', 'donette': 'Female', 'talisha': 'Female', 'donetta': 'Female', 'alijah': 'Male', 'chasity': 'Female', 'fae': 'Female', 'morley': 'Neutral', 'lillie': 'Female', 'yasmin': 'Female', 'saniyah': 'Female', 'lisa': 'Female', 'parthenia': 'Female', 'venessa': 'Female', 'lise': 'Female', 'teo': 'Male', 'tea': 'Female', 'ted': 'Male', 'robyn': 'Female', 'tex': 'Male', 'ulises': 'Male', 'lynwood': 'Male', 'sherice': 'Female', 'kavi': 'Neutral', 'gertha': 'Female', 'reina': 'Female', 'sue': 'Female', 'mindy': 'Female', 'jeanice': 'Female', 'sun': 'Female', 'magnolia': 'Female', 'suk': 'Female', 'jeniffer': 'Female', 'kyan': 'Male', 'zivan': 'Neutral', 'tecla': 'Female', 'brier': 'Male', 'arlie': 'Male', 'edena': 'Female', 'christian': 'Neutral', 'therese': 'Female', 'deshawn': 'Male', 'nena': 'Female', 'theresa': 'Female', 'samatha': 'Female', 'meryl': 'Neutral', 'sorley': 'Male', 'myrl': 'Female', 'lilyana': 'Female', 'dalila': 'Female', 'myra': 'Female', 'agustin': 'Male', 'jaylen': 'Neutral', 'jaylee': 'Female', 'azzie': 'Female', 'delois': 'Female', 'toshi': 'Male', 'florence': 'Female', 'clifford': 'Male', 'jayme': 'Neutral', 'tonda': 'Female', 'sheehan': 'Female', 'branden': 'Male', 'fonda': 'Female', 'gigi': 'Female', 'brandee': 'Female', 'minor': 'Neutral', 'tryna': 'Female', 'israel': 'Male', 'natori': 'Neutral', 'nieves': 'Female', 'mira': 'Female', 'tylar': 'Male', 'yehuda': 'Male', 'floyd': 'Male', 'yehudi': 'Male', 'flan': 'Neutral', 'zinnia': 'Female', 'cleantha': 'Female', 'salvador': 'Neutral', 'berta': 'Female', 'berty': 'Neutral', 'alane': 'Female', 'kristopher': 'Male', 'teague': 'Male', 'renato': 'Male', 'renate': 'Neutral', 'deondre': 'Male', 'renata': 'Female', 'azul': 'Female', 'palesa': 'Female', 'norina': 'Female', 'jaymie': 'Female', 'norine': 'Female', 'isabis': 'Female', 'kecia': 'Female', 'peregrine': 'Female', 'alyson': 'Female', 'tertius': 'Male', 'gisela': 'Female', 'gisele': 'Female', 'ofira': 'Female', 'maddison': 'Female', 'sanjeet': 'Neutral', 'vlad': 'Male', 'sabine': 'Female', 'ivie': 'Female', 'horacio': 'Male', 'deonte': 'Male', 'sabina': 'Female', 'okal': 'Neutral', 'davante': 'Male', 'pyralis': 'Neutral', 'svea': 'Female', 'malena': 'Female', 'uang': 'Male', 'mirna': 'Female', 'susan': 'Female', 'marlon': 'Male', 'celena': 'Female', 'ozell': 'Female', 'trevor': 'Male', 'marica': 'Female', 'marlow': 'Neutral', 'trevon': 'Male', 'adriel': 'Male', 'adrien': 'Male', 'carmelo': 'Male', 'jenell': 'Female', 'xuan': 'Female', 'essence': 'Female', 'nylah': 'Female', 'emmanuel': 'Male', 'carmela': 'Female', 'wyanet': 'Neutral', 'logan': 'Neutral', 'shellie': 'Neutral', 'wilmer': 'Male', 'sinclair': 'Male', 'vaughan': 'Neutral', 'leanne': 'Female', 'nannie': 'Female', 'melisa': 'Female', 'jamese': 'Neutral', 'jacoby': 'Male', 'hachi': 'Female', 'beyonce': 'Female', 'rylan': 'Neutral', 'abbey': 'Female', 'ricardo': 'Male', 'jacoba': 'Female', 'scot': 'Male', 'stephen': 'Male', 'argentina': 'Female', 'retta': 'Female', 'hunter': 'Neutral', 'kerrie': 'Female', 'samson': 'Neutral', 'casie': 'Female', 'vaughn': 'Neutral', 'gannon': 'Male', 'marcus': 'Male', 'braima': 'Female', 'ranee': 'Female', 'ryker': 'Male', 'alaine': 'Female', 'alaina': 'Female', 'lieselotte': 'Female', 'wilbert': 'Male', 'meagan': 'Female', 'kenisha': 'Female', 'willetta': 'Female', 'kymani': 'Male', 'trystan': 'Male', 'willette': 'Female', 'raechel': 'Female', 'charolette': 'Female', 'lola': 'Female', 'edwina': 'Female', 'suzy': 'Female', 'nealon': 'Male', 'latanya': 'Female', 'hisako': 'Female', 'enos': 'Male', 'claribel': 'Female', 'arvid': 'Neutral', 'viridiana': 'Female', 'etan': 'Male', 'xylon': 'Neutral', 'laurice': 'Female', 'benjamin': 'Male', 'danilo': 'Male', 'clora': 'Female', 'rikki': 'Female', 'kathrine': 'Female', 'shantell': 'Female', 'zbigniew': 'Male', 'oliana': 'Female', 'svetlana': 'Female', 'sylvester': 'Male', 'ayaan': 'Male', 'tova': 'Female', 'miette': 'Female', 'deja': 'Female', 'dina': 'Female', 'dino': 'Male', 'damari': 'Male', 'myrtice': 'Female', 'dinh': 'Male', 'bernadette': 'Female', 'sailor': 'Neutral', 'heinz': 'Male', 'pablo': 'Male', 'pabla': 'Female', 'cherlyn': 'Female', 'bidelia': 'Female', 'micheline': 'Female', 'michelina': 'Female', 'jacquelin': 'Female', 'storm': 'Neutral', 'ayoka': 'Female', 'shawanda': 'Female', 'dacey': 'Neutral', 'blaise': 'Male', 'jajuan': 'Male', 'adonia': 'Female', 'bernita': 'Female', 'alesia': 'Female', 'karon': 'Female', 'king': 'Male', 'karol': 'Female', 'kina': 'Female', 'ellyn': 'Female', 'zachary': 'Male', 'charlot': 'Female', 'dann': 'Female', 'jannet': 'Female', 'nathalie': 'Female', 'dane': 'Male', 'leoma': 'Female', 'dana': 'Neutral', 'rosamaria': 'Female', 'arissa': 'Female', 'noella': 'Female', 'noelle': 'Female', 'oakes': 'Neutral', 'gale': 'Neutral', 'garfield': 'Male', 'gala': 'Female', 'fionn': 'Female', 'fiona': 'Female', 'oriole': 'Neutral', 'gali': 'Male', 'wilson': 'Male', 'kovit': 'Male', 'judah': 'Male', 'sherri': 'Female', 'kabibe': 'Female', 'dierdra': 'Female', 'dierdre': 'Female', 'sherry': 'Female', 'baka': 'Female', 'kagami': 'Female', 'banji': 'Neutral', 'yitta': 'Female', 'gili': 'Female', 'amal': 'Female', 'aman': 'Female', 'rumer': 'Neutral', 'alake': 'Male', 'narcisa': 'Female', 'sandra': 'Female', 'britton': 'Male', 'deane': 'Female', 'deana': 'Female', 'elois': 'Female', 'deann': 'Female', 'artemis': 'Neutral', 'mayola': 'Female', 'kalyn': 'Female', 'shalanda': 'Female', 'deion': 'Male', 'bernadine': 'Female', 'juliann': 'Female', 'melodi': 'Female', 'juliana': 'Female', 'saraid': 'Neutral', 'juliane': 'Female', 'yoninah': 'Female', 'cameo': 'Neutral', 'melody': 'Female', 'favian': 'Male', 'rosella': 'Female', 'tilly': 'Neutral', 'roselle': 'Female', 'derry': 'Neutral', 'brigette': 'Female', 'hayleigh': 'Female', 'loida': 'Female', 'kevon': 'Male', 'rayan': 'Male', 'pascale': 'Male', 'carmine': 'Male', 'moses': 'Male', 'carmina': 'Female', 'billye': 'Female', 'nickie': 'Neutral', 'alicia': 'Female', 'coty': 'Neutral', 'camlin': 'Female', 'tomas': 'Male', 'kamilia': 'Female', 'shirlyn': 'Female', 'jeanna': 'Female', 'jeanne': 'Female', 'metta': 'Female', 'brendan': 'Male', 'dijon': 'Male', 'brennon': 'Male', 'carlotta': 'Female', 'maryjane': 'Female', 'denisha': 'Female', 'vincent': 'Male', 'sanaa': 'Female', 'stefania': 'Female', 'art': 'Male', 'bart': 'Male', 'stefanie': 'Female', 'ethel': 'Female', 'dionysius': 'Male', 'esmeralda': 'Female', 'nakesha': 'Female', 'kylie': 'Neutral', 'ara': 'Female', 'barb': 'Female', 'reba': 'Female', 'matia': 'Female', 'devorit': 'Female', 'daysi': 'Female', 'bari': 'Female', 'ari': 'Neutral', 'dumi': 'Neutral', 'inge': 'Female', 'mauli': 'Neutral', 'hanzila': 'Female', 'inga': 'Female', 'nestor': 'Male', 'jasmin': 'Female', 'natara': 'Female', 'clarinda': 'Female', 'joyslyn': 'Female', 'paisley': 'Neutral', 'conroy': 'Male', 'ressie': 'Female', 'latia': 'Female', 'erna': 'Female', 'zelia': 'Female', 'korey': 'Male', 'annis': 'Female', 'carnig': 'Male', 'dulcina': 'Female', 'namir': 'Neutral', 'roman': 'Neutral', 'annie': 'Female', 'jackeline': 'Female', 'delila': 'Female', 'camie': 'Female', 'danyell': 'Female', 'ozie': 'Female', 'taru': 'Neutral', 'gaige': 'Male', 'ravi': 'Male', 'seiko': 'Neutral', 'fergal': 'Male', 'gittel': 'Female', 'caspar': 'Male', 'duc': 'Male', 'pa': 'Female', 'brice': 'Male', 'sheron': 'Female', 'meaghan': 'Female', 'nicol': 'Female', 'chandler': 'Neutral', 'neha': 'Female', 'eleonor': 'Female', 'kaseko': 'Male', 'georgia': 'Neutral', 'conception': 'Female', 'georgie': 'Neutral', 'mikaela': 'Female', 'triston': 'Male', 'devonte': 'Male', 'melia': 'Female', 'lenard': 'Male', 'devonta': 'Male', 'carletta': 'Female', 'rio': 'Male', 'leann': 'Female', 'speranza': 'Female', 'leane': 'Female', 'leana': 'Female', 'ria': 'Female', 'ignacio': 'Male', 'santos': 'Male', 'margret': 'Female', 'madisyn': 'Female', 'latonya': 'Female', 'ignacia': 'Female', 'shira': 'Female', 'hester': 'Female', 'viola': 'Female', 'shiri': 'Female', 'shirl': 'Female', 'fredia': 'Female', 'kathrin': 'Female', 'tyisha': 'Female', 'epifanio': 'Male', 'epifania': 'Female', 'kelcie': 'Female', 'birch': 'Male', 'milissa': 'Female', 'dareh': 'Male', 'daren': 'Male', 'antonietta': 'Female', 'corinne': 'Female', 'iraida': 'Female', 'doris': 'Female', 'lawanda': 'Female', 'martell': 'Male', 'sela': 'Female', 'lexus': 'Female', 'prince': 'Male', 'shaina': 'Female', 'adrienne': 'Female', 'hsiu': 'Female', 'alysia': 'Female', 'andria': 'Female', 'gema': 'Female', 'caesar': 'Male', 'lakita': 'Female', 'jacinta': 'Female', 'lovie': 'Female', 'orton': 'Male', 'fremont': 'Male', 'kass': 'Male', 'lilian': 'Female', 'kasi': 'Female', 'angelita': 'Female', 'brit': 'Neutral', 'angelito': 'Male', 'tyreese': 'Male', 'robbyn': 'Female', 'mariah': 'Female', 'marlie': 'Female', 'mariam': 'Female', 'marian': 'Female', 'nasser': 'Male', 'marlin': 'Neutral', 'arthur': 'Male', 'judson': 'Male', 'rigoberto': 'Male', 'kendal': 'Neutral', 'jahiem': 'Male', 'tanika': 'Female', 'piedad': 'Female', 'brylee': 'Female', 'alphonso': 'Male', 'alphonse': 'Male', 'etsuko': 'Female', 'bree-anna': 'Female', 'jimmie': 'Male', 'meda': 'Female', 'dayton': 'Neutral', 'lorraine': 'Female', 'anne': 'Female', 'anna': 'Female', 'shena': 'Female', 'pirro': 'Neutral', 'yvon': 'Male', 'myrladis': 'Neutral', 'kieth': 'Male', 'skyla': 'Female', 'kelsey': 'Neutral', 'juji': 'Female', 'orly': 'Neutral', 'danyl': 'Male', 'devlin': 'Male', 'kelsea': 'Neutral', 'othello': 'Male', 'orla': 'Female', 'lorean': 'Female', 'coralee': 'Female', 'leonel': 'Male', 'orli': 'Female', 'jamarcus': 'Male', 'lavenia': 'Female', 'alleen': 'Female', 'cece': 'Female', 'dalit': 'Male', 'caelan': 'Neutral', 'lisimba': 'Female', 'mikhail': 'Male', 'dwight': 'Male', 'caelah': 'Female', 'moss': 'Neutral', 'belicia': 'Female', 'elvira': 'Female', 'daphne': 'Female', 'jerlene': 'Female', 'damita': 'Female', 'joella': 'Female', 'johna': 'Female', 'gaven': 'Male', 'loni': 'Female', 'sonny': 'Male', 'leisa': 'Female', 'isabela': 'Female', 'lona': 'Female', 'isabell': 'Female', 'long': 'Male', 'chauncey': 'Neutral', 'amelie': 'Female', 'corie': 'Female', 'charmaine': 'Female', 'lexi': 'Female', 'vienna': 'Female', 'melodie': 'Female', 'pebbles': 'Female', 'paityn': 'Female', 'tate': 'Neutral', 'lyndsey': 'Female', 'karlie': 'Female', 'delta': 'Female', 'junior': 'Male', 'denisse': 'Female', 'arjun': 'Male', 'elida': 'Female', 'fico': 'Male', 'gerda': 'Female', 'elizabet': 'Female', 'winthrop': 'Male', 'hedwig': 'Female', 'huso': 'Female', 'inell': 'Female', 'kathryn': 'Female', 'trahern': 'Male', 'garyn': 'Neutral', 'siobhan': 'Female', 'ammie': 'Female', 'graham': 'Male', 'tomeka': 'Female', 'ellard': 'Male', 'saffron': 'Female', 'nick': 'Male', 'annemarie': 'Female', 'adyson': 'Female', 'raina': 'Female', 'kamal': 'Male', 'myrle': 'Female', 'raine': 'Female', 'ormanda': 'Female', 'dale': 'Male', 'maeron': 'Neutral', 'aleah': 'Female', 'janella': 'Female', 'sheryll': 'Female', 'jedidiah': 'Male', 'litzy': 'Female', 'bela': 'Female', 'kenan': 'Male', 'elfreda': 'Female', 'aliya': 'Female', 'chynna': 'Female', 'belva': 'Female', 'aiko': 'Female', 'karma': 'Female', 'kaylie': 'Female', 'ashton': 'Neutral', 'nerys': 'Female', 'kaylin': 'Female', 'mardi': 'Female', 'darrin': 'Male', 'teodora': 'Female', 'aylin': 'Female', 'baruch': 'Male', 'libbie': 'Female', 'winda': 'Female', 'teodoro': 'Male', 'jacqualine': 'Female', 'steve': 'Male', 'windy': 'Female', 'zavier': 'Male', 'torii': 'Neutral', 'sidra': 'Female', 'torie': 'Female', 'simon': 'Male', 'syreeta': 'Female', 'ivria': 'Female', 'junie': 'Female', 'kinley': 'Female', 'tasmine': 'Female', 'ivrit': 'Male', 'celia': 'Female', 'aubrie': 'Female', 'virote': 'Male', 'gino': 'Male', 'yitro': 'Male', 'yves': 'Male', 'gina': 'Female', 'wanda': 'Female', 'lanza': 'Female', 'alden': 'Male', 'ja': 'Female', 'machelle': 'Female', 'bryant': 'Male', 'harlow': 'Male', 'jerrold': 'Male', 'maurilio': 'Male', 'carlen': 'Neutral', 'nowles': 'Neutral', 'marilynn': 'Female', 'eldora': 'Female', 'claudia': 'Female', 'claudie': 'Female', 'dagmar': 'Male', 'karson': 'Male', 'tuyen': 'Female', 'claudio': 'Male', 'osvaldo': 'Male', 'lisandra': 'Female', 'lisandro': 'Male', 'ummi': 'Neutral', 'doane': 'Neutral', 'amiee': 'Female', 'kris': 'Neutral', 'adelle': 'Female', 'amiel': 'Neutral', 'adella': 'Female', 'giza': 'Female', 'hiero': 'Male', 'ginny': 'Female', 'luella': 'Female', 'casondra': 'Female', 'aelan': 'Female', 'shaquan': 'Male', 'helaine': 'Female', 'desiree': 'Female', 'astrid': 'Female', 'tannar': 'Neutral', 'moanna': 'Female', 'cleopatra': 'Female', 'calvin': 'Male', 'themba': 'Neutral', 'verline': 'Female', 'sheila': 'Female', 'delana': 'Female', 'lorimer': 'Male', 'kristine': 'Female', 'reda': 'Neutral', 'nomlanga': 'Neutral', 'yestin': 'Neutral', 'kristina': 'Female', 'gabbi': 'Female', 'savanah': 'Female', 'stanislaus': 'Male', 'cili': 'Female', 'geri': 'Female', 'eleazar': 'Male', 'inez': 'Female', 'vella': 'Female', 'rakeem': 'Male', 'tabitha': 'Female', 'ines': 'Female', 'dejah': 'Neutral', 'krysta': 'Female', 'tameron': 'Male', 'rozalia': 'Female', 'sora': 'Female', 'connie': 'Female', 'edaline': 'Female', 'amorina': 'Female', 'nawal': 'Neutral', 'annmarie': 'Female', 'ram': 'Male', 'annot': 'Neutral', 'hedda': 'Female', 'margert': 'Female', 'taurean': 'Male', 'margery': 'Female', 'chin': 'Female', 'rashawn': 'Male', 'douglass': 'Male', 'arlen': 'Male', 'cierra': 'Female', 'carrol': 'Neutral', 'anemone': 'Female', 'ziven': 'Neutral', 'tad': 'Male', 'tyron': 'Male', 'hilton': 'Male', 'odette': 'Female', 'tam': 'Female', 'enrique': 'Male', 'tao': 'Neutral', 'tai': 'Neutral', 'taj': 'Male', 'siu': 'Female', 'felisa': 'Female', 'jeraldine': 'Female', 'madden': 'Neutral', 'izabellah': 'Female', 'camille': 'Female', 'brian': 'Male', 'camilla': 'Female', 'kachina': 'Female', 'sid': 'Male', 'chanell': 'Female', 'antione': 'Male', 'tacy': 'Female', 'kostya': 'Female', 'bertie': 'Neutral', 'derick': 'Male', 'derica': 'Female', 'eolande': 'Female', 'emelda': 'Female', 'ludivina': 'Female', 'martine': 'Female', 'martina': 'Female', 'ahcy': 'Female', 'jolie': 'Female', 'elie': 'Female', 'evelynn': 'Female', 'elia': 'Female', 'elin': 'Female', 'brandan': 'Male', 'iryl': 'Male', 'evelyne': 'Female', 'joanne': 'Female', 'jaylin': 'Neutral', 'joanna': 'Female', 'charlena': 'Female', 'laylah': 'Female', 'efrain': 'Male', 'eliz': 'Female', 'glen': 'Male', 'philippa': 'Female', 'roja': 'Female', 'franki': 'Neutral', 'hildred': 'Female', 'tyler': 'Neutral', 'dermot': 'Male', 'maryalice': 'Female', 'caroll': 'Female', 'carola': 'Female', 'holiday': 'Female', 'carole': 'Female', 'freeman': 'Male', 'wolfgang': 'Male', 'deven': 'Neutral', 'aisling': 'Female', 'bingham': 'Male', 'emerald': 'Female', 'suellen': 'Female', 'trae': 'Male', 'billi': 'Female', 'kezia': 'Female', 'glayds': 'Female', 'darcy': 'Female', 'tran': 'Female', 'billy': 'Male', 'darci': 'Female', 'edie': 'Neutral', 'bentley': 'Neutral', 'hyun': 'Female', 'deegan': 'Male', 'lilah': 'Female', 'terresa': 'Female', 'taelor': 'Female', 'pam': 'Female', 'zaire': 'Neutral', 'lerato': 'Male', 'randee': 'Female', 'nannette': 'Female', 'jalen': 'Neutral', 'chyna': 'Female', 'hyman': 'Male', 'vic': 'Neutral', 'jailene': 'Female', 'sarina': 'Female', 'maryellen': 'Female', 'tamah': 'Female', 'harriett': 'Female', 'molly': 'Female', 'york': 'Male', 'jorryn': 'Neutral', 'yori': 'Female', 'idalee': 'Female', 'philip': 'Male', 'lazar': 'Male', 'nasir': 'Male', 'cais': 'Neutral', 'derrell': 'Male', 'barny': 'Male', 'horace': 'Male', 'adrian': 'Neutral', 'cain': 'Neutral', 'rudolf': 'Male', 'renna': 'Female', 'jarrell': 'Male', 'echo': 'Neutral', 'ornice': 'Male', 'jamya': 'Female', 'renny': 'Neutral', 'taegan': 'Neutral', 'donte': 'Male', 'sharmaine': 'Female', 'donta': 'Male', 'unknown': 'Neutral', 'rigg': 'Neutral', 'arista': 'Female', 'rylee': 'Neutral', 'stephan': 'Male', 'carleen': 'Female', 'abbie': 'Female', 'valda': 'Female', 'jule': 'Female', 'corliss': 'Female', 'juli': 'Female', 'kiera': 'Female', 'kinfe': 'Neutral', 'berneice': 'Female', 'verlene': 'Female', 'kellye': 'Female', 'linette': 'Female', 'july': 'Female', 'aaden': 'Male', 'ranit': 'Female', 'tommy': 'Male', 'xenia': 'Female', 'emmett': 'Male', 'rania': 'Female', 'cohen': 'Male', 'alfonso': 'Male', 'conary': 'Neutral', 'alexa': 'Female', 'zayden': 'Male', 'angla': 'Female', 'clove': 'Male', 'angle': 'Female', 'kristy': 'Female', 'floria': 'Female', 'krista': 'Female', 'kristi': 'Female', 'martha': 'Female', 'keagan': 'Neutral', 'maurine': 'Female', 'deena': 'Female', 'loralee': 'Female', 'taniyah': 'Female', 'yuridia': 'Female', 'leonida': 'Female', 'xavier': 'Male', 'dena': 'Female', 'nenita': 'Female', 'dorotha': 'Female', 'vatusia': 'Female', 'myrna': 'Female', 'esme': 'Female', 'jazmin': 'Female', 'niel': 'Male', 'nikkos': 'Male', 'esma': 'Female', 'mikayla': 'Neutral', 'dorothy': 'Female', 'tarin': 'Neutral', 'tarik': 'Male', 'maryetta': 'Female', 'taniya': 'Female', 'rahul': 'Male', 'synan': 'Neutral', 'chipo': 'Female', 'daja': 'Female', 'silas': 'Male', 'tierra': 'Female', 'presley': 'Neutral', 'izefia': 'Female', 'titus': 'Male', 'qing-jao': 'Female', 'jaime': 'Neutral', 'kitoko': 'Neutral', 'jennine': 'Female', 'venedict': 'Male', 'kanga': 'Neutral', 'jaydan': 'Male', 'violet': 'Female', 'devora': 'Female', 'nasia': 'Female', 'yukiko': 'Female', 'landry': 'Male', 'aveline': 'Female', 'leigha': 'Female', 'avelina': 'Female', 'ashleigh': 'Female', 'mills': 'Neutral', 'junko': 'Female', 'theta': 'Female', 'grisel': 'Female', 'cicily': 'Female', 'amandus': 'Neutral', 'yamal': 'Male', 'desana': 'Female', 'joy': 'Female', 'amee': 'Female', 'addie': 'Female', 'duane': 'Male', 'job': 'Male', 'martika': 'Female', 'joe': 'Male', 'yahir': 'Male', 'joi': 'Female', 'percival': 'Male', 'jon': 'Male', 'barrett': 'Male', 'janell': 'Female', 'wilbur': 'Male', 'norbert': 'Male', 'tiera': 'Female', 'april': 'Female', 'zeki': 'Female', 'constantine': 'Male', 'rodney': 'Male', 'apria': 'Female', 'graig': 'Male', 'zeke': 'Male', 'kathline': 'Female', 'teige': 'Neutral', 'galina': 'Female', 'walt': 'Male', 'sharilyn': 'Female', 'lorrie': 'Female', 'bryanna': 'Female', 'shameka': 'Female', 'klara': 'Female', 'urijah': 'Male', 'kanisha': 'Female', 'grazia': 'Female', 'hinda': 'Female', 'jaden': 'Neutral', 'mike': 'Male', 'shanita': 'Female', 'mika': 'Neutral', 'miki': 'Female', 'mckinley': 'Female', 'peigi': 'Female', 'alyn': 'Female', 'ilom': 'Male', 'monahan': 'Neutral', 'reeves': 'Male', 'brenden': 'Male', 'karimah': 'Male', 'vicki': 'Female', 'odina': 'Female', 'will': 'Male', 'sebastien': 'Male', 'madeleine': 'Female', 'vicky': 'Neutral', 'tiffaney': 'Female', 'luetta': 'Female', 'thuy': 'Female', 'halina': 'Female', 'kyler': 'Neutral', 'tirza': 'Female', 'avi': 'Neutral', 'natania': 'Female', 'kylee': 'Female', 'ava': 'Female', 'unity': 'Female', 'jorden': 'Male', 'ince': 'Male', 'keneth': 'Male', 'ashli': 'Female', 'albertha': 'Female', 'lacresha': 'Female', 'jemima': 'Female', 'romeo': 'Male', 'ashly': 'Female', 'xiomara': 'Female', 'telly': 'Neutral', 'bastien': 'Male', 'suzi': 'Female', 'norah': 'Female', 'valeria': 'Female', 'tyne': 'Neutral', 'russom': 'Neutral', 'valerie': 'Female', 'albin': 'Male', 'jory': 'Neutral', 'oneida': 'Female', 'messiah': 'Male', 'emilee': 'Female', 'hamilton': 'Male', 'cristi': 'Female', 'carrie': 'Neutral', 'rachele': 'Female', 'shyanne': 'Female', 'crista': 'Female', 'dustan': 'Male', 'rachell': 'Female', 'cristy': 'Female', 'hali': 'Female', 'patria': 'Female', 'casper': 'Male', 'azalee': 'Female', 'nicky': 'Neutral', 'jara': 'Female', 'sky': 'Neutral', 'tawna': 'Female', 'auberta': 'Female', 'clyde': 'Male', 'nicki': 'Neutral', 'tawny': 'Female', 'larvall': 'Male', 'celeste': 'Female', 'ailish': 'Female', 'adolph': 'Male', 'leena': 'Female', 'celesta': 'Female', 'alisha': 'Female', 'knox': 'Male', 'neda': 'Female', 'sindy': 'Female', 'danelle': 'Female', 'kadeem': 'Male', 'lawson': 'Male', 'fatimah': 'Female', 'cletus': 'Male', 'james': 'Male', 'isadora': 'Female', 'morwenna': 'Female', 'jaimee': 'Neutral', 'elke': 'Female', 'fidella': 'Female', 'gautier': 'Male', 'kelby': 'Neutral', 'holley': 'Female', 'jennelle': 'Female', 'jeremy': 'Male', 'leah': 'Female', 'lean': 'Female', 'marivel': 'Female', 'leal': 'Neutral', 'madisen': 'Female', 'mckale': 'Neutral', 'francoise': 'Female', 'pasty': 'Female', 'haywood': 'Male', 'gratiana': 'Female', 'shonta': 'Female', 'kyna': 'Female', 'millicent': 'Female', 'wesley': 'Male', 'rianne': 'Female', 'mordecai': 'Male', 'tuyet': 'Female', 'daquan': 'Male', 'mellie': 'Female', 'mita': 'Female', 'katalin': 'Female', 'alisson': 'Female', 'daray': 'Neutral', 'idra': 'Female', 'francina': 'Female', 'asha': 'Female', 'francine': 'Female', 'prewitt': 'Male', 'jamee': 'Female', 'channing': 'Male', 'clifton': 'Male', 'colista': 'Female', 'dulcea': 'Female', 'jenine': 'Female', 'sabra': 'Female', 'van': 'Neutral', 'val': 'Neutral', 'indira': 'Female', 'cinderella': 'Female', 'jovianne': 'Female', 'cairo': 'Neutral', 'eulah': 'Female', 'tamar': 'Female', 'tamas': 'Male', 'bahari': 'Male', 'coye': 'Female', 'shani': 'Female', 'shane': 'Male', 'shana': 'Female', 'daphine': 'Female', 'fredrica': 'Female', 'riordan': 'Male', 'rutha': 'Female', 'mariel': 'Female', 'thyra': 'Female', 'tamera': 'Female', 'arne': 'Male', 'biana': 'Female', 'nerita': 'Female', 'anja': 'Female', 'jenny': 'Female', 'ailis': 'Female', 'aditya': 'Male', 'buffy': 'Female', 'providencia': 'Female', 'jenni': 'Female', 'mya': 'Female', 'jenna': 'Female', 'cason': 'Male', 'myrtle': 'Female', 'fraley': 'Male', 'oprah': 'Female', 'abigail': 'Female', 'krystyn': 'Female', 'sharron': 'Female', 'haruko': 'Male', 'haruki': 'Male', 'lance': 'Male', 'kevina': 'Female', 'juno': 'Neutral', 'assunta': 'Female', 'shery': 'Female', 'eupemia': 'Female', 'jung': 'Female', 'margaret': 'Female', 'reanna': 'Female', 'shera': 'Female', 'whitby': 'Male', 'sheri': 'Female', 'cliff': 'Male', 'rosamunde': 'Female', 'heidy': 'Female', 'xenos': 'Male', 'joneesha': 'Female', 'jewel': 'Female', 'emery': 'Neutral', 'felicitas': 'Female', 'emera': 'Female', 'heidi': 'Female', 'xenon': 'Male', 'caeleb': 'Male', 'heide': 'Female', 'wilma': 'Female'} diff --git a/requirements.txt b/requirements.txt index 886af18..a40c99f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,3 +8,4 @@ setuptools~=57.0.0 nltk~=3.7 Resiliparse~=0.13.5 syntok~=1.4.4 +python-dateutil \ No newline at end of file diff --git a/setup.py b/setup.py index bf90cad..2665cf7 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,8 @@ author='Chris Kamphuis', author_email='chris@cs.ru.nl', url='https://github.com/informagi/GeeseDB', - install_requires=['duckdb', 'numpy', 'pandas', 'protobuf', 'pycypher @ git+git://github.com/informagi/pycypher'], + install_requires=['duckdb', 'numpy', 'pandas', 'protobuf', 'pycypher @ git+git://github.com/informagi/pycypher', + 'nltk', 'resiliparse', 'syntok', 'python-dateutil'], packages=find_packages(), include_package_data=True, package_data={'': ['qrels.*', 'topics.*']},