From ea624b906866a9b6623ef95617d412655baad997 Mon Sep 17 00:00:00 2001 From: Konie Date: Thu, 28 Dec 2023 12:21:01 +0800 Subject: [PATCH 1/2] Optimize generation request default params --- examples/examples.py | 180 +--------------------------------------- examples/examples_v1.py | 5 +- fooocusapi/api_utils.py | 4 +- fooocusapi/img_utils.py | 4 +- fooocusapi/models.py | 2 +- fooocusapi/models_v2.py | 18 ++-- fooocusapi/worker.py | 2 +- 7 files changed, 21 insertions(+), 194 deletions(-) diff --git a/examples/examples.py b/examples/examples.py index e59001c..aa5b399 100644 --- a/examples/examples.py +++ b/examples/examples.py @@ -24,194 +24,18 @@ class Config(): cfg = Config() upscale_params = { - "prompt": "", - "negative_prompt": "", - "style_selections": [ - "Fooocus V2", - "Fooocus Enhance", - "Fooocus Sharp" - ], - "performance_selection": "Speed", - "aspect_ratios_selection": "1152*896", - "image_number": 1, - "image_seed": -1, - "sharpness": 2, - "guidance_scale": 4, - "base_model_name": "juggernautXL_version6Rundiffusion.safetensors", - "refiner_model_name": "None", - "refiner_switch": 0.5, - "loras": [ - { - "model_name": "sd_xl_offset_example-lora_1.0.safetensors", - "weight": 0.1 - } - ], - "advanced_params": { - "disable_preview": False, - "adm_scaler_positive": 1.5, - "adm_scaler_negative": 0.8, - "adm_scaler_end": 0.3, - "refiner_swap_method": "joint", - "adaptive_cfg": 7, - "sampler_name": "dpmpp_2m_sde_gpu", - "scheduler_name": "karras", - "overwrite_step": -1, - "overwrite_switch": -1, - "overwrite_width": -1, - "overwrite_height": -1, - "overwrite_vary_strength": -1, - "overwrite_upscale_strength": -1, - "mixing_image_prompt_and_vary_upscale": False, - "mixing_image_prompt_and_inpaint": False, - "debugging_cn_preprocessor": False, - "skipping_cn_preprocessor": False, - "controlnet_softness": 0.25, - "canny_low_threshold": 64, - "canny_high_threshold": 128, - "freeu_enabled": False, - "freeu_b1": 1.01, - "freeu_b2": 1.02, - "freeu_s1": 0.99, - "freeu_s2": 0.95, - "debugging_inpaint_preprocessor": False, - "inpaint_disable_initial_latent": False, - "inpaint_engine": inpaint_engine, - "inpaint_strength": 1, - "inpaint_respective_field": 1 - }, - "require_base64": False, - "async_process": False, "uov_method": "Upscale (Custom)", "upscale_value": 3, "input_image": "" } inpaint_params = { - "prompt": "", - "negative_prompt": "", - "style_selections": [ - "Fooocus V2", - "Fooocus Enhance", - "Fooocus Sharp" - ], - "performance_selection": "Speed", - "aspect_ratios_selection": "1152*896", - "image_number": 1, - "image_seed": -1, - "sharpness": 2, - "guidance_scale": 4, - "base_model_name": "juggernautXL_version6Rundiffusion.safetensors", - "refiner_model_name": "None", - "refiner_switch": 0.5, - "loras": [ - { - "model_name": "sd_xl_offset_example-lora_1.0.safetensors", - "weight": 0.1 - } - ], - "advanced_params": { - "disable_preview": False, - "adm_scaler_positive": 1.5, - "adm_scaler_negative": 0.8, - "adm_scaler_end": 0.3, - "refiner_swap_method": "joint", - "adaptive_cfg": 7, - "sampler_name": "dpmpp_2m_sde_gpu", - "scheduler_name": "karras", - "overwrite_step": -1, - "overwrite_switch": -1, - "overwrite_width": -1, - "overwrite_height": -1, - "overwrite_vary_strength": -1, - "overwrite_upscale_strength": -1, - "mixing_image_prompt_and_vary_upscale": False, - "mixing_image_prompt_and_inpaint": False, - "debugging_cn_preprocessor": False, - "skipping_cn_preprocessor": False, - "controlnet_softness": 0.25, - "canny_low_threshold": 64, - "canny_high_threshold": 128, - "freeu_enabled": False, - "freeu_b1": 1.01, - "freeu_b2": 1.02, - "freeu_s1": 0.99, - "freeu_s2": 0.95, - "debugging_inpaint_preprocessor": False, - "inpaint_disable_initial_latent": False, - "inpaint_engine": inpaint_engine, - "inpaint_strength": 1, - "inpaint_respective_field": 1 - }, - "require_base64": False, - "async_process": False, "input_image": "", "input_mask": None, "inpaint_additional_prompt": None, - "outpaint_selections": [], - "outpaint_distance_left": 0, - "outpaint_distance_right": 0, - "outpaint_distance_top": 0, - "outpaint_distance_bottom": 0, } img_prompt_params = { - "prompt": "", - "negative_prompt": "", - "style_selections": [ - "Fooocus V2", - "Fooocus Enhance", - "Fooocus Sharp" - ], - "performance_selection": "Speed", - "aspect_ratios_selection": "1152*896", - "image_number": 1, - "image_seed": -1, - "sharpness": 2, - "guidance_scale": 4, - "base_model_name": "juggernautXL_version6Rundiffusion.safetensors", - "refiner_model_name": "None", - "refiner_switch": 0.5, - "loras": [ - { - "model_name": "sd_xl_offset_example-lora_1.0.safetensors", - "weight": 0.1 - } - ], - "advanced_params": { - "disable_preview": False, - "adm_scaler_positive": 1.5, - "adm_scaler_negative": 0.8, - "adm_scaler_end": 0.3, - "refiner_swap_method": "joint", - "adaptive_cfg": 7, - "sampler_name": "dpmpp_2m_sde_gpu", - "scheduler_name": "karras", - "overwrite_step": -1, - "overwrite_switch": -1, - "overwrite_width": -1, - "overwrite_height": -1, - "overwrite_vary_strength": -1, - "overwrite_upscale_strength": -1, - "mixing_image_prompt_and_vary_upscale": False, - "mixing_image_prompt_and_inpaint": False, - "debugging_cn_preprocessor": False, - "skipping_cn_preprocessor": False, - "controlnet_softness": 0.25, - "canny_low_threshold": 64, - "canny_high_threshold": 128, - "freeu_enabled": False, - "freeu_b1": 1.01, - "freeu_b2": 1.02, - "freeu_s1": 0.99, - "freeu_s2": 0.95, - "debugging_inpaint_preprocessor": False, - "inpaint_disable_initial_latent": False, - "inpaint_engine": inpaint_engine, - "inpaint_strength": 1, - "inpaint_respective_field": 1 - }, - "require_base64": False, - "async_process": False, "image_prompts": [] } @@ -291,6 +115,6 @@ def image_prompt(img_prompt: list, params: dict) -> dict: "cn_type": "ImagePrompt" } ] -print(upscale_vary(image=image_base64)) +# print(upscale_vary(image=image_base64)) # print(inpaint_outpaint(input_image=s_base64, input_mask=m_base64)) -# print(image_prompt(img_prompt=img_prompt, params=img_prompt_params)) +print(image_prompt(img_prompt=img_prompt, params=img_prompt_params)) diff --git a/examples/examples_v1.py b/examples/examples_v1.py index 5a4fa69..19c8140 100644 --- a/examples/examples_v1.py +++ b/examples/examples_v1.py @@ -2,6 +2,7 @@ import requests import os import base64 +from examples.models import ControlNetEnum, ImagePromptParams, ImagePromptParamsJson, ImgInpaintOrOutpaintParams, ImgInpaintOrOutpaintParamsJson, ImgUpscaleOrVaryParams, ImgUpscaleOrVaryParamsJson, Text2ImgParams, UpscaleOrVaryMethod from models import * @@ -24,9 +25,9 @@ def txt2img(params: Text2ImgParams) -> dict: """ text to image """ - date = json.dumps(params.model_dump()) + data = json.dumps(params.model_dump()) response = requests.post(url=f"{cfg.fooocus_host}{cfg.text2img}", - data=date, + data=data, timeout=30) return response.json() diff --git a/fooocusapi/api_utils.py b/fooocusapi/api_utils.py index f2acfd0..35f3095 100644 --- a/fooocusapi/api_utils.py +++ b/fooocusapi/api_utils.py @@ -82,9 +82,9 @@ def req_to_params(req: Text2ImgRequest) -> ImageGenerationParams: for img_prompt in req.image_prompts: if img_prompt.cn_img is not None: cn_img = read_input_image(img_prompt.cn_img) - if img_prompt.cn_stop is None: + if img_prompt.cn_stop is None or img_prompt.cn_stop == 0: img_prompt.cn_stop = flags.default_parameters[img_prompt.cn_type.value][0] - if img_prompt.cn_weight is None: + if img_prompt.cn_weight is None or img_prompt.cn_weight == 0: img_prompt.cn_weight = flags.default_parameters[img_prompt.cn_type.value][1] image_prompts.append( (cn_img, img_prompt.cn_stop, img_prompt.cn_weight, img_prompt.cn_type.value)) diff --git a/fooocusapi/img_utils.py b/fooocusapi/img_utils.py index 3543b2d..abf2e9c 100644 --- a/fooocusapi/img_utils.py +++ b/fooocusapi/img_utils.py @@ -35,7 +35,9 @@ def read_input_image(input_image: UploadFile) -> np.ndarray: image = np.array(pil_image) return image -def base64_to_stream(image: str) -> UploadFile: +def base64_to_stream(image: str) -> UploadFile | None: + if image == '': + return None if image.startswith('data:image'): image = image.split(sep=',', maxsplit=1)[1] image_bytes = base64.b64decode(image) diff --git a/fooocusapi/models.py b/fooocusapi/models.py index 2033bd5..146ba65 100644 --- a/fooocusapi/models.py +++ b/fooocusapi/models.py @@ -4,7 +4,7 @@ from fastapi.params import File from fastapi.exceptions import RequestValidationError -from pydantic import BaseModel, ConfigDict, Field, TypeAdapter, ValidationError, parse_obj_as +from pydantic import BaseModel, ConfigDict, Field, TypeAdapter, ValidationError from pydantic_core import InitErrorDetails from typing import List diff --git a/fooocusapi/models_v2.py b/fooocusapi/models_v2.py index e3ec1e1..2bd475e 100644 --- a/fooocusapi/models_v2.py +++ b/fooocusapi/models_v2.py @@ -3,25 +3,25 @@ class ImgUpscaleOrVaryRequestJson(Text2ImgRequest): uov_method: UpscaleOrVaryMethod = "Upscale (2x)" - upscale_value: float | None = Field(None, ge=1.0, le=5.0, description="Upscale custom value, None for default value") + upscale_value: float | None = Field(1.0, ge=1.0, le=5.0, description="Upscale custom value, 1.0 for default value") input_image: str = Field(description="Init image for upsacale or outpaint as base64") class ImgInpaintOrOutpaintRequestJson(Text2ImgRequest): input_image: str = Field(description="Init image for inpaint or outpaint as base64") - input_mask: str | None = Field(None, description="Inpaint or outpaint mask as base64") - inpaint_additional_prompt: str | None = Field(None, description="Describe what you want to inpaint") + input_mask: str | None = Field('', description="Inpaint or outpaint mask as base64") + inpaint_additional_prompt: str | None = Field('', description="Describe what you want to inpaint") outpaint_selections: List[OutpaintExpansion] = [] - outpaint_distance_left: int = Field(default=0, description="Set outpaint left distance"), - outpaint_distance_right: int = Field(default=0, description="Set outpaint right distance"), - outpaint_distance_top: int = Field(default=0, description="Set outpaint top distance"), - outpaint_distance_bottom: int = Field(default=0, description="Set outpaint bottom distance"), + outpaint_distance_left: int | None = Field(-1, description="Set outpaint left distance") + outpaint_distance_right: int | None = Field(-1, description="Set outpaint right distance") + outpaint_distance_top: int | None = Field(-1, description="Set outpaint top distance") + outpaint_distance_bottom: int | None = Field(-1, description="Set outpaint bottom distance") class ImagePromptJson(BaseModel): cn_img: str | None = Field(None, description="Input image for image prompt as base64") - cn_stop: float | None = Field(None, ge=0, le=1, description="Stop at for image prompt, None for default value") - cn_weight: float | None = Field(None, ge=0, le=2, description="Weight for image prompt, None for default value") + cn_stop: float | None = Field(0, ge=0, le=1, description="Stop at for image prompt, 0 for default value") + cn_weight: float | None = Field(0, ge=0, le=2, description="Weight for image prompt, 0 for default value") cn_type: ControlNetType = Field(default=ControlNetType.cn_ip, description="ControlNet type for image prompt") diff --git a/fooocusapi/worker.py b/fooocusapi/worker.py index e561440..a2930f0 100644 --- a/fooocusapi/worker.py +++ b/fooocusapi/worker.py @@ -470,7 +470,7 @@ def yield_result(_, imgs, tasks): print(f'Image upscaled.') f = 1.0 - if upscale_value is not None: + if upscale_value is not None and upscale_value > 1.0: f = upscale_value else: pattern = r"([0-9]+(?:\.[0-9]+)?)x" From 8d3a2837441ac2a6cc5978389cf91c957e625dee Mon Sep 17 00:00:00 2001 From: Konie Date: Thu, 28 Dec 2023 13:58:18 +0800 Subject: [PATCH 2/2] Support inpaint and outpaint when call image prompt --- docs/openapi.json | 2 +- examples/examples.py | 26 +++++++++++------ examples/examples_v1.py | 2 +- examples/imgs/1485005453352708.jpeg | Bin 46900 -> 0 bytes examples/imgs/bear.jpg | Bin 0 -> 49756 bytes fooocusapi/api.py | 9 ++++-- fooocusapi/api_utils.py | 4 +++ fooocusapi/models.py | 42 ++++++++++++++++++++++------ fooocusapi/models_v2.py | 3 +- fooocusapi/parameters.py | 4 +++ fooocusapi/worker.py | 2 +- 11 files changed, 72 insertions(+), 22 deletions(-) delete mode 100644 examples/imgs/1485005453352708.jpeg create mode 100644 examples/imgs/bear.jpg diff --git a/docs/openapi.json b/docs/openapi.json index 9199149..f3c64c2 100755 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -1 +1 @@ -{"openapi":"3.1.0","info":{"title":"FastAPI","version":"0.1.0"},"paths":{"/":{"get":{"summary":"Home","operationId":"home__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/generation/text-to-image":{"post":{"summary":"Text2Img Generation","operationId":"text2img_generation_v1_generation_text_to_image_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Text2ImgRequest"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Text2Img Generation V1 Generation Text To Image Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/generation/image-upscale-vary":{"post":{"summary":"Img Upscale Or Vary","operationId":"img_upscale_or_vary_v1_generation_image_upscale_vary_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_img_upscale_or_vary_v1_generation_image_upscale_vary_post"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Img Upscale Or Vary V1 Generation Image Upscale Vary Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/generation/image-upscale-vary":{"post":{"summary":"Img Upscale Or Vary V2","operationId":"img_upscale_or_vary_v2_v2_generation_image_upscale_vary_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImgUpscaleOrVaryRequestJson"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Img Upscale Or Vary V2 V2 Generation Image Upscale Vary Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/generation/image-inpait-outpaint":{"post":{"summary":"Img Inpaint Or Outpaint","operationId":"img_inpaint_or_outpaint_v1_generation_image_inpait_outpaint_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_img_inpaint_or_outpaint_v1_generation_image_inpait_outpaint_post"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Img Inpaint Or Outpaint V1 Generation Image Inpait Outpaint Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/generation/image-inpait-outpaint":{"post":{"summary":"Img Inpaint Or Outpaint V2","operationId":"img_inpaint_or_outpaint_v2_v2_generation_image_inpait_outpaint_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImgInpaintOrOutpaintRequestJson"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Img Inpaint Or Outpaint V2 V2 Generation Image Inpait Outpaint Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/generation/image-prompt":{"post":{"summary":"Img Prompt","operationId":"img_prompt_v1_generation_image_prompt_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"allOf":[{"$ref":"#/components/schemas/Body_img_prompt_v1_generation_image_prompt_post"}],"title":"Body"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Img Prompt V1 Generation Image Prompt Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/generation/image-prompt":{"post":{"summary":"Img Prompt","operationId":"img_prompt_v2_generation_image_prompt_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImgPromptRequestJson"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Img Prompt V2 Generation Image Prompt Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/generation/query-job":{"get":{"summary":"Query Job","description":"Query async generation job","operationId":"query_job_v1_generation_query_job_get","parameters":[{"name":"job_id","in":"query","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"require_step_preivew","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Require Step Preivew"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AsyncJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/generation/job-queue":{"get":{"summary":"Job Queue","description":"Query job queue info","operationId":"job_queue_v1_generation_job_queue_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobQueueInfo"}}}}}}},"/v1/generation/stop":{"post":{"summary":"Stop","description":"Job stoping","operationId":"stop_v1_generation_stop_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StopResponse"}}}}}}},"/v1/engines/all-models":{"get":{"summary":"All Models","description":"Get all filenames of base model and lora","operationId":"all_models_v1_engines_all_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AllModelNamesResponse"}}}}}}},"/v1/engines/refresh-models":{"post":{"summary":"Refresh Models","description":"Refresh local files and get all filenames of base model and lora","operationId":"refresh_models_v1_engines_refresh_models_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AllModelNamesResponse"}}}}}}},"/v1/engines/styles":{"get":{"summary":"All Styles","description":"Get all legal Fooocus styles","operationId":"all_styles_v1_engines_styles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array","title":"Response All Styles V1 Engines Styles Get"}}}}}}}},"components":{"schemas":{"AdvancedParams":{"properties":{"disable_preview":{"type":"boolean","title":"Disable Preview","description":"Disable preview during generation","default":false},"adm_scaler_positive":{"type":"number","maximum":3.0,"minimum":0.1,"title":"Adm Scaler Positive","description":"Positive ADM Guidance Scaler","default":1.5},"adm_scaler_negative":{"type":"number","maximum":3.0,"minimum":0.1,"title":"Adm Scaler Negative","description":"Negative ADM Guidance Scaler","default":0.8},"adm_scaler_end":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Adm Scaler End","description":"ADM Guidance End At Step","default":0.3},"refiner_swap_method":{"type":"string","title":"Refiner Swap Method","description":"Refiner swap method","default":"joint"},"adaptive_cfg":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Adaptive Cfg","description":"CFG Mimicking from TSNR","default":7.0},"sampler_name":{"type":"string","title":"Sampler Name","description":"Sampler","default":"dpmpp_2m_sde_gpu"},"scheduler_name":{"type":"string","title":"Scheduler Name","description":"Scheduler","default":"karras"},"overwrite_step":{"type":"integer","maximum":200.0,"minimum":-1.0,"title":"Overwrite Step","description":"Forced Overwrite of Sampling Step","default":-1},"overwrite_switch":{"type":"integer","maximum":200.0,"minimum":-1.0,"title":"Overwrite Switch","description":"Forced Overwrite of Refiner Switch Step","default":-1},"overwrite_width":{"type":"integer","maximum":2048.0,"minimum":-1.0,"title":"Overwrite Width","description":"Forced Overwrite of Generating Width","default":-1},"overwrite_height":{"type":"integer","maximum":2048.0,"minimum":-1.0,"title":"Overwrite Height","description":"Forced Overwrite of Generating Height","default":-1},"overwrite_vary_strength":{"type":"number","maximum":1.0,"minimum":-1.0,"title":"Overwrite Vary Strength","description":"Forced Overwrite of Denoising Strength of \"Vary\"","default":-1},"overwrite_upscale_strength":{"type":"number","maximum":1.0,"minimum":-1.0,"title":"Overwrite Upscale Strength","description":"Forced Overwrite of Denoising Strength of \"Upscale\"","default":-1},"mixing_image_prompt_and_vary_upscale":{"type":"boolean","title":"Mixing Image Prompt And Vary Upscale","description":"Mixing Image Prompt and Vary/Upscale","default":false},"mixing_image_prompt_and_inpaint":{"type":"boolean","title":"Mixing Image Prompt And Inpaint","description":"Mixing Image Prompt and Inpaint","default":false},"debugging_cn_preprocessor":{"type":"boolean","title":"Debugging Cn Preprocessor","description":"Debug Preprocessors","default":false},"skipping_cn_preprocessor":{"type":"boolean","title":"Skipping Cn Preprocessor","description":"Skip Preprocessors","default":false},"controlnet_softness":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Controlnet Softness","description":"Softness of ControlNet","default":0.25},"canny_low_threshold":{"type":"integer","maximum":255.0,"minimum":1.0,"title":"Canny Low Threshold","description":"Canny Low Threshold","default":64},"canny_high_threshold":{"type":"integer","maximum":255.0,"minimum":1.0,"title":"Canny High Threshold","description":"Canny High Threshold","default":128},"freeu_enabled":{"type":"boolean","title":"Freeu Enabled","description":"FreeU enabled","default":false},"freeu_b1":{"type":"number","title":"Freeu B1","description":"FreeU B1","default":1.01},"freeu_b2":{"type":"number","title":"Freeu B2","description":"FreeU B2","default":1.02},"freeu_s1":{"type":"number","title":"Freeu S1","description":"FreeU B3","default":0.99},"freeu_s2":{"type":"number","title":"Freeu S2","description":"FreeU B4","default":0.95},"debugging_inpaint_preprocessor":{"type":"boolean","title":"Debugging Inpaint Preprocessor","description":"Debug Inpaint Preprocessing","default":false},"inpaint_disable_initial_latent":{"type":"boolean","title":"Inpaint Disable Initial Latent","description":"Disable initial latent in inpaint","default":false},"inpaint_engine":{"type":"string","title":"Inpaint Engine","description":"Inpaint Engine","default":"v1"},"inpaint_strength":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Inpaint Strength","description":"Inpaint Denoising Strength","default":1.0},"inpaint_respective_field":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Inpaint Respective Field","description":"Inpaint Respective Field","default":1.0}},"type":"object","title":"AdvancedParams"},"AllModelNamesResponse":{"properties":{"model_filenames":{"items":{"type":"string"},"type":"array","title":"Model Filenames","description":"All available model filenames"},"lora_filenames":{"items":{"type":"string"},"type":"array","title":"Lora Filenames","description":"All available lora filenames"}},"type":"object","required":["model_filenames","lora_filenames"],"title":"AllModelNamesResponse"},"AsyncJobResponse":{"properties":{"job_id":{"type":"string","title":"Job Id","description":"Job ID"},"job_type":{"allOf":[{"$ref":"#/components/schemas/TaskType"}],"description":"Job type"},"job_stage":{"allOf":[{"$ref":"#/components/schemas/AsyncJobStage"}],"description":"Job running stage"},"job_progress":{"type":"integer","title":"Job Progress","description":"Job running progress, 100 is for finished."},"job_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Status","description":"Job running status in text"},"job_step_preview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Step Preview","description":"Preview image of generation steps at current time, as base64 image"},"job_result":{"anyOf":[{"items":{"$ref":"#/components/schemas/GeneratedImageResult"},"type":"array"},{"type":"null"}],"title":"Job Result","description":"Job generation result"}},"type":"object","required":["job_id","job_type","job_stage","job_progress"],"title":"AsyncJobResponse"},"AsyncJobStage":{"type":"string","enum":["WAITING","RUNNING","SUCCESS","ERROR"],"title":"AsyncJobStage"},"Body_img_inpaint_or_outpaint_v1_generation_image_inpait_outpaint_post":{"properties":{"input_image":{"type":"string","format":"binary","title":"Input Image","description":"Init image for inpaint or outpaint"},"input_mask":{"type":"string","format":"binary","title":"Input Mask","description":"Inpaint or outpaint mask"},"inpaint_additional_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inpaint Additional Prompt","description":"Describe what you want to inpaint"},"outpaint_selections":{"items":{"type":"string"},"type":"array","title":"Outpaint Selections","description":"Outpaint expansion selections, literal 'Left', 'Right', 'Top', 'Bottom' seperated by comma","default":[]},"outpaint_distance_left":{"type":"integer","title":"Outpaint Distance Left","description":"Set outpaint left distance, 0 for default","default":0},"outpaint_distance_right":{"type":"integer","title":"Outpaint Distance Right","description":"Set outpaint right distance, 0 for default","default":0},"outpaint_distance_top":{"type":"integer","title":"Outpaint Distance Top","description":"Set outpaint top distance, 0 for default","default":0},"outpaint_distance_bottom":{"type":"integer","title":"Outpaint Distance Bottom","description":"Set outpaint bottom distance, 0 for default","default":0},"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","description":"Fooocus style selections, seperated by comma","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Loras","description":"Lora config in JSON. Format as [{\"model_name\": \"sd_xl_offset_example-lora_1.0.safetensors\", \"weight\": 0.5}]","default":"[{\"model_name\":\"sd_xl_offset_example-lora_1.0.safetensors\",\"weight\":0.1}]"},"advanced_params":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Advanced Params","description":"Advanced parameters in JSON"},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false}},"type":"object","required":["input_image"],"title":"Body_img_inpaint_or_outpaint_v1_generation_image_inpait_outpaint_post"},"Body_img_prompt_v1_generation_image_prompt_post":{"properties":{"cn_img1":{"type":"string","format":"binary","title":"Cn Img1","description":"Input image for image prompt"},"cn_stop1":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Cn Stop1","description":"Stop at for image prompt, None for default value"},"cn_weight1":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Cn Weight1","description":"Weight for image prompt, None for default value"},"cn_type1":{"allOf":[{"$ref":"#/components/schemas/ControlNetType"}],"description":"ControlNet type for image prompt","default":"ImagePrompt"},"cn_img2":{"type":"string","format":"binary","title":"Cn Img2","description":"Input image for image prompt"},"cn_stop2":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Cn Stop2","description":"Stop at for image prompt, None for default value"},"cn_weight2":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Cn Weight2","description":"Weight for image prompt, None for default value"},"cn_type2":{"allOf":[{"$ref":"#/components/schemas/ControlNetType"}],"description":"ControlNet type for image prompt","default":"ImagePrompt"},"cn_img3":{"type":"string","format":"binary","title":"Cn Img3","description":"Input image for image prompt"},"cn_stop3":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Cn Stop3","description":"Stop at for image prompt, None for default value"},"cn_weight3":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Cn Weight3","description":"Weight for image prompt, None for default value"},"cn_type3":{"allOf":[{"$ref":"#/components/schemas/ControlNetType"}],"description":"ControlNet type for image prompt","default":"ImagePrompt"},"cn_img4":{"type":"string","format":"binary","title":"Cn Img4","description":"Input image for image prompt"},"cn_stop4":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Cn Stop4","description":"Stop at for image prompt, None for default value"},"cn_weight4":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Cn Weight4","description":"Weight for image prompt, None for default value"},"cn_type4":{"allOf":[{"$ref":"#/components/schemas/ControlNetType"}],"description":"ControlNet type for image prompt","default":"ImagePrompt"},"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","description":"Fooocus style selections, seperated by comma","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Loras","description":"Lora config in JSON. Format as [{\"model_name\": \"sd_xl_offset_example-lora_1.0.safetensors\", \"weight\": 0.5}]","default":"[{\"model_name\":\"sd_xl_offset_example-lora_1.0.safetensors\",\"weight\":0.1}]"},"advanced_params":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Advanced Params","description":"Advanced parameters in JSON"},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false}},"type":"object","title":"Body_img_prompt_v1_generation_image_prompt_post"},"Body_img_upscale_or_vary_v1_generation_image_upscale_vary_post":{"properties":{"input_image":{"type":"string","format":"binary","title":"Input Image","description":"Init image for upsacale or outpaint"},"uov_method":{"$ref":"#/components/schemas/UpscaleOrVaryMethod"},"upscale_value":{"anyOf":[{"type":"number","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Upscale Value","description":"Upscale custom value, None for default value"},"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","description":"Fooocus style selections, seperated by comma","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Loras","description":"Lora config in JSON. Format as [{\"model_name\": \"sd_xl_offset_example-lora_1.0.safetensors\", \"weight\": 0.5}]","default":"[{\"model_name\":\"sd_xl_offset_example-lora_1.0.safetensors\",\"weight\":0.1}]"},"advanced_params":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Advanced Params","description":"Advanced parameters in JSON"},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false}},"type":"object","required":["input_image","uov_method"],"title":"Body_img_upscale_or_vary_v1_generation_image_upscale_vary_post"},"ControlNetType":{"type":"string","enum":["ImagePrompt","FaceSwap","PyraCanny","CPDS"],"title":"ControlNetType"},"GeneratedImageResult":{"properties":{"base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base64","description":"Image encoded in base64, or null if finishReasen is not 'SUCCESS', only return when request require base64"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Image file static serve url, or null if finishReasen is not 'SUCCESS'"},"seed":{"type":"string","title":"Seed","description":"The seed associated with this image"},"finish_reason":{"$ref":"#/components/schemas/GenerationFinishReason"}},"type":"object","required":["base64","url","seed","finish_reason"],"title":"GeneratedImageResult"},"GenerationFinishReason":{"type":"string","enum":["SUCCESS","QUEUE_IS_FULL","USER_CANCEL","ERROR"],"title":"GenerationFinishReason"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ImagePrompt":{"properties":{"cn_img":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"Cn Img"},"cn_stop":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Cn Stop"},"cn_weight":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Cn Weight","description":"None for default value"},"cn_type":{"allOf":[{"$ref":"#/components/schemas/ControlNetType"}],"default":"ImagePrompt"}},"type":"object","title":"ImagePrompt"},"ImagePromptJson":{"properties":{"cn_img":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cn Img","description":"Input image for image prompt as base64"},"cn_stop":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Cn Stop","description":"Stop at for image prompt, None for default value"},"cn_weight":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Cn Weight","description":"Weight for image prompt, None for default value"},"cn_type":{"allOf":[{"$ref":"#/components/schemas/ControlNetType"}],"description":"ControlNet type for image prompt","default":"ImagePrompt"}},"type":"object","title":"ImagePromptJson"},"ImgInpaintOrOutpaintRequestJson":{"properties":{"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"items":{"$ref":"#/components/schemas/Lora"},"type":"array","title":"Loras","default":[{"model_name":"sd_xl_offset_example-lora_1.0.safetensors","weight":0.1}]},"advanced_params":{"anyOf":[{"$ref":"#/components/schemas/AdvancedParams"},{"type":"null"}],"default":{"adaptive_cfg":7.0,"adm_scaler_end":0.3,"adm_scaler_negative":0.8,"adm_scaler_positive":1.5,"canny_high_threshold":128,"canny_low_threshold":64,"controlnet_softness":0.25,"debugging_cn_preprocessor":false,"debugging_inpaint_preprocessor":false,"disable_preview":false,"freeu_b1":1.01,"freeu_b2":1.02,"freeu_enabled":false,"freeu_s1":0.99,"freeu_s2":0.95,"inpaint_disable_initial_latent":false,"inpaint_engine":"v1","inpaint_respective_field":1.0,"inpaint_strength":1.0,"mixing_image_prompt_and_inpaint":false,"mixing_image_prompt_and_vary_upscale":false,"overwrite_height":-1,"overwrite_step":-1,"overwrite_switch":-1,"overwrite_upscale_strength":-1.0,"overwrite_vary_strength":-1.0,"overwrite_width":-1,"refiner_swap_method":"joint","sampler_name":"dpmpp_2m_sde_gpu","scheduler_name":"karras","skipping_cn_preprocessor":false}},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false},"input_image":{"type":"string","title":"Input Image","description":"Init image for inpaint or outpaint as base64"},"input_mask":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Mask","description":"Inpaint or outpaint mask as base64"},"inpaint_additional_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inpaint Additional Prompt","description":"Describe what you want to inpaint"},"outpaint_selections":{"items":{"$ref":"#/components/schemas/OutpaintExpansion"},"type":"array","title":"Outpaint Selections","default":[]},"outpaint_distance_left":{"type":"integer","title":"Outpaint Distance Left"},"outpaint_distance_right":{"type":"integer","title":"Outpaint Distance Right"},"outpaint_distance_top":{"type":"integer","title":"Outpaint Distance Top"},"outpaint_distance_bottom":{"type":"integer","title":"Outpaint Distance Bottom"}},"type":"object","required":["input_image"],"title":"ImgInpaintOrOutpaintRequestJson"},"ImgPromptRequestJson":{"properties":{"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"items":{"$ref":"#/components/schemas/Lora"},"type":"array","title":"Loras","default":[{"model_name":"sd_xl_offset_example-lora_1.0.safetensors","weight":0.1}]},"advanced_params":{"anyOf":[{"$ref":"#/components/schemas/AdvancedParams"},{"type":"null"}],"default":{"adaptive_cfg":7.0,"adm_scaler_end":0.3,"adm_scaler_negative":0.8,"adm_scaler_positive":1.5,"canny_high_threshold":128,"canny_low_threshold":64,"controlnet_softness":0.25,"debugging_cn_preprocessor":false,"debugging_inpaint_preprocessor":false,"disable_preview":false,"freeu_b1":1.01,"freeu_b2":1.02,"freeu_enabled":false,"freeu_s1":0.99,"freeu_s2":0.95,"inpaint_disable_initial_latent":false,"inpaint_engine":"v1","inpaint_respective_field":1.0,"inpaint_strength":1.0,"mixing_image_prompt_and_inpaint":false,"mixing_image_prompt_and_vary_upscale":false,"overwrite_height":-1,"overwrite_step":-1,"overwrite_switch":-1,"overwrite_upscale_strength":-1.0,"overwrite_vary_strength":-1.0,"overwrite_width":-1,"refiner_swap_method":"joint","sampler_name":"dpmpp_2m_sde_gpu","scheduler_name":"karras","skipping_cn_preprocessor":false}},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false},"image_prompts":{"items":{"anyOf":[{"$ref":"#/components/schemas/ImagePromptJson"},{"$ref":"#/components/schemas/ImagePrompt"}]},"type":"array","title":"Image Prompts"}},"type":"object","required":["image_prompts"],"title":"ImgPromptRequestJson"},"ImgUpscaleOrVaryRequestJson":{"properties":{"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"items":{"$ref":"#/components/schemas/Lora"},"type":"array","title":"Loras","default":[{"model_name":"sd_xl_offset_example-lora_1.0.safetensors","weight":0.1}]},"advanced_params":{"anyOf":[{"$ref":"#/components/schemas/AdvancedParams"},{"type":"null"}],"default":{"adaptive_cfg":7.0,"adm_scaler_end":0.3,"adm_scaler_negative":0.8,"adm_scaler_positive":1.5,"canny_high_threshold":128,"canny_low_threshold":64,"controlnet_softness":0.25,"debugging_cn_preprocessor":false,"debugging_inpaint_preprocessor":false,"disable_preview":false,"freeu_b1":1.01,"freeu_b2":1.02,"freeu_enabled":false,"freeu_s1":0.99,"freeu_s2":0.95,"inpaint_disable_initial_latent":false,"inpaint_engine":"v1","inpaint_respective_field":1.0,"inpaint_strength":1.0,"mixing_image_prompt_and_inpaint":false,"mixing_image_prompt_and_vary_upscale":false,"overwrite_height":-1,"overwrite_step":-1,"overwrite_switch":-1,"overwrite_upscale_strength":-1.0,"overwrite_vary_strength":-1.0,"overwrite_width":-1,"refiner_swap_method":"joint","sampler_name":"dpmpp_2m_sde_gpu","scheduler_name":"karras","skipping_cn_preprocessor":false}},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false},"uov_method":{"allOf":[{"$ref":"#/components/schemas/UpscaleOrVaryMethod"}],"default":"Upscale (2x)"},"upscale_value":{"anyOf":[{"type":"number","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Upscale Value","description":"Upscale custom value, None for default value"},"input_image":{"type":"string","title":"Input Image","description":"Init image for upsacale or outpaint as base64"}},"type":"object","required":["input_image"],"title":"ImgUpscaleOrVaryRequestJson"},"JobQueueInfo":{"properties":{"running_size":{"type":"integer","title":"Running Size","description":"The current running and waiting job count"},"finished_size":{"type":"integer","title":"Finished Size","description":"Finished job cound (after auto clean)"},"last_job_id":{"type":"string","title":"Last Job Id","description":"Last submit generation job id"}},"type":"object","required":["running_size","finished_size","last_job_id"],"title":"JobQueueInfo"},"Lora":{"properties":{"model_name":{"type":"string","title":"Model Name"},"weight":{"type":"number","maximum":2.0,"minimum":-2.0,"title":"Weight","default":0.5}},"type":"object","required":["model_name"],"title":"Lora"},"OutpaintExpansion":{"type":"string","enum":["Left","Right","Top","Bottom"],"title":"OutpaintExpansion"},"PerfomanceSelection":{"type":"string","enum":["Speed","Quality","Extreme Speed"],"title":"PerfomanceSelection"},"StopResponse":{"properties":{"msg":{"type":"string","title":"Msg"}},"type":"object","required":["msg"],"title":"StopResponse"},"TaskType":{"type":"string","enum":["Text to Image","Image Upscale or Variation","Image Inpaint or Outpaint","Image Prompt"],"title":"TaskType"},"Text2ImgRequest":{"properties":{"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"items":{"$ref":"#/components/schemas/Lora"},"type":"array","title":"Loras","default":[{"model_name":"sd_xl_offset_example-lora_1.0.safetensors","weight":0.1}]},"advanced_params":{"anyOf":[{"$ref":"#/components/schemas/AdvancedParams"},{"type":"null"}],"default":{"adaptive_cfg":7.0,"adm_scaler_end":0.3,"adm_scaler_negative":0.8,"adm_scaler_positive":1.5,"canny_high_threshold":128,"canny_low_threshold":64,"controlnet_softness":0.25,"debugging_cn_preprocessor":false,"debugging_inpaint_preprocessor":false,"disable_preview":false,"freeu_b1":1.01,"freeu_b2":1.02,"freeu_enabled":false,"freeu_s1":0.99,"freeu_s2":0.95,"inpaint_disable_initial_latent":false,"inpaint_engine":"v1","inpaint_respective_field":1.0,"inpaint_strength":1.0,"mixing_image_prompt_and_inpaint":false,"mixing_image_prompt_and_vary_upscale":false,"overwrite_height":-1,"overwrite_step":-1,"overwrite_switch":-1,"overwrite_upscale_strength":-1.0,"overwrite_vary_strength":-1.0,"overwrite_width":-1,"refiner_swap_method":"joint","sampler_name":"dpmpp_2m_sde_gpu","scheduler_name":"karras","skipping_cn_preprocessor":false}},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false}},"type":"object","title":"Text2ImgRequest"},"UpscaleOrVaryMethod":{"type":"string","enum":["Vary (Subtle)","Vary (Strong)","Upscale (1.5x)","Upscale (2x)","Upscale (Fast 2x)","Upscale (Custom)"],"title":"UpscaleOrVaryMethod"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}} \ No newline at end of file +{"openapi":"3.1.0","info":{"title":"FastAPI","version":"0.1.0"},"paths":{"/":{"get":{"summary":"Home","operationId":"home__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/generation/text-to-image":{"post":{"summary":"Text2Img Generation","operationId":"text2img_generation_v1_generation_text_to_image_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Text2ImgRequest"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Text2Img Generation V1 Generation Text To Image Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/generation/image-upscale-vary":{"post":{"summary":"Img Upscale Or Vary","operationId":"img_upscale_or_vary_v1_generation_image_upscale_vary_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_img_upscale_or_vary_v1_generation_image_upscale_vary_post"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Img Upscale Or Vary V1 Generation Image Upscale Vary Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/generation/image-upscale-vary":{"post":{"summary":"Img Upscale Or Vary V2","operationId":"img_upscale_or_vary_v2_v2_generation_image_upscale_vary_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImgUpscaleOrVaryRequestJson"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Img Upscale Or Vary V2 V2 Generation Image Upscale Vary Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/generation/image-inpait-outpaint":{"post":{"summary":"Img Inpaint Or Outpaint","operationId":"img_inpaint_or_outpaint_v1_generation_image_inpait_outpaint_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_img_inpaint_or_outpaint_v1_generation_image_inpait_outpaint_post"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Img Inpaint Or Outpaint V1 Generation Image Inpait Outpaint Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/generation/image-inpait-outpaint":{"post":{"summary":"Img Inpaint Or Outpaint V2","operationId":"img_inpaint_or_outpaint_v2_v2_generation_image_inpait_outpaint_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImgInpaintOrOutpaintRequestJson"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Img Inpaint Or Outpaint V2 V2 Generation Image Inpait Outpaint Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/generation/image-prompt":{"post":{"summary":"Img Prompt","operationId":"img_prompt_v1_generation_image_prompt_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"allOf":[{"$ref":"#/components/schemas/Body_img_prompt_v1_generation_image_prompt_post"}],"title":"Body"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Img Prompt V1 Generation Image Prompt Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v2/generation/image-prompt":{"post":{"summary":"Img Prompt","operationId":"img_prompt_v2_generation_image_prompt_post","parameters":[{"name":"accept","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes","title":"Accept"},"description":"Parameter to overvide 'Accept' header, 'image/png' for output bytes"},{"name":"accept","in":"header","required":false,"schema":{"type":"string","title":"Accept"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImgPromptRequestJson"}}}},"responses":{"200":{"description":"PNG bytes if request's 'Accept' header is 'image/png', otherwise JSON","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageResult"}},{"$ref":"#/components/schemas/AsyncJobResponse"}],"title":"Response Img Prompt V2 Generation Image Prompt Post"},"example":[{"base64":"...very long string...","seed":"1050625087","finish_reason":"SUCCESS"}]},"application/json async":{"example":{"job_id":1,"job_type":"Text to Image"}},"image/png":{"example":"PNG bytes, what did you expect?"}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/generation/query-job":{"get":{"summary":"Query Job","description":"Query async generation job","operationId":"query_job_v1_generation_query_job_get","parameters":[{"name":"job_id","in":"query","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"require_step_preivew","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Require Step Preivew"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AsyncJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/generation/job-queue":{"get":{"summary":"Job Queue","description":"Query job queue info","operationId":"job_queue_v1_generation_job_queue_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobQueueInfo"}}}}}}},"/v1/generation/stop":{"post":{"summary":"Stop","description":"Job stoping","operationId":"stop_v1_generation_stop_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StopResponse"}}}}}}},"/v1/engines/all-models":{"get":{"summary":"All Models","description":"Get all filenames of base model and lora","operationId":"all_models_v1_engines_all_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AllModelNamesResponse"}}}}}}},"/v1/engines/refresh-models":{"post":{"summary":"Refresh Models","description":"Refresh local files and get all filenames of base model and lora","operationId":"refresh_models_v1_engines_refresh_models_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AllModelNamesResponse"}}}}}}},"/v1/engines/styles":{"get":{"summary":"All Styles","description":"Get all legal Fooocus styles","operationId":"all_styles_v1_engines_styles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array","title":"Response All Styles V1 Engines Styles Get"}}}}}}}},"components":{"schemas":{"AdvancedParams":{"properties":{"disable_preview":{"type":"boolean","title":"Disable Preview","description":"Disable preview during generation","default":false},"adm_scaler_positive":{"type":"number","maximum":3.0,"minimum":0.1,"title":"Adm Scaler Positive","description":"Positive ADM Guidance Scaler","default":1.5},"adm_scaler_negative":{"type":"number","maximum":3.0,"minimum":0.1,"title":"Adm Scaler Negative","description":"Negative ADM Guidance Scaler","default":0.8},"adm_scaler_end":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Adm Scaler End","description":"ADM Guidance End At Step","default":0.3},"refiner_swap_method":{"type":"string","title":"Refiner Swap Method","description":"Refiner swap method","default":"joint"},"adaptive_cfg":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Adaptive Cfg","description":"CFG Mimicking from TSNR","default":7.0},"sampler_name":{"type":"string","title":"Sampler Name","description":"Sampler","default":"dpmpp_2m_sde_gpu"},"scheduler_name":{"type":"string","title":"Scheduler Name","description":"Scheduler","default":"karras"},"overwrite_step":{"type":"integer","maximum":200.0,"minimum":-1.0,"title":"Overwrite Step","description":"Forced Overwrite of Sampling Step","default":-1},"overwrite_switch":{"type":"integer","maximum":200.0,"minimum":-1.0,"title":"Overwrite Switch","description":"Forced Overwrite of Refiner Switch Step","default":-1},"overwrite_width":{"type":"integer","maximum":2048.0,"minimum":-1.0,"title":"Overwrite Width","description":"Forced Overwrite of Generating Width","default":-1},"overwrite_height":{"type":"integer","maximum":2048.0,"minimum":-1.0,"title":"Overwrite Height","description":"Forced Overwrite of Generating Height","default":-1},"overwrite_vary_strength":{"type":"number","maximum":1.0,"minimum":-1.0,"title":"Overwrite Vary Strength","description":"Forced Overwrite of Denoising Strength of \"Vary\"","default":-1},"overwrite_upscale_strength":{"type":"number","maximum":1.0,"minimum":-1.0,"title":"Overwrite Upscale Strength","description":"Forced Overwrite of Denoising Strength of \"Upscale\"","default":-1},"mixing_image_prompt_and_vary_upscale":{"type":"boolean","title":"Mixing Image Prompt And Vary Upscale","description":"Mixing Image Prompt and Vary/Upscale","default":false},"mixing_image_prompt_and_inpaint":{"type":"boolean","title":"Mixing Image Prompt And Inpaint","description":"Mixing Image Prompt and Inpaint","default":false},"debugging_cn_preprocessor":{"type":"boolean","title":"Debugging Cn Preprocessor","description":"Debug Preprocessors","default":false},"skipping_cn_preprocessor":{"type":"boolean","title":"Skipping Cn Preprocessor","description":"Skip Preprocessors","default":false},"controlnet_softness":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Controlnet Softness","description":"Softness of ControlNet","default":0.25},"canny_low_threshold":{"type":"integer","maximum":255.0,"minimum":1.0,"title":"Canny Low Threshold","description":"Canny Low Threshold","default":64},"canny_high_threshold":{"type":"integer","maximum":255.0,"minimum":1.0,"title":"Canny High Threshold","description":"Canny High Threshold","default":128},"freeu_enabled":{"type":"boolean","title":"Freeu Enabled","description":"FreeU enabled","default":false},"freeu_b1":{"type":"number","title":"Freeu B1","description":"FreeU B1","default":1.01},"freeu_b2":{"type":"number","title":"Freeu B2","description":"FreeU B2","default":1.02},"freeu_s1":{"type":"number","title":"Freeu S1","description":"FreeU B3","default":0.99},"freeu_s2":{"type":"number","title":"Freeu S2","description":"FreeU B4","default":0.95},"debugging_inpaint_preprocessor":{"type":"boolean","title":"Debugging Inpaint Preprocessor","description":"Debug Inpaint Preprocessing","default":false},"inpaint_disable_initial_latent":{"type":"boolean","title":"Inpaint Disable Initial Latent","description":"Disable initial latent in inpaint","default":false},"inpaint_engine":{"type":"string","title":"Inpaint Engine","description":"Inpaint Engine","default":"v1"},"inpaint_strength":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Inpaint Strength","description":"Inpaint Denoising Strength","default":1.0},"inpaint_respective_field":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Inpaint Respective Field","description":"Inpaint Respective Field","default":1.0}},"type":"object","title":"AdvancedParams"},"AllModelNamesResponse":{"properties":{"model_filenames":{"items":{"type":"string"},"type":"array","title":"Model Filenames","description":"All available model filenames"},"lora_filenames":{"items":{"type":"string"},"type":"array","title":"Lora Filenames","description":"All available lora filenames"}},"type":"object","required":["model_filenames","lora_filenames"],"title":"AllModelNamesResponse"},"AsyncJobResponse":{"properties":{"job_id":{"type":"string","title":"Job Id","description":"Job ID"},"job_type":{"allOf":[{"$ref":"#/components/schemas/TaskType"}],"description":"Job type"},"job_stage":{"allOf":[{"$ref":"#/components/schemas/AsyncJobStage"}],"description":"Job running stage"},"job_progress":{"type":"integer","title":"Job Progress","description":"Job running progress, 100 is for finished."},"job_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Status","description":"Job running status in text"},"job_step_preview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Step Preview","description":"Preview image of generation steps at current time, as base64 image"},"job_result":{"anyOf":[{"items":{"$ref":"#/components/schemas/GeneratedImageResult"},"type":"array"},{"type":"null"}],"title":"Job Result","description":"Job generation result"}},"type":"object","required":["job_id","job_type","job_stage","job_progress"],"title":"AsyncJobResponse"},"AsyncJobStage":{"type":"string","enum":["WAITING","RUNNING","SUCCESS","ERROR"],"title":"AsyncJobStage"},"Body_img_inpaint_or_outpaint_v1_generation_image_inpait_outpaint_post":{"properties":{"input_image":{"type":"string","format":"binary","title":"Input Image","description":"Init image for inpaint or outpaint"},"input_mask":{"type":"string","format":"binary","title":"Input Mask","description":"Inpaint or outpaint mask"},"inpaint_additional_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inpaint Additional Prompt","description":"Describe what you want to inpaint"},"outpaint_selections":{"items":{"type":"string"},"type":"array","title":"Outpaint Selections","description":"Outpaint expansion selections, literal 'Left', 'Right', 'Top', 'Bottom' seperated by comma","default":[]},"outpaint_distance_left":{"type":"integer","title":"Outpaint Distance Left","description":"Set outpaint left distance, -1 for default","default":0},"outpaint_distance_right":{"type":"integer","title":"Outpaint Distance Right","description":"Set outpaint right distance, -1 for default","default":0},"outpaint_distance_top":{"type":"integer","title":"Outpaint Distance Top","description":"Set outpaint top distance, -1 for default","default":0},"outpaint_distance_bottom":{"type":"integer","title":"Outpaint Distance Bottom","description":"Set outpaint bottom distance, -1 for default","default":0},"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","description":"Fooocus style selections, seperated by comma","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Loras","description":"Lora config in JSON. Format as [{\"model_name\": \"sd_xl_offset_example-lora_1.0.safetensors\", \"weight\": 0.5}]","default":"[{\"model_name\":\"sd_xl_offset_example-lora_1.0.safetensors\",\"weight\":0.1}]"},"advanced_params":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Advanced Params","description":"Advanced parameters in JSON"},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false}},"type":"object","required":["input_image"],"title":"Body_img_inpaint_or_outpaint_v1_generation_image_inpait_outpaint_post"},"Body_img_prompt_v1_generation_image_prompt_post":{"properties":{"cn_img1":{"type":"string","format":"binary","title":"Cn Img1","description":"Input image for image prompt"},"input_image":{"type":"string","format":"binary","title":"Input Image","description":"Init image for inpaint or outpaint"},"input_mask":{"type":"string","format":"binary","title":"Input Mask","description":"Inpaint or outpaint mask"},"inpaint_additional_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inpaint Additional Prompt","description":"Describe what you want to inpaint"},"outpaint_selections":{"items":{"type":"string"},"type":"array","title":"Outpaint Selections","description":"Outpaint expansion selections, literal 'Left', 'Right', 'Top', 'Bottom' seperated by comma","default":[]},"outpaint_distance_left":{"type":"integer","title":"Outpaint Distance Left","description":"Set outpaint left distance, 0 for default","default":0},"outpaint_distance_right":{"type":"integer","title":"Outpaint Distance Right","description":"Set outpaint right distance, 0 for default","default":0},"outpaint_distance_top":{"type":"integer","title":"Outpaint Distance Top","description":"Set outpaint top distance, 0 for default","default":0},"outpaint_distance_bottom":{"type":"integer","title":"Outpaint Distance Bottom","description":"Set outpaint bottom distance, 0 for default","default":0},"cn_stop1":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Cn Stop1","description":"Stop at for image prompt, None for default value"},"cn_weight1":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Cn Weight1","description":"Weight for image prompt, None for default value"},"cn_type1":{"allOf":[{"$ref":"#/components/schemas/ControlNetType"}],"description":"ControlNet type for image prompt","default":"ImagePrompt"},"cn_img2":{"type":"string","format":"binary","title":"Cn Img2","description":"Input image for image prompt"},"cn_stop2":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Cn Stop2","description":"Stop at for image prompt, None for default value"},"cn_weight2":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Cn Weight2","description":"Weight for image prompt, None for default value"},"cn_type2":{"allOf":[{"$ref":"#/components/schemas/ControlNetType"}],"description":"ControlNet type for image prompt","default":"ImagePrompt"},"cn_img3":{"type":"string","format":"binary","title":"Cn Img3","description":"Input image for image prompt"},"cn_stop3":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Cn Stop3","description":"Stop at for image prompt, None for default value"},"cn_weight3":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Cn Weight3","description":"Weight for image prompt, None for default value"},"cn_type3":{"allOf":[{"$ref":"#/components/schemas/ControlNetType"}],"description":"ControlNet type for image prompt","default":"ImagePrompt"},"cn_img4":{"type":"string","format":"binary","title":"Cn Img4","description":"Input image for image prompt"},"cn_stop4":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Cn Stop4","description":"Stop at for image prompt, None for default value"},"cn_weight4":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Cn Weight4","description":"Weight for image prompt, None for default value"},"cn_type4":{"allOf":[{"$ref":"#/components/schemas/ControlNetType"}],"description":"ControlNet type for image prompt","default":"ImagePrompt"},"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","description":"Fooocus style selections, seperated by comma","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Loras","description":"Lora config in JSON. Format as [{\"model_name\": \"sd_xl_offset_example-lora_1.0.safetensors\", \"weight\": 0.5}]","default":"[{\"model_name\":\"sd_xl_offset_example-lora_1.0.safetensors\",\"weight\":0.1}]"},"advanced_params":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Advanced Params","description":"Advanced parameters in JSON"},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false}},"type":"object","title":"Body_img_prompt_v1_generation_image_prompt_post"},"Body_img_upscale_or_vary_v1_generation_image_upscale_vary_post":{"properties":{"input_image":{"type":"string","format":"binary","title":"Input Image","description":"Init image for upsacale or outpaint"},"uov_method":{"$ref":"#/components/schemas/UpscaleOrVaryMethod"},"upscale_value":{"anyOf":[{"type":"number","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Upscale Value","description":"Upscale custom value, None for default value"},"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","description":"Fooocus style selections, seperated by comma","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Loras","description":"Lora config in JSON. Format as [{\"model_name\": \"sd_xl_offset_example-lora_1.0.safetensors\", \"weight\": 0.5}]","default":"[{\"model_name\":\"sd_xl_offset_example-lora_1.0.safetensors\",\"weight\":0.1}]"},"advanced_params":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Advanced Params","description":"Advanced parameters in JSON"},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false}},"type":"object","required":["input_image","uov_method"],"title":"Body_img_upscale_or_vary_v1_generation_image_upscale_vary_post"},"ControlNetType":{"type":"string","enum":["ImagePrompt","FaceSwap","PyraCanny","CPDS"],"title":"ControlNetType"},"GeneratedImageResult":{"properties":{"base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base64","description":"Image encoded in base64, or null if finishReasen is not 'SUCCESS', only return when request require base64"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Image file static serve url, or null if finishReasen is not 'SUCCESS'"},"seed":{"type":"string","title":"Seed","description":"The seed associated with this image"},"finish_reason":{"$ref":"#/components/schemas/GenerationFinishReason"}},"type":"object","required":["base64","url","seed","finish_reason"],"title":"GeneratedImageResult"},"GenerationFinishReason":{"type":"string","enum":["SUCCESS","QUEUE_IS_FULL","USER_CANCEL","ERROR"],"title":"GenerationFinishReason"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ImagePrompt":{"properties":{"cn_img":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"Cn Img"},"cn_stop":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Cn Stop"},"cn_weight":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Cn Weight","description":"None for default value"},"cn_type":{"allOf":[{"$ref":"#/components/schemas/ControlNetType"}],"default":"ImagePrompt"}},"type":"object","title":"ImagePrompt"},"ImagePromptJson":{"properties":{"cn_img":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cn Img","description":"Input image for image prompt as base64"},"cn_stop":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Cn Stop","description":"Stop at for image prompt, 0 for default value","default":0},"cn_weight":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Cn Weight","description":"Weight for image prompt, 0 for default value","default":0},"cn_type":{"allOf":[{"$ref":"#/components/schemas/ControlNetType"}],"description":"ControlNet type for image prompt","default":"ImagePrompt"}},"type":"object","title":"ImagePromptJson"},"ImgInpaintOrOutpaintRequestJson":{"properties":{"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"items":{"$ref":"#/components/schemas/Lora"},"type":"array","title":"Loras","default":[{"model_name":"sd_xl_offset_example-lora_1.0.safetensors","weight":0.1}]},"advanced_params":{"anyOf":[{"$ref":"#/components/schemas/AdvancedParams"},{"type":"null"}],"default":{"adaptive_cfg":7.0,"adm_scaler_end":0.3,"adm_scaler_negative":0.8,"adm_scaler_positive":1.5,"canny_high_threshold":128,"canny_low_threshold":64,"controlnet_softness":0.25,"debugging_cn_preprocessor":false,"debugging_inpaint_preprocessor":false,"disable_preview":false,"freeu_b1":1.01,"freeu_b2":1.02,"freeu_enabled":false,"freeu_s1":0.99,"freeu_s2":0.95,"inpaint_disable_initial_latent":false,"inpaint_engine":"v1","inpaint_respective_field":1.0,"inpaint_strength":1.0,"mixing_image_prompt_and_inpaint":false,"mixing_image_prompt_and_vary_upscale":false,"overwrite_height":-1,"overwrite_step":-1,"overwrite_switch":-1,"overwrite_upscale_strength":-1.0,"overwrite_vary_strength":-1.0,"overwrite_width":-1,"refiner_swap_method":"joint","sampler_name":"dpmpp_2m_sde_gpu","scheduler_name":"karras","skipping_cn_preprocessor":false}},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false},"input_image":{"type":"string","title":"Input Image","description":"Init image for inpaint or outpaint as base64"},"input_mask":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Mask","description":"Inpaint or outpaint mask as base64","default":""},"inpaint_additional_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inpaint Additional Prompt","description":"Describe what you want to inpaint","default":""},"outpaint_selections":{"items":{"$ref":"#/components/schemas/OutpaintExpansion"},"type":"array","title":"Outpaint Selections","default":[]},"outpaint_distance_left":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Outpaint Distance Left","description":"Set outpaint left distance","default":-1},"outpaint_distance_right":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Outpaint Distance Right","description":"Set outpaint right distance","default":-1},"outpaint_distance_top":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Outpaint Distance Top","description":"Set outpaint top distance","default":-1},"outpaint_distance_bottom":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Outpaint Distance Bottom","description":"Set outpaint bottom distance","default":-1}},"type":"object","required":["input_image"],"title":"ImgInpaintOrOutpaintRequestJson"},"ImgPromptRequestJson":{"properties":{"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"items":{"$ref":"#/components/schemas/Lora"},"type":"array","title":"Loras","default":[{"model_name":"sd_xl_offset_example-lora_1.0.safetensors","weight":0.1}]},"advanced_params":{"anyOf":[{"$ref":"#/components/schemas/AdvancedParams"},{"type":"null"}],"default":{"adaptive_cfg":7.0,"adm_scaler_end":0.3,"adm_scaler_negative":0.8,"adm_scaler_positive":1.5,"canny_high_threshold":128,"canny_low_threshold":64,"controlnet_softness":0.25,"debugging_cn_preprocessor":false,"debugging_inpaint_preprocessor":false,"disable_preview":false,"freeu_b1":1.01,"freeu_b2":1.02,"freeu_enabled":false,"freeu_s1":0.99,"freeu_s2":0.95,"inpaint_disable_initial_latent":false,"inpaint_engine":"v1","inpaint_respective_field":1.0,"inpaint_strength":1.0,"mixing_image_prompt_and_inpaint":false,"mixing_image_prompt_and_vary_upscale":false,"overwrite_height":-1,"overwrite_step":-1,"overwrite_switch":-1,"overwrite_upscale_strength":-1.0,"overwrite_vary_strength":-1.0,"overwrite_width":-1,"refiner_swap_method":"joint","sampler_name":"dpmpp_2m_sde_gpu","scheduler_name":"karras","skipping_cn_preprocessor":false}},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false},"input_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Image","description":"Init image for inpaint or outpaint as base64"},"input_mask":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Mask","description":"Inpaint or outpaint mask as base64","default":""},"inpaint_additional_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inpaint Additional Prompt","description":"Describe what you want to inpaint","default":""},"outpaint_selections":{"items":{"$ref":"#/components/schemas/OutpaintExpansion"},"type":"array","title":"Outpaint Selections","default":[]},"outpaint_distance_left":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Outpaint Distance Left","description":"Set outpaint left distance","default":-1},"outpaint_distance_right":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Outpaint Distance Right","description":"Set outpaint right distance","default":-1},"outpaint_distance_top":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Outpaint Distance Top","description":"Set outpaint top distance","default":-1},"outpaint_distance_bottom":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Outpaint Distance Bottom","description":"Set outpaint bottom distance","default":-1},"image_prompts":{"items":{"anyOf":[{"$ref":"#/components/schemas/ImagePromptJson"},{"$ref":"#/components/schemas/ImagePrompt"}]},"type":"array","title":"Image Prompts"}},"type":"object","required":["image_prompts"],"title":"ImgPromptRequestJson"},"ImgUpscaleOrVaryRequestJson":{"properties":{"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"items":{"$ref":"#/components/schemas/Lora"},"type":"array","title":"Loras","default":[{"model_name":"sd_xl_offset_example-lora_1.0.safetensors","weight":0.1}]},"advanced_params":{"anyOf":[{"$ref":"#/components/schemas/AdvancedParams"},{"type":"null"}],"default":{"adaptive_cfg":7.0,"adm_scaler_end":0.3,"adm_scaler_negative":0.8,"adm_scaler_positive":1.5,"canny_high_threshold":128,"canny_low_threshold":64,"controlnet_softness":0.25,"debugging_cn_preprocessor":false,"debugging_inpaint_preprocessor":false,"disable_preview":false,"freeu_b1":1.01,"freeu_b2":1.02,"freeu_enabled":false,"freeu_s1":0.99,"freeu_s2":0.95,"inpaint_disable_initial_latent":false,"inpaint_engine":"v1","inpaint_respective_field":1.0,"inpaint_strength":1.0,"mixing_image_prompt_and_inpaint":false,"mixing_image_prompt_and_vary_upscale":false,"overwrite_height":-1,"overwrite_step":-1,"overwrite_switch":-1,"overwrite_upscale_strength":-1.0,"overwrite_vary_strength":-1.0,"overwrite_width":-1,"refiner_swap_method":"joint","sampler_name":"dpmpp_2m_sde_gpu","scheduler_name":"karras","skipping_cn_preprocessor":false}},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false},"uov_method":{"allOf":[{"$ref":"#/components/schemas/UpscaleOrVaryMethod"}],"default":"Upscale (2x)"},"upscale_value":{"anyOf":[{"type":"number","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Upscale Value","description":"Upscale custom value, 1.0 for default value","default":1.0},"input_image":{"type":"string","title":"Input Image","description":"Init image for upsacale or outpaint as base64"}},"type":"object","required":["input_image"],"title":"ImgUpscaleOrVaryRequestJson"},"JobQueueInfo":{"properties":{"running_size":{"type":"integer","title":"Running Size","description":"The current running and waiting job count"},"finished_size":{"type":"integer","title":"Finished Size","description":"Finished job cound (after auto clean)"},"last_job_id":{"type":"string","title":"Last Job Id","description":"Last submit generation job id"}},"type":"object","required":["running_size","finished_size","last_job_id"],"title":"JobQueueInfo"},"Lora":{"properties":{"model_name":{"type":"string","title":"Model Name"},"weight":{"type":"number","maximum":2.0,"minimum":-2.0,"title":"Weight","default":0.5}},"type":"object","required":["model_name"],"title":"Lora"},"OutpaintExpansion":{"type":"string","enum":["Left","Right","Top","Bottom"],"title":"OutpaintExpansion"},"PerfomanceSelection":{"type":"string","enum":["Speed","Quality","Extreme Speed"],"title":"PerfomanceSelection"},"StopResponse":{"properties":{"msg":{"type":"string","title":"Msg"}},"type":"object","required":["msg"],"title":"StopResponse"},"TaskType":{"type":"string","enum":["Text to Image","Image Upscale or Variation","Image Inpaint or Outpaint","Image Prompt"],"title":"TaskType"},"Text2ImgRequest":{"properties":{"prompt":{"type":"string","title":"Prompt","default":""},"negative_prompt":{"type":"string","title":"Negative Prompt","default":""},"style_selections":{"items":{"type":"string"},"type":"array","title":"Style Selections","default":["Fooocus V2","Fooocus Enhance","Fooocus Sharp"]},"performance_selection":{"allOf":[{"$ref":"#/components/schemas/PerfomanceSelection"}],"default":"Speed"},"aspect_ratios_selection":{"type":"string","title":"Aspect Ratios Selection","default":"1152*896"},"image_number":{"type":"integer","maximum":32.0,"minimum":1.0,"title":"Image Number","description":"Image number","default":1},"image_seed":{"type":"integer","title":"Image Seed","description":"Seed to generate image, -1 for random","default":-1},"sharpness":{"type":"number","maximum":30.0,"minimum":0.0,"title":"Sharpness","default":2.0},"guidance_scale":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Guidance Scale","default":4.0},"base_model_name":{"type":"string","title":"Base Model Name","default":"juggernautXL_version6Rundiffusion.safetensors"},"refiner_model_name":{"type":"string","title":"Refiner Model Name","default":"None"},"refiner_switch":{"type":"number","maximum":1.0,"minimum":0.1,"title":"Refiner Switch","description":"Refiner Switch At","default":0.5},"loras":{"items":{"$ref":"#/components/schemas/Lora"},"type":"array","title":"Loras","default":[{"model_name":"sd_xl_offset_example-lora_1.0.safetensors","weight":0.1}]},"advanced_params":{"anyOf":[{"$ref":"#/components/schemas/AdvancedParams"},{"type":"null"}],"default":{"adaptive_cfg":7.0,"adm_scaler_end":0.3,"adm_scaler_negative":0.8,"adm_scaler_positive":1.5,"canny_high_threshold":128,"canny_low_threshold":64,"controlnet_softness":0.25,"debugging_cn_preprocessor":false,"debugging_inpaint_preprocessor":false,"disable_preview":false,"freeu_b1":1.01,"freeu_b2":1.02,"freeu_enabled":false,"freeu_s1":0.99,"freeu_s2":0.95,"inpaint_disable_initial_latent":false,"inpaint_engine":"v1","inpaint_respective_field":1.0,"inpaint_strength":1.0,"mixing_image_prompt_and_inpaint":false,"mixing_image_prompt_and_vary_upscale":false,"overwrite_height":-1,"overwrite_step":-1,"overwrite_switch":-1,"overwrite_upscale_strength":-1.0,"overwrite_vary_strength":-1.0,"overwrite_width":-1,"refiner_swap_method":"joint","sampler_name":"dpmpp_2m_sde_gpu","scheduler_name":"karras","skipping_cn_preprocessor":false}},"require_base64":{"type":"boolean","title":"Require Base64","description":"Return base64 data of generated image","default":false},"async_process":{"type":"boolean","title":"Async Process","description":"Set to true will run async and return job info for retrieve generataion result later","default":false}},"type":"object","title":"Text2ImgRequest"},"UpscaleOrVaryMethod":{"type":"string","enum":["Vary (Subtle)","Vary (Strong)","Upscale (1.5x)","Upscale (2x)","Upscale (Fast 2x)","Upscale (Custom)"],"title":"UpscaleOrVaryMethod"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}} \ No newline at end of file diff --git a/examples/examples.py b/examples/examples.py index aa5b399..53d9d0c 100644 --- a/examples/examples.py +++ b/examples/examples.py @@ -45,7 +45,7 @@ class Config(): imgs_base_path = os.path.join(os.path.dirname(__file__), 'imgs') -with open(os.path.join(imgs_base_path, "1485005453352708.jpeg"), "rb") as f: +with open(os.path.join(imgs_base_path, "bear.jpg"), "rb") as f: img1 = f.read() image_base64 = base64.b64encode(img1).decode('utf-8') f.close() @@ -92,7 +92,6 @@ def image_prompt(img_prompt: list, params: dict) -> dict: """ Image Prompt """ - params["prompt"] = "cat" params["image_prompts"] = img_prompt data = json.dumps(params) response = requests.post(url=f"{cfg.fooocus_host}{cfg.img_prompt}", @@ -101,6 +100,21 @@ def image_prompt(img_prompt: list, params: dict) -> dict: timeout=300) return response.json() +def image_prompt_with_inpaint(img_prompt: list, input_image: str, input_mask: str, params: dict) -> dict: + """ + Image Prompt + """ + params["image_prompts"] = img_prompt + params["input_image"] = input_image + params["input_mask"] = input_mask + params["outpaint_selections"] = ["Left", "Right"] + data = json.dumps(params) + response = requests.post(url=f"{cfg.fooocus_host}{cfg.img_prompt}", + data=data, + headers=headers, + timeout=300) + return response.json() + img_prompt = [ { @@ -108,13 +122,9 @@ def image_prompt(img_prompt: list, params: dict) -> dict: "cn_stop": 0.6, "cn_weight": 0.6, "cn_type": "ImagePrompt" - },{ - "cn_img": s_base64, - "cn_stop": 0.6, - "cn_weight": 0.6, - "cn_type": "ImagePrompt" } ] # print(upscale_vary(image=image_base64)) # print(inpaint_outpaint(input_image=s_base64, input_mask=m_base64)) -print(image_prompt(img_prompt=img_prompt, params=img_prompt_params)) +# print(image_prompt(img_prompt=img_prompt, params=img_prompt_params)) +print(image_prompt_with_inpaint(img_prompt=img_prompt, input_image=s_base64, input_mask=m_base64, params=img_prompt_params)) \ No newline at end of file diff --git a/examples/examples_v1.py b/examples/examples_v1.py index 19c8140..960a0fc 100644 --- a/examples/examples_v1.py +++ b/examples/examples_v1.py @@ -112,7 +112,7 @@ def image_prompt_v2(params: ImagePromptParamsJson = ImagePromptParamsJson()) -> if __name__ == '__main__': imgs_base_path = os.path.join(os.path.dirname(__file__), 'imgs') - input_image = open(os.path.join(imgs_base_path,'1485005453352708.jpeg'), 'rb').read() + input_image = open(os.path.join(imgs_base_path,'bear.jpg'), 'rb').read() input_source = open(os.path.join(imgs_base_path,'s.jpg'), 'rb').read() input_mask = open(os.path.join(imgs_base_path,'m.png'), 'rb').read() diff --git a/examples/imgs/1485005453352708.jpeg b/examples/imgs/1485005453352708.jpeg deleted file mode 100644 index a12386132c7e367f2db659ebd9428364687824ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46900 zcmV(vKH{Q`P(_yPksb(DLC<^4I4J6!bM?F9)UEQbn7?Dwb1QGge}7KD)xAZ! z3je|Mjps4yJN##xmtCi$2b|xnulT!Q&o=)%z8}*)@c*IqfBqjN_Lco__)q-(d3KBY zhxuQ-9>ZT4^hf^gpOa!z1{DW<#O+f#sYOY4m-;#7PyMlr&1gr?}{){wJv6 zNHdPDO$iONMI3Dp&`B0CdJ$VFNZ5iV-Ey#cReZrLgdqT_%6(B}MBJavSP&-nxSDDS z=0*b?t7=b);$_T(N?2gp7h=ms-C7xf$j)+lJyd$!MOnI*%Qo&-W$NBcI3q-L*E5O#Aj1U!r$9ZF;p$#-TsBmd&PqroPK%UME=5{)w`Fwo zTsaZ3H&iTfIuzm+f9kifkTDI+Pc2OZnRqyxNT1NF5~_grp8sagYK>fwt`!gWOjzYK zxbZ8>maq5>lnL*S&D|_N&W+?5*ZofC|8W5KUaz73NQJXKZacgG_&^S02=r385RT~X z?qBSr%5gB=z~JP_mhdUQUN|IMwNnb^25!Xyu(8bNv31aM5*7Zj^oqIhV#poBeQWIc zp-RAZ|N5hUgFKt(dUlM_kGd)}`$H7CBY~xMiLa02gNqvSJnh+*3 z0y3{1y+ML$&@rhkVtH*^ExMpQ!CPTHwd$~~l||M_i6n}carbT3hRYhoF1qIh(K8hA zG=|x_2ltFuHbo5ztYy@n!F$0Rljg$)gN#^=*a?b4MZ4I}^vBfS?^pkrH$vYcVy_PZ z@9R(T#=1xpoF2y2>0p`CKB?ragQQ*vn8f7r#~;S9n%^o^TQJ!EH!V7zEqkPRC&4?GuswQ&I%S zqDz*>{=ohXYZqBwd3N4uu6I>|{QF~navY?)+=%yZKp!8p029{_RyKS3@Q_M}N>-!M=Pz5W0## zC(Es(yRtAQMp-*vAjJ44>krr2#A(?iarw_3g=wrsS9!lkD11 zXx|r(ws?hN>rF59ad%@%hmgCHNn^oW-2TF4n7Df^SbU*KTNzbmtnO#ieR`wg$(*u8 zRJ+aCXxBFgT{F3FmgYaNEw;a%8u#EgWDDkDSBBukSlhftoDhFrED{V|{n3V|Gw1jc z*9KoPsUZuT0blc14I9SSP*TUNEC9Eg&d&y`Z*$XSV}S8M@z|tK)5<*A2slqBA($br z^3HaAd+xp+L&iuwv+)xEkBR)OS`XJOkuS(oDC6tSLf=XnmGb#VXYr^ZX4lnM88 zqMKY({m{e0#F73p>$t+B+RR~+iaK~yKIEi8J`}GiM$by@1L?JRav5{2<<##WFwxRz zz3ia>er*I?y=$=Ac%$tQ!%0A}sI?tH2a{ZM;QJgUIF>Ta3DV1g%gy~^N*OwuzPDdr zIE5at@FQwId`xF~*Lvxj&-t6a$TjvqXaBL2J)AT3m=ya^P{AUJN;>DVM)HS;g@i+# zve`0^bx_>?poy0!XqHJX>dQYEP$ZjIm~m^-Zjf`COnu;kLh+TVXWsOPWN%LDGFkfe z(^Ktgcn7eI(eHYThEwPq4~BChaz;m;2fO4*KP%U)ANeKRo>tSgDBH;C(PIvs~#ks;-6tBfA zrbW!!<$_6z;zwC0GE)mA;Lid=QYXS?KL?-`k!Y3BthWpyhlsz>xxZJWM>A)7j1Pjm z@OZ51Z3FXD9|L})wHn>iK`8OF-Q~Fa^feg|yzz0K@^)-HgX(;Q2=Ux4 zM_MiRj85c`8Ex4LXfLamqDyr(v*?%v_H;x=*IwG$SQV#Y&HQ(Hc% zZ8_2SV#Ws53^Z-ziB5*E=c$f`NZv{n(3`)pdXk()ciI9DHBe9;r1L8#Q&v<-t9gH@s$R`ZJ&6kD*I8v=OJ6YUs6q?%frqO&kdxHc2x z$_~77YrzG}<&~pKJLq$sHZRV;^%Nd&dY}B|puylW5zaia39^$5$lIa|+8O5^U?g{z zyWZLcWxMr?-y$`!b!-JpjYQyul;PTQiMR76^J-ww|y#xps?maU=bCuOOZ0|Fa5;Fs5Xr(C{@qD;hlf$fzU zZK-S?;r5UM#ls-`zxcM_0D75>kI>J)pyFlHDQ{=rEFEG1*Vc^O0g3n!NSgv;-s#~j z+Xgp@8mCs@Z_iyDdr}})9~)O>)knV?n86`9QU)>WwfWO4I}cUR(CgUh9*Gc79`n{W z7xt;$ta&|z@Zn}c8MC8;)Fsvc-FB8j^T2PDH@ID6#}jKmhG0W z6eE63bHj3B@)OnZBLp0b6x`l|t17zw#b&+gYtqOo$T+r=8`2edop8Jk2Zx|rjGn@D zK>_%^d*z?X%q)oPZu+c!@k!{Bm~#CE!iJ!0ps-J-;}31rD?P}%v586CA8cn!=D>s` zrLV?M4ifx*ply$#}p-KJt9>D1m|KIs-1iF|()5A! zn_cOI!T9>phQVyQmupb-i63!CP`Da=*V>hn!a<$N#(FVj&@`Kh`fkt=e=hpx+DVPn z87V28mGYjHfAvI##4fwx;BC=ziRMH8k8*lU9l3W0@?Mup{S-d@at0~CiHW7E@Hu+p zTx6+A-SClIWqBn8xRvbyZ)b&I@yB(IkAa1&xN>hxwWC(~1=nPr@!-`}(B&7piYgp~ zfI!VhIXs1jlj$byiPH4V)T$3^E)6bIJl`bHDQT*}hM(u((V!NW{J}sP_#iJY|A`Xy zQjaRrkz`KOvcE?xLlx^|&T9Np)O#Yc; zdnC|$hXcB+fGNwThCImT$=b$NG3f*hFGf?Wt2a}efg7@7Wj&(-X8U;~K?P|a; z>xDoXQ&2=sfqe%NP{4iTxy-HaEJH%VrZm$)JV2oT(w~@O%YW2mBAhEh(d{ zTi)qD^vh|5yz@8-!p?L>Y4U5!;TT}MyrJ5m&w1-#13k4)+F(082uoQw)Tir6dSh)0 zfbD0HH6}y^c)IVZMW}=75voJ+oH5Y}(s?C~VRlijmAde^VXeM34WUGfN0{B2cx+U) z+Ty1Sl~_pBn9+3)ql)4148dA2*`&r+=`bqfRD#H?^U#0rOD1qgi+o|sF>02}ZMe3G zih%M*Iy%72Ndvc;cXX$}K{+)Z9`>Tq`(n{VNHyq&85njUf%BvCB_*j5czQee^-|gC zlcB|Y>x@W984Z%&R+83EgBDorpo((3e;tQm=N`Y>g6 z$2Q-n(K9-h%n?|ZqH4+vh)KIOH-$gF>}D+y(1&+f+cNlC{MI!`e@>;=V(4yG zgmWqllht3nQ$jzd=vvu>~qvcgw^a(z>A?_tnD7QADn3%&jUqO^I~+ z7Zm~IZ%5@rTd@c++xCnlNo*PR!>-|?9^XH?>JV;knbeiW9k7&Ss|!rK-{~mD#G=_> z8~6H(Qv$0OY$WmE$#K0da`+0#J`ZTm=^;h41M;6Czw4D?h7u41_s@Qfuqh;Z zXd>TbmryWW+*zHC#N)f}j18Hx%sh-?4P41Ex zKLBG>GKNxE@l96~Olq3bPiU^9b0gN=+?3X_e`uJu!mA`DBAcOt(rKsavEwbEgu^b` zVpY)uq~A|!Uc`sPRe>XdV+v3GvBfTELUVQpnen?}(;Z}L>XMHw zBTzxR=3)Ns+$IfH!vM4sdXD;=;0=?effxbPZ0N@CJ{oSd`PcJx&gC>V;}gXDuR0bI z0<>i{>J?5bMYW$lA6ej>OaD2NPx=9<5MUVCqW(2#j7JS{oJTu?n}n(`WIg)BP}a>8<*rKi={RA$%c;x#h)sw56N3_JBwcz(OAg;~6~zI=)b|P^SO?zOb)khPr@D)slf9HahYr4~DU!;Q@srIy7v$(!I{EAR;@loerDhB&hn zu2#KGPWC-eq<4A`1t2&{Mv|zScf@wAe#1}wJYrtS)M*ebYWts9X^Am(vw{?fx61wURyw&Xl9heSqTQcF_=h z1=VqNw$Py%%)l9QA>t(S++GA~7KX->dKK^fTDaC(CQ+^XE?~;w#I)Te^)d++dB4^_ zxN~?Cb1#e%-9nR|Y+s&3NE*$+MtCR}3QHSnL3=m%K-IS`)qG&b$~i*FVt$5%8|y=! zi?kiTA~Y#o(j#ycz(&<4ua==%FXejRIxHf`y1jeGRuaCB0%K6N_K*eQDtq{pjo2<* zQm7T)f)|t}&YKO$7|UN{Nlp1)y*pCS&(`&=EmLxIa`)32B5dcF3Mi=$M3nM8?!bwT zc+4fqnZC*5-@uPXs@XUG&U(rgquI(5-UumeCZKGT1k?xf6bzu6O4YMmk+jH+sX3CQ zKc0i9sgs%`j~g)7AT?hv$C@VU-#^iVYrDPZCP?6>g9xbI$C{`IY#@+3O5&~vA~E3M zl;F%Y$w5J?^PODSza4|j61D&T)=t>#)Mfjp&-3Kl7uZYXK#ih@$ln^{*iTIJ-$?@6(6x`LD`V93#e94zaW`&s$7TOa` zx9Dct$!pP;c3`k*O=U4VvfIoBZo&()#tr9Ayww6>Tz)GcC{FKfjNY;TVn}4KjR@XQ zca7i+$L*b^ABj!|QrVG&g^F)ypD;Y7`s>ZLgZM1!*A8fE{2KvtA^+F-Bv_{J}E1t z-4w|^#6fEiA;x}0;*QP^K3nqQ_qn0hrX=XN9lkFbMWpT@G`fh3)bfTrR)@jY8kMNW zNk~M8X9ri$^)eFqKH^ z(AqW&@+rc)-R9;a!VcmY^ zq`loN+ZXl!G!6M8=MLRjT9sLsLM~VZv2T z{BlomKkC+wv+^TjT~Fj=@v>J{sG}GH%)vSMP51L2fi9 z!h|;RNEIR8-NGUx!4nGDf7e6LS#U=#G@yZ^U+xYX{Bo=F`nLYg?@I8f1ayZ4#7p`w zxTXqCA&fDah{-RN%^Jcp>a$VU=@A@U$OW=A{*9B~x0y1B<>#oq3y2G81Opl|^C zyEX4og_9=&8Vs$9#-7V8i7WU3-vZofk$FD9Y@K7__rq#_x zJr2^I8!#fd&(ze)%rKo$Hi*GfS;oPj(kdU(W+ReKC;fl`rvXL;QU-w zJN{%pg58vj!hc&6evU9Mt`&gn=eHMGTA;>pL6;`3{($p2xF2w1iEgW-rw#_@8NBOK zA;>&4S9zS)7GAE+V~C%;+~;U}&5>g%O&B-X{x+BS=%K}8$x(@e23>KWAj{rgFQn98 zp~{X9mYYEeC1YyY>>}G1r@XDlVLOtm3Qfw(^{3};a(;-{F)pYZ6d0*MaEK=PO?Cy3 ziDe433Of6t&|Gpkm?iJPuL@B+*&@WYVr9=wSF%(P(Mqm{${UM$Ia zU+1;ZH%Rk3bC23N){&cxTlifYb9ZHaI{fC<`I7A%2>hfi$CzT)*hkvhe=%Ahwq-X< z%i4Sbv8%uf=QAXis=Ko{M;!9}cVmz8rNi!&f{fneTZ#2l8WcizU|U+`p`ebAoRnFd z%UAohtH&m>RiFa5|5u;BbU&%<;Fr%|d15W>>pSOop6g2Xu2niC7d2SRmk{x(R3wwI zsr1zEUw*c5zIij^;9ci>g}vny+N?EXbFSR569sf8nIFmB-{HZSdwigw9)hJ>`!$kl zb>;%Q!`%j^;PL$$c?p5(E@J zd-{Ru4|m%+hK!85H7U91f(7_Y>}W&nrv`1!`0tH1!==&_<-J zv=zJf0?#=hM*W9Da+*ouDjF@M5#ezW~6_MQ-JY*BMnaYuv7AvoJgnW z9ipG?)@ieOpxXetCZ!b4bnYL*4&QC=a%&pT(FT*+5>^EF*?f@iVqlBAW7pq&8q>J6 z+CiYz&_c-!jrUw5_u(avSRqAAeBIX!_7};U>v9kzojc5P5XScM2OD9L5N(QHoaea$ z{`1xEA4P(0VFH7nW)W5#haul|(1}6MAQQC{7uar)Lv1k-ZNx3*DW6fO`iEMl-&e$g z+9;OOLlULDQAFAnAE?1Z-rYuK7VhD|p9+l}`Z%lLPjF zO$l3nICyCv>S0Scnrwa>$MQ0o;xF9CkaZ69H@Bx~n#{l|&cs&IWv{tnOX126$vx0BAgwqw?!WQ>b4WT;`e&OwGOfZo zT11gIXB>ajpDekbfy z$&6tx_O;0xe;?c9WAglmd@^Pr<}VL2n&4#tU0~%3uSw!TJS1Mc#a!Ss!`aRo8eX01 zN$oXo7Pb%JtSkM1*K*yuif&fj?q03_&cmxTV*myN?&!o)QBM_xH{R7m!?>6c-AT`? z>HaZWvuboP_G9h$`M)B5Z%jLm(S(?3C>^gqhpEmG!ga2uqH}M4qhI`-t6CqKwWPU2 zDe@Iwfr=V!$$V5p^EYEE#H`0#f4)4~i-zL5_zG(f%<-$}^@Zf36f@s4yT}~|Dj0=$ z5ppH&+=}k+1yZ|PdwM5$`w6r78Fm0Tg_PX@cM(ub6qXd{GD~*f_wl1w6ZL`^C#2$o z!KW_7;zlvLQ#-q5#|Wb`WzQQnQfsI(59)9v=+HB#7>>?Wp{@qHeN@D!$0x$uA0T#7 z6bpMTyMWofPv8&=JJz8tose3wibz)UsF=x4l$tTJv)8U@fhnkBbW>|YI3seZs+3<2|dqVTtIV(x~;-87a z6ec>A^GdYDu(R|u7P-4P&S|5vLmCdhW5!VVe|y1}VhrM>pSdVEXxy@0XCGDHVq(*> zGW{_RTU)eB)*?YF4x&C!YVrO97toIFW^?vCocu#iuW`B>RJWxem0i8sN4H6+$p8DO zvVvROW0W+|#L)uc!Xj?pJ>7rV(%;-|GGvpf5>{*5y;393j(ukc^C!f#EYbMVA|Xt8 z78igl*N@L;owW%WGw#VmA}riy)hf3jfV-7)C?T$WOO>jOvX@9dMR%2!GJ7pNc*)k~+*i{N-fepAnvHsXCfSym z@ls#qLZBu6Y`P#CwG6CmN9YH$sbpGtZn(gGqd*FWoiM6#>U*6dDhkV=pnb_1{FWZT;<|70lS$j5P*w!qnC3yl7L}a*++j@&!yS|Eo$wD+S z&HNbS=Ngg&E3PYGgzp$R~s}M(cenaL+1e75j}g#uw+TwU_rbJsRaK`SGrr7%0oXN&bA-AF@6x7C>fj8Yn*2+MN-H92x!iO9WXXagAU%doDd=f=l>RB%qM$_t7 z97>MYqH-(44-?>@&vLq-o!Wda4@s3|lPkY-C7~+u8ym_L{DvhTzA5h#`|HN!sgS}Y zc}dA!nWW-HT+9t1AUbI(QWcD=204Oi$~oaao-p8Bo*5u^zlx*=0Duys^pqctyqrt) z=|&#=U5gjAvRu;pW842&ka-Z2rip1&*m0w7v>)q*%6)Y=;o_{U)`@nbH}XaT!jM0z zuxCe2fpd|NWDyjh6eupO1~ULSgklrH-gV<=!0>1&qSGA*E2wIpj$7=QXK)j~(xr1*GHepS#5OQL%!&Mh z7h!y=-6vwcT^{+3T#Wu)ar%2U>jdp}z9(6O!ZH#+Z&e0W+gkzCWVv9;odHlN$9VSs zQn(fgPl0r=uz}^m862GTX>hGl#P~P~kMKc#hdgdW{Bh~Y>s987LFSuailYIEL)T)F zC_U8_!{Yd3QjIm%bb;xhR^>g7O7&hTOJe zMw+e;^A^+~DO4BUw4C8w#%_v&vBxTeFM~Z6c|fvwr7sV3Y3PHpq1C0GZVa(cRjj;T z9-#?flg*$BdU*d~IBZIzr;^4_@^xW@F@UPns}7&$aH_JvZwi$DK^N{&#xT``a&D3I z@Z))pK($AAs`%@z(Y{~{rQWxzY4!v>7B(AALpwU^I(mM{XgG-qwBRpOnJKu%ua%xI zTWxSBGbPWg8TNK^26^fY!4nv(1KSLzQt+iEu;3`iZ7wt3`OG?N$B3$4r}l`mn*Ue4 zA0jI@gy_AYXOONJ8mmSE-;IWPN{wC6&;Er4Wwv87HMHKhNsAQ7WoK{0_=J`4)fP@0tqe0ZQsY3q^x{n+jc#55GtU zHR_5{OSZzAaIFf5+Ro|Ww6g(6?`g#XQixmelgXYFR28F-_kKM_T*Zcq*s9v+A9ZyiE7D-m|3iz+n_ID|XI1bV3C8!^8il?eBr^D>s) z)Nw|Mm^hSYCD==a&-#t7h^>wy3(CJTP?$7$vW_X!ew1ag)y(f+H%3P4k8agAHiSbb zL%D)G9Ao=VZHF1T#NLux{z_T7ePFA$Bqfl6Ai|OexmdHBtTH_@k%L?M-<2$uiz39W zP1l)NC!{@ooP)R%Bt|2cO2$21|2w73nBwZgSJx~N`$@63KcYT76Er4tpxpDhIgTVbznGA|+@feRlTdf{-SBDSBv;R`7 zBe5yvC8-k~P{YOsvNM$oK_w!!>Aat!AQ;%9F!+_=F8%4Glz(hTjM)0Vhpmjw#T9-{ zVyb7qK4AS5tqeNbIief-u@2MgQot`Y!x(?vol#lX_g2^~_XYOb6S{?~5ZbBgIjMUV zA2P0E?;{L5?@SS^gBy>+afnsEia-f?cZc>qS;Bmof&w3mP|$vpAm8 z(zt3h+o^5Sg)6t?VFfu)b`Lws_ws{3ii50@;AdD9fM-^5#E(Og^V53($urfSrXEul z-FqO6b1t5i>(JzmYw-9E7YG(c^k^;PJu%oMVmcd=1H!+b$faNrGbmhH>jq6xg0hkm zSQ57%)2xh;Xsig&2hX59&s`Vg5P2Eidw~$y-LEd*R<0ZRMe()sxVNbYdZtCT|B_yf zB0V478C+ap3xBW?HlLhG?AQ_jT{9x$E^2!zqlL+m=QbTU)a!@09Qej@x7fvxT}rMg zI=y5$Lj&jHJi+8e}TbqJ&T#b&I7i*2$nFm@?jqIIadZOOM{_1aAyOXJl1dx zgM5Nb9}aE88#_}HTfZnmF}D;Xc7G@|&p zS-5ilz8RmNdMjvN0p^2Y z#3_td5k+CZ;f&>SeY{=6y((qj3W8sh$8Q!Yg!+ES8yf@=f3M3$_>(!i5DGVolyEDR zW^A&CF!^V@UZ8?qqN7T<`fwD#Hpzg3lI|nA{f%0)g`&@2oIH3o+pOv#qe6tOy3aMU zq-fUT@%1V42XMyRr3trlvEnr1#5I(@V;&h!5C&i{&@aj%ZlpC&T?dt3FrHY~cL@0T zajy;Mc`Ub~3NIFp(G~*5y1bPFsJAtk78QoN`9g9_+F{3Uz#y(^ym_pgRk*uEc?yD> z8?wIIF{7}Sx1y5=g^++Xc$`Ep&~LxS;6jUH+$QJ)K}fEHqHh8jfq=<`dmdGFW9fh? z8$Br3m=x?ycRQ6ECItXsUeS)EO)||wr6t0loq$^-LpY*SXBEZs3yb*(fy%6ML z*KG;`?md;<(S1fGv&JZ{?HpoR3?%;Hrlf${*H%Fcl~KZcHyWlQnwwa2zMuX7GCkz3 zRa+y?_Ds~?%+}z9o{8vIf=r`Yh3eR6=Hq>h1#l98AlRfJu=>}|7r)00u$*K?LG5di z#x-59S)*O{hQakC{&PaqD+R|-D{U8iWqUe|%HU=n|EqAKrG$yX2!h+84gwz+-7C?Cw1G-T{c28W@AtU@&)n(Mj zbNXALf*8;4zGjUiqJv$0?l7cl&5{_&HG~uJo-AM+_>7I)Ha1v~ZX}zxD>l?j8yN$X zOYG7XuS&;ZK-*!2W`x8_4T;2n&C*qvtkq|0{+gVZc3bMbO_EwR54+mEU6l^`IZ-lGoRq~wZ zCU$h*k~vkAQ$xrGib6KJ@IbV=`V$AmO*DHOQIOKo%GLJt3F5N;$=vkWis0%h=Ba5I zefA#bSD@R+%GEnaMzFSopYqU*a^YCeB6WxK@@JrpZoRzZjs!LYqN|xKOMf4bgz(UNi+3H5( zOm8F-->qZpb543d>hcwqA8C(Qp11SasU>O^QW=PZOEE*ZoE=Vbl@#*?J%jhqqWQq@ z=6k*gfzB%w^Lv)}d38HPeMeec1iP%(A6(|7Hw#HfGB`{7^}wT!4>@nHNzwSGKBh)V z3+Nn_AAKus`nn zyD>`P6$#?NRn;2M2fY9OPqGn{h^>?QhaB?Wqsv7kE?KI$8>QN3;l10!G4t2NScXO) z{nK9HR7qoBNuzHL&TU<@-;?CL)`zo${ZA%khD8aI3Oie%pC0=BS|I$8->2_pCpvzr zVtwH1XJmj&DEmlpuFmf}6N6)o{2}9^fq^vB7->SNBLjFF1m(;vB{o{%`4Y=fv;YIA zeK^fSg1~F#0==GUa;a={YDd#`6s4F`+N=5`58ZY)c`&M8l9NNM)+NAlM zJ#UW&LoeNTL7~^$a4aLOh?nA&6T*(tM=cxG!l1)6C*8rl z<@3zl-nJy4;#+6|xdM+65o{?jTwsvsgs~00d@>8FoA!guvjs2w;KQv(eThId;6ey?I6hHwp+>40bcp;bEHXBse+tN zD-OSRX|BrS^yyi>@J0c+r+E#vLZWXb&5wXuPhx)53Wn2eX0JP%E zRF~L^$#G@=-@!Fv%e}-u673TIYlE>}07R3ij3GlyT4hMQe_SO+NwgbYSeOe~4?ji9U z(oyoQAdjMQZymT@6w5gi1qyxD0*v39eXxzYenxh{ZA|v{X94?4BTxRUjV-oCbu3 zJRfXnjIra8EC7!mVQRGX!yGE^cG`eeQ8Z_BK@wqeJxk)qQfcYB21kb%b~vp6u76a< zP9zP4f8Vv~_%VdXsTd@bpy!XHF3SfE;Qo1u}_4NeSJ@HU7 zvV5H?3IK=Nz{kw8?r^Eg-EgHdTw(Z&Qp)X) z|4(goz0w0wpBZm|LX{N=M<}m%LBniX;zHqq0I#DV^;xS5Z8E*$(mLu+ubNW)@*QcQ?D=$Subd? znO+B?%#8NNzF2aO!`gv1*YZA@fQ{w-s@V|%j_9iEmCYt`|~eLJ|+S32M(fCzm*2LuFVWq<+8;3Y50#V)?E$_e!!&aIU! z(i~DLqhY$(G}y)yWpuC>eQ`eqfR8+fRh?wED@==6KyHy1VGIUu0$(IqJ%ZPbmY3rC zQ*=J%FF8IH4rG$J?R0U8iKo7MD>~SVf4=gH<0bq%Z8E$H3x1Bf?q0`fDL%irn(sE1)T;Z?iJVE{~$ zA^eQIjsKlS{<@wIUE8UWx;N%2{e^PaU5OWj!N}RnL4253se)iJZXulx=l*-|(>i-* z71xotBgn6okiW1vhbqNU>6`3kfunfe63ATE1Yg)NxcqJ^aQ1c%XwY&K_R97be^ zc|IAsiP^%%1nC?OGq>|W+IJL2b+U>&wp|t8eo9Wx0KV)*BJ6znGj(rt?C(hNT%;=V_X)dJ|c-bb*&z4ugdi^B)| ziImbbjC8RP>4c7vEcPl-m%soyKLtSK^^XdCLzWV%gTp2Tk$fvkz>Dv}-B8%|5fD{u z`Vw=ywX8M11E6SRe%tsLScCfS7T7$mD3cDBCa3WQAaF6?VAUeAzD(9_pz)hy z5D%8@ldN@d-lCY+{*)P#Vu#*0)q->!d?-r?>`eZvs97l6=Q!?=2{PVI!CSD!0ksp| zE7JyS$6h0jJvJZRD9ve-qw|#hw+_r6GKsUXQRpHu8RUcxMyxvcm}+;}=3o3Hk)u76 zwap;nbMH}WKVB2_9QtbW5U=pf<&CI;h1HBUUCO{E_&QX6wc&>FqS1LHaf1QEHRnE@S zKG?@7?iLm_r_ISg(!L;9aRj7=gBYZdCS!Ux56IjnjAV=Tt_bTMt`IQjXAUpyY`ply zIjB#W@f?tW;1)9nIf z|K@oioZj5sLoQYG_Q{BR=eUvVhX}`B^$Y0&L+$#_%~r`OoeDDr1Cl4I!>O2J?217P zL<)}S73lu)fZa|8|)fDWa!+EPFC*Ssa8zU zB27fCkMdR`cqIKKQ$96eJ->HiS_DDlIOr!ixBiXJc9UW*$%R4 zYZG(J5Mf18qt<(38B690J#ozPS=#h+y%mA4TzT$EFhfmucI55+_i*S3FqbsP-e2N^ z0dt-pzal`aYX>%-)fwQdd>dN(X+hy^CV;Y>1Sqpz23qPQr*tM8oVxg zgmR@y3&lBT6NMeSiaun4QD~e9VnfsUTS$jJ_|y3Z1Z z6{`>lhI=b-tXO7hJHj?_u98a(NlJwkJ5PoQ^CFTrC{>#EHn+NalZgOE=81# zl6d+QSq7O^EB-g=u;a1Hd@_n2uVMH%P1q^$8Q459S4&wV9XY;>#&ubc_8b%Y7CRs) zri}zdygy*^AG79d&d9OT$L~q^aZgcEoaq7dV_1I5=Am2PK52KajBWy<$R1_Pt}N4KbrCOy5;DSxdc(nIHy* zpfvK>a%^lzG24Du(P?xv*egrSCx0q9^&&g;1^}yuUqy=1IvW{MKbU@B_gjmJOw56I zrs0S^@=vybBa5ElcgmEDtaG{gvPs0Pj0#$PT#?E$uV<3GxDYt7%{W7Z0Tk6yZ62Fr zgmbF1r@fP_*RQ@ye|5~I^d&_9adY0?xsEyAY3EI_w%drB*b4|EZvhRFh`=X!WrI*247{c#TG||9zuq zPu22aL7W?}y=QJxbS(~KdLvtySQt!mbIW`?&V#SJdlq8@+9kJxqa`PP0aB?z606Rd$zcH%=;fJWesESIr+LO%M zR&lw#H^IGQ{t|^bPq*@X*T3M)MxsoE=5d2J@1=E6#^4l4{K05Jx_7xYlqk9xpUNJ# z6S+U0g@81%p*HO6gat8npIUA^#Un%i*KCwQ!TFRKgofwzjK2>IMS`d>-9-V#!VzA& zFD6k4%Dz7SCtO|A_U}N`BpI%P|JWs}&hB%5dvTBd1$ZKOsvAeL7UW+R7)dGOgz!~_EK!}a8VT-sAT z(xo1;0H(7E@k|rPhWfR|*MF{ZF}I{v)&r-EjswGm>sZyiKHI`E1i_si+M3ba5AR8a zsJOQHRk5=6;o79j!0Cfx*4;!Qqv(4;+k-SMf^p^m2(e^|%e)l$*9ivu~T^E+6{PCu28S-aT`B8MrNLV`xA|^TY z(FS4NcKkjs3n3g%D`IOIxrUB~agj66ERe2&RsHI626rG3Y8U{0NvlN$qwxvMbfuSa zce->*-HS%QXUZeRPuEHxI%@_}BRJNYY-%$*U*LguM&-&Sm>9ytnxp9ir=Sd2T~Z78 zW0*-5h&((EV{q`4a_DJQX4Rl>rAmsxRep&L>k=f<@OGDWu>aa`p}zM?JL`w8;tJ7& zsDYZ^_SH@-KVwy1&W90BOegT^sQ+RzuEQKfkn`FALKNC4d@bP`ZDtlsm2gVih%^xz zeOv_VI|6YNEV%X|CF>gqMp^F;H%&+P7G)A5`XK_RTAlf2Dlwlrq4}vZ6g;g<_vohH zB5O?IbSR)-3yr}pl)e7X(QH#-b8;&AQ@Dxk#i#tVkB=7b|5;(xt!y0YmOp(N znBz@p^DL>e6o+UtabW5#q-7A+b=_OkVu3%ICuYE)vdOZfij; z3L8FU|6qt3NQ)qvn$h84v;}8^ezawX@Bh7Qt=sB2II)vNrY-}u{ujLCMv%gDGp4)@ zTNoEdB$8vjW(Q#73!Hx$8LKQZ;$^?s2Hr5R7o!Un*&ky0qUVo^yM_aHu5|K!IJcw= zb6KOyc#yW|UMsx%{M!Z&1;1ynPyk@mn_CF`#mdHP6x8fg0GMRPw$ zKSt$chu$-uT-9sa>OlN2yW5v%K9VP@882840h(W%HzKA{^T?kNcge(HM2%A)Vsu*|H&nyKpka^~ z`!hrO=|BE)y0dKuz3yBZalmH2r7ru|gExgbb zhpt}GQUNW?_0o11flZH9kC>=u8rfERRy3||dA#t=TYO84jo=UR)ng%Y5S zW+S8)e)fs%kTb7PR^8uQIA-bzCu&$&4dX5Cm{?Jzw4N%i?ALDb-6D{`$A4r4o+rsa z-&jq_ND2q}`i0U+ZlUMI%)z~bTYdoLZ_E^X(crBVUV3qr_%MYjfO z5Rh0^j-ShZ(&6S%c*kOlGdWhn>5(BJrOCdWF!CpIex|W0OYRx>jN~Ymi`c zY5N{i&UknVkK{m?p`Q&{VFBD=;z-Z`ISLNTOTk^T*>cQhX922OHf{B2>J2VLj15IH zDe5)Ex_)M^Yi}Ea!`salysb*TD3f={PCF1aLjPx|@vY@_F zi|_K-1G`5Wf5JBY{yJUoT>f>rowSmy=}Czw5m@x6-ATD2`dHb&m(az35eAhrxZM>b z?QwUaSz6K~S-RDUEz=56&HSb=(iuRY>(yC$0J+OOigG6|FT>&Hz0}w?YpliMP*(gN z<-fCN;Xmk^RcoKTAWUDS|CG{ZX9E$OUb(+X=80ngx~O(LohgkX#OTrjY^we!roXhc zhDLRDK63rs?Fe~*5HMcG#KB|_c2;i|ozs++tQP`#z_k}=6_v0m0tN}W`@P6+xG$@{Uc>fQ=p9$^v!Ex-EU4}l>|whp2dg1-x1c7J?D1sVb)`@PVbn&WW=J!O0Il;AnD z40X0?lN8uhAt?6Cn9`F~%iBFN0Asl+kf1^8<6&~lcv;%n=BHy15O?+Ibei|V$4g=U zvOQfWe6YgXeb;pN=Km_fzZKAn2ipa_H|p~&eE12*&8hJfR;iXsKa=XRu6WqXJ|KtPJ^z<14jH$lZ*H5s#Fq(X3FU%2GwoZ2OY5W z-8YRMDkHHQIxq4z1_=T@Y$T+1RLrW~{VHIbCG-v17{l58>3Jbe9C``=;Wb)e5<{S= z4jJ-OhvWEmc&j@3LLpQHLTB{Jmp_(z&-?poG!Omuktxk#cn@%M1fZk_saBxl z!yIw5(^kEGhFY*tB~UW^n5F}LbTYEvoz6C0T=YXt=MhdpP;BM+xx3PhsWo0YoXA-L zq5oXHWe4`a)P--i6gYeez}T*U6wPq1b#6`-W~g>DQoctlBUR4KlfP!_?9#?ly2c!3 zoA-z^om6goP*TYJ+-8~>ZVxeN+!m(Nq<4T1q*it#(F`-jzanJGoehXNnu|F_E>fey zfO8&!wG04ur6;rh7bk?jTv^3R9tZFNHX~*NFJ7E1JH`^L7!CF3X)PoSFrC+V6V)|M z)8L1khNizJ&4)0u;qrX7@HPUY#TtGZOJyEpQryW@3ht&!UZFPP7Xd_arP0qi(O% zN|67@Xer?9E!g6=S%{j;_@zP={en#Mi{XbC-_n83FxvFiD zo(7&NIH6T}_8t^pBVWz^>g`tW365R*Qpo#BR%wL?HwT%!t?Km@phoc7uFJW_>Z=~( zar5?NgjvlbDK~XW8sRI(>iYrh(Mjbpn7Q-v%m^0TX$B~>0J;7nq`Zpg zxSekhkz$Vjcw6#-&lyPPB-A58F|;fkw2ww+t9}KRqo78m&2>udp>YTTp7Z%jI`ZM5 zga=*ZW(AS$#yO4wL~gW~vBtAg5kP}V>Kya>*6U-NjS|GjZeOEQRzW$e*lce--%fvj zfo~L=-we@mN0zXrv!n2l(yYxdW9TyAm{S)X$H%De1mYHA$ZjYXDUjO*x}I>*13{+a zu7^I#ehN$IZ~ifHA=s{QzpFBY>dlnSDsr7MgZ$-1;CR8RDm7v+qP$PL=*yp_K>r;d zMzQ}w9uer9Vvgz_P&bW}cSNOY0^8BO5bsK*8TYaI0Kj|ra>~9`0BUV034yOPbaMXt z)iV2W@`V$|TB~8H&w-6&nJH0eX7eDY;#|lpZmT!X9q*lBcT<|E$+Cjxz-SmyDy+0c zDa^A1XICx8qeQ9Web1NYSqMMX8gw0#x3ESx965MPyjBoK_7HHYE-HRI;{%rsF2O|+ zx0-mhHEppNSeZ{N5qYed(zKb*-M^Z)&&;6(#lKD*Y~WsIvc{A3m3ILO#mpSi(?MX2rD zo}qFgGn8paWGg;iVDyO^qHyJcwtUv$G?GA=X)-D>t_7dJL!<+6!t37R?MEg1#@Q%8 zS$|}M!W|H-cyaX`O&<0bmUYQgGaIs7HBd)IKmQ&C^6;@?0Y)tnGqG#YTwkz_>jRSB zWOkumz)^ZiDB}R{gD#8cw+@z7CnnflmjlWxye1v0+`V<`1>n)YHX$H!$o*4B%(9@h zuoGlGOu$TElEr#Grgj}zIS0+ALK;n;+xxC?CpS}YbW|xiHOdrPSo8fp?LWy^*g*sm zEuw|B`ljIIG+8%Rl)|k8HI~ql&f&Dazh^_<5x2?@U=nI&?h46<-k@gQG zIRZ;I^K3_vWRNs_cg-mJtrX`k`R;>Vx*6{PhH~~(xyl|L(M`|(&1U&R4!1-{-h;V{ z<@j>&uX_A=*NJ4+vR2Aa?>eMuQbmnErzH5~!UAhC}Q_KokpY)hV2MEe^RUH#eY|O?OS92o|!~pAJ2|kdt zI44jZa{#lA+Ws(S9S0jn>WnXQ5{3Tg0SpW=AN1(Ydzf%Pqf}175fe2X#{qs}MM)cd z1>3@tR*ZZOPD*{ zACrKSPVWeT4>{<9NbqQlIGSulnTG#0eYcXS6=kxKmBlj%U`>nz;*eV-d2^s8izFxJzb*CoK)WxCj@25?m_GuJP^Kyu$Nr-XU-Ym zgW0zMqfe?$T_w6u$U)B6s7m@KeI+FjMp0Oy0Gq0m<)rV4!>|QtZ zfLy7@qqzzccdhCGDj};ZEJ45d9aa55@$Nd1MKhKs?}V+>2-7owfA4!aX#<=)RK3-R zIFg?9JmM!6SX-FGd5bVY?q$h(%y=*e3F}cO$+JX~PKEY2EKtSw8aGwnV+9^%<+3Qh z$Qr;6Db@EfNszwiAZUYh*g)*|b2X)Kr+*b%*b{^Z)2)QJWh9karW`By-xkTBJeALK zm5*tUyb{Wbk5gVWQ`<7>to8cVzrybLkSLzEw$nH!%$lDFbjSg|61*$SJ%=RjHz3Jw;8$7XMsRc2Kt! zeTv6zM5O|$VSFqwr_hY)(Ixhf|5t`KWp&-%p z59hTxOB2IkB(&70@Li3e1LJsN*lg)j38D#Y#PGYVeBoXw!bUm`i8LQ&hd5SP*Od)4 z{we@~SCKWIiZ)oBw}ZX7{A4axUJ)WEW|6|T&*{;MA?|+!^xQKFB+AW&9}ZD1UfZk- zpu|$pbb(esw~bx&s|e-=iSYfbLTO*`x+n>>Hi!v+df73+(<{W))ea z$XE&h_Aqh-AIcafjF#&Cm(8KxSw6>WuEtC>uL+Xn%M0NpqDR0`s&d6o@fN5rH2e8> z;mx~#t}KSWy55DK7G%!?Woj+Mh!#9Mu=e|$?VynlDB3RA6vV_>#sz(EFeUKrYK=cl zy=mCB)6}!KvK}+9CLkx5ro#P+3;ZfubR9bTKxAUb79XDkC{z5tY3VjCQjF4A`VGua zb!bO?&z(1P_ns+b$5Q)O04IQKDT|kG-w81F9FAyJo)0+%oIymoRm0Y%X+8t#B{;tq z8K8KkPn1gK;;iS^j|iPn=6l$59$Ob%+zZ{?`nL^(N1rO9loeJ@RxxUVFhYVU^x_9R ze5Ji`eR*=lVAvO^HG<=znb*35HO>w@<3I5NAMMLFs(Z|OR&b+}?@Pk7I`LhLMVQ}U zx3=}NqJQLEdy^a;1PJB>nJs2T2|JD)SZBxZ^slrsdj6_W0NSzy?rZgI8w1R)7Fn=W zN@VdEN2LjTWs?2qRJo4>NRlPq6$z{gC!Oryc-!b&Ug$Jb$G|GRjqU<2(=3%N@Cn^G z$xQ8DR7PUjzMu!Gg?oyH>knJ6AVRCWd3u?wvb91445Z-?KMC z9Gq(R;9db@ousTO%+Q4>)ng?BQ~pKY+r_CKmC<+G6Ahf|@;d^yJ1yq#CUDooJWe-8 zgEZtg^&E*Fk_^);9XT{wll$LxVm+Z3W@p2C)VP%{dhB(*7I11Yt)Sm`Q;UK!WYnumu#$$5P3XoN`W%~^Xw(3M>O7M3CV zh?8hP1s8fyA6>oIld-0lH<$^>jP@|@Hs>#8L464f{amXb_$&$MC4v)VS^><9U@kAO zBh6$h>8$RpKXe?!Z)+Pku)vT9|IY?G|FSao??+y_Va8R3` zM9e@%Up*J|ma7>lFrb~pJuHbYwI`F)n?0TAe7?BhX;G5Cii96=9fIHY{N?0VQnbxk zYy5ucdTQ*q@I#X}u6B;mm+vj(;1Mm9L*2^mFyiA+=0fR1Tw`tE__i$Wn#ovEFrj!A z^L&ch#heQ;Q;kd3m%{mMEmzK_?b*A7{Qs0wfWND|rYlI-R8Z6=>EWm#sabT7IjzILAV_(l7J6A_Y4Le zjJq_Fss=4CLa{a7r19~wlJXfmi+KyX5u7-Ontz`vT8Faps_%QpFLEI_G2piGkYo<` zGCl{=Q WBZ5cy9U3D)cfbYHCncwLI!Kk8F9@;;(GAh;@gt^vLao#>MdS{s&?hvG z@+In;i=C~B8c?6cf0FJZC;lAgas}=f>+)`T)l9_UjYgGuwnax&dwdhR3QQ zn^l6co_yhYjWA>|>Rm^X zLZQILLnYVa^Fp0*d#Gpb%AHiBx*94>Tr3XRz|LPswXIP)YafR?sfArZBHM}HDZy2) zf;B>QcO_VkGct5HvbOwTVZVfF0rD9w#6UeD?B`~6*md7ihDEu!<&Ckb+Jf8X4?!OD zR|a#~MiKJDNeE7dpd@F#+N-V`J&a#X(D>yk{=}S3Z*fhao?|0m`ES-jsRq9lp7uFS zBa43N94PdwiR87oq;5;4|A@0b*NZZ=jd&JPYGO&c&f31%c%|OcJxMZGWL(0PU0H=n zc6b#A9lmH{hpN&6>y22mN6N0a4^S(g3)!wPgB@-mwBveybkH~96G?KdV*me~tb}qz zC?BiJA~@b|Qo-!K#1gIRM=}RNJo8(gUB<{(IctW2Z*=&($5s^Y8AX#}U{IAC7$!XP z8f2--FKN0=%N2QZ{w^TuN!7cRQSUcM{33H6umSxNE2~XU(LNDG^YZ)GtQr{EO=p8F z3>%6i;OQ{b6-aoP_nsE8t>q7cnO|YYb891@X#ut*a{&K^L_O0F(UQxH40@el9bb;~ z2mJw(4;!MASVehx9=%v_E#furEG<*h5j=3foiS5v0y+xNC<_36r4A*rl8rc`KyzF` z#ddKo^LeIi?}vOFk`V!!(0y8NrVefp*O^%bFl;GpgLa>eqj1JM3$*0YB&(Hk@gi`r zE`jnVv_0Ou70)5nnv32m0buF57Jl##=B$bf)zblExrg5(kV#3lQdewcJk2ZE*}hKl zBXegzQ;|>l$+w;r1egdE#uq|LzqE$`XWaGo+KA4d7@*??1xk5T2fG!u>>7 zK*&N+UJJZ>8~j3xApdUY@%R>vQ1=*~{Zzh`mD`9qd_*h~oyO}AMgzVnC^k+Kk^{tH z5MqV5P5*K2ku{(tEK>oO1*&H*4$T9|sL2&~#Q6W0hw`}f#5?;iiYyP7+xWhpju}O) zuGyTlPfJ6uksjd!qS5SCDq4ycoEt4$8}hoQ@+**%a)$lhpi&I|+ELGxSV@5;Zc$Yz zp#sY@Nx^m;?2>r-{2b$tixjL-wMj4vOxr3ndO z1l8M!s5#jtCGl%C*{Ttokub5EI!1)dn9(xTVgeRlME2`z{9STKak@IiC4`FK$`^ZT zvsq_Bj5jh3F%{I|AQ|`x3MMI%pQ$0)Xi7CR*WaUW#Xew>@#W@c`lYpQNXXCF7QY~k zM~T<(^`j=^3q%`%jGI*kq#{sH8PUY7Oo?TBVZNs2Yi#QuQd&N$B$oOQ!+^p5fxZDU z=@r{R4iGYCwsd7Wg~o(N^lm?<#uX$}W*OKlQj&0l1^v4bJq9B0P z4Rxwx8^?s6$JI)EA;^YFZ-pAgakgh2f)`+)7D5aJhSvLT42>z9KV)kDv%MF$LalQ zEZ8dGJHG;Uy2|+?u*mWN)I93kUEF2G5stm^NCEu|h$}iMZd6qzc=>|y77QxHRu8i) z-w5wkfw|suKX)RSEwYV%q)oh1FW?gBh<)Z&R-NM*(K4zM4 zlJy8XgYwSV94JqM=wWYN4Bv=F2944{lfGA!CqaC3o7EFtD|(qC4(IsyUPk1htTr^x zub|7Nk=-9B3}M>+j$5l=nE=e(Tk&ua(IidRr-!9*`6XpZp)j`J7!(Cn&nkg=Q{ zfAc{YiHik=N3W)|1#d;cE3cRk0Wi=18g0VV%LzFw?CKoSY?WqcRkpzUq^nk$C zse;n-7Y{$g(ykM&Nck>Zgl?Hpu#o)z%uH1E@3q9O8m;NI+hGVPufPYkbvbc62-qV; z&9hE$3P)PTW%2|d@PSiMmR_;dj5XcM$NjMY2x#_85ksiARYQ+~{M1>r^yF>{;y3EGc= zlF0j?fa;}_^IN0nspDf(e30kCw+#Qk6O}ZxX!RLAgrO=(4;#jMkZD8uSmVSUAbeZ? zh?%u1W*#qL-gpji?q&tVB?HhdAdD>&C4Radi;(uRYX9)DFmTM8dxh`int86w^!o7- zX&`c8%}*8J_=ixVSBQsU1RghBM6Mj%0WRdR>=(t?mYsKoIco+n6)>XHw;%zR-q{CX zx;??J?o-CisN#}J0dhe!Gxs`G*+f8Bo}W7frQ2TW5!#Spy3lAE@N57+EjA3&y6N0f z+giF=2*RC`>CEkhSMlOamhN7c63e8q$+!*VxUkWIBP|DoWu0_Cl=;(B$%5>$eNYJ@ z7s*N;RY(171s2;^QYU!0rqmBKipzh4K2NF~tM9H&O>~M z!X;=K3ehekq^WiZWqCslP0(Do(2jsO;OInD&L^&P&%Y8gjlPBO3i&N;A| zc-;8lZW_p8Xq%Y!5ZKyE7y9aDpuW^|PGFfhKms=BP79NwD zIK8(l?ku{hSh(C5P(WTztbiye0c@+iQrt71LV0850*N=<+XNzZtijzau4Ck8XVIok z4?z##J_8RK((Dpk;8v8g42~D_)QePra#M@z65m*DKaCDs&fi8Ls)x|9;=~IvE}k<3 zbyC4eCsoqU;Af31#n|h5L-zYRpj?2H;>sHo%5^0bBYm_ACnjL4rxEl=m(RWm;N4+D z9|g1DbVgPV>w`!J5QE)$y(pZse$+`KxaC-ii0-6B4d?CQoFsDP(~9OAu^$`I;iL2k zKrPYggJkKn)P<#of|HbTkxok?+pg&B4`enPg0N}@A|g8JJL2x_y~`({P^*~!+?7|a zyFo86VdwYdOl!6~LM29Pcibl%(jFtlIejAjX!*y`VsA%5mg4(O<)VuZAz|7%HU~*^#J_2}g<5_OuviRSVFeG~kb1nqyjmHc-74-73u&U~OBGe8kSqPu8 z#|m}=nvBc*Xs|_JDmbfwQrj={E%J^4@6K6KF=CeasH4U6f;6GXSkyRi`A1~BoMyOh za4E+$i6c(_>Qt}LL{Ue2=5Qr!w05}kL(>n{A6$A>{tcx`Cr*K3kn|>6_b&D>x(#*z zZA8(|VD?7lt60-5?Y5sqHsW+NxNCL8l~etTy^z^<1d{Sz#5jzsLD#(DQ*B;IpC52d z-+oG_QW?2^iW3?}^K!lj*`^9~aC9L9AO^l_k~Ko@O5fmLU8=BnBSenSY4~_mt_Brz zDN82t7>_dkIeB#f`_(Yia_ETPLIlo2y&=YCMr;Sm`eU(I3WoRrh2 zq6+ws&8Uxiktub+tZZg2!asM3N@CtsZl2_EFY5LTbct4_&yS=!aH)R){d8IDIdHBo z!9DKx-)STv5a@g)w1v>WQeO$cgJ>6t*7+n^Whnt&Pt@AtYiY>}ok&BQ35vqIatrrc zYRX5{(C7{XX>tQ?hG+O7287!%j-ipN3S?`8_pgktFOAH2a)<^4Shxz4>O|6?24IMu21aVO=%ub>+67a9_m?hhh!=8ac>a{2{ zrX|zQv`e&euzI3Jfu2{}FfE%ZAX*j;WsTw&)n9bN!VjoR?G*`t^ldDe|8>tTL#mzg`Mu#{LzeuCs(~uZl=zZ4I)!^-+Up z`YfA2wJS4PJQ&JmXwAFnREk{Ut_2T%T=R%IdV8w=6_qW3;;?VDSg)LJmu#hWe{|Au z2&e%t-#Y&y3;rSo|Sf`!K%+K>QB!@h0->k z&No{BV0pvV0R}%7v=XkpO>YFbk}`wO(YM2Au5sku45t?WQA;~sxG$pcAMdZ$i2T9i z^)+ioB9UJ0Dj}IFfF`&mLuSeI(SI8o{~nC)U1Zn3&k zFHTuw+1-Hf#?9PbNo~5*-ZO`&Iew!O!A1{6m1Y-=SZ+(PNp>zg+Bh>==E?I?)Mw{6 z8JP;WItsQ!?NtX43}NN@f4dW|J$;n|p778e(M$^Ug~!9Tca=hl_y&`M;!cT&!8C5d z;hEBVS#1bp#n??MhPCwMA>x2kElP%AdzR)RY_d;H;YuYb9y4JWu~ju57g$ah&gaQ( z>R0~go7nMBT%jFxnr)@-y`F*MY>!h&;L!$)P;YKNzbZD_l0T?{(h|oN?Nl&ZY7|J?`1ba7S;t%lW zeMGG=uv_EDi>;d|epfZd`P1tm13%R-;SU6E0Y?(zY`|dzP>&f+)aW$YDJEiz4E%&?KPwc^Lf}&Jvl17t-EIR!sNVmZ-%WVU8Rf+jXZ6#X9{9;$2 zlowcd7?86`L#OGk0c;id$F*r5n%87XAk>z^y>_;Fm?EfXtp`73aCZbm?)IH+c{#x# z4Q9wo>%q2G8biV`l9Ef_2Ho?X$yx)*gIm_7kWvA|5v{xLkf_L_CyX@V5&;Tru195s zXcO`rNOfh0N0{l3KHZ{4`DkKM2!nVqTO!?c+1PTbc0;+;%&k2#7R`C7RwcQususYv zA1G{_l4dp%=l&?&V>lKunco5l!*q2v7^ZvozgEiCmzNbn6bmG4LuJ61Y?Z*R4SGgf z7z+xe9Wh}d;JJUBChUM?b;*uw55G!CIaxnjIdH{tQ#>ieE92$y!;&W4v)j=?#UUs8 zRh?~Jnkss)|NOGQ^k2kJQbO;hGSE6PczYMdV&bf+hYW5EZr7$od|@t0+;c>6gEp!A z;ZWo=f=Y)Wrme}^d}WK>fck-(3!u44S<+XhW&Suo4QGK5yR zy|y=6q$s;CGYmr~9lr8Ocu_xF|8)QZR*mhp2Q7F=g0lxGPPx)JZCUUv{tDfnBsuVW zSAz2sbx%s|I)JxxUWt0HzT8dY2USJf|h zb|twBV*aM$d(u7<)f*yN8PqvrN#6pFeqzRETv>=fP%DkQ!(+FUMB;RyW@CPB6{SZ` zZ6y&6GaMx{_)~#@8lqpSi3zlD+cZvSNvREw3{Or;=yLkLDC;?#o>DYqPu=iG zwVfb>=~@m+o++Yf2eho=4#HU$=%$E-IC}xJ!2VNb2y*3wg<#PH<4MAN5ckF~e>~&~ z|8CjN5*csHO_&TNzkLGmS{5go7r2(M9b4~hY~2HaTaL6Eu=Ft){EDo=x2P^c$%Ezh z&n?sr);t36eZhl!sO7Rnr!f>eQ?Nb_84f$zrHTlYp)uuFbbN){a)vu_j_u^nd$#7D zx)9jC9i~3rm1f+~gUHcng-;5g=cth|TS)x1F65rwyq#8x9U$Qsm2T^2&Rnye=6&Nh z1(SzeztxoKM!);5006b^aMd`r9(&;jI^Y4|ZN>q(=Tz50EAzMLcQO2FzOyJWhI4_WvP70e z%k9~QI@A(mS<)*v z)e+P+fFFV|`9LP%uvXO1YV4Ht<>NMF1&mDGONXn9V8G7t);BttD9ORRU~1<9ELvJL z48Mzri*bz|;#eZ*k~cRiex~xnM~w{u_;F2p(5CzFX14^K%t0F+p@F`JR4@BmJt)(Y zmW+m4coYJ?>i>HzzaeX&m;e8#PqX2vidk&qoV2fu2e-FT&c%V(?aavw&p%{h?nnP? zisl*OjPTkX1R7XoK%adS&U6EetZ`cO&y&@+pHL4y<*aDmfl8;e#4dFZ zYb0nA4_ictWyZ{tgcR=0J8*@;86}19DhN;XGHI?jhxi7_JJ)jV_d4I&CG63dbwNIY zo+{y_WQ1=&Z_S961uQb}wM<;DSN2Ym<&hPUM4%lYXkU>rG*%YqPdDWK8#skOu0zKl z>1-A*+NA~sj26163L7ohZ>%KVON)m9fk4MviUjnaEOQeA{`Mf7{pd;dgPDN)$Pzet z-?;#&0c5`Ty8s>El8hAbgWksfY6{$}vk3QFU(T$NS8h`-zRa-nOJtU|3m)HkG=f9S zxcz~{H+z?K^aE~v{@&}?w?>3FErhAjNtj^pv0!0o*l^517z=Q%d*!Rb#>X-m!3<6s z!WjVMW~8O)-q6X{I3jfRH6^vBvU*D-U=!KcBuF~!H}|0OkTXZt|3WwNm@j^S zmZk*Q9K3Wvjy@QM>*=#S%k=(cZR=t6;48YpbZx8*Rgu1fuGiw@8hf}~^_SQP{l%vs zc`&R!Y~ZaRNEQtN`5|sp6QOZqs21@Yj?|o7*G#SOrok;DF2!JMEKrV7zudWF`-1he?{AkI~9p9#3{d zYAvA2`^9%EltyCvjn~<9eVkj;n(UFL7I}N;3qIsLniHkl4v@<>q2Ct!9@qLXdUEd& zJtj%Wof`Ez6-3$Z90-n39sLJ}hG62pD2wOpUOYX;+?B26Qi2$w6-|z6|(xcQx*Vt|ew)WZjNenTsnN-9UOo`U!?D zrelt40cfSDp}jQXMjD51+O^jI$P>M#@G0305n9E92tDLpELG9ih4XK z)R3u8EtLKenpgn=!eOokdHy1hBlIL?4bKd5ClIuB4Q8p-m~a+21WZ*HHYC>8jUQK8 z1{K!9LW`41>Mzb;MV!|1burhp7wqBeJ$q>7ca>IBU- z-82@V3tKdbHv`={UgLi~Vf^TpZIicQ^tP6(VS>-luVSgFlr-aD><7qBQTC#VxcEU; zt+Je6=E0gSIy~xA&l2FtzABQPK{iZzxv0_}?LCfat^n!h0ZJiF9Edp*HzuIF=~S5R z{cjcFyYo`xbbo3q3P?I4?=(=_?UO(tz+Dj&g5@@COBEfUPXK$+8Vyc$my`qitonW7 zeDfn(F@6QeD8dKxuyVC$tK8UDDN(*#y5|!l;hYjPEv>hvAl2?kEB^zL-unOu@DXnO zt#^}2Ri@@{ndTtKQVSjVYo`#%dU4uuEE1m*a>0ozm^M-w!~ztyTcwNZJxYy#-q5NRPPZ#`$0M!fftrIHhgi;)VDxbfZ~ zTS-(vBQiahQA;KDVSR2|#xXmF3qB9K=P;bn(6>*D8y$cs!j2utKoXZkd>0SRL5s2Zcb@zE5>o<$E zUMv{wGYf%(=jjG4MEJ^5otJPBTqt;`mhxfL_)qz5gjM9hjAwg^n!Y?Guy~{$*V~C9 zZoZZ8o)(^bON6T|yOz@(00))T5PZ0!2+jL)F|F*>wr3)hb`x7>Yo3l@RRRXKTJpc5 zhxgi%OjzVB%u$k;rXxa0W+{;1RWpe_48I?^nlI#RfanBy)vKtNtSj%~RO#yEGzmCs zc{sDzJI6g0?hq#f)TsW!gE2W6$NqXm6YP6rwe~itX;m?njxKBtrN0@#2y?WzIvY*f(G~f&MU3ZiJMCc+epv@DJij^oub*|;Px>~Kv#VW9BmJ`!V1qU#myU3# zs|E#F@jK*Y9EL$4Wa8gL;gv3dS>~P)+Ad|uLx)}=1IYyg_F_lXeGp#e<$F@F&;A0X zoh>2VSUh?@Wmg#3cX(MA?s}kEWI^wQ=h9Y16?s{;S~m~8GRlZ~1|*x%sWeMO;$;rv z&<~^-8`r0qbbMV_uJjFg6G5H8S;-?f-nh<`gLkGYA>RB4ygqP*o4G6`1FN<-um%on z%VX062=^~^htSU`u{?^Zf*KS19l*tIJ?bm;6gT@SIuRLY!=Urenu?TQus0pvCt z$#vEHiBK-G`bq7hc{0tghXDR6%=9)W572_}8-#BKOMPwhi^Hbsp(6XR6H2iJly{X5 z(_;PlUQ#l+4yCTlQ%eBJzc}H{2Z!=w-i&y6kMHIFc4FXejZuS%`O0+Dum%%X(biwj zKZU39>6VBR5i8@4r965WdDo9*+GBApn(jM$ORM%lkP^AQiBxW~P5^&hnX+Hex~s@0 z-@sL6LfMmGST3N z><{GkXz=r>yenRlgAsedVkw~pC;G?#$-NeLtjhT^-fac9R2XoSc;e^w<^|J{v6V5S zWi(e-joE|wtf<*u9UW1@iuOeV?B7Z~CG69;QFx$X7iD%J?mMdtNPsc33CaaHwv)hV z%CkalG0yY!YeQyYB1r8EJg!PWE>}YEBy(XJImw=R#L=8mitJ_X@A?(P<6Cp!db6G|Sg4jb%j^OQ}%07R?}p zmbw0u(--CsN&em*U-ZLl+W3{=3J0SVjT!It$I0>yPkRl_rAw@#>(N1q%o0pIQR9#w zuO#HFwVL39HI8b8rv^I3utnO*02ZO-ebZ-0hg|E4=Hx{T(Zl-Kf{5(Vz~j^mnI=%j z9GkAfz@p;Lj8Q7ioCxvWzI+)-xuAfrnX~h}73yF$CrGk_9WtF0mx-KVgMq@R=(Z|U zPFJSv=f|CvkKbRru?`4k7#U@3w=Z9?tN9KJ7+rOI7?+sO;{5CIz!v()7zM-$#FrMN z6{`{)93e&%Irz|LenX~De15KDqgI((8G)Js`)wuwNlyv-LxM~3@3=m?PdMdkynRne zkXv!2(3SEBQfcr5;Z8dw;%{`YGS1j%$>5|`g>7?X-JhPzf3CSZG2s!`cSoBN-Y-N^ zQ-fh}J~?)Ks%FcqudZGl5iHVwTlziTWniUqnP$h$!?4wIDk?|Vq%pW)3!<<2ojG!4 z#e*k`?N-nPo6ukL5k)SPB?degZV-CI?>&EloX^UAskk>vEqhEwFUa7`APt~Gmew9k z7s3qenX-2>d2;`!2(5OAG2-z*Ue(Zy)cCC-APJ_!iCE*KPP&lq%Su^Yr$!^)G^i28 zU5N)SJMh|FuTuA>{^lk;@=k(&WIKopyizgZkDQ4+l*;o7bm+?_aPEuD4WXgw8qJyr zRDX$?)+3C|Ztoxr+k!H1_zoqhj=$2{YNgk}E!);Bx3Bi)`}7y*qxA> ze>UoQcg_Z>q=0lIGyS9*7G59J$d)=trA|;9hKz}ap^Vrp? z91nL4?M&@^t!~l0eY)0&Xgm7KQo4gl%vBH~>5y-@Rr4WB0S@919~+c)JQX$Vu;R3O7QDSxmY_rwCL?r*|cAzT0XDOxH{>#_keN!??; zRPJ(=pElE2UY>)u&#bOREbks7@f3t*Na`1I6DW=uIYG?j7V!wO*2A(i4mLheTUZ4u zN(w4&YHM{2IY-rS?Mr6_>j}p83&U)LHJhg+F)GbJMtW#e%H*ldO#6 zV34I*i@csiiwOuGdS!gLOc7-=)C%3zS!O9l`%}$WHj+#m1zhy%#_n$QQnywC6i@xS za7G})ytPe*M0cr~ah?(H&q>ZyIByhHwE$v1I8H*D8CCy88j=T;A`9W~NI*Us+wyId zQeEQxvgd6lJ5Ca^j5%l}UQx$9QAz#Nl#OKOe`Wmex&XS`P!H=@ZEahXC*cAziOWfZ#;JK+91`FXE;IMh@r)ZMFuId!Hgg#D>sPCd z=(Z-b(fp=)fT07_q0HZQao4H62OP96NMBr6n^$~VW61icW`8O?ocEEQyhGnO+K6%% zQ)cB*eLLd9`4?g|QGhvhDqMSzbr{RLT*HHcK=2*T+{1!wNni_l6TG)nV~7)^QeLW zM^EAga<8FTbQ>VlC8FYv$eDz9s_KP5KQtEb z0_;q;FSvtu8F5|}p1+m{m?sWAG6eLDZCbES#gdRBTx~=BLv4P|bLJhkh4_E=XXx8k zDST26_*g%i{xbqg)4O=egVCUW=x9h|V5``)T-^nYH?d zv2ofvRNd%W)(K-r0PL0-BFx41U>HJxC9e7%S1Vr~=gu}VT*z9*GQtVxBKzIQ_USRT$fI z%*Bu?`(ZycT1oK9gU!RFwesmI_gK0oq?XH9@cXXfZu+|PS#h_W?#TfP@jh zlS}wYGpocH{y@a)fw4DbKpA-FFoghXRhlk#SOiE8_UiY6e#Ha`OpdT#M;!+9sPNrg z&-1BLDpwwN_eus2yHhjCT|T-_a9O5<2yJ+;VPvHsPcu!_^2*u7Ay>|M@`6uM5wCub zV3nav!TuldXu3aUsOzNJX?1}F&L#NR;hJ7MmjO)&1%#{a`F%^bKb8Mj-#6}wMx8dq zuA$%^`%mgz0(ekcc=c#0Lz47q0P5?Nvk3vdc#3!Z{o)KGJ^N=ec^@(ZAvZDNn~0x+ zyNH1w`2rZ9#ukn2A;T+-JDZ>wSWKH{#61*pWFl?0#Mj+yYSl?}Zh)77d38^VOShvs z#$wu7#xpL~w0tx^!5y7KzTmlPGS~kJFw5E!k120zkNHX=I2R)WBIY4XX3Q59V`azj z$RnD)fHGTP_+ zaLU_E^h!%ZCP5;B&fTD5iE-dzj4C2eyf>UfKCKP&Z&z&^L1Xu|2W%K#OCaJovrNS7 zggNzu75To>aLGlZ(>0I&AWwtR#vnPrMffe-L?%sLB9ZcN&iPqljVLayn9~k=F z_D0}us$AxUGDbd4wnhtLCuN?_=PtP3&EqFfFwN8)7}|&@R+dUXdKOvVpy}8V*k+%_ zM9RLz`NCW*ps?`RUY8DL!yB|pe4Gz)-zHQ)^4E4a5d!jdZObxw!(e8e zLjZU=e{jCjAROGtYa(G-z!zOK8t%3pLlC?)xRyUYIl$rG?Jm7YXuriFCWe+|cw`V0 zZqznFT+QOhr4|N0%dBqx3Mic;q(Os$Tnq;dA2An3^ zh5nG>Fhlp{gK136y#!Q70t`~Xg5^Oe!0TXjU!~QD9`dI7Dzn{+{uFPRy7)q&bc- zceL1L+K>(}_I2vtuZt~e4GQ;kZ9`sR!e<(Ok`y&R@rG+r-xPkWDV`VMQ<&C;~ z_?`mvU`Wf>R#D>sk%!DmF={u$3B4ufzPt!BR;0`!r>7qF!7?;Go8%Y3pPI9RsrLzLteAmKfiEcgY(>__V=eS_l2y6_^~ zMK;|>X=Nix7ITDrk5aO{Ayhe{NU>gPHk^>6d78Vu!Ua@pb^ZEz$<-Db^be& zqoOvY$|PGn6cfdo0@^S|OKwVX4`L>tz4FV+sMR{SGzHCc+mmU;>E(c;_$(&xjiaN|nbb5PX~}pgeSIg3OExj(3Fpmux_1(oq;JlSZm~h!&-m+e zU~A$}acpA-q?e0XY-Wjx(Myr%XWDN;tGJ-{e>xybjLvacmY<%!)HujITkWytD~rU+ z{QvujX%i1`@#3jZ1XezWogt;O5RPyQjrVo7FrmA=_y zi}{8CP51K1)cA5vK9R($aksKJbY{_8%$l&RN$o@HB-F??SPqVp^I8a%JT{NVh#Oen z8R*_>_W!)anNloGENZW#x*YVN{Df~rVMeofqfo?N!RfQQf_qwEbVh`JFSkr@xIW=a z)Mf*J+eOAtS4X`qlTR$6ZBhOy1&eQ%twFNLibNYhGYcsdov8XgJFR3e9~*L>W) zm4Stie4Y)n4BVUZxB1vF-EE)Y#-WR7Pk>@eKVDroHuB+wun$F9OGtki$NA()^_V^B zg`diiugYaejxdvQSC)OK4(0K>@9#%#WBzR@7~&Kyd-8^1>gIV z&r?!4Qd$=Yx^MW2fbAKW_aXt#xWc#!d^65QxSVk$JdUnm6Ta{1e=WiWEYABh1h8;m1;QzaB zm0uo7DH3?D-^yPAH4bWsu_6~1fKU7{bsbKPc2WuS+x&FF*vbE!DNM=p*|>tjq67&C zGe$}c7!223h_FSiq6;>5rDI5p*(g z0tQ}$p7*hk26?99e~-El2K564Ta|Pu2o?6j=~Oqji01wD+?%K^UNunkUFGK|vMPl5 zYzHE=r_SiN^}1+R!HtOi``!y~Eu^$@Q5=Lq`N3K45!C+#KF5J=ZzHloy(E5p0kLK_nol_M)z&ng|$8}kx4V5-}p=|MNmAj#b zT?T^BvU~$tzgkgO#MfP-+EwH!hcMW|*-CcQy6LJKs;(i(8n~^K!Gg8Gi~ox^HSTmk zSZv%4?47dnH_}+6Rv%_*{D_keEo{TsQqASj@Zd578zqD!g*Epg?f@@;VPr_4Pu~i5 zAsW{m(89&oRa=Uh6vD#Fh+;h~di($-o72ScdBh9^FLCM!9nS?`YJMm1T5k%(IZbrz zOwlyKtwaor-KV+3L`oER#S}K%q-o8i0gI)0y1LROa01k@RH?b}o6bB)7ZcOfx zHBl-}L?&J|07UeMzCM~y%0AhhvTP8o#V2HDswVlS>5iCVT(|w0qYduHjbkRofyEp1 zP~*$J{9Gi8(D1zaEp@HQi5Zw0*S_(m%rfXdrxV(26BRowXe9D*me|k$ zSM$QEX(7Gg+cI?<1$2OqY`$UYyRN~;iFZ;fHjc6^=MF9uMXzDMvVNFpx#$ZP)&eoF%nMp*X&E&9ox&r@|O zxzMYrB;MQtc?pCaOSx|O>aQHB2iv)0$^qA0@sxl}ic8bRC~ppYdv`qm@MAxfd3|_n zDBzkMhmEWg)~B)yO45V~s6oeR&AP@{(W>79;^xq~vdu?n-eNXx(d8js@@+DM`%v|* zSv^r$B@E8q?xxrT`n+~I5xVq0eOtDXP&F4Jf*H$GFmG7*ytM2+2bRjVpehbMYbkPb zeylYOHJFf>A8b&*Y@>l?YO}*KD4p|XjsLE1wK_xJZkj8mTj!*f8{*i=@1zWofPb$? z3TA6L1C#9_gR0I5{^Kw$;A$dj+rPBDPuXNUhJoKPfn02AI|r9`)SB~R)9Awt%;}bp z@qm{^Y8A&}K;l?R{d#1hlh4w$gzU90f{t~P4 z4NpVIH8T1Xv2e(@I5~`<%+x~RN&QtDHCL@wpG!AW*u+%3MbR(Y3XY8dJ_odW8==%S zn%o6ba06=szE`)mJ*xw045-^&f42V%IMcY|gnj>R1PWp_sGPJr?e5WH_4=S)x0p@$ z6xPmve7&l|K$Cny{Y zABV=F|0;-vzSQwiJ8AY|E87I2+H=zV{1ovi7M-zoqi~l7e)yeylAMzV(&XXo7a;b&*>G;b^y(FIkH&_p( zp?Q{2IP>R8uT;JM0v#~(vwplTqFVyKx8b9u@h(}@h#5(S9L`ry#=^i3 zniVH5)VwI469iS%&P}ld(wsQ~QyT`@tz?B0*!uWEESwWV)gPvb9%>@PL;!=O{nTWp zZo7C>%$Xz-(U!){>ix1_ZUgQT32&mV(I$F{*ExCfE=%FP{`E*Jzeq2jn6uaXLpBJ{yFXQ(R8$05I#)?uaxb@930FG0+j-f zC3S6}BU{oO=?vj>YOB?EQDM!#w7U_j2wo$xI!%%|4vsix*?8SR35L(kQ)|B>R_a2bhJ5Uw-`)VPKdd%>FaGrCcP(<{73||>|(SZ_xF}?J@H){ zg-yjWBfXb4ZqhP%!Icz)d?}DB+g}qrqw<`@z*9mwWE;7qf%}Xat4$p(oi$qQ|E%$4}`AIy5=8e*3aUnnd$>fs8kEjT_!G~J35fH-^5 zMVLhjSgnH!9585ka7V38UFDqlXVJnq*+i}fsjxoz7}MZ57<7zHY|_2r9L#l0U!5Or zZJ@eC;e;w|RsQAyEe}y#GNc}&+sX^$)m&DKp?(XPykf{)TCNNjE$ns0Dw2Bdu)$?I ziE?tasJgck7JC%O2q<&qQWj^o?C+m~t|UBQJc+p%z`ho%q@50JTLV$W=J=(cF%*zJ z>cyJAR;o!-n1=(oroHni1K+wp)mlP-VlNioO+d|%t8$Q7n@~F}>^Toi>}Bu))GNQm zKCJQrtRGVZbEo`6fTjsfERt29F^&5+`i|+gbL;HucxChEx5clpVNTBktw(lp&b*V2 z!;L%m;)o2IKaKiHKb#ti!?j7dysoe4C9Y&LIQI)^DAJ*yAA6<6R>qF}$<%9;$|l1b z%pjvT0~E(xtMGns&yC|%PW%d}(P0KxYXvOwvSx@4jYH~xy zUIF_>RsBR*6qR-+!GKMjlyJ7~@FtST+6AhqwrpHv;BS2VF|V3PD6&l9A*7R0@P({u zZh2|QJL?J!uzi}LU)a$KzuRZU^y43;BTlw^3Y&&B>3^a%H{SG9Op@0 zEep2|d_;HXl{AQzu<6lkYB7LFLB zoiS&<94D5Y08;a1IX?>OOf9lIxhz!>5(_oQSPw8e`X#cW&2M~eW0k1M%V&V>l*dX4 zEfX~8z9bJEQx#W#k@qY39WVb_>zW5YB=UbwrttU3fNrq}cw2 z;Uraw+;cO&;2*^kXutYmp6}~rm7`GE0n`G?NR2Wwn{(y=V&vOSm#uVrl#k6>=UmEO zASsE!;X57n4`%!Jy0_59(p$gz%UPKwScI48U1;?5ae15A@yGH??YolG2c{%go*j8k z%OCK2g+NLVq|)~Uo`#-1eI-C-=tNYaB zWRCP=abrC4WAWq{~%$EazBzy#w}unFZRc? z#nT(B-m9}aU0lSe#gXKPD9?%Ud#4nu{V^m$jn1%E>ECLR3k2Cmhyg8A?XYjOe`OzZ zZ$J}K@HKDH{~iw=bi`-v&rkIAY;CTbZtM9U=6W@cG%Su1z_SW1q;bcVS4f`tuTWnD zbK7=qKK6p$y&NYy@$Z6JjW*ac@@J*j)M4VMUPCf_PJ-xK$jn?es@D@b#^S?5zD3kM4ddI z)8lh=d}6_***Di(RE|duRUXx)y9Pw{p`fXo@<_Vu+=+0A#w*q3p*Rp5!a0!y<77s= z4E^_oUWyrKt;7<}gzq_E$K5FSg!Fe&YDdxpxI4E|pOgKrOF8 za=>MA?GqK!?!1;7&(3d|0XG&2vt>7tAUcjk{YNMc%2MpJTlLXG~x@? zJs1KODN~#=f-<5no6MCs*!*{8PEr9`#CS|-BT=>>jjAvm^VAEmFG%p{hdGcISZq-E zo2wk(*MEes-+x^u@BZ2`$<&hIu<9lwqxt{^KK_*Wp@h2LU0Dm*`ERNZsg)%wY4DXtvsXnz2k#xESC7&k>4)e)I)xNfa06&0b&Qg&;-lfDbw zkTz$F2KNPKmM}kXnSUnz(5a1_G))#f_S4k5zz6mMlsl)10ZAd=N~4P{kOa7#9`wNY zfxk1>Zo0}r-mU3npZ(z2clyuftCeTM&bmg}?iVtZeW#wp{8$&Mg3qXi69g<4skV<9 z3C6~#(XrJg?W1{?ypW+Ar&M7}Zijcz#-sZLdem`)fDyQ~*08+>;{ytDJ<@=_U8ow& zF>2g0w-_$8f7#kd)GwyAehqa92s0b%DMmo-q zgm%7+X9YEk;>|vMuk$RgB6TrXNkH1(ERU0igPN-N?7_dF=51|We_3&p)##aw$@6KW zR-;*3*k(1^v!%O7X6tW0dXHQ_0#AuZ5cv#U>9yxk1Acc^C-@Ss@7s`Qn_e#7j9Fr#LP)v|)&xw>QFv<{8}#Tl84YB||+TBv0w0!Idf z!=#DlK(#_-Mx>VigcIH?ZZOFk(6w4LUZ&5O31R zn$9}G0Xbtk+{k+CNMq$B^tdr&R`f@g>$;8n`3PsZ=o)sWLeLZcwlF45?rPnJjF{Q^W!5~t!ugqgV@dg82e^15G{8p~>EJmt^#HI12X1M*f!G3k2qg(ku6 z$pEB9J88QMiLaoMr6mM4mq??Mu2L&fEkr$&gA+ClA>lmyinee64%r7J~6wjOa~ z|G`p~!r33#XgfN;>@ZodLCxd~{ju-XJoLU#u+c(;uU|c!nFog>%8+^iYMVNoui;5- z9Hm_wdJe`B;ybII-VV@d;vY7Z(7ri`g!son+AOuwZ4lTkuoqcDOx-LLW8~OpL!djl zuJkE~G7YH^BqM6XA2>k|FRpq?3Rd3wKwM0=3gVKv-VG8a_m{-O$S`3+@^TUp+ley1 zS!IgQ6kgb8-^g*H=3o8lS74s64W_pw>`@E`9b}s(q)WYRAtf^NR!MudFXavGsyRy= zazkoiFA2>KrQSEVPz4|IJM>va}6c3s?0V9 z)xX@V5%%AP1@nJ0_S}Lmy7`h*T;*{&xfbN`{BrJcpXf1;uqa-|&>4O_@U^!oTQyiC z;n@IIv+kR=WaiTGbhwuGq*PZGokDpigS%A8TYX_~Wzwf>&?XDg&%pyhl$ol`^`?yh z2eJCnvh*D!A+5_-n!d`6s-rhb&H2d>#Oy zEKXIB*cVZ}B%#g!1xeRIBV5I1@8+dXaoOFkW6BLA3e}yR;ZLLw7@X5%QnX;T7PHRr z^-MI{P?t@mh^%julGfR55^x=OJY+S6t?Uxr7VCcb_liy$$?pm4uNwL@??}7qpral3 zH1Uu`Msr@^Dk>$Iuma!oEne{H4^maLRYfo^VuH7=+^*3Y>M`wvcV3lBx^*IQzw2sl zL7#nmzvnvwnhsT}%XN$*&rwt2>mj&Oy7vX_*RR0dvq~RM0&GX2@KNN6^KDMc_C$9+ z^JT+j6}0>!L!ATWb{09R$YlkMJ8D*Omt#z2EWWXP56H(qZ~UC6WGMuan+=S-5{UQy zDF>+a!!6vJ&dR7!3{m=xfKshWYPq8J8JkA*qzSAK|z69Ku3-}I-g4T4#pvfCJ< zD{V~&tzEpz7v@6r!v-BN5Ce_65_Arf(O5{tPs#QzCyOdz;F-!@n4<#mi5Z zn`51r6Vec#GEPLpIEUJI9YZr&d@0r1woz%D>+%Izp?8ZCxtyPT526{v#IIHclm3Px zX%*)Sbh!2lz&%f(e6o>CvX)$I;fGx60JH$ym~3{&!`Mz&&#~@u(+DSv1PF4>8C&yt zD=OwmwPV*hwIX-2#FoucP|9-zob}*T2(t(IyO?nbZn{hfLGVX^*8_?3wbu3K0A(n> ztU=Z7Ep9R9HgggfmFg9y(l}rGY-StLHK?GPdct4tzk)O+W_8q4ynA&2a}{*{E$xm% z{I^>G;~BzaeLHZ~$nJo7+98=kkOkDk2cPb|AP^3PqRWUu4c{>z4Mv#H9+Z?mZS3*S`WH7|{upU{0$#3YF zrDWCq;@HRz?6HKFTzlc#(pcGV)P`f&_wl8z!vAfTRjE#FY)Bge^4Y>kGGfvT#j7o) zi|*&@KYaun=ay&{$Yg&4HL&IywQ#NiI5Uq+(*$AJQ%16}NBKi45*wFpv#Efq>suHJ-fL}qbV@WPRAPoTGmb#eWX(tU=mZ*qy4ES=0#*5nYID0d_*-7AL^9W&tj(!O0 zDpiZ|!Ck$iA@j&vFVeRNr!%o4aU$N%uT1;k(3|={9IrS6cS2WPn~~U#8IJ*?^F)A@ zTink-OH;;`fp43dy&o(GB?pOZzNAkg-E_)4ADVG?-0V}D3KV{isAVl$LC{e%iEE~wxVz~ODK*99)o+zzF_2biP1E(_~PN$h6 z=TF4&EV1&1OB-6jV|eIr3LZ;_kw{Kp6GT)w2%6r2grn^yC9%BUES;Qkxd0$gGcBp& zBX^vmP$$is=++g!khIKm`bSy^v=h-e@!|?0`We#gb6;l%aMhi19UTX703^&? zEv+Pma)wG-dt2v2u&Us0_RKG31KD4`mZKM2e((*b0@0K**=8Ydnh49>BRDsON`m2l z)O*Z*z~=wS1!dQn`(1*G{c$m$lt)$BHgM46`mnUfJQh1=X*J9y3p{0~IOgB8NY~Zz zg0Vuh;)6Efem?7H-I!)CPslsWsk#GT`JHa_=ezRZ_cD-jo7_qd>+mt2%Kv36cJ*-J z<$j`$i3|;O2QoEJvu62|9yp6?7@5F8*GOHxA|{-HJprn{cpm=}XECc9S2h$v53-J> z%m3W)XP-}El|I4c%;GbU zM)`c79y>GP*ou4FXQSLC$7n*v7uoRrkVXDkg?5>hZ)xPacmz&7W>)IpTo$B-FHSVv z{CPMELx?KSnXgAw&zpQbcw4&S!W|H4xrihPAB#*^Oen}hDR$jj7(W`O5|*ZQix>lt zK@U68dHOyk?Xu0ra;@AVpoF0QQ&RenjIlZM3AH7+={*SQOn4Bt2A^ z*ErkXKucTQtLk%i7^OJhVl+qq_rh*`YD%Z=qNM5|X?d&Fyg^ZFBw zHwdFHoskc3wbd76EAzaCYHT&d>+N=>I|tugC5CbJDc|Td8w9Y9pQL*1*A;3n14KEv zd+19HnULAGRtsuSNMe6L6zjqrBhk8MKErvy0I(gc6j z9d36h0fQM3_CnxiBEi(y@J$GOyWDMR#kMl1o=P02daf!)rvIBxG0xkwH`?GX2{hbC z=P=CyDXdbcQOsAVog}C9M95}D<5}&ukAh^m31{Y2m$5IrYY~3V*LqW(hfIOH1VhT43>u$tLo)cf#F;l#8p z4ZiD9ZAwCfn6$iYPu-ApC+%yVhkKa?s`gDQC;=HOlHhoDpQ?Goh@?#FDtU5A9vfqy zfba~{oXH2g0GJz*P&)*5v~#vm0>6l`Lzn9!OI}5yc;pW~eXh4O=ZDsDPRljtD8}o$ z5|V;46)-*-^WZMCDSA{~*%G1ERrlfuImTw9u`jK(_9+q7i(AV8i$-X-9B)F13P_^3 zFq*IeG7zD%m}sbM!mY#CaH(+=p*3PyjtL&v)-)9yEu^-EYmiEGgR}QlaqTGyJ*mdm z3(WpHJ1pVOBfyGj^rYj>W!dbuQAaCK7>cC}^U8!mjyZcN4e#&CfGQiIv4O!|e@m=gGC7cXf`dg2c+i!%7 zKFEUuSRN1m{vPRB7|_`f=|>9;dFR-)7Fe=KOB|Q*>rxe`x07jjBSrdz*-Bau^hPRX z`uODDo6!Q$#X0TL^dOab1(9yWmk)3J4+?hmc%SlBAI1u-#R$*ibXHvktNd&wG4N|t zo?Mh61%yT{nZ8KZ;A%4Mb}VLPSS4nqK~;fP{@<8#oJVfzu`Xe%sSiJ!Z#ev7Pv#|Z z46po5jqXw4h#P@`EtNQ{*>m_Lwk57ATYxE{psy*gE7NY)qobbuMK&G2vYSE+l;g5u4L(5hUA0%O&hI(A;;QvE^;#;SFVL6(bNVr^vsW@;p z+n=JhF3~azBj3vG;WT~MpJO<2^PTz+j%Q=Y94@$UH8OnRri1ZlE_s6kVm-6JX2r~6 zGlDCf9ikJ!fIPKY-&V>1w#*7W2<+vXV~N+Y(@*Wz1?n^lQ{`-u15B263mw<8a<|tm zX8k#2;WJ_iVaX@G2lqfjqo5(iY*f|&@DPypV~}+RuRKMcQ+MFQZz_h}#eKk#=kgT{ zE9igJ{Nb}l0s`jXQkrNvm-7rts6h_0ixk07DI)e1j2RBSJ{v;Q%~Nk;$;z|v{)r}Y zDe)aH_>9ex6(G);5`_}&Qd7XMamvSvWjAwzNz9#Tet8r^@<$E&c<9&1(pNpKJ~b@( ziQQ9F$cdWhr_x{1otLT}?R*Fc9s+tXCPJ=~Cs7;b1>wg9bXQ&qWUjqXgXPtS=fShP zyuCN&Be6~5`z;2@{d?I8Q+y_4rm+$Z!27VKIpli_pF5x2daga74s))%0Nf?5sTDEL zYd+?5b?2347^T`-6RMf#5$x7+x+ znS;^DK;MxKxri#f^>4b(tX}W%mf2^J*aIts7inGr`Nzt$q|M`xil>EW-#k*2jw76u zNWs8BYB3O#{jQ*eM01HVNx4NL2P*TY)73xYo#DiNVKYM}hp}1U0guY6g#?o5Q&68G Q69*e3Dxu_f8Vq0n07VUXssI20 diff --git a/examples/imgs/bear.jpg b/examples/imgs/bear.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b9fa8b230973ba5c58692feb46f7a91e81db2816 GIT binary patch literal 49756 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 literal 0 HcmV?d00001 diff --git a/fooocusapi/api.py b/fooocusapi/api.py index 854dd75..eb83570 100644 --- a/fooocusapi/api.py +++ b/fooocusapi/api.py @@ -61,10 +61,10 @@ def call_worker(req: Text2ImgRequest, accept: str): task_type = TaskType.text_2_img if isinstance(req, ImgUpscaleOrVaryRequest) or isinstance(req, ImgUpscaleOrVaryRequestJson): task_type = TaskType.img_uov - elif isinstance(req, ImgInpaintOrOutpaintRequest) or isinstance(req, ImgInpaintOrOutpaintRequestJson): - task_type = TaskType.img_inpaint_outpaint elif isinstance(req, ImgPromptRequest) or isinstance(req, ImgPromptRequestJson): task_type = TaskType.img_prompt + elif isinstance(req, ImgInpaintOrOutpaintRequest) or isinstance(req, ImgInpaintOrOutpaintRequestJson): + task_type = TaskType.img_inpaint_outpaint params = req_to_params(req) queue_task = task_queue.add_task( @@ -215,6 +215,11 @@ def img_prompt(req: ImgPromptRequestJson, req.image_number = 1 else: streaming_output = False + + if req.input_image is not None: + req.input_image = base64_to_stream(req.input_image) + if req.input_mask is not None: + req.input_mask = base64_to_stream(req.input_mask) default_image_promt = ImagePrompt(cn_img=None) image_prompts_files: List[ImagePrompt] = [] diff --git a/fooocusapi/api_utils.py b/fooocusapi/api_utils.py index 35f3095..2768d20 100644 --- a/fooocusapi/api_utils.py +++ b/fooocusapi/api_utils.py @@ -79,6 +79,10 @@ def req_to_params(req: Text2ImgRequest) -> ImageGenerationParams: image_prompts = [] if isinstance(req, ImgPromptRequest) or isinstance(req, ImgPromptRequestJson): + # Auto set mixing_image_prompt_and_inpaint to True + if len(req.image_prompts) > 0 and req.input_image is not None and req.advanced_params is not None: + req.advanced_params.mixing_image_prompt_and_inpaint = True + for img_prompt in req.image_prompts: if img_prompt.cn_img is not None: cn_img = read_input_image(img_prompt.cn_img) diff --git a/fooocusapi/models.py b/fooocusapi/models.py index 146ba65..ad0cb32 100644 --- a/fooocusapi/models.py +++ b/fooocusapi/models.py @@ -195,10 +195,10 @@ def as_form(cls, input_image: UploadFile = Form(description="Init image for inpa outpaint_selections: List[str] = Form( [], description="Outpaint expansion selections, literal 'Left', 'Right', 'Top', 'Bottom' seperated by comma"), - outpaint_distance_left: int = Form(default=0, description="Set outpaint left distance, 0 for default"), - outpaint_distance_right: int = Form(default=0, description="Set outpaint right distance, 0 for default"), - outpaint_distance_top: int = Form(default=0, description="Set outpaint top distance, 0 for default"), - outpaint_distance_bottom: int = Form(default=0, description="Set outpaint bottom distance, 0 for default"), + outpaint_distance_left: int = Form(default=0, description="Set outpaint left distance, -1 for default"), + outpaint_distance_right: int = Form(default=0, description="Set outpaint right distance, -1 for default"), + outpaint_distance_top: int = Form(default=0, description="Set outpaint top distance, -1 for default"), + outpaint_distance_bottom: int = Form(default=0, description="Set outpaint bottom distance, -1 for default"), prompt: str = Form(''), negative_prompt: str = Form(default_prompt_negative), style_selections: List[str] = Form(defualt_styles, description="Fooocus style selections, seperated by comma"), @@ -257,7 +257,7 @@ def as_form(cls, input_image: UploadFile = Form(description="Init image for inpa errs = ve.errors() raise RequestValidationError(errors=[errs]) - return cls(input_image=input_image, input_mask=input_mask, inpaint_additional_prompt=inpaint_additional_prompt,outpaint_selections=outpaint_selections_arr, + return cls(input_image=input_image, input_mask=input_mask, inpaint_additional_prompt=inpaint_additional_prompt, outpaint_selections=outpaint_selections_arr, outpaint_distance_left=outpaint_distance_left, outpaint_distance_right=outpaint_distance_right, outpaint_distance_top=outpaint_distance_top, outpaint_distance_bottom=outpaint_distance_bottom, prompt=prompt, negative_prompt=negative_prompt, style_selections=style_selection_arr, performance_selection=performance_selection, aspect_ratios_selection=aspect_ratios_selection, @@ -266,11 +266,19 @@ def as_form(cls, input_image: UploadFile = Form(description="Init image for inpa loras=loras_model, advanced_params=advanced_params_obj, require_base64=require_base64, async_process=async_process) -class ImgPromptRequest(Text2ImgRequest): +class ImgPromptRequest(ImgInpaintOrOutpaintRequest): image_prompts: List[ImagePrompt] @classmethod - def as_form(cls, cn_img1: UploadFile = Form(File(None), description="Input image for image prompt"), + def as_form(cls, input_image: UploadFile = Form(Field(None), description="Init image for inpaint or outpaint"), + input_mask: UploadFile = Form(File(None), description="Inpaint or outpaint mask"), + inpaint_additional_prompt: str | None = Form(None, description="Describe what you want to inpaint"), + outpaint_selections: List[str] = Form([], description="Outpaint expansion selections, literal 'Left', 'Right', 'Top', 'Bottom' seperated by comma"), + outpaint_distance_left: int = Form(default=0, description="Set outpaint left distance, 0 for default"), + outpaint_distance_right: int = Form(default=0, description="Set outpaint right distance, 0 for default"), + outpaint_distance_top: int = Form(default=0, description="Set outpaint top distance, 0 for default"), + outpaint_distance_bottom: int = Form(default=0, description="Set outpaint bottom distance, 0 for default"), + cn_img1: UploadFile = Form(File(None), description="Input image for image prompt"), cn_stop1: float | None = Form( default=None, ge=0, le=1, description="Stop at for image prompt, None for default value"), cn_weight1: float | None = Form( @@ -320,6 +328,10 @@ def as_form(cls, cn_img1: UploadFile = Form(File(None), description="Input image require_base64: bool = Form(default=False, description="Return base64 data of generated image"), async_process: bool = Form(default=False, description="Set to true will run async and return job info for retrieve generataion result later"), ): + if isinstance(input_image, File): + input_image = None + if isinstance(input_mask, File): + input_mask = None if isinstance(cn_img1, File): cn_img1 = None if isinstance(cn_img2, File): @@ -329,6 +341,18 @@ def as_form(cls, cn_img1: UploadFile = Form(File(None), description="Input image if isinstance(cn_img4, File): cn_img4 = None + outpaint_selections_arr: List[OutpaintExpansion] = [] + for part in outpaint_selections: + if len(part) > 0: + for s in part.split(','): + try: + expansion = OutpaintExpansion(s) + outpaint_selections_arr.append(expansion) + except ValueError as ve: + err = InitErrorDetails(type='enum', loc=['outpaint_selections'], input=outpaint_selections, ctx={ + 'expected': "Literal 'Left', 'Right', 'Top', 'Bottom' seperated by comma"}) + raise RequestValidationError(errors=[err]) + image_prompts: List[ImagePrompt] = [] image_prompt_config = [(cn_img1, cn_stop1, cn_weight1, cn_type1), (cn_img2, cn_stop2, cn_weight2, cn_type2), (cn_img3, cn_stop3, cn_weight3, cn_type3), (cn_img4, cn_stop4, cn_weight4, cn_type4)] @@ -360,7 +384,9 @@ def as_form(cls, cn_img1: UploadFile = Form(File(None), description="Input image errs = ve.errors() raise RequestValidationError(errors=[errs]) - return cls(image_prompts=image_prompts, prompt=prompt, negative_prompt=negative_prompt, style_selections=style_selection_arr, + return cls(input_image=input_image, input_mask=input_mask, inpaint_additional_prompt=inpaint_additional_prompt, outpaint_selections=outpaint_selections_arr, + outpaint_distance_left=outpaint_distance_left, outpaint_distance_right=outpaint_distance_right, outpaint_distance_top=outpaint_distance_top, outpaint_distance_bottom=outpaint_distance_bottom, + image_prompts=image_prompts, prompt=prompt, negative_prompt=negative_prompt, style_selections=style_selection_arr, performance_selection=performance_selection, aspect_ratios_selection=aspect_ratios_selection, image_number=image_number, image_seed=image_seed, sharpness=sharpness, guidance_scale=guidance_scale, base_model_name=base_model_name, refiner_model_name=refiner_model_name, refiner_switch=refiner_switch, diff --git a/fooocusapi/models_v2.py b/fooocusapi/models_v2.py index 2bd475e..2382485 100644 --- a/fooocusapi/models_v2.py +++ b/fooocusapi/models_v2.py @@ -25,5 +25,6 @@ class ImagePromptJson(BaseModel): cn_type: ControlNetType = Field(default=ControlNetType.cn_ip, description="ControlNet type for image prompt") -class ImgPromptRequestJson(Text2ImgRequest): +class ImgPromptRequestJson(ImgInpaintOrOutpaintRequestJson): + input_image: str | None = Field(None, description="Init image for inpaint or outpaint as base64") image_prompts: List[ImagePromptJson | ImagePrompt] diff --git a/fooocusapi/parameters.py b/fooocusapi/parameters.py index 67e90e5..da66654 100644 --- a/fooocusapi/parameters.py +++ b/fooocusapi/parameters.py @@ -159,6 +159,10 @@ def __init__(self, prompt: str, inpaint_strength = 1.0 inpaint_respective_field = 0.618 + # Auto set mixing_image_prompt_and_inpaint to True + if len(self.image_prompts) > 0 and inpaint_input_image is not None: + mixing_image_prompt_and_inpaint = True + self.advanced_params = [ disable_preview, adm_scaler_positive, adm_scaler_negative, adm_scaler_end, adaptive_cfg, sampler_name, \ scheduler_name, generate_image_grid, overwrite_step, overwrite_switch, overwrite_width, overwrite_height, \ diff --git a/fooocusapi/worker.py b/fooocusapi/worker.py index a2930f0..f7564c9 100644 --- a/fooocusapi/worker.py +++ b/fooocusapi/worker.py @@ -121,7 +121,7 @@ def yield_result(_, imgs, tasks): refiner_switch = params.refiner_switch loras = params.loras input_image_checkbox = params.uov_input_image is not None or params.inpaint_input_image is not None or len(params.image_prompts) > 0 - current_tab = 'uov' if params.uov_method != flags.disabled else 'inpaint' if params.inpaint_input_image is not None else 'ip' if len(params.image_prompts) > 0 else None + current_tab = 'uov' if params.uov_method != flags.disabled else 'ip' if len(params.image_prompts) > 0 else 'inpaint' if params.inpaint_input_image is not None else None uov_method = params.uov_method upscale_value = params.upscale_value uov_input_image = params.uov_input_image