Spaces:
Running
on
A100
Running
on
A100
Commit
·
da87908
1
Parent(s):
392868d
Add list of examples
Browse files- .gitattributes +2 -0
- app.py +42 -27
- example_prompts.txt +0 -6
- examples/60066a5369f1354e631a23fef2ba638b.png +3 -0
- examples/60790035c8126a677645b4fdaedbc34.png +3 -0
- examples/8981c0ffae1af00a50fc88ed745bdb67.png +3 -0
- examples/9c1b0058dfe027cbf519adc9991b5f11.png +3 -0
- examples/e488826128fe3854b300c4ca2f51c01b.png +3 -0
- examples/e5c8853f28328d0c2511f68da65f4c4.png +3 -0
- examples/examples.json +44 -0
.gitattributes
CHANGED
@@ -33,3 +33,5 @@ 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 |
+
*.jpg filter=lfs diff=lfs merge=lfs -text
|
37 |
+
*.png filter=lfs diff=lfs merge=lfs -text
|
app.py
CHANGED
@@ -1,3 +1,4 @@
|
|
|
|
1 |
import os
|
2 |
import subprocess
|
3 |
import zipfile
|
@@ -38,7 +39,6 @@ def main():
|
|
38 |
|
39 |
model_cfg = LegoGPTConfig()
|
40 |
model = LegoGPT(LegoGPTConfig())
|
41 |
-
default_seed = 42
|
42 |
|
43 |
def generate_lego(
|
44 |
prompt: str,
|
@@ -75,33 +75,45 @@ def main():
|
|
75 |
|
76 |
return img_filename, output['lego']
|
77 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
78 |
demo = gr.Interface(
|
79 |
fn=generate_lego,
|
80 |
title='LegoGPT Demo',
|
81 |
description='Official demo for [LegoGPT](https://avalovelace1.github.io/LegoGPT/), the first approach for generating physically stable LEGO brick models from text prompts.',
|
82 |
-
inputs=[
|
83 |
-
|
84 |
-
],
|
85 |
-
additional_inputs=[
|
86 |
-
gr.Slider(0.0, 2.0, value=model_cfg.temperature, info=get_help_string('temperature'), step=0.01),
|
87 |
-
gr.Number(value=42, info='Random seed for generation.', precision=0, step=1),
|
88 |
-
gr.Number(value=model_cfg.max_bricks, info=get_help_string('max_bricks'),
|
89 |
-
precision=0, minimum=1, step=1),
|
90 |
-
gr.Number(value=model_cfg.max_brick_rejections, info=get_help_string('max_brick_rejections'),
|
91 |
-
precision=0, minimum=0, step=1),
|
92 |
-
gr.Number(value=model_cfg.max_regenerations, info=get_help_string('max_regenerations'),
|
93 |
-
precision=0, minimum=0, step=1),
|
94 |
-
],
|
95 |
-
outputs=[
|
96 |
-
gr.Image(label='output_img'),
|
97 |
-
gr.Textbox(label='output_txt', lines=5, max_lines=5, show_copy_button=True,
|
98 |
-
info='The LEGO structure in text format. Each line of the form "hxw (x,y,z)" represents a '
|
99 |
-
'1-unit-tall rectangular brick with dimensions hxw placed at coordinates (x,y,z).'),
|
100 |
-
],
|
101 |
-
# examples=[[prompt, model_cfg.temperature, default_seed] for prompt in get_example_prompts()],
|
102 |
-
# cache_examples=True,
|
103 |
flagging_mode='never',
|
104 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
105 |
demo.launch(share=True)
|
106 |
|
107 |
|
@@ -115,11 +127,14 @@ def get_help_string(field_name: str) -> str:
|
|
115 |
return name_field.metadata['help']
|
116 |
|
117 |
|
118 |
-
def
|
119 |
-
|
120 |
-
with open(
|
121 |
-
|
122 |
-
|
|
|
|
|
|
|
123 |
|
124 |
|
125 |
if __name__ == '__main__':
|
|
|
1 |
+
import json
|
2 |
import os
|
3 |
import subprocess
|
4 |
import zipfile
|
|
|
39 |
|
40 |
model_cfg = LegoGPTConfig()
|
41 |
model = LegoGPT(LegoGPTConfig())
|
|
|
42 |
|
43 |
def generate_lego(
|
44 |
prompt: str,
|
|
|
75 |
|
76 |
return img_filename, output['lego']
|
77 |
|
78 |
+
# Define inputs and outputs
|
79 |
+
in_prompt = gr.Textbox(label='Prompt', placeholder='Enter a prompt to generate a LEGO model.')
|
80 |
+
in_temperature = gr.Slider(0.0, 2.0, value=model_cfg.temperature, step=0.01,
|
81 |
+
label='Temperature', info=get_help_string('temperature'))
|
82 |
+
in_seed = gr.Number(value=42, label='Seed', info='Random seed for generation.', precision=0, step=1)
|
83 |
+
in_bricks = gr.Number(value=model_cfg.max_bricks, label='Max bricks', info=get_help_string('max_bricks'),
|
84 |
+
precision=0, minimum=1, step=1)
|
85 |
+
in_rejections = gr.Number(value=model_cfg.max_brick_rejections, label='Max brick rejections',
|
86 |
+
info=get_help_string('max_brick_rejections'), precision=0, minimum=0, step=1)
|
87 |
+
in_regenerations = gr.Number(value=model_cfg.max_regenerations, label='Max regenerations',
|
88 |
+
info=get_help_string('max_regenerations'), precision=0, minimum=0, step=1)
|
89 |
+
out_img = gr.Image(label='Output image', format='png')
|
90 |
+
out_txt = gr.Textbox(label='Output LEGO bricks', lines=5, max_lines=5, show_copy_button=True,
|
91 |
+
info='The LEGO structure in text format. Each line of the form "hxw (x,y,z)" represents a '
|
92 |
+
'1-unit-tall rectangular brick with dimensions hxw placed at coordinates (x,y,z).')
|
93 |
+
|
94 |
+
# Define Gradio interface
|
95 |
demo = gr.Interface(
|
96 |
fn=generate_lego,
|
97 |
title='LegoGPT Demo',
|
98 |
description='Official demo for [LegoGPT](https://avalovelace1.github.io/LegoGPT/), the first approach for generating physically stable LEGO brick models from text prompts.',
|
99 |
+
inputs=[in_prompt],
|
100 |
+
additional_inputs=[in_temperature, in_seed, in_bricks, in_rejections, in_regenerations],
|
101 |
+
outputs=[out_img, out_txt],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
102 |
flagging_mode='never',
|
103 |
)
|
104 |
+
with demo:
|
105 |
+
with gr.Row():
|
106 |
+
examples = get_examples()
|
107 |
+
dummy_name = gr.Textbox(visible=False, label='Name')
|
108 |
+
dummy_out_img = gr.Image(visible=False, label='Result')
|
109 |
+
gr.Examples(
|
110 |
+
examples=[[name, example['prompt'], example['temperature'], example['seed'], example['output_img']]
|
111 |
+
for name, example in examples.items()],
|
112 |
+
inputs=[dummy_name, in_prompt, in_temperature, in_seed, dummy_out_img],
|
113 |
+
outputs=[out_img, out_txt],
|
114 |
+
fn=lambda *args: (args[-1], examples[args[0]]['output_txt']),
|
115 |
+
run_on_click=True,
|
116 |
+
)
|
117 |
demo.launch(share=True)
|
118 |
|
119 |
|
|
|
127 |
return name_field.metadata['help']
|
128 |
|
129 |
|
130 |
+
def get_examples(example_dir: str = os.path.abspath('examples')) -> dict[str, dict[str, str]]:
|
131 |
+
examples_file = os.path.join(example_dir, 'examples.json')
|
132 |
+
with open(examples_file) as f:
|
133 |
+
examples = json.load(f)
|
134 |
+
|
135 |
+
for example in examples.values():
|
136 |
+
example['output_img'] = os.path.join(example_dir, example['output_img'])
|
137 |
+
return examples
|
138 |
|
139 |
|
140 |
if __name__ == '__main__':
|
example_prompts.txt
DELETED
@@ -1,6 +0,0 @@
|
|
1 |
-
Table featuring a flat rectangular surface over four evenly spaced legs.
|
2 |
-
Compact sofa with a geometric design.
|
3 |
-
Small car featuring a rectangular body, flat top, and stepped edges.
|
4 |
-
Train with rectangular body and geometric components.
|
5 |
-
Square-seated chair featuring an upright, rectangular backrest and straight legs.
|
6 |
-
Compact chair with a tall backrest and serrated seat.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
examples/60066a5369f1354e631a23fef2ba638b.png
ADDED
![]() |
Git LFS Details
|
examples/60790035c8126a677645b4fdaedbc34.png
ADDED
![]() |
Git LFS Details
|
examples/8981c0ffae1af00a50fc88ed745bdb67.png
ADDED
![]() |
Git LFS Details
|
examples/9c1b0058dfe027cbf519adc9991b5f11.png
ADDED
![]() |
Git LFS Details
|
examples/e488826128fe3854b300c4ca2f51c01b.png
ADDED
![]() |
Git LFS Details
|
examples/e5c8853f28328d0c2511f68da65f4c4.png
ADDED
![]() |
Git LFS Details
|
examples/examples.json
ADDED
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"table": {
|
3 |
+
"prompt": "Table featuring a flat rectangular surface over four evenly spaced legs.",
|
4 |
+
"temperature": 0.6,
|
5 |
+
"seed": 42,
|
6 |
+
"output_img": "9c1b0058dfe027cbf519adc9991b5f11.png",
|
7 |
+
"output_txt": "1x2 (16,18,0)\n1x2 (16,13,0)\n2x2 (0,18,0)\n2x2 (0,13,0)\n1x2 (16,18,1)\n1x2 (16,13,1)\n2x2 (0,18,1)\n2x2 (0,13,1)\n1x1 (16,18,2)\n1x2 (16,13,2)\n2x1 (0,18,2)\n2x2 (0,13,2)\n1x2 (16,17,3)\n1x1 (16,14,3)\n2x2 (0,17,3)\n2x1 (0,14,3)\n1x2 (16,17,4)\n1x2 (16,14,4)\n2x2 (0,17,4)\n2x2 (0,14,4)\n1x2 (16,17,5)\n1x2 (16,14,5)\n2x2 (0,17,5)\n2x2 (0,14,5)\n1x1 (16,18,6)\n1x2 (16,16,6)\n1x1 (16,14,6)\n8x1 (8,17,6)\n2x1 (0,18,6)\n8x1 (0,17,6)\n2x1 (0,16,6)\n2x1 (0,14,6)\n2x6 (16,13,7)\n1x6 (15,13,7)\n2x6 (13,13,7)\n2x6 (11,13,7)\n8x1 (10,19,7)\n2x6 (9,13,7)\n6x2 (3,17,7)\n6x2 (3,15,7)\n6x2 (3,13,7)\n8x1 (2,19,7)\n1x6 (2,13,7)\n2x6 (0,14,7)\n2x1 (0,13,7)\n1x6 (17,14,8)\n2x6 (15,14,8)\n1x6 (14,14,8)\n2x6 (12,14,8)\n8x1 (10,13,8)\n4x2 (8,14,8)\n2x1 (8,13,8)\n6x2 (6,18,8)\n6x2 (6,16,8)\n2x2 (6,14,8)\n2x6 (4,14,8)\n2x6 (2,14,8)\n2x6 (0,14,8)\n8x1 (0,13,8)\n"
|
8 |
+
},
|
9 |
+
"sofa": {
|
10 |
+
"prompt": "Compact sofa with a geometric design.",
|
11 |
+
"temperature": 0.6,
|
12 |
+
"seed": 42,
|
13 |
+
"output_img": "8981c0ffae1af00a50fc88ed745bdb67.png",
|
14 |
+
"output_txt": "1x2 (16,17,0)\n1x1 (16,13,0)\n2x2 (0,17,0)\n2x1 (0,13,0)\n1x1 (17,18,1)\n1x6 (17,12,1)\n2x6 (15,12,1)\n1x6 (14,12,1)\n8x1 (9,18,1)\n1x1 (8,18,1)\n6x2 (8,16,1)\n6x2 (8,14,1)\n6x2 (8,12,1)\n6x2 (2,16,1)\n6x2 (2,14,1)\n6x2 (2,12,1)\n8x1 (0,18,1)\n2x6 (0,12,1)\n2x6 (16,13,2)\n2x1 (16,12,2)\n1x1 (15,18,2)\n2x6 (14,12,2)\n1x6 (13,12,2)\n2x6 (11,12,2)\n6x1 (9,18,2)\n2x6 (9,12,2)\n2x6 (7,13,2)\n2x6 (5,13,2)\n4x1 (5,12,2)\n1x1 (4,18,2)\n2x6 (3,12,2)\n2x1 (2,18,2)\n2x6 (1,12,2)\n2x1 (0,18,2)\n1x6 (0,12,2)\n1x6 (17,12,3)\n2x1 (16,18,3)\n1x1 (16,17,3)\n1x2 (15,17,3)\n2x4 (15,13,3)\n2x1 (15,12,3)\n2x1 (13,18,3)\n8x1 (5,18,3)\n1x1 (4,18,3)\n2x1 (2,18,3)\n2x6 (0,13,3)\n2x1 (0,12,3)\n1x1 (17,18,4)\n2x6 (16,12,4)\n1x2 (15,17,4)\n6x2 (9,18,4)\n1x2 (8,18,4)\n6x2 (2,18,4)\n2x1 (0,18,4)\n2x6 (0,12,4)\n2x1 (16,16,5)\n2x4 (16,12,5)\n6x2 (12,17,5)\n8x1 (9,19,5)\n1x1 (8,19,5)\n6x2 (6,17,5)\n8x1 (0,19,5)\n6x2 (0,17,5)\n2x1 (0,16,5)\n2x4 (0,12,5)\n1x2 (17,18,6)\n2x1 (16,17,6)\n4x2 (13,18,6)\n6x2 (7,18,6)\n1x2 (6,18,6)\n6x2 (0,18,6)\n2x1 (0,17,6)\n1x2 (16,18,7)\n2x2 (14,18,7)\n6x2 (8,18,7)\n6x2 (2,18,7)\n2x2 (0,18,7)\n"
|
15 |
+
},
|
16 |
+
"car": {
|
17 |
+
"prompt": "Small car featuring a rectangular body, flat top, and stepped edges.",
|
18 |
+
"temperature": 0.6,
|
19 |
+
"seed": 42,
|
20 |
+
"output_img": "60066a5369f1354e631a23fef2ba638b.png",
|
21 |
+
"output_txt": "1x2 (7,15,0)\n1x1 (7,13,0)\n1x2 (7,5,0)\n2x2 (6,7,0)\n1x1 (6,5,0)\n2x6 (5,11,0)\n2x2 (5,3,0)\n2x6 (3,11,0)\n2x6 (3,3,0)\n2x6 (1,11,0)\n6x2 (1,9,0)\n2x2 (1,3,0)\n1x2 (0,15,0)\n1x1 (0,13,0)\n2x2 (0,7,0)\n1x2 (0,5,0)\n1x1 (7,18,1)\n1x4 (7,8,1)\n2x6 (6,12,1)\n2x6 (6,2,1)\n1x1 (5,19,1)\n2x6 (4,12,1)\n2x2 (4,2,1)\n2x1 (3,19,1)\n2x6 (2,12,1)\n2x2 (2,2,1)\n6x2 (1,10,1)\n6x2 (1,8,1)\n2x6 (0,14,1)\n2x2 (0,12,1)\n1x4 (0,8,1)\n6x2 (0,6,1)\n6x2 (0,4,1)\n2x1 (0,3,1)\n1x1 (7,18,2)\n1x4 (7,13,2)\n1x1 (7,2,2)\n2x6 (6,7,2)\n2x2 (6,5,2)\n2x1 (6,3,2)\n2x6 (5,14,2)\n1x6 (5,7,2)\n1x2 (5,3,2)\n2x6 (3,14,2)\n2x6 (3,7,2)\n1x2 (3,5,2)\n2x2 (3,3,2)\n4x1 (3,2,2)\n1x1 (2,2,2)\n2x6 (1,14,2)\n6x1 (1,13,2)\n2x4 (1,9,2)\n2x6 (1,3,2)\n1x1 (0,18,2)\n1x4 (0,13,2)\n1x1 (0,12,2)\n1x1 (7,13,3)\n1x2 (7,11,3)\n1x8 (7,3,3)\n2x2 (6,18,3)\n2x1 (6,16,3)\n2x2 (6,14,3)\n1x1 (5,19,3)\n1x2 (5,15,3)\n1x1 (4,16,3)\n2x1 (3,19,3)\n1x2 (3,15,3)\n6x1 (1,17,3)\n2x2 (1,15,3)\n2x1 (1,14,3)\n1x1 (1,13,3)\n6x2 (1,11,3)\n6x2 (1,9,3)\n6x2 (1,7,3)\n6x2 (1,5,3)\n6x2 (1,3,3)\n2x1 (0,18,3)\n1x1 (0,15,3)\n1x1 (0,14,3)\n1x1 (0,12,3)\n1x1 (7,18,4)\n2x6 (6,12,4)\n2x2 (6,10,4)\n1x1 (4,9,4)\n4x1 (3,18,4)\n1x2 (3,16,4)\n4x2 (2,10,4)\n1x1 (1,18,4)\n2x6 (1,12,4)\n1x1 (1,11,4)\n1x1 (1,10,4)\n1x1 (0,12,4)\n"
|
22 |
+
},
|
23 |
+
"train": {
|
24 |
+
"prompt": "Train with rectangular body and geometric components.",
|
25 |
+
"temperature": 0.6,
|
26 |
+
"seed": 42,
|
27 |
+
"output_img": "e5c8853f28328d0c2511f68da65f4c4.png",
|
28 |
+
"output_txt": "1x2 (3,17,0)\n1x2 (3,13,0)\n2x2 (2,2,0)\n2x2 (1,17,0)\n2x2 (1,13,0)\n1x2 (0,17,0)\n4x1 (0,6,0)\n2x2 (0,2,0)\n1x1 (3,18,1)\n1x2 (3,16,1)\n1x2 (3,12,1)\n1x2 (3,2,1)\n2x2 (2,14,1)\n2x6 (2,6,1)\n1x1 (2,3,1)\n2x1 (1,18,1)\n2x2 (1,16,1)\n1x2 (1,14,1)\n1x6 (1,6,1)\n2x1 (1,2,1)\n1x1 (0,18,1)\n1x2 (0,16,1)\n2x2 (0,12,1)\n1x2 (0,10,1)\n1x8 (0,2,1)\n1x2 (3,9,2)\n1x1 (3,2,2)\n2x6 (2,13,2)\n2x4 (2,5,2)\n2x1 (1,2,2)\n2x6 (0,13,2)\n4x2 (0,11,2)\n1x2 (0,9,2)\n2x4 (0,5,2)\n4x2 (0,3,2)\n1x1 (0,2,2)\n1x8 (3,10,3)\n1x6 (3,4,3)\n2x6 (1,12,3)\n2x6 (1,6,3)\n2x2 (1,4,3)\n4x1 (0,18,3)\n1x8 (0,10,3)\n1x6 (0,4,3)\n4x2 (0,2,3)\n2x6 (2,10,4)\n2x6 (2,3,4)\n4x1 (0,18,4)\n4x2 (0,16,4)\n2x6 (0,10,4)\n4x1 (0,9,4)\n2x6 (0,3,4)\n1x2 (2,17,5)\n1x4 (2,11,5)\n2x2 (1,9,5)\n2x2 (0,17,5)\n2x2 (0,13,5)\n2x2 (0,11,5)\n1x2 (0,9,5)\n"
|
29 |
+
},
|
30 |
+
"chair-1": {
|
31 |
+
"prompt": "Square-seated chair featuring an upright, rectangular backrest and straight legs.",
|
32 |
+
"temperature": 0.6,
|
33 |
+
"seed": 42,
|
34 |
+
"output_img": "e488826128fe3854b300c4ca2f51c01b.png",
|
35 |
+
"output_txt": "1x2 (7,18,0)\n1x2 (7,11,0)\n2x2 (0,18,0)\n2x2 (0,11,0)\n1x2 (7,18,1)\n1x2 (7,11,1)\n2x2 (0,18,1)\n2x2 (0,11,1)\n1x1 (7,18,2)\n1x2 (7,11,2)\n2x1 (0,18,2)\n2x2 (0,11,2)\n1x2 (7,17,3)\n1x2 (7,11,3)\n2x2 (0,17,3)\n2x2 (0,11,3)\n1x2 (7,17,4)\n1x2 (7,11,4)\n2x2 (0,17,4)\n2x2 (0,11,4)\n1x2 (7,17,5)\n1x2 (7,11,5)\n2x2 (0,17,5)\n2x2 (0,11,5)\n1x1 (7,18,6)\n1x2 (7,11,6)\n2x1 (6,17,6)\n1x1 (6,12,6)\n1x1 (1,12,6)\n6x1 (0,17,6)\n2x1 (0,18,6)\n1x1 (0,12,6)\n2x1 (0,11,6)\n1x6 (7,13,7)\n6x2 (2,11,7)\n6x1 (1,18,7)\n1x1 (1,17,7)\n1x4 (1,13,7)\n1x6 (0,13,7)\n2x2 (0,11,7)\n1x2 (7,17,8)\n1x1 (7,16,8)\n2x2 (7,14,8)\n1x2 (7,12,8)\n1x1 (6,18,8)\n4x1 (2,18,8)\n6x2 (1,16,8)\n6x2 (1,14,8)\n6x2 (1,12,8)\n2x1 (0,18,8)\n1x6 (0,12,8)\n2x6 (6,13,9)\n2x1 (6,12,9)\n2x6 (4,13,9)\n2x6 (2,13,9)\n4x1 (2,12,9)\n1x1 (1,18,9)\n1x6 (1,12,9)\n1x2 (7,17,10)\n6x2 (1,17,10)\n6x2 (2,17,11)\n1x2 (1,17,11)\n1x2 (7,17,12)\n6x2 (1,17,12)\n6x2 (2,17,13)\n1x2 (1,17,13)\n1x2 (7,17,14)\n6x2 (1,17,14)\n6x2 (2,17,15)\n1x2 (1,17,15)\n1x2 (7,18,16)\n6x2 (1,18,16)\n6x2 (2,18,17)\n1x2 (1,18,17)\n"
|
36 |
+
},
|
37 |
+
"chair-2": {
|
38 |
+
"prompt": "Compact chair with a tall backrest and serrated seat.",
|
39 |
+
"temperature": 0.6,
|
40 |
+
"seed": 42,
|
41 |
+
"output_img": "60790035c8126a677645b4fdaedbc34.png",
|
42 |
+
"output_txt": "1x2 (7,17,0)\n1x2 (7,13,0)\n2x2 (0,17,0)\n2x2 (0,13,0)\n1x2 (7,17,1)\n1x2 (7,13,1)\n2x2 (0,17,1)\n2x2 (0,13,1)\n1x1 (7,18,2)\n1x6 (7,12,2)\n2x2 (0,17,2)\n2x2 (0,13,2)\n1x2 (7,17,3)\n1x2 (7,12,3)\n2x2 (0,17,3)\n2x2 (0,12,3)\n1x2 (7,17,4)\n1x2 (7,12,4)\n2x2 (0,17,4)\n2x2 (0,12,4)\n1x2 (7,17,5)\n1x2 (7,12,5)\n2x2 (0,17,5)\n2x2 (0,12,5)\n1x1 (7,18,6)\n1x6 (7,12,6)\n4x1 (3,17,6)\n4x1 (3,13,6)\n1x1 (2,17,6)\n1x1 (2,13,6)\n2x1 (0,18,6)\n2x6 (0,12,6)\n1x1 (7,18,7)\n1x1 (7,12,7)\n6x1 (2,17,7)\n6x1 (2,13,7)\n2x1 (0,18,7)\n2x6 (0,12,7)\n1x1 (7,18,8)\n1x1 (7,12,8)\n2x1 (0,18,8)\n2x1 (0,12,8)\n1x8 (7,11,9)\n1x1 (6,18,9)\n1x1 (6,17,9)\n1x6 (6,11,9)\n4x1 (2,18,9)\n4x1 (2,11,9)\n2x6 (0,13,9)\n2x2 (0,11,9)\n1x2 (7,17,10)\n2x6 (6,11,10)\n1x6 (5,11,10)\n2x6 (3,11,10)\n6x2 (1,17,10)\n2x6 (1,11,10)\n1x1 (0,18,10)\n1x6 (0,12,10)\n1x1 (7,18,11)\n6x1 (1,18,11)\n1x2 (7,18,12)\n1x2 (6,18,12)\n4x2 (2,18,12)\n1x1 (1,18,12)\n1x1 (7,18,13)\n6x1 (2,19,13)\n1x1 (1,19,13)\n6x1 (1,18,13)\n1x2 (7,18,14)\n6x2 (1,18,14)\n6x2 (2,18,15)\n1x2 (1,18,15)\n1x2 (7,18,16)\n6x2 (1,18,16)\n1x2 (5,18,17)\n2x2 (3,18,17)\n"
|
43 |
+
}
|
44 |
+
}
|