diff options
author | Daniel Weipert <git@mail.dweipert.de> | 2024-12-12 02:12:52 +0100 |
---|---|---|
committer | Daniel Weipert <git@mail.dweipert.de> | 2024-12-12 02:12:52 +0100 |
commit | a22381eff3bf2286ee27f4d15ddf4c431ea063be (patch) | |
tree | 965bdcf12e5e0cf63c88cbba1bd5a52ba474f81f | |
parent | e3c185e05823e30eccd7728ceda2ee57cc66fd4d (diff) |
next commit
33 files changed, 859 insertions, 88 deletions
diff --git a/chat_window.gd b/chat_window.gd new file mode 100644 index 0000000..cbf9d6f --- /dev/null +++ b/chat_window.gd @@ -0,0 +1,19 @@ +extends PanelContainer + + +func add_message(message: String): + var label = Label.new() + label.text = message + %ChatWindow.add_child(label) + + %ScrollContainer.set_deferred("scroll_vertical", %ScrollContainer.get_v_scroll_bar().max_value) + # TODO: doesn't reach bottom? + + +func _on_line_edit_text_submitted(new_text: String) -> void: + %LineEdit.text = "" + #add_message(new_text) + + var send_chat_message_packet := SendChatMessagePacket.new() + send_chat_message_packet.message = "%s : %s" % ["secondi", new_text] + Network.map_server.send(send_chat_message_packet) diff --git a/chat_window.tscn b/chat_window.tscn new file mode 100644 index 0000000..54e9b69 --- /dev/null +++ b/chat_window.tscn @@ -0,0 +1,36 @@ +[gd_scene load_steps=2 format=3 uid="uid://c8uqw08hxfqlu"] + +[ext_resource type="Script" path="res://chat_window.gd" id="1_vovuq"] + +[node name="ChatWindow" type="PanelContainer"] +offset_right = 320.0 +offset_bottom = 175.0 +script = ExtResource("1_vovuq") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 2 + +[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +theme_override_constants/margin_left = 4 +theme_override_constants/margin_top = 4 +theme_override_constants/margin_bottom = 4 + +[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer/MarginContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_vertical = 3 +horizontal_scroll_mode = 0 +vertical_scroll_mode = 2 + +[node name="ChatWindow" type="VBoxContainer" parent="VBoxContainer/MarginContainer/ScrollContainer"] +unique_name_in_owner = true +layout_mode = 2 + +[node name="LineEdit" type="LineEdit" parent="VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +placeholder_text = "Send Messages here" + +[connection signal="text_submitted" from="VBoxContainer/LineEdit" to="." method="_on_line_edit_text_submitted"] @@ -1,9 +1,18 @@ extends Node +var account: Dictionary = { + "id": "", +} + +var character: Dictionary = { + "name": "", +} + + #func _ready() -> void: #var grf = GRF.open("res://data/data.grf") - #grf.extract("user://data") + #grf.convert()#"user://data") #Sprite.from_bytes(FileAccess.get_file_as_bytes("res://data/extracted/data/sprite/cursors.spr")) #ActionFormat.from_bytes( diff --git a/client.tscn b/client.tscn index 7d17661..d0dacf3 100644 --- a/client.tscn +++ b/client.tscn @@ -1,9 +1,10 @@ [gd_scene load_steps=3 format=3 uid="uid://cuylx656oarpy"] [ext_resource type="Script" path="res://client.gd" id="1_e4txq"] -[ext_resource type="PackedScene" uid="uid://n0y3fpb8j820" path="res://cursor.tscn" id="2_m3abr"] +[ext_resource type="PackedScene" uid="uid://n0y3fpb8j820" path="res://cursor.tscn" id="2_abx5m"] [node name="Client" type="Node"] script = ExtResource("1_e4txq") -[node name="Cursor" parent="." instance=ExtResource("2_m3abr")] +[node name="Cursor" parent="." instance=ExtResource("2_abx5m")] +z_index = 1024 diff --git a/constants.gd b/constants.gd index 562c54e..61fa1b2 100644 --- a/constants.gd +++ b/constants.gd @@ -42,11 +42,18 @@ static var PacketDB = { RequestCharacterListSuccessPacket.HEADER: RequestCharacterListSuccessPacket, SelectCharacterPacket.HEADER: SelectCharacterPacket, CharacterSelectionSuccessPacket.HEADER: CharacterSelectionSuccessPacket, + CharacterSelectionFailedPacket.HEADER: CharacterSelectionFailedPacket, MapServerLoginPacket.HEADER: MapServerLoginPacket, MapServerLoginSuccessPacket.HEADER: MapServerLoginSuccessPacket, + FriendListPacket.HEADER: FriendListPacket, + ServerMessagePacket.HEADER: ServerMessagePacket, + ChangeMapPacket.HEADER: ChangeMapPacket, ParameterChangePacket.HEADER: ParameterChangePacket, CoupleStatusPacket.HEADER: CoupleStatusPacket, UpdateAttackRangePacket.HEADER: UpdateAttackRangePacket, NewMailStatusPacket.HEADER: NewMailStatusPacket, QuestListPacket.HEADER: QuestListPacket, + AchievementUpdatePacket.HEADER: AchievementUpdatePacket, + AchievementListPacket.HEADER: AchievementListPacket, + UpdateCriticalWeightPacket.HEADER: UpdateCriticalWeightPacket, } @@ -1,26 +1,17 @@ extends Node2D -var sprite: Sprite - var current_action_idx := 0 var last_action_idx := 0 func _ready() -> void: - sprite = preload("res://sprite.tscn").instantiate() - sprite.load_file("res://data/extracted/data/sprite/cursors.spr") - add_child(sprite) - - sprite.action_data.frame_times[0] *= 2.0 - for idx in sprite.action_data.frame_times.size(): - sprite.action_data.frame_times[idx] *= 1.0 - Input.mouse_mode = Input.MOUSE_MODE_HIDDEN + $Actions.play("000") func _process(_delta: float) -> void: - sprite.global_position = get_global_mouse_position() + global_position = get_global_mouse_position() if Input.get_current_cursor_shape() == Input.CURSOR_ARROW: current_action_idx = 0 @@ -29,22 +20,13 @@ func _process(_delta: float) -> void: else: current_action_idx = -1 - if current_action_idx == -1: - Input.mouse_mode = Input.MOUSE_MODE_VISIBLE - sprite.visible = false - elif current_action_idx != last_action_idx: - sprite.set_current_action(current_action_idx) - Input.mouse_mode = Input.MOUSE_MODE_HIDDEN - sprite.visible = true - - if current_action_idx == 0 and sprite.get_node("%SpriteLayers").get_child_count() == 1: - Input.set_custom_mouse_cursor(sprite.get_node("%SpriteLayers").get_child(0).texture.get_image()) - Input.mouse_mode = Input.MOUSE_MODE_VISIBLE - sprite.visible = false + if current_action_idx != last_action_idx: + if current_action_idx == -1: + Input.mouse_mode = Input.MOUSE_MODE_VISIBLE + $Actions.visible = false + else: + Input.mouse_mode = Input.MOUSE_MODE_HIDDEN + $Actions.visible = true + $Actions.play(str(current_action_idx).pad_zeros(3)) last_action_idx = current_action_idx - - -func _input(event: InputEvent) -> void: - if event is InputEventMouseButton: - pass diff --git a/cursor.tscn b/cursor.tscn index 96efc47..11e46a7 100644 --- a/cursor.tscn +++ b/cursor.tscn @@ -1,6 +1,9 @@ -[gd_scene load_steps=2 format=3 uid="uid://n0y3fpb8j820"] +[gd_scene load_steps=3 format=3 uid="uid://n0y3fpb8j820"] [ext_resource type="Script" path="res://cursor.gd" id="1_gyqds"] +[ext_resource type="PackedScene" uid="uid://biyt4m7dnch83" path="res://data/extracted/data/sprite/cursors/actions.tscn" id="2_6gt4s"] [node name="Cursor" type="Node2D"] script = ExtResource("1_gyqds") + +[node name="Actions" parent="." instance=ExtResource("2_6gt4s")] diff --git a/extractor/action_format.gd b/extractor/action_format.gd index ff2ba64..719bc2d 100644 --- a/extractor/action_format.gd +++ b/extractor/action_format.gd @@ -57,18 +57,22 @@ static func from_bytes(bytes: ByteStream) -> ActionFormat: version.major = bytes.decode_u8() action_format.version = version + if version.major < 2 and version.minor < 3: + print(version) + return action_format + action_format.action_count = bytes.decode_u16() action_format.reserved = bytes.get_buffer(10).bytes action_format.actions = [] as Array[ActionData] for idx in action_format.action_count: - var action = ActionData.from_bytes(bytes) + var action = ActionData.from_bytes(bytes, version) action_format.actions.append(action) action_format.event_count = bytes.decode_u32() action_format.events = [] as Array[Event] for idx in action_format.event_count: - var event = Event.from_bytes(bytes) + var event = Event.from_bytes(bytes, version) action_format.events.append(event) action_format.frame_times = [] as Array[float] @@ -95,13 +99,13 @@ class ActionData: return length - static func from_bytes(bytes: ByteStream) -> ActionData: + static func from_bytes(bytes: ByteStream, version: Version) -> ActionData: var action = ActionData.new() action.motion_count = bytes.decode_u32() action.motions = [] as Array[Motion] for idx in action.motion_count: - var motion = Motion.from_bytes(bytes) + var motion = Motion.from_bytes(bytes, version) action.motions.append(motion) return action @@ -135,7 +139,7 @@ class Motion: return 44 + SpriteLayer.BYTE_LENGTH * sprite_layer_count + SpriteAnchor.BYTE_LENGTH * sprite_anchor_count - static func from_bytes(bytes: ByteStream): + static func from_bytes(bytes: ByteStream, version: Version): var motion = Motion.new() motion.unused = bytes.get_buffer(32).bytes @@ -143,7 +147,7 @@ class Motion: motion.sprite_layer_count = bytes.decode_u32() motion.sprite_layers = [] as Array[SpriteLayer] for idx in motion.sprite_layer_count: - var sprite_layer = SpriteLayer.from_bytes(bytes) + var sprite_layer = SpriteLayer.from_bytes(bytes, version) motion.sprite_layers.append(sprite_layer) motion.event_id = bytes.decode_s32() @@ -151,8 +155,8 @@ class Motion: motion.sprite_anchor_count = bytes.decode_u32() motion.sprite_anchors = [] as Array[SpriteAnchor] for idx in motion.sprite_anchor_count: - var sprite_anchor = SpriteAnchor.from_bytes(bytes) - motion.sprite_anchor_count.append(sprite_anchor) + var sprite_anchor = SpriteAnchor.from_bytes(bytes, version) + motion.sprite_anchors.append(sprite_anchor) return motion @@ -194,10 +198,17 @@ class SpriteLayer: ## Byte Type: f32 [br] ## Byte Length: 4 + ## Versions: [2.3, 2.4] + var scale: float + + ## Byte Type: f32 [br] + ## Byte Length: 4 + ## Versions: [2.5] var scale_u: float ## Byte Type: f32 [br] ## Byte Length: 4 + ## Versions: [2.5] var scale_v: float ## Byte Type: i32 [br] @@ -226,14 +237,20 @@ class SpriteLayer: func get_scale() -> Vector2: - return Vector2(scale_u, scale_v) + if scale: + return Vector2(scale, scale) + else: + return Vector2(scale_u, scale_v) func get_size() -> Vector2: - return Vector2(width, height) + if width and height: + return Vector2(width, height) + else: + return Vector2.ZERO - static func from_bytes(bytes: ByteStream): + static func from_bytes(bytes: ByteStream, version: Version): var sprite_layer = SpriteLayer.new() sprite_layer.position_u = bytes.decode_s32() @@ -244,12 +261,19 @@ class SpriteLayer: sprite_layer.color_g = bytes.decode_u8() sprite_layer.color_b = bytes.decode_u8() sprite_layer.color_a = bytes.decode_u8() - sprite_layer.scale_u = bytes.decode_float() - sprite_layer.scale_v = bytes.decode_float() + + if version.major == 2 and version.minor >= 4: + sprite_layer.scale_u = bytes.decode_float() + sprite_layer.scale_v = bytes.decode_float() + else: + sprite_layer.scale = bytes.decode_float() + sprite_layer.rotation_degrees = bytes.decode_s32() sprite_layer.type = bytes.decode_u32() - sprite_layer.width = bytes.decode_u32() - sprite_layer.height = bytes.decode_u32() + + if version.to_string() == "2.5": + sprite_layer.width = bytes.decode_u32() + sprite_layer.height = bytes.decode_u32() return sprite_layer @@ -278,7 +302,7 @@ class SpriteAnchor: return Vector2(position_u, position_v) - static func from_bytes(bytes: ByteStream): + static func from_bytes(bytes: ByteStream, version: Version): var sprite_anchor = SpriteAnchor.new() sprite_anchor.unused = bytes.get_buffer(4).bytes @@ -297,7 +321,7 @@ class Event: var name: String - static func from_bytes(bytes: ByteStream): + static func from_bytes(bytes: ByteStream, version: Version): var event = Event.new() event.name = bytes.get_string_from_utf8(BYTE_LENGTH) diff --git a/extractor/actions.gd b/extractor/actions.gd new file mode 100644 index 0000000..5c94cef --- /dev/null +++ b/extractor/actions.gd @@ -0,0 +1,13 @@ +extends Node2D + + +@onready var animation_player: AnimationPlayer = %AnimationPlayer +@onready var sprite_layers: CanvasGroup = %SpriteLayers + + +func play(animation_name: StringName = &"", custom_blend: float = -1, custom_speed: float = 1.0, from_end: bool = false): + animation_player.play(animation_name, custom_blend, custom_speed, from_end) + + +func pause(): + animation_player.pause() diff --git a/extractor/grf.gd b/extractor/grf.gd index 7e7e93c..fa7021a 100644 --- a/extractor/grf.gd +++ b/extractor/grf.gd @@ -140,7 +140,7 @@ class FileEntry: @warning_ignore("shadowed_variable") static func from_bytes_with_filename(bytes: PackedByteArray, file_name: String): - print(file_name) + #print(file_name) var file_entry = FileEntry.new() file_entry.file_name = file_name @@ -199,14 +199,214 @@ func extract(destination: String = "res://data"): var file = FileAccess.open("%s/extracted/%s" % [destination, file_path], FileAccess.WRITE_READ) file.store_buffer(file_entry.get_contents(file_access)) - - # TODO: write pngs for sprites (and .tres files maybe if necessary) - # TODO: (also maybe write .tres files for action data files(whatever they are)) +func convert(destination: String = "res://data"): + for file_entry in file_entries: + var file_path: String = file_entry.get_file_path() + + var base_directory = DirAccess.open(destination) + var base_directory_path = "extracted/%s" % file_path.get_base_dir() + base_directory.make_dir_recursive(base_directory_path) + base_directory.change_dir(base_directory_path) + + var file_name = file_path.get_file().substr(0, + file_path.get_file().length() - (file_path.get_extension().length() + 1) + ) + var base_file_directory_path := "%s/%s" % [base_directory.get_current_dir(), file_name] + + #DirAccess.make_dir_recursive_absolute(base_file_directory_path) + + if file_path.ends_with(".spr") and file_path.contains("cursors"): + var sprite = SpriteFormat.from_bytes(file_entry.get_contents(file_access)) + sprite.save_to_file(base_file_directory_path) + + elif file_path.ends_with(".act") and file_path.contains("cursors"): + if not FileAccess.file_exists("%s/000.png.import" % base_file_directory_path): + continue + + var scene := PackedScene.new() + var scene_root := Node2D.new() + scene_root.name = "Actions" + scene_root.set_script(load("res://extractor/actions.gd")) + + var animation_player := AnimationPlayer.new() + animation_player.name = "AnimationPlayer" + animation_player.unique_name_in_owner = true + scene_root.add_child(animation_player) + animation_player.owner = scene_root + + var sprite_layers := CanvasGroup.new() + sprite_layers.name = "SpriteLayers" + sprite_layers.unique_name_in_owner = true + + scene_root.add_child(sprite_layers) + sprite_layers.owner = scene_root + + var track_properties = [ + "animation", + "frame", + "speed_scale", + "position", + "self_modulate", + "scale", + "rotation_degrees", + "flip_h", + "visible", + ] + + var sprite_frames := SpriteFrames.new() + #sprite_frames.add_animation("default") + for img_file_path in DirAccess.get_files_at(base_file_directory_path): + if img_file_path.ends_with(".png"): + sprite_frames.add_frame("default", load("%s/%s" % [base_file_directory_path, img_file_path])) + + var animation_library := AnimationLibrary.new() + var action_data := ActionFormat.from_bytes(ByteStream.from_bytes(file_entry.get_contents(file_access))) + + # get max number of sprite layers for all actions + var action_sprite_layers_max_count = action_data.actions.reduce(func(accum, action: ActionFormat.ActionData): + return max(accum, action.motions.reduce(func(accum2, motion: ActionFormat.Motion): + return max(accum2, motion.sprite_layer_count) + , 0)) + , 0) + + # add Nodes for each sprite layer + for sprite_layer_idx in action_sprite_layers_max_count: + var sprite = AnimatedSprite2D.new() + sprite.centered = false # 必要!! + sprite.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST + sprite.sprite_frames = sprite_frames + sprite.name = str(sprite_layer_idx).pad_zeros(3) + sprite_layers.add_child(sprite) + sprite.owner = scene_root + + for action_idx in action_data.actions.size(): + var action: ActionFormat.ActionData = action_data.actions[action_idx] + var frame_timing_base := ((action_data.frame_times[action_idx] * 24) / 1000) + + if file_path.contains("cursors") and action_idx == 0: + frame_timing_base = ((action_data.frame_times[action_idx] * 24 * 2) / 1000) + + # add animation for each action + var animation := Animation.new() + animation.loop_mode = Animation.LOOP_LINEAR + animation.length = frame_timing_base * action.motion_count + animation_library.add_animation(str(action_idx).pad_zeros(3), animation) + + # TODO: set animation max length + + # get max number of sprite layers for current action motions + var motion_sprite_layers_max_count = action.motions.reduce(func(accum, motion: ActionFormat.Motion): + return max(accum, motion.sprite_layer_count) + , 0) + + # add animation tracks for each sprite layer + for sprite_layer_idx in motion_sprite_layers_max_count: + var sprite := sprite_layers.get_child(sprite_layer_idx) + for property_idx in track_properties.size(): + var track_idx = (sprite_layer_idx * track_properties.size()) + property_idx + animation.add_track(Animation.TYPE_VALUE, track_idx) + animation.value_track_set_update_mode(track_idx, Animation.UPDATE_DISCRETE) + animation.track_set_path( + track_idx, + "%s:%s" % ["SpriteLayers/" + sprite.name, track_properties[property_idx]] + ) + + for i in range(motion_sprite_layers_max_count, action_sprite_layers_max_count): + var sprite := sprite_layers.get_child(i) + var track_idx = animation.add_track(Animation.TYPE_VALUE) + animation.track_set_path( + track_idx, + "%s:visible" % ["SpriteLayers/" + sprite.name] + ) + animation.track_insert_key(track_idx, 0.0, false) + + # add animation tracks + for motion_idx in action.motions.size(): + var motion: ActionFormat.Motion = action.motions[motion_idx] + + var timing = motion_idx * frame_timing_base + var visible_key = 0 + + # add visible = false animation tracks to other sprite_layers + for i in motion_sprite_layers_max_count: + var track_idx = i * track_properties.size() + track_properties.find("visible") + visible_key = animation.track_insert_key(track_idx, timing, false) + + for sprite_layer_idx in motion.sprite_layers.size(): + var layer: ActionFormat.SpriteLayer = motion.sprite_layers[sprite_layer_idx] + + var track_base_idx = sprite_layer_idx * track_properties.size() + + animation.track_insert_key( + track_base_idx + track_properties.find("animation"), + timing, + "default" + ) + + animation.track_insert_key( + track_base_idx + track_properties.find("frame"), + timing, + layer.sprite_index + ) + + animation.track_insert_key( + track_base_idx + track_properties.find("speed_scale"), + timing, + 1.0 + ) + + var layer_image := sprite_frames.get_frame_texture("default", layer.sprite_index) + var position: Vector2 = layer.get_position() - ceil(layer_image.get_size() / 2) # for fixing half pixel drawing + var rotated = layer_image.get_size().rotated(deg_to_rad(layer.rotation_degrees)) + var distance = layer_image.get_size() - rotated + animation.track_insert_key( + track_base_idx + track_properties.find("position"), + timing, + position + (distance / 2) + ) + + animation.track_insert_key( + track_base_idx + track_properties.find("self_modulate"), + timing, + layer.get_color() + ) + + animation.track_insert_key( + track_base_idx + track_properties.find("scale"), + timing, + layer.get_scale() + ) + + animation.track_insert_key( + track_base_idx + track_properties.find("rotation_degrees"), + timing, + layer.rotation_degrees + ) + + animation.track_insert_key( + track_base_idx + track_properties.find("flip_h"), + timing, + layer.flip_h + ) + + animation.track_set_key_value( + track_base_idx + track_properties.find("visible"), + visible_key, + true + ) + + animation_player.add_animation_library("", animation_library) + scene.pack(scene_root) + + # TODO: doesn't work if png is not imported via editor focus => run game twice + ResourceSaver.save(scene, "%s/actions.tscn" % base_file_directory_path) + static func decode_string(bytes: PackedByteArray): return bytes.get_string_from_ascii() + @warning_ignore("unreachable_code") # TODO: check unicode codepoints and parse accordingly var string = bytes.get_string_from_utf32() if string == "": diff --git a/extractor/sprite_format.gd b/extractor/sprite_format.gd index fab0873..46b20c1 100644 --- a/extractor/sprite_format.gd +++ b/extractor/sprite_format.gd @@ -108,10 +108,11 @@ static func from_bytes(bytes: PackedByteArray) -> SpriteFormat: return sprite_format -func save_to_file(): - assert(filepath != "") +func save_to_file(base_dir: String = ""): + if base_dir == "": + assert(filepath != "") + base_dir = filepath.substr(0, filepath.length() - 4) # cut off .spr - var base_dir = filepath.substr(0, filepath.length() - 4) # cut off .spr DirAccess.make_dir_recursive_absolute(base_dir) for idx in palette_image_data.size(): @@ -124,7 +125,8 @@ func save_to_file(): data.get_rgba_data(palette) ) - image.save_png("%s/%s.png" % [base_dir, str(idx).pad_zeros(3)]) + var path = "%s/%s.png" % [base_dir, str(idx).pad_zeros(3)] + image.save_png(path) func files_exist() -> bool: diff --git a/extractor/sprite_layer_resource.gd b/extractor/sprite_layer_resource.gd new file mode 100644 index 0000000..d67707e --- /dev/null +++ b/extractor/sprite_layer_resource.gd @@ -0,0 +1,10 @@ +class_name SpriteLayerResource +extends Resource + + +@export var index: int +@export var position: Vector2 +@export var color: Color +@export var scale: Vector2 +@export var rotation_degrees: float +@export var flip_h: bool diff --git a/sprite_resource.gd b/extractor/sprite_resource.gd index 380fac4..380fac4 100644 --- a/sprite_resource.gd +++ b/extractor/sprite_resource.gd @@ -9,24 +9,33 @@ var current_character_information: CharacterInformation func _ready() -> void: switch_screen(%Login) - #$AudioStreamPlayer2.play() + #$BackgroundMusic.play() + + # TODO: check why TextureRect doesn't work + #get_tree().root.size_changed.connect(func(): + #$Background.scale = get_viewport_rect().size / $Background.get_rect().size + #) func switch_screen(screen: Node): for node in get_children(): - if node is Control: + if node is CenterContainer: node.visible = false screen.visible = true func _on_login_pressed() -> void: - $AudioStreamPlayer.play() + $ButtonClickSound.play() Network.login_server.login(%Username.text, %Password.text) account_information = await Network.login_server.logged_in character_server_information = account_information.character_server_information + Client.account.id = account_information.account_id + + get_tree().root.add_child(Network.login_server.get_keep_alive_timer()) + for node in %CharacterServerList.get_children(): node.queue_free() @@ -41,7 +50,7 @@ func _on_login_pressed() -> void: func _on_character_server_login_pressed(character_server_info: CharacterServerInformation) -> void: - $AudioStreamPlayer.play() + $ButtonClickSound.play() Network.character_server = CharacterServer.new( character_server_info.get_server_ip(), character_server_info.server_port @@ -54,11 +63,18 @@ func _on_character_server_login_pressed(character_server_info: CharacterServerIn account_information.gender ) - var _response = await Network.character_server.logged_in - var response: CharacterServerLoginSuccessCharacterListPacket = await Network.character_server.logged_in_character_list + var response = await Network.character_server.received_packet + if response is CharacterSelectionFailedPacket: + print("character server login failed") + %ChatWindow.add_message("character server login failed") + return + + get_tree().root.add_child(Network.character_server.get_keep_alive_timer()) - for slot_idx in response.character_information.size(): - var info: CharacterInformation = response.character_information[slot_idx] + var character_list: CharacterServerLoginSuccessCharacterListPacket = await Network.character_server.logged_in_character_list + + for slot_idx in character_list.character_information.size(): + var info: CharacterInformation = character_list.character_information[slot_idx] var character = Button.new() character.mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND character.text = info.name @@ -72,14 +88,14 @@ func _on_character_server_login_pressed(character_server_info: CharacterServerIn func _on_character_selected_pressed(slot_idx: int): - $AudioStreamPlayer.play() + $ButtonClickSound.play() Network.character_server.select_character(slot_idx) - var packet = await Network.character_server.selected_character - if packet is CharacterSelectionSuccessPacket: + var selected_character = await Network.character_server.selected_character + if selected_character is CharacterSelectionSuccessPacket: Network.map_server = MapServer.new( - packet.get_map_server_ip(), - packet.map_server_port + selected_character.get_map_server_ip(), + selected_character.map_server_port ) Network.map_server.login( @@ -89,5 +105,12 @@ func _on_character_selected_pressed(slot_idx: int): account_information.gender ) var _response = await Network.map_server.logged_in + + Client.character.name = current_character_information.name # TODO: switch to game :) + # TODO: check next packages to sent to server, most probably to map server + Network.map_server.received_packet.connect(func(packet: Packet): + if packet is ServerMessagePacket: + %ChatWindow.add_message(packet.message) + ) @@ -1,8 +1,14 @@ -[gd_scene load_steps=4 format=3 uid="uid://dser74lcd3a4g"] +[gd_scene load_steps=6 format=4 uid="uid://dser74lcd3a4g"] [ext_resource type="Script" path="res://login.gd" id="1_1m5cv"] -[ext_resource type="AudioStream" uid="uid://c2xge60t573wc" path="res://data/extracted/data/wav/¹öÆ°¼Ò¸®.wav" id="2_aeqi0"] +[ext_resource type="Texture2D" uid="uid://cxd6dnc7s17vg" path="res://backround.jpg" id="2_elmti"] [ext_resource type="AudioStream" uid="uid://br8ujl4uxv14a" path="res://data/BGM/01.mp3" id="3_2nukd"] +[ext_resource type="PackedScene" uid="uid://c8uqw08hxfqlu" path="res://chat_window.tscn" id="4_ah2a1"] + +[sub_resource type="AudioStreamWAV" id="AudioStreamWAV_f4kp2"] +data = PackedByteArray("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz/AAAAAAAAAAAAAAAAAAAAAPr/BAAAAAAAAAAAAAAAAAAAAPz/BgD8/wAAAAAAAAAA+v8AAAAABAD8/wAAAAAAAAAA+v8EAAAAAAAAAAAAAAAAAAAA/P8AAPr/BAAAAAAAAAAAAAAA+v8AAAAAAAD6/wAACAAAAAAAAAAJAAAA9/8AAAAAAADw/wAABgAAAPj/AAAMAAAA+P/4/wkAAAD8/wAAEgAEAAAAAAAEAAQA9P/8/wAADQD8/wAAAAAQAAAA9P8AAAAACADo/wQAAAAVAPr/AAANAAAAAADX/xYA/P8NAPD/DAAdAPf/BADf/yYA4v8AAPT/GwAQAO7/GAD3/yEAyP8IAPP/DAD6//j/KAAAABsA2P8WAO7/AADu//z/GAD3/xsA+P8eAPf/AADz//D/wAAbAJ7/3f6c/hX+3P21/e79Of6Q/kb/8P/GADsBmgHZAQYC6wF5ARYBxQApAIn/Rv8V/6/+V/6C/s/+Hf8x/6X/PwCSANEALAG2AcoBjwFeATUByQAAAH3/R//k/g/+pf3z/SX+X/5x/h3/zv84AJMALAGwAZoBkAF5AWUB0gApANj/UP8E/0T+Tf42/lX+bP6h/mH/qf9eAKwAeQGQAdkB8gHTAZABugC6AMj/lP/A/sL+Lf7I/er91v1w/jn+Xf+O/4AAqQA3AfYBswHpAV4ByAHzAG8A8P+U/0f/MP5Q/h7+dv5X/sn+ov8AAIEA4QCGAbMBsAGPAZoBcwH2ADgAGAB5/yn/jf52/nn+IP55/mD+WP9h/yYAjAAcAbwBnAEjAqkBCgJAAfYAWgC7/3f/i/7C/l/+m/59/tT+jv++/0UASgBqAacBsAGUAbYBvwELAbwAVgAWAH//4f7C/tr+y/6v/hn/u/8AAFEA/gDHATUCSAJoAmgCBgKcAQoBsAAeAIX/V/8C/wz/r/7s/tr+Xv8MAIcAUQFiAXwCIgJoAvYBGALxAQIB+QAeAF4ABP/y/sD+lv6S/iz+Rv9G/xAACQD+AHoBUQFqAUUB0wH2AKgAOQAVAGH/v/6v/n3+Dv6x/ej9i/7L/ur+pf+AAP4AWwAlAfYAzQE7AfwALAGy/9r/9P32/jX93f3p/F/9of4Y/WH/Zv5kAAQAewDIAV4APwImAJoBSgCK/+L/7v0v/7b8IP5W/Ub9R/6D/ff/h/5bAH0AOwH2AZIA7wJFAU8CIwHdAE4B1P4bAN39af/L/bj9yf4K/i0Agf4mAYgATgG4AU0BFwMcAREC8gAUAYEA6v7H/wX+iv5b/an9Tf6l/SX/ef52AAYArACXAQcBJwLjALYB3QDCAIkAKf/u/yf++f4B/iD+p/5H/qX/Pv/GALkAIAG9AVIBfAKzAbkBxAFkAYsB0/+BAHf/7f6v/sL9kP/9/W3/8v4/ANoAuP/rAVoAjgI9AAQBTQHf/8IAA/7LAOL93f7i/bv9Z//k/OP/0f2iAI7/TwDxAYAAHwNnAI4C1QATAfQAHf+6ADn+oP8F/pb+Df/G/QAAUP7jAHIAEwHlASUBmwM7ASUDZAEiAgoCuP9FARn/owAn/uH+K/+B/tf/3f28AMP/bACTAMsAkgJyANkB7QADAvQAjv/dAA7/TP/a/Pb9gv5R/Xr+p/1yAFz/u//5ACwB2wLtAA4DVAINAn4BOACDAcn+Hf9Z/mj+gv4+/Uf/ZP5E/5n/w/+5AfT/dwLIAcsCsQJFAZADAAB/Aer+cgAr/xj9ev7v/IP/hfxH/4D/AADAALT+yQN7ADEDvgAOAw4DNgAzAiX+EgK2/NT+UP7W/eL/rfxMARX+fgGF/8AApgJPAKcDGgEGBD4CJwIMAkz/IwHy/Nv+efzG/O79y/vU/nn8RQBf/lD/wgCm/3cCQP81AqIAywAbAKv9BAAn/Bf+rvsl/W79Bfyu/jz9AAA5/hIAGgG6AIECGQGsAzUC/wESAqIAUQG4/qD/Wf5Q/tT+iP02ALT+awAyACUBRQI3AakD/wHKA3wCLwKhAlMAWAEa/4X/Vf5o/X3+vPwC/+r9hf+RAKX/vQKkAHwDOwF4ArcC2wBwA+H+SwKu/kL/hv6//KX/ovpFAI786wBA/5H/uQPe/zUELv+aBKEBdgFMAnP/MgPO/D8AX/1U/qv9Fvvw/5L8BgCM/YMAAwJe/8sCLgApBP4AoQHdAkIALwJD/RYBu/27/Vn+TvwpAND7TwDT/RAARQC7/jIDBP/8AgAAYQJfAUT/TQF7/TkA+fun/r39+Pzq/fz8r//b/Hb+iv5H/ygAf/6sAeMAcwHw/0gA4wAc/lX+hPxH/s38mvse/Yj94f5P/R7/PwA5AJ8A/gDqAkMCjwFPAmUBvAGF/6X/hf9K/s/+KP0K/zD+Av/b/pD+sAGA//AC/gBHAxwDcgJuBIcARAT8/j0BQ/7U/hn/Bfza/7z72gBN/YD/jACx/48COv9zBEgBpwN+AgYCbASy/woCu/6tAOr+Sv3B/8P8tADb/Pr/vgDB/7cCGwBPBSsCnwTOAzgClATB/1sDAv/VAF7+Q/5bAKX8uQGn+38Bof5eANcAawDQA6//EQUZAQ4D2QFCAB4CrP3UAQX9bABZ/kH+uQDO/CQCF/6vArABqQEFBacB0wUaAaEDjQLmAD4CLP6NAjj9Av/j/dX9qv+0+8j/5v4QAH3/7P7WA3YAiQLAAHQCtwJz/6EBaf/LAIb+Bf1gABj8Dv+y+yX/Ff+a/VIBBv5zBHD+bAKiAUUBAQOJ/24DNf8xAZz/T/0QALH6r/8i+6X9ovwV/rkA1P4qAocAkQGKAbkAHgXyADMDh/5+AQz/vPx6/v/8nP9z+5L82f2V/dP/MP5HAxsAtwL8/rYCLAMQAbcCBP/aA7X9yP/E/KP94v1q+rH/hPoM/6r7Gv8nAs0BOAXnAPsEZ/8aApQBu/8KAp/9DAJK/R3/TvzX+x3/7vtRAKX9UwOoB70CCv6O+2EEEgRrAoD72vzrAKf90AP2+UL8e/zi/eb+XvuiASL7WQR3AIUCmQKo/skD2wGuBrkDA/4lBnv8hge99jEBUvzXAG4E8/bB/4H0YgOxBLgBjwiM+sYMFvk18anRuMt68nYhJViQRA4q+Q10AsYAXueu8L/a2d6X2zPVteOX3OLrffuRG9cv8z7cQ6cs2ym/ITYipA7R2hnEm7V+0ODGbMaMupfPl+yx/3ojbznxTM5nrE9bR4klXg38+b7t3doJ0Be/yLY+pcyqWMHr62oHehmxL5JAU0rnRQI0+DKWM+8hQxNb82rRw8TfxNnLa8uJwivZZ+/g/Ef/kxZNMoc8YDLrKYMvDzTkEC0CdPkD9Rryb9Zm0k/QX9Gt6TXxP/ro+fkIWRpUDN79R/yZKx86jDTtDo3+kAFH85frsPOlDRAHSeg51z3IkvLE94EBbe3p9EYjwCrIIBMBkAa0JNYr7SqCCekEVez+6gDu2uCT2lTIVdZd1gfYWPMLDSwaeAZ7HAYx/ztzKRoSoSUXHEMFrOJg3Jvc+8PzzMLP2d3k1Xbaff+sB58UaiepPfw+eia1H5Qp2B5P/QvuJPRe6fDPnb6pzRfd198N5k70zPjnBOQgxS8wJHYdrh5pN1AlNAsbBiD+e+5P3I7dWui03IPTMdvU8mj4UP9qESIZvxgoGvsl6jF6Ho0M5Bg8FLwN+fEZ7nvwHuez4BDoFOrw4lLlgPDP+zsF+gT7FnwaSh9vGiQkVxwjEswSPgpQCwfxZ+FB523bQ90o1SHbBuS/6QkAGwZuGf4XSDD9PLsxpifgGswXHg+TAKT4mes537LJddayyirdm9lr4qry/vf+F/MoKzDQMOQwHkCGM2QogwR5+7vt7dw22PfNbsIGwhXKttVP5lz1BgvbHiAhkDEYPP1FEEBYKxYfmxceAK7oidntz6C/BcGnyD3Ul9wI3TX8bBiEG6gmgivdPMM61y/qLLInUg+t9A7r0eF+0PbEHcqZ017VJ9b54Yn09/8AGGslXy5dMIwriTKIL1EcjxTeCRX8M+nV2lbVtdNDzCjR8dka5crtDARVEVsZ9x9SLhc5tTZLHgwnHR3gFDj7wOgk6J/cB8zfyxzRC9a71WvtSPTpC4oInB8vLKAzdC7rM8E11x2rDpD6/Pir6BzRk9KayxDOksx+1Crl9vB0BZob5S19LP0tYDsKOy8t1CJGF1sMF+8G3vnRNcvDwBTDQMnu0yPfwudPBRsUVSQCM0E5WDnYLSUxGydeGbH6V+ee5kfWT8cau6nEq87n2PDfmfpTCigT1iXnL4c8vjdmNyEyKSAeDngA/PyZ5r/SOse6zpXU7tE81q3kmfbLAJ4XJiBZLa0u4zR2OZ4rRx9pEjsLMfUl6Xnfrtpf04rKqNX63pfo6eeh/lMJuhUCIYgt6z+/Njoz0iufHNwHye5A7mvj09dSxb3OHdPw1q3ZX+y7/z4MmBCnHZYriTHJLBsw1SFjGI0FEP318VPii9Or2GvTh9EWz9fjuPPU/hYAQg7pHksl7SvgLrkpFSIhHIIVXQic80jiQ+TM2Y3XB9Kl1znecd9G8WQBTha9F5Ai2Ch0LMIpZB8FH2ERggVn91D14eTk1SjRpc7w1pfRcd959XcAhgc5DUol1yxNMw0rmi//Js0bmgvPABPxDuK61pXROdDTzajVoeSw5wD23QCfGgElky2eK9I1ljI/KIgXzwaQ/mHzCemJ1z/MhsqvzGbYpNjN6vP5sAoeFIwYBCnNNZ80fCgEIkgg7xS8BJDwnOYx29HT8dRj1vLXUNnD5lb5wQSLDSsXNSz3LdUtgypgKnImZA/hBDn5LfIX4dDWgdQE0XfTcdjY5aPuMPh+CEwdAiikJiYsei0wMBobdxYnDuoEJPSn5Y7fCdc304jOm9mS4ejtlwCVCBkW2xpaL6Qy/y8nKA8kYShvEvAEaPDA6O3c6dBY0gfSZNpk4I3tTPWH/EkOkh6PLPYn/SlpMjEzBB9sCTkAR/ol8Dneu9gs1e/RfM9f2p7mnvmvAioStR/GKLws6jEFLocmvhjSGc4KSv3u47zcGtlT0/3MB89/2YvqAPHtAE8IoxtEIRYrtCiYJhApsCNrGU4BzPRH8Mjk5NkdypvSttTx3XveOeoC/GAFJxg4HlwoSipKKgUpix1lFZQHhwLr8BnjKNeT2NzXWtOP0k3eP/Ta/BEFJw6JHisrDynvJ+kg4CIaF8kP+PxJ8JfnLuG03kPRm9Rs3FDoQ+/Z8fYEMxH7It0fhiShJ5gmICfkFwgSOAXP+7nwROLV3wnZ5d/022rg++fC8xgASwbbEUkemSjyKoAi5x+NFSgXOgzvAqLyD+Ym4NLZT9Mk1OTedu0D8RL2JAKlFnEekyBQIA4npCYyIRgShggr/171r/E+43zcgtI12hDfVOSw7b/0JQYCC20VaB5KJUMrbR5dIF0QAxCF/xj4zuxL4ArhANqI3VvXoNs+6/zygQE9Beca6iBcJQ8hRSPtJrgdcRP8A0T8B/EH51/fCtue2eXbdOTs6T/w7PmICywYdx11IJMkxiyqJfMeQRTnDGgBAvGg6rbeWd/x2b3dFd894WvxcPsNDBoPYhlQKHcokStcHvQi5BbdDRP/DvOE8KLiMt7903/VwN9u5N30r/H1BIQOOyHxI7AgMiahJVMnmBdHC6wDvff973jeod1V1m3bQ9sk4pbpO/WuArEQjBbfG5kisCpTKFEevRbsFD4KcPy+56HlhNwh3hvWLNzi42/s7/ZE+BoFBQ82HTElzR+0JNUc4CKCE1MIEvxb80DxfOH83efXPt4o4Rnk5O6w82sFDQ+4GQ4exh8FKv8mDSMWFJEPzgi0+jrsBeD54UzdLdo22P7f+u0j+K8CLwuxFhggCCgfJ4wiGSAoGzIVFgEk+EHro+uT3oLYOtf82nrm9ejo89T81wkUGUEckyYIHREoiiBeHe8OcAEEA9nz1Oxf2rzc2uAo3CTiReBf9UH6ggewDuwU8iF/H7ooBh7gGlMT/AwNBPvwnuup57Pkhtyw1fDf5+ZN7jfw8P5tDeQXyx6mIxAkXSR3HVkbAQ3WAl76sfX77KPb/teh3Bfh/uGv4XH0zwCrDoAPJRh6IIYkeiY5IK4acRFFCI3+N+385JjeLuFe2xTXkNwk6Pvzfvj0AbYSqB1KIzUieyagI7QdAxbnCP392O9k7X7ozt4n2KDbR+fC6g/sU/cRCTYWmRlDHEQjiidpIzEbHhMjC7gBcPkT7pvjc91+3iTj5N5P4+rqNfwDAjQHihKfG9Qjqh80Hpse+hUqEm4Bvv/n7n3sKeWh4CHd/NqX6GjwKfMW+3sDHBl4Fv4eTB43JW4ivRdnFF4HigHf9bPuCukK26jgQd6D5dXhxOke/wkGbhAwDe8ddySFImgg8RmfHN8MUgPb+a7wgeus3UziHdou3nziHe0t+eH61Qi9FpUj1iImH1gloCKgHXoOnwQw/XfwHeqg3sPcPdno3afib+RE7Sb8SAxBFMIUTCF2J3opgxxPGBES6goF++bwPuny4zncgdwL3Obg+ONs8zn+xwaKCnQZpiM4KA4hRiEGIQQZyQmp/If2ze7Y5CffBdqY3gDhcev+7rL1wwELDkcbJxjIHmsjWSekH0QRTA1nBMj6Ju1d4YPiX9ql4C7e1eeb6WLzVwbJBzAS8xUOITAqnh7YHgQZURkmCPf3v/TD5tvncNmg3jPc2+NP68jxjv3P/nERXxtbHywi/Rs4KjkabxRtAmMC6fqx6o7fINsX3qjg3Nw36y3scwFzASYWbRVEHggirCeoI/wbDRIkFDMDp/sx5+DrnOAS4JHZGuCZ5zvwA/o1A0wJYhSkGiQjTh3XHC4d/BqYEOb+hPq38bPsR9ww3DvcC+Um4grr6/BeAaMFthLtE7AgsRwWJ80brB1mCtMPwv1D+YrjzOR94P/iX9p84TTlGPVQ9AQHlAfgGWsaQiX8IW0eYhouFWwOOf5k8q7wy+iH4oTX1tvr48Tkee9A75IHmgmxGb8YaiHwImUjRSDwFyAKTQdZ9wT6Wd8Z5x3afebL3XbiketE9v8BUwhHEB0deRzWKMMdeCL7EtwSkArp+7Hx0eOu6Nzf2NqS26/jm/Eu86j6+wZlEJgdZBkRJhwfNCaZGfoUEwdF/S/1ee5P4xbi39vU50LhD+5d7DIAjQXkEPITSRs/HygjhR92HFIPcw2SAKn8ZuoC6LXhoOVJ3xjh8+e58+n6RP4/CKIRRxytHY4dKx7CG/UXhw65A6b7R/CO8WHj4uOD2trnOua+7Z/vmv1eB7cRERLSHmgb+yl+FN0T/gRiDfEFBPzK7STjQ91L4rjfsOVy4Ub5RPuaBVUE3xWbI9Udfx+iFrwdjRVyDl0C2fMM8VLl8OIC39TcdOrL6xj4AezdAF4KJRm9FjMZ7h8WJXwfxRWHBAkGVvZ9+afnoOfe3vPnzerk5k/q1PLoAuENtApyFFsZaygOHucYFRIjDacMFvyb9e/n8+dr5JzgfeB53xPsi/bg/jsFuAcsGpEYxiEpGa4elhamFesJywLw9rLvi+Xv5vnc4+FU3wDxhO71+oj9eg7yDrYZERhQIzQdsh1EER4SuQPo+2nsluyP5HLloOFC5Hbo2fBY+Bj9OAhVEOQY0RyqHDkcsxppGGwOTgCl/7Hx0fT44EXoc9xv6NXmcuxA9eH6aAhCEhsVCx3rEc0lRBXHGlgFxgXUAWb0ou6p3XzkPuRx3nLmIOWS+1n8cQjSDP8NQCAWGyklYReHFiQUaAmWBM/wau1V7SLjaOjS2WHrrOXO98z4wP6rCgAPDBymG5UcTR+pGGscewbOBUr4Rfrw7pPowuOb45vnDOpx6370Uv2aCSsNexaDFXEemhtBG/ERvw8ACgwA5fm1747t3uZS45Dj+uf174nzVPvxB8AKLRZMEcMeUBj0G7cV7RPqCqQE2/Z59THne+hf2qnrI+B581nr6P+NAK0NUw4+FZkYfiJ+Gf0dWgk7Ekf+TQHm6BHrIOfj5kjiXOC65vTvsfV9/9ADKxEhFlkbXB5lGMgYIxCaExYCAPxk8c31Mesv6HfdaeVp5bHx8/Ar//kCqBPGEQEdnRMCHiQXKxmiC+oGrwK8/Bf03Ou34bjrGOID8fLj7Pnb+YsE9go6DPMZ5xUBHUwZmBPhFHwDJQnv9pj0Jetw58vrmN+z68/pqvN4+B38YAjYDckW7xsnGGwfVBG1GKUGHgXe+OP2h/DF5gTk8Oai4/DpBuZs+NT64gmbCKgUohjvHb4ZVBgcFmkQtApH/pz50O+N7UflZ+NK5ujlo+509RX8GwZEBdAYAA8wILEQ0h6oFhcXAAmu/nT46fZS6dTsMtse7+jlVfbS6q35TQGgC4sNIBFhEqQgBhflHQ8IOA7a/qP9gfSL6kHrGOjh6/Lpcehs8in1MgUpBkAO8BJ0Gf4eHxb/FtcM0A+JBY4CHvQf85DshOpR4hviYuXt7yT2Ff6z/sUR+Q15G8EPyRwyE0IWBxA+Cv4ECfxE8vXu2+Mc6FbdNOs36SH0Jvtp/uoK5QucFswVIxV2HU0UtxjcCUsGPv3C8JXzouI+7SXg++rI6orxH/iX+hkH2A6KEr4ZQhLMHtkU7RcIA3QDffty+sjuvutF5fnqMecn6znqO/Wd/ZUJMQ3rEfITCh4mG68V0w3xCxEKr//A+hbvzu3V6DLp2eXk5gXpVvrF+9EJtAAjFdATjBy4FFsWJBcPFAYMgATG8yv7v+al89/biew25DvzU/R09hX/hgerDlAV4hD3Hb4TJh89DvQOMwNs/gn47O8g7rHnsOeb6mnrku/G88H9bwjfC3kSoRPqHP4XCBckEFEQXwU7Ab33gfYr6y3q+OMd6v/m3fE67+UBOwHQEZ8M4RZHFL8Y6hnCEHkNQwgcA+f+aeyV8L7hMe7/4oPqh+wB8+3+iwEpC3sKQRHqGUQaMxqyEnwQmA58A2L8JO0I84DtnO6B4wnpL+o4+Az2vAAc/qoR+RKEG2oT7BiGE2UY9wisBOn47PzC8wnwp+fz5+vnPu8X7XT27PRsCJoJcRPEElgPvxrnESIYJwX3CG0Bwv019onqj+gG63nnye5v5ET8c/PKCjMCMxDnDiAYIRbSGLUP3hRTA6kL3fSE+iTow+yZ5vPqEesO7OPv7/x5/RsIBAd3FtMTBhxWF1sWthAGCo4F9fxm9kztMe5V66zrhubl6hPxTvYMAIUCogpQEjsXPh2+EWIZIw1tFWUD9P/A9vb1BPTI6tXmFeib6KL20/Hu/ZL8Jw8oEM4SXRGwFOwVbRc4C8kJ4PsEATL1E/GH6ObkDe9Y7DPy1e5T+uoDYAh2DX8NDxRHG6wX5BdqCIkP4wAHBEPv5vEp5yPyFOcV7DXnmvRT9eUBcgD4DNgOqBzyE4wbUQ7eFSIIyAig/bn1wvN07dDtLud15tfps+7b9iL5pABDD+oNMxl6Di8cwBAhFiEMnQh6ATP7lPEG9B7nxfBE3zv1t+jb/MX3/AOqBhsPvBKLFHMSNhkiEXgWAQNzBDv2h/qE7oXsj+ib7ELs8PK38aT49P3kB3EMqQ87EsEVJhhAF0YLTgZkAXP/XPid7mTtBek98O/qOuxV7D33R/8QCFMGOhAdEK4evRGZEgoLvA51CYEByPeN8srt9fEI45vsiuMM9lX01P6pAKED/hD2D8kW2w9rEuQSBBKtCzIAhvfP+kzufPEi46rvM+lv9zfwH/uh+uwK9wcTFXQLCBvGEU8cxQkVDYr/IgBP8wP3Se3G72zqKPGm7afy//MC/xwEWQ1zDQ0VCRbaFjMV3wvEC2j9FwQd9r/3EO7u7lvtwOoJ7k/vBvRNAdgCpRAdCTcXvhFXG+IQ9g6UCQAJagFU/CTxVvD66K/v/Oaz6/LrV/qW/MgCzgJwDOwPKxm/EA4W0w+iFA4LWQQj+MLze/NA75Pqmeoy7fb0qPTi+lD6RAO6DI8QvxShD4cWgBLvFl8FfQJy+F/+HPHU8M3n8/AF74H0QO5v98D75wmKBq8RzgubF5kR4hVBC2IJDQWe//j7MvQZ8NDtOu/S7UXu0+7I+gX7TQumAsAREwuVGcYQ1RReDbAOQAW+Btv0RvtD6SL3geN58f/mmfMU8x79K//7BuwIphGTEAAaPg8pFCMLmw3HAeD8cPbL8jzyGe4+68Lq3O+c8xT4VfviAQAJERKFEvIROxGKEjEPtwllAyf+4PnV93bxLO7h6Wnu1O9G95XzvPz7AlIPBA3DD98PKRQKFCAR9QcEBtP/4gAo8RXyVehU8nvu//HF7m/3Gv/rA5wGlwpnDToT5BRnFAkPBQzqCt0B1fz78I3ySO6L8yDrkfCP7Kn5/fclAx399wzXC98XAQ5tFZgPwBEZB/cFufmi+tvzn/QT7AvuDusM8WHy/fcC+zEEdAjyDGES2g9xFHIL1BStBc4Iu/sH/6L04fKJ7EXs3er58V7uHf2W9RcH9gHGENEJYxCTELcShA5zDcMEUwN0+cD6s+0i74vqv+9h8uHycvSg+rwARwkYBlIPqg5qFuYT4hATCxwHggXL/PH1b/Je7n3z+u188SvtbvVC+lYAIwWbCAUP8RMGFzMR3g5xDtoNrQXr/wX2yPcG9OLxKuoL7fDuK/dT96L+qf/vC+4MKBIzDNISVhAREsILyweV/+3+a/cl8+btz+uc7tjvIve69F79VP/iCWEHQg2SDNATRxEnFFcG7wt2/gQDSfE495Pqf/Mv7Kryje+R+S75Mf+oACMN8wh4Eg4PfhQtCpwO9gToAkL/MPii81nu1/LF67LvjO4k8av4GALi//EKRQpbE9EQ0BAnDsQNIAtHBrMBWfy59Mbza+2b8snpiu5a9GH4A/5WAe4EgwtfDwwQBg5MD8UPCxCWCC0AyPr3+fL0T/I56k3xpPEM9K/2hvio/goG4wlzDUALuxNaEFYTYgobBqYBqP5z+gT1efGA8EHwc/Nu8GHxPvnP/jQIsgNMD3EORBMoEb0NFAnIB1kEbABh+CD3hO4T9sXqFu9b7VD1zvn2/DMDmwcBDLwNlxEJD5oO1A2QDCIGvwVE+Ev6yPF58bfs7vHk7tf4x/bPACD8EQnUBTcR2gpTEyMQ9RCfDpMKhgHmAAf1nvaT8fXy4O6Z8wz2Zfen+7v78wLwCG4LzA4gDZMQzhIzCmYKoP8yAEH6vPjA8TDvgfLS8B3zZ/R29fr/UwNCCtIIVAwjEAYOFBBGCUQHmgXpAQr+XPWN8pXwgu8q8CvtnvG++S0ApgL3A88KuwvdEB4PxQw9DXEMdgfaBEb7Rfhj87fyRvAf7GHv/fRc+ET7z/yQBFIHJw9MDScOFRKoDL8PowXQA8n8K/s+9x/yr+8H8U/ysfTQ8nH7c/qDBg0FWAt/DdkQnQy3EPkKWAkxA40ARPu2+Af1HPHh8gDxAPfD8rb5svw1BP4EGgufCLcQIA2JD1MJ1QwaAm4Ddvmu+OvwIvOt8DrzI/Il9wD2Hv2aATYG+wY4C6YPMhLXEfAMzwnsCmIDz/t49ob1dvXm8D70Au3T9QT3jvzd/cQBowf6Dd4NNw8iDGMQqAovCUcDFgBS/Jz2IPl78PrtgPBN8+r3YPm//AYEjAhzDaMHuA0OCyQQQQsVCHgG1gL+AEn5pPHm8OTxDPHn8rb1J/la/q4D6AOfCIYKNgw3DcwOYAsbDHAFQgW1/bf4hPUU8E70WPJi8wDxLfqQ+pX/GgKqB04K4RD5CnkSvAkVDBQFJgNx/rj6uvbn9vDyNvLt8X3ycfLm94r/sf9vCMIIbw+1DWMN9gqECKcLRQIxAbj6jf7y9Pn2Ee1o8x7vefcy9UT+4//WBfYGOww1C/cI3Q3CC1kK2gNNA5X8MP519PTzA/D/8/fyfviD9vn5cP5zBEEGswQVCjYPeA/XCjIJaQVeBSX+9Ph69ZX1oPTS9B32ffKl+Mz6z/67//EFGwplDREPGwxiDcoGmwptAY0Awfl7+nH0K/c+7/rzbvAW+dj0jQDB/1sHLwnLC2wOBAnJDPEKrgkuBg4Ggfm2AL7xvPoC7dn1H+9J+5z2u/4Q/YQKXgUYCm8H0A1yC/MKGArrAyMEY/x/+nn1ufWv8a/1X/DB+bD0Gf9W/VcCHggDC90L+gvMDhkNGQmeA7EAdv5n/9n1YPYa8vr3oPRx8pX2AfnGAGwEFAZrCn4Q7Q6NELQKkAoiBgsH6QGQ/Gv5t/jW9RP00fHV8j/2XfpU/iz+8AUvCB4OMQ2YDCMLIA0kDu4D4QM3/Ef+L/Y69pPwTPfl84L4O/UW/d39pQLuA20LGAq7C60N5gqoDVYEEwRj+loABvRc+zvu5PuA8ID7c/Nz+mL6WwanAYYIWwVSD9oKEQrkBxwDHAmc+hn/bfVq+zfz5fMh8/r2H/M4AHb4Swg1As4KaAi6CucMDwpeCSQIuQOpA/n+Jvlm9uXzf/VT8F/1uvZw+VEB1v3TBZgEewqfC20LZwyTCmIHWgqSAM7/5PhJ92j4afJc9cXwYPny+Tj68/ljAoYGDAuVCC0MCAqNDuYGMgVOAIr/g/3B9xL5KPGb+HDz+fa28Xb7z/u5AZ0FYgl3CjsMOAolC/0IjwS5AxT/aALX9in67PIY+t7vDPrJ8KD9bvrSBhYCDgnECHUMBAypCjUJfAeOB0gBXv+D9oz8ofDZ+kDuf/f/8/z8B/qgAZr/HAqPBJUOFwkyDOgLrgkmBmECNP8u/ef4ZffI9CP0qfcf8wn5Ivse/ywBrgJVCksISwzeCXoHsAqKBjEEMgC2/I/9B/gs9Tn0ZfJa/fH1rPwf+ysFQgXAB4IFFwsmCCQOPgRTCLMD3QLG/TL5lPem87n1+fbS9kn3Jvw0+w0Fov9HCYMEZQ09CmAKqgkOBicFpAAT/y325/hw9vH3cPMm973z6vqt9+4Bo/1gCpwGVg2UDHkLHwlIBWMIXv9K/8z6Wfz5+Ej6T/B/99bvSv0B833/+v1PCEsIqApeBxUNIgnjCfsD6wMMBBz+qv6d9533EvZg9uz0tvi++T0AdPwJBtICgwkrCKwI9wnXCYAH2QPD/8wAa/k1+Lf2O/bZ9276Yfes/KT4EgJ5/ZUGlgTTCTEL8wwQBw0JpgEOA6f73ftG97D0h/tj9jT5IPXI+Kf7v/5//p4FrAS0EdcFEw3xBQ8K8AXMAsX+lfx0/J75bvfY9Cf5PPTO+qv48wCc/zYGngXjCTAIQQqyBV8MHAeoBr8Blv5H/iT4XvrS8NH3wva6/Qn3YADL/UQHfQLOBuoD7wuJCe0KOgRxBz8AfQAm/Db1afmS9H378/M1+ub6y/zD/wsBVAIVCiAG+Q3KBu0LtQWJAyUDk/4E/PP75/bD+WH00fiN9kj4Ivtx/aQA2gboAwEM9QdiDRoFLAeaBRYFvQHF/nr5xfrU+DP25fX88xr8yvcmAMX7gwPXBZ0JcAPgCpcFfQ1wA5YIsv/jAOH77/qe9rn5u/U/+cf50Pkb/pn6aQVz//cIFgUCBxQJKQnKBvsDkv5GAhj6svwD+Gv37PoL94r6NfcU/eT85wJMAmIGwgP2C2IHBgk1BLwENAJWAKf96PnR99L5Zfci9k34XfdFAIT9HwMuAJ8HFwljCKwHtAjyBmsHlwNYARb9tf0e+Cb3LPVJ9/b23vmZ+p78zP91AWIDkAaBCH0JywV7Cs0ERAeUAdT+Ef3g+en6bfbj9oj5t/hj+sb73voGBcUA7Qo3A3oLkAZaCPwFlwfH/3oEm/yKAXn3JvtZ9y35uvnv+Hv6kwA1A4AE/wY7BKQKOwW6CgUDkwZwBREDPP6N/h35HPvX9n74OPgt+en8bP2LAbwD8gF9BbUHbwcCC9YFmwocBJ8EaP6l+K77bPgy+kL30fbx+z/7u/0t/F/96gbwAw8KWwaDC44JmwiLBIgAwf+B/o37W/mu+an5gPnD+S35mfqV/JD/cABQBmMI6gbmBxwHZQdbA1ACEAD8/gH+IPlA+Fv5KfrX+Yj5o/vF+6wB1//eBIEBfAlRBDIJEQWDBr0CFgPs/M38/fcW+8j0Pvy49xz4jfsp+zUEAf0+BOAFswPjDIADjgf/CfL+KQvA9CoEaPiP+OT+c/Hb+yz4QvYtAgn3FgX+ADUDugyDAWUK7AfWA9EKNgBXAz4CvPpxApj0oPqA+Rj08/+K+Iv+VAJh/yIIPAMbBg4JwAJQDOsDuwLLA/T9MQG++mH1w/l69Xr+sfq3+F4AXvv5BAcBLQCeB9oDAQ0yA+sDzgX8/hoDFPgE+sr5q/rk/Ej41vvp/Jn7cgCV/acDDwTzBhsG6gY7CFAHzQHFBGP6Df3C8KPvU/B9+IkJWQqZC4oHuQGMB/IAXgDzAO/84gGt91z8HPve+nv+5P9fAB4JNAQBCG0AiQMnBc0CAACK+Xn1sPyP9Xv5cfVA+EwBpv22BYIHawp7En8IvwpvBv7/sANj94b8w/bW9Qr4Te5a8xb2hfgABp4AHAuzC1QMtRBGBcIK4gVyAzYE6Pt3+dn2k/Gc95jz4PeP+/L6ZAVnAHwG7wrkBx0O6wcGCesIuv+nA0b66vvS+YPzc/jl9a/2Hfww+x8F7QHBAiQH7QGRCA0CWAOrCS0FdwnG/O77m/ub9ib+6/m3/sf/WPv8/P/5FP8wA43/DQQaAhcJ8Qg+AgoChwDhBLEErgCMAdX6hv2w+rL6rvra+Sj6Gft++lAAiwC6BmABLASLBsQHkAbyAqMCXAOH/0j84fjU9v74Z/QR+sn4vPtk/OD/cAIABA0EBwz6B+4J7gPtAuQEaP26/In5xPiZ+o/zpffM+O34mgGS/TgDDAJWBB0OcAVxChAEOwWuCNX9mgDc+6P5C/x99Ob7w/aZ+Hn9DP3s/20AaQVBCeoGfgVkCP0EjQwO/YsE7/4oAdL9k/na+QH8j/ea/QD8EfsCAxL54weL/BEIHANEBHYGTgOtBeEEBP7eAwX/yv7hAID1rQFc9kH/UflZ+mH+dv5+APEENQDECUIFXwpCB7oDTQf7/3gCOP5O/PP9Vfsl9wn5p/XH/fP5of74/FAB5gPGB8wElwpnBeULDwbqBnkBXP7C/eX3AvfW9bv1PvWl+K/2/P98+30FQABiCEYI4wiMDIMJ4wr2BUQDkP8Y/Dj4yfmU8H34DPPy/I74OfrZ/QYCpweuBqAGGwxeDDEIwgir/0AJC/psAf/16vi8+OX1Gvky90X3pP2A/b8A6AMdBUMPqwY8Cl4FPAeJBjMB+v4kAND6aP3x9VT4YPku9WH+2/cU/8UCPAP2CHAECAgwDe8F6gkWAfgF+QQK++T9ivfF+4f30fJt+Y/48vrF/p75gQZ5//kHWgYFCHwK4wiyCI4HR/0VA/T6XPyq99H1h/mb9Vn4Cvjt+QL9EAAMAlYLgAXzDIwI8gzBBiEE6wN6Agv+8PsF9374GPd08473PvXu+0f7b/8sBLYEmgoZC5oItwmKBUwH+wMe/hz/x/ah/JryVfYV9QD3HvnM+s3+XgPWAeQHPwhWCs4MwgbRC5wEfgWy/qv8o/oh+Ab0xPf68t/7g/Zn/QT+4P+FBegD8wnPCWgHgww4CE0HugQo/poAm/hx+9L3w/XB9yT2bfnO/Br6bQFRAnoFIAjIBE0OwAiPCuMHuQOyBAb/Afyt/aT0V/pV8sH3BvgN99P/SP91A+YEpASkCT8IkwZ4C2oCWwom/ZkCj/yL+wr3kvZF9oL5QfUQ/Y78EgCNA5oAeAfyA10JdAn+CPYFYwVEAzAFFvo8+lP4cvjZ+Zv0OPo/+eb9dPyn/ucAmAdTBVMLWAVhCRcJsAV5BNv62gBc/FX7N/a59oH3hvr68rP7yveMBKn92wN9BWUHrArbB0MI6gerBNcEx/97/DL9K/YJ+8/ycffa9zT7G/yq/dP/zwaPArcJAgV7CSkLHQYYB97/JQIw/nv6Nvko9VX2ePlp8zb8A/qEAqECYgF8BhsG/QqQCfgFPwYeB7IANwSU9y0AI/V4+cn04PVN+KD5jPnu/7L+kAQ7BncGsA2yBPwNUgT6B9gC7AAb/1D+NPmt+9H0z/jQ9Zb2hvyA+HwAdf98BmQGmwl/CCsLNgYuCYUDxAMbAe36KgDq99n6wvQ8+pn4M/v291MBqP3LB20BRwgaCawKCgveBsEGcQSxAjT+YvsC9+v83vTr+ovzMv3m+tv+gP5OAjcE8ghYBToLcQcBCyYGfAMSA/j71v6t+FH6QvfW9vL2NfhF+p3/3/0lBQUDvgjGCQUIuwrPBgEJUgRHAjMA0v2697D6zPEs+6jymvmR+eP80gDZ/sIEMwaWB+MIvgnUBXoL7wCOB+34Fv+H+bT66fYm9uX28vvS9xD6Lv1H/iQIWwAsDHEE9gygB1oF5gNYAor+SwFG+dP5YftU82b+3u7Q/EX2cgJm/+4EPAPkCg8HGwq8A2IEVAk8/28FlPccAP34o/pY9CP60fmVBIH7dgHB9976tP4e/qkFtgTRCvsJfgfjChcJIQVqA2b8wgBc+jz2OvQT8iv1A/US9nT7xfmmAW8FuAxSEUoPAxIKDlQNpAicBCQA0vjJ8A/wYuug7o/sG/Q69yT95wK9BDMNBws1FVAQABaUDEoMhgJ5Aev0jPda74jwWu0a7qD1hfEF/B768QeiCCUPZQtZEvELshDLBfIGIQKM/OP8SvAv9HHvx/R+7+z0/vP0AfT8BAfTAp0N3g7jC1QO0wjYCqIFiwSr/L/9fPWlAL/wH/ZE7ej1LPs0+zD+fQIuBKIIQQJPCCANSA2tEGQEugUlA6QA5vyh9CX0BPkE9K74h+/O9D/5+flgAW4DLAdIDNIHdBBQDJIMIA1eAykH+vy6/SX5cvPe8ujvVfJ/9UX1CPzeAfQB5wzWCBYTBwslD2ELfQzLBboEkPu8/c3ytPLs8YPw8fVT8HP83vmCA1sBcQw8CS8SBAwjEMkJKAluB2QDpf7m9U34RfSn9oHsFval8nz7n/gc/6AD3AaVCMQJ8QumDZEKnAeXCMr+bgKu+fr8aPRJ9RnyF/Vs8lz4zfZM/k4AMwNdCLYGDArcCV4LJgs5CFoGDQa+/Zv/e/ei+BH00/Oi9EH3PvWW/H76XAQXAwAGUg1qC5wPPgsHCgYKtgO2AIL8YfWi+qbvzvMc8YPyjfpA96T9uvwnBM8J+QyoCv0SkwlJEuIFGAePAvf7R/zQ8tTzgfGd8J3yJvOW8m8AXPsaCt8Cig4/Dk0Q0Q8DDlEJXQkNATj+tPoF81n3quyt8UzstPPV9gr5yPzeBGIIyg7/DPoOIhFLDC8O1wPaAtT+2fuf92j0a+/Z9EPwQfOW8e361QASA1UF+wugDQcRXAySC/8M1QZkBnz7nv379w31y/Td8XPu6/QS86776/lCAX4FvwqkC0YNrQ38D8IK6weJBp8Aa/41+PT2yvJl8K3xyfKa87H4dvtsAagEvwZlDioN+g20DCcOsw1gBqYBLwKc/GT38/Fh76X1U+1M9kLzDP32/S4B4gabCtIIbBEdDZcQUwrTCCIIwv30+tT2v/Sr9LDu2fEM9tDyIvtW+tUEhATdB9wOYA7VDWUQ7goJDlcDBALh/bX1rPX18CfzgfFh8Oj2fvyV/JUE9QJ7DQcJ5w1OD54ORwzhCU4FagQF/DT3LveH72LzR+yq9BT09fgA/YoB8gLRCvYHcA02DOcNxxCvCv8JCQBo+y35pfSk87LxofCf9ET29Pup/c37HAB//uIFvgm8DMQQ/A1WDIQI/QS8Aov/Z/ou+J3yVvah77DvlO2W9Vz4BP0C/wsKQwutD4cQORNEEg8NTwjOCCgDt/uP9qzy/e/16gDuofLD9Hb3F/1JA1MLggeMEeERtBdYEOQODw04CMH8K/kG8X7yH+sl6gvvg+1b9CzzNv7FA28IpQ3WFFwSNxSSDlESZQuhArr/wflp+uTv+uva7Rjw/O7l8rzzBQDcAOQGawofDhEWpBGPDwwLowkdB1cBcfvr/CP2ZvSv7dHsI/Ej7wL3gv2pA10HLgkCDRcOHAtkDw8P1wxiCDIABwU7+yD2CO8l8Hvxee9l8JP42/gQANoAYghwDWMNnA8vDrUNZA93CUsILgEx/DX6dfIz8kjwffHp8ePyn/ff+yX9eAbOBrcO6QtyE/QQaxCxBr8IYwI6/+f0iPRV9dLwh+578Gb34PT9+Nf7RAchBW8L/w2EFWES4QzWC1oJ4ADI+pb5p/ZE83Ls1vJE8rL0LvSS+JIA6QHEBaoJaA5nD8YO9AyzDb4DBwWr/O35h/WM8lHz//GG8Y7yZfUw+pf/dQGaCPgIeA9uDkgLwgp0CIMJoAJO/k78+/le9J3zF/DG9NDyg/Y0+0z/+AIJBL4JUQ8FDTENHA49DFsKBQL2//v9Efhs9ezv8fOR8vHuePSP9T7+nv9jBUAK8wuLCzcQCg10EagG/QhsBD4Br/my9tr0BPIo7sTwK/Xw99T9afohBvkEUwztCVEOnA8iEeoL7glrBc4CpPtY9RD1uPLR8ofu6/Od9qL4LfyuAlMHtwi8DIAP+hTJDLMLQwgBCZ3+b/qJ90X3+u8b7nHxXvN/9Yb0pP3EAL8GjQeaDQYQbBH0DJUNlwlAB9oC5Pse+bTz+/PO7Ubvr/HR9aP3mfpB/X0EJweDCWcNJw4PEEIOEw61CF4Cmf59++b14PCh8Bv0ZvR28Wn1gvlt/pYB+AKPC4wMPhDhDyIRsApkCJADUQMH+kf5sfX/9XTz4e1I8jv0cPh2+RT/DAVrDIMJ2BHJDGoSAwvcCboFcgKR/xH4IPVg9AbysvC+8ZLxL/qC+lMAfQPzBoQLlApmEc8Ohg9FC3wKbgWeAXf5tvlF9CXxmO6H7lH1SPNc90f5dQMXBeEJoQqGEI0PVBLHDigOPQojA4b/Tvte9gLwH+7a7EDu6ewZ8h34bf8VA20HVg/5ESkQmg9PEZ0ORAfoBJMB4/zK813wEO7b7Xzr0uzu8wT6BQCQAb8IQQtLEu0QbRFQDiMQoQp9BWj+B/ve95HwZu9h7ATv+O2H9OL3k/6wAEMHlAyiDokOPxIxFIAQlwrPBhUDCvue9o3xDvPp7+7uJ/HH8073Q/rc/zwGYQmVDJQPEA+FEZUNrQ2vBiMDIAGi+Hn4sPEZ8zjvk/Hs8fL2vPb8+8D/FwnnCd4M8RFdEAIPlQrMCxMIZABw+1j5OfcP8enuAe/H9EzxS/cI+kIElgLqBmEM5A83E3AP+A/sCQ4JOf9i/v71rPbK8G3xWu+D7hL1sfXO/W38xAVbByAP8gz0EFQOJhEXDOwGOQL2/Qn7mPPR8k7vTfKl7xj0ufT2/CX9EAQ4CXUMyg4RDn0Rtg4WDAMG7QM2AmT87fYu85nzOvHm8DjwI/g7+aT9Vf9sBuULGQ2VDbgNqA5uCkoGzAS8Aur8zfkl9H312vD38Z7xdfYC+SD8YgACBawHTgvwDAsPoA05C5ULYgQNAuT8vvpC+ALyX/KF7xPzGfM59wD8vQFyBIIIcwn3C84NnA0DDkkIhAubAdIBpvbF+ZPxW/Ej7f/yPPS89Rj6RP8kBlIDrwvRCyERkAkID0YNywuNAsL+Nf3b+PvyhuyL84bxqPUV8wz7/v1VA+ADVQf6CUkPdRBqDkwM5gh1B/j+g/z49n30dfI48CL0ffMC98z3D/+5/vgDYwfVDUkNFA76DigM9wkkAkkCTP4c+pf0W/XD80ryle7+82P4/vuT/88DJgxEDJcNTw0jDW8NLgjHBT8Dh//I+ib31PPG8nLvbvGN8bj3YPpg/XUEMwl5DSINog6eD/4OTgnvCGMCUQIZ+Mr3QfKD8xDvHfG28lX2HfhT/TkCsAXcC2oLjRHUDhASKgv2ClwCM/91+w34nvS+78Lx5vD884/xTvgL/BAEzwPTCGYMGRL2D3UMOQ3nCaUGG/88/8j6VPet8JbwV/E878Tw7fWU/lMA+AXMCCkQlg5iDjEM4A1vC5sG7gTD/dn9KvT79Lrtau957hrz8fU0+fP/tgUmCF4LmQ8FDywQTAxJDdoK5AQKAcb76foA8RDwoO5R8VLxOfUt+UT9pAGnBSMLWghkEKcOPxMmDKsK+gcDBe77E/eb9FD11O4H7vXwFPTJ+LT4AAAmBisJNwtnDA4Q0hHWDdsKKwb9BBf/Sfhg9FDzr/H07gPu8fMx9kn45f5YA1oIlQiWDZ8Q1xDaDfsLzAodBVf8zvh090/0wvE27xzygPNm9XL47vzWAGcFLwqEDSUPPA/SD3gNvgmCBcABnf769nH1MfF88vbwvvKg8iL5FPrb/ngBbwgHDMoMwA67DZMQ8wrcBmYDdgG5/sP2p/T08p70L/Cz8Qv0D/vW/lIA6wH2BzcNNA3kECMNwQ9iBAAGl//VAJn5JfeH9UXyCPJm8Y/1QPiL/I/+Bwa+B18LMgvGDnMO3QrnCYgGXAPg/Iv4HfhR9LfxtvFu9Cvzz/Yw+QoCXAJWBykKxg6lD78K2QwTC30JPgN//oP7Fvli82Px1O8X83r3lvac+gz95QTuBL4FvgmcDQYPhwpPCJMJuQYZ/9f9OPt096TwifD79LTznvUq90wBBQOQA7oEAgspC3cJyAjZC3sLXAOaAwD/mvwr9j71H/Y38/LzyfTD+nf8of5OAUkIeggiCWILbwulDZQFdwgvAmQCIPiz+Dr2rfcq8270BvgB+7r6j/lNBIUGqAvQBYgM4w6IDVIGggWKB5oAsvlr9m73c/YJ8sny5/Q/+mT51f3r/6MGWQegC4sJoQ1lC3ILxQa8AFYCNf0g/Nz0dfaH9RH1KvXC9qb7LP1kAIECTwgBCM0LrQqBCv4IXQUPA2f93/1Z+iz66vWW95/2/fjm9Vz4+vxfAe8F1gNnC4sLWAwOCBgHHQZABLD/T/sv/KD56vdd8n/42/XI93f4uv2LBIYCAAZ2CH0NLAklBy4HQgkwBdb/ff+m+yD8M/IV91LxKvcg9jX6ZP0+AH4EBgf+CKMFGQt9CagM+wOvByMCTABP+4X4dvja9bj1q/Tm9vP5i/6h/zMBbQSZBrALjgfuDIcK1AzKAwoAx/90+/r4A/W59/H1ufYn9D77U/r8/W//NAjdCbsHbQtvDD8P6wUlBX0E0wK++wn0Uff09EL2Ue8h93v5T/39+wcCggWtCEcJxQrdDSsL8AtaB+MI1v84/i/6G/YB9MrumvNo9BT5ffYk//z/dgR2AsoIgw0CDR0MDAyIDuIGsAA8/QX8aPiP8hb0BPTz92/xAvmR+WL/6/3zAxcJJwndDT4LrxChCWoJJP9xAej4HvzV81L2XPXH9I/1GfPU+Ej8rQGhAvUHIg3nDUMMOgsHDP0Hmgcm/poAWfoP+Dv0hvE99C7yhvST9Iv8egAeBGAFaAwCD90N5wuECoMMQwVYA7wAHvz2+e/yWfUJ78PzF/Ei+cj3x/3Q/hMIqwb6CT8PNRCADxgH6gqLBtgBYvgs+uz56vXx7wLyvvam9if2zPdKAkwDVAY3BxsMig4dDgwNwgg1CXgBygCT+dj54vU29UX04/Fc9+X0APwi+8UDiwTnB1EICAxxDcYJrgulBo8Kk/6i/9H1DPtN8gX0ovJu9LX3N/iB/h/9JgbKBncMFwrRCo8NhgxpCIYC/QRXAXz9jfO79YD1ffPo8JPy6vy6+jz/Sv1kCEQKqgqHCmYNEw7jCE4G7QEwAuf7z/lJ9lP1jvQu8Xb4+/QV/DD5lwPnAqAG5QXpDO0MxQvJCk8HLQjO/T7/LvhM+4z0r/Vc9lb2/vV/+VL9UABAAKsCUApMCbwKIAs0CQcJ7wRcAUT+LPsr+eb2W/n49kD4JfX++MD47v8YANYDLwoVDB0NkggiC3EF3AaIAfj+Vv6L+wf7+PYD9R/2//aL+OX3hfziAL0EOQXCCUUNjwoYCXYG4AjkALkAt/6G/1X6yfMF93f3bfbl9Jv7OACl/0sBLAR3CTEHTwgbCC0L6gW9BF4DJv8O/ZT3O/v/9TD3lPaX+kT8QflgAuIAkQhpAUsIWgeTCT4GGgPgB1//MgE59+D+EvaP/LL0jfrM+T/5b/2p+1gFygFLCAYHeQnPCXsEQAdV/wwGtfty/jf2AP3O+Cv2XPjD9pwBvPhcAZz7ownbA50GgAePClULlgMYBz7+6QNH+Dv97feO+A/3FvU0+0L41v+w/PsD/AA0BWAFKghsCNoIFAs9BNkEkf6A/2T8TPbh+Nf1BP1C9Kj69vqXAdT//wDUBU4JfwlaBO4IAAfXCML/Bv+5/tH8N/ix9Q75rfhg+kn3bPqg/VYCcALhBFUHvwqMCgoHeARoBrMEqwD8+876G/yM9tz3R/IW/Vj3rf+j+uIBkgR5BfcGlwUvDpIIMgslAzcHYwAsAOP5gfmE+Yr0BvnC8mj7Zvdi/6X/qQG+BlcDuQwdA0AOAwblDLIBVAO4/yD8B/qN9rv8pfQn9hH1cf00+XX7KgGVBasK/wIpC/cJUwzOAwwEggUcAMX+q/j0+vL1Uffe9ST22/iF9wIBDP6QBB8EzAm8CdoIyggICOYIDQKDBNj8K/9H9lz4rfPw9F/2Nfac/Mn7HACMAd8FnQa+CHUJ5wtfCvUHFgZXAwoB4vsK+pT2DPZA9EX1TPWZ+U/5xABd/04F8AMtC1AI9gpLCkALQgk3AmYCU/yK/hf1Avl59mD3SfXy9Wz6B/xc/8f/9gc8B74JYQmHCVsMTAWZBlsAwAHs+TT7lfUG+Pn04fbg98/2lf3p+s8DYgI4BjYKeQrRC6cIwAjsBp0Ew/5X/gj6zvhx9cf0o/dM9T75P/pU/gsBvwC+BkUJ2wouCpkLPQnHCDQEd/+qAWv5ov0f8kX4DvMA9xT2zPea/D7/AgSTAhUJbAdADlEIDAu3CEoG5gSv/Zb9qfn6+/v00vY39JT4WPcL+PP9NgEPBkQE6ga/C6sJJAmyB60HUQYtAN/9YPzB+T73/fcf9Bb5vPVE/L76FP8zAxYH8QhNBKQHtAq9CA4FhQW1BrQBJP3b9eH7X/XP9rTybvhx+/j7y//AAbIGvQUzCp0GRAynBbkJEARkBJUDcf9I/W/38vWa8470H/R2+SL8EP3z/3wA3AbmBZ0IKAmPCpMJzwbXA10FsP8e/g/3XPeE9T73wvQI+nP4b/8L/xAAjATlA+UJxAR5CvMFfwvRBO4Dpv6+/t/6a/Xb+Kr1IPxv9wL7S/zn/Tn/9P/0BHEHUAo8B7cKUQa1BpoBLwBQ/0L6fvqw9ov4tfiw9+36i/ya/iD+JATNAlEJCwYBCWwIlAU9BVYC/QHN/yb9Wvsc+Zj2tvYJ+Rj67f3E/CcEcgEsBAYH1QbXCqMEIQnKAwYH5P/nAin+yf2599r2pPhw9Fn6bfbb/jL9gQBPAkYEagY8B64IFQbvCH4DoAbn/7j/ePzz+Rz5Ffft+Ij5yPoA/Pn9XP6OAysDpAdZBmYIvgUGByUCagS6/xkAsvwI/Oj47fZ/+E/5Mv1j+r8Aef8wBZoBqwZHCeAH+AgCAuIGrQHpAZz9av6P+2z4Ifdh9dz5Hvkb/xz9wAHeAcoDXwb/BN8HSAiBCOADuQJqAJgB+/wJ+Ub7XvZz+Zb14/rJ/TP/2v9oAb0EEwVYBZUGuQfzBVIEgQN2/zgBoPrj/DH2Dvme9/35tfgc+6sAAABxBIT/HwtdBo0JcASDBz0H1AC8AZr9l/+u+oj5i/bW+BH2e/mk+4f7ygFI/8oGxQLGCEcJtwouBkIGCAQyA8r92fvF/b75aPhy9YH3PPoU+Ub7yP8jAc4DFgPMBrcIowkiCbsHQgYSBEAA+vzr+n/5MPoa9pr25vdz+c78PftnAZoBTQfmA1YIBQjjCkwJnAWrBTABaQFo+hT7vfjE+LH3Cfc8+Ov6v/x//aACxQILCOIG4AhvCLkHigUaBCkChwDZ/Sf7lvlT+AP2B/iA9n77H/sJACwCZgHBB58EqwvJBiIL9wR0CAAAkAEb/Zr8XfoD9gz5YvNP+dv1hv3X/HYAygJ+BBsIYAV6CwAHjAzNA3EFwgFh/7D8hPlr+b33ZPdB9RH4PveL/iH9UQPUBKkF2AhVBxoJtQh3BsEGuQLcAFf97ftH+Yf5+fQX+Gv3FPrh+vH96AHoA+8E2Af5BlcK5wclB9QFeAJzAjr+D/yO+Dv5+vY3+cP19PqV+hf+NP+y/6AEKASjCbIIkQlXCOMI7QOIAfz99P3T/Fz4uPf/9wf57/YU+s/7mgAU/3IC1AT9BxoHSQlQCGkKoAJWBML/fgDS+7r6RPqe94746PX++q33FQDS/WgEUwIOBZ4H1QbKCOEEnAmnA+kC5PxB/x38wfol+Zb3Fv1M9l/8jfgyAQ//DwPzAoIHcgfuB/IGpASRBakBogEE/UL8hv0e+vT6q/jQ+137If1c+ukBbAHPA60E3wXqCu4EtAXoAeQCr/8b/uj7uf6y+tD7x/YV+uT56vvC/Av/GAGABXkEjATiBgsGcge0AeECwgBOAaT+E/0T/Lf7wPhH+JP5mPng//z8ygJ4AZAEngRcBFcEXAfsBOAD0QDNAMoA6fy7/K77Pf3h+gr6IfpS/vb86gCz/wcF3wJnBv8CjwXBAwICXgIV/u4AUvzp/j/83fz6+677fP3o+xIA+/28A+4AigbSArYGcQNmAn4CC/8GATH+LQBf/L7+KftH/Bv6xvtt/u/9MAOkAKkFxwLEA2gElwNVAzABowLC/vUAqfk9Arb6uv219zz9RPy+/Rn9tAFuA78CCgPaAgMGywKkBJkDrgJX/pT+T/wX/lX5DP0s/Vf9f/wi+4b/LQCTAO8A1gM2BDsF8AHEBSECFQPy/0T9qf2p+x78B/zy/Af8W/8e/L8AaP0aAk4C+QOQA74FpAQoBh0BYQLH/wT+8f0p++/96PtD/Cz7Gf2Y+yr/wP//Au0CAATHBeADaQVgAgcFRwGWAG3+R/0O/Yn65v07+9P8rPm6/dL9qf41ADwDLQUoBJ8D/AJsBtwCgAKaAHH/+f/F+Sr/Ofl5AJz5rv6o+YEARvyiAR0BdQPYBz4CBAe8AEIGEgBeA1/9NgKp+07+3Plr+zf8U/sZ/br7hv/8AWQC+ALIBDgFrwagA0UDRQPkAo8ANv2M/cL9qvs8+Vf6yPqD/Zz6Cf+SAHYE5AJkBJ8EbAjPA+YF7wRoBKID3f1K/VX7ofss+j76qfkz/Rv6WP4Q/H4CqwJ4BKIDIgffBQAH0QS6BBEFRP94/+b7R/tZ+sT5Cfve+Y/6FPw+/oH+vwDqAtUGsQMSBCYGAwY9BQoBZANPAgj+IPwY+oL9M/gf+8z4yv6Z+jz+jf9mAx8EDAMlB8IE0QckAM4GiP5UBhv60QAB+8H8nPtO+Uz7/fkI/ZX8OAEu/wYF+gItB9QE/QQfB/sDQwPY/pb/IP7z/Q/7ZP1i+0L82/p/+Uv8Jv1EAaYCoAMUBp0F7gbwA58E/QThArT/MP6c/Rn9Gvx7+dj8s/jq/M/5t/7f/ZEC2QEVBk4ChARYBfAFcATeAVIDRAFq/sb7mPvF+iz9bflE/Uj8G/yp/Ef+YwKbBTwGjwXbAxYDzgMrA3YCxwCg/gv8nvnt+D76xfqd/17+xwA8/wIB6AHJAWwBBAI4BcQD5AQe/2IE3/vpAjz7DgMt/Sr/4vpS/AP+nf1HAfL8EQHU+hYB6/2fAfn+BASwA+0D7gPQAfUH0gAUAg/9bv9o/rb6HP2q+/n+R/um+8z5m//K/lcD/AJOBVUIoQMOBRsBEwVXARH/wv04/t/9cPn0+2v6wv/l9xQAS/16BKQBhQMFBvEEdQNzArEDbQG5AR/9eQEt+uT9Rvsq/rP73/uU/C//Yv63AL0DQwVnBa4AIwISAnMBBQAcAvcAAABh++f76v4tAH//l/6lAG//dP6S/fgBOwIwBRsBFwWkAdwCBP5x/+H9qQCe/b7+Iv4i/kYAlvzr/x/7rQB3/BgBcf+LBXYBBASPAfUBIAN5/zMDEv9sAWv+rf5//S39jP1r/Bf+ifqaACL+JAKr/yEEWQMjArAB7gAfBT8A8wLF/BoCqPzF/Bv+IPwRAaD6TQC++scCQ/5gA/f/IQTNAi0AKwO//TIH9PyzBLn5Nv8L+nb/Hv56AHv+wP4cAEf85P/q/pgFKQMrAroBMgInAjgBTv7NAK3/Tv6L/nH9fgBB/3b+v/8Y/gL/ff/U/n0Cdv/0AYsAWgLI/67/MAGsAC0ABP6WAeT/qQJx/RABuP/R/wT95f5GAK4BagDnAIAAUAFYAM0AuP8yAYv/MgDJ/xIARwHw/g0B8/7N/lD+U/8zAbwAcAAiAOMDKv/r/23+WgJgAhP+DgFE/qIBU/ud/sL+cQH0/S79DQDW/6EDf/5kBpMA+wMm//oAMgFx/84Cc/xpAyD4GwHM+PsABPqT/1gAhP/iAZj9JAaRAFQG5f3eBvn/4ANS/lv/IwFk+5b/4/kFAMH60P5z/K3/ov0gAAcCMgEOBVMBxAWpAgwDnwJH/pMBAAA3AKv7H/11/4P9gP+U+eUDAftXBu/4bAi6AdUEzQNE/6QHsvycBb368wL6+1z/ofxZ+kT/wfpJAjL6yAIl/SMD7wB1AewFEQJXBr7+0AT0/Z0EoPyBAOP8p/y1/CH4wv2m+qwAz/v8AYkAqgL5AVsBlweZA+QGIAA3BIgBEv8C/gj8Nv+c+4T8tvm2/VX9IPzv/Rj8EQU4AGQGrQMKBpAGcADsBSr8kQX0+fABk/i9/C36/PrK/rv2WwE1+LYEH/tvBjUECAiOB2IChQjW/j8I4foHBYT5zv+1+Zz5avxZ9/b+7/elAEv8EgMXAQgHywf9BIwI9AHGCEr/ggM5AD4Ajf4N+HD8Qvee+5f1oP4v+wABAv5LAUEG2wIiCXwDrwmLBDYEMwQKAPABL/vj/gb5OPue9lj7/fj0+kj82/zXBM7/kwatAkAJDgUfBRoF3gMfBcj+GwGs+V7+0vbZ+5v4aPuE/H78Yv/b/bEDZgLyBvABfgfXA68G/wJxBAUCUgGV/Wz6lPmS+Fz7PfsI/Pv83P/qACIADQGXBRcFywWNAusFjwV1A+0BCf+KACP6svoF9+/6vfgw/c/7U/1fAB/9+AXS/r4JWwB8C2ICLQhIAGQE1QDL/zD+BvnV/Kr3yPpH+M76J/1g/QAARP9SAyQEiwZgBfMFVQVmBukEJQHf/gH/tftP/Mj2lPut+h38Hvp0+83/RP/BA4D/TwhNA/QJuAC2BbADIAOcAjD6uQCI+PL8PPZS/sj6wv5E+in+5P9B/50EWQBcC4wBEAnRAC0GgwDgAbn+hvyu/u/4Qf8l93oA2Pm4/8b7J/7VAAcBAwZyAjkJvAKaB5oABgRbAGkA7gD5+nz+6/mw/iT5E/12/Uz/6P8B/hUCHwLyA9ACYgT2BUIEgQP4ARwDLP98/Wz8KfyF+/f74ftG/pH+wv+h/3IDmgAeBGkB+QObAjsCTQRvAfUDdP4tAL771fzF+Rn9iv02/ZoAXv6WA0H/bgL/A0kDlAWlALMEx/+nAor+lwB//cT8WvsI+oz83/pfAIT89QBK/4cCEQLlASEFbATwBa0AUgS1/t8CQvp5/in8qfuz+9X6+f4U/OcAYf1QA6D9tQP3ALkFwwRwAi4H7ADgAyv7jgB7/Jj+rfvh+33/CvpkAB75tgLO/Q8DtADBA0cEogHsA3MBVwP2/vUBHv5c/5X8SvwN/8P7C/8g/tQC5QNKApMDYf6O/wz+uf7CAIsAuQEiAKQAXwBgATMAaf/g/6n+/gD6/IL/Zvyu/kT8jP36/uD8TQCoAcUGEAQFBrwF8QO9A+T/oALV/uv9Tvik+k34pvmC+JH51v7//jYEIQLMCAgIywmzB2IG0wbxAsD/B/wr+1j5evcc9Ur4j/nx+er80/wpBHACrgg9CBAJPwjBBnUHrQHiAeP8Jv6B9pD4j/Vv92j54vZG/t37pAP1/tgHOAXVCYMHdwcHCtICxQSC/FID2fnq+wr37fov+h33U/v9+XoD5f5qA5kDHQaPBX8E+gZcBVoINQM7A3z96fyY+5r5jPeX9q36Q/tW/pj72/01AK3+ZAQMBUYGfwjEBm4JswQxBUECNv/s/SP6xfv5+eX4D/ja+aj6j/v0/b7+nQVwAh4IWgiwCuUG7AW5BekCFgF7/LD8hfv++Gf3o/f9+4H5T/x0/T4BpgNGBEAHiQjwCuoF+gc+A1YCaQCW/5r8HfiP+U33HvnR+Br65f1m/o7/UwHbBE0H+AUOCkcHVgclBWwBXAFH/Sn9x/gW/Uf1SPk+9zX6OPq1+/UAI/62Bg8CKAkbBkYIawX8BBMGEQHeA4v73P8X+7P7gfcs+Er6IPjh/X76GgLr/3AEMASCBo4HVwaCB0sESgREAisBSf6x/Xf4nPod90X3HfdF+qn8jPwcAoEBbQRvBRgJTQQ2CF8ErgbZBBEBxgEg/Mz9j/Xi92P32Pa4+nv5S/15/vsD6gJyBrIHnAcsCZMGPAeiAQwG2P8w/3z7Fvl1+dD11vYD9sX8/vya/n3/FgTRBoEGmwYeCEcJFwXPA4gD4gGy/RD86/l0+/v12/ek+Ez7UPo//T0BuQA7BnsDUQlrBcgIHwWrBDsFAAAMAsv7E/2B91X9kvid+K36gvpm/1z60wIEAMAHMwO+BQwGggbXBNcBAgSK/af/gvox/DL5ePse+Vj7rvvS+4r/AABDAzcC/wftBV0HqQPsBYkDSgL2/yYAmwGP+n77A/fP+1n3rvsx/Ez/QgLl/jMGMwN8B5wFQgaeBGYDsAMIARoCKfuZ/0f5Vfs39kj5V/zE+If/cf2sBKoCuwUaBc4GuQV8A9QE6QIYBLj/TgBj+9X89vjl+Yf5+/lV/dv9tAE9AUcGvQSdBcECyQe8AoQCNALwASsBFv0+/gD6yPwm9/b6Nfp5/qD+x/+MBMIBwAeAABMHBAIaBSAAtAFYA4L+Zv8W+UH/evj9+s/3JP9IAFoCGwK4/7ED8/3GALj/1Qb6AiMDRgI7ApUBPv6L/sX8AADI91n8RvtY/pz5g/16AFUApQC6/Q8GzQTcBhwC5wkiBoQCJQFtAIgAAPmC+5H2YPss+Dn8yv3c/7oBdv+nBtQAEQcMBdYI+QbxBOwEtgC5AE76tPoS9V/4TveD+1z6KfzZAcH/+AMAATQJmAfRBgAEEwfLBW8B+v6x/fb9UPhA+Ev0O/xc+D77Mv2EAboB0wHOBegFxAnUBdUJIQQuBl7+bf/t/Uz7eP2++ZT8UfaY+y72T/wI/akCuQSMBLkH5QRAChwD2QaaA2cFwv6r/Hj/cPyy/AP2aPrb+CD8Gfiw/ib/qQKJA6gESwgxBhAJigLfBXEBnANw/or/BP0x/EL69fbF+oj4MP6A+iABLwBCBNsEDgV3CSwESAjKAysG6P9aApb/E/0Y+wP2F/uo9rL6a/et/6H/+f/AAtcD2Ah6BM0IvQQzC5YEHAKtAcD/rv7/9zj77/ZL+Yz03PjM+SAA8P8RAWcFIgVNBzUEuQdGBkYIEgPAARIAAACR+jX4Hfhg97H4S/TZ+nz7rgCh/rkD5AbFBngGJwZvCTEEDgXwAR8F9P0t/Kr7gPhP+Yz0vvkW+ar9VPssAm4CIAPIBNwGKgnBBZEK7gSrBFr9yv5I/Kj9xfkK+BX4QvYD+AD65v10/McCxAFzBdAEZgnPCvgILAk/Ax4F0P6I/r76C/1z+jL3qvdt9uH6K/lAAMz9awMZAlUFbgdXBtQLCggFC9kCIgOo/hX+0PsA+d/6o/bE+Yz1mvw++cj+l/9BApMF6gVRCkEJBQpCBC0HrATpAMb80/yV/PX48/dV92v7o/lK+ev6+wB+Af8CcgRNB90HIQUcBrYF7gf4AscAdP4T/uX5Hvm79mv32Pl6+D77f/yIAZEAVAPHBcIIqwnzCEsIIghrBT4ATABq/e77HfVW9rr1F/j19RH4u/xV/+AA0gGpCTMK0w0FCiML6QcsBWwBXv63/Vb6oflM9hD1BPXI9h75gPro/gAASwdlBWkIrggFCzQJwQaNBrcBRgFM+i/7QfeY+Z73yvjP+Dn66v4M/uIAJQEICB0F6gYqCLUIogjIApUDXgCy/+b6VfpD+wj6I/jb+I/7pvug/A0A+f9mA4UDSwi1CFEI5QYFBscD7v9ZAFgAbf2M+WD40/he9+L2I/j6/BP++v65Ar4F2QkWBq8IZAhNCsED0QDQAEYBmvw0++34MvdL+b7yufjD+FsA8/uYAgwFzAgnCt0FfQmZBgEJlP5gAlL9U/96+Ef5EvlN9wj3F/X0+7r8CAHe/2kICgdaCNEGmQn4CFoC1AT0/6oCh/pr+ln6qviw96X03vy1+K0AAPz5BVAFUwWWB9QF9Ax6ApoHjwAOBID/QvxT/TD4rfvx86D6R/Y5/LT8Tv5EAygELAnBBJsJgwcWBsIGRgJaBRH/gv5i+yL7M/yb9H74b/Yx/Hb7UP15BNcD2AdqAkwJSwdXBmoIZgNjB6j80QBU+L/9DPnl92v2ofWz/Er6JAAK/3MF5QVdB7QEcQo8B/MFOAM9AnoDE/5E/Un1XP6184b6WvRG/kv8WPscAxL/EAwoAJUM0QQMDScEtgVQA2j+IQFC9yb/XvRl/ar0svmI+GX5vADQ+r0F+f+jDdACCg2KBZ0McAd2APAF+vhSBAjx7v+i8776pfdV9Pb8yvWcBXv5XQkNAE4LBQoKCC8OHATtDfv9OAOo+nf8M/uN9Sf50/ME+cr1oviU/Cb/PwSCBTQItwn9CpELrgjMBvUFOwFBAG35MPui9DP3EPP09GT5cfXf/Wn6AQgCA/0J2gruDHcMkwW8CYUFTQO6/Q36fvw097P1HPOZ9Mf2DfUH/Ej8tgXVBFYJmwobCAYRqQVuDnH+6gYo/j39qPne9Zb8uvDM94fvjvz79g3/agDuBKULMQW6DnYGDQ/ZBCkHVwECAgAAQflz/JXyU/4r7vT7rO3cAOX3UQBiAc4F3A6OA0gMQgWLD/kDzwOMBAb/pgE28Fv/pPDV/Rfv3/kJ+ar70Pym/s8G9gZQCIoIxAu6DKAI/QfbApwDs/sf+7r1c/nt9K31vvIL+hv7U/7K/s8BfwgoA1kL8QUaEOsIzgjgB84CvQTW98j8dPM49+nxX/PM9qr2dvvD+tgBVwOJBYALgwm4D/EL5g2RCXQGDAUS+/r7JvIu9QvyP+9Z9WjwV/1E9QcGUAGBDXkINw1NDpcMlA30BgsKxACv/Wj4SfXW9sztXvNp7jj7w/NjAk/9ewtvBQoNFgpPDV8P3gX6DOIAbQfQ+o/6zPgk8bL2NexG+lPyIQFA98sFHQOwB+gI1AXqEHMH/g02AZMJ5QOn/+L3Q/fj+kzzGPRD8nb7zPr9+C39hQOnCMkD+geRCJUNeQa/CL0E0Aci/h/9jPmY+O/4O/Sg9qn0DfrA+Db+iwC5BIUG9AQLCNMI+gw7Bq8I0wVfA/79+vgK++/4BvYy85H2xvlc+pX6L/9WAkIGnATjCMAIQwvxB40H/QQWBNAB2Psl+gj1R/hu9Cb3efZo+zz+mvw+AqECmgqgBoYJ4wjCCo0JGgP7Bur78wIx81j8IPIE+830d/fo+BT5YAKo/sYH5gNLCl0FVgfPCV0Hag3w/wsHifcSAFDxmPlX9Nv4S/fM91/8t/5ZAz8DCwjGB5MJBQs7CHQL6AXVB2j9mf+29oz5B/NV9e318/n5+kr5Qf8u/w4FIQLgCLQJRwydCFwFywduAl4Co/n4+zr3CfeP9af2V/q6+uH93PwHAXoCJARCBk0HQwgnCUoJbwapA7kApP6m+yX6QflZ+jr3yvev9k770vl8/oMA4gVXBnIHWghUCfgITwerBHYD6/7aAL75j/sD9bL6MvOI+KTzNv6c/L//8AFNB7gMJAYgC2wGTgsnAiUDTwJ1/0j9WPNh+6Txuvp18m39e/rV/g4BvAFBCtQErQ03BH8LOAUOCS4CfQInARP8Pvkn8jv4ffYa9870LPq4/zf+NgE+AlYMRgUZC7oEfQ9pB9QHFwEgARb/OPh6+Fz0r/d68yr3XPcd/EAA4P9KBf0E6gsiCPIMlQhUDMYHHARh//v8T/lh9IH0jfMo9wX22/ib+y//hABTArcHRQrjCwEKzAvMCdYITwJvACb+cvi89SDyNvXv9Z34T/nY+wT+xgBxA1gFNggGCXkMAAlWCqMEAQjq/kwAWfg3/N721Pb99Lr1e/qJ9yn9/PrbAloCDQYxCDYHCw/nBuUMqAEYCj39CgAD9qb5EvdC9Hb03PM1+v/3lfxm/tYD2QbuBt0NuQxDEb4IvAwJBCYGRvrh+l/1qvXG83Hy9PZa9Er7B/jk/7QB+wmHCWoKzwzRCoEOoARaCEICjwS6+kL4Kvdv9fn04/Bn98f28fxj+n0C4QKdB9EI0gl9DNwJAg0xB7sG/wHkAdv9nPdJ9azyaPTv77X12veQ/Vz+CAGNB+AITA3rCmoNgAqfCgQFmAQx/1D9Tvg59eHxH/Mv9PPzr/XM+sQAJwKyBh4Irw7hC2IJ5wlqCQwK6v6OAcn53/0N9FT15PQC97L2ufOP+xP8wAR1AVoJUAnxC0kJnQc0CcgFjwXF/hwAfvwv/AP3CfZY9zr2ivcv9ZX9SPxgAzr/8AoWCi0OJQcqCQ4I8QTaALr9KwHF+nj5mPNB+Dj4uPRr+DP4jAFm/AwG+AMHDvEIbQyFCKAIFAaaAHgByPnU+2322/iP9nn2zfnW90T9m/r6AmkB8QdGBhAJiQhcB7MJkwNuBYL9bQBZ/PT6Z/mu+Of5b/d++iH6Q/7x/fgBmAI+BjgGrQcKB/wGXwTxBdsEzwHK/gr7yvup91n3s/VR+Nf6o/kE/nD+swf9BGAKPwZZCw8HzAYgA1kDkANB/9z7wfel+Ef41fQ09y74SP/4/MQCnAN3ChYHzQjgBrMJtgTdA9b/Yv8q/Lb6tvpX+Pv5Mvco+jj60v5MAIgCKQSgBL4JswQgCP8CUgflAMD/JP9w/lb+5fcA/IL4u/yo9oP8bf11AD0BGAAwBiEEjwizBPwGAAbNA8kD2P6yASv7T/0o9tH5v/ec+0P8nPmD/fv8GgRsAX4FWgcmCvEIlQUPBtEEIwMP/Sn80/nR+QP36fbq+BH7MfwB/v7/owLsBK0E2AbgBu8KmQY4BcABjwKU/lv5svnP+XH74fR792P73f6D/SD+FwXEBTcGtgLgBxMKJQclA58BHwVq/039k/mx+7T4lPed9sz50Pt+/F/8hAGGAqQHOAavCckH/AqYBiYG4QQ4A63//vrj+kr5l/a29q30jvvB9yj9X/ybBKgEtQhiCAcLIAq2B8IGVAPqAE7+h/vt+iv1UPj/89n48fWu+0f+gAEEBCgDrQgyB+MKBgdPCAIFvwJtAen88P4K+yz7b/Y09xj3Y/gR+nj76P+pAhcFkATEB1MH3AabBQAGZwXGAyEBVwHB/+r7Dfkd91f47fQw98f32/xu/TYBaASpBzgJngfjCPYHCwnNBwgDBALp/FL/9PaH9xzz7/a49I703/lM/rMCYgETBnQK2QvECzQHFwvdBWQG5f7u/7f8IvpP9rnz0PUo9bT4q/jd/c7/cgIABsEGlwpYCVYLfwg4BjMEPgKiAXb9m/uw96P3TPWD9pr3QfhO+0P+UwCiA+0DIAo2CEULjgcWDLkHnQTc/2L+dPt6+Ar4zfX/9cL0Ifjk+cj6iP5pAU8IEQX2COQKpQ2pCb4FigUfBOr+NvkE+cj5tfel8+D05vj4+8/6A/7HAH4FbwXOBuIJMAo5Cp0EcwWVA04Chv2++TD7yPfc+Kv0dvpH+wD8O/t2/T8FMgNYBmoEAgx0CAgHhASYBIoFFf6a/Vn6HvzB97v1QPie94L9vPiT/yr+XgWZA6AGYQgpClMKDAYLBiUCkAEh/Zj74vs2+cT4PvUt+Zj4nPxx+9YAGQCTBbAF3Qh0CO8IbQdKBo4DFQGhANv8afiT9Mr3uvmc+577xfxX/lb9H//KAHcGowVPB3MFXgeIBjEFVQTNAHYAF/sD+6v37Pnp+mD7xfp0+0n+cv/k/7cAVQX5Bn8GggYRBxoHPgO//6v/Hv8j/Jj4FffE+OH4P/oe+tj/4/5TANYB0QWHCk8G1QnTBVAIEQI3ACP+3fxZ+k33mfry94j71PgW/Y4AvwAwBbcAMQiiBY0J6wPXBFwDIgPi/jj6XP4i+iX8jfbu/Hn9D/0N/TP9GgKeAN4EogMuBocB1AVaBHsEfwHT/1oCAv5h/m/6sv5K+k771viI/ob9e/6R/0AA4QQYBHQGZAVXBg4EXwOTApoAJADn+yb+RfmE/FH3P/sc+1b/Pv64/+gBWQPdBXEE7QiBB68FrADz/qQBkv1o+0v3aPsR+kT6TfkW/TcAOQB+AUwD0QbBBc8D1gNnBnUFjgPc/6MAcf50/VH5ifrj+lb6Q/rm+m0AJP+pAS0AMQT5BPUD1wS4A7IHgQLIBO8AfwGo/o36Evz293X7//RY+0f6mgBa/rABtgMlBXIHKAWfCcgFKQdiAQAB7P9E/Uf7NfaF+Gb1PvuM9tH8dvpMA6sChQVDCGYInQovB5YHyQP1A9n+k/4b+yz7fvu19yT6HPXf+jz6gv7K/UUD1ASvB7YGzAQFCCADfQUZAFYEKACe/dD6Xvwo/Zz5N/mU92D9Cfs3/vr+OwKcA/4BQAevB7IMWgjdB/8CqQMoAPD7a/kg+Y/7yPZT98b5EPyZ+uP5aP6tBLIDAwYiCUAOdwzgBu8FswK4/6n5tvq/+Rb5ZPYP9yL7fvl6/Ur6/gHWAY0G0AbJCZQKiwnvCSgEugSV/ND8hfjI+nb6Sfjq+T73B/tR+a7/iP6HA1cC8wUtCD8IXwobBsYIMgIpAzL95/8f+6v6+Pdu+Az5xPRN90X4BwBX/3ICHwU0CdcKLQc4CmUHWAkiAGQCjP3c/7X3Xfaq9EH10vYE9cX7LPslAUYBXQdaCQ8KrwnFBwIMUwXsBVD97wDy+q757/Wi9Gv4gPSC+C/5nAHsALgCSgLcBjwJMgcICOQGIAqPBYcC9//M/T37xPjf9pT3NPe494L5JfvWANYAMgMuAlEG8gb0Ce0HTAmGCTYEqwQB/q0A3PgK+P/1a/eP9rP1Lfnm+iIANP9gBoIGkwn9B1AIwwu/B2MH1gAOA6X8Af1P9or3U/UG9p/37/fj/JX8ygEyAkcGHwfVCbUI9gesCJQFUgaw/rwA1fpQ/JT4f/g89o322vmr+o7+NPtsAyUBLQZfA9YIoQr3BrYEMwNsB6UAZv+p+Qr/f/km96z2TPZT/ND1vv6G/QAGLALiBUAHRApfCg4FLgdpAxMELfyc/Ev7qPlp9+vz6PjS+NT7LPtpAWsFrQcLB8kHkQiACWMH3gT5Aw0AVP5t+SX7IPk5+nX2W/m++rr9hP+h/ywE4gFKBg0EPQfhBCwETQT0AU8CQ/6fAAr7APxr+AH87frm+k/9fP68Ap7/ugGBAK0EgAJoBLUDSAWfA4gBLAItADABePur+oz5P/v5+Rz6vfxt/hwDBQA9BUEDJAjhAiUFugTzBkICtP6E/gL9yv5L9yv7E/gc+yT6EPxnAeoAWgU2AVAI6gL9CBICmwQkA9YAogEj+vn+j/l6/ej4Z/1y/Dn9bv2f/pMFQAFPBM8AAgcHBU4C8gL0AS0DJv6B/vb99v/M+jT7LPpQ/vv8qPwE/tP/ZALYAggEOwRUBpwD2AXQARIDSP9g/aD9YPuy/Xv5MPt9+Br7Evtu/7UCOQCjAjsCownjB98JUgegBsIA9/vB+jn65PlJ9pn4Qvo7/MP7mv02Al8EQwWSBDkINAiVCZwFpwY2Ai//aPoH+iX6PPmZ+MP4lPwp+3j+T/zYAZUBxAOzBNgHnQhEAxoERwEABuT/C/8P/KX+PP7y+fj7APkyACj5/v3t+rkCVwEtACgDTQQPCs8DngeTBcoGwgBS/RD+D/sk+1v1dPuR9376Ifia/GoADgO5BcQFmghWB3kIVwYDCIoFqQPv/Uv71PrK9y/1QPRU9037EP7++zACwQLHBoUFGQS7BpwDigZwArIF8QIdA0f+FPyF++L3Ufmb9FX61foL/3b/lv8QBEMDywVaBJUGgQaABw4F6AVnBZgCtf45+sn4ufY39q/zRfeb+Db+7/0sAu4E0wi2B0oF4AdjCXkIjgNmAoABmgEY+mL4pvc09xP27vQB+8X7agCg/nUHgQb6CR8F/AX2CDEFCgey/0wDaP1Z/ST5UPiG+cv2rvjf9lf+H/vu/+T/sAUHCu8HXQkhBhUJDgN8A0gAtAGc/OP5MvnB+uz5lPe++Kv6JfyH+5P/pAOkBzIHvgijCfoHDAZOAjgDXP7u/6n7Ff4J+4v68vpZ+dT7+/Y8+7P7YgJQARMFsgjVBlYJbgWKCP4CVgJx/ZD90/8H+t75xPWB+zv55vqo+Uf9vwDrAcUEZwUXCngHYAb0Bv4GnAXo/y38r/0P+xz5o/aX+s/7bPm++sb7BwIAALwCqARICHcH+wP9BQMFhwcOAXj/nv5A/on67/gj+GT9+foj+JH5lf2PAsP+vALeA9kJDQYZBOkHgAUFCKz80AJ2/af+Zvib9c76Jfhy/I34sf1FAGsCQgRDBSIIwQZGBpwF4QTpA8L+jf0f/ej7qfvD9o/81Puy/qT9FP1cBCAAlQSu/7YFyAREA7ACKgAKBZ7+rQAS+3T+Tv4E/f7+5vrCAGr8TP+L+14AVwE7AqEAMwAdBuwDOAW8AIwEZgNZAZ39T/zs/dD78vqS+oz9zfxc+2771gDMBLoFugOnBb8GggVOArD+JwLZ/jD+Dvnq+wT9V/xs/M78IgOH/zb/M/+uAzQFqAFTAT8DIwPPAA39PABh/zD+QP0M/m4CFv+I/xz+k/8OADP9AQH0/f8CqP7kAM8BWgGFA4H+dgGd//QB4gFO/kIBdv2c/4L8hPyN/TD9QABOAEQDGQIdAa0DugF9BYT/VgJMAPr90P66+pz/JPob/iD+mgDSADb9swJtAJUEYgAKBQME0AGPAmn+bARV/Tb+yPqa/Jf8Xfus/Af+2QKyAEcB3ADlAz8DsACv/6ACWgQRAvn/BwCKAU/9hfzU+oj+oftk/Db+tADhApEAHQMTBAAG5ABHAd7/TgJoAdT+OQCW/6j/zPvN/Bv+0v08/J77WAAfAu0B6P9NAgoFRgSMAaUAOQJNAuv+Vv+u/wcBmP7T+m39gvyW/c768fxW/4v/pQBM/6gE7gOiBfYE/wJOBWQA5QEw/vD+5v0Q/BT92fh3/GD7CP21/lX98QKIACQG8APLBUYF9AGgBJb/cwHV/JL8KP4r+87/0PvuAFD8Nv5h/ar9fQKt/iQDwgAVBRoF2wLWASwARwQRAUH/Pf35/5cA4PyC+m38Vf19+1X5t/xtADICngGTA5MJHgjRBwoDlgRmA5H/qv1v+un8/vhw+JT3dPtz/KH7T/3Y/9EFhASVBqwH2AmAB/4BgAFtAXX/BPo1+rf7af7r+oP63PwP/xH/yv7iAMACHAI2AqYDhgR7BLoB2gGwAYgA5ABm/g0AgP6SAFD9Af1P+0D7bf3M+uv+pP1jAbQB4QKlBgMEJAjmAywFDwMOASMBVPs6/GH6jPzQ+oz5Ivz++1//Z/wsAPsDawMwBmMBxAeCBcgEQQLq/jICQ/vy/CX6Z/1o/T/7FP9O/ocBgvvD/RL/hQGVAVv/VgSLBSYGMQSGAqYE3QFV/xP9u/xY/jz6m/rQ+hf/jP2A+pL8nP/PA/oCJASTBgEI8wWpA7kENAKaALv8dPwl/Nn6L/rF+gL9Mv2W/VD+uACbAogCLgLPA5gFPwU4A58BjQLkAtL+aP08/RD+hv20+uH7Sv26/VD9dP6KAVMBzQIVAYEDSwQCBR8EIwFpAYAARgEs/aT66/y5+3L+Ivrf/Vz/NP8kAOD/LAT9Aa0BHQHqAu8E9QCPAo3/QgKZ/yT9Zv6I+8H/fPv2/Mz9b/0QABT8sAHW/2QCGQAnAjAFJQNaBawBxQaBAj4Bof7q+yn8+Pad+L38sv9kABf7ev07AXQCIgOOA8EHlgREAocAwwL/A4f/YP0K+7r+ovyl/Jz8cf0GAhP++wAAALoB6QAiAE4CVANWApD/FgFCAQ0Avv5m/10C1gBS/5L9of6j/Uj8OfxE/Z3+9f6l/1YC5QMOBdQEtAUNBPgClgAP/5P+ovxj+xn7z/nF/DL9iwBH/m0AZgJQBYUGcAIxBJwBcQOo/1D+xf3t+vH8xvmd/jr+lwAOAef/6ASPAbYDTv7hAC4Cu//M/br6uAB5AAkANP9TADsE9/+eACAA2wI2Ae79RP/Z/VL/GPzo+4v/7/70AaL/xANGBS0DjwKt/l4D0/8q/8b7O/2L/wj97/7F/oACMgA2/0sBwAEMBJj+iwCpAZ8BqgB8+639kv3O/lr+fP0CAOwA/ALiAfABogF2AXwA4/6SAC7+rf4T/vT/DALg//T/5//kAAwAcf45/8H/DgCt/q7+/v+wAPf/q//c/7YAvwCLAOj/JwKRAMwAv/z+/X//Zv54/fz71gFgAisCp/5QAVgFJwLTAWf9EwQX/0j/f/xW/tAA6fqU/hf+agLi/sX9XwC1AvkEcACBAgoC1wM7AWL+BwDk/3b+dv6c/ZUBzP3Z/Yj+UAD0AeP6+P50/csCk/+TAVUFLAU/Bq4AFgQkALj/6vuH+0b++fq7/Jr8q/96ANf9nf+d//8C0gLLAgwF/QSyBvUDAQGU/ij9Av1p+of6oPqB/h//agCQAfcARALnAEABuQDp/hwAff+NAroBuAM0AgAAX/+N/3YATP7N/E/9tP46/qD81P3u/NT+ff9+AWYDbgJYBaAF6ga0BHgC2wLw/t3+Ivn5+SP4xPlZ+lD6PP/6/eYDHABCBX4FEwbtBYgCVQXKAfcAYP1u/07+vvs2+ef5Tv44/vz9GP6iARcDHQMQAeADNgErAuv8/wAkAvwBVgK7/7sFnAHiARL7vfwQ/XD7B/xn+XX/Of1B/879PwB6A9oBbAS9BF0HxAU6A5wDogHp/vb6/fgb+kL6Afuu+gz+dv7lAOkB+AHxBOwDuQWOA+wCYgSHAsECXP7q/tn++Pv4+/b6hP9x/df8Q/zN/18A3f2U/p7/hgScA1ADYgTcBHEGWAPpAr8AsP7U+5f45vop+7L50viJ+SQA5f4cACb/jQc2CDwH5QTUBWkJhwIIAQf+mgAw+6n3k/iC+wz+T/m3+3H9OAPKAGYCHAPtBc0DqQEBAdsCzQKBAQoBUv+PAZL85v2J+Xf84frN+8f9Pv4UAub9dgJiAW8G3AIgA/MDAATUBVAAuAIk/7j/nPwi+z77o/l++u36sf3E//oAugE4Az0FmwY1BMQDGgJcBLECkwCL/1n9Xv7f+hP87fuP+9L9lfr//iL+LwLKATACfQNoBEEGPgKoBI4DDAUMArL9yv4z/PH8bPiY+aT7pPwU/VD8JgDmA7oDcARsAwsGDgWuA8sCnAHaAKD8Pf2D+mX9PPrq+6b9JP9+AUT/wwJnAAYDJwG2AgwCxAAG/9T+sgEYAMIASv3EAD0BUwHS/b//Yv/z/0/9Df00/xD+8v44/aMCqwBgA6IBswQMBe0CCgNe/pgBtvul/rr5/frX+tn67v0A/TsCawJqBIoCfgMaBCkEpgKfASEBSADO/h/93fz8+1j85/sq/jz/YAElAeQAvAPLAkcEyv7l/lD/l//k/8L9FwNoATkCOv+8ATQC7/3E/MH7RAFB/XP8KP02AccDW/9jAEYBAAS3AYcAVgIWBJ8BC/9v/f/+6fwl+wn5S/0X/w0AvwDtAeAGgwRLBEIBxwNmA/b9Z/10+wkA8Puu+037lgBI/7X+nP+AAoQEFgHXARcDswR4AML98fyDABf+DP4B+2X+BADI/oQAbf4/BNz/cwJ//kQBJv9o/rAAiv+0BOr++QFU/2gCZABT/9v+Ff6OAFL+gAA0/9YA6f6v/x///P/1AIQABAJ4Au0DQQLMAWb+7P8P/Wn8EPzo+7IAzv3kABL/3gN+AiQAJADY/wwD6P6iAU4AiANGAcD+igC3/ef/Wfpz/XH+pQAm//v8mgAGAkcCIv6K/+oCaARdAhUBTAOLBHEBeP8S/9j/Nvxr+EX6G/sL/4b8Vv9GAJgCCQS8AUIEsQJCBrwCWgK0/0gAG/+k/cr9efyM/H37XvyZ/+EAOABt/4MAuAL1ABcDTgMOBK4AJP2n/pH/sAFD/tYAkf5TAX/+QP6g/T/9UP5O+y//WwBCBSkD0wLbA2sFswSIAPYAaAGfAwL/Zvz5+rn72Pm5+O748/vD/kz/uQM4BYAJ6wUOBo4D/gFfAGD8MP9w/ocBaP5X/yP+Nv7V/OP5e/7y/Nj/cf3v/mwDtAF9A/0BxAXwA4cAYv//AGICBwAT/nj/TgBl/Yn5EPp+/Ef9yPxl/WYCRwJUA2oDigWVCcQDiAQVAe4EjwB//I36VvqV/P/3Cfmh+aX/l/7B/14CQwXKBlADFwUiBuQFugGH/t3+sv9c/AT7kPp2/ZH+0v63/l4AWAHaAF8A0v7dARwAkAGN/04COgSFA2QDtAGiA3UAkf+g/En+mvwz+4f5wvnr/E/8cv4U/5gEuAZiCKgGnQenBuwEvwCB/tH/JfwJ+3T3O/xG+w/7fPtc/mAD2gCfATgBIQY5Bd0DjgMZAnwDNP8JAJb/0/+O/qn7Kf2m/Ur9+vto+4f/HQEYAWkAGwKPBNgCcQGSAHgC0AHo/qj+f/7lAc792f3m/ED+gv54+aX8Fv0+AigA0gD8AgcFPQU0ApgCOwLyA20Abf4D/hj+wP/t+yr8X/wx/if+aP3A/r8AXgA+AUkBlwPhAloBtgA0Ao8BEQHo/xz/xgCC/g3/2f3M/c38ZfsO/Nf8rf7h/S0AYwJyBz4GRgVaBPMF0ARv/6D86fwn/pv6MPkc+u7/2/5E/2oARQM0Be4APgHaACADVQCZ/wAAygCSAHP9yv4AAMYBjv6z/cj/UAA5/+T7RP1E/93+4P6HAY8E6QQ+AtAC+wOxA0z/6P4U/18AhP4//Az+0fxA/eb7Yf0kAEH/HAL1AasFqQObAgIC/wGcA7j/IP89/TT/J/5C/Cz93vwEALD8v/3r/hUCQgLRAEQCRgNOAyMBBf+b/zb/rf8c/2b/YgGlABsBW/8lAfoAdf86/N76ZP1x/dD+G/8wAh8E6QPFA8kD6wO5AuQAKACh/6L87fpH+Rv89/tn/GH8Hv9LA2gE7gScBBsIOAb3BEYBHADj/u35Dfny91L8R/x6/Yj+dgKcBO0DNAITAs8D6QCjAJ7/RgLKAqQA5P/A/4T/gv6y/KT9l/5M/7D/CgB2AR0BqgA3/gAAqP//AAAAGQBkBCgDzgIFAEIBdgIQ/rP7UPpI/T/96fwm/hwATgEU/9IAcwExBFYCFgHlAt8CTAXk/5j+t/4t/rH93vj4+Db8S/0u/nT+wQOUBa0ETQIjBFAFwQLv/rr9uADV/gv9rvtK/ef/FP0p/NX8+P6o/3/+2P7sAsQDfAM4AaAC1gOVAZP/+f/aAnYA+/3p/P7/sP5g+Tn5qfuqAND8Hv8cAiAIfgehAywEjAMaA7z82/wE/hYBGP6S/En+zwAeAW38uvyo/uwAVv90/r8AaARCBNQCsgErA8QBnP/Y/sD/fAH5/1D/4/4NAKH8T/tK+n774/5A/sIByAJYBloGOAVMBSsD+QPk/3b+t/0m/Vb9Q/sE/vX7yfuy+an8Tv+aANMC5QLEBqcHZwXUBFcD8gJYALf+uf2z/QT9tPrq+0/8s/3w+3j8bv8tAOEC2P8GA8AErQTUBMoA0gIZBKYCvACZ/nH/MP9t+1j7R/vT/Cv7Ivpf/OX9PwAJAMwEaQUBCk8I2AeSB6QDxAN9+yX8PPhR+Tj3p/bX+qL8n/4U/7EDUgTeBIgC4gVNB3UF6QIEAhoDxABc/Dj4ifpT+8j8JfuK/EH/LQCJADD/lv9QAUYCNgHrAZQD2AWXA8UCrQS6BJgCr/1a/vz9H/2++JL4Kfw4+xn94/rsAA0CDwM7A1UEOQjdBXEFXwNcBOYDn/5H+xT6fvzx+eD1X/ir/M7/ZPsL/QQDeAfUBSUCHweCCP4G7AB1AEQD/v6p+7X4RPz6+wj6EPou/sIBoQDV/sP+ZAIkA4ABNgFUA70FPwMKAeQBiAO8AMf9HvwZACD82frh9jz8mvz2/Ib9sv/kBsQDsAW6BRUINwepAvUAXP8c/9D5D/p4+Yb8ivu++Sn8sP8SAD4AMf+dBNMG7QNqBAwFUAhqAoP9gv31AKcDzABE/vb65Ptg+RD6l/xa/qv/RP24//ECDwbsBDMDCgORBQcFEQI4AY3/IwHv+jj6lvl//Nz8Wvuo/h//CwH//gAAQQPwAnkExgNxBrkF/wSEAsj/iP7D+kf6JPmf98r7hPlM/rb9IwH1AjABdQRnBY0GQgWwAxsG8QQpAhb9f/4Y/hf90/lH+Hz7Vfvj+u772PxyAqkA4QIQBIEGaAlqBkcH+QX9BXACKP1A++j4oflr9Sv2Bvjb/O/+7ABGA10GHgiNBo0GwwSNAzMBAADn/0j/FfyW+9T6MfxK/Mf6+f3n/1gBuP8AAEABDwNMARIAfgK1A8wE4QBJAgYEDAUMAh/9cf7T/FD6HPUR9zP8V/3X/eD+/wTZBtEFigTHBuYGsQOKANP/iQCW/bb6zPrS+137L/je9zH8uv8cAHgAdAOhCcIJNAWnA+EEHwSsABj6/P3d/Sn8ufjz+d3+tP5B/Jz7JADxAlwC6AH+AvYHsgRLA1EAsgGHAQz+0/yp/hQAEAA2/OD/u/9W/0P6APqa/mT+O/2W/QkEQwiZBXMFyAXmCGsD6/4p/Az9RPz8+BL4kfkU/EP+KvxqAPQBsQRxBMQDxwh/CDcHvgOpAsQC8vzU+CP3L/tG+dD6a/xnAJABaP1A/rD/YgFGAC8AjgMLB2QImwUMBfEDpARE/7r5N/ia+Sz7bvhI+QT+9AGOAKH+eAE3BDsFfQLXA0IHWgfiBaYC5QGfAHT8QPtl+cz6U/mQ+Nn5UPya/rn+YwFYAtcEWgWiBfYHvgf1BUICrQH7/wv/7PnZ+Jn5dvqc+Yr3gPqw/lABgQAHAmAFMQhxByUFggXTBqYEGQII/uv+3/2g+o744fYU+iX5FvmP+QL+PgKpAuwEqwYKCx4J8wWbBTYGpgQSAO779v0o+vv3X/UX+DT7iPmm+xD+TwSSBAAEBgVTBY8IZgIFA04BcQMQBNj+iwCO/+T/5/v2+OX5YPlW+SX4wvy4/80AfwFWBP4I6whTB4YH4weGB3ICtP8O/d76TfeA8w/0UfaC+Bn5B/xsAWoG6gYABzkJEgzXCt4EgwTHA9sCmvzQ9xr6xvkB+M30/ffX+878yPxv/3IG8QU2B+8E8wd5CGoETgK9ATkCfwHd+zT7yPxg/C36sfch+s783/uy+jD+GQLLAqMC8QNgCcgIiwbEBOUG3gVYAoX8mPvz+Xf4ffRm9GP2Z/lL+/L7EQHUBesJvgk5C0wNYwzfB88BQQAX/bT6ufSv9kH4l/gC+VT4Bv/n/9wAwAF5BQUIywWiBdkEOAguBAUCfwGfAYcBbfuS+tn7PPw5+t71bvgv/F7+Nv4B/5EFcwePCJwGjgdTCvYF+wO/AN0B9f6J+hL4sffg9z72vvar90j8+v4vAoAFsgarCVAJSwjcBUgFIAPYAg//Vv/8/Jj5m/hX9vX4WfcL+PT7KACmAv4CawWcCKMJFAaEBFgFBwXAAUD+d/wj/jH8jPlw+K/5lPsD+mf65vwKAnoDcwKuA6QHQgk8B40DVQVSBFwBV/3Q+gb9pvl2+O33vvlG+8358vwm/0IFAwQ4BogGuwp0CqgE0gJMAJgBkv0M+fb48PsT/PP5G/og/Hn/1/th/Mj+mgOmBPMDiwUkCXoI2AV6A00DeAGD/Qj6hvlx+uf3gvi5+F78x/3V/IcBUAMlCEgFwQfOCM8JIQaI/80A9P3p/JH2XfYN+ov7U/tK+o3/5QLXA7oBegPwA3kFXAICAl4DpAMaAjH/gQAe//n+Efse+qz8GvuW/dD6LP+E/18A8/9PAuEECQRkBBkEQAeLBo8CyAFtAZMA1Puj96P4hvp/+FP4APn6/pIAvAHlAucGvQjOCK0GqAYAB4sFNAKU/sX7gvgy92XzlvcA+dj7Af1f/yQGJAa2BxkGtQhgBlEDrACeAMQALf0n/j7+1v54/AP60/kL/Av8lP6t/uwArgOUA+4DxADRA8cDHgSQAfwC1AXTAkwB0PyR/qP5Tfau82D38/lP+9v+0gBjBwMGHwkxB9oI5wZ6BUkDRgFTAhj+C/3h9kX4D/cD9vv24/nr/p8AZgJlBY0JXAddB2UFhgfUBFsAq//S/vL+LPvb+pf4F/sk+b75Ffwh/XgBEgDLApwFxgjwBq4CmwL4AtwCov+eAFsBSQG6+9/5ufnU+6f4ovgU+kf9hP+T/+kCfAYHCe4H/Qe9CLsJVgdTAnUAgv6s/BX4K/Yo9gX51vbW+PL6ZAD4Ak4CDgXfB5kJ6wcDBuwFZAXVAOv9yfuK/J77qPkA+sP6wvxc+hD8NfoI/un+BQC5BBgHugx0C5IM3QjqBhUAQ/vV+oT4cvjP85b2Nvmu+6P6oP28AeYFEwWcAl0HZQeoCEMDjgOIBMQDfABk/XD+Bv3M+2v11Paj9/z6Avsq/MQAUwQ0BfADoAbyBgUIWAOCAxoE/AGwAGH9hwCi/DP7OPfA+MT4QvbZ+Cv7ugFyA3cFCAlXDHsNBQvJBjsEfwHz/XX57ffm9xn4effv9Rn7hPxq/qH+uP+xBJYEnAWqBuAJIAowCM0EXAQeAU39Y/lf+Kn3A/il9/76ov/WANwCKgE8A/IC9gBnAGkAwQPgA+gD9QJCBygG1wR2//T9CP00+bD1n/OB9973pvt5/DQCZgaJB5oKIgrACwUIigR3/1P92/qP+QX5hfjt+tX6/fvN+239zv2u/+T/rQPlBfIGIQnjB6sJbwUvAhP+p/yo+vv3Gfim+F/9O/23/lD+cgB4AaUAEv8HAK4C2gLFA9ABQgaJBTgF3ALlAT4A1/s2+WT3cvjE9h75Afw6/9ABGQJOBaAGwQVSBTgFUgTgA4MA2gBAAI4AYv79+zX6dvpY+0j5f/l6+4MAoQLZAQMFYwkjC1sILATmA6gBivwr+Sb4OPun+en64vv/AFwCugEHArT/hwGQ/br+F/4yAYUDDQQ9BdsFAgc3AgAAlPzU+//38fVA+PL76/3r/coCIgaKCHoEfAN1BDwDzADF/Tb/4QCkAcL++f8c/33/oftc+Pv5M/uh/Ef8MwD5A9UGqAToBNsG5AVxBPP9Df8M/o/+7vxN/UP+Gf/V/QD8mv1H/ev9V/zD/vQBBAQDBFgFLghDCG8GGAHaABP+S/so+C/3Gvk++qD6hfxAAAADIwQhBNcEAwb2BGECGwKMAQcCPwDC/s3/Bf/8/UH8pPut++/6P/rU+yL+TQAaA7AFRwhqCBMHagTXAzH/Vv5D+gr73Pyv/SQAsP7RAEYAuP8b/CX6A/v5+q/9bf44BUMIcwp8Cp8JQgfiAwf+Yvsb+U74cvhu9yT5JPtJ/jb/CgHXAnkF3AabBDYHWgVMBa0CXAG/AO/9s/tG+8n7PPrN+aD5Gvz0/Cb+1gB7A1cGNAZqBiwEOgQ+ArwBAf9O/sT/Zv+r/2H+GQAKAMn9dvqZ+S/74/md+sH7hAHCBCwHCAgvCjEJSAhXBEcBIv7r+pH5XPiE9z74JPnt+kT97f1X/mL/QgESBOwEWgU9CJsKAQodB4EDlwNV/5z5cfXg9Rv2g/Z69h/7EQHtArYFjwU8B2AGgwS1AuUA6AFLAX0C/P+9Ab8A7P8p/hn7lvu5+Mf3BviD+s38p/7kAaQFWgc2BxoI5QnjCGUF9QEz/3n+RvrE+ID47/iG+2T58vtt/N7/V/+2ALECTgXIB0YGkgg4Ce8IqwVqAM7+j/sc+D71R/bx+Mz6Afst/p8B4QJyAW0B6QLhBAQEygLEBfYGswcGBPQBUAH4/of6VfaM9W326/dL9yf74P/UBFIGJgb7Bv4I/gbMBG4CMwH1AJf+RP7w/s7+hP4w/Y/7wPq6+Wv5tvqk+4T/LwL/BHcGYgh3BzwHJwWiA+8Ai/xS/LX7Kfz/+bD6Dfw4/X/81PsN/33/SQEcAPAB+wN3BcoG5AZ4BzcH0wUTAhP+Ivt3+En2BvRX9Lf3Gfv6/ooCxQTdCKQH6weKBd8FngQhAo8A0f9YAbH9U/29+tD6CPpZ94P6oftw/p7/ygGtBIIFVgScAxgEEAQAA0YB7gDQAR0BCv8u/9f9Fv/k+6b6nPv++jH8bfoD/uf/qgJrA4UGMwmJCccI6wX5AzcAy/vo+KD2IfaD9g34+fpM/p4AoAOjBMsFeQXDBEUDtgNJA2QDLAIGAQYB5P8f/TD7NfoT+kr5E/ir+1P+8wCxAjgFGwgPB6AFXgLKAnL/av76/MX9NQAcAD4BpAAvAj4BKf2S+Cr3zPh1+xH/QgHbA+EELwbyBpEIqgapA5r+Xv5q/bL60/qX+sb8GvsS/Db9h/9QAEABKATiAyQG4QSRBUIFPwPxAs3/Uv7y+1j70vn2+Pb5+vsW/bf9AACiA0YDvAOCA54E5QNlACcC9QDTAdL+6f7L/7L/yP8I/ET92Ptu/W37Ffq9/Lv/SQOtAn0EigfRCFcGRQP/AioBmP4P+436s/to+w/79PxQ/u8A+f8dAdQABwGcAWoCLQPOA18ETgU9BYYCKACa/uH7kPqO+Kr4FPoX/Pz9rQD3AJQDsANSBOEC0wHQAr8DBAQkAlwCnwBAAMr9/Pss+z76g/sP+/D7YP0oAUIBKQIrAooGcQerBWoEbgUTBsQB8f1G+9377fj49iv4p/l4/WT9EgBLASkDHQM/AwAECgXQBWIEVgRPBGwDxwBq/Yr7yvv2+O/4p/gz/Mr+F/7+/6MAjQNOAawBFgFUA+QEmgOzBtkECwY9Arr/MP6m+7X5yvXS9cP1n/i4+nD+owJnBXQIqwn9CUcK8AblBAwC6v7k/Oj4iPl/+Uf6Fvnq+d37Iv4m///+CgIsBPEFmwabBsgHjQZyBJsCAQHi/jv9Z/oY+xD6Xfur+mD8ov15/qL/Bf+IAT0BPwMjA2IEvgVOBZ8F0AQnBbYCTQDg/Of7IPmN9hX1BvYu+OH6iP20ADYG5wdzCkAJuwn3CAMGhARtAU0AC/2z+yv5n/i29m321veN+k39PwBOArsGEwgTCFsIHgaBBhkCkgAF/5n+bv0e+u37ufuk/rr6Dfzd/cL+pf/I/JIAmgCpAoYCxgPbBeYFzAYdBTEFCAOXADn9Nvks+CX30vVZ95j49PzQ/sIA7gO2BXMHXwa5Bz0FewQyAysCnwFz/VL+r/yb+6T4E/hb+cr5TPpL/Ib/ygGyA04GfAikCNAHlQVcBUwBiP+y/XD8rvxk+q78f/w//cb79/tw/Pb8QP6I/voCfwRDB/oHWwdTB+YFWAOl/yL8H/uz+9v43vi2+Sz94Pyh/PH9kAGjAqAC8gNgBUcHiwWQBDsEVwOHAW3+JfwY/BP81Poe+sn5Bv3e/Ob9Rv5YAgAERAQfBdcEdwZeApwBbQAGATwAeP58/17+yP6W+6b7c/oE+un6PPpS/e7/NwR3BwMIqwlZCWEHzwN5AFT+VftZ+T74gfnq+Y36UP7q/j4CHADQASQDigJgAxcBbgNWAkYDIwGEAbwA9P8F/0v8hvzb/Ib8Wvyo/d3+wf9B/8oAcQFaAu0CGAEyAkcBTgPiAFkDRwKKAoQAiP3c/Tz6b/ry+ar7Df1e/oEAqQOyBmcGXQaTBn4G8ANnAMr+0f04+zD6o/i/+TX6vvv+/dH/IwKGAjgDkAOmBM8DMwPgAx0DjQIQAC0ATv6s/HD5nPpZ+gH8oPxd/94EqwWYBVAD5ALHACL+OfzP+zz/qP8CA3oCawNqBOUBygDS/Sr8j/u1+WT6Wvvb/P/+MgFfAzgFNweCBqoGNAT0AUsBAv0u/jD7zftN+3D7mvzQ+5/9GP6/ANH/4gHjA8sFaAZiBGIEFgPiADP/5v0p/Wf8bvsN/aj8Sv0f/dL+GQA3AGsCPgE/BMIBhQMkAhEB/QGlAHgC9gCfAS0AwP/K/qv8RvvI9z75CPqy/DP/kAHoBWEHqgb4BcgEKAQyAYL+2f6A//n/Tf3N/m/9B/72+u/4J/t9+2r/NP/iAacFsAd/CLAF3gTOA8IBJv7y+rr6M/uZ+u368vsX/9z/uP84AUkBrQJvABEBnwH8AiEE4QJwBNQEBAUMA1T/pP5d+5r5TvdY93X6kPoT/k0AxAR/BooEDQZcBaoGHAL/AAsBjwAZ/xr8Rv7u/WD9tvtG/Hj9uvze/Jb9SP/qALQBjQIJBBoFqgUrA84CZwGmAaT+Df3h/W79+f63/Hv+nv0G/Vn80/y//TP9AADGAQwGgQYCBxoJPAdvBYUBnv4O/En4E/ev91z4lfr1+4/+fgA+A0sDPQRNBPwE1AUYBLIExAIjAu8AyP8m/nL8yfth+lz7h/pk+2T8Mv1ZAbYA4QLiA7oFKAYhBNACZgHpALT/uv77//D/eAFm/yr/H//w+2P7Wfmg+XT74vtVAPkBEwYoCYsJiwngB1QGVwLo/tT7Rfnr98f2avjB+RX63/18/ysD2wN2A2AGLAWjBgIETAOQA1ABdQBf/aH8a/td+vL6svpZ/On84/42ARkCDAWaA8YDdgJCAfQBVv9eABT/0QDAAZUBtAFIALcAn/0Q/YL7dvum+wn7nv2f/l8AYQLPA6cFkwYUBswEKQMwAlsA6P7F+6D83PuW+w/8dPtA/pT+H/8U/yr+CwEhAYEDqQLFBKAFpAXkBAAAwf/k/DP8S/nx+CL80f2t/hgA/wJyBCkD4P9V/5oABAIcAEv9Rv5h//0BDgPdBSwFegLX/c/6CPq2+SX5Vfs8/SgBXAL7AzsGEQfxBGECSgJ4AsQABAAUAOwAq/8m/cb7Xvpo+yn8efzj/uQAMwPQAoYCdQMpA04CcwCn/yAA/P9H//n9ff8RAa7/Kv/f/d7/M/9g/bj/Qf8hAaX/1ABVA30CcgJvAJUBRwEyANT/yv5X/sn78/tB/Q790P75/kwBugHlAc4F7gQHBcAB2v+U/kb7bvsS+/b9Nv9+AKIBZgGFAxUA2P/n/ev+Nv/v/UEAsAGaA0QClwHsAAkAsP6z+4r9Wf2N/34ApgKSBD4CzQDe/yr+ofz4+2H9Nv/I/7kBmQNVBWQE7gNrAsYAOf/m+7v8F/yb+2v8V/xy//7+rv/PAfgCJQO+AyME0QQKAzYBq/8o/qD8PPta++r7Rv6e/qUAlANyAxkEtAG6AWEBvv76/nD+nP98/z7/qP+uAJD/G/7d/aL/GAGSAOUAIwLaAsH/1f08/JL8U/1a/AcABQJ3BTIHBQbLBcsC4/7h+tL3Dfh/+DD6y/yX/wIDBAXIBVoE8QM7A/oAYQGlAAIC6wHY//f/1/wX/Rv8ZfuF+wr7lP5u/9MBDgPFBG0GEwWQBIcBqwCv/6D91fx7/BP+3f7//vn/BwF4AfoAuv/d/kn/PP+Z/qj+3v/WAIgBeAG1AogC0gLYAhUCpAGL/9/9MP1z/RT8S/vF+3b+EABV/3oCHQUsBRYD1wE6A6MCmgBIAM7/TQC5/iz9kvwY/Bb9S/tf/HP9AP9SAcQAsgNMAzcEDgOIAf8Ajv+Q/9X+DQAKASUBnwHHAF3/tfxe+mv6Xfn0+r/9Kv/HAtEDhgd6CAQHFAaOA7ACqP+0/Lf7APyu/K37avx8/Zr+lv09/Xb/ygAYAWcB/wFeA1oENAQZBLYCfgG3AIz91fwZ+2r8E/0t/cr9cv5IAIMAGQCLAM0ApgJ+AR0DwQOtA+IDiAGoAUYAyv5W/r/8Wv3d/LP7C/xG/Hr9s/xk/hEBnAMlBWkFsgeQBuQEcwHp/ir+RvuC+Tn5j/v2/cL+Jv/uACMB+wBkADkAMgDpAJoBhwJQAwoDYAOiATkA4/5Z/Y793f1I/0z/SACL/2kAhP92/QH9MPtP/c38nv50AqQFnQigB0IHkAaLBLkAr/zS+aL4NfjP91z4RPzN/gYBhgIXAxQGcASbBK4DvAK9AwsBzQDd/mX9fvzM+nv84fvV/D39H/9AAS8AUwIAA7gDagIVATYCLgFyANIAygBJAcj/W/88//j+KP5t/dX9uf1Q/r7+xf7q/lb+mP7a//UACgNABKwESgacBUoFEQLo/s78AvlR9//30Pk//Ib9CgGBA9cDCgP8AmYD/AGsAYMAugFmAlMBvACG/07/g/2m+mH7lfzv/bj/QAEhBPADyQMvAuv/bf4Z/Uz+MP0c/7gAYgJLA38BHwKQAQsB3f0V/Pf7AP0e/BP88/5qAB8C0AFJA1wENAT8AvQBFQGAAGb/UP0y/Z39Jv7s/Z/+6f73/wUA5QC0AVcBKAMZAnEBXwAe/3oAJABHAeQAFgE4AVv/Xv5B/Cb9hfzo+17+ff92AhQCjwLiA8gBYQG//w//DAB1/0kB/wCPAv4BlwAB/178fPvk+Rj8yf2o/woDHwS6Bq4GTAWCA0r/zv02/Jn6VfsT/fz/0ACtAKQBnAGkABv/rv5t/14AugGiAUYDyQPNAtEA5f2+/Y789PvJ+8H8Yf+AAdIBDwKzAgwCGACK/n//of+0/wwAAgK4Aj4BfwHNANoAgv6g/J/9Fv3M/Rf9t/2l/6EAxADdAdcC4wMcBBAEPwTpAsgBEf+w/Av6YPnh+B76RP1b/6cCSgRsBhkGvgOYAkYBXv5E/BT8uf1q/7L/ygAsAQgB3P88/tn9Rv40/54AZALWA2ADzgIWAT7/Gf1D+1L8yf0L/2oCUgTPBk4FCgMrAZL9y/uT+Cj5V/px+0P+FACUAxcDZAQMBSwEoANJAQoCWQEAABwAVP4b/o/8z/uY+8j6cPwf/XL/gQEgA/kEnQT9BHYD0AEaAl4ABACK/Yj99f6h/u/+xf12/jz/f/7U/TD+hAAAAXYAgwDkAcsCYgG2AGABYQIvA3gC2QE7AjcA1P4k+7r4Pvji97n5q/sZ/zwDUwfyCEQJGQhoBvUCeP9o/T/8rvtT+zP8bfxh/fT9xf0D/hz9RP7+/+sB/ARABzkIygaPAmn/xPwL/lb+pv60/KD8Hv4U/00AYgAsAF3/c/3x/VL+MP/1AOwAiAOcA80DmgMzBOcCHQFM/zD/9P14+yX7SPwL/Sn9jP2l/xgBWAAyAA8C9AIVAtAA+wCJA6IBzACtAOEAcgBI/Uf9Xv66/Rf9ufvc/en+nf8HAGwB4wP0AnwD4QIXA78CGQCkAEz/ef7W/uH9gv9r/kz+b/1r/Hn8R/vx/FL+RwEzA8gFBQkrCf0HPQVTAgAAt/to+Zb5X/im+Xv5zP0/ALwAgQEvApYCfgGkAb8CxAMSA00CTgJ8ATH/+f7Q/TD+u/zG/Ij+rf7o/lX//v8GASoAof+jACsBhAFCASECRQOnA/QBxAH+ANwA0P5L/az8lfzj+oL5NPu7/Hb/OABQA5MGfwZyBkIF5QMsAXz9efzq+0v8zfsG/Yf+qP9GADUAOAEOAZIAoQB4AW0BCgGWANcBxgBv/4j/lv9lANj+Xf/L/0gA4P8qAAkAUgAX/83/xf4v//b9rv5T/7r+Uv98AOEC5wRqBL0EMQXaAgsBYftZ/An5jPk499v6Jv4AAUwBzQKNBdMGXARXAw8DwgEJALL80v6z/Dv9B/xh/gcAGQB4//ABYgJWAnL/QAFCAV4AqP4c/5ABff/C/gz+eP98/+P+W//xAPsAgAKAAAYB3P9X/xP+pP14/pn+RgB1AWADhQOhA00EbgIsAD7+Dv0f/Tz8Kfwk/eX+mgCiAX4CzQOTBHYCkwLRAI4A7f3p/Mz9dv7W/nn+GAAzALIAD//e/8D/TAAz/1ABpQD8ArwA4AFCAWb/MP+K/VX91Pv7/Ez+bQDg/+ECXANgBdcBRwLd/qwAuf2K/VP9j/5q/wAAEAASAuIBxAD1AI7+3v8o/TP/TP43ACr/9QCtAAYD/gGNAuQA1gE2/zD+7P2S/VL+EPyE/h7/BQAFAF8A/AD8Afn/WwH5/8ABtgDSAOkA/v8AAJ/+2v8P/9D+cf/MAO0BYQFIADYBRP/A/l7+iv1a/vz8Nv9eAMIBSQI1A4sEEwR9Aq4BGADj/nX7JPv9+sD6Mfwl/HIBxgHBBDYEXQZ5BcEEbQAYAI79IP5B/A39yv5v/2b/3P0AAID+uv8u/ecAqQA2AhIAAASFAwsEJgCpABgAG/+z/J79Pv6a/ir+9v4MAiQADgFT/h4BUP5U/6H8Gf/I/ioB4gAGBHoDMgWTAmACXwGA/pf+Zfug/Mj6EvxZ/Nn+2P/eAe0B7gM8AykEWAKWAvcAXf+1/pL9yP6K/an9JP8+//7/eQC8ABECWQFqAF8Aff8kAPn+iP8A/8j+QP6H/4AApQDiANIC4AO4A34C4gEdAUf9F/wH+hH7B/mt+wz94QJgA5YHkwYtCDgFMwOLAHD+WvwM+/77PvtE/Tr8/v/U/pUB6v66AW3/zQLHAJYD/wIcBC8CyQG/AKoA1v6k/Kr9vPy//WH8cf+X/38Bgv7WAIj/bwJW/7AAKv8GAt7/jgDWABsCxgJyAVYCBwEgAEH9B/4t+5j8tvp3/b79tP96AHoCSgM6A6IDowJmA6oBwwAIANT+XP58/eH8ZP3+/MT+3P/v/wAAsv9UAcwALgHw/5YBkgEdAsAAAwGgAW0Bzv6C/ZP+Zv9O/1L9BgCg/woAgfyk/tL9ZQDN/V0BjgLXBHADtQT2BOUDtQD8/Wb+o/vr++754/1F/ToA7P5EA3gBXQPeAHsC4wCCAf3+ZgBq/yYAWwC1AKICiwC1AQ4AfAFY/r3+pPuq/Xz7gP2w/PgAywCmA+wB9wMGBNAC/gFVAB8BbAAmALX++v9U/qn+a/sb/I37Wv3y/bIAAwIqBGkFEAVmBSgD9gEAAJj9+fuY/ML8cvwS/Tn+KAEAANQAhwHUAlMBgwAxAHQBdf+T/sT+7QADARsBbwDyAG0Bl/9JADX++P+f/vP+ev1S/yT+jP9N/fT/DP/KAQkBcwTeBAwFFAVzAggD//3G/cT64vu7+YX7sfoy/87+3QGQAfkE6wMiBWADlQMsAcj/s/6C/OX7fPs2/i7+CACX/0YEyQJrA///zQCN/jf+fftF/e395P8xAJgBEQM7A4ECkgGWAQYAjgCq/mT/j/6a/33+Xv4k/RD+IP37/Vb+LgAjAjQE1gRcBL4DKgLYAJv9Y/xE/HP7wPtg+9z+2v87AZ0AoAJoA7QCZQE8AZkCKgHU/tH+tv8n/1r+jv2SAFL/IAAi/6YBRABgAHb+HgE8AGMAJP5iAIYA4AAG/wMArgFAAT4B4v+mARwAEQGu/TEAjf0OALj82v6n/pIAGf/i/xQBwQKtAgkCcwGQAfr/nv6B/fP7ev38+4r/6/+uA30DUAVTA9oClv9q/8j8+PwS/An+z/0r/wgCSgP/A+8ADQGY//n+ev2u/nn/CQCB/3wA+gAjAf//YgBxABwAqv8eAHsBIAEAAAAAff8R/yf+ff6M/rn+Vv5CAOUAtwKKAcoBLwECAqsAb//G/m/+0P7t/Pj9L/5f/zL/UADfALkCPgFOAioBqALWADwBr//k/9n8AvzG/KX+VQHGAdAC4AHg/w79DP3s+7v+5v2OAfYAHwTxAl0F/ANIAz8B6/8//xb+d/4BAFcAmv6Z/UL8Df00++L8bP45AjADiAZaBsEHYgTrAqH/K/68+m35LfgJ+n78cP3X/+YAZQPHA1oDJQPlBE4EDwRlAbsAbv83/b774/uN/V7+AAAUAZwBngEgAAAABP3Z/Mf9NQAzAVMAOQCnAsQBewFIAIwCYAKKAPT+tf+OADr+Ev6J/NX8s/qw+mX7gv9aAL4DNQRMCAcIfAdFBAwDqADR/lb6OvkJ+Wz5Gvom+/D9kv98AdsANgRABMoFOASqBIcDMQK5/sn+uv0+//v9wv4J/tH9Tf2U/Fb9ePzd/mP/ZwGXAeQCtQI1AsYAvwGkALYA3P/bAv8DewPIAPgAKwAM/U/5cPhR+nn7xPsp/t4BDgQnBZ0EOgYUBkAFYAOmAT0B1/9r/TD7EvvX+q36lPtO/EP/1f+WAcgBTAOhAhoDCAK+AqQBlQFFAV4B6wBw/3v+cP3b/OH7SPxl/GX9p/4UAfYBKgSnA0IFaQP1AjwB5QDVAKkAtwBRAfkAOAAU/vL8l/sw+tf5nfkG/ez9TwJ7AzwG3wXUBQUEIgI6/8z+Bf4O/2D/ewAIAbYAif+V/bL8BvsR+3j7Af3m/q4BiAPnBUkFsQXbA/kCWwE9ACL/7/1a/Qf+Ev1j/Jr7Yv13/Y/9l/4HAdQDJAOmA3AExwQrAwEB4gC2AO3+jf2//Gz9bPwL/Of7If3F/RT/DgEaA/IDQQWiA4gDsgAAALr+K/6P/cf+OQDyAGEBpAATAW3/vf4j/Tr9j/x2/cr8RP95AD0DQAMpBLEENgbXBCQDpADa/w7++/qu+SH6Cvvc+hj8rPyi/xwA9gHFA4oGuwaEB04GSQb5ApMAqPz0+f/3fPc0+LP5SvyH/ycD5QS3BZkGIQYJBDMC6P+C/339Y/2F/bv+6/7u/pL/ZQBjALf/Fv/r/7P/rv/7/hD/sf8P/yL/uf8xAGoBHwEWAsYCUgNYAi0AwP8D/7H91vu6+7T8jf3j/Cb9//46AtECsgQ7BTkH5Qb9BCsD2gDT/o774vgx+HD46Pm6+5b9CQGZA7QFNATRBB4ELgScAd7/J/8m/0D+n/4z/oD/2P4z/1T/Ev///rP+VgC8AMQBHAFMAlwC0wGGAAEATv/Q/wT/xP8qAJMBsgGgALr/Gf/9/QD8MPsJ/BD+MP8oAV0D/AXdBbMFogOcAnYA4P7E/e38/Pve+zz8hv07/cv9+f5+AKoAbAHJAqADqgMqA8kCzALuAGAAav+d/rz9R/yJ/BP8s/yT/Bz9Mf7J//MA8wHfAiME8AOQBIgC1gL+ALz/Ff7A/Bb92fwt/S3+Av8OAGf///7B/ir/TwDOAL0BCwL/A8kEcwS6AmMBwP9x/mT7V/sR+5/8Nv2o/vkAZwFVAUcAxAAAAJH/ff/7APwBCwPDAnUEVQNtAvf/B/7n/AH7jPp1+g781v2x/uD/bACwAVoC6gKfAwMEpwVMBeYE5AIcAX//7/w3+sr4/PfI+a76jPyK/mABEASsBDwFNwXSBQUFuwNjAoQAKP+c/Cn77foR+937s/zj/tgA0QFJAscC4AECAZv/Zv/6/iv/ZgAMAjYDcAOGA7QChAH3/wL+5vxf+8H7XvxW/PX8WP3g/9kAZQG8AcIDLAUdBWUE0QTeBGEEpwC1/ub7Vfrc91b2u/fT+ST80v0+AX8FjgieCG8IsAdRBuYBB/82/AL9tfuS+0n8ZP0W/jf9uf3e/mP/9P+WAD4CQwMoA2MD6QJwAm8Aef+R/pH+WP8lALQAuQFXAPL/sv3p/Pz77Por/KH8Hv8eAN4B0gJ+BDwF1wTQA7oDNQOcAhoAo/68/Ar76PlZ+Ff5ivqC/dUA5gJWBloHWwgSBr0EDwORAIn+sfzo/FT90vzX/PD8+v3z/U79Kv4m/xYAngCXAUMDuANNBGwEIAOSAU3//v7r/YT+jP1Y/pH+DP91/9v/9P6L/gb96P2D/kj/wAA1AuMEywRCBU8EJwSdAs4AQv+q/Tf9r/z5+3n8fPyd/bn9FP7q/yIAAwLTAZMDdwSXBAsEvQIIAhQAk/6S/aT89PzK+2b82Pwp/ez99/32/7gATgIjAxAEIAW+Bf0ECANCAFP/W/00/Ir6I/uV/G386P38/df/+P8gAMkAqwHUAo4DgANDBEoDyAIKAeD/5/1l/Mr7f/vv+1H9BP7+AEUBhQKFAVABEgEAAD7/ff6L/9oAxABYAoUCzAQzA28COv+C/Ov6yPr0/Lr+sP7m/sH+2/+2AAoBUwOpA3sEHAOdA3ED0AJZAGX+WP1I/BD6fPmO+sn9+/+PAEMC4QI7BMICBgLFAZwCPQJfARUAawCx/jL9Pvqq+hT7B/3p/skBfAQwBdUEKgRLAm4Aaf5s/Zn+nv51AEgAdgIGAnMCOQAa/2n+iv1z/eT8zv3W/n7/lf+///v/QgFlAPcBTAL4A1EDWwLRAScB7P/W/dH8I/wC+yD7FPuO/eP+SgCaAhoEtQVlBWUFKwS7AkwAV/7e+1v7gPrz+0n7C/47/9UBrwGPAp4ClgPMAeYB3/4mAaf+ugBY/rQAq//9AJX+sP8S/iUA0f36/7f97v9l/pP/QP95APQAZwFNAdYCxgF4AhQBwgEBADn/b/5Q/vr9af0V/dP9R/1i/gT+7v+FAKsB0gL4AzoFqAXnBCkEBwFs/hb8+/pI+j36pvtt/b//yACIAU0CDAKmAawA0P82AVEBqgLWAl0D2gImAPX+Mf26/B77cvvT/Ef/yf9pAKAAcALcAIQBvv/JARwBsAEPAi4DqQKZAWD/mv8T/cv8ufqw/Kn8C/4M/mv/dQCXAfABygMEA0sEwgIzBLoCGgJ2/2n+ufza/G38Df3C/Ez+Q/8tAPH/6P8YAJz+Pf9c/1QBnAKNBLAFegbGA+ICn//r/hj7pPqz+Zj7xPuc/Pr9IADiALgBMwE/AxAD/AOaAwcE5gSUA8QBS//X/Wr9I/uz+lf6wvzE/Uv+cv/OAFcDIAM+A9UDSQO5ArMASgBRAKP+M/53/Wb/BP9g/+r+DgCt/4r/KP5x/gD+k/9w/nQAlgGvA98DjwMiBP4DPQJqAAj/Dv/i/T38wvvc+578APys/G/9X//tAIACGQS5Bd0FYwZyBBUEawHk/+/8sftD+9f60/ki+8z7t/5g/ksBgwEyBZwDCQR/AnUDkwHAALf9nP8K/gAAj/6GAUsBTgLC/+n+yfxS/BT7ufu2/B8AZgFKA+QDnQRbBAYDCAIeAQoA1P9x/8L/df4Z/T38uvvF+jP6RPuX/Q8AvwKFBNcGIQdXBnIFWQPLASf/8P3e/Jr7Ufsb+z78uvxA/W/+3//tAQsC+QLMA8cDvQM+AewB0wAAAbr/DAAhAKMA/P5p/xH9+v1/+3j8mPur/l7/DQHaAYoDRgObA5oBkAOyAQICr//ZAJEAcACJ/if+2fwE/cD61/sd/Dz/tP9PAvkC3ARaBMEE4wJOAxsBngBC/kz9z/yZ/P385/0Q/yYAIQAKAOUAfwCRALL/XgCv/w4BuwAJA4ADqwM2Aj4Bnf/p/dz74vth+4f8gvxo/qT/HgGrAcMB7wGDAe4BegI8Aj8DEALOAXMAdf8i/hz8w/u0+zX85/xO/lcAvAHsAUYCPwJBA5QBmQGtAFUByAD6/8f+nv93/nv/u/2K//b+FAAF/1n/ef8pAKr/Iv88/+//ZAB8AcEBQgPrA5UCqwHg/wD/H/2b+9P7VPy3/Tr+aP8mAqICYQNmAXQCmQHoAXkBJQEmAv8BGwBr/7L8YP33+ZD6C/of/bv+aQHiApEGZwXABesBoAI4/xj/rPzL/ST+Pf/X/o4AKQDiAB7/Q//z/n3/Jv+E//L/HwHCANYAzADOAN0AMQH1AF8BAAHBAEMAFf9S/nD9Cv0x/U/8qP2a/h4AEgJrAscDwgKuAx0DegKRAtQA0wA5/9b82vyO+uL7hvus/BT+jf5oAjIDNASMBGEEGwRuArf/YgB0/tb/lfwl/vX99P7M/qH+yv7zAKz/PQCk/cv/xP8TAS4BLgLhArYEPgIDA8EAQwEC/h79Bvyw/b39/f4t/sX/uv5R/zb+Vf8X/4QBvQFWBGYEOQZJBeUDZQEd/mT8fvpm+er5Hvse/Wn/eP9XAbwADAOUAbsBeAGoAigDuwLfAX0CPwEmAAn9L/3r/Bb9vvxK/T/+PQDa/7v/Wv/HAMABtAGpAX4DOwRXBYsCxAEmAUD/af2b+h/6vfsQ/DP9lv3q/xIC9QDeAdYAUwO8A4UD4gPHA88D8wKu/tD+9/pF/Ov5uflH/ML9aQDeAMYAqAIrATcCigBOAJ0B8ABWA7MCfAMhBKQCAAI0/o/9t/yk+i/7Jfq6/Pv9jf4AABoBmwJlAyMCAwQMBHIFzgMGA0gCswHd/Uv8cvm7+pD4RPof+m3+Ov8vAgQCVgXaBIQGAQRTBMcCtgInAFL/bP00/rD77Pue+xP8gv3Y/bX+pQDn/ycCjQHZAqYCpQHCAvoB/QF4ApAABAFe/9v+RP5c/bL9LPwi+2P6zfrL/Eb+dv9VAucDLwYFBkgGfwZ1BcUDOwHg/sH+1vwg/Lf68fn9+sz6w/vj+xT/TwEBBFEFBwcFB6MGRgJTAdT9Uf71+zL86/36/igA1v/c/X0Aw/0Y/4X9cP8yAocCkQKkAsoBQQRsACsBrv/yAE8ApP4T/pn+9/20/vL7fP76/GT+j/1j/okAqwIvBDUFngXpBlkFLAM3ALL9hv3w+zf8QvsA/Sz9O/4i/V79av0GAL4AmgPvBAoHXgbtBL4BXAC5/WL9+Ps8/aT+3/9c/wj//Pym/if9zf3T/tIAvgMuBBgDngMsAXgCwf9t/1MACwApAWv+Rf0W/o78E/30+/j96AAjABwCLQEaA/YCfAGTAZ4CHwOrA87/CADZ/R39UPsZ+kb8Rf65/xsBTwE2AtcBTQESAf0AOQIzAnoC6QENAZgAHf9Q/oD9Bv1l/on9qP75/Qr+eP/z/mz/uADIAf0EPAMRBMYCxwJMAZb/lP5t/0n9hf7/+uH8y/qQ/GL8nv77AD4EygPkBXADjASuAC8ADP8TAL3/3P8u/0r/cv3e/Kb76fyd/fX/QAFbA1gEgQNiAsQAKv8N/wP+bP/B/80AjABGACIADP+H/nn9+/68/u3+3P7w/gwAtP9d/xYCkAIyBU8DRwOaAjMBGADf/S79Xv4q/SL+BPxq/Hn9UfwJ/pn9NgIuBeAFyAbiBS0F0wPy/fv92vt4/e38APxw/f39oP3+/Xn8RgA9AYEDjgNYBJkEgAMsAN3+q/1s/0L+pf/Z/00BmACI/6X9R/5j/Q7/ef2m/wEAVwEFAe4AiAFjAxQD2wMbA2kDXgK1/yH+6ft2/KP7Z/sH/Jf96f4x/0j+nwB0AckEhQQzBgEHOwZrA8EAIv3E/Fb68vqe+ib8qfzi/c793v+q//EB0AJDBKgE7wS7AzwDowAq/9H+xv4w/z3+wv4S///9Iv3E+nj83fxi/3L/UQFHA5MDogILAfgAvQIPArMBrAJhAlUDMP5U/mT7HvzY+s36Gv2+/jUAngDq//wBLAKHA/gD3wNuBi8E+AJAALT9OP1E+rH6Bfw5/Ob+Z/5dAEgA6f9wABEBbwF6A7kCFgXyAiYDDQHSAMT/Ev+9/f39z/zy/L/69Pq6+/D9k/81AfUCcgV6BM4EBgLUAhEB+QEeAPgBzP8HARD9Mf2x+dz6wvnr+y39TwA3ApsDTgQVA84BEgEyAZAAkALRAvQCTQA9/gL9JPyO/Ej90/1O/63/o/4s/57+8QA8AYkCmQSLBZIGswQIA6oBef8H/cj7jPq9/Sj8Ov2k+2D8Sv0r/pP/3AHwBHAH4Aa6BDgDyQAoAMb8w/3Y/RIAHf8v/r/6B/2/+cD8MfuPAmwCHQdkBCMFqgO1APz+uf3s/yQA9wJS/7MClv3GAe/7qf7K/Oz+BgC7/Tv/XP1d/4z9DQBz/5MF/gL2B3UD/wWQAZQAcf16/ID87vtJ/CT8lv1r/bv+J/3kADoBMQVYBGAGngS8BasAXwDH/Nv90fvy/PL7s/7d/Oj+bf1hAJ4AWwI7A2MDLwSTAeoBwv6W/xn9qf9R/hcBef+TAev/owC5/3j9sv+s/NIBGPwqANH8QwI1/jgCQQC8BlYEYgV0AiYBEQGW+wb+6viH/yb7jQDO+4gCVv2oAo/8IgJwAU4EAgWiAyAG+wHNAfH7r/2x+Kf94fhmAEP84wFd/9ABtwEtAfMCpwFTA4wAoQHL/kQAzvzJ/2T99wFd/4kBhQBT/+D/cPzM/n79YAADAK8BPADBAmwA5wLv/pICoAAGA7n/HADW/hb/iPuX/E/7E/82/rcA1wA4A1UCRwEAAAAABwL6AIoCvf9RAof/a/+I+0f8v/sX/1D9of/JANUBuQNI/7cCHf9fA8P+VAI+/7AC7P5wAB3+EQCOAOwAFQKP/vsBtfsf//L3e/6O+1MCXP8LBX8DkgafApoBGwAT/kkAbPwxAan9ZQJ9/Vj/wPpG/mb7iv8c/mcDDQTLBBQFUwJLBNj/CQBy/Qz+k/0P/jX8KP4x/aH/hP+8/+kB+gB0A6EAbgHN/88AVQDcAKcAygJnAecBX//H/6v+qv7u/Y/+IP7h/j/9jf2A/HP+2P/aAF8DfAS0B7QFOAUoAc4BqPzR/eP5Q/5y+4X+e/zK/p39/P2S/2MB7wP/ApwEMgI+BagBnwP//or/Nvy2+3X7gfzB/iT9+v8N/voDGv+ZBI//uwRc/pv/QfzT/6z+iwHbAb4EhQVEASIBLPsQ/9H5v/2D+5EAhv+FALf9dv/i/RgAuv+TAvcFBgaDB5MCqQLZ/ij+N/sJ+6z8rP2K/d78Z/xN/rv+AACMAvUDGAc7BaAE7QF6/7f+Ef0h/kz+TP9cABX/f/4K/qX9pP5H/xwBwQLsAhUCsgC8/TD+f/y0/7//3AQCBUsHwQK+AUv7lPxk95T6bPp0/5IBCgKpAegAVQCg/j7/dwAPBeAEPAeCAx0EYP4s/Qn60vot/HH9Z/5O/YD/2f/CAWgAAwNWBGkG/wMEAmQAFP6G/Y36x/3n/WAD/gACBBv+TwDA+qL7QvrJ/T0BYwP9A+sD1AL3AB3/Kf1yAG8A9gR0AnsDrAD//Qb8Evk3+hD82/72AWICigMoAwoBqgAd/1oBzgFgApADDgJNAdv9QvwR/Hb8Lv6F/woBIAE/ANT/a/7z/jb+2gCgAcEDugHGAqb+WgAW/NH/L/5VAyQCRQQQALL/SPtj+kz5Z/s5AJ4BZQZxBHUHugI9Akb9DADz/XABYv7eAZP/zv+1/FX7BvyS/Bn/DQGVAsYD4wJIArIAewBH/6kBBQB7Atj+QQBS/Kn9Bftj/yL/EwPGAfMCBwEV/9j9APsc/VX9LgKDAnoEHAMTBFoAgf9p/MD/DAATAmQBwQAnAJv8jvpb+rL7DAB2ARMFGQYnBsYD8P9J/T/9Nv1r/kj+9v8BAS7/FP6I+yL+Sf/IAMcCXwRTBeEDdgAd/5f+gf0i/w7+2gGH/5cAmv2M/Yz9Wv8nAd0CWAT7BPwDTP+w/Y75yfym+pQARgAeBg0ENAU/Abr/qfzd/dX93/8NAGgBWgG+/kL92Ptg/QP+LwAZA1EExAU1AmcB+/26/iH9Mv7O/TYAPQC+/w7+b/3B/pf/pAENAqAFxQOQBFn+Vf97+7L9b/x0/5YAewLXAMgA3P0X/9f9Pv+wAE0CwQOWAiEAUv4l/Jf9vPzb/5MBwgQxBbICRACe/Sf8S/t7/G39NgEyAUsDTACDALj+UP8u/wUBJwNoBLgDwQHn/938sPy4+v79e/4/AYsBrQBeAA3+yv7W/j8BnAKLBN8DugQy//n+b/rY/NH8iP6AAfgC+wNZAcb+A/3D/Lv80/79/4kDGgOWA+IAj//a/gb+Cf++/74CQQMXAkT/nP3+/Dj7XvxO/YEC9wKgBNoB5gLe/+0AJf6SAZMAXAP3ABQAY/18/Gv7ufv8/FsAuwKIA6kCowFWAIj+PP52/hcBUALTApgCNAD8/hL9sPzg/YH+lwI+A6UEfgCB/xr8Svxg+cD8Uf7BAxkEJwVfBLoCgQE4/0n/kv8FAZIA5/8n/fj80/o/+zb7A/6wAq0DaAWRA/kDsgFj/0D+qv+uAMwBjAAvAHD+SvyV+zL6Kv50/5cDOwMnBB4D2wDj/Wj8r/xo/8EAgwLGAysDogIe/0n+f/2q/vn/jABdAeH/uv7o+zv8cvqt/r7/MgVsBfgGXAX8AxgBZ/5t/d39zv5t/pb+Sf2x/ev6y/sM/MT/6QJOBfoFAgYDBCECV/5H/ZX9cP8uAO0AFAAvADz9xPxj+wL+JP8HAw0DUAUXAsIBVP24/H/7hv1SAAoCfQQLBHkEcwFQ/3n9RP4d/qD/oP4vAF3+y/2J/JD8Z/9jAPMDfATFBWIE7AEWAGL9kv2o/UD/Fv+nAOT+kf+a+9D8bfzB/rwBBwM3BkwENgQaAb/+9/wI/Uv/ygAVAcMBKAFgABL9/ftv/EH+/f8GAfIC5QGRASP+L/6K/IL/VwG6AxoFegQHBdgAFv6a+jj8ePxz/sv9qwALAAwAO/3f/cf/dQEHA7wDTwUkBU0CXf/Q/JT8Cf2V/aj+9gDuAFQBKv2+/cT88/52/xAC1QShBc4DIwCu/m/8Zf25/On/rAEEAyEDdAHR//v9CPx7/Rr9cQB3AGkCigFZAHz/5f41ACoBXAKmA50DHgL0/jn8f/rF+8X7Pf/o/+cDJANkAkEAZv78/xL+0QAZAAYEyAJ6AaL+OP24/Ir8wf1cAP0CngPSAn//JP7c++z8lv72AAwC7wJqAZwAbP4D/tP98v0fAVsCZwXTA7MD7/+d/bf6oPpr+zv+1wC+A2AE5gITAef+B/+a/o0AFgLiAjQB6P49/Cb7dvoj/Jj/sQJCBZUE0wOhAIj/if4z/+AA7gHdAxYCLgHK/Ej8tvou/C/9HAA0A/ADEQS5AUsAGf8k/U/+X/37/7kA2wFqAZgAfQBPAAn/s/++AEIC2AEnAD7/+/03/K778/v1/mQBhQPEBakD0AOl/7H/0PwZ/sj+7ACoAIr/jf72/Mf87/vz//YB0AWNBccEowL0/3r9j/w+/dn/WQEaAvkAo/5X/eT6Y/yg/LYBvwPVBaAEoQKPAGr92PvY+5v9s/+KAZ4BawLJAPIAFP/w/qj+Q/8xAAcAQ/8t/0P/zv/z/j7/VAEDA/QDQQKFAlQB0/87/az7hv1H/lMAU/9CAagAy/94/Z/8GP9GAacDfgTMBGcEFQG0/bj64Ptq/cf/wABrAs8Bjv/B/Df8sv0t/wQCOgM0BRwD6wAJ/uT8Gv26/qYAxgP6AuEDAAA2/2z8O/wX/Vv+bwDEAFoBMwDpAP//UwHqAH8D3gNQA+MB2v/g/jP8L/uU+yT9uf74/2cATwJhAJUA//2C/tz+rwDYAhsESQWIBJQCuP4P/B76Bfy5/BoAdAFzA3UCGgDa/Rn8+/xI/qQASAMSBBEE6wGe/7H+S/6oAA4BUwJ5ATkAe/1k+jL6JfuV/mIAVgP8A7ADrgEfAGz/i//uAE8CHQMeAvj/Lv4D/LH6o/ox/a7/VwFNAr4C1gKgALz/RP4UAMf/gAGUAbkCVgJDAdr+2/3e/Ab+z/2k/w8BzgKeAnwAf/52/L38MvzY/r0A0AS3BK0EDALQAL3/cv77/73/XgHj/yr+cfvg+bX6Av2r/1UDOwXzBnEEHAEG/+X9n/+D/0wCRAOWAzkAQ/2f+kr78PoO/hAAOANHBOcCvQFu/0X/+v58/2IAVAFhASwBfP8//7X+Nv/L/sP/ZwAGAbAA8P+X/wL+5/2G/UH/6P/FAdUDYgSnAzoBeQAz//39mf2o/rUAgAA//6T9vPyR/DX8nv5GAZ8FHAZpBbEB3/82/WX8W/zf/woD+gM2Ap//u/05+zb6pPtr/8wC8ARbBE8DYACO/nX82v1X/k0BRwGUApgBLwCl/z/+1v+C/8sAbADp/yL/5P12/Qb+ef8MAdkBpgKKAzoCigH1/lf/Hv6O/ln+yv/KAIYBcABTALv+Wv5U/e79RwDcAUcEpAPvAiUALP54/BX8R/2/AIkC3wONAZkARf56/L/7Y/0+AZgD/wN0AjABrv4k/fb7/v0rATQDWQR5AjkBm/79/Av8BP2T/1MBxgHIANb/If9w/uP+3f+IApADMwT3AYAAG/4j/Y/83vzI/v7/GwIoAgMCcgALAKP+Jv6f/XH/AQETApAB8wGoAIf/jvzD/ET9ff/5AGwCmgNQAuIACv4l/fL8w/7qAEACzgIyAokAQ/7f/HX9MACzAdUD7gLtAa3+DvyM+oP7NP6YARsE/wQUBCMCAwBi/fj95v6/AaUBLwEAANH+iPxE+4/78f7WACsDXQMIBNsCKgES/3D+9/6J/wkA2f/1AGIA7f8W/gP+r/4A/yMAlQAKA8wCYQL+AEz/ZP5v/JX95P7BALABOAIXAnsAyP41/lj/mAC7AeEBowHY/xH9V/vq+u/9VAAKBA0FBAaeA4EAAf0T/AL9vv55AOwBWwIzAcT9Bvw9+5r96f/mAWsEfwQgBPkA6f4d/jT+Hv9QABgBjQEDAC//8v3S/Vj+TP/XABwB9QGNASUBtf9j/lb+RP5O/97/cQEkAh0D9gGOASP/qP6T/SL+Vv4+/y8AXgAw/979c/3K/iAAKwK+A2EFdwQVAr7+qvyo/Mz8T/9MANICegGy/8X8Rfvv/Gj+mwG2A6oFFQZtAgj/Lvz+/EX9uf5EAIoCBQIJAGr9F/2d/bH+JgB4AVkDlQJJATX/5v2L/qD+WwDrAO8CVQOMAn0A/v5u/s39SP2k/en+LAC/AOwAvgAFACAAjv8CAAAAwwHAAtwCjgH4ALv/ev3R+8/8s/6uAfgBFQJ7AF7+jfz2+1v+KQFKA1kE/wKGANf9h/yI/Z3/7gFcBLIETwS2AMz9svtP+yD9Pv7eAPkBIwKDAFL+lf3f/b3/uwFuBM4EOQTeAIH+Bv1L+yL8K/wIAM0A5AEDAZ8BNwHL/yD+D/7z/80BOAI6AhQCdgH5/hn98vsZ/UH+2/+LAfcC0AMcAhoAo/2P/YL9Vv90ANQBQwJMAT8AeP5m/tX+BAE2A88DIwIdAFf9Lfvz+c36DP93AQkE6QL8AqYAuf+J/gEAwgHSA8cDGAHW/uL7S/s/+yL94wDNA3cFXgMZAbr+WP3W/Mz9AAD1AW4CRgFeANb+zf61/ioAZQEhAnwCpgFPALD/Pf5E/oP9Cv6l/in/c/8kACYBzQGCAYwAKAFIAKkA8f9LANMACf83//z87f1o/bn/7gC0AjQD5AI3Aef+oP0t/uj/kgGUAuYCIAKN/+78MvsA/N3+yQFAA40DAgLcANb8X/xi+ysAjAE+A2YCqQEhADT9G/wF/QIBiwK2BIgC6wJI/5n90PpU+0X9MP+yAbQADgOOAHACFP/kAGoA6gEyAlAAtwBF/gP//PyU/Vr9Jf9HAFYBbwIHAzcDeQFv/9L9xvyV/fH9ygDsAWQDlQHw/9L9Bv08/Zf+swHnAigEmAHa/+j8xvuU/KT+bgIOBHYEOwJKAAT9H/xU/MH/QAL9A4kD9AFz/578x/sw/Pb/eQEeBOoCtQJwAOP9Nf01/SIAFgHqAcUB8AE5AMH+Sv3K/vH/X/9sAAv/0wEd/1sAaf4tAJP/qP+9/yMAzgE6AVQCq//8AFr+SP+q/Zz/oQB0Av8B3AC//0b90/1V/D4AiQBLBD4DPwNSAOv9lf0R/fz/x/9aA3sBkgEc/cP8mfyw/ocBPwObBRQEpAEu/RH7WfqP+zH/cAHsA+MD7AJjANb9Bf48/qsAvwBuAboBgQA6/yr9C/4q/6sAeAErAc8BBgGJAO/+QP9L/5n/jf/e/hMAMgBOANf/4//KAGn/u/8O/78BDAKoAUMBAAAc/zj88Pus/PT/CgLmAnMDLAJEAZD9wf18/UkB9gEtA/wBHACI/X36Ifvh+6QALALUBbcDcAP5/lr+p/yu/bD/mwEXBLoBewBD/bP9wP2f/+n/LwJCArQBt/7U/dP+9f5aAMn+JgKSAIUBhf1M/8j+VgDvAN0ADARAApYDTf8AAKP9DP1m/CH7Cf7p/XEBKwK2BJ0ESAJ0AcH9u/7r/Kn/hAG0AnACuP/L/u37xPug/ED/OAOZA3UEkgECAJH9S/xm/mr/PAPjAsECXgDS/Y79cPzf/kAA5wK/AiABPP8X/fL8z/x8/ykBygKeA/IBSAHN/iv/CP83AJoBzgFCAm7/gP7g+6L9HPxO/pH+kQFoAlgCJgJFAogCzgDy/7n+/P8H/0QAsf/EATQBAwDJ/c/86fzL/Sj/PADVAm4CoQJH/xv/ff6/AIcBmALeAhMC7P+l/MD8mvtxAGgAKwT6ASYBsf5L+8b7K/viAOACigbeBdUDyAEX/Sz9SvsV/7H/xAGyAREAmP/G/NL9lP2s/28BHALeAmABkABXAKn/kgA7/+UA/f9cAPz+8f7g/+r+/P/T/fz/of4s/wr/fv+kAVgA2ABB/+kA8ABcAf0BjQJxA8MAc/5c/B78w/0X/fUANAGNAzwAuv3O/Ij8TP8oAIAFsAaRB88CpP/Z+276Zvpl/DkA5AJVA0cCRP/w/cP8Qf2W//UAIAMdAogBwv/0/kP+SP/rAAsCNgKbAJMAcf4t/v/8bf/g/9UAqv8eAMX/Kv/g/w//3wHlAGgCYQFmAR0C4QAAAV/+OP4m/Gb8Jvwc/uYAFQIABLQBvwFk/7H/df/8/1gBXgL9AokBxf0I/Fb65vv4/XEBJgULBNcC9P3Y/e77Hf+LAB8DkQSgAXkB1fwY/zr+agFgAoQC3wG5/rX+OvwC/Yz9D/80AaEAfgFAADsAQ/8c/vD/s//jAjUBpAOCAsMC1wBu/hb+MPwi/SL8a/6OACICQAO7AdgBpgCS/5L+Nv5nAOsAvQE2ABcAMf90/S79Sf32/0ABZQLgAZ4BgQBI/6T+UP6NAJABwgJdAWIAV/6W/XX8kv06AMcCgwR8AhgA9vyZ+yH7cfzYAJADEQaEA5cBH/4j/dv87v4bAukD2gTGARb/Sfxs+x38X/7AAPUCNgIyAjUAzgCx/34AxABPALD/JP0Z/xD+LgF7/xoCpABe/3L+efybAND/XwO0AQMCGQDA/Xb92v22AZwCTgMwAnT/EP4X+ij8G/7vArkEMgMSA1X+kP3p+fn8fQDgA+EFAgStA37/g/1b+1r8e/8dAGsCUQDrAN/+Df6s/W3+dgD0AHYCBQKAAgUBv/+f/4D+Nv+H/lcAfQDMACoAPP9f/wT+HP7U/jcAggFcAUIBcQByAH7/4v8aAFwBqwFIATIBVQADAO7+f/6P/br91P2z/+b/egFBAZUBwv9c/m3+BgAiAr8DAwRdA/cAzvxn+uP4QfwD/p4ChgLdAxwB0v7S/R79GwJjAnEGzAJjAh3+dPt6+7n7UwEMAkYExQHA/139lPv+/GP+NgLMAuYCswEc/+b/Tv7iAJwAtwH2AUgAfAB9/soASAAaAAT/3/xw/YT7Tf4f/48D3gNIA6IBiP7N/0X+lQFFAlEE/gMdAHf9iPmw+lD7Y/5cAR4DUwRyATUAUP4y/1IAkQFcA7ECnwKk/8f9sPxP/KX+9f4rAZoAcQHE/wL/gv3s/az/ywD4ATQCrQJaAgQAjv4H/s7+OQCyABwCCQJnAav+4vzu+w79g/2w/+8AcAIrAqoAHgGpACMC0gB4AusAJwGd/mv++v7f/cz+uvwc/7P9Tv+R/4gB4ANpAs4Bd/6t/ij+Af88AXMDdQVzApn/EvwX+xv8Df3EAVUDdAQUAab9pfy9+9X+SgDiBHUFBwTdAJn8a/31+1AAiQDyA5oCAgCc/YP62/zE/NIAGgJYAzcDdACuANH+xQD5AB0CbQGc/4z//v3U/ov+Rf/8/73+i/9m/a3/qf8PArsCBgH0ACn+A/8R/lcARgJDBPoDZQEN/2v8ffsP/In91wAdAiUDBQEz/139Zf2Q/v3/pwLgAwsF1wLdAAT+xf0P/ZT9sP4YAKYBRQCK/779u/4N/ur/SAGbA5cE4gKfAXr+4/06/F798/45AZoCiAFuAIf+cP4E/iT/pwCwAf4BDwCB/0n+kv7O/1gAiwKTAbwBqwBU/8v/v/69AMf+YP+I/Xr+R/8G/+YB/ABOA+//QP9j/nv/ZAJkAusE8QKUAQD9xvlR+vX7VwCYAfcDwAJhAPz9ufuV/oYAUwSfBTkELQLv/O/7efkq/fb+7gIWBPMCGAHt/eX9gP1f/3wAGALwAt0APgA7/h//MP9W/0AA5/8hAdj/wABsAIcBEAG8/wz/tv1M/uT9pf/jAMwBdAGZABkA1/9MABQBWgI0Av8Akf4l/dr7DvwX/Vb/ugF6AlQCAgGyAJL/Sv+H/00B0QItAv4Avv9+/hr99/t//Zn/+QHGAl0CLgJH/w3+6vv1/L3/4AEzBBUDSQPl/2H+Qvux/EL/FwEvA8MBUQIL/7j9fvxM/S8AhwCbAg4BDwH2/4H/BABfABkCjgH/ADH/Dv6u/q/9zf/N/qIAsv9a/6r/rv+SAhQC7wJ6AK7/Rv7m/Yf/wACRA88CqAFI/mD7Tfto++v/lwGwBN8DrgH1/vL7qfxZ/kkCMwRKBcADzgAC/sr65vum/RUBFwLaAUkBbP/Q/Vv8xv1XAPwB2wJyAgUCSwHc/37/pv81AOH/h//Y/hT/0f7G/h//zv8KADUAYQDsAK8BawFFAQ8Ae/9a/mn+Pf/+/x8CAwKyAqAAN/+a/Q79of3l/U0A2ACXAhkBgwCl/9b+Wv8Q/4UBxgKsA3MCcwBU/y/9kfzP+9P9EwAgAX0BBQADAG/+Gf/R/2sC0gQqBDME4f+I/hn7mvsA/Uf/LALpARYCOf/o/cD8NP2XAKQBDQR/ArUC//9L/rf9Mf7+AKAARgGxAIAAZwDm/t3/of9+AK3+EP6e/V7+TgBgAb4CVAJLAZP/+f10/vn/kAKJA1wDdwFe/vn7xfoO/A7+6gD5AfwBCACF/tH+p/92AtkDcgX3A+MA+Pys+uX6i/xs/94B2wO8AqkAB/79/LP9pf71ABAC5QOyAi8BLf+t/ov+iP4J/8b/OwEAAdYAMwCf/7f/bf4d/t39EP8wAGQAJQHBANQBhwBpAFEApQBIAvsAoQGQ/x4AjP6U/ZD9kv3q/x//GgArAA8BCAH1/3QAFACoAfYAyAHIAdEA7/9G/YX9tfy7/isANgJKA5IBAAAm/Yz82vwA/6YCswSTBbcCZAAl/Rj8SfxM/rAB9gIBA6cAlf5r/cP8g/6+/4YCXwJ7ATr/Kv72/mn/vgGYAtIDuwGz/9f9FP2y/dr96v/p/6sAl/8AAJn/XAEZAUoBDQAw/1z+sP4SADkCRAOTA38BQf/0+7L7QvyU/4QB3gPXAkcBtv34+8T7R/7yACYELATMBOEBsf8X/Qr91P6n/8IAEQCEAP3+2f3T/Yr+DgEQAfQCoAFfAkcApP8r/8X+/v9j/4kAMAAcAG7/F/7R/k3+5P8HAC4C2QIcAiABFv/Z/jD9j/33/voAlAIIAhQCNQGjAKb/mf6w/iH+8v5b/u3/EgAWAboAmP+N/8z+qv8MAAcBJwPtAjQDJwCC/+f8ef0R/Q//swCXATYBOv+u/Wb9i/7nAM8CawVPBM4CMv4x/Ar7Pf0h/08CiwKwAtP/wP0S/PT9LADSAi4EIwSTAlr/8PzQ/Lr9yf+CAJkBvgAcAAX/bP9f/8QARgD0AGD+vP7f/bP/SABcAdgBJAF1ALv+TP8dAEAC5gJ1AcgAw/0w/ab6If38/lcCeAKFAVUAj/5R/vX+7gC7A2sEegSHAQH/Evvp+kr7Yv5TAfwCwwJTATz/E/4i/U7/nQDYAlYCxgJvAeH/DP8s/h7/U/+tAAMB5gBwAd3/JgBs/ZP+P/7A/zkAuwB+ATkA3f+X/pb/YgBvAWwCIgL5Afv/6P5t/VP9d/00/nr/cAA5AQkBJwH8ABUBAwBUALv/ggAyAFYBUgEZAWj/Rv4M/TL8Rv0Y/0gCQQNBA+cAFP8g/QD9g/6RASsFLwXGA+r/tP3S+i377fztAD8DUANpAdj+R/2Y+5T9H/+4Am0D0AKAAT3/av8t/zQBmwGVAh0BN/94/Sr8AP36/VsASgGQAVMB9wBhAbEAPgEAAYcAQf/c/bv9Qf+9AMgCWAJiAqb/Qv7F+0/8Ev4yABwCawFmAZX/zf5x/mv/KAK+AjAEhQGWAJ39R/3f/A3+4f9UAeUBVAAI/yD+gP0+/r3+6wHzAikEwQK+AiABGAAD/jf+av6E//v+YP/Z/vj+kP5f/rP/FAHZApQCYwLbAHz/Kv4v/eb+xP9YAh0CSgJIAJn/x/2v/ef9Uf9HAGMAVwDS/x4Auf+lAK4AtQBDAOn/SwDv/3UBlgHRAn4A6v80/ub9zv2r/jEAVQDR//D9h/3Q/en/6wIABRMHPAVxAhr9fvpb+XD7FP6bAQkD6ALd/+/94vyX/fX/zQF5BLcDFAL4/tH96f0U/woBswEsA/YAnv/n/Cf97/2V/rD/TQCiAX0ATABJAGsBfgF7AKn/A/+R/4L/zQDgARkDgQIaAEr+mPyk/Jv8sf7i/40BvACDAG3/3/8zAB0C9gJwA4sCfAB9/mP8h/xl/Y7/kACNAd8BwQALAOD9X/5N/loAsQB7AsMCHAOuAeL/pf4C/hr+x/7f/5QAuwBx/zr+jv3u/dr//QD7An8C0ALL/5L+3Pwa/rz/qgFQAzcDYwL9/2H+Af2z/NL9p/69/y3/FQAJAKIBIgEHA/kBVwKW/1b/I/51//H/5AAPATgAXf8W/hv+M//JANcBJQEGABr9bf3W/D4ApQHuBM0ExwMNACz9sPtf/HH+zgA6AosCJwAi/s77B/1V/gYCOgOCBPICHgES/nb9xf15ALUBdwIVAp8AqP5u/EP8O/3J/sn/cwAOAhoCmAJNAeUBvQAWAP793f2L/rH/1AA6AZgBCAGR/9T9l/1H/qP/jAAfAVYBgADP/yT//f+HAA4CKwJ0AiUBeP9V/kD9If4//vr/hQB/AcIA3P/e/g/+V/5R/kUAkAHCA0QD8AItAYz/3/1d/Vf+Rf9/APr/EgC5/aD9bv1LAPMBIwQ4BN4D6wGJ/jL8kPuj/Yv//wBMAhoCoQFH/vL9k/0sAB0A4QAqAHoASP+j/2cABwLLAuQBEgDi/ln++/4+/8MA3AAzAXL+2P2l/On+bf+nAQ0BwQHy/7X+x/1W/wcCcwQeBbEEUQIt/x77evr5+uT+nwDoAnwBmAD//W79pP1JAMACZQT/AlIB+/4u/rT9yf6EANABLwE/AFj+O/5h/cD+lP5fACcAlQEyAcUBbAFKAV8Ah/8x/w3/4/9sANMAogASAMz/lf6D/uD9bv83/2kAAQDYAFQAuABGABcBbwFlAswCRgJJAar/Ev5f/O/7yvww/tv/jwAlAr8B1wHm/+n/qf4t/9L/EAGjAlcCIAL6/9X+QP3O/dX+wwCfAcsAdP9X/Z380fx5/30CAQWQBLECAACq/Sf9Wf2WADYC8wPFAT8A5P3D/Er88Pzv/ogAVgEXAdQANwHrAFgBzACeAYIA0f+K/gX/Rf8sAAIAjQB8/37+8/y1/XX/uQEEAx0DwQG1/3r9Tv2X/qoBiQOnBJUC1AAP/XX8BfzJ/lAAiAEbAan/QP4O/RL+8v/cAVgD/QKxApUAnP9y/lz/1/9SAWMBfwHb/93+tPwj/Ij7Vv1H/3oB1AJ5A6QDwQKxAUMASv8e/5n+Of+j/hAAtP+cABX/Tf+L/nD/zf97ANEADAHKALf/b/+u/98ANQHVABEBbABMAL3+Rf/e/tf/vf4W/+X+BACZAGQAAAAr/xT/yv7H/9YBGgQQBToD7QA+/sr85fs6/Tn/aAF9Adn/7v0E/V/9o/6dAGEDVQWxBEoCov8U/mz94v1U//IAEwIAAYz/fP2W/Tn+5//QAIMBmwHF/9n+Jf4LAGEBPQJlAnUB2P8Q/hP+nP4bAGkA1AD6/xL/0P5Z/6wAKwHtAEr/8P2L/UX+//+hAswElgVDA2QAd/3T+1n7SPzv/rUATwJeAaMAMP+t/gD/8f/eAYUC9wI7AUMAhv5i/mX+dP9GAGkAWgBp/zD/Qv7e/nX/XADaAOIAeAEVATkBFwBSAIT/CQDx/6wADgEIAQQAvP75/e39ff5e/44AaAEXAdb/rf7//p7/BQGbAaYCLAJZAdL/CP9r/pD+Hv5B/kj+Bv/m/wQB6AE7ArMBjAD7/mv+Hf7O/5wARwLwAa8Br/9B/mf9mf1W/58A5QExAYv/+f3g/OL9jf8DA6EETAV2Akj/Sfx2+5r8cv8dAiQE0gKjAMP97Pzk/D3+6f80AZMBCAEaAEwA3wAwAkUC8gF2AML/Af4m/qf9Vf94/wMAcv9z/5D/4//MAEQBwQFWAV4AIP8h/ub+nP+IAZEBQwLXAJb/bf0l/cT9+P+IASQCvQEvALv+ov36/dn/wgH2AqgCxAEXADz/Uf7J/mr/nADxAAgBHAC9/7L+kP2M/F39d/96AUYDWgS4BAoDNAAX/gj94P2F/nz/5v/9/6H/YP6f/iv/BQECARIBsQCTAMT/9f6a/6QAgAFsAU8BAwEPAN3+bf5D/gn/I/97/8P/8P9GACkAPwFaAZ0Bvv/9/mv+Bv/p/+QBKANVAygBp/7l/GT8Af6M/5IBhAGXAFv+O/wu/df+AwMxBM8FyAO3Af79ZPx1/Pb9DgD7AG8BMQAq/zL+B/4A/wAAGALtASkCigB8AGv/9v/W//0A9QCjAHD/af5U/sz+Wf8AADgAQQCh/2T/of+HAAgBGQEQAF//dP5j/8f/DALMAo4DZwFe/zz9nfwR/a/9jv+JAPwAgQCb/zAA9v8YAfEA5wGzAXEBmwB7//7+dP5y/jT/x/82ASsBNwHb/x7+Xv3z/L3+JwD2AU0D7gJzAvD/Dv8d/gz/gP9NAN8A/wDu/23+jf0A/vX+TwCIAX0BuQHu/2T/N/7G/8EAdwKRAu4BwQAN/7f+oP0p/0v/gf/8/in+iv9s/xoCygHXAv8Bb/8R/z39iwD1/wQD2wEKAaD/tfwX/vH8LgFfAIwCYwCS/9j9Lv1e/gAAqAJeA8sDdgE5AKn8xP1t/aIAyAHRAvUCfP/O/gX79/0X/c0A/AAdAg4CwP+IAA//EAK8AA4CfwAAAJD/s/2+/vb99v9r/pn/BP/SAFMB8wEUAvAATABi/j7+7/1j/3gAJAFRARkBgwCx/47+K/81/6//EgBBAH4Bm/+OAEn+EgD6/iEAFAEnAX0CJADKABH/wf8r/1n/UACAANYAl/+c/lH+pP3N/TL/OACgA40CIASmAMIAff6N/aL/1f54A7b/BAFH/UD9FP46/XUCCwF3BcQA+QDi/cP9E//u/rEBOgE9AksAZf+Y/kv/af8aAEr/gQDK/+//jgD5/5MCwv+MAX/94f6K/cf+4AC8ALMEdQGmAjb+Gf5r/V/9UwDa/9MCkP/n/w39Vv5H/6QB1AMDBIcDy/+A/rL7ZP3A/Z4AgwFWAYUApP7a/s79/v89ADsCjQFQARgArf8K/1f/cf8JAF4ArAADAeb/TwCr/sn/R/5n/9n/ZwDnAV8ArQGk/20Ayv62/lH/Yv9KAcsAhgGjAaMAKAAB/jf+mv4S/3cAmv/DAQIAXQDF/xL/cAHt/uABWv+dASwAm/8oAMT9FgD6/FkA8/8FAkcCywCaAKz94f2a/dD/VgIqA4YDvQEd/wj+I/y3/mX/rQF3ApUAzgD4/ET/T/18AOAAfgFBAsD+SQA4/cD/Fv91AdoCxwFtAv7+AAAf/W3+/v2X/+b/qP+C/1T/cADNAPcBiwHnAQAAXf/q/WP/XQAFAaABtf+S/wr9CP6p/pkBzAJfA6cBiv9Y/aP8l/2Q/2cCxwKVA/sA4f+Z/fz8MP7t/mgBtgBBAjIA+/9g/p791f7x/vAA1QCFAYUBxgCtAJf/YQCSAEAARwDY/p//Vf4W/vz+dP4EAVb/BQKmACICdgHe/5kAJf5iANb+RwDlALoARQGs/lv/Ov48/4v/n/8gAZAAmwAQAFv/AAFq/1kA0f6P/34Azv8VAhUAIQJF/9v+wf7//YkB/f/gAvD/EgAF/or81v3F/SICJgL8A8kC0gExAKr+lf4t/08AywBeAEH/Ev7F/L/9Qf7IAY0C0AN2AngADP8d/Xn+3/6hAX4BtgFGABr/vP53/pP/BwC3AJ//ef/c/jcAewBqATYB1AD3/7r95v7W/tUBpQE/AvsBEACL/1H9rv7P/jQAewAQAP3/7P6e/uv+iP/zAXICMAP8AXcAqv9Q/W/+7f3/AAcBBAHOAF7+Mf8A/Rj/r/8BARoCqQCIAXr/LQA6/0v/UACj//EAhgAAARoBFf82/0f9wP6t/sf/IgJfAdgCrv/y/8b+Vf70/wv/AwL2/5wB5/9mAMEAmP/zAN7+u/8+/lH+2v4v/8EAlAA4ATUBmwAEAQAAZQA6AHT/5f8Q/n3/8/6jANkAKAHGAen/iP8e/eX9aP71/xECrAJYAzkBr/+C/Yz9cP7sAFUCPQMIAh0A6P1V/IT9T/5EAQcCNAMGAaP+w/14/fL/oQCdAvIBUwEq/+v9wv48/7D/9P93/8b/+P5s/1YASQFdAgEBawE2ABQATAB2/zwBO/8RAGb+of6h/sn+GAGBABACJQHVAJH/dP1s/nH+igBHAT8CvQI0AEb/q/2l/vH/6f8nApIAfgHm/kD+tv4Q/poAKf+lAR8AuAA/ABH/DwCV/qkAkABZAQICZAGpAZz+Lf1D/LT86P7Z/yYDngNXA5YB8P7y/lD92v7x/p8AWQFzACUBMf9LAOD+Kv/M/7//xACF/9kAeADtAAAArP/M/2H/u/7V/r3/5wBWAQUBLgHc/6r/XP5u/xMAIQEhAVb/Hv9d/W7+CP9EAS4DdwN0AuL/W/5+/Wb+7f90AQgClwEx/6X9f/yh/VD/yAAEA6cCTwNXALH/Ov6a/pD/E//1ADYAFgEFAH3/RQCi/4sALf9m/x7/kf5o/7L/nQExApIBgQFD/97/3/0Z/9X/UQBVAaD/8wBe/0MAKgAjADIBtv4e/3v9vv6T/1MAwAIcAhMDvQCk/97+m/3m/hH+yP9AAIAAXAGp/3MAv/5N/xT/WP+vASMB3wK3AHsAU/+T/kD/7f7nAGUAzACj/+j+3/6N/n3/LQD3AI4B4ABmAGf/7/52/1X/PwFdAVUCCwGu/x7/iv2u/qj+pADtANkAjgBL/0T/ov7e/1oA0gB4AKEAsgALAbIA5QApAOv+2P2E/D3+Ff8VAsACgwOLAnv/Uf4L/PX9rf72AIACeAIvAgAAhv+p/hX/IgByAA4B0v/E/jX+eP1w/7//HgJeAsgB0AAd/tj+4f3+/zUBQwKKA7YAkQD4/Wb+1P3W/Wj/4f5xAHT/qQBKASABAQJIAL8Ahf+C/zYAvf91Afv/XwDx/nP+Av8V/lUArf8pAYcATgCyAEL/QAAi/2UAPwBjAPsAEgCmALr/nf/J/73/2wBYACkAvP/f/ij/C/5i/8T/EwHAAe4AigHO/1cA0f5u//3/8QAdAuYAGwHn/un99fsq/PL9ZQBTAkgDSANFApcAD/9q/4L/rACX/7P/8f5i/s7+rP4YAQ0B3AE5AG//tv54/nf/nP8oAYYBVgHMAPL/MQAXACYASgDm//3/Lv8Q/7v/8P89ARYASQB9/rb9tf3P/YcABQGmAwgDrgLPADL+OP5i/ToA4gA0Ag8CMwBg/8/8Zv04/gIADQKKATUCzABPAI//1f5hAJv/bwA0/2//u/8t/zoAUf/cANL/+P+2/xL/8P8r//D/3v9gAEsBAQF7AZMABACO/3/+KP9//v3/SADIAIsBSwAQAbX+0f6G/S/+fP8AAJECkQKVAwkCxQBO/xb+6f2r/az+mv+pAA8BWgG+AFkA3/7c/q7+0//AADwBDwJnAC0APv4H/x//OgCCAeUA/QC8/l3+8f3U/n8AbwFQAnwBQwDF/ib+yf5KACgBZQKcAZIBXP+i/iP+DP68/4D/VQFhAAABKgBB/9//3/7BAKT/YgDZ//T/swBpAIMBeQDT/4f+PP2y/Vj+3ACCAtsCzQJgAGz/b/38/Vb/NQDpAZkAEwEY/0D/pv8JAKABIgGTAaj/aP7W/bH9WP8YAMEBYALTAQgBrv4v/nH9Wf76//oAQAOHArQCbQDp/gT+3vxC/sP9zv8sAGMBuQFHAc4BywCXAFn/Wv99/6H/oP/S/8v/9P8c/3//ov8jALsACwD4APD/2gAGAF0AtQD0/2AAuP6U/xX/4f/K/8b/MgDZ/2wAHQDUAGkAzv+0/hz+IP5A/3QAVAL8Aj4C8gB9/l/+Mf0e/2YAbQJTA0UBgABL/Vv9C/z3/QYADQKAAzEC1QEGAK7/Ef9Z/zkAaAD2/wP/Gv64/iz/pgB8AZ8BvQGt/0b/uP0R//r/9gCzAdYAJQGG/4T/Af+H/y8AfP9o/5/+av8+AN8A5gGmAU4Bn//q/eD91P3Y/7sAOQKiAooBxABp/o/+A/5S/18A6QB1AQkAdf/z/Rz+8/5jANYBQAIRAi4Buf8F/6v+Yf8zAAsAvQBw/8//f/7v/lX/iv8FAVAAzAGFANwAtv8Z/yn/nf5ZAIcAHgKzAUAB9P/D/kP+LP7d/vX/wADBANMAKQDoAKn/FAAn/6v/rv9//wcBtgBuAtgAEgEM/zf+6v1t/SP/Mf92AUwBhwGPALL/wP93/xwAmAD7AOoA8//Z/qL+uv48ALsAFAKNAUwAc/6M/FD95/3wADwCkwPpAqYAJP85/UX+Gf8WAfsB3AEJAUH/Zf4d/rL+nf9LAM8ArwD1/wMAnP9sABIAmwCdAFQAYwCn/7wAYQC4APH/dP8O/zn+Sf7O/joAigHEAaYB9ADK/zL/Q/7W/yQAVQGvAO//YP8D/ib/Df9vAY4B6gEUASP/xP5G/bL+A/+4AFgBkQFsAUQAmv/e/gX/mf83AOEAngE7ARMBDv/J/sL9bP5Q/57/dQF5AKUBvP88APn/WgBoAWgASQF0/7X/Lv4r/sr+ef+lAFcA0QCZAGwAzP+B/8j/QgAaAFcA9f9YAAAA7/9XAAYA+QCt//D//v5m/wsAIABIAV8AoQDp/ob+dP6A/0wB3gFCArwAmf/y/b79kP6RAEQC5QLVAQ0APv4U/UX9NP5xAIEBHgIvAV0Awf9K/8D/aQBUASUBQgAx/1X+5v2P/of/XQG0AQ8CAgEIACP/Nv5X/1P/8wBqAMcAVACf/x0Ab/9rAKP/6/9T/1j/BwCVAI8BagHnAMn/Z/7k/Qb++f7OAFYBTgLlALkAlP/d/j7/vP4KARAASgH6/wYArP+B/mr/wv4IAcwAiwHyACYA6f9i/t7+C/+eAD4BDAHOAPj/cv8G/wP/LwCdACMBtwDr/6b/ZP4O/8X+UwDnAIQB1gFaACEAE/6q/kT+mv+vAC8B5AFkAHUAHf+l/3L/1P8SAML/1P9o/wAAfwBTAUYBvQCU/9z+Xv7V/q7/ygBTAeUABQAv/0L/iv+fAB0BmQGmAKT/Jf7S/V/+x/9wASYCmAIaAQAA5/2b/TX+l/9zAcYBMgKNAHL/C/78/Sr/UgDGAbcBPAEQAPv+8P77/uX/sAC9AMkARP99/wP/4v8wACMAGAH4/7gAQv8cAAAA9v8JAKz+qP+1/gAAtf+jAF8B2gAXAcH/LQCK/53/vv+b/ykAvv+S/1r/5v7I/+v/CgF+AYcBqAHW/3X/sf1//tD+t/9GASQBYAJPACMAqf6t/iv/E//zAM4AJALNAEcAQf+N/sn+u/4oAKwAMAGPALL/RP8Y/9D/ywB9Ad8BygDC/0T+1f1b/k//5gALAWEBZQATAHn/n/8qAG8A0QAAAOP/D/9w/4b/FgBvAD0AXQCO/67/Xv8JAIcAygC5AM7/Xv/C/hr/n/9uAKEBkgH2AFj/Wf5o/o7+RgAvAcMC4gEjAGf+0vwB/l/+6QC9AaECBQIAAJf/Zv4oAB8ALwELAVYA7v8u/of+e/7U/5QApwBNAccAtADE/yr/c/8U/9f/mf9PAMQAnwAdAbD/VgBN/6H/fP8N/0YAov8jAR4A0gByAMD/AQDa/kYAtP+wADwACAAZAGj/EACs/30AtACuAHYAa/9u//v++f5B/1r/ngDMAIABRAG4AEcAxv7O/lL+7P+vAGwBUAEFAH//5f10/s3+xgDVAdsBFgE9/4D+uf3J/g4AvAGjAkcCaAFp/3n+3P2B/mT/IwAWAdcAfgBr/wb/Qv9n/zcAIgC+AFQAMAA6AEEARQHZABUBq/83/5H+af6E/6//KAFiAEMAN//6/vn/WwDdAVMBHQGr/yn+0v0A/j0AjAGEAk0C3wDf/9T91f01/qv/KgHnAJMB3v/C/37+j/7C/zQAHQI0AbgBEwBK/6T++P19/3X/KAG5ANgAOQAc/3P/0/7f/+T/mwA9AekASwFzAIYA4/8X/0H/7v4EAND/NgBUAMr/IgAo/0IAAADRAMMAFAAnAPX+2v89/xIAOgB8AAQBOgDNACUAegC2//j+hP4s/jH/rP/xAFYBZwGkAEb/s/6b/uf/5gCvARECaQGRALn+Dv4O/jP/OQCDAOkALgDG/3z+rP6a/yEBlAIqAvEB/P/h/mX9bf3n/kEA3QFUAQQB7f9B/wv/F/9jAJsA1AD+/0f/pf95/5QAVQDhAKAAy//T/wH/bQA7AM4ASwBZ/13/M/5z/37/9gCEASgBGQE4/3//m/6a/zEA1AAOAuwAwAC//n3+YP6o/vf/OQA5AbAA8/94/+/+KQBfAH4BjgHxAHYAl/7G/vj9RP/l/6UAiwGvAEEBlv+h/43+mf5g/3z/EgHPAM8B6gAeAEP/Xv5R/1H/kACsAMsAoQCC/5P/Ev/j/zgAaQCoAOL/BQB9/+X/fwCQAIUAtv/L/13/5f8UAPT/8f9N/03/0P5K/7z/uQCLAawBIAHt/57/t/7L/lD/uQDWAakBOwEAAHf/SP53/r7/xAC+AZYAwP8e/qD9Uv5a/74BWAIaA34BvP+Y/nX91v7u/poAsQC7AJYAWv/6/zD/UgA/AFEAlQDP/4EAvP82ACoAHABdAEf/gv8D/4L/DAD3/8wA7/8xAHH/Sv8RAEkA2QHzAC0B2P/4/oX+3f2//yAA+AGDAe0ABwCg/hD/O/7l/w0AIAHlAP3/PgBI/2MAwP+SAKAAywDZALT/wP8b/0H/R/8i/zoArwDoAHkAgf+s/wP/1f/b/z8BuwGHAb0AZP9R/5/+J/8+/ywApAA5AK7/lv4t/+z+9f+DAHABPwJEAfUAKv/5/nT+iv6Z/6r/RAG2ABUBiQApAI4AXf+0/4r+1f4m/6z/SAFbAVoCAgHT/5b+7/07/9j/gQG4AX0BRgBu/vb9Cv5Z/40AOAFLAWkAlP/X/hL/GwA/ATwCFAJGAcv/bP7A/dP9x/7Y//sA9ADqAKj/YP8T/5j/fgC+AK8BxgDHAGr/W//B/4z/jQC1/6UAy//d/wUArf+CAIP/sf/n/u7+6/81AJYBEgElAXgAKP8c/2z++f9fAOUAGgEjAGcAxv4B/5r+R/8yAPH/1AAvAMoAOQDM/z4ANgBVAdsAAQFGAIn/of6k/Qb+vP5JABQBowGBAeYA+//g/q3+E/8hALUAaAGSAQ8BVADo/ub+y/6q/ykAUgC3AKH/jP+K/h3/9f+FAKIBtQDOAK7/g/+z/6r/0QCFANAA2f8u/2H/CP8nAML//v/K/07/5v9b/8cA/gBLAdIAcP+q/9v+4v8IAAYBmAHCACEATP4+/ij+Xv+EAIMBGAJDAfz/K/6g/QH+qf89AYQC2AIFAm8Alv7h/Q7+Kv8AAEoAjQAjALz/cf+G/5kAsgAOAUwA/v8HAIn/HAC5/6EAagAZACMAYf9EAEL/kf82/zP/6P9z/8QAjgCDAVEBuQBpACz/cf/D/jX/xf8ZAB0BpQDaAAkAg/8e/9X+rP/2/8UAjgAiANL/Tf+P/67/bgD2AGwBQgG1AOj/Nv/E/oT+9/6P/3QA1gC6AEgATP/9/s3+0f/OAJkBLgI1ATsAdP4T/pL+J/+rAKcAWAFfAHn/F/+4/mgAhwDCAUoB/QCTAAL/Pv9p/q3/qv/U/yUA4/+gAB8AewBfADgAGgD//sD+sv5u/64A7AC7ATUBsQB9/6P+I/+R/94A7AD4ABkAEf/A/qv+4f/LAK8BBQG6/1n+Af6E/o//SAFQAssCYQEAAJD+K/6m/uv+RgCCAEsBlQDA/4D/M//8/8T/fAANAQcB5wB+/4f/8P4Z/zb/Nf9VACYAuwBbAFkAhgDH//n/Gv+V/8X/GwDAAIoA+wBPAAEAkP9I/+7/0P9TAAAA9//x/7D/AgDf/1YAKQD8/6v/jf/o/+v/TgAsAIkAeQCEAHUACgDZ/9r+rv79/fP+AABtAXAC4QFsAZH/w/7o/Wr+BAABASYCYAHqALP/pv6j/rX+EgDLAOIAnwBd/1r/g/5I/wYAEAEyAkEB+ABh/wv/6P7r/iwAAwDpAPL/w/92/4L/VAA5AL8AHADO/3b/if9LAMIALgHBAPL/Gf+a/gH/5v+xAEAB5gANAOT+Jf6S/o3/3QCvAb4BVQELABX/jv7A/ub/hwCFATsB2QAIAAT/Bv/X/r//CAA2ADoAbf93/9r+jP8yAOcA3gFTATkB+v+L/zz/xv5//1b/eQB/AKwAlADX//n/t/6h/pP+t/8yAYgBLQJ0ASsBtf+Q/mz+nP6I/3///f9xAM0A4gBoADkACwC0/1j/K/+s/3UAyQCiAEIADAC7/3z/q/9oALAA4wAPAIz/5P6H/hn/Rf+WAK4AHAF/AHX/kf8b/3cAowCXAa8BxQD3/wT+N/5j/t7/BwFVAYMB9/+//p/92P2H/90AWQJWAtsB0gBh/+v+o/50/8//1v/h/5n/DQAOAGUAYwBQAAkAZv8U/1f/AADDAPAA5wCDANH/YP8W/57/UQC6APgAOQCz/9H+kP4D/6P/AAFUAVkBbgAh/8T+Tv6W/20AtwFBAnMB1ADw/qT+O/7s/sn/zv+nAAoAbADq//f/gQBDANEAPQCCAG8ACQAJADr/iv+G/87/WABMAA8BSgDO/wL/p/5n/2D/hQChAAsBuwDz//b/f/84ACUAiQByADwAGQBv/0n/+v5t/7H/IQCIAJIA6wA5AEUAkP+D/3n/Ov/X//v/DAFUAWcB5wDi/+7+7P2q/b7+MwDJATACwgGZAEj/Mf45/hv/qACMAUABrgB6/y7/x/56/3kA3wAMAbX/DP9b/oj+o/9SALUBpgFjAXAALf8h/8/+uP8mAJ4A5wBGABQARv9A/2r/0/9bACUAJwASAEYAXQBeAHUAeADJ/y3/8P6F/3kAwwArAaIAEgD6/iz+qv6O/xQBfAFiAd0AqP/1/iX+n/6d/18ARwHyABIBkgAOAPH/Of/q/6T/KQAIAMj/IwBZ/9v/Tf8WAJ0A5ABpAYcAkgBQ/xP/wP4H/wMATgAAAZ8AUwDj/0j/W/86/wMAiwDqAOoAUQA5AJn/jf+N/7j/OwDP/+n/N/9z/7T/GQDLAL0ACgE/AKz/Qf9T/wEAAwA7AAMA7P/f//H/eQDsAO4AdwBe/67+of5M/28AIgGfAQQB3P+o/uD9mf6Z/xUBFgLxAWMBlP+1/uj9M/6O/3oAqQEkAaIAtP/C/rz+6/5OABgBhAEsAVAA8/+E/3n/ov+t//r/ev8y/yL/wf+2ABgBTwHyAHwAtP8U/zf/tP88ACYAKwDp/zMAFQBpAH4ARAAcAA3/B/+g/nn/MQC0AIIB1AD0AKf/M//Z/tT+AABAADsBLgH4AJMAOf8I/4H+Kv+//wYA+wChANEA3/9c/3//Uf9TADIADAEpAd0AWAAO/w7/s/48/7v/dwAvAcIALAAk//X+EP+8/8gAeAGEAbkAtP8Q//X+Sv/t/3kAcAAUAH7/Iv8r/3n/IgCBAJYAVgA2AEwAjwCZAIEANgDi/3n/Lf9o/9f/nACrAHoAu/8W/8r+lf5a/y4ANAF1AeEAXwCX/2f/g/8AAA4BSwENAdb/t/6H/qL+3f+pAJ0BkAFVADv/xf0e/qL+DgBSAbsBEwLrAE0AXf9g/43/i//j/8P/CADr//D/2P+y/7D/iv+Z/6b/GQCZAPAA/wCfAEEApf9U/zn/Tf/q/wkAngA/ABYA2/9M/5H/Tv9TAKUAxwC+AAsAZgCW/+//yf8NAIoA/v9HAJ3//P8gAOn/NADJ/yMAtf9z/5X/Yv+9/4P/IgDxAGwB3gEkAWMAKv9M/jz+nv7t//wAogFXAQAA6f42/ob+U/8tAGQBrAGNAZYA4P+f/5r/zv/u/ysANgC+/13/Kf+a/xgAOgA1ACAAHgAAAOD/JABiAKkAPADU/1H/S/+O/wQA1QAdAQ0B7//y/oD+tf7E/1IAQwHxAHsAfv/T/h//vv8nAbABpQHNAIT/9P5Y/vT+2f+1ACEBWgD6/zv/+P4c/27/tAADAX4B4QBiAEYAq//T/3H/+v8nACkAAwCA/6T/Vf+Y/7D/AABiAD4AbwAhAGUAAQDC/3f/X/8JAFQACAEPAeEAVAAt/7X+CP7I/oH/mwBnATQBDwEIAJr/Of/n/nj/n/90AKcA+gA5AY4AKwAy//7+Cf8E/9f/DgDjAJkAGwCZ/zr/1P8aALcA8QCyAGgAcP8i/y3/jv9rAKUA3QB0AI//AP9Q/hz/8P8MAZABLQHhAKv/Jf++/k//hQAiAaMB2wAGAA7/fv6q/hj/8/9nAI0AjAB+AKUAigBIABMAl/9h/xP/hf8cAPAAXgHwABkA2v5p/mn+Mv8qAAwBmQH8AF8ANv8S/w7/j/93AM8AMAFNAJH/Ev8Z/+//OgAbAf0AvADg/6/+iv57/pr/YAANAWsB9QC+ANv/uf+T/6//9f/J/woA6P/s/9P/jP+r/4//5v/1/00AuADTANcADQCm/1n/k//8/ywAhgBRADUAXP8V/xb/bf8OAEEA4gDgALIAPgDX/+D/t//U/9D//f9OAFAAQQDU/4f/pP96/9f///94AMwAdQBUAG//Lf/E/vT+9v+zAAMC2wFdATEA5f5h/vj9xv7y/xUBkwG1AOX/9f6+/jX/vv/kADMBJwGLAKv/0v+w/1QATQBUABsAMP/Z/mv+PP8XAK8ANwHiAPMAUQD8/7z/tf/5/+//ZQCNAFsA8v+G/5P/pv+q/yH/Bv8d/37/RwDhAFYBAAFHAIr/2v4C/5v/7wCqAf0BDAHD/wn/eP7u/m//RgDGALwAjAB3/zP/5f41/8P/OQAVAc8A6wB8ADIA4P9l/2b/P//w/xAAAADI/5b/pP95//P/gAAXAYMBLgF0AIn/6/63/tX+3f+9AEgBCwFUAJ3/jf5m/nL+RP9iADABtgELAcoA9v+U/47/r/9CAEsAxwCDAP3/xf89/zX/6v5A/8H/FwCyAMYArwBLAHD/H//F/vD/CwHUAR4CDgETAEn+iv3N/df+8wDEATkCMgHS/4j+Zf05/l3/HgFDAiYCtwEnAGL/h/6K/qj/bgBKAeMAZACl/6r+s/6U/lT/+/+aAAIB2wA4AdcAogAhAKv/ff8m/6D/wv9eAKMAagCy//n+9/4n/9v/kQAqAfcAXQCb/wT/Uf/5/wUBVwFLAXsAOf9E/t39ef6U/+oAwAG9ATIBDADO/gn+Ff4Y/0UAkgFDAgMCYgEiACb/Nf5l/h//6//MAAEB8QAGAC//ef5W/kD/AQACAYkB8AFRARYAMP/Q/kL/3v+NAOoAwABJAED/mP6R/jD/FACYACoBGQGVACIAjP/C/8H/AgD//+//UAApAB0Ayf+Q/3z/O//N/woAwQAeAe0AdAAx/7v+b/4I/18AWgFRAuEB8wBz/wH+5f0k/pD/2wCdAbsBaACR/yf+HP4q/1oA4QHVAe0BpgBP/5H+V/6c/18APAEuAZQA5v+V/lX+a/5P/xcAogBRAV4BOgGsAMD/Pv+8/u3+KP/U//MAaQFTAWcAev+i/jr+qf6E/84AjgGiAdkA/P8l/7L+3/7F/8IAVwFwAa0Apf/L/n/+zf5s/4sAMQFWAbYA5f8p/8/+LP/Q/4gAMQFIAecAEQB9//7+4/4//9r/iQADAe0AMwAs/7f+l/4p/zMAhwFDAgEC8QBc/zr+0v1f/qT/7AAJAtYB9gCv/5n+MP5M/i7/DwD4AHcBOAHBADcA6v+b/2H/qf/T/yUAVgAxAC0Aqf+e/x3/Uf/e/0QA+gDqAPgAOgBe/wj/pf6w/3IAjAGrAe4AGQBj/uT96f1B/+AA1AFSAjEB0v+Y/uX9o/6c/0EB9gHLARMBY//U/lD+6f7C/5AAhwHzAJQAef8C/8n+0P6M/xoAFQGKAW0BDAFcANH/Hv/V/iv/pv88AIcAiABIALL/NP+k/vf+y/+2AGIBYAECARkASf/I/un+y//HAEQBGwF2AID/e/7x/XT+ff+kAGkBxAFyAbEAtP/Y/nD+0P6H/10AEwGxAYQBmACI/4/+W/7E/rX/nQAzAf4AEgAt/7D++f6x/9oAqAHRAQ8BHAAW/5L+j/5W/2AAFgE7AXMAmP/N/lr+m/5Q/9MAaAGtAQYBgADO/07/bP9//wsATQBHACsA+P8WAJz/L/8f/yn/sP8XAOgAqgGTASkBfP/A/hj+nv7A/90ATgLzAT8Bmv8x/uL99/2D/1kAZgFyAa0A5////jT/mv9cACsBDgH2ABwAW//z/t3+xv8iAMQAswAxAMX/7f7y/tr+pP9bAM4AMQEVAf4AbQDZ/3f/Cv9G/2//9/9YAKIAtAARAHT/Dv8V/67/WwAZAUcBDAFZAG//BP82/9b/awDXABcBrgD4/y3/xf7K/hH/m/8ZALwABwHkAGoAz/96/zj/k/8EALkAEAEQAX0Arf8W/7P+9P6U/48A+wD/AGkAof/R/pz+J/8QABcByAHLAeIApf+Z/kb+wv6w/7YARQFFAX0Al//g/vn+Sv/t/18AfwBwAP//CQDt/04AkABqAEIAov++/37/of+e/5H/xf+d/7//+f92AC8B8wCoAMT/Mv/x/u7+6f+hAKIBsAG6AL7/Yf4//j7+UP/HAJEBCALtAP7/8f54/uf+cf/qAIgBngHoANf/Sv+l/v3+fP8dAL0AkACRAAAAxv+A/z3/X/9q/+f/UwChAAcBzwCHAPH/kP+P/4r/AAAfADQA8P+B/4z/iv/8/zsAtwDQAHoAAgCU/4b/j//M/y0AjQDLAHgA9v+A/zz/Gv8q/5P/UQDCABoB5ACvABcAlf8U/+/+Vv/o/4IAwQDvAJwA8P9H/9v+Mv/O/5UA5ADIADMAZf/D/sr+jv+iAHwBqwElASMAN/+//u3+uv99APgAvgA+AJn/J/8j/3j/AAB1AJAAjAA5AA8A/v/t/wkA2v/l/8H/4P/+//r/OAAMAPb/l/9Y/6H/4f+oAOUAEQHkAPj/Sf9u/uD+iv9GAAsBCQHyAOn/MP/1/jD/KgCRAPkAhgDu/3n/Df+X/xMA0AAdAb8AagCd/zj/7P4E/+D/OwDcALcAkwAxAID/T//i/jf/tP9qABABMAElAX8Av/8d/7b+9/5l/xwArQDFAMQAIACv/0b/Wv+4/wgAjQC0AKoAUgDX/6//if/v/xgAVABGACMAAADQ/7//uv/P/+P/4f8AADoAgACDAD8AAACn/5v/nP/1/0oAaQBZAKD/G//n/mP/HwDWAFgBQgGEAGT/ev6H/jj/QgAcAbEBmQGkAHf/nv6C/vL+r/9oAPAA8ACTAOX/eP9r/6n/EQBTAHUAVQABAAIA+/9PAEsANwAEAI3/iv9o/9n/+v8AAOP/ef+N/6T/NQDqABcBCwEpAIf/B/8B/7v/OwAQAf8AjwC1/8v+y/65/qL/YwDzAEcBtABVAJf/Zf+R/7X/RABlALYAaADl/5j/Vf+M/7r/CwBzAGUAcADn/6r/e/9//8H/1P9JAIsArQCRABgA9/+2/5f/m//X/2MAYQAYAJb/K/8c/yb/8/+fAD0BUwHWADgAdv8t/zH/iv8iAHoAxwCWAGcA7v+M/z3///4H/0r/AQDHAD4BUAHPADUAcP/k/uH+av9OAMkA7QCeACEAlf8s/07/uv9kAJAAXQDv/4f/Q/9I/9X/tgBEAUkBqwDf/yj/5P4v/+f/mAAOAc4AKgBj//D+AP9R//f/hwDhAM0AXwArAP//+//Y/6v/xf+0/w4AMwBdAGMA8/+k//X++v5O//r/1gAwAVwBxQD2/03/x/4t/43/WADXAOsA1gAAAJ3/Kv80/57/8P9oAC8ACgDN/5f/2P8AAJ0A3ADXAIMA5P+Y/1L/T/+Z/+r/dwB0AHQARwDm/6v/Fv8j/2D/9f+aANUAHQG+ADAAeP8d/2f/wf9QAH0AbwAoAJ//a/9X/87/PAB2AHoAQgD//8H/nv/Z/woAZgB1AG4APQD7/9n/k/+h/4f/rP/I////QwBhAH4AUwAOALP/ff+V/+X/ZQDLAPAAnQDc/xr/m/7R/ov/hQBNAWYBwQDN/8T+bP7B/tf/5wB7AW8B0wADAFT/Ff9n/+P/UABZACsABgDR/9f/3v8SAEoAHQDp/3//mP/E//H/SgB6ANIAowA/ABsAwf/W/1X/W/9e/5L//f8JAKUAzwDkAHcAo/9d//j+Uv/M/3YAGwH4AKUAvv8E/9L+//7O/0kA1QDyAHoAHAB2/4j/i//G/ycANQCcAFUAPgDZ/4r/jf98/9n/GgB2ALkAYwD+/2n/O/9Z/4//QACaAN8AjwAYAMD/cP+w//L/WwCiAI4APACL/zL/Av9Q/93/VwDaANYApAAVAJb/e/+R//X/KABaAF8AHAD5/7T/1v/U/9T/tv+l/+3/IwCFAKQAqgBaAND/cf9Q/63/IwBxAJIAHAC8/z3/U//a/2kAFgHqAJ0Alv/d/qH+4P7k/5cAcwFlAfIAEgAi/+j+5f6N/x0AqADwAIsAEABu/zv/W/+0/ygAgACjAJQAPgALAOL/8//Q/8f/xv/q/xYAHAAuAAMA5f+B/3H/mP/9/3wAmgCsADYA5/+f/4T/2/8WAIAAWQACAMb/eP+e/7L/GwB+AH8AfQDs/7f/d/9y/8D/3P+JAMUAAAHEACsAu/8K/+r+9v6L/1cA0wAcAdIAVgC4/wr/+/4u//H/nQAIATEBrgAkAG//Z/+e/8j/IgAPAPL/iP87/yz/U//9/5IABQHcAHoA+f+e/3z/lf/o/2sAiwB6ACUA8//d/9T/6//l//z/6v/6/+j/BwAaAAAAAAC4//7/EgBWAG8AWgBgAMf/e/8q/zr/wP8GAJoApQClAFEAtv+S/1f/yv9FAIwA2QBoACwAmv9a/3T/mf8nAC0ASQATAN3/uv+m/9H//P8nAEkAOQA/ACUAJgAdAOX/uP+y/wAAYAC+AL8AYwDD//X+aP5r/jb/NgAxAY0BVQHAANX/N//+/nj/FACNAM8AjAA8AJj/Nf8r/4f/AwA1AFIAKgD+/+n/zf8wAHgAoQCTAC4ABACe/6r/o//F////5f/9/+P/BgAiABAABwCo/4P/dv+b/zwAkwDuAMkAOAC+/yj/Zf/E/24A9ADUAJEAnv/z/oj+vv5v/zMA+gA6ATgBwwAVAHH/Pv9J/63/GABeAJ4AawAGAKj/Zf9h/3f/y/8fAE4AiwBWAFAALQAMABwAAQAfABYAAADn/4P/jf+P/+D/RQB0AJ0AVwDb/0r/AP9O/8z/YQDgAPwAzABBALn/mv+w/8f/BADz/x8AFAAMABoA2/8KAMP/sv/B/8X/VQBiAI0AcgAHAM3/Yv+K/9//OADGAIcATAC4/x//Dv8I/9H/gAAbASEBhgD0/1L/Kv9s/+//iwDxAKAAEABZ/xH/N/+V/1IApADfAFkAy/99/1z/nP8AAD0AiACKAHQARgDx/xMAw/+3/4H/a//Q/+X/VABqAHQATwDq/7P/iP+y/woANgBjAGwALAAAALH/sv/c/w8AJgAMAOX/r/+K/5//8P9AAMIAtwCYACAAiv9d/yD/pv8AAJAA5ACxAJIA6v94/z3/Df99/87/ZgDaAMIArAD9/6L/Vf8z/93/RwDsANoAWADN/yv/Af8V/6L/bwDWAOIAlgAIANb/kP+j//D/FgBXABwA9//m/9n/CwDx//v/CwDF/9T/pv/q/yMAJABaAA4AJgD4/+L/CwACADUAEADL/6r/iv/Y/zwAnwDlAIsAEQA6/63+z/5W/1gAEQFeARIBTQB2//7+FP/B/2IAvgDOADcAzv8p/yP/ev/v/48AqQCTAC4A2P/I/67/2/8pADwAagAeAPX/yv+V/63/hv/F/+n/FABHAEQAcABrADIA6/+y/6D/0//s/0EAcQB3AEkAsP+E/13/pf8QAD8AigBeAAEAmv9C/4b/w/8ZAJUAmADgAGoAIADW/3v/") +format = 1 +mix_rate = 22050 [node name="Login" type="Control"] layout_mode = 3 @@ -13,6 +19,18 @@ grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_1m5cv") +[node name="Background" type="TextureRect" parent="."] +self_modulate = Color(0.779291, 0.779291, 0.779291, 1) +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("2_elmti") +expand_mode = 3 +stretch_mode = 6 + [node name="Login" type="CenterContainer" parent="."] unique_name_in_owner = true layout_mode = 1 @@ -73,10 +91,22 @@ unique_name_in_owner = true layout_mode = 2 columns = 5 -[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] -stream = ExtResource("2_aeqi0") +[node name="ButtonClickSound" type="AudioStreamPlayer" parent="."] +stream = SubResource("AudioStreamWAV_f4kp2") -[node name="AudioStreamPlayer2" type="AudioStreamPlayer" parent="."] +[node name="BackgroundMusic" type="AudioStreamPlayer" parent="."] stream = ExtResource("3_2nukd") +[node name="ChatWindow" parent="." instance=ExtResource("4_ah2a1")] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = -1 +anchor_top = 0.829 +anchor_right = 0.5 +anchor_bottom = 1.0 +offset_top = -0.192017 +offset_right = -31.0 +offset_bottom = 0.0 +grow_vertical = 0 + [connection signal="pressed" from="Login/VBoxContainer/Login" to="." method="_on_login_pressed"] diff --git a/network/character_server.gd b/network/character_server.gd index 4831b36..ec0aadb 100644 --- a/network/character_server.gd +++ b/network/character_server.gd @@ -56,3 +56,18 @@ func select_character(slot: int): if packet is CharacterSelectionSuccessPacket: print(inst_to_dict(packet)) selected_character.emit(packet) + + +func get_keep_alive_timer() -> Timer: + var character_server_keep_alive_timer = Timer.new() + character_server_keep_alive_timer.name = "CharacterServerKeepAliveTimer" + character_server_keep_alive_timer.autostart = true + character_server_keep_alive_timer.one_shot = false + character_server_keep_alive_timer.wait_time = 12.0 + + character_server_keep_alive_timer.timeout.connect(func(): + var character_server_keep_alive_packet := CharacterServerKeepAlivePacket.new() + send(character_server_keep_alive_packet) + ) + + return character_server_keep_alive_timer diff --git a/network/login_server.gd b/network/login_server.gd index 238a183..a78f750 100644 --- a/network/login_server.gd +++ b/network/login_server.gd @@ -21,3 +21,19 @@ func login(username: String, password: String): if packet is LoginServerLoginSuccessPacket: print(inst_to_dict(packet)) logged_in.emit(packet) + + +func get_keep_alive_timer() -> Timer: + var login_server_keep_alive_timer = Timer.new() + login_server_keep_alive_timer.name = "LoginServerKeepAliveTimer" + login_server_keep_alive_timer.autostart = true + login_server_keep_alive_timer.one_shot = false + login_server_keep_alive_timer.wait_time = 30.0 # 60.0 + + login_server_keep_alive_timer.timeout.connect(func(): + var login_server_keep_alive_packet := LoginServerKeepAlivePacket.new() + login_server_keep_alive_packet.user_name = "dweipert" + send(login_server_keep_alive_packet) + ) + + return login_server_keep_alive_timer diff --git a/network/map_server.gd b/network/map_server.gd index 1f74055..cf6f2ad 100644 --- a/network/map_server.gd +++ b/network/map_server.gd @@ -19,8 +19,8 @@ func login(account_id: int, character_id: int, login_id1: int, gender: Constants peer.put_data(map_server_login_packet.to_bytes()) - peer.get_data(6) # in-between packet - peer.get_data(4) # in-between packet + peer.get_data(6) # in-between packet # 0x0283 + peer.get_data(4) # in-between packet # 0x0b18 var packet = await received_packet if packet is MapServerLoginSuccessPacket: diff --git a/network/server.gd b/network/server.gd index e46e797..8b41b4f 100644 --- a/network/server.gd +++ b/network/server.gd @@ -35,10 +35,27 @@ func listen() -> void: raw_packet += packet_length raw_packet += peer.get_data(packet_length.decode_u16(0) - 4)[1] + prints("Upcoming Length:", packet_length.decode_u16(0), "for =>") var packet = packet_type.from_bytes(raw_packet) received_packet.emit(packet) + + var display_header = raw_packet.slice(0, 2) + display_header.reverse() + print("Received known packet with header ", display_header.hex_encode(), " = ", packet_type.get_global_name()) else: raw_packet.reverse() print("Received unknown packet with header ", raw_packet.hex_encode()) + + +func send(packet: Packet) -> Error: + var display_header = packet.get_header() + display_header.reverse() + print("Sent packet with header ", display_header.hex_encode()) + + return send_raw(packet.to_bytes()) + + +func send_raw(bytes: PackedByteArray) -> Error: + return peer.put_data(bytes) diff --git a/packets/achievement_data.gd b/packets/achievement_data.gd new file mode 100644 index 0000000..a26633f --- /dev/null +++ b/packets/achievement_data.gd @@ -0,0 +1,50 @@ +class_name AchievementData +extends PacketChunk + + +const BYTE_LENGTH := 50 + + +## Byte Type: u32 +## Byte Length: 4 +var achievement_id: int + +## Byte Type: u8 +## Byte Length: 1 +var is_completed: bool + +## Byte Type: u32 +## Byte Length: 4 * 10 +var objectives: PackedByteArray + +## Byte Type: u32 +## Byte Length: 4 +var completion_timestamp: int + +## Byte Type: u8 +## Byte Length: 1 +var got_rewarded: bool + + +static func from_bytes(bytes: PackedByteArray) -> AchievementData: + var achievement_data = AchievementData.new() + + achievement_data.achievement_id = bytes.decode_u32(0) + achievement_data.is_completed = bytes.decode_u8(4) + achievement_data.objectives = bytes.slice(5, 5 + 40) + achievement_data.completion_timestamp = bytes.decode_u32(45) + achievement_data.got_rewarded = bytes.decode_u8(49) + + return achievement_data + + +static func array_from_bytes(bytes: PackedByteArray) -> Array[AchievementData]: + var array: Array[AchievementData] = [] + + var offset = 0 + while offset < bytes.size(): + var chunk = from_bytes(bytes.slice(offset)) + array.append(chunk) + offset += chunk.byte_length + + return array diff --git a/packets/achievement_list_packet.gd b/packets/achievement_list_packet.gd new file mode 100644 index 0000000..ed09184 --- /dev/null +++ b/packets/achievement_list_packet.gd @@ -0,0 +1,48 @@ +## rAthena References: +## - ZC_ALL_ACH_LIST +class_name AchievementListPacket +extends Packet + + +const HEADER := 0x0a23 +const BYTE_LENGTH := 0 + + +## Byte Type: u16 +## Byte Length: 2 +var packet_length: int + +## Byte Type: u32 +## Byte Length: 4 +var achievement_count: int + +## Byte Type: u32 +## Byte Length: 4 +var total_score: int + +## Byte Type: u16 +## Byte Length: 2 +var level: int + +## Byte Type: u32 +## Byte Length: 4 +var achievement_experience: int + +## Byte Type: u32 +## Byte Length: 4 +var achievement_experience_to_next_level: int + +var achievement_data: Array[AchievementData] + + +static func from_bytes(bytes: PackedByteArray) -> AchievementListPacket: + var packet = AchievementListPacket.new() + + packet.achievement_count = bytes.decode_u32(4) + packet.total_score = bytes.decode_u32(8) + packet.level = bytes.decode_u16(12) + packet.achievement_experience = bytes.decode_u32(14) + packet.achievement_experience_to_next_level = bytes.decode_u32(18) + packet.achievement_data = AchievementData.array_from_bytes(bytes.slice(22)) + + return packet diff --git a/packets/achievement_update_packet.gd b/packets/achievement_update_packet.gd new file mode 100644 index 0000000..9b33273 --- /dev/null +++ b/packets/achievement_update_packet.gd @@ -0,0 +1,39 @@ +## rAthena References: +## - ZC_ACH_UPDATE +class_name AchievementUpdatePacket +extends Packet + + +const HEADER := 0x0a24 +const BYTE_LENGTH := 66 + + +## Byte Type: u32 +## Byte Length: 4 +var total_score: int + +## Byte Type: u16 +## Byte Length: 2 +var level: int + +## Byte Type: u32 +## Byte Length: 4 +var achievement_experience: int + +## Byte Type: u32 +## Byte Length: 4 +var achievement_experience_to_next_level: int + +var achievement_data: AchievementData + + +static func from_bytes(bytes: PackedByteArray) -> AchievementUpdatePacket: + var packet = AchievementUpdatePacket.new() + + packet.total_score = bytes.decode_u32(2) + packet.level = bytes.decode_u16(6) + packet.achievement_experience = bytes.decode_u32(8) + packet.achievement_experience_to_next_level = bytes.decode_u32(12) + packet.achievement_data = AchievementData.from_bytes(bytes.slice(16)) + + return packet diff --git a/packets/change_map_packet.gd b/packets/change_map_packet.gd new file mode 100644 index 0000000..beee821 --- /dev/null +++ b/packets/change_map_packet.gd @@ -0,0 +1,35 @@ +## rAthena References: +## - ZC_NPCACK_MAPMOVE +class_name ChangeMapPacket +extends Packet + + +const HEADER := 0x0091 +const BYTE_LENGTH := 22 + + +## Byte Type: u8 +## Byte Length: 16 +var map_name: String + +## Byte Type: u16 +## Byte Length: 2 +var position_x: int + +## Byte Type: u16 +## Byte Length: 2 +var position_y: int + + +func get_position() -> Vector2: + return Vector2(position_x, position_y) + + +static func from_bytes(bytes: PackedByteArray): + var packet = ChangeMapPacket.new() + + packet.map_name = bytes.slice(2, 2 + 16).get_string_from_utf8() + packet.position_x = bytes.decode_u16(18) + packet.position_x = bytes.decode_u16(20) + + return packet diff --git a/packets/character_selection_failed_packet.gd b/packets/character_selection_failed_packet.gd new file mode 100644 index 0000000..5f6cb8a --- /dev/null +++ b/packets/character_selection_failed_packet.gd @@ -0,0 +1,19 @@ +class_name CharacterSelectionFailedPacket +extends Packet + + +const HEADER := 0x006c +const BYTE_LENGTH := 3 + + +## Byte Type: u8 +## Byte Length: 1 +var reason: int + + +static func from_bytes(bytes: PackedByteArray): + var packet = CharacterSelectionFailedPacket.new() + + packet.reason = bytes.decode_u8(2) + + return packet diff --git a/packets/character_server_keep_alive_packet.gd b/packets/character_server_keep_alive_packet.gd new file mode 100644 index 0000000..81f918c --- /dev/null +++ b/packets/character_server_keep_alive_packet.gd @@ -0,0 +1,22 @@ +## rAthena References: +class_name CharacterServerKeepAlivePacket +extends Packet + + +const HEADER := 0x0187 +const BYTE_LENGTH := 6 + + +## Byte Type: u32 +## Byte Length: 4 +var account_id: int + + +func to_bytes(): + var payload = PackedByteArray([]) + payload.resize(4) + + # rAthena never reads this value, so just set it to 0 + payload.encode_u32(0, 0) + + return get_header() + payload diff --git a/packets/friend.gd b/packets/friend.gd new file mode 100644 index 0000000..70120fe --- /dev/null +++ b/packets/friend.gd @@ -0,0 +1,40 @@ +class_name Friend +extends PacketChunk + + +const BYTE_LENGTH := 32 + + +## Byte Type: u32 +## Byte Length: 4 +var account_id: int + +## Byte Type: u32 +## Byte Length: 4 +var character_id: int + +## Byte Type: u8 +## Byte Length: 24 +var name: String + + +static func from_bytes(bytes: PackedByteArray): + var quest = Friend.new() + + quest.account_id = bytes.decode_u32(0) + quest.character_id = bytes.decode_u32(4) + quest.name = bytes.slice(8, 8 + 24).get_string_from_utf8() + + return quest + + +static func array_from_bytes(bytes: PackedByteArray) -> Array[Friend]: + var array: Array[Friend] = [] + + var offset = 0 + while offset < bytes.size(): + var chunk = from_bytes(bytes.slice(offset)) + array.append(chunk) + offset += chunk.byte_length + + return array diff --git a/packets/friend_list_packet.gd b/packets/friend_list_packet.gd new file mode 100644 index 0000000..ab419f5 --- /dev/null +++ b/packets/friend_list_packet.gd @@ -0,0 +1,23 @@ +## rAthena References: +## - ZC_FRIENDS_LIST +class_name FriendListPacket +extends Packet + + +const HEADER := 0x0201 +const BYTE_LENGTH := 0 + + +## Byte Type: u16 +## Byte Length: 2 +var packet_length: int + +var friends: Array[Friend] + + +static func from_bytes(bytes: PackedByteArray): + var packet = FriendListPacket.new() + + packet.friends = Friend.array_from_bytes(bytes.slice(4)) + + return packet diff --git a/packets/login_server_keep_alive_packet.gd b/packets/login_server_keep_alive_packet.gd new file mode 100644 index 0000000..db0eedb --- /dev/null +++ b/packets/login_server_keep_alive_packet.gd @@ -0,0 +1,22 @@ +## rAthena References: +## - CA_CONNECT_INFO_CHANGED ? +class_name LoginServerKeepAlivePacket +extends Packet + + +const HEADER := 0x0200 +const BYTE_LENGTH := 26 + + +## Byte Type: u8 +## Byte Length: 24 +var user_name: String + + +func to_bytes(): + var payload = PackedByteArray([]) + + payload += user_name.to_utf8_buffer() + payload.resize(BYTE_LENGTH - 2) + + return get_header() + payload diff --git a/packets/map_server_login_success_packet.gd b/packets/map_server_login_success_packet.gd index a6cbdae..9b70428 100644 --- a/packets/map_server_login_success_packet.gd +++ b/packets/map_server_login_success_packet.gd @@ -6,7 +6,7 @@ extends Packet const HEADER := 0x02eb -const BYTE_LENGTH := 14 +const BYTE_LENGTH := 13 ## Byte Type: u32 @@ -46,6 +46,6 @@ static func from_bytes(bytes: PackedByteArray): packet.position = bytes.slice(6, 6 + 3) packet.ignored = bytes.slice(9, 9 + 2) packet.font = bytes.decode_u16(11) - packet.gender = bytes.decode_u8(13) + #packet.gender = bytes.decode_u8(13) return packet diff --git a/packets/send_chat_message_packet.gd b/packets/send_chat_message_packet.gd new file mode 100644 index 0000000..6bb6b14 --- /dev/null +++ b/packets/send_chat_message_packet.gd @@ -0,0 +1,26 @@ +## rAthena References: +## - +class_name SendChatMessagePacket +extends Packet + + +const HEADER := 0x00f3 +const BYTE_LENGTH := 0 + + +## Byte Type: u16 +## Byte Length: 2 +var packet_length: int + +## Byte Type: u8 +## Byte Length: variable +var message: String + + +func to_bytes(): + var payload = PackedByteArray([]) + + payload = message.to_utf8_buffer() + PackedByteArray([0]) + print(message) + print(get_header(4 + payload.size()) + payload) + return get_header(4 + payload.size()) + payload diff --git a/packets/server_message_packet.gd b/packets/server_message_packet.gd new file mode 100644 index 0000000..9b8d846 --- /dev/null +++ b/packets/server_message_packet.gd @@ -0,0 +1,25 @@ +## rAthena References: +## - clif_displaymessage +class_name ServerMessagePacket +extends Packet + + +const HEADER := 0x008e +const BYTE_LENGTH := 0 + + +## Byte Type: u16 +## Byte Length: 2 +var packet_length: int + +## Byte Type: u8 +## Byte Length: variable +var message: String + + +static func from_bytes(bytes: PackedByteArray): + var packet = ServerMessagePacket.new() + + packet.message = bytes.slice(4).get_string_from_utf8() + + return packet diff --git a/packets/update_critical_weight_packet.gd b/packets/update_critical_weight_packet.gd new file mode 100644 index 0000000..03fb273 --- /dev/null +++ b/packets/update_critical_weight_packet.gd @@ -0,0 +1,19 @@ +class_name UpdateCriticalWeightPacket +extends Packet + + +const HEADER := 0x0ade +const BYTE_LENGTH := 6 + + +## Byte Type: u32 +## Byte Length: 4 +var weight: int + + +static func from_bytes(bytes: PackedByteArray) -> UpdateCriticalWeightPacket: + var packet = UpdateCriticalWeightPacket.new() + + packet.weight = bytes.decode_u32(2) + + return packet @@ -2,7 +2,7 @@ class_name Sprite extends Node2D -var sprite_data: SpriteResource +@export var sprite_data: SpriteResource var action_data: ActionFormat var current_action_idx := 0 @@ -21,16 +21,13 @@ func _ready() -> void: func load_file(path: String): var basename = path.get_basename() - sprite_data = load("%s.tres" % basename) + sprite_data = load("%s/sprite.tres" % basename) var act = FileAccess.open("%s.act" % basename, FileAccess.READ) action_data = ActionFormat.from_bytes(ByteStream.from_bytes( act.get_buffer(act.get_length()) )) - if not sprite_data.files_exist(): - sprite_data.save_to_file() # generate at "runtime" - set_process(true) set_current_action(0) @@ -71,19 +68,18 @@ func update(sprite_layers: Array[ActionFormat.SpriteLayer]): for idx in sprite_layers.size(): var sprite_layer = sprite_layers[idx] - - var base_dir = sprite_data.filepath.substr(0, sprite_data.filepath.length() - 4) # cut off .spr - var image = load("%s/%s.png" % [base_dir, str(sprite_layer.sprite_index).pad_zeros(3)]) + var image = sprite_data.images[sprite_layer.sprite_index] var sprite: Sprite2D if has_different_layer_count: sprite = Sprite2D.new() + sprite.centered = false # 必要!! sprite.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST else: sprite = %SpriteLayers.get_child(idx) sprite.texture = image - sprite.position = sprite_layer.get_position() + sprite.position = sprite_layer.get_position() - ceil(sprite_layer.get_size() / 2) # for fixing half pixel drawing sprite.self_modulate = sprite_layer.get_color() sprite.scale = sprite_layer.get_scale() sprite.rotation_degrees = sprite_layer.rotation_degrees |