From 86d18ffe43b435fad49e9ee30d4c73706042d46f Mon Sep 17 00:00:00 2001 From: ckjolhede Date: Wed, 19 Jun 2024 01:35:36 -0600 Subject: [PATCH] added space seeds, add player, home, wincond working --- Pipfile | 1 + lib/cli.py | 162 +++++++++++++------ lib/debug.py | 1 - lib/models/__init__.py | 2 +- lib/models/game.py | 39 ++--- lib/models/game_space.py | 63 ++++++-- lib/models/helper.py | 8 +- lib/models/player.py | 36 ++--- lib/models/space.py | 38 ++--- lib/seeds.py | 50 ++++++ wireframe.drawio | 328 +++++++++++++++++++-------------------- 11 files changed, 428 insertions(+), 300 deletions(-) create mode 100644 lib/seeds.py diff --git a/Pipfile b/Pipfile index 648cc4d..0ebe435 100644 --- a/Pipfile +++ b/Pipfile @@ -9,6 +9,7 @@ faker = "*" pytest = "7.1.3" rich = "13.7.1" pick = "2.3.2" +sqlite3 = "*" [dev-packages] diff --git a/lib/cli.py b/lib/cli.py index 8a0cce7..d005c3c 100644 --- a/lib/cli.py +++ b/lib/cli.py @@ -1,41 +1,45 @@ # lib/cli.py -import sqlite3 -import rich -import pick +import time +from sqlite3 import * import os import random from models.player import Player from models.game_space import Game_space from models.game import Game -from models.helper import Helper from models.__init__ import CONN, CURSOR -player_house_positions = [3, 9, 15, 21] -player_home_position = random.sample(player_house_positions, k=4) - - +player_house_positions = [4, 10, 16, 22] +player_home_position = random.sample(player_house_positions, k=4) +os.system('clear') def main_menu(): + print("WELCOME TO MONOPOLYTHON!") print("Please select an option:") print("1 Start New Game") print("2 Exit Game") -def exit_program(): - print("Goodbye!") - exit() def main(): while True: main_menu() - choice = input("What would you like to do?\n Enter the number of your choice") + print("Enter the number of your choice:") + choice = input("") if choice == "1": game = Game.create() + os.system('clear') new_game_setup(game) elif choice == "2": exit_program() else: - print("Invalid choice") + os.system('clear') + print("Invalid choice\n") + time.sleep(2.5) + main() +def exit_program(): + os.system('clear') + print("Goodbye!") + exit() def new_game_setup_menu(): print("New Game Menu:") @@ -45,66 +49,108 @@ def new_game_setup_menu(): print("4 Quit Game") def new_game_setup(game): - os.system('clear') new_game_setup_menu() choice = input() if choice == "1": + os.system('clear') player_setup(game) elif choice == "2": - print("Enter net worth needed to win") - print("Must be between 5000 and 20000") - game.win_condition == input(10000) - game.update() + os.system('clear') + set_win_condition(game) elif choice == "3": + os.system('clear') start_game(game) elif choice == "4": - exit_program_prestart(game) + exit_program() else: + os.system('clear') print("That is not a valid input.") - print("Enter the number next to your choice") + print("Enter the number next to your choice.\n") + time.sleep(2.5) + new_game_setup(game) def player_setup_menu(): print("Players") print("1 Add Player") print("2 See All Players") - print("3 Remove Player") + print("3 Remove Player") #add home position back into list print("4 Edit Player") print("5 Return to Game Setup") print("6 Quit Game") def player_setup(game): - os.system('clear') + players = Player.get_all_players_by_gameid(game.id) player_setup_menu() print("What would you like to do?") choice = input() if choice == "1": + os.system('clear') enter_new_player(game) elif choice == "2": - get_all_players_by_game(game) + os.system('clear') + ipdb.set_trace() + for player in players: + print(player.name) + player_setup(game) elif choice == "3": - remove_player(game) + os.system('clear') + remove_player(game, players) + player_setup(game) elif choice == "4": + os.system('clear') edit_player(game) elif choice == "5": + os.system('clear') new_game_setup(game) + elif choice == "6": + players = Player.get_all_players_by_gameid(game.id) + homes = Game_space.get_all_homes_by_gameid(game.id) + os.system('clear') + exit_program_prestart(game, players, homes) else: + os.system('clear') print("Invalid choice, please select again") + time.sleep(2.5) + player_setup(game) -def enter_new_player(game): +def remove_player(game, players): + os.system('clear') + for player in players: + print(f'{player.index} - {player.name}') + print("Enter number next to the player you would like to remove") + value = input() + if value >= len(players): os.system('clear') + print("Invalid entry") + time.sleep(2.5) + remove_player(game, players) + remove_player_home(game, player[value]) + print(f"{player[value].name}'s home has been deleted") + Player.delete(player[value]) + print(f'{player[value].name} has been deleted') + + +def remove_player_home(player, game): + home = Game_space.get_game_space_by_playerid_gameid(game, player) + Game_space.delete(home) + + + +def enter_new_player(game): print("Enter Your Player's Name (required)") print("Name must be less than 16 characters") - value = input() - name = value - #print(f'my name is {name}') + name = input() if not 0 < len(name) < 16: + os.system('clear') print("Name is invalid") + enter_new_player(game) else: + os.system('clear') + create_player_type(game, name) - - print("\n, \n, \n, \n, \n") - print("Enter which type of player you would like to be") +def create_player_type(game, name): + print(f"{name}, which type of player you would like to be?") print('1 REALTOR = The REALTOR receives 10 percent of all property purchases') print('2 COP = The COP receives $50 from any player occupying the same space') print('3 BUILDER = The BUILDER recieves a 20 percent discount on home purchases') @@ -119,37 +165,63 @@ def enter_new_player(game): elif value == "4": player_type = "PILOT" else: - print("You must choose from the 4 player types") + os.system('clear') + print("You must choose from the 4 player types\n") + time.sleep(2.5) + create_player_type(game,name) + player = Player.create(name, player_type, 0, 1800, 1800, game.id) - position = player_home_position.pop + print(f"Good Luck {player.name}!") + time.sleep(2) + position = player_home_position.pop() + os.system('clear') enter_player_home(position, player, game) def enter_player_home(position, player, game): - print("\n, \n, \n, \n, \n") print("Each player begins with a home property") - print("What is your home's street name?") + print(f"{player.name} enter a name for your home's street?") street_name = input() if len(street_name) == 0: + os.system('clear') print("Street cannot be left blank") - - Game_space(game.id, player.id, street_name, 0, 100, position, None, 0, False) - player_setup(game) + time.sleep(2.5) + enter_player_home(position, player, game) + else: + assign_game_space(game.id, player.id, position, street_name, 0, 100, position, None, 0, 0, game, player) + +def assign_game_space(game_id, player_id, space_id, street_name, price, rent, position, neighborhood, houses, monopoly, game, player): + Game_space.create(game_id, player_id, space_id, street_name, price, rent, position, neighborhood, houses, monopoly) + print("\n \n CONGRATULATIONS! You now own your first property.") + print(f"You can find your home on the {position}th position on the board") + time.sleep(2.5) + os.system('clear') + player_setup(game) +def set_win_condition(game): + print("Enter net worth needed to win") + print("Must be between 5000 and 20000") + win_condition = input() + if not 5000 <= int(win_condition) <= 20000: + print("Invalid entry") + time.sleep(2.5) + set_win_condition(game) + else: + update_game_win_cond(game, win_condition) +def update_game_win_cond(game, win_condition): + game.win_condition = int(win_condition) + game.update() + print(f'Get to ${win_condition} net worth and you will win!') + time.sleep(2.5) + os.system('clear') + new_game_setup(game) - -def get_all_players_by_game(cls, game): - sql = """ SELECT * FROM players WHERE game_id = game.id """ - def start_game(game): pass def exit_program_prestart(game): pass -def remove_player(game): - pass - def edit_player(game): pass diff --git a/lib/debug.py b/lib/debug.py index e080e53..47aa6c0 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -2,7 +2,6 @@ # lib/debug.py from models.__init__ import CONN, CURSOR -import ipdb import os diff --git a/lib/models/__init__.py b/lib/models/__init__.py index 58043cf..6f6dfa7 100644 --- a/lib/models/__init__.py +++ b/lib/models/__init__.py @@ -1,4 +1,4 @@ import sqlite3 -CONN = sqlite3.connect('../monopolython.db') +CONN = sqlite3.connect('./monopolython.db') CURSOR = CONN.cursor() diff --git a/lib/models/game.py b/lib/models/game.py index fe5985a..a506d69 100644 --- a/lib/models/game.py +++ b/lib/models/game.py @@ -1,6 +1,5 @@ -import sqlite3 + from sqlite3 import * -from models.helper import Helper from models.__init__ import CONN, CURSOR class Game(): @@ -12,14 +11,13 @@ def create_table(cls): with CONN: CURSOR.execute( """CREATE TABLE IF NOT EXISTS games ( + id INTEGER PRIMARY KEY, win_condition INTEGER, curr_player TEXT, next_player TEXT);""") except IntegrityError as e: return e - - @classmethod def drop_table(cls): """ Drop the table that persists Game instances """ @@ -30,18 +28,18 @@ def drop_table(cls): CONN.commit() @classmethod - def create(cls, win_condition = 10000): + def create(cls, win_condition = 10000, curr_player = None, next_player = None): """ Initialize a new Game instance and save the object to the database """ - game = cls(win_condition) + game = cls() game.save() return game - def __init__(self, win_condition, id = None): + def __init__(self, win_condition = 10000, curr_player = None, next_player = None, id = None): self.win_condition = win_condition - self.players = [] - self.curr_player = "" - self.next_player = "" + self.curr_player = curr_player + self.next_player = next_player self.id = id + self.players = [] def __repr__(self): return f"" @@ -59,7 +57,7 @@ def update(self): sql = """ UPDATE games SET win_condition = ?, curr_player = ?, next_player = ? - WHERE id = ? + WHERE id = ?; """ CURSOR.execute(sql, (self.win_condition, self.curr_player, self.next_player, self.id)) CONN.commit() @@ -68,18 +66,9 @@ def delete(self): sql = """ DELETE FROM games WHERE id = ? """ CURSOR.execute(sql, (self.id,)) CONN.commit() + + -Game.drop_table() -Game.create_table() -#@property - #def win_condition(self): - # return self._win_condtion - - #@win_condition.setter - #def win_condition(self, win_condition): - # if not isinstance(win_condition, int): - # raise TypeError("Win Condition must be an integer") - # elif 5000 < self.win_condition < 20000: - # raise ValueError("Dollar amount must be between 5000 and 20000") - # else: - # self._win_condition = win_condition \ No newline at end of file + + + diff --git a/lib/models/game_space.py b/lib/models/game_space.py index 9fe2bb7..92c2800 100644 --- a/lib/models/game_space.py +++ b/lib/models/game_space.py @@ -1,6 +1,6 @@ -import sqlite3 from sqlite3 import * from models.__init__ import CONN, CURSOR +from models.space import Space class Game_space: @@ -9,17 +9,21 @@ def create_table(cls): try: with CONN: CURSOR.execute( - """CREATE TABLE IN NOT EXISTS game_spaces ( + """CREATE TABLE IF NOT EXISTS game_spaces ( id INTEGER PRIMARY KEY, - game_id INTEGER FOREIGN KEY, - player_id INTEGER FOREIGN KEY, + game_id INTEGER, + player_id INTEGER, + space_id INTEGER, street_name TEXT, + position INTEGER, price INTEGER, rent INTEGER, - position INTEGER, neighborhood TEXT, - houses INTEGER - monopoly BOOLEAN);""") + houses INTEGER, + monopoly INTEGER, + FOREIGN KEY (game_id) REFERENCES games(id), + FOREIGN KEY (player_id) REFERENCES players(id), + FOREIGN KEY (space_id) REFERENCES spaces(id));""") except IntegrityError as e: return e @@ -32,16 +36,17 @@ def drop_table(cls): CONN.commit() @classmethod - def create(cls, game_id, player_id, street_name, price, rent, position, neighborhood, houses, monopoly): - game_space = cls(game_id, player_id, street_name, price, rent, position, neighborhood, houses, monopoly) + def create(cls, game_id, player_id, space_id, street_name, position, price, rent, neighborhood, houses, monopoly): + game_space = cls(game_id, player_id, space_id, street_name, position, price, rent, neighborhood, houses, monopoly) game_space.save() return game_space - def __init__(self, game_id, position, id = None): + def __init__(self, game_id, player_id, space_id, street_name, position, price = 0, rent = 0, neighborhood = None, houses = 0, monopoly = False, id = None): space = Space.find_by_space_position(position) self.game_id = game_id - self.player_id = Game.curr_player.id - self.street_name = space.street_name + self.player_id = player_id + self.space_id = space_id + self.street_name = street_name self.price = space.price self.rent = space.rent self.position = position @@ -55,10 +60,10 @@ def __repr__(self): def save(self): sql = """ - INSERT INTO game_spaces (game_id, player_id, street_name, price, rent, position, neighborhood, houses, monopoly) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?); + INSERT INTO game_spaces (game_id, player_id, space_id, street_name, position, price, rent, neighborhood, houses, monopoly) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?); """ - CURSOR.execute(sql, (self.game_id, self.player_id, self.street_name, self.price, self.rent, self.position, self.neighborhood, self.houses, self.monopoly)) + CURSOR.execute(sql, (self.game_id, self.player_id, self.space_id, self.street_name, self.position, self.price, self.rent, self.neighborhood, self.houses, self.monopoly)) CONN.commit() self.id = CURSOR.lastrowid @@ -75,4 +80,30 @@ def delete(self): sql = """ DELETE FROM game_spaces WHERE id = ?;""" CURSOR.execute(self, (self.id,)) CONN.commit() - \ No newline at end of file + + @classmethod + def get_all_homes_by_gameid(cls, gameid): + sql = """ SELECT * FROM game_spaces WHERE game_id = ?;""" + rows = CURSOR.execute(sql, (gameid, )).fetchall + return [cls.instance_from_db(row) for row in rows] + + @classmethod + def instance_from_db(cls, row): + game_space = cls( + id = row[0], + game_id = row[1], + player_id = row[2], + space_id = row[3], + street_name = row[4], + position = [5], + price = [6], + rent = [7], + neighborhood = [8], + houses = [9], + monopoly = [10]) + + @classmethod + def get_game_space_by_playerid_gameid(cls, game, player): + sql = """ SELECT * FROM game_spaces WHERE (game_id = ? AND player_id = ?) LIMIT 1;""" + row = CURSOR.execute(sql, (game.id, player.id)).fetchone() + return cls.instance_from_db(row) if row else None \ No newline at end of file diff --git a/lib/models/helper.py b/lib/models/helper.py index 8b6f908..f07f805 100644 --- a/lib/models/helper.py +++ b/lib/models/helper.py @@ -3,8 +3,6 @@ import sqlite3 import random - - # Larger example that inserts many records at a time #purchases = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00), # ('2006-04-05', 'BUY', 'MSFT', 1000, 72.00), @@ -20,8 +18,6 @@ #winners: list[str] = sample(names, k=(#number of selections from list you want) <-- output unique list #winners: list[str] = choices(names, k=(#number of selections from list you want) <-- may have repeat selections - -class Helper(): - def blank(): - pass \ No newline at end of file +def blank(): + pass \ No newline at end of file diff --git a/lib/models/player.py b/lib/models/player.py index bddcc07..1a0cbd1 100644 --- a/lib/models/player.py +++ b/lib/models/player.py @@ -1,6 +1,6 @@ -import sqlite3 -from sqlite3 import IntegrityError +from sqlite3 import * from models.__init__ import CONN, CURSOR +from models.game_space import Game_space class Player(): @@ -16,7 +16,8 @@ def create_table(cls): curr_pos INTEGER, money INTEGER, net_worth INTEGER, - game_id INTEGER FOREIGN KEY);""") + game_id INTEGER, + FOREIGN KEY (game_id) REFERENCES games(id));""") except IntegrityError as e: return e @@ -45,10 +46,6 @@ def instance_from_db(cls, row): net_worth = row[5], game_id = row[6]) - @classmethod - def get_all_players(cls): - pass - def __init__(self, name, player_type, curr_pos = 0, money = 1800, net_worth = 1800, game_id = None, id = None): self.name = name @@ -60,12 +57,12 @@ def __init__(self, name, player_type, curr_pos = 0, money = 1800, net_worth = 18 self.id = id def __repr__(self): - return f"<{self.name}: Player Type = {self.player_type}: Money = {self.money}: Net Worth = {self.net_worth}: Postion = {Game_space.find_by_position(self.curr_pos).street_name}>" + return f"<{self.name}: ID# = {self.id}\nPlayer Type = {self.player_type}\nMoney = {self.money}\nNet Worth = {self.net_worth}\n Postion = {self.curr_pos}>" def save(self): sql = """ INSERT INTO players (name, player_type, curr_pos, money, net_worth, game_id) - VALUES (?, ?, ?, ?, ?, ?}; + VALUES (?, ?, ?, ?, ?, ?); """ CURSOR.execute(sql, (self.name, self.player_type, self.curr_pos, self.money, self.net_worth, self.game_id)) CONN.commit() @@ -85,17 +82,10 @@ def delete(self): CURSOR.execute(sql, (self.id,)) CONN.commit() - - - #@property - #def name(self): - # return self._name - - #@name.setter - #def name(self, name): - # if not isinstance(name, str): - # raise TypeError("Player name must be a string") - # elif 0 < len(name) < 16: - # raise ValueError("Player name must be less than 16 characters") - # else: - # self._name = name \ No newline at end of file + @classmethod + def get_all_players_by_gameid(cls, gameid): + sql = """ SELECT * FROM players WHERE game_id = ?; """ + rows = CURSOR.execute(sql, (gameid,)).fetchall() + players = [cls.instance_from_db(row) for row in rows] + [print(player) for player in players] + return players \ No newline at end of file diff --git a/lib/models/space.py b/lib/models/space.py index ac0c373..986486f 100644 --- a/lib/models/space.py +++ b/lib/models/space.py @@ -1,20 +1,18 @@ -import sqlite3 - -from models.helper import Helper +from sqlite3 import * from models.__init__ import CONN, CURSOR - class Space(): @classmethod def create_table(cls): - sql = """(CREATE TABLE IF NOT EXISTS spaces - (id = INTEGER PRIMARY KEY, + sql = """CREATE TABLE IF NOT EXISTS spaces + (id INTEGER PRIMARY KEY, street_name TEXT, price INTEGER, rent INTEGER, - position = INTEGER, - neighborhood = TEXT);""" + position INTEGER, + neighborhood TEXT, + owned INTEGER);""" CURSOR.execute(sql) CONN.commit() @@ -25,14 +23,14 @@ def drop_table(cls): CONN.commit() @classmethod - def create(cls, street_name, price, rent, position, neighborhood): - space = cls(street_name, price, rent, position, neighborhood) + def create(cls, street_name, price, rent, position, neighborhood, owned): + space = cls(street_name, price, rent, position, neighborhood, owned) space.save() return space @classmethod def find_by_space_position(cls, position): - sql = """ SELECT * FROM space WHERE position = ? LIMIT 1;""" + sql = """ SELECT * FROM spaces WHERE position = ? LIMIT 1;""" row = CURSOR.execute(sql, (position,)).fetchone() return cls.instance_from_db(row) if row else None @@ -44,28 +42,30 @@ def instance_from_db(cls, row): price=row[2], rent=row[3], position=row[4], - neighborhood=row[5]) + neighborhood=row[5], + owned=[6]) - def __init__(self, street_name, price, rent, position, neighborhood, id = None): + def __init__(self, street_name, price, rent, position, neighborhood, owned = False, id = None): self.street_name = street_name self.price = price self.rent = rent self.position = position self.neighborhood = neighborhood + self.owned = owned self.id = id def save(self): - sql = """INSERT INTO spaces (street_name, price, rent, position, neighborhood) - VALUES (?, ?, ?, ?); """ - CURSOR.execute(sql (self.street_name, self.price, self.rent, self.position, self.neighborhood)) + sql = """INSERT INTO spaces (street_name, price, rent, position, neighborhood, owned) + VALUES (?, ?, ?, ?, ?, ?); """ + CURSOR.execute(sql, (self.street_name, self.price, self.rent, self.position, self.neighborhood, self.owned)) CONN.commit() self.id = CURSOR.lastrowid def update(self): sql = """UPDATE spaces - SET street_name = ?, price = ?, rent = ?, position = ?, neighborhood = ? + SET street_name = ?, price = ?, rent = ?, position = ?, neighborhood = ?, owned = ? WHERE id = ?;""" - CURSOR.execute(sql, (self.street_name, self.price, self.rent, self.position, self.neighborhood)) + CURSOR.execute(sql, (self.street_name, self.price, self.rent, self.position, self.neighborhood, self.owned, self.id)) CONN.commit() def delete(self): @@ -74,4 +74,4 @@ def delete(self): CONN.commit() def __repr__(self): - return f"<{self.street_name}: Price = {self.price}: Rent = {self.rent}: Neighborhood = {self.neighborhood}>" \ No newline at end of file + return f"<{self.street_name}: Price = {self.price}: Rent = {self.rent}: Neighborhood = {self.neighborhood}: Owned = {self.owned}>" \ No newline at end of file diff --git a/lib/seeds.py b/lib/seeds.py new file mode 100644 index 0000000..84b335b --- /dev/null +++ b/lib/seeds.py @@ -0,0 +1,50 @@ +from models.__init__ import CONN, CURSOR +from models.game import Game +from models.space import Space +from models.player import Player +from models.game_space import Game_space +from sqlite3 import * + +Game.drop_table() +Space.drop_table() +Game_space.drop_table() +Player.drop_table() +print("Tables have been dropped") +#ipdb.set_trace() +Game_space.create_table() +Game.create_table() +Space.create_table() +Player.create_table() +print("Tables have been created") + +def seed_spaces(): + spaces = [('GO', 0, 0, 1, "Game", 1), + ('unowned', 60, 30, 2, "Pink", 0), + ('unowned', 80, 40, 3, "Pink", 0), + ('unowned', 0, 100, 4, "Player", 0), + ('unowned', 100, 50, 5, "Lt Blue", 0), + ('unowned', 120, 60, 6, "Lt Blue", 0), + ('CASINO', 0, 0, 0, "Game", 1), + ('unowned', 140, 70, 8, "Purple", 0), + ('unowned', 160, 80, 9, "Purple", 0), + ('unowned', 0, 100, 10, "Player", 0), + ('unowned', 180, 90, 11, "Orange", 0), + ('unowned', 200, 100, 12, "Orange", 0), + ("Free Spasce", 0, 0, 13, "Game", 1), + ("unowned", 220, 110, 14, "Red", 0), + ("unowned", 240, 120, 15, "Red", 0), + ("unowned", 0, 100, 16, "Player", 0), + ('unowned', 260, 130, 17, "Yellow", 0), + ("unowned", 280, 140, 18, "Yellow", 0), + ("Pay HOA", 0, 200, 19, "Game", 1), + ("unowned", 300, 150, 20, "Green", 0), + ("unowned", 320, 160, 21, "Green", 0), + ("unowned", 0, 100, 22, "Player", 0), + ("unowned", 360, 130, 23, "Blue", 0), + ("unowned", 400, 200, 24, "Blue", 0)] + for space in spaces: + Space.create(*space) + print("Spaces have successfully seeded") +if __name__ == "__main__": + + seed_spaces() \ No newline at end of file diff --git a/wireframe.drawio b/wireframe.drawio index 3fd9446..391166e 100644 --- a/wireframe.drawio +++ b/wireframe.drawio @@ -1,10 +1,10 @@ - + - + @@ -78,7 +78,7 @@ - + @@ -116,115 +116,115 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -242,183 +242,183 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -430,25 +430,25 @@ - + - + - + - + - + - + - + @@ -476,37 +476,37 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -514,7 +514,7 @@ - + @@ -522,10 +522,10 @@ - + - + @@ -535,13 +535,13 @@ - + - + - + @@ -552,10 +552,10 @@ - + - + @@ -563,7 +563,7 @@ - + @@ -573,7 +573,7 @@ - + @@ -582,10 +582,10 @@ - + - + @@ -595,7 +595,7 @@ - + @@ -603,19 +603,19 @@ - + - + - + - + @@ -625,13 +625,13 @@ - + - + - + @@ -640,24 +640,24 @@ - + - + - + - + - + - + @@ -665,7 +665,7 @@ - + @@ -674,13 +674,13 @@ - + - + - + @@ -689,7 +689,7 @@ - + @@ -698,7 +698,7 @@ - + @@ -711,36 +711,36 @@ - + - + - + - + - + - + - + - + - + - + @@ -749,25 +749,25 @@ - + - + - + - + - + - + - +