From 1d9b3a64dc64d2b7e376b5ad02766a4c5b74e2d5 Mon Sep 17 00:00:00 2001 From: Tran Xen <137925069+glucauze@users.noreply.github.com> Date: Sun, 30 Jul 2023 14:19:49 +0200 Subject: [PATCH 1/7] start v1.1.3 branch --- docs/faq.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/faq.markdown b/docs/faq.markdown index 89eb744..115b9ad 100644 --- a/docs/faq.markdown +++ b/docs/faq.markdown @@ -112,7 +112,7 @@ A face checkpoint is a saved embedding of a face, generated from multiple images The primary advantage of face checkpoints is their size. An embedding is only around 2KB, meaning it's lightweight and can be reused later without requiring additional calculations. -Face checkpoints are saved as `.safetensors` files. Please be aware that exchanging `.safetensors` files carries potential security risks. These files, by default, are not secure and could potentially execute malicious code when opened. Therefore, extreme caution should be exercised when sharing or receiving this type of file. +Face checkpoints are saved as `.safetensors` files. #### How is similarity determined? From ee7f7d09d2cb9220aba3dbeda6d76e35b5af7ddc Mon Sep 17 00:00:00 2001 From: Tran Xen <137925069+glucauze@users.noreply.github.com> Date: Tue, 1 Aug 2023 20:17:43 +0200 Subject: [PATCH 2/7] huge changes, inpainting in faces unit, change faces processing, change api, refactor, requires further testing --- client_api/api_utils.py | 73 +++--- client_api/faceswaplab_api_example.py | 15 +- requirements.txt | 3 +- scripts/faceswaplab.py | 86 ++++--- scripts/faceswaplab_api/faceswaplab_api.py | 53 +--- scripts/faceswaplab_globals.py | 2 +- .../faceswaplab_inpainting.py | 41 ++++ .../i2i_pp.py | 64 +++-- .../postprocessing.py | 19 +- .../postprocessing_options.py | 36 ++- .../faceswaplab_postprocessing/upscaling.py | 12 +- scripts/faceswaplab_swapping/facemask.py | 2 +- .../faceswaplab_swapping/parsing/__init__.py | 2 +- scripts/faceswaplab_swapping/swapper.py | 228 ++++++++++-------- .../upscaled_inswapper.py | 97 ++++++-- .../faceswaplab_inpainting_ui.py | 68 ++++++ .../faceswaplab_postprocessing_ui.py | 6 +- scripts/faceswaplab_ui/faceswaplab_tab.py | 135 ++++++----- .../faceswaplab_unit_settings.py | 67 ++--- scripts/faceswaplab_ui/faceswaplab_unit_ui.py | 52 ++-- scripts/faceswaplab_utils/imgutils.py | 58 ++--- scripts/faceswaplab_utils/typing.py | 10 + scripts/faceswaplab_utils/ui_utils.py | 39 +++ tests/test_api.py | 36 ++- 24 files changed, 786 insertions(+), 418 deletions(-) create mode 100644 scripts/faceswaplab_inpainting/faceswaplab_inpainting.py rename scripts/{faceswaplab_postprocessing => faceswaplab_inpainting}/i2i_pp.py (50%) create mode 100644 scripts/faceswaplab_ui/faceswaplab_inpainting_ui.py create mode 100644 scripts/faceswaplab_utils/typing.py create mode 100644 scripts/faceswaplab_utils/ui_utils.py diff --git a/client_api/api_utils.py b/client_api/api_utils.py index 4369ef8..8499306 100644 --- a/client_api/api_utils.py +++ b/client_api/api_utils.py @@ -18,6 +18,37 @@ class InpaintingWhen(Enum): AFTER_ALL = "After All" +class InpaintingOptions(BaseModel): + inpainting_denoising_strengh: float = Field( + description="Inpainting denoising strenght", default=0, lt=1, ge=0 + ) + inpainting_prompt: str = Field( + description="Inpainting denoising strenght", + examples=["Portrait of a [gender]"], + default="Portrait of a [gender]", + ) + inpainting_negative_prompt: str = Field( + description="Inpainting denoising strenght", + examples=[ + "Deformed, blurry, bad anatomy, disfigured, poorly drawn face, mutation" + ], + default="", + ) + inpainting_steps: int = Field( + description="Inpainting steps", + examples=["Portrait of a [gender]"], + ge=1, + le=150, + default=20, + ) + inpainting_sampler: str = Field( + description="Inpainting sampler", examples=["Euler"], default="Euler" + ) + inpainting_model: str = Field( + description="Inpainting model", examples=["Current"], default="Current" + ) + + class FaceSwapUnit(BaseModel): # The image given in reference source_img: str = Field( @@ -82,6 +113,16 @@ class FaceSwapUnit(BaseModel): default=0, ) + pre_inpainting: Optional[InpaintingOptions] = Field( + description="Inpainting options", + default=None, + ) + + post_inpainting: Optional[InpaintingOptions] = Field( + description="Inpainting options", + default=None, + ) + def get_batch_images(self) -> List[Image.Image]: images = [] if self.batch_images: @@ -104,39 +145,15 @@ class PostProcessingOptions(BaseModel): upscaler_visibility: float = Field( description="upscaler visibility", default=1, le=1, ge=0 ) - - inpainting_denoising_strengh: float = Field( - description="Inpainting denoising strenght", default=0, lt=1, ge=0 - ) - inpainting_prompt: str = Field( - description="Inpainting denoising strenght", - examples=["Portrait of a [gender]"], - default="Portrait of a [gender]", - ) - inpainting_negative_prompt: str = Field( - description="Inpainting denoising strenght", - examples=[ - "Deformed, blurry, bad anatomy, disfigured, poorly drawn face, mutation" - ], - default="", - ) - inpainting_steps: int = Field( - description="Inpainting steps", - examples=["Portrait of a [gender]"], - ge=1, - le=150, - default=20, - ) - inpainting_sampler: str = Field( - description="Inpainting sampler", examples=["Euler"], default="Euler" - ) inpainting_when: InpaintingWhen = Field( description="When inpainting happens", examples=[e.value for e in InpaintingWhen.__members__.values()], default=InpaintingWhen.NEVER, ) - inpainting_model: str = Field( - description="Inpainting model", examples=["Current"], default="Current" + + inpainting_options: Optional[InpaintingOptions] = Field( + description="Inpainting options", + default=None, ) diff --git a/client_api/faceswaplab_api_example.py b/client_api/faceswaplab_api_example.py index fdeffbe..26b2975 100644 --- a/client_api/faceswaplab_api_example.py +++ b/client_api/faceswaplab_api_example.py @@ -1,13 +1,14 @@ import requests from api_utils import ( - FaceSwapRequest, FaceSwapUnit, - PostProcessingOptions, - FaceSwapResponse, pil_to_base64, + PostProcessingOptions, InpaintingWhen, - FaceSwapCompareRequest, + InpaintingOptions, + FaceSwapRequest, + FaceSwapResponse, FaceSwapExtractRequest, + FaceSwapCompareRequest, FaceSwapExtractResponse, ) @@ -37,9 +38,11 @@ restorer_visibility=1, upscaler_name="Lanczos", scale=4, - inpainting_steps=30, - inpainting_denoising_strengh=0.1, inpainting_when=InpaintingWhen.BEFORE_RESTORE_FACE, + inpainting_options=InpaintingOptions( + inpainting_steps=30, + inpainting_denoising_strengh=0.1, + ), ) # Prepare the request diff --git a/requirements.txt b/requirements.txt index e48dc85..2999cc3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,4 +6,5 @@ onnxruntime==1.15.0 opencv-python==4.7.0.72 pandas pydantic==1.10.9 -dill==0.3.6 \ No newline at end of file +dill==0.3.6 +safetensors \ No newline at end of file diff --git a/scripts/faceswaplab.py b/scripts/faceswaplab.py index e730d56..8c49032 100644 --- a/scripts/faceswaplab.py +++ b/scripts/faceswaplab.py @@ -1,16 +1,16 @@ import importlib -from scripts.faceswaplab_api import faceswaplab_api -from scripts.faceswaplab_settings import faceswaplab_settings -from scripts.faceswaplab_ui import faceswaplab_tab, faceswaplab_unit_ui -from scripts.faceswaplab_utils.models_utils import ( - get_current_model, -) +import traceback from scripts import faceswaplab_globals -from scripts.faceswaplab_swapping import swapper -from scripts.faceswaplab_utils import faceswaplab_logging, imgutils -from scripts.faceswaplab_utils import models_utils +from scripts.faceswaplab_api import faceswaplab_api from scripts.faceswaplab_postprocessing import upscaling +from scripts.faceswaplab_settings import faceswaplab_settings +from scripts.faceswaplab_swapping import swapper +from scripts.faceswaplab_ui import faceswaplab_tab, faceswaplab_unit_ui +from scripts.faceswaplab_utils import faceswaplab_logging, imgutils, models_utils +from scripts.faceswaplab_utils.models_utils import get_current_model +from scripts.faceswaplab_utils.typing import * +from scripts.faceswaplab_utils.ui_utils import dataclasses_from_flat_list # Reload all the modules when using "apply and restart" # This is mainly done for development purposes @@ -25,14 +25,12 @@ importlib.reload(faceswaplab_api) import os -from dataclasses import fields from pprint import pformat from typing import Any, List, Optional, Tuple import gradio as gr import modules.scripts as scripts -from modules import script_callbacks, scripts -from modules import scripts, shared +from modules import script_callbacks, scripts, shared from modules.images import save_image from modules.processing import ( Processed, @@ -40,16 +38,14 @@ StableDiffusionProcessingImg2Img, ) from modules.shared import opts -from PIL import Image -from scripts.faceswaplab_utils.faceswaplab_logging import logger, save_img_debug from scripts.faceswaplab_globals import VERSION_FLAG +from scripts.faceswaplab_postprocessing.postprocessing import enhance_image from scripts.faceswaplab_postprocessing.postprocessing_options import ( PostProcessingOptions, ) -from scripts.faceswaplab_postprocessing.postprocessing import enhance_image from scripts.faceswaplab_ui.faceswaplab_unit_settings import FaceSwapUnitSettings - +from scripts.faceswaplab_utils.faceswaplab_logging import logger, save_img_debug EXTENSION_PATH = os.path.join("extensions", "sd-webui-faceswaplab") @@ -62,7 +58,9 @@ script_callbacks.on_app_started(faceswaplab_api.faceswaplab_api) except: - pass + logger.error("Failed to register API") + + traceback.print_exc() class FaceSwapScript(scripts.Script): @@ -107,44 +105,39 @@ def show(self, is_img2img: bool) -> bool: def ui(self, is_img2img: bool) -> List[gr.components.Component]: with gr.Accordion(f"FaceSwapLab {VERSION_FLAG}", open=False): - components = [] + components: List[gr.components.Component] = [] for i in range(1, self.units_count + 1): components += faceswaplab_unit_ui.faceswap_unit_ui(is_img2img, i) - upscaler = faceswaplab_tab.postprocessing_ui() + post_processing = faceswaplab_tab.postprocessing_ui() # If the order is modified, the before_process should be changed accordingly. - return components + upscaler + return components + post_processing def read_config( - self, p: StableDiffusionProcessing, *components: List[gr.components.Component] + self, p: StableDiffusionProcessing, *components: Tuple[Any, ...] ) -> None: + for i, c in enumerate(components): + logger.debug("%s>%s", i, pformat(c)) + # The order of processing for the components is important # The method first process faceswap units then postprocessing units - - # self.make_first_script(p) - + classes: List[Any] = dataclasses_from_flat_list( + [FaceSwapUnitSettings] * self.units_count + [PostProcessingOptions], + components, + ) self.units: List[FaceSwapUnitSettings] = [] - - # Parse and convert units flat components into FaceSwapUnitSettings - for i in range(0, self.units_count): - self.units += [FaceSwapUnitSettings.get_unit_configuration(i, components)] + self.units += [u for u in classes if isinstance(u, FaceSwapUnitSettings)] + self.postprocess_options = classes[-1] for i, u in enumerate(self.units): logger.debug("%s, %s", pformat(i), pformat(u)) - # Parse the postprocessing options - # We must first find where to start from (after face swapping units) - len_conf: int = len(fields(FaceSwapUnitSettings)) - shift: int = self.units_count * len_conf - self.postprocess_options = PostProcessingOptions( - *components[shift : shift + len(fields(PostProcessingOptions))] # type: ignore - ) logger.debug("%s", pformat(self.postprocess_options)) if self.enabled: p.do_not_save_samples = not self.keep_original_images def process( - self, p: StableDiffusionProcessing, *components: List[gr.components.Component] + self, p: StableDiffusionProcessing, *components: Tuple[Any, ...] ) -> None: try: self.read_config(p, *components) @@ -152,7 +145,7 @@ def process( # If is instance of img2img, we check if face swapping in source is required. if isinstance(p, StableDiffusionProcessingImg2Img): if self.enabled and len(self.swap_in_source_units) > 0: - init_images: List[Tuple[Optional[Image.Image], Optional[str]]] = [ + init_images: List[Tuple[Optional[PILImage], Optional[str]]] = [ (img, None) for img in p.init_images ] new_inits = swapper.process_images_units( @@ -167,6 +160,7 @@ def process( p.init_images = [img[0] for img in new_inits] except Exception as e: logger.info("Failed to process : %s", e) + traceback.print_exc() def postprocess( self, p: StableDiffusionProcessing, processed: Processed, *args: List[Any] @@ -174,7 +168,7 @@ def postprocess( try: if self.enabled: # Get the original images without the grid - orig_images: List[Image.Image] = processed.images[ + orig_images: List[PILImage] = processed.images[ processed.index_of_first_image : ] orig_infotexts: List[str] = processed.infotexts[ @@ -237,7 +231,6 @@ def postprocess( # Generate grid : if opts.return_grid and len(images) > 1: - # FIXME :Use sd method, not that if blended is not active, the result will be a bit messy. grid = imgutils.create_square_image(images) text = processed.infotexts[0] infotexts.insert(0, text) @@ -245,6 +238,20 @@ def postprocess( grid.info["parameters"] = text images.insert(0, grid) + if opts.grid_save: + save_image( + grid, + p.outpath_grids, + "swapped-grid", + p.all_seeds[0], + p.all_prompts[0], + opts.grid_format, + info=text, + short_filename=not opts.grid_extended_filename, + p=p, + grid=True, + ) + if keep_original: # If we want to keep original images, we add all existing (including grid this time) images += processed.images @@ -254,3 +261,4 @@ def postprocess( processed.infotexts = infotexts except Exception as e: logger.error("Failed to swap face in postprocess method : %s", e) + traceback.print_exc() diff --git a/scripts/faceswaplab_api/faceswaplab_api.py b/scripts/faceswaplab_api/faceswaplab_api.py index 34c4597..de280d2 100644 --- a/scripts/faceswaplab_api/faceswaplab_api.py +++ b/scripts/faceswaplab_api/faceswaplab_api.py @@ -17,7 +17,6 @@ PostProcessingOptions, ) from client_api import api_utils -from scripts.faceswaplab_postprocessing.postprocessing_options import InpaintingWhen def encode_to_base64(image: Union[str, Image.Image, np.ndarray]) -> str: # type: ignore @@ -58,58 +57,12 @@ def encode_np_to_base64(image: np.ndarray) -> str: # type: ignore return api.encode_pil_to_base64(pil) -def get_postprocessing_options( - options: api_utils.PostProcessingOptions, -) -> PostProcessingOptions: - pp_options = PostProcessingOptions( - face_restorer_name=options.face_restorer_name, - restorer_visibility=options.restorer_visibility, - codeformer_weight=options.codeformer_weight, - upscaler_name=options.upscaler_name, - scale=options.scale, - upscale_visibility=options.upscaler_visibility, - inpainting_denoising_strengh=options.inpainting_denoising_strengh, - inpainting_prompt=options.inpainting_prompt, - inpainting_negative_prompt=options.inpainting_negative_prompt, - inpainting_steps=options.inpainting_steps, - inpainting_sampler=options.inpainting_sampler, - # hacky way to prevent having a separate file for Inpainting when (2 classes) - # therfore a conversion is required from api IW to server side IW - inpainting_when=InpaintingWhen(options.inpainting_when.value), - inpainting_model=options.inpainting_model, - ) - - assert isinstance( - pp_options.inpainting_when, InpaintingWhen - ), "Value is not a valid InpaintingWhen enum" - - return pp_options - - def get_faceswap_units_settings( api_units: List[api_utils.FaceSwapUnit], ) -> List[FaceSwapUnitSettings]: units = [] for u in api_units: - units.append( - FaceSwapUnitSettings( - source_img=base64_to_pil(u.source_img), - source_face=u.source_face, - _batch_files=u.get_batch_images(), - blend_faces=u.blend_faces, - enable=True, - same_gender=u.same_gender, - sort_by_size=u.sort_by_size, - check_similarity=u.check_similarity, - _compute_similarity=u.compute_similarity, - min_ref_sim=u.min_ref_sim, - min_sim=u.min_sim, - _faces_index=",".join([str(i) for i in (u.faces_index)]), - reference_face_index=u.reference_face_index, - swap_in_generated=True, - swap_in_source=False, - ) - ) + units.append(FaceSwapUnitSettings.from_api_dto(u)) return units @@ -137,7 +90,7 @@ async def swap_face( if src_image is not None: if request.postprocessing: - pp_options = get_postprocessing_options(request.postprocessing) + pp_options = PostProcessingOptions.from_api_dto(request.postprocessing) units = get_faceswap_units_settings(request.units) swapped_images = swapper.batch_process( @@ -172,7 +125,7 @@ async def extract( ) -> api_utils.FaceSwapExtractResponse: pp_options = None if request.postprocessing: - pp_options = get_postprocessing_options(request.postprocessing) + pp_options = PostProcessingOptions.from_api_dto(request.postprocessing) images = [base64_to_pil(img) for img in request.images] faces = swapper.extract_faces( images, extract_path=None, postprocess_options=pp_options diff --git a/scripts/faceswaplab_globals.py b/scripts/faceswaplab_globals.py index a93249c..11f70f4 100644 --- a/scripts/faceswaplab_globals.py +++ b/scripts/faceswaplab_globals.py @@ -8,7 +8,7 @@ scripts.basedir(), "extensions", "sd-webui-faceswaplab", "references" ) -VERSION_FLAG: str = "v1.1.2" +VERSION_FLAG: str = "v1.2.0" EXTENSION_PATH = os.path.join("extensions", "sd-webui-faceswaplab") # The NSFW score threshold. If any part of the image has a score greater than this threshold, the image will be considered NSFW. diff --git a/scripts/faceswaplab_inpainting/faceswaplab_inpainting.py b/scripts/faceswaplab_inpainting/faceswaplab_inpainting.py new file mode 100644 index 0000000..716d1b3 --- /dev/null +++ b/scripts/faceswaplab_inpainting/faceswaplab_inpainting.py @@ -0,0 +1,41 @@ +from dataclasses import dataclass +from typing import List +import gradio as gr +from client_api import api_utils + + +@dataclass +class InpaintingOptions: + inpainting_denoising_strengh: float = 0 + inpainting_prompt: str = "" + inpainting_negative_prompt: str = "" + inpainting_steps: int = 20 + inpainting_sampler: str = "Euler" + inpainting_model: str = "Current" + + @staticmethod + def from_gradio(components: List[gr.components.Component]) -> "InpaintingOptions": + return InpaintingOptions(*components) + + @staticmethod + def from_api_dto(dto: api_utils.InpaintingOptions) -> "InpaintingOptions": + """ + Converts a InpaintingOptions object from an API DTO (Data Transfer Object). + + :param options: An object of api_utils.InpaintingOptions representing the + post-processing options as received from the API. + :return: A InpaintingOptions instance containing the translated values + from the API DTO. + """ + if dto is None: + # Return default values + return InpaintingOptions() + + return InpaintingOptions( + inpainting_denoising_strengh=dto.inpainting_denoising_strengh, + inpainting_prompt=dto.inpainting_prompt, + inpainting_negative_prompt=dto.inpainting_negative_prompt, + inpainting_steps=dto.inpainting_steps, + inpainting_sampler=dto.inpainting_sampler, + inpainting_model=dto.inpainting_model, + ) diff --git a/scripts/faceswaplab_postprocessing/i2i_pp.py b/scripts/faceswaplab_inpainting/i2i_pp.py similarity index 50% rename from scripts/faceswaplab_postprocessing/i2i_pp.py rename to scripts/faceswaplab_inpainting/i2i_pp.py index 09ebce2..61a4850 100644 --- a/scripts/faceswaplab_postprocessing/i2i_pp.py +++ b/scripts/faceswaplab_inpainting/i2i_pp.py @@ -1,53 +1,60 @@ +from scripts.faceswaplab_inpainting.faceswaplab_inpainting import InpaintingOptions from scripts.faceswaplab_utils.faceswaplab_logging import logger from PIL import Image from modules import shared from scripts.faceswaplab_utils import imgutils from modules import shared, processing from modules.processing import StableDiffusionProcessingImg2Img -from scripts.faceswaplab_postprocessing.postprocessing_options import ( - PostProcessingOptions, -) from modules import sd_models - +import traceback from scripts.faceswaplab_swapping import swapper +from scripts.faceswaplab_utils.typing import * +from typing import * -def img2img_diffusion(img: Image.Image, pp: PostProcessingOptions) -> Image.Image: - if pp.inpainting_denoising_strengh == 0: - logger.info("Discard inpainting denoising strength is 0") +def img2img_diffusion( + img: PILImage, options: InpaintingOptions, faces: Optional[List[Face]] = None +) -> Image.Image: + if not options or options.inpainting_denoising_strengh == 0: + logger.info("Discard inpainting denoising strength is 0 or no inpainting") return img try: logger.info( f"""Inpainting face -Sampler : {pp.inpainting_sampler} -inpainting_denoising_strength : {pp.inpainting_denoising_strengh} -inpainting_steps : {pp.inpainting_steps} +Sampler : {options.inpainting_sampler} +inpainting_denoising_strength : {options.inpainting_denoising_strengh} +inpainting_steps : {options.inpainting_steps} """ ) - if not isinstance(pp.inpainting_sampler, str): - pp.inpainting_sampler = "Euler" + if not isinstance(options.inpainting_sampler, str): + options.inpainting_sampler = "Euler" logger.info("send faces to image to image") img = img.copy() - faces = swapper.get_faces(imgutils.pil_to_cv2(img)) + + if not faces: + faces = swapper.get_faces(imgutils.pil_to_cv2(img)) + if faces: for face in faces: bbox = face.bbox.astype(int) mask = imgutils.create_mask(img, bbox) - prompt = pp.inpainting_prompt.replace( + prompt = options.inpainting_prompt.replace( "[gender]", "man" if face["gender"] == 1 else "woman" ) - negative_prompt = pp.inpainting_negative_prompt.replace( + negative_prompt = options.inpainting_negative_prompt.replace( "[gender]", "man" if face["gender"] == 1 else "woman" ) logger.info("Denoising prompt : %s", prompt) - logger.info("Denoising strenght : %s", pp.inpainting_denoising_strengh) + logger.info( + "Denoising strenght : %s", options.inpainting_denoising_strengh + ) i2i_kwargs = { - "sampler_name": pp.inpainting_sampler, + "sampler_name": options.inpainting_sampler, "do_not_save_samples": True, - "steps": pp.inpainting_steps, + "steps": options.inpainting_steps, "width": img.width, "inpainting_fill": 1, "inpaint_full_res": True, @@ -55,17 +62,26 @@ def img2img_diffusion(img: Image.Image, pp: PostProcessingOptions) -> Image.Imag "mask": mask, "prompt": prompt, "negative_prompt": negative_prompt, - "denoising_strength": pp.inpainting_denoising_strengh, + "denoising_strength": options.inpainting_denoising_strengh, + "override_settings": { + "return_mask_composite": False, + "save_images_before_face_restoration": False, + "save_images_before_highres_fix": False, + "save_images_before_color_correction": False, + "save_mask": False, + "save_mask_composite": False, + "samples_save": False, + }, } current_model_checkpoint = shared.opts.sd_model_checkpoint - if pp.inpainting_model and pp.inpainting_model != "Current": + if options.inpainting_model and options.inpainting_model != "Current": # Change checkpoint - shared.opts.sd_model_checkpoint = pp.inpainting_model + shared.opts.sd_model_checkpoint = options.inpainting_model sd_models.select_checkpoint sd_models.load_model() i2i_p = StableDiffusionProcessingImg2Img([img], **i2i_kwargs) i2i_processed = processing.process_images(i2i_p) - if pp.inpainting_model and pp.inpainting_model != "Current": + if options.inpainting_model and options.inpainting_model != "Current": # Restore checkpoint shared.opts.sd_model_checkpoint = current_model_checkpoint sd_models.select_checkpoint @@ -76,8 +92,6 @@ def img2img_diffusion(img: Image.Image, pp: PostProcessingOptions) -> Image.Imag img = images[0] return img except Exception as e: - logger.error("Failed to apply img2img to face : %s", e) - import traceback - + logger.error("Failed to apply inpainting to face : %s", e) traceback.print_exc() raise e diff --git a/scripts/faceswaplab_postprocessing/postprocessing.py b/scripts/faceswaplab_postprocessing/postprocessing.py index 813a5dc..cba191e 100644 --- a/scripts/faceswaplab_postprocessing/postprocessing.py +++ b/scripts/faceswaplab_postprocessing/postprocessing.py @@ -4,8 +4,9 @@ PostProcessingOptions, InpaintingWhen, ) -from scripts.faceswaplab_postprocessing.i2i_pp import img2img_diffusion +from scripts.faceswaplab_inpainting.i2i_pp import img2img_diffusion from scripts.faceswaplab_postprocessing.upscaling import upscale_img, restore_face +import traceback def enhance_image(image: Image.Image, pp_options: PostProcessingOptions) -> Image.Image: @@ -19,7 +20,9 @@ def enhance_image(image: Image.Image, pp_options: PostProcessingOptions) -> Imag or pp_options.inpainting_when == InpaintingWhen.BEFORE_UPSCALING ): logger.debug("Inpaint before upscale") - result_image = img2img_diffusion(result_image, pp_options) + result_image = img2img_diffusion( + img=result_image, options=pp_options.inpainting_options + ) result_image = upscale_img(result_image, pp_options) if ( @@ -27,7 +30,9 @@ def enhance_image(image: Image.Image, pp_options: PostProcessingOptions) -> Imag or pp_options.inpainting_when == InpaintingWhen.BEFORE_RESTORE_FACE ): logger.debug("Inpaint before restore") - result_image = img2img_diffusion(result_image, pp_options) + result_image = img2img_diffusion( + result_image, pp_options.inpainting_options + ) result_image = restore_face(result_image, pp_options) @@ -36,9 +41,11 @@ def enhance_image(image: Image.Image, pp_options: PostProcessingOptions) -> Imag or pp_options.inpainting_when == InpaintingWhen.AFTER_ALL ): logger.debug("Inpaint after all") - result_image = img2img_diffusion(result_image, pp_options) + result_image = img2img_diffusion( + result_image, pp_options.inpainting_options + ) except Exception as e: - logger.error("Failed to upscale %s", e) - + logger.error("Failed to post-process %s", e) + traceback.print_exc() return result_image diff --git a/scripts/faceswaplab_postprocessing/postprocessing_options.py b/scripts/faceswaplab_postprocessing/postprocessing_options.py index e2f6f39..b7f7bcd 100644 --- a/scripts/faceswaplab_postprocessing/postprocessing_options.py +++ b/scripts/faceswaplab_postprocessing/postprocessing_options.py @@ -3,6 +3,8 @@ from dataclasses import dataclass from modules import shared from enum import Enum +from scripts.faceswaplab_inpainting.faceswaplab_inpainting import InpaintingOptions +from client_api import api_utils class InpaintingWhen(Enum): @@ -22,13 +24,10 @@ class PostProcessingOptions: scale: float = 1 upscale_visibility: float = 0.5 - inpainting_denoising_strengh: float = 0 - inpainting_prompt: str = "" - inpainting_negative_prompt: str = "" - inpainting_steps: int = 20 - inpainting_sampler: str = "Euler" inpainting_when: InpaintingWhen = InpaintingWhen.BEFORE_UPSCALING - inpainting_model: str = "Current" + + # (Don't use optional for this or gradio parsing will fail) : + inpainting_options: InpaintingOptions = None @property def upscaler(self) -> UpscalerData: @@ -43,3 +42,28 @@ def face_restorer(self) -> FaceRestoration: if face_restorer.name() == self.face_restorer_name: return face_restorer return None + + @staticmethod + def from_api_dto( + options: api_utils.PostProcessingOptions, + ) -> "PostProcessingOptions": + """ + Converts a PostProcessingOptions object from an API DTO (Data Transfer Object). + + :param options: An object of api_utils.PostProcessingOptions representing the + post-processing options as received from the API. + :return: A PostProcessingOptions instance containing the translated values + from the API DTO. + """ + return PostProcessingOptions( + face_restorer_name=options.face_restorer_name, + restorer_visibility=options.restorer_visibility, + codeformer_weight=options.codeformer_weight, + upscaler_name=options.upscaler_name, + scale=options.scale, + upscale_visibility=options.upscaler_visibility, + inpainting_when=InpaintingWhen(options.inpainting_when.value), + inpainting_options=InpaintingOptions.from_api_dto( + options.inpainting_options + ), + ) diff --git a/scripts/faceswaplab_postprocessing/upscaling.py b/scripts/faceswaplab_postprocessing/upscaling.py index 04ba5fb..746f229 100644 --- a/scripts/faceswaplab_postprocessing/upscaling.py +++ b/scripts/faceswaplab_postprocessing/upscaling.py @@ -5,11 +5,12 @@ from PIL import Image import numpy as np from modules import codeformer_model +from scripts.faceswaplab_utils.typing import * -def upscale_img(image: Image.Image, pp_options: PostProcessingOptions) -> Image.Image: +def upscale_img(image: PILImage, pp_options: PostProcessingOptions) -> PILImage: if pp_options.upscaler is not None and pp_options.upscaler.name != "None": - original_image = image.copy() + original_image: PILImage = image.copy() logger.info( "Upscale with %s scale = %s", pp_options.upscaler.name, @@ -18,7 +19,12 @@ def upscale_img(image: Image.Image, pp_options: PostProcessingOptions) -> Image. result_image = pp_options.upscaler.scaler.upscale( image, pp_options.scale, pp_options.upscaler.data_path ) - if pp_options.scale == 1: + + # FIXME : Could be better (managing images whose dimensions are not multiples of 16) + if pp_options.scale == 1 and original_image.size == result_image.size: + logger.debug( + "Sizes orig=%s, result=%s", original_image.size, result_image.size + ) result_image = Image.blend( original_image, result_image, pp_options.upscale_visibility ) diff --git a/scripts/faceswaplab_swapping/facemask.py b/scripts/faceswaplab_swapping/facemask.py index 8af364c..d49b713 100644 --- a/scripts/faceswaplab_swapping/facemask.py +++ b/scripts/faceswaplab_swapping/facemask.py @@ -20,7 +20,7 @@ def get_parsing_model(device: torch_device) -> torch.nn.Module: Returns: The parsing model. """ - return init_parsing_model(device=device) + return init_parsing_model(device=device) # type: ignore def convert_image_to_tensor( diff --git a/scripts/faceswaplab_swapping/parsing/__init__.py b/scripts/faceswaplab_swapping/parsing/__init__.py index 39fe887..e045dec 100644 --- a/scripts/faceswaplab_swapping/parsing/__init__.py +++ b/scripts/faceswaplab_swapping/parsing/__init__.py @@ -50,7 +50,7 @@ ROOT_DIR = FACE_PARSER_DIR -def load_file_from_url(url, model_dir=None, progress=True, file_name=None): +def load_file_from_url(url: str, model_dir=None, progress=True, file_name=None): """Ref:https://github.com/1adrianb/face-alignment/blob/master/face_alignment/utils.py""" if model_dir is None: hub_dir = get_dir() diff --git a/scripts/faceswaplab_swapping/swapper.py b/scripts/faceswaplab_swapping/swapper.py index 27496b6..d2dd2d4 100644 --- a/scripts/faceswaplab_swapping/swapper.py +++ b/scripts/faceswaplab_swapping/swapper.py @@ -7,7 +7,7 @@ import cv2 import insightface import numpy as np -from insightface.app.common import Face +from insightface.app.common import Face as ISFace from PIL import Image from sklearn.metrics.pairwise import cosine_similarity @@ -28,7 +28,8 @@ ) from scripts.faceswaplab_utils.models_utils import get_current_model import gradio as gr - +from scripts.faceswaplab_utils.typing import CV2ImgU8, PILImage, Face +from scripts.faceswaplab_inpainting.i2i_pp import img2img_diffusion providers = ["CPUExecutionProvider"] @@ -60,7 +61,7 @@ def cosine_similarity_face(face1: Face, face2: Face) -> float: return max(0, similarity[0, 0]) -def compare_faces(img1: Image.Image, img2: Image.Image) -> float: +def compare_faces(img1: PILImage, img2: PILImage) -> float: """ Compares the similarity between two faces extracted from images using cosine similarity. @@ -87,22 +88,22 @@ def compare_faces(img1: Image.Image, img2: Image.Image) -> float: def batch_process( - src_images: List[Image.Image], + src_images: List[PILImage], save_path: Optional[str], units: List[FaceSwapUnitSettings], postprocess_options: PostProcessingOptions, -) -> Optional[List[Image.Image]]: +) -> Optional[List[PILImage]]: """ Process a batch of images, apply face swapping according to the given settings, and optionally save the resulting images to a specified path. Args: - src_images (List[Image.Image]): List of source PIL Images to process. + src_images (List[PILImage]): List of source PIL Images to process. save_path (Optional[str]): Destination path where the processed images will be saved. If None, no images are saved. units (List[FaceSwapUnitSettings]): List of FaceSwapUnitSettings to apply to the images. postprocess_options (PostProcessingOptions): Post-processing settings to be applied to the images. Returns: - Optional[List[Image.Image]]: List of processed images, or None in case of an exception. + Optional[List[PILImage]]: List of processed images, or None in case of an exception. Raises: Any exceptions raised by the underlying process will be logged and the function will return None. @@ -149,7 +150,7 @@ def batch_process( def extract_faces( - images: List[Image.Image], + images: List[PILImage], extract_path: Optional[str], postprocess_options: PostProcessingOptions, ) -> Optional[List[str]]: @@ -206,7 +207,7 @@ def extract_faces( return result_images except Exception as e: - logger.info("Failed to extract : %s", e) + logger.error("Failed to extract : %s", e) import traceback traceback.print_exc() @@ -273,16 +274,15 @@ def getFaceSwapModel(model_path: str) -> upscaled_inswapper.UpscaledINSwapper: def get_faces( - img_data: np.ndarray, # type: ignore + img_data: CV2ImgU8, det_size: Tuple[int, int] = (640, 640), det_thresh: Optional[float] = None, - sort_by_face_size: bool = False, ) -> List[Face]: """ Detects and retrieves faces from an image using an analysis model. Args: - img_data (np.ndarray): The image data as a NumPy array. + img_data (CV2ImgU8): The image data as a NumPy array. det_size (tuple): The desired detection size (width, height). Defaults to (640, 640). sort_by_face_size (bool) : Will sort the faces by their size from larger to smaller face @@ -309,26 +309,55 @@ def get_faces( return get_faces(img_data, det_size=det_size_half, det_thresh=det_thresh) try: - if sort_by_face_size: - return sorted( - face, - reverse=True, - key=lambda x: (x.bbox[2] - x.bbox[0]) * (x.bbox[3] - x.bbox[1]), - ) - # Sort the detected faces based on their x-coordinate of the bounding box return sorted(face, key=lambda x: x.bbox[0]) except Exception as e: return [] +def filter_faces( + all_faces: List[Face], + faces_index: Set[int], + source_gender: int = None, + sort_by_face_size: bool = False, +) -> List[Face]: + """ + Sorts and filters a list of faces based on specified criteria. + + This function takes a list of Face objects and can sort them by face size and filter them by gender. + Sorting by face size is performed if sort_by_face_size is set to True, and filtering by gender is + performed if source_gender is provided. + + :param faces: A list of Face objects representing the faces to be sorted and filtered. + :param faces_index: A set of faces index + :param source_gender: An optional integer representing the gender by which to filter the faces. + If provided, only faces with the specified gender will be included in the result. + :param sort_by_face_size: A boolean indicating whether to sort the faces by size. If True, faces are + sorted in descending order by size, calculated as the area of the bounding box. + :return: A list of Face objects sorted and filtered according to the specified criteria. + """ + filtered_faces = copy.copy(all_faces) + if sort_by_face_size: + filtered_faces = sorted( + all_faces, + reverse=True, + key=lambda x: (x.bbox[2] - x.bbox[0]) * (x.bbox[3] - x.bbox[1]), + ) + + if source_gender is not None: + filtered_faces = [ + face for face in filtered_faces if face["gender"] == source_gender + ] + return [face for i, face in enumerate(filtered_faces) if i in faces_index] + + @dataclass class ImageResult: """ Represents the result of an image swap operation """ - image: Image.Image + image: PILImage """ The image object with the swapped face """ @@ -362,7 +391,7 @@ def get_or_default(l: List[Any], index: int, default: Any) -> Any: return l[index] if index < len(l) else default -def get_faces_from_img_files(files: List[gr.File]) -> List[Optional[np.ndarray]]: # type: ignore +def get_faces_from_img_files(files: List[gr.File]) -> List[Optional[CV2ImgU8]]: """ Extracts faces from a list of image files. @@ -388,7 +417,7 @@ def get_faces_from_img_files(files: List[gr.File]) -> List[Optional[np.ndarray]] return faces -def blend_faces(faces: List[Face]) -> Face: +def blend_faces(faces: List[Face]) -> Optional[Face]: """ Blends the embeddings of multiple faces into a single face. @@ -418,16 +447,10 @@ def blend_faces(faces: List[Face]) -> Face: # Create a new Face object using the properties of the first face in the list # Assign the blended embedding to the blended Face object - blended = Face( + blended = ISFace( embedding=blended_embedding, gender=faces[0].gender, age=faces[0].age ) - assert ( - not np.array_equal(blended.embedding, faces[0].embedding) - if len(faces) > 1 - else True - ), "If len(faces)>0, the blended embedding should not be the same than the first image" - return blended # Return None if the input list is empty @@ -435,85 +458,80 @@ def blend_faces(faces: List[Face]) -> Face: def swap_face( - reference_face: np.ndarray, # type: ignore - source_face: np.ndarray, # type: ignore - target_img: Image.Image, + reference_face: CV2ImgU8, + source_face: Face, + target_img: PILImage, + target_faces: List[Face], model: str, - faces_index: Set[int] = {0}, - same_gender: bool = True, upscaled_swapper: bool = False, compute_similarity: bool = True, - sort_by_face_size: bool = False, ) -> ImageResult: """ Swaps faces in the target image with the source face. Args: - reference_face (np.ndarray): The reference face used for similarity comparison. - source_face (np.ndarray): The source face to be swapped. - target_img (Image.Image): The target image to swap faces in. + reference_face (CV2ImgU8): The reference face used for similarity comparison. + source_face (CV2ImgU8): The source face to be swapped. + target_img (PILImage): The target image to swap faces in. model (str): Path to the face swap model. - faces_index (Set[int], optional): Set of indices specifying which faces to swap. Defaults to {0}. - same_gender (bool, optional): If True, only swap faces with the same gender as the source face. Defaults to True. Returns: ImageResult: An object containing the swapped image and similarity scores. """ return_result = ImageResult(target_img, {}, {}) + target_img_cv2: CV2ImgU8 = cv2.cvtColor(np.array(target_img), cv2.COLOR_RGB2BGR) try: - target_img = cv2.cvtColor(np.array(target_img), cv2.COLOR_RGB2BGR) gender = source_face["gender"] logger.info("Source Gender %s", gender) if source_face is not None: - result = target_img + result = target_img_cv2 model_path = os.path.join(os.path.abspath(os.path.dirname(__file__)), model) face_swapper = getFaceSwapModel(model_path) - target_faces = get_faces(target_img, sort_by_face_size=sort_by_face_size) logger.info("Target faces count : %s", len(target_faces)) - if same_gender: - target_faces = [x for x in target_faces if x["gender"] == gender] - logger.info("Target Gender Matches count %s", len(target_faces)) - for i, swapped_face in enumerate(target_faces): logger.info(f"swap face {i}") - if i in faces_index: - # type : ignore - result = face_swapper.get( - result, swapped_face, source_face, upscale=upscaled_swapper - ) + + result = face_swapper.get( + img=result, + target_face=swapped_face, + source_face=source_face, + upscale=upscaled_swapper, + ) # type: ignore result_image = Image.fromarray(cv2.cvtColor(result, cv2.COLOR_BGR2RGB)) return_result.image = result_image - if compute_similarity: - try: - result_faces = get_faces( - cv2.cvtColor(np.array(result_image), cv2.COLOR_RGB2BGR), - sort_by_face_size=sort_by_face_size, - ) - if same_gender: - result_faces = [ - x for x in result_faces if x["gender"] == gender - ] - - for i, swapped_face in enumerate(result_faces): - logger.info(f"compare face {i}") - if i in faces_index and i < len(target_faces): - return_result.similarity[i] = cosine_similarity_face( - source_face, swapped_face - ) - return_result.ref_similarity[i] = cosine_similarity_face( - reference_face, swapped_face - ) - - logger.info(f"similarity {return_result.similarity}") - logger.info(f"ref similarity {return_result.ref_similarity}") - - except Exception as e: - logger.error("Similarity processing failed %s", e) - raise e + # FIXME : recompute similarity + + # if compute_similarity: + # try: + # result_faces = get_faces( + # cv2.cvtColor(np.array(result_image), cv2.COLOR_RGB2BGR), + # sort_by_face_size=sort_by_face_size, + # ) + # if same_gender: + # result_faces = [ + # x for x in result_faces if x["gender"] == gender + # ] + + # for i, swapped_face in enumerate(result_faces): + # logger.info(f"compare face {i}") + # if i in faces_index and i < len(target_faces): + # return_result.similarity[i] = cosine_similarity_face( + # source_face, swapped_face + # ) + # return_result.ref_similarity[i] = cosine_similarity_face( + # reference_face, swapped_face + # ) + + # logger.info(f"similarity {return_result.similarity}") + # logger.info(f"ref similarity {return_result.ref_similarity}") + + # except Exception as e: + # logger.error("Similarity processing failed %s", e) + # raise e except Exception as e: logger.error("Conversion failed %s", e) raise e @@ -523,11 +541,11 @@ def swap_face( def process_image_unit( model: str, unit: FaceSwapUnitSettings, - image: Image.Image, + image: PILImage, info: str = None, upscaled_swapper: bool = False, force_blend: bool = False, -) -> List[Tuple[Image.Image, str]]: +) -> List[Tuple[PILImage, str]]: """Process one image and return a List of (image, info) (one if blended, many if not). Args: @@ -541,6 +559,8 @@ def process_image_unit( results = [] if unit.enable: + faces = get_faces(pil_to_cv2(image)) + if check_against_nsfw(image): return [(image, info)] if not unit.blend_faces and not force_blend: @@ -549,15 +569,10 @@ def process_image_unit( else: logger.info("blend all faces together") src_faces = [unit.blended_faces] - assert ( - not np.array_equal( - unit.reference_face.embedding, src_faces[0].embedding - ) - if len(unit.faces) > 1 - else True - ), "Reference face cannot be the same as blended" for i, src_face in enumerate(src_faces): + current_image = image + logger.info(f"Process face {i}") if unit.reference_face is not None: reference_face = unit.reference_face @@ -565,18 +580,35 @@ def process_image_unit( logger.info("Use source face as reference face") reference_face = src_face + target_faces = filter_faces( + faces, + faces_index=unit.faces_index, + source_gender=src_face["gender"] if unit.same_gender else None, + sort_by_face_size=unit.sort_by_size, + ) + + # Apply pre-inpainting to image + if unit.pre_inpainting.inpainting_denoising_strengh > 0: + current_image = img2img_diffusion( + img=current_image, faces=target_faces, options=unit.pre_inpainting + ) + save_img_debug(image, "Before swap") result: ImageResult = swap_face( - reference_face, - src_face, - image, - faces_index=unit.faces_index, + reference_face=reference_face, + source_face=src_face, + target_img=current_image, + target_faces=target_faces, model=model, - same_gender=unit.same_gender, upscaled_swapper=upscaled_swapper, compute_similarity=unit.compute_similarity, - sort_by_face_size=unit.sort_by_size, ) + # Apply post-inpainting to image + if unit.post_inpainting.inpainting_denoising_strengh > 0: + result.image = img2img_diffusion( + img=result.image, faces=target_faces, options=unit.post_inpainting + ) + save_img_debug(result.image, "After swap") if result.image is None: @@ -610,17 +642,17 @@ def process_image_unit( def process_images_units( model: str, units: List[FaceSwapUnitSettings], - images: List[Tuple[Optional[Image.Image], Optional[str]]], + images: List[Tuple[Optional[PILImage], Optional[str]]], upscaled_swapper: bool = False, force_blend: bool = False, -) -> Optional[List[Tuple[Image.Image, str]]]: +) -> Optional[List[Tuple[PILImage, str]]]: """ Process a list of images using a specified model and unit settings for face swapping. Args: model (str): The name of the model to use for processing. units (List[FaceSwapUnitSettings]): A list of settings for face swap units to apply on each image. - images (List[Tuple[Optional[Image.Image], Optional[str]]]): A list of tuples, each containing + images (List[Tuple[Optional[PILImage], Optional[str]]]): A list of tuples, each containing an image and its associated info string. If an image or info string is not available, its value can be None. upscaled_swapper (bool, optional): If True, uses an upscaled version of the face swapper. @@ -629,7 +661,7 @@ def process_images_units( image. Defaults to False. Returns: - Optional[List[Tuple[Image.Image, str]]]: A list of tuples, each containing a processed image + Optional[List[Tuple[PILImage, str]]]: A list of tuples, each containing a processed image and its associated info string. If no units are provided for processing, returns None. """ diff --git a/scripts/faceswaplab_swapping/upscaled_inswapper.py b/scripts/faceswaplab_swapping/upscaled_inswapper.py index 2726e1b..a441dc0 100644 --- a/scripts/faceswaplab_swapping/upscaled_inswapper.py +++ b/scripts/faceswaplab_swapping/upscaled_inswapper.py @@ -1,3 +1,4 @@ +from typing import Any, Tuple, Union import cv2 import numpy as np from insightface.model_zoo.inswapper import INSwapper @@ -12,6 +13,7 @@ ) from scripts.faceswaplab_swapping.facemask import generate_face_mask from scripts.faceswaplab_utils.imgutils import cv2_to_pil, pil_to_cv2 +from scripts.faceswaplab_utils.typing import CV2ImgU8, Face def get_upscaler() -> UpscalerData: @@ -23,7 +25,25 @@ def get_upscaler() -> UpscalerData: return None -def merge_images_with_mask(image1, image2, mask): +def merge_images_with_mask( + image1: CV2ImgU8, image2: CV2ImgU8, mask: CV2ImgU8 +) -> CV2ImgU8: + """ + Merges two images using a given mask. The regions where the mask is set will be replaced with the corresponding + areas of the second image. + + Args: + image1 (CV2Img): The base image, which must have the same shape as image2. + image2 (CV2Img): The image to be merged, which must have the same shape as image1. + mask (CV2Img): A binary mask specifying the regions to be merged. The mask shape should match image1's first two dimensions. + + Returns: + CV2Img: The merged image. + + Raises: + ValueError: If the shapes of the images and mask do not match. + """ + if image1.shape != image2.shape or image1.shape[:2] != mask.shape: raise ValueError("Img should have the same shape") mask = mask.astype(np.uint8) @@ -34,42 +54,80 @@ def merge_images_with_mask(image1, image2, mask): return merged_image -def erode_mask(mask, kernel_size=3, iterations=1): +def erode_mask(mask: CV2ImgU8, kernel_size: int = 3, iterations: int = 1) -> CV2ImgU8: + """ + Erodes a binary mask using a given kernel size and number of iterations. + + Args: + mask (CV2Img): The binary mask to erode. + kernel_size (int, optional): The size of the kernel. Default is 3. + iterations (int, optional): The number of erosion iterations. Default is 1. + + Returns: + CV2Img: The eroded mask. + """ kernel = np.ones((kernel_size, kernel_size), np.uint8) eroded_mask = cv2.erode(mask, kernel, iterations=iterations) return eroded_mask -def apply_gaussian_blur(mask, kernel_size=(5, 5), sigma_x=0): +def apply_gaussian_blur( + mask: CV2ImgU8, kernel_size: Tuple[int, int] = (5, 5), sigma_x: int = 0 +) -> CV2ImgU8: + """ + Applies a Gaussian blur to a mask. + + Args: + mask (CV2Img): The mask to blur. + kernel_size (tuple, optional): The size of the kernel, e.g. (5, 5). Default is (5, 5). + sigma_x (int, optional): The standard deviation in the X direction. Default is 0. + + Returns: + CV2Img: The blurred mask. + """ blurred_mask = cv2.GaussianBlur(mask, kernel_size, sigma_x) return blurred_mask -def dilate_mask(mask, kernel_size=5, iterations=1): +def dilate_mask(mask: CV2ImgU8, kernel_size: int = 5, iterations: int = 1) -> CV2ImgU8: + """ + Dilates a binary mask using a given kernel size and number of iterations. + + Args: + mask (CV2Img): The binary mask to dilate. + kernel_size (int, optional): The size of the kernel. Default is 5. + iterations (int, optional): The number of dilation iterations. Default is 1. + + Returns: + CV2Img: The dilated mask. + """ kernel = np.ones((kernel_size, kernel_size), np.uint8) dilated_mask = cv2.dilate(mask, kernel, iterations=iterations) return dilated_mask -def get_face_mask(aimg, bgr_fake): +def get_face_mask(aimg: CV2ImgU8, bgr_fake: CV2ImgU8) -> CV2ImgU8: + """ + Generates a face mask by performing bitwise OR on two face masks and then dilating the result. + + Args: + aimg (CV2Img): Input image for generating the first face mask. + bgr_fake (CV2Img): Input image for generating the second face mask. + + Returns: + CV2Img: The combined and dilated face mask. + """ mask1 = generate_face_mask(aimg, device=shared.device) mask2 = generate_face_mask(bgr_fake, device=shared.device) mask = dilate_mask(cv2.bitwise_or(mask1, mask2)) return mask -class UpscaledINSwapper: +class UpscaledINSwapper(INSwapper): def __init__(self, inswapper: INSwapper): self.__dict__.update(inswapper.__dict__) - def forward(self, img, latent): - img = (img - self.input_mean) / self.input_std - pred = self.session.run( - self.output_names, {self.input_names[0]: img, self.input_names[1]: latent} - )[0] - return pred - - def super_resolution(self, img, k=2): + def super_resolution(self, img: CV2ImgU8, k: int = 2) -> CV2ImgU8: pil_img = cv2_to_pil(img) options = PostProcessingOptions( upscaler_name=opts.data.get( @@ -91,7 +149,14 @@ def super_resolution(self, img, k=2): upscaled = upscaling.restore_face(upscaled, options) return pil_to_cv2(upscaled) - def get(self, img, target_face, source_face, paste_back=True, upscale=True): + def get( + self, + img: CV2ImgU8, + target_face: Face, + source_face: Face, + paste_back: bool = True, + upscale: bool = True, + ) -> Union[CV2ImgU8, Tuple[CV2ImgU8, Any]]: aimg, M = face_align.norm_crop2(img, target_face.kps, self.input_size[0]) blob = cv2.dnn.blobFromImage( aimg, @@ -116,7 +181,7 @@ def get(self, img, target_face, source_face, paste_back=True, upscale=True): else: target_img = img - def compute_diff(bgr_fake, aimg): + def compute_diff(bgr_fake: CV2ImgU8, aimg: CV2ImgU8) -> CV2ImgU8: fake_diff = bgr_fake.astype(np.float32) - aimg.astype(np.float32) fake_diff = np.abs(fake_diff).mean(axis=2) fake_diff[:2, :] = 0 diff --git a/scripts/faceswaplab_ui/faceswaplab_inpainting_ui.py b/scripts/faceswaplab_ui/faceswaplab_inpainting_ui.py new file mode 100644 index 0000000..bb4dd93 --- /dev/null +++ b/scripts/faceswaplab_ui/faceswaplab_inpainting_ui.py @@ -0,0 +1,68 @@ +from typing import List +import gradio as gr +from modules.shared import opts +from modules import sd_models, sd_samplers + + +def face_inpainting_ui( + name: str, id_prefix: str = "faceswaplab", description: str = "" +) -> List[gr.components.Component]: + with gr.Accordion(name, open=False): + gr.Markdown(description) + inpainting_denoising_strength = gr.Slider( + 0, + 1, + 0, + step=0.01, + elem_id=f"{id_prefix}_pp_inpainting_denoising_strength", + label="Denoising strenght", + ) + + inpainting_denoising_prompt = gr.Textbox( + opts.data.get( + "faceswaplab_pp_default_inpainting_prompt", "Portrait of a [gender]" + ), + elem_id=f"{id_prefix}_pp_inpainting_denoising_prompt", + label="Inpainting prompt use [gender] instead of men or woman", + ) + inpainting_denoising_negative_prompt = gr.Textbox( + opts.data.get( + "faceswaplab_pp_default_inpainting_negative_prompt", "blurry" + ), + elem_id=f"{id_prefix}_pp_inpainting_denoising_neg_prompt", + label="Inpainting negative prompt use [gender] instead of men or woman", + ) + with gr.Row(): + samplers_names = [s.name for s in sd_samplers.all_samplers] + inpainting_sampler = gr.Dropdown( + choices=samplers_names, + value=[samplers_names[0]], + label="Inpainting Sampler", + elem_id=f"{id_prefix}_pp_inpainting_sampler", + ) + inpainting_denoising_steps = gr.Slider( + 1, + 150, + 20, + step=1, + label="Inpainting steps", + elem_id=f"{id_prefix}_pp_inpainting_steps", + ) + + inpaiting_model = gr.Dropdown( + choices=["Current"] + sd_models.checkpoint_tiles(), + default="Current", + label="sd model (experimental)", + elem_id=f"{id_prefix}_pp_inpainting_sd_model", + ) + + gradio_components: List[gr.components.Component] = [ + inpainting_denoising_strength, + inpainting_denoising_prompt, + inpainting_denoising_negative_prompt, + inpainting_denoising_steps, + inpainting_sampler, + inpaiting_model, + ] + + return gradio_components diff --git a/scripts/faceswaplab_ui/faceswaplab_postprocessing_ui.py b/scripts/faceswaplab_ui/faceswaplab_postprocessing_ui.py index 62427b6..ec12a82 100644 --- a/scripts/faceswaplab_ui/faceswaplab_postprocessing_ui.py +++ b/scripts/faceswaplab_ui/faceswaplab_postprocessing_ui.py @@ -7,9 +7,9 @@ def postprocessing_ui() -> List[gr.components.Component]: - with gr.Tab(f"Post-Processing"): + with gr.Tab(f"Global Post-Processing"): gr.Markdown( - """Upscaling is performed on the whole image. Upscaling happens before face restoration.""" + """Upscaling is performed on the whole image and all faces (including not swapped). Upscaling happens before face restoration.""" ) with gr.Row(): face_restorer_name = gr.Radio( @@ -130,11 +130,11 @@ def postprocessing_ui() -> List[gr.components.Component]: upscaler_name, upscaler_scale, upscaler_visibility, + inpainting_when, inpainting_denoising_strength, inpainting_denoising_prompt, inpainting_denoising_negative_prompt, inpainting_denoising_steps, inpainting_sampler, - inpainting_when, inpaiting_model, ] diff --git a/scripts/faceswaplab_ui/faceswaplab_tab.py b/scripts/faceswaplab_ui/faceswaplab_tab.py index cea0935..622c48f 100644 --- a/scripts/faceswaplab_ui/faceswaplab_tab.py +++ b/scripts/faceswaplab_ui/faceswaplab_tab.py @@ -1,31 +1,32 @@ import os +import re +import traceback from pprint import pformat, pprint -from scripts.faceswaplab_utils import face_utils +from typing import * +from scripts.faceswaplab_utils.typing import * import gradio as gr import modules.scripts as scripts import onnx import pandas as pd -from scripts.faceswaplab_ui.faceswaplab_unit_ui import faceswap_unit_ui -from scripts.faceswaplab_ui.faceswaplab_postprocessing_ui import postprocessing_ui from modules import scripts -from PIL import Image from modules.shared import opts +from PIL import Image -from scripts.faceswaplab_utils import imgutils -from scripts.faceswaplab_utils.models_utils import get_models -from scripts.faceswaplab_utils.faceswaplab_logging import logger import scripts.faceswaplab_swapping.swapper as swapper +from scripts.faceswaplab_postprocessing.postprocessing import enhance_image from scripts.faceswaplab_postprocessing.postprocessing_options import ( PostProcessingOptions, ) -from scripts.faceswaplab_postprocessing.postprocessing import enhance_image -from dataclasses import fields -from typing import Any, Dict, List, Optional +from scripts.faceswaplab_ui.faceswaplab_postprocessing_ui import postprocessing_ui from scripts.faceswaplab_ui.faceswaplab_unit_settings import FaceSwapUnitSettings -import re +from scripts.faceswaplab_ui.faceswaplab_unit_ui import faceswap_unit_ui +from scripts.faceswaplab_utils import face_utils, imgutils +from scripts.faceswaplab_utils.faceswaplab_logging import logger +from scripts.faceswaplab_utils.models_utils import get_models +from scripts.faceswaplab_utils.ui_utils import dataclasses_from_flat_list -def compare(img1: Image.Image, img2: Image.Image) -> str: +def compare(img1: PILImage, img2: PILImage) -> str: """ Compares the similarity between two faces extracted from images using cosine similarity. @@ -43,14 +44,15 @@ def compare(img1: Image.Image, img2: Image.Image) -> str: except Exception as e: logger.error("Fail to compare", e) + traceback.print_exc() return "You need 2 images to compare" def extract_faces( files: List[gr.File], extract_path: Optional[str], - *components: List[gr.components.Component], -) -> Optional[List[Image.Image]]: + *components: Tuple[gr.components.Component, ...], +) -> Optional[List[PILImage]]: """ Extracts faces from a list of image files. @@ -69,22 +71,32 @@ def extract_faces( If no faces are found, None is returned. """ - postprocess_options = PostProcessingOptions(*components) # type: ignore - images = [ - Image.open(file.name) for file in files - ] # potentially greedy but Image.open is supposed to be lazy - return swapper.extract_faces( - images, extract_path=extract_path, postprocess_options=postprocess_options - ) + if files and len(files) == 0: + logger.error("You need at least one image file to extract") + return [] + try: + postprocess_options = PostProcessingOptions(*components) # type: ignore + images = [ + Image.open(file.name) for file in files + ] # potentially greedy but Image.open is supposed to be lazy + result_images = swapper.extract_faces( + images, extract_path=extract_path, postprocess_options=postprocess_options + ) + return result_images + except Exception as e: + logger.error("Failed to extract : %s", e) + + traceback.print_exc() + return None -def analyse_faces(image: Image.Image, det_threshold: float = 0.5) -> Optional[str]: +def analyse_faces(image: PILImage, det_threshold: float = 0.5) -> Optional[str]: """ Function to analyze the faces in an image and provide a detailed report. Parameters ---------- - image : PIL.Image.Image + image : PIL.PILImage The input image where faces will be detected. The image must be a PIL Image object. det_threshold : float, optional @@ -122,6 +134,7 @@ def analyse_faces(image: Image.Image, det_threshold: float = 0.5) -> Optional[st except Exception as e: logger.error("Analysis Failed : %s", e) + traceback.print_exc() return None @@ -142,7 +155,7 @@ def sanitize_name(name: str) -> str: def build_face_checkpoint_and_save( batch_files: gr.File, name: str -) -> Optional[Image.Image]: +) -> Optional[PILImage]: """ Builds a face checkpoint using the provided image files, performs face swapping, and saves the result to a file. If a blended face is successfully obtained and the face swapping @@ -153,7 +166,7 @@ def build_face_checkpoint_and_save( name (str): The name assigned to the face checkpoint. Returns: - PIL.Image.Image or None: The resulting swapped face image if the process is successful; None otherwise. + PIL.PILImage or None: The resulting swapped face image if the process is successful; None otherwise. """ try: @@ -170,7 +183,7 @@ def build_face_checkpoint_and_save( os.makedirs(faces_path, exist_ok=True) - target_img = None + target_img: PILImage = None if blended_face: if blended_face["gender"] == 0: target_img = Image.open(os.path.join(preview_path, "woman.png")) @@ -180,15 +193,30 @@ def build_face_checkpoint_and_save( if name == "": name = "default_name" pprint(blended_face) - result = swapper.swap_face( - blended_face, blended_face, target_img, get_models()[0] - ) - result_image = enhance_image( - result.image, - PostProcessingOptions( - face_restorer_name="CodeFormer", restorer_visibility=1 - ), + target_face = swapper.get_or_default( + swapper.get_faces(imgutils.pil_to_cv2(target_img)), 0, None ) + if target_face is None: + logger.error( + "Failed to open reference image, cannot create preview : That should not happen unless you deleted the references folder or change the detection threshold." + ) + else: + result = swapper.swap_face( + reference_face=blended_face, + target_faces=[target_face], + source_face=blended_face, + target_img=target_img, + model=get_models()[0], + upscaled_swapper=opts.data.get( + "faceswaplab_upscaled_swapper", False + ), + ) + result_image = enhance_image( + result.image, + PostProcessingOptions( + face_restorer_name="CodeFormer", restorer_visibility=1 + ), + ) file_path = os.path.join(faces_path, f"{name}.safetensors") file_number = 1 @@ -202,14 +230,16 @@ def build_face_checkpoint_and_save( face_utils.save_face(filename=file_path, face=blended_face) try: data = face_utils.load_face(filename=file_path) - print(data) + logger.debug(data) except Exception as e: print(e) return result_image - print("No face found") + logger.error("No face found") except Exception as e: logger.error("Failed to build checkpoint %s", e) + + traceback.print_exc() return None return target_img @@ -242,36 +272,32 @@ def explore_onnx_faceswap_model(model_path: str) -> pd.DataFrame: df = pd.DataFrame(data) except Exception as e: - logger.info("Failed to explore model %s", e) + logger.error("Failed to explore model %s", e) + + traceback.print_exc() return None return df def batch_process( - files: List[gr.File], save_path: str, *components: List[gr.components.Component] -) -> Optional[List[Image.Image]]: + files: List[gr.File], save_path: str, *components: Tuple[Any, ...] +) -> Optional[List[PILImage]]: try: units_count = opts.data.get("faceswaplab_units_count", 3) - units: List[FaceSwapUnitSettings] = [] - # Parse and convert units flat components into FaceSwapUnitSettings - for i in range(0, units_count): - units += [FaceSwapUnitSettings.get_unit_configuration(i, components)] # type: ignore - - for i, u in enumerate(units): - logger.debug("%s, %s", pformat(i), pformat(u)) - - # Parse the postprocessing options - # We must first find where to start from (after face swapping units) - len_conf: int = len(fields(FaceSwapUnitSettings)) - shift: int = units_count * len_conf - postprocess_options = PostProcessingOptions( - *components[shift : shift + len(fields(PostProcessingOptions))] # type: ignore + classes: List[Any] = dataclasses_from_flat_list( + [FaceSwapUnitSettings] * units_count + [PostProcessingOptions], + components, ) - logger.debug("%s", pformat(postprocess_options)) + units: List[FaceSwapUnitSettings] = [ + u for u in classes if isinstance(u, FaceSwapUnitSettings) + ] + postprocess_options = classes[-1] + images = [ Image.open(file.name) for file in files ] # potentially greedy but Image.open is supposed to be lazy + return swapper.batch_process( images, save_path=save_path, @@ -280,7 +306,6 @@ def batch_process( ) except Exception as e: logger.error("Batch Process error : %s", e) - import traceback traceback.print_exc() return None diff --git a/scripts/faceswaplab_ui/faceswaplab_unit_settings.py b/scripts/faceswaplab_ui/faceswaplab_unit_settings.py index b2fb3a3..d3ecf7c 100644 --- a/scripts/faceswaplab_ui/faceswaplab_unit_settings.py +++ b/scripts/faceswaplab_ui/faceswaplab_unit_settings.py @@ -1,15 +1,16 @@ from scripts.faceswaplab_swapping import swapper -import numpy as np import base64 import io -from dataclasses import dataclass, fields -from typing import Any, List, Optional, Set, Union +from dataclasses import dataclass +from typing import List, Optional, Set, Union import gradio as gr from insightface.app.common import Face from PIL import Image from scripts.faceswaplab_utils.imgutils import pil_to_cv2 from scripts.faceswaplab_utils.faceswaplab_logging import logger from scripts.faceswaplab_utils import face_utils +from scripts.faceswaplab_inpainting.faceswaplab_inpainting import InpaintingOptions +from client_api import api_utils @dataclass @@ -17,11 +18,11 @@ class FaceSwapUnitSettings: # ORDER of parameters is IMPORTANT. It should match the result of faceswap_unit_ui # The image given in reference - source_img: Union[Image.Image, str] + source_img: Optional[Union[Image.Image, str]] # The checkpoint file - source_face: str + source_face: Optional[str] # The batch source images - _batch_files: Union[gr.components.File, List[Image.Image]] + _batch_files: Optional[Union[gr.components.File, List[Image.Image]]] # Will blend faces if True blend_faces: bool # Enable this unit @@ -48,14 +49,39 @@ class FaceSwapUnitSettings: swap_in_source: bool # Swap in the generated image in img2img (always on for txt2img) swap_in_generated: bool + # Pre inpainting configuration (Don't use optional for this or gradio parsing will fail) : + pre_inpainting: InpaintingOptions + # Post inpainting configuration (Don't use optional for this or gradio parsing will fail) : + post_inpainting: InpaintingOptions @staticmethod - def get_unit_configuration( - unit: int, components: List[gr.components.Component] - ) -> Any: - fields_count = len(fields(FaceSwapUnitSettings)) + def from_api_dto(dto: api_utils.FaceSwapUnit) -> "FaceSwapUnitSettings": + """ + Converts a InpaintingOptions object from an API DTO (Data Transfer Object). + + :param options: An object of api_utils.InpaintingOptions representing the + post-processing options as received from the API. + :return: A InpaintingOptions instance containing the translated values + from the API DTO. + """ return FaceSwapUnitSettings( - *components[unit * fields_count : unit * fields_count + fields_count] + source_img=api_utils.base64_to_pil(dto.source_img), + source_face=dto.source_face, + _batch_files=dto.get_batch_images(), + blend_faces=dto.blend_faces, + enable=True, + same_gender=dto.same_gender, + sort_by_size=dto.sort_by_size, + check_similarity=dto.check_similarity, + _compute_similarity=dto.compute_similarity, + min_ref_sim=dto.min_ref_sim, + min_sim=dto.min_sim, + _faces_index=",".join([str(i) for i in (dto.faces_index)]), + reference_face_index=dto.reference_face_index, + swap_in_generated=True, + swap_in_source=False, + pre_inpainting=InpaintingOptions.from_api_dto(dto.pre_inpainting), + post_inpainting=InpaintingOptions.from_api_dto(dto.post_inpainting), ) @property @@ -156,24 +182,5 @@ def blended_faces(self) -> Face: """ if not hasattr(self, "_blended_faces"): self._blended_faces = swapper.blend_faces(self.faces) - assert ( - all( - [ - not np.array_equal( - self._blended_faces.embedding, face.embedding - ) - for face in self.faces - ] - ) - if len(self.faces) > 1 - else True - ), "Blended faces cannot be the same as one of the face if len(face)>0" - assert ( - not np.array_equal( - self._blended_faces.embedding, self.reference_face.embedding - ) - if len(self.faces) > 1 - else True - ), "Blended faces cannot be the same as reference face if len(face)>0" return self._blended_faces diff --git a/scripts/faceswaplab_ui/faceswaplab_unit_ui.py b/scripts/faceswaplab_ui/faceswaplab_unit_ui.py index 9516ca1..8cac3db 100644 --- a/scripts/faceswaplab_ui/faceswaplab_unit_ui.py +++ b/scripts/faceswaplab_ui/faceswaplab_unit_ui.py @@ -1,4 +1,5 @@ from typing import List +from scripts.faceswaplab_ui.faceswaplab_inpainting_ui import face_inpainting_ui from scripts.faceswaplab_utils.face_utils import get_face_checkpoints import gradio as gr @@ -142,22 +143,39 @@ def refresh_fn(selected: str) -> None: visible=is_img2img, elem_id=f"{id_prefix}_face{unit_num}_swap_in_generated", ) + pre_inpainting = face_inpainting_ui( + name="Pre-Inpainting (Before swapping)", + id_prefix=f"{id_prefix}_face{unit_num}_preinpainting", + description="Pre-inpainting sends face to inpainting before swapping", + ) + post_inpainting = face_inpainting_ui( + name="Post-Inpainting (After swapping)", + id_prefix=f"{id_prefix}_face{unit_num}_postinpainting", + description="Post-inpainting sends face to inpainting after swapping", + ) + + gradio_components: List[gr.components.Component] = ( + [ + img, + face, + batch_files, + blend_faces, + enable, + same_gender, + sort_by_size, + check_similarity, + compute_similarity, + min_sim, + min_ref_sim, + target_faces_index, + reference_faces_index, + swap_in_source, + swap_in_generated, + ] + + pre_inpainting + + post_inpainting + ) + # If changed, you need to change FaceSwapUnitSettings accordingly # ORDER of parameters is IMPORTANT. It should match the result of FaceSwapUnitSettings - return [ - img, - face, - batch_files, - blend_faces, - enable, - same_gender, - sort_by_size, - check_similarity, - compute_similarity, - min_sim, - min_ref_sim, - target_faces_index, - reference_faces_index, - swap_in_source, - swap_in_generated, - ] + return gradio_components diff --git a/scripts/faceswaplab_utils/imgutils.py b/scripts/faceswaplab_utils/imgutils.py index f286bdc..7b0e534 100644 --- a/scripts/faceswaplab_utils/imgutils.py +++ b/scripts/faceswaplab_utils/imgutils.py @@ -1,5 +1,5 @@ import io -from typing import List, Optional, Tuple, Union, Dict +from typing import List, Optional, Union, Dict from PIL import Image import cv2 import numpy as np @@ -10,14 +10,15 @@ from modules import processing import base64 from collections import Counter +from scripts.faceswaplab_utils.typing import BoxCoords, CV2ImgU8, PILImage -def check_against_nsfw(img: Image.Image) -> bool: +def check_against_nsfw(img: PILImage) -> bool: """ Check if an image exceeds the Not Safe for Work (NSFW) score. Parameters: - img (PIL.Image.Image): The image to be checked. + img (PILImage): The image to be checked. Returns: bool: True if any part of the image is considered NSFW, False otherwise. @@ -32,33 +33,33 @@ def check_against_nsfw(img: Image.Image) -> bool: return any(shapes) -def pil_to_cv2(pil_img: Image.Image) -> np.ndarray: # type: ignore +def pil_to_cv2(pil_img: PILImage) -> CV2ImgU8: # type: ignore """ Convert a PIL Image into an OpenCV image (cv2). Args: - pil_img (PIL.Image.Image): An image in PIL format. + pil_img (PILImage): An image in PIL format. Returns: - np.ndarray: The input image converted to OpenCV format (BGR). + CV2ImgU8: The input image converted to OpenCV format (BGR). """ return cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGB2BGR) -def cv2_to_pil(cv2_img: np.ndarray) -> Image.Image: # type: ignore +def cv2_to_pil(cv2_img: CV2ImgU8) -> PILImage: # type: ignore """ Convert an OpenCV image (cv2) into a PIL Image. Args: - cv2_img (np.ndarray): An image in OpenCV format (BGR). + cv2_img (CV2ImgU8): An image in OpenCV format (BGR). Returns: - PIL.Image.Image: The input image converted to PIL format (RGB). + PILImage: The input image converted to PIL format (RGB). """ return Image.fromarray(cv2.cvtColor(cv2_img, cv2.COLOR_BGR2RGB)) -def torch_to_pil(images: torch.Tensor) -> List[Image.Image]: +def torch_to_pil(tensor: torch.Tensor) -> List[PILImage]: """ Converts a tensor image or a batch of tensor images to a PIL image or a list of PIL images. @@ -72,7 +73,7 @@ def torch_to_pil(images: torch.Tensor) -> List[Image.Image]: list A list of PIL images. """ - images = images.cpu().permute(0, 2, 3, 1).numpy() + images: CV2ImgU8 = tensor.cpu().permute(0, 2, 3, 1).numpy() if images.ndim == 3: images = images[None, ...] images = (images * 255).round().astype("uint8") @@ -80,13 +81,13 @@ def torch_to_pil(images: torch.Tensor) -> List[Image.Image]: return pil_images -def pil_to_torch(pil_images: Union[Image.Image, List[Image.Image]]) -> torch.Tensor: +def pil_to_torch(pil_images: Union[PILImage, List[PILImage]]) -> torch.Tensor: """ Converts a PIL image or a list of PIL images to a torch tensor or a batch of torch tensors. Parameters ---------- - pil_images : Union[Image.Image, List[Image.Image]] + pil_images : Union[PILImage, List[PILImage]] A PIL image or a list of PIL images. Returns @@ -104,7 +105,7 @@ def pil_to_torch(pil_images: Union[Image.Image, List[Image.Image]]) -> torch.Ten return torch_image -def create_square_image(image_list: List[Image.Image]) -> Optional[Image.Image]: +def create_square_image(image_list: List[PILImage]) -> Optional[PILImage]: """ Creates a square image by combining multiple images in a grid pattern. @@ -156,7 +157,7 @@ def create_square_image(image_list: List[Image.Image]) -> Optional[Image.Image]: return None -# def create_mask(image : Image.Image, box_coords : Tuple[int, int, int, int]) -> Image.Image: +# def create_mask(image : PILImage, box_coords : Tuple[int, int, int, int]) -> PILImage: # width, height = image.size # mask = Image.new("L", (width, height), 255) # x1, y1, x2, y2 = box_coords @@ -170,19 +171,20 @@ def create_square_image(image_list: List[Image.Image]) -> Optional[Image.Image]: def create_mask( - image: Image.Image, box_coords: Tuple[int, int, int, int] -) -> Image.Image: + image: PILImage, + box_coords: BoxCoords, +) -> PILImage: """ Create a binary mask for a given image and bounding box coordinates. Args: - image (PIL.Image.Image): The input image. + image (PILImage): The input image. box_coords (Tuple[int, int, int, int]): A tuple of 4 integers defining the bounding box. It follows the pattern (x1, y1, x2, y2), where (x1, y1) is the top-left coordinate of the box and (x2, y2) is the bottom-right coordinate of the box. Returns: - PIL.Image.Image: A binary mask of the same size as the input image, where pixels within + PILImage: A binary mask of the same size as the input image, where pixels within the bounding box are white (255) and pixels outside the bounding box are black (0). """ width, height = image.size @@ -195,8 +197,8 @@ def create_mask( def apply_mask( - img: Image.Image, p: processing.StableDiffusionProcessing, batch_index: int -) -> Image.Image: + img: PILImage, p: processing.StableDiffusionProcessing, batch_index: int +) -> PILImage: """ Apply mask overlay and color correction to an image if enabled @@ -213,7 +215,7 @@ def apply_mask( overlays = p.overlay_images if overlays is None or batch_index >= len(overlays): return img - overlay: Image.Image = overlays[batch_index] + overlay: PILImage = overlays[batch_index] overlay = overlay.resize((img.size), resample=Image.Resampling.LANCZOS) img = img.copy() img.paste(overlay, (0, 0), overlay) @@ -227,9 +229,7 @@ def apply_mask( return img -def prepare_mask( - mask: Image.Image, p: processing.StableDiffusionProcessing -) -> Image.Image: +def prepare_mask(mask: PILImage, p: processing.StableDiffusionProcessing) -> PILImage: """ Prepare an image mask for the inpainting process. (This comes from controlnet) @@ -243,12 +243,12 @@ def prepare_mask( apply a Gaussian blur to the mask with a radius equal to 'mask_blur'. Args: - mask (Image.Image): The input mask as a PIL Image object. + mask (PILImage): The input mask as a PIL Image object. p (processing.StableDiffusionProcessing): An instance of the StableDiffusionProcessing class containing the processing parameters. Returns: - mask (Image.Image): The prepared mask as a PIL Image object. + mask (PILImage): The prepared mask as a PIL Image object. """ mask = mask.convert("L") # FIXME : Properly fix blur @@ -257,7 +257,7 @@ def prepare_mask( return mask -def base64_to_pil(base64str: Optional[str]) -> Optional[Image.Image]: +def base64_to_pil(base64str: Optional[str]) -> Optional[PILImage]: """ Converts a base64 string to a PIL Image object. @@ -267,7 +267,7 @@ def base64_to_pil(base64str: Optional[str]) -> Optional[Image.Image]: will return None. Returns: - Optional[Image.Image]: A PIL Image object created from the base64 string. If the input is None, + Optional[PILImage]: A PIL Image object created from the base64 string. If the input is None, the function returns None. Raises: diff --git a/scripts/faceswaplab_utils/typing.py b/scripts/faceswaplab_utils/typing.py new file mode 100644 index 0000000..d102d63 --- /dev/null +++ b/scripts/faceswaplab_utils/typing.py @@ -0,0 +1,10 @@ +from typing import Tuple +from numpy import uint8 +from numpy.typing import NDArray +from insightface.app.common import Face as IFace +from PIL import Image + +PILImage = Image.Image +CV2ImgU8 = NDArray[uint8] +Face = IFace +BoxCoords = Tuple[int, int, int, int] diff --git a/scripts/faceswaplab_utils/ui_utils.py b/scripts/faceswaplab_utils/ui_utils.py new file mode 100644 index 0000000..fc02120 --- /dev/null +++ b/scripts/faceswaplab_utils/ui_utils.py @@ -0,0 +1,39 @@ +from dataclasses import fields, is_dataclass +from typing import * + + +def dataclass_from_flat_list(cls: type, values: Tuple[Any, ...]) -> Any: + if not is_dataclass(cls): + raise TypeError(f"{cls} is not a dataclass") + + idx = 0 + init_values = {} + for field in fields(cls): + if is_dataclass(field.type): + inner_values = [values[idx + i] for i in range(len(fields(field.type)))] + init_values[field.name] = field.type(*inner_values) + idx += len(inner_values) + else: + value = values[idx] + init_values[field.name] = value + idx += 1 + return cls(**init_values) + + +def dataclasses_from_flat_list( + classes_mapping: List[type], values: Tuple[Any, ...] +) -> List[Any]: + instances = [] + idx = 0 + for cls in classes_mapping: + num_fields = sum( + len(fields(field.type)) if is_dataclass(field.type) else 1 + for field in fields(cls) + ) + instance = dataclass_from_flat_list(cls, values[idx : idx + num_fields]) + instances.append(instance) + idx += num_fields + assert [ + isinstance(i, t) for i, t in zip(instances, classes_mapping) + ], "Instances should match types" + return instances diff --git a/tests/test_api.py b/tests/test_api.py index abf7bfd..166ee24 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -17,6 +17,7 @@ FaceSwapExtractRequest, FaceSwapExtractResponse, compare_faces, + InpaintingOptions, ) from PIL import Image @@ -45,11 +46,12 @@ def face_swap_request() -> FaceSwapRequest: restorer_visibility=1, upscaler_name="Lanczos", scale=4, - inpainting_steps=30, - inpainting_denoising_strengh=0.1, inpainting_when=InpaintingWhen.BEFORE_RESTORE_FACE, + inpainting_options=InpaintingOptions( + inpainting_steps=30, + inpainting_denoising_strengh=0.1, + ), ) - # Prepare the request request = FaceSwapRequest( image=pil_to_base64("tests/test_image.png"), @@ -149,3 +151,31 @@ def test_faceswap(face_swap_request: FaceSwapRequest) -> None: assert response.status_code == 200 similarity = float(response.text) assert similarity > 0.50 + + +def test_faceswap_inpainting(face_swap_request: FaceSwapRequest) -> None: + face_swap_request.units[0].pre_inpainting = InpaintingOptions( + inpainting_denoising_strengh=0.4, + inpainting_prompt="Photo of a funny man", + inpainting_negative_prompt="blurry, bad art", + inpainting_steps=100, + ) + + face_swap_request.units[0].post_inpainting = InpaintingOptions( + inpainting_denoising_strengh=0.4, + inpainting_prompt="Photo of a funny man", + inpainting_negative_prompt="blurry, bad art", + inpainting_steps=20, + inpainting_sampler="Euler a", + ) + + response = requests.post( + f"{base_url}/faceswaplab/swap_face", + data=face_swap_request.json(), + headers={"Content-Type": "application/json; charset=utf-8"}, + ) + + assert response.status_code == 200 + data = response.json() + assert "images" in data + assert "infos" in data From b773bda19f0cbe29e013e4b31b63f2f02da05468 Mon Sep 17 00:00:00 2001 From: Tran Xen <137925069+glucauze@users.noreply.github.com> Date: Wed, 2 Aug 2023 01:21:21 +0200 Subject: [PATCH 3/7] fix similarity, add checksum for swapper, fix minor bugs --- README.md | 4 + requirements.txt | 2 +- scripts/faceswaplab_swapping/swapper.py | 135 ++++++---- scripts/faceswaplab_ui/faceswaplab_tab.py | 120 ++------- .../faceswaplab_unit_settings.py | 17 +- scripts/faceswaplab_ui/faceswaplab_unit_ui.py | 2 +- .../face_checkpoints_utils.py | 236 ++++++++++++++++++ scripts/faceswaplab_utils/face_utils.py | 72 ------ scripts/faceswaplab_utils/imgutils.py | 18 +- 9 files changed, 371 insertions(+), 235 deletions(-) create mode 100644 scripts/faceswaplab_utils/face_checkpoints_utils.py delete mode 100644 scripts/faceswaplab_utils/face_utils.py diff --git a/README.md b/README.md index b3423f3..3728c68 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,10 @@ In short: More on this here : https://glucauze.github.io/sd-webui-faceswaplab/ +### Known problems (wontfix): + ++ Older versions of gradio don't work well with the extension. See this bug : https://github.com/glucauze/sd-webui-faceswaplab/issues/5 + ### Features + **Face Unit Concept**: Similar to controlNet, the program introduces the concept of a face unit. You can configure up to 10 units (3 units are the default setting) in the program settings (sd). diff --git a/requirements.txt b/requirements.txt index 2999cc3..1c8637a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ cython ifnude insightface==0.7.3 onnx==1.14.0 -onnxruntime==1.15.0 +onnxruntime==1.15.1 opencv-python==4.7.0.72 pandas pydantic==1.10.9 diff --git a/scripts/faceswaplab_swapping/swapper.py b/scripts/faceswaplab_swapping/swapper.py index d2dd2d4..89eaf8e 100644 --- a/scripts/faceswaplab_swapping/swapper.py +++ b/scripts/faceswaplab_swapping/swapper.py @@ -27,7 +27,6 @@ PostProcessingOptions, ) from scripts.faceswaplab_utils.models_utils import get_current_model -import gradio as gr from scripts.faceswaplab_utils.typing import CV2ImgU8, PILImage, Face from scripts.faceswaplab_inpainting.i2i_pp import img2img_diffusion @@ -250,6 +249,21 @@ def getAnalysisModel() -> insightface.app.FaceAnalysis: raise FaceModelException("Loading of analysis model failed") +import hashlib + + +def is_sha1_matching(file_path: str, expected_sha1: str) -> bool: + sha1_hash = hashlib.sha1() + + with open(file_path, "rb") as file: + for byte_block in iter(lambda: file.read(4096), b""): + sha1_hash.update(byte_block) + if sha1_hash.hexdigest() == expected_sha1: + return True + else: + return False + + @lru_cache(maxsize=1) def getFaceSwapModel(model_path: str) -> upscaled_inswapper.UpscaledINSwapper: """ @@ -262,6 +276,14 @@ def getFaceSwapModel(model_path: str) -> upscaled_inswapper.UpscaledINSwapper: insightface.model_zoo.FaceModel: The face swap model. """ try: + expected_sha1 = "17a64851eaefd55ea597ee41e5c18409754244c5" + if not is_sha1_matching(model_path, expected_sha1): + logger.error( + "Suspicious sha1 for model %s, check the model is valid or has been downloaded adequately. Should be %s", + model_path, + expected_sha1, + ) + # Initializes the face swap model using the specified model path. return upscaled_inswapper.UpscaledINSwapper( insightface.model_zoo.get_model(model_path, providers=providers) @@ -270,6 +292,9 @@ def getFaceSwapModel(model_path: str) -> upscaled_inswapper.UpscaledINSwapper: logger.error( "Loading of swapping model failed, please check the requirements (On Windows, download and install Visual Studio. During the install, make sure to include the Python and C++ packages.)" ) + import traceback + + traceback.print_exc() raise FaceModelException("Loading of swapping model failed") @@ -315,11 +340,15 @@ def get_faces( return [] +@dataclass +class FaceFilteringOptions: + faces_index: Set[int] + source_gender: Optional[int] = None # if none will not use same gender + sort_by_face_size: bool = False + + def filter_faces( - all_faces: List[Face], - faces_index: Set[int], - source_gender: int = None, - sort_by_face_size: bool = False, + all_faces: List[Face], filtering_options: FaceFilteringOptions ) -> List[Face]: """ Sorts and filters a list of faces based on specified criteria. @@ -337,18 +366,24 @@ def filter_faces( :return: A list of Face objects sorted and filtered according to the specified criteria. """ filtered_faces = copy.copy(all_faces) - if sort_by_face_size: + if filtering_options.sort_by_face_size: filtered_faces = sorted( all_faces, reverse=True, key=lambda x: (x.bbox[2] - x.bbox[0]) * (x.bbox[3] - x.bbox[1]), ) - if source_gender is not None: + if filtering_options.source_gender is not None: filtered_faces = [ - face for face in filtered_faces if face["gender"] == source_gender + face + for face in filtered_faces + if face["gender"] == filtering_options.source_gender ] - return [face for i, face in enumerate(filtered_faces) if i in faces_index] + return [ + face + for i, face in enumerate(filtered_faces) + if i in filtering_options.faces_index + ] @dataclass @@ -391,7 +426,7 @@ def get_or_default(l: List[Any], index: int, default: Any) -> Any: return l[index] if index < len(l) else default -def get_faces_from_img_files(files: List[gr.File]) -> List[Optional[CV2ImgU8]]: +def get_faces_from_img_files(files: List[str]) -> List[Optional[CV2ImgU8]]: """ Extracts faces from a list of image files. @@ -407,7 +442,7 @@ def get_faces_from_img_files(files: List[gr.File]) -> List[Optional[CV2ImgU8]]: if len(files) > 0: for file in files: - img = Image.open(file.name) # Open the image file + img = Image.open(file) # Open the image file face = get_or_default( get_faces(pil_to_cv2(img)), 0, None ) # Extract faces from the image @@ -503,41 +538,44 @@ def swap_face( result_image = Image.fromarray(cv2.cvtColor(result, cv2.COLOR_BGR2RGB)) return_result.image = result_image - # FIXME : recompute similarity - - # if compute_similarity: - # try: - # result_faces = get_faces( - # cv2.cvtColor(np.array(result_image), cv2.COLOR_RGB2BGR), - # sort_by_face_size=sort_by_face_size, - # ) - # if same_gender: - # result_faces = [ - # x for x in result_faces if x["gender"] == gender - # ] - - # for i, swapped_face in enumerate(result_faces): - # logger.info(f"compare face {i}") - # if i in faces_index and i < len(target_faces): - # return_result.similarity[i] = cosine_similarity_face( - # source_face, swapped_face - # ) - # return_result.ref_similarity[i] = cosine_similarity_face( - # reference_face, swapped_face - # ) - - # logger.info(f"similarity {return_result.similarity}") - # logger.info(f"ref similarity {return_result.ref_similarity}") - - # except Exception as e: - # logger.error("Similarity processing failed %s", e) - # raise e except Exception as e: logger.error("Conversion failed %s", e) raise e return return_result +def compute_similarity( + reference_face: Face, + source_face: Face, + swapped_image: PILImage, + filtering: FaceFilteringOptions, +) -> Tuple[Dict[int, float], Dict[int, float]]: + similarity: Dict[int, float] = {} + ref_similarity: Dict[int, float] = {} + try: + swapped_image_cv2: CV2ImgU8 = cv2.cvtColor( + np.array(swapped_image), cv2.COLOR_RGB2BGR + ) + new_faces = filter_faces(get_faces(swapped_image_cv2), filtering) + if len(new_faces) == 0: + logger.error("compute_similarity : No faces to compare with !") + return None + + for i, swapped_face in enumerate(new_faces): + logger.info(f"compare face {i}") + similarity[i] = cosine_similarity_face(source_face, swapped_face) + ref_similarity[i] = cosine_similarity_face(reference_face, swapped_face) + + logger.info(f"similarity {similarity}") + logger.info(f"ref similarity {ref_similarity}") + + return (similarity, ref_similarity) + except Exception as e: + logger.error("Similarity processing failed %s", e) + raise e + return None + + def process_image_unit( model: str, unit: FaceSwapUnitSettings, @@ -580,13 +618,14 @@ def process_image_unit( logger.info("Use source face as reference face") reference_face = src_face - target_faces = filter_faces( - faces, + face_filtering_options = FaceFilteringOptions( faces_index=unit.faces_index, source_gender=src_face["gender"] if unit.same_gender else None, sort_by_face_size=unit.sort_by_size, ) + target_faces = filter_faces(faces, filtering_options=face_filtering_options) + # Apply pre-inpainting to image if unit.pre_inpainting.inpainting_denoising_strengh > 0: current_image = img2img_diffusion( @@ -611,6 +650,18 @@ def process_image_unit( save_img_debug(result.image, "After swap") + if unit.compute_similarity: + similarities = compute_similarity( + reference_face=reference_face, + source_face=src_face, + swapped_image=result.image, + filtering=face_filtering_options, + ) + if similarities: + (result.similarity, result.ref_similarity) = similarities + else: + logger.error("Failed to compute similarity") + if result.image is None: logger.error("Result image is None") if ( diff --git a/scripts/faceswaplab_ui/faceswaplab_tab.py b/scripts/faceswaplab_ui/faceswaplab_tab.py index 622c48f..0d66cec 100644 --- a/scripts/faceswaplab_ui/faceswaplab_tab.py +++ b/scripts/faceswaplab_ui/faceswaplab_tab.py @@ -1,26 +1,21 @@ -import os -import re import traceback -from pprint import pformat, pprint +from pprint import pformat from typing import * from scripts.faceswaplab_utils.typing import * import gradio as gr -import modules.scripts as scripts import onnx import pandas as pd -from modules import scripts from modules.shared import opts from PIL import Image import scripts.faceswaplab_swapping.swapper as swapper -from scripts.faceswaplab_postprocessing.postprocessing import enhance_image from scripts.faceswaplab_postprocessing.postprocessing_options import ( PostProcessingOptions, ) from scripts.faceswaplab_ui.faceswaplab_postprocessing_ui import postprocessing_ui from scripts.faceswaplab_ui.faceswaplab_unit_settings import FaceSwapUnitSettings from scripts.faceswaplab_ui.faceswaplab_unit_ui import faceswap_unit_ui -from scripts.faceswaplab_utils import face_utils, imgutils +from scripts.faceswaplab_utils import face_checkpoints_utils, imgutils from scripts.faceswaplab_utils.faceswaplab_logging import logger from scripts.faceswaplab_utils.models_utils import get_models from scripts.faceswaplab_utils.ui_utils import dataclasses_from_flat_list @@ -138,24 +133,9 @@ def analyse_faces(image: PILImage, det_threshold: float = 0.5) -> Optional[str]: return None -def sanitize_name(name: str) -> str: - """ - Sanitize the input name by removing special characters and replacing spaces with underscores. - - Parameters: - name (str): The input name to be sanitized. - - Returns: - str: The sanitized name with special characters removed and spaces replaced by underscores. - """ - name = re.sub("[^A-Za-z0-9_. ]+", "", name) - name = name.replace(" ", "_") - return name[:255] - - def build_face_checkpoint_and_save( - batch_files: gr.File, name: str -) -> Optional[PILImage]: + batch_files: gr.File, name: str, overwrite: bool +) -> PILImage: """ Builds a face checkpoint using the provided image files, performs face swapping, and saves the result to a file. If a blended face is successfully obtained and the face swapping @@ -170,79 +150,19 @@ def build_face_checkpoint_and_save( """ try: - name = sanitize_name(name) - batch_files = batch_files or [] - logger.info("Build %s %s", name, [x.name for x in batch_files]) - faces = swapper.get_faces_from_img_files(batch_files) - blended_face = swapper.blend_faces(faces) - preview_path = os.path.join( - scripts.basedir(), "extensions", "sd-webui-faceswaplab", "references" + if not batch_files: + logger.error("No face found") + return None + filenames = [x.name for x in batch_files] + preview_image = face_checkpoints_utils.build_face_checkpoint_and_save( + filenames, name, overwrite=overwrite ) - - faces_path = os.path.join(scripts.basedir(), "models", "faceswaplab", "faces") - - os.makedirs(faces_path, exist_ok=True) - - target_img: PILImage = None - if blended_face: - if blended_face["gender"] == 0: - target_img = Image.open(os.path.join(preview_path, "woman.png")) - else: - target_img = Image.open(os.path.join(preview_path, "man.png")) - - if name == "": - name = "default_name" - pprint(blended_face) - target_face = swapper.get_or_default( - swapper.get_faces(imgutils.pil_to_cv2(target_img)), 0, None - ) - if target_face is None: - logger.error( - "Failed to open reference image, cannot create preview : That should not happen unless you deleted the references folder or change the detection threshold." - ) - else: - result = swapper.swap_face( - reference_face=blended_face, - target_faces=[target_face], - source_face=blended_face, - target_img=target_img, - model=get_models()[0], - upscaled_swapper=opts.data.get( - "faceswaplab_upscaled_swapper", False - ), - ) - result_image = enhance_image( - result.image, - PostProcessingOptions( - face_restorer_name="CodeFormer", restorer_visibility=1 - ), - ) - - file_path = os.path.join(faces_path, f"{name}.safetensors") - file_number = 1 - while os.path.exists(file_path): - file_path = os.path.join( - faces_path, f"{name}_{file_number}.safetensors" - ) - file_number += 1 - result_image.save(file_path + ".png") - - face_utils.save_face(filename=file_path, face=blended_face) - try: - data = face_utils.load_face(filename=file_path) - logger.debug(data) - except Exception as e: - print(e) - return result_image - - logger.error("No face found") except Exception as e: logger.error("Failed to build checkpoint %s", e) traceback.print_exc() return None - - return target_img + return preview_image def explore_onnx_faceswap_model(model_path: str) -> pd.DataFrame: @@ -281,7 +201,7 @@ def explore_onnx_faceswap_model(model_path: str) -> pd.DataFrame: def batch_process( files: List[gr.File], save_path: str, *components: Tuple[Any, ...] -) -> Optional[List[PILImage]]: +) -> List[PILImage]: try: units_count = opts.data.get("faceswaplab_units_count", 3) @@ -308,7 +228,7 @@ def batch_process( logger.error("Batch Process error : %s", e) traceback.print_exc() - return None + return [] def tools_ui() -> None: @@ -319,7 +239,7 @@ def tools_ui() -> None: """Build a face based on a batch list of images. Will blend the resulting face and store the checkpoint in the faceswaplab/faces directory.""" ) with gr.Row(): - batch_files = gr.components.File( + build_batch_files = gr.components.File( type="file", file_count="multiple", label="Batch Sources Images", @@ -332,12 +252,18 @@ def tools_ui() -> None: interactive=False, elem_id="faceswaplab_build_preview_face", ) - name = gr.Textbox( + build_name = gr.Textbox( value="Face", placeholder="Name of the character", label="Name of the character", elem_id="faceswaplab_build_character_name", ) + build_overwrite = gr.Checkbox( + False, + placeholder="overwrite", + label="Overwrite Checkpoint if exist (else will add number)", + elem_id="faceswaplab_build_overwrite", + ) generate_checkpoint_btn = gr.Button( "Save", elem_id="faceswaplab_build_save_btn" ) @@ -452,7 +378,9 @@ def tools_ui() -> None: ) compare_btn.click(compare, inputs=[img1, img2], outputs=[compare_result_text]) generate_checkpoint_btn.click( - build_face_checkpoint_and_save, inputs=[batch_files, name], outputs=[preview] + build_face_checkpoint_and_save, + inputs=[build_batch_files, build_name, build_overwrite], + outputs=[preview], ) extract_btn.click( extract_faces, diff --git a/scripts/faceswaplab_ui/faceswaplab_unit_settings.py b/scripts/faceswaplab_ui/faceswaplab_unit_settings.py index d3ecf7c..9bfe4b0 100644 --- a/scripts/faceswaplab_ui/faceswaplab_unit_settings.py +++ b/scripts/faceswaplab_ui/faceswaplab_unit_settings.py @@ -8,7 +8,7 @@ from PIL import Image from scripts.faceswaplab_utils.imgutils import pil_to_cv2 from scripts.faceswaplab_utils.faceswaplab_logging import logger -from scripts.faceswaplab_utils import face_utils +from scripts.faceswaplab_utils import face_checkpoints_utils from scripts.faceswaplab_inpainting.faceswaplab_inpainting import InpaintingOptions from client_api import api_utils @@ -118,14 +118,13 @@ def reference_face(self) -> Optional[Face]: """ if not hasattr(self, "_reference_face"): if self.source_face and self.source_face != "None": - with open(self.source_face, "rb") as file: - try: - logger.info(f"loading face {file.name}") - face = face_utils.load_face(file.name) - self._reference_face = face - except Exception as e: - logger.error("Failed to load checkpoint : %s", e) - raise e + try: + logger.info(f"loading face {self.source_face}") + face = face_checkpoints_utils.load_face(self.source_face) + self._reference_face = face + except Exception as e: + logger.error("Failed to load checkpoint : %s", e) + raise e elif self.source_img is not None: if isinstance(self.source_img, str): # source_img is a base64 string if ( diff --git a/scripts/faceswaplab_ui/faceswaplab_unit_ui.py b/scripts/faceswaplab_ui/faceswaplab_unit_ui.py index 8cac3db..a035c14 100644 --- a/scripts/faceswaplab_ui/faceswaplab_unit_ui.py +++ b/scripts/faceswaplab_ui/faceswaplab_unit_ui.py @@ -1,6 +1,6 @@ from typing import List from scripts.faceswaplab_ui.faceswaplab_inpainting_ui import face_inpainting_ui -from scripts.faceswaplab_utils.face_utils import get_face_checkpoints +from scripts.faceswaplab_utils.face_checkpoints_utils import get_face_checkpoints import gradio as gr diff --git a/scripts/faceswaplab_utils/face_checkpoints_utils.py b/scripts/faceswaplab_utils/face_checkpoints_utils.py new file mode 100644 index 0000000..de3ebf1 --- /dev/null +++ b/scripts/faceswaplab_utils/face_checkpoints_utils.py @@ -0,0 +1,236 @@ +import glob +import os +from typing import * +from insightface.app.common import Face +from safetensors.torch import save_file, safe_open +import torch + +import modules.scripts as scripts +from modules import scripts +from scripts.faceswaplab_utils.faceswaplab_logging import logger +from scripts.faceswaplab_utils.typing import * +from scripts.faceswaplab_utils import imgutils +from scripts.faceswaplab_postprocessing.postprocessing import enhance_image +from scripts.faceswaplab_postprocessing.postprocessing_options import ( + PostProcessingOptions, +) +from scripts.faceswaplab_utils.models_utils import get_models +from modules.shared import opts +import traceback + +import dill as pickle # will be removed in future versions +from scripts.faceswaplab_swapping import swapper +from pprint import pformat +import re + + +def sanitize_name(name: str) -> str: + """ + Sanitize the input name by removing special characters and replacing spaces with underscores. + + Parameters: + name (str): The input name to be sanitized. + + Returns: + str: The sanitized name with special characters removed and spaces replaced by underscores. + """ + name = re.sub("[^A-Za-z0-9_. ]+", "", name) + name = name.replace(" ", "_") + return name[:255] + + +def build_face_checkpoint_and_save( + batch_files: List[str], name: str, overwrite: bool = False +) -> PILImage: + """ + Builds a face checkpoint using the provided image files, performs face swapping, + and saves the result to a file. If a blended face is successfully obtained and the face swapping + process succeeds, the resulting image is returned. Otherwise, None is returned. + + Args: + batch_files (list): List of image file paths used to create the face checkpoint. + name (str): The name assigned to the face checkpoint. + + Returns: + PIL.PILImage or None: The resulting swapped face image if the process is successful; None otherwise. + """ + + try: + name = sanitize_name(name) + batch_files = batch_files or [] + logger.info("Build %s %s", name, [x for x in batch_files]) + faces = swapper.get_faces_from_img_files(batch_files) + blended_face = swapper.blend_faces(faces) + preview_path = os.path.join( + scripts.basedir(), "extensions", "sd-webui-faceswaplab", "references" + ) + + reference_preview_img: PILImage = None + if blended_face: + if blended_face["gender"] == 0: + reference_preview_img = Image.open( + os.path.join(preview_path, "woman.png") + ) + else: + reference_preview_img = Image.open( + os.path.join(preview_path, "man.png") + ) + + if name == "": + name = "default_name" + logger.debug("Face %s", pformat(blended_face)) + target_face = swapper.get_or_default( + swapper.get_faces(imgutils.pil_to_cv2(reference_preview_img)), 0, None + ) + if target_face is None: + logger.error( + "Failed to open reference image, cannot create preview : That should not happen unless you deleted the references folder or change the detection threshold." + ) + else: + result = swapper.swap_face( + reference_face=blended_face, + target_faces=[target_face], + source_face=blended_face, + target_img=reference_preview_img, + model=get_models()[0], + upscaled_swapper=opts.data.get( + "faceswaplab_upscaled_swapper", False + ), + ) + preview_image = enhance_image( + result.image, + PostProcessingOptions( + face_restorer_name="CodeFormer", restorer_visibility=1 + ), + ) + + file_path = os.path.join(get_checkpoint_path(), f"{name}.safetensors") + if not overwrite: + file_number = 1 + while os.path.exists(file_path): + file_path = os.path.join( + get_checkpoint_path(), f"{name}_{file_number}.safetensors" + ) + file_number += 1 + save_face(filename=file_path, face=blended_face) + preview_image.save(file_path + ".png") + try: + data = load_face(file_path) + logger.debug(data) + except Exception as e: + logger.error("Error loading checkpoint, after creation %s", e) + traceback.print_exc() + + return preview_image + + else: + logger.error("No face found") + return None + except Exception as e: + logger.error("Failed to build checkpoint %s", e) + traceback.print_exc() + return None + + +def save_face(face: Face, filename: str) -> None: + try: + tensors = { + "embedding": torch.tensor(face["embedding"]), + "gender": torch.tensor(face["gender"]), + "age": torch.tensor(face["age"]), + } + save_file(tensors, filename) + except Exception as e: + traceback.print_exc + logger.error("Failed to save checkpoint %s", e) + raise e + + +def load_face(name: str) -> Face: + filename = matching_checkpoint(name) + if filename is None: + return None + + if filename.endswith(".pkl"): + logger.warning( + "Pkl files for faces are deprecated to enhance safety, they will be unsupported in future versions." + ) + logger.warning("The file will be converted to .safetensors") + logger.warning( + "You can also use this script https://gist.github.com/glucauze/4a3c458541f2278ad801f6625e5b9d3d" + ) + with open(filename, "rb") as file: + logger.info("Load pkl") + face = Face(pickle.load(file)) + logger.warning( + "Convert to safetensors, you can remove the pkl version once you have ensured that the safetensor is working" + ) + save_face(face, filename.replace(".pkl", ".safetensors")) + return face + + elif filename.endswith(".safetensors"): + face = {} + with safe_open(filename, framework="pt", device="cpu") as f: + for k in f.keys(): + logger.debug("load key %s", k) + face[k] = f.get_tensor(k).numpy() + return Face(face) + + raise NotImplementedError("Unknown file type, face extraction not implemented") + + +def get_checkpoint_path() -> str: + checkpoint_path = os.path.join(scripts.basedir(), "models", "faceswaplab", "faces") + os.makedirs(checkpoint_path, exist_ok=True) + return checkpoint_path + + +def matching_checkpoint(name: str) -> Optional[str]: + """ + Retrieve the full path of a checkpoint file matching the given name. + + If the name already includes a path separator, it is returned as-is. Otherwise, the function looks for a matching + file with the extensions ".safetensors" or ".pkl" in the checkpoint directory. + + Args: + name (str): The name or path of the checkpoint file. + + Returns: + Optional[str]: The full path of the matching checkpoint file, or None if no match is found. + """ + + # If the name already includes a path separator, return it as is + if os.path.sep in name: + return name + + # If the name doesn't end with the specified extensions, look for a matching file + if not (name.endswith(".safetensors") or name.endswith(".pkl")): + # Try appending each extension and check if the file exists in the checkpoint path + for ext in [".safetensors", ".pkl"]: + full_path = os.path.join(get_checkpoint_path(), name + ext) + if os.path.exists(full_path): + return full_path + # If no matching file is found, return None + return None + + # If the name already ends with the specified extensions, simply complete the path + return os.path.join(get_checkpoint_path(), name) + + +def get_face_checkpoints() -> List[str]: + """ + Retrieve a list of face checkpoint paths. + + This function searches for face files with the extension ".safetensors" in the specified directory and returns a list + containing the paths of those files. + + Returns: + list: A list of face paths, including the string "None" as the first element. + """ + faces_path = os.path.join(get_checkpoint_path(), "*.safetensors") + faces = glob.glob(faces_path) + + faces_path = os.path.join(get_checkpoint_path(), "*.pkl") + faces += glob.glob(faces_path) + + return ["None"] + [os.path.basename(face) for face in sorted(faces)] diff --git a/scripts/faceswaplab_utils/face_utils.py b/scripts/faceswaplab_utils/face_utils.py deleted file mode 100644 index e07a6b6..0000000 --- a/scripts/faceswaplab_utils/face_utils.py +++ /dev/null @@ -1,72 +0,0 @@ -import glob -import os -from typing import List -from insightface.app.common import Face -from safetensors.torch import save_file, safe_open -import torch - -import modules.scripts as scripts -from modules import scripts -from scripts.faceswaplab_utils.faceswaplab_logging import logger -import dill as pickle # will be removed in future versions - - -def save_face(face: Face, filename: str) -> None: - tensors = { - "embedding": torch.tensor(face["embedding"]), - "gender": torch.tensor(face["gender"]), - "age": torch.tensor(face["age"]), - } - save_file(tensors, filename) - - -def load_face(filename: str) -> Face: - if filename.endswith(".pkl"): - logger.warning( - "Pkl files for faces are deprecated to enhance safety, they will be unsupported in future versions." - ) - logger.warning("The file will be converted to .safetensors") - logger.warning( - "You can also use this script https://gist.github.com/glucauze/4a3c458541f2278ad801f6625e5b9d3d" - ) - with open(filename, "rb") as file: - logger.info("Load pkl") - face = Face(pickle.load(file)) - logger.warning( - "Convert to safetensors, you can remove the pkl version once you have ensured that the safetensor is working" - ) - save_face(face, filename.replace(".pkl", ".safetensors")) - return face - - elif filename.endswith(".safetensors"): - face = {} - with safe_open(filename, framework="pt", device="cpu") as f: - for k in f.keys(): - logger.debug("load key %s", k) - face[k] = f.get_tensor(k).numpy() - return Face(face) - - raise NotImplementedError("Unknown file type, face extraction not implemented") - - -def get_face_checkpoints() -> List[str]: - """ - Retrieve a list of face checkpoint paths. - - This function searches for face files with the extension ".safetensors" in the specified directory and returns a list - containing the paths of those files. - - Returns: - list: A list of face paths, including the string "None" as the first element. - """ - faces_path = os.path.join( - scripts.basedir(), "models", "faceswaplab", "faces", "*.safetensors" - ) - faces = glob.glob(faces_path) - - faces_path = os.path.join( - scripts.basedir(), "models", "faceswaplab", "faces", "*.pkl" - ) - faces += glob.glob(faces_path) - - return ["None"] + sorted(faces) diff --git a/scripts/faceswaplab_utils/imgutils.py b/scripts/faceswaplab_utils/imgutils.py index 7b0e534..e8d67fb 100644 --- a/scripts/faceswaplab_utils/imgutils.py +++ b/scripts/faceswaplab_utils/imgutils.py @@ -11,6 +11,7 @@ import base64 from collections import Counter from scripts.faceswaplab_utils.typing import BoxCoords, CV2ImgU8, PILImage +from scripts.faceswaplab_utils.faceswaplab_logging import logger def check_against_nsfw(img: PILImage) -> bool: @@ -157,19 +158,6 @@ def create_square_image(image_list: List[PILImage]) -> Optional[PILImage]: return None -# def create_mask(image : PILImage, box_coords : Tuple[int, int, int, int]) -> PILImage: -# width, height = image.size -# mask = Image.new("L", (width, height), 255) -# x1, y1, x2, y2 = box_coords -# for x in range(width): -# for y in range(height): -# if x1 <= x <= x2 and y1 <= y <= y2: -# mask.putpixel((x, y), 255) -# else: -# mask.putpixel((x, y), 0) -# return mask - - def create_mask( image: PILImage, box_coords: BoxCoords, @@ -216,7 +204,9 @@ def apply_mask( if overlays is None or batch_index >= len(overlays): return img overlay: PILImage = overlays[batch_index] - overlay = overlay.resize((img.size), resample=Image.Resampling.LANCZOS) + logger.debug("Overlay size %s, Image size %s", overlay.size, img.size) + if overlay.size != img.size: + overlay = overlay.resize((img.size), resample=Image.Resampling.LANCZOS) img = img.copy() img.paste(overlay, (0, 0), overlay) return img From 4533750c492171b54ddff1c2781f73275039f511 Mon Sep 17 00:00:00 2001 From: Tran Xen <137925069+glucauze@users.noreply.github.com> Date: Thu, 3 Aug 2023 00:38:17 +0200 Subject: [PATCH 4/7] add pp&mask options for each faces. Improve API. Requires more testing --- README.md | 2 +- client_api/api_utils.py | 46 +++++ client_api/faceswaplab_api_example.py | 33 ++++ client_api/requirements.txt | 5 + client_api/test.safetensors | Bin 0 -> 2256 bytes docs/faq.markdown | 22 +++ requirements.txt | 6 +- scripts/faceswaplab.py | 10 -- scripts/faceswaplab_api/faceswaplab_api.py | 2 + .../faceswaplab_settings.py | 64 +++---- scripts/faceswaplab_swapping/swapper.py | 100 +++++++---- .../upcaled_inswapper_options.py | 38 +++++ .../upscaled_inswapper.py | 79 +++++---- .../faceswaplab_postprocessing_ui.py | 2 +- scripts/faceswaplab_ui/faceswaplab_tab.py | 2 + .../faceswaplab_unit_settings.py | 4 + scripts/faceswaplab_ui/faceswaplab_unit_ui.py | 159 ++++++++++++++---- .../face_checkpoints_utils.py | 29 ++-- 18 files changed, 435 insertions(+), 168 deletions(-) create mode 100644 client_api/requirements.txt create mode 100644 client_api/test.safetensors create mode 100644 scripts/faceswaplab_swapping/upcaled_inswapper_options.py diff --git a/README.md b/README.md index 3728c68..e97d8cf 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ While FaceSwapLab is still under development, it has reached a good level of sta In short: -+ **Ethical Guideline:** This extension should not be forked to create a public, easy way to circumvent NSFW filtering. ++ **Ethical Guideline:** This extension should not be forked to create a public, easy way to bypass NSFW filtering. If you modify it for this purpose, keep it private, or you'll be banned. + **License:** This software is distributed under the terms of the GNU Affero General Public License (AGPL), version 3 or later. + **Model License:** This software uses InsightFace's pre-trained models, which are available for non-commercial research purposes only. diff --git a/client_api/api_utils.py b/client_api/api_utils.py index 8499306..9190b0d 100644 --- a/client_api/api_utils.py +++ b/client_api/api_utils.py @@ -9,6 +9,7 @@ from typing import List, Tuple, Optional import numpy as np import requests +import safetensors class InpaintingWhen(Enum): @@ -49,6 +50,23 @@ class InpaintingOptions(BaseModel): ) +class InswappperOptions(BaseModel): + face_restorer_name: str = Field( + description="face restorer name", default="CodeFormer" + ) + restorer_visibility: float = Field( + description="face restorer visibility", default=1, le=1, ge=0 + ) + codeformer_weight: float = Field( + description="face restorer codeformer weight", default=1, le=1, ge=0 + ) + upscaler_name: str = Field(description="upscaler name", default=None) + improved_mask: bool = Field(description="Use Improved Mask", default=False) + color_corrections: bool = Field(description="Use Color Correction", default=False) + sharpen: bool = Field(description="Sharpen Image", default=False) + erosion_factor: float = Field(description="Erosion Factor", default=1, le=10, ge=0) + + class FaceSwapUnit(BaseModel): # The image given in reference source_img: str = Field( @@ -118,6 +136,11 @@ class FaceSwapUnit(BaseModel): default=None, ) + swapping_options: Optional[InswappperOptions] = Field( + description="PostProcessing & Mask options", + default=None, + ) + post_inpainting: Optional[InpaintingOptions] = Field( description="Inpainting options", default=None, @@ -244,3 +267,26 @@ def compare_faces( ) return float(result.text) + + +def safetensors_to_base64(file_path: str) -> str: + with open(file_path, "rb") as file: + file_bytes = file.read() + return "data:application/face;base64," + base64.b64encode(file_bytes).decode( + "utf-8" + ) + + +def base64_to_safetensors(base64str: str, output_path: str) -> None: + try: + base64_data = base64str.split("base64,")[-1] + file_bytes = base64.b64decode(base64_data) + with open(output_path, "wb") as file: + file.write(file_bytes) + with safetensors.safe_open(output_path, framework="pt") as f: + print(output_path, "keys =", f.keys()) + except Exception as e: + print("Error : failed to convert base64 string to safetensor", e) + import traceback + + traceback.print_exc() diff --git a/client_api/faceswaplab_api_example.py b/client_api/faceswaplab_api_example.py index 26b2975..b992f15 100644 --- a/client_api/faceswaplab_api_example.py +++ b/client_api/faceswaplab_api_example.py @@ -1,6 +1,7 @@ import requests from api_utils import ( FaceSwapUnit, + InswappperOptions, pil_to_base64, PostProcessingOptions, InpaintingWhen, @@ -10,6 +11,7 @@ FaceSwapExtractRequest, FaceSwapCompareRequest, FaceSwapExtractResponse, + safetensors_to_base64, ) address = "http://127.0.0.1:7860" @@ -94,3 +96,34 @@ for img in response.pil_images: img.show() + + +############################# +# FaceSwap with local safetensors + +# First face unit : +unit1 = FaceSwapUnit( + source_face=safetensors_to_base64("test.safetensors"), + faces_index=(0,), # Replace first face + swapping_options=InswappperOptions( + face_restorer_name="CodeFormer", + upscaler_name="LDSR", + improved_mask=True, + sharpen=True, + color_corrections=True, + ), +) + +# Prepare the request +request = FaceSwapRequest(image=pil_to_base64("test_image.png"), units=[unit1]) + +# Face Swap +result = requests.post( + url=f"{address}/faceswaplab/swap_face", + data=request.json(), + headers={"Content-Type": "application/json; charset=utf-8"}, +) +response = FaceSwapResponse.parse_obj(result.json()) + +for img in response.pil_images: + img.show() diff --git a/client_api/requirements.txt b/client_api/requirements.txt new file mode 100644 index 0000000..e5e672f --- /dev/null +++ b/client_api/requirements.txt @@ -0,0 +1,5 @@ +numpy==1.25.1 +Pillow==10.0.0 +pydantic==1.10.9 +Requests==2.31.0 +safetensors==0.3.1 diff --git a/client_api/test.safetensors b/client_api/test.safetensors new file mode 100644 index 0000000000000000000000000000000000000000..c74264bdb49b4d996d1791eeac4b4a7b192cb435 GIT binary patch literal 2256 zcmb7^Yc$n)7so?M)C?zdlj@{$IXSK;Bj>kImqAL3D1>khdd8(flNymyIw?{rgpigI zk&xp5+efG5u8c{Yjbtuu!Wu>o*qFyKEa}p;BOZLj+t9HhwUp06pHr!KcE@M zkoOlU3h)vMg}VcN{|Q?f8~r2I)X?aEgAI8cBLkj^TX^{5Z?gWozs%n*-N%L5ErFQ( zLlibX%*W6XA&As6$W7mL=-HYAePyc9ZMF;IKiOeWIpR5w0GR0>4BVey6N{tk!2Ks% zv^@8Yh~q<1^m{2kF~=FV@b2J9%0bN4Tu+*sbgBMhWXdlxa9rgqqaE@`MPP$9Y)h(y zzEm-C59(mA+ykoqXE2DTHqq1_X=Kp#JUnqZi!W}xCD|wY>0tOQ@^yDD7I$gDy`2X^ zTOkKe%2lIqmJXOUH{h1W70|ggm$ZFo!NMaFnxJA&&nzhh6W%efY`=yqr4YhR{6dTJ zn=nB^hRBC`(98{`ME1*ZEU1V;_2v|Gzcq~veisVfz7l?Gt13BgUlUi{d`p>?C1}>< zge+$j@Q_WSRFDS(dl9)Gcpo#GHiPpRVS~%GW%(I)YKJ*+WTdjr< z^RMHqbT^=v{si$rFYzCf(lS9Ead-70Vr5s%Y`=_!Vl{r`QdP;Zp$xj0 z-?Kr{;2G}XsDNfo2(f-HFS!!NfhGRe8Jn6s7|c$@mo^n}!7iC*Wk!LyaV4E#q9Ll~ z9PV5`KwnvmFx>V4@=&+{AR!1l+Vrq+7FImzv%vtz4BUVHF3K;F0hVP0-RgG)aue2p z&7#?Kbf}ZqhbPiw`y=V;t@coQXcKr1eV{JN9%$<{4X-&Z1(D}4IU)a*bZSn)GQ}oZ zpdf0cq;n8Mm(rg4NGvN@BkVsA&y>-gmhWF0q!h=@ZBlf#h^K(rTMgV)HQ-6x%fUyg~_CGOR?E zWLCmR$uRo8@*xJcJlwNE7R}ts$PeWSpdBoOHqO2nBKF3^mu|zAu7~uC=qmC~7ei*G zBRD!pX|hyKFsUQO^;uz5b+Q<-x)IYxH$(5p1ktHj2s)c0A>?HzSvVo)EA;Qdzf!RmdT%0hx?RkQ2ohjdW(}yp1zM{yi66T?t&8- zH9QSIsavB(r9Oy*j8XMPCMk04CLaZ#VNn+Y8WYj{3sE7o?OXtE`!SRRdm0ON8h)Xx zx1NV55>~kgqJDOVu+0kvN~62M^oVOhnl2Z=oGs=)gJ!4R)lfe#)ceFIUiMg$s z40k8IQR|#9Y-qTEJ#u51R6IoOA8L@X+6ibp8;B3yC}ZKb|FpK{R}wkSwiwNPK|kKS z#MewbhTrH}H*0GpY^Nwhh$YTDf7#t~V!35{aFiS;-G%oeR zF(bf}pKI~%r9KRpcNd1@QyJ3{V_dw;8w}&hsra!H?%Tc&7rWmg4oyAymc4<>zc5F+ zUyebZpc$rCD?xADF5KuK#r{X(6@Cy;I+!c){y+_C7jFk{>wf6rX+z=iJai1WifOIc z zl#_*#hnDbVzw6-l)IX(1f13}&h#ahznJE}v83#4vF;JzPNV(RAl4U&x=<&7y<4=`< zX2g29ViyUQ4;DdePz^Rzaj9wIT^3X_pwQkGxaNzXcGsceeRTJy%V%Uhxlhy zoavec&5-JxiWdx0(9*CSvZm`poZuyFTV~HU$=*vJoG_wN{VGVGqYU$O*_6>}r@vmA z2VE;~fY>CJwALG9sCfmhf87nff=)Ak#A_y=FD(KvjW}d{{Z)5Ig0=Q literal 0 HcmV?d00001 diff --git a/docs/faq.markdown b/docs/faq.markdown index 115b9ad..3bfa1c3 100644 --- a/docs/faq.markdown +++ b/docs/faq.markdown @@ -133,3 +133,25 @@ The model generates faces with a resolution of 128x128, which is relatively low. SimSwap models are based on older InsightFace architectures, and SimSwap has not been released as a Python package. Its incorporation would complicate the process, and it does not guarantee any substantial gain. If you manage to implement SimSwap successfully, feel free to submit a pull request. + + +#### Shasum of inswapper model + +Check that your model is correct and not corrupted : + +```shell +$>sha1sum inswapper_128.onnx +17a64851eaefd55ea597ee41e5c18409754244c5 inswapper_128.onnx + +$>sha256sum inswapper_128.onnx +e4a3f08c753cb72d04e10aa0f7dbe3deebbf39567d4ead6dce08e98aa49e16af inswapper_128.onnx + +$>sha512sum inswapper_128.onnx +4311f4ccd9da58ec544e912b32ac0cba95f5ab4b1a06ac367efd3e157396efbae1097f624f10e77dd811fbba0917fa7c96e73de44563aa6099e5f46830965069 inswapper_128.onnx +``` + +#### Gradio errors (issubclass() arg 1 must be a class) + +Older versions of gradio don't work well with the extension. See this bug report : https://github.com/glucauze/sd-webui-faceswaplab/issues/5 + +It has been tested on 3.32.0 \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 1c8637a..b4fb1e8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,10 +1,10 @@ cython +dill ifnude insightface==0.7.3 onnx==1.14.0 onnxruntime==1.15.1 -opencv-python==4.7.0.72 +opencv-python pandas -pydantic==1.10.9 -dill==0.3.6 +pydantic safetensors \ No newline at end of file diff --git a/scripts/faceswaplab.py b/scripts/faceswaplab.py index 8c49032..82d66eb 100644 --- a/scripts/faceswaplab.py +++ b/scripts/faceswaplab.py @@ -72,14 +72,6 @@ def __init__(self) -> None: def units_count(self) -> int: return opts.data.get("faceswaplab_units_count", 3) - @property - def upscaled_swapper_in_generated(self) -> bool: - return opts.data.get("faceswaplab_upscaled_swapper", False) - - @property - def upscaled_swapper_in_source(self) -> bool: - return opts.data.get("faceswaplab_upscaled_swapper_in_source", False) - @property def enabled(self) -> bool: """Return True if any unit is enabled and the state is not interupted""" @@ -152,7 +144,6 @@ def process( get_current_model(), self.swap_in_source_units, images=init_images, - upscaled_swapper=self.upscaled_swapper_in_source, force_blend=True, ) logger.info(f"processed init images: {len(init_images)}") @@ -187,7 +178,6 @@ def postprocess( get_current_model(), self.swap_in_generated_units, images=[(img, info)], - upscaled_swapper=self.upscaled_swapper_in_generated, ) if swapped_images is None: continue diff --git a/scripts/faceswaplab_api/faceswaplab_api.py b/scripts/faceswaplab_api/faceswaplab_api.py index de280d2..e4d9c3e 100644 --- a/scripts/faceswaplab_api/faceswaplab_api.py +++ b/scripts/faceswaplab_api/faceswaplab_api.py @@ -91,6 +91,8 @@ async def swap_face( if src_image is not None: if request.postprocessing: pp_options = PostProcessingOptions.from_api_dto(request.postprocessing) + else: + pp_options = None units = get_faceswap_units_settings(request.units) swapped_images = swapper.batch_process( diff --git a/scripts/faceswaplab_settings/faceswaplab_settings.py b/scripts/faceswaplab_settings/faceswaplab_settings.py index 313816a..71c315c 100644 --- a/scripts/faceswaplab_settings/faceswaplab_settings.py +++ b/scripts/faceswaplab_settings/faceswaplab_settings.py @@ -54,7 +54,7 @@ def on_ui_settings() -> None: "faceswaplab_pp_default_face_restorer", shared.OptionInfo( None, - "UI Default post processing face restorer (requires restart)", + "UI Default global post processing face restorer (requires restart)", gr.Dropdown, { "interactive": True, @@ -67,7 +67,7 @@ def on_ui_settings() -> None: "faceswaplab_pp_default_face_restorer_visibility", shared.OptionInfo( 1, - "UI Default post processing face restorer visibility (requires restart)", + "UI Default global post processing face restorer visibility (requires restart)", gr.Slider, {"minimum": 0, "maximum": 1, "step": 0.001}, section=section, @@ -77,7 +77,7 @@ def on_ui_settings() -> None: "faceswaplab_pp_default_face_restorer_weight", shared.OptionInfo( 1, - "UI Default post processing face restorer weight (requires restart)", + "UI Default global post processing face restorer weight (requires restart)", gr.Slider, {"minimum": 0, "maximum": 1, "step": 0.001}, section=section, @@ -87,7 +87,7 @@ def on_ui_settings() -> None: "faceswaplab_pp_default_upscaler", shared.OptionInfo( None, - "UI Default post processing upscaler (requires restart)", + "UI Default global post processing upscaler (requires restart)", gr.Dropdown, { "interactive": True, @@ -100,13 +100,15 @@ def on_ui_settings() -> None: "faceswaplab_pp_default_upscaler_visibility", shared.OptionInfo( 1, - "UI Default post processing upscaler visibility(requires restart)", + "UI Default global post processing upscaler visibility(requires restart)", gr.Slider, {"minimum": 0, "maximum": 1, "step": 0.001}, section=section, ), ) + # Inpainting + shared.opts.add_option( "faceswaplab_pp_default_inpainting_prompt", shared.OptionInfo( @@ -132,20 +134,10 @@ def on_ui_settings() -> None: # UPSCALED SWAPPER shared.opts.add_option( - "faceswaplab_upscaled_swapper", - shared.OptionInfo( - False, - "Upscaled swapper. Applied only to the swapped faces. Apply transformations before merging with the original image.", - gr.Checkbox, - {"interactive": True}, - section=section, - ), - ) - shared.opts.add_option( - "faceswaplab_upscaled_swapper_upscaler", + "faceswaplab_default_upscaled_swapper_upscaler", shared.OptionInfo( None, - "Upscaled swapper upscaler (Recommanded : LDSR but slow)", + "Default Upscaled swapper upscaler (Recommanded : LDSR but slow) (requires restart)", gr.Dropdown, { "interactive": True, @@ -155,40 +147,40 @@ def on_ui_settings() -> None: ), ) shared.opts.add_option( - "faceswaplab_upscaled_swapper_sharpen", + "faceswaplab_default_upscaled_swapper_sharpen", shared.OptionInfo( False, - "Upscaled swapper sharpen", + "Default Upscaled swapper sharpen", gr.Checkbox, {"interactive": True}, section=section, ), ) shared.opts.add_option( - "faceswaplab_upscaled_swapper_fixcolor", + "faceswaplab_default_upscaled_swapper_fixcolor", shared.OptionInfo( False, - "Upscaled swapper color correction", + "Default Upscaled swapper color corrections (requires restart)", gr.Checkbox, {"interactive": True}, section=section, ), ) shared.opts.add_option( - "faceswaplab_upscaled_improved_mask", + "faceswaplab_default_upscaled_swapper_improved_mask", shared.OptionInfo( True, - "Use improved segmented mask (use pastenet to mask only the face)", + "Default Use improved segmented mask (use pastenet to mask only the face) (requires restart)", gr.Checkbox, {"interactive": True}, section=section, ), ) shared.opts.add_option( - "faceswaplab_upscaled_swapper_face_restorer", + "faceswaplab_default_upscaled_swapper_face_restorer", shared.OptionInfo( None, - "Upscaled swapper face restorer", + "Default Upscaled swapper face restorer (requires restart)", gr.Dropdown, { "interactive": True, @@ -198,40 +190,30 @@ def on_ui_settings() -> None: ), ) shared.opts.add_option( - "faceswaplab_upscaled_swapper_face_restorer_visibility", + "faceswaplab_default_upscaled_swapper_face_restorer_visibility", shared.OptionInfo( 1, - "Upscaled swapper face restorer visibility", + "Default Upscaled swapper face restorer visibility (requires restart)", gr.Slider, {"minimum": 0, "maximum": 1, "step": 0.001}, section=section, ), ) shared.opts.add_option( - "faceswaplab_upscaled_swapper_face_restorer_weight", + "faceswaplab_default_upscaled_swapper_face_restorer_weight", shared.OptionInfo( 1, - "Upscaled swapper face restorer weight (codeformer)", + "Default Upscaled swapper face restorer weight (codeformer) (requires restart)", gr.Slider, {"minimum": 0, "maximum": 1, "step": 0.001}, section=section, ), ) shared.opts.add_option( - "faceswaplab_upscaled_swapper_fthresh", - shared.OptionInfo( - 10, - "Upscaled swapper fthresh (diff sensitivity) 10 = default behaviour. Low impact.", - gr.Slider, - {"minimum": 5, "maximum": 250, "step": 1}, - section=section, - ), - ) - shared.opts.add_option( - "faceswaplab_upscaled_swapper_erosion", + "faceswaplab_default_upscaled_swapper_erosion", shared.OptionInfo( 1, - "Upscaled swapper mask erosion factor, 1 = default behaviour. The larger it is, the more blur is applied around the face. Too large and the facial change is no longer visible.", + "Default Upscaled swapper mask erosion factor, 1 = default behaviour. The larger it is, the more blur is applied around the face. Too large and the facial change is no longer visible. (requires restart)", gr.Slider, {"minimum": 0, "maximum": 10, "step": 0.001}, section=section, diff --git a/scripts/faceswaplab_swapping/swapper.py b/scripts/faceswaplab_swapping/swapper.py index 89eaf8e..e6fcae9 100644 --- a/scripts/faceswaplab_swapping/swapper.py +++ b/scripts/faceswaplab_swapping/swapper.py @@ -1,8 +1,14 @@ import copy import os from dataclasses import dataclass -from typing import Any, Dict, List, Set, Tuple, Optional +from pprint import pformat +from typing import Any, Dict, Generator, List, Set, Tuple, Optional import tempfile +from tqdm import tqdm +import sys +from io import StringIO +from contextlib import contextmanager +import hashlib import cv2 import insightface @@ -13,6 +19,7 @@ from sklearn.metrics.pairwise import cosine_similarity from scripts.faceswaplab_swapping import upscaled_inswapper +from scripts.faceswaplab_swapping.upcaled_inswapper_options import InswappperOptions from scripts.faceswaplab_utils.imgutils import ( pil_to_cv2, check_against_nsfw, @@ -117,19 +124,16 @@ def batch_process( for src_image in src_images: current_images = [] swapped_images = process_images_units( - get_current_model(), - images=[(src_image, None)], - units=units, - upscaled_swapper=opts.data.get( - "faceswaplab_upscaled_swapper", False - ), + get_current_model(), images=[(src_image, None)], units=units ) if len(swapped_images) > 0: current_images += [img for img, _ in swapped_images] logger.info("%s images generated", len(current_images)) - for i, img in enumerate(current_images): - current_images[i] = enhance_image(img, postprocess_options) + + if postprocess_options: + for i, img in enumerate(current_images): + current_images[i] = enhance_image(img, postprocess_options) if save_path: for img in current_images: @@ -225,6 +229,33 @@ def __init__(self, message: str) -> None: super().__init__(self.message) +@contextmanager +def capture_stdout() -> Generator[StringIO, None, None]: + """ + Capture and yield the printed messages to stdout. + + This context manager temporarily replaces sys.stdout with a StringIO object, + capturing all printed output. After the context block is exited, sys.stdout + is restored to its original value. + + Example usage: + with capture_stdout() as captured: + print("Hello, World!") + output = captured.getvalue() + # output now contains "Hello, World!\n" + + Returns: + A StringIO object containing the captured output. + """ + original_stdout = sys.stdout # Type: ignore + captured_stdout = StringIO() + sys.stdout = captured_stdout # Type: ignore + try: + yield captured_stdout + finally: + sys.stdout = original_stdout # Type: ignore + + @lru_cache(maxsize=1) def getAnalysisModel() -> insightface.app.FaceAnalysis: """ @@ -237,11 +268,20 @@ def getAnalysisModel() -> insightface.app.FaceAnalysis: if not os.path.exists(faceswaplab_globals.ANALYZER_DIR): os.makedirs(faceswaplab_globals.ANALYZER_DIR) - logger.info("Load analysis model, will take some time.") + logger.info("Load analysis model, will take some time. (> 30s)") # Initialize the analysis model with the specified name and providers - return insightface.app.FaceAnalysis( - name="buffalo_l", providers=providers, root=faceswaplab_globals.ANALYZER_DIR - ) + + with tqdm(total=1, desc="Loading analysis model", unit="model") as pbar: + with capture_stdout() as captured: + model = insightface.app.FaceAnalysis( + name="buffalo_l", + providers=providers, + root=faceswaplab_globals.ANALYZER_DIR, + ) + pbar.update(1) + logger.info("%s", pformat(captured.getvalue())) + + return model except Exception as e: logger.error( "Loading of swapping model failed, please check the requirements (On Windows, download and install Visual Studio. During the install, make sure to include the Python and C++ packages.)" @@ -249,11 +289,8 @@ def getAnalysisModel() -> insightface.app.FaceAnalysis: raise FaceModelException("Loading of analysis model failed") -import hashlib - - def is_sha1_matching(file_path: str, expected_sha1: str) -> bool: - sha1_hash = hashlib.sha1() + sha1_hash = hashlib.sha1(usedforsecurity=False) with open(file_path, "rb") as file: for byte_block in iter(lambda: file.read(4096), b""): @@ -284,10 +321,15 @@ def getFaceSwapModel(model_path: str) -> upscaled_inswapper.UpscaledINSwapper: expected_sha1, ) - # Initializes the face swap model using the specified model path. - return upscaled_inswapper.UpscaledINSwapper( - insightface.model_zoo.get_model(model_path, providers=providers) - ) + with tqdm(total=1, desc="Loading swap model", unit="model") as pbar: + with capture_stdout() as captured: + model = upscaled_inswapper.UpscaledINSwapper( + insightface.model_zoo.get_model(model_path, providers=providers) + ) + pbar.update(1) + logger.info("%s", pformat(captured.getvalue())) + return model + except Exception as e: logger.error( "Loading of swapping model failed, please check the requirements (On Windows, download and install Visual Studio. During the install, make sure to include the Python and C++ packages.)" @@ -498,7 +540,7 @@ def swap_face( target_img: PILImage, target_faces: List[Face], model: str, - upscaled_swapper: bool = False, + swapping_options: Optional[InswappperOptions], compute_similarity: bool = True, ) -> ImageResult: """ @@ -532,7 +574,7 @@ def swap_face( img=result, target_face=swapped_face, source_face=source_face, - upscale=upscaled_swapper, + options=swapping_options, ) # type: ignore result_image = Image.fromarray(cv2.cvtColor(result, cv2.COLOR_BGR2RGB)) @@ -581,7 +623,6 @@ def process_image_unit( unit: FaceSwapUnitSettings, image: PILImage, info: str = None, - upscaled_swapper: bool = False, force_blend: bool = False, ) -> List[Tuple[PILImage, str]]: """Process one image and return a List of (image, info) (one if blended, many if not). @@ -639,7 +680,7 @@ def process_image_unit( target_img=current_image, target_faces=target_faces, model=model, - upscaled_swapper=upscaled_swapper, + swapping_options=unit.swapping_options, compute_similarity=unit.compute_similarity, ) # Apply post-inpainting to image @@ -694,7 +735,6 @@ def process_images_units( model: str, units: List[FaceSwapUnitSettings], images: List[Tuple[Optional[PILImage], Optional[str]]], - upscaled_swapper: bool = False, force_blend: bool = False, ) -> Optional[List[Tuple[PILImage, str]]]: """ @@ -725,13 +765,9 @@ def process_images_units( processed_images = [] for i, (image, info) in enumerate(images): logger.debug("Processing image %s", i) - swapped = process_image_unit( - model, units[0], image, info, upscaled_swapper, force_blend - ) + swapped = process_image_unit(model, units[0], image, info, force_blend) logger.debug("Image %s -> %s images", i, len(swapped)) - nexts = process_images_units( - model, units[1:], swapped, upscaled_swapper, force_blend - ) + nexts = process_images_units(model, units[1:], swapped, force_blend) if nexts: processed_images.extend(nexts) else: diff --git a/scripts/faceswaplab_swapping/upcaled_inswapper_options.py b/scripts/faceswaplab_swapping/upcaled_inswapper_options.py new file mode 100644 index 0000000..efba4e4 --- /dev/null +++ b/scripts/faceswaplab_swapping/upcaled_inswapper_options.py @@ -0,0 +1,38 @@ +from dataclasses import * +from client_api import api_utils + + +@dataclass +class InswappperOptions: + face_restorer_name: str = None + restorer_visibility: float = 1 + codeformer_weight: float = 1 + upscaler_name: str = None + improved_mask: bool = False + color_corrections: bool = False + sharpen: bool = False + erosion_factor: float = 1.0 + + @staticmethod + def from_api_dto(dto: api_utils.InswappperOptions) -> "InswappperOptions": + """ + Converts a InpaintingOptions object from an API DTO (Data Transfer Object). + + :param options: An object of api_utils.InpaintingOptions representing the + post-processing options as received from the API. + :return: A InpaintingOptions instance containing the translated values + from the API DTO. + """ + if dto is None: + return InswappperOptions() + + return InswappperOptions( + face_restorer_name=dto.face_restorer_name, + restorer_visibility=dto.restorer_visibility, + codeformer_weight=dto.codeformer_weight, + upscaler_name=dto.upscaler_name, + improved_mask=dto.improved_mask, + color_corrections=dto.color_corrections, + sharpen=dto.sharpen, + erosion_factor=dto.erosion_factor, + ) diff --git a/scripts/faceswaplab_swapping/upscaled_inswapper.py b/scripts/faceswaplab_swapping/upscaled_inswapper.py index a441dc0..dd66d82 100644 --- a/scripts/faceswaplab_swapping/upscaled_inswapper.py +++ b/scripts/faceswaplab_swapping/upscaled_inswapper.py @@ -12,8 +12,10 @@ PostProcessingOptions, ) from scripts.faceswaplab_swapping.facemask import generate_face_mask +from scripts.faceswaplab_swapping.upcaled_inswapper_options import InswappperOptions from scripts.faceswaplab_utils.imgutils import cv2_to_pil, pil_to_cv2 from scripts.faceswaplab_utils.typing import CV2ImgU8, Face +from scripts.faceswaplab_utils.faceswaplab_logging import logger def get_upscaler() -> UpscalerData: @@ -127,26 +129,25 @@ class UpscaledINSwapper(INSwapper): def __init__(self, inswapper: INSwapper): self.__dict__.update(inswapper.__dict__) - def super_resolution(self, img: CV2ImgU8, k: int = 2) -> CV2ImgU8: + def upscale_and_restore( + self, img: CV2ImgU8, k: int = 2, inswapper_options: InswappperOptions = None + ) -> CV2ImgU8: pil_img = cv2_to_pil(img) - options = PostProcessingOptions( - upscaler_name=opts.data.get( - "faceswaplab_upscaled_swapper_upscaler", "LDSR" - ), + pp_options = PostProcessingOptions( + upscaler_name=inswapper_options.upscaler_name, upscale_visibility=1, scale=k, - face_restorer_name=opts.data.get( - "faceswaplab_upscaled_swapper_face_restorer", "" - ), - codeformer_weight=opts.data.get( - "faceswaplab_upscaled_swapper_face_restorer_weight", 1 - ), - restorer_visibility=opts.data.get( - "faceswaplab_upscaled_swapper_face_restorer_visibility", 1 - ), + face_restorer_name=inswapper_options.face_restorer_name, + codeformer_weight=inswapper_options.codeformer_weight, + restorer_visibility=inswapper_options.restorer_visibility, ) - upscaled = upscaling.upscale_img(pil_img, options) - upscaled = upscaling.restore_face(upscaled, options) + + upscaled = pil_img + if pp_options.upscaler_name: + upscaled = upscaling.upscale_img(pil_img, pp_options) + if pp_options.face_restorer_name: + upscaled = upscaling.restore_face(upscaled, pp_options) + return pil_to_cv2(upscaled) def get( @@ -155,7 +156,7 @@ def get( target_face: Face, source_face: Face, paste_back: bool = True, - upscale: bool = True, + options: InswappperOptions = None, ) -> Union[CV2ImgU8, Tuple[CV2ImgU8, Any]]: aimg, M = face_align.norm_crop2(img, target_face.kps, self.input_size[0]) blob = cv2.dnn.blobFromImage( @@ -190,43 +191,48 @@ def compute_diff(bgr_fake: CV2ImgU8, aimg: CV2ImgU8) -> CV2ImgU8: fake_diff[:, -2:] = 0 return fake_diff - if upscale: - print("*" * 80) - print( - f"Upscaled inswapper using {opts.data.get('faceswaplab_upscaled_swapper_upscaler', 'LDSR')}" - ) - print("*" * 80) + if options: + logger.info("*" * 80) + logger.info(f"Upscaled inswapper") - k = 4 - aimg, M = face_align.norm_crop2( - img, target_face.kps, self.input_size[0] * k - ) + if options.upscaler_name: + # Upscale original image + k = 4 + aimg, M = face_align.norm_crop2( + img, target_face.kps, self.input_size[0] * k + ) + else: + k = 1 # upscale and restore face : - bgr_fake = self.super_resolution(bgr_fake, k) + bgr_fake = self.upscale_and_restore( + bgr_fake, inswapper_options=options, k=k + ) - if opts.data.get("faceswaplab_upscaled_improved_mask", True): + if options.improved_mask: mask = get_face_mask(aimg, bgr_fake) bgr_fake = merge_images_with_mask(aimg, bgr_fake, mask) # compute fake_diff before sharpen and color correction (better result) fake_diff = compute_diff(bgr_fake, aimg) - if opts.data.get("faceswaplab_upscaled_swapper_sharpen", True): - print("sharpen") + if options.sharpen: + logger.info("sharpen") # Add sharpness blurred = cv2.GaussianBlur(bgr_fake, (0, 0), 3) bgr_fake = cv2.addWeighted(bgr_fake, 1.5, blurred, -0.5, 0) # Apply color corrections - if opts.data.get("faceswaplab_upscaled_swapper_fixcolor", True): - print("color correction") + if options.color_corrections: + logger.info("color correction") correction = processing.setup_color_correction(cv2_to_pil(aimg)) bgr_fake_pil = processing.apply_color_correction( correction, cv2_to_pil(bgr_fake) ) bgr_fake = pil_to_cv2(bgr_fake_pil) + logger.info("*" * 80) + else: fake_diff = compute_diff(bgr_fake, aimg) @@ -254,7 +260,7 @@ def compute_diff(bgr_fake: CV2ImgU8, aimg: CV2ImgU8) -> CV2ImgU8: borderValue=0.0, ) img_white[img_white > 20] = 255 - fthresh = opts.data.get("faceswaplab_upscaled_swapper_fthresh", 10) + fthresh = 10 print("fthresh", fthresh) fake_diff[fake_diff < fthresh] = 0 fake_diff[fake_diff >= fthresh] = 255 @@ -263,9 +269,8 @@ def compute_diff(bgr_fake: CV2ImgU8, aimg: CV2ImgU8) -> CV2ImgU8: mask_h = np.max(mask_h_inds) - np.min(mask_h_inds) mask_w = np.max(mask_w_inds) - np.min(mask_w_inds) mask_size = int(np.sqrt(mask_h * mask_w)) - erosion_factor = opts.data.get( - "faceswaplab_upscaled_swapper_erosion", 1 - ) + erosion_factor = options.erosion_factor + k = max(int(mask_size // 10 * erosion_factor), int(10 * erosion_factor)) kernel = np.ones((k, k), np.uint8) diff --git a/scripts/faceswaplab_ui/faceswaplab_postprocessing_ui.py b/scripts/faceswaplab_ui/faceswaplab_postprocessing_ui.py index ec12a82..6207b5b 100644 --- a/scripts/faceswaplab_ui/faceswaplab_postprocessing_ui.py +++ b/scripts/faceswaplab_ui/faceswaplab_postprocessing_ui.py @@ -17,7 +17,7 @@ def postprocessing_ui() -> List[gr.components.Component]: choices=["None"] + [x.name() for x in shared.face_restorers], value=lambda: opts.data.get( "faceswaplab_pp_default_face_restorer", - shared.face_restorers[0].name(), + "None", ), type="value", elem_id="faceswaplab_pp_face_restorer", diff --git a/scripts/faceswaplab_ui/faceswaplab_tab.py b/scripts/faceswaplab_ui/faceswaplab_tab.py index 0d66cec..5db3dd7 100644 --- a/scripts/faceswaplab_ui/faceswaplab_tab.py +++ b/scripts/faceswaplab_ui/faceswaplab_tab.py @@ -249,6 +249,8 @@ def tools_ui() -> None: preview = gr.components.Image( type="pil", label="Preview", + width=512, + height=512, interactive=False, elem_id="faceswaplab_build_preview_face", ) diff --git a/scripts/faceswaplab_ui/faceswaplab_unit_settings.py b/scripts/faceswaplab_ui/faceswaplab_unit_settings.py index 9bfe4b0..84db6d3 100644 --- a/scripts/faceswaplab_ui/faceswaplab_unit_settings.py +++ b/scripts/faceswaplab_ui/faceswaplab_unit_settings.py @@ -6,6 +6,7 @@ import gradio as gr from insightface.app.common import Face from PIL import Image +from scripts.faceswaplab_swapping.upcaled_inswapper_options import InswappperOptions from scripts.faceswaplab_utils.imgutils import pil_to_cv2 from scripts.faceswaplab_utils.faceswaplab_logging import logger from scripts.faceswaplab_utils import face_checkpoints_utils @@ -51,6 +52,8 @@ class FaceSwapUnitSettings: swap_in_generated: bool # Pre inpainting configuration (Don't use optional for this or gradio parsing will fail) : pre_inpainting: InpaintingOptions + # Configure swapping options + swapping_options: InswappperOptions # Post inpainting configuration (Don't use optional for this or gradio parsing will fail) : post_inpainting: InpaintingOptions @@ -81,6 +84,7 @@ def from_api_dto(dto: api_utils.FaceSwapUnit) -> "FaceSwapUnitSettings": swap_in_generated=True, swap_in_source=False, pre_inpainting=InpaintingOptions.from_api_dto(dto.pre_inpainting), + swapping_options=InswappperOptions.from_api_dto(dto.swapping_options), post_inpainting=InpaintingOptions.from_api_dto(dto.post_inpainting), ) diff --git a/scripts/faceswaplab_ui/faceswaplab_unit_ui.py b/scripts/faceswaplab_ui/faceswaplab_unit_ui.py index a035c14..e75b2cf 100644 --- a/scripts/faceswaplab_ui/faceswaplab_unit_ui.py +++ b/scripts/faceswaplab_ui/faceswaplab_unit_ui.py @@ -2,6 +2,100 @@ from scripts.faceswaplab_ui.faceswaplab_inpainting_ui import face_inpainting_ui from scripts.faceswaplab_utils.face_checkpoints_utils import get_face_checkpoints import gradio as gr +from modules.shared import opts +from modules import shared + + +def faceswap_unit_advanced_options( + is_img2img: bool, unit_num: int = 1, id_prefix: str = "faceswaplab_" +) -> List[gr.components.Component]: + with gr.Accordion(f"Post-Processing & Advanced Mask Options", open=False): + gr.Markdown("""Post-processing and mask settings for unit faces""") + with gr.Row(): + face_restorer_name = gr.Radio( + label="Restore Face", + choices=["None"] + [x.name() for x in shared.face_restorers], + value=lambda: opts.data.get( + "faceswaplab_default_upscaled_swapper_face_restorer", + "None", + ), + type="value", + elem_id=f"{id_prefix}_face{unit_num}_face_restorer", + ) + with gr.Column(): + face_restorer_visibility = gr.Slider( + 0, + 1, + value=lambda: opts.data.get( + "faceswaplab_default_upscaled_swapper_face_restorer_visibility", + 1.0, + ), + step=0.001, + label="Restore visibility", + elem_id=f"{id_prefix}_face{unit_num}_face_restorer_visibility", + ) + codeformer_weight = gr.Slider( + 0, + 1, + value=lambda: opts.data.get( + "faceswaplab_default_upscaled_swapper_face_restorer_weight", 1.0 + ), + step=0.001, + label="codeformer weight", + elem_id=f"{id_prefix}_face{unit_num}_face_restorer_weight", + ) + upscaler_name = gr.Dropdown( + choices=[upscaler.name for upscaler in shared.sd_upscalers], + value=lambda: opts.data.get( + "faceswaplab_default_upscaled_swapper_upscaler", "" + ), + label="Upscaler", + elem_id=f"{id_prefix}_face{unit_num}_upscaler", + ) + + improved_mask = gr.Checkbox( + lambda: opts.data.get( + "faceswaplab_default_upscaled_swapper_improved_mask", False + ), + interactive=True, + label="Use improved segmented mask (use pastenet to mask only the face)", + elem_id=f"{id_prefix}_face{unit_num}_improved_mask", + ) + color_corrections = gr.Checkbox( + lambda: opts.data.get( + "faceswaplab_default_upscaled_swapper_fixcolor", False + ), + interactive=True, + label="Use color corrections", + elem_id=f"{id_prefix}_face{unit_num}_color_corrections", + ) + sharpen_face = gr.Checkbox( + lambda: opts.data.get( + "faceswaplab_default_upscaled_swapper_sharpen", False + ), + interactive=True, + label="sharpen face", + elem_id=f"{id_prefix}_face{unit_num}_sharpen_face", + ) + erosion_factor = gr.Slider( + 0.0, + 10.0, + lambda: opts.data.get("faceswaplab_default_upscaled_swapper_erosion", 1.0), + step=0.01, + label="Upscaled swapper mask erosion factor, 1 = default behaviour.", + elem_id=f"{id_prefix}_face{unit_num}_erosion_factor", + ) + + return [ + face_restorer_name, + face_restorer_visibility, + codeformer_weight, + upscaler_name, + improved_mask, + color_corrections, + sharpen_face, + erosion_factor, + ] def faceswap_unit_ui( @@ -62,35 +156,6 @@ def refresh_fn(selected: str) -> None: elem_id=f"{id_prefix}_face{unit_num}_blend_faces", interactive=True, ) - gr.Markdown("""Discard images with low similarity or no faces :""") - with gr.Row(): - check_similarity = gr.Checkbox( - False, - placeholder="discard", - label="Check similarity", - elem_id=f"{id_prefix}_face{unit_num}_check_similarity", - ) - compute_similarity = gr.Checkbox( - False, - label="Compute similarity", - elem_id=f"{id_prefix}_face{unit_num}_compute_similarity", - ) - min_sim = gr.Slider( - 0, - 1, - 0, - step=0.01, - label="Min similarity", - elem_id=f"{id_prefix}_face{unit_num}_min_similarity", - ) - min_ref_sim = gr.Slider( - 0, - 1, - 0, - step=0.01, - label="Min reference similarity", - elem_id=f"{id_prefix}_face{unit_num}_min_ref_similarity", - ) gr.Markdown( """Select the face to be swapped, you can sort by size or use the same gender as the desired face:""" @@ -143,11 +208,46 @@ def refresh_fn(selected: str) -> None: visible=is_img2img, elem_id=f"{id_prefix}_face{unit_num}_swap_in_generated", ) + + with gr.Accordion("Similarity", open=False): + gr.Markdown("""Discard images with low similarity or no faces :""") + with gr.Row(): + check_similarity = gr.Checkbox( + False, + placeholder="discard", + label="Check similarity", + elem_id=f"{id_prefix}_face{unit_num}_check_similarity", + ) + compute_similarity = gr.Checkbox( + False, + label="Compute similarity", + elem_id=f"{id_prefix}_face{unit_num}_compute_similarity", + ) + min_sim = gr.Slider( + 0, + 1, + 0, + step=0.01, + label="Min similarity", + elem_id=f"{id_prefix}_face{unit_num}_min_similarity", + ) + min_ref_sim = gr.Slider( + 0, + 1, + 0, + step=0.01, + label="Min reference similarity", + elem_id=f"{id_prefix}_face{unit_num}_min_ref_similarity", + ) + pre_inpainting = face_inpainting_ui( name="Pre-Inpainting (Before swapping)", id_prefix=f"{id_prefix}_face{unit_num}_preinpainting", description="Pre-inpainting sends face to inpainting before swapping", ) + + options = faceswap_unit_advanced_options(is_img2img, unit_num, id_prefix) + post_inpainting = face_inpainting_ui( name="Post-Inpainting (After swapping)", id_prefix=f"{id_prefix}_face{unit_num}_postinpainting", @@ -173,6 +273,7 @@ def refresh_fn(selected: str) -> None: swap_in_generated, ] + pre_inpainting + + options + post_inpainting ) diff --git a/scripts/faceswaplab_utils/face_checkpoints_utils.py b/scripts/faceswaplab_utils/face_checkpoints_utils.py index de3ebf1..481718f 100644 --- a/scripts/faceswaplab_utils/face_checkpoints_utils.py +++ b/scripts/faceswaplab_utils/face_checkpoints_utils.py @@ -7,21 +7,19 @@ import modules.scripts as scripts from modules import scripts +from scripts.faceswaplab_swapping.upcaled_inswapper_options import InswappperOptions from scripts.faceswaplab_utils.faceswaplab_logging import logger from scripts.faceswaplab_utils.typing import * from scripts.faceswaplab_utils import imgutils -from scripts.faceswaplab_postprocessing.postprocessing import enhance_image -from scripts.faceswaplab_postprocessing.postprocessing_options import ( - PostProcessingOptions, -) from scripts.faceswaplab_utils.models_utils import get_models -from modules.shared import opts import traceback import dill as pickle # will be removed in future versions from scripts.faceswaplab_swapping import swapper from pprint import pformat import re +from client_api import api_utils +import tempfile def sanitize_name(name: str) -> str: @@ -93,16 +91,9 @@ def build_face_checkpoint_and_save( source_face=blended_face, target_img=reference_preview_img, model=get_models()[0], - upscaled_swapper=opts.data.get( - "faceswaplab_upscaled_swapper", False - ), - ) - preview_image = enhance_image( - result.image, - PostProcessingOptions( - face_restorer_name="CodeFormer", restorer_visibility=1 - ), + swapping_options=InswappperOptions(face_restorer_name="Codeformer"), ) + preview_image = result.image file_path = os.path.join(get_checkpoint_path(), f"{name}.safetensors") if not overwrite: @@ -147,6 +138,16 @@ def save_face(face: Face, filename: str) -> None: def load_face(name: str) -> Face: + if name.startswith("data:application/face;base64,"): + with tempfile.NamedTemporaryFile(delete=True) as temp_file: + api_utils.base64_to_safetensors(name, temp_file.name) + face = {} + with safe_open(temp_file.name, framework="pt", device="cpu") as f: + for k in f.keys(): + logger.debug("load key %s", k) + face[k] = f.get_tensor(k).numpy() + return Face(face) + filename = matching_checkpoint(name) if filename is None: return None From 02d88bac918a131994c140590e6198cb6340e764 Mon Sep 17 00:00:00 2001 From: Tran Xen <137925069+glucauze@users.noreply.github.com> Date: Thu, 3 Aug 2023 15:25:44 +0200 Subject: [PATCH 5/7] add api for face building, add tests --- client_api/api_utils.py | 2 +- client_api/faceswaplab_api_example.py | 22 +++- client_api/test.safetensors | Bin 2256 -> 2256 bytes scripts/faceswaplab_api/faceswaplab_api.py | 24 ++++ scripts/faceswaplab_swapping/swapper.py | 9 +- scripts/faceswaplab_ui/faceswaplab_tab.py | 4 +- .../face_checkpoints_utils.py | 27 +++-- tests/test_api.py | 108 +++++++++++++++++- 8 files changed, 169 insertions(+), 27 deletions(-) diff --git a/client_api/api_utils.py b/client_api/api_utils.py index 9190b0d..4847acd 100644 --- a/client_api/api_utils.py +++ b/client_api/api_utils.py @@ -187,7 +187,7 @@ class FaceSwapRequest(BaseModel): default=None, ) units: List[FaceSwapUnit] - postprocessing: Optional[PostProcessingOptions] + postprocessing: Optional[PostProcessingOptions] = None class FaceSwapResponse(BaseModel): diff --git a/client_api/faceswaplab_api_example.py b/client_api/faceswaplab_api_example.py index b992f15..9a5a522 100644 --- a/client_api/faceswaplab_api_example.py +++ b/client_api/faceswaplab_api_example.py @@ -1,7 +1,9 @@ +from typing import List import requests from api_utils import ( FaceSwapUnit, InswappperOptions, + base64_to_safetensors, pil_to_base64, PostProcessingOptions, InpaintingWhen, @@ -98,12 +100,30 @@ img.show() +############################# +# Build checkpoint + +source_images: List[str] = [ + pil_to_base64("../references/man.png"), + pil_to_base64("../references/woman.png"), +] + +result = requests.post( + url=f"{address}/faceswaplab/build", + json=source_images, + headers={"Content-Type": "application/json; charset=utf-8"}, +) + +base64_to_safetensors(result.json(), output_path="test.safetensors") + ############################# # FaceSwap with local safetensors # First face unit : unit1 = FaceSwapUnit( - source_face=safetensors_to_base64("test.safetensors"), + source_face=safetensors_to_base64( + "test.safetensors" + ), # convert the checkpoint to base64 faces_index=(0,), # Replace first face swapping_options=InswappperOptions( face_restorer_name="CodeFormer", diff --git a/client_api/test.safetensors b/client_api/test.safetensors index c74264bdb49b4d996d1791eeac4b4a7b192cb435..a24d1b6a2fe97011273f695d28bf97b6b864875c 100644 GIT binary patch literal 2256 zcmb7?XHb-f7KRrK5Q2(`QiO=BD8h;~*A47 zBzn<^5;UUjcaCs{fCWn=5u?PhT`WnVTP(xxeoF=aiXe-gnNNI>~>vS{l13 zLF%zus#=z*e&0xaU($(KZ4vIbNsk?a$y&gBPD`QYnXA1#}uA4Ds;v@efp6>SjpFp#IdbPx{~$}#i)B+?6Upyk_==+zHuFm&I6 zK40lkSwX8ZSh5oJ`dt#jsuE$~>rU{`uHdNr+aUe9nNpNzc!dSxT{B;PBRdN|nD%aHY;JLn=~#$D2aSQJu6|un%zN)*>w``q#n@^Kf3ClOxEi%c(B6 zNzlEn5gVJ=;!Bwo8W+5#An&IXuxTrYSvIkMem;gKTi`s4a5NFTDPFdf7vDN84vX-` zLeUAIJZ}UsuNYL)KZI>lDxh340uG+JMOpH3%5G~%oR>GAJI6L1E|3FTO0t;*x`WJ}QW|iCcMLh8LNSZ-#_w9Vbn<oZ^;0WyO+fJ?@=hB(p z)qG&cBtep8h-!L7m%0Yg(Dg$Q?-x^qg%h6n*SEB0`cL#(_$2%!dn}&|AB4jr4q(d2 z@1Wa$I9h6(IBin~2jA#|N0YR?=0OuhYFF^6j;kc$39xp;7U-Ov5B1YzsPV8DT0e`S zo6WPZV(SPMX0MhElf>%4M&b_#(mGOiyfmRmyUSUg$G z9u*4Xoa}L)YbaU-xF|yc5%p>(Li;z8b8e+)dEAs5sC}FSZ5{UT)eAlTerPrrFWE>P zjn@GJTCvZ)8PnT~x$DP693N`SJr6tRp2h`NZI}o4QddF$?n0jadj&l)j^jaZ=W*^? z#s{OfL(R2%7_0Tg?Ugw=dz3E)+e9*4(?<`*dXhzcNHe7;!N16kvox`uy2A1NTXq@- z9vDwY(^^FrqgRkDb>xWay>!ZIAH6tXB2<*_;W(eQ{8SdmldtT73%5F9!+kfd`KB8E zl1Jm&pF;70N+Nu*+mFjy*R%12E2uVb0r};H?5vZp`Ct!pu4g!unnTYelTZ_HjKi+f z^PUUmDY#}Xm7F{PrWd@?aM(Lh&r-p^rev~T_hGs>C7va1_h>^`9`TZukl~q!PKrQO z2H5g!D-92bYN3MaL6ANunpcdRh&9&HSaz!i2MjAE_kc5?=o^hcIMkwgUnBUGZiSce zUNpbOpY5HpK%3Mho+zHpX(xkN=RXbIdu}7OCX=Z=hf1UDpwiNpi;94wc56tnZ=m3w z?#u%xlwiiiAkuXd@cDrw;PL4SkawvuF40+NJEBF2;@>3OWy+q>v#2yc4VqK>=o@pA z`j5$@u+%NAd*#TlzBR+uf`Lepja=u zRtm7@agO+@&Bt7qoB~xob)2661z1PU;*u;i=zTqwYAB8C2YAs=?|gpO5scoB2dVK$ zIi+?VhhEhb&N+0E?kw*|v#r;%+q$3?Oo}(wY$MO+Jg{pR4H++7 z(9^UNjs|b1czXl9yw?lY6fA*=v!1M7dK5ym=3E^;moFUafxwwJ#VD5(nDzRFM_KI= za?stP`^)|VwV6riQ00V v|3~Nj6!`6FQ5iCg40qfRC96)IzMtj8Znjlur;6mydfw9P4=X__|Cs*-&(#JB literal 2256 zcmb7^Yc$n)7so?M)C?zdlj@{$IXSK;Bj>kImqAL3D1>khdd8(flNymyIw?{rgpigI zk&xp5+efG5u8c{Yjbtuu!Wu>o*qFyKEa}p;BOZLj+t9HhwUp06pHr!KcE@M zkoOlU3h)vMg}VcN{|Q?f8~r2I)X?aEgAI8cBLkj^TX^{5Z?gWozs%n*-N%L5ErFQ( zLlibX%*W6XA&As6$W7mL=-HYAePyc9ZMF;IKiOeWIpR5w0GR0>4BVey6N{tk!2Ks% zv^@8Yh~q<1^m{2kF~=FV@b2J9%0bN4Tu+*sbgBMhWXdlxa9rgqqaE@`MPP$9Y)h(y zzEm-C59(mA+ykoqXE2DTHqq1_X=Kp#JUnqZi!W}xCD|wY>0tOQ@^yDD7I$gDy`2X^ zTOkKe%2lIqmJXOUH{h1W70|ggm$ZFo!NMaFnxJA&&nzhh6W%efY`=yqr4YhR{6dTJ zn=nB^hRBC`(98{`ME1*ZEU1V;_2v|Gzcq~veisVfz7l?Gt13BgUlUi{d`p>?C1}>< zge+$j@Q_WSRFDS(dl9)Gcpo#GHiPpRVS~%GW%(I)YKJ*+WTdjr< z^RMHqbT^=v{si$rFYzCf(lS9Ead-70Vr5s%Y`=_!Vl{r`QdP;Zp$xj0 z-?Kr{;2G}XsDNfo2(f-HFS!!NfhGRe8Jn6s7|c$@mo^n}!7iC*Wk!LyaV4E#q9Ll~ z9PV5`KwnvmFx>V4@=&+{AR!1l+Vrq+7FImzv%vtz4BUVHF3K;F0hVP0-RgG)aue2p z&7#?Kbf}ZqhbPiw`y=V;t@coQXcKr1eV{JN9%$<{4X-&Z1(D}4IU)a*bZSn)GQ}oZ zpdf0cq;n8Mm(rg4NGvN@BkVsA&y>-gmhWF0q!h=@ZBlf#h^K(rTMgV)HQ-6x%fUyg~_CGOR?E zWLCmR$uRo8@*xJcJlwNE7R}ts$PeWSpdBoOHqO2nBKF3^mu|zAu7~uC=qmC~7ei*G zBRD!pX|hyKFsUQO^;uz5b+Q<-x)IYxH$(5p1ktHj2s)c0A>?HzSvVo)EA;Qdzf!RmdT%0hx?RkQ2ohjdW(}yp1zM{yi66T?t&8- zH9QSIsavB(r9Oy*j8XMPCMk04CLaZ#VNn+Y8WYj{3sE7o?OXtE`!SRRdm0ON8h)Xx zx1NV55>~kgqJDOVu+0kvN~62M^oVOhnl2Z=oGs=)gJ!4R)lfe#)ceFIUiMg$s z40k8IQR|#9Y-qTEJ#u51R6IoOA8L@X+6ibp8;B3yC}ZKb|FpK{R}wkSwiwNPK|kKS z#MewbhTrH}H*0GpY^Nwhh$YTDf7#t~V!35{aFiS;-G%oeR zF(bf}pKI~%r9KRpcNd1@QyJ3{V_dw;8w}&hsra!H?%Tc&7rWmg4oyAymc4<>zc5F+ zUyebZpc$rCD?xADF5KuK#r{X(6@Cy;I+!c){y+_C7jFk{>wf6rX+z=iJai1WifOIc z zl#_*#hnDbVzw6-l)IX(1f13}&h#ahznJE}v83#4vF;JzPNV(RAl4U&x=<&7y<4=`< zX2g29ViyUQ4;DdePz^Rzaj9wIT^3X_pwQkGxaNzXcGsceeRTJy%V%Uhxlhy zoavec&5-JxiWdx0(9*CSvZm`poZuyFTV~HU$=*vJoG_wN{VGVGqYU$O*_6>}r@vmA z2VE;~fY>CJwALG9sCfmhf87nff=)Ak#A_y=FD(KvjW}d{{Z)5Ig0=Q diff --git a/scripts/faceswaplab_api/faceswaplab_api.py b/scripts/faceswaplab_api/faceswaplab_api.py index e4d9c3e..ef6803f 100644 --- a/scripts/faceswaplab_api/faceswaplab_api.py +++ b/scripts/faceswaplab_api/faceswaplab_api.py @@ -1,3 +1,4 @@ +import tempfile from PIL import Image import numpy as np from fastapi import FastAPI @@ -17,6 +18,9 @@ PostProcessingOptions, ) from client_api import api_utils +from scripts.faceswaplab_utils.face_checkpoints_utils import ( + build_face_checkpoint_and_save, +) def encode_to_base64(image: Union[str, Image.Image, np.ndarray]) -> str: # type: ignore @@ -135,3 +139,23 @@ async def extract( result_images = [encode_to_base64(img) for img in faces] response = api_utils.FaceSwapExtractResponse(images=result_images) return response + + @app.post( + "/faceswaplab/build", + tags=["faceswaplab"], + description="Build a face checkpoint using base64 images, return base64 satetensors", + ) + async def build(base64_images: List[str]) -> Optional[str]: + if len(base64_images) > 0: + pil_images = [base64_to_pil(img) for img in base64_images] + with tempfile.NamedTemporaryFile( + delete=True, suffix=".safetensors" + ) as temp_file: + build_face_checkpoint_and_save( + images=pil_images, + name="api_ckpt", + overwrite=True, + path=temp_file.name, + ) + return api_utils.safetensors_to_base64(temp_file.name) + return None diff --git a/scripts/faceswaplab_swapping/swapper.py b/scripts/faceswaplab_swapping/swapper.py index e6fcae9..677e49d 100644 --- a/scripts/faceswaplab_swapping/swapper.py +++ b/scripts/faceswaplab_swapping/swapper.py @@ -468,12 +468,12 @@ def get_or_default(l: List[Any], index: int, default: Any) -> Any: return l[index] if index < len(l) else default -def get_faces_from_img_files(files: List[str]) -> List[Optional[CV2ImgU8]]: +def get_faces_from_img_files(images: List[PILImage]) -> List[Optional[CV2ImgU8]]: """ Extracts faces from a list of image files. Args: - files (list): A list of file objects representing image files. + images (list): A list of PILImage objects representing image files. Returns: list: A list of detected faces. @@ -482,9 +482,8 @@ def get_faces_from_img_files(files: List[str]) -> List[Optional[CV2ImgU8]]: faces = [] - if len(files) > 0: - for file in files: - img = Image.open(file) # Open the image file + if len(images) > 0: + for img in images: face = get_or_default( get_faces(pil_to_cv2(img)), 0, None ) # Extract faces from the image diff --git a/scripts/faceswaplab_ui/faceswaplab_tab.py b/scripts/faceswaplab_ui/faceswaplab_tab.py index 5db3dd7..c2c659f 100644 --- a/scripts/faceswaplab_ui/faceswaplab_tab.py +++ b/scripts/faceswaplab_ui/faceswaplab_tab.py @@ -153,9 +153,9 @@ def build_face_checkpoint_and_save( if not batch_files: logger.error("No face found") return None - filenames = [x.name for x in batch_files] + images = [Image.open(file.name) for file in batch_files] preview_image = face_checkpoints_utils.build_face_checkpoint_and_save( - filenames, name, overwrite=overwrite + images, name, overwrite=overwrite ) except Exception as e: logger.error("Failed to build checkpoint %s", e) diff --git a/scripts/faceswaplab_utils/face_checkpoints_utils.py b/scripts/faceswaplab_utils/face_checkpoints_utils.py index 481718f..bf652f1 100644 --- a/scripts/faceswaplab_utils/face_checkpoints_utils.py +++ b/scripts/faceswaplab_utils/face_checkpoints_utils.py @@ -38,7 +38,7 @@ def sanitize_name(name: str) -> str: def build_face_checkpoint_and_save( - batch_files: List[str], name: str, overwrite: bool = False + images: List[PILImage], name: str, overwrite: bool = False, path: str = None ) -> PILImage: """ Builds a face checkpoint using the provided image files, performs face swapping, @@ -55,9 +55,9 @@ def build_face_checkpoint_and_save( try: name = sanitize_name(name) - batch_files = batch_files or [] - logger.info("Build %s %s", name, [x for x in batch_files]) - faces = swapper.get_faces_from_img_files(batch_files) + images = images or [] + logger.info("Build %s with %s images", name, len(images)) + faces = swapper.get_faces_from_img_files(images) blended_face = swapper.blend_faces(faces) preview_path = os.path.join( scripts.basedir(), "extensions", "sd-webui-faceswaplab", "references" @@ -95,14 +95,17 @@ def build_face_checkpoint_and_save( ) preview_image = result.image - file_path = os.path.join(get_checkpoint_path(), f"{name}.safetensors") - if not overwrite: - file_number = 1 - while os.path.exists(file_path): - file_path = os.path.join( - get_checkpoint_path(), f"{name}_{file_number}.safetensors" - ) - file_number += 1 + if path: + file_path = path + else: + file_path = os.path.join(get_checkpoint_path(), f"{name}.safetensors") + if not overwrite: + file_number = 1 + while os.path.exists(file_path): + file_path = os.path.join( + get_checkpoint_path(), f"{name}_{file_number}.safetensors" + ) + file_number += 1 save_face(filename=file_path, face=blended_face) preview_image.save(file_path + ".png") try: diff --git a/tests/test_api.py b/tests/test_api.py index 166ee24..8f20bce 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -2,22 +2,28 @@ import pytest import requests import sys +import tempfile +import safetensors sys.path.append(".") +import requests from client_api.api_utils import ( FaceSwapUnit, - FaceSwapResponse, - PostProcessingOptions, - FaceSwapRequest, - base64_to_pil, + InswappperOptions, pil_to_base64, + PostProcessingOptions, InpaintingWhen, - FaceSwapCompareRequest, + InpaintingOptions, + FaceSwapRequest, + FaceSwapResponse, FaceSwapExtractRequest, + FaceSwapCompareRequest, FaceSwapExtractResponse, compare_faces, - InpaintingOptions, + base64_to_pil, + base64_to_safetensors, + safetensors_to_base64, ) from PIL import Image @@ -37,6 +43,13 @@ def face_swap_request() -> FaceSwapRequest: source_img=pil_to_base64("references/woman.png"), # The face you want to use same_gender=True, faces_index=(0,), # Replace first woman since same gender is on + swapping_options=InswappperOptions( + face_restorer_name="CodeFormer", + upscaler_name="LDSR", + improved_mask=True, + sharpen=True, + color_corrections=True, + ), ) # Post-processing config @@ -179,3 +192,86 @@ def test_faceswap_inpainting(face_swap_request: FaceSwapRequest) -> None: data = response.json() assert "images" in data assert "infos" in data + + +def test_faceswap_checkpoint_building() -> None: + source_images: List[str] = [ + pil_to_base64("references/man.png"), + pil_to_base64("references/woman.png"), + ] + + response = requests.post( + url=f"{base_url}/faceswaplab/build", + json=source_images, + headers={"Content-Type": "application/json; charset=utf-8"}, + ) + + assert response.status_code == 200 + + with tempfile.NamedTemporaryFile(delete=True) as temp_file: + base64_to_safetensors(response.json(), output_path=temp_file.name) + with safetensors.safe_open(temp_file.name, framework="pt") as f: + assert "age" in f.keys() + assert "gender" in f.keys() + assert "embedding" in f.keys() + + +def test_faceswap_checkpoint_building_and_using() -> None: + source_images: List[str] = [ + pil_to_base64("references/man.png"), + ] + + response = requests.post( + url=f"{base_url}/faceswaplab/build", + json=source_images, + headers={"Content-Type": "application/json; charset=utf-8"}, + ) + + assert response.status_code == 200 + + with tempfile.NamedTemporaryFile(delete=True) as temp_file: + base64_to_safetensors(response.json(), output_path=temp_file.name) + with safetensors.safe_open(temp_file.name, framework="pt") as f: + assert "age" in f.keys() + assert "gender" in f.keys() + assert "embedding" in f.keys() + + # First face unit : + unit1 = FaceSwapUnit( + source_face=safetensors_to_base64( + temp_file.name + ), # convert the checkpoint to base64 + faces_index=(0,), # Replace first face + swapping_options=InswappperOptions( + face_restorer_name="CodeFormer", + upscaler_name="LDSR", + improved_mask=True, + sharpen=True, + color_corrections=True, + ), + ) + + # Prepare the request + request = FaceSwapRequest( + image=pil_to_base64("tests/test_image.png"), units=[unit1] + ) + + # Face Swap + response = requests.post( + url=f"{base_url}/faceswaplab/swap_face", + data=request.json(), + headers={"Content-Type": "application/json; charset=utf-8"}, + ) + assert response.status_code == 200 + fsr = FaceSwapResponse.parse_obj(response.json()) + data = response.json() + assert "images" in data + assert "infos" in data + + # First face is the man + assert ( + compare_faces( + fsr.pil_images[0], Image.open("references/man.png"), base_url=base_url + ) + > 0.5 + ) From be1cd15432a2abac3bf5d75a883ed95c0e3f7ce0 Mon Sep 17 00:00:00 2001 From: Tran Xen <137925069+glucauze@users.noreply.github.com> Date: Fri, 4 Aug 2023 00:19:04 +0200 Subject: [PATCH 6/7] update docs --- CHANGELOG.md | 20 ++++ docs/assets/images/doc_mi.png | Bin 114356 -> 279887 bytes docs/documentation.markdown | 92 +++++++++--------- install.py | 32 +----- scripts/configure.py | 79 +++++++++++++++ scripts/faceswaplab.py | 3 +- scripts/faceswaplab_globals.py | 3 + scripts/faceswaplab_swapping/swapper.py | 32 +++--- .../upscaled_inswapper.py | 2 +- 9 files changed, 174 insertions(+), 89 deletions(-) create mode 100644 scripts/configure.py diff --git a/CHANGELOG.md b/CHANGELOG.md index f1a4dd2..c7ec8ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,23 @@ +# 1.2.0 : + +This version changes quite a few things. + ++ The upscaled inswapper options are now moved to each face unit. This makes it possible to fine-tune the settings for each face. + ++ Upscaled inswapper configuration in sd now concerns default values in each unit's interface. + ++ Pre- and post-inpainting is now possible for each face. Here too, default options are set in the main sd settings. + ++ Codeformer is no longer the default in post-processing. Don't be surprised if you get bad results by default. You can set it to default in the application's global settings + +Bug fixes : + ++ The problem of saving the grid should be solved. ++ The downscaling problem for inpainting should be solved. ++ Change model download logic and add checksum. This should prevent some bugs. + +In terms of the API, it is now possible to create a remote checkpoint and use it in units. See the example in client_api or the tests in the tests directory. + # 1.1.2 : + Switch face checkpoint format from pkl to safetensors diff --git a/docs/assets/images/doc_mi.png b/docs/assets/images/doc_mi.png index c76cfb0478bc56c0554cf9d107c160de639fae07..ec773004222ecac13071cb0a181da934f7beef47 100644 GIT binary patch literal 279887 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

nO!xN8t}xQ1`cU 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

  • n>0!Lpwi34xQ)4 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

    @3=hS8)@-J6&;MA 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 literal 114356 zcmeFZRahKd)Gio^kc8kC+}(l)cXt|xh6H!FMgs)5;O_438iF)#jazVs&^V1ufB%_Z z@}0RkH}lNJ@YDr#)vn&PYpu1{`>uBprlKT`@}A)Rix)3YWMw4OUc7h-dhz1b+qZAv zpVZJ}3cq+k_Ci)dRNceiIPm-@THnxzHeyG6Z zEA$r#e;scrUctx6i02Xfdkh);#3Y)?i&uXgWN$GX!qKToR=5IH0`nODHRxyh3kici zc770&e~k*o_y$HcLJ2?o_TugTJYLx&qJw_6KdO5DHLDl?WKu6ESVOt!%3l8cr05;* zM7Cd_T}z*c{ynpRj|ib1WOF$ssDFLIH<3RyFJkdJmPs3t{`KTW|2(;NU>@K9`wzkS zRw4{DHI7!^O2d=|*d-^o9rckrg|ESSXUohz27}Y-@>MyB)k*)!a#O)vWt!Ti#Jhv3 zE!qZ)^Y;Y8jtr0YS0hW(i#zwmA#PJm#O<<&cJiLk-+Whx{6CVIfR-aCLZ_wrr9`t8 zs)=P9r82xuc)97#cIn<#T=V?Ayi;GAyC4;o;`bMOXk#h7F~O*$#>q}w zC#p7&(~td;7^`_m#JrvX!wJ>b+2E069v&{6P2hf~*G-m?_pQa$OWW2G*O4MllRq!0 z!&&q@6iNX_WIXdi5ceLkr54L{=9tSXK?KEZTixz}-ViitkkeklaqIhZ9MGKpdLcm1 zYQE_8tmR~eSkMPq#^f>DnB07e(}(`9-B6_eX)f^JZ?i6Giy?qN5qIP?Zt z<5}&0;IqnNMowhVn>`-8?)b9TE6OsduwXV!C9OSV|$iVEx4pUP96XE`Y`yDGzG)cnxqbj9a-yb{P_ z*jhA3`L*}eHg8{|94@O|9$7Mrq2x;>ltTOUF4Z`yFpE(cWd`+6!kyk%;bvo5%2>1$ zDmPUIwLh})XYGAFUGuv-+X0)~`1_AAv_t#$ zrs`s1{+sFjS}c0oGsF^$MAjiw~sn}@Q3cmF;?>%%Qh%zazg}m zx9sCa!#mguEYw_HZn!c4s|YfMoRz|Q*1P>?##dnp`?|Fz zB(`g9nV#2f8aEMOM*Wf(t(V8rBcH1a9xBF;w5FG?2ovf4S=zB|{wTMzMP*v0j3P)W zU^*_SzQnPfTlYo{1JwQeQ1nzKzJGfTQ18;GhdQ_yT5%DUz+B>y+RJd6QewiBN^&0S zA?NV7%lTc$Dvml&@uoFN-!Swdu_LcfrXWQ&oPg`SV3%LidmLu@y>UYqg&0Yef4R2V zJDb&pv_=Kr!1=JB@*kAb3UEM}FLnlFNS8>XYeh=63!7p>w#VWl+|Cw6WC11x^Y&|M z-9jvojF;{v;JEpa^umWEdSlPB`I?|>-b!6gRm}#1M#9qWu*t*qW?H@Xj5E?rkswrJ zMGmtuK)39tlq6;X#v4%#7oO_O+yjnXwFV2-LwW-47&D$DE7oS~(3uWRH*$d>$ zSEQt)Qo%@QA!?`I{n|v=IZXPCOIK-D*&65`pTSd^bO*Q)9z8gv+;?{UHM%gq&qC2UyMl&Ml%O+GHq3^*q8YaneX z;=ppG+F$Xx=lR`e3SSlh#|Zf7Jt)wL<)+d z!$v|mGN0eh=89>JR|tj@Yt}-`vu!}U2tu>_1V{C6uVsoV?jVAgLaeSr6<;19)3+J}3R!*Qp0Jgh?vzv{{-<%1nH=CQ3A33^JD`qgg?7V{3 zwTwBC|DAh$TgM8;V`Tw;c9xJ_Po|RMVM9Og;!48-B~OqRA8_nVZkIlPS0@k(p_!wN z0uyr9pmCLGrT2>ok)EbiJ$k9eOI^_cnjVA@%fa>GILrkB`TI0CqK_qFcXbbnExm^m z9L0(`?q}=eBD9-%^yX*V90(D~6**yB(rV{wI2xZmzI&qZSLoAqixnOuD>c0s*yhVg zmW|~x-Lx3a7LMW0E1;J*=xpP%+;(uM4&e0Hlpx~^ao}cvZtJ!q9Hl9gSE;QJ zf=V~;1nv&T9IICOy+lGYm0v+(Fl^!^7IKPQ>$u8uE=HxFqDgAmn=n*~KGxxt+Y>?M zV;5s&IGU^aImNWB+Hvbh4=Q6~kO`GF&YvmdlO&hSP!*8ZaJHTI82K%6ln_8mwAETJP8sjR1(5_)^y*Bw%b99y z_CfU|cKA`1N#j=tYF+?S8&$*Jlre2$XuIP@)4ifl7}=&Q1%LRDG%ha$#Vw1BG;Dr1 zrnX-{W!#Qe#JP?*HT{y#}pgL+s)fh_QwKPF>M!Gf;6jFMe5C!pfu3F zI+|>CI>Ro`PQM%ff#~exu@DUjgCYfd?;g2Kp^)%PUe5xg*=jv`9U61!9+~gsy`qzu z>IFH-asGIBIysHUT7uWvL?g0q6{1cSAAO?7mj839J~VCA%TXl7U!U|*y-~`?6;%as znbUgu+iQ16YUn7i+jNV8KGVKx*!N{8*8fN1;KoozL+-}X+BoP13RbKe#NRcgs2|Oy(y=r_T>GQ9>B!CBw zPkygHl?eVFBSg?C(JLej(5?B^k^asxU%c{0{{|K>{ug3{V=JQDLc<;~Q ziF%d`M*r)ZM0ywymFTDU?qKPw9EO5^Mzc{r4>q+Ov1$ru@aH;yL-tD;|9Vlc)DV?Y zp$Sj0?Vp)n@J;%sx#Pbuy^AZzX?NmA``^|9@e@L^K!4d|r}wqT3l^guI^BU|(7Oyo zDZL!*e;LvM9C+(2@RLEAUImT(%ak4xUr1yH-ID*GpZm5dkp=sW0BJMjAWg&RIK3esNq6AjmB;mHWr$^`ahtqU zt+*&Wu}tOR)%n3{yL*HCjUAucWhiws-({K=mzCO-QNPc2tLco?Qmb*h_%Owk#z+#Q zG6=ep|LJS*bRg`;@^NYQ^6~%>vTbikbMJEmYd*W&+(G8^_(Gb==h!Y4@|$Da{Kw zXx+Y=8%eU#^HF|y^{&LanWP~)X!z<#i(cc9Q@z^vWtxyH!)lA~*x}yY4hjV{j#gRp zVs{*xG?vV2xW7Da@0;3qz1T0Gly|&XKXaJKc(64Xquy%8C6~rY4{AZn%NF+IEBKIP zl7|7RH&ZC)Z?;$c{uYBCusf>1R@UG$MZxEKSU?@a<{9M-{=w09Fg^7&;*MWv$WNUlL-u?_~Jj;^cP`X?f=Xi+;o&c(bs zwHbx{?j=T&nHz8MqgzxY3^x11EPGpOqru}}NQ{P%e?C8745D3mU4CQ(+x|f(;I}HM zQ+b_GfC0MqDgT;JgU#&elE(QpqZ$s7bU6tG`euw`=PRA1;g&Sp->gV~OhyV&!vD>%m9qO`8bvp&2u@uww z#S<2H)6~aOcM^JiB~y79yW(7O>D-xO9&wTbyHSJ*uUQn+8q{m$G{UiHSvrlH2cihM zYp5^E77zQQ@M7+--3u|q1rZZQir8Yc+H81-6Zv^SZD@1XvAs4r5t!8Mf}Xc3v#_Vm z_9ahwQU=WqD#>u7Fp|2^#C2mQLu*JuDGztP^oL^U7?S(ng|*utJdnf*zgrQ{3Z52| z;XqR7rj4kQ=)(URY%~ll-$EPz9hLs7R7Qcrs8(@Gqtn^%b}5x zh$>)buOF+pPQ7VyVn?X&(N)rWTqX&f`n@k~n?tyX>ooV_SSSvJ1>@T%i;XipKEtOs zX_%k`4wD>(RQ8#Jnc@YXKY|+7IuU(KoK7jl4AOm}7^UWCU6;30luLD{SiBdT{Dc<^ zqkDI8)XGw0x=lqmHmx0gd)(CWu>prXHVXN{X!$($285L%p+7uP2pGP8GEUnXPuE49 zOQ2S6QONq7HJntPqfc8HBLI3xf$ok;2SwoI*BVPr0iN79sbov6Z%CM0Xr`QnoKslD zrA`g)59Y@75-3dHAC4jpuG*4yn$Pzec7JFuBfteI**v=JDMoA^+GK@xsF@CzH0jh? zko!E|C-w#*%Xi*iYgHA&!XRdP@bvBuh@u-{f3_NB%3q9}&1@n|8eQi1hOVB!6H zVj516M|2KzI?uHKBdh~herNm8GIe=5&7dH_i5AJ86-XBE~cHwYAX(>_J( zw)jCtRw64DbE8n!{cJ@Q+2S!Fa^lqWsH#G>ik75U;wXcpykOmKLvaIrg@7s-?s6o{nvxK`UTqbPezWOPH)S>ZO19brx1 zM1#wuE@S%{oGO3;N@UP7LryK{+oO{m?+V)|60pdbb4q5{U^s*n5~AD?_0DyfQ<=h< za^$g8t{G{pRBHgn1LmzMj{T2)8h|Ue$q-g7kI9epIWZPOBoqR!B9hg%lEEgcndr4H zA8~8VO7&-4J2j-SGlYXjF`fU~$^%Fc+QU0KTAkHkN-Vl^bsW#zL*4sTTz9uOqQ z71<>71sx=h%W8tx3R~g}ZIl@I4niePbJ`tN#Ai1%Vw7ZRGLtH_wpqlo&eGP=_q^6L zI-X@bV@XL{ry>ipdq0#k1+sbF>UmcuYEWy`Pm^rW3EJq+iY5}m{_WWs+JS9js@L+x zzsaU9H3x$%43oMDj;$RWlD2K$g^REm_ZNI+dYe^GhCTw%8nP{?0`7zkxtvBl+}0oD zyIq+wj1Ks{_sQC6t2n@-64yckKZ{^lf`a1pZE#yHn9Q>;9l`x17*+y2VBFT4sI(U&wW z^zx0BPUdIdj7m7A-H8bVkrqe^0+_sEsnCEd* zozp(qKHEI}?78yF?Ob1u_U>-l?r1@9QH4s|*)}bX*++5V@H(1#Jp`3Fhoe}Tk=zy~l)$1-=q=aP2{w$!2P0O4DLM)D+Rc871ufnKVkfAoiWrkw&hhK$ zAnUFMEOpDiniCu4(aP#*aJyn~-5o2Yo{-Jt zohg7Pj3v$u1hKT{FZ`bG`o(SoW9SM7B-ZBb4J|i1TKQx$EkM*`$Psq$v1lTl`s2?Ai5I%(nHb)Mu=;=MbNcM~pl!P?Q_sV93s0&hX2&vDQE#T6 ze4h2SsEsUywRkGQ<=Um}J7%$)<5jNrdxL!LCq??$D6NkNTB_sM2ko_Pt_Qi}4F~N{ zydPtlk0UdOX7s6i`ivJGmTK%W>$I)nG90nkJ}1Lcd>J(Lne3>+V~xVp3JEfqj*vzp z{IcrW9>%tL0!$Fj0uWG9xB31KcGJyK;54o@j$jqA0xs$cK_j&|waGqBn`^KH|HuW8 z`Mhlxvd`P{Tn~X%)-zL7o0PI+3z~h<#qXh*y*FQ%So<$@7flIY)@IiW-6m|oy&jU& z1SU(&!}V&s9dMS0^-z4yJ1=+p4SSDFjcmcU7`++`E|*I1yhPw9Tk3V5srG!tL* z?~ccj7=U%Ji1~e|^<0!hapNQ-B%lcmG1)w>12(90bxN&AKD#k&Fq*sm!ATSy=yaj- zgq@wOC5@lQ-Br34gB5&!JL)Pp7@#-?ttz>@JDYfIt<%~gy*QI0I$elGgY_ON!=U+O zI4-NGwPy7;UF>|Sw2K>~!p{%xpz^Mk9$68*+R@Q%`!XL>p|rQ(pkG~#5xBg6P0o2K z!bxCa?D=-C<1Sji5qshBfiI1cRdD+ZDMjDpH{z7ojVt|EUECW6l_q5i&9; zw-dzakqT%6UkCe1L(y}w ze766p!}1JEbP4DXLVpTV)%Zm0xTnyM!5h_Rxj&hEOJonY`s#6);)56+w^$`EjWfkT z{@h&4w@d~7{8=qH5+Bn1E@*-jw<0@H5+^&f#;bVn<$smbz0n;)!6Qjr98vg!k?=CL zocVYbtria&j)&wpB&@xt08*+pP1fv7MXLV%w8dYk+nFU5MN-_C`u3No-6Or>+RF2D zK@UCwnp9Ij|7=yR9a8nDwcl2c8&*Rw;(pFhqwxvF zFPNN3@0Y=!`sVt#u|3QP^g0yKf)1ln2JMoP`|rKRxGF~YNfxnjRGt?73>pwx+HHYi z?=1N^5^ZhTZCahMc?`U9G&H`qU1PnMTE0ww-%Gg@GxR8_FLQIUTFJCobZ8R+j=&Wp@H6@q z#iR68S11sUdw7;jz z(N5OuL&h_B3sq!lN{D!!)Wo00zhoN-c4WqXIIU3e`!Bo>!}BkP}H5QBcfhfdE&zMf{E@a-XslS69tTqi}(huhL$!+PaX8dfuHyopSJ z#jl_xe#-7L@oB0s%kc{O1WrpetNB{Slaglp*{y=20VtR9|kg~BcVvE-q1qQ|UVtyXh z(%Q|bd|KZ*KQ|ja<$r3tIE?eRIwS)m$66rR>_at}W}kd99SJOCz>{N78xluAB~}X02zNrLQ^#jjx9LIo(#M_&krl&rUR{Z|{s} z#&cKcZRD>43dh8F>&yXL)3wI5mBZ^q@!#0p@Q+}-xV%MQQp(#;J9lw$G)2*h@a8M^ zBBF_S%lc&Dxqi`r(K_eX8@o)p@9|hsB>Yo{gSTdmwu)xH)D2AZfrdN4k}tmL12Xc% z6@F2zT^!E$R0dcqIq|g0%TSLK!QFxG9xCYNJl4)gGR^#xPl?63)8*a-slBzi^Hy!X zWLEy%2weXq2yHYY;e_b8uFnU&hN^aYHkODFo^~D1H?198$2R-GSkn0YVu!meVtfB7 zlr!kGVXk(#E}NvXWC|-W>$*4G2f1yA{e~0GO>=lRcWemwVEKeHnR)wLY_EYj?%5(Z z50aNYKMq)VMgL(<$Y<$Qo9`pdKO}vOwb}9(Jb|xz88Ue)2(uXh53~;_(97EDa`P}i zy)U{>)@ozlph6pD|Irdf27}U?x5L2cJmv&&nq!0kvFOk=I;_$-S>tuXZzE$L!+Nl6 z76YZv9dtH;_R&48wGD<2IuriUKIl*meM^T2E3$`45?5e?o_bbSw2ujC0+CR1Vn~G+ zsG$D{%G~XN*Us{5*Of<>B-O4DzvA|?L9ikq*G<|H|5Tn-;aIvRz+a5Ia$M7zfBh^iqBU8i@Ejp;N}EaX>ly^npaYs_T`E?Wc44WKP6jV5@Bp_c29kVdJ2R=Q8N!D^{byJi_nwPAN* zfTW!2k>*&b!D<>dhtvl?zYU7Uy)Nn-Ik;s~wzgjtN8-=SoBMnG#qw^VbK=E52BXTWqfuF7Yjih6T2kZ83ugE54qfpvy1{`A$yd@_0ww% zW4qjs>Tp?fdEZqZ53Hd*HhqGat#?1?0GD|tJK+32oDQH8+Vpa_{rXiPbv<_+J9<6W z{cMfxqH&werQk5R&30?LK6^@t>Q0{YY_5^AKMX4!uA7ut)xV$2dtFawn+Cbe!n5mM zP%~`s0C`?qS5660e?V%x&ei2Ao3cJd8;m9?rg-p8b)M&>hPvR51rNl|TF*^=ugzEY z@&tjVLRGiu;3f#y8jc}hp_o6`T89q4EngG>K_PkWj3(e8kYX(!-wEqjXBqRQny<*n zWnZl_X3k)|7ueHoug5;mW-eFC54vHqslD<|Zi-`UM|r-#lE0$1tQKf>o|>-~FpJKX zK*nPRn6j(88=pn}dA!^~mi&SiQl`PksEoQ=JExtU*fi%iPpgn|Sjk8$8wZwNK3-`| zR$v>7R6AR%a=G1Sv+ItA z)QA#0xuKSF>v&$1*nxucD=pn&d*y{AT2pnVjI&qf zN+fyx@>-KE=kc@M^HsWX7k9vw7Ern8Jm=}kT&RHgDPf&4FwaBP^UrUDt6erAN3}M4 zaw-8J7|peqPL&eSehr)@sx_ZC(@3rY^4))oC>+(QUd;)x!5ID_M4VWu5<~#0HlO{d zUup#Ezk>^cR+@zYXuI9UgLd)8Sxj#2Zl^tuKT|cU7jt$I#81-(?%N>iE4rd?7lNxu zYQ5jz9gtPCsTC@T&J;~tlS7x9ZDoVrUJxBkb(o2_Uh~)ZHp!~Tv9qAa3&*?X ze&-_lXVE2JT9*38BW|^`w1PY5q8ZDlGiJS})QrI$T^;pgR=uTkl@hq_?xqzLn_rV@ zd@FME`uER#KccJMk~dMh7UiaP4>N`lDOO0%)|`OH$;HLR{f|Zm-o@>^qv^CfV=3IR zy-*C=17Qu&W9|_m-HEZ4{v;k~V9tH_-ao3d z?b?BmqDddT$HVRu8mLKcsahcg%Fb)GCoyVu(9Q9RLT1}#PA3etZ${NNhFYwc;_-Kupxt15rcL!x_I%bM5CBo(Bn3=ulj+@z2Ph6K#4zGychHaC4FYq z>t@LIi?G~BVWCE=W!0T_+Y!Dt&;{<5JFx;BVijXE#r0*%KXt{7@LG+&Y6KfJ8j<5L ztBNu|amsej4Bs*6ypVr1siohPGtA+#(oR;&7AiIvxIWRlplD*iVN^BXS6MZRFb`2$ zo$Xb`McV9Qh;Uprks(|Ca-;!MTJ`w4S>g81ZnaIES+}tmjZ~N+Dc(br;xuzJJL8{P zL7gkVa%irMj+XW(`^CCIlW%2O&D-18-0vTOyBINl#@~MX)T^({AIk$h$cR845V6>OBi-5D3x^Pz9?@E(7Z8FW3Q0KC9 zquvv6Ff>yP$?k8ytbO!qqG#*)GNnd+DO8*C)El7>cvJ_>yOt+U$>F}PTd?e5X@?gZ z%z~F^$LnphJv>`V-Db}y=R!N+^psk5mz~_ULfWU`r$2ecpmMje9n)yTShCR|riM zIZd07f%|b?P*jV(Hq>qi)zr?{J)P59QFxKsci=MYGLDCd&&^4-pUr$IeHeLKHoiy| zPBvNe*9CEUU3>4KQum7JZ^sY|%Th#2wCrx9ykGnCjZ#|O0EC~d0Y`%?v zPCcBdj6a}4wXMr02)yQ9@d>R70SZhQpnNIM$rn6mx^*V4!**o$PB;uHF=>r9gAq8a z1{Hf+gbC1_21@|os3{ZjvE8$u0{VwY5($-96ZtJ*%U3y>B_UXc)yyx=*yL=Oiu;;E?CVAwn?{?pP^Ue{BJOLZ)DeZo7;T`* zsO@SM2enc{=;2&d>9CyzlcvwNAkoZw#RKRLqshoeCLh^*sBP9S&eOD_VXY+C3Pg6R z#5do}<@)$_*?2_Vxp6QdHmK;nt+X+~=KBz6Xv*8bX)fb+Lg3&;t3WmwpUy` zBY@rHX^)zG-t0FB5N+7uaUQo970&6QBD`y$PHe~q_j%{O6#*8)>va#7BsTfD(5~8! zgXPePJz$qplxLeuQFsTwN`bacV)7GFp&soRk&O*JcqylP8d8xOTXQ-;PD1`8c6Dcc zG9TjLV%d-8D%v&LFfJnn6F^bB>sQ-uinMEurm=nT&T3+RC4eK~dex~Lkr}sZ0)Cg& zA-Fne6yr2s5)$0HpD==_q?VgkNKX_Y2e3ANbd9xNn;*|yVnpkcjW15s6@m@fcj1ES zdT=&yXcRuSxg4;gkg#Woa@n$%JRd(gtC7wLC*lV4^;G4~I6X1xO-|>OYlnZ;RT$bI@+)Q4xI%`!M zlBLoeMRfYp_FR-IHU?Z_$I?EEZmG4KE~8ql=cX@7&I=why&Nx5 z-LgEnk2-W@|AK0+N*|zw8<}Qe=k%#zGVv#caj=Vew}GwPuQ{qk?H@uk?eSbzTz@pZ zogdYmYqf<;dXp59b!^U-T9XNCMdFAl@J0y0;}9(aIsLOVY~iSBI?O< zigz-nDd)Ud9X@8fyQJwkgU};IUnKmpCbroSs)-r%ar&b+-)Z>vG^|x-gVW~v7=RgW zq?2fJk}9CHVil)d(Z^nBKLn2+5}!;q+!%AqW}9NeRl>Q#T6`Fm6kxdtnDFg? zg$j~9;W^C;?WDH)M(F`vz?p_G2@*=@QQPC7%5sV^g}=q94z$hnsKoVM{GM#L^+G{V zvvYb{cXFkQhHaLt)m#BN_0G+DRHyoA6buC2Ho{;}a@uB*P$al0!eM37ZL%09WGbY$ zo>SOnTSx@DGnDQvF+g2ju7$qEi7*vx(tg^gosVlBU1`zEWUfD1ZY=mC@Z4mvXke>G zfCVzT!ahp3t26tM1iO^XDupVhvuBw!8!(;4G4aNmmsF?gGJ=C`@UP1zuZY;(SjOQF zLd=g#%-@l$-@3j(K>De1SLUaIaMG@=)dL%M*FjT!7kDN!f2X3|qo!c&2hjE&pYMXY zo5yM?Tq%=pi!qjVFM{=A7YfBG*EmmN&6GCxu%%8vjVp-B7WPWe_q?R8-9M@(bvZKG zSI9cOEpEqUYrdXo_C2VYN@7YgZXgu`K^3Byg9mD63bl94U^=xps0_l@v4m?}c@(O(8PV)|YG zY?WHS6Qo%gZP@TncA+ZVZ?OiV^1N=I^!6nqKgx#jM7@o*zT#JIu$U@AI{TzirJluY zzg9I~v>z_rDxJ03=~UPOF)Ebiq==ad+BxK+mMK#&6UpRn+~F?$g&g~*!RLt2YS=EGVos5b zdzP}YcKaZl0916m7KR+%LMd}+^3%Q&d^ASUWD=I=vJZ9)A3ZHz)MgqAkh|Bma4U2< zm|fR9AG-pK^+V$(QnKt9jT5o(+Zw6u*-~JjZnI6<+G~sm%3!qI`RX;g=ESCBrM32K!XfP{ z!++pS!XQN3`m~e%vg*i~nSTK3W&sEY@phG?$(aF5DKu zvQjZY1XZbZyBeCl;uOj=XC}vgqNtUZV8^W&OWcWUYTA_s?FM=)%;|FuD&1UG&g+mn zcKC(v4>LgJR6SU#ZvKfWkD2kK3Wp{>fw&ZO_j}<*roBYgX$#p&z8)UH`NxwdpqX@g zG&Sl?>vg`sU4+$gKV~d#z~rP?PPawP;6m<%0(ZqB6oZ6!@UtmYo6qO40-D5eb-F(h z*yUqL-J^N$VhL%Rn;NpCQ0^h&ZAo7}IXv%kkUiNp8_NjOZ94c;qjaAnU_4LY`SnUN zs#a9KUKG$45x@aos69*2YUmHSmz~pSM46uuClLP82p^`2X ze*eZqVN{DFd3Yid%M)J7<20Z+)7s~Ga{}x38$lh@b(@Ww(E5%-7+qAaf)SBJ1&CC1 zRa*}g7<2Adl<0kBK9rT6CmkUtje61q1_H)|8+Rq!wNLwq6<1{WTy64kn~Ydk4H`aa zRGzP=3Jp!@3(qFV(u`UsPpGt`0zvLw{!Y2++^zzZ#`BXySf=w`IZm^U$za9-(@Y`P zfJ4Tlq$&OMF#bQe;?fJYZ7et}x|%xKrXi)CiNiuGT(0ooEJU^8Z#t;)J>R#jhrjw{ zA-p`S%CgM+#?G*)?YNE6oQUhJk~&+ZW>+Drc0x;L`Fd-NwALkYw`M6gWq(fbKk{I> zb98WOmIp`aS=(Tss)y_Mt~}Rk zV4ot~p`>e_Rd?V#m%&ZvOoQU$``JX-nUC?e=bQ9Gm|Z_K z<>+5oSebAWW|vhrW00$c5|2<283lt9Eea-a^sg?UCQ%&L1sV& z-;rn9tkW3Qr~92}c|VQeOT(-7>V`bCe*I8DgM+A0)uhZaYh+jl?ic~!4r-e&!Fsrm#Wm$5zpCpcZgNgigF5~WS!e}Von1$d5h>vC}bTFPIa7Ppi@4SM0 zQ1f=GE)4E~MfbS_appE3YF)Z6qQEo6cm+O}%%HYlgw>``)KE<7Nab=Z7S%bR;&+g| zWEKtD>Wv8Z0N0R#aflGdVhx}BeF;Gb+VQ%QWJDss+5m7C{Ul%^N2v|%3U3rnkY(GDsR3|#fo7q6 zat?;~XMJ2Iyj##a%swronjMv@Qhzeah5T!x|MzJa#K;=1MN{Rb2V5BWCJZfnZLHl??ag{IcJuY>N~W@CHI- z*iC4o>qlmtwzxhYZf;oEdJAaAM0j@0ngsdo4@U3QS|^fv4GFKFdZ8Nc=`uzsg&)6a zoUdQv>&ri}#t?j&D6n!eTXA!JmQ(hJ9!wjP&^?*=gMrgxYc8L`=F8iJCcA6Yiuj6+ zI)ZM%%6^u5rzWX23|Y(+aqo*A^hO(rhle})^V#eLg)8#K4T2%UcbitAaCb1g^{xUD zpyem}pIU%zne6zt0K(hJt_(|z5b~{VD$W?>)imF*oY)6su zi}|EUK0ANt!T{C%SZT535cIxHalf}xWfU@}_vuH+TJ_E0cU$bGksRKZ;@#h+Jk@kc zsk= zJ|TaI8iJ$tgLy%>c=24wT_IHtKH2D93S`$^u2&KD>VIdYnG`zJR z8*EDY4P5?Om)$YcxZjCvcrB;e0(CvKHlp<mgpTU4ryj*}_&6`r9cYb4;n~eHOd` zbGwyfz6PtQ1ellV_3>@hF1@33+CVxt+y?VI?jkIKnJ(*Gi{D^FTbUW;Nd^3F``5@D zS;3XHnTxIucM*6Gf#&GKHOrAi#qO`wrATBvN@W^Gmz6f6ED&8O}QQE|_ zxX*kg%kTb#h(gSrMk$g+jfSerVLAMP8fqfm2N7VIOX>hQTX&{x-wve2ikFJ!?=sZH zAloO&jE2CQU_S~R=KbG@H-2oL1-N8wOqt?os1PRL{OEv=1mfTf4)y=J;$2)C(?~G^ zY02TwO3`IZIYg?%pe3Zmj1kedoGFqm9N^MvPUVZIJz_RK^DnBpCgQ*3aWNHtg7-vV zv-;|v#J+~dnq01L_G?-?-N#GyT9q&RZ@1Vy$gYS#$q-^sF6YgSKi9zZ4YHa6-!4!0 z%2x0s)n%lUi7npIu)&)!(|EnI$^v{pI>Gnu`YhS)LO5bBr3=Tb>2=<>a4qVC^f2EI z`yXzIBLTWPK#=jN07-d^!v-BIgwrA44M~q1B}8GO&mP*6I`I}R!3Lifb({{?f~?fb z``S;(tsIV48u5fLx`V=3iV>L{CR2-v&Yf>d*f{Mj-wKf#_I*7~tLsVc-4oybebjWq zpLnF@fxAKh-TpALwyM|IzJ|GY+!w|HnJr9ye`OU}+p-((RT28?(FFcHXIG(&wsj`5 zpA)WW2{`QX+}Kb0u{Tc#S+w<8&+ z@E!A5e7%=Ben{YH((Wa0G&Hi&hCG3;F>RGye#D|=jHM2C^7AGC=ix8NJK>CWGaG%rQWVbNU@XQcCJ(Ajt;WME z2*sjyb{zUr9XN46#ONxE&j(leI1^4xuB=}>3TFzq2FJWks-#fn_D>>27xYn+_k|1==bO5m?fp68Dk z@X>(~t#pe=)u-{EU51HYs#AD93E!qbG;Vlb3#r7dTw`IJ4qHfNNA+0*`-sY5m&HpmBuxrk{7#5#S%nA zPCX*-uG}NqcP6JeBg#Hc*9lYy%WyzlWW{xKfBUhmw9BsQS#wu})aSmXWIx(^&Q66e z#K?aZt%KrGW4uw$1>OjBcJZ*7%w1_H3U9Ml*)-^~PGa@5!!gySxR+HoujNd)qLshk z=6;eP85rPMWgF0yH&8%rz@Tmh5;Nl{%F zaM4mRf?I#3H-2FiXVWpHiWg=@2f8}tP?2n&^RvI4Cu8?ZBX~CXrRAIKODV0d&=?2@ z6IG;E6bMH#XxC00j-uD*#bNGcIRQqZ*mzFoyBIgB z&e>@*XUk0w%UTo@Ngo`Qd&ob9(H8l@P^~72!@sP7?P%cbQK}pN7j17HRaM(>4GW^A zbSemJN@+wI1f;t`x&>*ZJEXh2K~h2*r6i;Tl|3u1cMg`fmnu&PqU>{yZ)8f z<=;qz=ylSO`{Egz9ObJ*KcuR8VwZHjfM^9Ciz3IA-o59HA#nc?Y8EgM&>rY~Hem_b zqp>fpGKp)R&g466trBScg+Mvccd%Mg6Wvad&M%yi8;qEB*|GY%%|&WOhU@S!K|6XS ztBU$mbtD2HOJ81HSEDKU{~5kmIrSXQ4Udr<}P-asPV|HZMp zqm;K|0Ab}BoH8%=f1|R1zg~s{QJq(`So43;qF~~a1w=q6y1YmG6#1Ww{3A-a7P$u* zZ0V-Z{TFfT?mv6?0cXnd9$w`CVX$!z?gj`r*L7E-nf_sm{i7y6g#!{!e(w-5-+#Wj z6MuSp0W+UNrh{&R|B+&EkYZASPKy7L$rflP30ziC|IZYA0u|~YM%GgF|Hz~+G?Ssc z2M_)``|BPYKN(0dqWr%2|Hvd0$mF%i)3g7PVp1TaJ-lD&O!+@DNdPkWf2o!Uk(H~f zi*byQfPad>+ZZ7&Esg%`&)yQ|7IkE_L>RwoBHY`0jU7Od(w>gyLU&d%t>_5utmK<- z%aiAs2Pd-?e9tKUjM9AI5>+Ne@MQyA6|7W|jL*SLqMzzkQ5mzv8$?N8iA3W@1LyBd%~DK0UnPfJ#;8nqBp6hU$!8j1V|~vC}G)&weg> zl!W_S@+AtvD_$<1K(w*YN6K@q@Xgz?W9vaYpfSNe@c{&wUv*5GzuPaIj;^=O&(976 z>uBHbL;wcG(F2_k!q3Y3ZzdH0dl-n{lG9%MAz4`57j{u9kdjLrARbQWoO<{OGhTok z+HPAhkU96YDCUwOCzK+=__1?M9;+oi@^)1}tW&rc5!Pd$0Ra^bJ1?KtL6Ya5A6)?s zGvkH+^22B`Lq-h9qhK>{@B7G{foKwoZ6aAVSP=QJH~SmIU4M^Ou1U@h|3=DuX*G*B z5nt#jTkFCgRiEJE!4&!V0|iIur-j-G&;_^dB6WnsdN+IBNbWYxol0)F;5f^YKNI;P zee`XMp~>wAu5Dm9g-QGsk)2DFg{m?N0YusQltlE!w zFxNGRUScmlh=d~~Z>>K9n0T#BNF5Q0L7wh6qB_<(Q`O7QIev#U3QH&rL3Nb?>G4$1 z;$;oOY1Mk#@q}>nJ{%&Jc(>gzu#)?IwtS&FXsH^^>p_=M|H%*K2{KQbqlKw7nxkK^ z7@$TX@W2PGJ(nWeKxt&wZ&zqDD%#j@M_lQ+0TjY9>{cx+1{N(0crv{pZ)b`8fhd0~ z-LJwe_5&O0?=4!LAWXvIC?xFg8l4dc%q$aF)K4G4lVScrnh;v)l!}XcwU6bO*>atJ zCIk;>j;zO6mq1tsY_FI_1$^VKt`31NDqMGtgxHRdDdP0fBu^ z%zHk1LIM#O!ePX#x@63B)UO+q$72$y4e`Ht{cRSBHLdUo4bc#}XV;)oZ^MG*?Trkt z&qXLT<0r8(*H5R~Z^^ECFl5r#j|f-(IZhZ?#_dE}8to)6*aVts8u+EL7)B+>FYmAO zRB*DJyZfTp2xgmIa3D;a4o`W;@$4GXeU@y=FvF1j7MSq!29m2UITs=$nufG5DYqk#mY1J zYs~7D7;8mVj0aPKm%2iM!11P!Nh$vbm*urHx5GJcI+qhU^O8{VwlFBZbb%!nFx-WB z3yEY9pQ4g5R!ST}IZ6k{QbRGTB|sOCM2lN<3fEmyte)JaBmltndQ_8l?^a_0a`;^&LW{#Ju=w0rYky=BHSedCpK})llEOdVqk{IBk zAV~3DIv)e>N1y20el*2Hg_@M``yzikw4OdoLH0-R5fCD44Q}j?hA5%r$|8#XjRMQcITQ3On>DJO~oG;NgSdd z?fvrl_0~R0yh zIVCpLWYVJk396KqlFn%FDl-4-XeOlJ9`JE7mzuDNLvDvyx%B;mP1e@gyl(S0NO?MP zbRvZtKCm_7VKWQlRUP|l(WM?nzOIyOI1bF7Z(QXA9m0qR!J z2UM=kWk=8Neqe0X@J@K{k4tFWM67nt{lJKrKLYu3i2*01yarX>v0>{2DdHe3RS;V+ zpqQ#EQ|KK1`Y7?H*>RRyqv7p+nN;4Cg9Bmbz}&o=-I3U#0y(KtP4>68XMunoAhnZ` zJ5u(0DjwDJVt_A>$w_u|%J81?K-#wj2TgYRTwqG35V9iiTp9U5j=mecsnPtgza*Tk}mG<_7i0Ty)B+?9E zKqKDbd6Pf!*)Y1w4k?Aht7vj<2+!pO&7(i_vFoL7)uug?y%`KRHRiKvorW*3$#$4F z$L#KjAQ41Rhdlv;O3|D^xs0gkti_`bEtxNE1eihwQd13(|NQC;SNtehww4Wy#$tmS zy8ft6HQUM6EEY>Z9X=rCp6%>M$J1)o#(2M`iaexH@Lu3*H#vR)0>V=Ic;J)sbF^gq zUH_N<&2vMBnOH&m;w>|j%cb>o6;_UHMwQ*oA?-$76gyM{@tNK`PNej;0tk2aB5zzgqAWpg5zxQG9F zL1f_&C47?2Xm~7L*&Fdq!*_fsoiFx9@4m;eC^xtYQLPxk$7;(blMxK0N@{;S^#1Yg zEQU+D(t?c*Ic(47qbkXl;lI}NMTt@-Y(;-2ouURZr{ox$5Qhe|FQj#xc2-`QO;nR; zH`@EBuoab4KT3Y1b@4@hgE_l9o<@T!lDtUIr}1Im(Rsh7G@7ctnHCCk;Wma@VGM~| zpMFm*2WUKXY3~#Zl;Mq72OZX8f*KS4j2`U$qQECXc8)j)>R^W)wZ`ZaW7G z2%5Op!X4ss;`D0y2wwy7e`*|zmFkEe;?w7br`9T@aem(D3{|7tNy*r`U#K$8X#aQa zehRtM2V1PLkmbraMsy^RMt;=7x?IC~+YL$2G z-j$$L71v$}*jUj*;L8=Rre1oCxvP}>AulU+)iS&TVKw}(=FRShDG>k2EXVVi8L^+i zu_mT|>jIJ~lq@by7fxkz5B1gl>K~ntJ^{ir^`@8<;oW(!!m{W}i>b<3CkV%{9*VEe z#O9VZcN28fQnWQBap|O+E*|Cc@r+gRgoU1H1@LygNiNfEF|L$hVRDqbBaX8_vsH5L5o?v}c5pXyEn;pIRGqvAt zbY{=sat<$NXZXZ1bEey%Zv@V+zb1v%1#FXX#Y0mN>(Qw?QGM5G1q>4gdx5rfmb`4W{}Ipo(7LmC)p?>jF{?0e_E6GP@Zh3 z7-_L$;6PJjaATeX&TtwLPW-)LnR7_FSEiNy)(M|R&-y|*)xM%c3@4U$!~6c}wCDJp z5B`KacL}1}IX_OF;!>N}wmYhS-n-oSrr~5qOHM}9HItQXwI_+3p~igL_bI=tbi3%a z6ZJ1J5q^g-U3x*}Ch%xgqjL^4^r!NEy$qNYluP3ll3J6aadPCs+nP^`-Z={WP#^qv zuoBOFgiBcIu(p0lwM;qUF4Xnos52_qaStUg``N z8q8>s---LOlTtECB?MnHvsQ&}yZk*Lh$?6^JwVA>r6*_=&>hUU{N3$}++AU@_{2@m z#1p7~rj?lu%HHPR%3h|m1-^VjY9)BIEKy3VmT^?cJlW>AsKoiN;)j!6kyt%g?GYK} ztXwOdzIiRZMSUham;M!FwV-3c6|-tJKAG2lP#{YAYfkxX~c?tN8Vk?kOu)Y(ani zhrmc8`q+ktT^)L`es>RU7=f7TpmN{o0NZ9Eg68H%Hp8k2d(YOdD>7rqB_s0()vVkz zKlCRlgE<}xtd`3oSl*i|bn;(S`$ss82P{Ibj%wZP6KumlHwkOl1@l zWq-BC@cu7h&-(qA!m2GLn((}erOocAFOAj3+14H@%Pin&M<;R{qmZt;9)1sfSg}>; zuC~|S6uHJk9A-VnUZa!Z!b7Jb&@hJ(| zjXs8Umf+Zed;$xGD$1U}2cC!P*hjGlhWnMRb+a+NzP)ToguaqeIZweHb1g`wP^o;h zwCxjdawE1lOp5wBD(~pKdO=06)O)Ws2|xsKDlV*aUu z|KK5T-a>*44B?f^G3U-36MPoSxxZ8txzOzVo)kw2(@ahI0Vv_m2*h~Kou6x7Tlx6k zTRUhSQhY{(gzyvqN~;*m z{+sgo+QGsMvb+-}z}rBLJs*0T1MrJ;K{nrciW}s{j-!=D57+WTEM0Oqr~ZX;Qh7u0 zj%j2{x!C9(trnwWQKA_(OOptm8!UPFNDlK%-Y;EtXXe&#m=kjo!3=#G0Cp8m;mc3+ zi>_zsmKe>dHvm7M65rX$LmCCsrP(Bm2Hb_f1Yaxd_ZkVp8xixC3E(L9=3=0FDS8l}0f~|}Q^xGdCd(bd|M+#C50x|7@ z(a#~inWvP&=Y}7dpPy2=8$AL5MtO{FJMV{4PYCP?6&uMxCqnI3vYFvFF74H{|!4tTnq($uAWK@$4NJ-Dvh zRdCF2jT`0`uKdy{n9depgBHot7U+$>5;<2+x>;qnvPu}5DFwpff4PdaD6rvAdKL?i%w4wsm z1>CrxdE2=|8|{v&as~dNrv`uUXxyAY&OGzo?=#ys2Y;r}oC$BiS8ozz zPURJKZriEPp3b;;cx)1tH>=BAtVQ_S67~^*8XRJ>;fLJrI-tW2fPw?)GVU(yHdBIYdaE|hEX=@*EDJiI2`$8XPd$=ngx-zR z3~kW<_+S9qW-a7`CIi9#Un3Rj#w^?_RCVmLAl8}?j0s^nJ;oU!gcbrk4xHv1d#Z>| zuf6)lz;UQgFh(ydS(qKjdE%+b0Itg_r2_W&&L47Jp=E)Ih6Ky-!}~jhklPFc%-g$_ z4z7?z9v7B$T^Gq$iT`i`fYkbs?KLmVnUSmlT%!JA2s(ga%^T31ppue9JgyFi7;Y;I z{0LltK>Z%pM&G*J)WMrg2Vd~=d}IYo*vt8#LlIJ=?=|9W-C+K_t#A_1bu^@Mc%ezW z2mknAc^B$}$*qx0p(R8PZle3=rZ2ZG9N$Gk>0>TpU3u;USi2A)YsD0gdBHH-;vl2> zwBGz-Qof)d>`xYy(2ecyj(3LIHc#&AdP4Y~kD5hWKq~AO_-DXx^4=8lGyL1XdoP1X z0apaudzicCo*Ojr3OOPL7`u&^&8ppScYTGP5|hj9rR(mos$0!R9hw`%UHaBM?#gHG zzUDSgP8irTRP|pU`0|j~^W6V7JL_vs=KK=@3H=+1FAqY`SgD1REA-#okC)c@gVWY6 z+WERFv*#sWc6n6lb_|#B2;dIcvB}`Trw+%aq#Jxw7s>R568Z)9-Un|iv1clZE4F6Q z_mHFRAt%LqW6i(i+(!|~P%nVnhCuHcq|)oaQe1J_an~P|@J0|P2D>GaOZ~MlZsM{;DJj|?a)aMjEo*+r!g9KL>()h-9X?ef>f>I9p zM)1ie$7FTn<#n|gG>a@zppkAgNFmQ7hyBeFVTSe~$=Uxf683frgfPz6zwe7=Op3;w zz~1==iE!UC0H<7j#dhf~@8O^@#G_4W74rCCuc<`{J7sT&FzK{Wo^I_hMBF9@T1o)| zGYG-9Hv=*yd}!k@`+xq#gq83I=W7Gl0E^T1Iw_uDMth45C%Ax??i-X#X^ z%IiLCbZL7U3o<2O1JUcKBf@uKG3@G$6~pkwA)S(h-bjhrhTIW^hZsqEZM;p@&L(u~ zUF8P-egW<-r%zkcwPBUdj0H!n!}3e-C+=<9eD2|ZI%IyWdRtkPm|!Wf^58F4-W4q4 zwb19WY2?DE$C>PID+$^PULs&qN%?DzGpcXfvTgc-7Q*WH(hpXL5ugn{#VNPB{{xdP{gh6K{fGugpVub|B5o z{4x}F=>aZhx>6Wm=|tdzHeTF!FP5f0+6m6n)xyd{0G<(BJcIjwnGUac)AVQ|4z-Rg z7PB?QZMU@H0nhM)Z!S(N1z{QCMp2?S$G)Jc?1t&HBG7a7`}+rsJ*kw>&<_A@zzqvpi0-f3MP8d+j(>^AkDQ0j2Z;fl%gSYVao2pi!BM==Q_u#pk);jmN!(QhJ>tKL$)4I_M} zkV80CZRK-@im!i^wC^(-)^{ww(hwHH5#z0iyeFNZX zwsmP)a>OUK7G_3X8C+KxPp8@%g!SRLjfx2y={M+4ug{U(oNtJOi@9se^cGs13l*E# z2h#a=KSa@sPQ2QCK>a$T(d*qqs^wNAvC=!Yh}Y_s1j( zI>e%u&WRlLP_NL5yM6DK5WupbECzz=aK5j#`d8=Sglw+#Lnh*Zov3R$`mt{bUm20b zP)UVoHK17zP=Dr{=vJFvGXM+9fQ!F3 zZ9nyM_qMLD(9fo)Dd^(0TXrLWbw!p)imHNA$sdRg`F zs?D3}3PJ6cmP1ItazxsJPMq21C$m+$O@7C6kCucb;0Jl zKx++bnK$e_5P|wVdJQ_9WRwn)Y=m|4|)6Sg8EO(83nFW#ZC#~78-m(&i+-v>u zQtjXep$U51Q^(?%{I5hKpGNe=<{PGKBp-)=_Oe)9q4voFb1zm11Fnl88{`uQGtw!3 zC8y_%DWzl_CY#yVaDPzJ=FcKJU>+Um``|EFF!!x1%kU(m;NwgZX;+CMrbslKIez2K zh4qj07Nn}T{SKzhx{yJgk;xmL*M318Cmv$Tg?r&Tag(17IYh%AhXcQX3)4aV#gwzd z_4dEo+(jazxb=?PDH=c0^|T8ub28w7muYyZX5I3|F3%ze7oFC+n4fkfv=T~<3Brrs zu9^l{6jq3cAPHb$HlG$UUZ^h~#|*d0W@?5<#-Lf(Ri^D`ZwI_K+I&2|jznH@(rYx1 zn6sx=<$bmI<+k~ zRQzY&Koy!J|4XsnYq$AYbN&@ylp+@?mSqGZmLwisg4h{~%5m3lfow*NL5)svlK9%T1P5%nnG-iB{i$`sr z4ZEU&NE(flolvD@RMmvg`n9l5pK8DD$qz33-AP2Ik(^IyCP$GBZ!;*W8H{jX3v=ie zc98W)2SH^)T!ZU+s!}qCQ~q_f)nswH(B}j|>Ab9dkKF5_Lsi&jkh>1kJzACW5K&DI&cz8Orp^o$lMx#6WGla88?)Qr&}8v)qX zAGlDI_`UdrMXPMO(x)rzrBkBnP<^_i`O;!UYjj^eQ2uRioM2+z(bm}^!JGx^6LvIi z$DM%L-fz=7_|a;gC1oxRam+~Q9O-|kp)o+L*TQ9CP~nw_ay`ing6 zeM4pU^S@ju1#uQXc1IaCyJY8ij=TUdcpsky60AxslaascP#a6rb?sl@=+ch^f>uq&79X8S44rUaH=p-_d$Ttde zd7ue0-b^huutxFS%-k)EGoPSLV{jo52RGU*w&@Sc(? zHy@d!G1|K^Q$%v$c~#yWOH%o0OSK3yK`rQHHIdVH^JPFJVfa_tm&1^QkVN`G%{r?K zuAgNA<{{l~m#4_Uz-75YR;oUKyR5*=a)0>EoB%u=S!)L!oOf4FKIKAccP!d)C8jBs z*vV3Fyojt=j`a0dsW}a9_f3tg#aj0b3BN5i>e`JH{$5XPftk}zaPw$#w|QB_Yy0h) zZ(^ozf!oWTgHO&mo$i6HsTzsXPf>hf<$7PJ2A zE!NfdZ*_%r4CAwv-4j<2${F(0h+pMi!}guo z-NSUrw4W6GMq)npmEHrwD1Wdr%Jm3jMDOe23f$(m9$BP&qEc)oCOdG#=Tf$_qAslC zi-4>=l$5E^puu4NR-Q{~yvR_qq}zNlCz;ziT0E1gx`m#u+HlnEe646){M4a=_5jG9 z0w0f-zjCu9P^O(I z%jiMG9a50{{-6%-{yCZX+K(|22~9>gNUe0`xSOTQp2hu5e&lnadTC%Zj#x!4iiE`INZP4t)Yil)%S;DxUl z+dk?vO>NA3F%RgTDs3mJ3=usyAGge7wbbafoI7A$`;i>Ur0krNmKlo8^@3KdbajtU z7;d%)YHc1ttjMH9%1^X4W-X90qg(W0Bb~e?IU&7Kl|gwaF~|RBt{Q*Mmovq3dC9l3 zeL@z2Czi_mj}7*IVoi80U}DoQK3m5mCP{DtdsWrN)UENWyoRuATX>yjXP>3ckcGPW z2s6iKmXk<^ofKA!u0tfhNK82E`O7-a#oHx=%bXUnET1E#{Ystl>?YnuIkxrL$t!L( zd@d4j;LM!GY@=)o{I_2aLjhpLs=GcahG0R!nI7(60`+kI+O?)$#j#G&|1hqZlcsrRCvdY z3d53sP1zAkURen5^CW5Gy*QGg8A<16x4){k++`TueaWIGVcIoRoIg0G2zimg4sS>) zq;Y|3F2kT^+wA}%66VM2(xTX$OTwu0#n(Eurn(uW_17eK3qBVEWH-U}+j-JwoRO^$ zJLX>M&F);vMHHdD3pe%H50yYw-oOhNF8APu0Tq7A{k|=>?x=t%6L<&)!Y<00Q!!|N~u-@ z3ek%^v6DaQ$G&rWi#lWe@@_w`@m%;ua`dmh)X0Capz_Gq8c6jjAGnNH!QxtM7yDVx zp2A{?f3kC!+%v2aO~Wp!x&>^B$$79;N)>PM3QCa@&&t*cd0Bc&itJ z`!w8T@LAb2 zUb*W1@3-IoKcI?K6eZWr?3bti4OHQ`eKFJI(*OSqs88h4$)#W6981y zE*!BG23jByLhF}vA7^p#iU+PL>7ztzJCYwNDLNjVieN-q119k0NaJ_HFHyVlTOZ7L zhbvzn*_mtlP!vn!LP+J9h!BPoM8ZV=bmpsNY3nWg#4?aZCDBUg z!=(J#D-6&0IrbhiY*1a&uL_-ggbQyu?IavmsPOsy*^5Sx3sK~T;vfEq56m73!S48G232pYJGL3dM0BqONnXlFSyn}$)!D_ zK3D)8HbMrm?)dr5EO4jHiVd9kxxsIW#BTW}(!=eqDOg!5Qlb5s2d2)AHnGMQ0SK?r z;V2@aAWSP^{B8#>NO=;e_@&deU1R;J_LPzbanI$eR4qSgH$A@ank@*&j{du|t@%l_ z>M`K)DWWEkIukD*q7i653b=!W9WVWy?QiB0Rdhf%6DTN~r;tsnf86;2(Mx|O>DOEZ zE|WS+XGo&JJTRcW()ODN8`7hJ^q|I^&X9M}>l?i>3_P17r6yOVlS5RT4oetIG;r9b z{625?u@@GbZX&RmwPKY%Aoyko1j+*S(u&lNbiU!KHNHkDZ`zU91 zSuC=;TQheci8mSU;hH%`EK=8D!?hr-UO#&{EerI=B40hPBm&|b?3x7?y_h8EDj~_S? z=644jAl8cbhs0ws>9{+G6X#=pZv5DNNTV<(3x9%uO)25S!*MOOwg8qO07Yhu_O^uw zhdz8`#fyGnJz!x@W!#$}^sP3R`3xt756vAO7-orm zq*aM#5R>(LMDmbeAhR8q#O?q2tu&jYYjOZT4;d4OCl7^&RiLod7_Xl7jFbRGMWe8+9jP%_|rBA?z=gs6FHTR+i3V^OM>=7P4y>i8+liaMvzfe{edVtmxaUiA>)i zw1hsUEC$QJml4NwShQIE9x;Cvg3cgM?-0=6KFh6)&>+A)WOq?`>Ba-1#j1C=AhC}C zjX*TPhPXQUEw(FQ17Z~fGooQ9F}HVfLfaegr_q>cbd9Eff#uMsOcbTadVH>g^2I*4<&6h%*A@gLO zjn4HBTj*6LkeT;UXkLqxN3oiqS6j})t5>}h1hSzD>l@Fo$Hx>q zGYutQPcNdc2)W&H$3CeCBAM-b^yRZ9y)tA^V9@fCr}l|KdW$749HR-V39Z)^fc6`cs$Y?b{!FYpt^Z^t#%q1@vF z0WA;NbBl{AOw-XyuI8&+7FyNf2!P{OPLX|e1B21~@vDQcnX2bvEB>ei=mm1uPqPZ~LwNZE{Wzk$%c0=IkV%g}YC)te zr}#n@_QY8q{_16|-k*Bp=BY&rtzkxYC6u*mS{iVSxA%`^)`cRCNsy-m9poAU7u{l; z9uFVj7FZho zl)vJzO5^0TTcdCM9tKt^UK+v8rgKXYF(ET^mUx-UM>Bd}YMM={#Trtv$Bpmf|WXcmcI;P`;kix(0tQ!Bu^ zRAG<##!}xw>aRh!AO+IGlM68rYsDl5#-@jy(RD_@w9;PLMew*>r)xFx|Ae+*mVHTJ z%S(4e;{&$$%iY;crq|l$e`f3EE4p!fIK1ZQf26U=l_r%59<204DIzC>-Of3t%W#2A zTR|l0uP>Hjq}vi38)5Hojw1}bsH$HTUw{MVv$i7e=N=B0O*XB0JaqU&K0VL2*t(obAkZA(7lGBU-^AhowkuV zOTB7oFA-^t*mPVmn7yrSP)?xuxcE&g#VT z-78N=v(0Re)M~_mXvwBOPa-BuZO{t1EpzC!c!sl?kJIt9jnW3)#ypC>{88||Pq*$P zVq`~hYwZ7-v@2;~Xf}VihzUH;EvB3AgM-=INxjnYfRk3ZIxXhEqNWd)x2z~dB)5grfthM~$otjaEYU93CRcA#cf*2X`WLuHPX}Ph6 z?#k<6CAi&>@%_VB#aeKEi8m`?fS7Cnsmpp-rTXf! z=ud!GJRKrFQ%b==Rbtmw%k@yp&Dp`~w>0%(W`*>?`SU|Z&^;erU7WN9MH^PwPoj`I zg5Ds}RyFH(@($}{N~ZSqwW`vp=})Y4_DmpLM~lsL)AtX=@R~QKjhPNo=(>(9hef+}vy$o{m0&wE$7jF$t4mBplfAV4 z%kdLt8UL^;9g2WQuQ?sYD!@5;=YtWiSx^aRz11a6*Lu@+jYr*oZ)bc`f3aK;FD1W| z+FS3wT3lmh>&{l9CiDy2_-K9wvk_^^{peau+YuKCh0 zseDqzAy8fkxH6vXdBWof87tF)JJUtRaIiP-OTeQ`WIDhvd!8MJ5r40$|CAop2YW}i z!bZaV{Am8K{N_=4ca=;rHn+Vg@u@?>Tr!TXQA;eqHF=cPqMuVqdKk_&R2|LN`7uHs z8wXao`xgfhvOv&x=06hXt~0%{5CN#KAbY3!Xa2jX`f3spES0Yz6>7#Sz(qNBF8yHp zKxw5YopxUJDMQ2xP=9fwiL?|8Qn@sEF6Xze5r;HVKZW~5SzawVt~BLeP}1!kxo})6yC>@PJ#c9ihxGCANg>(S07X(OC!#HI>LJz!cp-gM z1mUX3xNHP}cSNS&>HHUmX-$=-Oi{N-VxkUKV<(bH%y5pomqf1S3HA-xg3@_j#PN;5-^9bsY0@)e=Bw;vG4&ARoM=5 zDTVF}TjwUvcHZ@0TX4*JOb0gYl-3%?J|!`1dzQOZ|aWpsSP-L{?}Zs>f~b z65FLOkx~BdtJh!An*+@ybK+biPs1K_DeqcIh==ByPsJhAHs2&4H`(LE9m$;0*4v+j zFk(|l8j+N7=`R`4Ypt+qRk_tMK2!aK)T~evnh-C~<;P_FusAC9(G!j>SK?q^m&7@> z-ky-E>K3s;^Xo6D6e{Q2R8onW{fXKlJ!50dLIh}}-16yFp*!0@7U62XaEbW01a)65 zUJP&>si;aZ)b`LlU;B~K%j!bDOos{9Z*PWnf3e5*z&f@+4lKS_Xr25t1SL@+|plCpo#?#7X=RiLgUB8QaU zw3539zMtV_%9GB}x@etOep8Ufm3Zjq(!yv^Iyj~#^%d9U=@r{cmGxO@cZV*3BY49O z39gl8%VJ!SO#P-Dp8S?homEy$Qv4{D1@;E#dS5;vpoZ$VH&u7Xe%RKm`!uX&T*u^j zdAd=A{-w{yu^DaFuq7aWvmPu0NI>6GdX(Gsgd)_Er`G!W3y0eNSBg~Xm3ikR74JbG zi@`Mp0nANeokv%0)?UFFSfpxAqI~JfQUld&R_7!U#T^yCI|3vKp+x4xiD3tNIL+jea({DnECmVjWTPg?<;FQx^JX#gn$RT6eO@1!P;+SU& zuPts|aw9w^>)(YA+VsnAE7ZIfiKExnVcO|6o>Yn3NL}ANZOhQ+&wXE`!Rd6;cs+Aq zK?ae-*Y)DLEIGO0FM5XGSK~hU8ft%Ua=?52!=aWA zFmjnLs7%y|>A+R9bl93wH$Ig117~sQA4TF+SoFAu@OqNV2ttX1?avRSS=?W?1qe_% z=vb@-kxvl>S0IqDcxFiNhBuMUb45A{b))Z461{*qU^5o;rYWdP-kWRbVm z41)B%94MZ@(*AmK+FkZMG|qp-Alt|@K}2#|3SsKo)mH~qRgQ zpB<(hk2TUQ2q((xB3E>3kI^>fpRC3`Y9B$*GO`&cb(aBQ)gyC%`d8Dy%V?C(ZtX`G zK{07e5Os*FjJ&aNDy2uX{}4m!c(&&UYBRN+q!SYmg7OmzjL_Ruj(4Vdix%(lrRBhu z;3!!T%N95qDwV%V`83$L-gAZb1f^)*Pq5zc_={`0yvj?f8G*BA zV_cWZx1Nr7aRKrzwK>52nRJu8FAlKQAh7Ho2eC1XEv~Op@Xa_;PW2f|OqR7;Wf`Oe z-OHa|P{1ME#)+dNzr$6a3H8(2Y;vg^&OX@8)U#pp-j05 z`#in4WryE;kwR?i8P0{;vu@v&K}~i&AMEfLqaW91pLFUdCR3@9CCAJ7D&&ld;*50D zxogG1A!#ZXf0<2o;OTE};7cenu*rwYEY0KnKJprLDTG#Xi~?V~&bdlk4dD!=7PHZk zLZp}ujmBfOEC+mk8qDR#Z%|JF2v?~^yF1<*zgB-7fdKl zrbbeLxNo8+(OQZ?oZe$s0%sA10I(I4J9?xRnI4vlh{_9Qm%mS;!4YprWR*7pZ_quF z48%w5UpJWmj(FYHnJUq$41Jz8-sfci!mImG)VpHS;#c4esnr#lhjHvb_{#?YLOk>n z9e)jVMu0UDmi6=q!>@rk)+E9<3vUeq@Tsm2y0ypd8n=iSr5=5rNWH>}?HvO+DIWZ; zx>$fCjHp@fe@l*APsrA%fc?P3+s#6iIdHCc1i~jTO=&}6w?+vp;E2b+q5~{P{nDhx z6raH)HW(;YpLoX>Z31!z7!p!|0|r#NOt?S%&}%<>kVkTJ-pMC0BIbPn0H6sNV!^J4 zp=7gAT)@_B^fcBWdH>o!$8&fIQo_Zu7jVeXPcbNMIbo3X}ES?Ejl zhye*S`)79dVH#Ik1~gRwxcet`M=+C*xJ?BBGoL8ATM97h*`Y5Vl)vkWW7C zn8-cV{7a4XE|2}#3y@&fG8LYfWq5Hz37)Yej9n<*JE$ADp_UzyX_ajpR z=v~f?Fu2ri9o0=1it~Q+fo-!orIHZ5W}E&y2N;<3%(U1I|38PT{;wS1(9CB=by0-q zaJMN3(6ZGXgI$&NmcbrB$oJkN6GkxRfQ6abg2kcfrPO1GHsB*4$e;y<#2w^I|F4X4 z?!zG3AELMImv#EtKjd#s*qBYg>Zrx*a^y|%56>Ft1SnLAc|A`PN1q0mr@S>aMS>Nl zAoO?3xMe?h=(E7OA2zcvh`gfd8VbXOEN(JlZ?l8Nz;J! zfVV(yaTjPGdnfP}n%!1ASmZo|M;AuwM?#0e{kwe|Ec;87u?wyK?65xOjO0`J%V6Pb zxNB_gh1Rgp!;IP6?u`izo&dr#k*`aYIqZk1p`DeQ7&qmP@SFsOLw$RCSS?^Gg7~t3 zT(l8Cti1i8tdx+KM7G;QTrnV4b=!i6G5?{k*L1;Ri2ayDcTxzRyIMWFRUG`UYnA0a zZllLl$iLU>9f92pqn%BL_2oY@0U&d^ork_PR}kJ+2q6SyG@#-$Cam5i0C1aZuV;Ek zq`v?eZHQ#kyw$p3Be_D;{qDuvu8(#!zRhYDKDUk38$pXQid%?Xi}xb%KVGX$784a9 zd@5wK@cId?k?{HnBr)snU0(r=o~Z0M`Taqw+mRiK`Yz`8t#OhKRwp>vV7kFUN0EW$ z=fC1?&_5$RhX$p3#Vbi+P2e>&qGnjj%jtB$@o%;I4~6|dU90P6NN9mD5rsFxj09LG z%t)kK!p1)YHlQrXqW*CXD*aQT>?vhD2O+fpnAD&3ieDGG>o&H%)5NQGX|D@K_TcOSPDS!Z+YL)-L?*a*4s%R zx<`26-umV~?8^o0TNw$w6WSYCd_w^G4O9aKqgr;|uS5I<>*C%B@B(C(`NX#r#fJgr z5ARWj!n$S>l-UJTP{X)JrUR!y0^~V3PgWzh+h4R*rupHph_dA|KGY~j~F^gjA-$AsI~DRQ`53^xD}`!EAgpKglZ zBHVp+@=t})wl}2+^X|jZJO7%0u$*}JI6G8#geWn&^yWNM?CIIpWp{p&AExfHXaWzi zh1S*JIZYEQr{eDy@r$yfOlWB3Cw_4^hWFT@#)zP`C}eu~?*zb{Swy<4bM85TP>2X} z|KYDEfA!=x#QhCtAw?wNzKd5M*B}T6;NnXY^L}?|{N-N}W)`J3Z?8r|amVG03gw9! zW4|55!=&5jV4X%tYmdNEP4adtP2&H%s@#i_`Q+l)0Djz-rbWZBYg%GQZq4#t7I@pY zh72bbzBrS&nbZ<{b+?wDGkKkUikRQ&HdT6rn{T}E-m&!F!6E&F zNul5U6%OGD_q@Nm>C4;wE98^%d#4wwymyPI{uf~GA;`MQ7XP|y=)3se=B(cp29GU8 z)C`ahQ$xILchd=89mXk{f{}h(IELXhM`I$7)NiWVV}V<5;u1LKw14>x-I-VbiQnOl zbw+ZE{t%N3>5FiXZNaM}wrZ3+;(Jzi+y18;MmsR?m4Tv@n!kINOTrFmqbsBU< z4_l!+q!p19^;TPO19)y zI3J+{A;LwJi17!%M*A1SsW{0iZ&A@m9!zlTSmz774Riqb=ibTg)KcHwJcl+Il0RmY zm8)?*cpy!5wcPzcnOw@OS=UW*v^9iS;lX-!avsDi_V~Hy~Pb%pJ z4!tlPt_{(h$8y7hfr=+PT52th54Q46I5wk+ld6Yd^SKG8i^iaNCh_fT?EXU-yAoYq^#UCI$%LQtQ>kciLLPVv?RxZ* zMBVMX=?7>xFAACgBWuT#6;?~fiiKGi0P8Qqqm^>|DIEzHzARCONza%O6*c075V59y z=4dnLc6wsay~K}l$$NOSJ5Plv?tC(W%;VuSyZ*t8R;rIZj4CG!a8H^i%L}Y7S`^*R z+aw0u5PwthP`&ze8_5c}{IEg7U4zeaLL@E!l-)Cc$GF*}d60M7fcEd_!n>zTkm4?R zTqlV|8$nHlPh+FNbGeBEj&wfd1=^bjE;YZ+h2%McHv&Eu8kw*X9~I)8=AaOO+M4Sr zr9C|iIdKfH-k1eSABeRL1ac#HB(%q|a2odSJU;PsuFg05h`g|;BkhRkM+346rA2s8 zpLZK*{(gpcsKhgid0g7p3+ot1b)zDuI<^mbu|jhAdcL=%^(~tHW^Cf$Q%+2_bYPKd zHX|4RC)B=NT!f*3(jgDf*g)_0Vz7R%t=&Av#gbRBNj-iYD=6kHV6KmBy~vCx^UO_`d6%F)KAok?Wq@14I^XCo0vv7#MwL%Gid#Nb416#X- zfSBIzY5C<6Z~soB1ELj}mXM4)|M~B)L3#i%E?EgccHrL+e|-%`_#GLe&ZSD+|NcTk z==LT}FaOU?{ySs;FHIN8&yO{52;7kboPT2h78Xx;FT$RgW7W7Eap@>rYfs1-7DeLj z?@U+oe;br*pV5RgnRaoQja5+cAB})I_pJLU94N{#DTL$^-plI*0^>Q#FFUbjzvzD! zN7;VVR&hT)m-hSn_kKg;CB_1g1uD~+7#ej{pt-5a)!>`R0tMJ|i)ri1gfx8E0ZUhI zk3&4)tX^%MzPWi6^K<7;wXVptUkS z#BMtf$aSw*UCNIrx|;7kqE?@UQ;_*s^AU|4;HJ4^vxsDFl-{%!(0*NstR>t*clJSC zY4r;sw%VIRtFPMGw!Pq7E@*UMhu7z8`A9@)D18&mqm5m7{ZxVgf+w3MEEHj>z7Y*} z!}pI2L&)`_3rJ2TJqlihw-sMWB6jUtvz5)d$>Rb1B|qpHySF|_1-f(ak;wlrHwfx+ zEyr#1y)!;Oe6PO(Y5>PfucyW*IS)44mmXDxW>CKc0D)kdlTttykjZN99Us_^D+|a9 zoDZH-Uj!8<@)&+;QLVl%oITdM;JRY5FzARB>|B`zkP9!)m17>5fV_;El!^9(U8f3D zsWVDwnT1wB<;F=QtROJgcd~FgGudE^SDvz32zIW#aerc58jvI}S!N^=yD-`a#=a>s9%V`(thg zI>LO_dR-QfE`PMY(9#@kK+B{vCo`QHxj9}-YcibcUv7ER0vZf38AD%e8uo0Ic$>1B zPCT?XQ5I=_Rw_FmU-VTz>w(2o#itVE!CMSSER!t?7M(`+CKAR|B$vxR)oE=EutT?0 z*~dROYO^x++#>Gih^F!BRL)OP>3@~YSO{2lqPeQ&_tJ!s`q?}$PsO6#eRdVKJ+IHO zH{sCx`-+6*wd4145>I#b*2~3d{b>{aKOL0A^8!O&b-aKhglJG}XXUlI1O-<{ouy&`AihR7uW>$8M#St%$ z?h^_+ha%yPVc()vN=-)9ntYy>_ODFOC5G^PiD|62(fLs^Z zQq_MT7ry#9^i5v(uq{t^91RbQ0>i+)D}+V+Iw5nA|qHt70Dh2l$F*9fgt ztba6hj++uimK$KthNzWhlQ|bHRk&`?HA;Dhiy{boamlzX^o9L#3Z z;dJN|cwJG7Nv@H%K!U5uDaks@q-Jv?hXn4KZmTreVgVI{@41Yccs2eSy^j29nN@uG1-Z!n$)76{H@J6$h;7O4sEX(Cz|#`+=8O?%v$ z$Sf~L>`xbe-jcaxb9@_cKR>W}*YD)bXLQ!02B0-7lEv5HLDf6%sJ^0x zTS~25t%Z@m=Pt~?j-4DJ{-Vr$R)`U5F0){}+%X)>?J4{2DmBd+V)heQp?!CJos(8uziEHolRE+0Di6ZFA-iCr+JL{D4n{(O3oN zF)>H_WQ3-d_K!e;w;HTm&kHJN#1|~> zRr58B?c^8bH0WL0FcoY&0PA)z^L|GpUB06meT?}+l!LiC>Fek~phW)R=zxXF6ZBjs z^W}E5SbeS_YvFMC-ISZr!D99y<5B$LXhJyQBoLZSGYP6v!hhQv`yRjC;@k8QnpFMh zu^!3$=ke!Pn-h6i6B+dz<_z5DB4xRs3yprz>9;3If13TKQgJ%_^)FSVP|fe|u4Sou zSr#tJy&m}$MG;h}SG2+yl%g@Rn60JGUFE{?WpG@dtmdAn zanJdAWUB zttW{V0uDX9c{Su=RH&iyKsTM+2i}fzT(>x35doX8=K3O*3F9*NV670M(54I%s6fhI zv_Kz|1`plW6Pf>P6S&wa-EZ$dSL=F`R0pXs**%XcrdB8^!HVl4>YyNiLX)!&n`U53 zFIH#aZ2|}zxq;2{j7cPOp=mGEd&Ac6@c(GcusUqxdqO9N_-Lj3=OJ#fy-^%mm?17Z zLSa#@2AXr30W4S6mU%g0jI@bvQyYk(D03x=C@2q0)Ph{NUeKl3ZY*~yO9^SwlnM+L zSV|MVp;eaYrZFUwCbCEq49;yTrjN;Mi_jbeEom1Rk7O(=1yz)@)gC$9t~$gCjWC9- zZUE2Q==UgqVcJF2d~GlXKb%7Hy;ki5jw`Ln5U)UM+9=gB;|Spjr}c1@cKc`}u~#n{ zH95Sd&iu32{OsFqZi*dSJs~OehEyTMuO^Tt-yH?gB-r8nqL1R01X1=+p_fI?156jrM!yWMU~h?ik_VwPuJgQ)!7jRXNRWArnNe! zk)Yn6jH0%R{wdT*w@msq6*276{^q6Sa^k0&BY^oE77G;TLyjXg{`xLkwkgtH9EQU&}2jC&$ou#9k5%KgCYR*PUU_r&?uKBh3f}e z9Z3i5#Mt?W;F98A7u3sS0AxJyco*k-}^viXzwreWJK7Zp|nI1FE?`yy*HwDRmjkdNKY{ zs0`m3GFq5{bGPrMWSw%UiDLOv6=pK1K9yy2kq_6@SW(1@d4%uRydGS2tsi8%WAa(O z3SY8_q8YTm2|P1+X*e^r-jJ%8LxFbvh~YumS3%AG zVTSr;%=;i~cL7e1ShIpj297;psG-ckAV8`f)ml0;h+qlBe(Z@O6SmqV{rW}wMpVH5 z+`NFj5))bGHzDrv`zHZu&P3)$2){DHAV95gF3wutOV=eA-lTW{?YlWR)&{^nMQKif zr-o3Ei)|eL910TUd<}u@AsQx|F_J`vOKVNdb2)Rz@|G*Pmd+vEuPS$=VpSqk*lw$BtzRE0bV zk~walzm(FfGTmpk(y=TtnU?hv9w|_NT@c+IV$6Uj&tb<8={2t!vIfhDq2fr!3Jhg75??;BK!H!q2D;p)NTr z`8iSFpUHlq&XgqD1ruU9Ybs`9vk@ZD7J5eOt|ZwgJ!(1jwa&6!;Zv^41M~Nau~J`;?k($2Hh@v)a-zOpJ(esOdG~}h)ojo zU1)E&5=1vpq)5+A@XPdg7=sQm^IyK&5x< z6VB#0rCrk;KEO;6H^kY_BFd#JaNLuw$fU6U%xxIg5gm==evaH&vJAhFPHc%$@d7TmYnz1=;2m|cZX~$yv%TOt*}58DuNe0r^!}EB+yS(3X1+zTDD?;?MIyH) zJd@8(mk%@4ml8`X8)sdX$e}n4doJD%HMElgl)3xE2}R`sJup&uke0YmQ9+9kBF!U) zObWJ7XyjZDTT|xU0HXN{`k01$)<(&CrbZ~1$8Jttc|JV}(J)ceb%ueaJt<-->U8Bx1g zl&%KzukH__Ou^X6tnTYGHH5Wc%*zzJ7!WR)-|&`Qp)?2Ki!i#0zHI}v!nMGL!M9z7 zGi3GFRKdhUsnO9}vC!0qW2ql5*3Bvlv})z*DeE_KTf(2Wg|$U6XGsyX^v{NXUS&#E z9%3zI^^@z&D^{o6Yobe>c*KTf92m|$bp^*jd!_bP7UXmcv}tB1xqePU*84d*de$$o z-mGkAO8o6=lV8Xe`B7p8hYd$A+Y)l^4Ks`ClYZa4->3u8C1++nG{$H`TMGi+T%dpG7uxQZvwzv)gsp08aL1FX`jC`*oj<3{awxJx&91=R7g}l7FX`xu*gOq!0X(P?sM3 zD2y$DxfOv3vHlYEyYBNh z=80ks9ViFHJl}tM7e@U1^C1x^oxE@5=okO@vtN-0y45F8vwa=wgz>xH_`9SC3UsKq zusyv5Bg+5%O@$yBGo?h$oqFj%bsHc&2@k*y(ix9&L$N-SlBH=?RLQB)P*@Z#-7kzLogwpZ@z8+3kdJgWY{pfX5mYJL`6i^4w9+g%p_q>bO;NV{i z(6NBIhviK69gALTqfG0mMC@OtN{p@2w90w_*bJZqFE&QrNXd8~u27 z>iMKUlig=C*9b!TY*S%w29uVWQpOD`UO3DZ5J0O&$5|;t`FE8+EWF)sn**@1%_m9( zzo9n+hNQ}6jXn1{D#3f{WIp3i%#N7BQ?viT6OaWSVm^CPb=B87pYoB!6{y$%y`qoch&O+nSiLr|46ku|@TCso zkgI~zSC4Ar9t8^$*v&x8XY6Ft<4Uy)hpDgFko^h091f#)-OtPW0naV3$><5_=i{_J za1{}{C~+Vj%xvZ}*^rB`=a`HZ1k=ef03-13N0asCDe+AiHaFJ!(YDX~`_M%n^kmx= zdYL1Jkz~bum3u+>?EIy8_J{T5mXjYpVPt(ViSh@OJsQv@C>SNNPPwe6@!TFl3WR~U zo*aFc82=_y$VCKkeq$i>s*pjms6vrnY)G2dH-iW!`3Hv^`>@P!MMKofE%hqU;{oZ`p+mk$1{rqmj3GUNu+MnVyVtcek2rAk}1WuPTX!cw!+wq07fTXLHow@5Pa$L&XdbW0{6D+^#S0w_I`%(JJLbOSP{FMGS4b#vKRC z3yT_p00)@ZA(_)wDMX%u^%}~X#A8rpe~n8hfSb&`{Os&h)9O^O0rKyiu)w#>OJpqvCVNFfyMxRui0wvh9y)t=IhXjrXmA;Mh`UJU;CCk?`Wv z+4+?`bsV1W$%yrC?+X{7I^oBG?8VR*tKKAc6h8?fm)Fm{NLK4mh_59JF8zS&FJY8Q zIN+evxnD5pE<9=LX{f1WkxiAe=W#z*@N_sEFhIg%CI}-FdWATQ+PRY=v?K|VBG`84cQ|AkAy98O!U*4yO3gQ6MM_=tpa_o2tlBr`A9;_`v$=(^A zN^95t59>UxeC3mvca(>Dd0meN-#C_xS^=#b$&esAI3QYs4zb(ysWssdoCEr!u=bJe zZ!S_^x|cRYSu+4)pf4(+x7%5O5x0Se%unO^- zOsR6&sbC?QF&gR(2n1<*Kb&U*$_$!$;g{>*D*P-W{0xbeIbKjRnXxyD+wN zL_3=HxS5Cbkmug|%xv)U6=ifl6m@_fDlslm6Obp{e52+9yc7ce%Y+U^HG;JEIy0aeM&u8MPCU z@rQ&;pGC3xq#3;RI zJeM<%R059=5d1R^qdGp?hKSDY21;f}(#Xnee`Ph9>cY1%G$5k>QEfC&K;NZRe;t#x z{kaBfmQ|o7aJ~PVExT!=AIjFtZ_LZGHAb?Q+zCamDI|at-A533FO2QN+u7iv%|*X< za9rL6Ql8Drw8}@xo1-~tj)Hz6I0m(huE%CltrW#^1uU7;1Ga)aaTY4|;s}SbRj75{ ziG(II{!VevbrIRjrndCd{M#n898wUm7*eremTcH&&6~ruub{mgYFmfq!Dq+Qc5F(_ zMA4n)R+8(U4@%W}OqOKqb}m1t4RM+|A+-h)r8?R2VC9E%sVfC)XFOZ}4?9X`L6vdvTF04OGG1XUpTFWQ@jTx{Q_Obl z<#E=zVL04jX&Ck6aqU+uG15JhQ6=p3kjDkY>c%!*0V_$LmumSy;ChWP`-FHV?e!|k zvvHqZ7IQhnszYOYj+IGAOW8s>WK&;=2$^NfL@93eIi9c&y2JJWT86mt_cG+rkUUJkjQ=0zO)z#cj z9336$n`>oqD+E$2Feeu1BNv)AXE|faC%ePVirR%m>zwP4F^lwWK6iJqug-AST0w`5 zH%S<@d}_j);1^S0+#6cllf`k+NmCrRk_#I)iQZmnJ7^AwS?jN50Tm$g#Addo_2cN! zzw&kanAgwba-?AOJHwmh0kMdNOo|8sGzA~cPft2>P=5$tqLq09fH7q~Ig;i_yGK05 zNN`K@^IqC01V2fP`Ak3C#S;=@TuosaGmPgrLNG347?P;wbE*BY85g!I(|$+^B$+!E z*%x`&NT}MV!4{+)OtaCQm1y@6h!m6!9upkwRIjh8Tpjej7BDf)i@1 zbOQgPF!FPqJ{f`-FRx1%Bvxwh7_gJ&yGy%Ph%)bBo}~PBpPK)kB^(UJ5^{KE^n{&E zleZKs{BiT^%Jor*sVyxsIR=&FQHhwE&=@5qUGf9#{->T3j@h;`L|QxHX`xwBS?hyO zXED6DG&4ADNTwqY7P;+PxJ8{!n-L3#7Aizkx75&Jp+)1o<4C9~S z=1@7G;G9rSY#k3>U2{9h4qu)27*F=>vB=uyT$y&1r*)noq*XTrPiip8HK;Ly-o|FB z5x_LiDwAX7!RyOnDDmTDw)aO^TI<>C#J?vQQKkVPauA#cGbI|dJvD!T>`~}Ti{sMq zWt4T63{q)Y8a$X%>6v|uED9bsJ-&E_^HyWxj1lOGp?-res3yjXkIi~&AC#=0Pk1Q~ z^qTiC7^oE4;WoB6Fev6IFemr>C!~cMB5=8U;P7bF$Bnzj1k`vPEzXo5vheI@nj?Ac zP`kYt%k)oQ>Sp+3zFp-Cx6cuCRb?GZX9M-yaf{bc((vyq?Kh*5y85x(!zr1%AJ`9E zYg0)lM?d|b7b>%o$ZPr_vnO`lJege90gy?_e6Lt!=RBz2mxGw@%U@t-rxS?`$qRQx4Q}#}%Gt9o zN*`!tKsj#zm^ss(c16N&sTPo@UZ%GYxh_iDZP^-xZ=B7MDV_9U{z9w<{&kcj{P%tm zAjJD-O@}b}Rg%(ZNl_$?z=M*jvWUa>>JVlF@i)^|$jl8rCeKV>voxGJ%ST$8}x9}%UA$ff$SEub+GK|s)@l4#^1JvvsDQt<6n5ATzGB_72xpL zc_T>N%5LWXR)6f3O2yN8spRuX)VS2@)T^T^yLBUB^C9Dtq}sP7BFKO7`S1|_l`fr3 z)D};Ln#AY+ERCAzIXO#R*gdiZvEjEVaNVFB_&IwFeVv%Y^_WLG&2-~@qRiNMWcs_c z?E#BsCY!8e#M4q-#bQ4sB-_mu`eJkIg`aHf2bH#~;n(^h8UAH`fi~YFilcZ4-wBH3 z4E?2;WkHUiLl5@;W5lgA#1^e)yq-1dKoU4a>4~>de1T@rcO>~ub;yvYDAz3 zn^TFj{)AQzqdOhhquxi1`QEc(q@9?zwEn7=dv;qOiO6#IxO05bs6O!+6}{%d!o@My zOmn-uI-CHW@P%-_x>{;)IAt*|jeCaxG(G#YukDQIbP((Z~?ty$i&N9RSn2}4YIxzkXVd)2QeKXh@lI4l={od-dX~w z;ycpbWRZ~^aeoN*`s#RnnB#s_j3cZ`MpurP@@0)qkEj<3R-egA2-H8~K~P-$Xrk4Z zf4==>PwV#Uh9Xvo&Q-LxQ^g2<+jg+(wY>F1yn*}`T>9(yi9^O^!F&HW_c@gYO444B zbn!3p{|@8U^FK7ZM<@{%0hx_xwQ80B_^+3`{hb9&D(}`=Ww;^n9uE&0*~setV@eY{ z@0gROb=S`SPROq-J-p|hIF_T#xWBYdK2>cG%c#wFQWDokaCrFyY6h#NQf?(0PR2?m z+U9z`RaoP?Q;N$xeN1R^&swHZ;-3fQ2hU7$h-f5BliQ zi?v#pGjwIf#3RSH1BSUXO1raTnM#vHDIcE6DB3Wz?Qari}s9xdp4F+v2_XL+?ma{}|96=Y9M*iT zmQ<+RgwXf$n7u{&9^+3TU^_MJ4vJ@IU9$f3Hq?*Z;1-%+zZ+~tdA`J{-mcg7h>wb? z-20D#oJzkVWyEe=qElGs6(Fj|`j2mXlEN?g*h;AFV4H->Yu;c|e~^8$c_q%vTA>2v z-xqN^mwj+JP?h#aB@scie?9^XSQR0pjB~xr`CfnA_Th_rzC6A){M_ReWPe_3?mi9_ z2MTjdw}|)W3+KnsX#+#}f9NLf$(EW!h*4$J1b^g=7VMoL;a^_t^42)*H&SwUo`CFW z*nfP(?WFK2dZj#c)^?A2XsS#vbm_GJm_|l~t&k!+eyPvE{NrB{oG%i$>kUisF?;#J0~H;O1RXirF`*{QR)Zhp9PhjQ%4 ztU;_eT7r|!rh9}A3`uP>k=nwt9)nF}CGws?lDx*{^FJ>xey`xYmd*p7>6jEmXTm!3 zpdC#voz?u>)1yP&Kmy($;`l7WNC{kp#EVZQn!P^_CXgAn+4=_%Xa4KHzyLMqb?^^i zxaaO0w5gZAK_lXE`HeiY?PIdn@oOA>@ z#kLDBRXKvOa^#3C55JcJ!Y*%a`@{mw6X@Op zGJRAw`kf{!Aw=9>_dfW>-<)**3|+-$?GgC%emGt!D9-u5`fawQ)G>d0CO0`4Bxj&y zY?vy(+e-jhTl6ZH3|%i?Y3Yt1bx-gkzB?EEGxW!?;J+g|dpXxxYyP=*|9bR%iD~Kn z9!*R0pBs!9O+)BvYiJCcEy`4#Ek5&8BOM~f{D41RM9RBz7~RJY3KuJcP9c zcjDW}?@758ODMawjBks_G=qh$c%JKYx^{1-#(B|ydxiOr1$z(iRJ~z(ny~*%b3^4| z>m?@C?(M9vfTv~2hx=m>cxEjkk_BdB#3Guyc?p1RCT%5HJZD#T1F%(Gh zcaP#ho@(-GYVt#cSt7Ac{bQ>By6;B&nAb(3Cj8mVaDX9i_rm1cm}5zDd(yhZ(elZ) zuGPybUJr}>Z}_WNBgpN81}(Q++uA%i?uX?>mdUQ(KcC>qUimFu8I4yM$vbLau_u|2 zW*dpO{KcWU%)v8-`-*)By=5F=HsH6Fv6Rl2DaDfT(0Ire){Ci}uFhF!+910)r0&z$yO1>-gOl+do}1_2b7dmb0}{nV$>x4*LZzT{nG=GuMZgvO^84%?xAK zb z4h@(vJ>FymBiIS=lZr1ERzq7;R{iBeI{$N(U#@4)j2dcj^@DWn%s?Ah3LVZ5-BnHZ zH&)L7y&HlDuurRtd#pTOr!txX5iU>ZEG+=asRWYQ9s@TOYWX!7wi8{2iVhU_|sPW|7RJ% z)%+!()qrn{{Kr^87$6C@-oCGue{O*P=kf10xBu^E9~>lB(MZwJDWniVBE$+6yJvo+ z&iM+DQM>l%5p4``D#h<+S^f@a01wluu!!VsQoq$BVhr8JD(-~Et7>+qiw(Y=n*q#% zUBZ**fitwbRlz^^=#+EGxZ!miGkp?|vp2{`&TUV!qm<8dcN5;`;?vt?tH5yRd!{fyYVM;{!61&A8S%*OVBlc}iALHj_|Oa1HW52Il~+$tuY z*}BON*7Q2Yc;WN6t9+Lii|e&V1vBI(Lq=8+R2eb7i73$|Q@_8%3uE26&w%9tHqY?zqDwvi9=zITVIfj zHXGbf&4HX5br|{Ltm{b|y8r!40;rr}hu37e#oU!^<(TSU?iCCsW44aA0=c~lb6W)> z9|Er$t`pZrJ)Z-p^-(|Dn$Ysk{wp9!RST!WMvGkZ;V0(pPVf-U>r_z+pin8bVd{u1@HZXJzc3-1M5Wi} zLWO;R(n@UD%gI|%%wo4bL-odfOg|&6r`@6wh7(x+=B=#(#9bK#g_&K(=&$=xA63$&znxIf&32UR}RB~D3Ue%5_%~NLqOy=i~13yQs57g={ zLW&Q@{dkbarmGxYofTy~mOozn`ANIqa!v-o>mMY`fmWPMWE;cZJ~=Lt5gz3;>ISbyp4xCV`8oe@zjL#z5UU9k0oR0|^53TBW%X zAaA>3Pp=NqmfF?fMz1S_N10IsjbZ_@#V5KOKNV!PRB9b+v*3ktlo^C#ENUgzmY;Cl z2m6YJXxl+$prO~5r%c36z^-81WQ{ZaN|*ZDKw27Ufo1)VvAPdYJTZ+ny0^ZXkI4&_ zRQj1SI+PENrxS9sEm|U~`@H_OUAp+1Z;~ysUN>X!@_d?a&BHnr=V(*avG2P5xni(( z8)HQ4EXyz0d+uR^CN};bJF$D5RNDtbu^*2r*AraFGQH8clBV64tot%DUJi&3EA*4| z9Z~gY?Ikel%;!z53ev5iJbNL$2XPem-&J~Zj$1G4dSp~I2QRK2IRMU}{0 zu=fCZa{!6j(AU$Qi^``M@XWb=kz};kcLZcFK-q^==SzVo|4HT8nUa_ z9qaO7VkBtsKkj*aQQRw2WoNAbD$O8G1bqU<8!8Ao-CxlC`PKSmg^z~43}OZKlJlt4 zpvNd*BvbDDqwO1>=CBKRF^f0G8x!nlV$-GmC-O zYH7_ctnbCr)%Q1;{+RTEOVEJ%wZg^IGClTNzMvNCXs%LexJKwCsoc+pW5tdTm%|Oi zq!)KbUoUC(2Jf13Mv&uw-B7G_@E5YvBZ|3<>j6Sf4fmjPJ)&6gBm`#*A`sII`xEiv z^;~(t;1(~n04gQ~(fKorK|>!Y?A~&W_FUuH>y`7P(Wso2^Ah8$XP^-xA|UmJeUJFd z)N_Kmd)`+K_0^S2X4enoY)?sAA}f0ZIj)+?fPtRk+osvUsc z;9BGl;UsO`EEp$DUqlfZHf;y8TsmuGF$fY`aNY$ zuE+Y-Yxl}~v)^?wCQ8i>dNMq&{M2@}7uv46Zpm}xB1%)$j>K2Xr#ln1qq(ar-=>^O z&5yfT>ytT$4_h~8iVMbD%jIwf^{}L``{9v!T~WW!U^IWifNxrMqm?0HB;s}P29o@G zBU{dI-H%TMt8z^TESZf53PSnJ)eZn+ww|?{=?EtS2%@7J;BtL&0U-Wvwysz{04}>R znubrLGL4on8qK7{V>4b~cbf3!x$-(*=l0Mi4$tZ^3ieT6{p|bW3S!C5=Hh{b&xCh? zO}BrXpg=o4iqCG5;&xWFHd9-W0BcywI_lcOr1$iT%aQo$vwh{$g91o@t`K)IFIR?i zGRlYZ6X7a5KM;&I=gSu);Boa$wKh zR&qD##YT+X;aAd?fK1HFg=R#(%ds%gc+%?eFD~|`3v2xtE7;PTBi*uj;zB_Ccj8i_ z{yXS%DHM_fFf6m4OwJ1`m2LF`i*NJz&V7_hL`i|f?PH))-W-+Vsn^v;%G}F~6te<* zm!+E<#Oez@xz2kb5TS!jACA9)9Yi6?tSuVqY6&ybm`@BdGhRQNvSWncBwgy9!ZsRt zy=F0=h~n%5JDP9)Ix@0DsxTZADao8tT3{qNZ?k`Al3}dUG^A2CPq`ecLpj%?mM@5i zyZ^5p=+8@Gc}zKy;pfr*%Efz3r<7 z*KGAX>a&*sMW~sV7AloA-UneDJ&)5prYAHS{1$IfW1l+DXi{ZK5Cz1uTYR>_!aHp2 zq>W+Fs##i3@Av!4m;`Bku^yZ%pRY0ApQ&g&WZJjYMCeO^Z~oxx)uC`__wf!dF-(X7 z9!CnQO&c4#(GUTU9Bcu#2rKpTmQwT4ab?m1Z=UD*vel$L31{7OHiN#y9E^asjPfGw zJ=N=IICvBS;d;=dQ#>xf#77o(wqyAbrBz5vQu2v2qBEXJ{*A4``;~``^#m?A%(|DN zNHK_=Q&Ujk^ z*!1tSZDyguaqydGQA#j?l+oQS;Ny>O_5fv#a#iRh#;bC3t$>Iusdz+P3r-eu;qXxkP1G^7dqj zsVxfcXZeio_W*08wkj5OY3fE^AL@%tsFSp`&iLYj&smk(@MoN2XIJmhBUA1@|Lda3 z8iRP}XX)}CPuiIj8PtScN1`SgBAvv6Q!W2P^i#$qAE69OvNwWhUpZX2>D53FU1Rev z6L2+tH@g8Rx^tM@5vvkygYorQ(n+KiQ)9vfwlP{Nl_o)FmXo2QO4<19gIO;FqPO!p z>aSej0A*WPAD6z@L+5+qJkcH_XJ7-8IQRl z87_CW(CkdSSjF5!smO^5w=F%#o)s^6v!mM@G?V9?GJ78Pg^Htp8csew^tyMhf_-13EHsrH%Q!9YoNzA!0ux~_*joQv{(L~b8%UYa5 zyoZF5Hx_azw8fU+e#{Cjf7O_*G?OWryxiUng}=DKMrN5vme|#Pq2HUxJ1u|kQ<~6?|yc;A-AZ^H@W71MHmxZ<2T#L`3uY zB}ZQe>Y+_*A(HXs(H(oZgH*jXQXAGI@K^5eNNlk1oLs$I0!eAT*@~^f=6T&8j$&O6 z>kK-NLw0cCQ8!G>RI9JnP88K66u&984i-8b^7fFQq?4yRrKI-T^td>G0U23fn2A?I z``UYw*Kd;II=Bi|JPt9iABKizNu$~o5k6mrP_4d7N)u1oUQ>t;`0UG%{9!r0*w*hD z`dT1KO7nX2+4uF|8f)Q z-;M!8p~;T$JF>IdH){2=^gu25Nf(V5a6tS+Gn?5G1UM6p=I4jIg>R=_jOOAQB)4B& zt}V&89c-Lu&s$8bp?$=peR_Ol)4)SDTu5l^Je=-R=jxW)Jwt=gTwM_hoZuJS_mXp~+z&^IcWaY;&WHC5F~WS~t{1Y*1u! zB~DGO#^WjzfmKWLn6&r!nleTq?`be`5aj04@_QhFuEdG=gM)7E6q}|WL$PTL%F{#P z$b3pQN-oA>s>GU&gKsB1cu9?7@}pY3)h;FvRKDtXNW^jAt+T8gGW}ody=7RGYuh#~ zC=H@CC?zE=EiiU5!309AIa>tdg*Xioj!#L3RrL*$=V4V zuYJl?3EtT|CWE3zDy8yx%y2vDG@oZf7&Q5s&s==0h0bDo3{GsfSEq`qbHuk+T?<#5 zd0&khkKBh}DQO=-%4Cbpi}QK~-=COZ%o#OUE^mVQ(v1BInVJ(`Tl=BCNoX>>T9jj| z0g5#-qvg5xW@3Lb0CM?(*Kk5&-{Cw*^(@#m;egWiaE_gNon_(24dQenfnq71{9Y)K zh@XW>dQgT=j(b2_vSfQTz}Yn3bp2qKnIN$UK8}_@BUJx_GH*bxvZv{D45PRUx7E-x z&8w2LkV*drz$}jSP+eq@<=8)?gMW%`;I1Cynj` z&E}xWpwuI*NosF3W+=u&C*O6^ZTmOh#!p4$(^ZrFM}?tP)aIM8=*xqED~N|I)Lop~N*WrWAPpb!{H5X2{idskli+V51!RZGU?$(dC$ znrYRpFe=y4GN~0<@xp}RX1zIFId^4Vmz5oeV6&gs4=OJyZCU)xHPG3cQ>GgLZ&=EG zoe-KFZ&4N9s{H81uTlDr=_#4f$}W(~j{@$>c&(t#!$z zP=-|(EIaqZ5=EIoRD7~LMiCr(3`8BN!lfry^?Ac0d|_sx8)Mz|FO!ou7?n&A8wUKd z3~cwPs0Y4Ex2Pc&IzIWnW+qC=A)W}T$#8r$rpsAHz2n8bLBf(W2HdAsQ4m<~N)DI@ zoe0#C_17K8`-qEc4iZTCE$@->TI}C|N ze@1{XAIT5hR_f1tofCmgbB#MuW$kT~B^j)?)4gx)*bgl?i8YRDdmiHb-YAyS>|vGV zq&1*)K%PsZ{}hHwg+7ci*Ytprf7g9+^iIj9B+{k4emm!I825^-A{|y}=T2(&H8CeL z+rAw!jLRO77qXgp+pq8oeWXSZEU)fBH=jn12Tg{OZ_73Jc7A`NFe%KWkJDp@0LEl9qw|IHm-!)l8{;VW#^6y)DdD)Cz5xX9d+q z-N7W(k1$_4K#D@|hPUzz%al)!S_#HCS;cW?^Nn!g_=0ybb38Dr81&4H=TkX*1Qc<% zK77x2s~uhz@&aU)Dv9AakKMsn`|G!Gg4B&>D+Z!7tYAjG5wA35qVnG6LnpLeqbYt> z`Ka8>KUU>#0^N1Tr+KSLytQFMI<0&TCy!BstlnauC^K72hm!EweXMpzST=5o&n$nk zcsrMnLR&h(=XJuu$z}Tzpvd`Q z;Oos_>=Z4&a+_$*t3C9%e}gl{q|Me|&Ks@%z-~xSiZX0RO!p2RK6*RJpx~sK;=gVx zD}4ExJINsnAU&ig=HFMpl86}7+QZrOUXGrr7;jH~SWZtP?tfkIu4|Thl)-vqtcaVu zomD~U5E<5_%?#_-MzbUpunbuuCbSFJKce1&7A!+5+7ySoXyC2>kU7tmSnxqUDZtoD^YpETkXdVRThP)djkd;MG>3b=L&G9wuMB-bBL5s|gg#mzR`QKmcLreB z39hk3)fmf>#S6b-*KOb)J6rB2OSmuH2zCkU>E!!usE?eA6SKcP^-ODuw26kyT|W6} z@@f5bpJ`!^Q7Vy@M?TW%l@L_G$2>)6`Ypk3diKsZNEg3}$4-2DS`c>3epU+2Jy2!| z7b#IGP43B^IUjs|hP_V3G-H);xf(w)t28T=+yD6dXxsmnodJzYg=x0P)R1B4V45JCp9>-m@O0X_h%=V$CIaicHFP9R39*KZCu9rE-`9X1@B zl~HOdqamH?uerfWWOr5?>M8fv2{C8fM+?GNx~5*yDI7C6Z9gQTx;^NY#1aQNsA0KO z>x_FA*>Fx_k)<&(Mk|fCxR=3zU<#Ku_LFOt)yOKMqM31dA*s64soUKmF64U5H?KpP z{I)l_ott6#2Ag|`_?#`vE{t6>&Kv)g%8Y zp$kim!s$&lX?0K86xXqx(7{1IHWICC6_-LiGd3I1=#TYjz(E)d9;Lb8U=Yl3& zHl8~y+ITM7BkoF_XywxJ<|aDE@T|H=JSBDXW3=j+GaWWYEzxQEE~3W9G3Q>lf>oV( zQ|bib52g}x9h1~Z1~QKK_s?H7dR`OR=uUNB-qt4B)pDaZJq~FU*{NpZkqWgm_S=lH z-?=x%;14MYQ}lL&jyKYw%j;MfKLEKq7Dfs+&$7r%Uml?0{6S4L}ajvgx7w zSHtyxKOQ{R|Lbp#Y?n+zU05#Fw&+Z3oaFoOMD74R;8lbz&TMr&Swf$ANoKmo|Cz(z# z`Wp2(d?m%uP^83DEcvob;GJbass1;;z8YyH=n3-M@hll)so5DJ#Zp_w2G`@epqF$v z{LuDyYD24d%Ph6c{<2jpmkl)@y{wn~Y?UMsh%06~tAm<@x$C%8H-+M4v-}O^YlM$m z8?xE$bjje4`<{ss4eXzxccHkH`h(&3?^Zv`Wr7xG?pbtU(dcgj`Cc-w(TzXh#p)|B zuq=#jV1}I?nx|RDDdp;vH!%}+8vWK9zvF-u^8wQ9QLNqgFvmlPwIA-EYQFT*bhMEA z<(GU@k0}70b6cOxKi_X@6<-}HNHN1aQ3tBIr=@%!iP-!)!&2tX#~nBvMz!Al_<}?( zSRwi2;rQOgsY6J@6H+W9HlBS8$@Lp_yF{gUI9vLYkL1foz(RZq zcdpep4BW)`W+Wth9-KE=c1a{%>(%XmC-y&|f}Cu$JmswKASY2Wcyx9Fcu58l?>IQF z58lmsN%Wzf+jp|m1HbNY(}aoEC2~g1$0$yTPPQflkFIQdRO20){@8Y7u4*M-#Ulbn zgFBn!^|PDT1Zpgd)_NjQTc%O@m;>jYuE%Kkk_L`vt72bEdH8L z`D)s2ACmH<{Q^4jkuH|c^Zsbjtf{sX@Z0Bj-)9StqW2rnZD>JIdVK#b4HFhHN#y6% zAy<=e=m%_)RA_le?(1?U1J5H;`Q$UgqRIE1ymciTMwDkb4}B=K1r7V_4r>r&uQzH1 z&A;DMDN&VX8r^y8nUZc1)v^DiKtiRjVJz!5~6ZEycUWdGGUxXtTHsQU9|;jYGTn zZ=RkzYkrHAzcDfg-)y~|q7%6?e zu(AP5c@a#aOxvZUMF^L+w54?)5LiUvpC>v936*Lf(oVY|l7 z8q!_@?#oUDY$~_f0`7j%Qzcd_zQWlObW#&r-HkBhFhabUYOuo+_y5HCjNQ!{SAnm4 zBF22!Z>TGtCS`m;Taforx?ctIhnMkldDP}d4X4HrEE5dPcYjrzY)C~l;L!!A`5q`w zUH3i&o7^rEp>%??o5{#XT0Ac%Y9YE$)r}q+6j3CoOeC|j{_G{ zgqy47!w-%=izz75V1S*+$UWgD1SdMcL&ivIXr;ZSnX?Id_fEvwkXn`aZ*RKB?ogLMD>IG z^h!o81j{LUr|dU3ep-d}+Up$ejA3EWZEA)_Wf)DebvAugE3uXX(&}$_&PR(9#Lqd2 zK$E5~ePqWC>X7jYriuuM3nP|#eTy`mVw)ABm{8)YElrweK>p=-V3+xIWyL*v#~AQA zW#{@MXcC~0({U|WB89_A1ad`Oj@H6}XsBj0hM4$wZh56wueeS-!f2?#L=E1h-2(e$ z4~#=>^=9P{$e-K+y6v(fte$u}d{q`*zY0=em5qk@1LLRK6F*~V2@9iHn|b)6U2YeS zd|*>D8k8>ZDDc!Wk2WNI{JmZn8v4zP&EmsUi}ggs2)Fo%^zCR>2zR(Ty%lC0wY$Jy zxb+(KK3CC+Y31{_czIZMXbcrd>LX_7;yX^Lwv6;c zdP_6K?pQiL>*+eHDj0x^`XimJW@-1~oFjdoHq@jKof=e3J*&1&fKyz5?HBq>&z1L) z&ktW^xEK+{tXHXRR7#fZh^XhQ*f~bo=5_Yu+>DF*<#@)=o>r)aq`Z!|@EGI_nZk*G zB#TX>$`!f`yyFLKKORrrGFeFry5d*9btg>SYOCzCChmiF2fw71FGn51@&D)4EINo; z1A$jsj}t7>twynE?`1q#;#Mje%2!zKBjtehVD}~0-&*R478{_@4rj252&3hG5%Q3O z#A)Y(xxYI!J&T)TW2Qi)f-+T&ujTgHkr-$>7xjV-A0}EQ7cZkBmb_KRJ@x5<5c1cz zKYzG4KYYU1-F$f!V3w?rrbSv|GlsXsJQALYkCDJv{Jf36$oA}jbaT9xlw#uTc6R`# z6iKa}2Q%M@#@^3_)o4ykGa9oVm-z)r81^oZ6z{>)CM%9|J_XYD->rO^+qx0VzF?Tc zeVhC-Aq5VO0RIC7U;^BE*Tdl5_a2~wfGjyz4U-DzpX8(8T))xlF~@jHHTksft)!^Q z4zegUV4oeWdrK?lWLRww0VNhnnQ=dD|4F*uT&g}L`79pY$8_;?-fYISv&)7ZVoJ~& zFkDpb+FBPtD&zF+@rRs;4c5k6z`9hRN->G zuoNKD8F*hiUY@N3=zjz6v5gUwGx$Db2tICm}~{L1&N?=Hf{61GY?^4+_SaCm+$=bn{nWE zh&m!QklUhitJ6%x`J=8l5GO7TYWY;CZdYKGswPfWTFq~S=e!>8jk!AD-u>u*22wTk zf+6?1X#0aIcjC7)N2(~JSr1gQtfxvT%mFZbmUqSg2M=s=3v^B<9PMY5t(1&djeQc2 zHU!-fsTfdT+Yt3}i!tvPFBi>{2E7bjiEJ%Xc1eL#r0}h{{Yys}WV}F;Qotk2p8db2 zfaoAr4GY};bct9gYr{+I10o}kn*r9u2N1{vW%C#6G|#BCo;q2M*AR(Ig>*!-PJVSb zN4+@P0Ie(bbiWKAl>N9Xn-vcc@Au?&dMiJKa#g-2-pOw@9jVHQp;kac9a5~(Z!->| z5PT)}!d^Cocj#arAqT{N$9epic>Bf!Pvn>aK9StUi3S?($b^e6diYwuV{~8K;Ip$k z6AHitqqR%lcd*nBi!^pQL}ecDMT#(=RxN@LDA0o5i4=8$>|e!lV;*h`t?P{CPiAjz z;}|15V$Ef|ztPD_E_JmwBI-Ue#|l_QS9)f+kL-nUbt>jt8YK!kwI0kmsF0UU8~65m z-hkM8PbM-|d?njDSm|gRzkw)t*%Yy@$QIo2}4*TlW=XLQ6jee6%*6*D8fmm`1Kp#=S?kLn)8 zN(d5~5fus=O5;DC%W1^Zr<_qeOZY({Tsnzup5co;j!F}pb(A3Jv7mN9`IO*{{Kgfm zLoU$(v~yRr{e;PxrFxIp;8}7B9gx7sT7@BI8dI-O?+>G)lOebZEt-cwE_S-~KCkgy zIwoGI=Y`#;ycgLDG0#y8)=c9ojC*1!fWUzp^>AY(!uuUj4}u~gyC0WAxI*~O(AJP^Vt!Y#*CPpYEB@2?>WKmHkRjkn8dGjkQWFuY2@?cD@0soAds1C3ljR z-zMUR5P9WL!E$_^u+?3GmrPb?*HWS6Z4qsq@D71A8F3xdykD|WS0=#ng!y$vQTC}p zW>-X?+?E>WN!O392SsudjGa z6q%{{jGzL6AMTFoizErZL+^as65@}??Ku3v9H-gE*E-K<0?pT2TOd_>5tZH%#LcGo z_-+ZjbCf5)mu(izOaIHXT!Wm2u2Az0SH7tT23z!@`E_w)eKkqIPE(2nk;B2@K#j+u ze_ryq!kMs$w$5kTprw&J3Qyi&&~kmtR*+*$%7dHHRmZDL44d>ATwiszC?z`xu(mtv^KpkLQqqMvR!s{{Fv^p#S{?|CLz$?=AXg%=}+9igwky z_5<%>VBj%)kaEVY3BX#hbpZKDpJGaM7S5u2olh6yuy~V#|MT5WbiKwnuOHa|jji8n zxC3zhgY;N#BMp!Qfes=7S^(1ca62v`K@hNw{a!?5EP#dtwoB^pydc=7>hgZ&U(%HB-<2Ru;^F z4?x*jY%9w6OETDu0eT`?Kfc_qwwZ1L(AG7UlW-;k$93Di+wq|^1ByXstTCU{o0t>LU-|HZr3 z_nxz5J@-3(Xzc>9i&FC?gD;G_gk#0pPUd`DE987GBoq*rkY~ODf|U<1OK*NN$`1AB zN?Rpb2B;NG0B>X>z-xtZYMi0*dfhqv`lkrpi|~6Up_B)N&p-=fC{I~1Qz3>3Fkind z(23}6o^%gG4p=Yn{TeiDJ;iiBm*CN8R?&JTUwrt~>H)%6EN%67OdK@~9E=xZ-w^j}ny2^D`Z-|FQ z4pJ(`s*`zEf2$|mUfy(0_-Ns$S{>!K7b2V8*X_qfUCh8Fm0p3ww@Il8aMm6ybOr}3 z%RMkS>9VVFI0h|#_j8<%Bl6aa&nrE*cgDhrpMOhKRkOEry6{5rIej z=+40-lAmK`bI7Eu8Y+p`i?j>w5iB*9pWg{ykRclC=+_%1gR?)8B7CM_Eu#WCeKCRU ztFHaxr0mOVkH<@=yl`^iQZ#U~Z@ZxnPMP3{!LmIAJ`(m&1GVE*#}oAUN>c_xku3&v zl>!Y6jrNZO9LPtT(_s{iXY=FbE6XNPZE6F z!3%V46o#GHQZta+T`klk^{ck9*r#S>`KrZ%#{FdJ5_un&%j*j5l-?DpXD~I%N8dTe zefX{G)#8&T0`Vl@Aqi{0+{Hy4|7rqMM3cy{PtP7wZ` z$FUW{voX5ZqpMal$?*?rnX>bC_Wy-iZh-^(+Y_@b+!rYv3^NUO5U)^X1!1-u;iRY{ zmh)ZcGY8hcvPN)8y^v853lWg;1P%vYk zbik-lxdvczO1+UVnI|Scko%IF(ItZkzU`*nepU2byY}hTCk~o`x$WlTOw6aF7nX=j z4%45RbayF*{U3e6np<&4>wBCQ9qt6&f-GlBHQ17Gmm02ED-@Jy*Q1)N6omA=w&)E^ zyB{I&j!FH;D|X+B+VT~Uh9FfVt^3{g+zABA$(TMOt^~O_hMl8_v5zQ+RKcXWp`o5g-5;d9PW?UdR)NBt_KN7w9?ID4{9H; z|17p*rafi4FYs<{4S^qmm3gxQC!)x9VJ%pUSM^)a+$9*<^)$^$>U% zJ(t9IavSYH>_`hmE>e0&Y=)qgNWHkeDyl)wo_vZ9_YPo@2Ey&Nb-ubG0RaHb*wp!G z+xj%mP(f-mm)hN*`LKI{GtPCMhYQ*0t^$Hw)J6Dwp6bj&T0urQ2$OuzYcYIFq*y25 zM)tF*4%;0#+*qA9NsSqkI5!$8QIpZ?QD=rW(4(%{Jg)wPOt4$vg(a43b354xfA*XS zz61>KWQhAEhv91t(|qUjpW6KIKB1OMuw8E#PjLRBTl&2(MJf5Ad=d+i0;=Rt3c1jG zWW&bQjO^Y`m{T}}&hl|ot6?^tiAWTSIyMNXuQD6MIQKj)u}RBF&F+2k)s33hYT_gR zK2f}+eEbs)Yc}inxiwhB8Pw`!dlJgWckeGEydS;ywV2MJR&SY6zhyCw*|16H{tBf=Jhzz&B~QNEb2~Fa zgX?pxl1~mzDgG4*XwpraN4$CSc{*)g7T(c>ALJbA<&UfPT0SaV5Bcr;^1@?yWa#^n zgvd!bSE`cnKw?^J&xl2-QSbYWS*VkoBf(EcV=K8x-goAJsMo|40O?p+%|wUsUr8Ui?rdViBny>k?Vxu>yd>YqV5Wr|6#D>@?|?S6x^k7V5QSS%Wul^;LFhR3iY@V!7=q%*1TKP4*r00puL&fgGwVEFpVa z_OrX;Ol{N0Y_4rj-RizaSFOD;_8qiJM56xz_ z5vAn-;j>Q?4m5rBh^E|e{IOC)A{f9aViYAoX=@J#+_OYi@1ujd8@F|j=KP8E0s)Ig zMPDz?!ec&b2eH-njWa^pn&oG>UvvLl%e>swX}H)mne}ThQ|??uWQhpjG$;WK6(mw2 zY0^3xe{Q-zaS(7*QF#y2-x~y9+9FOB;qj*Go*CDLTDQeNu$9v}AG|&AKDmiJ`SWhh zD7)o8o0H4FS1_Zw7VoxY#etObq_vWqex6E;maCL%O*EY$QGT0k*|%L^dJ_VwC{tLg z#w6U)*R`7kl3*p&3g>8I-L zWnH|MU=erJeFGA4<#xyDdQfW;&Oii3AJywscs$E z`>@foeG3wwLNVL?!=89?-ASatMm6~jHneTt(!ddCl2Z@W-9JG-ii`9d_ZH|M`BD>@$0L> zsQ}!p`GO`> z?BdnjNYY76C=|kOfkwTa+~h6q2wq4Yo1{NdS`eL(1@|D_Hf|K35htJ1E6`UfKV9}ii&V)$@@5vUJfclEC7DZm@uBm2-3 zgbxcGvOni|SKa_Hz4$8RA1v45b|(;PEf63!a!V{z{bsF7b^&ajhfirJ~YAYQo>nEdft0?OUYuYrx3?89JtrN(+T-$GNYcv(`e zIW=ftJ%EuazVsy9Bv`Ds$!}T2GMn5jjJ%&G_-?EHW>zfR%nHn#n(T(a*2dl39?1{} zbW310^3{C9rzPwpK(LFtqrEv)gr6?)$pD${@2~obDpR|+qU87z4VS}twQJD%>1E|W z1O3_G(%x2CP{<6>h|$u@Mak>v?@Bzs0z@YI!wY>&&_~vTAh_Q$2(#req zQcw)f_D`pU@@_fPZOvTQ+6N)A2M%N~BA9~y0C>CyS?+x}fn?#}1l zP46fA5s%FCcC5zJ&*K{Zzy07j0H)=6I^uUMwOvw-rzk-+nESR7O zKL`9Y=o8m(&TU}Sgx>j9SG&0Ja}C61J%G3!C?a|^Pn}7)dILNi%Fr)}p|doyZ}=p_ zh{(6Mw`)$$OPo!n5)()eiTevVzoV9-NV@2>FXQpH=i3%reO>8Cp_uQfsg}sc%g2c^ zg*|Cqy+0>oCQu^Jx_r@~0y?2(zGZ=CqnG>=Z& zM&rGRk$aqYkBYINS(~A`nGM%yjR5yum`nSaugx3&v-s#_wez1>Tr>&j5aY#y>pZ#=zOpmQORiB zzy3Oc&Vq=b>-rN99ETioD=bq*(EjHeH;NsHLaine!wy-|t%;HQA|9X|ZXl$29&%;c zmcVTm=u&AB*DT_8@E8^Q;iDG=U#&J=u*rEb>z#H!pjM{0V=hk2j_u0LKmyt5`a%2k z(Ytk(+&5_rnad<3Pn}~=3+0dYCwRwLG_wiFc=E$Cfxl&cLiG?R_!FPn4GYYMQ`2N> zjG-QHPm7l?TNU;KVYCjrvHVxWn;a`Bl6LtP{7NovWoaPz55Dp)Z^@024Cdj*DD^j1eN6@RfUT4*( z7ctZc>i!u}R_1HqRR*NBw=d6*B+f#{L0^rTYc^9FwhKGEzMH*O1~iLCg69XMUg7~^ z@l+S8Gj<%-7jI`1xh}B(hxh?pD%6qifw6^y96PEeMxd>UHyNMXE%_@KRIKP?ZqJc2 zGk3QLDvGnaWJ~rkC1T0Cs-H9T*23z1E~^udhY=j;@fK_vW!ONt;CELHF}dS8*S^2< z)NwUXnc8Ng$0%0Fgo4-d;G#H4g;6d6i>l5u;qg z3190N4?Eq{_w{`O-1v3$(uRtK%)v{-|@?fBqy0=1+UgS38(yrL0ms@^eXoS{QCM+XUm5 zlBLxz)IOJg0aVJK0S(w|us9?|UdxF`TV~T~&ulkOf`*gd<@5r(g2grb=763T5hJ-#H7_6Ys~V6WEJ z*3NAGJlgjWcnoKF+VzfNp^4*t=RBh}ze46Yk#nLs$a!iVvp*lV6JwMboIa9G5XK75 zw9&uzXnZU2!yaTf5P`st5Pfm9G~1!iP3Fa<@-zBrBLeQaGaa8a2kUokIXnWg%kKyG zS(K|l#bBi65&f^*Nq=)Y{c$!KkEdcdoaXImhO(jJ-$9itE+yw!8{%}k1aJ(xVa)g} zG}iR8tA{Pj6ATJDdN3{6k`lG8H}G8*3)|LK)M4`b!*cW<+06|w8u*MMj&>m0Ml>6b z{PWumLz-Nt&dFBTKAXug6I}iIa7Dud1>Lk%cF8fP#b#Z1Bg+-DjzOox(fs+J zn*&e?s3GgpOM91cIxm141>ULCd~l(R>sn0a+&FR_;(q8!-=_Iu^ZSaWj zBW!p<3A23~{3G|#^r=_Y`WUmYz0HR5k)TABv3Tk7TF$8+qh5x09OvGT1}V+Y(-Aht zPRo6sJ4qxbEA3cXjc^SIWq*hV+wa3s6sa21Su)7yZMX9Lv4}@!f#;RoM#F4W9Qm)R z4%PyIwSZ%lDuvuJBU_@-hnz6V+6oqbNKDO%!5`;Oswc=8k@Qk0fjYyM`__6oS2K+r zFlzQusjqt%-G*AVs~Us~)TD@+`nDkE-|Zf~oph-}xM3HZa;W=HD_ju|*9SF*9FCI* zF?IT4zusfBe3~c%y;B1BES3k2l#hFdzfbs7(YZU{{6452q)Ud~CHI4O!x-of>|C^| z8X!)BpVeq3K9LdP(h}&_I_pp*6IWyxV?!a|emlT`mto+`fAmpU>=1|Na@^xEkO*Vj za8Eh~gz?>zd7%rBebi)OyCPhj7AxZ}SKTn=V!q#3d+-5*z)8^sE) zTE;&v_ZA8Sn5l*$8(vcfPNDqkM~~-(k@x}{)E>WTKpzI~G9ac7q{65e%Y~&p{Xj10 z)Z46JFtYv*fsZPDye0PIkD*GC+Tw|9jR`FYe~vtzX-5;mYh|9(1jzali_2EFVm_2@ z6u6RqJTEWgZ9-e|F4qsmGvsgu*K*^r;^~&5j2zqTDHIUoBDM}XQ?0o}h__~t7GXy<+HCF8fJ{lcP- zeu`M)Zr<6PzP(7#x#~XGNyP^`5x<>lZ8Jolh$V9m$tK}}uv*RnF8y!V4+XR3p3FkB zWMVMo5=J@L`{HRtKoAA%b-Ra)P4pu3zwY@{VswM9$Ox{b>v|_^Zr=h^6r1^POKj?D z`6@js2cgoGjhp;fR|$J02U=qA;6JAT=AC=!_Fc?6g-?k3lJw8!a31is>f_5vElfC; zyPs!ghv_Vtzk9k)k1O}Dn`nIxU94-rVBy`?!Wgm5QV$No#64U!OCm@N$mOW2tfxO| z*WY~v3NLhGwuc}roZ0hRtjIsBVe&oatBbfqr$;UZqlpZEk1MKQ$RNd}ef^yU2%JHR zSs}~}KL$sU!pSOB{$Z1r-Ff`}7xB;H9KZL!--@5RxZ=L>k;q z@p9yoB;j2i)H}@|Da4ayTqD_Ude#5q$SC&73ss2xJTuHjH>Rq)J$z+MWk2d-$KS6Z z)*2hiAfL!VJF~ZK-4=BzTY8x0%|7vXiHgX@$8FVRgtwk^Z zJ*`No$rwG9#ARJi2>TMic3ts8&2WKU8hnyn=ePeB$>oa;xjpqzn(YiHehg{)mrbS@zBd&(OQ9!d^lwaL-L8|Kg(Owj zBngvf3t~(p97JH8-8ulOoOoR)#CE9NBE$LXymm6;9C zFmu~Xp!=eo#zqYZyGVs4bK|~fe!t~^st$|>Q*ng>s!+M+Yl5s}g5iwc#D^62xc@WsVgC#culryol@~3Wt;*2I@inJ#cN`2k@S0IJJpZJ*@V!}%TfKcT;$QGoi#zf& zY-k;_$7{%G&S~{5&9L`p;G||X!QBP2w0U;TN++8Pi9;zxya@{&3FML-Y2{!qU>f}n zv&MG6=Lg(87hzd%J->!q&jv~=OmJNNVSXYqf#ndA`Q}dACv)zxXyny51~dONns*a# zmM*$g^>yd#%W0daYaD3w%FH_MO3*p|fbo_N%c|&Oe_kjKd$Q*idY1I@*YpbO%eQSi2~ab>Tgr`=H>tA z_C$hk#{L~QyrHW|f(k&a1g>VZc zU&-QHq*SX0rGJCo-d_J77waW{gH=5-vzG{_xQ$CW(+O~cT`*Xo&=wPO&sBf@d(>ig zBt8;gyvlgq>3e=`yR^Wsf5!0Q2{!bZ!D7Pi*CC2z0*rV+bP_WT&jBLs$@$FeXEmLk z-nQ84lgr3R$+_mPb4>kj{^B6v?Y^*^^M(D{(<=_^VmWY_fbNa_aap2Nckt*hG3RNX zf1j>*k}cdP-V}S*BUox>MMW@k@!7_Kcu(!u0hU|Iz4Hu^owjC}x0>X>FN@sZLp@-` z+4QFmwJrS|AwTA4_b9UFYY!PF=WAYmY$L{J{!dbzVP?#!kVv${B5>@Uz2>wLa~vdOk$LbdfFiAoG^iW;Mb%>(cF5bBCH;Py^v0ElNy@eX$&+7deuFp#Q-GudR4~SLY$UEJ=gQk{dztv>;!G(Z1 zb#q2$XSn5vm9u5_Jw}VQ89@Bk%!Sit zn6Ow38+inS6B~vo?h}X6hkdd9Xq25nzB7$=iwUx%yJNaeHz{nJziNAD-#`EIBUhO7 zdZ)}S7)0Udb$>PjbRkSfawp4auLIKZE?yyjjSzA^jHTYFXT!8XUu~|DLLTxEX*UW! zf+E=Mz{9PunpGdYT(j7zJUsrauf8#w?~Nerp_1Qx`qX0~^9^)yK*T2D7{yWjU{PW8 zaCNHoc26`LBhAHyVWR8N(X(o{q(Kl1WjQ-vtt}l%+j?hL<&;^6ya@!wZV|G+ncX%QaHSk`RU-2tsS2PlTaI-IN_|(_XfYZ zKY+8VOlkcbNa7+dHy)5onVBZ{hv2YhbcS@+>_yU=e(%WsRPZXzfG6>K$)}k-wRL%? zc_+=oHyg3jyeDEtRwtY9mn7iCla^j_Cp15bIrU}b#Ik!;6vU)t2rjq1IAP^&`>3WPnNyboQlz_wOo57d*;Cu&8j)i z4PV>m1Hq5}gv@G-M_Ym%$d|GJ1GR!D});`*o?>rHogk>Z*vTZ|W{@umb&UanP!^SK;2xD-PljN@8Z3ff2!HINVeD$x3 zTxnm86UdCo>X1|EWYpG&hEx_>hhzi!x~#^}3&WbG#r!7QZV-0_0T5=l=D|#MCD;y* zrQg`m!CBQIl*&2%;l`0yDLiRWkV!olV2}{7Y2EXD@uXaqQd+q?f5c)Dq86C`wgL=%5!rov1)!*Tp&2`kqVY6V>`_jQR2THoo-s8cgZj(|Iw zMWMfI0ZyKv%&2y0@_GuOhCK|^cD?+_fU>_LmbCs_u~CPsdI#OfAEM2Fz8Kcf9$u|} z)>5QhjvZ!n5Ib>5wg^)YJ_5N`>ssqS8HZk?s(s}f=N)rAn(!K71o|bVB{BfL$BY@1 zKcOA>Z@?xUHteX7K9Oev)=_1$z&`4U2SM3N*Kr4uA9ILuK!Bn#Io5Q#ZI@YfsdrV1?Pxt)+ZkTS1*%TM-e5h7q2kGhk()e&$Q}EzeWx=wOUtpxffMKV*7whSN*B zhd?*s*^3Gc6OeYf+xsDyzJ?zQs$o4U#g`cUZcrE+u{4ARqL8`V7c0b|b94G;V*Jm6 zu?v76jw&NWdS5)PbGfWLt-ZUMJ{iO8L@g0QFl0qt0^+=kPc*ii)TB_g8Q+xN0?u3? z-+VP_9m}aEeM(;%1=*_4-54*Fd|(=>;NIYSm!jOP%{)&-C&D8d|EtrE$N%{jK)LAk zrZU%l)pqWM1XCVo~}yt`ZO!)Tcd;Ac}|2W6LhnkbhU;5Ftd#KS9r{m zXUHKB`0)0O9AO?!xBE>~0Uu*RJ>Tbp9HElbEc`d6^6orlLs9rxvjQ<`-`=C_0Uf>F z1ipNl51(Rp$ss*kf^9=B%q9amyT@I3dIJ;o7AGm4CC}k&2S2#S9P0^8PG&GGB03c$ zBB>3)`L(fnvV}0`e=058u$D}ZBlFQ>1QC$#P8Zz`i+V2h-v4v<-e=w~@67woJTvEu!#J~UmlyX{zZ@7M zg%81^ZEHt#QU+z1$9-adzx$Eb+&{fgzf4_itmJi%>Q7pQ_FoD37-VzN2D5$}msezGb6f|XDuXknLh&BnHMs{A#p_zx{)+4x zr1{5x8MQq&``#B_eB%s)6eq>hgRcnlW4 z!QW9CO-Bgwb=SiFkxD;_DTyJbxy>;N`~a@ZsTk_fcj^26;V(X_Majx6R5r|F7U#+ce@EP|1!B<85YnDh#f7N1xt*eVzU5xN=_x zalc7Wkkw)^-K_gJrsRMB62MK>UA2wz4URVv4;huz=Kz3lc{*$DZ}+7Oc?ET0>@S}u z^BkOnSos{l+j596TzTTyH~;<1g9l7u8g~CS`nSmm=UxtzmD;25-;HyBoDY}2N8;P# z5L{u1LRtQX5&Ze%IdUBzv{@`_}7@X)xUfyo)(t!{BE(?DI3JfF}kDRv$*v%yvco&m*pl8+b|u} zI#>(?l{8pX|9W|qDg0kXit8V~{ZMYWhdPR6H}wq}J=uaEYcekx6n1d=oPfm1j@LXM z7XKc^cQ2m;k`=ei3ct0*ol(O!Qe^vG6$6bdj#vm5V!6w&(+IxLf-|W*9n$U{Gq)tny=yNjuL(t zgpqC`IfD8thuXHrY7*gmU!*OTaT0WsnY;=kz+CPKmYVwJD;n_+g$Y36Fce-QRf0f$ z46}i>cgyU{lxNUWw1UW5*KHzb-%{FI63|0*f!ih~7`dP(jKhsp?!S|6{_wX5*GX1; zohOML<#!oYH%EcGJ==L0qWdGm%n!?~XR00wxb8&fCFzfl5855zo`GobKmGG*I7@Ae zX=AHRe+(~09lR2NbJeWWe;-7NvkWqHQiIj~ale*7g~Jz5OOlBYB-B&64G?PN?&%m(LE1Lj z0G+?DCU!1qCbh^C+x)wzqyI5sfQ1AxknHH$POd_#Y~X@f<<1{3e7Q=1c7*fhn@q?k z|5`PO!00%Ph6#h3q2)t~f6SK$h$)W|0Qx66HD;+l$wE4$09)J4@!3B4zA+;+w2%`a zKZKOAKA1jw-4N~O7Dg;GUG}LfFG*1OU#k~_4#i_irT9y`XocuA{Y;NhNdm#{uHvw> zVFAyR9FLc0keITXc__3`G^P)qnkBl-nM{lc9Q$Y3dAo`RAJh ze)UgYKo1}MYiD`-3A8eb4G%!`{&U3mb7*nE_QdwrkN;V*DgK|fr?$v0zU0s~C&pV9hjK>j}*V0T8!GO>Dgi>YtuPw<(s-y(9l)&55d z5VNOk_8s1X%_NewiOPdgW3T-J;8fz)#PE$2ZZ=ki@#ie9isu@B>B1Lhjk^0smMuKn z+}_fDbIoq#z&B`r#g9P>eMdK#mgyDIVw-;6C@Ai$ueT@wpzrS=oap-2VPLl}9c+8I ze=v5dTWj_lq`ZGdMDar%nQ1&eUhNZc$a)X1xg=P0ieY)oGln-X1yOB-mOn|iK)R>J zk@zCMf){7op8=n|oT!^pqTh_?WEu3tv9jq!Rdwf z4}zVA%E9Xe(%!L4>xH@}DtZ0wSrT#pqd#8SY+at8EKBKFM~-f6LUpq#>P7KIS_B=2 zFh%5x>GITfbmD2g5l!xw@Zc8i=99aa?dHDKxG6;S_^hx+j*>O!%-mi)O+dt8;Mxav z`l?uyZMZ@W={*`T9;-nM>e=lY>L2)in@fP^_O_ z`J@Oq;iUVd^?h)=YzE!M0yX2Sh^_DJK;|dwql=0!_z8O0e?Y>gPvArZ%04s!0IzJY zt*!5<+5NL=qqwE1(CIwRo9#OmCOX-e?mG8dsKDzUl!BXj*V8xh>6j<7X_Yr?Tjp(v zcR!G`4~_@dL7H8i+p_X9|NWG|FhmT*Jpys6@40vRjprLayTUQ5(}%j+=upW*rGY6I zzp3%;N48XiK~bU4(IJRL%phkszkTEekaK+>?{d>^SB^p6a^q~JbX)pJR@S{mKmX?{ z`M(DY+;Rh_P@+s*-1Zk@*BIrVS)kXHzEhuVxn6C_FbivyfghN!UBVvt}y!!^18m+c1VJ31l-R=6XN3xxCag? zyu6+}yue->EOL9%(L|$=G`2BYL=57+LW(9!GvnV60D%IvIIQa6bn`O;vT)a>6aG-? zJ06xh&(4Nh87#W?U#p>*biglA26V~UAVTB<8m;u=F4Jyq7Ii6MIhuVXf~K=r%%kH%j>*3M;6Nv2NeB-FRTUx0hoMPeaUGx^YnCU zj9p~0(k*@3?|6OS$J}M;3%doe<74qFH^YHBL;^O);>)Wq5>9N!Yb3>sb<>#&b9L!5 zk(vPjy`t0z-?=#POE;XYNd<9-$&<%?U~YTZaw4m4HS~V<+VUODf0Hm z$BpR@V%*;N&U7FE9o%bPiS30r^%tr!W}2Nc(5q*qj2n*p80K|7;r*$U5*S7}l4+Mt zCVhCS0m{89IMqnr+X%QOO%9~-5ni24WWEbd_ zUs>zdS##&LKlqk@RoYL$?~DVob3%WFVErChl>-)@+)Jh@MbKK@_H|i2@`aK2HK02P zI86|MKFnJGO~G5fD#$!Z`maN$r6tNra=)9?LYLba!3yJG?mA}u20M6PR{&WU>&2)a zwST~1O>ge*PG^niTi0;j8yPL$PZ;hvm@Qen_Q8uFUHA-A6_=+DqbEFgwKZlLj9jM4 zg&JMB_mNq9M}LX#HA&c?&3W*`^vh3&&fVQCLm3=@Ki9pm*Q~LQMHq!!yOOGPSgnxQ znC?PaAe}YdJc=dY_O3eJ?N8!-IRMTNS1*7XS+n^q8y1ZMMBjMdDRU7y;1d0C%q^Pi z92gT{h67ChFq$q;X7TIrZ_MX!p5>=^a52UkE-fv81*u?IKknw5*82v{hcor8oS6Ef z2Vs#$*$Wr-mDNh|++2^)PB0^QFRqW>*EE9B$t4cItfmq*Z)%o-?8KQWOO`HiUZz`z z#Ays*t{rF@J*fl1drXefxx8w>aJr*gKVG8O$`1(pg`ZWgHmA*`^ZVJ9tjyNZfkRis zuH)@By9c{`UdlXqR{c@LQR5#zzB7*UL+bXQv3O`K0~+0nubio*IMsOZs418N3?4O z{OuX?rNLRZ7luRMCdC$#)I^MW<80R6uJp2gF&Ylka-?FhWl=wMTZgun>O=^C#G-lf zg+}gelG7$~zI?$KbVd(t2dlZN>Q>o>Zp?QtUb0x^$<=**Qvg3xYxO}D(#o~HV@+y( zY0cRo;Bssp18>jLiNp%O20@3ZN`on0w=Jb}qgLr}^n!=-9l^&Zm66G6tp7B>snN&u~ zUe}RGPR*vqPtzm0j0ZM(VHZYcsvtU+3`kET2lo~(VB1jOD9%Op4#n>air9Z@Wk2je zqws}bdy+*euGr%s9${0L&&hDRW_QRZO&O+JWj(&o1n#GY7uy4RmEU6}a2%+F>yej{d{pT06I~!uh927^G45(NB}Pi^XKv z_z)hd;_Yyk38mey-c(OxR$cL^c}%sx*>+ z#qCLFM_qso5VaVLCa?7i&=?e>IKd@nfr$ zJ8cJfc?LsGrUKZ?>e9T!dF`V#(zA-ddEZfz>JR_5}pnDz%lntdurW^}JFMY+E(G!zgRk)0J6zUUp8)r96B@V?`l-TE{EN zVVi8~f%-q~oDynHV6+c^h7*SGSFECqHSk+L;kW+AO6BR1I2cyBk30L}WOJT0vGwLr z^)`3=vH4(T=8apu(MXo57xoeQ-fZ|KmLb2)OSGw!KCN!2lY0A8fgkgW3gb|(x{CLg zj<|(A=O!jO(udU$o24CrUq^g9BK8E55rlSU@ihYpY}-inaBJ_}4~08QcZs98q=a=F zU8$89iDv}&4+2s_KU>6{vJTxMoQsKwiC8Z;DKuyVJAbiqApDd{;z`n=UUia-18A9w zVbma^4o0g2g~E#vPhDIbuQ-~^tQx=FoygfNxhm7RB`b}F> zEF$7^?Oz|+K=)8vGtZw=iM0(+hCnWHO(YcNVwLHb>qw7d_<-2U=V)ypkrp@q9RY_c z)xe!Ms>G-Gr~~`&Or^HFMA9kG%2kPcihJ))MwPyqubZ7jrca-V^nF>?sh=VWw_{(A zX}oh3eGXR=pxeFLt@jv|D+NTTHXY$JKvE-wh7xwrY~}0AP)LHw5@CHdO}x%cC{PS#Ds?D`4Vj zkqW3+yC&5jvK*0Ft@G((sk1-)a_V-xuGp0+E_I`394_lp;uFl0Hp!F|`x3p4mNUXzNBQg<|*ucj2kC&u-=M}1$xnxh2l zUSo@;`jlzLWs3feuk3nV>H2W{Lx#E$PpJWAdb<3YS=54wbUYiQ@71oG-*%p#1Ktsd z4@-(q#Pk(9GQpF;tN9%K<%hXi6$_}}+zyGS1~bnd0=qqeudvrZ9m!m6$Ic*Wqbt&u zm$(k`#$hzC76bOyNu!$1%bYvf?CsPj2#oG#nzu%xuJgHW!@o5Kju$#{F zCv_vg-UJWK8_Z6E{c0w#ZNbg3Epe(blVI+qfXC|zez&={y(aCfu*ZNfQoyCRR?9mZ zk%t3on|&fnZ9Hd5Rt=8f-lGmH&U8ode_ZekaUZ*OSN6#yyMHF+`oS3rnXkdFvC+4Z z%<#TwE7Q^<*!5>tI0W$pyZclvCLvh_phJ&E54PXVsa>^^2Y+_m>EwL4=Woq-)LPRU zNPNVEj|>^{3*N6VajZkH!EbHAf)m$Y54Tw@wIr*5JQGSVoJIAHb9Xc{`=*Ub@^Qpj zYQv?D+l@yEmc&70e`oHafj6d%m&7zIhTSUprF#5SKp;193Bev4ew#+Chv(P(4gW~; zGl6wdSvV0FS^l#*O9}ZRRenh9EAiKpw#_&Fbh)Yzs~q!ZbC#8pH7q&m(v?W#Y?#8y z^qSc`=MbtaCJ3C?nZGplZ(=fQb7K2CJDM1?Le)xD$v)={=FA|v+#vNLW|SsB8rq(; zOK^F-)5fU1OTy*&k#FLWoC-%tppS@Y!*ql`CUu5hSE+jPo}K`eXgdP!SEQOR>l^Mv ziCZl;qlJXwGO=eXtBhFT{3}H{Al0BX| zZoQ^bp!Z7nEh7@#u#d;8WvO?k#^@W9rzny{`~q&>j_;?9_{UvQBi4_kQ;mAIk52Bx zriThmIi7tn>-L=6kCb(eHnWjGopN=oDur7w!7X4Wp3I0)@*^CBG$(!l>wPbKRY)z_ zZ$frco_+(Dqc6tSlcD)h97>de?gvBf1!t2{Yqrnx){@SI@dsMEc6@?)Q9ML%Y)1-9 zxXr_!EjDV0RL*VKuR48|b|qX2>@R^K=oftC_{`OnzWuqWroYOXh>|*)ife z^@6h16d!c>mQ7ydjltGGph$n8`wOFgYV~RFw1(uwNMXtX z?i@vIAY|mV;F5_KW|`ZrnSA>DDy$l&%#I_^<^z3Rzc`Rpr@}Q`5X9-gsL>G90oXMB zuaM&!bg9WIp+nl3&^J=shWqbr!D@Bo$oU1us$_0cI@we0$SDD6F)bjprWxhr0|~-&7ygD22{REl52t7u--UgspV`ggKE}3GemCard73v zYUso+oAK5w9PD(Rkyd#|4-cpH6SowFM9u-#qZ2lG?Qwydw`T5Ce>`ipuZCPRo$z<WdKX=J02aivq55 z$-L|A;<5X85UtE%#k)XQJQ1bfJerJ~U~Tw@)xMo#pD*TW3})rJ3^8q=(Lq z;0S$Nq)da^RupSw2422cy>fU{&_}Bf@5Fl@UUAOnjB~_ovw*j;k9O0C(;YusJP>O& zIV=J5xBTXMrdL+xf_GF!6L@x2b#ha!(c^TIy2b=;-aIz9GthxGX#1{*+)Oul7+3By zsFy;7&K{~Ck)#@s`rsp2ml7UG23HQoarl{2veK`2^N`Zn@f#eT|FKps(LIGm=Hv5< zbcaml-%;#*VNeH>Gx>3Gq)Usb9K;M_6A`YNIVWz=x`V~v$ARE6|VvFuUe*tLGFXoi|Tz) zu8Ik$=L`lNo*rr%lW)P~Yb@`%JFmc=pG!W;SE(@HAmhh}tk*y$^W#nJurl~Ri90k=s#Kv5SOo(yqdC#U!Z&8;cU|6HEV|`V-%m$}P3D`-HD*nwe!(nJrrn9!2ismEcc9_r`ofSLukp$$?AhIs+%_;Jp>7>4Q%^NcvLehVYJcyE zWdxEliJBm%UE*w?qmv6ADj(KkxpCK(y4RoxZN5P|mrqAsHG1t6QJ>2tzo9(9w!q@O z&cqV6W<7JKgft47&C7+bY*>QwNu*wl;uuqdXi+PMETd-aHQq5Z?~X_3Qm09$^0Cd$ z2*)G2augbA?XJo13Z>cx!+m|3qV?&0X%xtHKwq0q>kaK7#g0u9{cN~)5f9u+!tmB0 zh}Sl7a;++@!Ou+OFlYCPJc2S>J{l^QA866A#?MihIQc1^>Zt&|S|$W(D-alh4h+gy z1ci_f^hE#c?vEZZdy0K5M1AwL8o8u$P{OcPT<~x{=Z4p>*|Xo zNbut8()WTlx{ubtY8~J!wWWaNHCX0k24#Y7E=i}F+Ed)<>NWb#SCLsTkK2KAuYrkv zt?p4#7ZRV_6O#1}fuS?a;~%$UK6Ng~M4Yx0Pm;N9#9wc!@an=STsJ3rPkNlr_#XGI z_b#-!aS!rb&U#L9Pon$UtpikwQ-pK3A zH{BFu{23q5iZ+-PPOB0V75NJdisBUdyQ4Kqbp!0~GR^EUnwRvLV{LHiRc{n{>&JuwNtpX^_-$eF2RR@f-! z_f9lUdphJ%!^JUc;6heyn`}fvKn>0`{}kDMnc0=~2I=t$$lZ+Ow);*sYBDfF$80sx zw=rK?q)Y!S8k3#%R|ZE%zab;PcD8mYcyN?qN(iI$x39>T`%RgH}ZXp+}W{CVZX8HeQ44zKzdqf+mV=sl9($AGf(IUHKnAG#x08;P3-DSCej+koldj}00n0iI>m1=TLRe3 zb`S_}z6ByLdopeKWAJanwh`w-RPrN5?8rD4+e+`G%HJlg#qq-zsQ&~Y71Q^;SS~2U zWlaC^=<1e(Cv=FVQm^J=vW4abUG^NLb)=U)DJQ(N0H2B^a^QdSQwn0Q9C|nzB8eSo(r%oE#MKioGdnz+!#xKSep~_)(fIv`0ivQ zCsQf;ou%5&Ql|LE&ip8UQc<(4KA0E_55CFAp_q}1vZbo#V2}zkQSW%_Bui{Vdl57~_ChINt+KY*U}!hJ<7RP0E@o>|v@)2w#< z9G16fMXEOn-d7hAAxrvCxX(=_RcuCEP}G_93}K0USGovi0za@96=vLC*Ye1Gc~$4P z4;S>Az^47Bp>S{wt^$Z>LGuW>Tp04nxY3d8{VbU3tW0dfF5rAYUmWSP)YlCjU0B9_ zRis{>m00F$0FX#&*e`W9qmk)`=7RdX>_Gz{p>@0da>Otd@Lad-3_|Qc1wT+OqxW4jWRCqYH-ay>vA~x6S910Pf z1y{Yx#rw@htn%eIF@1}mI2Y#vqNAc}27CNc|jbQLnK`MPfAc(??VRFxq{Y;cA$8^^LAj?Pe^s;^f8@du<3-ZVtB=jubjtF0w1j-AjM@j<9zuBk%eLSFT{&#Qy)AN7Jn*-L6 zG>shkkMZ=+o2Wb~z284p)Hnla1MaY$=eF0Lm`dq_M;Ad3aDQ^W0d0>DbnysiT7v$d zju+_ew`!s1v^Na6WP)|UbV_MUtG)P&wF0_z2lwDJ2v-UZ6-hT4@=6cKDrE$-C_tH^ z%}I-XzI=}9ey#z_D3J7wl#MK1hMK!y90WWKVhi)V^Y-yHy%}bF1u6`d+k?6~E9r#o zJ#B^mn1xL?aA~~@dt@K+Sy^o7>MmV1sBl>3dwWravm`q~H;&lyghMp=huR(^fIwX7 zbi&pkp}{D)bpHss!2|)CC*O(eJMNb} zcWsKQ)Lw=d#&+2#o!TJSTt?8#p zJ)oX=xKcv|D9aHYe)|SdBe_v(9dSB}&sW>BfJ2;Eho{TXH<{3<+DcD=Toa|2S0qjXrU`{4=*dTh3<0-7!|@2gWu(5`hLugFxSQ6^!qC|c)r zzR%M#slwWw#KkdF4G94!6Itx>c+FNLY}h4gJGtNO=7a=jGmeesxDN+5)L8NnjIXwu z#WL!6{~h#A7|hZt1u{-t)7)!zVXC*b>-nXwUXVx+BlazBY=b4eaH29)r3{ z4bUsy!+aIW0kjMYtoPUJWUQkF5RL19O?(D5aCk^~6vwLf(ZILFI z;0ThAp9(q)pB(RRXTCeq7t%wzHE*j=*uugbP34UDTW)ymmm+m03(Vc@Ky=CMs;oW% z-=URD?4PozCasrBf&0DneMdJ7`EG7=t!{%x-Bv>x=$~+${Al+3lLGuY!4bx2^;2he zTBW~7G+hV8aFQXViW4NC&~e*MpG^#akX4UrD>d=CLE(!g&9*w%&*OWq2XQZJ@JuD>VDUw*A>XP`pg3TrQ@yp*KMvMQt>DrgyM6gB?L8#J#PWV=r2t z?TYDPnksyIVXOjo4Viwz!DVrn7NU#`iJ<$KH2{+68~tOeLhkaw>MK^d+p*RTFD;pgiZ?= zr;|ly#HU#X$x^O6Ly`k1wGKd0;8f~)c|^`vEBFe)i#Ms%r@Etcul1aKfq;{NOxXQB zh<`IaOS$~2U5#a_UKaS4=9ktDtpdqsW2p#ZppKkKr;&|$kR5~}+W!9VaMHl6=hd@maa{=c#uZ%&s~dMJVJvsFoJ9O!@!g85)-aQ1P=t|Fsu-Gfg(9y22} zl!o2Ck;2TN8N+BG1USrpf*hq6R%e17D0&g2<^xp0s(327@&SUEp-Z7AGHk#(A$-Y; zE_^4L<}shyA@#b+#ABlgtTEKU-R^KZhgh|}^trcH-(&Z>-n)|_M=|w@fnO|1sNXg6 zF&fO^?tF*E#r94uF0%_H96^8g1XY0#)&J^(Ud|I)~qH$3A}l=?~uD zgJom{R_J_;Y+9l&FWax8-#^iGo%+Lfb+SFHe-Y5rC7AZAC$W0=#xOy!ysvh7G-(ug z0pafdc{?sSqtbGmAN%Vgxy68n(`4D9nE+s<$r5jj+n}fG0O^YvZ!g(5hFZ`nOnQyY z^3^KKS{1|Z8#dZ%-M?EGOrU+QAr&a;y;=!1nX0!DYPn!238RM%?M1zz@Y6><*nRgY z)=Ijq>B(;ELH_${xOYK`E=258NNB{hoUzg+Pr?bf9~X@HTCL@7`z?={R>dk`_0W+U z&m~|2X=K(ZLY>*T(iD{&elRNW2Ub%(Jmv%%x|)@bI6Wvx=Qdr}m!b0A8F?pi0>IG6Ut{+HwEZNu<;>%7LLvAcEXTK3SnCh-NAL9#y_YC} zr1ZSqp2^0DW6=w+<1qb!QJJ4*5po2$bM|l>W}-q zN$cx8`(IZ|;*touBbfUNhk^j@M5`}Nm!X7Y=D-3r$pEL&7n@kMb9p&tZ{z9fw5 zjSG^A3lZj?9>EhIFxi&DlOCOrBBDSgqJN_G%{LHotar~hm9PCUPXwZb@G8igY?ZE> z5hcTPF6C)g!9l>=$S1Rt6^vXUG6+F-XPa@6qjO$lZd?y`fx1b;l=$d8MHj2dmn+Xg zhKp(=T=@7S5S`2^94b`T%!x*5m58ibUh&vXhXa7ocmZRy9MD@16fVtAi!-k zPvA%>3Bp#dTnfXazwl!E!W`0&z2gSPYkZDcdJ@P+^A%stplX$Db9k(1GTlO+1M@b7 z-z>j30k`$$%BL2mEM>3~u zg`>y$1Nj<*ENelIpHvsyqU73K++6!JzmK!i+#R8q44#p~uFfR0a-NrDF6h(jAO5CO zEK`F|(u{ME56|7Hf5P9yx4Surzpe!Lq)7-a;=Lf6F#q&E@tSsb<&ed32#6X@pe34V z67QHlpnQm_BbhN*?-g;GCFlYR3zJP%8gY{}zP-Mh@rC7qNi6dY5cwUU}^rTJ>HSnif-QeXEtNHw})SH)g$l83w1g`UIf*| zlJ=tLf~YE!eY?$${B^04ozFyk2-A+xEn>yU%O%XYw!?5N|o)X((49gdJw7}Y>4a3SX8DzO6QNviCCJ2!038r3b?*pm17 ztokjkw`0WLK=WwyCj&kwg%@rMVoW+Mzp6kZJC^-?s-DxvXI-KETF5wRS9oe$XRpRk zvz3&J&DGVu7g*2i8q^(BO@*rbf(ypBn)tvWggmZIfb<9+ohr*9ti|zMiBVfThwqnh zy>UJrbLxr7DYRg5QSY+7dX99IdwT|dVA|P!5&hnQ3G`7$K8ZHnqXG%U(1GnL!b*c= zg*F#Z!G>&tGu(;d_d-obE|%Sp#_s2dj5K4w3qyPKfv3IX6PW`g_rA-6hL_U72)E8& z0)>nU^-3oaJ*$F^0Grv2-JE_mv4|}Ki+&x>#xNHbCrkY8Of>D)hkDR-nJKY-mcZsh z^{JBDnniup`d}(3*8a4Xp9^ffk`HdX%FPX z4Mu^WychivTw|M6;tg^a=maY-ppe=y_)Ev+N&R|PQoS65Y}b+@S$$X)WGKVoc(R6V z=~5-RY;Um=w>LN94nw4`tNyqZ;a6v@Rrtnmw%lX{T6a`qhC{6?CE$P-oJ&AJQ7RDj z^{C{mOMy(83$UhO9i<37D*Y1ADf9N4LP6dehS6TC=Y`2(hUz4xC=j*nWN-q_>3}~6 z^;3i#IUQ5O9pymq7B8N*pte0_V^7y?W$H;P==9mq28Rn zs`Slh-5)(Yez7KIscFVaJUhUVb1`)okDbK zSt|?+`)34uhpY~NZkbM{s^p>I$AFPmrFTm_izY8x&AYE2h*Zy+fJ6uz_%z$n%RDEo zC@MrYYkNP{GOfWXRS2ukxNJO2fUd`r)(P*yis2a^#sW^z)6^QWsbN0*L3EI-*~>-Z zcV5Xi14*A!?Ob?I=VR{7_K}=ct>{PHe`4N}iAQSsm1Blg-kq|#^^Rz2g{m>@CF5eZ zVl+1&1bxtFt9pJ%(HXqn^zxnM$GG1!5n~xuo-F#r69Qf`NjL7f8hnWkPvx0{fEVoJ zrb?~HG54s5?Kjoaq+fh9potz72^fxl%HGXc@9rno$kgH4%%&IBu=_?EwT-g7Ww?J` zkXEC>V6(p3-5DDh&+G7(DJm~VTd$FBe7uI;KV=U?u6y*wef{bv(h$}IX6BD6dPP$x z9x#H!X^wnNh5570#a#-oUDr>8~QyvX& z12AAX^tp<+&7;s^KXP8@$4F=7U!vMp?syvVPWXlx%=UEoauyfF36;(A38f{GAVyC8 z=PQ*zV?p`Af@nak4~q&G+M5|~rJ}b;t5>a+Zb}@mY{fGMj}UB{A14s(C<DScYQBR=~laLSJ{!$POuRF^G#K|-||)jLgZEnK8Gvy*FND8Gky?X8VtZYqPVz>uhD7Ar%8qz2d_0L)%cn*i{WG% zeJm(aDUU~K3rpvoxvZ_oc8^-2bG%GOeUR-#jf74Zgei_h=`=C7HY2HXsLEt8Y3_7YJhl(rtW&(wE&#iFziHSY#rs^wjeBck8zYq zzm7cF9&gM4-C!J=O zg?3xaE?kxDh0fJGX6a6UnZRQd)g!by9c|X31I~Bwsd^HM8^lw>23YYthJ!5a;1V&F zF>Xwe=C1ghw=D-EJq0|l0Tt%cbq!+Ea13@0n;{J3;j{mOR^}@?+)SdNx(lBCA(mcB z#k^1+Fx5UBxt#|!EU#{Y`WHitPMuc!!gmE+5w|smmI@!%B#E-dx3%2)uCL zkQR(>_4^pjE%6zT+45Ua4tW-7Z6Z8Kz0;&*t)j3O_~X(4Z8vz22QtluD(LD-|3rlT z%P{Z?SPg>zByjG9&VL}I|7$h)%X{&EgO}rFBm&i|kNyd4Z-K(JmbB&0FZ~9ibsokn zeZ2nnw4FfOr-kDBy?6?se8xq$!J9CaVe)a((?whcV5{%>05EwfyIZO<8-sQP4uz{6eGL=!zCoq}*vU`=(Ld<<-eiJBaMt8Q{>a`kEkM{)pk1 z`92`FZFN}8|K>?v(gmwPnO%Asi195>^a8ihgF%tIrST$-wSA8x+@E%>H+v3OYyCvj zphp{M+uE&qKjAXso$XEsiG7e;`q{4oQr7CbCc75kLAqGjM2U75sGazT%Samzg7t16 zBKchKeb`Te%|e@zXsl6$vRN%zcnul$g9wP#7M zvQhi{@*r`I#ktN#Y=E5F@j!v96`@F-Mf8&@p>Ar)tUfu&DeAj1dIT!6iQge%0Qrtv zB&&h#kB@ky9A^CvvyNihVGGXIOga@W;g2JM0dcP0Da&op)|JuYK7*s)X`Rhz1*$Aw zL|LZ3yG3u1S*TMZBknj%^}Q!tX+)eR;K(9F}+V!uI-EpTW28CjBBTSR=rysDY|{s>Y=; zFN8q6!lP7loP+rcKWi zoBoRVGRgUaj@&N{U@lp11_mJMu)oQ*0~SjlV2kxDp7C9d43=C1pMO;L&#WRhDPRDg z8AuZf22B&mdG=e{8HU2T(dS?g(Acu2q=FUo!XSwwxj(4zU?8GUAxTs^6U7(MQC<*%i{X8RaUa*- zck8k`HFR34QyVvZt5fSMHM!Sp5AA-q>3Cb*yWpk_`K( zNIFXtI_tJ)c-Qin10rzq%sHv30xfpFEgN?GDk zcGs8r1|n541#h}eksK&o`X5#};YakUne} zJi_k|m5cY4V9|=7a(HXpJ%p)QZ~56{J}1Q3VPgo>Tg0RA(u-6pB89Iq+qWZ68RU)n zwtakUtXyJgTA31pB|9j~Yct(M2xRlY~2AO?Wb7aKfS! z`x&-b?t3GNY>f%cS}a?sP`oY0PxiSw^WXRXK0&Li%~wy2zi{LIC@FLe^yy?cPk*A# zVAkiv2ZmO5{331K1U4Ub*%$`a@$$x@bG;__=gP5QLOL$hzYlwegiZ;p4GBU{pX%Et zLr(`tXA@DT%$R3^Fi)b!T1#GpNv=BIH8rTtbC(DvgFQa$cH90jD*GmLyR$MVFtO72 z;M_^CRcA!ic_?z()$NTh^7k7b&+ON~@pzAqwW_R#5hQZ>-!#4A!+ydAO%*vunQ_~p z!e2Hjcet^{CIGSIp;s7WhSMVw2`4wIOgc5~gKB|xm2oySs=JcEB~NKmxY>+cHb++J zRSFTbYpjE=5knJQ9M+7qw05IwRL}Ho;XCcm_gfV#X6vouFRQa}R&aYz1fW?hQiCm; z6mV2u-v7Q7>1zX8T7bdo)_Gd1f^aLK_vKj56@Ax0&piA3%~`7=h~t!;bxkb>NY_=7 z&g1~rtBOp;8%ZpCvMl3Z*KP$!xyR+?e6n_^Tq?UW&Sp^t`v3) za|BDX_=~2!Hu~pzk@*8)!vFlSpHJZfb50O(qg@+_9!#2hd?_!s)WFsIS~;0C@pa@BS1K>!PKFeRFgVdm8mO4FRs`(fYSGRupC6J z)u=OE2>V%c{%)EA9>lf#S+S0r_-+n=1M zZEM2HI@QfE0TMqsD=Dhjk2SJ^6j{NWp=fqDSga^MetR#6NajRla1<2*|>t^!N>G}6n1HWq7SJ7+9+I+*mJ~2}6GeQ=oq~ea()7|VZx-rL!bY?j} z3o`XDpZ$8k%;$vfZu2ccjnOXWKc_dMC2RY{V){SeQZ*3sn_SwL^0d@pZ2Ve2(_v&SoWs@rmH zm62p+Im%_@YgRurwzaIhS(HDHSn`(BcIFNIrmx=$oOoZeBa4x*aG!7(ZEBU$ z)Q`eRglzTvNP8UeRgW5EX_SiG(oj9Z1xfTiT8;MCJLSn`Y+9W~XWwAGkT29)SKN)# zTv$|P5Gf@go*{X29u3>HC?WSFkqVs0v+5rGWOs$0TGG#zx?5%}b#@D|I0ke#QQt8}gAcZeyOSfw=Gc&dcXpOSew$BtX5_vu}v5j!5 zCJTj=@(lM$B_moztH`A{`Qxf+0B}uNlldJDghTrVb;DSa32xZ6bN7Rw5FSiAdb|<~ z)rJo3(6}p%^TwK)hljIRF_9e&DaZ1EE|*~O<6O3y`Z$~ipQAv+BSX#ugjyxt5Ri~T zfnJl`Y;x%BJbJOY0LclJuQk-aXRy)l8RM@-oDUfA+fqe0Zsc{T++*(OwWJ zq{^z(tvin`OgnQKRnCr$2P*C?iEUTfHXK%cgx>fvc7;P{1WB8?y#A-Zf8O|cox_ny zR0la+%lW@&$?~Uv{Fq)Z=N;!J#hcu77B$cPW?AeXfjEp*6wRTCn98CE%~}5b6wR_v z;h&v*Bk|aZRU|8LKcl?!Nb@3>F*6^yHgo0JPjhPNu~;LZeeyhP#UdYFYHZosvvQ}& zqC6s(ywzN`J3Xp^*3dGxee)af;7eud(UvnI2b;vYdR7 zpaxmE@z4sT_JPSR>~jr4cv>iA)Lgsr<3K1i6cRwhd>tiXpg&7J-i5fCH&DBw+l>T~25 zh#am7mlE3YuNb+u0tNS%=b%jzy#&DkyApw6hz z=C|5eGXnFett43ESb;)puW)nDo6e&wafS2!yUzE41vRqSET`L(Q3GYp-^LlLEujF& z6Dxf2)1=#Jb@@f#k%^g3MvmqoRZUB^&lYs9=KrslOkzt>lsSe9s+=%Fxlm+swQ{h^9W$dc&D`MG-4H&l`#r8G~5 zA`&h&b_0&dVqc@f;!8*4p|+MU9OjBD#p{6{F+aa}ktHv)Ky#JS70m`y%ow%zrpiar zw{4VL^<%{KPq)-|yz8If>PG_FKjA6AunAcq(V2I3(HO@*Hfdb(pu^awI{tN*rpSDo zK?91iU6;w=G`H;u36NiDo5q;Xtv~zl5o&d&;=5A;vxM?&P4x8o#}xh#;Q#o8jddwD z5Zc1SO&6n{+FKzn_x0yjBeJ_XNX<%Shgt385~VV#EJufh zkKQBx_4+=2xpe#ZhiCU_$Jh#Nq}R|PBqX8~ zE4_shRGM_8Lqbucmr$jHNC~}!-tXpl-uHRL^}lzm`{91OesHnQIyq;b*?VU8p85S| zB*wS6l-YD$CPS0B#tq3!Y?!ZP9gv^>^i;W^^&J2G|0*hYna@eq4?!P^Ds$XQyJ3oN z#?zYf-<%ll{rHmW(NJK=vI1nBQ-Go&1X2mRZ}7pO!b|>zeJ)mCa$?~i|DWmodrT$N zr02KHb2qm+LWQh5-ay%y#a5d%9?nR<)v9lb6by=XLQj%3McHMNUz$^d88jUElIL)r z15M1}9{#D)$`ZRfDIp=?LK(_CTKE%aJ;m38^ED4D^Nzek;7YTFT{r$z1j3hLh z`z?s;kCH?6MNdrRj0H&bKLrYrecW&2+m?&PJFB)zDbJIVLF2k~|E!Ng`H^b>bZAqt zv-yyu9N*vEveV9qhE+FO6C-hV!p66W&?(3Rh9V7Y^WX}9ugV}6&y^E)Sx`%3ar92xCT z5^9!lsXN?Za(91QFC-^PVFo9T{J81_$DMlkb9JtOf0go3^C^iXr~mWie?P$Ij3SGX zKaN{ahILGVB9cMFJOUgD8mg$q#=EBTFSJ>YJ~(>+XR_~2!Nse4qUP0;{N|%ODoHLo zk(xWylD-TwF>~y*Q?hjQkquD1HMy8ks$$zQZC9GO{xYph1Nio(T#57t??4S78m&kL{VJbvm#+Dw0zQc zQvLs!8cA9p0F4VyUvblUvpePPuPlny?eD$);yNq!eI=3b=S#RK`Q?mKxCI)&x66&A zTG-?@s^72r9A2$| zJ$duU)&IMDeJNm~$Fu7brGjn6xK?z zNSuI#-ZJHq9X{b4D0c4muT;Eq{3?-wWbxZX<;3di#85H)^UEt5FwjIB^FqF*x>@7x z$q@+NvE`(zu=D5N=aSOi2bFD@Cnv;6!Vj(3b?!UYqxvgBc7J2cA*hIXLJWoE7 zL^Cf4>E4n!XW5*h(DL-C)nYLr^NoL*diVu7I?I|VmW#|=YlL!Y&oSnpr@%bB@*f)K zd#`DlA|O#x{n!7T1Kp}8fY^&mVvs^AI}BBDavv;Z(rTzBULqpAX_Q)Vr&@40edmdp zOJwKID%TTUn<^YJH-l%VUbec#ig|7`;3@+dFVBDN6!Ro#99*wamV_Q3Hm1Jf2t3zj zLr7xXpacKh+4i%rvRfnHl{jnz4MMwQ&<5E3;=wXE6^Ap!p&y$!>@jS`@2>Er^MmNJry{3_FTBFh3mNdN_1IO6@9xn0+d3s z0y)p4E0xq!{&_Ir(tVMmCiFW6iLBA!?F$9RkNBRYH^*42Wi z>d5r}yhH+!=~wzlk6fh`1%}*dOtS5$GFL%>Bgna#NA>&Szr*4Hl=)XJ?88wD@?0A{ z!^q^1P09a$S3^m}eXGBJR7xdaC-s(|;G^~XoE$rDM8z@=^9y-@^s1BG^I%%h))QI3 z85*!yaBN^Vc9xy~sGs`fe~gviA?}Qx&p%tmL!JMBFK9*AlbT72d<~&ohi3Yor6BGy z2_*Q|n5pwjm$eWZYZaWIT5;Jm!Zk>mCyLJ)G!lZ=b+Uix`^#*!Q@#2Uyy09f-tke+ zHchWw-L;=P0#eTMi0eJgLDIfvk--x&k9~yi067*9t=uy354yr0TWt4Mi$2bHx4Y=Q zfH}YkmRpqf6w&ojh%HLYeW?&J#~D;?7r$c?WX+3p!D5DQEbi^oH|)D2$w*5U-1q7; zA7tuKp~bxOl2p;MUbudZj%4`b+CV10C_cl;8R6Lm&2cYpc}@mW^X#P`>gI2fr>pH@eblKFgkvSx+@dyZj# z|4j!<<91p#LTo6YMKNI%xzengKAOX-97P+ zG*kVw$AyvHYG-we2^oeHjT4Z(r|mlry`=bM4-Lhuk>d}~!+>}qQq->YCu)RW3juCl z$@T_7Ew zb%!L!5PY?89t-xT1;sEK5y#5@_#3(c*6o>JZW!$PoIHJcI7n{AiaASPBuwZ+Y6t+E zdajClK(J?F8!LhzJ#rR)&5p4@GLD_dZrIqB&Mx2hrBV-h`04ZNVyDWCu$5PkwW>eP zPB&jMgv}3}{~?mnJ=@3k*zEUWE@`g&rL&@96AM_4d=Hm7CI2a4lH-EbXZb}N3asxA=y6-9*SjhqE87}3mmeB;FE`Z&x@!9hgCX8gg{&P?|;KU~TBaK_{1 zQ|Oy~zc9E|=gF|yo`cc^+~`7vO}BDKnzw!wD}Q!@@Ei$F3>t}8`bxbuGYfq-6mt46 zgD`09bAnapgPvNh2v6{bm;POo!X)rGd3Q8s2WX!%!5zA*Xu=X%n!*i3D0-0 z#Roi}*-w9xbptRrLTDSKzRbR(lej*9g;^<9D+O&54hodrTJaT7{Pq3y{Cb{bgo48` z&iX(?e8-*X{H#rh#l5<$ot`nYxLb;losM>%MFS6tVNXunb%qah;N8+{?|iN&^GQa^ z{MR%S|HtB&%YAw`#xw+aRvX1GGxGI(k<+*C*ffW&hA52JdCMr#x(tJ@BX_=qYKWJc zE!vwwP!#GBfSPOx8`y`B)$$6s@0wXJIUBYQzZq``ZHzMZHf>=P1-DjmlzX{{f%5rH z6$$GqInpO4%H^Rd*_N0{$YkwC(eyO0@kf6H$E(CNzRKOj58-@0In-ryzw*(KI(>v*T{+awIo7scj3qR4wnO)AU8Of?Qy-`CG1zdLLiLp1wx5S4b2xTf?}FMlzQQ(-%xqis$p*bFgoM0 za1y<7@A;~5Pe29qR|kBN7y+R&%0VKL0*Kx_)(o`UNwTjkH)2(>m!?iiXU0{as`ht14t$ zgj$OHAai%umn$RrAT`|-6OrIQr=7EQ_oYJb$7m|=$*D#!3K_ImnD+%S{_TyG>Wz^I ze>J_v#Y*P$YZCi^dE%v~q~ERTV{dtfsz&d|+|bF@0X=NL;mgc9btkKRkejP!2 z&=FS$dV89gJ1+AMH2EYPaPMue2FD27DwfiwD?JqCxDQycg5B~^HdmdPef8>IVls0h z$d9W&9rDzuj}?GrmcQQ}A9WCI_RzqL?%!< zltXE}s$xj>aUA86ze-^2FAOz@XrVv2er<-vLbwmMo32i64d6^7&M^sSBKuKQ zdO7-7gVX03_$1sHA}!Sv+o0?8LZHfC;KB7rEx|umYN6kftk=05)-%&OQidQYJ&R}3 zbUwx*%J=kX5Du@5*yB|fpL$jcucc(All^)hQxtjP4ALDw?>A57;ufDiWG+ZZw$2wR zs`5eJ$_0h=ruS`(w+0OcuId3e2wUNdP{Ci?2<2!B=d*?j^Ba_K0Nh933dtIw)LF_N zo+?C&EE|`iQBCnhd>Qr3xm`TaE#`>ZKngBKu~y$#0!SuK__`f&z8K5ChB?PSeu@8~ zYK)LAFX*Nj93-vtwDP%ids*U~C_!h$rN1f7XYdIY(~7P(f^YAG)K)ldt=6uu)VBDB z*P(m0Ok_FX2BphwV=oyS=)i5U@Q%OO5qFn%rj^+`Eycm6f+=XWjql z{ajzZ#!PnxuV9LrD?QODK}t)lwy<+q(1GB%S5ib9VL zF@tI#QhUs(k~@)T$_m#$OV+6BM}2vXTr0Yd0846T7_>+)KrByauM5_9j|4AC^9x<; zPFo9Y!r-O~3avZuchn|iI{T&(FqG>v%DUx>nTnek` z#4FpySsIHA9VOPW4^Y}``8I=7R0390q+;;(!Iw^=)erx2k-pTg+JgxUvK=wQFOAnx z+@-|J)V#yFPxt9Hf0l-_zK6kwXNl8q@Uq^5S(UEmVg2kn9}&7~JI-OjJuN8PYz7%8 z+57LA7C{s0_f;2UcCF-+`Mj!k6Y0czQx{oQ>QLC-?G+~2M@=`EN0XLN=~enCjFWkt z=OA4pm-zJhhi~}KH@HaOk8etzow+sBQhDB#(Zru>hT>o-xIk{^2h>I`)U#Uh#f~v5K2J3IlF>Cwc(+md5X)e3_^{(-Q|v(N z0HSskAl%8|(rY6!v9_Pou-Iy0VHQ9b)xFHS-G?iz-s_D8j+1P_ zr}xvRlrxoGTC{jwVqC~?~xG@}&(JvMW%C;&N@ z=4Z@_4ISnpkF8#{jp{YDILe_=GA<_&au`pxM1+HXaNt$x+v7n=8Nmd^J8{W}0f}6< z~2hl0qA9kfqL2zFdU&&&yW9Q-3Vu)TAB{ZAgD)a4C3|Nk5@j_CVWM%D( zjN&O$7op|(KQZKpJC#N$ge)9luSH$Sp6fuy(!WMb9Rrc3fzQadP!4!WmfHdR%oV)~&jKdQCUqLRbtwX{SiP z)&%Or(km~2l9vOk$Ck7HqQ}F47k(-Y)18*GMj6#SYlO;OVrB3a61l&>&ZP^Ni;v1> z<^SaJp-#x^sWJR~JgrCFj82asD67-@;uJB!7ni%(@Txz#+^FAHFGHPO(09A!hTc*N zV!5V=xW4OGVI=9|*rqgyxhppe(lU0MTQodX(;qLI|bcN_}9JA&sTOO;% z%T@?iX3?$clPDQi#nb1mx@&}RX)lU-BseX|8rfBB7#QY+sp%9MN21%Q12HHKS))Y% zwd6$fSXKhN_&JZo3nRUl%xCgvRpR@FlMBg$Orj)H6f%tywC4#y$aTCZyYk?c|AyF% zb^TjqeYfv^=PA@}qz}MZ*LGwKDAS(6YIAA6dvpok!Z5u!LPsI^wlr#Nb%^x6+~JXM zDg92SFOItfk?c3gmHnIyvGC>zFh}r@2IvRX7Q--?!1;zwg)=2*Vf~3~dmC^$f3fM7 z==IDs5h>XAD?h%Rf+&W*1c4PFRdZ><3vz^a(}TD*dJ&bYf(IteB}$iv!-7*kS~ZS4 zxz|t54-}hyo@OM6?!OdWpHJt;cRRrW9A&f608y;HQ~zyiC8<_rP0o*cue>$3lZkG= zwB6=&zZ?Lqrz-kMQeb1%7Jp&MN3aAoV`97P01aSvzJnuE313`#jHu4{99m}6iJ5-# zfiQy2P_Dbli9i>*YNOazz}KL6n))d%(d@V*I^vIOZWknea@t?}3FRBvY@K&^JHHyU zJ3dxZ#Emcg>?c7B^_BGK@o&xPVp<1``@Z4DX+fi6tlPxQJI&f=tldDFA0u&QLC=+z z=vvX?F|tTzEoUZ&NtE(hI30U4t6akb{?MSDP>|ZtZ8>Pr32_-;VjcyrzgV@($OuP*r~-xJZRN-X^yMb)NDtXj7nTAxzkhAzal42#w=R0n04pr;zX^ zR2|dGspl|>cp_9TzcSf;4jq>2^Q&7MTTgz;RtLt&C+0*Hl890d_^ui&Ief9s%9h+| z^;V6PO)T_zQ)G_KMnc`i3D2SCEoHkmMgVi&;*Vc+N1DH}U={@-Qu#^1~8iNB>svDD*6X)L#N((+-AbWI9?yZrP6T^Hm z+HP`c+A(LbV!+hPuCXzMU12`Bgkn}YEF$Fteqe>R@1xeXOda*GT5N_bzg!+=6)>}B-bn8vX2u@u*vvfoa@N<;Fk3 zI!D7w`{CLZvTJarh+mD}TgSUzNG8O5{A}K+{YA#TPzE3rUei4jue#V}{YVCkdsG8YQ&1Ys6)@ylJ$IJT3AEHi#wP5qwdG^9)?>hz|3!A;%h zUd5=l(G=pTea2;>GPhZG#r7NJwG2HEUHj9kHG=kF-}d)9Mr$1?XtR|=Q^vqf~Hzue9_uKFJV)H4ioLTT=VR&sHNx9$!EOd z*3Yk4VwAM9?W`rp4w`a`25epww=78#IOmG-@~T%DOqnoQD}_SOt=-fVj&;8ApKYdW zo)(p{mVtv=H1iLFPQbV+P=(<6ssU_mU{<&l+mM1 zc8HG}M@!=U1|J`qs-WWaacf~oiud9gP&6H1y5GHTe3%8We6@0n{VdRr}T8*-)FlRDFJl#D#da&NxD>$6*hJE5P*rS+?ZA9xp-r7>1qMg!k| zeY(9opV!xEchiYZ6ltRvLY4KYXCfkSUCbT6zHb$9!@9l`TDit`BP7j8uh@u&{sn`I zr>K2)c6lx7A2^K;w_QXZCJk|T75Hsg7ImNC}Tz16B>p0 z@m2v87v@G(TuGyYf^z0WYfN29KlqapYD$L|T76Exem$mu7K7H0rnI3o9a~dGfJiwaM+oKl^<{o0=^eFx;5Q*;%B-M{3d&ABdu@Gr%53;Kf8J+4@f1XZoexvkvpy2 zpjl(rJ#-1u)4SEaEjHIEio=srbczSy?kzt{X(Yrv=sdM5{>DMS@Qhx-1Iwn!n#ZZ- zT%9TSJmYiXD2u7W&k-Nv2_KMVt>vw5u4}_>zn&OJ&ve@Uup>23stGCBC^8v~{3y-O zjMHZbBn3`ZvE(?2tCB_W|6(r|&C>s&6gHU!;=b5!?zM+!^+mHH5vSht9iwEX<#k=! z%g#x5?Q3*i*xlOnBrOm-e|CzNN?!Gj`^Eb9nW7xESQc$Q#RS$782F%{1ZyKKcA*`Hg5mvf#bIs=sE; z3wD|LAM8U6RaJDF!GiO(Vu;*aK^hA#mT_5jlRZ)wqE$G`A^yAG!KH9i&^dw)(`5q?vvig5;BjRNvJjS1B`qfOIA-3I83{Ur+k~1OBf- zJ^$ZH7D#)jji^(QVPx*Ihnq_7J% zE8F@GJ(hm;R9cF~t z1>EWiz6mF4p&VaEG0`^4&Uee*?!cg|vR?tYX_BL0B`qyY&A>3%Zu_gVarkycYMyym zp>3qf0uEnOD#t98TWNq@_XwB8^gsUm0Qe#sDwBE_H$zyp2wR&1v-iCpIfmDV$~MB8 zQQ|Bslda)^U)7M==Q1`Z_TlcotN23Ea{$fN1k4<*T8(Hn(5%AmVts;!KLtI9hU9Vy zgY<3y*nY_d9&DxFFcLC;LknT+$uW+~vM8_EJ1t-0;9n>G!CI-mn(fvZyN-aPGRjMMyxI4MvBgY|Mn4wZzDSK$|_@XmNON;wQ9n z;6Qz6sanA5fy{N|>`XHH9<%me8|I^*HYVB?m_kC>{gp@A@C|@GVE#hPKc^T)Gc&id zwbh`Lzeip3w()(esM!`VLSV7QV@@1@xt{;!nT;q*OzZW!K*p$sM=1mD)5J+!kA1ZF z?EKdH2*_(i37BJ|+!@6OP|)Fm`?Z1bR$iaW8bR7HS*|WybERgcqh{4BStCmQJj15$ zX*%qq$r3gJH=)&!0h&!I6d4mHE^*p9`@Ee-vDak|cHdfE&>Q{cm)Ray3T>=YiR_O8 z)W`b$Y?GJUq1T+)wuo^l9h+a*j^hD&k}9snpf;DM0}%^E1NJ z{fSWpwgbvxBNX+t$Bsr#(pX`n@xgn>Q+bmbS`#Q>S8ko1VTgM#xL|s;Ip=iZD19 z$||=_+S47pQS*Z$&#upMeewY0ctA#gj!q2ms=#LG?!Khcx7K+qDB7=@aI485_pIiv z;?8+PyWXp}KjfG-Z${&696&W**XaP~%{CJ{Dfbr~8W@8-^v#kTEb|<`Qe?gh6E&w{ z9_B|r92rwMGw}SE&Q+n$+@Lj3=p^reQl6R81lkf)G&+APf3GkjvI(@aF zr@KZDy^oQiJ8x9$vCb3ez)SV{(@Irb535trrn!RbT}ccVu0B>dRI1+*eT>l9)!v#b z1rvX_^kaU27%$d}<0`=wPcgzk_jfVW{)=-{J^IR#*Z2%oFLZ%^=)j8n68V4?aId&F zP~c#4qVH1;vu~MJ;hrTvu8{Qxz`uRxf1SXvHFg2L-)|=7JRTH`k)#;&J9{ZyEw%_G z-IUBGh@2vAP@#h#hfT|G(utbnA&3nESZ@j#f6Ot4cE=VloU6n*`=NM9Ir7a#Uc1&B zh%@*h`e2=&SU|QAU*;NRjNDIn$1I_&8t{o?sI}?U=*#)2(_s0Uqjnu*0?d0_`8iQv zpEuzqlF=qQ!r_w<<|FJ$aZ=1qgSg9HTuo$3aeb#Rw~- zgj?a=9+;Ck19~Iqd{Y-D7ievLdt#le5w*y;7&3(Ci8B2ic+7CKAr_VEV<=}t+o`W# z*gwQi;rd#+-lfRRBm0|?49F^m8`Ne7(CKBWlzSB>k2bBzR%ALBsKAAS4q&o}XzRTY zt1SJ*2ori?51U)m28S|-|bgWc)K(-fIbR$sN4 z!o1PC(z=@NvSPL8UBTM951a(QFFM@R$6EN2MIfmid8_sZ>MjyV%e)n4x++D-t#kST zRW?cQeZOXwp851pM!3W{T={L5m6|Y8(T1(kD8t-mQr9 zB3*%^QmP|JY!g$)`eU&Rx^n}BC!H@N8vF?gssmb#mvMWuS)rn+(KBA>tGY`WIU(AOpT*o`S9evJiZKZQR}f<+0Eo z$(u0nL?lxmBU5H)s@X!6RvJlY2E~3H0YMQK5i|`H7diNgu zvheOy98M}lHu17``_t7RGP!J3cF>7@asU4I1qL=_@4}&0OL}{+we9F)=3Lpa$+PL!qw!Uix0*wA7m7&Pi*rMl;mrPJSA>JJ^(()&+IAl6%7Z;h zvro^SVYpK`+mV&Zam!E3B3jJL%MP4aLyxC;zCVxcekKWWM``oD?d+;}JKj=zFDP^v zM`u$x3ItZ<*4*%R%0OQDFJgeSsEY!8gNX%>+HHS~_8wYoMqXd!(_xqwy-xodl&p$| zB*z~Ye*IB>q}r@%a?_VQlQ9c@C+GhXDXvVsKx}@c*0oC4^{0SsFTVOg0WuxiZmJ~V z|KXO{KkdL=&$5{28K0hA`PLI5{)PYxqmkV$a(R`X7Z}AKC`a*dg3MxG zwVg_a%&^EQ6$X`t(3*Ki{0&_UfD0Op+6h`Z)VzsU?>R*-4Ur2t7aZ4@-*oHIU034x zblzSpwp*+-Rl^d#=jzZC$S7exF(cgZ0a;Eehp9+W8uRa{FtpuiF7)0(hTa-mSbttB z;8q|w=h#x_W;@`RT=%Iw!B3U);E*mubnUf1q|0!2N~E|ziXHZ3xzMnPp5_O=uinM; z-(*b5FlmB)PWQLAN5zWpa=4{GP7$A^qZ79apC9!WaIruO)?GBcbxC_I`aILFVTu}> zWm@&pL+_%&>wAfV?co{>zssz)?rlXE?cV_%6wp7@xEmmzVUYr7kkwhxbsqsRY+Q~N3~=M9;coGsNsy{vI4Ch4jD zHIpB&oa4ALiE87Gt0gN8%&gxCczz%I(1o<)O8I60>Npxz3ROA6Ho0~oiFAE zPD$VRzB`o#;Yxa**`oTa8>WuS?Opd5aQ31pq0x>X*9T5uCb{NQ-B8`{RCt zvxD<3O`D!vV!4*73R<@=6A^Y7nEwa4KTZ7xVTIIc)k~Or5x-5>u>W+TIx61~+E>@6 z%$q$c;Y3nch>UIK>))k7dXME!{aD9umI%oA+1;lbw6nOpo@W!bzWwI`-Z%3Pyzi1K zh{K?1ZI8anNe}2is>X%CQ(^x+Q+u!C?sLyYC%OR=n6xP!g@y7dM_~-sB#2chQFwrZR$hBx1L(dAXwUo_I0zy8Kxw zNS4IfJ2H==qcZva3OoUNux||Th8JF+maL;xqd;C=6|ii*wzWbiOXXdb9yb>)_jo%J zbKN|>D*~MHmQ_OUxg#p{Y=rGNQSst5?3;E+Ex}UJF+c77OIey<;tK43Jcuctzxr&q zFVw?)<{d0=Z(wNH-4g!qVIKT-=N$k(@0(}sJ$sV2_Uw{%PqGH-ssi~)@YY-DaNdE6 zKq|x^AMUCD9F%>w>LaKqrn>Vc>kja-)udyN!Y}?Vioiy4jd*dBq6ruLd2htR9$F#m*&hrC67VYO zwuZ?Ezx#rpUugmVX_FAme(yJP=W~*SlKWrQhp(V(_-G8-6hOBA{#%y*;~-5Pe=>?s z?*7(D5LT)m8BQ3N3d;#LsBnJhFj4`=LIz`sKXJt5_?+aUG^$q#y&aN-yq2}={xnEI z{LqT#O*S~bd5WRiCE9m$jWa`3=ieC zbO5lRcYP+F6Vg&PXa1mOknTc0B(is=!d1^R4)Xhm?l0GK0!G?KD5rvhQuysJpr&D8 zVtn3FHp%ll-;aYl2@y2clHN(YmrxTteM?F-P zAqlgwF-Q}bEDH<%LdxXg-=S9#U1kNc7?E$HPSg!C>`{mL(4OoAUI5V!9q=jUxE5Vi z=Xcbyl+Y{*f8|r6mRYIf2xXI3E=BIeFvzUNo;)?=zR}@`Vm>5jr2m(oVZwE08xS-^ z!v7_A{xz9Zg;nt%B%C2PA7rE3Lugw}XI!H#TrUG|#+1;Dp5Mtqz?gX|07J{DQ1k~k zgA8md;%-w2{lU!$1l$aXK)a(ad_{9yWc<=KBhF3G?9_QBVb!#{p_r^j`zRZ_#US5Isv6AwmXX)_!S(SdeFvHE)SdN?j>T=`YjBc{T6_INGQ^&wR NC3*FG*|JYx{4Y+Lqq diff --git a/docs/documentation.markdown b/docs/documentation.markdown index 26a6a0c..7cc8127 100644 --- a/docs/documentation.markdown +++ b/docs/documentation.markdown @@ -25,6 +25,8 @@ Here are the main options for configuring a unit: **You must always have at least one reference face OR a checkpoint. If both are selected, the checkpoint will be used and the reference ignored.** +#### Similarity + Always check for errors in the SD console. In particular, the absence of a reference face or a checkpoint can trigger errors. + **Comparison of faces** with the obtained swapped face: The swapped face can be compared to the original face using a distance function. The higher this value (from 1 to 0), the more similar the faces are. This calculation is performed if you activate **"Compute Similarity"** or **"Check Similarity"**. If you check the latter, you will have the opportunity to filter the output images with: @@ -35,7 +37,43 @@ Always check for errors in the SD console. In particular, the absence of a refer + **Same gender:** the gender of the source face will be determined and only faces of the same gender will be considered. + **Sort by size:** faces will be sorted from largest to smallest. -#### Post-processing +#### Pre-Inpainting : + +This part is applied BEFORE face swapping and only on matching faces. + +The inpainting part works in the same way as adetailer. It sends each face to img2img for transformation. This is useful for transforming the face before swapping. For example, using a Lora model before swapping. + +You can use a specific model for the replacement, different from the model used for the generation. + +For inpainting to be active, denoising must be greater than 0 and the Inpainting When option must be set to: + +#### Post-Processing & Advanced Masks Options : (upscaled inswapper) + +By default, these settings are disabled, but you can use the global settings to modify the default behavior. These options are called "Default Upscaled swapper..." + +The 'Upscaled Inswapper' is an option in SD FaceSwapLab which allows for upscaling of each face using an upscaller prior to its integration into the image. This is achieved by modifying a small segment of the InsightFace code. + +The purpose of this feature is to enhance the quality of the face in the final image. While this process might slightly increase the processing time, it can deliver improved results. In certain cases, this could even eliminate the need for additional tools such as Codeformer or GFPGAN in postprocessing. See the processing order section to understand when and how it is used. + +![](/assets/images/upscaled_settings.png) + +The upscaled inswapper is disabled by default. It can be enabled in the sd options. Understanding the various steps helps explain why results may be unsatisfactory and how to address this issue. + ++ **upscaler** : LDSR if None. The LDSR option generally gives the best results but at the expense of a lot of computational time. You should test other models to form an opinion. The 003_realSR_BSRGAN_DFOWMFC_s64w8_SwinIR-L_x4_GAN model seems to give good results in a reasonable amount of time. It's not possible to disable upscaling, but it is possible to choose LANCZOS for speed if Codeformer is enabled in the upscaled inswapper. The result is generally satisfactory. ++ **restorer** : The face restorer to be used if necessary. Codeformer generally gives good results. ++ **sharpening** can provide more natural results, but it may also add artifacts. The same goes for **color correction**. By default, these options are set to False. ++ **improved mask:** The segmentation mask for the upscaled swapper is designed to avoid the square mask and prevent degradation of the non-face parts of the image. It is based on the Codeformer implementation. If "Use improved segmented mask (use pastenet to mask only the face)" and "upscaled inswapper" are checked in the settings, the mask will only cover the face, and will not be squared. However, depending on the image, this might introduce different types of problems such as artifacts on the border of the face. ++ **erosion factor:** it is possible to adjust the mask erosion parameters using the erosion settings. The higher this setting is, the more the mask is reduced. + +#### Post-Inpainting : + +This part is applied AFTER face swapping and only on matching faces. + +This is useful for adding details to faces. The stronger the denoising, the more likely you are to lose the resemblance of the face. Some samplers (DPM variants for instance) seem to better preserve this resemblance than others. + +## Global Post-processing + +By default, these settings are disabled, but you can use the global settings to modify the default behavior. These options are called default "UI Default global post processing..." The post-processing window looks very much like what you might find in the extra options, except for the inpainting part. The process takes place after all units have swapped faces. @@ -82,21 +120,7 @@ The checkpoint can then be used in the main interface (use refresh button) ![](/assets/images/checkpoints_use.png) -## Upscaled-inswapper - -The 'Upscaled Inswapper' is an option in SD FaceSwapLab which allows for upscaling of each face using an upscaller prior to its integration into the image. This is achieved by modifying a small segment of the InsightFace code. - -The purpose of this feature is to enhance the quality of the face in the final image. While this process might slightly increase the processing time, it can deliver improved results. In certain cases, this could even eliminate the need for additional tools such as Codeformer or GFPGAN in postprocessing. See the processing order section to understand when and how it is used. - -![](/assets/images/upscaled_settings.png) -The upscaled inswapper is disabled by default. It can be enabled in the sd options. Understanding the various steps helps explain why results may be unsatisfactory and how to address this issue. - -+ **upscaler** : LDSR if None. The LDSR option generally gives the best results but at the expense of a lot of computational time. You should test other models to form an opinion. The 003_realSR_BSRGAN_DFOWMFC_s64w8_SwinIR-L_x4_GAN model seems to give good results in a reasonable amount of time. It's not possible to disable upscaling, but it is possible to choose LANCZOS for speed if Codeformer is enabled in the upscaled inswapper. The result is generally satisfactory. -+ **restorer** : The face restorer to be used if necessary. Codeformer generally gives good results. -+ **sharpening** can provide more natural results, but it may also add artifacts. The same goes for **color correction**. By default, these options are set to False. -+ **improved mask:** The segmentation mask for the upscaled swapper is designed to avoid the square mask and prevent degradation of the non-face parts of the image. It is based on the Codeformer implementation. If "Use improved segmented mask (use pastenet to mask only the face)" and "upscaled inswapper" are checked in the settings, the mask will only cover the face, and will not be squared. However, depending on the image, this might introduce different types of problems such as artifacts on the border of the face. -+ **fthresh and erosion factor:** it is possible to adjust the mask erosion parameters using the fthresh and erosion settings. The higher these settings are (particularly erosion), the more the mask is reduced. ## Processing order: @@ -123,42 +147,20 @@ The extension is activated after all other extensions have been processed. Duri ![](/assets/images/step4.png) -## Settings -Here are the parameters that can be configured in sd settings and their default values +## API -### General Settings : +A specific API is available. To understand how it works you can have a look at the example file in `client_utils`. You can also view the application's tests in the `tests` directory. - Name | Description | Default Value ----|---|--- - faceswaplab_model | Insightface model to use| models[0] if len(models) > 0 else "None" - faceswaplab_keep_original | keep original image before swapping. It true, will show original image | False - faceswaplab_units_count | How many faces units to use(requires restart) | 3 - faceswaplab_detection_threshold | Detection threshold to use to detect face, if low will detect non human face as face | 0.5 +The API is documented in the FaceSwapLab tags in the http://localhost:7860/docs docs. -### Default Settings : +You don't have to use the api_utils.py file and pydantic types, but it can save time. -These parameters are used to configure the default settings displayed in post-processing. - Name | Description | Default Value - faceswaplab_pp_default_face_restorer | UI Default post processing face restorer (requires restart) | None - faceswaplab_pp_default_face_restorer_visibility | UI Default post processing face restorer visibility (requires restart) | 1 - faceswaplab_pp_default_face_restorer_weight | UI Default post processing face restorer weight (requires restart) | 1 - faceswaplab_pp_default_upscaler | UI Default post processing upscaler (requires restart) | None - faceswaplab_pp_default_upscaler_visibility | UI Default post processing upscaler visibility(requires restart) | 1 +## Settings -### Upscaled inswapper Settings : +You can change the program's default behavior in your webui's global settings (FaceSwapLab section in settings). This is particularly useful if you want to have default options for inpainting or for post-processsing, for example. -These parameters are used to control the upscaled inswapper, see above. +The interface must be restarted to take the changes into account. Sometimes you have to reboot the entire webui server. - Name | Description | Default Value - faceswaplab_upscaled_swapper | Upscaled swapper. Applied only to the swapped faces. Apply transformations before merging with the original image | False - faceswaplab_upscaled_swapper_upscaler | Upscaled swapper upscaler (Recommended : LDSR but slow) | None - faceswaplab_upscaled_swapper_sharpen | Upscaled swapper sharpen | False - faceswaplab_upscaled_swapper_fixcolor | Upscaled swapper color correction | False - faceswaplab_upscaled_improved_mask | Use improved segmented mask (use pastenet to mask only the face) | True - faceswaplab_upscaled_swapper_face_restorer | Upscaled swapper face restorer | None - faceswaplab_upscaled_swapper_face_restorer_visibility | Upscaled swapper face restorer visibility | 1 - faceswaplab_upscaled_swapper_face_restorer_weight | Upscaled swapper face restorer weight (codeformer) | 1 - faceswaplab_upscaled_swapper_fthresh | Upscaled swapper fthresh (diff sensitivity) 10 = default behaviour. Low impact | 10 - faceswaplab_upscaled_swapper_erosion | Upscaled swapper mask erosion factor, 1 = default behaviour. The larger it is, the more blur is applied around the face. Too large and the facial change is no longer visible | 1 \ No newline at end of file +There may be display bugs on some radio buttons that may not display the value (Codeformer might look disabled for instance). Check the logs to ensure that the transformation has been applied. \ No newline at end of file diff --git a/install.py b/install.py index f1d7033..ba3aff8 100644 --- a/install.py +++ b/install.py @@ -2,39 +2,9 @@ import os import pkg_resources import sys -from tqdm import tqdm -import urllib.request -req_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), "requirements.txt") - -models_dir = os.path.abspath("models/faceswaplab") -faces_dir = os.path.abspath(os.path.join("models", "faceswaplab", "faces")) -model_url = "https://huggingface.co/henryruhs/roop/resolve/main/inswapper_128.onnx" -model_name = os.path.basename(model_url) -model_path = os.path.join(models_dir, model_name) - - -def download(url: str, path: str) -> None: - request = urllib.request.urlopen(url) - total = int(request.headers.get("Content-Length", 0)) - with tqdm( - total=total, desc="Downloading", unit="B", unit_scale=True, unit_divisor=1024 - ) as progress: - urllib.request.urlretrieve( - url, - path, - reporthook=lambda count, block_size, total_size: progress.update( - block_size - ), - ) - - -os.makedirs(models_dir, exist_ok=True) -os.makedirs(faces_dir, exist_ok=True) - -if not os.path.exists(model_path): - download(model_url, model_path) +req_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), "requirements.txt") print("Checking faceswaplab requirements") with open(req_file) as file: diff --git a/scripts/configure.py b/scripts/configure.py new file mode 100644 index 0000000..74c8b9c --- /dev/null +++ b/scripts/configure.py @@ -0,0 +1,79 @@ +import os +from tqdm import tqdm +import urllib.request +from scripts.faceswaplab_utils.faceswaplab_logging import logger +from scripts.faceswaplab_swapping.swapper import is_sha1_matching +from scripts.faceswaplab_utils.models_utils import get_models +from scripts.faceswaplab_globals import * +from packaging import version +import pkg_resources + +ALREADY_DONE = False + + +def check_configuration() -> None: + global ALREADY_DONE + + if ALREADY_DONE: + return + + logger.info(f"FaceSwapLab {VERSION_FLAG} Config :") + + # This has been moved here due to pb with sdnext in install.py not doing what a1111 is doing. + models_dir = MODELS_DIR + faces_dir = FACES_DIR + + model_url = "https://huggingface.co/henryruhs/roop/resolve/main/inswapper_128.onnx" + model_name = os.path.basename(model_url) + model_path = os.path.join(models_dir, model_name) + + def download(url: str, path: str) -> None: + request = urllib.request.urlopen(url) + total = int(request.headers.get("Content-Length", 0)) + with tqdm( + total=total, + desc="Downloading inswapper model", + unit="B", + unit_scale=True, + unit_divisor=1024, + ) as progress: + urllib.request.urlretrieve( + url, + path, + reporthook=lambda count, block_size, total_size: progress.update( + block_size + ), + ) + + os.makedirs(models_dir, exist_ok=True) + os.makedirs(faces_dir, exist_ok=True) + + if not is_sha1_matching(model_path, EXPECTED_INSWAPPER_SHA1): + logger.error( + "Suspicious sha1 for model %s, check the model is valid or has been downloaded adequately. Should be %s", + model_path, + EXPECTED_INSWAPPER_SHA1, + ) + + gradio_version = pkg_resources.get_distribution("gradio").version + + if version.parse(gradio_version) < version.parse("3.32.0"): + logger.warning( + "Errors may occur with gradio versions lower than 3.32.0. Your version : %s", + gradio_version, + ) + + if not os.path.exists(model_path): + download(model_url, model_path) + + def print_infos() -> None: + logger.info("FaceSwapLab config :") + logger.info("+ MODEL DIR : %s", models_dir) + models = get_models() + logger.info("+ MODELS: %s", models) + logger.info("+ FACES DIR : %s", faces_dir) + logger.info("+ ANALYZER DIR : %s", ANALYZER_DIR) + + print_infos() + + ALREADY_DONE = True diff --git a/scripts/faceswaplab.py b/scripts/faceswaplab.py index 82d66eb..a8d0b6b 100644 --- a/scripts/faceswaplab.py +++ b/scripts/faceswaplab.py @@ -2,6 +2,7 @@ import traceback from scripts import faceswaplab_globals +from scripts.configure import check_configuration from scripts.faceswaplab_api import faceswaplab_api from scripts.faceswaplab_postprocessing import upscaling from scripts.faceswaplab_settings import faceswaplab_settings @@ -65,8 +66,8 @@ class FaceSwapScript(scripts.Script): def __init__(self) -> None: - logger.info(f"FaceSwapLab {VERSION_FLAG}") super().__init__() + check_configuration() @property def units_count(self) -> int: diff --git a/scripts/faceswaplab_globals.py b/scripts/faceswaplab_globals.py index 11f70f4..4b43407 100644 --- a/scripts/faceswaplab_globals.py +++ b/scripts/faceswaplab_globals.py @@ -4,6 +4,8 @@ MODELS_DIR = os.path.abspath(os.path.join("models", "faceswaplab")) ANALYZER_DIR = os.path.abspath(os.path.join(MODELS_DIR, "analysers")) FACE_PARSER_DIR = os.path.abspath(os.path.join(MODELS_DIR, "parser")) +FACES_DIR = os.path.abspath(os.path.join(MODELS_DIR, "faces")) + REFERENCE_PATH = os.path.join( scripts.basedir(), "extensions", "sd-webui-faceswaplab", "references" ) @@ -13,3 +15,4 @@ # The NSFW score threshold. If any part of the image has a score greater than this threshold, the image will be considered NSFW. NSFW_SCORE_THRESHOLD: float = 0.7 +EXPECTED_INSWAPPER_SHA1 = "17a64851eaefd55ea597ee41e5c18409754244c5" diff --git a/scripts/faceswaplab_swapping/swapper.py b/scripts/faceswaplab_swapping/swapper.py index 677e49d..e61ee89 100644 --- a/scripts/faceswaplab_swapping/swapper.py +++ b/scripts/faceswaplab_swapping/swapper.py @@ -2,6 +2,7 @@ import os from dataclasses import dataclass from pprint import pformat +import traceback from typing import Any, Dict, Generator, List, Set, Tuple, Optional import tempfile from tqdm import tqdm @@ -271,7 +272,9 @@ def getAnalysisModel() -> insightface.app.FaceAnalysis: logger.info("Load analysis model, will take some time. (> 30s)") # Initialize the analysis model with the specified name and providers - with tqdm(total=1, desc="Loading analysis model", unit="model") as pbar: + with tqdm( + total=1, desc="Loading analysis model (first time is slow)", unit="model" + ) as pbar: with capture_stdout() as captured: model = insightface.app.FaceAnalysis( name="buffalo_l", @@ -291,14 +294,21 @@ def getAnalysisModel() -> insightface.app.FaceAnalysis: def is_sha1_matching(file_path: str, expected_sha1: str) -> bool: sha1_hash = hashlib.sha1(usedforsecurity=False) - - with open(file_path, "rb") as file: - for byte_block in iter(lambda: file.read(4096), b""): - sha1_hash.update(byte_block) - if sha1_hash.hexdigest() == expected_sha1: - return True - else: - return False + try: + with open(file_path, "rb") as file: + for byte_block in iter(lambda: file.read(4096), b""): + sha1_hash.update(byte_block) + if sha1_hash.hexdigest() == expected_sha1: + return True + else: + return False + except Exception as e: + logger.error( + "Failed to check model hash, check the model is valid or has been downloaded adequately : %e", + e, + ) + traceback.print_exc() + return False @lru_cache(maxsize=1) @@ -334,8 +344,6 @@ def getFaceSwapModel(model_path: str) -> upscaled_inswapper.UpscaledINSwapper: logger.error( "Loading of swapping model failed, please check the requirements (On Windows, download and install Visual Studio. During the install, make sure to include the Python and C++ packages.)" ) - import traceback - traceback.print_exc() raise FaceModelException("Loading of swapping model failed") @@ -379,6 +387,8 @@ def get_faces( # Sort the detected faces based on their x-coordinate of the bounding box return sorted(face, key=lambda x: x.bbox[0]) except Exception as e: + logger.error("Failed to get faces %s", e) + traceback.print_exc() return [] diff --git a/scripts/faceswaplab_swapping/upscaled_inswapper.py b/scripts/faceswaplab_swapping/upscaled_inswapper.py index dd66d82..441a886 100644 --- a/scripts/faceswaplab_swapping/upscaled_inswapper.py +++ b/scripts/faceswaplab_swapping/upscaled_inswapper.py @@ -193,7 +193,7 @@ def compute_diff(bgr_fake: CV2ImgU8, aimg: CV2ImgU8) -> CV2ImgU8: if options: logger.info("*" * 80) - logger.info(f"Upscaled inswapper") + logger.info(f"Inswapper") if options.upscaler_name: # Upscale original image From 26ac28634f11267c4b834c722891de61cc3e0273 Mon Sep 17 00:00:00 2001 From: Tran Xen <137925069+glucauze@users.noreply.github.com> Date: Fri, 4 Aug 2023 01:11:33 +0200 Subject: [PATCH 7/7] fix extract --- client_api/faceswaplab_api_example.py | 2 ++ scripts/faceswaplab_swapping/upscaled_inswapper.py | 1 + scripts/faceswaplab_ui/faceswaplab_tab.py | 4 +++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/client_api/faceswaplab_api_example.py b/client_api/faceswaplab_api_example.py index 9a5a522..94748cc 100644 --- a/client_api/faceswaplab_api_example.py +++ b/client_api/faceswaplab_api_example.py @@ -18,6 +18,8 @@ address = "http://127.0.0.1:7860" +# This has been tested on Linux platforms. This might requires some minor adaptations for windows. + ############################# # FaceSwap diff --git a/scripts/faceswaplab_swapping/upscaled_inswapper.py b/scripts/faceswaplab_swapping/upscaled_inswapper.py index 441a886..ec3fe7d 100644 --- a/scripts/faceswaplab_swapping/upscaled_inswapper.py +++ b/scripts/faceswaplab_swapping/upscaled_inswapper.py @@ -210,6 +210,7 @@ def compute_diff(bgr_fake: CV2ImgU8, aimg: CV2ImgU8) -> CV2ImgU8: ) if options.improved_mask: + logger.info("improved_mask") mask = get_face_mask(aimg, bgr_fake) bgr_fake = merge_images_with_mask(aimg, bgr_fake, mask) diff --git a/scripts/faceswaplab_ui/faceswaplab_tab.py b/scripts/faceswaplab_ui/faceswaplab_tab.py index c2c659f..9c90cb3 100644 --- a/scripts/faceswaplab_ui/faceswaplab_tab.py +++ b/scripts/faceswaplab_ui/faceswaplab_tab.py @@ -70,7 +70,9 @@ def extract_faces( logger.error("You need at least one image file to extract") return [] try: - postprocess_options = PostProcessingOptions(*components) # type: ignore + postprocess_options = dataclasses_from_flat_list( + [PostProcessingOptions], components + ).pop() images = [ Image.open(file.name) for file in files ] # potentially greedy but Image.open is supposed to be lazy