Compare commits

...
2 Commits
28 changed files with 1083 additions and 780 deletions
+7
View File
@@ -1,3 +1,10 @@
HW3/results/*
HW3/results HW3/results
HW3/plots
HW4/results HW4/results
HW4/plots
HW5/results HW5/results
HW5/plots
HW5/plots/*
HW5/dataset.csv
HW5/trained_model.joblib
+13 -34
View File
@@ -19,11 +19,8 @@ class Pokemon:
raise ValueError(f"{move} is not an available move.") raise ValueError(f"{move} is not an available move.")
else: else:
self.moves_dict[move] = copy.deepcopy(gd.available_moves[move]) self.moves_dict[move] = copy.deepcopy(gd.available_moves[move])
print(gd.available_moves[move]['PP'])
print("TYPE", type(gd.available_moves[move]))
self.curr_hp = self.baseStats['hp'] self.curr_hp = self.baseStats['hp']
def _get_baseStats(self): def _get_baseStats(self):
return self.baseStats return self.baseStats
@@ -49,6 +46,7 @@ class Pokemon:
self.moves_dict[move] = gd.available_moves[move] self.moves_dict[move] = gd.available_moves[move]
def _useMove(self, move, opponent): def _useMove(self, move, opponent):
win_flag = False
if move['PP'] > 0: if move['PP'] > 0:
if random.random() < move['accuracy']: if random.random() < move['accuracy']:
if move['category'] == 'physical': if move['category'] == 'physical':
@@ -64,29 +62,32 @@ class Pokemon:
modifier = stability * effect * critical * luck modifier = stability * effect * critical * luck
damage = math.floor((( 2 * self.level + 10) / 250 * (attack / defense) * move['power'] + 2) * modifier) damage = math.floor((( 2 * self.level + 10) / 250 * (attack / defense) * move['power'] + 2) * modifier)
opponent.curr_hp -= damage opponent.curr_hp -= damage
if opponent.curr_hp < 0: if opponent.curr_hp < 0 or opponent.curr_hp == 0:
opponent.curr_hp = 0 opponent.curr_hp = 0
win_flag = True
print(f"{opponent.name} has fainted!")
print(f"{self.name} used {move['name']} and dealt {damage} damage to {opponent.name}!") print(f"{self.name} used {move['name']} and dealt {damage} damage to {opponent.name}!")
print("CPU's Pokemon current HP: ", opponent.curr_hp)
move['PP'] = move['PP'] - 1 move['PP'] = move['PP'] - 1
else: else:
print(f"{self.name}'s attack missed!") print(f"{self.name}'s attack missed!")
move['PP'] = move['PP'] - 1 move['PP'] = move['PP'] - 1
else: else:
print(f"{self.name} has no PP left for {move['name']}!") print(f"{self.name} has no PP left for {move['name']}!")
pass return win_flag
def useMove(self, move_name, opponent): def useMove(self, move_name, opponent):
if move_name not in self.moves_dict: if move_name not in self.moves_dict:
raise ValueError(f"{self.name} does not know the move {move_name}.") raise ValueError(f"{self.name} does not know the move {move_name}.")
else: else:
self._useMove(self.moves_dict[move_name], opponent) return self._useMove(self.moves_dict[move_name], opponent)
def print_move(self,move): def print_move(self,move):
print(f"Move: {self.moves_dict[move]['name']}") print(f"Move: {self.moves_dict[move]['name']}")
print(f"Type: {self.moves_dict[move]['type']}") #print(f"Type: {self.moves_dict[move]['type']}")
print(f"Category: {self.moves_dict[move]['category']}") #print(f"Category: {self.moves_dict[move]['category']}")
print(f"Power: {self.moves_dict[move]['power']}") print(f"Power: {self.moves_dict[move]['power']}")
print(f"Accuracy: {self.moves_dict[move]['accuracy']}") #print(f"Accuracy: {self.moves_dict[move]['accuracy']}")
print(f"PP: {self.moves_dict[move]['PP']}") print(f"PP: {self.moves_dict[move]['PP']}")
def get_moves(self): def get_moves(self):
@@ -111,7 +112,7 @@ class Pokemon:
class Trainer: class Trainer:
def __init__(self, name, starter_name, items = {"potions": 0, "pokeball": 0}, is_CPU = False): def __init__(self, name, starter_name, items = {}, is_CPU = False):
self.name = name self.name = name
if is_CPU: if is_CPU:
if starter_name not in gd.available_wild_pokemons: if starter_name not in gd.available_wild_pokemons:
@@ -171,28 +172,6 @@ class Trainer:
except ValueError as e: except ValueError as e:
raise e raise e
def print_items(self):
print(f"1) Potions: {self.items['potions']}")
print(f"2) Pokeballs: {self.items['pokeball']}")
def use_item(self, item_name):
if item_name not in self.items:
raise ValueError(f"{item_name} is not an available item.")
else:
if self.items[item_name] > 0:
self.items[item_name] -= 1 #use the item
print(f"Used {item_name}. Remaining: {self.items[item_name]}")
if item_name == "potions":
self.active_pokemon.curr_hp += 20
if self.active_pokemon.curr_hp > self.active_pokemon.baseStats['hp']:
self.active_pokemon.curr_hp = self.active_pokemon.baseStats['hp']
print(f"{self.active_pokemon.name} has been healed by 20 HP!")
return False
elif item_name == "pokeball":
return True
else:
raise ValueError(f"You have no {item_name} left.")
def update_pokemon_list(self, pokemon): def update_pokemon_list(self, pokemon):
pass pass
@@ -203,7 +182,7 @@ class Trainer:
print(f"Pokemon List: {[pok.name for pok in self.pokemon_list]}") print(f"Pokemon List: {[pok.name for pok in self.pokemon_list]}")
print("Active Pokemon info:") print("Active Pokemon info:")
self.active_pokemon.print_pokemon_info() self.active_pokemon.print_pokemon_info()
print("Detailed info of Pokemons in your list:") print("Detailed info of Pokemons in the list:")
print("-"*30) print("-"*30)
for pokemon in self.pokemon_list: for pokemon in self.pokemon_list:
pokemon.print_pokemon_info() pokemon.print_pokemon_info()
+17 -18
View File
@@ -1,8 +1,5 @@
import random import random
import math
import game_data as gd import game_data as gd
from core import Trainer from core import Trainer
def Main(): def Main():
@@ -19,11 +16,11 @@ def Main():
print(e) print(e)
print("Please try again...") print("Please try again...")
continue continue
trainer.print_trainer_info() #trainer.print_trainer_info()
cpu_trainer = Trainer(name="CPU", starter_name=random.choice(gd.available_starter_names)) cpu_trainer = Trainer(name="CPU", starter_name=random.choice(gd.available_wild_pokemon_names), is_CPU=True)
print(f"CPU has chosen {cpu_trainer.get_active_pokemon().name} as their starter Pokemon!") print(f"CPU has chosen {cpu_trainer.get_active_pokemon().name} as their starter Pokemon!")
cpu_trainer.print_trainer_info() #cpu_trainer.print_trainer_info()
continue_playing = True continue_playing = True
while continue_playing: while continue_playing:
selected_pokemon_combat_flag = False selected_pokemon_combat_flag = False
@@ -42,7 +39,6 @@ def Main():
print(f"Choose a move for {player_pokemon.name} to use against {cpu_trainer.get_active_pokemon().name}:\n", player_pokemon.get_moves()) print(f"Choose a move for {player_pokemon.name} to use against {cpu_trainer.get_active_pokemon().name}:\n", player_pokemon.get_moves())
player_move_name = input("Choose:") player_move_name = input("Choose:")
try: try:
#print the move selected by the player
print("Your selected move: ") print("Your selected move: ")
player_pokemon.checkout_move(player_move_name) player_pokemon.checkout_move(player_move_name)
selected_combat_move_flag = True selected_combat_move_flag = True
@@ -50,21 +46,24 @@ def Main():
print(e) print(e)
print("Please try again...") print("Please try again...")
#make a combat #combat
print('='*30) print('='*30)
print("BATTLE RESULTS:") print("BATTLE RESULTS:")
print("Your move:") print("Your move:")
player_pokemon.useMove(player_move_name, cpu_trainer.get_active_pokemon()) opponent_fainted = player_pokemon.useMove(player_move_name, cpu_trainer.get_active_pokemon())
player_pokemon.checkout_move(player_move_name) #player_pokemon.checkout_move(player_move_name)
print('-'*30) #print('-'*30)
print("CPU's pokemon") #print("CPU's pokemon")
cpu_trainer.get_active_pokemon().print_pokemon_info() #cpu_trainer.get_active_pokemon().print_pokemon_info()
print('='*30) #print('='*30)
if opponent_fainted:
print("Continue playing? (yes/no)") print("You won the battle!")
response = input().strip().lower()
if response != "yes":
continue_playing = False continue_playing = False
else:
print("Continue playing? (yes/no)")
response = input().strip().lower()
if response != "yes":
continue_playing = False
if __name__ == "__main__": if __name__ == "__main__":
+1 -1
View File
@@ -178,7 +178,7 @@ class Trainer:
raise ValueError(f"{item_name} is not an available item.") raise ValueError(f"{item_name} is not an available item.")
else: else:
if self.items[item_name] > 0: if self.items[item_name] > 0:
self.items[item_name] -= 1 #use the item self.items[item_name] -= 1
print(f"Used {item_name}. Remaining: {self.items[item_name]}") print(f"Used {item_name}. Remaining: {self.items[item_name]}")
if item_name == "potions": if item_name == "potions":
self.active_pokemon.curr_hp += 20 self.active_pokemon.curr_hp += 20
+3 -4
View File
@@ -160,7 +160,7 @@ def Main():
print("Adding potions and pokeballs to your inventory...") print("Adding potions and pokeballs to your inventory...")
trainer.items = {"potions": 10, "pokeball": 10} trainer.items = {"potions": 10, "pokeball": 10}
print("Your character is ready!") print("Your character is ready!")
trainer.print_trainer_info() #trainer.print_trainer_info()
player_created_flag = True player_created_flag = True
print(f"Welcome {trainer.name}! Your adventure begins now!") print(f"Welcome {trainer.name}! Your adventure begins now!")
except ValueError as e: except ValueError as e:
@@ -201,9 +201,9 @@ def Main():
battle_prob = random.uniform(0, 1) battle_prob = random.uniform(0, 1)
print(f"Battle probability: {battle_prob:.2f}") print(f"Battle probability: {battle_prob:.2f}")
if battle_prob < 0.8: if battle_prob < 0.8:
print("A wild Pokemon appeared!")
cpu_trainer = Trainer(name='CPU',starter_name=gd.available_wild_pokemon_names[random.randint(0,len(gd.available_wild_pokemon_names)-1)],is_CPU=True) cpu_trainer = Trainer(name='CPU',starter_name=gd.available_wild_pokemon_names[random.randint(0,len(gd.available_wild_pokemon_names)-1)],is_CPU=True)
print(cpu_trainer.get_active_pokemon().print_pokemon_info()) print(f"A wild {cpu_trainer.get_active_pokemon().name} appeared!")
#print(cpu_trainer.get_active_pokemon().print_pokemon_info())
game_status = 'battle' game_status = 'battle'
Battle(trainer,cpu_trainer) Battle(trainer,cpu_trainer)
else: else:
@@ -224,7 +224,6 @@ def Main():
else: else:
print("You exited the Pokemon Center.") print("You exited the Pokemon Center.")
game_status = 'story' game_status = 'story'
# Add Pokemon Center logic here
elif game_status == 'pokemon_store': elif game_status == 'pokemon_store':
print("You are in the Pokemon Store. You can buy items here.") print("You are in the Pokemon Store. You can buy items here.")
restore_items_flag = input("Type 'yes' to restore your items: ").strip().lower() restore_items_flag = input("Type 'yes' to restore your items: ").strip().lower()
-4
View File
@@ -21,7 +21,6 @@ class Pokemon:
self.moves_dict[move] = copy.deepcopy(gd.available_moves[move]) self.moves_dict[move] = copy.deepcopy(gd.available_moves[move])
self.curr_hp = self.baseStats['hp'] self.curr_hp = self.baseStats['hp']
def _get_baseStats(self): def _get_baseStats(self):
return self.baseStats return self.baseStats
@@ -51,9 +50,6 @@ class Pokemon:
self.moves_dict[move] = copy.deepcopy(gd.available_moves[move]) self.moves_dict[move] = copy.deepcopy(gd.available_moves[move])
def _compute_effect(self, move, opponent): def _compute_effect(self, move, opponent):
#check the move type (attack) and the defending
#pokemon type (defend) and look at effectiveness list.
#this should be done for all type of the defending pokemon
attack_move_type = move['type'] attack_move_type = move['type']
defending_types = opponent.get_types() defending_types = opponent.get_types()
+4 -4
View File
@@ -1,9 +1,9 @@
import json import json
import random import random
#load moves from json file
#eclude moves with power equal to null, #exclude moves with power equal to null,
# do not consider the effect,effects or changes fields #do not consider the effect,effects or changes fields
available_moves = dict() available_moves = dict()
keys_to_skip = ['effect','effects','changes'] keys_to_skip = ['effect','effects','changes']
with open('moves.json', 'r') as file: with open('moves.json', 'r') as file:
@@ -33,7 +33,7 @@ with open('pokemons.json', 'r') as file:
for m in available_moves.keys(): for m in available_moves.keys():
if available_moves[m]['type'] in current_pokemon_types: if available_moves[m]['type'] in current_pokemon_types:
compatible_moves.append(m) compatible_moves.append(m)
#select two random moves #select two (compatible) random moves
selected_moves = [random.choice(compatible_moves) for _ in range(2)] selected_moves = [random.choice(compatible_moves) for _ in range(2)]
pokemons_dict[p['name']]['moves'] = selected_moves pokemons_dict[p['name']]['moves'] = selected_moves
+7 -4
View File
@@ -1,3 +1,4 @@
import os
from core import Trainer from core import Trainer
import random import random
@@ -68,11 +69,7 @@ def Main(starter_choice,Nbattles):
try: try:
starter_name = starter_choice starter_name = starter_choice
trainer = Trainer(name='edo', starter_name=starter_name) trainer = Trainer(name='edo', starter_name=starter_name)
#print(f"{trainer.name} has chosen {trainer.starter} as their starter Pokemon!")
#print("Adding potions and pokeballs to your inventory...")
trainer.items = {"potions": 10, "pokeball": 10} trainer.items = {"potions": 10, "pokeball": 10}
#print("Your character is ready!")
#print(f"Welcome {trainer.name}! Your adventure begins now!")
except ValueError as e: except ValueError as e:
print(e) print(e)
print("Something went wrong!") print("Something went wrong!")
@@ -98,6 +95,8 @@ def Main(starter_choice,Nbattles):
def make_plots(Ngames,Nbattles): def make_plots(Ngames,Nbattles):
#SIMPLE PLOT #SIMPLE PLOT
if os.path.exists('plots') == False:
os.makedirs('plots')
cumulative_victories = np.zeros((Ngames,Nbattles)) cumulative_victories = np.zeros((Ngames,Nbattles))
plt.figure(figsize=(10, 6)) plt.figure(figsize=(10, 6))
for starter_choice in gd.available_starters: for starter_choice in gd.available_starters:
@@ -171,6 +170,10 @@ def make_plots(Ngames,Nbattles):
if __name__ == "__main__": if __name__ == "__main__":
Ngames = 500 Ngames = 500
Nbattles = 100 Nbattles = 100
if os.path.exists('results') == False:
os.makedirs('results')
if os.path.exists('plots') == False:
os.makedirs('plots')
for starter_choice in gd.available_starters: for starter_choice in gd.available_starters:
for i in range(Ngames): for i in range(Ngames):
print(f"Generating data for {starter_choice}, game {i}...") print(f"Generating data for {starter_choice}, game {i}...")
+2
View File
@@ -0,0 +1,2 @@
numpy>=1.24.0
matplotlib>=3.5.0
+2 -3
View File
@@ -56,6 +56,5 @@ with open('type_effectiveness.json', 'r') as file:
type_effectiveness.append(json.loads(line)) type_effectiveness.append(json.loads(line))
type_effectiveness_df = pd.DataFrame.from_dict(type_effectiveness) type_effectiveness_df = pd.DataFrame.from_dict(type_effectiveness)
#NOTE: from a practical point of view, since type_effectiveness is accessed many times #NOTE: from a practical point of view, since type_effectiveness is accessed many times
#in the main code, using pandas DataFrame is not efficient. I decided to keep using dictionaries #in the main code I decided to keep using dictionaries
#for the type effectiveness. The justification arises especially if we consider #for the type effectiveness
#how long data generation will take.
+5 -4
View File
@@ -7,7 +7,6 @@ import pickle
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
import numpy as np import numpy as np
import os import os
np.seterr(divide='raise', invalid='raise')
#if the results folder does not exist, create it #if the results folder does not exist, create it
if not os.path.exists('results'): if not os.path.exists('results'):
@@ -220,17 +219,19 @@ def make_plots(Ngames,Nbattles):
plt.savefig('plots/pokemon_types_distribution.pdf') plt.savefig('plots/pokemon_types_distribution.pdf')
if __name__ == "__main__": if __name__ == "__main__":
Ngames = 1000 Ngames = 1000
Nbattles = 150 Nbattles = 150
print("Generating data") print("Generating data")
for i in range(Ngames): for i in range(Ngames):
#automatic player creation (choose a random starter pokemon)
starter_choice = random.choice(gd.available_starters) starter_choice = random.choice(gd.available_starters)
#print(f"Generating data for {starter_choice}, game {i}...") print(f"Generating data for {starter_choice}, game {i}...")
results = Main(starter_choice = starter_choice, Nbattles=Nbattles) results = Main(starter_choice = starter_choice, Nbattles=Nbattles)
pickle_out = open(f"results/{starter_choice}_game_{i}_{Nbattles}_battles.pickle",'wb') pickle_out = open(f"results/{starter_choice}_game_{i}_{Nbattles}_battles.pickle",'wb')
pickle.dump(results,pickle_out) pickle.dump(results,pickle_out)
pickle_out.close() pickle_out.close()
print("Generating plots") print("Generating plots")
make_plots(Ngames, Nbattles) make_plots(Ngames, Nbattles)
print("Finished!")
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+3
View File
@@ -0,0 +1,3 @@
numpy>=1.24.0
matplotlib>=3.5.0
pandas>=2.0.0
+7 -5
View File
@@ -78,7 +78,7 @@ class Pokemon:
break break
return effect return effect
def _useMove(self, move, opponent): def _useMove(self, move, opponent, game_status = None):
if random.random() < move['accuracy']: if random.random() < move['accuracy']:
if move['category'] == 'physical': if move['category'] == 'physical':
attack = self.ActStats['attack'] attack = self.ActStats['attack']
@@ -97,17 +97,19 @@ class Pokemon:
opponent.curr_hp -= damage opponent.curr_hp -= damage
if opponent.curr_hp < 0: if opponent.curr_hp < 0:
opponent.curr_hp = 0 opponent.curr_hp = 0
#print(f"{self.name} used {move['name']} and dealt {damage} damage to {opponent.name}!") if not game_status == 'new_random_battle':
print(f"{self.name} used {move['name']} and dealt {damage} damage to {opponent.name}!")
else: else:
damage = 0 damage = 0
#print(f"{self.name}'s attack missed!") if not game_status == 'new_random_battle':
print(f"{self.name}'s attack missed!")
return damage return damage
def useMove(self, move_name, opponent): def useMove(self, move_name, opponent, game_status = None):
if move_name not in self.moves_dict: if move_name not in self.moves_dict:
raise ValueError(f"{self.name} does not know the move {move_name}.") raise ValueError(f"{self.name} does not know the move {move_name}.")
else: else:
return self._useMove(self.moves_dict[move_name], opponent) return self._useMove(self.moves_dict[move_name], opponent, game_status)
def print_move(self,move): def print_move(self,move):
print(f"Move: {self.moves_dict[move]['name']}") print(f"Move: {self.moves_dict[move]['name']}")
-441
View File
@@ -1,441 +0,0 @@
player_hp,player_attack,player_defense,player_speed,player_special,player_type_normal,player_type_fire,player_type_water,player_type_electric,player_type_grass,player_type_ice,player_type_fighting,player_type_poison,player_type_ground,player_type_flying,player_type_psychic,player_type_bug,player_type_rock,player_type_ghost,player_type_dragon,opponent_hp,opponent_attack,opponent_defense,opponent_speed,opponent_special,opponent_type_normal,opponent_type_fire,opponent_type_water,opponent_type_electric,opponent_type_grass,opponent_type_ice,opponent_type_fighting,opponent_type_poison,opponent_type_ground,opponent_type_flying,opponent_type_psychic,opponent_type_bug,opponent_type_rock,opponent_type_ghost,opponent_type_dragon,battle_result
32,15,26,18,33,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,56,33,29,51,31,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
32,15,26,18,33,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,34,30,28,22,20,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1
32,15,26,18,33,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,20,12,10,11,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1
32,15,26,18,33,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,20,12,9,11,10,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1
32,15,26,18,33,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,12,6,6,7,7,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1
27,17,13,16,13,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,62,45,33,23,25,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0
27,17,13,16,13,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,49,20,23,20,28,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0
27,17,13,16,13,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,12,6,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
27,17,13,16,13,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,36,22,20,14,27,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0
27,17,13,16,13,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,21,11,12,16,14,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
36,27,31,14,16,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,42,25,23,28,24,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1
36,27,31,14,16,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,52,25,23,53,59,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1
36,27,31,14,16,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,32,9,17,11,10,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1
36,27,31,14,16,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,24,11,11,15,15,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1
36,27,31,14,16,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,47,20,22,28,32,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1
42,21,20,22,21,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,26,14,12,16,14,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1
42,21,20,22,21,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,44,30,16,18,28,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0
42,21,20,22,21,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,23,16,18,9,10,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1
42,21,20,22,21,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,17,9,8,12,8,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
42,21,20,22,21,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,31,13,13,11,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
22,17,19,13,12,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,22,13,9,14,9,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1
22,17,19,13,12,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,54,22,29,14,24,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
22,17,19,13,12,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,26,16,12,14,13,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1
22,17,19,13,12,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,28,19,13,13,18,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1
22,17,19,13,12,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,51,31,31,30,37,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0
42,22,23,15,30,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,25,13,12,20,23,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0
42,22,23,15,30,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,42,23,23,30,19,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
42,22,23,15,30,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,28,16,15,17,14,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1
42,22,23,15,30,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,20,9,14,11,18,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1
42,22,23,15,30,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,28,19,15,21,14,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1
38,27,20,14,16,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,11,6,5,6,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
38,27,20,14,16,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,24,15,11,17,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
38,27,20,14,16,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,49,35,28,30,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1
38,27,20,14,16,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,51,34,25,42,35,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0
38,27,20,14,16,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,28,17,13,15,14,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1
16,8,8,12,11,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,21,14,10,10,13,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0
16,8,8,12,11,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,40,32,39,11,15,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0
16,8,8,12,11,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,50,37,40,25,22,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0
16,8,8,12,11,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,35,23,17,28,23,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0
16,8,8,12,11,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,21,13,10,15,13,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1
36,16,15,15,26,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,28,7,19,25,10,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
36,16,15,15,26,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,17,11,8,12,8,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1
36,16,15,15,26,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,53,36,26,44,37,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0
36,16,15,15,26,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,15,8,9,6,8,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1
36,16,15,15,26,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,38,21,31,24,38,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1
27,14,18,8,14,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,47,30,23,17,20,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0
27,14,18,8,14,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,33,16,15,19,14,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1
27,14,18,8,14,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,52,30,29,34,27,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0
27,14,18,8,14,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,42,29,32,17,14,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0
27,14,18,8,14,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,38,33,37,24,21,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0
38,21,17,33,17,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,37,29,15,26,15,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1
38,21,17,33,17,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,49,29,28,30,29,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0
38,21,17,33,17,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,36,31,21,29,19,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0
38,21,17,33,17,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,19,9,10,8,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
38,21,17,33,17,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,49,32,28,30,27,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1
14,7,7,6,8,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,46,30,23,25,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0
14,7,7,6,8,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,51,23,17,39,39,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0
14,7,7,6,8,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,54,32,33,32,39,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0
14,7,7,6,8,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,14,7,7,10,8,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1
14,7,7,6,8,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,27,11,17,11,14,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0
22,15,14,16,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,21,22,14,29,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0
22,15,14,16,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35,23,31,14,21,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0
22,15,14,16,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,15,16,13,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
22,15,14,16,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,33,22,17,19,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0
22,15,14,16,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,24,27,17,29,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
51,37,23,24,35,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,23,20,12,12,18,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1
51,37,23,24,35,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,37,30,19,27,19,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1
51,37,23,24,35,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,59,44,29,54,27,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0
51,37,23,24,35,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,31,15,14,12,16,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1
51,37,23,24,35,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,23,11,13,21,14,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1
23,10,11,13,14,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,42,35,62,27,32,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0
23,10,11,13,14,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,46,29,20,15,15,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0
23,10,11,13,14,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,56,42,28,30,41,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0
23,10,11,13,14,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,46,37,27,38,30,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
23,10,11,13,14,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,35,17,14,30,16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
43,17,29,17,23,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,48,44,35,33,18,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0
43,17,29,17,23,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,49,36,24,26,35,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1
43,17,29,17,23,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,18,9,9,8,8,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1
43,17,29,17,23,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,32,27,30,20,17,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0
43,17,29,17,23,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,15,7,7,9,9,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1
48,27,21,25,21,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,15,8,8,8,7,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1
48,27,21,25,21,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,47,31,26,36,41,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1
48,27,21,25,21,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,51,41,30,42,33,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
48,27,21,25,21,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,36,18,29,14,15,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1
48,27,21,25,21,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,38,21,20,25,21,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1
24,11,10,19,23,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,25,17,12,20,12,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1
24,11,10,19,23,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,36,18,24,10,19,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1
24,11,10,19,23,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,52,32,30,35,42,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0
24,11,10,19,23,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,24,12,10,19,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
24,11,10,19,23,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,46,31,28,28,37,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1
17,9,9,10,9,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,44,37,66,28,33,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0
17,9,9,10,9,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,38,14,15,18,11,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0
17,9,9,10,9,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,62,30,31,26,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
17,9,9,10,9,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,40,13,11,41,47,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0
17,9,9,10,9,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,18,11,11,14,13,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1
19,11,14,8,11,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,25,14,13,20,23,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0
19,11,14,8,11,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,16,8,8,7,7,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1
19,11,14,8,11,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,42,19,14,31,31,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0
19,11,14,8,11,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,42,21,17,24,19,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0
19,11,14,8,11,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,32,25,18,36,23,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1
51,20,14,14,16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,20,59,28,15,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0
51,20,14,14,16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,23,23,22,34,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1
51,20,14,14,16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,32,35,23,20,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0
51,20,14,14,16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,15,12,9,10,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1
51,20,14,14,16,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,23,19,37,19,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
16,9,10,7,6,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,53,41,38,16,17,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0
16,9,10,7,6,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,24,12,11,21,23,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1
16,9,10,7,6,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,30,17,13,9,11,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0
16,9,10,7,6,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,22,15,14,8,8,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0
16,9,10,7,6,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,44,42,35,30,21,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0
50,20,21,16,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,9,9,19,21,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1
50,20,21,16,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,6,6,12,13,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1
50,20,21,16,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,20,37,19,34,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0
50,20,21,16,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,43,26,25,29,35,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0
50,20,21,16,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,8,7,8,7,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1
38,23,22,27,23,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,40,20,16,35,18,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
38,23,22,27,23,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,17,9,9,7,11,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1
38,23,22,27,23,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,29,17,15,16,14,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1
38,23,22,27,23,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,40,31,27,13,27,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1
38,23,22,27,23,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,28,20,14,21,16,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1
26,14,12,21,12,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,46,28,27,31,37,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0
26,14,12,21,12,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,61,38,36,45,39,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0
26,14,12,21,12,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,16,9,8,11,10,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1
26,14,12,21,12,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,38,23,19,21,19,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0
26,14,12,21,12,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,54,31,33,21,39,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0
20,11,11,12,10,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,22,14,9,9,13,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1
20,11,11,12,10,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,18,9,7,6,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
20,11,11,12,10,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,29,16,16,15,19,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1
20,11,11,12,10,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,46,30,26,28,26,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1
20,11,11,12,10,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,12,5,5,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
28,13,27,12,24,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,45,22,22,22,22,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
28,13,27,12,24,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,46,26,20,24,20,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1
28,13,27,12,24,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,42,21,28,37,41,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1
28,13,27,12,24,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,29,12,15,9,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
28,13,27,12,24,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,62,37,25,15,21,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0
61,38,36,45,39,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,76,6,6,16,28,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
61,38,36,45,39,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,49,35,27,41,24,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
61,38,36,45,39,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,13,6,9,6,8,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1
61,38,36,45,39,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,21,18,11,11,16,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1
61,38,36,45,39,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,12,6,6,6,6,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1
40,20,22,20,25,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,28,20,19,9,10,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0
40,20,22,20,25,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,40,27,37,16,25,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1
40,20,22,20,25,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,42,27,25,26,22,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0
40,20,22,20,25,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,44,29,24,33,38,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1
40,20,22,20,25,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,37,20,17,32,17,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
46,35,23,34,32,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,19,7,10,8,7,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1
46,35,23,34,32,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,51,20,35,20,27,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1
46,35,23,34,32,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,28,16,22,20,22,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
46,35,23,34,32,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,32,26,20,17,21,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1
46,35,23,34,32,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,33,26,17,24,17,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1
36,25,20,21,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,53,52,43,37,25,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1
36,25,20,21,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,43,29,26,26,35,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1
36,25,20,21,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,33,20,12,23,13,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1
36,25,20,21,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,15,7,7,10,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
36,25,20,21,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,45,20,22,18,18,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0
30,18,16,17,16,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,49,29,29,29,35,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0
30,18,16,17,16,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,28,18,15,20,23,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1
30,18,16,17,16,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,53,27,31,20,33,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
30,18,16,17,16,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,18,8,11,8,9,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1
30,18,16,17,16,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,41,24,23,25,24,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0
29,16,16,15,19,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,46,28,33,26,28,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
29,16,16,15,19,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,33,15,12,24,24,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1
29,16,16,15,19,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,21,10,10,10,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
29,16,16,15,19,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,27,16,15,11,20,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1
29,16,16,15,19,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,38,27,21,24,21,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
25,12,12,12,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,23,21,39,46,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0
25,12,12,12,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,11,23,15,13,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1
25,12,12,12,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,9,12,11,12,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
25,12,12,12,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65,33,46,16,35,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0
25,12,12,12,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,18,21,18,25,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1
17,8,9,8,8,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,56,31,29,57,49,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0
17,8,9,8,8,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,43,22,28,20,23,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0
17,8,9,8,8,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,23,14,12,13,12,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1
17,8,9,8,8,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,36,27,24,12,24,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0
17,8,9,8,8,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,21,10,12,10,11,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
33,15,14,23,31,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,44,27,23,25,24,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0
33,15,14,23,31,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,43,39,36,29,26,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0
33,15,14,23,31,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,22,15,16,11,10,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1
33,15,14,23,31,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,33,24,28,13,14,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1
33,15,14,23,31,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,29,22,13,35,19,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1
28,18,20,12,10,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,34,11,18,14,11,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0
28,18,20,12,10,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,14,9,7,8,7,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1
28,18,20,12,10,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,12,7,7,6,6,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1
28,18,20,12,10,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,15,8,7,6,6,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1
28,18,20,12,10,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,29,14,16,14,18,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1
38,21,21,20,25,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,29,10,7,7,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
38,21,21,20,25,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,49,28,25,44,27,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
38,21,21,20,25,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,18,10,10,9,9,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1
38,21,21,20,25,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,41,24,23,25,24,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
38,21,21,20,25,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,47,37,32,15,32,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1
51,27,25,37,43,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,26,13,13,13,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
51,27,25,37,43,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,28,22,16,31,20,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1
51,27,25,37,43,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,19,9,10,8,11,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
51,27,25,37,43,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,63,39,37,43,52,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0
51,27,25,37,43,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,37,18,17,21,15,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1
28,17,14,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,38,19,17,22,16,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0
28,17,14,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,54,40,27,49,25,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0
28,17,14,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,47,29,27,19,37,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0
28,17,14,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,12,7,6,6,7,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1
28,17,14,15,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,48,41,73,31,37,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0
46,28,27,31,37,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,22,11,9,12,10,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1
46,28,27,31,37,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,48,24,24,23,31,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1
46,28,27,31,37,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,48,37,25,39,29,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1
46,28,27,31,37,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,62,39,35,24,50,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1
46,28,27,31,37,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,49,25,24,25,29,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
14,11,10,8,6,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,22,11,10,19,21,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0
14,11,10,8,6,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,28,16,14,15,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
14,11,10,8,6,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,18,15,14,11,9,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
14,11,10,8,6,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,25,18,17,9,9,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1
14,11,10,8,6,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,46,5,5,11,17,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
39,23,23,29,29,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,33,18,16,21,18,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
39,23,23,29,29,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,34,22,19,25,29,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1
39,23,23,29,29,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,17,7,6,14,15,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1
39,23,23,29,29,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,38,19,30,26,30,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
39,23,23,29,29,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,32,18,18,17,17,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1
66,57,37,27,31,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,37,18,28,25,28,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
66,57,37,27,31,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,53,29,29,39,24,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
66,57,37,27,31,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,35,27,14,24,14,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1
66,57,37,27,31,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,27,13,25,12,23,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1
66,57,37,27,31,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,21,11,12,16,14,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
24,13,15,13,17,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,20,8,8,8,11,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
24,13,15,13,17,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,40,20,33,15,17,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0
24,13,15,13,17,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,35,17,30,18,27,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0
24,13,15,13,17,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,12,5,5,5,6,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1
24,13,15,13,17,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,19,10,9,14,16,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0
53,30,37,28,31,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,29,20,29,14,15,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
53,30,37,28,31,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,16,9,7,10,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
53,30,37,28,31,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,50,27,25,35,35,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1
53,30,37,28,31,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,23,12,12,12,14,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1
53,30,37,28,31,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,22,11,11,14,14,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1
28,21,16,21,17,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,24,12,20,11,18,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0
28,21,16,21,17,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,45,29,32,41,37,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0
28,21,16,21,17,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,11,6,6,5,6,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1
28,21,16,21,17,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,22,9,9,8,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
28,21,16,21,17,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,32,25,14,41,22,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1
42,26,15,30,16,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,35,17,16,20,14,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1
42,26,15,30,16,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,29,22,12,20,12,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1
42,26,15,30,16,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,11,6,5,6,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
42,26,15,30,16,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,63,37,35,41,33,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1
42,26,15,30,16,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,16,10,8,10,8,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1
43,26,25,31,27,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,53,29,27,54,46,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0
43,26,25,31,27,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,51,39,25,43,39,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0
43,26,25,31,27,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,16,12,11,9,8,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
43,26,25,31,27,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,28,26,14,20,11,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1
43,26,25,31,27,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,54,32,31,33,32,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
20,9,9,12,12,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,57,50,37,32,39,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0
20,9,9,12,12,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,44,25,24,28,23,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0
20,9,9,12,12,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,14,7,8,7,9,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1
20,9,9,12,12,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,28,17,14,11,12,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1
20,9,9,12,12,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,23,8,6,6,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
47,36,33,14,15,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,29,15,14,24,28,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0
47,36,33,14,15,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,19,15,13,11,9,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1
47,36,33,14,15,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,40,24,21,23,22,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1
47,36,33,14,15,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,67,25,24,25,40,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
47,36,33,14,15,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,34,30,28,22,20,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1
38,25,33,16,18,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,52,27,18,11,18,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
38,25,33,16,18,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,12,6,6,6,6,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1
38,25,33,16,18,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,47,30,23,17,20,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1
38,25,33,16,18,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,57,23,30,15,25,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
38,25,33,16,18,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,28,13,10,20,20,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1
44,28,21,16,19,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,46,35,24,37,28,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
44,28,21,16,19,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,66,31,31,11,21,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1
44,28,21,16,19,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,34,29,20,27,18,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1
44,28,21,16,19,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,34,13,22,13,18,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1
44,28,21,16,19,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,35,32,27,23,17,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1
11,6,6,5,6,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,48,31,29,30,25,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0
11,6,6,5,6,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,42,15,16,20,11,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0
11,6,6,5,6,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,46,26,24,32,27,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
11,6,6,5,6,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,38,34,27,26,14,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0
11,6,6,5,6,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,59,47,31,32,39,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0
26,9,7,7,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,21,15,10,13,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0
26,9,7,7,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,43,39,39,52,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0
26,9,7,7,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,8,8,6,6,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1
26,9,7,7,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,53,36,26,44,37,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0
26,9,7,7,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,5,5,6,7,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0
14,7,7,8,8,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,27,17,18,23,21,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0
14,7,7,8,8,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,36,22,18,20,18,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0
14,7,7,8,8,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,46,23,21,27,19,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0
14,7,7,8,8,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,21,10,16,11,15,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1
14,7,7,8,8,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,12,5,7,8,5,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
19,9,13,10,16,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,46,27,28,27,33,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0
19,9,13,10,16,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,20,10,9,10,10,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
19,9,13,10,16,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,35,21,13,24,13,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1
19,9,13,10,16,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,20,10,9,10,10,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
19,9,13,10,16,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,35,36,32,23,17,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0
31,20,27,13,19,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,27,15,15,19,19,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1
31,20,27,13,19,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,48,25,23,29,22,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0
31,20,27,13,19,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,52,37,29,43,25,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
31,20,27,13,19,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,26,22,19,16,12,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1
31,20,27,13,19,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,53,28,26,37,37,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0
35,30,18,27,15,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,19,12,12,7,7,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1
35,30,18,27,15,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,28,13,23,14,21,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1
35,30,18,27,15,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,36,12,8,8,9,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
35,30,18,27,15,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,21,12,11,9,15,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1
35,30,18,27,15,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,47,27,25,42,49,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0
12,6,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,18,10,10,8,12,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0
12,6,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,20,10,14,8,9,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0
12,6,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,41,24,33,30,33,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0
12,6,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,43,20,26,47,29,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0
12,6,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,20,11,9,15,9,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0
19,12,9,12,11,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,49,32,18,30,20,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0
19,12,9,12,11,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,28,18,24,12,17,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0
19,12,9,12,11,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,63,37,43,37,52,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0
19,12,9,12,11,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,15,8,7,10,11,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0
19,12,9,12,11,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,51,29,27,35,29,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
51,29,27,46,54,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,48,33,37,20,16,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1
51,29,27,46,54,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,63,55,41,35,43,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1
51,29,27,46,54,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,28,17,11,17,12,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1
51,29,27,46,54,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,38,26,14,16,24,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1
51,29,27,46,54,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,12,6,7,6,7,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1
19,10,9,10,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,15,14,16,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
19,10,9,10,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,17,10,10,12,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
19,10,9,10,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,28,41,19,21,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0
19,10,9,10,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,23,29,21,24,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0
19,10,9,10,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,27,31,27,37,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0
45,33,35,23,20,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,18,8,9,10,11,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1
45,33,35,23,20,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,33,21,17,20,16,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1
45,33,35,23,20,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,26,10,14,23,14,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1
45,33,35,23,20,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,51,24,46,26,41,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1
45,33,35,23,20,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,15,7,8,10,11,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1
15,8,8,7,7,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,15,8,8,6,6,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1
15,8,8,7,7,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,14,8,7,9,8,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1
15,8,8,7,7,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,35,17,15,33,37,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0
15,8,8,7,7,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,26,13,14,10,15,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
15,8,8,7,7,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,19,7,10,8,7,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1
17,7,7,7,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,13,14,13,17,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0
17,7,7,7,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,33,37,24,21,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0
17,7,7,7,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,17,12,13,17,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1
17,7,7,7,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,8,7,7,8,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
17,7,7,7,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,53,54,27,29,46,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
30,11,12,14,9,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,40,16,12,12,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
30,11,12,14,9,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,34,18,19,12,24,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1
30,11,12,14,9,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,22,11,17,10,16,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0
30,11,12,14,9,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,40,19,19,8,13,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1
30,11,12,14,9,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,57,49,32,23,27,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0
42,16,15,16,24,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,28,9,8,26,30,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1
42,16,15,16,24,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,26,14,15,14,14,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1
42,16,15,16,24,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,38,38,19,29,14,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1
42,16,15,16,24,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,30,23,17,23,19,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1
42,16,15,16,24,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,30,19,17,18,17,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1
40,28,24,27,23,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,29,17,16,19,22,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1
40,28,24,27,23,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,59,44,29,54,27,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0
40,28,24,27,23,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,34,14,14,12,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
40,28,24,27,23,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,16,8,10,9,10,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
40,28,24,27,23,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,20,13,11,14,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
12,6,6,6,6,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,12,6,6,7,6,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0
12,6,6,6,6,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,34,21,21,21,21,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0
12,6,6,6,6,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,12,7,6,6,7,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1
12,6,6,6,6,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,26,12,21,13,19,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1
12,6,6,6,6,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,14,7,7,7,7,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1
22,13,9,14,9,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,50,40,27,27,33,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0
22,13,9,14,9,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,24,23,21,14,9,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0
22,13,9,14,9,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,30,17,13,9,11,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1
22,13,9,14,9,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,50,33,28,38,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0
22,13,9,14,9,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,44,29,26,27,23,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0
28,11,11,11,16,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,23,13,10,7,9,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1
28,11,11,11,16,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,19,10,9,15,13,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1
28,11,11,11,16,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,34,11,18,14,11,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1
28,11,11,11,16,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,46,33,43,24,32,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0
28,11,11,11,16,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,37,23,16,20,18,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1
37,15,18,15,21,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,23,11,17,13,22,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1
37,15,18,15,21,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,30,28,15,16,24,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1
37,15,18,15,21,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,23,14,9,14,10,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1
37,15,18,15,21,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,49,24,27,24,31,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1
37,15,18,15,21,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,34,16,20,35,22,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1
49,29,28,30,29,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,68,44,33,24,29,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0
49,29,28,30,29,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,67,32,30,24,35,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0
49,29,28,30,29,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,45,23,22,23,27,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
49,29,28,30,29,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,44,22,22,21,28,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1
49,29,28,30,29,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,16,6,6,12,13,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1
37,21,19,32,20,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,27,27,26,33,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0
37,21,19,32,20,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,43,22,21,22,25,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
37,21,19,32,20,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,14,12,24,13,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
37,21,19,32,20,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,14,16,22,19,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
37,21,19,32,20,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,8,6,7,6,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1
37,21,29,27,29,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,13,6,6,6,7,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1
37,21,29,27,29,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,62,37,36,39,37,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0
37,21,29,27,29,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,26,10,14,23,14,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1
37,21,29,27,29,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,23,11,9,16,16,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1
37,21,29,27,29,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,18,11,10,11,10,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1
17,8,8,9,7,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,44,22,18,39,20,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
17,8,8,9,7,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,48,33,37,20,16,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0
17,8,8,9,7,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,44,27,17,41,25,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0
17,8,8,9,7,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,26,8,13,9,9,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1
17,8,8,9,7,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,19,11,14,8,11,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1
46,28,31,12,13,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,19,11,11,11,11,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1
46,28,31,12,13,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,12,6,6,5,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
46,28,31,12,13,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,18,10,9,11,10,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1
46,28,31,12,13,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,25,13,12,20,23,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0
46,28,31,12,13,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,12,7,7,6,6,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1
19,9,11,14,15,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,11,5,6,7,6,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1
19,9,11,14,15,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,33,14,12,32,36,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1
19,9,11,14,15,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,12,7,6,6,5,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1
19,9,11,14,15,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,51,28,26,51,44,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0
19,9,11,14,15,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,42,33,17,30,17,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0
30,15,14,17,14,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,34,24,17,27,24,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0
30,15,14,17,14,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,46,30,26,28,26,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0
30,15,14,17,14,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,28,14,18,13,15,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
30,15,14,17,14,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,28,12,13,12,16,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
30,15,14,17,14,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,29,14,23,16,29,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1
38,25,21,23,21,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,25,17,14,9,14,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1
38,25,21,23,21,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,46,29,29,29,29,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1
38,25,21,23,21,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,21,10,16,11,15,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1
38,25,21,23,21,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,32,17,17,17,21,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1
38,25,21,23,21,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,15,7,7,10,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
35,22,13,21,14,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,33,33,30,21,16,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0
35,22,13,21,14,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,19,12,12,7,7,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1
35,22,13,21,14,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,38,19,16,22,17,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1
35,22,13,21,14,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,46,31,28,28,37,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0
35,22,13,21,14,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,40,32,39,11,15,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0
42,23,23,30,19,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,32,16,20,15,17,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
42,23,23,30,19,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,39,19,19,19,19,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
42,23,23,30,19,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,27,18,16,17,15,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1
42,23,23,30,19,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,32,23,17,24,19,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1
42,23,23,30,19,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,16,9,8,10,8,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
23,15,11,12,15,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,58,37,25,19,19,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0
23,15,11,12,15,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,64,5,5,14,23,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
23,15,11,12,15,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,28,18,20,12,10,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1
23,15,11,12,15,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,53,52,43,37,25,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0
23,15,11,12,15,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,63,55,41,35,43,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0
50,38,36,15,16,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,64,33,21,12,21,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
50,38,36,15,16,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,47,18,32,18,25,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1
50,38,36,15,16,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,20,17,10,13,8,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1
50,38,36,15,16,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,35,17,14,20,16,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1
50,38,36,15,16,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,43,38,26,35,23,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1
49,27,33,25,28,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,49,35,29,33,28,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1
49,27,33,25,28,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,12,6,6,6,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
49,27,33,25,28,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,63,37,43,37,52,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0
49,27,33,25,28,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,27,19,27,13,14,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1
49,27,33,25,28,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,12,6,6,6,6,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1
14,8,12,7,8,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,43,21,20,18,17,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0
14,8,12,7,8,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,30,32,28,18,11,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0
14,8,12,7,8,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,12,6,7,5,5,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1
14,8,12,7,8,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,41,21,22,19,19,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0
14,8,12,7,8,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,16,10,15,9,10,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1
32,25,18,36,23,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,22,10,16,12,20,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1
32,25,18,36,23,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,33,18,17,31,27,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0
32,25,18,36,23,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,45,22,21,19,17,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0
32,25,18,36,23,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,37,19,18,22,17,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1
32,25,18,36,23,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,35,28,19,14,16,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0
1 player_hp player_attack player_defense player_speed player_special player_type_normal player_type_fire player_type_water player_type_electric player_type_grass player_type_ice player_type_fighting player_type_poison player_type_ground player_type_flying player_type_psychic player_type_bug player_type_rock player_type_ghost player_type_dragon opponent_hp opponent_attack opponent_defense opponent_speed opponent_special opponent_type_normal opponent_type_fire opponent_type_water opponent_type_electric opponent_type_grass opponent_type_ice opponent_type_fighting opponent_type_poison opponent_type_ground opponent_type_flying opponent_type_psychic opponent_type_bug opponent_type_rock opponent_type_ghost opponent_type_dragon battle_result
2 32 15 26 18 33 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 56 33 29 51 31 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
3 32 15 26 18 33 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 34 30 28 22 20 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1
4 32 15 26 18 33 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 20 12 10 11 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
5 32 15 26 18 33 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 20 12 9 11 10 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
6 32 15 26 18 33 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 12 6 6 7 7 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1
7 27 17 13 16 13 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 62 45 33 23 25 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
8 27 17 13 16 13 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 49 20 23 20 28 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
9 27 17 13 16 13 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 12 6 6 6 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
10 27 17 13 16 13 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 36 22 20 14 27 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0
11 27 17 13 16 13 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 21 11 12 16 14 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
12 36 27 31 14 16 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 42 25 23 28 24 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1
13 36 27 31 14 16 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 52 25 23 53 59 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1
14 36 27 31 14 16 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 32 9 17 11 10 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
15 36 27 31 14 16 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 24 11 11 15 15 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
16 36 27 31 14 16 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 47 20 22 28 32 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1
17 42 21 20 22 21 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 26 14 12 16 14 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
18 42 21 20 22 21 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 44 30 16 18 28 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
19 42 21 20 22 21 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 23 16 18 9 10 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1
20 42 21 20 22 21 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 17 9 8 12 8 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
21 42 21 20 22 21 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 31 13 13 11 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
22 22 17 19 13 12 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 22 13 9 14 9 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1
23 22 17 19 13 12 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 54 22 29 14 24 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
24 22 17 19 13 12 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 26 16 12 14 13 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
25 22 17 19 13 12 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 28 19 13 13 18 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1
26 22 17 19 13 12 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 51 31 31 30 37 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
27 42 22 23 15 30 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 25 13 12 20 23 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
28 42 22 23 15 30 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 42 23 23 30 19 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
29 42 22 23 15 30 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 28 16 15 17 14 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1
30 42 22 23 15 30 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 20 9 14 11 18 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
31 42 22 23 15 30 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 28 19 15 21 14 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1
32 38 27 20 14 16 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 11 6 5 6 5 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
33 38 27 20 14 16 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 24 15 11 17 9 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
34 38 27 20 14 16 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 49 35 28 30 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
35 38 27 20 14 16 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 51 34 25 42 35 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
36 38 27 20 14 16 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 28 17 13 15 14 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
37 16 8 8 12 11 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 21 14 10 10 13 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
38 16 8 8 12 11 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 40 32 39 11 15 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
39 16 8 8 12 11 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 50 37 40 25 22 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
40 16 8 8 12 11 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 35 23 17 28 23 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
41 16 8 8 12 11 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 21 13 10 15 13 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
42 36 16 15 15 26 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 28 7 19 25 10 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
43 36 16 15 15 26 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 17 11 8 12 8 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1
44 36 16 15 15 26 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 53 36 26 44 37 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
45 36 16 15 15 26 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 15 8 9 6 8 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1
46 36 16 15 15 26 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 38 21 31 24 38 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
47 27 14 18 8 14 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 47 30 23 17 20 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
48 27 14 18 8 14 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 33 16 15 19 14 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1
49 27 14 18 8 14 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 52 30 29 34 27 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
50 27 14 18 8 14 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 42 29 32 17 14 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
51 27 14 18 8 14 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 38 33 37 24 21 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
52 38 21 17 33 17 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 37 29 15 26 15 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
53 38 21 17 33 17 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 49 29 28 30 29 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
54 38 21 17 33 17 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 36 31 21 29 19 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
55 38 21 17 33 17 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 19 9 10 8 11 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
56 38 21 17 33 17 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 49 32 28 30 27 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1
57 14 7 7 6 8 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 46 30 23 25 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
58 14 7 7 6 8 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 51 23 17 39 39 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0
59 14 7 7 6 8 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 54 32 33 32 39 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
60 14 7 7 6 8 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 14 7 7 10 8 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
61 14 7 7 6 8 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 27 11 17 11 14 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0
62 22 15 14 16 12 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 40 21 22 14 29 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
63 22 15 14 16 12 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 35 23 31 14 21 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
64 22 15 14 16 12 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 38 15 16 13 19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
65 22 15 14 16 12 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 40 33 22 17 19 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
66 22 15 14 16 12 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 24 27 17 29 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
67 51 37 23 24 35 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 23 20 12 12 18 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
68 51 37 23 24 35 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 37 30 19 27 19 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
69 51 37 23 24 35 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 59 44 29 54 27 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
70 51 37 23 24 35 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 31 15 14 12 16 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1
71 51 37 23 24 35 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 23 11 13 21 14 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
72 23 10 11 13 14 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 42 35 62 27 32 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0
73 23 10 11 13 14 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 46 29 20 15 15 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
74 23 10 11 13 14 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 56 42 28 30 41 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
75 23 10 11 13 14 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 46 37 27 38 30 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
76 23 10 11 13 14 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 35 17 14 30 16 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
77 43 17 29 17 23 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 48 44 35 33 18 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
78 43 17 29 17 23 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 49 36 24 26 35 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1
79 43 17 29 17 23 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 18 9 9 8 8 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1
80 43 17 29 17 23 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 32 27 30 20 17 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
81 43 17 29 17 23 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 15 7 7 9 9 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1
82 48 27 21 25 21 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 15 8 8 8 7 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1
83 48 27 21 25 21 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 47 31 26 36 41 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1
84 48 27 21 25 21 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 51 41 30 42 33 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85 48 27 21 25 21 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 36 18 29 14 15 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1
86 48 27 21 25 21 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 38 21 20 25 21 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
87 24 11 10 19 23 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 25 17 12 20 12 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1
88 24 11 10 19 23 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 36 18 24 10 19 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1
89 24 11 10 19 23 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 52 32 30 35 42 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
90 24 11 10 19 23 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 24 12 10 19 11 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
91 24 11 10 19 23 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 46 31 28 28 37 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1
92 17 9 9 10 9 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 44 37 66 28 33 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0
93 17 9 9 10 9 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 38 14 15 18 11 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
94 17 9 9 10 9 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 62 30 31 26 35 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95 17 9 9 10 9 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 40 13 11 41 47 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
96 17 9 9 10 9 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 18 11 11 14 13 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1
97 19 11 14 8 11 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 25 14 13 20 23 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
98 19 11 14 8 11 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 16 8 8 7 7 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1
99 19 11 14 8 11 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 42 19 14 31 31 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0
100 19 11 14 8 11 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 42 21 17 24 19 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0
101 19 11 14 8 11 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 32 25 18 36 23 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1
102 51 20 14 14 16 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 38 20 59 28 15 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
103 51 20 14 14 16 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 45 23 23 22 34 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1
104 51 20 14 14 16 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 37 32 35 23 20 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
105 51 20 14 14 16 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 15 12 9 10 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
106 51 20 14 14 16 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 42 23 19 37 19 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
107 16 9 10 7 6 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 53 41 38 16 17 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
108 16 9 10 7 6 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 24 12 11 21 23 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1
109 16 9 10 7 6 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 30 17 13 9 11 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
110 16 9 10 7 6 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 22 15 14 8 8 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
111 16 9 10 7 6 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 44 42 35 30 21 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
112 50 20 21 16 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 9 9 19 21 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1
113 50 20 21 16 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 6 6 12 13 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1
114 50 20 21 16 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 41 20 37 19 34 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
115 50 20 21 16 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 43 26 25 29 35 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
116 50 20 21 16 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 8 7 8 7 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
117 38 23 22 27 23 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 40 20 16 35 18 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
118 38 23 22 27 23 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 17 9 9 7 11 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1
119 38 23 22 27 23 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 29 17 15 16 14 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
120 38 23 22 27 23 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 40 31 27 13 27 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1
121 38 23 22 27 23 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 28 20 14 21 16 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
122 26 14 12 21 12 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 46 28 27 31 37 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
123 26 14 12 21 12 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 61 38 36 45 39 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
124 26 14 12 21 12 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 16 9 8 11 10 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
125 26 14 12 21 12 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 38 23 19 21 19 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
126 26 14 12 21 12 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 54 31 33 21 39 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
127 20 11 11 12 10 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 22 14 9 9 13 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1
128 20 11 11 12 10 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 18 9 7 6 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
129 20 11 11 12 10 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 29 16 16 15 19 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1
130 20 11 11 12 10 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 46 30 26 28 26 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1
131 20 11 11 12 10 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 12 5 5 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
132 28 13 27 12 24 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 45 22 22 22 22 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
133 28 13 27 12 24 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 46 26 20 24 20 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
134 28 13 27 12 24 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 42 21 28 37 41 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1
135 28 13 27 12 24 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 29 12 15 9 13 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
136 28 13 27 12 24 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 62 37 25 15 21 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
137 61 38 36 45 39 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 76 6 6 16 28 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
138 61 38 36 45 39 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 49 35 27 41 24 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
139 61 38 36 45 39 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 13 6 9 6 8 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1
140 61 38 36 45 39 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 21 18 11 11 16 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
141 61 38 36 45 39 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 12 6 6 6 6 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1
142 40 20 22 20 25 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 28 20 19 9 10 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
143 40 20 22 20 25 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 40 27 37 16 25 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
144 40 20 22 20 25 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 42 27 25 26 22 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
145 40 20 22 20 25 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 44 29 24 33 38 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1
146 40 20 22 20 25 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 37 20 17 32 17 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
147 46 35 23 34 32 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 19 7 10 8 7 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1
148 46 35 23 34 32 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 51 20 35 20 27 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1
149 46 35 23 34 32 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 28 16 22 20 22 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
150 46 35 23 34 32 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 32 26 20 17 21 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1
151 46 35 23 34 32 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 33 26 17 24 17 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
152 36 25 20 21 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 53 52 43 37 25 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
153 36 25 20 21 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 43 29 26 26 35 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1
154 36 25 20 21 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 33 20 12 23 13 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1
155 36 25 20 21 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 15 7 7 10 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
156 36 25 20 21 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 45 20 22 18 18 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
157 30 18 16 17 16 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 49 29 29 29 35 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
158 30 18 16 17 16 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 28 18 15 20 23 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1
159 30 18 16 17 16 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 53 27 31 20 33 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
160 30 18 16 17 16 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 18 8 11 8 9 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1
161 30 18 16 17 16 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 41 24 23 25 24 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
162 29 16 16 15 19 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 46 28 33 26 28 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
163 29 16 16 15 19 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 33 15 12 24 24 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1
164 29 16 16 15 19 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 21 10 10 10 10 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
165 29 16 16 15 19 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 27 16 15 11 20 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1
166 29 16 16 15 19 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 38 27 21 24 21 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
167 25 12 12 12 12 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 44 23 21 39 46 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
168 25 12 12 12 12 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 44 11 23 15 13 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
169 25 12 12 12 12 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 9 12 11 12 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
170 25 12 12 12 12 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65 33 46 16 35 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0
171 25 12 12 12 12 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 32 18 21 18 25 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1
172 17 8 9 8 8 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 56 31 29 57 49 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
173 17 8 9 8 8 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 43 22 28 20 23 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
174 17 8 9 8 8 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 23 14 12 13 12 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1
175 17 8 9 8 8 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 36 27 24 12 24 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0
176 17 8 9 8 8 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 21 10 12 10 11 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
177 33 15 14 23 31 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 44 27 23 25 24 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
178 33 15 14 23 31 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 43 39 36 29 26 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
179 33 15 14 23 31 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 22 15 16 11 10 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1
180 33 15 14 23 31 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 33 24 28 13 14 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1
181 33 15 14 23 31 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 29 22 13 35 19 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1
182 28 18 20 12 10 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 34 11 18 14 11 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0
183 28 18 20 12 10 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 14 9 7 8 7 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
184 28 18 20 12 10 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 12 7 7 6 6 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1
185 28 18 20 12 10 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 15 8 7 6 6 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
186 28 18 20 12 10 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 29 14 16 14 18 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1
187 38 21 21 20 25 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 29 10 7 7 8 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
188 38 21 21 20 25 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 49 28 25 44 27 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
189 38 21 21 20 25 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 18 10 10 9 9 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1
190 38 21 21 20 25 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 41 24 23 25 24 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
191 38 21 21 20 25 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 47 37 32 15 32 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1
192 51 27 25 37 43 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 26 13 13 13 15 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
193 51 27 25 37 43 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 28 22 16 31 20 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1
194 51 27 25 37 43 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 19 9 10 8 11 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
195 51 27 25 37 43 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 63 39 37 43 52 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
196 51 27 25 37 43 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 37 18 17 21 15 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1
197 28 17 14 15 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 38 19 17 22 16 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
198 28 17 14 15 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 54 40 27 49 25 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
199 28 17 14 15 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 47 29 27 19 37 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0
200 28 17 14 15 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 12 7 6 6 7 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1
201 28 17 14 15 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 48 41 73 31 37 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0
202 46 28 27 31 37 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 22 11 9 12 10 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1
203 46 28 27 31 37 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 48 24 24 23 31 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1
204 46 28 27 31 37 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 48 37 25 39 29 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
205 46 28 27 31 37 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 62 39 35 24 50 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1
206 46 28 27 31 37 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 49 25 24 25 29 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
207 14 11 10 8 6 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 22 11 10 19 21 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
208 14 11 10 8 6 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 28 16 14 15 9 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
209 14 11 10 8 6 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 18 15 14 11 9 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
210 14 11 10 8 6 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 25 18 17 9 9 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1
211 14 11 10 8 6 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 46 5 5 11 17 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
212 39 23 23 29 29 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 33 18 16 21 18 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
213 39 23 23 29 29 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 34 22 19 25 29 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1
214 39 23 23 29 29 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 17 7 6 14 15 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1
215 39 23 23 29 29 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 38 19 30 26 30 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
216 39 23 23 29 29 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 32 18 18 17 17 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1
217 66 57 37 27 31 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 37 18 28 25 28 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
218 66 57 37 27 31 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 53 29 29 39 24 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
219 66 57 37 27 31 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 35 27 14 24 14 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
220 66 57 37 27 31 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 27 13 25 12 23 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1
221 66 57 37 27 31 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 21 11 12 16 14 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
222 24 13 15 13 17 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 20 8 8 8 11 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
223 24 13 15 13 17 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 40 20 33 15 17 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
224 24 13 15 13 17 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 35 17 30 18 27 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
225 24 13 15 13 17 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 12 5 5 5 6 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1
226 24 13 15 13 17 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 19 10 9 14 16 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
227 53 30 37 28 31 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 29 20 29 14 15 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
228 53 30 37 28 31 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 16 9 7 10 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
229 53 30 37 28 31 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 50 27 25 35 35 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1
230 53 30 37 28 31 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 23 12 12 12 14 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1
231 53 30 37 28 31 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 22 11 11 14 14 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1
232 28 21 16 21 17 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 24 12 20 11 18 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
233 28 21 16 21 17 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 45 29 32 41 37 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0
234 28 21 16 21 17 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 11 6 6 5 6 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1
235 28 21 16 21 17 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 22 9 9 8 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
236 28 21 16 21 17 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 32 25 14 41 22 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1
237 42 26 15 30 16 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 35 17 16 20 14 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1
238 42 26 15 30 16 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 29 22 12 20 12 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
239 42 26 15 30 16 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 11 6 5 6 5 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
240 42 26 15 30 16 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 63 37 35 41 33 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1
241 42 26 15 30 16 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 16 10 8 10 8 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
242 43 26 25 31 27 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 53 29 27 54 46 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
243 43 26 25 31 27 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 51 39 25 43 39 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
244 43 26 25 31 27 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 16 12 11 9 8 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
245 43 26 25 31 27 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 28 26 14 20 11 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
246 43 26 25 31 27 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 54 32 31 33 32 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
247 20 9 9 12 12 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 57 50 37 32 39 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0
248 20 9 9 12 12 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 44 25 24 28 23 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
249 20 9 9 12 12 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 14 7 8 7 9 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
250 20 9 9 12 12 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 28 17 14 11 12 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
251 20 9 9 12 12 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 23 8 6 6 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
252 47 36 33 14 15 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 29 15 14 24 28 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
253 47 36 33 14 15 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 19 15 13 11 9 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
254 47 36 33 14 15 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 40 24 21 23 22 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1
255 47 36 33 14 15 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 67 25 24 25 40 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
256 47 36 33 14 15 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 34 30 28 22 20 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1
257 38 25 33 16 18 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 52 27 18 11 18 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
258 38 25 33 16 18 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 12 6 6 6 6 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1
259 38 25 33 16 18 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 47 30 23 17 20 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
260 38 25 33 16 18 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 57 23 30 15 25 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
261 38 25 33 16 18 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 28 13 10 20 20 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1
262 44 28 21 16 19 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 46 35 24 37 28 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
263 44 28 21 16 19 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 66 31 31 11 21 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1
264 44 28 21 16 19 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 34 29 20 27 18 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1
265 44 28 21 16 19 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 34 13 22 13 18 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1
266 44 28 21 16 19 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 35 32 27 23 17 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
267 11 6 6 5 6 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 48 31 29 30 25 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
268 11 6 6 5 6 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 42 15 16 20 11 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
269 11 6 6 5 6 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 46 26 24 32 27 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
270 11 6 6 5 6 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 38 34 27 26 14 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
271 11 6 6 5 6 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 59 47 31 32 39 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
272 26 9 7 7 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 36 21 15 10 13 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
273 26 9 7 7 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 63 43 39 39 52 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
274 26 9 7 7 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 8 8 6 6 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1
275 26 9 7 7 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 53 36 26 44 37 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
276 26 9 7 7 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 5 5 6 7 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
277 14 7 7 8 8 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 27 17 18 23 21 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0
278 14 7 7 8 8 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 36 22 18 20 18 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
279 14 7 7 8 8 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 46 23 21 27 19 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
280 14 7 7 8 8 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 21 10 16 11 15 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
281 14 7 7 8 8 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 12 5 7 8 5 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
282 19 9 13 10 16 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 46 27 28 27 33 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
283 19 9 13 10 16 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 20 10 9 10 10 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
284 19 9 13 10 16 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 35 21 13 24 13 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1
285 19 9 13 10 16 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 20 10 9 10 10 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
286 19 9 13 10 16 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 35 36 32 23 17 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
287 31 20 27 13 19 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 27 15 15 19 19 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
288 31 20 27 13 19 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 48 25 23 29 22 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
289 31 20 27 13 19 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 52 37 29 43 25 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
290 31 20 27 13 19 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 26 22 19 16 12 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
291 31 20 27 13 19 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 53 28 26 37 37 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0
292 35 30 18 27 15 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 19 12 12 7 7 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1
293 35 30 18 27 15 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 28 13 23 14 21 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
294 35 30 18 27 15 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 36 12 8 8 9 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
295 35 30 18 27 15 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 21 12 11 9 15 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1
296 35 30 18 27 15 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 47 27 25 42 49 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
297 12 6 6 6 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 18 10 10 8 12 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0
298 12 6 6 6 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 20 10 14 8 9 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
299 12 6 6 6 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 41 24 33 30 33 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
300 12 6 6 6 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 43 20 26 47 29 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
301 12 6 6 6 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 20 11 9 15 9 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
302 19 12 9 12 11 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 49 32 18 30 20 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0
303 19 12 9 12 11 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 28 18 24 12 17 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
304 19 12 9 12 11 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 63 37 43 37 52 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
305 19 12 9 12 11 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 15 8 7 10 11 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
306 19 12 9 12 11 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 51 29 27 35 29 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
307 51 29 27 46 54 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 48 33 37 20 16 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1
308 51 29 27 46 54 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 63 55 41 35 43 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1
309 51 29 27 46 54 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 28 17 11 17 12 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1
310 51 29 27 46 54 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 38 26 14 16 24 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1
311 51 29 27 46 54 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 12 6 7 6 7 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1
312 19 10 9 10 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 15 14 16 12 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
313 19 10 9 10 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 56 17 10 10 12 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
314 19 10 9 10 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 38 28 41 19 21 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
315 19 10 9 10 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 45 23 29 21 24 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
316 19 10 9 10 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 27 31 27 37 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
317 45 33 35 23 20 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 18 8 9 10 11 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1
318 45 33 35 23 20 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 33 21 17 20 16 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
319 45 33 35 23 20 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 26 10 14 23 14 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
320 45 33 35 23 20 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 51 24 46 26 41 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
321 45 33 35 23 20 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 15 7 8 10 11 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1
322 15 8 8 7 7 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 15 8 8 6 6 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1
323 15 8 8 7 7 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 14 8 7 9 8 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
324 15 8 8 7 7 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 35 17 15 33 37 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
325 15 8 8 7 7 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 26 13 14 10 15 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
326 15 8 8 7 7 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 19 7 10 8 7 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1
327 17 7 7 7 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 30 13 14 13 17 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
328 17 7 7 7 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 38 33 37 24 21 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
329 17 7 7 7 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 17 12 13 17 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1
330 17 7 7 7 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 8 7 7 8 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
331 17 7 7 7 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 53 54 27 29 46 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
332 30 11 12 14 9 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 40 16 12 12 13 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
333 30 11 12 14 9 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 34 18 19 12 24 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1
334 30 11 12 14 9 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 22 11 17 10 16 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
335 30 11 12 14 9 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 40 19 19 8 13 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1
336 30 11 12 14 9 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 57 49 32 23 27 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
337 42 16 15 16 24 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 28 9 8 26 30 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1
338 42 16 15 16 24 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 26 14 15 14 14 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1
339 42 16 15 16 24 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 38 38 19 29 14 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
340 42 16 15 16 24 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 30 23 17 23 19 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
341 42 16 15 16 24 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 30 19 17 18 17 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1
342 40 28 24 27 23 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 29 17 16 19 22 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1
343 40 28 24 27 23 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 59 44 29 54 27 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
344 40 28 24 27 23 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 34 14 14 12 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
345 40 28 24 27 23 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 16 8 10 9 10 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
346 40 28 24 27 23 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 20 13 11 14 10 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
347 12 6 6 6 6 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 12 6 6 7 6 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
348 12 6 6 6 6 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 34 21 21 21 21 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
349 12 6 6 6 6 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 12 7 6 6 7 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1
350 12 6 6 6 6 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 26 12 21 13 19 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
351 12 6 6 6 6 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 14 7 7 7 7 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
352 22 13 9 14 9 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 50 40 27 27 33 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
353 22 13 9 14 9 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 24 23 21 14 9 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
354 22 13 9 14 9 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 30 17 13 9 11 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
355 22 13 9 14 9 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 50 33 28 38 45 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
356 22 13 9 14 9 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 44 29 26 27 23 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
357 28 11 11 11 16 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 23 13 10 7 9 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
358 28 11 11 11 16 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 19 10 9 15 13 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
359 28 11 11 11 16 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 34 11 18 14 11 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1
360 28 11 11 11 16 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 46 33 43 24 32 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
361 28 11 11 11 16 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 37 23 16 20 18 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
362 37 15 18 15 21 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 23 11 17 13 22 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
363 37 15 18 15 21 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 30 28 15 16 24 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
364 37 15 18 15 21 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 23 14 9 14 10 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1
365 37 15 18 15 21 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 49 24 27 24 31 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1
366 37 15 18 15 21 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 34 16 20 35 22 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
367 49 29 28 30 29 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 68 44 33 24 29 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
368 49 29 28 30 29 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 67 32 30 24 35 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0
369 49 29 28 30 29 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 45 23 22 23 27 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
370 49 29 28 30 29 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 44 22 22 21 28 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1
371 49 29 28 30 29 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 16 6 6 12 13 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1
372 37 21 19 32 20 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 49 27 27 26 33 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
373 37 21 19 32 20 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 43 22 21 22 25 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
374 37 21 19 32 20 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 29 14 12 24 13 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
375 37 21 19 32 20 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 26 14 16 22 19 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
376 37 21 19 32 20 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 8 6 7 6 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
377 37 21 29 27 29 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 13 6 6 6 7 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1
378 37 21 29 27 29 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 62 37 36 39 37 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
379 37 21 29 27 29 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 26 10 14 23 14 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
380 37 21 29 27 29 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 23 11 9 16 16 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1
381 37 21 29 27 29 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 18 11 10 11 10 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
382 17 8 8 9 7 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 44 22 18 39 20 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
383 17 8 8 9 7 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 48 33 37 20 16 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
384 17 8 8 9 7 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 44 27 17 41 25 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
385 17 8 8 9 7 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 26 8 13 9 9 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
386 17 8 8 9 7 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 19 11 14 8 11 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
387 46 28 31 12 13 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 19 11 11 11 11 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1
388 46 28 31 12 13 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 12 6 6 5 6 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
389 46 28 31 12 13 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 18 10 9 11 10 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
390 46 28 31 12 13 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 25 13 12 20 23 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
391 46 28 31 12 13 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 12 7 7 6 6 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
392 19 9 11 14 15 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 11 5 6 7 6 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
393 19 9 11 14 15 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 33 14 12 32 36 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1
394 19 9 11 14 15 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 12 7 6 6 5 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
395 19 9 11 14 15 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 51 28 26 51 44 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
396 19 9 11 14 15 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 42 33 17 30 17 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
397 30 15 14 17 14 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 34 24 17 27 24 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
398 30 15 14 17 14 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 46 30 26 28 26 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
399 30 15 14 17 14 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 28 14 18 13 15 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
400 30 15 14 17 14 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 28 12 13 12 16 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
401 30 15 14 17 14 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 29 14 23 16 29 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
402 38 25 21 23 21 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 25 17 14 9 14 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1
403 38 25 21 23 21 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 46 29 29 29 29 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1
404 38 25 21 23 21 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 21 10 16 11 15 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
405 38 25 21 23 21 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 32 17 17 17 21 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1
406 38 25 21 23 21 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 15 7 7 10 7 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
407 35 22 13 21 14 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 33 33 30 21 16 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
408 35 22 13 21 14 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 19 12 12 7 7 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1
409 35 22 13 21 14 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 38 19 16 22 17 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1
410 35 22 13 21 14 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 46 31 28 28 37 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
411 35 22 13 21 14 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 40 32 39 11 15 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
412 42 23 23 30 19 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 32 16 20 15 17 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
413 42 23 23 30 19 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 39 19 19 19 19 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
414 42 23 23 30 19 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 27 18 16 17 15 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
415 42 23 23 30 19 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 32 23 17 24 19 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
416 42 23 23 30 19 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 16 9 8 10 8 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
417 23 15 11 12 15 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 58 37 25 19 19 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
418 23 15 11 12 15 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 64 5 5 14 23 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
419 23 15 11 12 15 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 28 18 20 12 10 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1
420 23 15 11 12 15 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 53 52 43 37 25 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
421 23 15 11 12 15 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 63 55 41 35 43 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0
422 50 38 36 15 16 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 64 33 21 12 21 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
423 50 38 36 15 16 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 47 18 32 18 25 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1
424 50 38 36 15 16 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 20 17 10 13 8 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
425 50 38 36 15 16 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 35 17 14 20 16 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1
426 50 38 36 15 16 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 43 38 26 35 23 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1
427 49 27 33 25 28 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 49 35 29 33 28 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
428 49 27 33 25 28 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 12 6 6 6 6 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
429 49 27 33 25 28 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 63 37 43 37 52 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
430 49 27 33 25 28 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 27 19 27 13 14 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
431 49 27 33 25 28 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 12 6 6 6 6 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1
432 14 8 12 7 8 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 43 21 20 18 17 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0
433 14 8 12 7 8 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 30 32 28 18 11 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
434 14 8 12 7 8 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 12 6 7 5 5 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1
435 14 8 12 7 8 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 41 21 22 19 19 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
436 14 8 12 7 8 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 16 10 15 9 10 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1
437 32 25 18 36 23 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 22 10 16 12 20 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
438 32 25 18 36 23 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 33 18 17 31 27 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
439 32 25 18 36 23 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 45 22 21 19 17 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0
440 32 25 18 36 23 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 37 19 18 22 17 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1
441 32 25 18 36 23 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 35 28 19 14 16 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+1 -1
View File
@@ -47,7 +47,7 @@ pokemons_df = pd.DataFrame.from_dict(pokemons_dict,orient='index')
available_pokemon_names = list(pokemons_dict.keys()) available_pokemon_names = list(pokemons_dict.keys())
available_starters = ['bulbasaur', 'charmander', 'squirtle'] available_starter_names = ['bulbasaur', 'charmander', 'squirtle']
#type effectiveness #type effectiveness
type_effectiveness = [] type_effectiveness = []
+434 -170
View File
@@ -1,21 +1,199 @@
from core import Trainer from core import Trainer
import game_data as gd
import random import random
import copy import copy
import game_data as gd
import pickle
import matplotlib.pyplot as plt
import numpy as np import numpy as np
import pickle
import joblib
import os import os
import pandas as pd import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint
from sklearn.tree import export_graphviz
import graphviz
np.seterr(divide='raise', invalid='raise') game_status = 'story'
game_active_flag = True
if os.path.exists('trained_model.joblib'):
recommender_sys_avail = True
else:
recommender_sys_avail = False
#if the results folder does not exist, create it def recommend(player_pokemon, opponent_pokemon):
if not os.path.exists('results'): global recommender_sys_avail
os.makedirs('results') if recommender_sys_avail:
if not os.path.exists('plots'): model = joblib.load('trained_model.joblib')
os.makedirs('plots')
# Prepare input data
all_pokemon_types = list(gd.available_types)
player_ActStats = list(player_pokemon.ActStats.values())
player_pokemon_type = player_pokemon.types
player_pokemon_type_encoded = [1 if t in player_pokemon_type else 0 for t in all_pokemon_types]
opponent_ActStats = list(opponent_pokemon.ActStats.values())
opponent_pokemon_type = opponent_pokemon.types
opponent_pokemon_type_encoded = [1 if t in opponent_pokemon_type else 0 for t in all_pokemon_types]
input_data = player_ActStats + player_pokemon_type_encoded + opponent_ActStats + opponent_pokemon_type_encoded
labels = build_dataset()[:-1] # Exclude the last label which is 'battle_result'
df_to_eval = pd.DataFrame([input_data], columns=labels)
prediction_proba = model.predict_proba(df_to_eval)
return prediction_proba[0][1] # Returns 1 if prediction is a win, 0 otherwise, and the probability of winning
else:
raise ValueError("Recommender system is not available. Play NewRandomBattle once!")
def Battle(trainer,cpu_trainer):
global game_status
global game_active_flag
print(f"You are in battle against CPU's {cpu_trainer.get_active_pokemon().name}!")
battle_active = True
while battle_active:
player_battle_action_selected = False
while not player_battle_action_selected:
print("Type the number of one of the following actions:")
print(f"1) Attack - [Your active Pokemon - {trainer.get_active_pokemon().name}]")
print("2) Change pokemon")
print("3) Use item")
print("4) Consult the Oracle")
print("5) Run away")
print('6) Check status')
try:
action = int(input("Choose an action (1-6): ").strip())
player_battle_action_selected = True
except ValueError:
print("Invalid input. Please enter a number between 1 and 6.")
continue
if action == 1:
#check if the player can sustain a battle: first check the active pokemon,
#then check the pokemons in the list
if not trainer.active_pokemon_can_battle():
print("Your active pokemon cannot battle!")
if not trainer.can_battle():
print("You have no more pokemon that can battle! You lost the battle!")
battle_active = False
game_status = 'pokemon_center'
break
else:
print("You have other pokemon that can battle! Please change your active pokemon!")
continue
selected_combat_move_flag = False
while not selected_combat_move_flag:
active_pokemon = trainer.get_active_pokemon()
cpu_active_pokemon = cpu_trainer.get_active_pokemon()
print(f"Choose a move for {active_pokemon.name} to use against {cpu_active_pokemon.name}:\n", active_pokemon.get_moves())
player_move_name = input("Choose:")
try:
active_pokemon.useMove(player_move_name,cpu_active_pokemon)
selected_combat_move_flag = True
#check if the opponent has been defeated
if not cpu_trainer.active_pokemon_can_battle():
print(f"{cpu_trainer.get_active_pokemon().name} has been defeated!")
battle_active = False
game_status = 'story'
break
#if the opponent has not been defeated, then its the CPU turn to play
cpu_active_pokemon_selected_move_name = random.choice(cpu_active_pokemon.get_moves())
print(f"CPU's {cpu_active_pokemon.name} is using {cpu_active_pokemon_selected_move_name} against your {active_pokemon.name}!")
cpu_active_pokemon.useMove(cpu_active_pokemon_selected_move_name, active_pokemon)
#update the player pokemon list
trainer.update_pokemon_list(active_pokemon)
#check if the player has been defeated
if not trainer.active_pokemon_can_battle():
print(f"Your {active_pokemon.name} has been defeated!")
if not trainer.can_battle():
print("You have no more Pokemons that can battle! You lost!")
battle_active = False
game_status = 'pokemon_center'
break
else:
print("You have other Pokemons that can battle!")
continue
except ValueError as e:
print(e)
print("Please try again...")
elif action == 2:
print('='*30)
print("Change active pokemon")
print('-'*30)
change_pokemon_success = False
while not change_pokemon_success:
try:
print("Select the name of a pokemon in your list:")
print(trainer.get_pokemon_list())
chosen_new_pokemon_name = input('Choose...')
trainer.change_active_pokemon(chosen_new_pokemon_name)
change_pokemon_success = True
except ValueError as e:
print(e)
elif action == 3:
print("Select the item index to use:")
trainer.print_items()
item_selected_flag = False
while not item_selected_flag:
try:
avail_items = list(trainer.items.keys())
item_index = int(input("Choose an item index (1-2): ").strip())
item_selected_flag = True
is_pokeball = trainer.use_item(item_name=avail_items[item_index - 1])
if is_pokeball:
catch_prob = 1 - (cpu_trainer.get_active_pokemon().get_current_hp() / cpu_trainer.get_active_pokemon().baseStats['hp'])
random_value = random.uniform(0, 1)
if random_value < catch_prob:
print(f"You caught {cpu_trainer.get_active_pokemon().name}!")
trainer.add_pokemon(cpu_trainer.get_active_pokemon())
battle_active = False
game_status = 'story'
else:
print(f"{cpu_trainer.get_active_pokemon().name} escaped your pokeball!")
except ValueError:
print("Please enter a number between 1 and 2.")
continue
elif action == 4:
global recommender_sys_avail
if recommender_sys_avail:
try:
for pokemon in trainer.pokemon_list:
win_prob = recommend(player_pokemon=pokemon, opponent_pokemon=cpu_trainer.get_active_pokemon())
print(f"The Oracle predicts {pokemon.name} to have {win_prob:.2f} of chances to win against {cpu_trainer.get_active_pokemon().name}.")
except ValueError as e:
print(e)
elif action == 5:
runaway_prob = 0.6
random_value = random.uniform(0, 1)
if random_value < runaway_prob:
print("You successfully ran away from the battle!")
battle_active = False
game_status = 'story'
else:
print("You could not run away from the battle!")
elif action == 6:
print('='*30)
print("BATTLE INFO")
print('-'*30)
print("Your items:")
trainer.print_items()
print("Your pokemon list info:")
for pokemon in trainer.pokemon_list:
pokemon.print_pokemon_info()
print("-"*30)
print("CPU active pokemon info:")
cpu_trainer.get_active_pokemon().print_pokemon_info()
print('='*30)
else:
print("Invalid action. Please choose again.")
def RandomBattle(trainer,cpu_trainer): def RandomBattle(trainer,cpu_trainer):
#print(f"You are in battle against {cpu_trainer.name}!") #print(f"You are in battle against {cpu_trainer.name}!")
@@ -33,13 +211,20 @@ def RandomBattle(trainer,cpu_trainer):
cpu_hp_evolution = [] cpu_hp_evolution = []
cpu_selected_moves = [] cpu_selected_moves = []
cpu_damage_done = [] cpu_damage_done = []
zero_damage_counter = 0
zero_damage_max_turns = 10
while battle_active: while battle_active:
#print(f"Starting battle turn {battle_turns_num + 1}")
player_move_name = random.choice(active_pokemon.get_moves()) player_move_name = random.choice(active_pokemon.get_moves())
player_selected_moves.append(player_move_name) player_selected_moves.append(player_move_name)
#print(f"{active_pokemon.name} selected {player_move_name} to use against {cpu_active_pokemon.name}:\n") #print(f"{active_pokemon.name} selected {player_move_name} to use against {cpu_active_pokemon.name}:\n")
try: try:
player_damage_done_value = active_pokemon.useMove(player_move_name,cpu_active_pokemon) player_damage_done_value = active_pokemon.useMove(player_move_name,cpu_active_pokemon,game_status='new_random_battle')
if player_damage_done_value == 0:
zero_damage_counter += 1
else:
zero_damage_counter = 0
#print(f"Player did {player_damage_done_value} damage with {player_move_name}")
player_damage_done.append(player_damage_done_value) player_damage_done.append(player_damage_done_value)
player_hp_evolution.append(active_pokemon.get_current_hp()) player_hp_evolution.append(active_pokemon.get_current_hp())
cpu_hp_evolution.append(cpu_active_pokemon.get_current_hp()) cpu_hp_evolution.append(cpu_active_pokemon.get_current_hp())
@@ -57,7 +242,11 @@ def RandomBattle(trainer,cpu_trainer):
#print(f"CPU's {cpu_active_pokemon.name} is using {cpu_active_pokemon_selected_move_name} against your {active_pokemon.name}!") #print(f"CPU's {cpu_active_pokemon.name} is using {cpu_active_pokemon_selected_move_name} against your {active_pokemon.name}!")
cpu_selected_moves.append(cpu_active_pokemon_selected_move_name) cpu_selected_moves.append(cpu_active_pokemon_selected_move_name)
cpu_damage_done_value = cpu_active_pokemon.useMove(cpu_active_pokemon_selected_move_name, active_pokemon) cpu_damage_done_value = cpu_active_pokemon.useMove(cpu_active_pokemon_selected_move_name, active_pokemon,game_status='new_random_battle')
if cpu_damage_done_value == 0:
zero_damage_counter += 1
else:
zero_damage_counter = 0
cpu_damage_done.append(cpu_damage_done_value) cpu_damage_done.append(cpu_damage_done_value)
player_hp_evolution.append(active_pokemon.get_current_hp()) player_hp_evolution.append(active_pokemon.get_current_hp())
@@ -66,7 +255,7 @@ def RandomBattle(trainer,cpu_trainer):
#update the player pokemon list #update the player pokemon list
trainer.update_pokemon_list(active_pokemon) trainer.update_pokemon_list(active_pokemon)
#check if the player has been defeated
if not trainer.active_pokemon_can_battle(): if not trainer.active_pokemon_can_battle():
#print(f"Your {active_pokemon.name} has been defeated!") #print(f"Your {active_pokemon.name} has been defeated!")
if not trainer.can_battle(): if not trainer.can_battle():
@@ -75,12 +264,16 @@ def RandomBattle(trainer,cpu_trainer):
battle_active = False battle_active = False
break break
else: else:
#print("You have other Pokemons that can battle!") print("You have other Pokemons that can battle!")
continue continue
if zero_damage_counter >= zero_damage_max_turns:
print("Zero damage detected for too many consecutive turns. Ending battle.")
battle_active = False
did_player_won = False
break
except ValueError as e: except ValueError as e:
print(e) print(e)
flag_1 = True
#manage those cases for which the player wins in the first turn and the cpu does not play any turn #manage those cases for which the player wins in the first turn and the cpu does not play any turn
if len(player_damage_done) == 0: if len(player_damage_done) == 0:
player_damage_done = [0] player_damage_done = [0]
@@ -115,112 +308,6 @@ def RandomBattle(trainer,cpu_trainer):
} }
return battle_results return battle_results
def Main(starter_choice,Nbattles):
try:
starter_name = starter_choice
trainer = Trainer(name='edo', starter_name=starter_name)
#print(f"{trainer.name} has chosen {trainer.starter} as their starter Pokemon!")
#print("Adding potions and pokeballs to your inventory...")
trainer.items = {"potions": 10, "pokeball": 10}
#print("Your character is ready!")
#print(f"Welcome {trainer.name}! Your adventure begins now!")
except ValueError as e:
print(e)
print("Something went wrong!")
game_active_flag = True
while game_active_flag:
all_battle_results = []
for i in range(0,Nbattles):
#print("You entered the Random Battle mode")
#print("Battle #",i)
cpu_trainer = Trainer(name='CPU',starter_name=gd.pokemons_df.index[random.randint(0,len(gd.pokemons_df.index)-1)],is_CPU=True)
battle_results = RandomBattle(trainer,cpu_trainer)
all_battle_results.append(battle_results)
heal_flag = 'yes'
if heal_flag == 'yes':
for pokemon in trainer.pokemon_list:
pokemon.curr_hp = pokemon.baseStats['hp']
#print("All your Pokemon have been healed!")
game_active_flag = False
#save all battle results
return all_battle_results
def make_plots(Ngames,Nbattles):
files_to_analyze = os.listdir('results/')
avg_damage_per_level = dict()
for file_name in files_to_analyze:
pickle_in = open(f"results/{file_name}",'rb')
all_battle_results = pickle.load(pickle_in)
pickle_in.close()
for battle_result in all_battle_results:
player_pokemon = battle_result['player_pokemon']
player_pokemon_name = player_pokemon.name
player_pokemon_level = player_pokemon.level
player_avg_damage_done = battle_result['turn_history']['player_history']['player_avg_damage_done']
if player_pokemon_name not in avg_damage_per_level:
avg_damage_per_level[player_pokemon_name] = {}
if player_pokemon_level not in avg_damage_per_level[player_pokemon_name]:
avg_damage_per_level[player_pokemon_name][player_pokemon_level] = []
avg_damage_per_level[player_pokemon_name][player_pokemon_level].append(player_avg_damage_done)
for pokemon_name in avg_damage_per_level:
for level in avg_damage_per_level[pokemon_name]:
avg_damage_per_level[pokemon_name][level] = np.mean(avg_damage_per_level[pokemon_name][level])
for pokemon_name in avg_damage_per_level:
levels = list(avg_damage_per_level[pokemon_name].keys())
avg_damages = list(avg_damage_per_level[pokemon_name].values())
plt.figure(figsize=(12, 6))
plt.bar(levels, avg_damages)
plt.xlabel('Pokemon Level')
plt.ylabel('Average Damage Done')
plt.title(f'Average Damage Done per battle turn for {pokemon_name}')
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig(f'plots/average_damage_per_turn_{pokemon_name}.pdf')
#pie chart
available_pokemon_type_distribution = {}
for pokemon_name in gd.pokemons_dict:
pokemon_types = gd.pokemons_dict[pokemon_name]['types']
for pokemon_type in pokemon_types:
if pokemon_type not in available_pokemon_type_distribution:
available_pokemon_type_distribution[pokemon_type] = 0
available_pokemon_type_distribution[pokemon_type] += 1
encountered_pokemon_types = {}
for file_name in files_to_analyze:
pickle_in = open(f"results/{file_name}",'rb')
all_battle_results = pickle.load(pickle_in)
pickle_in.close()
for battle_result in all_battle_results:
encountered_pokemon = battle_result['encountered_pokemon']
encountered_pokemon_types_list = encountered_pokemon.types
for pokemon_type in encountered_pokemon_types_list:
if pokemon_type not in encountered_pokemon_types:
encountered_pokemon_types[pokemon_type] = 0
encountered_pokemon_types[pokemon_type] += 1
quantities = list(encountered_pokemon_types.values())
labels = list(encountered_pokemon_types.keys())
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.pie(quantities, labels=labels, autopct='%1.1f%%', startangle=140)
plt.title('Distribution of Encountered Pokemon Types')
plt.axis('equal') # Equal aspect ratio ensures that pie is drawn as a circle
plt.subplot(1, 2, 2)
quantities_base = list(available_pokemon_type_distribution.values())
labels_base = list(available_pokemon_type_distribution.keys())
plt.pie(quantities_base, labels=labels_base, autopct='%1.1f%%', startangle=140)
plt.title('Distribution of Available Pokemon Types')
plt.axis('equal')
plt.savefig('plots/pokemon_types_distribution.pdf')
def build_dataset(): def build_dataset():
all_pokemon_types = list(gd.available_types) all_pokemon_types = list(gd.available_types)
player_ActStats_labels = ["player_hp", "player_attack", "player_defense", "player_speed", "player_special"] player_ActStats_labels = ["player_hp", "player_attack", "player_defense", "player_speed", "player_special"]
@@ -228,39 +315,48 @@ def build_dataset():
opponent_ActStats_labels = ["opponent_hp", "opponent_attack", "opponent_defense", "opponent_speed", "opponent_special"] opponent_ActStats_labels = ["opponent_hp", "opponent_attack", "opponent_defense", "opponent_speed", "opponent_special"]
opponent_type_label = ['opponent_type_' + t for t in all_pokemon_types] opponent_type_label = ['opponent_type_' + t for t in all_pokemon_types]
#define a padas dataframe to store the dataset #define a pandas dataframe to store the dataset
dataset_column_labels = player_ActStats_labels + player_type_label + opponent_ActStats_labels + opponent_type_label + ['battle_result'] dataset_column_labels = player_ActStats_labels + player_type_label + opponent_ActStats_labels + opponent_type_label + ['battle_result']
if os.path.exists('dataset.csv'):
return dataset_column_labels
dataset = pd.DataFrame(columns=dataset_column_labels) dataset = pd.DataFrame(columns=dataset_column_labels)
files_to_analyze = os.listdir('results/') files_to_analyze = os.listdir('results/')
dataset_row = [] dataset_rows = []
for file_name in files_to_analyze: num_of_files = len(files_to_analyze)
pickle_in = open(f"results/{file_name}",'rb') for i, file_name in enumerate(files_to_analyze):
all_battle_results = pickle.load(pickle_in) print(f"Processing file {i + 1}/{num_of_files}: {file_name}")
pickle_in.close()
with open(f"results/{file_name}", "rb") as pickle_in:
all_battle_results = pickle.load(pickle_in)
for battle_result in all_battle_results: for battle_result in all_battle_results:
player_pokemon_ActStats = list(battle_result['player_pokemon'].ActStats.values()) player_pokemon = battle_result["player_pokemon"]
player_pokemon_type = battle_result['player_pokemon'].types opponent_pokemon = battle_result["encountered_pokemon"]
player_pokemon_type_encoded = [1 if t in player_pokemon_type else 0 for t in all_pokemon_types]
opponent_pokemon = list(battle_result['encountered_pokemon'].ActStats.values()) player_stats = list(player_pokemon.ActStats.values())
opponent_pokemon_type = battle_result['encountered_pokemon'].types player_types = [
opponent_pokemon_type_encoded = [1 if t in opponent_pokemon_type else 0 for t in all_pokemon_types] int(pokemon_type in player_pokemon.types)
battle_result_integer = 1 if battle_result['result'] else 0 for pokemon_type in all_pokemon_types
dataset_row = player_pokemon_ActStats + player_pokemon_type_encoded + opponent_pokemon + opponent_pokemon_type_encoded + [battle_result_integer] ]
#append the row to the dataset opponent_stats = list(opponent_pokemon.ActStats.values())
dataset.loc[len(dataset)] = dataset_row opponent_types = [
int(pokemon_type in opponent_pokemon.types)
for pokemon_type in all_pokemon_types
]
result = int(battle_result["result"])
dataset_rows.append(
player_stats + player_types + opponent_stats + opponent_types + [result]
)
dataset = pd.DataFrame(dataset_rows, columns=dataset_column_labels)
dataset.to_csv("dataset.csv", index=False)
#save the dataset to a csv file
dataset.to_csv('dataset.csv', index=False)
return dataset_column_labels return dataset_column_labels
def train_model(dataset_column_labels): def train_model(dataset_column_labels):
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint
dataset_labels = dataset_column_labels[:-1] dataset_labels = dataset_column_labels[:-1]
# Load the dataset # Load the dataset
dataset = pd.read_csv('dataset.csv') dataset = pd.read_csv('dataset.csv')
@@ -275,13 +371,14 @@ def train_model(dataset_column_labels):
# Create a Random Forest Classifier # Create a Random Forest Classifier
model = RandomForestClassifier() model = RandomForestClassifier()
param_dist = { param_dist = {
'n_estimators': randint(50, 500), 'n_estimators': randint(30, 300),
'max_depth': randint(1, 20), 'max_depth': randint(2, 30),
} }
#RandomizedSearchCV is used for parameter tuning.
rand_search = RandomizedSearchCV(model, rand_search = RandomizedSearchCV(model,
param_distributions=param_dist, param_distributions=param_dist,
n_iter=5, cv=5).fit(X_train, y_train) n_iter=7, cv=5, n_jobs=3).fit(X_train, y_train)
# Train the model # Train the model
best_model = rand_search.best_estimator_ best_model = rand_search.best_estimator_
@@ -298,8 +395,6 @@ def train_model(dataset_column_labels):
print("Confusion Matrix:") print("Confusion Matrix:")
print(confusion_matrix(y_test, y_pred)) print(confusion_matrix(y_test, y_pred))
from sklearn.tree import export_graphviz
import graphviz
# Visualize the first three estimators # Visualize the first three estimators
for i in range(3): for i in range(3):
tree = best_model.estimators_[i] tree = best_model.estimators_[i]
@@ -310,22 +405,191 @@ def train_model(dataset_column_labels):
impurity = False, impurity = False,
proportion = True) proportion = True)
graph = graphviz.Source(dot_data) graph = graphviz.Source(dot_data)
graph.render(outfile=f"plots/tree_{i}.pdf", format='pdf') graph.render(outfile=f"plots/tree_{i}.pdf", format='pdf')
# Save the trained model
joblib.dump(best_model, 'trained_model.joblib')
def MainRandomBattle(starter_choice,Nbattles):
try:
starter_name = starter_choice
trainer = Trainer(name='trainer', starter_name=starter_name)
trainer.items = {"potions": 10, "pokeball": 10}
except ValueError as e:
print(e)
print("Something went wrong!")
game_active_flag = True
while game_active_flag:
all_battle_results = []
for i in range(0,Nbattles):
cpu_trainer = Trainer(name='CPU',starter_name=gd.pokemons_df.index[random.randint(0,len(gd.pokemons_df.index)-1)],is_CPU=True)
battle_results = RandomBattle(trainer,cpu_trainer)
all_battle_results.append(battle_results)
heal_flag = 'yes'
if heal_flag == 'yes':
for pokemon in trainer.pokemon_list:
pokemon.curr_hp = pokemon.baseStats['hp']
game_active_flag = False
#save all battle results
return all_battle_results
def Main():
global game_status
global game_active_flag
player_created_flag = False
while not player_created_flag:
try:
trainer_name = input("Enter your trainer name: ")
print("Available starter Pokemon: ", gd.available_starter_names)
starter_name = input("Choose your starter Pokemon: ")
trainer = Trainer(name=trainer_name, starter_name=starter_name)
print(f"{trainer.name} has chosen {trainer.starter} as their starter Pokemon!")
print("Adding potions and pokeballs to your inventory...")
trainer.items = {"potions": 10, "pokeball": 10}
print("Your character is ready!")
#trainer.print_trainer_info()
player_created_flag = True
print(f"Welcome {trainer.name}! Your adventure begins now!")
except ValueError as e:
print(e)
print("Please try again...")
continue
while game_active_flag:
if game_status == 'story':
print("Type the number of one of the following actions:")
print("1) Explore ")
print("2) Pokemon Center")
print("3) Pokemon Store")
print("4) Show trainer data")
print("5) NewRandomBattle")
print("6) Exit")
try:
action = int(input("Choose an action (1-6): ").strip())
except ValueError:
print("Invalid input. Please enter a number between 1 and 6.")
continue
if action == 1:
game_status = 'explore'
elif action == 2:
game_status = 'pokemon_center'
elif action == 3:
game_status = 'pokemon_store'
elif action == 4:
print("Showing trainer data:")
trainer.print_trainer_info()
elif action == 5:
confirm=input("Are you sure you want to start a new random battle? This will generate data and train the model. Type 'yes' to continue: ")
if confirm.lower() == 'yes':
print("Starting a new random battle!")
game_status = 'new_random_battle'
else:
print("Cancelled starting a new random battle.")
elif action == 6:
print("Exiting the game. Goodbye!")
game_active_flag = False
else:
print("Invalid action. Please choose again.")
elif game_status == 'explore':
print("You are exploring")
battle_prob = random.uniform(0, 1)
#print(f"Battle probability: {battle_prob:.2f}")
if battle_prob < 0.8:
cpu_trainer = Trainer(name='CPU',starter_name=gd.pokemons_df.index[random.randint(0,len(gd.pokemons_df.index)-1)],is_CPU=True)
print(f"A wild {cpu_trainer.get_active_pokemon().name} appeared!")
#print(cpu_trainer.get_active_pokemon().print_pokemon_info())
game_status = 'battle'
#before entering the battle, we predict the win probability of
#each of the player's pokemon against the opponent's pokemon
try:
win_probs = []
for pokemon in trainer.pokemon_list:
win_prob = recommend(player_pokemon=pokemon, opponent_pokemon=cpu_trainer.get_active_pokemon())
win_probs.append(win_prob)
print(f"The Oracle predicts {pokemon.name} to have {win_prob:.2f} of chances to win.")
#if all the win probabilities are below 0.5, we suggest the player to run away
if all(prob < 0.5 for prob in win_probs):
print("The Oracle suggests to RUN AWAY!")
else:
if len(win_probs) > 1:
#find the pokemon with the highest win probability
best_pokemon_index = win_probs.index(max(win_probs))
best_pokemon = trainer.pokemon_list[best_pokemon_index]
print(f"The Oracle suggests to use {best_pokemon.name}!")
except ValueError as e:
print("HINT: Unlock access to the Oracle by playing NewRandomBattle!")
Battle(trainer,cpu_trainer)
else:
print('-'*30)
print("No wild Pokemon appeared.")
game_status = 'story'
elif game_status == 'pokemon_center':
print("You are at the Pokemon Center. You can heal your Pokemon here.")
heal_flag = input("Type 'yes' to heal your Pokemons or any other key to exit: ").strip().lower()
if heal_flag == 'yes':
for pokemon in trainer.pokemon_list:
pokemon.curr_hp = pokemon.baseStats['hp']
for move in pokemon.moves_dict.keys():
pokemon.moves_dict[move]['pp'] = copy.deepcopy(gd.available_moves_df.loc[move]['pp'])
print("All your Pokemon have been healed!")
game_status = 'story'
else:
print("You exited the Pokemon Center.")
game_status = 'story'
# Add Pokemon Center logic here
elif game_status == 'pokemon_store':
print("You are in the Pokemon Store. You can buy items here.")
restore_items_flag = input("Type 'yes' to restore your items: ").strip().lower()
if restore_items_flag == 'yes':
trainer.items = {"potions": 10, "pokeball": 10}
print("Your items have been restored!")
game_status = 'story'
else:
print("You exited the Pokemon Store.")
game_status = 'story'
elif game_status == 'new_random_battle':
Ngames = 1000
Nbattles = 500
print("Generating data...")
#generate battle data only if the dataset.csv does not exist
if not os.path.exists('dataset.csv'):
for i in range(Ngames):
starter_choice = gd.pokemons_df.index[random.randint(0,len(gd.pokemons_df.index)-1)]
print(f"Generating data for {starter_choice}, game {i}...")
results = MainRandomBattle(starter_choice=starter_choice, Nbattles=Nbattles)
pickle_out = open(f"results/{starter_choice}_game_{i}_{Nbattles}_battles.pickle",'wb')
pickle.dump(results,pickle_out)
pickle_out.close()
print("Setting up the dataset...")
dataset_column_labels = build_dataset()
try:
print("Training model...")
train_model(dataset_column_labels)
print("Model has been trained! Ending NewRandomBattle")
global recommender_sys_avail
recommender_sys_avail = True
except Exception as e:
print(f"An error occurred during model training: {e}")
print("Ending NewRandomBattle without training the model.")
game_status = 'story'
else:
print("Unknown game status. Try again.")
if __name__ == "__main__": if __name__ == "__main__":
Ngames = 10 if not os.path.exists('results'):
Nbattles = 5 os.makedirs('results')
print("Generating data") if not os.path.exists('plots'):
for i in range(Ngames): os.makedirs('plots')
starter_choice = gd.pokemons_df.index[random.randint(0,len(gd.pokemons_df.index)-1)]
#print(f"Generating data for {starter_choice}, game {i}...")
results = Main(starter_choice = starter_choice, Nbattles=Nbattles)
pickle_out = open(f"results/{starter_choice}_game_{i}_{Nbattles}_battles.pickle",'wb')
pickle.dump(results,pickle_out)
pickle_out.close()
print("Generating dataset") Main()
dataset_column_labels = build_dataset()
print("Training model")
train_model(dataset_column_labels)
print("Ended")
+571
View File
@@ -0,0 +1,571 @@
from core import Trainer
import game_data as gd
import random
import copy
import numpy as np
import pickle
import joblib
import os
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint
from sklearn.tree import export_graphviz
import graphviz
game_status = 'story'
game_active_flag = True
if os.path.exists('trained_model.joblib'):
recommender_sys_avail = True
else:
recommender_sys_avail = False
def recommend(player_pokemon, opponent_pokemon):
global recommender_sys_avail
if recommender_sys_avail:
model = joblib.load('trained_model.joblib')
# Prepare input data
all_pokemon_types = list(gd.available_types)
player_ActStats = list(player_pokemon.ActStats.values())
player_pokemon_type = player_pokemon.types
player_pokemon_type_encoded = [1 if t in player_pokemon_type else 0 for t in all_pokemon_types]
opponent_ActStats = list(opponent_pokemon.ActStats.values())
opponent_pokemon_type = opponent_pokemon.types
opponent_pokemon_type_encoded = [1 if t in opponent_pokemon_type else 0 for t in all_pokemon_types]
input_data = player_ActStats + player_pokemon_type_encoded + opponent_ActStats + opponent_pokemon_type_encoded
labels = build_dataset()[:-1] # Exclude the last label which is 'battle_result'
df_to_eval = pd.DataFrame([input_data], columns=labels)
prediction_proba = model.predict_proba(df_to_eval)
return prediction_proba[0][1] # Returns 1 if prediction is a win, 0 otherwise, and the probability of winning
else:
raise ValueError("Recommender system is not available. Play NewRandomBattle once!")
def Battle(trainer,cpu_trainer):
global game_status
global game_active_flag
print(f"You are in battle against CPU's {cpu_trainer.get_active_pokemon().name}!")
battle_active = True
while battle_active:
player_battle_action_selected = False
while not player_battle_action_selected:
print("Type the number of one of the following actions:")
print(f"1) Attack - [Your active Pokemon - {trainer.get_active_pokemon().name}]")
print("2) Change pokemon")
print("3) Use item")
print("4) Consult the Oracle")
print("5) Run away")
print('6) Check status')
try:
action = int(input("Choose an action (1-6): ").strip())
player_battle_action_selected = True
except ValueError:
print("Invalid input. Please enter a number between 1 and 6.")
continue
if action == 1:
#check if the player can sustain a battle: first check the active pokemon,
#then check the pokemons in the list
if not trainer.active_pokemon_can_battle():
print("Your active pokemon cannot battle!")
if not trainer.can_battle():
print("You have no more pokemon that can battle! You lost the battle!")
battle_active = False
game_status = 'pokemon_center'
break
else:
print("You have other pokemon that can battle! Please change your active pokemon!")
continue
selected_combat_move_flag = False
while not selected_combat_move_flag:
active_pokemon = trainer.get_active_pokemon()
cpu_active_pokemon = cpu_trainer.get_active_pokemon()
print(f"Choose a move for {active_pokemon.name} to use against {cpu_active_pokemon.name}:\n", active_pokemon.get_moves())
player_move_name = input("Choose:")
try:
active_pokemon.useMove(player_move_name,cpu_active_pokemon)
selected_combat_move_flag = True
#check if the opponent has been defeated
if not cpu_trainer.active_pokemon_can_battle():
print(f"{cpu_trainer.get_active_pokemon().name} has been defeated!")
battle_active = False
game_status = 'story'
break
#if the opponent has not been defeated, then its the CPU turn to play
cpu_active_pokemon_selected_move_name = random.choice(cpu_active_pokemon.get_moves())
print(f"CPU's {cpu_active_pokemon.name} is using {cpu_active_pokemon_selected_move_name} against your {active_pokemon.name}!")
cpu_active_pokemon.useMove(cpu_active_pokemon_selected_move_name, active_pokemon)
#update the player pokemon list
trainer.update_pokemon_list(active_pokemon)
#check if the player has been defeated
if not trainer.active_pokemon_can_battle():
print(f"Your {active_pokemon.name} has been defeated!")
if not trainer.can_battle():
print("You have no more Pokemons that can battle! You lost!")
battle_active = False
game_status = 'pokemon_center'
break
else:
print("You have other Pokemons that can battle!")
continue
except ValueError as e:
print(e)
print("Please try again...")
elif action == 2:
print('='*30)
print("Change active pokemon")
print('-'*30)
change_pokemon_success = False
while not change_pokemon_success:
try:
print("Select the name of a pokemon in your list:")
print(trainer.get_pokemon_list())
chosen_new_pokemon_name = input('Choose...')
trainer.change_active_pokemon(chosen_new_pokemon_name)
change_pokemon_success = True
except ValueError as e:
print(e)
elif action == 3:
print("Select the item index to use:")
trainer.print_items()
item_selected_flag = False
while not item_selected_flag:
try:
avail_items = list(trainer.items.keys())
item_index = int(input("Choose an item index (1-2): ").strip())
item_selected_flag = True
is_pokeball = trainer.use_item(item_name=avail_items[item_index - 1])
if is_pokeball:
catch_prob = 1 - (cpu_trainer.get_active_pokemon().get_current_hp() / cpu_trainer.get_active_pokemon().baseStats['hp'])
random_value = random.uniform(0, 1)
if random_value < catch_prob:
print(f"You caught {cpu_trainer.get_active_pokemon().name}!")
trainer.add_pokemon(cpu_trainer.get_active_pokemon())
battle_active = False
game_status = 'story'
else:
print(f"{cpu_trainer.get_active_pokemon().name} escaped your pokeball!")
except ValueError:
print("Please enter a number between 1 and 2.")
continue
elif action == 4:
global recommender_sys_avail
if recommender_sys_avail:
try:
for pokemon in trainer.pokemon_list:
win_prob = recommend(player_pokemon=pokemon, opponent_pokemon=cpu_trainer.get_active_pokemon())
print(f"The Oracle predicts {pokemon.name} to have {win_prob:.2f} of chances to win against {cpu_trainer.get_active_pokemon().name}.")
except ValueError as e:
print(e)
elif action == 5:
runaway_prob = 0.6
random_value = random.uniform(0, 1)
if random_value < runaway_prob:
print("You successfully ran away from the battle!")
battle_active = False
game_status = 'story'
else:
print("You could not run away from the battle!")
elif action == 6:
print('='*30)
print("BATTLE INFO")
print('-'*30)
print("Your items:")
trainer.print_items()
print("Your pokemon list info:")
for pokemon in trainer.pokemon_list:
pokemon.print_pokemon_info()
print("-"*30)
print("CPU active pokemon info:")
cpu_trainer.get_active_pokemon().print_pokemon_info()
print('='*30)
else:
print("Invalid action. Please choose again.")
def RandomBattle(trainer,cpu_trainer):
#print(f"You are in battle against {cpu_trainer.name}!")
battle_active = True
active_pokemon = trainer.get_active_pokemon()
cpu_active_pokemon = cpu_trainer.get_active_pokemon()
#print(f"Your active Pokemon is {active_pokemon.name} and the CPU's active Pokemon is {cpu_active_pokemon.name}.")
did_player_won = False
battle_turns_num = 0
player_hp_evolution = []
player_selected_moves = []
player_damage_done = []
cpu_hp_evolution = []
cpu_selected_moves = []
cpu_damage_done = []
while battle_active:
player_move_name = random.choice(active_pokemon.get_moves())
player_selected_moves.append(player_move_name)
#print(f"{active_pokemon.name} selected {player_move_name} to use against {cpu_active_pokemon.name}:\n")
try:
player_damage_done_value = active_pokemon.useMove(player_move_name,cpu_active_pokemon,game_status='new_random_battle')
player_damage_done.append(player_damage_done_value)
player_hp_evolution.append(active_pokemon.get_current_hp())
cpu_hp_evolution.append(cpu_active_pokemon.get_current_hp())
battle_turns_num += 1
#check if the opponent has been defeated
if not cpu_trainer.active_pokemon_can_battle():
#print(f"{cpu_trainer.get_active_pokemon().name} has been defeated! You win!")
did_player_won = True
battle_active = False
break
#if the opponent has not been defeated, then its the CPU turn to play
cpu_active_pokemon_selected_move_name = random.choice(cpu_active_pokemon.get_moves())
#print(f"CPU's {cpu_active_pokemon.name} is using {cpu_active_pokemon_selected_move_name} against your {active_pokemon.name}!")
cpu_selected_moves.append(cpu_active_pokemon_selected_move_name)
cpu_damage_done_value = cpu_active_pokemon.useMove(cpu_active_pokemon_selected_move_name, active_pokemon,game_status='new_random_battle')
cpu_damage_done.append(cpu_damage_done_value)
player_hp_evolution.append(active_pokemon.get_current_hp())
cpu_hp_evolution.append(cpu_active_pokemon.get_current_hp())
battle_turns_num += 1
#update the player pokemon list
trainer.update_pokemon_list(active_pokemon)
#check if the player has been defeated
if not trainer.active_pokemon_can_battle():
#print(f"Your {active_pokemon.name} has been defeated!")
if not trainer.can_battle():
#print("You have no more Pokemons that can battle! You lose!")
did_player_won=False
battle_active = False
break
else:
#print("You have other Pokemons that can battle!")
continue
except ValueError as e:
print(e)
#manage those cases for which the player wins in the first turn and the cpu does not play any turn
if len(player_damage_done) == 0:
player_damage_done = [0]
if len(cpu_damage_done) == 0:
cpu_damage_done = [0]
player_avg_damage_done = np.mean(player_damage_done) #average damage done per turn
cpu_avg_damage_done = np.mean(cpu_damage_done) #average damage done per turn
player_residual_hp_percent = trainer.get_active_pokemon().get_current_hp_percent()
player_history = {'player_hp_evolution':player_hp_evolution,
'player_selected_moves':player_selected_moves,
'player_damage_done':player_damage_done,
'player_avg_damage_done':player_avg_damage_done
}
cpu_history = {'cpu_hp_evolution':cpu_hp_evolution,
'cpu_selected_moves':cpu_selected_moves,
'cpu_damage_done':cpu_damage_done,
'cpu_avg_damage_done':cpu_avg_damage_done
}
turn_history = {'player_history':player_history,
'cpu_history':cpu_history
}
battle_results = {
'player_pokemon':trainer.get_active_pokemon(),
'encountered_pokemon':cpu_trainer.get_active_pokemon(),
'result':did_player_won,
'battle_turns_num':battle_turns_num,
'player_residual_hp_percent':player_residual_hp_percent,
'turn_history':turn_history
}
return battle_results
def build_dataset():
#if the dataset.csv file does not exist, then build, otherwise load it
all_pokemon_types = list(gd.available_types)
player_ActStats_labels = ["player_hp", "player_attack", "player_defense", "player_speed", "player_special"]
player_type_label = ['player_type_' + t for t in all_pokemon_types]
opponent_ActStats_labels = ["opponent_hp", "opponent_attack", "opponent_defense", "opponent_speed", "opponent_special"]
opponent_type_label = ['opponent_type_' + t for t in all_pokemon_types]
#define a padas dataframe to store the dataset
dataset_column_labels = player_ActStats_labels + player_type_label + opponent_ActStats_labels + opponent_type_label + ['battle_result']
dataset = pd.DataFrame(columns=dataset_column_labels)
files_to_analyze = os.listdir('results/')
dataset_row = []
for file_name in files_to_analyze:
pickle_in = open(f"results/{file_name}",'rb')
all_battle_results = pickle.load(pickle_in)
pickle_in.close()
for battle_result in all_battle_results:
player_pokemon_ActStats = list(battle_result['player_pokemon'].ActStats.values())
player_pokemon_type = battle_result['player_pokemon'].types
player_pokemon_type_encoded = [1 if t in player_pokemon_type else 0 for t in all_pokemon_types]
opponent_pokemon = list(battle_result['encountered_pokemon'].ActStats.values())
opponent_pokemon_type = battle_result['encountered_pokemon'].types
opponent_pokemon_type_encoded = [1 if t in opponent_pokemon_type else 0 for t in all_pokemon_types]
battle_result_integer = 1 if battle_result['result'] else 0
dataset_row = player_pokemon_ActStats + player_pokemon_type_encoded + opponent_pokemon + opponent_pokemon_type_encoded + [battle_result_integer]
#append the row to the dataset
dataset.loc[len(dataset)] = dataset_row
#save the dataset to a csv file
dataset.to_csv('dataset.csv', index=False)
return dataset_column_labels
def train_model(dataset_column_labels):
dataset_labels = dataset_column_labels[:-1]
# Load the dataset
dataset = pd.read_csv('dataset.csv')
# Split the dataset into features and target variable
X = dataset.drop('battle_result', axis=1)
y = dataset['battle_result']
# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Create a Random Forest Classifier
model = RandomForestClassifier()
param_dist = {
'n_estimators': randint(50, 500),
'max_depth': randint(1, 20),
}
rand_search = RandomizedSearchCV(model,
param_distributions=param_dist,
n_iter=5, cv=5).fit(X_train, y_train)
# Train the model
best_model = rand_search.best_estimator_
print(f"Best parameters found: {rand_search.best_params_}")
# Make predictions on the test set
y_pred = best_model.predict(X_test)
# Evaluate the model
accuracy = accuracy_score(y_test, y_pred)
print(f"Model Accuracy: {accuracy:.2f}")
print("Classification Report:")
print(classification_report(y_test, y_pred))
print("Confusion Matrix:")
print(confusion_matrix(y_test, y_pred))
# Visualize the first three estimators
for i in range(3):
tree = best_model.estimators_[i]
dot_data = export_graphviz(tree,
feature_names=dataset_labels,
filled = True,
max_depth = 2,
impurity = False,
proportion = True)
graph = graphviz.Source(dot_data)
graph.render(outfile=f"plots/tree_{i}.pdf", format='pdf')
# Save the trained model
joblib.dump(best_model, 'trained_model.joblib')
def MainRandomBattle(starter_choice,Nbattles):
try:
starter_name = starter_choice
trainer = Trainer(name='trainer', starter_name=starter_name)
#print(f"{trainer.name} has chosen {trainer.starter} as their starter Pokemon!")
#print("Adding potions and pokeballs to your inventory...")
trainer.items = {"potions": 10, "pokeball": 10}
#print("Your character is ready!")
#print(f"Welcome {trainer.name}! Your adventure begins now!")
except ValueError as e:
print(e)
print("Something went wrong!")
game_active_flag = True
while game_active_flag:
all_battle_results = []
for i in range(0,Nbattles):
#print("You entered the Random Battle mode")
#print("Battle #",i)
cpu_trainer = Trainer(name='CPU',starter_name=gd.pokemons_df.index[random.randint(0,len(gd.pokemons_df.index)-1)],is_CPU=True)
battle_results = RandomBattle(trainer,cpu_trainer)
all_battle_results.append(battle_results)
heal_flag = 'yes'
if heal_flag == 'yes':
for pokemon in trainer.pokemon_list:
pokemon.curr_hp = pokemon.baseStats['hp']
#print("All your Pokemon have been healed!")
game_active_flag = False
#save all battle results
return all_battle_results
def Main():
global game_status
global game_active_flag
player_created_flag = False
while not player_created_flag:
try:
trainer_name = input("Enter your trainer name: ")
print("Available starter Pokemon: ", gd.available_starter_names)
starter_name = input("Choose your starter Pokemon: ")
trainer = Trainer(name=trainer_name, starter_name=starter_name)
print(f"{trainer.name} has chosen {trainer.starter} as their starter Pokemon!")
print("Adding potions and pokeballs to your inventory...")
trainer.items = {"potions": 10, "pokeball": 10}
print("Your character is ready!")
#trainer.print_trainer_info()
player_created_flag = True
print(f"Welcome {trainer.name}! Your adventure begins now!")
except ValueError as e:
print(e)
print("Please try again...")
continue
while game_active_flag:
if game_status == 'story':
print("Type the number of one of the following actions:")
print("1) Explore ")
print("2) Pokemon Center")
print("3) Pokemon Store")
print("4) Show trainer data")
print("5) NewRandomBattle")
print("6) Exit")
try:
action = int(input("Choose an action (1-6): ").strip())
except ValueError:
print("Invalid input. Please enter a number between 1 and 6.")
continue
if action == 1:
game_status = 'explore'
elif action == 2:
game_status = 'pokemon_center'
elif action == 3:
game_status = 'pokemon_store'
elif action == 4:
print("Showing trainer data:")
trainer.print_trainer_info()
elif action == 5:
confirm=input("Are you sure you want to start a new random battle? This will generate data and train the model. Type 'yes' to continue: ")
if confirm.lower() == 'yes':
print("Starting a new random battle!")
game_status = 'new_random_battle'
else:
print("Cancelled starting a new random battle.")
elif action == 6:
print("Exiting the game. Goodbye!")
game_active_flag = False
else:
print("Invalid action. Please choose again.")
elif game_status == 'explore':
print("You are exploring")
battle_prob = random.uniform(0, 1)
#print(f"Battle probability: {battle_prob:.2f}")
if battle_prob < 0.8:
cpu_trainer = Trainer(name='CPU',starter_name=gd.pokemons_df.index[random.randint(0,len(gd.pokemons_df.index)-1)],is_CPU=True)
print(f"A wild {cpu_trainer.get_active_pokemon().name} appeared!")
#print(cpu_trainer.get_active_pokemon().print_pokemon_info())
game_status = 'battle'
#before entering the battle, we predict the win probability of
#each of the player's pokemon against the opponent's pokemon
try:
win_probs = []
for pokemon in trainer.pokemon_list:
win_prob = recommend(player_pokemon=pokemon, opponent_pokemon=cpu_trainer.get_active_pokemon())
win_probs.append(win_prob)
print(f"The Oracle predicts {pokemon.name} to have {win_prob:.2f} of chances to win.")
#if all the win probabilities are below 0.5, we suggest the player to run away
if all(prob < 0.5 for prob in win_probs):
print("The Oracle suggests to RUN AWAY!")
else:
if len(win_probs) > 1:
#find the pokemon with the highest win probability
best_pokemon_index = win_probs.index(max(win_probs))
best_pokemon = trainer.pokemon_list[best_pokemon_index]
print(f"The Oracle suggests to use {best_pokemon.name}!")
else:
continue
except ValueError as e:
print("HINT: Unlock access to the Oracle by playing NewRandomBattle!")
Battle(trainer,cpu_trainer)
else:
print('-'*30)
print("No wild Pokemon appeared.")
game_status = 'story'
elif game_status == 'pokemon_center':
print("You are at the Pokemon Center. You can heal your Pokemon here.")
heal_flag = input("Type 'yes' to heal your Pokemons or any other key to exit: ").strip().lower()
if heal_flag == 'yes':
for pokemon in trainer.pokemon_list:
pokemon.curr_hp = pokemon.baseStats['hp']
for move in pokemon.moves_dict.keys():
pokemon.moves_dict[move]['pp'] = copy.deepcopy(gd.available_moves_df.loc[move]['pp'])
print("All your Pokemon have been healed!")
game_status = 'story'
else:
print("You exited the Pokemon Center.")
game_status = 'story'
# Add Pokemon Center logic here
elif game_status == 'pokemon_store':
print("You are in the Pokemon Store. You can buy items here.")
restore_items_flag = input("Type 'yes' to restore your items: ").strip().lower()
if restore_items_flag == 'yes':
trainer.items = {"potions": 10, "pokeball": 10}
print("Your items have been restored!")
game_status = 'story'
else:
print("You exited the Pokemon Store.")
game_status = 'story'
elif game_status == 'new_random_battle':
Ngames = 1000
Nbattles = 500
print("Generating data...")
for i in range(Ngames):
starter_choice = gd.pokemons_df.index[random.randint(0,len(gd.pokemons_df.index)-1)]
#print(f"Generating data for {starter_choice}, game {i}...")
results = MainRandomBattle(starter_choice=starter_choice, Nbattles=Nbattles)
pickle_out = open(f"results/{starter_choice}_game_{i}_{Nbattles}_battles.pickle",'wb')
pickle.dump(results,pickle_out)
pickle_out.close()
print("Generating dataset")
dataset_column_labels = build_dataset()
print("Training model")
try:
train_model(dataset_column_labels)
print("Model has been trained! Ending NewRandomBattle")
global recommender_sys_avail
recommender_sys_avail = True
except Exception as e:
print(f"An error occurred during model training: {e}")
print("Ending NewRandomBattle without training the model.")
game_status = 'story'
else:
print("Unknown game status. Try again.")
if __name__ == "__main__":
if not os.path.exists('results'):
os.makedirs('results')
Main()
-33
View File
@@ -1,33 +0,0 @@
digraph Tree {
node [shape=box, style="filled", color="black", fontname="helvetica"] ;
edge [fontname="helvetica"] ;
0 [label="player_defense <= 14.5\nsamples = 100.0%\nvalue = [0.332, 0.668]", fillcolor="#9ccef2"] ;
1 [label="opponent_speed <= 16.5\nsamples = 40.8%\nvalue = [0.579, 0.421]", fillcolor="#f8ddc9"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
2 [label="player_hp <= 13.0\nsamples = 20.2%\nvalue = [0.321, 0.679]", fillcolor="#97cbf1"] ;
1 -> 2 ;
3 [label="(...)", fillcolor="#C0C0C0"] ;
2 -> 3 ;
6 [label="(...)", fillcolor="#C0C0C0"] ;
2 -> 6 ;
29 [label="opponent_hp <= 37.5\nsamples = 20.6%\nvalue = [0.873, 0.127]", fillcolor="#e99356"] ;
1 -> 29 ;
30 [label="(...)", fillcolor="#C0C0C0"] ;
29 -> 30 ;
39 [label="(...)", fillcolor="#C0C0C0"] ;
29 -> 39 ;
40 [label="opponent_speed <= 36.5\nsamples = 59.2%\nvalue = [0.145, 0.855]", fillcolor="#5baee9"] ;
0 -> 40 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
41 [label="player_attack <= 14.0\nsamples = 54.3%\nvalue = [0.102, 0.898]", fillcolor="#50a8e8"] ;
40 -> 41 ;
42 [label="(...)", fillcolor="#C0C0C0"] ;
41 -> 42 ;
43 [label="(...)", fillcolor="#C0C0C0"] ;
41 -> 43 ;
80 [label="player_special <= 30.0\nsamples = 4.9%\nvalue = [0.714, 0.286]", fillcolor="#efb388"] ;
40 -> 80 ;
81 [label="(...)", fillcolor="#C0C0C0"] ;
80 -> 81 ;
88 [label="(...)", fillcolor="#C0C0C0"] ;
80 -> 88 ;
}
Binary file not shown.
-33
View File
@@ -1,33 +0,0 @@
digraph Tree {
node [shape=box, style="filled", color="black", fontname="helvetica"] ;
edge [fontname="helvetica"] ;
0 [label="player_hp <= 32.5\nsamples = 100.0%\nvalue = [0.327, 0.673]", fillcolor="#99cdf2"] ;
1 [label="player_type_psychic <= 0.5\nsamples = 47.3%\nvalue = [0.503, 0.497]", fillcolor="#fffefd"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
2 [label="player_special <= 6.5\nsamples = 45.0%\nvalue = [0.479, 0.521]", fillcolor="#eff7fd"] ;
1 -> 2 ;
3 [label="(...)", fillcolor="#C0C0C0"] ;
2 -> 3 ;
12 [label="(...)", fillcolor="#C0C0C0"] ;
2 -> 12 ;
47 [label="opponent_attack <= 17.5\nsamples = 2.3%\nvalue = [0.9, 0.1]", fillcolor="#e88f4f"] ;
1 -> 47 ;
48 [label="(...)", fillcolor="#C0C0C0"] ;
47 -> 48 ;
49 [label="(...)", fillcolor="#C0C0C0"] ;
47 -> 49 ;
50 [label="opponent_hp <= 40.5\nsamples = 52.7%\nvalue = [0.156, 0.844]", fillcolor="#5eafea"] ;
0 -> 50 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
51 [label="player_defense <= 17.5\nsamples = 38.6%\nvalue = [0.075, 0.925]", fillcolor="#49a5e7"] ;
50 -> 51 ;
52 [label="(...)", fillcolor="#C0C0C0"] ;
51 -> 52 ;
59 [label="(...)", fillcolor="#C0C0C0"] ;
51 -> 59 ;
78 [label="player_attack <= 26.5\nsamples = 14.1%\nvalue = [0.391, 0.609]", fillcolor="#b8dcf6"] ;
50 -> 78 ;
79 [label="(...)", fillcolor="#C0C0C0"] ;
78 -> 79 ;
98 [label="(...)", fillcolor="#C0C0C0"] ;
78 -> 98 ;
}
Binary file not shown.
-21
View File
@@ -1,21 +0,0 @@
digraph Tree {
node [shape=box, style="filled", color="black", fontname="helvetica"] ;
edge [fontname="helvetica"] ;
0 [label="opponent_type_ghost <= 0.5\nsamples = 100.0%\nvalue = [0.361, 0.639]", fillcolor="#a9d4f4"] ;
1 [label="opponent_defense <= 28.5\nsamples = 98.7%\nvalue = [0.352, 0.648]", fillcolor="#a4d2f3"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
2 [label="player_type_bug <= 0.5\nsamples = 80.4%\nvalue = [0.254, 0.746]", fillcolor="#7cbeee"] ;
1 -> 2 ;
3 [label="(...)", fillcolor="#C0C0C0"] ;
2 -> 3 ;
58 [label="(...)", fillcolor="#C0C0C0"] ;
2 -> 58 ;
65 [label="opponent_type_dragon <= 0.5\nsamples = 18.3%\nvalue = [0.794, 0.206]", fillcolor="#eca26c"] ;
1 -> 65 ;
66 [label="(...)", fillcolor="#C0C0C0"] ;
65 -> 66 ;
83 [label="(...)", fillcolor="#C0C0C0"] ;
65 -> 83 ;
84 [label="samples = 1.3%\nvalue = [1.0, 0.0]", fillcolor="#e58139"] ;
0 -> 84 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
}
Binary file not shown.
+6
View File
@@ -0,0 +1,6 @@
numpy>=1.24.0
pandas>=2.0.0
scikit-learn>=1.3.0
scipy>=1.10.0
joblib>=1.3.0
graphviz>=0.20.0