salso ultimaxxl commited on
Commit
5226627
·
verified ·
1 Parent(s): 1b14f71

Add examples modes (#4)

Browse files

- Update app.py (4d1b1fe30d42871efcea779217e874a8348a3209)
- Run Black formatter (7f7588e48cea7178916d11b3f3634b948c3dcf60)
- Move examples dictionary to examples_db (0c6a3710cbbdf3fddb60cb030ddc9da71919f7ad)
- Replace Dataset by Examples (7c276e82d1907d65f3b154d65a49b16ec2a787ed)
- Add images to lfs (11fa7472b5fc42c51133bfaaa8ff90aa8b4ec5f3)
- Add background images examples (a90338fa31dbb02dbe498c9e16e52846579d779a)
- comment out canny, depth and deblur examples (ea4c9b35107d65bcdbc47552a8fffb9a9e237346)
- Add Subject Generation images (7adbc62c3965e7ccf9c17f80e0ebf3352a57d20f)
- Update subject generation examples (7266d6367b2f8c20adeda111c53fdb9e6ad51b6c)
- add conditional to display examples (ae4669bccf7b0534deb37b8ea39e78677006c659)
- delete example (166b0767dd98008f82fdcc5a099e556c23bc3f28)
- Reorganize tabs (61480b4ce9e6141da5c89f6871cb441327dd9552)
- Step slider default to 10 (55244f639dc92b5ae59a8c40edceb634851644d3)


Co-authored-by: fmarcano <[email protected]>

.gitattributes CHANGED
@@ -33,3 +33,6 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ *.png filter=lfs diff=lfs merge=lfs -text
37
+ *.jpg filter=lfs diff=lfs merge=lfs -text
38
+ *.webp filter=lfs diff=lfs merge=lfs -text
app.py CHANGED
@@ -6,24 +6,20 @@ import requests
6
  import gradio as gr
7
  from PIL import Image
8
 
 
 
9
  # Read Baseten configuration from environment variables.
10
  BTEN_API_KEY = os.getenv("API_KEY")
11
  URL = os.getenv("URL")
12
 
 
13
  def image_to_base64(image: Image.Image) -> str:
14
- """Convert a PIL image to a base64-encoded PNG string."""
15
  with io.BytesIO() as buffer:
16
  image.save(buffer, format="PNG")
17
  return base64.b64encode(buffer.getvalue()).decode("utf-8")
18
 
19
 
20
  def ensure_image(img) -> Image.Image:
21
- """
22
- Ensure the input is a PIL Image.
23
- If it's already a PIL Image, return it.
24
- If it's a string (file path), open it.
25
- If it's a dict with a "name" key, open the file at that path.
26
- """
27
  if isinstance(img, Image.Image):
28
  return img
29
  elif isinstance(img, str):
@@ -44,9 +40,6 @@ def call_baseten_generate(
44
  lora_name: str,
45
  remove_bg: bool,
46
  ) -> Image.Image | None:
47
- """
48
- Call the Baseten /predict endpoint with provided parameters and return the generated image.
49
- """
50
  image = ensure_image(image)
51
  b64_image = image_to_base64(image)
52
  payload = {
@@ -59,14 +52,10 @@ def call_baseten_generate(
59
  "lora_name": lora_name,
60
  "bgrm": remove_bg,
61
  }
62
- if not BTEN_API_KEY:
63
- headers = {"Authorization": f"Api-Key {os.getenv('API_KEY')}"}
64
- else:
65
- headers = {"Authorization": f"Api-Key {BTEN_API_KEY}"}
66
  try:
67
  if not URL:
68
  raise ValueError("The URL environment variable is not set.")
69
-
70
  response = requests.post(URL, headers=headers, json=payload)
71
  if response.status_code == 200:
72
  data = response.json()
@@ -83,7 +72,7 @@ def call_baseten_generate(
83
  return None
84
 
85
 
86
- # Mode defaults for each tab.
87
 
88
  Mode = TypedDict(
89
  "Mode",
@@ -99,40 +88,22 @@ Mode = TypedDict(
99
  )
100
 
101
  MODE_DEFAULTS: dict[str, Mode] = {
102
- "Subject Generation": {
103
- "model": "subject_99000_512",
104
- "prompt": "A detailed portrait with soft lighting",
105
- "default_strength": 1.2,
106
- "default_height": 512,
107
- "default_width": 512,
108
- "models": [
109
- "zendsd_512_146000",
110
- "subject_99000_512",
111
- # "zen_pers_11000",
112
- "zen_26000_512",
113
- ],
114
- "remove_bg": True,
115
- },
116
  "Background Generation": {
117
  "model": "bg_canny_58000_1024",
118
  "prompt": "A vibrant background with dynamic lighting and textures",
119
  "default_strength": 1.2,
120
  "default_height": 1024,
121
  "default_width": 1024,
122
- "models": [
123
- "bgwlight_15000_1024",
124
- # "rmgb_12000_1024",
125
- "bg_canny_58000_1024",
126
- # "gen_back_3000_1024",
127
- "gen_back_7000_1024",
128
- # "gen_bckgnd_18000_512",
129
- # "gen_bckgnd_18000_512",
130
- # "loose_25000_512",
131
- # "looser_23000_1024",
132
- # "looser_bg_gen_21000_1280",
133
- # "old_looser_46000_1024",
134
- # "relight_bg_gen_31000_1024",
135
- ],
136
  "remove_bg": True,
137
  },
138
  "Canny": {
@@ -150,9 +121,7 @@ MODE_DEFAULTS: dict[str, Mode] = {
150
  "default_strength": 1.2,
151
  "default_height": 1024,
152
  "default_width": 1024,
153
- "models": [
154
- "depth_9800_1024",
155
- ],
156
  "remove_bg": True,
157
  },
158
  "Deblurring": {
@@ -161,63 +130,42 @@ MODE_DEFAULTS: dict[str, Mode] = {
161
  "default_strength": 1.2,
162
  "default_height": 1024,
163
  "default_width": 1024,
164
- "models": ["deblurr_1024_10000"], # "slight_deblurr_18000",
165
  "remove_bg": False,
166
  },
167
  }
168
 
 
 
 
 
 
 
169
 
170
  header = """
171
  <h1>🌍 ZenCtrl / FLUX</h1>
172
  <div align="center" style="line-height: 1;">
173
- <a href="https://github.com/FotographerAI/ZenCtrl/tree/main" target="_blank" style="margin: 2px;" name="github_repo_link"><img src="https://img.shields.io/badge/GitHub-Repo-181717.svg" alt="GitHub Repo" style="display: inline-block; vertical-align: middle;"></a>
174
- <a href="https://huggingface.co/spaces/fotographerai/ZenCtrl" target="_blank" name="huggingface_space_link"><img src="https://img.shields.io/badge/🤗_HuggingFace-Space-ffbd45.svg" alt="HuggingFace Space" style="display: inline-block; vertical-align: middle;"></a>
175
- <a href="https://discord.com/invite/b9RuYQ3F8k" target="_blank" style="margin: 2px;" name="discord_link"><img src="https://img.shields.io/badge/Discord-Join-7289da.svg?logo=discord" alt="Discord" style="display: inline-block; vertical-align: middle;"></a>
176
- <a href="https://fotographer.ai/" target="_blank" style="margin: 2px;" name="lp_link"><img src="https://img.shields.io/badge/Website-Landing_Page-blue" alt="LP" style="display: inline-block; vertical-align: middle;"></a>
177
- <a href="https://x.com/FotographerAI" target="_blank" style="margin: 2px;" name="twitter_link"><img src="https://img.shields.io/twitter/follow/FotographerAI?style=social" alt="X" style="display: inline-block; vertical-align: middle;"></a>
178
  </div>
179
  """
180
 
181
- defaults = MODE_DEFAULTS["Subject Generation"]
182
-
183
-
184
  with gr.Blocks(title="🌍 ZenCtrl") as demo:
185
  gr.HTML(header)
186
- gr.Markdown(
187
- """
188
- # ZenCtrl Demo
189
- [WIP] One Agent to Generate multi-view, diverse-scene, and task-specific high-resolution images from a single subject image—without fine-tuning.
190
- We are first releasing some of the task specific weights and will release the codes soon.
191
- The goal is to unify all of the visual content generation tasks with a single LLM...
192
-
193
- **Modes:**
194
- - **Subject Generation:** Focuses on generating detailed subject portraits.
195
- - **Background Generation:** Creates dynamic, vibrant backgrounds:
196
- You can generate part of the image from sketch while keeping part of it as it is.
197
- - **Canny:** Emphasizes strong edge detection.
198
- - **Depth:** Produces images with realistic depth and perspective.
199
-
200
- For more details, shoot us a message on discord.
201
- """
202
- )
203
  with gr.Tabs():
204
  for mode in MODE_DEFAULTS:
205
  with gr.Tab(mode):
206
  defaults = MODE_DEFAULTS[mode]
207
  gr.Markdown(f"### {mode} Mode")
208
- gr.Markdown(f"**Default Model:** {defaults['model']}")
209
 
210
  with gr.Row():
211
- with gr.Column(scale=2, min_width=370):
212
- input_image = gr.Image(
213
- label="Upload Image",
214
- type="pil",
215
- scale=3,
216
- height=370,
217
- min_width=100,
218
- )
219
  generate_button = gr.Button("Generate")
220
- with gr.Blocks(title="Options"):
221
  model_dropdown = gr.Dropdown(
222
  label="Model",
223
  choices=defaults["models"],
@@ -229,24 +177,16 @@ with gr.Blocks(title="🌍 ZenCtrl") as demo:
229
  )
230
 
231
  with gr.Column(scale=2):
232
- output_image = gr.Image(
233
- label="Generated Image",
234
- type="pil",
235
- height=573,
236
- scale=4,
237
- min_width=100,
238
- )
239
 
240
- gr.Markdown("#### Prompt")
241
  prompt_box = gr.Textbox(
242
  label="Prompt", value=defaults["prompt"], lines=2
243
  )
244
 
245
- # Wrap generation parameters in an Accordion for collapsible view.
246
  with gr.Accordion("Generation Parameters", open=False):
247
  with gr.Row():
248
  step_slider = gr.Slider(
249
- minimum=2, maximum=28, value=2, step=2, label="Steps"
250
  )
251
  strength_slider = gr.Slider(
252
  minimum=0.5,
@@ -272,14 +212,7 @@ with gr.Blocks(title="🌍 ZenCtrl") as demo:
272
  )
273
 
274
  def on_generate_click(
275
- model_name,
276
- prompt,
277
- steps,
278
- strength,
279
- height,
280
- width,
281
- remove_bg,
282
- image,
283
  ):
284
  return call_baseten_generate(
285
  image,
@@ -305,9 +238,16 @@ with gr.Blocks(title="🌍 ZenCtrl") as demo:
305
  input_image,
306
  ],
307
  outputs=[output_image],
308
- concurrency_limit=None
309
  )
310
 
 
 
 
 
 
 
 
 
311
 
312
  if __name__ == "__main__":
313
- demo.launch()
 
6
  import gradio as gr
7
  from PIL import Image
8
 
9
+ import examples_db
10
+
11
  # Read Baseten configuration from environment variables.
12
  BTEN_API_KEY = os.getenv("API_KEY")
13
  URL = os.getenv("URL")
14
 
15
+
16
  def image_to_base64(image: Image.Image) -> str:
 
17
  with io.BytesIO() as buffer:
18
  image.save(buffer, format="PNG")
19
  return base64.b64encode(buffer.getvalue()).decode("utf-8")
20
 
21
 
22
  def ensure_image(img) -> Image.Image:
 
 
 
 
 
 
23
  if isinstance(img, Image.Image):
24
  return img
25
  elif isinstance(img, str):
 
40
  lora_name: str,
41
  remove_bg: bool,
42
  ) -> Image.Image | None:
 
 
 
43
  image = ensure_image(image)
44
  b64_image = image_to_base64(image)
45
  payload = {
 
52
  "lora_name": lora_name,
53
  "bgrm": remove_bg,
54
  }
55
+ headers = {"Authorization": f"Api-Key {BTEN_API_KEY or os.getenv('API_KEY')}"}
 
 
 
56
  try:
57
  if not URL:
58
  raise ValueError("The URL environment variable is not set.")
 
59
  response = requests.post(URL, headers=headers, json=payload)
60
  if response.status_code == 200:
61
  data = response.json()
 
72
  return None
73
 
74
 
75
+ # ================== MODE CONFIG =====================
76
 
77
  Mode = TypedDict(
78
  "Mode",
 
88
  )
89
 
90
  MODE_DEFAULTS: dict[str, Mode] = {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
91
  "Background Generation": {
92
  "model": "bg_canny_58000_1024",
93
  "prompt": "A vibrant background with dynamic lighting and textures",
94
  "default_strength": 1.2,
95
  "default_height": 1024,
96
  "default_width": 1024,
97
+ "models": ["bgwlight_15000_1024", "bg_canny_58000_1024", "gen_back_7000_1024"],
98
+ "remove_bg": True,
99
+ },
100
+ "Subject Generation": {
101
+ "model": "subject_99000_512",
102
+ "prompt": "A detailed portrait with soft lighting",
103
+ "default_strength": 1.2,
104
+ "default_height": 512,
105
+ "default_width": 512,
106
+ "models": ["zendsd_512_146000", "subject_99000_512", "zen_26000_512"],
 
 
 
 
107
  "remove_bg": True,
108
  },
109
  "Canny": {
 
121
  "default_strength": 1.2,
122
  "default_height": 1024,
123
  "default_width": 1024,
124
+ "models": ["depth_9800_1024"],
 
 
125
  "remove_bg": True,
126
  },
127
  "Deblurring": {
 
130
  "default_strength": 1.2,
131
  "default_height": 1024,
132
  "default_width": 1024,
133
+ "models": ["deblurr_1024_10000"],
134
  "remove_bg": False,
135
  },
136
  }
137
 
138
+ # ================== PRESET EXAMPLES =====================
139
+
140
+
141
+
142
+
143
+ # ================== UI =====================
144
 
145
  header = """
146
  <h1>🌍 ZenCtrl / FLUX</h1>
147
  <div align="center" style="line-height: 1;">
148
+ <a href="https://github.com/FotographerAI/ZenCtrl/tree/main" target="_blank"><img src="https://img.shields.io/badge/GitHub-Repo-181717.svg"></a>
149
+ <a href="https://huggingface.co/spaces/fotographerai/ZenCtrl" target="_blank"><img src="https://img.shields.io/badge/🤗_HuggingFace-Space-ffbd45.svg"></a>
150
+ <a href="https://discord.com/invite/b9RuYQ3F8k" target="_blank"><img src="https://img.shields.io/badge/Discord-Join-7289da.svg?logo=discord"></a>
 
 
151
  </div>
152
  """
153
 
 
 
 
154
  with gr.Blocks(title="🌍 ZenCtrl") as demo:
155
  gr.HTML(header)
156
+ gr.Markdown("# ZenCtrl Demo")
157
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
158
  with gr.Tabs():
159
  for mode in MODE_DEFAULTS:
160
  with gr.Tab(mode):
161
  defaults = MODE_DEFAULTS[mode]
162
  gr.Markdown(f"### {mode} Mode")
 
163
 
164
  with gr.Row():
165
+ with gr.Column(scale=2):
166
+ input_image = gr.Image(label="Input Image", type="pil")
 
 
 
 
 
 
167
  generate_button = gr.Button("Generate")
168
+ with gr.Blocks():
169
  model_dropdown = gr.Dropdown(
170
  label="Model",
171
  choices=defaults["models"],
 
177
  )
178
 
179
  with gr.Column(scale=2):
180
+ output_image = gr.Image(label="Generated Image", type="pil")
 
 
 
 
 
 
181
 
 
182
  prompt_box = gr.Textbox(
183
  label="Prompt", value=defaults["prompt"], lines=2
184
  )
185
 
 
186
  with gr.Accordion("Generation Parameters", open=False):
187
  with gr.Row():
188
  step_slider = gr.Slider(
189
+ minimum=2, maximum=28, value=10, step=2, label="Steps"
190
  )
191
  strength_slider = gr.Slider(
192
  minimum=0.5,
 
212
  )
213
 
214
  def on_generate_click(
215
+ model_name, prompt, steps, strength, height, width, remove_bg, image
 
 
 
 
 
 
 
216
  ):
217
  return call_baseten_generate(
218
  image,
 
238
  input_image,
239
  ],
240
  outputs=[output_image],
 
241
  )
242
 
243
+ # ---------------- Templates --------------------
244
+ if examples_db.MODE_EXAMPLES.get(mode):
245
+ gr.Examples(
246
+ examples=examples_db.MODE_EXAMPLES.get(mode, []),
247
+ inputs=[input_image, prompt_box, output_image],
248
+ label="Presets (Input / Prompt / Output)",
249
+ examples_per_page=6,
250
+ )
251
 
252
  if __name__ == "__main__":
253
+ demo.launch()
examples_db.py ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MODE_EXAMPLES = {
2
+ "Subject Generation": [
3
+ [
4
+ "imgs/sub_i1.png",
5
+ "Low angle photography, shoes, stepping in water in a futuristic cityscape with neon lights, in the back in large, the words 'ZenCtrl 2025' are written in a futuristic font",
6
+ "imgs/sub_o1.webp",
7
+ ],
8
+ [
9
+ "imgs/sub_i2.png",
10
+ "blue car, on the road, outdoor, sunny day , beautiful cityscape",
11
+ "imgs/sub_o2.webp",
12
+ ],
13
+ [
14
+ "imgs/sub_i3.png",
15
+ "in a modern living room , next to a flower vase",
16
+ "imgs/sub_o3.webp",
17
+ ],
18
+ ["imgs/sub_i4.png", "a watch with blue dial, on a table, in a living room, next to a window, sunny day", "imgs/sub_o4.webp"],
19
+ ["imgs/sub_i5.png", "a ring , on a jewelry box, next to a luxurious shop window, side view, sunny day", "imgs/sub_o5.webp"],
20
+ ],
21
+ "Background Generation": [
22
+ [
23
+ "imgs/bg_i1.png",
24
+ "placed on a dark marble table in a bathroom of luxury hotel modern light authentic atmosphere",
25
+ "imgs/bg_o1.png",
26
+ ],
27
+ [
28
+ "imgs/bg_i2.png",
29
+ "sitting on the middle of the city road on a sunny day very bright day front view",
30
+ "imgs/bg_o2.png",
31
+ ],
32
+ [
33
+ "imgs/bg_i3.png",
34
+ "A creative capture in an art gallery, with soft, focused lighting highlighting both the person’s features and the abstract surroundings, exuding sophistication.",
35
+ "imgs/bg_o3.jpg",
36
+ ],
37
+ [
38
+ "imgs/bg_i4.png",
39
+ "In a rain-soaked urban nightscape, with headlights piercing through the mist and wet streets reflecting the city’s vibrant neon colors, creating an atmosphere of mystery and modern elegance.",
40
+ "imgs/bg_o4.jpg",
41
+ ],
42
+ [
43
+ "imgs/bg_i5.png",
44
+ "An elegant room scene featuring a minimalist table and chairs, illuminated by ambient lighting that casts gentle shadows and enhances the refined, contemporary decor.",
45
+ "imgs/bg_o5.jpg",
46
+ ],
47
+ ],
48
+ # "Canny": [
49
+ # ["assets/canny1.jpg", "A neon cyberpunk city skyline", "assets/canny1_out.jpg"],
50
+ # ["assets/canny2.jpg", "A robot walking in the fog", "assets/canny2_out.jpg"],
51
+ # [
52
+ # "assets/canny3.jpg",
53
+ # "A futuristic vehicle parked under a bridge",
54
+ # "assets/canny3_out.jpg",
55
+ # ],
56
+ # [
57
+ # "assets/canny4.jpg",
58
+ # "Sci-fi lab interior with glowing machinery",
59
+ # "assets/canny4_out.jpg",
60
+ # ],
61
+ # [
62
+ # "assets/canny5.jpg",
63
+ # "A portrait of a woman outlined in neon",
64
+ # "assets/canny5_out.jpg",
65
+ # ],
66
+ # [
67
+ # "assets/canny6.jpg",
68
+ # "Post-apocalyptic abandoned street",
69
+ # "assets/canny6_out.jpg",
70
+ # ],
71
+ # ],
72
+ # "Depth": [
73
+ # [
74
+ # "assets/depth1.jpg",
75
+ # "A narrow alleyway with deep perspective",
76
+ # "assets/depth1_out.jpg",
77
+ # ],
78
+ # [
79
+ # "assets/depth2.jpg",
80
+ # "A mountain road vanishing into the distance",
81
+ # "assets/depth2_out.jpg",
82
+ # ],
83
+ # [
84
+ # "assets/depth3.jpg",
85
+ # "A hallway with strong depth of field",
86
+ # "assets/depth3_out.jpg",
87
+ # ],
88
+ # [
89
+ # "assets/depth4.jpg",
90
+ # "A misty forest path stretching far away",
91
+ # "assets/depth4_out.jpg",
92
+ # ],
93
+ # ["assets/depth5.jpg", "A bridge over a deep canyon", "assets/depth5_out.jpg"],
94
+ # [
95
+ # "assets/depth6.jpg",
96
+ # "An underground tunnel with receding arches",
97
+ # "assets/depth6_out.jpg",
98
+ # ],
99
+ # ],
100
+ # "Deblurring": [
101
+ # ["assets/deblur1.jpg", "", "assets/deblur1_out.jpg"],
102
+ # ["assets/deblur2.jpg", "", "assets/deblur2_out.jpg"],
103
+ # ["assets/deblur3.jpg", "", "assets/deblur3_out.jpg"],
104
+ # ["assets/deblur4.jpg", "", "assets/deblur4_out.jpg"],
105
+ # ["assets/deblur5.jpg", "", "assets/deblur5_out.jpg"],
106
+ # ["assets/deblur6.jpg", "", "assets/deblur6_out.jpg"],
107
+ # ],
108
+ }
imgs/bg_i1.png ADDED

Git LFS Details

  • SHA256: 8233ff6e5eaaf97f6157599708ed67e62380f3e09820d67bb2ebd472d84165a7
  • Pointer size: 130 Bytes
  • Size of remote file: 97.7 kB
imgs/bg_i2.png ADDED

Git LFS Details

  • SHA256: 41ff9fabfb2e31cce35cc97f2c5962165c3b68bce60732e6669692307ec5ebed
  • Pointer size: 131 Bytes
  • Size of remote file: 197 kB
imgs/bg_i3.png ADDED

Git LFS Details

  • SHA256: 89815263bfd1b72e5be817ddcefc770a728b46bdb7d8264258cae8b5a4270493
  • Pointer size: 131 Bytes
  • Size of remote file: 279 kB
imgs/bg_i4.png ADDED

Git LFS Details

  • SHA256: ebedef7bdaf6b6e184cad63665f40d2f86dd5a6c54334b400d1ce479c5ec339e
  • Pointer size: 132 Bytes
  • Size of remote file: 1 MB
imgs/bg_i5.png ADDED

Git LFS Details

  • SHA256: f3065ff3010bdf54d9eed2784a9f998597fb3f10646f0a6ba71e7d2abd9041c2
  • Pointer size: 131 Bytes
  • Size of remote file: 947 kB
imgs/bg_o1.png ADDED

Git LFS Details

  • SHA256: 8e80909e8b091f02d8d00f8614194f5e6606b076bf86d4fd88e58ffcfeaaa4ed
  • Pointer size: 131 Bytes
  • Size of remote file: 621 kB
imgs/bg_o2.png ADDED

Git LFS Details

  • SHA256: e32d9497741ea352725220043e54d1772b1fe4e81910cfaf668cc95ee6e9a23f
  • Pointer size: 131 Bytes
  • Size of remote file: 945 kB
imgs/bg_o3.jpg ADDED

Git LFS Details

  • SHA256: ffef49f49bbed31e53e10552a3e6bedc8c492d0b69b3e5284e5f612705f84983
  • Pointer size: 130 Bytes
  • Size of remote file: 58.1 kB
imgs/bg_o4.jpg ADDED

Git LFS Details

  • SHA256: f26c092a93c15a781ae013a4980f2a4b0489277687263e7f6619f5ea454fa645
  • Pointer size: 130 Bytes
  • Size of remote file: 69.7 kB
imgs/bg_o5.jpg ADDED

Git LFS Details

  • SHA256: 3ebe1a2421d9a36a108d9aca97064d96f1c5016bc6ea378dee637fc843a0357c
  • Pointer size: 130 Bytes
  • Size of remote file: 37 kB
imgs/sub_i1.png ADDED

Git LFS Details

  • SHA256: 41ff9fabfb2e31cce35cc97f2c5962165c3b68bce60732e6669692307ec5ebed
  • Pointer size: 131 Bytes
  • Size of remote file: 197 kB
imgs/sub_i2.png ADDED

Git LFS Details

  • SHA256: ebedef7bdaf6b6e184cad63665f40d2f86dd5a6c54334b400d1ce479c5ec339e
  • Pointer size: 132 Bytes
  • Size of remote file: 1 MB
imgs/sub_i3.png ADDED

Git LFS Details

  • SHA256: f3065ff3010bdf54d9eed2784a9f998597fb3f10646f0a6ba71e7d2abd9041c2
  • Pointer size: 131 Bytes
  • Size of remote file: 947 kB
imgs/sub_i4.png ADDED

Git LFS Details

  • SHA256: 24deed93849e951f8c7c44de47226240db7c5a42a289f3fdc7c0fa5621f65609
  • Pointer size: 131 Bytes
  • Size of remote file: 281 kB
imgs/sub_i5.png ADDED

Git LFS Details

  • SHA256: 50b05fff1d2d404da6d6045c36971cd810c2e0d425168cdafa1511f95c5ba269
  • Pointer size: 131 Bytes
  • Size of remote file: 250 kB
imgs/sub_o1.webp ADDED

Git LFS Details

  • SHA256: c1c9eef884328c26cc58de4f35680b2ca5f211071c2b9bd5254223b0dec0757e
  • Pointer size: 130 Bytes
  • Size of remote file: 32.1 kB
imgs/sub_o2.webp ADDED

Git LFS Details

  • SHA256: 026e18cab72811630eb367bf4ae2e38933fb9c31c0146b66990c5f8879b8b71b
  • Pointer size: 130 Bytes
  • Size of remote file: 27.3 kB
imgs/sub_o3.webp ADDED

Git LFS Details

  • SHA256: f0b2abf5d005c747c092c60837b3a80b8d96e5c52625b2d288475799603c8147
  • Pointer size: 130 Bytes
  • Size of remote file: 28.3 kB
imgs/sub_o4.webp ADDED

Git LFS Details

  • SHA256: f77c4b61c9ad96cbf312af18c631f9d558bdcf1f51beb1317bc483bfe700cf18
  • Pointer size: 130 Bytes
  • Size of remote file: 16.9 kB
imgs/sub_o5.webp ADDED

Git LFS Details

  • SHA256: 14ef4c02f4a2970a26a1bd92ce4c937b8aad477a91463fef5a8a34dd61afe3e8
  • Pointer size: 130 Bytes
  • Size of remote file: 17.4 kB