diff --git a/_Core/managers/AuthManager.gd b/_Core/managers/AuthManager.gd index 2f54ddb..9f58e0f 100644 --- a/_Core/managers/AuthManager.gd +++ b/_Core/managers/AuthManager.gd @@ -29,7 +29,7 @@ extends RefCounted # ============ 信号定义 ============ # 登录成功信号 -signal login_success(username: String) +signal login_success(username: String, token: String) # 登录失败信号 signal login_failed(message: String) @@ -80,6 +80,9 @@ var current_email: String = "" # 网络请求管理 var active_request_ids: Array = [] +# 当前登录用户ID (静态变量,全局访问) +static var current_user_id: String = "" + # ============ 生命周期方法 ============ # 初始化管理器 @@ -431,12 +434,20 @@ func _on_login_response(success: bool, data: Dictionary, error_info: Dictionary) if result.success: var username = "" - if data.has("data") and data.data.has("user") and data.data.user.has("username"): - username = data.data.user.username + if data.has("data") and data.data.has("user"): + var user_data = data.data.user + if user_data.has("username"): + username = user_data.username + if user_data.has("id"): + current_user_id = user_data.id + print("AuthManager: Current User ID set to ", current_user_id) # 延迟发送登录成功信号 await Engine.get_main_loop().create_timer(1.0).timeout - login_success.emit(username) + var token = "" + if data.has("data") and data.data.has("access_token"): + token = data.data.access_token + login_success.emit(username, token) else: login_failed.emit(result.message) @@ -451,11 +462,16 @@ func _on_verification_login_response(success: bool, data: Dictionary, error_info if result.success: var username = "" - if data.has("data") and data.data.has("user") and data.data.user.has("username"): - username = data.data.user.username + if data.has("data") and data.data.has("user"): + var user_data = data.data.user + if user_data.has("username"): + username = user_data.username + if user_data.has("id"): + current_user_id = user_data.id + print("AuthManager: Current User ID set to ", current_user_id) await Engine.get_main_loop().create_timer(1.0).timeout - login_success.emit(username) + login_success.emit(username, data.get("access_token", "")) else: login_failed.emit(result.message) diff --git a/_Core/managers/NetworkManager.gd b/_Core/managers/NetworkManager.gd index 3e73627..6e0b04d 100644 --- a/_Core/managers/NetworkManager.gd +++ b/_Core/managers/NetworkManager.gd @@ -41,8 +41,13 @@ signal request_failed(request_id: String, error_type: String, message: String) # ============ 常量定义 ============ # API基础URL - 所有请求的根地址 +# [Remote] 正式环境地址 (实际正式项目用此地址) +# [Remote] 正式环境地址 (实际正式项目用此地址) const API_BASE_URL = "https://whaletownend.xinghangee.icu" +# [Local] 本地调试地址 (本地调试用此地址) +# const API_BASE_URL = "http://localhost:3000" + # 默认请求超时时间(秒) const DEFAULT_TIMEOUT = 30.0 diff --git a/_Core/managers/SceneManager.gd b/_Core/managers/SceneManager.gd index 74980e0..17480ad 100644 --- a/_Core/managers/SceneManager.gd +++ b/_Core/managers/SceneManager.gd @@ -37,6 +37,7 @@ signal scene_change_started(scene_name: String) var current_scene_name: String = "" # 当前场景名称 var is_changing_scene: bool = false # 是否正在切换场景 var _next_scene_position: Variant = null # 下一个场景的初始位置 (Vector2 or null) +var _next_spawn_name: String = "" # 下一个场景的出生点名称 (String) # 场景路径映射表 # 将场景名称映射到实际的文件路径 @@ -109,15 +110,18 @@ func change_scene(scene_name: String, use_transition: bool = true): if use_transition: await show_transition() + # 更新场景名称(在切换之前设置,确保新场景的 _ready 能获取正确的名称) + current_scene_name = scene_name + # 执行场景切换 var error = get_tree().change_scene_to_file(scene_path) if error != OK: print("场景切换失败: ", error) + current_scene_name = "" # 恢复为空 is_changing_scene = false return false # 更新状态 - current_scene_name = scene_name is_changing_scene = false scene_changed.emit(scene_name) @@ -147,6 +151,16 @@ func get_next_scene_position() -> Variant: _next_scene_position = null return pos +# 设置下一个场景的出生点名称 +func set_next_spawn_name(spawn_name: String) -> void: + _next_spawn_name = spawn_name + +# 获取并清除下一个场景的出生点名称 +func get_next_spawn_name() -> String: + var name = _next_spawn_name + _next_spawn_name = "" + return name + # ============ 场景注册方法 ============ diff --git a/_Core/managers/WebSocketManager.gd b/_Core/managers/WebSocketManager.gd new file mode 100644 index 0000000..4b57ce4 --- /dev/null +++ b/_Core/managers/WebSocketManager.gd @@ -0,0 +1,172 @@ +extends Node + +# ============================================================================ +# WebSocketManager.gd - WebSocket连接管理器 +# ============================================================================ +# 负责与后端 Native WebSocket 服务进行实时通信 +# +# 协议文档: new_docs/game_architecture_design.md +# 后端地址: ws://localhost:3000/location-broadcast +# ============================================================================ + +signal connected_to_server() +signal connection_closed() +signal connection_error() +signal session_joined(data: Dictionary) +signal user_joined(data: Dictionary) +signal user_left(data: Dictionary) +signal position_updated(data: Dictionary) + +const WS_URL = "wss://whaletownend.xinghangee.icu/location-broadcast" +const PING_INTERVAL = 25.0 # 秒 + +var _socket: WebSocketPeer +var _connected: bool = false +var _ping_timer: float = 0.0 +var _auth_token: String = "" + +func _ready(): + _socket = WebSocketPeer.new() + process_mode = Node.PROCESS_MODE_ALWAYS # 保证暂停时也能处理网络 + print("WebSocketManager Initialized") + +func _process(delta): + _socket.poll() + var state = _socket.get_ready_state() + + if state == WebSocketPeer.STATE_OPEN: + if not _connected: + _on_connected() + + # 处理接收到的数据包 + while _socket.get_available_packet_count() > 0: + var packet = _socket.get_packet() + _handle_packet(packet) + + # 心跳处理 + _ping_timer += delta + if _ping_timer >= PING_INTERVAL: + _send_heartbeat() + _ping_timer = 0.0 + + elif state == WebSocketPeer.STATE_CLOSED: + if _connected: + _on_disconnected() + +func connect_to_server(): + if _socket.get_ready_state() == WebSocketPeer.STATE_OPEN: + print("WebSocket 已经是连接状态") + return + + print("正在连接 WebSocket: ", WS_URL) + var err = _socket.connect_to_url(WS_URL) + if err != OK: + print("WebSocket 连接请求失败: ", err) + connection_error.emit() + else: + # Godot WebSocket connect is non-blocking, wait for state change in _process + pass + +func close_connection(): + _socket.close() + +func set_auth_token(token: String): + _auth_token = token + +# ============ 协议发送 ============ + +func send_packet(event: String, data: Dictionary): + if _socket.get_ready_state() != WebSocketPeer.STATE_OPEN: + return + + var message = { + "event": event, + "data": data + } + var json_str = JSON.stringify(message) + _socket.put_packet(json_str.to_utf8_buffer()) + +func join_session(map_id: String, initial_pos: Vector2): + var data = { + "sessionId": map_id, + "initialPosition": { + "x": initial_pos.x, + "y": initial_pos.y, + "mapId": map_id + }, + "token": _auth_token + } + print("发送加入会话请求: ", map_id, " mapId Payload: ", data.initialPosition.mapId) + send_packet("join_session", data) + +func leave_session(map_id: String): + print("发送离开会话请求: ", map_id) + send_packet("leave_session", {"sessionId": map_id}) + +func send_position_update(map_id: String, pos: Vector2, anim_data: Dictionary = {}): + var data = { + "x": pos.x, + "y": pos.y, + "mapId": map_id, + "metadata": anim_data + } + # print("发送位置更新: ", map_id) + if map_id == "": + print("WARNING: Sending position update with EMPTY mapId! Pos: ", pos) + send_packet("position_update", data) + +func _send_heartbeat(): + send_packet("heartbeat", {"timestamp": Time.get_unix_time_from_system()}) + +# ============ 事件处理 ============ + +func _on_connected(): + _connected = true + print("WebSocket 连接成功!") + connected_to_server.emit() + +func _on_disconnected(): + _connected = false + var code = _socket.get_close_code() + var reason = _socket.get_close_reason() + print("WebSocket 连接断开. Code: %d, Reason: %s" % [code, reason]) + connection_closed.emit() + +func _handle_packet(packet: PackedByteArray): + var json_str = packet.get_string_from_utf8() + var json = JSON.new() + var err = json.parse(json_str) + + if err != OK: + print("JSON 解析失败: ", json.get_error_message()) + return + + var message = json.data + if not message is Dictionary or not message.has("event"): + return + + var event = message["event"] + var data = message.get("data", {}) + + if event != "heartbeat_response": + print("WebSocket Rx: ", event) # Debug logs for all events + + match event: + "session_joined": + session_joined.emit(data) + print("加入会话成功,当前房间人数: ", data.get("users", []).size()) + "user_joined": + user_joined.emit(data) + print("用户加入: ", data.get("userId")) + "user_left": + user_left.emit(data) + print("用户离开: ", data.get("userId")) + "position_update": + print("WebSocket Rx position_update: ", data.get("userId", "unknown")) + position_updated.emit(data) + "heartbeat_response": + pass # 静默处理 + "error": + print("WebSocket 错误事件: ", JSON.stringify(data)) + _: + print("未处理的 WebSocket 事件: ", event) diff --git a/_Core/managers/WebSocketManager.gd.uid b/_Core/managers/WebSocketManager.gd.uid new file mode 100644 index 0000000..312caf6 --- /dev/null +++ b/_Core/managers/WebSocketManager.gd.uid @@ -0,0 +1 @@ +uid://stpl2jdeqo0d diff --git a/project.godot b/project.godot index ecaa2de..e9582bf 100644 --- a/project.godot +++ b/project.godot @@ -22,6 +22,7 @@ SceneManager="*res://_Core/managers/SceneManager.gd" EventSystem="*res://_Core/systems/EventSystem.gd" NetworkManager="*res://_Core/managers/NetworkManager.gd" ResponseHandler="*res://_Core/managers/ResponseHandler.gd" +WebSocketManager="*res://_Core/managers/WebSocketManager.gd" [debug] diff --git a/scenes/MainScene.gd b/scenes/MainScene.gd index e978d86..67369eb 100644 --- a/scenes/MainScene.gd +++ b/scenes/MainScene.gd @@ -48,10 +48,10 @@ var player_max_energy: int = 100 func _ready(): # 初始化游戏状态 - # setup_game() + setup_game() # [TEST] 临时绕过登录 - call_deferred("_on_login_success", "LocalTester") + # call_deferred("_on_login_success", "LocalTester") # 连接登录成功信号 auth_scene.login_success.connect(_on_login_success) @@ -97,14 +97,14 @@ func _setup_test_environment(): var map_instance = map_res.instantiate() add_child(map_instance) - # 3. 加载玩家 - var player_res = load("res://Scenes/characters/player.tscn") - if player_res: - var player_instance = player_res.instantiate() - player_instance.position = Vector2(800, 600) # 设置初始位置 - map_instance.add_child(player_instance) - else: - print("错误: 无法加载玩家场景") + # 3. 加载玩家 - 交由 BaseLevel 或场景脚本动态处理 + # var player_res = load("res://Scenes/characters/player.tscn") + # if player_res: + # var player_instance = player_res.instantiate() + # player_instance.position = Vector2(800, 600) # 设置初始位置 + # map_instance.add_child(player_instance) + # else: + # print("错误: 无法加载玩家场景") else: print("错误: 无法加载广场地图") @@ -114,10 +114,15 @@ func update_player_status(): exp_label.text = "经验: " + str(player_exp) + "/" + str(player_max_exp) energy_label.text = "体力: " + str(player_energy) + "/" + str(player_max_energy) -func _on_login_success(username: String): +func _on_login_success(username: String, token: String): # 登录成功后的处理 current_user = username print("用户 ", username, " 登录成功!") + + # 连接到游戏服务器 + WebSocketManager.set_auth_token(token) + WebSocketManager.connect_to_server() + show_main_game() func _on_logout_pressed(): diff --git a/scenes/Maps/BaseLevel.gd b/scenes/Maps/BaseLevel.gd new file mode 100644 index 0000000..6ae9b93 --- /dev/null +++ b/scenes/Maps/BaseLevel.gd @@ -0,0 +1,318 @@ +class_name BaseLevel +extends Node2D + +# 基础关卡脚本 +# 负责处理通用的关卡逻辑,如玩家生成 + +@onready var spawn_points = $SpawnPoints if has_node("SpawnPoints") else null +@onready var players_container = $Objects/Players if has_node("Objects/Players") else self + +func _ready(): + # 延时一帧确保所有子节点就绪 + call_deferred("_spawn_player") + + # 连接到多人会话 + # 获取当前场景名字作为 Session ID + _current_session_id = SceneManager.get_current_scene_name() + if _current_session_id == "": + _current_session_id = "square" # Fallback for direct run + + # 如果是私人场景,生成唯一的 Session ID (e.g., room_123) + if _current_session_id in PRIVATE_SCENES: + _current_session_id = _current_session_id + "_" + str(AuthManager.current_user_id) + print("BaseLevel: 进入私密房间实例: ", _current_session_id) + + print("BaseLevel: Preparing to join session: ", _current_session_id) + + # 如果 WebSocket 已连接,直接加入 + if WebSocketManager._socket.get_ready_state() == WebSocketPeer.STATE_OPEN: + + _join_session_with_player(_current_session_id) + else: + # 否则等待连接成功信号 + WebSocketManager.connected_to_server.connect(func(): _join_session_with_player(_current_session_id)) + + # 连接远程玩家相关信号 + WebSocketManager.session_joined.connect(_on_session_joined) + WebSocketManager.user_joined.connect(_on_user_joined) + WebSocketManager.user_left.connect(_on_user_left) + WebSocketManager.position_updated.connect(_on_position_updated) + + # Debug: Simulate fake player to verify rendering + # get_tree().create_timer(2.0).timeout.connect(_debug_fake_activity) + +func _exit_tree(): + # 场景卸载时不需要再做操作,交给 DoorTeleport 或其他切换逻辑显示处理 + pass + +func _debug_fake_activity(): + print("BaseLevel: Starting fake player simulation") + var fake_id = "fake_ghost" + _on_user_joined({"user": {"userId": fake_id, "username": "Ghost"}, "position": {"x": 500, "y": 500}}) + + for i in range(20): + await get_tree().create_timer(0.5).timeout + var new_pos = Vector2(500 + i * 20, 500 + i * 10) + _on_position_updated({"userId": fake_id, "position": {"x": new_pos.x, "y": new_pos.y}}) + print("BaseLevel: Ghost moved to ", new_pos) + +var remote_players: Dictionary = {} # userId -> RemotePlayer instance +var remote_player_scene = preload("res://scenes/characters/remote_player.tscn") +var _player_spawned: bool = false # Track if local player has been spawned +var _local_player: Node = null # Reference to the local player node +var _position_update_timer: float = 0.0 # Throttle timer for position updates +var _current_session_id: String = "" # Cache session ID to avoid race condition on exit +const POSITION_UPDATE_INTERVAL: float = 0.125 # Send at most 8 times per second +const PRIVATE_SCENES = ["room"] # List of scenes that should be private instances + +func _on_session_joined(data: Dictionary): + # 对账远程玩家列表,使用 position.mapId 过滤 + if not data.has("users"): + return + + var current_map = _current_session_id + if current_map == "": + current_map = SceneManager.get_current_scene_name() + if current_map == "": + current_map = "square" + + print("BaseLevel: 同步会话 - 当前场景: ", current_map, ", 收到用户数: ", data.users.size()) + + # 1. 收集服务器返回的、且 mapId 匹配当前场景的用户ID + var valid_user_ids: Array = [] + var valid_users: Dictionary = {} # userId -> user data + + for user in data.users: + if not user.has("userId") or str(user.userId) == str(AuthManager.current_user_id): + continue + + # 检查 position.mapId 是否匹配当前场景 + var user_map_id = "" + if user.has("position") and user.position != null: + if typeof(user.position) == TYPE_DICTIONARY and user.position.has("mapId"): + user_map_id = str(user.position.mapId) + print("BaseLevel: 用户 ", user.userId, " 的位置数据: ", user.position) + else: + print("BaseLevel: 用户 ", user.userId, " 没有位置数据") + + print("BaseLevel: 用户 ", user.userId, " mapId=", user_map_id, ", 当前场景=", current_map) + + if user_map_id == current_map: + var uid = str(user.userId) + valid_user_ids.append(uid) + valid_users[uid] = user + print("BaseLevel: 添加有效用户: ", uid) + else: + # mapId 不匹配,这是"幽灵玩家" + print("BaseLevel: 跳过 mapId 不匹配的玩家: ", user.get("userId"), " (mapId=", user_map_id, ", expected=", current_map, ")") + + # 2. 清理幽灵:移除本地有但不在有效列表中的玩家 + var local_user_ids = remote_players.keys() + for user_id in local_user_ids: + if str(user_id) not in valid_user_ids: + print("BaseLevel: 清理幽灵玩家: ", user_id) + _remove_remote_player(user_id) + + # 3. 添加或更新有效的玩家 + for uid in valid_user_ids: + var user = valid_users[uid] + if remote_players.has(uid): + # 已存在,更新位置 + _update_remote_player_position(user) + else: + # 不存在,创建新玩家 + print("BaseLevel: 创建远程玩家: ", uid) + _add_remote_player(user) + +func _on_user_joined(data: Dictionary): + var user = data.get("user", {}) + if user.has("userId"): + print("BaseLevel: 新玩家加入: ", user.userId) + if user.userId == AuthManager.current_user_id: + return + + # 将 position 数据合并到 user 字典中,以便 _add_remote_player 统一处理 + if data.has("position"): + user["position"] = data.position + + _add_remote_player(user) + +func _on_user_left(data: Dictionary): + var user_id = data.get("userId") + if user_id: + print("BaseLevel: 玩家离开: ", user_id) + _remove_remote_player(user_id) + +func _on_position_updated(data: Dictionary): + var user_id = data.get("userId") + + if user_id and remote_players.has(user_id): + var player = remote_players[user_id] + # 数据可能直接是位置(扁平)或者包含在 position 字段中 + # 根据后端协议: { userId:..., position: {x,y...}, ... } + var pos_data = data.get("position", {}) + if pos_data.is_empty(): + pos_data = data # 兼容扁平格式 + + # print("BaseLevel: 收到位置更新: ", user_id, " Data: ", pos_data) # Debug log + + # 检查 mapId 是否匹配当前场景 + if pos_data.has("mapId") and str(pos_data.mapId) != "": + var current_map = _current_session_id + if current_map == "": + current_map = "square" + + if str(pos_data.mapId) != current_map: + print("BaseLevel: 收到异地位置更新,移除幽灵玩家: ", user_id, " (在该玩家在 ", pos_data.mapId, ")") + _remove_remote_player(user_id) + return + + if player.has_method("update_position") and pos_data.has("x") and pos_data.has("y"): + player.update_position(Vector2(pos_data.x, pos_data.y)) + +func _add_remote_player(user_data: Dictionary): + var user_id = str(user_data.get("userId", "")) + if user_id == "": + return + + # 防止重复创建 + if remote_players.has(user_id): + return + + var remote_player = remote_player_scene.instantiate() + + # 使用统一的 setup 方法 + if remote_player.has_method("setup"): + remote_player.setup(user_data) + else: + # Fallback: 手动设置属性 (如果脚本没更新) + remote_player.position = Vector2.ZERO + if user_data.has("position"): + var p = user_data.position + if p.has("x") and p.has("y"): + remote_player.position = Vector2(p.x, p.y) + + # 添加到场景玩家容器 + if has_node("Objects/Players"): + $Objects/Players.add_child(remote_player) + else: + add_child(remote_player) + + remote_players[user_id] = remote_player + print("BaseLevel: 已创建远程玩家: ", user_id) + +func _remove_remote_player(user_id): + var uid = str(user_id) + if remote_players.has(uid): + var player = remote_players[uid] + if is_instance_valid(player): + player.queue_free() + remote_players.erase(uid) + +func _update_remote_player_position(user: Dictionary): + var user_id = str(user.get("userId", "")) + var player = remote_players.get(user_id) + if not player or not is_instance_valid(player): + return + if user.has("position"): + var pos = user.position + if pos.has("x") and pos.has("y") and player.has_method("update_position"): + player.update_position(Vector2(pos.x, pos.y)) + +func _join_session_with_player(session_id: String): + # 检查是否有Token,如果没有则等待 + if WebSocketManager._auth_token == "": + print("BaseLevel: Token not ready, waiting...") + # 轮询等待Token就绪 (简单重试机制) + await get_tree().create_timer(0.5).timeout + _join_session_with_player(session_id) + return + + # 等待玩家生成完毕 + if not _player_spawned or not _local_player: + await get_tree().process_frame + _join_session_with_player(session_id) + return + + var pos = _local_player.global_position if is_instance_valid(_local_player) else Vector2.ZERO + + WebSocketManager.join_session(session_id, pos) + + # 强制广播一次位置更新,确保旧房间的玩家立即收到 "已切换地图" 的通知 + # 这能解决"需要移动两步幽灵才消失"的问题 + await get_tree().create_timer(0.1).timeout + WebSocketManager.send_position_update(session_id, pos) + +func _process(delta): + # 发送位置更新 (节流机制) + if not _player_spawned or not _local_player: + return # Wait for player to be spawned + + if WebSocketManager._socket.get_ready_state() != WebSocketPeer.STATE_OPEN: + return # WebSocket not connected + + if not is_instance_valid(_local_player): + return # Player was freed + + # 检查 velocity 属性 + if not "velocity" in _local_player: + return + + # 只有在移动时才更新计时器和发送 + if _local_player.velocity.length() > 0: + _position_update_timer += delta + if _position_update_timer >= POSITION_UPDATE_INTERVAL: + _position_update_timer = 0.0 + # 使用 _current_session_id 确保有正确的 fallback + var map_id = _current_session_id if _current_session_id != "" else "square" + WebSocketManager.send_position_update(map_id, _local_player.global_position) + + + +func _spawn_player(): + # 1. 确定出生位置 + var spawn_pos = Vector2.ZERO + var spawn_name = SceneManager.get_next_spawn_name() + + print("BaseLevel: Checking spawn point for name: '", spawn_name, "'") + + # 查找逻辑:优先查找名为 spawn_name 的节点,其次找 DefaultSpawn + var target_node_name = spawn_name if spawn_name != "" else "DefaultSpawn" + var marker_node = null + + # 策略 A: 在 SpawnPoints 容器中查找 + if has_node("SpawnPoints"): + marker_node = $SpawnPoints.get_node_or_null(target_node_name) + + # 策略 B: 如果没找到,在当前节点(根节点)下查找 + if marker_node == null: + marker_node = get_node_or_null(target_node_name) + + # 如果找到了标记点,使用其位置 + if marker_node: + spawn_pos = marker_node.global_position + print("BaseLevel: Found spawn marker '", target_node_name, "' at ", spawn_pos) + else: + # 策略 C: 检查 SceneManager 是否有备用坐标 (兼容旧逻辑) + var pos_param = SceneManager.get_next_scene_position() + if pos_param != null: + spawn_pos = pos_param + print("BaseLevel: Using explicit position from SceneManager: ", spawn_pos) + else: + print("BaseLevel: Warning - Could not find marker '", target_node_name, "' and no explicit position set. Using (0,0)") + + # 2. 实例化玩家 + var player_scene = preload("res://scenes/characters/player.tscn") + var player = player_scene.instantiate() + player.global_position = spawn_pos + + # 添加到场景 + # 如果有Objects/Players容器则添加进去,否则直接添加到当前节点 + if has_node("Objects/Players"): + $Objects/Players.add_child(player) + else: + add_child(player) + + print("BaseLevel: Player spawned at ", player.global_position) + _local_player = player # Save reference + _player_spawned = true diff --git a/scenes/Maps/BaseLevel.gd.uid b/scenes/Maps/BaseLevel.gd.uid new file mode 100644 index 0000000..e5d031b --- /dev/null +++ b/scenes/Maps/BaseLevel.gd.uid @@ -0,0 +1 @@ +uid://c5ml4722ptwp2 diff --git a/scenes/Maps/door_teleport.gd b/scenes/Maps/DoorTeleport.gd similarity index 63% rename from scenes/Maps/door_teleport.gd rename to scenes/Maps/DoorTeleport.gd index c856d61..ae66a1c 100644 --- a/scenes/Maps/door_teleport.gd +++ b/scenes/Maps/DoorTeleport.gd @@ -1,8 +1,9 @@ extends Area2D # 场景名称 -@export var target_scene_name: String = "room" -@export var target_position: Vector2 = Vector2.ZERO # 目标场景的生成位置 (Vector2.ZERO 表示使用默认位置/不设置) +@export var target_scene_name: String = "" +@export var target_position: Vector2 = Vector2.ZERO # 兼容旧逻辑 +@export var target_spawn_name: String = "" # 新逻辑:指定目标场景的 Marker2D 名称 (例如 "FromSquare") # 目标场景的生成位置 (Vector2.ZERO 表示使用默认位置/不设置) # Called when the node enters the scene tree for the first time. func _ready() -> void: @@ -23,10 +24,16 @@ func _on_body_entered(body: Node2D) -> void: _teleport_player() func _teleport_player() -> void: - # 如果设置了目标位置,则传递给 SceneManager - if target_position != Vector2.ZERO: + if target_scene_name == "": + print("Error: Target scene name is empty!") + return + + print("Teleporting to scene: ", target_scene_name) + + # 设置参数 + if target_spawn_name != "": + SceneManager.set_next_spawn_name(target_spawn_name) + elif target_position != Vector2.ZERO: SceneManager.set_next_scene_position(target_position) - # 使用 SceneManager 切换场景 - # 确保 SceneManager 已经注册了相关场景路径 SceneManager.change_scene(target_scene_name) diff --git a/scenes/Maps/DoorTeleport.gd.uid b/scenes/Maps/DoorTeleport.gd.uid new file mode 100644 index 0000000..5b1de28 --- /dev/null +++ b/scenes/Maps/DoorTeleport.gd.uid @@ -0,0 +1 @@ +uid://b068cnbw3a8wt diff --git a/scenes/Maps/room.tscn b/scenes/Maps/room.tscn index a4210d8..32ec743 100644 --- a/scenes/Maps/room.tscn +++ b/scenes/Maps/room.tscn @@ -1,8 +1,8 @@ [gd_scene load_steps=10 format=4 uid="uid://npn1yjrhdwwx"] [ext_resource type="Texture2D" uid="uid://bjcij2ncikeyw" path="res://assets/sprites/environment/room_512_384.png" id="1_gnxaf"] -[ext_resource type="PackedScene" uid="uid://b2f8e24plwqgj" path="res://scenes/characters/player.tscn" id="2_shs2d"] -[ext_resource type="Script" uid="uid://3wghcufucve5" path="res://scenes/Maps/door_teleport.gd" id="3_y0jqb"] +[ext_resource type="Script" uid="uid://c5ml4722ptwp2" path="res://scenes/Maps/BaseLevel.gd" id="1_y0jqb"] +[ext_resource type="Script" uid="uid://b068cnbw3a8wt" path="res://scenes/Maps/DoorTeleport.gd" id="3_y0jqb"] [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_shs2d"] texture = ExtResource("1_gnxaf") @@ -681,18 +681,22 @@ size = Vector2(500.5, 121) size = Vector2(215, 12.5) [node name="Room" type="Node2D"] +script = ExtResource("1_y0jqb") [node name="ground" type="TileMapLayer" parent="."] tile_map_data = PackedByteArray("AADw//L/AAAAAAEAAADw//P/AAAAAAIAAADw//T/AAAAAAMAAADw//X/AAAAAAQAAADw//b/AAAAAAUAAADw//f/AAAAAAYAAADw//j/AAAAAAcAAADw//n/AAAAAAgAAADw//r/AAAAAAkAAADw//v/AAAAAAoAAADw//z/AAAAAAsAAADw//3/AAAAAAwAAADw//7/AAAAAA0AAADw////AAAAAA4AAADw/wAAAAAAAA8AAADw/wEAAAAAABAAAADw/wIAAAAAABEAAADw/wMAAAAAABIAAADw/wQAAAAAABMAAADw/wUAAAAAABQAAADx//L/AAABAAEAAADx//P/AAABAAIAAADx//T/AAABAAMAAADx//X/AAABAAQAAADx//b/AAABAAUAAADx//f/AAABAAYAAADx//j/AAABAAcAAADx//n/AAABAAgAAADx//r/AAABAAkAAADx//v/AAABAAoAAADx//z/AAABAAsAAADx//3/AAABAAwAAADx//7/AAABAA0AAADx////AAABAA4AAADx/wAAAAABAA8AAADx/wEAAAABABAAAADx/wIAAAABABEAAADx/wMAAAABABIAAADx/wQAAAABABMAAADx/wUAAAABABQAAADy//L/AAACAAEAAADy//P/AAACAAIAAADy//T/AAACAAMAAADy//X/AAACAAQAAADy//b/AAACAAUAAADy//f/AAACAAYAAADy//j/AAACAAcAAADy//n/AAACAAgAAADy//r/AAACAAkAAADy//v/AAACAAoAAADy//z/AAACAAsAAADy//3/AAACAAwAAADy//7/AAACAA0AAADy////AAACAA4AAADy/wAAAAACAA8AAADy/wEAAAACABAAAADy/wIAAAACABEAAADy/wMAAAACABIAAADy/wQAAAACABMAAADy/wUAAAACABQAAADz//L/AAADAAEAAADz//P/AAADAAIAAADz//T/AAADAAMAAADz//X/AAADAAQAAADz//b/AAADAAUAAADz//f/AAADAAYAAADz//j/AAADAAcAAADz//n/AAADAAgAAADz//r/AAADAAkAAADz//v/AAADAAoAAADz//z/AAADAAsAAADz//3/AAADAAwAAADz//7/AAADAA0AAADz////AAADAA4AAADz/wAAAAADAA8AAADz/wEAAAADABAAAADz/wIAAAADABEAAADz/wMAAAADABIAAADz/wQAAAADABMAAADz/wUAAAADABQAAAD0//L/AAAEAAEAAAD0//P/AAAEAAIAAAD0//T/AAAEAAMAAAD0//X/AAAEAAQAAAD0//b/AAAEAAUAAAD0//f/AAAEAAYAAAD0//j/AAAEAAcAAAD0//n/AAAEAAgAAAD0//r/AAAEAAkAAAD0//v/AAAEAAoAAAD0//z/AAAEAAsAAAD0//3/AAAEAAwAAAD0//7/AAAEAA0AAAD0////AAAEAA4AAAD0/wAAAAAEAA8AAAD0/wEAAAAEABAAAAD0/wIAAAAEABEAAAD0/wMAAAAEABIAAAD0/wQAAAAEABMAAAD0/wUAAAAEABQAAAD1//L/AAAFAAEAAAD1//P/AAAFAAIAAAD1//T/AAAFAAMAAAD1//X/AAAFAAQAAAD1//b/AAAFAAUAAAD1//f/AAAFAAYAAAD1//j/AAAFAAcAAAD1//n/AAAFAAgAAAD1//r/AAAFAAkAAAD1//v/AAAFAAoAAAD1//z/AAAFAAsAAAD1//3/AAAFAAwAAAD1//7/AAAFAA0AAAD1////AAAFAA4AAAD1/wAAAAAFAA8AAAD1/wEAAAAFABAAAAD1/wIAAAAFABEAAAD1/wMAAAAFABIAAAD1/wQAAAAFABMAAAD1/wUAAAAFABQAAAD2//L/AAAGAAEAAAD2//P/AAAGAAIAAAD2//T/AAAGAAMAAAD2//X/AAAGAAQAAAD2//b/AAAGAAUAAAD2//f/AAAGAAYAAAD2//j/AAAGAAcAAAD2//n/AAAGAAgAAAD2//r/AAAGAAkAAAD2//v/AAAGAAoAAAD2//z/AAAGAAsAAAD2//3/AAAGAAwAAAD2//7/AAAGAA0AAAD2////AAAGAA4AAAD2/wAAAAAGAA8AAAD2/wEAAAAGABAAAAD2/wIAAAAGABEAAAD2/wMAAAAGABIAAAD2/wQAAAAGABMAAAD2/wUAAAAGABQAAAD3//L/AAAHAAEAAAD3//P/AAAHAAIAAAD3//T/AAAHAAMAAAD3//X/AAAHAAQAAAD3//b/AAAHAAUAAAD3//f/AAAHAAYAAAD3//j/AAAHAAcAAAD3//n/AAAHAAgAAAD3//r/AAAHAAkAAAD3//v/AAAHAAoAAAD3//z/AAAHAAsAAAD3//3/AAAHAAwAAAD3//7/AAAHAA0AAAD3////AAAHAA4AAAD3/wAAAAAHAA8AAAD3/wEAAAAHABAAAAD3/wIAAAAHABEAAAD3/wMAAAAHABIAAAD3/wQAAAAHABMAAAD3/wUAAAAHABQAAAD4//L/AAAIAAEAAAD4//P/AAAIAAIAAAD4//T/AAAIAAMAAAD4//X/AAAIAAQAAAD4//b/AAAIAAUAAAD4//f/AAAIAAYAAAD4//j/AAAIAAcAAAD4//n/AAAIAAgAAAD4//r/AAAIAAkAAAD4//v/AAAIAAoAAAD4//z/AAAIAAsAAAD4//3/AAAIAAwAAAD4//7/AAAIAA0AAAD4////AAAIAA4AAAD4/wAAAAAIAA8AAAD4/wEAAAAIABAAAAD4/wIAAAAIABEAAAD4/wMAAAAIABIAAAD4/wQAAAAIABMAAAD4/wUAAAAIABQAAAD5//L/AAAJAAEAAAD5//P/AAAJAAIAAAD5//T/AAAJAAMAAAD5//X/AAAJAAQAAAD5//b/AAAJAAUAAAD5//f/AAAJAAYAAAD5//j/AAAJAAcAAAD5//n/AAAJAAgAAAD5//r/AAAJAAkAAAD5//v/AAAJAAoAAAD5//z/AAAJAAsAAAD5//3/AAAJAAwAAAD5//7/AAAJAA0AAAD5////AAAJAA4AAAD5/wAAAAAJAA8AAAD5/wEAAAAJABAAAAD5/wIAAAAJABEAAAD5/wMAAAAJABIAAAD5/wQAAAAJABMAAAD5/wUAAAAJABQAAAD6//L/AAAKAAEAAAD6//P/AAAKAAIAAAD6//T/AAAKAAMAAAD6//X/AAAKAAQAAAD6//b/AAAKAAUAAAD6//f/AAAKAAYAAAD6//j/AAAKAAcAAAD6//n/AAAKAAgAAAD6//r/AAAKAAkAAAD6//v/AAAKAAoAAAD6//z/AAAKAAsAAAD6//3/AAAKAAwAAAD6//7/AAAKAA0AAAD6////AAAKAA4AAAD6/wAAAAAKAA8AAAD6/wEAAAAKABAAAAD6/wIAAAAKABEAAAD6/wMAAAAKABIAAAD6/wQAAAAKABMAAAD6/wUAAAAKABQAAAD7//L/AAALAAEAAAD7//P/AAALAAIAAAD7//T/AAALAAMAAAD7//X/AAALAAQAAAD7//b/AAALAAUAAAD7//f/AAALAAYAAAD7//j/AAALAAcAAAD7//n/AAALAAgAAAD7//r/AAALAAkAAAD7//v/AAALAAoAAAD7//z/AAALAAsAAAD7//3/AAALAAwAAAD7//7/AAALAA0AAAD7////AAALAA4AAAD7/wAAAAALAA8AAAD7/wEAAAALABAAAAD7/wIAAAALABEAAAD7/wMAAAALABIAAAD7/wQAAAALABMAAAD7/wUAAAALABQAAAD8//L/AAAMAAEAAAD8//P/AAAMAAIAAAD8//T/AAAMAAMAAAD8//X/AAAMAAQAAAD8//b/AAAMAAUAAAD8//f/AAAMAAYAAAD8//j/AAAMAAcAAAD8//n/AAAMAAgAAAD8//r/AAAMAAkAAAD8//v/AAAMAAoAAAD8//z/AAAMAAsAAAD8//3/AAAMAAwAAAD8//7/AAAMAA0AAAD8////AAAMAA4AAAD8/wAAAAAMAA8AAAD8/wEAAAAMABAAAAD8/wIAAAAMABEAAAD8/wMAAAAMABIAAAD8/wQAAAAMABMAAAD8/wUAAAAMABQAAAD9//L/AAANAAEAAAD9//P/AAANAAIAAAD9//T/AAANAAMAAAD9//X/AAANAAQAAAD9//b/AAANAAUAAAD9//f/AAANAAYAAAD9//j/AAANAAcAAAD9//n/AAANAAgAAAD9//r/AAANAAkAAAD9//v/AAANAAoAAAD9//z/AAANAAsAAAD9//3/AAANAAwAAAD9//7/AAANAA0AAAD9////AAANAA4AAAD9/wAAAAANAA8AAAD9/wEAAAANABAAAAD9/wIAAAANABEAAAD9/wMAAAANABIAAAD9/wQAAAANABMAAAD9/wUAAAANABQAAAD9/wYAAAANABUAAAD9/wcAAAANABYAAAD9/wgAAAANABcAAAD+//L/AAAOAAEAAAD+//P/AAAOAAIAAAD+//T/AAAOAAMAAAD+//X/AAAOAAQAAAD+//b/AAAOAAUAAAD+//f/AAAOAAYAAAD+//j/AAAOAAcAAAD+//n/AAAOAAgAAAD+//r/AAAOAAkAAAD+//v/AAAOAAoAAAD+//z/AAAOAAsAAAD+//3/AAAOAAwAAAD+//7/AAAOAA0AAAD+////AAAOAA4AAAD+/wAAAAAOAA8AAAD+/wEAAAAOABAAAAD+/wIAAAAOABEAAAD+/wMAAAAOABIAAAD+/wQAAAAOABMAAAD+/wUAAAAOABQAAAD+/wYAAAAOABUAAAD+/wcAAAAOABYAAAD+/wgAAAAOABcAAAD///L/AAAPAAEAAAD///P/AAAPAAIAAAD///T/AAAPAAMAAAD///X/AAAPAAQAAAD///b/AAAPAAUAAAD///f/AAAPAAYAAAD///j/AAAPAAcAAAD///n/AAAPAAgAAAD///r/AAAPAAkAAAD///v/AAAPAAoAAAD///z/AAAPAAsAAAD///3/AAAPAAwAAAD///7/AAAPAA0AAAD/////AAAPAA4AAAD//wAAAAAPAA8AAAD//wEAAAAPABAAAAD//wIAAAAPABEAAAD//wMAAAAPABIAAAD//wQAAAAPABMAAAD//wUAAAAPABQAAAD//wYAAAAPABUAAAD//wcAAAAPABYAAAD//wgAAAAPABcAAAAAAPL/AAAQAAEAAAAAAPP/AAAQAAIAAAAAAPT/AAAQAAMAAAAAAPX/AAAQAAQAAAAAAPb/AAAQAAUAAAAAAPf/AAAQAAYAAAAAAPj/AAAQAAcAAAAAAPn/AAAQAAgAAAAAAPr/AAAQAAkAAAAAAPv/AAAQAAoAAAAAAPz/AAAQAAsAAAAAAP3/AAAQAAwAAAAAAP7/AAAQAA0AAAAAAP//AAAQAA4AAAAAAAAAAAAQAA8AAAAAAAEAAAAQABAAAAAAAAIAAAAQABEAAAAAAAMAAAAQABIAAAAAAAQAAAAQABMAAAAAAAUAAAAQABQAAAAAAAYAAAAQABUAAAAAAAcAAAAQABYAAAAAAAgAAAAQABcAAAABAPL/AAARAAEAAAABAPP/AAARAAIAAAABAPT/AAARAAMAAAABAPX/AAARAAQAAAABAPb/AAARAAUAAAABAPf/AAARAAYAAAABAPj/AAARAAcAAAABAPn/AAARAAgAAAABAPr/AAARAAkAAAABAPv/AAARAAoAAAABAPz/AAARAAsAAAABAP3/AAARAAwAAAABAP7/AAARAA0AAAABAP//AAARAA4AAAABAAAAAAARAA8AAAABAAEAAAARABAAAAABAAIAAAARABEAAAABAAMAAAARABIAAAABAAQAAAARABMAAAABAAUAAAARABQAAAABAAYAAAARABUAAAABAAcAAAARABYAAAABAAgAAAARABcAAAACAPL/AAASAAEAAAACAPP/AAASAAIAAAACAPT/AAASAAMAAAACAPX/AAASAAQAAAACAPb/AAASAAUAAAACAPf/AAASAAYAAAACAPj/AAASAAcAAAACAPn/AAASAAgAAAACAPr/AAASAAkAAAACAPv/AAASAAoAAAACAPz/AAASAAsAAAACAP3/AAASAAwAAAACAP7/AAASAA0AAAACAP//AAASAA4AAAACAAAAAAASAA8AAAACAAEAAAASABAAAAACAAIAAAASABEAAAACAAMAAAASABIAAAACAAQAAAASABMAAAACAAUAAAASABQAAAACAAYAAAASABUAAAACAAcAAAASABYAAAACAAgAAAASABcAAAADAPL/AAATAAEAAAADAPP/AAATAAIAAAADAPT/AAATAAMAAAADAPX/AAATAAQAAAADAPb/AAATAAUAAAADAPf/AAATAAYAAAADAPj/AAATAAcAAAADAPn/AAATAAgAAAADAPr/AAATAAkAAAADAPv/AAATAAoAAAADAPz/AAATAAsAAAADAP3/AAATAAwAAAADAP7/AAATAA0AAAADAP//AAATAA4AAAADAAAAAAATAA8AAAADAAEAAAATABAAAAADAAIAAAATABEAAAADAAMAAAATABIAAAADAAQAAAATABMAAAADAAUAAAATABQAAAAEAPL/AAAUAAEAAAAEAPP/AAAUAAIAAAAEAPT/AAAUAAMAAAAEAPX/AAAUAAQAAAAEAPb/AAAUAAUAAAAEAPf/AAAUAAYAAAAEAPj/AAAUAAcAAAAEAPn/AAAUAAgAAAAEAPr/AAAUAAkAAAAEAPv/AAAUAAoAAAAEAPz/AAAUAAsAAAAEAP3/AAAUAAwAAAAEAP7/AAAUAA0AAAAEAP//AAAUAA4AAAAEAAAAAAAUAA8AAAAEAAEAAAAUABAAAAAEAAIAAAAUABEAAAAEAAMAAAAUABIAAAAEAAQAAAAUABMAAAAEAAUAAAAUABQAAAAFAPL/AAAVAAEAAAAFAPP/AAAVAAIAAAAFAPT/AAAVAAMAAAAFAPX/AAAVAAQAAAAFAPb/AAAVAAUAAAAFAPf/AAAVAAYAAAAFAPj/AAAVAAcAAAAFAPn/AAAVAAgAAAAFAPr/AAAVAAkAAAAFAPv/AAAVAAoAAAAFAPz/AAAVAAsAAAAFAP3/AAAVAAwAAAAFAP7/AAAVAA0AAAAFAP//AAAVAA4AAAAFAAAAAAAVAA8AAAAFAAEAAAAVABAAAAAFAAIAAAAVABEAAAAFAAMAAAAVABIAAAAFAAQAAAAVABMAAAAFAAUAAAAVABQAAAAGAPL/AAAWAAEAAAAGAPP/AAAWAAIAAAAGAPT/AAAWAAMAAAAGAPX/AAAWAAQAAAAGAPb/AAAWAAUAAAAGAPf/AAAWAAYAAAAGAPj/AAAWAAcAAAAGAPn/AAAWAAgAAAAGAPr/AAAWAAkAAAAGAPv/AAAWAAoAAAAGAPz/AAAWAAsAAAAGAP3/AAAWAAwAAAAGAP7/AAAWAA0AAAAGAP//AAAWAA4AAAAGAAAAAAAWAA8AAAAGAAEAAAAWABAAAAAGAAIAAAAWABEAAAAGAAMAAAAWABIAAAAGAAQAAAAWABMAAAAGAAUAAAAWABQAAAAHAPL/AAAXAAEAAAAHAPP/AAAXAAIAAAAHAPT/AAAXAAMAAAAHAPX/AAAXAAQAAAAHAPb/AAAXAAUAAAAHAPf/AAAXAAYAAAAHAPj/AAAXAAcAAAAHAPn/AAAXAAgAAAAHAPr/AAAXAAkAAAAHAPv/AAAXAAoAAAAHAPz/AAAXAAsAAAAHAP3/AAAXAAwAAAAHAP7/AAAXAA0AAAAHAP//AAAXAA4AAAAHAAAAAAAXAA8AAAAHAAEAAAAXABAAAAAHAAIAAAAXABEAAAAHAAMAAAAXABIAAAAHAAQAAAAXABMAAAAHAAUAAAAXABQAAAAIAPL/AAAYAAEAAAAIAPP/AAAYAAIAAAAIAPT/AAAYAAMAAAAIAPX/AAAYAAQAAAAIAPb/AAAYAAUAAAAIAPf/AAAYAAYAAAAIAPj/AAAYAAcAAAAIAPn/AAAYAAgAAAAIAPr/AAAYAAkAAAAIAPv/AAAYAAoAAAAIAPz/AAAYAAsAAAAIAP3/AAAYAAwAAAAIAP7/AAAYAA0AAAAIAP//AAAYAA4AAAAIAAAAAAAYAA8AAAAIAAEAAAAYABAAAAAIAAIAAAAYABEAAAAIAAMAAAAYABIAAAAIAAQAAAAYABMAAAAIAAUAAAAYABQAAAAJAPL/AAAZAAEAAAAJAPP/AAAZAAIAAAAJAPT/AAAZAAMAAAAJAPX/AAAZAAQAAAAJAPb/AAAZAAUAAAAJAPf/AAAZAAYAAAAJAPj/AAAZAAcAAAAJAPn/AAAZAAgAAAAJAPr/AAAZAAkAAAAJAPv/AAAZAAoAAAAJAPz/AAAZAAsAAAAJAP3/AAAZAAwAAAAJAP7/AAAZAA0AAAAJAP//AAAZAA4AAAAJAAAAAAAZAA8AAAAJAAEAAAAZABAAAAAJAAIAAAAZABEAAAAJAAMAAAAZABIAAAAJAAQAAAAZABMAAAAJAAUAAAAZABQAAAAKAPL/AAAaAAEAAAAKAPP/AAAaAAIAAAAKAPT/AAAaAAMAAAAKAPX/AAAaAAQAAAAKAPb/AAAaAAUAAAAKAPf/AAAaAAYAAAAKAPj/AAAaAAcAAAAKAPn/AAAaAAgAAAAKAPr/AAAaAAkAAAAKAPv/AAAaAAoAAAAKAPz/AAAaAAsAAAAKAP3/AAAaAAwAAAAKAP7/AAAaAA0AAAAKAP//AAAaAA4AAAAKAAAAAAAaAA8AAAAKAAEAAAAaABAAAAAKAAIAAAAaABEAAAAKAAMAAAAaABIAAAAKAAQAAAAaABMAAAAKAAUAAAAaABQAAAALAPL/AAAbAAEAAAALAPP/AAAbAAIAAAALAPT/AAAbAAMAAAALAPX/AAAbAAQAAAALAPb/AAAbAAUAAAALAPf/AAAbAAYAAAALAPj/AAAbAAcAAAALAPn/AAAbAAgAAAALAPr/AAAbAAkAAAALAPv/AAAbAAoAAAALAPz/AAAbAAsAAAALAP3/AAAbAAwAAAALAP7/AAAbAA0AAAALAP//AAAbAA4AAAALAAAAAAAbAA8AAAALAAEAAAAbABAAAAALAAIAAAAbABEAAAALAAMAAAAbABIAAAALAAQAAAAbABMAAAALAAUAAAAbABQAAAAMAPL/AAAcAAEAAAAMAPP/AAAcAAIAAAAMAPT/AAAcAAMAAAAMAPX/AAAcAAQAAAAMAPb/AAAcAAUAAAAMAPf/AAAcAAYAAAAMAPj/AAAcAAcAAAAMAPn/AAAcAAgAAAAMAPr/AAAcAAkAAAAMAPv/AAAcAAoAAAAMAPz/AAAcAAsAAAAMAP3/AAAcAAwAAAAMAP7/AAAcAA0AAAAMAP//AAAcAA4AAAAMAAAAAAAcAA8AAAAMAAEAAAAcABAAAAAMAAIAAAAcABEAAAAMAAMAAAAcABIAAAAMAAQAAAAcABMAAAAMAAUAAAAcABQAAAANAPL/AAAdAAEAAAANAPP/AAAdAAIAAAANAPT/AAAdAAMAAAANAPX/AAAdAAQAAAANAPb/AAAdAAUAAAANAPf/AAAdAAYAAAANAPj/AAAdAAcAAAANAPn/AAAdAAgAAAANAPr/AAAdAAkAAAANAPv/AAAdAAoAAAANAPz/AAAdAAsAAAANAP3/AAAdAAwAAAANAP7/AAAdAA0AAAANAP//AAAdAA4AAAANAAAAAAAdAA8AAAANAAEAAAAdABAAAAANAAIAAAAdABEAAAANAAMAAAAdABIAAAANAAQAAAAdABMAAAANAAUAAAAdABQAAAAOAPL/AAAeAAEAAAAOAPP/AAAeAAIAAAAOAPT/AAAeAAMAAAAOAPX/AAAeAAQAAAAOAPb/AAAeAAUAAAAOAPf/AAAeAAYAAAAOAPj/AAAeAAcAAAAOAPn/AAAeAAgAAAAOAPr/AAAeAAkAAAAOAPv/AAAeAAoAAAAOAPz/AAAeAAsAAAAOAP3/AAAeAAwAAAAOAP7/AAAeAA0AAAAOAP//AAAeAA4AAAAOAAAAAAAeAA8AAAAOAAEAAAAeABAAAAAOAAIAAAAeABEAAAAOAAMAAAAeABIAAAAOAAQAAAAeABMAAAAOAAUAAAAeABQAAAAPAPL/AAAfAAEAAAAPAPP/AAAfAAIAAAAPAPT/AAAfAAMAAAAPAPX/AAAfAAQAAAAPAPb/AAAfAAUAAAAPAPf/AAAfAAYAAAAPAPj/AAAfAAcAAAAPAPn/AAAfAAgAAAAPAPr/AAAfAAkAAAAPAPv/AAAfAAoAAAAPAPz/AAAfAAsAAAAPAP3/AAAfAAwAAAAPAP7/AAAfAA0AAAAPAP//AAAfAA4AAAAPAAAAAAAfAA8AAAAPAAEAAAAfABAAAAAPAAIAAAAfABEAAAAPAAMAAAAfABIAAAAPAAQAAAAfABMAAAAPAAUAAAAfABQAAAA=") tile_set = SubResource("TileSet_y0jqb") -[node name="Player" parent="." instance=ExtResource("2_shs2d")] -position = Vector2(-2, 95) +[node name="DefaultSpawn" type="Marker2D" parent="."] + +[node name="FromSquare" type="Marker2D" parent="."] +position = Vector2(0, 84) [node name="RoomDoorArea" type="Area2D" parent="."] script = ExtResource("3_y0jqb") target_scene_name = "square" target_position = Vector2(647, 32) +target_spawn_name = "FromRoom" [node name="RoomDoorAreaCollisionShape2D" type="CollisionShape2D" parent="RoomDoorArea"] position = Vector2(2, 127) diff --git a/scenes/Maps/square.tscn b/scenes/Maps/square.tscn index 577fb03..c524792 100644 --- a/scenes/Maps/square.tscn +++ b/scenes/Maps/square.tscn @@ -1,5 +1,6 @@ [gd_scene load_steps=36 format=4 uid="uid://5cc0c6cpnhe8"] +[ext_resource type="Script" uid="uid://c5ml4722ptwp2" path="res://scenes/Maps/BaseLevel.gd" id="1_m4als"] [ext_resource type="Texture2D" uid="uid://baa5wkuyqouh6" path="res://assets/sprites/environment/standard_brick_128_128.jpg" id="1_rb5kq"] [ext_resource type="Texture2D" uid="uid://dwlnclqw6lsa7" path="res://assets/sprites/environment/grass_256_256.png" id="2_dly5q"] [ext_resource type="Texture2D" uid="uid://ccqxsarxnnf4e" path="res://assets/sprites/environment/ground.png" id="2_rb5kq"] @@ -8,14 +9,13 @@ [ext_resource type="Texture2D" uid="uid://df3klfat72qro" path="res://assets/sprites/environment/river2_256_256.png" id="4_mpm5m"] [ext_resource type="Texture2D" uid="uid://b4wt8paqrevg2" path="res://assets/sprites/environment/river_512_512.png" id="5_dly5q"] [ext_resource type="Texture2D" uid="uid://5r75q24ww18f" path="res://assets/sprites/environment/river2_512_512.png" id="6_ff6l1"] -[ext_resource type="PackedScene" uid="uid://b2f8e24plwqgj" path="res://scenes/characters/player.tscn" id="10_ho5ay"] [ext_resource type="Texture2D" uid="uid://d3w3fncsm32oi" path="res://assets/sprites/environment/deck_384_167.png" id="13_tct6u"] [ext_resource type="Texture2D" uid="uid://j0twhfkpj15i" path="res://assets/sprites/environment/deck_512_164.png" id="14_m4als"] [ext_resource type="Texture2D" uid="uid://blre1srim52hs" path="res://assets/sprites/environment/deck_512_282.png" id="15_2rqka"] [ext_resource type="PackedScene" uid="uid://dscbaqkb1klwl" path="res://scenes/Maps/community.tscn" id="16_0xqio"] [ext_resource type="PackedScene" uid="uid://vq5qgk3k6t7e" path="res://scenes/Maps/fountain.tscn" id="16_2rqka"] [ext_resource type="PackedScene" uid="uid://bvfyllcy5fi8o" path="res://scenes/Maps/datawhale_home.tscn" id="16_m4als"] -[ext_resource type="Script" uid="uid://3wghcufucve5" path="res://scenes/Maps/door_teleport.gd" id="18_0xqio"] +[ext_resource type="Script" uid="uid://b068cnbw3a8wt" path="res://scenes/Maps/DoorTeleport.gd" id="18_0xqio"] [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_7nixu"] texture = ExtResource("1_rb5kq") @@ -1048,7 +1048,7 @@ sources/1 = SubResource("TileSetAtlasSource_0xqio") sources/4 = SubResource("TileSetAtlasSource_edt5w") [sub_resource type="RectangleShape2D" id="RectangleShape2D_edt5w"] -size = Vector2(40, 48) +size = Vector2(40, 35) [sub_resource type="RectangleShape2D" id="RectangleShape2D_m4als"] size = Vector2(17, 1440) @@ -1060,6 +1060,7 @@ size = Vector2(32, 825) size = Vector2(1289, 40) [node name="square" type="Node2D"] +script = ExtResource("1_m4als") [node name="ground" type="TileMapLayer" parent="."] tile_map_data = PackedByteArray("AAD8/wAAAAAAAAAAAAD8/wEAAAAAAAEAAAD8/wIAAAAAAAIAAAD8/wMAAAAAAAMAAAD9/wAAAAABAAAAAAD9/wEAAAABAAEAAAD9/wIAAAABAAIAAAD9/wMAAAABAAMAAAD+/wAAAAACAAAAAAD+/wEAAAACAAEAAAD+/wIAAAACAAIAAAD+/wMAAAACAAMAAAD//wAAAAADAAAAAAD//wEAAAADAAEAAAD//wIAAAADAAIAAAD//wMAAAADAAMAAAD4/wAAAAAAAAAAAAD4/wEAAAAAAAEAAAD4/wIAAAAAAAIAAAD4/wMAAAAAAAMAAAD5/wAAAAABAAAAAAD5/wEAAAABAAEAAAD5/wIAAAABAAIAAAD5/wMAAAABAAMAAAD6/wAAAAACAAAAAAD6/wEAAAACAAEAAAD6/wIAAAACAAIAAAD6/wMAAAACAAMAAAD7/wAAAAADAAAAAAD7/wEAAAADAAEAAAD7/wIAAAADAAIAAAD7/wMAAAADAAMAAAD0/wAAAAAAAAAAAAD0/wEAAAAAAAEAAAD0/wIAAAAAAAIAAAD0/wMAAAAAAAMAAAD1/wAAAAABAAAAAAD1/wEAAAABAAEAAAD1/wIAAAABAAIAAAD1/wMAAAABAAMAAAD2/wAAAAACAAAAAAD2/wEAAAACAAEAAAD2/wIAAAACAAIAAAD2/wMAAAACAAMAAAD3/wAAAAADAAAAAAD3/wEAAAADAAEAAAD3/wIAAAADAAIAAAD3/wMAAAADAAMAAADw/wAAAAAAAAAAAADw/wEAAAAAAAEAAADw/wIAAAAAAAIAAADw/wMAAAAAAAMAAADx/wAAAAABAAAAAADx/wEAAAABAAEAAADx/wIAAAABAAIAAADx/wMAAAABAAMAAADy/wAAAAACAAAAAADy/wEAAAACAAEAAADy/wIAAAACAAIAAADy/wMAAAACAAMAAADz/wAAAAADAAAAAADz/wEAAAADAAEAAADz/wIAAAADAAIAAADz/wMAAAADAAMAAADs/wAAAAAAAAAAAADs/wEAAAAAAAEAAADs/wIAAAAAAAIAAADs/wMAAAAAAAMAAADt/wAAAAABAAAAAADt/wEAAAABAAEAAADt/wIAAAABAAIAAADt/wMAAAABAAMAAADu/wAAAAACAAAAAADu/wEAAAACAAEAAADu/wIAAAACAAIAAADu/wMAAAACAAMAAADv/wAAAAADAAAAAADv/wEAAAADAAEAAADv/wIAAAADAAIAAADv/wMAAAADAAMAAADo/wAAAAAAAAAAAADo/wEAAAAAAAEAAADo/wIAAAAAAAIAAADo/wMAAAAAAAMAAADp/wAAAAABAAAAAADp/wEAAAABAAEAAADp/wIAAAABAAIAAADp/wMAAAABAAMAAADq/wAAAAACAAAAAADq/wEAAAACAAEAAADq/wIAAAACAAIAAADq/wMAAAACAAMAAADr/wAAAAADAAAAAADr/wEAAAADAAEAAADr/wIAAAADAAIAAADr/wMAAAADAAMAAADk/wAAAAAAAAAAAADk/wEAAAAAAAEAAADk/wIAAAAAAAIAAADk/wMAAAAAAAMAAADl/wAAAAABAAAAAADl/wEAAAABAAEAAADl/wIAAAABAAIAAADl/wMAAAABAAMAAADm/wAAAAACAAAAAADm/wEAAAACAAEAAADm/wIAAAACAAIAAADm/wMAAAACAAMAAADn/wAAAAADAAAAAADn/wEAAAADAAEAAADn/wIAAAADAAIAAADn/wMAAAADAAMAAADi/wAAAAACAAAAAADi/wEAAAACAAEAAADi/wIAAAACAAIAAADi/wMAAAACAAMAAADj/wAAAAADAAAAAADj/wEAAAADAAEAAADj/wIAAAADAAIAAADj/wMAAAADAAMAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAEAAAAAAAIAAAAAAAIAAAAAAAMAAAAAAAMAAAABAAAAAAABAAAAAAABAAEAAAABAAEAAAABAAIAAAABAAIAAAABAAMAAAABAAMAAAACAAAAAAACAAAAAAACAAEAAAACAAEAAAACAAIAAAACAAIAAAACAAMAAAACAAMAAAADAAAAAAADAAAAAAADAAEAAAADAAEAAAADAAIAAAADAAIAAAADAAMAAAADAAMAAAAEAAAAAAAAAAAAAAAEAAEAAAAAAAEAAAAEAAIAAAAAAAIAAAAEAAMAAAAAAAMAAAAFAAAAAAABAAAAAAAFAAEAAAABAAEAAAAFAAIAAAABAAIAAAAFAAMAAAABAAMAAAAGAAAAAAACAAAAAAAGAAEAAAACAAEAAAAGAAIAAAACAAIAAAAGAAMAAAACAAMAAAAHAAAAAAADAAAAAAAHAAEAAAADAAEAAAAHAAIAAAADAAIAAAAHAAMAAAADAAMAAAAIAAAAAAAAAAAAAAAIAAEAAAAAAAEAAAAIAAIAAAAAAAIAAAAIAAMAAAAAAAMAAAAJAAAAAAABAAAAAAAJAAEAAAABAAEAAAAJAAIAAAABAAIAAAAJAAMAAAABAAMAAAAKAAAAAAACAAAAAAAKAAEAAAACAAEAAAAKAAIAAAACAAIAAAAKAAMAAAACAAMAAAALAAAAAAADAAAAAAALAAEAAAADAAEAAAALAAIAAAADAAIAAAALAAMAAAADAAMAAAAMAAAAAAAAAAAAAAAMAAEAAAAAAAEAAAAMAAIAAAAAAAIAAAAMAAMAAAAAAAMAAAANAAAAAAABAAAAAAANAAEAAAABAAEAAAANAAIAAAABAAIAAAANAAMAAAABAAMAAAAOAAAAAAACAAAAAAAOAAEAAAACAAEAAAAOAAIAAAACAAIAAAAOAAMAAAACAAMAAAAPAAAAAAADAAAAAAAPAAEAAAADAAEAAAAPAAIAAAADAAIAAAAPAAMAAAADAAMAAAAQAAAAAAAAAAAAAAAQAAEAAAAAAAEAAAAQAAIAAAAAAAIAAAAQAAMAAAAAAAMAAAARAAAAAAABAAAAAAARAAEAAAABAAEAAAARAAIAAAABAAIAAAARAAMAAAABAAMAAAASAAAAAAACAAAAAAASAAEAAAACAAEAAAASAAIAAAACAAIAAAASAAMAAAACAAMAAAATAAAAAAADAAAAAAATAAEAAAADAAEAAAATAAIAAAADAAIAAAATAAMAAAADAAMAAAAUAAAAAAAAAAAAAAAUAAEAAAAAAAEAAAAUAAIAAAAAAAIAAAAUAAMAAAAAAAMAAAAVAAAAAAABAAAAAAAVAAEAAAABAAEAAAAVAAIAAAABAAIAAAAVAAMAAAABAAMAAAAWAAAAAAACAAAAAAAWAAEAAAACAAEAAAAWAAIAAAACAAIAAAAWAAMAAAACAAMAAAAXAAAAAAADAAAAAAAXAAEAAAADAAEAAAAXAAIAAAADAAIAAAAXAAMAAAADAAMAAAAYAAAAAAAAAAAAAAAYAAEAAAAAAAEAAAAYAAIAAAAAAAIAAAAYAAMAAAAAAAMAAAAZAAAAAAABAAAAAAAZAAEAAAABAAEAAAAZAAIAAAABAAIAAAAZAAMAAAABAAMAAAAaAAAAAAACAAAAAAAaAAEAAAACAAEAAAAaAAIAAAACAAIAAAAaAAMAAAACAAMAAAAbAAAAAAADAAAAAAAbAAEAAAADAAEAAAAbAAIAAAADAAIAAAAbAAMAAAADAAMAAAAcAAAAAAAAAAAAAAAcAAEAAAAAAAEAAAAcAAIAAAAAAAIAAAAcAAMAAAAAAAMAAAAdAAAAAAABAAAAAAAdAAEAAAABAAEAAAAdAAIAAAABAAIAAAAdAAMAAAABAAMAAAAAAAQAAAAAAAAAAAAAAAUAAAAAAAEAAAAAAAYAAAAAAAIAAAAAAAcAAAAAAAMAAAABAAQAAAABAAAAAAABAAUAAAABAAEAAAABAAYAAAABAAIAAAABAAcAAAABAAMAAAACAAQAAAACAAAAAAACAAUAAAACAAEAAAACAAYAAAACAAIAAAACAAcAAAACAAMAAAADAAQAAAADAAAAAAADAAUAAAADAAEAAAADAAYAAAADAAIAAAADAAcAAAADAAMAAAAAAAgAAAAAAAAAAAAAAAkAAAAAAAEAAAAAAAoAAAAAAAIAAAAAAAsAAAAAAAMAAAABAAgAAAABAAAAAAABAAkAAAABAAEAAAABAAoAAAABAAIAAAABAAsAAAABAAMAAAACAAgAAAACAAAAAAACAAkAAAACAAEAAAACAAoAAAACAAIAAAACAAsAAAACAAMAAAADAAgAAAADAAAAAAADAAkAAAADAAEAAAADAAoAAAADAAIAAAADAAsAAAADAAMAAAAAAAwAAAAAAAAAAAAAAA0AAAAAAAEAAAAAAA4AAAAAAAIAAAAAAA8AAAAAAAMAAAABAAwAAAABAAAAAAABAA0AAAABAAEAAAABAA4AAAABAAIAAAABAA8AAAABAAMAAAACAAwAAAACAAAAAAACAA0AAAACAAEAAAACAA4AAAACAAIAAAACAA8AAAACAAMAAAADAAwAAAADAAAAAAADAA0AAAADAAEAAAADAA4AAAADAAIAAAADAA8AAAADAAMAAAAAABAAAAAAAAAAAAAAABEAAAAAAAEAAAAAABIAAAAAAAIAAAAAABMAAAAAAAMAAAABABAAAAABAAAAAAABABEAAAABAAEAAAABABIAAAABAAIAAAABABMAAAABAAMAAAACABAAAAACAAAAAAACABEAAAACAAEAAAACABIAAAACAAIAAAACABMAAAACAAMAAAADABAAAAADAAAAAAADABEAAAADAAEAAAADABIAAAADAAIAAAADABMAAAADAAMAAAAEAAQAAAAAAAAAAAAEAAUAAAAAAAEAAAAEAAYAAAAAAAIAAAAEAAcAAAAAAAMAAAAFAAQAAAABAAAAAAAFAAUAAAABAAEAAAAFAAYAAAABAAIAAAAFAAcAAAABAAMAAAAGAAQAAAACAAAAAAAGAAUAAAACAAEAAAAGAAYAAAACAAIAAAAGAAcAAAACAAMAAAAHAAQAAAADAAAAAAAHAAUAAAADAAEAAAAHAAYAAAADAAIAAAAHAAcAAAADAAMAAAAEAAgAAAAAAAAAAAAEAAkAAAAAAAEAAAAEAAoAAAAAAAIAAAAEAAsAAAAAAAMAAAAFAAgAAAABAAAAAAAFAAkAAAABAAEAAAAFAAoAAAABAAIAAAAFAAsAAAABAAMAAAAGAAgAAAACAAAAAAAGAAkAAAACAAEAAAAGAAoAAAACAAIAAAAGAAsAAAACAAMAAAAHAAgAAAADAAAAAAAHAAkAAAADAAEAAAAHAAoAAAADAAIAAAAHAAsAAAADAAMAAAAEAAwAAAAAAAAAAAAEAA0AAAAAAAEAAAAEAA4AAAAAAAIAAAAEAA8AAAAAAAMAAAAFAAwAAAABAAAAAAAFAA0AAAABAAEAAAAFAA4AAAABAAIAAAAFAA8AAAABAAMAAAAGAAwAAAACAAAAAAAGAA0AAAACAAEAAAAGAA4AAAACAAIAAAAGAA8AAAACAAMAAAAHAAwAAAADAAAAAAAHAA0AAAADAAEAAAAHAA4AAAADAAIAAAAHAA8AAAADAAMAAAAEABAAAAAAAAAAAAAEABEAAAAAAAEAAAAEABIAAAAAAAIAAAAEABMAAAAAAAMAAAAFABAAAAABAAAAAAAFABEAAAABAAEAAAAFABIAAAABAAIAAAAFABMAAAABAAMAAAAGABAAAAACAAAAAAAGABEAAAACAAEAAAAGABIAAAACAAIAAAAGABMAAAACAAMAAAAHABAAAAADAAAAAAAHABEAAAADAAEAAAAHABIAAAADAAIAAAAHABMAAAADAAMAAAAIAAQAAAAAAAAAAAAIAAUAAAAAAAEAAAAIAAYAAAAAAAIAAAAIAAcAAAAAAAMAAAAJAAQAAAABAAAAAAAJAAUAAAABAAEAAAAJAAYAAAABAAIAAAAJAAcAAAABAAMAAAAKAAQAAAACAAAAAAAKAAUAAAACAAEAAAAKAAYAAAACAAIAAAAKAAcAAAACAAMAAAALAAQAAAADAAAAAAALAAUAAAADAAEAAAALAAYAAAADAAIAAAALAAcAAAADAAMAAAAIAAgAAAAAAAAAAAAIAAkAAAAAAAEAAAAIAAoAAAAAAAIAAAAIAAsAAAAAAAMAAAAJAAgAAAABAAAAAAAJAAkAAAABAAEAAAAJAAoAAAABAAIAAAAJAAsAAAABAAMAAAAKAAgAAAACAAAAAAAKAAkAAAACAAEAAAAKAAoAAAACAAIAAAAKAAsAAAACAAMAAAALAAgAAAADAAAAAAALAAkAAAADAAEAAAALAAoAAAADAAIAAAALAAsAAAADAAMAAAAIAAwAAAAAAAAAAAAIAA0AAAAAAAEAAAAIAA4AAAAAAAIAAAAIAA8AAAAAAAMAAAAJAAwAAAABAAAAAAAJAA0AAAABAAEAAAAJAA4AAAABAAIAAAAJAA8AAAABAAMAAAAKAAwAAAACAAAAAAAKAA0AAAACAAEAAAAKAA4AAAACAAIAAAAKAA8AAAACAAMAAAALAAwAAAADAAAAAAALAA0AAAADAAEAAAALAA4AAAADAAIAAAALAA8AAAADAAMAAAAIABAAAAAAAAAAAAAIABEAAAAAAAEAAAAIABIAAAAAAAIAAAAIABMAAAAAAAMAAAAJABAAAAABAAAAAAAJABEAAAABAAEAAAAJABIAAAABAAIAAAAJABMAAAABAAMAAAAKABAAAAACAAAAAAAKABEAAAACAAEAAAAKABIAAAACAAIAAAAKABMAAAACAAMAAAALABAAAAADAAAAAAALABEAAAADAAEAAAALABIAAAADAAIAAAALABMAAAADAAMAAAAMAAQAAAAAAAAAAAAMAAUAAAAAAAEAAAAMAAYAAAAAAAIAAAAMAAcAAAAAAAMAAAANAAQAAAABAAAAAAANAAUAAAABAAEAAAANAAYAAAABAAIAAAANAAcAAAABAAMAAAAOAAQAAAACAAAAAAAOAAUAAAACAAEAAAAOAAYAAAACAAIAAAAOAAcAAAACAAMAAAAPAAQAAAADAAAAAAAPAAUAAAADAAEAAAAPAAYAAAADAAIAAAAPAAcAAAADAAMAAAAMAAgAAAAAAAAAAAAMAAkAAAAAAAEAAAAMAAoAAAAAAAIAAAAMAAsAAAAAAAMAAAANAAgAAAABAAAAAAANAAkAAAABAAEAAAANAAoAAAABAAIAAAANAAsAAAABAAMAAAAOAAgAAAACAAAAAAAOAAkAAAACAAEAAAAOAAoAAAACAAIAAAAOAAsAAAACAAMAAAAPAAgAAAADAAAAAAAPAAkAAAADAAEAAAAPAAoAAAADAAIAAAAPAAsAAAADAAMAAAAMAAwAAAAAAAAAAAAMAA0AAAAAAAEAAAAMAA4AAAAAAAIAAAAMAA8AAAAAAAMAAAANAAwAAAABAAAAAAANAA0AAAABAAEAAAANAA4AAAABAAIAAAANAA8AAAABAAMAAAAOAAwAAAACAAAAAAAOAA0AAAACAAEAAAAOAA4AAAACAAIAAAAOAA8AAAACAAMAAAAPAAwAAAADAAAAAAAPAA0AAAADAAEAAAAPAA4AAAADAAIAAAAPAA8AAAADAAMAAAAMABAAAAAAAAAAAAAMABEAAAAAAAEAAAAMABIAAAAAAAIAAAAMABMAAAAAAAMAAAANABAAAAABAAAAAAANABEAAAABAAEAAAANABIAAAABAAIAAAANABMAAAABAAMAAAAOABAAAAACAAAAAAAOABEAAAACAAEAAAAOABIAAAACAAIAAAAOABMAAAACAAMAAAAPABAAAAADAAAAAAAPABEAAAADAAEAAAAPABIAAAADAAIAAAAPABMAAAADAAMAAAAQAAQAAAAAAAAAAAAQAAUAAAAAAAEAAAAQAAYAAAAAAAIAAAAQAAcAAAAAAAMAAAARAAQAAAABAAAAAAARAAUAAAABAAEAAAARAAYAAAABAAIAAAARAAcAAAABAAMAAAASAAQAAAACAAAAAAASAAUAAAACAAEAAAASAAYAAAACAAIAAAASAAcAAAACAAMAAAATAAQAAAADAAAAAAATAAUAAAADAAEAAAATAAYAAAADAAIAAAATAAcAAAADAAMAAAAQAAgAAAAAAAAAAAAQAAkAAAAAAAEAAAAQAAoAAAAAAAIAAAAQAAsAAAAAAAMAAAARAAgAAAABAAAAAAARAAkAAAABAAEAAAARAAoAAAABAAIAAAARAAsAAAABAAMAAAASAAgAAAACAAAAAAASAAkAAAACAAEAAAASAAoAAAACAAIAAAASAAsAAAACAAMAAAATAAgAAAADAAAAAAATAAkAAAADAAEAAAATAAoAAAADAAIAAAATAAsAAAADAAMAAAAQAAwAAAAAAAAAAAAQAA0AAAAAAAEAAAAQAA4AAAAAAAIAAAAQAA8AAAAAAAMAAAARAAwAAAABAAAAAAARAA0AAAABAAEAAAARAA4AAAABAAIAAAARAA8AAAABAAMAAAASAAwAAAACAAAAAAASAA0AAAACAAEAAAASAA4AAAACAAIAAAASAA8AAAACAAMAAAATAAwAAAADAAAAAAATAA0AAAADAAEAAAATAA4AAAADAAIAAAATAA8AAAADAAMAAAAQABAAAAAAAAAAAAAQABEAAAAAAAEAAAAQABIAAAAAAAIAAAAQABMAAAAAAAMAAAARABAAAAABAAAAAAARABEAAAABAAEAAAARABIAAAABAAIAAAARABMAAAABAAMAAAASABAAAAACAAAAAAASABEAAAACAAEAAAASABIAAAACAAIAAAASABMAAAACAAMAAAATABAAAAADAAAAAAATABEAAAADAAEAAAATABIAAAADAAIAAAATABMAAAADAAMAAAAUAAQAAAAAAAAAAAAUAAUAAAAAAAEAAAAUAAYAAAAAAAIAAAAUAAcAAAAAAAMAAAAVAAQAAAABAAAAAAAVAAUAAAABAAEAAAAVAAYAAAABAAIAAAAVAAcAAAABAAMAAAAWAAQAAAACAAAAAAAWAAUAAAACAAEAAAAWAAYAAAACAAIAAAAWAAcAAAACAAMAAAAXAAQAAAADAAAAAAAXAAUAAAADAAEAAAAXAAYAAAADAAIAAAAXAAcAAAADAAMAAAAUAAgAAAAAAAAAAAAUAAkAAAAAAAEAAAAUAAoAAAAAAAIAAAAUAAsAAAAAAAMAAAAVAAgAAAABAAAAAAAVAAkAAAABAAEAAAAVAAoAAAABAAIAAAAVAAsAAAABAAMAAAAWAAgAAAACAAAAAAAWAAkAAAACAAEAAAAWAAoAAAACAAIAAAAWAAsAAAACAAMAAAAXAAgAAAADAAAAAAAXAAkAAAADAAEAAAAXAAoAAAADAAIAAAAXAAsAAAADAAMAAAAUAAwAAAAAAAAAAAAUAA0AAAAAAAEAAAAUAA4AAAAAAAIAAAAUAA8AAAAAAAMAAAAVAAwAAAABAAAAAAAVAA0AAAABAAEAAAAVAA4AAAABAAIAAAAVAA8AAAABAAMAAAAWAAwAAAACAAAAAAAWAA0AAAACAAEAAAAWAA4AAAACAAIAAAAWAA8AAAACAAMAAAAXAAwAAAADAAAAAAAXAA0AAAADAAEAAAAXAA4AAAADAAIAAAAXAA8AAAADAAMAAAAUABAAAAAAAAAAAAAUABEAAAAAAAEAAAAUABIAAAAAAAIAAAAUABMAAAAAAAMAAAAVABAAAAABAAAAAAAVABEAAAABAAEAAAAVABIAAAABAAIAAAAVABMAAAABAAMAAAAWABAAAAACAAAAAAAWABEAAAACAAEAAAAWABIAAAACAAIAAAAWABMAAAACAAMAAAAXABAAAAADAAAAAAAXABEAAAADAAEAAAAXABIAAAADAAIAAAAXABMAAAADAAMAAAAYAAQAAAAAAAAAAAAYAAUAAAAAAAEAAAAYAAYAAAAAAAIAAAAYAAcAAAAAAAMAAAAZAAQAAAABAAAAAAAZAAUAAAABAAEAAAAZAAYAAAABAAIAAAAZAAcAAAABAAMAAAAaAAQAAAACAAAAAAAaAAUAAAACAAEAAAAaAAYAAAACAAIAAAAaAAcAAAACAAMAAAAbAAQAAAADAAAAAAAbAAUAAAADAAEAAAAbAAYAAAADAAIAAAAbAAcAAAADAAMAAAAYAAgAAAAAAAAAAAAYAAkAAAAAAAEAAAAYAAoAAAAAAAIAAAAYAAsAAAAAAAMAAAAZAAgAAAABAAAAAAAZAAkAAAABAAEAAAAZAAoAAAABAAIAAAAZAAsAAAABAAMAAAAaAAgAAAACAAAAAAAaAAkAAAACAAEAAAAaAAoAAAACAAIAAAAaAAsAAAACAAMAAAAbAAgAAAADAAAAAAAbAAkAAAADAAEAAAAbAAoAAAADAAIAAAAbAAsAAAADAAMAAAAYAAwAAAAAAAAAAAAYAA0AAAAAAAEAAAAYAA4AAAAAAAIAAAAYAA8AAAAAAAMAAAAZAAwAAAABAAAAAAAZAA0AAAABAAEAAAAZAA4AAAABAAIAAAAZAA8AAAABAAMAAAAaAAwAAAACAAAAAAAaAA0AAAACAAEAAAAaAA4AAAACAAIAAAAaAA8AAAACAAMAAAAbAAwAAAADAAAAAAAbAA0AAAADAAEAAAAbAA4AAAADAAIAAAAbAA8AAAADAAMAAAAYABAAAAAAAAAAAAAYABEAAAAAAAEAAAAYABIAAAAAAAIAAAAYABMAAAAAAAMAAAAZABAAAAABAAAAAAAZABEAAAABAAEAAAAZABIAAAABAAIAAAAZABMAAAABAAMAAAAaABAAAAACAAAAAAAaABEAAAACAAEAAAAaABIAAAACAAIAAAAaABMAAAACAAMAAAAbABAAAAADAAAAAAAbABEAAAADAAEAAAAbABIAAAADAAIAAAAbABMAAAADAAMAAAAcAAQAAAAAAAAAAAAcAAUAAAAAAAEAAAAcAAYAAAAAAAIAAAAcAAcAAAAAAAMAAAAdAAQAAAABAAAAAAAdAAUAAAABAAEAAAAdAAYAAAABAAIAAAAdAAcAAAABAAMAAAAcAAgAAAAAAAAAAAAcAAkAAAAAAAEAAAAcAAoAAAAAAAIAAAAcAAsAAAAAAAMAAAAdAAgAAAABAAAAAAAdAAkAAAABAAEAAAAdAAoAAAABAAIAAAAdAAsAAAABAAMAAAAcAAwAAAAAAAAAAAAcAA0AAAAAAAEAAAAcAA4AAAAAAAIAAAAcAA8AAAAAAAMAAAAdAAwAAAABAAAAAAAdAA0AAAABAAEAAAAdAA4AAAABAAIAAAAdAA8AAAABAAMAAAAcABAAAAAAAAAAAAAcABEAAAAAAAEAAAAcABIAAAAAAAIAAAAcABMAAAAAAAMAAAAdABAAAAABAAAAAAAdABEAAAABAAEAAAAdABIAAAABAAIAAAAdABMAAAABAAMAAADi/wQAAAACAAAAAADi/wUAAAACAAEAAADi/wYAAAACAAIAAADi/wcAAAACAAMAAADj/wQAAAADAAAAAADj/wUAAAADAAEAAADj/wYAAAADAAIAAADj/wcAAAADAAMAAADi/wgAAAACAAAAAADi/wkAAAACAAEAAADi/woAAAACAAIAAADi/wsAAAACAAMAAADj/wgAAAADAAAAAADj/wkAAAADAAEAAADj/woAAAADAAIAAADj/wsAAAADAAMAAADi/wwAAAACAAAAAADi/w0AAAACAAEAAADi/w4AAAACAAIAAADi/w8AAAACAAMAAADj/wwAAAADAAAAAADj/w0AAAADAAEAAADj/w4AAAADAAIAAADj/w8AAAADAAMAAADi/xAAAAACAAAAAADi/xEAAAACAAEAAADi/xIAAAACAAIAAADi/xMAAAACAAMAAADj/xAAAAADAAAAAADj/xEAAAADAAEAAADj/xIAAAADAAIAAADj/xMAAAADAAMAAADk/wQAAAAAAAAAAADk/wUAAAAAAAEAAADk/wYAAAAAAAIAAADk/wcAAAAAAAMAAADl/wQAAAABAAAAAADl/wUAAAABAAEAAADl/wYAAAABAAIAAADl/wcAAAABAAMAAADm/wQAAAACAAAAAADm/wUAAAACAAEAAADm/wYAAAACAAIAAADm/wcAAAACAAMAAADn/wQAAAADAAAAAADn/wUAAAADAAEAAADn/wYAAAADAAIAAADn/wcAAAADAAMAAADk/wgAAAAAAAAAAADk/wkAAAAAAAEAAADk/woAAAAAAAIAAADk/wsAAAAAAAMAAADl/wgAAAABAAAAAADl/wkAAAABAAEAAADl/woAAAABAAIAAADl/wsAAAABAAMAAADm/wgAAAACAAAAAADm/wkAAAACAAEAAADm/woAAAACAAIAAADm/wsAAAACAAMAAADn/wgAAAADAAAAAADn/wkAAAADAAEAAADn/woAAAADAAIAAADn/wsAAAADAAMAAADk/wwAAAAAAAAAAADk/w0AAAAAAAEAAADk/w4AAAAAAAIAAADk/w8AAAAAAAMAAADl/wwAAAABAAAAAADl/w0AAAABAAEAAADl/w4AAAABAAIAAADl/w8AAAABAAMAAADm/wwAAAACAAAAAADm/w0AAAACAAEAAADm/w4AAAACAAIAAADm/w8AAAACAAMAAADn/wwAAAADAAAAAADn/w0AAAADAAEAAADn/w4AAAADAAIAAADn/w8AAAADAAMAAADk/xAAAAAAAAAAAADk/xEAAAAAAAEAAADk/xIAAAAAAAIAAADk/xMAAAAAAAMAAADl/xAAAAABAAAAAADl/xEAAAABAAEAAADl/xIAAAABAAIAAADl/xMAAAABAAMAAADm/xAAAAACAAAAAADm/xEAAAACAAEAAADm/xIAAAACAAIAAADm/xMAAAACAAMAAADn/xAAAAADAAAAAADn/xEAAAADAAEAAADn/xIAAAADAAIAAADn/xMAAAADAAMAAADo/wQAAAAAAAAAAADo/wUAAAAAAAEAAADo/wYAAAAAAAIAAADo/wcAAAAAAAMAAADp/wQAAAABAAAAAADp/wUAAAABAAEAAADp/wYAAAABAAIAAADp/wcAAAABAAMAAADq/wQAAAACAAAAAADq/wUAAAACAAEAAADq/wYAAAACAAIAAADq/wcAAAACAAMAAADr/wQAAAADAAAAAADr/wUAAAADAAEAAADr/wYAAAADAAIAAADr/wcAAAADAAMAAADo/wgAAAAAAAAAAADo/wkAAAAAAAEAAADo/woAAAAAAAIAAADo/wsAAAAAAAMAAADp/wgAAAABAAAAAADp/wkAAAABAAEAAADp/woAAAABAAIAAADp/wsAAAABAAMAAADq/wgAAAACAAAAAADq/wkAAAACAAEAAADq/woAAAACAAIAAADq/wsAAAACAAMAAADr/wgAAAADAAAAAADr/wkAAAADAAEAAADr/woAAAADAAIAAADr/wsAAAADAAMAAADo/wwAAAAAAAAAAADo/w0AAAAAAAEAAADo/w4AAAAAAAIAAADo/w8AAAAAAAMAAADp/wwAAAABAAAAAADp/w0AAAABAAEAAADp/w4AAAABAAIAAADp/w8AAAABAAMAAADq/wwAAAACAAAAAADq/w0AAAACAAEAAADq/w4AAAACAAIAAADq/w8AAAACAAMAAADr/wwAAAADAAAAAADr/w0AAAADAAEAAADr/w4AAAADAAIAAADr/w8AAAADAAMAAADo/xAAAAAAAAAAAADo/xEAAAAAAAEAAADo/xIAAAAAAAIAAADo/xMAAAAAAAMAAADp/xAAAAABAAAAAADp/xEAAAABAAEAAADp/xIAAAABAAIAAADp/xMAAAABAAMAAADq/xAAAAACAAAAAADq/xEAAAACAAEAAADq/xIAAAACAAIAAADq/xMAAAACAAMAAADr/xAAAAADAAAAAADr/xEAAAADAAEAAADr/xIAAAADAAIAAADr/xMAAAADAAMAAADs/wQAAAAAAAAAAADs/wUAAAAAAAEAAADs/wYAAAAAAAIAAADs/wcAAAAAAAMAAADt/wQAAAABAAAAAADt/wUAAAABAAEAAADt/wYAAAABAAIAAADt/wcAAAABAAMAAADu/wQAAAACAAAAAADu/wUAAAACAAEAAADu/wYAAAACAAIAAADu/wcAAAACAAMAAADv/wQAAAADAAAAAADv/wUAAAADAAEAAADv/wYAAAADAAIAAADv/wcAAAADAAMAAADs/wgAAAAAAAAAAADs/wkAAAAAAAEAAADs/woAAAAAAAIAAADs/wsAAAAAAAMAAADt/wgAAAABAAAAAADt/wkAAAABAAEAAADt/woAAAABAAIAAADt/wsAAAABAAMAAADu/wgAAAACAAAAAADu/wkAAAACAAEAAADu/woAAAACAAIAAADu/wsAAAACAAMAAADv/wgAAAADAAAAAADv/wkAAAADAAEAAADv/woAAAADAAIAAADv/wsAAAADAAMAAADs/wwAAAAAAAAAAADs/w0AAAAAAAEAAADs/w4AAAAAAAIAAADs/w8AAAAAAAMAAADt/wwAAAABAAAAAADt/w0AAAABAAEAAADt/w4AAAABAAIAAADt/w8AAAABAAMAAADu/wwAAAACAAAAAADu/w0AAAACAAEAAADu/w4AAAACAAIAAADu/w8AAAACAAMAAADv/wwAAAADAAAAAADv/w0AAAADAAEAAADv/w4AAAADAAIAAADv/w8AAAADAAMAAADs/xAAAAAAAAAAAADs/xEAAAAAAAEAAADs/xIAAAAAAAIAAADs/xMAAAAAAAMAAADt/xAAAAABAAAAAADt/xEAAAABAAEAAADt/xIAAAABAAIAAADt/xMAAAABAAMAAADu/xAAAAACAAAAAADu/xEAAAACAAEAAADu/xIAAAACAAIAAADu/xMAAAACAAMAAADv/xAAAAADAAAAAADv/xEAAAADAAEAAADv/xIAAAADAAIAAADv/xMAAAADAAMAAADw/wQAAAAAAAAAAADw/wUAAAAAAAEAAADw/wYAAAAAAAIAAADw/wcAAAAAAAMAAADx/wQAAAABAAAAAADx/wUAAAABAAEAAADx/wYAAAABAAIAAADx/wcAAAABAAMAAADy/wQAAAACAAAAAADy/wUAAAACAAEAAADy/wYAAAACAAIAAADy/wcAAAACAAMAAADz/wQAAAADAAAAAADz/wUAAAADAAEAAADz/wYAAAADAAIAAADz/wcAAAADAAMAAADw/wgAAAAAAAAAAADw/wkAAAAAAAEAAADw/woAAAAAAAIAAADw/wsAAAAAAAMAAADx/wgAAAABAAAAAADx/wkAAAABAAEAAADx/woAAAABAAIAAADx/wsAAAABAAMAAADy/wgAAAACAAAAAADy/wkAAAACAAEAAADy/woAAAACAAIAAADy/wsAAAACAAMAAADz/wgAAAADAAAAAADz/wkAAAADAAEAAADz/woAAAADAAIAAADz/wsAAAADAAMAAADw/wwAAAAAAAAAAADw/w0AAAAAAAEAAADw/w4AAAAAAAIAAADw/w8AAAAAAAMAAADx/wwAAAABAAAAAADx/w0AAAABAAEAAADx/w4AAAABAAIAAADx/w8AAAABAAMAAADy/wwAAAACAAAAAADy/w0AAAACAAEAAADy/w4AAAACAAIAAADy/w8AAAACAAMAAADz/wwAAAADAAAAAADz/w0AAAADAAEAAADz/w4AAAADAAIAAADz/w8AAAADAAMAAADw/xAAAAAAAAAAAADw/xEAAAAAAAEAAADw/xIAAAAAAAIAAADw/xMAAAAAAAMAAADx/xAAAAABAAAAAADx/xEAAAABAAEAAADx/xIAAAABAAIAAADx/xMAAAABAAMAAADy/xAAAAACAAAAAADy/xEAAAACAAEAAADy/xIAAAACAAIAAADy/xMAAAACAAMAAADz/xAAAAADAAAAAADz/xEAAAADAAEAAADz/xIAAAADAAIAAADz/xMAAAADAAMAAAD0/wQAAAAAAAAAAAD0/wUAAAAAAAEAAAD0/wYAAAAAAAIAAAD0/wcAAAAAAAMAAAD1/wQAAAABAAAAAAD1/wUAAAABAAEAAAD1/wYAAAABAAIAAAD1/wcAAAABAAMAAAD2/wQAAAACAAAAAAD2/wUAAAACAAEAAAD2/wYAAAACAAIAAAD2/wcAAAACAAMAAAD3/wQAAAADAAAAAAD3/wUAAAADAAEAAAD3/wYAAAADAAIAAAD3/wcAAAADAAMAAAD0/wgAAAAAAAAAAAD0/wkAAAAAAAEAAAD0/woAAAAAAAIAAAD0/wsAAAAAAAMAAAD1/wgAAAABAAAAAAD1/wkAAAABAAEAAAD1/woAAAABAAIAAAD1/wsAAAABAAMAAAD2/wgAAAACAAAAAAD2/wkAAAACAAEAAAD2/woAAAACAAIAAAD2/wsAAAACAAMAAAD3/wgAAAADAAAAAAD3/wkAAAADAAEAAAD3/woAAAADAAIAAAD3/wsAAAADAAMAAAD0/wwAAAAAAAAAAAD0/w0AAAAAAAEAAAD0/w4AAAAAAAIAAAD0/w8AAAAAAAMAAAD1/wwAAAABAAAAAAD1/w0AAAABAAEAAAD1/w4AAAABAAIAAAD1/w8AAAABAAMAAAD2/wwAAAACAAAAAAD2/w0AAAACAAEAAAD2/w4AAAACAAIAAAD2/w8AAAACAAMAAAD3/wwAAAADAAAAAAD3/w0AAAADAAEAAAD3/w4AAAADAAIAAAD3/w8AAAADAAMAAAD0/xAAAAAAAAAAAAD0/xEAAAAAAAEAAAD0/xIAAAAAAAIAAAD0/xMAAAAAAAMAAAD1/xAAAAABAAAAAAD1/xEAAAABAAEAAAD1/xIAAAABAAIAAAD1/xMAAAABAAMAAAD2/xAAAAACAAAAAAD2/xEAAAACAAEAAAD2/xIAAAACAAIAAAD2/xMAAAACAAMAAAD3/xAAAAADAAAAAAD3/xEAAAADAAEAAAD3/xIAAAADAAIAAAD3/xMAAAADAAMAAAD4/wQAAAAAAAAAAAD4/wUAAAAAAAEAAAD4/wYAAAAAAAIAAAD4/wcAAAAAAAMAAAD5/wQAAAABAAAAAAD5/wUAAAABAAEAAAD5/wYAAAABAAIAAAD5/wcAAAABAAMAAAD6/wQAAAACAAAAAAD6/wUAAAACAAEAAAD6/wYAAAACAAIAAAD6/wcAAAACAAMAAAD7/wQAAAADAAAAAAD7/wUAAAADAAEAAAD7/wYAAAADAAIAAAD7/wcAAAADAAMAAAD4/wgAAAAAAAAAAAD4/wkAAAAAAAEAAAD4/woAAAAAAAIAAAD4/wsAAAAAAAMAAAD5/wgAAAABAAAAAAD5/wkAAAABAAEAAAD5/woAAAABAAIAAAD5/wsAAAABAAMAAAD6/wgAAAACAAAAAAD6/wkAAAACAAEAAAD6/woAAAACAAIAAAD6/wsAAAACAAMAAAD7/wgAAAADAAAAAAD7/wkAAAADAAEAAAD7/woAAAADAAIAAAD7/wsAAAADAAMAAAD4/wwAAAAAAAAAAAD4/w0AAAAAAAEAAAD4/w4AAAAAAAIAAAD4/w8AAAAAAAMAAAD5/wwAAAABAAAAAAD5/w0AAAABAAEAAAD5/w4AAAABAAIAAAD5/w8AAAABAAMAAAD6/wwAAAACAAAAAAD6/w0AAAACAAEAAAD6/w4AAAACAAIAAAD6/w8AAAACAAMAAAD7/wwAAAADAAAAAAD7/w0AAAADAAEAAAD7/w4AAAADAAIAAAD7/w8AAAADAAMAAAD4/xAAAAAAAAAAAAD4/xEAAAAAAAEAAAD4/xIAAAAAAAIAAAD4/xMAAAAAAAMAAAD5/xAAAAABAAAAAAD5/xEAAAABAAEAAAD5/xIAAAABAAIAAAD5/xMAAAABAAMAAAD6/xAAAAACAAAAAAD6/xEAAAACAAEAAAD6/xIAAAACAAIAAAD6/xMAAAACAAMAAAD7/xAAAAADAAAAAAD7/xEAAAADAAEAAAD7/xIAAAADAAIAAAD7/xMAAAADAAMAAAD8/wQAAAAAAAAAAAD8/wUAAAAAAAEAAAD8/wYAAAAAAAIAAAD8/wcAAAAAAAMAAAD9/wQAAAABAAAAAAD9/wUAAAABAAEAAAD9/wYAAAABAAIAAAD9/wcAAAABAAMAAAD+/wQAAAACAAAAAAD+/wUAAAACAAEAAAD+/wYAAAACAAIAAAD+/wcAAAACAAMAAAD//wQAAAADAAAAAAD//wUAAAADAAEAAAD//wYAAAADAAIAAAD//wcAAAADAAMAAAD8/wgAAAAAAAAAAAD8/wkAAAAAAAEAAAD8/woAAAAAAAIAAAD8/wsAAAAAAAMAAAD9/wgAAAABAAAAAAD9/wkAAAABAAEAAAD9/woAAAABAAIAAAD9/wsAAAABAAMAAAD+/wgAAAACAAAAAAD+/wkAAAACAAEAAAD+/woAAAACAAIAAAD+/wsAAAACAAMAAAD//wgAAAADAAAAAAD//wkAAAADAAEAAAD//woAAAADAAIAAAD//wsAAAADAAMAAAD8/wwAAAAAAAAAAAD8/w0AAAAAAAEAAAD8/w4AAAAAAAIAAAD8/w8AAAAAAAMAAAD9/wwAAAABAAAAAAD9/w0AAAABAAEAAAD9/w4AAAABAAIAAAD9/w8AAAABAAMAAAD+/wwAAAACAAAAAAD+/w0AAAACAAEAAAD+/w4AAAACAAIAAAD+/w8AAAACAAMAAAD//wwAAAADAAAAAAD//w0AAAADAAEAAAD//w4AAAADAAIAAAD//w8AAAADAAMAAAD8/xAAAAAAAAAAAAD8/xEAAAAAAAEAAAD8/xIAAAAAAAIAAAD8/xMAAAAAAAMAAAD9/xAAAAABAAAAAAD9/xEAAAABAAEAAAD9/xIAAAABAAIAAAD9/xMAAAABAAMAAAD+/xAAAAACAAAAAAD+/xEAAAACAAEAAAD+/xIAAAACAAIAAAD+/xMAAAACAAMAAAD//xAAAAADAAAAAAD//xEAAAADAAEAAAD//xIAAAADAAIAAAD//xMAAAADAAMAAAAAAPz/AAAAAAAAAAAAAP3/AAAAAAEAAAAAAP7/AAAAAAIAAAAAAP//AAAAAAMAAAABAPz/AAABAAAAAAABAP3/AAABAAEAAAABAP7/AAABAAIAAAABAP//AAABAAMAAAACAPz/AAACAAAAAAACAP3/AAACAAEAAAACAP7/AAACAAIAAAACAP//AAACAAMAAAADAPz/AAADAAAAAAADAP3/AAADAAEAAAADAP7/AAADAAIAAAADAP//AAADAAMAAAAAAPj/AAAAAAAAAAAAAPn/AAAAAAEAAAAAAPr/AAAAAAIAAAAAAPv/AAAAAAMAAAABAPj/AAABAAAAAAABAPn/AAABAAEAAAABAPr/AAABAAIAAAABAPv/AAABAAMAAAACAPj/AAACAAAAAAACAPn/AAACAAEAAAACAPr/AAACAAIAAAACAPv/AAACAAMAAAADAPj/AAADAAAAAAADAPn/AAADAAEAAAADAPr/AAADAAIAAAADAPv/AAADAAMAAAAAAPT/AAAAAAAAAAAAAPX/AAAAAAEAAAAAAPb/AAAAAAIAAAAAAPf/AAAAAAMAAAABAPT/AAABAAAAAAABAPX/AAABAAEAAAABAPb/AAABAAIAAAABAPf/AAABAAMAAAACAPT/AAACAAAAAAACAPX/AAACAAEAAAACAPb/AAACAAIAAAACAPf/AAACAAMAAAADAPT/AAADAAAAAAADAPX/AAADAAEAAAADAPb/AAADAAIAAAADAPf/AAADAAMAAAAAAPD/AAAAAAAAAAAAAPH/AAAAAAEAAAAAAPL/AAAAAAIAAAAAAPP/AAAAAAMAAAABAPD/AAABAAAAAAABAPH/AAABAAEAAAABAPL/AAABAAIAAAABAPP/AAABAAMAAAACAPD/AAACAAAAAAACAPH/AAACAAEAAAACAPL/AAACAAIAAAACAPP/AAACAAMAAAADAPD/AAADAAAAAAADAPH/AAADAAEAAAADAPL/AAADAAIAAAADAPP/AAADAAMAAAAAAOz/AAAAAAAAAAAAAO3/AAAAAAEAAAAAAO7/AAAAAAIAAAAAAO//AAAAAAMAAAABAOz/AAABAAAAAAABAO3/AAABAAEAAAABAO7/AAABAAIAAAABAO//AAABAAMAAAACAOz/AAACAAAAAAACAO3/AAACAAEAAAACAO7/AAACAAIAAAACAO//AAACAAMAAAADAOz/AAADAAAAAAADAO3/AAADAAEAAAADAO7/AAADAAIAAAADAO//AAADAAMAAAAAABQAAAAAAAAAAAAAABUAAAAAAAEAAAAAABYAAAAAAAIAAAAAABcAAAAAAAMAAAABABQAAAABAAAAAAABABUAAAABAAEAAAABABYAAAABAAIAAAABABcAAAABAAMAAAACABQAAAACAAAAAAACABUAAAACAAEAAAACABYAAAACAAIAAAACABcAAAACAAMAAAADABQAAAADAAAAAAADABUAAAADAAEAAAADABYAAAADAAIAAAADABcAAAADAAMAAAAAABgAAAAAAAAAAAABABgAAAABAAAAAAACABgAAAACAAAAAAADABgAAAADAAAAAAAEABQAAAAAAAAAAAAFABQAAAABAAAAAAAGABQAAAACAAAAAAAHABQAAAADAAAAAAAEABUAAAAAAAAAAAAFABUAAAABAAAAAAAGABUAAAACAAAAAAAHABUAAAADAAAAAAAEABYAAAAAAAAAAAAFABYAAAABAAAAAAAGABYAAAACAAAAAAAHABYAAAADAAAAAAAEABcAAAAAAAAAAAAFABcAAAABAAAAAAAGABcAAAACAAAAAAAHABcAAAADAAAAAAAEABgAAAAAAAAAAAAFABgAAAABAAAAAAAGABgAAAACAAAAAAAHABgAAAADAAAAAAAIABQAAAAAAAAAAAAJABQAAAABAAAAAAAKABQAAAACAAAAAAALABQAAAADAAAAAAAIABUAAAAAAAAAAAAJABUAAAABAAAAAAAKABUAAAACAAAAAAALABUAAAADAAAAAAAIABYAAAAAAAAAAAAJABYAAAABAAAAAAAKABYAAAACAAAAAAALABYAAAADAAAAAAAIABcAAAAAAAAAAAAJABcAAAABAAAAAAAKABcAAAACAAAAAAALABcAAAADAAAAAAAIABgAAAAAAAAAAAAJABgAAAABAAAAAAAKABgAAAACAAAAAAALABgAAAADAAAAAAAMABQAAAAAAAAAAAANABQAAAABAAAAAAAOABQAAAACAAAAAAAPABQAAAADAAAAAAAMABUAAAAAAAAAAAANABUAAAABAAAAAAAOABUAAAACAAAAAAAPABUAAAADAAAAAAAMABYAAAAAAAAAAAANABYAAAABAAAAAAAOABYAAAACAAAAAAAPABYAAAADAAAAAAAMABcAAAAAAAAAAAANABcAAAABAAAAAAAOABcAAAACAAAAAAAPABcAAAADAAAAAAAMABgAAAAAAAAAAAANABgAAAABAAAAAAAOABgAAAACAAAAAAAPABgAAAADAAAAAAAQABQAAAAAAAAAAAARABQAAAABAAAAAAASABQAAAACAAAAAAATABQAAAADAAAAAAAQABUAAAAAAAAAAAARABUAAAABAAAAAAASABUAAAACAAAAAAATABUAAAADAAAAAAAQABYAAAAAAAAAAAARABYAAAABAAAAAAASABYAAAACAAAAAAATABYAAAADAAAAAAAQABcAAAAAAAAAAAARABcAAAABAAAAAAASABcAAAACAAAAAAATABcAAAADAAAAAAAQABgAAAAAAAAAAAARABgAAAABAAAAAAASABgAAAACAAAAAAATABgAAAADAAAAAAAUABQAAAAAAAAAAAAVABQAAAABAAAAAAAWABQAAAACAAAAAAAXABQAAAADAAAAAAAUABUAAAAAAAAAAAAVABUAAAABAAAAAAAWABUAAAACAAAAAAAXABUAAAADAAAAAAAUABYAAAAAAAAAAAAVABYAAAABAAAAAAAWABYAAAACAAAAAAAXABYAAAADAAAAAAAUABcAAAAAAAAAAAAVABcAAAABAAAAAAAWABcAAAACAAAAAAAXABcAAAADAAAAAAAUABgAAAAAAAAAAAAVABgAAAABAAAAAAAWABgAAAACAAAAAAAXABgAAAADAAAAAAAYABQAAAAAAAAAAAAZABQAAAABAAAAAAAaABQAAAACAAAAAAAbABQAAAADAAAAAAAYABUAAAAAAAAAAAAZABUAAAABAAAAAAAaABUAAAACAAAAAAAbABUAAAADAAAAAAAYABYAAAAAAAAAAAAZABYAAAABAAAAAAAaABYAAAACAAAAAAAbABYAAAADAAAAAAAYABcAAAAAAAAAAAAZABcAAAABAAAAAAAaABcAAAACAAAAAAAbABcAAAADAAAAAAAYABgAAAAAAAAAAAAZABgAAAABAAAAAAAaABgAAAACAAAAAAAbABgAAAADAAAAAAAcABQAAAAAAAAAAAAdABQAAAABAAAAAAAcABUAAAAAAAAAAAAdABUAAAABAAAAAAAcABYAAAAAAAAAAAAdABYAAAABAAAAAAAcABcAAAAAAAAAAAAcABgAAAAAAAAAAADi/xQAAAACAAAAAADj/xQAAAADAAAAAADi/xUAAAACAAAAAADj/xUAAAADAAAAAADi/xYAAAACAAAAAADj/xYAAAADAAAAAADi/xcAAAACAAAAAADj/xcAAAADAAAAAADi/xgAAAACAAAAAADj/xgAAAADAAAAAADk/xQAAAAAAAAAAADl/xQAAAABAAAAAADm/xQAAAACAAAAAADn/xQAAAADAAAAAADk/xUAAAAAAAAAAADl/xUAAAABAAAAAADm/xUAAAACAAAAAADn/xUAAAADAAAAAADk/xYAAAAAAAAAAADl/xYAAAABAAAAAADm/xYAAAACAAAAAADn/xYAAAADAAAAAADk/xcAAAAAAAAAAADl/xcAAAABAAAAAADm/xcAAAACAAAAAADn/xcAAAADAAAAAADk/xgAAAAAAAAAAADl/xgAAAABAAAAAADm/xgAAAACAAAAAADn/xgAAAADAAAAAADo/xQAAAAAAAAAAADp/xQAAAABAAAAAADq/xQAAAACAAAAAADr/xQAAAADAAAAAADo/xUAAAAAAAAAAADp/xUAAAABAAAAAADq/xUAAAACAAAAAADr/xUAAAADAAAAAADo/xYAAAAAAAAAAADp/xYAAAABAAAAAADq/xYAAAACAAAAAADr/xYAAAADAAAAAADo/xcAAAAAAAAAAADp/xcAAAABAAAAAADq/xcAAAACAAAAAADr/xcAAAADAAAAAADo/xgAAAAAAAAAAADp/xgAAAABAAAAAADq/xgAAAACAAAAAADr/xgAAAADAAAAAADs/xQAAAAAAAAAAADt/xQAAAABAAAAAADu/xQAAAACAAAAAADv/xQAAAADAAAAAADs/xUAAAAAAAAAAADt/xUAAAABAAAAAADu/xUAAAACAAAAAADv/xUAAAADAAAAAADs/xYAAAAAAAAAAADt/xYAAAABAAAAAADu/xYAAAACAAAAAADv/xYAAAADAAAAAADs/xcAAAAAAAAAAADt/xcAAAABAAAAAADu/xcAAAACAAAAAADv/xcAAAADAAAAAADs/xgAAAAAAAAAAADt/xgAAAABAAAAAADu/xgAAAACAAAAAADv/xgAAAADAAAAAADw/xQAAAAAAAAAAADx/xQAAAABAAAAAADy/xQAAAACAAAAAADz/xQAAAADAAAAAADw/xUAAAAAAAAAAADx/xUAAAABAAAAAADy/xUAAAACAAAAAADz/xUAAAADAAAAAADw/xYAAAAAAAAAAADx/xYAAAABAAAAAADy/xYAAAACAAAAAADz/xYAAAADAAAAAADw/xcAAAAAAAAAAADx/xcAAAABAAAAAADy/xcAAAACAAAAAADz/xcAAAADAAAAAADw/xgAAAAAAAAAAADx/xgAAAABAAAAAADy/xgAAAACAAAAAADz/xgAAAADAAAAAAD0/xQAAAAAAAAAAAD1/xQAAAABAAAAAAD2/xQAAAACAAAAAAD3/xQAAAADAAAAAAD0/xUAAAAAAAAAAAD1/xUAAAABAAAAAAD2/xUAAAACAAAAAAD3/xUAAAADAAAAAAD0/xYAAAAAAAAAAAD1/xYAAAABAAAAAAD2/xYAAAACAAAAAAD3/xYAAAADAAAAAAD0/xcAAAAAAAAAAAD1/xcAAAABAAAAAAD2/xcAAAACAAAAAAD3/xcAAAADAAAAAAD0/xgAAAAAAAAAAAD1/xgAAAABAAAAAAD2/xgAAAACAAAAAAD3/xgAAAADAAAAAAD4/xQAAAAAAAAAAAD5/xQAAAABAAAAAAD6/xQAAAACAAAAAAD7/xQAAAADAAAAAAD4/xUAAAAAAAAAAAD5/xUAAAABAAAAAAD6/xUAAAACAAAAAAD7/xUAAAADAAAAAAD4/xYAAAAAAAAAAAD5/xYAAAABAAAAAAD6/xYAAAACAAAAAAD7/xYAAAADAAAAAAD4/xcAAAAAAAAAAAD5/xcAAAABAAAAAAD6/xcAAAACAAAAAAD7/xcAAAADAAAAAAD4/xgAAAAAAAAAAAD5/xgAAAABAAAAAAD6/xgAAAACAAAAAAD7/xgAAAADAAAAAAD8/xQAAAAAAAAAAAD9/xQAAAABAAAAAAD+/xQAAAACAAAAAAD//xQAAAADAAAAAAD8/xUAAAAAAAAAAAD9/xUAAAABAAAAAAD+/xUAAAACAAAAAAD//xUAAAADAAAAAAD8/xYAAAAAAAAAAAD9/xYAAAABAAAAAAD+/xYAAAACAAAAAAD//xYAAAADAAAAAAD8/xcAAAAAAAAAAAD9/xcAAAABAAAAAAD+/xcAAAACAAAAAAD//xcAAAADAAAAAAD8/xgAAAAAAAAAAAD9/xgAAAABAAAAAAD+/xgAAAACAAAAAAD//xgAAAADAAAAAAAEAOz/AAAAAAAAAAAFAOz/AAABAAAAAAAGAOz/AAACAAAAAAAHAOz/AAADAAAAAAAEAO3/AAAAAAAAAAAFAO3/AAABAAAAAAAGAO3/AAACAAAAAAAHAO3/AAADAAAAAAAEAO7/AAAAAAAAAAAFAO7/AAABAAAAAAAGAO7/AAACAAAAAAAHAO7/AAADAAAAAAAEAO//AAAAAAAAAAAFAO//AAABAAAAAAAGAO//AAACAAAAAAAHAO//AAADAAAAAAAEAPD/AAAAAAAAAAAFAPD/AAABAAAAAAAGAPD/AAACAAAAAAAHAPD/AAADAAAAAAAEAPH/AAAAAAAAAAAFAPH/AAABAAAAAAAGAPH/AAACAAAAAAAHAPH/AAADAAAAAAAEAPL/AAAAAAAAAAAFAPL/AAABAAAAAAAGAPL/AAACAAAAAAAHAPL/AAADAAAAAAAEAPP/AAAAAAAAAAAFAPP/AAABAAAAAAAGAPP/AAACAAAAAAAHAPP/AAADAAAAAAAEAPT/AAAAAAAAAAAFAPT/AAABAAAAAAAGAPT/AAACAAAAAAAHAPT/AAADAAAAAAAEAPX/AAAAAAAAAAAFAPX/AAABAAAAAAAGAPX/AAACAAAAAAAHAPX/AAADAAAAAAAEAPb/AAAAAAAAAAAFAPb/AAABAAAAAAAGAPb/AAACAAAAAAAHAPb/AAADAAAAAAAEAPf/AAAAAAAAAAAFAPf/AAABAAAAAAAGAPf/AAACAAAAAAAHAPf/AAADAAAAAAAEAPj/AAAAAAAAAAAFAPj/AAABAAAAAAAGAPj/AAACAAAAAAAHAPj/AAADAAAAAAAEAPn/AAAAAAAAAAAFAPn/AAABAAAAAAAGAPn/AAACAAAAAAAHAPn/AAADAAAAAAAEAPr/AAAAAAAAAAAFAPr/AAABAAAAAAAGAPr/AAACAAAAAAAHAPr/AAADAAAAAAAEAPv/AAAAAAAAAAAFAPv/AAABAAAAAAAGAPv/AAACAAAAAAAHAPv/AAADAAAAAAAEAPz/AAAAAAAAAAAFAPz/AAABAAAAAAAGAPz/AAACAAAAAAAHAPz/AAADAAAAAAAEAP3/AAAAAAAAAAAFAP3/AAABAAAAAAAGAP3/AAACAAAAAAAHAP3/AAADAAAAAAAEAP7/AAAAAAAAAAAFAP7/AAABAAAAAAAGAP7/AAACAAAAAAAHAP7/AAADAAAAAAAEAP//AAAAAAAAAAAFAP//AAABAAAAAAAGAP//AAACAAAAAAAHAP//AAADAAAAAAAIAOz/AAAAAAAAAAAJAOz/AAABAAAAAAAKAOz/AAACAAAAAAALAOz/AAADAAAAAAAIAO3/AAAAAAAAAAAJAO3/AAABAAAAAAAKAO3/AAACAAAAAAALAO3/AAADAAAAAAAIAO7/AAAAAAAAAAAJAO7/AAABAAAAAAAKAO7/AAACAAAAAAALAO7/AAADAAAAAAAIAO//AAAAAAAAAAAJAO//AAABAAAAAAAKAO//AAACAAAAAAALAO//AAADAAAAAAAIAPD/AAAAAAAAAAAJAPD/AAABAAAAAAAKAPD/AAACAAAAAAALAPD/AAADAAAAAAAIAPH/AAAAAAAAAAAJAPH/AAABAAAAAAAKAPH/AAACAAAAAAALAPH/AAADAAAAAAAIAPL/AAAAAAAAAAAJAPL/AAABAAAAAAAKAPL/AAACAAAAAAALAPL/AAADAAAAAAAIAPP/AAAAAAAAAAAJAPP/AAABAAAAAAAKAPP/AAACAAAAAAALAPP/AAADAAAAAAAIAPT/AAAAAAAAAAAJAPT/AAABAAAAAAAKAPT/AAACAAAAAAALAPT/AAADAAAAAAAIAPX/AAAAAAAAAAAJAPX/AAABAAAAAAAKAPX/AAACAAAAAAALAPX/AAADAAAAAAAIAPb/AAAAAAAAAAAJAPb/AAABAAAAAAAKAPb/AAACAAAAAAALAPb/AAADAAAAAAAIAPf/AAAAAAAAAAAJAPf/AAABAAAAAAAKAPf/AAACAAAAAAALAPf/AAADAAAAAAAIAPj/AAAAAAAAAAAJAPj/AAABAAAAAAAKAPj/AAACAAAAAAALAPj/AAADAAAAAAAIAPn/AAAAAAAAAAAJAPn/AAABAAAAAAAKAPn/AAACAAAAAAALAPn/AAADAAAAAAAIAPr/AAAAAAAAAAAJAPr/AAABAAAAAAAKAPr/AAACAAAAAAALAPr/AAADAAAAAAAIAPv/AAAAAAAAAAAJAPv/AAABAAAAAAAKAPv/AAACAAAAAAALAPv/AAADAAAAAAAIAPz/AAAAAAAAAAAJAPz/AAABAAAAAAAKAPz/AAACAAAAAAALAPz/AAADAAAAAAAIAP3/AAAAAAAAAAAJAP3/AAABAAAAAAAKAP3/AAACAAAAAAALAP3/AAADAAAAAAAIAP7/AAAAAAAAAAAJAP7/AAABAAAAAAAKAP7/AAACAAAAAAALAP7/AAADAAAAAAAIAP//AAAAAAAAAAAJAP//AAABAAAAAAAKAP//AAACAAAAAAALAP//AAADAAAAAAAMAOz/AAAAAAAAAAANAOz/AAABAAAAAAAOAOz/AAACAAAAAAAPAOz/AAADAAAAAAAMAO3/AAAAAAAAAAANAO3/AAABAAAAAAAOAO3/AAACAAAAAAAPAO3/AAADAAAAAAAMAO7/AAAAAAAAAAANAO7/AAABAAAAAAAOAO7/AAACAAAAAAAPAO7/AAADAAAAAAAMAO//AAAAAAAAAAANAO//AAABAAAAAAAOAO//AAACAAAAAAAPAO//AAADAAAAAAAMAPD/AAAAAAAAAAANAPD/AAABAAAAAAAOAPD/AAACAAAAAAAPAPD/AAADAAAAAAAMAPH/AAAAAAAAAAANAPH/AAABAAAAAAAOAPH/AAACAAAAAAAPAPH/AAADAAAAAAAMAPL/AAAAAAAAAAANAPL/AAABAAAAAAAOAPL/AAACAAAAAAAPAPL/AAADAAAAAAAMAPP/AAAAAAAAAAANAPP/AAABAAAAAAAOAPP/AAACAAAAAAAPAPP/AAADAAAAAAAMAPT/AAAAAAAAAAANAPT/AAABAAAAAAAOAPT/AAACAAAAAAAPAPT/AAADAAAAAAAMAPX/AAAAAAAAAAANAPX/AAABAAAAAAAOAPX/AAACAAAAAAAPAPX/AAADAAAAAAAMAPb/AAAAAAAAAAANAPb/AAABAAAAAAAOAPb/AAACAAAAAAAPAPb/AAADAAAAAAAMAPf/AAAAAAAAAAANAPf/AAABAAAAAAAOAPf/AAACAAAAAAAPAPf/AAADAAAAAAAMAPj/AAAAAAAAAAANAPj/AAABAAAAAAAOAPj/AAACAAAAAAAPAPj/AAADAAAAAAAMAPn/AAAAAAAAAAANAPn/AAABAAAAAAAOAPn/AAACAAAAAAAPAPn/AAADAAAAAAAMAPr/AAAAAAAAAAANAPr/AAABAAAAAAAOAPr/AAACAAAAAAAPAPr/AAADAAAAAAAMAPv/AAAAAAAAAAANAPv/AAABAAAAAAAOAPv/AAACAAAAAAAPAPv/AAADAAAAAAAMAPz/AAAAAAAAAAANAPz/AAABAAAAAAAOAPz/AAACAAAAAAAPAPz/AAADAAAAAAAMAP3/AAAAAAAAAAANAP3/AAABAAAAAAAOAP3/AAACAAAAAAAPAP3/AAADAAAAAAAMAP7/AAAAAAAAAAANAP7/AAABAAAAAAAOAP7/AAACAAAAAAAPAP7/AAADAAAAAAAMAP//AAAAAAAAAAANAP//AAABAAAAAAAOAP//AAACAAAAAAAPAP//AAADAAAAAAAQAOz/AAAAAAAAAAARAOz/AAABAAAAAAASAOz/AAACAAAAAAATAOz/AAADAAAAAAAQAO3/AAAAAAAAAAARAO3/AAABAAAAAAASAO3/AAACAAAAAAATAO3/AAADAAAAAAAQAO7/AAAAAAAAAAARAO7/AAABAAAAAAASAO7/AAACAAAAAAATAO7/AAADAAAAAAAQAO//AAAAAAAAAAARAO//AAABAAAAAAASAO//AAACAAAAAAATAO//AAADAAAAAAAQAPD/AAAAAAAAAAARAPD/AAABAAAAAAASAPD/AAACAAAAAAATAPD/AAADAAAAAAAQAPH/AAAAAAAAAAARAPH/AAABAAAAAAASAPH/AAACAAAAAAATAPH/AAADAAAAAAAQAPL/AAAAAAAAAAARAPL/AAABAAAAAAASAPL/AAACAAAAAAATAPL/AAADAAAAAAAQAPP/AAAAAAAAAAARAPP/AAABAAAAAAASAPP/AAACAAAAAAATAPP/AAADAAAAAAAQAPT/AAAAAAAAAAARAPT/AAABAAAAAAASAPT/AAACAAAAAAATAPT/AAADAAAAAAAQAPX/AAAAAAAAAAARAPX/AAABAAAAAAASAPX/AAACAAAAAAATAPX/AAADAAAAAAAQAPb/AAAAAAAAAAARAPb/AAABAAAAAAASAPb/AAACAAAAAAATAPb/AAADAAAAAAAQAPf/AAAAAAAAAAARAPf/AAABAAAAAAASAPf/AAACAAAAAAATAPf/AAADAAAAAAAQAPj/AAAAAAAAAAARAPj/AAABAAAAAAASAPj/AAACAAAAAAATAPj/AAADAAAAAAAQAPn/AAAAAAAAAAARAPn/AAABAAAAAAASAPn/AAACAAAAAAATAPn/AAADAAAAAAAQAPr/AAAAAAAAAAARAPr/AAABAAAAAAASAPr/AAACAAAAAAATAPr/AAADAAAAAAAQAPv/AAAAAAAAAAARAPv/AAABAAAAAAASAPv/AAACAAAAAAATAPv/AAADAAAAAAAQAPz/AAAAAAAAAAARAPz/AAABAAAAAAASAPz/AAACAAAAAAATAPz/AAADAAAAAAAQAP3/AAAAAAAAAAARAP3/AAABAAAAAAASAP3/AAACAAAAAAATAP3/AAADAAAAAAAQAP7/AAAAAAAAAAARAP7/AAABAAAAAAASAP7/AAACAAAAAAATAP7/AAADAAAAAAAQAP//AAAAAAAAAAARAP//AAABAAAAAAASAP//AAACAAAAAAATAP//AAADAAAAAAAUAOz/AAAAAAAAAAAVAOz/AAABAAAAAAAWAOz/AAACAAAAAAAXAOz/AAADAAAAAAAUAO3/AAAAAAAAAAAVAO3/AAABAAAAAAAWAO3/AAACAAAAAAAXAO3/AAADAAAAAAAUAO7/AAAAAAAAAAAVAO7/AAABAAAAAAAWAO7/AAACAAAAAAAXAO7/AAADAAAAAAAUAO//AAAAAAAAAAAVAO//AAABAAAAAAAWAO//AAACAAAAAAAXAO//AAADAAAAAAAUAPD/AAAAAAAAAAAVAPD/AAABAAAAAAAWAPD/AAACAAAAAAAXAPD/AAADAAAAAAAUAPH/AAAAAAAAAAAVAPH/AAABAAAAAAAWAPH/AAACAAAAAAAXAPH/AAADAAAAAAAUAPL/AAAAAAAAAAAVAPL/AAABAAAAAAAWAPL/AAACAAAAAAAXAPL/AAADAAAAAAAUAPP/AAAAAAAAAAAVAPP/AAABAAAAAAAWAPP/AAACAAAAAAAXAPP/AAADAAAAAAAUAPT/AAAAAAAAAAAVAPT/AAABAAAAAAAWAPT/AAACAAAAAAAXAPT/AAADAAAAAAAUAPX/AAAAAAAAAAAVAPX/AAABAAAAAAAWAPX/AAACAAAAAAAXAPX/AAADAAAAAAAUAPb/AAAAAAAAAAAVAPb/AAABAAAAAAAWAPb/AAACAAAAAAAXAPb/AAADAAAAAAAUAPf/AAAAAAAAAAAVAPf/AAABAAAAAAAWAPf/AAACAAAAAAAXAPf/AAADAAAAAAAUAPj/AAAAAAAAAAAVAPj/AAABAAAAAAAWAPj/AAACAAAAAAAXAPj/AAADAAAAAAAUAPn/AAAAAAAAAAAVAPn/AAABAAAAAAAWAPn/AAACAAAAAAAXAPn/AAADAAAAAAAUAPr/AAAAAAAAAAAVAPr/AAABAAAAAAAWAPr/AAACAAAAAAAXAPr/AAADAAAAAAAUAPv/AAAAAAAAAAAVAPv/AAABAAAAAAAWAPv/AAACAAAAAAAXAPv/AAADAAAAAAAUAPz/AAAAAAAAAAAVAPz/AAABAAAAAAAWAPz/AAACAAAAAAAXAPz/AAADAAAAAAAUAP3/AAAAAAAAAAAVAP3/AAABAAAAAAAWAP3/AAACAAAAAAAXAP3/AAADAAAAAAAUAP7/AAAAAAAAAAAVAP7/AAABAAAAAAAWAP7/AAACAAAAAAAXAP7/AAADAAAAAAAUAP//AAAAAAAAAAAVAP//AAABAAAAAAAWAP//AAACAAAAAAAXAP//AAADAAAAAAAYAOz/AAAAAAAAAAAZAOz/AAABAAAAAAAaAOz/AAACAAAAAAAbAOz/AAADAAAAAAAYAO3/AAAAAAAAAAAZAO3/AAABAAAAAAAaAO3/AAACAAAAAAAbAO3/AAADAAAAAAAYAO7/AAAAAAAAAAAZAO7/AAABAAAAAAAaAO7/AAACAAAAAAAbAO7/AAADAAAAAAAYAO//AAAAAAAAAAAZAO//AAABAAAAAAAaAO//AAACAAAAAAAbAO//AAADAAAAAAAYAPD/AAAAAAAAAAAZAPD/AAABAAAAAAAaAPD/AAACAAAAAAAbAPD/AAADAAAAAAAYAPH/AAAAAAAAAAAZAPH/AAABAAAAAAAaAPH/AAACAAAAAAAbAPH/AAADAAAAAAAYAPL/AAAAAAAAAAAZAPL/AAABAAAAAAAaAPL/AAACAAAAAAAbAPL/AAADAAAAAAAYAPP/AAAAAAAAAAAZAPP/AAABAAAAAAAaAPP/AAACAAAAAAAbAPP/AAADAAAAAAAYAPT/AAAAAAAAAAAZAPT/AAABAAAAAAAaAPT/AAACAAAAAAAbAPT/AAADAAAAAAAYAPX/AAAAAAAAAAAZAPX/AAABAAAAAAAaAPX/AAACAAAAAAAbAPX/AAADAAAAAAAYAPb/AAAAAAAAAAAZAPb/AAABAAAAAAAaAPb/AAACAAAAAAAbAPb/AAADAAAAAAAYAPf/AAAAAAAAAAAZAPf/AAABAAAAAAAaAPf/AAACAAAAAAAbAPf/AAADAAAAAAAYAPj/AAAAAAAAAAAZAPj/AAABAAAAAAAaAPj/AAACAAAAAAAbAPj/AAADAAAAAAAYAPn/AAAAAAAAAAAZAPn/AAABAAAAAAAaAPn/AAACAAAAAAAbAPn/AAADAAAAAAAYAPr/AAAAAAAAAAAZAPr/AAABAAAAAAAaAPr/AAACAAAAAAAbAPr/AAADAAAAAAAYAPv/AAAAAAAAAAAZAPv/AAABAAAAAAAaAPv/AAACAAAAAAAbAPv/AAADAAAAAAAYAPz/AAAAAAAAAAAZAPz/AAABAAAAAAAaAPz/AAACAAAAAAAbAPz/AAADAAAAAAAYAP3/AAAAAAAAAAAZAP3/AAABAAAAAAAaAP3/AAACAAAAAAAbAP3/AAADAAAAAAAYAP7/AAAAAAAAAAAZAP7/AAABAAAAAAAaAP7/AAACAAAAAAAbAP7/AAADAAAAAAAYAP//AAAAAAAAAAAZAP//AAABAAAAAAAaAP//AAACAAAAAAAbAP//AAADAAAAAAAcAOz/AAAAAAAAAAAdAOz/AAABAAAAAAAcAO3/AAAAAAAAAAAdAO3/AAABAAAAAAAcAO7/AAAAAAAAAAAdAO7/AAABAAAAAAAcAO//AAAAAAAAAAAdAO//AAABAAAAAAAcAPD/AAAAAAAAAAAdAPD/AAABAAAAAAAcAPH/AAAAAAAAAAAdAPH/AAABAAAAAAAcAPL/AAAAAAAAAAAdAPL/AAABAAAAAAAcAPP/AAAAAAAAAAAdAPP/AAABAAAAAAAcAPT/AAAAAAAAAAAdAPT/AAABAAAAAAAcAPX/AAAAAAAAAAAdAPX/AAABAAAAAAAcAPb/AAAAAAAAAAAdAPb/AAABAAAAAAAcAPf/AAAAAAAAAAAdAPf/AAABAAAAAAAcAPj/AAAAAAAAAAAdAPj/AAABAAAAAAAcAPn/AAAAAAAAAAAdAPn/AAABAAAAAAAcAPr/AAAAAAAAAAAdAPr/AAABAAAAAAAcAPv/AAAAAAAAAAAdAPv/AAABAAAAAAAcAPz/AAAAAAAAAAAdAPz/AAABAAAAAAAcAP3/AAAAAAAAAAAdAP3/AAABAAAAAAAcAP7/AAAAAAAAAAAdAP7/AAABAAAAAAAcAP//AAAAAAAAAAAdAP//AAABAAAAAADi/+z/AAACAAAAAADj/+z/AAADAAAAAADi/+3/AAACAAAAAADj/+3/AAADAAAAAADi/+7/AAACAAAAAADj/+7/AAADAAAAAADi/+//AAACAAAAAADj/+//AAADAAAAAADi//D/AAACAAAAAADj//D/AAADAAAAAADi//H/AAACAAAAAADj//H/AAADAAAAAADi//L/AAACAAAAAADj//L/AAADAAAAAADi//P/AAACAAAAAADj//P/AAADAAAAAADi//T/AAACAAAAAADj//T/AAADAAAAAADi//X/AAACAAAAAADj//X/AAADAAAAAADi//b/AAACAAAAAADj//b/AAADAAAAAADi//f/AAACAAAAAADj//f/AAADAAAAAADi//j/AAACAAAAAADj//j/AAADAAAAAADi//n/AAACAAAAAADj//n/AAADAAAAAADi//r/AAACAAAAAADj//r/AAADAAAAAADi//v/AAACAAAAAADj//v/AAADAAAAAADi//z/AAACAAAAAADj//z/AAADAAAAAADi//3/AAACAAAAAADj//3/AAADAAAAAADi//7/AAACAAAAAADj//7/AAADAAAAAADi////AAACAAAAAADj////AAADAAAAAADk/+z/AAAAAAAAAADl/+z/AAABAAAAAADm/+z/AAACAAAAAADn/+z/AAADAAAAAADk/+3/AAAAAAAAAADl/+3/AAABAAAAAADm/+3/AAACAAAAAADn/+3/AAADAAAAAADk/+7/AAAAAAAAAADl/+7/AAABAAAAAADm/+7/AAACAAAAAADn/+7/AAADAAAAAADk/+//AAAAAAAAAADl/+//AAABAAAAAADm/+//AAACAAAAAADn/+//AAADAAAAAADk//D/AAAAAAAAAADl//D/AAABAAAAAADm//D/AAACAAAAAADn//D/AAADAAAAAADk//H/AAAAAAAAAADl//H/AAABAAAAAADm//H/AAACAAAAAADn//H/AAADAAAAAADk//L/AAAAAAAAAADl//L/AAABAAAAAADm//L/AAACAAAAAADn//L/AAADAAAAAADk//P/AAAAAAAAAADl//P/AAABAAAAAADm//P/AAACAAAAAADn//P/AAADAAAAAADk//T/AAAAAAAAAADl//T/AAABAAAAAADm//T/AAACAAAAAADn//T/AAADAAAAAADk//X/AAAAAAAAAADl//X/AAABAAAAAADm//X/AAACAAAAAADn//X/AAADAAAAAADk//b/AAAAAAAAAADl//b/AAABAAAAAADm//b/AAACAAAAAADn//b/AAADAAAAAADk//f/AAAAAAAAAADl//f/AAABAAAAAADm//f/AAACAAAAAADn//f/AAADAAAAAADk//j/AAAAAAAAAADl//j/AAABAAAAAADm//j/AAACAAAAAADn//j/AAADAAAAAADk//n/AAAAAAAAAADl//n/AAABAAAAAADm//n/AAACAAAAAADn//n/AAADAAAAAADk//r/AAAAAAAAAADl//r/AAABAAAAAADm//r/AAACAAAAAADn//r/AAADAAAAAADk//v/AAAAAAAAAADl//v/AAABAAAAAADm//v/AAACAAAAAADn//v/AAADAAAAAADk//z/AAAAAAAAAADl//z/AAABAAAAAADm//z/AAACAAAAAADn//z/AAADAAAAAADk//3/AAAAAAAAAADl//3/AAABAAAAAADm//3/AAACAAAAAADn//3/AAADAAAAAADk//7/AAAAAAAAAADl//7/AAABAAAAAADm//7/AAACAAAAAADn//7/AAADAAAAAADk////AAAAAAAAAADl////AAABAAAAAADm////AAACAAAAAADn////AAADAAAAAADo/+z/AAAAAAAAAADp/+z/AAABAAAAAADq/+z/AAACAAAAAADr/+z/AAADAAAAAADo/+3/AAAAAAAAAADp/+3/AAABAAAAAADq/+3/AAACAAAAAADr/+3/AAADAAAAAADo/+7/AAAAAAAAAADp/+7/AAABAAAAAADq/+7/AAACAAAAAADr/+7/AAADAAAAAADo/+//AAAAAAAAAADp/+//AAABAAAAAADq/+//AAACAAAAAADr/+//AAADAAAAAADo//D/AAAAAAAAAADp//D/AAABAAAAAADq//D/AAACAAAAAADr//D/AAADAAAAAADo//H/AAAAAAAAAADp//H/AAABAAAAAADq//H/AAACAAAAAADr//H/AAADAAAAAADo//L/AAAAAAAAAADp//L/AAABAAAAAADq//L/AAACAAAAAADr//L/AAADAAAAAADo//P/AAAAAAAAAADp//P/AAABAAAAAADq//P/AAACAAAAAADr//P/AAADAAAAAADo//T/AAAAAAAAAADp//T/AAABAAAAAADq//T/AAACAAAAAADr//T/AAADAAAAAADo//X/AAAAAAAAAADp//X/AAABAAAAAADq//X/AAACAAAAAADr//X/AAADAAAAAADo//b/AAAAAAAAAADp//b/AAABAAAAAADq//b/AAACAAAAAADr//b/AAADAAAAAADo//f/AAAAAAAAAADp//f/AAABAAAAAADq//f/AAACAAAAAADr//f/AAADAAAAAADo//j/AAAAAAAAAADp//j/AAABAAAAAADq//j/AAACAAAAAADr//j/AAADAAAAAADo//n/AAAAAAAAAADp//n/AAABAAAAAADq//n/AAACAAAAAADr//n/AAADAAAAAADo//r/AAAAAAAAAADp//r/AAABAAAAAADq//r/AAACAAAAAADr//r/AAADAAAAAADo//v/AAAAAAAAAADp//v/AAABAAAAAADq//v/AAACAAAAAADr//v/AAADAAAAAADo//z/AAAAAAAAAADp//z/AAABAAAAAADq//z/AAACAAAAAADr//z/AAADAAAAAADo//3/AAAAAAAAAADp//3/AAABAAAAAADq//3/AAACAAAAAADr//3/AAADAAAAAADo//7/AAAAAAAAAADp//7/AAABAAAAAADq//7/AAACAAAAAADr//7/AAADAAAAAADo////AAAAAAAAAADp////AAABAAAAAADq////AAACAAAAAADr////AAADAAAAAADs/+z/AAAAAAAAAADt/+z/AAABAAAAAADu/+z/AAACAAAAAADv/+z/AAADAAAAAADs/+3/AAAAAAAAAADt/+3/AAABAAAAAADu/+3/AAACAAAAAADv/+3/AAADAAAAAADs/+7/AAAAAAAAAADt/+7/AAABAAAAAADu/+7/AAACAAAAAADv/+7/AAADAAAAAADs/+//AAAAAAAAAADt/+//AAABAAAAAADu/+//AAACAAAAAADv/+//AAADAAAAAADs//D/AAAAAAAAAADt//D/AAABAAAAAADu//D/AAACAAAAAADv//D/AAADAAAAAADs//H/AAAAAAAAAADt//H/AAABAAAAAADu//H/AAACAAAAAADv//H/AAADAAAAAADs//L/AAAAAAAAAADt//L/AAABAAAAAADu//L/AAACAAAAAADv//L/AAADAAAAAADs//P/AAAAAAAAAADt//P/AAABAAAAAADu//P/AAACAAAAAADv//P/AAADAAAAAADs//T/AAAAAAAAAADt//T/AAABAAAAAADu//T/AAACAAAAAADv//T/AAADAAAAAADs//X/AAAAAAAAAADt//X/AAABAAAAAADu//X/AAACAAAAAADv//X/AAADAAAAAADs//b/AAAAAAAAAADt//b/AAABAAAAAADu//b/AAACAAAAAADv//b/AAADAAAAAADs//f/AAAAAAAAAADt//f/AAABAAAAAADu//f/AAACAAAAAADv//f/AAADAAAAAADs//j/AAAAAAAAAADt//j/AAABAAAAAADu//j/AAACAAAAAADv//j/AAADAAAAAADs//n/AAAAAAAAAADt//n/AAABAAAAAADu//n/AAACAAAAAADv//n/AAADAAAAAADs//r/AAAAAAAAAADt//r/AAABAAAAAADu//r/AAACAAAAAADv//r/AAADAAAAAADs//v/AAAAAAAAAADt//v/AAABAAAAAADu//v/AAACAAAAAADv//v/AAADAAAAAADs//z/AAAAAAAAAADt//z/AAABAAAAAADu//z/AAACAAAAAADv//z/AAADAAAAAADs//3/AAAAAAAAAADt//3/AAABAAAAAADu//3/AAACAAAAAADv//3/AAADAAAAAADs//7/AAAAAAAAAADt//7/AAABAAAAAADu//7/AAACAAAAAADv//7/AAADAAAAAADs////AAAAAAAAAADt////AAABAAAAAADu////AAACAAAAAADv////AAADAAAAAADw/+z/AAAAAAAAAADx/+z/AAABAAAAAADy/+z/AAACAAAAAADz/+z/AAADAAAAAADw/+3/AAAAAAAAAADx/+3/AAABAAAAAADy/+3/AAACAAAAAADz/+3/AAADAAAAAADw/+7/AAAAAAAAAADx/+7/AAABAAAAAADy/+7/AAACAAAAAADz/+7/AAADAAAAAADw/+//AAAAAAAAAADx/+//AAABAAAAAADy/+//AAACAAAAAADz/+//AAADAAAAAADw//D/AAAAAAAAAADx//D/AAABAAAAAADy//D/AAACAAAAAADz//D/AAADAAAAAADw//H/AAAAAAAAAADx//H/AAABAAAAAADy//H/AAACAAAAAADz//H/AAADAAAAAADw//L/AAAAAAAAAADx//L/AAABAAAAAADy//L/AAACAAAAAADz//L/AAADAAAAAADw//P/AAAAAAAAAADx//P/AAABAAAAAADy//P/AAACAAAAAADz//P/AAADAAAAAADw//T/AAAAAAAAAADx//T/AAABAAAAAADy//T/AAACAAAAAADz//T/AAADAAAAAADw//X/AAAAAAAAAADx//X/AAABAAAAAADy//X/AAACAAAAAADz//X/AAADAAAAAADw//b/AAAAAAAAAADx//b/AAABAAAAAADy//b/AAACAAAAAADz//b/AAADAAAAAADw//f/AAAAAAAAAADx//f/AAABAAAAAADy//f/AAACAAAAAADz//f/AAADAAAAAADw//j/AAAAAAAAAADx//j/AAABAAAAAADy//j/AAACAAAAAADz//j/AAADAAAAAADw//n/AAAAAAAAAADx//n/AAABAAAAAADy//n/AAACAAAAAADz//n/AAADAAAAAADw//r/AAAAAAAAAADx//r/AAABAAAAAADy//r/AAACAAAAAADz//r/AAADAAAAAADw//v/AAAAAAAAAADx//v/AAABAAAAAADy//v/AAACAAAAAADz//v/AAADAAAAAADw//z/AAAAAAAAAADx//z/AAABAAAAAADy//z/AAACAAAAAADz//z/AAADAAAAAADw//3/AAAAAAAAAADx//3/AAABAAAAAADy//3/AAACAAAAAADz//3/AAADAAAAAADw//7/AAAAAAAAAADx//7/AAABAAAAAADy//7/AAACAAAAAADz//7/AAADAAAAAADw////AAAAAAAAAADx////AAABAAAAAADy////AAACAAAAAADz////AAADAAAAAAD0/+z/AAAAAAAAAAD1/+z/AAABAAAAAAD2/+z/AAACAAAAAAD3/+z/AAADAAAAAAD0/+3/AAAAAAAAAAD1/+3/AAABAAAAAAD2/+3/AAACAAAAAAD3/+3/AAADAAAAAAD0/+7/AAAAAAAAAAD1/+7/AAABAAAAAAD2/+7/AAACAAAAAAD3/+7/AAADAAAAAAD0/+//AAAAAAAAAAD1/+//AAABAAAAAAD2/+//AAACAAAAAAD3/+//AAADAAAAAAD0//D/AAAAAAAAAAD1//D/AAABAAAAAAD2//D/AAACAAAAAAD3//D/AAADAAAAAAD0//H/AAAAAAAAAAD1//H/AAABAAAAAAD2//H/AAACAAAAAAD3//H/AAADAAAAAAD0//L/AAAAAAAAAAD1//L/AAABAAAAAAD2//L/AAACAAAAAAD3//L/AAADAAAAAAD0//P/AAAAAAAAAAD1//P/AAABAAAAAAD2//P/AAACAAAAAAD3//P/AAADAAAAAAD0//T/AAAAAAAAAAD1//T/AAABAAAAAAD2//T/AAACAAAAAAD3//T/AAADAAAAAAD0//X/AAAAAAAAAAD1//X/AAABAAAAAAD2//X/AAACAAAAAAD3//X/AAADAAAAAAD0//b/AAAAAAAAAAD1//b/AAABAAAAAAD2//b/AAACAAAAAAD3//b/AAADAAAAAAD0//f/AAAAAAAAAAD1//f/AAABAAAAAAD2//f/AAACAAAAAAD3//f/AAADAAAAAAD0//j/AAAAAAAAAAD1//j/AAABAAAAAAD2//j/AAACAAAAAAD3//j/AAADAAAAAAD0//n/AAAAAAAAAAD1//n/AAABAAAAAAD2//n/AAACAAAAAAD3//n/AAADAAAAAAD0//r/AAAAAAAAAAD1//r/AAABAAAAAAD2//r/AAACAAAAAAD3//r/AAADAAAAAAD0//v/AAAAAAAAAAD1//v/AAABAAAAAAD2//v/AAACAAAAAAD3//v/AAADAAAAAAD0//z/AAAAAAAAAAD1//z/AAABAAAAAAD2//z/AAACAAAAAAD3//z/AAADAAAAAAD0//3/AAAAAAAAAAD1//3/AAABAAAAAAD2//3/AAACAAAAAAD3//3/AAADAAAAAAD0//7/AAAAAAAAAAD1//7/AAABAAAAAAD2//7/AAACAAAAAAD3//7/AAADAAAAAAD0////AAAAAAAAAAD1////AAABAAAAAAD2////AAACAAAAAAD3////AAADAAAAAAD4/+z/AAAAAAAAAAD5/+z/AAABAAAAAAD6/+z/AAACAAAAAAD7/+z/AAADAAAAAAD4/+3/AAAAAAAAAAD5/+3/AAABAAAAAAD6/+3/AAACAAAAAAD7/+3/AAADAAAAAAD4/+7/AAAAAAAAAAD5/+7/AAABAAAAAAD6/+7/AAACAAAAAAD7/+7/AAADAAAAAAD4/+//AAAAAAAAAAD5/+//AAABAAAAAAD6/+//AAACAAAAAAD7/+//AAADAAAAAAD4//D/AAAAAAAAAAD5//D/AAABAAAAAAD6//D/AAACAAAAAAD7//D/AAADAAAAAAD4//H/AAAAAAAAAAD5//H/AAABAAAAAAD6//H/AAACAAAAAAD7//H/AAADAAAAAAD4//L/AAAAAAAAAAD5//L/AAABAAAAAAD6//L/AAACAAAAAAD7//L/AAADAAAAAAD4//P/AAAAAAAAAAD5//P/AAABAAAAAAD6//P/AAACAAAAAAD7//P/AAADAAAAAAD4//T/AAAAAAAAAAD5//T/AAABAAAAAAD6//T/AAACAAAAAAD7//T/AAADAAAAAAD4//X/AAAAAAAAAAD5//X/AAABAAAAAAD6//X/AAACAAAAAAD7//X/AAADAAAAAAD4//b/AAAAAAAAAAD5//b/AAABAAAAAAD6//b/AAACAAAAAAD7//b/AAADAAAAAAD4//f/AAAAAAAAAAD5//f/AAABAAAAAAD6//f/AAACAAAAAAD7//f/AAADAAAAAAD4//j/AAAAAAAAAAD5//j/AAABAAAAAAD6//j/AAACAAAAAAD7//j/AAADAAAAAAD4//n/AAAAAAAAAAD5//n/AAABAAAAAAD6//n/AAACAAAAAAD7//n/AAADAAAAAAD4//r/AAAAAAAAAAD5//r/AAABAAAAAAD6//r/AAACAAAAAAD7//r/AAADAAAAAAD4//v/AAAAAAAAAAD5//v/AAABAAAAAAD6//v/AAACAAAAAAD7//v/AAADAAAAAAD4//z/AAAAAAAAAAD5//z/AAABAAAAAAD6//z/AAACAAAAAAD7//z/AAADAAAAAAD4//3/AAAAAAAAAAD5//3/AAABAAAAAAD6//3/AAACAAAAAAD7//3/AAADAAAAAAD4//7/AAAAAAAAAAD5//7/AAABAAAAAAD6//7/AAACAAAAAAD7//7/AAADAAAAAAD4////AAAAAAAAAAD5////AAABAAAAAAD6////AAACAAAAAAD7////AAADAAAAAAD8/+z/AAAAAAAAAAD9/+z/AAABAAAAAAD+/+z/AAACAAAAAAD//+z/AAADAAAAAAD8/+3/AAAAAAAAAAD9/+3/AAABAAAAAAD+/+3/AAACAAAAAAD//+3/AAADAAAAAAD8/+7/AAAAAAAAAAD9/+7/AAABAAAAAAD+/+7/AAACAAAAAAD//+7/AAADAAAAAAD8/+//AAAAAAAAAAD9/+//AAABAAAAAAD+/+//AAACAAAAAAD//+//AAADAAAAAAD8//D/AAAAAAAAAAD9//D/AAABAAAAAAD+//D/AAACAAAAAAD///D/AAADAAAAAAD8//H/AAAAAAAAAAD9//H/AAABAAAAAAD+//H/AAACAAAAAAD///H/AAADAAAAAAD8//L/AAAAAAAAAAD9//L/AAABAAAAAAD+//L/AAACAAAAAAD///L/AAADAAAAAAD8//P/AAAAAAAAAAD9//P/AAABAAAAAAD+//P/AAACAAAAAAD///P/AAADAAAAAAD8//T/AAAAAAAAAAD9//T/AAABAAAAAAD+//T/AAACAAAAAAD///T/AAADAAAAAAD8//X/AAAAAAAAAAD9//X/AAABAAAAAAD+//X/AAACAAAAAAD///X/AAADAAAAAAD8//b/AAAAAAAAAAD9//b/AAABAAAAAAD+//b/AAACAAAAAAD///b/AAADAAAAAAD8//f/AAAAAAAAAAD9//f/AAABAAAAAAD+//f/AAACAAAAAAD///f/AAADAAAAAAD8//j/AAAAAAAAAAD9//j/AAABAAAAAAD+//j/AAACAAAAAAD///j/AAADAAAAAAD8//n/AAAAAAAAAAD9//n/AAABAAAAAAD+//n/AAACAAAAAAD///n/AAADAAAAAAD8//r/AAAAAAAAAAD9//r/AAABAAAAAAD+//r/AAACAAAAAAD///r/AAADAAAAAAD8//v/AAAAAAAAAAD9//v/AAABAAAAAAD+//v/AAACAAAAAAD///v/AAADAAAAAAD8//z/AAAAAAAAAAD9//z/AAABAAAAAAD+//z/AAACAAAAAAD///z/AAADAAAAAAD8//3/AAAAAAAAAAD9//3/AAABAAAAAAD+//3/AAACAAAAAAD///3/AAADAAAAAAD8//7/AAAAAAAAAAD9//7/AAABAAAAAAD+//7/AAACAAAAAAD///7/AAADAAAAAAD8////AAAAAAAAAAD9////AAABAAAAAAD+////AAACAAAAAAD/////AAADAAAAAAA=") @@ -1084,17 +1085,23 @@ tile_set = SubResource("TileSet_0xqio") [node name="Fountain" parent="." instance=ExtResource("16_2rqka")] position = Vector2(0, 320) -[node name="Player" parent="." instance=ExtResource("10_ho5ay")] - [node name="DataWhaleHome" parent="." instance=ExtResource("16_m4als")] position = Vector2(8, -128) +[node name="DefaultSpawn" type="Marker2D" parent="."] +position = Vector2(647, 500) + +[node name="FromRoom" type="Marker2D" parent="."] +position = Vector2(648, 24) + [node name="DoorArea" type="Area2D" parent="."] position = Vector2(0, 5) script = ExtResource("18_0xqio") +target_scene_name = "room" +target_spawn_name = "FromSquare" [node name="CollisionShape2D" type="CollisionShape2D" parent="DoorArea"] -position = Vector2(644, -56) +position = Vector2(644, -62.5) shape = SubResource("RectangleShape2D_edt5w") [node name="Community" parent="." instance=ExtResource("16_0xqio")] diff --git a/scenes/characters/player.gd b/scenes/characters/PlayerController.gd similarity index 100% rename from scenes/characters/player.gd rename to scenes/characters/PlayerController.gd diff --git a/scenes/characters/PlayerController.gd.uid b/scenes/characters/PlayerController.gd.uid new file mode 100644 index 0000000..fea74a2 --- /dev/null +++ b/scenes/characters/PlayerController.gd.uid @@ -0,0 +1 @@ +uid://fdswi18nel8n diff --git a/scenes/characters/RemotePlayer.gd b/scenes/characters/RemotePlayer.gd new file mode 100644 index 0000000..f9a816c --- /dev/null +++ b/scenes/characters/RemotePlayer.gd @@ -0,0 +1,87 @@ +extends CharacterBody2D + +# 远程玩家脚本 +# 负责处理位置同步和动画播放 +# 严格遵循 Visual Only 原则:无输入处理,无物理碰撞 + +# 公共属性 (snake_case) +var user_id: String = "" +var target_position: Vector2 = Vector2.ZERO + +# 内部状态 +var last_direction: String = "down" +@onready var animation_player: AnimationPlayer = $AnimationPlayer +@onready var sprite: Sprite2D = $Sprite2D + +func _ready(): + # 初始化时确保无物理处理 + set_physics_process(false) + # 初始位置设为当前位置 + target_position = global_position + + # 确保禁用物理碰撞 (双重保险) + if has_node("CollisionShape2D"): + $CollisionShape2D.disabled = true + +func _process(delta: float): + # 1. 平滑移动插值 + var current_pos = global_position + var dist = current_pos.distance_to(target_position) + + if dist > 1.0: + # 简单的线性插值,速度系数 10.0 可根据需要调整 + var new_pos = current_pos.lerp(target_position, 10.0 * delta) + + # 计算移动向量用于动画朝向 + var move_vec = new_pos - current_pos + _update_animation(move_vec) + + global_position = new_pos + else: + # 距离很近时直接吸附并播放待机动画 + global_position = target_position + _play_idle_animation() + +# 统一初始化方法 +# data: 包含 camelCase 字段的字典 (userId, username, position 等) +func setup(data: Dictionary): + if data.has("userId"): + user_id = data.userId + + if data.has("position"): + var pos_data = data.position + if pos_data.has("x") and pos_data.has("y"): + var new_pos = Vector2(pos_data.x, pos_data.y) + global_position = new_pos + target_position = new_pos + + # 如果有名字显示需求,可在此扩展 + # if data.has("username") and has_node("Label"): + # $Label.text = data.username + +# 更新目标位置 +func update_position(new_pos: Vector2): + target_position = new_pos + +# 动画更新逻辑 (复用 PlayerController 的命名规范) +func _update_animation(move_vec: Vector2): + if not animation_player: + return + + # 确定主方向 + if abs(move_vec.x) > abs(move_vec.y): + if move_vec.x > 0: + last_direction = "right" + else: + last_direction = "left" + else: + if move_vec.y > 0: + last_direction = "down" + else: + last_direction = "up" + + animation_player.play("walk_" + last_direction) + +func _play_idle_animation(): + if animation_player: + animation_player.play("idle_" + last_direction) diff --git a/scenes/characters/RemotePlayer.gd.uid b/scenes/characters/RemotePlayer.gd.uid new file mode 100644 index 0000000..d369450 --- /dev/null +++ b/scenes/characters/RemotePlayer.gd.uid @@ -0,0 +1 @@ +uid://dtbajfsljdht5 diff --git a/scenes/characters/player.tscn b/scenes/characters/player.tscn index 24bf2a1..112c8d9 100644 --- a/scenes/characters/player.tscn +++ b/scenes/characters/player.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=13 format=3 uid="uid://b2f8e24plwqgj"] -[ext_resource type="Script" uid="uid://btka26hrcvgen" path="res://Scenes/characters/player.gd" id="1_script"] +[ext_resource type="Script" uid="uid://fdswi18nel8n" path="res://scenes/characters/PlayerController.gd" id="1_script"] [ext_resource type="Texture2D" uid="uid://cghab1hkx5lg5" path="res://assets/characters/player_spritesheet.png" id="2_texture"] [sub_resource type="CapsuleShape2D" id="CapsuleShape2D_1"] diff --git a/scenes/characters/remote_player.tscn b/scenes/characters/remote_player.tscn new file mode 100644 index 0000000..3c30591 --- /dev/null +++ b/scenes/characters/remote_player.tscn @@ -0,0 +1,175 @@ +[gd_scene load_steps=13 format=3 uid="uid://chb8mcqhfnkkr"] + +[ext_resource type="Script" uid="uid://dtbajfsljdht5" path="res://scenes/characters/RemotePlayer.gd" id="1_mu86i"] +[ext_resource type="Texture2D" uid="uid://cghab1hkx5lg5" path="res://assets/characters/player_spritesheet.png" id="2_7oc7u"] + +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_1"] +radius = 21.0 +height = 48.0 + +[sub_resource type="Animation" id="Animation_idle_down"] +resource_name = "idle_down" +length = 0.1 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0] +} + +[sub_resource type="Animation" id="Animation_idle_left"] +resource_name = "idle_left" +length = 0.1 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [12] +} + +[sub_resource type="Animation" id="Animation_idle_right"] +resource_name = "idle_right" +length = 0.1 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [8] +} + +[sub_resource type="Animation" id="Animation_idle_up"] +resource_name = "idle_up" +length = 0.1 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [4] +} + +[sub_resource type="Animation" id="Animation_walk_down"] +resource_name = "walk_down" +length = 0.8 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4, 0.6), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 3] +} + +[sub_resource type="Animation" id="Animation_walk_left"] +resource_name = "walk_left" +length = 0.8 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4, 0.6), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 1, +"values": [12, 13, 14, 15] +} + +[sub_resource type="Animation" id="Animation_walk_right"] +resource_name = "walk_right" +length = 0.8 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4, 0.6), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 1, +"values": [8, 9, 10, 11] +} + +[sub_resource type="Animation" id="Animation_walk_up"] +resource_name = "walk_up" +length = 0.8 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sprite2D:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4, 0.6), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 1, +"values": [4, 5, 6, 7] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_1"] +_data = { +&"idle_down": SubResource("Animation_idle_down"), +&"idle_left": SubResource("Animation_idle_left"), +&"idle_right": SubResource("Animation_idle_right"), +&"idle_up": SubResource("Animation_idle_up"), +&"walk_down": SubResource("Animation_walk_down"), +&"walk_left": SubResource("Animation_walk_left"), +&"walk_right": SubResource("Animation_walk_right"), +&"walk_up": SubResource("Animation_walk_up") +} + +[node name="RemotePlayer" type="CharacterBody2D"] +script = ExtResource("1_mu86i") + +[node name="Sprite2D" type="Sprite2D" parent="."] +position = Vector2(1.5000005, -24.5) +texture = ExtResource("2_7oc7u") +hframes = 4 +vframes = 4 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2(2, -24) +shape = SubResource("CapsuleShape2D_1") +disabled = true + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +&"": SubResource("AnimationLibrary_1") +} diff --git a/scenes/ui/AuthScene.gd b/scenes/ui/AuthScene.gd index b9b1873..2db6530 100644 --- a/scenes/ui/AuthScene.gd +++ b/scenes/ui/AuthScene.gd @@ -26,7 +26,7 @@ extends Control # ============ 信号定义 ============ # 登录成功信号 - 传递给上层场景 -signal login_success(username: String) +signal login_success(username: String, token: String) # ============ UI节点引用 ============ @@ -328,7 +328,7 @@ func _on_login_enter(_text: String): # ============ 控制器信号处理 ============ # 登录成功处理 -func _on_controller_login_success(username: String): +func _on_controller_login_success(username: String, token: String): # 清空表单 login_username.text = "" login_password.text = "" @@ -338,7 +338,7 @@ func _on_controller_login_success(username: String): _hide_field_error(login_verification_error) # 发送登录成功信号给上层 - login_success.emit(username) + login_success.emit(username, token) # 登录失败处理 func _on_controller_login_failed(_message: String): diff --git a/test_client.js b/test_client.js new file mode 100644 index 0000000..f3aa698 --- /dev/null +++ b/test_client.js @@ -0,0 +1,118 @@ +const WebSocket = require('ws'); +const http = require('http'); + +// Mock Data +// const TOKEN = "mock_token_for_validation"; // Assuming manual auth is bypassed or working +const WS_URL = 'ws://localhost:3000/location-broadcast'; +const SESSION_ID = 'debug_room'; + +function loginAndStart() { + // 1. Try Register first (in case user doesn't exist) + const registerData = JSON.stringify({ + username: 'testuser1', + password: 'password123', + nickname: 'TestUser' + }); + + const regOptions = { + hostname: 'localhost', + port: 3000, + path: '/auth/register', + method: 'POST', + headers: { 'Content-Type': 'application/json', 'Content-Length': registerData.length } + }; + + const regReq = http.request(regOptions, (res) => { + // Regardless of success (maybe already exists), try login + performLogin(); + }); + regReq.on('error', () => performLogin()); // Proceed to login on error + regReq.write(registerData); + regReq.end(); +} + +function performLogin() { + const postData = JSON.stringify({ + identifier: 'testuser1', // Using a test account + password: 'password123' + }); + + const options = { + hostname: 'localhost', + port: 3000, + path: '/auth/login', + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Content-Length': postData.length + } + }; + + const req = http.request(options, (res) => { + let data = ''; + res.on('data', (chunk) => { data += chunk; }); + res.on('end', () => { + if (res.statusCode === 201 || res.statusCode === 200) { + const json = JSON.parse(data); + const realToken = json.data.access_token; + console.log("Got Token:", realToken.substring(0, 10) + "..."); + startClients(realToken); + } else { + console.error("Login Failed:", res.statusCode, data); + } + }); + }); + + req.on('error', (e) => { + console.error(`Login Request Error: ${e.message}`); + }); + + req.write(postData); + req.end(); +} + +function startClients(validToken) { + console.log("Starting Test Clients..."); + createClient('Listener', validToken); + setTimeout(() => createClient('Sender', validToken), 1000); +} + +function createClient(name, token) { + const ws = new WebSocket(WS_URL); + + ws.on('open', () => { + // console.log(`[${name}] Connected`); + setTimeout(() => { + // console.log(`[${name}] Sending Join Session...`); + const joinMsg = { + event: 'join_session', + data: { + sessionId: SESSION_ID, + token: token + } + }; + ws.send(JSON.stringify(joinMsg)); + }, 500); + }); + + ws.on('message', (data) => { + console.log(`[${name}] Rx: ${data.toString()}`); + }); + + ws.on('close', (code, reason) => { + console.log(`[${name}] Closed: ${code} ${reason}`); + }); + + ws.on('error', (err) => { + console.error(`[${name}] Error:`, err.message); + }); +} + +// Start +loginAndStart(); + +// Timeout +setTimeout(() => { + console.log("❌ Test Timed Out - No broadcast received."); + process.exit(1); +}, 15000);