From c31cda8e966e34b1b6561e1b9f9f308b62da78ca Mon Sep 17 00:00:00 2001 From: Prodeath21 Date: Thu, 2 Jul 2026 00:24:18 +0200 Subject: [PATCH] Release Blender L1960_Tools V1_8_5 --- .../_Release/L1960_Tools_1_8_5.zip | Bin 0 -> 72721 bytes .../L1960_Tools_1_8_5/AutoColorPalette.py | 333 ++++++ .../L1960_Tools_1_8_5/ColorPalette_01.csv | 1025 +++++++++++++++++ .../L1960_Tools_1_8_5/ColorPalette_01.png | Bin 0 -> 9972 bytes .../L1960_Tools_1_8_5/ColorPalette_02.csv | 1025 +++++++++++++++++ .../L1960_Tools_1_8_5/ColorPalette_02.png | Bin 0 -> 9295 bytes .../L1960_Tools_1_8_5/CubeProjection.py | 94 ++ .../_Source/L1960_Tools_1_8_5/Dekogon.py | 187 +++ .../_Source/L1960_Tools_1_8_5/Helper.py | 139 +++ .../L1960_Tools_1_8_5/MaterialToMask.py | 244 ++++ .../_Source/L1960_Tools_1_8_5/PrepareLods.py | 42 + .../_CreateColorPaletteMatrix.py | 30 + .../_Source/L1960_Tools_1_8_5/__init__.py | 222 ++++ .../AutoColorPalette.cpython-311.pyc | Bin 0 -> 5915 bytes .../CubeProjection.cpython-311.pyc | Bin 0 -> 5501 bytes .../__pycache__/Dekogon.cpython-311.pyc | Bin 0 -> 8550 bytes .../__pycache__/Helper.cpython-311.pyc | Bin 0 -> 8342 bytes .../MaterialToMask.cpython-311.pyc | Bin 0 -> 12056 bytes .../__pycache__/PrepareLods.cpython-311.pyc | Bin 0 -> 2584 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 14144 bytes 20 files changed, 3341 insertions(+) create mode 100644 Blender/L1960_Tools/_Release/L1960_Tools_1_8_5.zip create mode 100644 Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/AutoColorPalette.py create mode 100644 Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/ColorPalette_01.csv create mode 100644 Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/ColorPalette_01.png create mode 100644 Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/ColorPalette_02.csv create mode 100644 Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/ColorPalette_02.png create mode 100644 Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/CubeProjection.py create mode 100644 Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/Dekogon.py create mode 100644 Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/Helper.py create mode 100644 Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/MaterialToMask.py create mode 100644 Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/PrepareLods.py create mode 100644 Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/_CreateColorPaletteMatrix.py create mode 100644 Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/__init__.py create mode 100644 Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/__pycache__/AutoColorPalette.cpython-311.pyc create mode 100644 Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/__pycache__/CubeProjection.cpython-311.pyc create mode 100644 Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/__pycache__/Dekogon.cpython-311.pyc create mode 100644 Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/__pycache__/Helper.cpython-311.pyc create mode 100644 Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/__pycache__/MaterialToMask.cpython-311.pyc create mode 100644 Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/__pycache__/PrepareLods.cpython-311.pyc create mode 100644 Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/__pycache__/__init__.cpython-311.pyc diff --git a/Blender/L1960_Tools/_Release/L1960_Tools_1_8_5.zip b/Blender/L1960_Tools/_Release/L1960_Tools_1_8_5.zip new file mode 100644 index 0000000000000000000000000000000000000000..fc47d294a78e08fd6e694edc0d4c2fb824cbf26c GIT binary patch literal 72721 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
  • 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
    N))imKL#%%EjfgF3KH@}FF+Y||v#>HqYCb{px0 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

    !lwyp;9)EDKR{f=0_DB|ZeI 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 Yuk&}4CUgMcAnAF8^yM+gMnih{C&VP$`2YX_ literal 0 HcmV?d00001 diff --git a/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/AutoColorPalette.py b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/AutoColorPalette.py new file mode 100644 index 0000000..e9199f4 --- /dev/null +++ b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/AutoColorPalette.py @@ -0,0 +1,333 @@ +import bpy +import math +import csv +import os +import json +from mathutils import Vector + +### GENRATE MLOD ### + +plugin_dir = bpy.utils.user_resource('SCRIPTS') +plugin_path = "addons\L1960Tools" +L1960_path = os.path.join(plugin_dir, plugin_path) + +colorpalettes = [ + json.dumps(["ColorPalette_01.png", "BF1BC94A0DE4398F"]), + json.dumps(["ColorPalette_02.png", "A95B2794A0EE8340"]) +] + +enum_palettes = [] +for palettes in colorpalettes: + file = json.loads(palettes)[0] + enum_palettes.append((palettes, file[:-4], "Select " + file[:-4] + " for MLOD")) + +class EnumColorPalettes(bpy.types.PropertyGroup): + mlod_enum_selection: bpy.props.EnumProperty(name="Color Palettes for MLOD", items = enum_palettes, description = "Choose a palette", default = 0) + +class MESH_OT_set_up_mlod(bpy.types.Operator): + """Set´s up a material to be used for MLOD´s""" + + bl_idname = "mesh.set_up_mlod" + bl_label = "Set´s up a material to be used for MLOD´s" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context): + + #Load Color Palettes + self.import_palettes_textures() + + #Selected Mesh + obj = bpy.context.active_object + + if obj not in bpy.context.selected_objects or obj.type != "MESH": + self.report({'WARNING'}, 'Select a Mesh to continue') + return {"CANCELLED"} + + arr_layers = obj.data.uv_layers + if not arr_layers.get("MLOD") or len(arr_layers) > 1: + for uv_layer in reversed(arr_layers): + arr_layers.remove(uv_layer) + arr_layers.new(name = 'MLOD') + + if not len(obj.data.materials) == 0: + obj.data.materials.clear() + + palette_enum_selection = json.loads(context.scene.color_palettes.mlod_enum_selection) + mlod_material_name = "MLOD_" + palette_enum_selection[0][:-4] + "_" + palette_enum_selection[1] + + if not bpy.data.materials.get(mlod_material_name): + material = bpy.data.materials.new(name=mlod_material_name) + material.use_nodes = True + bsdf_node = material.node_tree.nodes["Principled BSDF"] + texImage = material.node_tree.nodes.new('ShaderNodeTexImage') + texImage.image = bpy.data.images.get(palette_enum_selection[0]) + + material.node_tree.links.new(bsdf_node.inputs['Base Color'], texImage.outputs['Color']) + + obj.data.materials.append(bpy.data.materials.get(mlod_material_name)) + + self.report({'INFO'}, 'Mesh configured like MLOD') + return {"FINISHED"} + + def import_palettes_textures(self): + for image_name in colorpalettes: + image_name = json.loads(image_name)[0] + texture_name = image_name.split(".")[0] + if texture_name not in bpy.data.textures: + texture = bpy.data.textures.new(name=texture_name, type='IMAGE') + else: + texture = bpy.data.textures.get(texture_name) + if image_name not in bpy.data.images: + image = bpy.data.images.load(os.path.join(L1960_path, image_name)) + else: + image = bpy.data.images.get(image_name) + texture.image = image + +# texture_filepath = os.path.join(L1960_path, colorpalettes[1]) + +### Palette MLOD ### +# class MESH_OT_bake_basic_mlod(bpy.types.Operator): +# """Set´s up a basic MLOD via Bake""" + +# bl_idname = "mesh.bake_basic_mlod" +# bl_label = "Set´s up a basic MLOD via Bake" +# bl_options = {"REGISTER", "UNDO"} + +# def execute(self, context): +# obj = context.active_object + +# #Palette selection +# palette_enum_selection = json.loads(context.scene.color_palettes.mlod_enum_selection) + +# if obj not in bpy.context.selected_objects or obj.type != "MESH": +# self.report({'WARNING'}, 'Select a Mesh to continue') +# return {"CANCELLED"} + +# faces_with_color = self.get_faces_with_color(obj) + +# grouped_colors = self.groupe_colors(faces_with_color, threshold=50) + +# matched_colors = self.find_matching_color(grouped_colors, palette_enum_selection[0][:-4]) + +# self.adjust_UV(obj, matched_colors) + +# #Entfernen des referenz Bake Image +# #bpy.data.images.remove(bpy.data.images["MLOD_Temp"]) + +# # Entfernen aller Meterials +# if not len(obj.data.materials) == 0: +# obj.data.materials.clear() + +# # Create new Material with selected Palette +# mlod_material_name = "MLOD_" + palette_enum_selection[0][:-4] + palette_enum_selection[1] + +# texture_filepath = os.path.join(L1960_path, palette_enum_selection[0]) +# image = bpy.data.images.load(texture_filepath) + +# if not bpy.data.materials.get(mlod_material_name): +# material = bpy.data.materials.new(name=mlod_material_name) +# material.use_nodes = True +# bsdf_node = material.node_tree.nodes["Principled BSDF"] +# texImage = material.node_tree.nodes.new('ShaderNodeTexImage') +# texImage.image = image +# material.node_tree.links.new(bsdf_node.inputs['Base Color'], texImage.outputs['Color']) +# obj.data.materials.append(bpy.data.materials.get(mlod_material_name)) + +# self.report({'INFO'}, f'MLOD sucessfully created with {palette_enum_selection[0][:-4]}.') +# return {"FINISHED"} + +# def get_faces_with_color(self, obj): + +# #Bake Image +# image = self.bake_diffuse(obj) + +# mesh = obj.data +# uv_layer = mesh.uv_layers.active.data # direct UV access + +# colors = [] + +# for poly in mesh.polygons: # same as "face" in BMesh +# # Durchschnittliche UV-Koordinaten berechnen +# uv = Vector((0.0, 0.0)) +# for loop_index in poly.loop_indices: +# uv += uv_layer[loop_index].uv +# uv /= len(poly.loop_indices) + +# # UV → Pixel-Koordinaten (Bildgröße) +# x = int(uv.x * (image.size[0] - 1)) +# y = int(uv.y * (image.size[1] - 1)) + +# # RGBA Pixel holen +# index = (y * image.size[0] + x) * 4 +# pixel = image.pixels[index:index+4] + +# # In 0–255 Werte umwandeln +# rgb_255 = [round(c * 255) for c in pixel][:3] + +# colors.append({ +# "face": poly.index, +# "rgb": rgb_255 +# }) + +# # print(colors[-1]) # -> [{'face': , 'rgb': [0, 0, 0]}] + +# return colors + +# def groupe_colors(self, color_list, threshold = 10): +# groups = [] + +# for color in color_list: +# found_group = False +# for group in groups: +# # Compute average color of the group +# avg_color = [sum(c["rgb"][i] for c in group)/len(group) for i in range(3)] +# if self.color_distance(color["rgb"], avg_color) <= threshold: +# group.append(color) +# found_group = True +# break +# if not found_group: +# groups.append([color]) + +# # Compute the average color for each group +# grouped_colors = [{ +# "face": [c["face"] for c in group], +# "rgb": [round(sum(c["rgb"][i] for c in group) / len(group)) for i in range(3)] +# } +# for group in groups +# ] + +# return grouped_colors + +# def color_distance(self, c1, c2): +# return math.sqrt( +# (c1[0]-c2[0])**2 + +# (c1[1]-c2[1])**2 + +# (c1[2]-c2[2])**2 +# ) + +# def read_color_csv(self, palette): +# colors = [] +# try: +# with open(f"{palette}.csv", newline="") as datei: +# reader = csv.DictReader(datei) +# for row in reader: +# colors.append({ +# "rgb": [int(row["r"]), int(row["g"]), int(row["b"])], +# "norm_x": float(row["norm_x"]), +# "norm_y": float(row["norm_y"]) +# }) +# return colors +# except: +# return [] + +# def find_matching_color(self, colors, palette): +# match = [] +# for color in colors: +# best = None +# min_dist = float("inf") + +# for target in self.read_color_csv(palette): +# dist = self.color_distance(target["rgb"], color["rgb"]) +# if dist < min_dist: +# min_dist = dist +# best = { +# "face": color["face"], +# "rgb": color["rgb"], +# "norm_x": target["norm_x"], +# "norm_y": target["norm_y"] +# } +# match.append(best) +# return match + +# def adjust_UV(self, obj, new_face_coords): +# scale = 0.001 # Skalierung + +# mesh = obj.data + +# arr_layers = obj.data.uv_layers +# if not arr_layers.get("MLOD") or len(arr_layers) > 1: +# for uv_layer in reversed(arr_layers): +# arr_layers.remove(uv_layer) +# arr_layers.new(name = 'MLOD') +# uv_layer = arr_layers.get("MLOD") +# mesh.uv_layers.active = uv_layer + +# for poly in mesh.polygons: +# for coords in new_face_coords: +# if poly.index in coords["face"]: + +# # Mittelpunkt der UVs dieses Polygons berechnen +# uvs = [uv_layer.data[i].uv.copy() for i in poly.loop_indices] +# center = sum(uvs, Vector((0.0, 0.0))) / len(uvs) + +# # Skalieren + Verschieben +# for i in poly.loop_indices: +# uv = uv_layer.data[i].uv +# uv -= center +# uv *= scale +# uv += Vector((float(coords["norm_x"]), float(coords["norm_y"]))) + +# # Mesh updaten +# mesh.update() + +# def bake_diffuse(self, selected_obj, res = 1024): + +# source_obj = None +# for obj in bpy.data.objects: +# if obj.type == 'MESH' and obj.name.endswith("_LOD0"): +# print(obj.name) +# source_obj = obj.copy() +# source_obj.data = obj.data.copy() +# bpy.context.collection.objects.link(source_obj) +# break + +# if source_obj is None: +# source_obj = selected_obj.copy() +# source_obj.data = selected_obj.data.copy() +# bpy.context.collection.objects.link(source_obj) + +# # Material erstellen +# if "MLOD_Temp" in bpy.data.materials: +# mat = bpy.data.materials.remove["MLOD_Temp"] +# mat = bpy.data.materials.new(name="MLOD_Temp") +# source_obj.data.materials.clear() +# source_obj.data.materials.append(mat) + +# # WICHTIG: Material als aktives Material setzen +# mat.use_nodes = True +# source_obj.active_material = mat + +# # Ziel Image Node konfigurieren +# nodes = mat.node_tree.nodes +# links = mat.node_tree.links +# nodes.clear() +# tex_node = nodes.new(type="ShaderNodeTexImage") +# bsdf = nodes.new(type="ShaderNodeBsdfPrincipled") +# output = nodes.new(type="ShaderNodeOutputMaterial") +# links.new(bsdf.outputs["BSDF"], output.inputs["Surface"]) +# links.new(tex_node.outputs["Color"], bsdf.inputs["Base Color"]) +# nodes.active = tex_node + +# # Erstellen des Images +# if "MLOD_Temp" in bpy.data.images: +# bpy.data.images.remove(bpy.data.images["MLOD_Temp"]) +# image = bpy.data.images.new("MLOD_Temp", res, res) +# tex_node.image = image + +# # Selected Object = Quelle +# bpy.context.view_layer.objects.active = source_obj +# # Active Object = Ziel +# selected_obj.select_set(True) + +# # Bake +# bpy.context.scene.render.engine = 'CYCLES' +# bpy.ops.object.bake(type='COMBINED', width=512, height=512, cage_extrusion=0.5, pass_filter={'COLOR'}, margin=16, use_selected_to_active=True) + +# # Temporäre Helfer entfernen +# bpy.data.objects.remove(source_obj, do_unlink=True) +# if "MLOD_Temp" in bpy.data.materials: +# bpy.data.materials.remove(mat) + +# bpy.context.view_layer.objects.active = selected_obj + +# return image \ No newline at end of file diff --git a/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/ColorPalette_01.csv b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/ColorPalette_01.csv new file mode 100644 index 0000000..853a0f3 --- /dev/null +++ b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/ColorPalette_01.csv @@ -0,0 +1,1025 @@ +norm_x,norm_y,r,g,b +0.015625,0.984375,255,196,181 +0.046875,0.984375,255,234,176 +0.078125,0.984375,255,253,190 +0.109375,0.984375,237,255,190 +0.140625,0.984375,207,255,186 +0.171875,0.984375,188,255,192 +0.203125,0.984375,188,255,217 +0.234375,0.984375,190,255,245 +0.265625,0.984375,190,245,255 +0.296875,0.984375,188,217,255 +0.328125,0.984375,188,192,253 +0.359375,0.984375,207,187,255 +0.390625,0.984375,238,190,255 +0.421875,0.984375,255,190,253 +0.453125,0.984375,255,190,225 +0.484375,0.984375,254,193,201 +0.515625,0.984375,238,212,207 +0.546875,0.984375,238,224,204 +0.578125,0.984375,238,237,206 +0.609375,0.984375,229,238,206 +0.640625,0.984375,212,237,203 +0.671875,0.984375,204,238,207 +0.703125,0.984375,204,238,218 +0.734375,0.984375,206,238,233 +0.765625,0.984375,206,233,238 +0.796875,0.984375,204,218,238 +0.828125,0.984375,204,206,237 +0.859375,0.984375,213,204,238 +0.890625,0.984375,229,206,238 +0.921875,0.984375,238,206,237 +0.953125,0.984375,238,206,223 +0.984375,0.984375,239,207,212 +0.015625,0.953125,254,181,167 +0.046875,0.953125,255,217,163 +0.078125,0.953125,255,252,164 +0.109375,0.953125,230,255,163 +0.140625,0.953125,188,254,158 +0.171875,0.953125,160,255,167 +0.203125,0.953125,160,255,203 +0.234375,0.953125,163,255,241 +0.265625,0.953125,164,241,255 +0.296875,0.953125,160,200,254 +0.328125,0.953125,160,166,254 +0.359375,0.953125,188,159,255 +0.390625,0.953125,232,163,255 +0.421875,0.953125,255,163,249 +0.453125,0.953125,255,163,215 +0.484375,0.953125,254,167,181 +0.515625,0.953125,232,195,188 +0.546875,0.953125,232,212,186 +0.578125,0.953125,232,230,187 +0.609375,0.953125,218,232,186 +0.640625,0.953125,197,230,182 +0.671875,0.953125,184,231,187 +0.703125,0.953125,184,231,204 +0.734375,0.953125,186,232,225 +0.765625,0.953125,187,225,232 +0.796875,0.953125,184,203,230 +0.828125,0.953125,182,186,230 +0.859375,0.953125,197,182,231 +0.890625,0.953125,219,186,232 +0.921875,0.953125,232,186,229 +0.953125,0.953125,232,186,212 +0.984375,0.953125,232,190,195 +0.015625,0.921875,254,159,141 +0.046875,0.921875,255,206,136 +0.078125,0.921875,255,250,135 +0.109375,0.921875,221,255,135 +0.140625,0.921875,167,254,131 +0.171875,0.921875,132,254,140 +0.203125,0.921875,134,255,188 +0.234375,0.921875,135,255,239 +0.265625,0.921875,135,238,255 +0.296875,0.921875,134,185,254 +0.328125,0.921875,133,139,254 +0.359375,0.921875,169,131,254 +0.390625,0.921875,224,136,255 +0.421875,0.921875,255,136,248 +0.453125,0.921875,255,136,204 +0.484375,0.921875,254,141,158 +0.515625,0.921875,226,178,170 +0.546875,0.921875,225,201,166 +0.578125,0.921875,225,223,165 +0.609375,0.921875,207,225,165 +0.640625,0.921875,180,223,162 +0.671875,0.921875,162,223,166 +0.703125,0.921875,164,224,190 +0.734375,0.921875,165,225,217 +0.765625,0.921875,165,216,225 +0.796875,0.921875,164,188,224 +0.828125,0.921875,163,166,223 +0.859375,0.921875,181,162,223 +0.890625,0.921875,210,166,225 +0.921875,0.921875,225,166,222 +0.953125,0.921875,225,166,200 +0.984375,0.921875,226,170,178 +0.015625,0.890625,255,137,116 +0.046875,0.890625,255,193,109 +0.078125,0.890625,255,249,109 +0.109375,0.890625,213,255,110 +0.140625,0.890625,146,255,102 +0.171875,0.890625,105,254,115 +0.203125,0.890625,106,255,172 +0.234375,0.890625,109,255,236 +0.265625,0.890625,108,234,255 +0.296875,0.890625,106,170,255 +0.328125,0.890625,107,114,255 +0.359375,0.890625,150,103,254 +0.390625,0.890625,217,108,255 +0.421875,0.890625,255,109,248 +0.453125,0.890625,255,109,192 +0.484375,0.890625,254,116,134 +0.515625,0.890625,219,160,150 +0.546875,0.890625,217,187,145 +0.578125,0.890625,217,215,145 +0.609375,0.890625,197,217,146 +0.640625,0.890625,162,216,140 +0.671875,0.890625,141,216,146 +0.703125,0.890625,143,217,176 +0.734375,0.890625,145,217,207 +0.765625,0.890625,145,207,217 +0.796875,0.890625,143,175,217 +0.828125,0.890625,144,146,217 +0.859375,0.890625,164,141,216 +0.890625,0.890625,198,145,217 +0.921875,0.890625,217,145,215 +0.953125,0.890625,217,145,186 +0.984375,0.890625,218,150,159 +0.015625,0.859375,255,115,91 +0.046875,0.859375,255,182,83 +0.078125,0.859375,255,248,83 +0.109375,0.859375,207,255,83 +0.140625,0.859375,128,255,75 +0.171875,0.859375,78,254,90 +0.203125,0.859375,78,255,157 +0.234375,0.859375,82,255,231 +0.265625,0.859375,82,230,255 +0.296875,0.859375,78,153,255 +0.328125,0.859375,80,88,254 +0.359375,0.859375,131,76,254 +0.390625,0.859375,210,82,255 +0.421875,0.859375,255,82,247 +0.453125,0.859375,255,82,181 +0.484375,0.859375,255,91,114 +0.515625,0.859375,212,144,132 +0.546875,0.859375,212,176,126 +0.578125,0.859375,212,208,126 +0.609375,0.859375,188,212,126 +0.640625,0.859375,146,210,120 +0.671875,0.859375,122,210,128 +0.703125,0.859375,122,210,160 +0.734375,0.859375,125,211,198 +0.765625,0.859375,125,198,211 +0.796875,0.859375,122,159,210 +0.828125,0.859375,123,127,210 +0.859375,0.859375,146,120,208 +0.890625,0.859375,188,125,211 +0.921875,0.859375,211,125,207 +0.953125,0.859375,211,125,174 +0.984375,0.859375,212,132,143 +0.015625,0.828125,254,94,65 +0.046875,0.828125,255,172,56 +0.078125,0.828125,255,247,55 +0.109375,0.828125,198,255,55 +0.140625,0.828125,108,254,47 +0.171875,0.828125,50,254,64 +0.203125,0.828125,51,255,141 +0.234375,0.828125,54,255,227 +0.265625,0.828125,56,226,255 +0.296875,0.828125,51,137,255 +0.328125,0.828125,51,62,253 +0.359375,0.828125,111,47,254 +0.390625,0.828125,203,55,255 +0.421875,0.828125,255,55,246 +0.453125,0.828125,255,55,169 +0.484375,0.828125,255,65,91 +0.515625,0.828125,207,127,113 +0.546875,0.828125,204,164,106 +0.578125,0.828125,204,201,105 +0.609375,0.828125,177,204,105 +0.640625,0.828125,129,201,99 +0.671875,0.828125,101,203,108 +0.703125,0.828125,102,204,146 +0.734375,0.828125,104,204,190 +0.765625,0.828125,106,190,204 +0.796875,0.828125,102,145,204 +0.828125,0.828125,101,107,201 +0.859375,0.828125,131,99,201 +0.890625,0.828125,179,105,204 +0.921875,0.828125,204,105,200 +0.953125,0.828125,204,105,162 +0.984375,0.828125,207,113,125 +0.015625,0.796875,255,70,39 +0.046875,0.796875,255,160,25 +0.078125,0.796875,255,248,26 +0.109375,0.796875,192,255,26 +0.140625,0.796875,87,255,15 +0.171875,0.796875,19,255,35 +0.203125,0.796875,20,255,126 +0.234375,0.796875,26,255,227 +0.265625,0.796875,27,223,255 +0.296875,0.796875,20,121,255 +0.328125,0.796875,20,34,255 +0.359375,0.796875,91,15,255 +0.390625,0.796875,197,26,255 +0.421875,0.796875,255,26,246 +0.453125,0.796875,255,26,157 +0.484375,0.796875,255,38,67 +0.515625,0.796875,201,108,93 +0.546875,0.796875,197,150,82 +0.578125,0.796875,197,193,83 +0.609375,0.796875,165,197,83 +0.640625,0.796875,111,195,75 +0.671875,0.796875,78,195,86 +0.703125,0.796875,79,195,132 +0.734375,0.796875,83,197,182 +0.765625,0.796875,84,182,198 +0.796875,0.796875,79,129,195 +0.828125,0.796875,79,86,195 +0.859375,0.796875,113,75,195 +0.890625,0.796875,167,83,197 +0.921875,0.796875,197,83,193 +0.953125,0.796875,197,83,148 +0.984375,0.796875,200,92,107 +0.015625,0.765625,255,50,15 +0.046875,0.765625,255,149,1 +0.078125,0.765625,255,247,2 +0.109375,0.765625,184,255,2 +0.140625,0.765625,67,254,0 +0.171875,0.765625,0,255,13 +0.203125,0.765625,0,255,110 +0.234375,0.765625,2,255,223 +0.265625,0.765625,1,217,255 +0.296875,0.765625,0,106,255 +0.328125,0.765625,0,8,255 +0.359375,0.765625,72,0,254 +0.390625,0.765625,188,1,255 +0.421875,0.765625,255,1,245 +0.453125,0.765625,255,1,145 +0.484375,0.765625,255,14,46 +0.515625,0.765625,193,92,75 +0.546875,0.765625,190,138,64 +0.578125,0.765625,190,187,65 +0.609375,0.765625,155,190,65 +0.640625,0.765625,96,190,63 +0.671875,0.765625,64,190,70 +0.703125,0.765625,64,190,119 +0.734375,0.765625,65,190,175 +0.765625,0.765625,64,172,190 +0.796875,0.765625,64,117,190 +0.828125,0.765625,64,68,190 +0.859375,0.765625,99,63,190 +0.890625,0.765625,158,64,190 +0.921875,0.765625,190,64,186 +0.953125,0.765625,190,64,136 +0.984375,0.765625,193,74,90 +0.015625,0.734375,234,43,13 +0.046875,0.734375,239,135,0 +0.078125,0.734375,238,226,0 +0.109375,0.734375,167,242,0 +0.140625,0.734375,59,232,0 +0.171875,0.734375,0,233,7 +0.203125,0.734375,0,235,99 +0.234375,0.734375,0,246,203 +0.265625,0.734375,0,198,245 +0.296875,0.734375,0,94,234 +0.328125,0.734375,0,5,233 +0.359375,0.734375,63,0,234 +0.390625,0.734375,171,0,244 +0.421875,0.734375,239,0,223 +0.453125,0.734375,239,0,130 +0.484375,0.734375,235,13,41 +0.515625,0.734375,178,83,68 +0.546875,0.734375,179,127,60 +0.578125,0.734375,178,171,59 +0.609375,0.734375,144,182,61 +0.640625,0.734375,87,174,58 +0.671875,0.734375,58,174,62 +0.703125,0.734375,59,176,108 +0.734375,0.734375,61,184,162 +0.765625,0.734375,61,160,182 +0.796875,0.734375,58,105,175 +0.828125,0.734375,58,60,174 +0.859375,0.734375,90,58,175 +0.890625,0.734375,146,61,182 +0.921875,0.734375,180,60,171 +0.953125,0.734375,179,60,125 +0.984375,0.734375,179,68,82 +0.015625,0.703125,207,41,13 +0.046875,0.703125,207,118,1 +0.078125,0.703125,208,197,0 +0.109375,0.703125,148,212,0 +0.140625,0.703125,52,204,0 +0.171875,0.703125,0,204,8 +0.203125,0.703125,0,204,87 +0.234375,0.703125,0,213,176 +0.265625,0.703125,0,174,215 +0.296875,0.703125,0,83,204 +0.328125,0.703125,0,7,203 +0.359375,0.703125,56,0,204 +0.390625,0.703125,150,0,213 +0.421875,0.703125,208,0,195 +0.453125,0.703125,208,0,115 +0.484375,0.703125,207,13,40 +0.515625,0.703125,158,75,61 +0.546875,0.703125,156,111,53 +0.578125,0.703125,156,149,52 +0.609375,0.703125,127,159,53 +0.640625,0.703125,77,153,51 +0.671875,0.703125,51,153,55 +0.703125,0.703125,51,153,94 +0.734375,0.703125,53,160,141 +0.765625,0.703125,54,140,160 +0.796875,0.703125,51,92,153 +0.828125,0.703125,51,55,152 +0.859375,0.703125,79,51,153 +0.890625,0.703125,128,53,160 +0.921875,0.703125,156,52,149 +0.953125,0.703125,156,52,109 +0.984375,0.703125,158,61,75 +0.015625,0.671875,181,37,13 +0.046875,0.671875,181,102,1 +0.078125,0.671875,181,170,1 +0.109375,0.671875,127,182,1 +0.140625,0.671875,46,177,0 +0.171875,0.671875,0,176,7 +0.203125,0.671875,0,178,76 +0.234375,0.671875,0,186,152 +0.265625,0.671875,1,150,185 +0.296875,0.671875,0,71,178 +0.328125,0.671875,0,6,176 +0.359375,0.671875,49,0,176 +0.390625,0.671875,129,0,184 +0.421875,0.671875,181,0,170 +0.453125,0.671875,181,0,100 +0.484375,0.671875,181,13,35 +0.515625,0.671875,138,66,55 +0.546875,0.671875,136,96,46 +0.578125,0.671875,136,130,46 +0.609375,0.671875,109,137,46 +0.640625,0.671875,67,132,44 +0.671875,0.671875,44,132,47 +0.703125,0.671875,44,133,82 +0.734375,0.671875,46,139,122 +0.765625,0.671875,47,121,139 +0.796875,0.671875,44,79,133 +0.828125,0.671875,44,47,132 +0.859375,0.671875,68,44,132 +0.890625,0.671875,110,46,138 +0.921875,0.671875,135,45,129 +0.953125,0.671875,135,45,95 +0.984375,0.671875,138,55,65 +0.015625,0.640625,155,33,13 +0.046875,0.640625,152,88,0 +0.078125,0.640625,153,144,1 +0.109375,0.640625,108,155,0 +0.140625,0.640625,39,149,0 +0.171875,0.640625,0,149,6 +0.203125,0.640625,0,150,64 +0.234375,0.640625,0,157,129 +0.265625,0.640625,1,127,156 +0.296875,0.640625,0,61,150 +0.328125,0.640625,0,5,150 +0.359375,0.640625,41,0,148 +0.390625,0.640625,110,0,155 +0.421875,0.640625,153,0,143 +0.453125,0.640625,153,0,85 +0.484375,0.640625,155,13,31 +0.515625,0.640625,119,59,48 +0.546875,0.640625,114,82,38 +0.578125,0.640625,115,110,39 +0.609375,0.640625,93,116,39 +0.640625,0.640625,56,111,37 +0.671875,0.640625,37,111,40 +0.703125,0.640625,38,113,70 +0.734375,0.640625,39,117,103 +0.765625,0.640625,40,102,117 +0.796875,0.640625,38,68,113 +0.828125,0.640625,37,40,112 +0.859375,0.640625,58,37,111 +0.890625,0.640625,93,39,116 +0.921875,0.640625,114,38,109 +0.953125,0.640625,114,38,80 +0.984375,0.640625,119,48,57 +0.015625,0.609375,129,29,14 +0.046875,0.609375,125,72,0 +0.078125,0.609375,127,118,1 +0.109375,0.609375,88,127,0 +0.140625,0.609375,30,122,0 +0.171875,0.609375,0,122,5 +0.203125,0.609375,0,123,51 +0.234375,0.609375,1,129,106 +0.265625,0.609375,0,104,129 +0.296875,0.609375,0,50,122 +0.328125,0.609375,0,3,123 +0.359375,0.609375,32,0,122 +0.390625,0.609375,90,0,128 +0.421875,0.609375,127,0,119 +0.453125,0.609375,125,0,69 +0.484375,0.609375,130,13,27 +0.515625,0.609375,99,50,42 +0.546875,0.609375,93,67,31 +0.578125,0.609375,95,90,32 +0.609375,0.609375,76,95,32 +0.640625,0.609375,45,91,30 +0.671875,0.609375,30,91,32 +0.703125,0.609375,31,92,56 +0.734375,0.609375,33,97,85 +0.765625,0.609375,32,83,96 +0.796875,0.609375,30,55,91 +0.828125,0.609375,31,32,92 +0.859375,0.609375,46,30,91 +0.890625,0.609375,77,32,96 +0.921875,0.609375,95,32,91 +0.953125,0.609375,93,31,65 +0.984375,0.609375,100,42,49 +0.015625,0.578125,103,26,13 +0.046875,0.578125,98,55,0 +0.078125,0.578125,99,93,0 +0.109375,0.578125,68,100,0 +0.140625,0.578125,24,96,0 +0.171875,0.578125,0,95,4 +0.203125,0.578125,0,95,40 +0.234375,0.578125,1,100,83 +0.265625,0.578125,0,82,101 +0.296875,0.578125,0,38,96 +0.328125,0.578125,0,3,96 +0.359375,0.578125,26,0,97 +0.390625,0.578125,70,0,101 +0.421875,0.578125,99,0,92 +0.453125,0.578125,98,0,54 +0.484375,0.578125,103,13,24 +0.515625,0.578125,80,42,36 +0.546875,0.578125,73,51,24 +0.578125,0.578125,74,71,25 +0.609375,0.578125,59,75,25 +0.640625,0.578125,36,72,24 +0.671875,0.578125,24,71,26 +0.703125,0.578125,24,71,44 +0.734375,0.578125,26,75,66 +0.765625,0.578125,25,65,75 +0.796875,0.578125,24,43,72 +0.828125,0.578125,24,25,72 +0.859375,0.578125,37,24,72 +0.890625,0.578125,60,25,75 +0.921875,0.578125,74,25,70 +0.953125,0.578125,73,24,51 +0.984375,0.578125,80,36,41 +0.015625,0.546875,78,22,13 +0.046875,0.546875,69,40,0 +0.078125,0.546875,69,67,1 +0.109375,0.546875,49,72,1 +0.140625,0.546875,18,69,0 +0.171875,0.546875,0,69,3 +0.203125,0.546875,0,69,29 +0.234375,0.546875,1,72,60 +0.265625,0.546875,1,59,73 +0.296875,0.546875,0,28,70 +0.328125,0.546875,0,2,68 +0.359375,0.546875,18,0,70 +0.390625,0.546875,50,0,72 +0.421875,0.546875,71,0,65 +0.453125,0.546875,70,0,38 +0.484375,0.546875,78,13,22 +0.515625,0.546875,61,34,29 +0.546875,0.546875,51,37,17 +0.578125,0.546875,52,51,18 +0.609375,0.546875,43,54,19 +0.640625,0.546875,26,51,17 +0.671875,0.546875,17,51,18 +0.703125,0.546875,17,51,31 +0.734375,0.546875,19,54,48 +0.765625,0.546875,19,48,55 +0.796875,0.546875,17,31,52 +0.828125,0.546875,17,18,51 +0.859375,0.546875,26,17,52 +0.890625,0.546875,43,18,54 +0.921875,0.546875,53,18,50 +0.953125,0.546875,52,17,36 +0.984375,0.546875,61,29,34 +0.015625,0.515625,41,5,0 +0.046875,0.515625,41,24,0 +0.078125,0.515625,41,40,1 +0.109375,0.515625,29,44,0 +0.140625,0.515625,10,41,0 +0.171875,0.515625,0,41,2 +0.203125,0.515625,0,41,17 +0.234375,0.515625,1,42,36 +0.265625,0.515625,0,35,43 +0.296875,0.515625,0,17,41 +0.328125,0.515625,0,2,41 +0.359375,0.515625,10,0,41 +0.390625,0.515625,30,0,42 +0.421875,0.515625,42,0,39 +0.453125,0.515625,41,0,23 +0.484375,0.515625,41,0,5 +0.515625,0.515625,30,12,10 +0.546875,0.515625,30,22,10 +0.578125,0.515625,31,30,11 +0.609375,0.515625,25,33,11 +0.640625,0.515625,15,30,10 +0.671875,0.515625,10,30,11 +0.703125,0.515625,10,30,18 +0.734375,0.515625,11,31,28 +0.765625,0.515625,11,28,32 +0.796875,0.515625,10,18,30 +0.828125,0.515625,10,11,30 +0.859375,0.515625,15,10,30 +0.890625,0.515625,25,10,31 +0.921875,0.515625,31,10,29 +0.953125,0.515625,30,10,21 +0.984375,0.515625,30,10,12 +0.015625,0.484375,221,204,201 +0.046875,0.484375,232,224,212 +0.078125,0.484375,232,231,212 +0.109375,0.484375,226,232,212 +0.140625,0.484375,216,231,210 +0.171875,0.484375,211,231,212 +0.203125,0.484375,212,232,221 +0.234375,0.484375,212,232,229 +0.265625,0.484375,212,229,232 +0.296875,0.484375,212,219,232 +0.328125,0.484375,211,212,230 +0.359375,0.484375,217,211,231 +0.390625,0.484375,227,212,232 +0.421875,0.484375,232,212,231 +0.453125,0.484375,232,212,223 +0.484375,0.484375,221,203,204 +0.515625,0.484375,215,208,207 +0.546875,0.484375,225,222,217 +0.578125,0.484375,226,226,218 +0.609375,0.484375,224,226,218 +0.640625,0.484375,218,224,217 +0.671875,0.484375,217,225,217 +0.703125,0.484375,217,225,221 +0.734375,0.484375,218,226,225 +0.765625,0.484375,218,225,226 +0.796875,0.484375,217,221,225 +0.828125,0.484375,217,217,224 +0.859375,0.484375,218,217,224 +0.890625,0.484375,224,218,226 +0.921875,0.484375,226,218,226 +0.953125,0.484375,226,218,223 +0.984375,0.484375,215,208,210 +0.015625,0.453125,224,201,197 +0.046875,0.453125,223,211,195 +0.078125,0.453125,223,222,195 +0.109375,0.453125,215,223,195 +0.140625,0.453125,200,219,190 +0.171875,0.453125,193,222,195 +0.203125,0.453125,193,222,206 +0.234375,0.453125,195,223,218 +0.265625,0.453125,195,218,223 +0.296875,0.453125,193,204,221 +0.328125,0.453125,193,195,221 +0.359375,0.453125,201,192,221 +0.390625,0.453125,216,195,223 +0.421875,0.453125,223,195,221 +0.453125,0.453125,223,195,211 +0.484375,0.453125,224,198,201 +0.515625,0.453125,213,207,206 +0.546875,0.453125,212,208,204 +0.578125,0.453125,213,213,204 +0.609375,0.453125,211,212,204 +0.640625,0.453125,204,211,201 +0.671875,0.453125,201,212,203 +0.703125,0.453125,203,212,207 +0.734375,0.453125,204,212,212 +0.765625,0.453125,204,212,213 +0.796875,0.453125,203,207,212 +0.828125,0.453125,201,203,212 +0.859375,0.453125,204,201,212 +0.890625,0.453125,211,204,212 +0.921875,0.453125,212,204,212 +0.953125,0.453125,212,204,208 +0.984375,0.453125,215,207,207 +0.015625,0.421875,213,186,181 +0.046875,0.421875,212,198,177 +0.078125,0.421875,212,212,177 +0.109375,0.421875,203,212,177 +0.140625,0.421875,185,211,174 +0.171875,0.421875,174,211,176 +0.203125,0.421875,176,212,192 +0.234375,0.421875,177,212,207 +0.265625,0.421875,177,207,212 +0.296875,0.421875,176,190,212 +0.328125,0.421875,175,177,211 +0.359375,0.421875,185,174,211 +0.390625,0.421875,204,177,212 +0.421875,0.421875,212,177,211 +0.453125,0.421875,212,177,198 +0.484375,0.421875,213,181,186 +0.515625,0.421875,204,193,192 +0.546875,0.421875,201,195,188 +0.578125,0.421875,201,201,188 +0.609375,0.421875,198,201,188 +0.640625,0.421875,190,198,186 +0.671875,0.421875,187,198,188 +0.703125,0.421875,188,200,193 +0.734375,0.421875,188,201,198 +0.765625,0.421875,188,198,201 +0.796875,0.421875,188,193,200 +0.828125,0.421875,187,188,198 +0.859375,0.421875,190,186,198 +0.890625,0.421875,198,188,201 +0.921875,0.421875,201,188,200 +0.953125,0.421875,201,188,195 +0.984375,0.421875,204,192,193 +0.015625,0.390625,207,171,165 +0.046875,0.390625,204,185,160 +0.078125,0.390625,204,201,160 +0.109375,0.390625,190,204,160 +0.140625,0.390625,167,201,155 +0.171875,0.390625,157,201,160 +0.203125,0.390625,158,203,178 +0.234375,0.390625,160,204,198 +0.265625,0.390625,159,197,203 +0.296875,0.390625,158,177,203 +0.328125,0.390625,158,160,203 +0.359375,0.390625,170,156,201 +0.390625,0.390625,192,159,203 +0.421875,0.390625,204,160,201 +0.453125,0.390625,204,160,185 +0.484375,0.390625,206,164,170 +0.515625,0.390625,192,180,178 +0.546875,0.390625,188,182,174 +0.578125,0.390625,188,188,174 +0.609375,0.390625,186,190,175 +0.640625,0.390625,175,186,170 +0.671875,0.390625,172,187,173 +0.703125,0.390625,173,188,180 +0.734375,0.390625,174,188,187 +0.765625,0.390625,174,187,188 +0.796875,0.390625,173,179,188 +0.828125,0.390625,173,174,188 +0.859375,0.390625,176,171,186 +0.890625,0.390625,185,174,188 +0.921875,0.390625,188,174,188 +0.953125,0.390625,188,174,182 +0.984375,0.390625,192,178,180 +0.015625,0.359375,197,155,148 +0.046875,0.359375,195,173,143 +0.078125,0.359375,195,193,143 +0.109375,0.359375,180,195,143 +0.140625,0.359375,153,192,138 +0.171875,0.359375,139,192,143 +0.203125,0.359375,140,193,164 +0.234375,0.359375,141,193,187 +0.265625,0.359375,141,186,193 +0.296875,0.359375,140,163,193 +0.328125,0.359375,141,143,193 +0.359375,0.359375,155,138,192 +0.390625,0.359375,180,141,193 +0.421875,0.359375,193,141,192 +0.453125,0.359375,193,141,172 +0.484375,0.359375,197,148,153 +0.515625,0.359375,181,167,164 +0.546875,0.359375,177,170,160 +0.578125,0.359375,177,176,160 +0.609375,0.359375,172,177,160 +0.640625,0.359375,160,174,156 +0.671875,0.359375,157,175,158 +0.703125,0.359375,157,175,165 +0.734375,0.359375,159,177,174 +0.765625,0.359375,159,174,177 +0.796875,0.359375,157,165,175 +0.828125,0.359375,158,159,176 +0.859375,0.359375,162,156,174 +0.890625,0.359375,172,159,177 +0.921875,0.359375,177,159,176 +0.953125,0.359375,177,159,169 +0.984375,0.359375,181,164,166 +0.015625,0.328125,188,139,131 +0.046875,0.328125,185,160,125 +0.078125,0.328125,185,182,125 +0.109375,0.328125,167,185,125 +0.140625,0.328125,137,181,119 +0.171875,0.328125,121,182,125 +0.203125,0.328125,122,182,149 +0.234375,0.328125,124,184,175 +0.265625,0.328125,125,176,185 +0.296875,0.328125,122,148,182 +0.328125,0.328125,121,124,182 +0.359375,0.328125,138,119,181 +0.390625,0.328125,169,125,185 +0.421875,0.328125,185,125,182 +0.453125,0.328125,185,125,159 +0.484375,0.328125,188,132,139 +0.515625,0.328125,169,153,150 +0.546875,0.328125,165,157,145 +0.578125,0.328125,165,164,145 +0.609375,0.328125,159,165,145 +0.640625,0.328125,146,160,140 +0.671875,0.328125,141,162,141 +0.703125,0.328125,141,163,150 +0.734375,0.328125,144,164,160 +0.765625,0.328125,145,162,165 +0.796875,0.328125,141,150,163 +0.828125,0.328125,141,141,162 +0.859375,0.328125,146,140,160 +0.890625,0.328125,160,145,165 +0.921875,0.328125,165,145,164 +0.953125,0.328125,165,145,156 +0.984375,0.328125,170,150,153 +0.015625,0.296875,179,123,114 +0.046875,0.296875,174,146,105 +0.078125,0.296875,175,173,106 +0.109375,0.296875,156,175,106 +0.140625,0.296875,121,171,99 +0.171875,0.296875,101,172,106 +0.203125,0.296875,102,173,134 +0.234375,0.296875,106,175,166 +0.265625,0.296875,106,165,175 +0.296875,0.296875,102,133,173 +0.328125,0.296875,102,106,173 +0.359375,0.296875,122,99,171 +0.390625,0.296875,157,106,175 +0.421875,0.296875,175,106,172 +0.453125,0.296875,175,106,145 +0.484375,0.296875,179,114,122 +0.515625,0.296875,157,138,135 +0.546875,0.296875,150,141,128 +0.578125,0.296875,152,150,129 +0.609375,0.296875,146,152,129 +0.640625,0.296875,130,146,123 +0.671875,0.296875,125,149,127 +0.703125,0.296875,125,149,136 +0.734375,0.296875,129,152,149 +0.765625,0.296875,129,149,152 +0.796875,0.296875,125,135,149 +0.828125,0.296875,125,126,149 +0.859375,0.296875,131,123,146 +0.890625,0.296875,146,129,152 +0.921875,0.296875,152,129,150 +0.953125,0.296875,152,129,141 +0.984375,0.296875,157,135,138 +0.015625,0.265625,171,109,98 +0.046875,0.265625,166,134,90 +0.078125,0.265625,166,164,90 +0.109375,0.265625,144,166,90 +0.140625,0.265625,109,165,89 +0.171875,0.265625,89,166,93 +0.203125,0.265625,89,166,122 +0.234375,0.265625,90,166,156 +0.265625,0.265625,90,155,166 +0.296875,0.265625,89,121,166 +0.328125,0.265625,89,91,166 +0.359375,0.265625,110,89,165 +0.390625,0.265625,146,90,166 +0.421875,0.265625,166,90,163 +0.453125,0.265625,166,90,133 +0.484375,0.265625,171,98,108 +0.515625,0.265625,146,126,122 +0.546875,0.265625,141,130,115 +0.578125,0.265625,141,140,115 +0.609375,0.265625,134,141,115 +0.640625,0.265625,121,140,114 +0.671875,0.265625,114,140,115 +0.703125,0.265625,114,140,125 +0.734375,0.265625,115,141,138 +0.765625,0.265625,115,137,141 +0.796875,0.265625,114,125,140 +0.828125,0.265625,114,115,140 +0.859375,0.265625,121,114,140 +0.890625,0.265625,134,115,141 +0.921875,0.265625,141,115,140 +0.953125,0.265625,141,115,130 +0.984375,0.265625,146,122,125 +0.015625,0.234375,156,99,90 +0.046875,0.234375,155,123,83 +0.078125,0.234375,155,150,83 +0.109375,0.234375,135,158,85 +0.140625,0.234375,99,150,81 +0.171875,0.234375,81,150,83 +0.203125,0.234375,82,153,112 +0.234375,0.234375,86,160,146 +0.265625,0.234375,85,145,159 +0.296875,0.234375,82,110,152 +0.328125,0.234375,81,82,150 +0.359375,0.234375,101,82,152 +0.390625,0.234375,136,85,158 +0.421875,0.234375,156,84,150 +0.453125,0.234375,155,83,122 +0.484375,0.234375,157,91,99 +0.515625,0.234375,134,115,112 +0.546875,0.234375,131,120,107 +0.578125,0.234375,131,130,107 +0.609375,0.234375,126,134,109 +0.640625,0.234375,110,128,104 +0.671875,0.234375,104,128,105 +0.703125,0.234375,105,129,115 +0.734375,0.234375,110,135,131 +0.765625,0.234375,110,130,135 +0.796875,0.234375,105,115,129 +0.828125,0.234375,104,104,128 +0.859375,0.234375,111,105,129 +0.890625,0.234375,126,109,134 +0.921875,0.234375,132,108,130 +0.953125,0.234375,131,107,120 +0.984375,0.234375,135,113,115 +0.015625,0.203125,138,89,80 +0.046875,0.203125,135,108,73 +0.078125,0.203125,136,132,73 +0.109375,0.203125,118,138,74 +0.140625,0.203125,86,132,71 +0.171875,0.203125,71,132,73 +0.203125,0.203125,71,133,97 +0.234375,0.203125,75,139,127 +0.265625,0.203125,75,127,140 +0.296875,0.203125,71,96,133 +0.328125,0.203125,71,73,132 +0.359375,0.203125,88,71,132 +0.390625,0.203125,120,75,139 +0.421875,0.203125,136,73,132 +0.453125,0.203125,136,73,107 +0.484375,0.203125,138,80,88 +0.515625,0.203125,119,102,99 +0.546875,0.203125,115,106,94 +0.578125,0.203125,115,114,94 +0.609375,0.203125,110,117,95 +0.640625,0.203125,96,112,91 +0.671875,0.203125,91,112,92 +0.703125,0.203125,92,113,101 +0.734375,0.203125,96,118,114 +0.765625,0.203125,96,114,118 +0.796875,0.203125,92,100,113 +0.828125,0.203125,91,92,112 +0.859375,0.203125,97,91,112 +0.890625,0.203125,111,96,118 +0.921875,0.203125,115,94,114 +0.953125,0.203125,115,94,105 +0.984375,0.203125,119,99,102 +0.015625,0.171875,122,78,72 +0.046875,0.171875,118,94,64 +0.078125,0.171875,118,114,64 +0.109375,0.171875,102,119,64 +0.140625,0.171875,76,115,62 +0.171875,0.171875,61,114,63 +0.203125,0.171875,62,116,85 +0.234375,0.171875,65,121,110 +0.265625,0.171875,65,109,120 +0.296875,0.171875,62,84,116 +0.328125,0.171875,61,63,114 +0.359375,0.171875,76,61,114 +0.390625,0.171875,102,64,119 +0.421875,0.171875,117,63,114 +0.453125,0.171875,117,63,93 +0.484375,0.171875,122,72,78 +0.515625,0.171875,105,91,88 +0.546875,0.171875,100,92,82 +0.578125,0.171875,100,99,82 +0.609375,0.171875,95,101,83 +0.640625,0.171875,84,97,79 +0.671875,0.171875,79,97,80 +0.703125,0.171875,80,98,88 +0.734375,0.171875,83,102,98 +0.765625,0.171875,83,98,102 +0.796875,0.171875,80,87,98 +0.828125,0.171875,79,80,97 +0.859375,0.171875,84,79,97 +0.890625,0.171875,95,82,101 +0.921875,0.171875,99,81,98 +0.953125,0.171875,99,81,91 +0.984375,0.171875,105,88,90 +0.015625,0.140625,105,68,62 +0.046875,0.140625,99,80,53 +0.078125,0.140625,100,97,54 +0.109375,0.140625,87,101,54 +0.140625,0.140625,64,97,52 +0.171875,0.140625,52,97,54 +0.203125,0.140625,53,98,72 +0.234375,0.140625,55,102,94 +0.265625,0.140625,55,93,102 +0.296875,0.140625,53,71,98 +0.328125,0.140625,52,54,97 +0.359375,0.140625,63,51,96 +0.390625,0.140625,87,54,101 +0.421875,0.140625,99,53,96 +0.453125,0.140625,99,53,79 +0.484375,0.140625,105,62,68 +0.515625,0.140625,91,78,77 +0.546875,0.140625,83,77,68 +0.578125,0.140625,84,83,69 +0.609375,0.140625,80,85,69 +0.640625,0.140625,71,82,67 +0.671875,0.140625,67,82,68 +0.703125,0.140625,68,83,74 +0.734375,0.140625,70,86,83 +0.765625,0.140625,70,83,86 +0.796875,0.140625,68,74,83 +0.828125,0.140625,67,68,82 +0.859375,0.140625,70,66,81 +0.890625,0.140625,80,69,85 +0.921875,0.140625,84,68,83 +0.953125,0.140625,84,68,77 +0.984375,0.140625,91,77,78 +0.015625,0.109375,88,59,54 +0.046875,0.109375,81,65,43 +0.078125,0.109375,83,80,45 +0.109375,0.109375,70,82,44 +0.140625,0.109375,51,79,42 +0.171875,0.109375,42,79,43 +0.203125,0.109375,43,80,58 +0.234375,0.109375,46,84,77 +0.265625,0.109375,45,76,84 +0.296875,0.109375,42,57,79 +0.328125,0.109375,43,44,80 +0.359375,0.109375,52,42,79 +0.390625,0.109375,72,45,83 +0.421875,0.109375,82,44,79 +0.453125,0.109375,81,43,64 +0.484375,0.109375,89,54,58 +0.515625,0.109375,77,67,65 +0.546875,0.109375,69,63,56 +0.578125,0.109375,70,69,57 +0.609375,0.109375,66,70,57 +0.640625,0.109375,58,67,55 +0.671875,0.109375,55,67,55 +0.703125,0.109375,55,67,60 +0.734375,0.109375,58,71,69 +0.765625,0.109375,58,68,71 +0.796875,0.109375,55,60,67 +0.828125,0.109375,55,55,67 +0.859375,0.109375,58,55,67 +0.890625,0.109375,66,57,70 +0.921875,0.109375,70,57,69 +0.953125,0.109375,69,56,63 +0.984375,0.109375,77,65,66 +0.015625,0.078125,72,48,44 +0.046875,0.078125,63,50,34 +0.078125,0.078125,64,62,34 +0.109375,0.078125,55,65,35 +0.140625,0.078125,40,62,33 +0.171875,0.078125,33,62,34 +0.203125,0.078125,33,62,45 +0.234375,0.078125,35,65,60 +0.265625,0.078125,35,59,65 +0.296875,0.078125,33,44,62 +0.328125,0.078125,33,34,62 +0.359375,0.078125,42,34,63 +0.390625,0.078125,56,35,65 +0.421875,0.078125,64,34,62 +0.453125,0.078125,63,34,50 +0.484375,0.078125,72,44,48 +0.515625,0.078125,62,54,53 +0.546875,0.078125,54,50,44 +0.578125,0.078125,54,53,44 +0.609375,0.078125,52,55,45 +0.640625,0.078125,45,53,43 +0.671875,0.078125,42,52,42 +0.703125,0.078125,42,52,46 +0.734375,0.078125,45,55,53 +0.765625,0.078125,45,53,55 +0.796875,0.078125,43,47,53 +0.828125,0.078125,43,43,53 +0.859375,0.078125,46,43,53 +0.890625,0.078125,52,45,55 +0.921875,0.078125,54,44,53 +0.953125,0.078125,54,44,50 +0.984375,0.078125,62,53,54 +0.015625,0.046875,56,39,36 +0.046875,0.046875,45,36,24 +0.078125,0.046875,45,44,25 +0.109375,0.046875,40,47,26 +0.140625,0.046875,29,45,24 +0.171875,0.046875,24,45,25 +0.203125,0.046875,24,45,33 +0.234375,0.046875,26,47,43 +0.265625,0.046875,26,44,48 +0.296875,0.046875,24,32,45 +0.328125,0.046875,24,25,44 +0.359375,0.046875,29,24,45 +0.390625,0.046875,40,25,47 +0.421875,0.046875,46,25,44 +0.453125,0.046875,45,24,35 +0.484375,0.046875,55,36,39 +0.515625,0.046875,49,43,42 +0.546875,0.046875,38,35,31 +0.578125,0.046875,38,38,31 +0.609375,0.046875,38,40,33 +0.640625,0.046875,33,38,31 +0.671875,0.046875,31,38,31 +0.703125,0.046875,31,38,34 +0.734375,0.046875,33,40,39 +0.765625,0.046875,33,39,40 +0.796875,0.046875,31,34,38 +0.828125,0.046875,30,30,37 +0.859375,0.046875,33,31,38 +0.890625,0.046875,37,32,39 +0.921875,0.046875,39,32,38 +0.953125,0.046875,38,31,35 +0.984375,0.046875,48,41,42 +0.015625,0.015625,0,0,0 +0.046875,0.015625,4,4,4 +0.078125,0.015625,9,9,9 +0.109375,0.015625,15,15,15 +0.140625,0.015625,21,21,21 +0.171875,0.015625,28,28,28 +0.203125,0.015625,36,36,36 +0.234375,0.015625,44,44,44 +0.265625,0.015625,52,52,52 +0.296875,0.015625,60,60,60 +0.328125,0.015625,69,69,69 +0.359375,0.015625,79,79,79 +0.390625,0.015625,88,88,88 +0.421875,0.015625,98,98,98 +0.453125,0.015625,108,108,108 +0.484375,0.015625,118,118,118 +0.515625,0.015625,128,128,128 +0.546875,0.015625,137,137,137 +0.578125,0.015625,146,146,146 +0.609375,0.015625,157,157,157 +0.640625,0.015625,167,167,167 +0.671875,0.015625,176,176,176 +0.703125,0.015625,186,186,186 +0.734375,0.015625,195,195,195 +0.765625,0.015625,203,203,203 +0.796875,0.015625,211,211,211 +0.828125,0.015625,218,218,218 +0.859375,0.015625,227,227,227 +0.890625,0.015625,234,234,234 +0.921875,0.015625,239,239,239 +0.953125,0.015625,246,246,246 +0.984375,0.015625,250,250,250 diff --git a/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/ColorPalette_01.png b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/ColorPalette_01.png new file mode 100644 index 0000000000000000000000000000000000000000..a1bae62ae6e5dfc873380cc8becf0e2e9115a014 GIT binary patch literal 9972 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 literal 0 HcmV?d00001 diff --git a/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/CubeProjection.py b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/CubeProjection.py new file mode 100644 index 0000000..5e6ca15 --- /dev/null +++ b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/CubeProjection.py @@ -0,0 +1,94 @@ +import bpy +from math import pi + +L1960_Arr_PlainData = [ + ["Proj_Empty_01", (0, 0, 2), (0, 0, 0)], + ["Proj_Empty_02", (2, 0, 0), ((pi * 90 / 180), 0, (pi * 90 / 180))], + ["Proj_Empty_03", (0, 2, 0), ((pi * 90 / 180), 0, (pi * 180 / 180))], + ["Proj_Empty_04", (0, 0, -2), ((pi * 180 / 180), 0, 0)], + ["Proj_Empty_05", (-2, 0, 0), ((pi * 90 / 180), 0, (pi * -90 / 180))], + ["Proj_Empty_06", (0, -2, 0), ((pi * 90 / 180), 0, 0)] +] + +class MESH_OT_add_auto_cube_projection(bpy.types.Operator): + """Check Empty´s for projecting, if not existing create new one´s""" + + bl_idname = "mesh.add_auto_cube_projection" + bl_label = "Add Plain_Axes to scene" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context): + + scene = context.scene + oldSelection = context.selected_objects + oldActive = context.active_object + + for EmptyData in L1960_Arr_PlainData: + + EmptyName = EmptyData[0] + EmptyLocation = EmptyData[1] + EmptyRotation = EmptyData[2] + + if not scene.objects.get(EmptyName): + bpy.ops.object.empty_add(type='PLAIN_AXES', align='WORLD', location=EmptyLocation, scale=(1, 1, 1), rotation=EmptyRotation) + empty = context.active_object + empty.name = EmptyName + empty.hide_select = True + empty.hide_set(True) + + #Change back to old selection and select old active + for obj in oldSelection: + obj.select_set(True) + context.view_layer.objects.active = oldActive + + self.report({'INFO'}, 'Added/Fixed Emptys for Projection to Scene') + return {"FINISHED"} + +class MESH_OT_add_modifier_to_mesh(bpy.types.Operator): + """Add Modifier to selected Mesh´s and prepare UV-Maps""" + + bl_idname = "mesh.add_modifier_to_mesh" + bl_label = "Add Modifier to selected Mesh" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context): + + newModifierName = "CubeTexModifier" + arr_obj = context.selected_objects + if not arr_obj: + self.report({'WARNING'}, 'Select a mesh to add the UVProject-Modifier') + return {"CANCELLED"} + + empty_objs = [emp_obj for emp_obj in context.scene.objects if emp_obj.name.startswith("Proj_Empty")] + if len(empty_objs) < 6: + self.report({'WARNING'}, 'Create/Recreate projectors, they need to be set up first!') + return {"CANCELLED"}; + + for obj in arr_obj: + + if obj.data.uv_layers.get("UVMap"): + obj.data.uv_layers['UVMap'].name = 'UVMap0' + + if not obj.data.uv_layers.get("UVMap0"): + obj.data.uv_layers.new(name = 'UVMap0') + + if not obj.data.uv_layers.get("UVMap1"): + obj.data.uv_layers.new(name = 'UVMap1') + + + if obj.type == "MESH" and newModifierName not in obj.modifiers: + obj.modifiers.new(type='UV_PROJECT', name=newModifierName) + mod = obj.modifiers[newModifierName] + mod.uv_layer = "UVMap1" + mod.projector_count = 6 + + i = 0 + for p in mod.projectors: + p.object = bpy.data.objects[L1960_Arr_PlainData[i][0]] + i = i+1 + else: + self.report({'INFO'}, 'UVProject-Modifier allready set') + return {"FINISHED"} + + self.report({'INFO'}, 'Added UVProject-Modifier to mesh') + return {"FINISHED"} diff --git a/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/Dekogon.py b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/Dekogon.py new file mode 100644 index 0000000..92688b1 --- /dev/null +++ b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/Dekogon.py @@ -0,0 +1,187 @@ +import bpy +import re +import os + +### GROUP OBJECTS TO COLLECTIONS ### + +class MESH_OT_group_objects_in_collections(bpy.types.Operator): + """Groups objects by name into seperate collections, usefull for Unreal Decogon import""" + + bl_idname = "mesh.group_objects_in_collections" + bl_label = "Groups objects by name into seperate collections, usefull for Unreal Decogon import" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context): + # Erstellen einer leeren Dictionary zur Speicherung der Collections nach Basisnamen + collection_dict = {} + + # Durchlaufen aller Objekte in der Szene + for obj in context.scene.objects: + # Überprüfen, ob das Objekt ein leeres Elternobjekt ist + if obj.type == 'EMPTY': + # Anwenden der Regex auf den Objektnamen + match = re.match(r'^(.*?)_(.*?)_(\d+)([a-zA-Z]+)$', obj.name) + if match: + prefix = match.group(1) + name = match.group(2) + number = match.group(3) + letter = match.group(4) + + # Extrahieren des Basisnamens für die Collection + base_name = f"L1960_{name}" + + # Hinzufügen des Objekts zur entsprechenden Liste in der Dictionary + if base_name not in collection_dict: + collection_dict[base_name] = {} + if number not in collection_dict[base_name]: + collection_dict[base_name][number] = {} + if letter not in collection_dict[base_name][number]: + collection_dict[base_name][number][letter] = {'empty': obj, 'children': []} + + # Durchlaufen der Dictionary und Erstellen der Collections + for base_name, number_dict in collection_dict.items(): + # Erstellen einer neuen Collection für den Basisnamen + base_collection = bpy.data.collections.new(base_name) + bpy.context.scene.collection.children.link(base_collection) + + # Durchlaufen der sortierten Liste der Objekte und Verschieben in die Collections + for number, letter_dict in number_dict.items(): + # Erstellen einer Collection für die Nummer und Verschieben des leeren Elternobjekts dorthin + number_collection = bpy.data.collections.new(f"{base_name}_{number}") + base_collection.children.link(number_collection) + + # Durchlaufen der Buchstaben und Erstellen der Buchstaben-Collection unter der Nummer + for letter, obj_data in letter_dict.items(): + empty = obj_data['empty'] + children = empty.children + + letter_collection = bpy.data.collections.new(f"{base_name}_{number}{letter}") + number_collection.children.link(letter_collection) + + # Verschieben des leeren Elternobjekts in die entsprechende Collection + letter_collection.objects.link(empty) + + # Verschieben der Kinder des leeren Elternobjekts in die entsprechende Collection + for child in children: + letter_collection.objects.link(child) + + # Entfernen des leeren Elternobjekts und seiner Kinder aus der Szene + bpy.context.collection.objects.unlink(empty) + for child in children: + bpy.context.collection.objects.unlink(child) + + # ------------------------------------------------------------------------------------------- + # Regular expression pattern to match any _LOD1, _LOD2, etc., but not _LOD0 + pattern = re.compile(r"_LOD[1-9]\d*$") + + # Loop through all objects in the scene + for obj in bpy.context.scene.objects: + # If the object name matches the pattern, hide it + if pattern.search(obj.name): + obj.hide_set(True) # This hides the object in the viewport + else: + obj.hide_set(False) # Ensure _LOD0 objects remain visible + + # Update the view layer to reflect changes + bpy.context.view_layer.update() + + self.report({'INFO'}, 'All objects sorted') + return {"FINISHED"} + + +### ASSIGN TEXTURES ### + +class MESH_OT_assign_textures(bpy.types.Operator): + """Assign Textures to Mesh´s, usefull for Unreal Decogon import""" + + bl_idname = "mesh.assign_textures" + bl_label = "Assign Textures to Mesh´s, usefull for Unreal Decogon import" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context): + + # Define the path to the folder containing your textures + texture_folder_path = context.scene.dekogon_file_path + + texture_prefix = context.scene.dekogon_settings_prefix + if texture_prefix != "": + if texture_prefix[-1] != "_": + texture_prefix = texture_prefix + "_" + + texture_suffix = context.scene.dekogon_settings_suffix + if texture_suffix != "": + if texture_suffix[0] != "_": + texture_suffix = "_" + texture_suffix + + texture_filetype = context.scene.dekogon_settings_filetype + + if not os.path.exists(texture_folder_path): + self.report({'ERROR'}, f"The texture folder path '{texture_folder_path}' does not exist.") + return {"FINISHED"} + else: + self.report({'INFO'}, f"Texture folder path: {texture_folder_path}") + # List all files in the texture folder for debugging purposes + #texture_files = os.listdir(texture_folder_path) + #self.report({'INFO'}, "Files in texture folder:") + #for f in texture_files: + # print(f" - {f}") + + # Iterate over all materials in the Blender file + for material in bpy.data.materials: + self.report({'INFO'}, f"Processing material: {material.name}") + # Ensure the material uses nodes + if not material.use_nodes: + material.use_nodes = True + self.report({'INFO'}, f"Enabled nodes for material: {material.name}") + + # Get the node tree of the material + if material.node_tree is None: + self.report({'WARNING'}, f"Material {material.name} has no node tree.") + continue + + nodes = material.node_tree.nodes + + # Find or create an Image Texture node + image_texture_node = None + for node in nodes: + if node.type == 'TEX_IMAGE': + image_texture_node = node + break + if image_texture_node is None: + image_texture_node = nodes.new(type='ShaderNodeTexImage') + self.report({'INFO'}, f"Created new Image Texture node for material: {material.name}") + else: + self.report({'INFO'}, f"Found existing Image Texture node for material: {material.name}") + + # Construct the expected texture filename based on the material name + texture_filename = f"{texture_prefix}{material.name}{texture_suffix}.{texture_filetype}" + texture_filepath = os.path.join(texture_folder_path, texture_filename) + self.report({'INFO'}, f"Looking for texture: {texture_filepath}") + + # Check if the texture file exists + if os.path.exists(texture_filepath): + try: + # Load the image and assign it to the Image Texture node + image = bpy.data.images.load(texture_filepath) + image_texture_node.image = image + self.report({'INFO'}, f"Loaded texture: {texture_filename} for material: {material.name}") + + # Link the Image Texture node to the Base Color of the Principled BSDF shader + principled_node = None + for node in nodes: + if node.type == 'BSDF_PRINCIPLED': + principled_node = node + break + if principled_node is not None: + links = material.node_tree.links + links.new(image_texture_node.outputs['Color'], principled_node.inputs['Base Color']) + self.report({'INFO'}, f"Linked texture to Principled BSDF for material: {material.name}") + else: + self.report({'WARNING'}, f"No Principled BSDF node found for material: {material.name}") + except RuntimeError as e: + self.report({'ERROR'}, f"Failed to load image {texture_filename}: {e}") + else: + self.report({'WARNING'}, "Texture file not found for material {material.name}: {texture_filename}") + + self.report({'INFO'}, 'Texture assignment complete.') + return {"FINISHED"} \ No newline at end of file diff --git a/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/Helper.py b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/Helper.py new file mode 100644 index 0000000..388226a --- /dev/null +++ b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/Helper.py @@ -0,0 +1,139 @@ +import bpy +import bmesh + +### FIX MATERIALS ### + +class MESH_OT_fix_material_names(bpy.types.Operator): + """Fixes the material naming, if duplicated are present e.g. Material.001, Material.002 ...""" + + bl_idname = "mesh.fix_material_names" + bl_label = "Fixes the material naming, if duplicated are present" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context): + #Remove all duplicated materials + self.merge_duplicated_materials() + + #Merge material slots for every mesh in the scene + for obj in bpy.context.scene.objects: + if obj.type == "MESH": + self.merge_material_slots(obj) + + + self.report({'INFO'}, 'All duplicated Materials fixed') + return {"FINISHED"} + + def merge_duplicated_materials(self): + for material in bpy.data.materials: + #Remove MI for Dekogon material names + if material.name.split('_')[0] == 'MI': + material.name = material.name[3:] + #Check for .001 at end and remove + if material.name[-3:].isnumeric(): + opti_matName = material.name[:-4] + if bpy.data.materials.get(opti_matName): #check if og_mat exists + material.user_remap(bpy.data.materials.get(opti_matName)) + print("Removed Material: " + material.name) + bpy.data.materials.remove(material) + else: + material.name = opti_matName + + def merge_material_slots(self, obj): + duplicated_material_list = [] + + #create list with indexes of material slots with the same name and merge them + for og_slot in obj.material_slots: + for slot in obj.material_slots: + if slot.name == og_slot.name: + if slot.slot_index == og_slot.slot_index: + continue + if og_slot.slot_index in duplicated_material_list: + continue + duplicated_material_list.append(int(slot.slot_index)) + + #delete all material slots within list + for slot_index in sorted(duplicated_material_list, reverse=True): + obj.data.materials.pop(index = slot_index) + + +### FIX NAMING CONVENTIONS ### + +class MESH_OT_fix_naming_conventions(bpy.types.Operator): + """Changes . to _ to solve naming issues with workbench""" + + bl_idname = "mesh.fix_naming_convention" + bl_label = "Changes . to _ to solve naming issues with workbench" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context): + for obj in bpy.data.objects: + obj.name = obj.name.replace(".","_") + + self.report({'INFO'}, 'Fixed Naming') + return {"FINISHED"} + +class MESH_OT_generate_empty_for_mesh(bpy.types.Operator): + """Generates a Empty with the objects name at it´s position""" + + bl_idname = "mesh.generate_empty_for_mesh" + bl_label = "Generates a Empty with the objects name at it´s position" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context): + scene = bpy.context.scene + Selection = bpy.context.selected_objects + FilteredSelection = [obj for obj in Selection if obj.type != 'EMPTY'] + ActiveObj = bpy.context.active_object + + for obj in FilteredSelection: + oldEmpty = scene.objects.get("Socket_" + obj.name) + if oldEmpty: + oldEmpty.location = obj.location + oldEmpty.rotation_euler = obj.rotation_euler + else: + obj.select_set(True) + bpy.ops.object.empty_add(type='PLAIN_AXES', align='WORLD', location=obj.location, scale=(1, 1, 1), rotation=obj.rotation_euler) + empty = bpy.context.active_object + empty.name = "Socket_" + obj.name + + #Change back to selection and select old active + bpy.ops.object.select_all(action='DESELECT') + + self.report({'INFO'}, 'Generated Emptys for selectes Meshes in Scene') + return {"FINISHED"} + +class MESH_OT_select_face_id(bpy.types.Operator): + """Highlights Face with given ID""" + + bl_idname = "mesh.select_face_id" + bl_label = "Highlight/Select Face with given Index" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context): + EditObj = bpy.context.active_object + + face_Index = int(context.scene.face_id_field) + + if EditObj != None: + bpy.ops.object.mode_set(mode='EDIT') + bpy.ops.mesh.select_all(action='DESELECT') + bm = bmesh.from_edit_mesh(EditObj.data) + bm.faces.ensure_lookup_table() + + for area in bpy.context.screen.areas: + if area.type == 'VIEW_3D': + for space in area.spaces: + if space.type == 'VIEW_3D': + space.shading.type = 'WIREFRAME' + try: + bm.faces[face_Index].select = True + bmesh.update_edit_mesh(EditObj.data) + + self.report({'INFO'}, f'Highlighted Face with Index: {face_Index}') + return {"FINISHED"} + except IndexError: + self.report({'INFO'}, f'Index: {face_Index} out of range!') + return {"FINISHED"} + else: + self.report({'INFO'}, 'Please select a Mesh first.') + return {"FINISHED"} \ No newline at end of file diff --git a/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/MaterialToMask.py b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/MaterialToMask.py new file mode 100644 index 0000000..a58ffb2 --- /dev/null +++ b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/MaterialToMask.py @@ -0,0 +1,244 @@ +import bpy +import bmesh + +# Callback for Enum Items +def get_uv_layers(self, context): + items = [] + obj = context.object + + if obj and obj.type == 'MESH' and obj.data.uv_layers: + for i, uv in enumerate(obj.data.uv_layers): + items.append((str(i), uv.name, f"UV Layer {i}")) + else: + items.append(("NONE", "No UVs", "No UV available within Mesh")) + + return items + +class UVEnumProperties(bpy.types.PropertyGroup): + uv_enum: bpy.props.EnumProperty(name="MASK UV Map", description="Select Mask UV-Layer", items=get_uv_layers, default=0) + +class MESH_OT_merge_materials_to_mask(bpy.types.Operator): + """Merges 4 Materials into one Material (Mask)""" + + bl_idname = "mesh.merge_materials_to_mask" + bl_label = "Merges 4 Materials into one Material (Mask)" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context): + scene = context.scene + ts = scene.tool_settings + arr_obj = context.selected_objects + activeObj = context.active_object + + # Get all inputs from user + selected_uv = context.scene.settings_uv_enum_props.uv_enum + ignore_custom = context.scene.settings_multi_ignor + mat_nameing = context.scene.settings_mat_nameing + island_margin_custom = context.scene.settings_uv_island_margin_slider + + # Scale and offset for UV allignment + SCALE = 0.5 + OFFSETS = [ + (0.0, 0.5), + (0.5, 0.5), + (0.0, 0.0), + (0.5, 0.0) + ] + IGNORE = ["glass", "glas", "grass", "gras", "atlas"] + if ignore_custom.strip(): + IGNORE.extend(ignore_custom.split(",")) + + # No Mesh selected + if not arr_obj: + self.report({'WARNING'}, 'Select one mesh') + return {"CANCELLED"} + + # Only one Mesh selected? + if len(arr_obj) > 1: + self.report({'WARNING'}, 'Only one Mesh can be selected') + return {"CANCELLED"} + + obj = arr_obj[0] + + # UV Maps present? + if not obj.data.uv_layers or not selected_uv: + self.report({'WARNING'}, 'No UV-Map selected') + return {"CANCELLED"} + + obj.data.uv_layers.active_index = int(selected_uv) + + # Deactivate uv Select Sync in UV Editor. Makes Problems + old_ts_state = ts.use_uv_select_sync + ts.use_uv_select_sync = False + + skip = 0 + idx_multi = None + idx_multi_name = 1 + delete = [] + + # Loop through all Materials + for i, slot in enumerate(obj.material_slots): + + # Skip Materials in static ignore list or user ignore list + if any(str(name).lower() in slot.material.name.lower() for name in IGNORE): + self.report({'INFO'}, f'Material "{slot.material.name}" skipped.') + skip += 1 + continue + + # Switch to edit mode + bpy.ops.object.mode_set(mode='EDIT') + + # Create bmesh to work with + bm = bmesh.from_edit_mesh(obj.data) + uv_layer = bm.loops.layers.uv.active + + # Deselect all + bpy.ops.mesh.select_all(action='DESELECT') + + if slot.material: + # Select Mat slot + obj.active_material_index = i + + # Select all Faces of Mat + bpy.ops.object.material_slot_select() + + # If UV has assigned faces + if any(f.select for f in bm.faces): + # Repack UV Islands + bpy.ops.uv.select_all(action='SELECT') + bpy.ops.uv.pack_islands(margin=island_margin_custom) + + # Select Offset + group = (i - skip) % len(OFFSETS) + offset = OFFSETS[group] + + # Scale and offset UV + for f in bm.faces: + if f.select: + for loop in f.loops: + uv = loop[uv_layer].uv + uv[0] = offset[0] + uv[0] * SCALE + uv[1] = offset[1] + uv[1] * SCALE + + # Apply Changes + bmesh.update_edit_mesh(obj.data) + + # Create Texture Attributes with previous material names + match group: + case 0: + mat = bpy.data.materials.get(obj.material_slots[i].name) + mat["1. Black "] = mat.name + + # Change name and use as base to merge + mat.name = str(mat_nameing).replace("$MeshName", obj.name.replace("L1960_", "").replace("KB3D_AMC_", "")) + "_" + str(idx_multi_name) + idx_multi_name += 1 + idx_multi = i + self.report({'INFO'}, f'Material "{mat.name}" created.') + continue + case 1: + mat = bpy.data.materials.get(obj.material_slots[idx_multi].name) + mat["2. Red "] = slot.material.name + case 2: + mat = bpy.data.materials.get(obj.material_slots[idx_multi].name) + mat["3. Green "] = slot.material.name + case 3: + mat = bpy.data.materials.get(obj.material_slots[idx_multi].name) + mat["4. Blue "] = slot.material.name + case _: + pass + + # Merge Material A -> B + self.merge_mat_A_to_B(obj, i, idx_multi) + + # Add Material B to delete list + delete.insert(0, i) + + # Switch to object mode + bpy.ops.object.mode_set(mode='OBJECT') + + # Delete not used materials from list + for mat in delete: + obj.active_material_index = mat + bpy.ops.object.material_slot_remove() + + # Put UV first + self.put_UV_first(obj, selected_uv) + + # Change UV names like in Reforger Tools + mesh = obj.data + uv_layers = mesh.uv_layers + for i, layer in enumerate(uv_layers): + layer.name = f"UVMap{i + 1}" + + # Activate Select Sync in UV Editor + ts.use_uv_select_sync = old_ts_state + + self.report({'INFO'}, 'Merged Materials to Multitextures.') + return {"FINISHED"} + + def merge_mat_A_to_B(self, obj, mat_A, mat_B): + # check if Mat Name is index or string and convert + if type(mat_A) is str: + mat_A = bpy.data.materials.get(mat_A) + mat_A = obj.material_slots.find(mat_A) + if type(mat_B) is str: + mat_B = bpy.data.materials.get(mat_B) + mat_B = obj.material_slots.find(mat_B) + + # Change to Edit Mode + bpy.ops.object.mode_set(mode='EDIT') + bpy.ops.mesh.select_all(action='DESELECT') + + # Select all Faces from Mat B + obj.active_material_index = mat_A + bpy.ops.object.material_slot_select() + + # Select Mat A and assign Faces from Mat B + obj.active_material_index = mat_B + bpy.ops.object.material_slot_assign() # Faces from B → A + + # Switch to object mode + bpy.ops.object.mode_set(mode='OBJECT') + + def put_UV_first(self, obj, target_index): + target_index = int(target_index) + mesh = obj.data + uv_layers = mesh.uv_layers + + if target_index < 0 or target_index >= len(uv_layers): + return + + if len(uv_layers) <= 1: + return + + # Sicherstellen, dass wir im Object Mode sind + if obj.mode != 'OBJECT': + bpy.ops.object.mode_set(mode='OBJECT') + + # Backup aller UV-Layer + uv_backup = [] + for layer in uv_layers: + uv_backup.append({ + "name": layer.name, + "data": [loop.uv.copy() for loop in layer.data] + }) + + # Neue Reihenfolge: target_index zuerst + new_order = [target_index] + [ + i for i in range(len(uv_layers)) if i != target_index + ] + + # Alle UV-Layer löschen (rückwärts!) + for i in range(len(uv_layers) - 1, -1, -1): + uv_layers.remove(uv_layers[i]) + + # UV-Layer neu erstellen + for idx in new_order: + info = uv_backup[idx] + new_layer = uv_layers.new(name=info["name"]) + for i, uv in enumerate(info["data"]): + new_layer.data[i].uv = uv + + # Ersten UV-Layer aktiv & render setzen + uv_layers.active_index = 0 + uv_layers[0].active_render = True \ No newline at end of file diff --git a/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/PrepareLods.py b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/PrepareLods.py new file mode 100644 index 0000000..928f456 --- /dev/null +++ b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/PrepareLods.py @@ -0,0 +1,42 @@ +import bpy + +### PREPARE LODS ### + +class MESH_OT_prepare_lods_decimate(bpy.types.Operator): + """Copy current Mesh and apply decimate Modifier""" + + bl_idname = "mesh.prepare_lods_decimate" + bl_label = "Copy current Mesh and apply decimate Modifier" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context): + + #Selected Mesh + obj = bpy.context.active_object + + if obj not in bpy.context.selected_objects or obj.type != "MESH": + self.report({'WARNING'}, 'Select a Mesh to continue') + return {"CANCELLED"} + + if not obj.name[:-1].endswith('LOD'): + obj.name = obj.name + '_LOD0' + + LODnumber = context.scene.lod_slider #Get from Slider + startLODcount = int(obj.name[-1]) + endLODcount = startLODcount + LODnumber + + for i in range (startLODcount + 1, endLODcount): + new_obj = obj.copy() + new_obj.data = obj.data.copy() + new_obj.name = obj.name[:-1] + str(i) + bpy.context.collection.objects.link(new_obj) + + for t in range (startLODcount, i): + newModifierName = 'LOD_Decimate_' + str(t) + new_obj.modifiers.new(type='DECIMATE', name=newModifierName) + mod = new_obj.modifiers[newModifierName] + mod.ratio = 0.49 + mod.use_collapse_triangulate = True + + self.report({'INFO'}, 'LOD´s created') + return {"FINISHED"} \ No newline at end of file diff --git a/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/_CreateColorPaletteMatrix.py b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/_CreateColorPaletteMatrix.py new file mode 100644 index 0000000..0d4debc --- /dev/null +++ b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/_CreateColorPaletteMatrix.py @@ -0,0 +1,30 @@ +from PIL import Image +import csv + +palettes = ["ColorPalette_01", "ColorPalette_02"] + +for palette in palettes: + # Bild öffnen (Pfad anpassen) + bild = Image.open(f"{palette}.png").convert("RGB") + + breite, hoehe = bild.size + tiles_x, tiles_y = 32, 32 + + # Auf 32x32 verkleinern (nimmt repräsentative Pixel pro Kachel) + klein = bild.resize((32, 32), Image.NEAREST) + + # CSV-Datei schreiben + with open(f"{palette}.csv", mode="w", newline="") as datei: + writer = csv.writer(datei) + writer.writerow(["norm_x", "norm_y", "r", "g", "b"]) + + for py in range(tiles_y): + for px in range(tiles_x): + # Farbe an diesem Pixel holen + r, g, b = bild.getpixel((int(px), int(py))) + + # Normalisierung [0,1] + norm_x = (px / (breite)) + 1/64 + norm_y = 1.0 - ((py / (hoehe))) - 1/64 + + writer.writerow([f"{norm_x:.6f}", f"{norm_y:.6f}", r, g, b]) diff --git a/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/__init__.py b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/__init__.py new file mode 100644 index 0000000..2443c65 --- /dev/null +++ b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/__init__.py @@ -0,0 +1,222 @@ +bl_info = { + "name": "L1960 Tools", + "author": "Prodeath21", + "version": (1, 8, 5), + "blender": (4, 2, 0), + "location": "3D Viewport > Sidebar > 1960Life category", + "description": "Set´s up the Projection-Modifier automatically and add´s in the Emptys if not allready created.", + "category": "Object", +} + +# ---------------------------------------------- +# Import modules +# ---------------------------------------------- +if "bpy" in locals(): + import imp + imp.reload(Dekogon) + imp.reload(CubeProjection) + imp.reload(Helper) + imp.reload(PrepareLods) + imp.reload(AutoColorPalette) + imp.reload(MaterialToMask) + print("L1960 Tools: Reloaded multifiles") +else: + from . import Dekogon + from . import CubeProjection + from . import Helper + from . import PrepareLods + from . import AutoColorPalette + from . import MaterialToMask + +import bpy + +from . Dekogon import MESH_OT_group_objects_in_collections, MESH_OT_assign_textures +from . CubeProjection import MESH_OT_add_auto_cube_projection, MESH_OT_add_modifier_to_mesh +from . Helper import MESH_OT_fix_material_names, MESH_OT_fix_naming_conventions, MESH_OT_generate_empty_for_mesh, MESH_OT_select_face_id +from . PrepareLods import MESH_OT_prepare_lods_decimate +from . AutoColorPalette import MESH_OT_set_up_mlod, EnumColorPalettes +from . MaterialToMask import UVEnumProperties, MESH_OT_merge_materials_to_mask + +class L1960_PT_dekogon(bpy.types.Panel): + #where to add the panel + bl_space_type = "VIEW_3D" + bl_region_type = "UI" + + #add labels + bl_label = "1960-Life Import" + bl_category = "1960-Life" + bl_options = {'DEFAULT_CLOSED'} + + def draw(self, context): + box = self.layout.box() + # Dekogon-Import + box.label(text="Dekogon-Import") + row = box.row() + row.enabled = context.mode == 'OBJECT' + row.operator("mesh.group_objects_in_collections", text="Group to Collections") + row = box.row() + split = row.split(factor=0.5) + split.enabled = context.mode == 'OBJECT' + split.operator("mesh.assign_textures", text="Assign Textures") + split.prop(context.scene, "dekogon_file_path", text="") + row = box.row() + row.prop(context.scene, "section1", + text="Settings", + icon="TRIA_DOWN" if context.scene.section1 else "TRIA_RIGHT", + emboss=False) + if context.scene.section1: + box.prop(context.scene, "dekogon_settings_prefix", text="Prefix") + box.prop(context.scene, "dekogon_settings_suffix", text="Suffix") + box.prop(context.scene, "dekogon_settings_filetype", text="File Type") + self.layout.separator() + + box = self.layout.box() + # Americano-Import + box.label(text="Materials-to-Multi") + row = box.row() + row.enabled = context.mode == 'OBJECT' + row.operator("mesh.merge_materials_to_mask", text="Merge Materials to Mask") + row = box.row() + row.prop(context.scene, "section2", + text="Settings", + icon="TRIA_DOWN" if context.scene.section2 else "TRIA_RIGHT", + emboss=False) + if context.scene.section2: + row = box.row() + props = context.scene.settings_uv_enum_props + row.prop(props, "uv_enum", text="UV Mask") + box.prop(context.scene, "settings_multi_ignor", text="Ignore") + box.prop(context.scene, "settings_mat_nameing", text="Naming") + box.prop(context.scene, "settings_uv_island_margin_slider", text="Island Margin") + +class L1960_PT_tools(bpy.types.Panel): + #where to add the panel + bl_space_type = "VIEW_3D" + bl_region_type = "UI" + + #add labels + bl_label = "1960-Life Tools" + bl_category = "1960-Life" + + def draw(self, context): + """define the layout of the panel""" + box = self.layout.box() + # UV-Project helper + box.label(text="UV-Projection") + row = box.row() + row.enabled = context.mode == 'OBJECT' + row.operator("mesh.add_auto_cube_projection", text="Set up Projectors") + row = box.row() + row.operator("mesh.add_modifier_to_mesh", text="Add Modifier to Mesh") + self.layout.separator() + # Helpers + box = self.layout.box() + box.label(text="Various Helper") + row = box.row() + row.enabled = context.mode == 'OBJECT' + row.operator("mesh.fix_material_names", text="Fix Material Name´s") + row = box.row() + row.operator("mesh.fix_naming_convention", text="Fix Naming Convention") + row = box.row() + row.enabled = context.mode == 'OBJECT' + row.operator("mesh.generate_empty_for_mesh", text="Generate Empty") + row = box.row() + split = row.split(factor=0.7) + split.operator("mesh.select_face_id", text="Show Face Index") + split.prop(context.scene, "face_id_field", text="") + self.layout.separator() + # Generate LODs + box = self.layout.box() + box.label(text="LOD´s") + row = box.row() + row.operator("mesh.prepare_lods_decimate", text="Create LOD´s") + box.prop(context.scene, "lod_slider", text="Amount") + box = self.layout.box() + box.prop(context.scene.color_palettes, "mlod_enum_selection", expand=True) + row = box.row() + row.enabled = context.mode == 'OBJECT' + # row.operator("mesh.set_up_mlod", text="Set up MLOD") + row.operator("mesh.set_up_mlod", text="Set up MLOD (Palette)") + self.layout.separator() + ############################### + # Enfusion Blender Tools Linked + box = self.layout.box() + box.label(text="EBT Linked") + row = box.row() + row.operator("ebt.sort_collections", text="Sort Objects") + # colliders setup is allowed in both OBJECT and EDIT mode + row = box.row() + row.operator("ebt.collider_cache_reload", icon="FILE_REFRESH", text="") + row.operator("ebt.collider_setup", text=" Colliders Setup") + # Light Setup + row = box.row() + row.operator("ebt.setup_light", text=" Light Setup") + # Update Materials + row = box.row() + col = row.column(align=True) + col.operator( + "ebt.update_blender_materials", + ) + row = box.row() + col = row.column(align=True) + col.operator("ebt.open_in_workbench") + row.prop(context.scene, "ebt_xob_path") + row = box.row() + col = row.column(align=True) + +#register the panel with blender +modules = [ L1960_PT_dekogon, + L1960_PT_tools, + MESH_OT_add_auto_cube_projection, + MESH_OT_add_modifier_to_mesh, + MESH_OT_merge_materials_to_mask, + MESH_OT_fix_material_names, + MESH_OT_group_objects_in_collections, + MESH_OT_assign_textures, + MESH_OT_fix_naming_conventions, + MESH_OT_generate_empty_for_mesh, + MESH_OT_prepare_lods_decimate, + MESH_OT_set_up_mlod, + EnumColorPalettes, + MESH_OT_select_face_id, + UVEnumProperties +] + +def register(): + for mod in modules: + bpy.utils.register_class(mod) + + bpy.types.Scene.lod_slider = bpy.props.IntProperty(name="LOD Number", default=3, min=0, max=10) + bpy.types.Scene.color_palettes = bpy.props.PointerProperty(type=EnumColorPalettes) + bpy.types.Scene.face_id_field = bpy.props.IntProperty(name="Face ID", default=0, min=0) + bpy.types.Scene.section1 = bpy.props.BoolProperty(name="Expand Section", default=False) + bpy.types.Scene.section2 = bpy.props.BoolProperty(name="Expand Section", default=False) + bpy.types.Scene.dekogon_file_path = bpy.props.StringProperty(name="Textures", description="Path to the texture folder, textures to be applied from", subtype="DIR_PATH", default="") + bpy.types.Scene.dekogon_settings_prefix = bpy.props.StringProperty(name="Prefix", default="TX") + bpy.types.Scene.dekogon_settings_suffix = bpy.props.StringProperty(name="Suffix", default="ALB") + bpy.types.Scene.dekogon_settings_filetype = bpy.props.StringProperty(name="File Type", default="tga") + bpy.types.Scene.settings_mat_nameing = bpy.props.StringProperty(name="Naming", default="Multi_$MeshName", description="Naming for new multi materials, use $MeshName as placeholder") + bpy.types.Scene.settings_multi_ignor = bpy.props.StringProperty(name="Ignore", default="", description="Ignore material when string is in name (split by comma) | Default: grass, glass, atlas") + bpy.types.Scene.settings_uv_enum_props = bpy.props.PointerProperty(type=UVEnumProperties) + bpy.types.Scene.settings_uv_island_margin_slider = bpy.props.FloatProperty(name="Island Margin", default=0.02, min=0.01, max=0.1) + +def unregister(): + for mod in modules: + bpy.utils.unregister_class(mod) + + del bpy.types.Scene.lod_slider + del bpy.types.Scene.color_palettes + del bpy.types.Scene.face_id_field + del bpy.types.Scene.section1 + del bpy.types.Scene.section2 + del bpy.types.Scene.dekogon_file_path + del bpy.types.Scene.dekogon_settings_prefix + del bpy.types.Scene.dekogon_settings_suffix + del bpy.types.Scene.dekogon_settings_filetype + del bpy.types.Scene.settings_mat_nameing + del bpy.types.Scene.settings_multi_ignor + del bpy.types.Scene.settings_uv_enum_props + del bpy.types.Scene.settings_uv_island_margin_slider + +if __name__== "__main__": + register() \ No newline at end of file diff --git a/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/__pycache__/AutoColorPalette.cpython-311.pyc b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/__pycache__/AutoColorPalette.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..66e5a5456484db28afa39fe8497188e41c0ae390 GIT binary patch literal 5915 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 QP>!B?fmz?~!`IH_KMvnYumAu6 literal 0 HcmV?d00001 diff --git a/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/__pycache__/Dekogon.cpython-311.pyc b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/__pycache__/Dekogon.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c85ea85c8c996022d0ec9d496276f4b285f9b98 GIT binary patch literal 8550 zcmb_BTTC3smOaBfdYHk}Kx5iwfClrJu??}YLku>tv3c4&d@+82!IOb*%-~^W(mh<; zlOA7RDXX<2q>Lg<<~m$uv|8o*D$&XxS#3V{!&+sf`;m`oR1%|>qD5Ny!~2Dm8!4Ng z-BUg90UWRHHpQvxs&h`AbLw9G zWym`|>Afw5R>I!U+>$sSk-h$)cRmydK-(V*%F!!>WK`zU!~EQRKImH(d4Dhx;$<-` zO1_B5=TRKxS7dQvB@o~jLK1&9D2cuR-zUz8Zij-re>ohIBGHCrQC@6+)4Uoz(LXqR zWwL)lGhH3)8=uc;NtCt0Ke6PG>lUK1pNbh3!x9K7b{Upma^1>;f~&x z{v~3~U{O?Vl>{STXI7m05^%rD(#A}RN%~wdC1BQ_k5KX@%==Y#?wEN`Oj8l2Wlv0V z5vFxdOiK|aEm#%H=hPpKF`HsjjK4KVW{r`-IZm`p2A#GdF9D`CGM8 zXwa{#V?vIt>4XyI^@n9-+v~W0iYIks+XR_692s!k$~1sK^fH zH41jug8fq3uaqPz^H8%*!Lh^M9ed*L@bcB6J!EGy6C|oKt^B%hUxM$PO6<=c&$NYo ziw412cv2WBfmtNyb@`ZP?jOB8ITfwDebd(#?QNT$J>qG4Mf~Fx zIci>!lkF9`HfWZS<6WJ{ydI-w7MH`3`x-sJ=nn{z7}N}2iG1(TGVjQE-_7G~U9&U7 z;iky}%``kVFdnVwh4VLaWXo{mih@QD437<88S3xzRBL8=UJQzwHI1T~BKO0hW|TzD zyzGn2FKQ-o$ZKZ(h}O*hh`20kC3E5Xno00Qe40J)z}HHG;$6);9|}gqdl9WPHzbiQ zR5Jzq!8@8|C8*bcw;c8dM9m_LJ_%-`7yW|hl|`WZtzW$B4fyVh5}=1+BEXVFa%1qY znn@M|3sODd=*&&w75wuNtpxOts&$ivC2_%jPvZ2K;L7qGVHOZ05vXl*K3VkYn%PrB zDRQUYpJS@oQv|8e@-%ARI1Tf8i6QhwNU2$#rpZGy>&vBC!#*;7P$nM7@ACZOztBB% zRTd?A#&=H)2s6Fma364=nF#ro{lVKa=L2F;5G8&fv=W4A;bNBQnmO6tF(c1Q{%{0{ z1p%&XGbyi`421%+_qg|z_vB2Uc!ylS+F|{y;yrPGB_c+TzRmToJ&jF#P5uZx^C7i$ z(DlfJA!F3unoPTlQyCIbu#oTDz zoUG)wDQCH0NY*xfar5cTXXSsmwSFr;kgVaqIQ{f=;=@0@zy5x_uXwZ&8D?)d_KZz9 z6VCWByl@TAoT&OeD9LxG z529*PlH(KTgE`bc4<(C?x$bX);{4ArQETUB%ju1l(`ri(Zt2;kYHj_7*E&=kjgN-o zAHA$=SYO0-9h-HX8+Dz}@2hpaxUTon_zw=}>Lu)`#SS-i9N%ivL}%hw3JaVzzz zx_#K~Lu_-BZN_Z-CVOIoJ%LX4tLy+~2M{{|Q&+WMwr!K`*kC)JzpJucnC(Jr7YsBW z-lhyy@9SXAoa8*1JHE+vZg8E?S5&SCb3I5eKLHQ!@g>Y2#%#wX+qJ=VecPRgBL*SbE2d-w_j=6Tsb#8J!8(hz~qRRDQt`F&DyM&;45n7{!br#@?dR#eNlC`VrT0%RZ`ZJ zWGbIHK69*1s!Sth8j)VM(w$df4KZ^F=>-_u9IJLr*KN|x8+5Zuw_>^#(XCsw<5T-5 z_V~5<5UT4?=@Xbff#?%S=HMd*(KSE9H%N{Bnbv5pzK40eTB+B&91>OnBD5V|?}sbC z0NLH(&Fb|Ep?PT7<^o>7pznD!Gy}dlF`$(~D-_lPJgEz~{+W`xp^{D!K#m?Akn6g9 z9>BxwU(z&-OtV|eiHE~Ur|@tnS>ak+K;_L3FK(MI8O*M2YIm4oPdNX-gs#<@y~`)d z{@Xz>Ie1niQC{hR8G7|Telp$1L!3Ga;pV@6Bfm{(%IcwM5nqW!gc1q+c8^053_YQC zk3oxK(_AzOaVbQjqT!a$E zq;oM9a3SlVKQVJ88&g3vOcd3h-QxqrSa=_k>)>ugXK3oKgyQJ5Xp#h{B7%RVr4tt0x`I^Q5x0 zCzbvF2Jp*yWHxRh8HC+EOre*^{at^An%o`+(LcG$r}|yF{$lywsAFxBc02ZyH+UoY z2J3!}K5ks?Iz&Y}GLlkM6D7GJKeE?1LiWXa-SWKR1Yg==?G`RF9FuSBcThjKnmHy^FKEQRJp zIJSegc?ds6$?pqv^OI3mf6zA<5Cvc+085fj&JAnU>%9|W!()R{+i04Gk5=%DJ~FpX z!AB%fY}ag){WrYBqrHRuTE&$`AILfe>_C#?W#4VlW01&)5^cKxiE0Rwc?f2CeI#>( zNbxG1JbFwI#Znp)v454~7ejlrY9ti8L$C?6wD~}NW+Vhs33)xvVqKl*uk;OgFHa1Q zT^PPR(%+|_ zEXJ-H@Il-TVuttt2n@M=FdrW^f(C=xbp;HtS7a9s{70F!YbUqSSU3Ms+63MOpwj!I zt_-8p1#DRiM&P%FWzZlZwtEgrWGB?hg;Y4J(|L*CY1Nr7$Rk9+!m>A&2iRpmURi(y zfp%aA1(70^1_{ZUNoQ-(Jy@2=FDp_F0WKndEu)E?$}`yD7Z0!QqneFWUgCI~S?|%k zOR6JerlpWSs9AKo!3@NRkXj*D)XXF|B11lAB@$kV$bb~oYsbV&Fydbp`z0wPc^Jt< zWYBXUm09EIpI^!h`!bzr?X&M`rJ2llR#!TsiZo3`tkA{D+^2P&AQc2EX$7QuI8o3; z%q86-ES%x2)9Lh*m-HG$nd~CP$&XaT(FG&X`aSOSnG}QwNb*UzvOc6BZme%vU&eJk z5EgA6;MZ&Mf%hNnOWF^tO>Effk-a|YtX-SK&W6O54W}D9-N}Y`o*z;h-i`0u6WxcM zeB#1}vlTg8lMPLY2PyQL#`PXta~{#$OK17&T@v}By5p*|13NpmDUjAhph$!1TS zh7dH#uutrt+1IYE4WX9F7dO6}g$jzwT*VBe3a)|~84iquoSqEs)Y>KFx%T|VH?vTs zippHa%yq%uIA@<$)_194*ua?~ZcS`z;r)Ir>otgL?Am9TGA9zm5ylAboi zwj|jD@&0Wy#U3RSLSo31Y(D&_sehP4Cx;SKYV$B|9)@r^BZ4ljh_2nj*XB`+2t{QU zFtdR4vX!sYBAW8ysRh)s2t{T5nDHaV53?LPj_QTy?r++ldQk^}l!>`?!{Pd&zG40D z7s^uw9X*SBf1}n<;Q9&Va242j1a)6TjU!N0$0&A;BF89%?o36-3EEZXJJ|WoYifU4 z#IS9wET1vFbk(m9t&eZIj%~P(q2s-(>pXUyhjhw2C&3V4wtt}pCQ?TKrNA=Dm5K0o#aNuxciavx&uL!_6jG}ct&5;`72A1vYzmPzAyNaezq z3nMQ4-#`CQeF(BJV2pg2(YrcfLr133g)0O?xqc(nP}!T9y@?77bp8wvBx`^hX;`T8 zD&3`ZHf~aA$gFo!aT?|JrA-wOtB|SJ=WBLLhi=W zBmm7!4j);g$MxUTLsBXcqf1dJ*)Q~&RMzKxDGY?`ElK`*AyB4s}8q!Kwa8&-c3YZw|sWM3# z88r{H65ES3>;uH^PO|*w^daY6qI8(pU?c)L5lisywQs_UwQo>P&f zN$pBc(kAK(#hZRf@n(UVHR+RP&3f%A)Sel4lNK`G0^_Y8G~PM)q7az ziOx@-VxxCiejyQyMqmohhDCu*h=L@{Cs`pd9biZEoC2MlU8jogy4gS=u;>H!Gl4yp z?D_vJsWRiiE5o6Q;J9kJIW~Abq8|(%k_Ga;`gGz28o5U7I>ApJUliW8VU~j8MS^+ z5T^yM@D`2NFRA9K#8;|45}!{B50k1@iU{+9YL8FN3X!CwT9RKS1l6m}*Cm6KVsYrR zi9#YSCcibS7DpHEv7BYv}G8-!uVyz{|6i8^{s!b zcv=sO zm201`4arCPGEBe1^vg_t&RxHfl9`6ruqG8TBmr(vVu-|k3h(<7mBa!0GHZ-0$mAfk zMt@ncM5pM2N!v7}Q=f@fo-UO--c)CF^X9zFdW-ph`Jn!?XjF>kaA%~HjI)-G+cb1R zAC1>i9TWedgagIfidR}Pz3;g{OtZvfir!nV{xtkcPZaD%P2q`od+`%4;tA~1`uFa^ zQQ%gnrFOkX8YE!VoH7-^9cXd#6j%smOr<#yEr)6v9e#6M zzYi8%w-gsye}(A8(H2m?u89y3bqi5<%6=z4`@WoX;wTV2|6HD_JTn`bhvHpSJJrWMzTG@o^K%dYMm+y0~~ z9ZpZBrxdnpjajcEGd9LILK`8))wJb0nRT7axH=S9#|~w$>dGB$d%Tnm!Gw@w?kQLx^mveEpJ=a+xGY7=Zw;RajU&A+urv>D$_oq zw2x%Gql$M__Kv>r*2(pO?`pq4oT=~2c>5J^zwGUQ0j6h2@gCpuc4WOB>6wi8oZ>wv zd(S~-yR~y|Xnpj5cIx06$21MThUXw+FUd*{vVM^}+ zG;gkQNfeoUNrCV4+*Asc1fH$%d08-qT0fV1OS_ACaNI;Mhd)m6h?_G4mBs@3BQeK ziU|HKrPl5N%v>xgB>{)0$s&NTz+Mc%XbB$Prp}>N;mCCPX7*MnaZ^s zlNlDktF}S$`9aXxkv+mNnVavtCMg-!btXV!B{_MFQ38rHu~w<#xj zv%X&0*PE+lbG{?MN$v>BKKx;e_tcj6OxAnmp9X%g{LYo>8B%(NGTvduJ1l#L-|kc) z>pvWz8k*#$3qSVA^+TEZA*Ft3hoT*zS3p*-=A5q8A;o!Q%h{ZDHm5Jj&gP8stl~T? zli!Y6A4>FM3>;pDBi=2?sTCYI7v~pZ0@R%x_lt#a3@seo**T7nN1)=Eig8h%*gXcS zvG9}-Q!Ai`77W}E(FdnRjFyNe{w+n8(Ov;Uu!scTjr35UeCZumNP))g#4{1CI|bKL_66eemz`u@`#=X2SE+5E}&8WSr%YNb%TxAs-&F zQAt{W-Urd-4ErE1-kTEUBQuNOapt}LGL|Ab3?iOXiS5ExV!Qs1?EigmX}IEsjoHK_ zDJwk9@3ImpQ^BzzuK1n~3~vTk+)`>^z!kR=SKK!C6CDr{g+w%Fi%tw>cy^4Oo`}&a z=r#%1O)t5 zU;X;SEni#K*OoS?2Qt1+#n-tqusQ_z$T)R3bz?rmbSO-R%yj5ps-`~QGU8d_EuKSi z9?1nH7m<97q!$U%iBGVGSfnXKKh}_7yM&}z8Tw>P-?sbI9?D=vWhf^aXXN)M5%;6| z;Z8%GBSPrP33G|$SKQsW$f3+G;A39N_epG+4Pv(@-WVO{10$4vfek0wX!4)Gm)JyH zilVwKHWInthxa~`kH|zMe;jo9{XxLK?y{i?OJ<(_C6zJ{?sCJIEcVFw1$-@cd6(=dyI2Qf4CGDOxkBAGYxn`sZq!%%Q?^Z#|AA8}DG(UH z%cVAagIQEOQZ_NtD=U~MDc%)tgF9pW=k}*y51tt|0o?o|4h7$+kQ7*A%1xMP)tLfFxb3G!H;nU}R8ydnxGxeSPu>~%siGJCmPmXq z(YN^VdsIy~WP#pTJQ9vceNfRS-vpjgE0ASMZXDHqo1q^(zpMT6R`$Y(d|_lG1VsB0 z6QSBe@yISat?T0>gMRZ%kR3`K(}~|o9z(T;W6|k(mBAgL z0%HOs91~PVj3>1QW-u5EjsyoLzNNvji{K#5=y&K=g4b*WBwpeo3z-l|oB$w>f-!+h zbe;`iN<~8jw}uKRmm zh!muUK@>8LqYB(Hb@|?o700%xb%$~|x(Pw-Yg}L2^0jAu?diJjLf?Op@qd!>^(nr- zm7$!=hcR7uuC?vS$QlF7LcdP7f#qHSFtGC?k zS$BIn_G6noaZ8!_3wh=ja_Z|h6tzTOH_7hyR}@uq!vyz0cL>GUv{I?05`Ba z*Sp{dfy=#kcqlqO18O*vl-SGArh)A=D8W2CJh)> z17_}n5ZAEg6b136ML&x|BDmC2LzHdOjp!OJo-aXw4~|Yrg!?YcD{wOKYd`FKZYkX% z;2NrDz7#MMaNj`9(itRAU?A1rIP?_wJ=2*|`(h^|2r07|N|6FyM*zGJ>nwW4r0~{! zexV6k5wJ*sadqIG*!CFbBuMVnM{)+I)%w-b4)|sR*#=|(DRUtq%3%~vO39gEmWq`9 z&xFR03`OUt&wvCh1BmQMng5ph&93+Zq6k3i5Y<8@I}77m!N9+VTP1SioxdsnKmhzA zrrVGLd_X-k-=-eW@7z^YnV&%R z!{forMh#ycZ=0*d?Crk@3JC>lue5bH)29q67rzQ zh6!lG_X|-<2K;qJSa}O~f~TdSW>wyFz?UretRPNe2S(kHc!Yfu9JHX-5WmDm>lD`2 z>bqimjuZH3k~sP#G*hj}Nm4z+ytE(+Tr3{Hw~*kH;VJL|Z1DX-5WppXPhMe3^A~JV zf=sYWGhrS=Wf(+IQ*|#SAc+dmgux%hPpu%29u&p6=(iUTSG5OW9Du1>K^}#SQcY8H zss$Ir%quQ~R!0NWe6EKesu8i5+C<%*O28!PuQeb&aB%&ka^U2O{r3lJH++u|D|J1Y zgC8jeKU%5St~{{Df7Ab0{VyP|a%FXF%h{53wxkcq&X$a`Q*n06&Q7gsB;N%Y7wF1o zTwc^1QfiKEPCtodYR)J%XI4JTIjdKPww&!*XM4tZLUEpuohN>;A>aw6wsVKFRDD8- zok|I=phew9k|;xc_c8@~?X^?DyzHeawZxa~=YZ zFbbpaD0W48<5zIX@Gf@6V8BK(%J?ounP_a@sAiovsi99H?sF~vidp721HVPbZ`p<4 zO5xL3!1@(Ro}4wPT=2HSKa%^r0!OvGi6sp@KCdw(jl7Yec;h^zDi4L(>JNf(DBfbs}oR7CK8Tbicf^u+ue)z zB2_pPRis#Fg2KB@}&E{^AFE|+?EM{xPNVbcF!jV z)=xjavwnL0v{3hIjvNrl0YUz48&OURW~+FQd`Jp4XL7`-NQ?@^=u?O5{`u!nGi(+S z^-+h+^NSGk2%|9=k}x1IW3;h2{B|}<3I;E2p^O`*Php^bt_@b&N|^^h8f8I)PI6tI z2|_ntVB(83!$oK|;g}elJ_qLGp9n7|JkxX(Oa#L0ZHViV4UIt~D_~-f*-H+JRyqf| zjB%kDD@D(Rm!h0x1??jnngm-TLLp=}p^#(`g%;w}QWS;BQ0UH5I9fyK9#s3!1e>VU-FlCy3%iMIomd!ZR<_K z$Q9v6T)3AIoNYPh+oJPr!GwM}nL( z6$=I4?~0YO03|3ZP#Z;nx@}Sm8nU6OOCcCoH|fwq!D`tM7l#k_cA|3vC9wV@pmN2c zS$`zP#r^RZtws6UQGWyyjSDc4yLS;K5f_7_$&o3YXCjtszGB(t1e#ikx4=qkLszE zWTWt;{U$~k{sK=r;BACA$y>7}{#@n7uumcQx%SDl^JG?@1GT6^0P;ioUwo)CFJA7i zc@taDV_EXWoG`G=w{XhxDOk(rs>NV9Mpo568F@#q{|mHC(D|eU7Au_sln|eDf_@$ghR8K1|l^QqMgqZ?;Vh zmAlFvtmPeit!748(yMRz zwaKK9_szGfr7=PH(rf_Mt|yaqd>vm?lrXQgJ6X?rOMM1kuluqmz=tP5Fp5VD2H+-& zav-+!tCX8S-04&4DV+reAX0vIw_qIOYnO4#URc8m(C?+Asp!u-R9V>)yHMlweuJ+r z*10&2^_osL@D0T@zJcTinLhF)tyy%zfg)XM+=s8+3VtI&*@EFOSP_j>0G$?#kr8L0$+9zjnnTnx0HB~Vr|Rk zmUI_r;czj%7y>Q4u#PMBUdcwjvADKMHtE(bP5RLY^{-OaE6HYRA72e)5ehkCqI7lit)p~*xz4ErXpI?YpZss74Np%8OaVjT1NKPB1qTfBOARAW${?b~%VD!* zz8MX(tYktj_+XR|cuD3k2XWuv2PNx|1}{#IPmU%k3!6l=ML|0f$u>MVIUGEHJ~;9f z0#Xu9Q?ckhWd{Sv{@HNMe}nb|d;nWZnv%DZi7FYZ=z>kBmT+cPgJD1lS{(Pm|8ul~ z{{TM+i)z@mVAqC|I9I~Q<9fwsOVS`?;n5qx14D6xQ{3Eqmz;O88SD`b0L}=7O=F+o zldvsDy8_7^jlV@R5~1$!_cjgj1!Xq~9_q$7!!ZvG0I zC6Q*CqreydVT#d!wH}8E37=z;D8F9;0s0~QLsT~p`B_w@g63*_h1%Zi;L4rVWeAl0 z6s=g4cA}~+gqfR>Si*j|+dmWy&))X?6SlnwYMTV$L$WBCm4r#Qb3=V2p}~pakc5Yj z5@#72_WD$J!qMC9zerOuV)hkkSi;uV?H^@mI_CchnM%TO1PNcF5sPG*8afL)mduxD z5LUBCh7KqVC1Cvk8%zKY1Hjxex5UtFw?v#7pB$ea3yuVOB{Mq<<|a8gfYCxM&2fOk zv64$2mLUZlWF;r+z`JzeTdGxA5x9onosf*!Flb{Vd9=g@RB$MAGZtq`W5b+`13^&| zjB}+-Bq+j0!!Zgl5TwHp8;t-M2sPvY_LD47eS|)m*~MstlPnCq7-u-i2#_Iz00IVK z0Fn`45{WF-H3DGbvQ)Li(nz?{q!4>AHp|!%Z-qK6p(GfEk}({+$Gn0>Axw)wdnW)g z7g+|@;1~>IuxX?r$$UfhZxwS)d?7?r5e{%1@OLoS5oTpkfK#R#Ws=SQF2JfXhrLjR za5O5_6zZteL8+`q`$lyt)LAmmg=cAi!xq7y3QA&`VN`%?X%T=@x}+L5RRS~!z)!^y zSwUN1jkM&_aH7y4f}4gUOC$z}EGLzf%+L#Qs5rT}#Dy-;gytd)%LV)lT7EMKNnkFZ z;tilSYnWk>Sx7deNmCGXX!f&oS8~ezPlslgST4RGIiP}C_j~kRUSKg#4-cLXO4g|} zXQqRfrX|bx=;YMJAcMdJiHt|75XXjCzyLwB$oWXN2(=uNjZLc1f^s2}g@PFdKr{q4 zNQN5=5&^a#_Ys=X;!9vz@wqwZS7ropm{2b&oo9rKG7*SWOv@~1VopE=>jxqa(A~*v zvNw{f1s|O_@Ex5w8bR!7Fu6YgKJD_ZI#cGnvr2UOQ-*w1omkb8vgSPvq9>5D0f_8v zUR@At`^DO!lq2tJS#yfM{**Ic+k~QzLtM-LwWQcGArOtg?e?V1+XizrAl)iSS+_~7 z>ZITvfM3dzclfp(&6|$qoWn0V{0QJak|(R)n|L^p>DsFA+N|$dpUu_xiuJuYvQH%Y z1hNkVyS&?&!Pc55UGJTHcrH_yaR~d4<;Yh=@)d!6CGTljIVq6-KUy%dGWFJjf%HJ8 zb<@!xI2v?0Msj3OB!dDORC7G7s96c8=Tk;hMs<2wtZbDFT5oup zWk=Wg?OaE{*wLRdrU{X#7l{KP$yYCW52nbxe_zTV5=~DlT`5!E<4f7{b@i!=yt_JO zfvWmiv(;j2U(S0(^d8y9&f>Pc&t&>w6aaq?I9%1G6Xfsi!dI?pMg&?pBUa9AV@79P z-sO4Z__-r9lNl5CzyA2h7bnHOAcT}(&UI0AT@+jwfh~i-Z(A|tT|STuNcCuXa*J%+ zB-_?&1+pzi_K0MUK=wdll~;7{LnjkC_aV`JC^eM#)~znD{zUW!L~l=OOwE73kRMb6 z`HzX@F@Zexw6Z##e1;u&?tOZ&YsDzK0>JL}tXfwqwp@LiuD+b>sOUN>xQ;@+$E!?t z>s1>*2<2*fMWEHaVs-B}R_PwXzw~%lM_12oc>CAb?M9-Mu8G}A(ZpnH+eB(FO>p%LeaicNUcyuM0Z`zx^ymo!%3`+K|y#YpA zGlVNNgXbF>*N(#pP2CWlZx3u(LAy;T7169Izb~-f{>gQ5-?6MA-`>4`XT$b*=<%H| zg1-&^%|xz!Fl)#j{)I``xo4~S$Y%4A$J64`(cj_X(X-;wsa*2~vH3#Am_K-EV=QCLoX`1?ZucI@zMX69 z6WjW>+Fspkd-b>Hepmf3zOC^$H^<);uG|o)x!m|oas1}iczkm_E-bz+B!BV@14A1$ ze676TYwr;H0J@D~LBp5PM~>`Fc1-A=`fcCeABUIn%lR&dz6*ly!oU0cFKM$)JbF<)`lDR) z8)EYt(B`hg8`s3H)6ndRoUcRhb$rkKorg9~ik&AR|GAv6UGTL-ex&i8^!;7RhE_t? zxofsu`!-!LSk@1(M{=&?qU*TeI*wAjkDNbuX2Mx_&ebNm+5}hI|3GKi$h0+Gu|>3O z5-r&`1fnHJbc;l{Ky*VMPd#!vVEI5&!}<2k)UZhIdqP$!WA)G`c_>F77Rkec{DT}e z=N3`7Nz`T9GH>UIPLb#oh)#${u1t10tCK0)6L2(vobRCMJBZwEKqe2yz{f1*>)NyK z?CZa-$+TozQo;1u)LF>g+NHQHf_%^M(6KVJGA1++<%nUC7#4`(ysJLN3q*swGMzQS zY@$AB?TG%L|0k>}A7Q%vl0m;;;?TOY@GN1>DXv6Lac@*S>e>19kuQ@fAKatGl>B6^ zYN+)6Vjf*R%Z|bSO!X|2Dj#;ete!9A(dkG#vYJQBQu*2W@QK1V%CrO^TB){+k{p_( zosXQ*DKG4Ei`NzatbwZ%A+(y6pIzh@Yp8*%Y7X@N6#hTgB0we_1%3~i+Od-+Vh5Qo ztr=Rdzwl7z7j=jBi2=(bgWxUZBqFB~c@2>XAORPH>`q=5%S(J^^RS5G?jZ7GAd+bg zmgCF~^o{I*nMFii3ZmU1a~qK;kn&YCASAHZh3&t*PIe;>Gg|HrDz70H^(l`G~4uclx9xJ__0!4J*4Fv;%U@^ox^I@XWoJcmWk z;S?;WymBm>jMsxXPp|0dO$DF)uZ1z(zwlX^v>S0H-9 zhwbY~8AYO1VFHKSxk+^9h%S-n5{RysrI(khbJXCg;iq^%<4VTByyl&X7mKo*r%;=W-tyg#GOqwftY+Q>U}QHO%$s*UJm)R*T6yRq z1AJ@xC_ikYENf-@11#*&1H(-`Wq^ZN>$?P}9YDZw#kc57@4w2+L11ap`dwvF26VVa z5fq_^u%X>eaKXT|^T9oD;!BRS^!0&OHS<=;Kb^GkX5OZu*;vvJ@-#nNs(;>2mGEuY z^%9c~PCL|vBP%=QD9Y4xLaAOEIws)41Iaszy-`}9aI zUK=C>gogx5rrG%7y#k)cJcO81MDH8>Ks3T~v+;$+Q;FAJ<}FJBixOZ|lki_i`W_$v ziuz6~zx9!fXU+So#*Z35Y+h^DqGcxnwUXf=G`e=yh96Qszzh1YBYiwDD1-K|;T{XL z)=_A!(qyBIS}J%1$pO>_H`HYCM~4G52;lzVt^GYnVLN~Tng9#e{jl>_NxrK3G5+}K zX3wC|Gnhg|`N^&R>VM%;;A*_s{!4)><{Ahq0&dJz^mz&qgqM|1nP|x(XP3-OICc{N z&;qVxjL~n&D4g8?%yr7@Cs8JYi((2t707){x|I76Q8}a@y=$;NulK=;3}yzUpgvM_a2-|pUS)rsEgoe zmSbTCgl)y~mE}!Gi{NO{_82lA;FI_By&~BwkZ3Ng@d9#D(+qoKTcu23x+iP4$i_{w zG4E?yv*%?ye;oYcESPrAcUttF-ZmSXD`4~7T=5K0ipsAML3l-hkXY@WmC2&56hlwE zjUP{E>pr}`c0K1k2sp~N5e(`XvZ}8Ufl!S-W&5KYV2Tge%!&8kS$$_6&v^suz3WWQ z-7C6b1BKf8RP zSF7mSE4cQ;O-$e*usv-ln@BVRhLEzYw5Cas*dxe4c_>T<>`WtcHiJAhgYH#G)=-Fw z&%)J3+l^=_LZO?B5&=QDUrR?NJA~qk=(vMreuna}h#(7-9e^xUu{w0^g+T<}aAHG1 z?rVQ}(^0{6^r@@+{&>D};Qm;?sxdPsxcA*ZyKR~=m>ajT61r%rH6Pl>G}03=L(^X* zO4+Ey0HF+63c||GN;A3u3_yS37U;cE1dhsADkWkH?uCZAI3riKtQFr71Iks-Q_Nq1 zFf;+MSs*D_a6?Hpg literal 0 HcmV?d00001 diff --git a/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/__pycache__/PrepareLods.cpython-311.pyc b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_5/__pycache__/PrepareLods.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..212d357151b185c2eeef2a467dce78d368b11c8c GIT binary patch literal 2584 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 iI+x~FEj5azCe1n*`+s@$A)StJWXQt6bg