From bd1b7e66c8c5bb9bfc77b0b117c9e24bdbfdb241 Mon Sep 17 00:00:00 2001 From: xiangsilian Date: Tue, 5 May 2026 21:44:42 +0800 Subject: [PATCH] save code --- .claude/settings.local.json | 11 + python/README.md | 146 ++ python/requirements.txt | 7 + python/server/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 134 bytes .../__pycache__/index_map.cpython-312.pyc | Bin 0 -> 3034 bytes .../server/__pycache__/mesh.cpython-312.pyc | Bin 0 -> 3306 bytes python/server/assets/face_picture_3dmax.obj | 2279 +++++++++++++++++ python/server/effects/1.png | Bin 0 -> 7334 bytes python/server/effects/11.png | Bin 0 -> 4224 bytes python/server/effects/12.png | Bin 0 -> 4466 bytes python/server/effects/13.png | Bin 0 -> 4429 bytes python/server/effects/14.png | Bin 0 -> 1984 bytes python/server/effects/21.png | Bin 0 -> 4079 bytes python/server/effects/23.png | Bin 0 -> 1852 bytes python/server/effects/24.png | Bin 0 -> 5665 bytes python/server/effects/26.png | Bin 0 -> 9154 bytes python/server/effects/27.png | Bin 0 -> 1882 bytes python/server/effects/32.png | Bin 0 -> 2940 bytes python/server/effects/37.png | Bin 0 -> 5274 bytes python/server/effects/4.png | Bin 0 -> 14879 bytes python/server/effects/40.png | Bin 0 -> 5239 bytes python/server/effects/45.png | Bin 0 -> 8319 bytes python/server/effects/48.png | Bin 0 -> 1632 bytes python/server/effects/49.png | Bin 0 -> 8727 bytes python/server/effects/5.png | Bin 0 -> 7804 bytes python/server/effects/53.png | Bin 0 -> 4328 bytes python/server/effects/56.png | Bin 0 -> 4316 bytes python/server/effects/59.png | Bin 0 -> 3782 bytes python/server/effects/6.png | Bin 0 -> 4814 bytes python/server/effects/62.png | Bin 0 -> 5009 bytes python/server/effects/65.png | Bin 0 -> 5117 bytes python/server/effects/68.png | Bin 0 -> 6173 bytes python/server/effects/7.png | Bin 0 -> 7259 bytes python/server/effects/71.png | Bin 0 -> 5725 bytes python/server/effects/76.png | Bin 0 -> 2327 bytes python/server/effects/77.png | Bin 0 -> 2253 bytes python/server/effects/78.png | Bin 0 -> 2590 bytes python/server/effects/80.png | Bin 0 -> 2103 bytes python/server/effects/81.png | Bin 0 -> 3275 bytes python/server/effects/82.png | Bin 0 -> 5111 bytes python/server/face_renderer.py | 312 +++ python/server/index_map.py | 61 + python/server/main.py | 62 + python/server/mesh.py | 75 + 45 files changed, 2953 insertions(+) create mode 100644 .claude/settings.local.json create mode 100644 python/README.md create mode 100644 python/requirements.txt create mode 100644 python/server/__init__.py create mode 100644 python/server/__pycache__/__init__.cpython-312.pyc create mode 100644 python/server/__pycache__/index_map.cpython-312.pyc create mode 100644 python/server/__pycache__/mesh.cpython-312.pyc create mode 100644 python/server/assets/face_picture_3dmax.obj create mode 100644 python/server/effects/1.png create mode 100644 python/server/effects/11.png create mode 100644 python/server/effects/12.png create mode 100644 python/server/effects/13.png create mode 100644 python/server/effects/14.png create mode 100644 python/server/effects/21.png create mode 100644 python/server/effects/23.png create mode 100644 python/server/effects/24.png create mode 100644 python/server/effects/26.png create mode 100644 python/server/effects/27.png create mode 100644 python/server/effects/32.png create mode 100644 python/server/effects/37.png create mode 100644 python/server/effects/4.png create mode 100644 python/server/effects/40.png create mode 100644 python/server/effects/45.png create mode 100644 python/server/effects/48.png create mode 100644 python/server/effects/49.png create mode 100644 python/server/effects/5.png create mode 100644 python/server/effects/53.png create mode 100644 python/server/effects/56.png create mode 100644 python/server/effects/59.png create mode 100644 python/server/effects/6.png create mode 100644 python/server/effects/62.png create mode 100644 python/server/effects/65.png create mode 100644 python/server/effects/68.png create mode 100644 python/server/effects/7.png create mode 100644 python/server/effects/71.png create mode 100644 python/server/effects/76.png create mode 100644 python/server/effects/77.png create mode 100644 python/server/effects/78.png create mode 100644 python/server/effects/80.png create mode 100644 python/server/effects/81.png create mode 100644 python/server/effects/82.png create mode 100644 python/server/face_renderer.py create mode 100644 python/server/index_map.py create mode 100644 python/server/main.py create mode 100644 python/server/mesh.py diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..e2a98c8 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,11 @@ +{ + "permissions": { + "allow": [ + "Bash(awk '/^vt / {print $2, $3}' D:/face_sdk/app/src/main/assets/face_picture_3dmax.obj)", + "Bash(awk 'BEGIN{minu=99;maxu=-99;minv=99;maxv=-99} {if\\($1maxu\\)maxu=$1; if\\($2maxv\\)maxv=$2} END{print \"u:\",minu,maxu,\" v:\",minv,maxv}')", + "Bash(python -c \"from PIL import Image; print\\(Image.open\\('D:/face_sdk/example/src/main/assets/pic/4ex.png'\\).size\\)\")", + "Bash(python -c ' *)", + "Bash(python -c \"import sys; print\\(sys.executable\\)\")" + ] + } +} diff --git a/python/README.md b/python/README.md new file mode 100644 index 0000000..8a97bfe --- /dev/null +++ b/python/README.md @@ -0,0 +1,146 @@ +# Face SDK Web 服务 + +把 Android Face SDK 的人脸贴图渲染逻辑迁移到 Python Web 服务:上传一张人物图 + 效果 ID, +返回叠加渲染后的 PNG。CPU 实现(OpenCV 仿射 warp + alpha 混合),不依赖 GPU。 + +--- + +## 渲染原理(与 Android SDK 一致) + +``` +input image ──► MediaPipe FaceLandmarker ──► 478 normalized landmarks + │ + ▼ + face_picture_3dmax.obj (468 顶点+UV / 852 三角形) + 每个 obj 顶点 i 的画面位置 = landmarks[INDEX_MAP[i]] + │ + ▼ + 每个三角形: + src = obj UV × effect 贴图尺寸 (在 512×512 effect 里) + dst = landmarks 像素位置 (在 input image 里) + cv2.getAffineTransform → cv2.warpAffine → alpha 混合 + │ + ▼ + output PNG(同原图尺寸) +``` + +`INDEX_MAP[468]` 同步自 `vulkan/hardcode_data.h::indexMap`,UV 的 V 翻转与 +`vulkan/FaceApp.cpp::LoadOBJ` 行为一致。 + +--- + +## 目录结构 + +``` +python/ +├── server/ +│ ├── main.py FastAPI 入口(/health /effects /render) +│ ├── face_renderer.py 渲染核心 +│ ├── mesh.py OBJ 解析 +│ ├── index_map.py OBJ vertex → MediaPipe landmark 映射 +│ ├── assets/ +│ │ ├── face_picture_3dmax.obj ← 来自 app/src/main/assets +│ │ └── face_landmarker.task ← 可选;不放则自动回退到 app/src/main/assets/ +│ └── effects/ +│ └── 1.png 512×512 RGBA 效果贴图,文件名是效果 ID(1-99) +└── requirements.txt +``` + +--- + +## 一次性安装 + +需要 Python 3.10–3.12(mediapipe 当前不支持 3.13)。 + +```powershell +# Windows PowerShell(或 cmd) +cd D:\face_sdk\python +python -m venv venv +.\venv\Scripts\Activate.ps1 # cmd 用 .\venv\Scripts\activate.bat +pip install --upgrade pip +pip install -r requirements.txt +``` + +```bash +# Linux / macOS +cd /path/to/face_sdk/python +python3 -m venv venv +source venv/bin/activate +pip install --upgrade pip +pip install -r requirements.txt +``` + +--- + +## 启动服务 + +```powershell +cd D:\face_sdk\python +.\venv\Scripts\Activate.ps1 +uvicorn server.main:app --host 0.0.0.0 --port 8000 +``` + +启动日志看到 `Application startup complete.` 即就绪。 + +--- + +## API + +### `GET /health` +```json +{"ok": true} +``` + +### `GET /effects` +返回当前 `server/effects/` 下存在的效果 ID(按 `.png` 文件名提取,1–99): +```json +{"effects": [1]} +``` + +### `POST /render` +- form-data: + - `image`: 文件(jpeg / png / webp,≤ 20MB) + - `effect_id`: 整数(1–99,必须在 `/effects` 列表内) +- 成功:`200`,`Content-Type: image/png`,body 是 PNG 字节 +- 没检测到人脸:`400 {"error":"no_face"}` +- effect_id 不存在:`404` +- 参数错误(图非法 / 太大 / id 越界):`400` + +#### curl 示例 + +```bash +curl -X POST http://localhost:8000/render \ + -F image=@/path/to/photo.jpg \ + -F effect_id=1 \ + --output result.png +``` + +#### Python 示例 + +```python +import requests +files = {"image": open("photo.jpg", "rb")} +data = {"effect_id": 1} +r = requests.post("http://localhost:8000/render", files=files, data=data) +r.raise_for_status() +open("result.png", "wb").write(r.content) +``` + +--- + +## 添加新效果 + +把一张 512×512 的 RGBA PNG 放到 `python/server/effects/.png`(`` 是 1–99 的整数)。 +服务下次响应 `/effects` 时会自动列出;首次被请求时按需载入并缓存内存。 + +PNG 必须有 alpha 通道——透明区域不会盖到原图上。 + +--- + +## 已知限制 + +- 纯 2D 仿射 warp,与 Android SDK 行为一致:人脸侧面角度大时贴图会拉伸。 +- MediaPipe FaceLandmarker 每次 `detect()` 不保证多线程并发安全,服务用锁串行化。 + 单进程同步部署够用;要更高并发请用多 worker 或前置队列。 +- 单张 4K 图渲染约 100–300ms(852 三角形 × `cv2.warpAffine`);如需更快可改成 + `cv2.remap` 一次性贴整脸,但需要更多代码。 diff --git a/python/requirements.txt b/python/requirements.txt new file mode 100644 index 0000000..dcd3160 --- /dev/null +++ b/python/requirements.txt @@ -0,0 +1,7 @@ +fastapi>=0.110 +uvicorn[standard]>=0.27 +python-multipart>=0.0.9 +mediapipe>=0.10.14 +opencv-python>=4.9 +pillow>=10.0 +numpy>=1.26,<2.0 diff --git a/python/server/__init__.py b/python/server/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/python/server/__pycache__/__init__.cpython-312.pyc b/python/server/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..75959b3287793894640b26443696f221dcc7e8ac GIT binary patch literal 134 zcmX@j%ge<81O^{|W`gL)AOanHW&w&!XQ*V*Wb|9fP{ah}eFmxdrRri8la`pA8eg1} z9aB(Ql98VmQ=D2gjEsy$ H%s>_ZlBFKs literal 0 HcmV?d00001 diff --git a/python/server/__pycache__/index_map.cpython-312.pyc b/python/server/__pycache__/index_map.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79fbb724e019f71acd409293390821f1759a4f05 GIT binary patch literal 3034 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 literal 0 HcmV?d00001 diff --git a/python/server/assets/face_picture_3dmax.obj b/python/server/assets/face_picture_3dmax.obj new file mode 100644 index 0000000..a4c9eac --- /dev/null +++ b/python/server/assets/face_picture_3dmax.obj @@ -0,0 +1,2279 @@ +# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware +# ļ:02.12.2025 18:33:58 + +mtllib 1202.mtl + +# +# object default +# + +v 0.1676 0.5092 0.2591 +v 0.1771 0.5141 0.1685 +v 0.1865 0.4618 0.1361 +v 0.4670 0.7575 -0.0631 +v 0.4671 0.7458 -0.0670 +v 0.4379 0.7395 -0.0631 +v 0.3892 0.5426 -0.0007 +v 0.3631 0.5501 0.0018 +v 0.3648 0.5691 -0.0028 +v 0.4383 0.7547 -0.0594 +v 0.4080 0.7493 -0.0466 +v 0.4142 0.5453 -0.0172 +v 0.3929 0.5585 -0.0115 +v 0.3953 0.5777 -0.0249 +v 0.2693 0.3555 -0.0041 +v 0.3317 0.3441 -0.0417 +v 0.3176 0.2901 -0.0208 +v 0.4645 0.9425 0.0141 +v 0.4131 0.9359 0.0208 +v 0.4148 0.9524 0.0567 +v 0.2764 0.5811 0.0178 +v 0.2618 0.6372 0.0203 +v 0.3218 0.6083 -0.0036 +v 0.4130 0.7599 -0.0441 +v 0.3882 0.7597 -0.0267 +v 0.4716 0.4160 -0.0756 +v 0.4717 0.3448 -0.0701 +v 0.3976 0.3432 -0.0630 +v 0.3969 0.6604 -0.0717 +v 0.4082 0.6504 -0.0986 +v 0.4081 0.6340 -0.0898 +v 0.3866 0.8650 0.0146 +v 0.3576 0.8424 0.0268 +v 0.3437 0.8641 0.0496 +v 0.3940 0.7654 -0.0259 +v 0.3753 0.7689 -0.0041 +v 0.4042 0.7765 -0.0144 +v 0.3997 0.7722 -0.0205 +v 0.3858 0.7742 -0.0038 +v 0.3656 0.7335 -0.0192 +v 0.3465 0.7519 0.0005 +v 0.3297 0.5547 0.0078 +v 0.2951 0.5537 0.0195 +v 0.3330 0.8122 0.0361 +v 0.3121 0.7799 0.0363 +v 0.2817 0.7829 0.0643 +v 0.4327 0.8532 -0.0060 +v 0.4654 0.8552 -0.0070 +v 0.4656 0.8296 -0.0366 +v 0.3696 0.7768 0.0149 +v 0.3665 0.7770 0.0190 +v 0.3761 0.7887 0.0050 +v 0.3077 0.4839 0.0049 +v 0.2906 0.4595 -0.0031 +v 0.2739 0.4710 0.0089 +v 0.3790 0.4711 -0.0057 +v 0.3737 0.4919 0.0003 +v 0.3911 0.5057 0.0066 +v 0.3754 0.8206 0.0083 +v 0.2726 0.8255 0.1227 +v 0.2492 0.7539 0.0989 +v 0.3648 0.6781 -0.0133 +v 0.3913 0.7208 -0.0338 +v 0.4049 0.6867 -0.0353 +v 0.1839 0.3975 0.1474 +v 0.2000 0.4179 0.0893 +v 0.2271 0.3808 0.0385 +v 0.4461 0.6108 -0.1335 +v 0.4449 0.6420 -0.1470 +v 0.4683 0.6424 -0.1505 +v 0.3130 0.5174 0.0122 +v 0.3092 0.5328 0.0113 +v 0.3340 0.5345 0.0034 +v 0.3805 0.7832 0.0001 +v 0.3891 0.8008 -0.0126 +v 0.3002 0.6720 -0.0008 +v 0.2473 0.6924 0.0531 +v 0.4243 0.8807 0.0009 +v 0.4652 0.8852 -0.0044 +v 0.4008 0.8398 -0.0021 +v 0.3934 0.7913 -0.0180 +v 0.4090 0.8158 -0.0252 +v 0.4368 0.8081 -0.0399 +v 0.4355 0.8259 -0.0348 +v 0.3387 0.7021 -0.0061 +v 0.3413 0.6423 -0.0146 +v 0.3707 0.9171 0.0457 +v 0.4398 0.4946 -0.0439 +v 0.4163 0.4924 -0.0098 +v 0.4205 0.5208 -0.0087 +v 0.3286 0.4800 -0.0027 +v 0.3507 0.4822 -0.0044 +v 0.3507 0.4573 -0.0138 +v 0.2650 0.4848 0.0259 +v 0.2885 0.4959 0.0245 +v 0.2953 0.4902 0.0145 +v 0.4299 0.5952 -0.0907 +v 0.4478 0.5842 -0.1103 +v 0.4469 0.5590 -0.0919 +v 0.2100 0.3506 0.0899 +v 0.4704 0.4907 -0.0625 +v 0.4708 0.4538 -0.0666 +v 0.2438 0.5706 0.0425 +v 0.2694 0.5454 0.0357 +v 0.2547 0.5342 0.0489 +v 0.4147 0.4479 -0.0578 +v 0.4381 0.6925 -0.0621 +v 0.4358 0.6881 -0.0632 +v 0.3997 0.6049 -0.0340 +v 0.3666 0.5924 -0.0138 +v 0.4158 0.6704 -0.0715 +v 0.4240 0.6662 -0.0985 +v 0.4162 0.6618 -0.1040 +v 0.3915 0.5162 0.0115 +v 0.3762 0.5164 0.0068 +v 0.3827 0.5290 0.0029 +v 0.4015 0.6264 -0.0480 +v 0.3951 0.6468 -0.0647 +v 0.2745 0.8529 0.1747 +v 0.3121 0.8883 0.1365 +v 0.4156 0.5873 -0.0517 +v 0.3094 0.4427 -0.0210 +v 0.2958 0.4235 -0.0338 +v 0.2595 0.4320 -0.0112 +v 0.4257 0.6190 -0.1166 +v 0.3369 0.8887 0.0738 +v 0.3553 0.8012 0.0189 +v 0.3268 0.5785 0.0047 +v 0.2483 0.5082 0.0545 +v 0.2680 0.5023 0.0429 +v 0.2444 0.4142 0.0007 +v 0.4447 0.6760 -0.1132 +v 0.4468 0.6819 -0.0886 +v 0.4518 0.6855 -0.0880 +v 0.2345 0.4506 0.0166 +v 0.2186 0.4376 0.0384 +v 0.2080 0.4730 0.0733 +v 0.3758 0.7767 0.0109 +v 0.3724 0.7765 0.0115 +v 0.3860 0.7805 -0.0004 +v 0.2017 0.5181 0.1021 +v 0.1794 0.5700 0.1817 +v 0.2078 0.6235 0.0945 +v 0.2264 0.5516 0.0656 +v 0.4481 0.6677 -0.1374 +v 0.4565 0.6808 -0.1238 +v 0.4680 0.6820 -0.1255 +v 0.3186 0.7336 0.0088 +v 0.3551 0.5186 0.0035 +v 0.3600 0.5332 0.0009 +v 0.4362 0.7131 -0.0588 +v 0.4161 0.9117 0.0047 +v 0.3756 0.6237 -0.0222 +v 0.3370 0.7750 0.0229 +v 0.4334 0.6829 -0.0627 +v 0.2232 0.5152 0.0750 +v 0.2488 0.4835 0.0338 +v 0.3185 0.4537 -0.0130 +v 0.3124 0.8326 0.0644 +v 0.2574 0.4627 0.0097 +v 0.1892 0.6268 0.1920 +v 0.2004 0.5675 0.0971 +v 0.4176 0.7696 -0.0389 +v 0.4403 0.7685 -0.0495 +v 0.3885 0.6596 -0.0216 +v 0.3968 0.6721 -0.0561 +v 0.4127 0.6839 -0.0509 +v 0.3910 0.6586 -0.0486 +v 0.2811 0.7127 0.0235 +v 0.3801 0.7717 -0.0038 +v 0.3058 0.8611 0.0987 +v 0.3436 0.9132 0.1068 +v 0.3766 0.9355 0.0767 +v 0.2857 0.4006 -0.0310 +v 0.3413 0.4028 -0.0575 +v 0.4461 0.5307 -0.0678 +v 0.4702 0.5253 -0.0786 +v 0.2170 0.6766 0.1074 +v 0.3464 0.4269 -0.0501 +v 0.4055 0.4113 -0.0715 +v 0.3989 0.7829 -0.0152 +v 0.4124 0.7997 -0.0300 +v 0.1829 0.6285 0.2903 +v 0.4662 0.7941 -0.0388 +v 0.4395 0.7914 -0.0353 +v 0.4667 0.7799 -0.0380 +v 0.4429 0.7777 -0.0344 +v 0.3334 0.5197 0.0053 +v 0.4044 0.7768 -0.0132 +v 0.4168 0.7866 -0.0268 +v 0.3914 0.7770 0.0008 +v 0.2412 0.7896 0.1540 +v 0.2439 0.8140 0.2214 +v 0.2163 0.7403 0.1861 +v 0.2171 0.7611 0.2620 +v 0.4046 0.6684 -0.0743 +v 0.4218 0.7757 -0.0259 +v 0.4693 0.5807 -0.1203 +v 0.4645 0.9176 -0.0027 +v 0.4427 0.7770 -0.0354 +v 0.3002 0.5130 0.0210 +v 0.2904 0.5279 0.0232 +v 0.1733 0.5677 0.2835 +v 0.3888 0.2791 -0.0510 +v 0.4062 0.6759 -0.0606 +v 0.3911 0.7769 -0.0000 +v 0.3491 0.4463 -0.0240 +v 0.4591 0.6886 -0.0877 +v 0.3948 0.4651 -0.0194 +v 0.4693 0.5547 -0.0987 +v 0.2793 0.5182 0.0339 +v 0.2917 0.5082 0.0285 +v 0.2830 0.5012 0.0372 +v 0.4253 0.6445 -0.1239 +v 0.4322 0.6630 -0.1245 +v 0.4292 0.5259 -0.0266 +v 0.1712 0.4480 0.2091 +v 0.4299 0.5441 -0.0501 +v 0.4302 0.5711 -0.0722 +v 0.4679 0.6942 -0.0697 +v 0.4487 0.6788 -0.1199 +v 0.4677 0.7135 -0.0618 +v 0.4672 0.7696 -0.0536 +v 0.4666 0.7789 -0.0387 +v 0.4143 0.6117 -0.0684 +v 0.3989 0.5145 0.0114 +v 0.3979 0.5234 0.0058 +v 0.4074 0.5155 0.0073 +v 0.4330 0.6672 -0.1115 +v 0.4015 0.4957 0.0009 +v 0.3750 0.8914 0.0272 +v 0.4221 0.7771 -0.0248 +v 0.1977 0.6930 0.2835 +v 0.2017 0.6854 0.1930 +v 0.4680 0.6685 -0.1399 +v 0.2263 0.7213 0.1205 +v 0.4161 0.6751 -0.0607 +v 0.4679 0.6893 -0.0895 +v 0.4217 0.6803 -0.0551 +v 0.2780 0.4493 -0.0086 +v 0.4070 0.5352 -0.0034 +v 0.4134 0.5615 -0.0359 +v 0.2270 0.4800 0.0463 +v 0.7744 0.5149 0.2502 +v 0.7717 0.4527 0.2009 +v 0.7564 0.4666 0.1289 +v 0.4961 0.7564 -0.0603 +v 0.4968 0.7409 -0.0641 +v 0.5513 0.5446 -0.0028 +v 0.5470 0.5601 -0.0137 +v 0.5759 0.5717 -0.0057 +v 0.5217 0.7633 -0.0460 +v 0.5265 0.7526 -0.0487 +v 0.5263 0.5464 -0.0187 +v 0.5258 0.5628 -0.0376 +v 0.5440 0.5794 -0.0271 +v 0.5326 0.5370 -0.0051 +v 0.6749 0.3576 -0.0091 +v 0.6914 0.3169 0.0245 +v 0.6266 0.2923 -0.0250 +v 0.4644 0.9578 0.0484 +v 0.5151 0.9534 0.0552 +v 0.6655 0.5852 0.0127 +v 0.6148 0.5816 0.0010 +v 0.6177 0.6115 -0.0074 +v 0.5414 0.7702 -0.0285 +v 0.5470 0.7642 -0.0296 +v 0.5384 0.4118 -0.0725 +v 0.5462 0.3442 -0.0649 +v 0.5404 0.6625 -0.0737 +v 0.5420 0.6489 -0.0668 +v 0.5294 0.6356 -0.0915 +v 0.5463 0.8663 0.0123 +v 0.5572 0.8928 0.0248 +v 0.5904 0.8660 0.0460 +v 0.5546 0.7769 -0.0072 +v 0.5597 0.7746 -0.0078 +v 0.5303 0.7798 -0.0166 +v 0.5433 0.7812 -0.0029 +v 0.5494 0.7797 -0.0068 +v 0.5895 0.7566 -0.0036 +v 0.6114 0.5583 0.0040 +v 0.6029 0.8160 0.0321 +v 0.6222 0.8358 0.0597 +v 0.6549 0.7875 0.0586 +v 0.4990 0.8532 -0.0067 +v 0.4972 0.8271 -0.0358 +v 0.5660 0.7828 0.0113 +v 0.5545 0.7887 -0.0031 +v 0.5593 0.7932 0.0014 +v 0.6346 0.4869 0.0005 +v 0.6476 0.4942 0.0098 +v 0.6703 0.4744 0.0038 +v 0.5633 0.4724 -0.0083 +v 0.5397 0.4974 -0.0014 +v 0.5495 0.5072 0.0040 +v 0.5582 0.8234 0.0052 +v 0.5322 0.8411 -0.0042 +v 0.6630 0.8297 0.1167 +v 0.6946 0.7937 0.1473 +v 0.6879 0.7587 0.0926 +v 0.5719 0.6809 -0.0160 +v 0.5485 0.6618 -0.0238 +v 0.5309 0.6890 -0.0369 +v 0.7595 0.4019 0.1394 +v 0.7337 0.3543 0.0828 +v 0.7165 0.3837 0.0323 +v 0.4907 0.6108 -0.1342 +v 0.4686 0.6085 -0.1422 +v 0.6285 0.5216 0.0079 +v 0.6083 0.5236 0.0014 +v 0.6071 0.5388 -0.0005 +v 0.5410 0.7954 -0.0205 +v 0.5457 0.8047 -0.0151 +v 0.6384 0.6759 -0.0051 +v 0.6567 0.7166 0.0184 +v 0.6916 0.6970 0.0471 +v 0.5070 0.8820 -0.0003 +v 0.5247 0.8179 -0.0270 +v 0.5220 0.8031 -0.0318 +v 0.4960 0.8096 -0.0407 +v 0.4663 0.8117 -0.0427 +v 0.5989 0.7052 -0.0097 +v 0.5967 0.6454 -0.0179 +v 0.5548 0.9369 0.0738 +v 0.5614 0.9182 0.0429 +v 0.5700 0.7367 -0.0225 +v 0.5441 0.7234 -0.0362 +v 0.5007 0.4954 -0.0448 +v 0.5116 0.5273 -0.0278 +v 0.5196 0.5223 -0.0099 +v 0.6141 0.4824 -0.0067 +v 0.6251 0.4559 -0.0172 +v 0.5922 0.4593 -0.0170 +v 0.6544 0.5000 0.0197 +v 0.5084 0.5956 -0.0919 +v 0.5087 0.5722 -0.0734 +v 0.4922 0.5595 -0.0925 +v 0.5285 0.4483 -0.0589 +v 0.6986 0.5752 0.0364 +v 0.7160 0.5567 0.0593 +v 0.6877 0.5382 0.0432 +v 0.5248 0.4937 -0.0115 +v 0.5480 0.4664 -0.0217 +v 0.5237 0.6857 -0.0523 +v 0.4998 0.6891 -0.0639 +v 0.5391 0.6066 -0.0361 +v 0.5629 0.6260 -0.0248 +v 0.5726 0.5943 -0.0166 +v 0.5205 0.6722 -0.0730 +v 0.5317 0.6708 -0.0760 +v 0.5198 0.6630 -0.1055 +v 0.5495 0.5184 0.0091 +v 0.5428 0.5258 0.0035 +v 0.5577 0.5312 0.0005 +v 0.5364 0.6280 -0.0500 +v 0.5238 0.6125 -0.0700 +v 0.6281 0.8636 0.0938 +v 0.6213 0.8908 0.1315 +v 0.5232 0.5884 -0.0534 +v 0.6352 0.4452 -0.0248 +v 0.6668 0.4522 -0.0132 +v 0.6867 0.4338 -0.0162 +v 0.4918 0.6432 -0.1477 +v 0.5114 0.6456 -0.1254 +v 0.5115 0.6200 -0.1179 +v 0.5553 0.2800 -0.0530 +v 0.5789 0.8055 0.0152 +v 0.5774 0.5527 -0.0012 +v 0.6946 0.5128 0.0488 +v 0.6953 0.4875 0.0281 +v 0.6793 0.4888 0.0205 +v 0.7019 0.4160 -0.0048 +v 0.6604 0.4020 -0.0352 +v 0.6497 0.4245 -0.0376 +v 0.4912 0.6765 -0.1137 +v 0.4866 0.6789 -0.1205 +v 0.4840 0.6866 -0.0884 +v 0.7115 0.4529 0.0107 +v 0.7171 0.4838 0.0400 +v 0.7369 0.4771 0.0664 +v 0.5594 0.7825 0.0073 +v 0.5439 0.7814 -0.0022 +v 0.5485 0.7852 -0.0035 +v 0.7270 0.4401 0.0327 +v 0.7415 0.5225 0.0958 +v 0.7419 0.5721 0.0907 +v 0.7620 0.5753 0.1738 +v 0.7328 0.6288 0.0872 +v 0.4875 0.6683 -0.1379 +v 0.4904 0.5846 -0.1110 +v 0.6180 0.7377 0.0042 +v 0.5643 0.5195 0.0040 +v 0.5813 0.5365 -0.0023 +v 0.4993 0.7142 -0.0598 +v 0.5151 0.9128 0.0035 +v 0.5984 0.7794 0.0184 +v 0.4892 0.6825 -0.0891 +v 0.5669 0.4936 -0.0026 +v 0.7203 0.5196 0.0686 +v 0.6533 0.4625 -0.0078 +v 0.5766 0.8444 0.0235 +v 0.5623 0.7825 0.0079 +v 0.7520 0.6314 0.1844 +v 0.5167 0.7730 -0.0406 +v 0.5400 0.6741 -0.0581 +v 0.5303 0.6776 -0.0624 +v 0.5353 0.7759 -0.0228 +v 0.6239 0.7833 0.0314 +v 0.5960 0.8909 0.0700 +v 0.6122 0.3457 -0.0448 +v 0.4938 0.5309 -0.0685 +v 0.6776 0.6411 0.0149 +v 0.5357 0.7863 -0.0175 +v 0.5982 0.4280 -0.0528 +v 0.6040 0.4038 -0.0603 +v 0.5174 0.7896 -0.0284 +v 0.7582 0.6342 0.2818 +v 0.7690 0.5736 0.2749 +v 0.4943 0.7922 -0.0363 +v 0.5854 0.5220 0.0003 +v 0.5304 0.7802 -0.0155 +v 0.5130 0.7792 -0.0265 +v 0.6597 0.8562 0.1685 +v 0.7211 0.7447 0.1787 +v 0.6912 0.8179 0.2141 +v 0.5286 0.6525 -0.1003 +v 0.5129 0.7787 -0.0275 +v 0.5682 0.7832 0.0151 +v 0.5171 0.9373 0.0194 +v 0.4939 0.7699 -0.0503 +v 0.6871 0.4657 0.0044 +v 0.6327 0.5371 0.0068 +v 0.6520 0.5319 0.0182 +v 0.6466 0.5575 0.0148 +v 0.7649 0.5192 0.1610 +v 0.4720 0.2776 -0.0588 +v 0.5948 0.4476 -0.0270 +v 0.4767 0.6883 -0.0879 +v 0.6595 0.5052 0.0319 +v 0.6627 0.5227 0.0286 +v 0.6748 0.5067 0.0376 +v 0.5094 0.5448 -0.0511 +v 0.7436 0.4215 0.0823 +v 0.5889 0.9153 0.1029 +v 0.4976 0.6930 -0.0628 +v 0.5039 0.6639 -0.1257 +v 0.5413 0.5168 0.0092 +v 0.5031 0.6686 -0.1125 +v 0.5327 0.5174 0.0054 +v 0.4791 0.6807 -0.1241 +v 0.7373 0.6903 0.1852 +v 0.7417 0.6977 0.2756 +v 0.5128 0.6674 -0.0998 +v 0.7229 0.6814 0.1002 +v 0.7119 0.7257 0.1136 +v 0.5199 0.6768 -0.0623 +v 0.5147 0.6813 -0.0562 +v 0.6730 0.5500 0.0303 +v 0.5024 0.6834 -0.0634 +v 0.7196 0.7647 0.2546 +v 0.6510 0.5129 0.0235 +v 0.2529 0.3140 0.0303 +v 0.5906 0.4839 -0.0078 +v 0.5462 0.6605 -0.0508 +v 0.4910 0.7798 -0.0353 +v 0.4916 0.7787 -0.0363 +v 0.6419 0.5178 0.0164 +# 468 vertices + + +vt 0.0147 0.4668 0.0000 +vt 0.1049 0.4716 0.0000 +vt 0.1292 0.5313 0.0000 +vt 0.5005 0.2458 0.0000 +vt 0.5005 0.2570 0.0000 +vt 0.4745 0.2628 0.0000 +vt 0.3859 0.4818 0.0000 +vt 0.3646 0.4669 0.0000 +vt 0.3693 0.4471 0.0000 +vt 0.4759 0.2479 0.0000 +vt 0.4423 0.2555 0.0000 +vt 0.4120 0.4846 0.0000 +vt 0.3932 0.4639 0.0000 +vt 0.4003 0.4442 0.0000 +vt 0.2789 0.6680 0.0000 +vt 0.3509 0.6923 0.0000 +vt 0.3233 0.7432 0.0000 +vt 0.5005 0.0338 0.0000 +vt 0.4441 0.0397 0.0000 +vt 0.4312 0.0048 0.0000 +vt 0.2866 0.4184 0.0000 +vt 0.2814 0.3609 0.0000 +vt 0.3366 0.3971 0.0000 +vt 0.4479 0.2441 0.0000 +vt 0.4187 0.2424 0.0000 +vt 0.5013 0.6285 0.0000 +vt 0.5009 0.7040 0.0000 +vt 0.4227 0.7019 0.0000 +vt 0.4367 0.3599 0.0000 +vt 0.4546 0.3734 0.0000 +vt 0.4474 0.3880 0.0000 +vt 0.4127 0.1154 0.0000 +vt 0.3776 0.1397 0.0000 +vt 0.3570 0.1118 0.0000 +vt 0.4245 0.2358 0.0000 +vt 0.3990 0.2257 0.0000 +vt 0.4291 0.2176 0.0000 +vt 0.4278 0.2257 0.0000 +vt 0.4085 0.2183 0.0000 +vt 0.3920 0.2671 0.0000 +vt 0.3702 0.2432 0.0000 +vt 0.3340 0.4539 0.0000 +vt 0.2997 0.4488 0.0000 +vt 0.3483 0.1726 0.0000 +vt 0.3277 0.2091 0.0000 +vt 0.2881 0.2020 0.0000 +vt 0.4647 0.1244 0.0000 +vt 0.5005 0.1223 0.0000 +vt 0.5005 0.1584 0.0000 +vt 0.3882 0.2060 0.0000 +vt 0.3842 0.2055 0.0000 +vt 0.4009 0.1949 0.0000 +vt 0.3240 0.5332 0.0000 +vt 0.3086 0.5596 0.0000 +vt 0.2893 0.5442 0.0000 +vt 0.3901 0.5544 0.0000 +vt 0.3855 0.5335 0.0000 +vt 0.3961 0.5202 0.0000 +vt 0.4023 0.1612 0.0000 +vt 0.2419 0.1475 0.0000 +vt 0.2356 0.2274 0.0000 +vt 0.3833 0.3293 0.0000 +vt 0.4165 0.2829 0.0000 +vt 0.4238 0.3222 0.0000 +vt 0.1094 0.6010 0.0000 +vt 0.1699 0.5849 0.0000 +vt 0.2225 0.6315 0.0000 +vt 0.4860 0.4115 0.0000 +vt 0.4924 0.3854 0.0000 +vt 0.5012 0.3858 0.0000 +vt 0.3136 0.4853 0.0000 +vt 0.3135 0.4704 0.0000 +vt 0.3372 0.4740 0.0000 +vt 0.4066 0.2006 0.0000 +vt 0.4228 0.1832 0.0000 +vt 0.3239 0.3285 0.0000 +vt 0.2580 0.2993 0.0000 +vt 0.4569 0.0982 0.0000 +vt 0.5005 0.0934 0.0000 +vt 0.4319 0.1411 0.0000 +vt 0.4280 0.1927 0.0000 +vt 0.4470 0.1698 0.0000 +vt 0.4744 0.1790 0.0000 +vt 0.4737 0.1615 0.0000 +vt 0.3593 0.2991 0.0000 +vt 0.3583 0.3638 0.0000 +vt 0.3901 0.0568 0.0000 +vt 0.4604 0.5378 0.0000 +vt 0.4215 0.5338 0.0000 +vt 0.4193 0.5091 0.0000 +vt 0.3461 0.5423 0.0000 +vt 0.3661 0.5430 0.0000 +vt 0.3662 0.5686 0.0000 +vt 0.2731 0.5238 0.0000 +vt 0.2948 0.5106 0.0000 +vt 0.3067 0.5212 0.0000 +vt 0.4582 0.4314 0.0000 +vt 0.4820 0.4394 0.0000 +vt 0.4781 0.4654 0.0000 +vt 0.1687 0.6591 0.0000 +vt 0.5006 0.5393 0.0000 +vt 0.5005 0.5826 0.0000 +vt 0.2482 0.4258 0.0000 +vt 0.2699 0.4542 0.0000 +vt 0.2515 0.4650 0.0000 +vt 0.4436 0.5938 0.0000 +vt 0.4655 0.3097 0.0000 +vt 0.4596 0.3179 0.0000 +vt 0.4055 0.4116 0.0000 +vt 0.3746 0.4209 0.0000 +vt 0.4472 0.3421 0.0000 +vt 0.4638 0.3541 0.0000 +vt 0.4621 0.3644 0.0000 +vt 0.3851 0.5111 0.0000 +vt 0.3696 0.5043 0.0000 +vt 0.3786 0.4937 0.0000 +vt 0.4170 0.3941 0.0000 +vt 0.4310 0.3714 0.0000 +vt 0.1987 0.1072 0.0000 +vt 0.2659 0.0727 0.0000 +vt 0.4255 0.4356 0.0000 +vt 0.3309 0.5828 0.0000 +vt 0.3224 0.6075 0.0000 +vt 0.2824 0.5897 0.0000 +vt 0.4691 0.4044 0.0000 +vt 0.3374 0.0828 0.0000 +vt 0.3767 0.1817 0.0000 +vt 0.3352 0.4294 0.0000 +vt 0.2436 0.4922 0.0000 +vt 0.2667 0.4989 0.0000 +vt 0.2640 0.6037 0.0000 +vt 0.4861 0.3510 0.0000 +vt 0.4776 0.3328 0.0000 +vt 0.4828 0.3273 0.0000 +vt 0.2509 0.5633 0.0000 +vt 0.2244 0.5712 0.0000 +vt 0.1957 0.5278 0.0000 +vt 0.3952 0.2075 0.0000 +vt 0.3920 0.2069 0.0000 +vt 0.4106 0.2053 0.0000 +vt 0.1759 0.4752 0.0000 +vt 0.1009 0.4117 0.0000 +vt 0.1954 0.3660 0.0000 +vt 0.2214 0.4448 0.0000 +vt 0.4894 0.3650 0.0000 +vt 0.4963 0.3512 0.0000 +vt 0.5013 0.3506 0.0000 +vt 0.3407 0.2632 0.0000 +vt 0.3509 0.4949 0.0000 +vt 0.3596 0.4824 0.0000 +vt 0.4679 0.2897 0.0000 +vt 0.4512 0.0662 0.0000 +vt 0.3857 0.3856 0.0000 +vt 0.3562 0.2113 0.0000 +vt 0.4558 0.3242 0.0000 +vt 0.2113 0.4830 0.0000 +vt 0.2544 0.5237 0.0000 +vt 0.3366 0.5693 0.0000 +vt 0.3182 0.1465 0.0000 +vt 0.2735 0.5527 0.0000 +vt 0.1012 0.3494 0.0000 +vt 0.1847 0.4235 0.0000 +vt 0.4508 0.2318 0.0000 +vt 0.4757 0.2315 0.0000 +vt 0.4010 0.3544 0.0000 +vt 0.4301 0.3460 0.0000 +vt 0.4367 0.3271 0.0000 +vt 0.4212 0.3580 0.0000 +vt 0.3021 0.2818 0.0000 +vt 0.4032 0.2219 0.0000 +vt 0.2912 0.1118 0.0000 +vt 0.3179 0.0469 0.0000 +vt 0.3723 0.0264 0.0000 +vt 0.3117 0.6281 0.0000 +vt 0.3711 0.6357 0.0000 +vt 0.4738 0.4975 0.0000 +vt 0.5008 0.5007 0.0000 +vt 0.1975 0.3082 0.0000 +vt 0.3746 0.6135 0.0000 +vt 0.4366 0.6327 0.0000 +vt 0.4299 0.2024 0.0000 +vt 0.4496 0.1861 0.0000 +vt 0.0053 0.3348 0.0000 +vt 0.5005 0.1954 0.0000 +vt 0.4749 0.1968 0.0000 +vt 0.5005 0.2115 0.0000 +vt 0.4768 0.2107 0.0000 +vt 0.3319 0.4878 0.0000 +vt 0.4328 0.2102 0.0000 +vt 0.4508 0.2000 0.0000 +vt 0.4135 0.2110 0.0000 +vt 0.1895 0.1824 0.0000 +vt 0.1298 0.1429 0.0000 +vt 0.1384 0.2290 0.0000 +vt 0.0685 0.1945 0.0000 +vt 0.4418 0.3514 0.0000 +vt 0.4494 0.2171 0.0000 +vt 0.5009 0.4400 0.0000 +vt 0.5005 0.0619 0.0000 +vt 0.4742 0.2157 0.0000 +vt 0.3008 0.4876 0.0000 +vt 0.2923 0.4722 0.0000 +vt 0.0005 0.4015 0.0000 +vt 0.4068 0.7707 0.0000 +vt 0.4363 0.3405 0.0000 +vt 0.4123 0.2121 0.0000 +vt 0.3686 0.5816 0.0000 +vt 0.4912 0.3214 0.0000 +vt 0.4097 0.5625 0.0000 +vt 0.5005 0.4679 0.0000 +vt 0.2791 0.4819 0.0000 +vt 0.2919 0.4918 0.0000 +vt 0.2827 0.4994 0.0000 +vt 0.4738 0.3832 0.0000 +vt 0.4791 0.3668 0.0000 +vt 0.4334 0.5056 0.0000 +vt 0.0543 0.5378 0.0000 +vt 0.4456 0.4851 0.0000 +vt 0.4515 0.4542 0.0000 +vt 0.5005 0.3015 0.0000 +vt 0.4916 0.3521 0.0000 +vt 0.5008 0.2886 0.0000 +vt 0.5005 0.2309 0.0000 +vt 0.5005 0.2127 0.0000 +vt 0.4341 0.4127 0.0000 +vt 0.3949 0.5126 0.0000 +vt 0.3922 0.5039 0.0000 +vt 0.4020 0.5117 0.0000 +vt 0.4750 0.3572 0.0000 +vt 0.4057 0.5296 0.0000 +vt 0.4019 0.0857 0.0000 +vt 0.4541 0.2102 0.0000 +vt 0.0273 0.2648 0.0000 +vt 0.1148 0.2863 0.0000 +vt 0.5011 0.3651 0.0000 +vt 0.1987 0.2586 0.0000 +vt 0.4424 0.3354 0.0000 +vt 0.5008 0.3208 0.0000 +vt 0.4437 0.3275 0.0000 +vt 0.2981 0.5717 0.0000 +vt 0.4023 0.4956 0.0000 +vt 0.4203 0.4658 0.0000 +vt 0.2287 0.5259 0.0000 +vt 0.9848 0.4692 0.0000 +vt 0.9459 0.5412 0.0000 +vt 0.8720 0.5338 0.0000 +vt 0.5265 0.2472 0.0000 +vt 0.5278 0.2623 0.0000 +vt 0.6153 0.4824 0.0000 +vt 0.6078 0.4648 0.0000 +vt 0.6324 0.4475 0.0000 +vt 0.5545 0.2426 0.0000 +vt 0.5596 0.2542 0.0000 +vt 0.5894 0.4851 0.0000 +vt 0.5805 0.4662 0.0000 +vt 0.6005 0.4447 0.0000 +vt 0.5981 0.4959 0.0000 +vt 0.7226 0.6706 0.0000 +vt 0.7602 0.7091 0.0000 +vt 0.6771 0.7445 0.0000 +vt 0.5005 0.0005 0.0000 +vt 0.5712 0.0054 0.0000 +vt 0.7164 0.4194 0.0000 +vt 0.6676 0.4301 0.0000 +vt 0.6652 0.3982 0.0000 +vt 0.5782 0.2337 0.0000 +vt 0.5835 0.2407 0.0000 +vt 0.5670 0.6338 0.0000 +vt 0.5793 0.7023 0.0000 +vt 0.5645 0.3606 0.0000 +vt 0.5700 0.3722 0.0000 +vt 0.5539 0.3888 0.0000 +vt 0.5906 0.1168 0.0000 +vt 0.6014 0.0873 0.0000 +vt 0.6464 0.1140 0.0000 +vt 0.5984 0.2198 0.0000 +vt 0.6026 0.2235 0.0000 +vt 0.5728 0.2157 0.0000 +vt 0.5891 0.2097 0.0000 +vt 0.5936 0.2159 0.0000 +vt 0.6318 0.2428 0.0000 +vt 0.6677 0.4541 0.0000 +vt 0.6550 0.1736 0.0000 +vt 0.6842 0.1482 0.0000 +vt 0.7142 0.2035 0.0000 +vt 0.5379 0.1252 0.0000 +vt 0.5294 0.1616 0.0000 +vt 0.6140 0.2039 0.0000 +vt 0.5958 0.1986 0.0000 +vt 0.6018 0.1939 0.0000 +vt 0.6771 0.5351 0.0000 +vt 0.6938 0.5232 0.0000 +vt 0.7137 0.5456 0.0000 +vt 0.6110 0.5558 0.0000 +vt 0.5943 0.5303 0.0000 +vt 0.6034 0.5215 0.0000 +vt 0.6001 0.1616 0.0000 +vt 0.5710 0.1421 0.0000 +vt 0.7597 0.1494 0.0000 +vt 0.8115 0.1846 0.0000 +vt 0.7662 0.2292 0.0000 +vt 0.6177 0.3301 0.0000 +vt 0.5999 0.3550 0.0000 +vt 0.5771 0.3224 0.0000 +vt 0.8905 0.6045 0.0000 +vt 0.8310 0.6625 0.0000 +vt 0.7787 0.6346 0.0000 +vt 0.5151 0.4121 0.0000 +vt 0.5009 0.4119 0.0000 +vt 0.6876 0.4855 0.0000 +vt 0.6697 0.4878 0.0000 +vt 0.6640 0.4736 0.0000 +vt 0.5748 0.1915 0.0000 +vt 0.5804 0.1824 0.0000 +vt 0.6785 0.3296 0.0000 +vt 0.7003 0.2837 0.0000 +vt 0.7442 0.3013 0.0000 +vt 0.5459 0.0983 0.0000 +vt 0.5564 0.1701 0.0000 +vt 0.5539 0.1850 0.0000 +vt 0.5284 0.1787 0.0000 +vt 0.5005 0.1772 0.0000 +vt 0.6430 0.3002 0.0000 +vt 0.6430 0.3646 0.0000 +vt 0.6303 0.0280 0.0000 +vt 0.6132 0.0590 0.0000 +vt 0.6097 0.2674 0.0000 +vt 0.5849 0.2832 0.0000 +vt 0.5402 0.5378 0.0000 +vt 0.5678 0.5055 0.0000 +vt 0.5815 0.5092 0.0000 +vt 0.6558 0.5438 0.0000 +vt 0.6657 0.5712 0.0000 +vt 0.6354 0.5697 0.0000 +vt 0.7059 0.5124 0.0000 +vt 0.5430 0.4322 0.0000 +vt 0.5497 0.4544 0.0000 +vt 0.5233 0.4656 0.0000 +vt 0.5587 0.5950 0.0000 +vt 0.7543 0.4271 0.0000 +vt 0.7807 0.4461 0.0000 +vt 0.7504 0.4667 0.0000 +vt 0.5788 0.5343 0.0000 +vt 0.5917 0.5639 0.0000 +vt 0.5647 0.3278 0.0000 +vt 0.5418 0.3174 0.0000 +vt 0.5956 0.4123 0.0000 +vt 0.6156 0.3864 0.0000 +vt 0.6264 0.4223 0.0000 +vt 0.5542 0.3419 0.0000 +vt 0.5591 0.3514 0.0000 +vt 0.5393 0.3648 0.0000 +vt 0.6157 0.5115 0.0000 +vt 0.6086 0.5039 0.0000 +vt 0.6221 0.4943 0.0000 +vt 0.5841 0.3948 0.0000 +vt 0.5672 0.4138 0.0000 +vt 0.7110 0.1141 0.0000 +vt 0.7358 0.0748 0.0000 +vt 0.5756 0.4364 0.0000 +vt 0.6724 0.5841 0.0000 +vt 0.7053 0.5733 0.0000 +vt 0.7220 0.5927 0.0000 +vt 0.5098 0.3851 0.0000 +vt 0.5277 0.3835 0.0000 +vt 0.5323 0.4048 0.0000 +vt 0.5945 0.7713 0.0000 +vt 0.6251 0.1815 0.0000 +vt 0.6365 0.4674 0.0000 +vt 0.7583 0.4933 0.0000 +vt 0.7484 0.5253 0.0000 +vt 0.7302 0.5250 0.0000 +vt 0.7398 0.6069 0.0000 +vt 0.6925 0.6304 0.0000 +vt 0.6819 0.6101 0.0000 +vt 0.5160 0.3506 0.0000 +vt 0.5102 0.3521 0.0000 +vt 0.5188 0.3269 0.0000 +vt 0.7529 0.5667 0.0000 +vt 0.7737 0.5282 0.0000 +vt 0.8066 0.5304 0.0000 +vt 0.6068 0.2054 0.0000 +vt 0.5889 0.2094 0.0000 +vt 0.5914 0.2039 0.0000 +vt 0.7790 0.5747 0.0000 +vt 0.8264 0.4776 0.0000 +vt 0.8176 0.4259 0.0000 +vt 0.8998 0.4138 0.0000 +vt 0.8059 0.3678 0.0000 +vt 0.5123 0.3651 0.0000 +vt 0.5195 0.4396 0.0000 +vt 0.6613 0.2639 0.0000 +vt 0.6307 0.5044 0.0000 +vt 0.6418 0.4822 0.0000 +vt 0.5337 0.2895 0.0000 +vt 0.5524 0.0668 0.0000 +vt 0.6458 0.2115 0.0000 +vt 0.5245 0.3325 0.0000 +vt 0.6141 0.5347 0.0000 +vt 0.7909 0.4849 0.0000 +vt 0.6941 0.5613 0.0000 +vt 0.6256 0.1415 0.0000 +vt 0.6096 0.2049 0.0000 +vt 0.9000 0.3524 0.0000 +vt 0.5515 0.2303 0.0000 +vt 0.5709 0.3469 0.0000 +vt 0.5645 0.3412 0.0000 +vt 0.5747 0.2240 0.0000 +vt 0.6746 0.2107 0.0000 +vt 0.6652 0.0847 0.0000 +vt 0.6511 0.6939 0.0000 +vt 0.5274 0.4979 0.0000 +vt 0.7207 0.3628 0.0000 +vt 0.5729 0.2018 0.0000 +vt 0.6289 0.6150 0.0000 +vt 0.6339 0.6380 0.0000 +vt 0.5520 0.1991 0.0000 +vt 0.9949 0.3369 0.0000 +vt 0.9995 0.4038 0.0000 +vt 0.5281 0.1971 0.0000 +vt 0.6494 0.4952 0.0000 +vt 0.5698 0.2093 0.0000 +vt 0.5491 0.2099 0.0000 +vt 0.8023 0.1093 0.0000 +vt 0.8624 0.2316 0.0000 +vt 0.8703 0.1449 0.0000 +vt 0.5467 0.3737 0.0000 +vt 0.5529 0.2158 0.0000 +vt 0.6173 0.2034 0.0000 +vt 0.5588 0.0402 0.0000 +vt 0.5267 0.2312 0.0000 +vt 0.7295 0.5547 0.0000 +vt 0.6883 0.4705 0.0000 +vt 0.7097 0.4730 0.0000 +vt 0.7023 0.4497 0.0000 +vt 0.8959 0.4739 0.0000 +vt 0.5005 0.7724 0.0000 +vt 0.6340 0.5832 0.0000 +vt 0.5103 0.3214 0.0000 +vt 0.7183 0.5004 0.0000 +vt 0.7223 0.4825 0.0000 +vt 0.7349 0.4997 0.0000 +vt 0.5555 0.4858 0.0000 +vt 0.8313 0.5881 0.0000 +vt 0.6843 0.0486 0.0000 +vt 0.5357 0.3096 0.0000 +vt 0.5225 0.3673 0.0000 +vt 0.6052 0.5128 0.0000 +vt 0.5262 0.3575 0.0000 +vt 0.5981 0.5120 0.0000 +vt 0.5059 0.3513 0.0000 +vt 0.8860 0.2886 0.0000 +vt 0.9734 0.2673 0.0000 +vt 0.5380 0.3550 0.0000 +vt 0.8040 0.3108 0.0000 +vt 0.8029 0.2613 0.0000 +vt 0.5581 0.3352 0.0000 +vt 0.5573 0.3283 0.0000 +vt 0.7323 0.4549 0.0000 +vt 0.5458 0.3240 0.0000 +vt 0.9322 0.1972 0.0000 +vt 0.7099 0.4918 0.0000 +vt 0.2399 0.7066 0.0000 +vt 0.6343 0.5445 0.0000 +vt 0.5798 0.3590 0.0000 +vt 0.5256 0.2097 0.0000 +vt 0.5282 0.2152 0.0000 +vt 0.7007 0.4875 0.0000 +# 468 texture coords + + +vn -0.9892 0.0918 -0.1146 +vn -0.9788 0.0236 -0.2033 +vn -0.9677 -0.0121 -0.2518 +vn -0.0286 0.4641 -0.8853 +vn -0.0210 0.1059 -0.9942 +vn -0.2963 0.0263 -0.9547 +vn -0.2656 -0.3737 -0.8887 +vn -0.1333 -0.1062 -0.9854 +vn -0.2982 -0.3067 -0.9039 +vn -0.2701 0.4062 -0.8730 +vn -0.5118 0.1804 -0.8400 +vn -0.6858 -0.4508 -0.5714 +vn -0.4596 -0.4367 -0.7734 +vn -0.6024 -0.3459 -0.7194 +vn -0.6700 -0.2574 -0.6963 +vn -0.3874 -0.2160 -0.8962 +vn -0.4873 -0.2184 -0.8455 +vn -0.0187 0.7636 -0.6454 +vn -0.3895 0.6894 -0.6107 +vn -0.3730 0.8476 -0.3773 +vn -0.4425 -0.2135 -0.8710 +vn -0.6390 0.0497 -0.7676 +vn -0.3241 -0.1838 -0.9280 +vn -0.4361 0.4943 -0.7520 +vn -0.5509 0.4800 -0.6827 +vn -0.0096 0.1041 -0.9945 +vn -0.0117 -0.1221 -0.9924 +vn -0.2092 -0.1327 -0.9688 +vn -0.9011 0.2674 -0.3415 +vn -0.8776 0.0591 -0.4757 +vn -0.8804 -0.3287 -0.3418 +vn -0.5055 0.2486 -0.8262 +vn -0.5902 0.2855 -0.7551 +vn -0.6930 0.3322 -0.6398 +vn -0.4684 0.6694 -0.5766 +vn -0.4272 0.7368 -0.5240 +vn -0.2852 0.8727 -0.3964 +vn -0.3535 0.8216 -0.4473 +vn -0.3118 0.8767 -0.3662 +vn -0.5250 0.1467 -0.8384 +vn -0.4721 0.4437 -0.7617 +vn -0.2451 -0.0267 -0.9691 +vn -0.4187 -0.1407 -0.8972 +vn -0.5714 0.2908 -0.7675 +vn -0.5276 0.3879 -0.7558 +vn -0.7228 0.4014 -0.5625 +vn -0.1836 0.4449 -0.8765 +vn -0.0125 0.4693 -0.8829 +vn -0.0217 0.5490 -0.8355 +vn -0.7483 0.2841 -0.5994 +vn -0.4508 0.3894 -0.8032 +vn -0.7218 -0.1978 -0.6632 +vn -0.2589 0.4773 -0.8397 +vn -0.1985 0.5505 -0.8109 +vn -0.3127 0.5807 -0.7516 +vn -0.1325 0.5499 -0.8246 +vn 0.0988 0.3107 -0.9454 +vn -0.0383 0.4255 -0.9042 +vn -0.5889 0.2725 -0.7609 +vn -0.8103 0.4772 -0.3402 +vn -0.8348 0.3692 -0.4084 +vn -0.3030 -0.0161 -0.9529 +vn -0.4987 -0.0940 -0.8617 +vn -0.6857 0.2014 -0.6994 +vn -0.9601 -0.0063 -0.2796 +vn -0.9401 -0.0814 -0.3311 +vn -0.8443 -0.2348 -0.4818 +vn -0.5192 -0.4575 -0.7219 +vn -0.4560 -0.0053 -0.8899 +vn -0.0145 0.0191 -0.9997 +vn -0.4007 -0.1577 -0.9025 +vn -0.3961 -0.0224 -0.9179 +vn -0.1931 0.0337 -0.9806 +vn -0.6352 -0.3880 -0.6678 +vn -0.6957 0.1472 -0.7031 +vn -0.4450 0.1127 -0.8884 +vn -0.7920 0.2538 -0.5553 +vn -0.2588 0.1393 -0.9558 +vn -0.0160 0.0757 -0.9970 +vn -0.4640 0.3737 -0.8031 +vn -0.5965 -0.2402 -0.7659 +vn -0.5234 0.3510 -0.7764 +vn -0.2373 0.0020 -0.9714 +vn -0.2813 0.4791 -0.8315 +vn -0.3584 0.0892 -0.9293 +vn -0.2542 0.0002 -0.9671 +vn -0.6701 0.5630 -0.4837 +vn -0.7034 0.1121 -0.7019 +vn -0.6507 0.4083 -0.6402 +vn -0.7793 -0.1925 -0.5964 +vn -0.1515 0.3979 -0.9048 +vn -0.0209 0.3518 -0.9359 +vn -0.1058 0.5639 -0.8190 +vn -0.3450 0.6540 -0.6732 +vn -0.3752 0.7249 -0.5777 +vn -0.3356 0.6076 -0.7198 +vn -0.8198 -0.4081 -0.4018 +vn -0.6040 -0.5115 -0.6112 +vn -0.6003 -0.4769 -0.6420 +vn -0.8971 -0.1474 -0.4166 +vn -0.0088 -0.1756 -0.9844 +vn -0.0130 0.2566 -0.9664 +vn -0.6727 -0.1461 -0.7253 +vn -0.5253 -0.1978 -0.8276 +vn -0.5550 -0.1543 -0.8174 +vn -0.2962 0.5043 -0.8111 +vn -0.5151 0.3789 -0.7689 +vn -0.6769 0.4352 -0.5936 +vn -0.7119 -0.1376 -0.6887 +vn -0.3869 -0.2729 -0.8808 +vn -0.2593 0.9100 -0.3235 +vn -0.4232 0.8725 -0.2441 +vn -0.6388 0.6348 -0.4346 +vn 0.0075 -0.5272 -0.8497 +vn 0.1431 -0.3278 -0.9338 +vn 0.0417 -0.2968 -0.9540 +vn -0.9190 -0.2914 -0.2656 +vn -0.9525 -0.1975 -0.2320 +vn -0.8218 0.5259 -0.2193 +vn -0.7717 0.5717 -0.2788 +vn -0.8407 -0.2471 -0.4819 +vn -0.1589 0.6204 -0.7680 +vn -0.3844 0.3934 -0.8351 +vn -0.5135 0.2291 -0.8270 +vn -0.7775 -0.3931 -0.4910 +vn -0.7590 0.4870 -0.4321 +vn -0.5333 0.0772 -0.8424 +vn -0.2512 -0.2327 -0.9396 +vn -0.5037 0.2809 -0.8169 +vn -0.3684 0.3409 -0.8649 +vn -0.7436 -0.0832 -0.6634 +vn -0.6117 0.7847 -0.1002 +vn -0.5291 0.8080 -0.2592 +vn -0.4508 0.8443 -0.2898 +vn -0.6923 0.3110 -0.6511 +vn -0.8890 -0.0214 -0.4573 +vn -0.8997 0.1327 -0.4158 +vn -0.2615 0.0617 -0.9632 +vn -0.7042 -0.3851 -0.5965 +vn -0.4049 -0.7183 -0.5658 +vn -0.8981 0.0608 -0.4355 +vn -0.9788 0.1245 -0.1626 +vn -0.9079 0.1364 -0.3963 +vn -0.7298 -0.0858 -0.6783 +vn -0.4109 0.5683 -0.7129 +vn -0.2760 0.8715 -0.4054 +vn -0.0052 0.8916 -0.4528 +vn -0.4766 0.3068 -0.8238 +vn 0.0050 -0.1775 -0.9841 +vn -0.0091 -0.0562 -0.9984 +vn -0.3366 0.0198 -0.9414 +vn -0.3670 0.2717 -0.8897 +vn -0.3339 0.0046 -0.9426 +vn -0.3391 0.4495 -0.8264 +vn -0.6108 0.5190 -0.5979 +vn -0.7075 0.1706 -0.6858 +vn -0.4370 0.5756 -0.6911 +vn -0.1373 0.5563 -0.8196 +vn -0.6839 0.4104 -0.6032 +vn -0.4112 0.5547 -0.7234 +vn -0.9719 0.1950 -0.1316 +vn -0.8965 0.0314 -0.4419 +vn -0.3061 0.7640 -0.5679 +vn -0.2095 0.7295 -0.6511 +vn -0.6765 0.0404 -0.7353 +vn -0.7748 0.5551 -0.3026 +vn -0.3352 0.8062 -0.4875 +vn -0.9828 0.0737 -0.1690 +vn -0.6294 0.2746 -0.7270 +vn -0.4010 0.7990 -0.4481 +vn -0.7680 0.5065 -0.3919 +vn -0.7313 0.6102 -0.3048 +vn -0.6386 0.7024 -0.3143 +vn -0.5403 -0.0661 -0.8389 +vn -0.2972 0.0398 -0.9540 +vn -0.6776 -0.4136 -0.6081 +vn -0.0027 -0.5203 -0.8540 +vn -0.9184 0.2515 -0.3056 +vn -0.2748 0.5707 -0.7738 +vn -0.1584 0.1286 -0.9790 +vn -0.4616 -0.5618 -0.6866 +vn -0.4293 -0.0927 -0.8984 +vn -0.9793 0.1926 -0.0624 +vn -0.0161 -0.1523 -0.9882 +vn -0.2259 -0.2227 -0.9484 +vn -0.0197 -0.0720 -0.9972 +vn -0.2632 -0.1251 -0.9566 +vn -0.2093 -0.1177 -0.9707 +vn -0.4462 -0.5951 -0.6684 +vn -0.3734 -0.3688 -0.8512 +vn -0.4127 -0.7924 -0.4493 +vn -0.8775 0.4155 -0.2396 +vn -0.8941 0.4319 -0.1185 +vn -0.9429 0.3025 -0.1392 +vn -0.9468 0.3122 -0.0776 +vn -0.4967 0.7780 -0.3847 +vn -0.2129 0.8951 -0.3917 +vn -0.0010 -0.6457 -0.7636 +vn -0.0191 0.3220 -0.9466 +vn -0.2007 0.8540 -0.4801 +vn -0.5261 -0.2296 -0.8189 +vn -0.5469 -0.1438 -0.8248 +vn -0.9882 0.1379 -0.0665 +vn -0.2607 -0.1418 -0.9549 +vn -0.3010 0.8206 -0.4858 +vn -0.2486 0.9237 -0.2915 +vn -0.1986 0.7334 -0.6502 +vn -0.2171 0.9455 -0.2426 +vn -0.3870 0.6895 -0.6122 +vn -0.0087 -0.5839 -0.8117 +vn -0.5436 -0.1897 -0.8176 +vn -0.5570 -0.2589 -0.7891 +vn -0.4501 0.2685 -0.8516 +vn -0.7925 0.0362 -0.6087 +vn -0.6696 0.5211 -0.5292 +vn -0.8579 -0.2632 -0.4412 +vn -0.9774 0.0665 -0.2005 +vn -0.8059 -0.4189 -0.4185 +vn -0.8334 -0.3312 -0.4425 +vn -0.0113 0.7507 -0.6605 +vn -0.5000 0.8023 -0.3261 +vn -0.0179 0.1168 -0.9930 +vn -0.0280 0.7348 -0.6777 +vn -0.0341 0.8515 -0.5232 +vn -0.8728 -0.3807 -0.3053 +vn -0.2925 -0.1250 -0.9481 +vn -0.2521 -0.4913 -0.8337 +vn -0.5752 -0.1476 -0.8046 +vn -0.5558 0.7877 -0.2655 +vn -0.3244 0.4596 -0.8268 +vn -0.6118 0.2479 -0.7511 +vn -0.3883 -0.3420 -0.8557 +vn -0.9704 0.2327 -0.0645 +vn -0.9662 0.2260 -0.1243 +vn -0.0165 0.5612 -0.8275 +vn -0.8997 0.3056 -0.3117 +vn -0.1538 0.8423 -0.5165 +vn 0.0106 0.9761 -0.2172 +vn -0.4197 0.4256 -0.8017 +vn -0.2580 0.5206 -0.8139 +vn -0.5099 -0.4374 -0.7407 +vn -0.7786 -0.4123 -0.4731 +vn -0.6680 0.4185 -0.6154 +vn 0.9885 0.0946 -0.1177 +vn 0.9766 0.0763 -0.2009 +vn 0.9707 -0.0059 -0.2403 +vn 0.2175 0.4167 -0.8827 +vn 0.2655 0.0332 -0.9635 +vn 0.2465 -0.3758 -0.8933 +vn 0.4508 -0.4321 -0.7811 +vn 0.2787 -0.3017 -0.9118 +vn 0.3870 0.4936 -0.7788 +vn 0.4777 0.1827 -0.8593 +vn 0.6807 -0.4529 -0.5758 +vn 0.7749 -0.3960 -0.4927 +vn 0.5928 -0.3359 -0.7320 +vn 0.5041 -0.4457 -0.7397 +vn 0.6609 -0.2685 -0.7009 +vn 0.7711 -0.1906 -0.6075 +vn 0.4693 -0.2150 -0.8565 +vn -0.0176 0.9138 -0.4057 +vn 0.3385 0.8619 -0.3777 +vn 0.4241 -0.2022 -0.8827 +vn 0.2284 -0.2246 -0.9473 +vn 0.3009 -0.1708 -0.9382 +vn 0.4152 0.6914 -0.5913 +vn 0.5263 0.4569 -0.7171 +vn 0.1372 0.1315 -0.9818 +vn 0.1889 -0.1299 -0.9734 +vn 0.8941 0.2902 -0.3410 +vn 0.9565 -0.1796 -0.2300 +vn 0.8827 -0.3064 -0.3563 +vn 0.4749 0.2725 -0.8368 +vn 0.5803 0.2684 -0.7689 +vn 0.6698 0.3602 -0.6493 +vn 0.3502 0.8087 -0.4726 +vn 0.3789 0.7560 -0.5337 +vn 0.1939 0.9029 -0.3835 +vn 0.0992 0.9694 -0.2244 +vn 0.2482 0.8870 -0.3894 +vn 0.4589 0.4349 -0.7748 +vn 0.2199 -0.0208 -0.9753 +vn 0.5447 0.3217 -0.7745 +vn 0.6608 0.4456 -0.6039 +vn 0.7042 0.4225 -0.5706 +vn 0.1420 0.4548 -0.8792 +vn 0.2331 0.5063 -0.8303 +vn 0.8500 -0.0556 -0.5238 +vn 0.6186 -0.3893 -0.6824 +vn 0.7050 -0.2003 -0.6803 +vn 0.2278 0.4733 -0.8510 +vn 0.3290 0.5971 -0.7316 +vn 0.2896 0.5777 -0.7632 +vn 0.1057 0.5527 -0.8267 +vn 0.2923 0.4695 -0.8331 +vn 0.0250 0.4179 -0.9081 +vn 0.5611 0.3112 -0.7670 +vn 0.4233 0.4058 -0.8100 +vn 0.7948 0.5049 -0.3366 +vn 0.8680 0.4384 -0.2332 +vn 0.8266 0.3904 -0.4053 +vn 0.2732 -0.0165 -0.9618 +vn 0.6635 0.0658 -0.7453 +vn 0.6643 0.2138 -0.7162 +vn 0.9600 -0.0003 -0.2800 +vn 0.8960 -0.1414 -0.4210 +vn 0.8452 -0.2504 -0.4722 +vn 0.5089 -0.4481 -0.7350 +vn -0.0089 -0.4314 -0.9021 +vn 0.3708 -0.1626 -0.9144 +vn 0.1925 -0.1126 -0.9748 +vn 0.1658 0.0472 -0.9850 +vn 0.5831 -0.2210 -0.7818 +vn 0.6667 0.1757 -0.7243 +vn 0.4231 0.1187 -0.8983 +vn 0.6085 0.2868 -0.7400 +vn 0.7769 0.2723 -0.5677 +vn 0.2238 0.1445 -0.9639 +vn 0.4823 0.3914 -0.7837 +vn 0.4059 -0.0703 -0.9112 +vn 0.1984 0.0143 -0.9800 +vn -0.0156 0.0695 -0.9975 +vn 0.3273 0.0921 -0.9404 +vn 0.2286 0.0054 -0.9735 +vn 0.6102 0.7222 -0.3257 +vn 0.6443 0.5803 -0.4981 +vn 0.4969 0.1416 -0.8562 +vn 0.4749 -0.0910 -0.8753 +vn 0.6870 0.1214 -0.7165 +vn 0.8579 -0.2672 -0.4390 +vn 0.7796 -0.1825 -0.5992 +vn 0.1208 0.3971 -0.9098 +vn 0.1075 0.5451 -0.8314 +vn 0.0761 0.5486 -0.8326 +vn 0.3651 0.7087 -0.6037 +vn 0.8210 -0.3904 -0.4167 +vn 0.8331 -0.3228 -0.4492 +vn 0.5980 -0.4679 -0.6507 +vn 0.2695 0.5104 -0.8166 +vn 0.6652 -0.1336 -0.7347 +vn 0.7261 -0.0753 -0.6835 +vn 0.5408 -0.1514 -0.8274 +vn 0.6207 0.4346 -0.6526 +vn 0.3602 0.6969 -0.6202 +vn 0.2923 0.8174 -0.4963 +vn 0.6549 0.4616 -0.5984 +vn 0.7013 -0.1214 -0.7024 +vn 0.3127 0.0149 -0.9498 +vn 0.3730 -0.2646 -0.8893 +vn 0.2068 0.9225 -0.3261 +vn 0.4428 0.8057 -0.3933 +vn 0.6128 0.6523 -0.4461 +vn -0.0282 -0.5216 -0.8527 +vn 0.2269 -0.4823 -0.8461 +vn -0.0625 -0.2963 -0.9530 +vn 0.9255 -0.2612 -0.2742 +vn 0.8782 -0.3583 -0.3167 +vn 0.7431 0.5356 -0.4013 +vn 0.7497 0.5979 -0.2835 +vn 0.8369 -0.2377 -0.4930 +vn 0.1306 0.5947 -0.7933 +vn 0.2395 0.5098 -0.8263 +vn 0.4942 0.2256 -0.8396 +vn 0.4387 0.0211 -0.8984 +vn 0.7810 0.0588 -0.6218 +vn 0.7757 -0.3764 -0.5066 +vn 0.2367 -0.1436 -0.9609 +vn 0.5078 0.1003 -0.8556 +vn 0.1036 -0.1009 -0.9895 +vn 0.4829 0.2882 -0.8269 +vn 0.4273 0.5748 -0.6979 +vn 0.3231 0.6484 -0.6894 +vn 0.7422 -0.0986 -0.6628 +vn 0.5223 -0.0708 -0.8498 +vn 0.3597 0.3844 -0.8502 +vn 0.5795 0.8063 -0.1185 +vn 0.4603 0.8254 -0.3268 +vn 0.3691 0.8831 -0.2895 +vn 0.6861 0.3121 -0.6571 +vn 0.6473 0.4401 -0.6223 +vn 0.8993 0.1483 -0.4114 +vn 0.2468 0.0393 -0.9683 +vn 0.4702 -0.7357 -0.4875 +vn 0.4528 -0.6808 -0.5758 +vn 0.8966 -0.0343 -0.4415 +vn 0.8987 0.0843 -0.4303 +vn 0.8959 0.0466 -0.4419 +vn 0.9774 0.1340 -0.1635 +vn 0.9007 0.1575 -0.4050 +vn 0.3724 0.5882 -0.7179 +vn 0.6001 -0.5021 -0.6227 +vn 0.4579 0.3117 -0.8325 +vn -0.1567 -0.3306 -0.9307 +vn -0.0155 -0.0506 -0.9986 +vn 0.3119 0.0191 -0.9499 +vn 0.3392 0.2827 -0.8972 +vn 0.3362 0.4579 -0.8230 +vn 0.5374 0.7997 -0.2676 +vn -0.1332 0.2907 -0.9475 +vn 0.7012 0.1840 -0.6888 +vn 0.1714 0.5455 -0.8204 +vn 0.5580 0.3128 -0.7686 +vn 0.5971 0.3016 -0.7433 +vn 0.9675 0.2147 -0.1340 +vn 0.2314 0.7831 -0.5773 +vn 0.7580 0.5782 -0.3018 +vn 0.2670 0.8375 -0.4768 +vn 0.2693 0.8599 -0.4336 +vn 0.5067 0.3950 -0.7663 +vn 0.7394 0.5132 -0.4357 +vn 0.3673 -0.2156 -0.9047 +vn 0.6777 -0.3981 -0.6182 +vn 0.6185 0.0661 -0.7830 +vn 0.4711 -0.5517 -0.6882 +vn 0.2506 0.5734 -0.7800 +vn 0.2726 0.0404 -0.9613 +vn 0.3665 -0.3395 -0.8662 +vn 0.9744 0.2145 -0.0671 +vn 0.9857 0.1509 -0.0744 +vn 0.2074 -0.2071 -0.9561 +vn -0.0326 -0.1888 -0.9815 +vn 0.4509 -0.5767 -0.6812 +vn 0.3959 -0.2961 -0.8693 +vn 0.8077 0.5514 -0.2088 +vn 0.9332 0.3326 -0.1365 +vn 0.8820 0.4566 -0.1162 +vn 0.8617 0.1065 -0.4962 +vn 0.1504 0.9084 -0.3900 +vn 0.4885 0.3529 -0.7980 +vn 0.3556 0.7052 -0.6134 +vn 0.1387 0.7361 -0.6625 +vn 0.3951 0.5494 -0.7363 +vn 0.3690 -0.0160 -0.9293 +vn 0.5278 -0.1434 -0.8372 +vn 0.3953 -0.1320 -0.9090 +vn 0.9794 0.0344 -0.1991 +vn -0.0106 -0.1659 -0.9861 +vn 0.1745 0.7218 -0.6697 +vn 0.1633 0.9568 -0.2405 +vn 0.4306 0.2942 -0.8532 +vn 0.5371 -0.1872 -0.8225 +vn 0.3508 0.3438 -0.8710 +vn 0.8106 -0.3958 -0.4315 +vn 0.9431 -0.0884 -0.3207 +vn 0.7107 0.6303 -0.3125 +vn 0.4906 0.3956 -0.7764 +vn 0.6379 0.5420 -0.5471 +vn 0.2648 -0.1351 -0.9548 +vn 0.5070 0.8298 -0.2331 +vn 0.5564 -0.1294 -0.8208 +vn 0.2610 0.8806 -0.3955 +vn 0.9583 0.2570 -0.1252 +vn 0.9614 0.2663 -0.0692 +vn 0.3949 0.8811 -0.2603 +vn 0.9102 0.2754 -0.3092 +vn 0.8881 0.3375 -0.3120 +vn 0.1150 0.8695 -0.4803 +vn 0.3658 0.4631 -0.8073 +vn 0.5063 -0.1983 -0.8392 +vn 0.5772 0.5500 -0.6036 +vn 0.9361 0.3433 -0.0766 +vn 0.5392 -0.2542 -0.8029 +vn -0.7761 -0.1922 -0.6006 +vn -0.0115 0.3481 -0.9374 +vn 0.9827 0.0780 -0.1680 +vn 0.2198 -0.1358 -0.9660 +vn 0.1342 0.8481 -0.5125 +vn 0.4880 -0.2447 -0.8379 +# 468 vertex normals + +#o default +g default +#usemtl 07___Default +#s 1 +f 1/1/1 2/2/2 3/3/3 +f 4/4/4 5/5/5 6/6/6 +f 7/7/7 8/8/8 9/9/9 +f 10/10/10 6/6/6 11/11/11 +f 12/12/12 13/13/13 14/14/14 +f 7/7/7 13/13/13 12/12/12 +f 15/15/15 16/16/16 17/17/17 +f 18/18/18 19/19/19 20/20/20 +f 21/21/21 22/22/22 23/23/23 +f 24/24/24 11/11/11 25/25/25 +f 26/26/26 27/27/27 28/28/28 +f 29/29/29 30/30/30 31/31/31 +f 32/32/32 33/33/33 34/34/34 +f 35/35/35 25/25/25 36/36/36 +f 37/37/37 38/38/38 39/39/39 +f 25/25/25 40/40/40 41/41/41 +f 42/42/42 43/43/43 21/21/21 +f 44/44/44 45/45/45 46/46/46 +f 47/47/47 48/48/48 49/49/49 +f 50/50/50 51/51/51 52/52/52 +f 53/53/53 54/54/54 55/55/55 +f 56/56/56 57/57/57 58/58/58 +f 59/59/59 33/33/33 32/32/32 +f 60/60/60 46/46/46 61/61/61 +f 62/62/62 63/63/63 64/64/64 +f 65/65/65 66/66/66 67/67/67 +f 68/68/68 69/69/69 70/70/70 +f 71/71/71 72/72/72 73/73/73 +f 74/74/74 52/52/52 75/75/75 +f 76/76/76 22/22/22 77/77/77 +f 78/78/78 79/79/79 48/48/48 +f 75/75/75 59/59/59 80/80/80 +f 81/81/81 75/75/75 82/82/82 +f 83/83/83 84/84/84 49/49/49 +f 85/85/85 62/62/62 86/86/86 +f 20/20/20 19/19/19 87/87/87 +f 40/40/40 25/25/25 11/11/11 +f 88/88/88 89/89/89 90/90/90 +f 91/91/91 92/92/92 93/93/93 +f 94/94/94 95/95/95 96/96/96 +f 97/97/97 98/98/98 99/99/99 +f 100/100/100 67/67/67 15/15/15 +f 88/88/88 101/101/101 102/102/102 +f 103/103/103 104/104/104 105/105/105 +f 89/89/89 88/88/88 106/106/106 +f 64/64/64 107/107/107 108/108/108 +f 109/109/109 14/14/14 110/110/110 +f 111/111/111 112/112/112 113/113/113 +f 114/114/114 115/115/115 116/116/116 +f 117/117/117 118/118/118 31/31/31 +f 60/60/60 119/119/119 120/120/120 +f 14/14/14 109/109/109 121/121/121 +f 122/122/122 123/123/123 124/124/124 +f 69/69/69 68/68/68 125/125/125 +f 34/34/34 126/126/126 87/87/87 +f 17/17/17 16/16/16 28/28/28 +f 127/127/127 59/59/59 75/75/75 +f 42/42/42 128/128/128 9/9/9 +f 129/129/129 130/130/130 94/94/94 +f 131/131/131 124/124/124 123/123/123 +f 132/132/132 133/133/133 134/134/134 +f 135/135/135 136/136/136 137/137/137 +f 138/138/138 139/139/139 140/140/140 +f 135/135/135 124/124/124 131/131/131 +f 141/141/141 2/2/2 142/142/142 +f 143/143/143 103/103/103 144/144/144 +f 145/145/145 146/146/146 147/147/147 +f 97/97/97 125/125/125 68/68/68 +f 148/148/148 85/85/85 76/76/76 +f 115/115/115 149/149/149 150/150/150 +f 11/11/11 6/6/6 151/151/151 +f 79/79/79 78/78/78 152/152/152 +f 86/86/86 153/153/153 110/110/110 +f 154/154/154 45/45/45 44/44/44 +f 133/133/133 155/155/155 108/108/108 +f 93/93/93 92/92/92 57/57/57 +f 156/156/156 129/129/129 157/157/157 +f 53/53/53 91/91/91 158/158/158 +f 33/33/33 44/44/44 159/159/159 +f 157/157/157 160/160/160 135/135/135 +f 127/127/127 44/44/44 33/33/33 +f 139/139/139 50/50/50 74/74/74 +f 161/161/161 143/143/143 162/162/162 +f 163/163/163 164/164/164 10/10/10 +f 62/62/62 165/165/165 153/153/153 +f 166/166/166 64/64/64 167/167/167 +f 118/118/118 168/168/168 166/166/166 +f 163/163/163 24/24/24 35/35/35 +f 45/45/45 148/148/148 169/169/169 +f 38/38/38 35/35/35 170/170/170 +f 171/171/171 126/126/126 34/34/34 +f 126/126/126 172/172/172 173/173/173 +f 174/174/174 175/175/175 16/16/16 +f 176/176/176 177/177/177 101/101/101 +f 143/143/143 178/178/178 77/77/77 +f 140/140/140 74/74/74 81/81/81 +f 179/179/179 106/106/106 180/180/180 +f 181/181/181 81/81/81 182/182/182 +f 23/23/23 110/110/110 9/9/9 +f 131/131/131 174/174/174 15/15/15 +f 183/183/183 161/161/161 142/142/142 +f 184/184/184 185/185/185 83/83/83 +f 165/165/165 168/168/168 118/118/118 +f 186/186/186 187/187/187 185/185/185 +f 106/106/106 102/102/102 26/26/26 +f 110/110/110 14/14/14 13/13/13 +f 188/188/188 73/73/73 150/150/150 +f 189/189/189 181/181/181 190/190/190 +f 177/177/177 176/176/176 99/99/99 +f 189/189/189 191/191/191 140/140/140 +f 192/192/192 193/193/193 119/119/119 +f 194/194/194 195/195/195 193/193/193 +f 30/30/30 29/29/29 196/196/196 +f 38/38/38 37/37/37 197/197/197 +f 198/198/198 98/98/98 68/68/68 +f 127/127/127 52/52/52 51/51/51 +f 19/19/19 18/18/18 199/199/199 +f 197/197/197 200/200/200 164/164/164 +f 124/124/124 135/135/135 160/160/160 +f 71/71/71 201/201/201 202/202/202 +f 123/123/123 179/179/179 175/175/175 +f 43/43/43 104/104/104 103/103/103 +f 2/2/2 1/1/1 203/203/203 +f 180/180/180 28/28/28 16/16/16 +f 204/204/204 28/28/28 27/27/27 +f 29/29/29 166/166/166 205/205/205 +f 139/139/139 138/138/138 206/206/206 +f 165/165/165 117/117/117 109/109/109 +f 144/144/144 156/156/156 141/141/141 +f 103/103/103 143/143/143 22/22/22 +f 207/207/207 179/179/179 123/123/123 +f 147/147/147 146/146/146 208/208/208 +f 209/209/209 106/106/106 179/179/179 +f 98/98/98 198/198/198 210/210/210 +f 211/211/211 212/212/212 213/213/213 +f 214/214/214 215/215/215 145/145/145 +f 136/136/136 66/66/66 3/3/3 +f 176/176/176 88/88/88 216/216/216 +f 94/94/94 130/130/130 213/213/213 +f 66/66/66 65/65/65 217/217/217 +f 126/126/126 171/171/171 120/120/120 +f 218/218/218 219/219/219 99/99/99 +f 148/148/148 41/41/41 40/40/40 +f 220/220/220 107/107/107 151/151/151 +f 208/208/208 146/146/146 221/221/221 +f 222/222/222 151/151/151 6/6/6 +f 10/10/10 164/164/164 223/223/223 +f 164/164/164 200/200/200 224/224/224 +f 131/131/131 67/67/67 66/66/66 +f 129/129/129 156/156/156 144/144/144 +f 23/23/23 22/22/22 76/76/76 +f 85/85/85 40/40/40 63/63/63 +f 117/117/117 225/225/225 121/121/121 +f 63/63/63 151/151/151 107/107/107 +f 214/214/214 30/30/30 113/113/113 +f 226/226/226 227/227/227 228/228/228 +f 229/229/229 132/132/132 221/221/221 +f 46/46/46 60/60/60 171/171/171 +f 230/230/230 58/58/58 226/226/226 +f 19/19/19 152/152/152 231/231/231 +f 146/146/146 145/145/145 215/215/215 +f 185/185/185 187/187/187 232/232/232 +f 83/83/83 185/185/185 190/190/190 +f 84/84/84 83/83/83 182/182/182 +f 47/47/47 84/84/84 82/82/82 +f 78/78/78 47/47/47 80/80/80 +f 161/161/161 183/183/183 233/233/233 +f 50/50/50 139/139/139 39/39/39 +f 51/51/51 50/50/50 170/170/170 +f 154/154/154 51/51/51 36/36/36 +f 45/45/45 154/154/154 41/41/41 +f 46/46/46 169/169/169 77/77/77 +f 2/2/2 141/141/141 137/137/137 +f 112/112/112 229/229/229 215/215/215 +f 143/143/143 161/161/161 234/234/234 +f 145/145/145 235/235/235 70/70/70 +f 78/78/78 32/32/32 231/231/231 +f 166/166/166 168/168/168 165/165/165 +f 236/236/236 194/194/194 192/192/192 +f 237/237/237 111/111/111 196/196/196 +f 134/134/134 108/108/108 107/107/107 +f 220/220/220 238/238/238 208/208/208 +f 239/239/239 237/237/237 205/205/205 +f 72/72/72 202/202/202 104/104/104 +f 211/211/211 130/130/130 129/129/129 +f 73/73/73 72/72/72 43/43/43 +f 150/150/150 73/73/73 42/42/42 +f 116/116/116 150/150/150 8/8/8 +f 227/227/227 116/116/116 7/7/7 +f 89/89/89 230/230/230 228/228/228 +f 209/209/209 56/56/56 230/230/230 +f 93/93/93 56/56/56 209/209/209 +f 158/158/158 93/93/93 207/207/207 +f 54/54/54 158/158/158 122/122/122 +f 55/55/55 54/54/54 240/240/240 +f 94/94/94 55/55/55 160/160/160 +f 132/132/132 112/112/112 133/133/133 +f 111/111/111 237/237/237 239/239/239 +f 155/155/155 239/239/239 167/167/167 +f 178/178/178 234/234/234 194/194/194 +f 133/133/133 112/112/112 111/111/111 +f 77/77/77 178/178/178 236/236/236 +f 227/227/227 241/241/241 90/90/90 +f 241/241/241 12/12/12 216/216/216 +f 12/12/12 242/242/242 218/218/218 +f 242/242/242 121/121/121 219/219/219 +f 31/31/31 30/30/30 214/214/214 +f 121/121/121 225/225/225 97/97/97 +f 225/225/225 31/31/31 125/125/125 +f 234/234/234 233/233/233 195/195/195 +f 141/141/141 156/156/156 243/243/243 +f 202/202/202 201/201/201 212/212/212 +f 104/104/104 202/202/202 211/211/211 +f 244/244/244 245/245/245 246/246/246 +f 4/4/4 247/247/247 248/248/248 +f 249/249/249 250/250/250 251/251/251 +f 247/247/247 252/252/252 253/253/253 +f 254/254/254 255/255/255 256/256/256 +f 249/249/249 257/257/257 254/254/254 +f 258/258/258 259/259/259 260/260/260 +f 18/18/18 261/261/261 262/262/262 +f 263/263/263 264/264/264 265/265/265 +f 252/252/252 266/266/266 267/267/267 +f 26/26/26 268/268/268 269/269/269 +f 270/270/270 271/271/271 272/272/272 +f 273/273/273 274/274/274 275/275/275 +f 266/266/266 276/276/276 277/277/277 +f 278/278/278 279/279/279 280/280/280 +f 267/267/267 277/277/277 281/281/281 +f 282/282/282 264/264/264 263/263/263 +f 283/283/283 284/284/284 285/285/285 +f 286/286/286 287/287/287 49/49/49 +f 288/288/288 289/289/289 290/290/290 +f 291/291/291 292/292/292 293/293/293 +f 294/294/294 295/295/295 296/296/296 +f 297/297/297 298/298/298 273/273/273 +f 299/299/299 300/300/300 301/301/301 +f 302/302/302 303/303/303 304/304/304 +f 305/305/305 306/306/306 307/307/307 +f 308/308/308 309/309/309 70/70/70 +f 310/310/310 311/311/311 312/312/312 +f 289/289/289 313/313/313 314/314/314 +f 315/315/315 316/316/316 317/317/317 +f 318/318/318 286/286/286 48/48/48 +f 314/314/314 319/319/319 298/298/298 +f 313/313/313 320/320/320 319/319/319 +f 321/321/321 322/322/322 49/49/49 +f 323/323/323 315/315/315 324/324/324 +f 262/262/262 325/325/325 326/326/326 +f 327/327/327 328/328/328 253/253/253 +f 329/329/329 330/330/330 331/331/331 +f 332/332/332 333/333/333 334/334/334 +f 335/335/335 293/293/293 292/292/292 +f 336/336/336 337/337/337 338/338/338 +f 306/306/306 259/259/259 258/258/258 +f 329/329/329 339/339/339 102/102/102 +f 340/340/340 341/341/341 342/342/342 +f 343/343/343 344/344/344 339/339/339 +f 304/304/304 345/345/345 346/346/346 +f 347/347/347 348/348/348 349/349/349 +f 350/350/350 351/351/351 352/352/352 +f 353/353/353 354/354/354 355/355/355 +f 356/356/356 357/357/357 272/272/272 +f 299/299/299 358/358/358 359/359/359 +f 256/256/256 255/255/255 360/360/360 +f 361/361/361 362/362/362 363/363/363 +f 364/364/364 365/365/365 366/366/366 +f 275/275/275 274/274/274 326/326/326 +f 260/260/260 367/367/367 269/269/269 +f 368/368/368 290/290/290 314/314/314 +f 282/282/282 369/369/369 251/251/251 +f 370/370/370 371/371/371 372/372/372 +f 373/373/373 374/374/374 375/375/375 +f 376/376/376 377/377/377 378/378/378 +f 379/379/379 380/380/380 381/381/381 +f 382/382/382 383/383/383 384/384/384 +f 379/379/379 385/385/385 373/373/373 +f 386/386/386 387/387/387 388/388/388 +f 389/389/389 387/387/387 341/341/341 +f 390/390/390 235/235/235 147/147/147 +f 336/336/336 391/391/391 308/308/308 +f 392/392/392 316/316/316 315/315/315 +f 393/393/393 355/355/355 394/394/394 +f 253/253/253 328/328/328 395/395/395 +f 79/79/79 199/199/199 396/396/396 +f 324/324/324 265/265/265 349/349/349 +f 397/397/397 368/368/368 283/283/283 +f 398/398/398 378/378/378 346/346/346 +f 334/334/334 294/294/294 399/399/399 +f 400/400/400 380/380/380 371/371/371 +f 291/291/291 401/401/401 333/333/333 +f 402/402/402 275/275/275 284/284/284 +f 371/371/371 380/380/380 379/379/379 +f 368/368/368 297/297/297 402/402/402 +f 403/403/403 384/384/384 289/289/289 +f 404/404/404 388/388/388 387/387/387 +f 405/405/405 252/252/252 247/247/247 +f 302/302/302 324/324/324 348/348/348 +f 406/406/406 407/407/407 345/345/345 +f 271/271/271 270/270/270 406/406/406 +f 405/405/405 408/408/408 266/266/266 +f 409/409/409 285/285/285 316/316/316 +f 408/408/408 280/280/280 276/276/276 +f 358/358/358 284/284/284 275/275/275 +f 410/410/410 326/326/326 325/325/325 +f 374/374/374 258/258/258 411/411/411 +f 412/412/412 329/329/329 101/101/101 +f 389/389/389 413/413/413 317/317/317 +f 384/384/384 414/414/414 313/313/313 +f 415/415/415 416/416/416 268/268/268 +f 414/414/414 417/417/417 320/320/320 +f 265/265/265 264/264/264 251/251/251 +f 373/373/373 307/307/307 258/258/258 +f 418/418/418 419/419/419 388/388/388 +f 184/184/184 322/322/322 321/321/321 +f 303/303/303 356/356/356 271/271/271 +f 186/186/186 184/184/184 420/420/420 +f 339/339/339 268/268/268 26/26/26 +f 349/349/349 251/251/251 250/250/250 +f 311/311/311 421/421/421 394/394/394 +f 422/422/422 423/423/423 417/417/417 +f 177/177/177 210/210/210 338/338/338 +f 422/422/422 414/414/414 384/384/384 +f 300/300/300 299/299/299 424/424/424 +f 425/425/425 300/300/300 426/426/426 +f 427/427/427 352/352/352 351/351/351 +f 408/408/408 405/405/405 428/428/428 +f 198/198/198 309/309/309 308/308/308 +f 368/368/368 397/397/397 429/429/429 +f 430/430/430 396/396/396 199/199/199 +f 428/428/428 405/405/405 431/431/431 +f 363/363/363 362/362/362 432/432/432 +f 310/310/310 433/433/433 434/434/434 +f 375/375/375 374/374/374 416/416/416 +f 435/435/435 263/263/263 340/340/340 +f 436/436/436 388/388/388 419/419/419 +f 268/268/268 416/416/416 411/411/411 +f 367/367/367 437/437/437 27/27/27 +f 270/270/270 351/351/351 407/407/407 +f 403/403/403 280/280/280 279/279/279 +f 303/303/303 348/348/348 347/347/347 +f 341/341/341 387/387/387 386/386/386 +f 340/340/340 263/263/263 413/413/413 +f 438/438/438 361/361/361 375/375/375 +f 147/147/147 238/238/238 439/439/439 +f 344/344/344 438/438/438 415/415/415 +f 391/391/391 338/338/338 210/210/210 +f 440/440/440 441/441/441 442/442/442 +f 365/365/365 364/364/364 390/390/390 +f 385/385/385 381/381/381 246/246/246 +f 412/412/412 443/443/443 330/330/330 +f 440/440/440 372/372/372 335/335/335 +f 444/444/444 246/246/246 245/245/245 +f 410/410/410 445/445/445 359/359/359 +f 443/443/443 412/412/412 338/338/338 +f 392/392/392 323/323/323 327/327/327 +f 220/220/220 222/222/222 395/395/395 +f 439/439/439 378/378/378 377/377/377 +f 222/222/222 5/5/5 248/248/248 +f 247/247/247 4/4/4 223/223/223 +f 431/431/431 223/223/223 224/224/224 +f 373/373/373 385/385/385 444/444/444 +f 370/370/370 342/342/342 341/341/341 +f 265/265/265 324/324/324 315/315/315 +f 323/323/323 302/302/302 328/328/328 +f 356/356/356 347/347/347 360/360/360 +f 328/328/328 304/304/304 446/446/446 +f 365/365/365 447/447/447 352/352/352 +f 354/354/354 353/353/353 448/448/448 +f 449/449/449 447/447/447 377/377/377 +f 285/285/285 284/284/284 358/358/358 +f 295/295/295 450/450/450 448/448/448 +f 430/430/430 326/326/326 274/274/274 +f 451/451/451 377/377/377 447/447/447 +f 420/420/420 417/417/417 423/423/423 +f 321/321/321 320/320/320 417/417/417 +f 287/287/287 319/319/319 320/320/320 +f 286/286/286 298/298/298 319/319/319 +f 318/318/318 273/273/273 298/298/298 +f 404/404/404 452/452/452 453/453/453 +f 288/288/288 276/276/276 280/280/280 +f 429/429/429 277/277/277 276/276/276 +f 397/397/397 281/281/281 277/277/277 +f 409/409/409 392/392/392 281/281/281 +f 285/285/285 301/301/301 317/317/317 +f 436/436/436 246/246/246 381/381/381 +f 454/454/454 352/352/352 447/447/447 +f 389/389/389 455/455/455 452/452/452 +f 390/390/390 364/364/364 70/70/70 +f 318/318/318 396/396/396 274/274/274 +f 406/406/406 304/304/304 303/303/303 +f 456/456/456 301/301/301 300/300/300 +f 457/457/457 407/407/407 351/351/351 +f 378/378/378 439/439/439 446/446/446 +f 220/220/220 446/446/446 439/439/439 +f 458/458/458 345/345/345 407/407/407 +f 433/433/433 435/435/435 459/459/459 +f 441/441/441 342/342/342 370/370/370 +f 312/312/312 282/282/282 435/435/435 +f 394/394/394 369/369/369 282/282/282 +f 355/355/355 249/249/249 369/369/369 +f 354/354/354 257/257/257 249/249/249 +f 343/343/343 331/331/331 450/450/450 +f 344/344/344 343/343/343 295/295/295 +f 334/334/334 438/438/438 344/344/344 +f 333/333/333 361/361/361 438/438/438 +f 401/401/401 362/362/362 361/361/361 +f 293/293/293 432/432/432 362/362/362 +f 372/372/372 371/371/371 432/432/432 +f 449/449/449 376/376/376 398/398/398 +f 457/457/457 350/350/350 460/460/460 +f 460/460/460 346/346/346 345/345/345 +f 455/455/455 456/456/456 425/425/425 +f 398/398/398 460/460/460 350/350/350 +f 317/317/317 301/301/301 456/456/456 +f 354/354/354 450/450/450 331/331/331 +f 257/257/257 331/331/331 330/330/330 +f 254/254/254 330/330/330 443/443/443 +f 255/255/255 443/443/443 337/337/337 +f 272/272/272 366/366/366 365/365/365 +f 360/360/360 337/337/337 336/336/336 +f 357/357/357 336/336/336 366/366/366 +f 452/452/452 425/425/425 461/461/461 +f 386/386/386 381/381/381 380/380/380 +f 434/434/434 441/441/441 462/462/462 +f 459/459/459 342/342/342 441/441/441 +f 226/226/226 228/228/228 230/230/230 +f 226/226/226 114/114/114 227/227/227 +f 213/213/213 95/95/95 94/94/94 +f 213/213/213 130/130/130 211/211/211 +f 296/296/296 399/399/399 294/294/294 +f 448/448/448 296/296/296 295/295/295 +f 448/448/448 450/450/450 354/354/354 +f 440/440/440 442/442/442 372/372/372 +f 440/440/440 462/462/462 441/441/441 +f 335/335/335 372/372/372 293/293/293 +f 239/239/239 155/155/155 111/111/111 +f 132/132/132 229/229/229 112/112/112 +f 217/217/217 1/1/1 3/3/3 +f 10/10/10 4/4/4 6/6/6 +f 13/13/13 7/7/7 9/9/9 +f 24/24/24 10/10/10 11/11/11 +f 242/242/242 12/12/12 14/14/14 +f 241/241/241 7/7/7 12/12/12 +f 463/463/463 15/15/15 17/17/17 +f 261/261/261 18/18/18 20/20/20 +f 128/128/128 21/21/21 23/23/23 +f 35/35/35 24/24/24 25/25/25 +f 180/180/180 26/26/26 28/28/28 +f 118/118/118 29/29/29 31/31/31 +f 231/231/231 32/32/32 34/34/34 +f 170/170/170 35/35/35 36/36/36 +f 206/206/206 37/37/37 39/39/39 +f 36/36/36 25/25/25 41/41/41 +f 128/128/128 42/42/42 21/21/21 +f 159/159/159 44/44/44 46/46/46 +f 84/84/84 47/47/47 49/49/49 +f 74/74/74 50/50/50 52/52/52 +f 96/96/96 53/53/53 55/55/55 +f 230/230/230 56/56/56 58/58/58 +f 80/80/80 59/59/59 32/32/32 +f 192/192/192 60/60/60 61/61/61 +f 165/165/165 62/62/62 64/64/64 +f 100/100/100 65/65/65 67/67/67 +f 309/309/309 68/68/68 70/70/70 +f 188/188/188 71/71/71 73/73/73 +f 81/81/81 74/74/74 75/75/75 +f 169/169/169 76/76/76 77/77/77 +f 47/47/47 78/78/78 48/48/48 +f 82/82/82 75/75/75 80/80/80 +f 182/182/182 81/81/81 82/82/82 +f 322/322/322 83/83/83 49/49/49 +f 76/76/76 85/85/85 86/86/86 +f 173/173/173 20/20/20 87/87/87 +f 63/63/63 40/40/40 11/11/11 +f 216/216/216 88/88/88 90/90/90 +f 158/158/158 91/91/91 93/93/93 +f 55/55/55 94/94/94 96/96/96 +f 219/219/219 97/97/97 99/99/99 +f 463/463/463 100/100/100 15/15/15 +f 106/106/106 88/88/88 102/102/102 +f 144/144/144 103/103/103 105/105/105 +f 209/209/209 89/89/89 106/106/106 +f 167/167/167 64/64/64 108/108/108 +f 153/153/153 109/109/109 110/110/110 +f 196/196/196 111/111/111 113/113/113 +f 227/227/227 114/114/114 116/116/116 +f 225/225/225 117/117/117 31/31/31 +f 171/171/171 60/60/60 120/120/120 +f 242/242/242 14/14/14 121/121/121 +f 240/240/240 122/122/122 124/124/124 +f 214/214/214 69/69/69 125/125/125 +f 231/231/231 34/34/34 87/87/87 +f 204/204/204 17/17/17 28/28/28 +f 52/52/52 127/127/127 75/75/75 +f 8/8/8 42/42/42 9/9/9 +f 157/157/157 129/129/129 94/94/94 +f 174/174/174 131/131/131 123/123/123 +f 221/221/221 132/132/132 134/134/134 +f 243/243/243 135/135/135 137/137/137 +f 191/191/191 138/138/138 140/140/140 +f 136/136/136 135/135/135 131/131/131 +f 162/162/162 141/141/141 142/142/142 +f 162/162/162 143/143/143 144/144/144 +f 235/235/235 145/145/145 147/147/147 +f 98/98/98 97/97/97 68/68/68 +f 169/169/169 148/148/148 76/76/76 +f 116/116/116 115/115/115 150/150/150 +f 63/63/63 11/11/11 151/151/151 +f 199/199/199 79/79/79 152/152/152 +f 23/23/23 86/86/86 110/110/110 +f 127/127/127 154/154/154 44/44/44 +f 134/134/134 133/133/133 108/108/108 +f 56/56/56 93/93/93 57/57/57 +f 243/243/243 156/156/156 157/157/157 +f 54/54/54 53/53/53 158/158/158 +f 34/34/34 33/33/33 159/159/159 +f 243/243/243 157/157/157 135/135/135 +f 59/59/59 127/127/127 33/33/33 +f 140/140/140 139/139/139 74/74/74 +f 142/142/142 161/161/161 162/162/162 +f 24/24/24 163/163/163 10/10/10 +f 86/86/86 62/62/62 153/153/153 +f 205/205/205 166/166/166 167/167/167 +f 29/29/29 118/118/118 166/166/166 +f 38/38/38 163/163/163 35/35/35 +f 46/46/46 45/45/45 169/169/169 +f 39/39/39 38/38/38 170/170/170 +f 159/159/159 171/171/171 34/34/34 +f 87/87/87 126/126/126 173/173/173 +f 15/15/15 174/174/174 16/16/16 +f 88/88/88 176/176/176 101/101/101 +f 22/22/22 143/143/143 77/77/77 +f 181/181/181 140/140/140 81/81/81 +f 175/175/175 179/179/179 180/180/180 +f 190/190/190 181/181/181 182/182/182 +f 128/128/128 23/23/23 9/9/9 +f 67/67/67 131/131/131 15/15/15 +f 203/203/203 183/183/183 142/142/142 +f 322/322/322 184/184/184 83/83/83 +f 117/117/117 165/165/165 118/118/118 +f 184/184/184 186/186/186 185/185/185 +f 180/180/180 106/106/106 26/26/26 +f 9/9/9 110/110/110 13/13/13 +f 149/149/149 188/188/188 150/150/150 +f 232/232/232 189/189/189 190/190/190 +f 210/210/210 177/177/177 99/99/99 +f 181/181/181 189/189/189 140/140/140 +f 60/60/60 192/192/192 119/119/119 +f 192/192/192 194/194/194 193/193/193 +f 113/113/113 30/30/30 196/196/196 +f 163/163/163 38/38/38 197/197/197 +f 309/309/309 198/198/198 68/68/68 +f 154/154/154 127/127/127 51/51/51 +f 152/152/152 19/19/19 199/199/199 +f 163/163/163 197/197/197 164/164/164 +f 240/240/240 124/124/124 160/160/160 +f 72/72/72 71/71/71 202/202/202 +f 174/174/174 123/123/123 175/175/175 +f 21/21/21 43/43/43 103/103/103 +f 142/142/142 2/2/2 203/203/203 +f 175/175/175 180/180/180 16/16/16 +f 437/437/437 204/204/204 27/27/27 +f 196/196/196 29/29/29 205/205/205 +f 39/39/39 139/139/139 206/206/206 +f 153/153/153 165/165/165 109/109/109 +f 162/162/162 144/144/144 141/141/141 +f 21/21/21 103/103/103 22/22/22 +f 122/122/122 207/207/207 123/123/123 +f 238/238/238 147/147/147 208/208/208 +f 207/207/207 209/209/209 179/179/179 +f 99/99/99 98/98/98 210/210/210 +f 69/69/69 214/214/214 145/145/145 +f 137/137/137 136/136/136 3/3/3 +f 218/218/218 176/176/176 216/216/216 +f 3/3/3 66/66/66 217/217/217 +f 172/172/172 126/126/126 120/120/120 +f 176/176/176 218/218/218 99/99/99 +f 85/85/85 148/148/148 40/40/40 +f 222/222/222 220/220/220 151/151/151 +f 134/134/134 208/208/208 221/221/221 +f 5/5/5 222/222/222 6/6/6 +f 4/4/4 10/10/10 223/223/223 +f 223/223/223 164/164/164 224/224/224 +f 136/136/136 131/131/131 66/66/66 +f 105/105/105 129/129/129 144/144/144 +f 86/86/86 23/23/23 76/76/76 +f 62/62/62 85/85/85 63/63/63 +f 109/109/109 117/117/117 121/121/121 +f 64/64/64 63/63/63 107/107/107 +f 215/215/215 214/214/214 113/113/113 +f 215/215/215 229/229/229 221/221/221 +f 159/159/159 46/46/46 171/171/171 +f 87/87/87 19/19/19 231/231/231 +f 221/221/221 146/146/146 215/215/215 +f 190/190/190 185/185/185 232/232/232 +f 182/182/182 83/83/83 190/190/190 +f 82/82/82 84/84/84 182/182/182 +f 80/80/80 47/47/47 82/82/82 +f 32/32/32 78/78/78 80/80/80 +f 234/234/234 161/161/161 233/233/233 +f 170/170/170 50/50/50 39/39/39 +f 36/36/36 51/51/51 170/170/170 +f 41/41/41 154/154/154 36/36/36 +f 148/148/148 45/45/45 41/41/41 +f 61/61/61 46/46/46 77/77/77 +f 3/3/3 2/2/2 137/137/137 +f 113/113/113 112/112/112 215/215/215 +f 178/178/178 143/143/143 234/234/234 +f 69/69/69 145/145/145 70/70/70 +f 152/152/152 78/78/78 231/231/231 +f 64/64/64 166/166/166 165/165/165 +f 61/61/61 236/236/236 192/192/192 +f 205/205/205 237/237/237 196/196/196 +f 208/208/208 134/134/134 107/107/107 +f 107/107/107 220/220/220 208/208/208 +f 167/167/167 239/239/239 205/205/205 +f 43/43/43 72/72/72 104/104/104 +f 105/105/105 211/211/211 129/129/129 +f 42/42/42 73/73/73 43/43/43 +f 8/8/8 150/150/150 42/42/42 +f 7/7/7 116/116/116 8/8/8 +f 241/241/241 227/227/227 7/7/7 +f 90/90/90 89/89/89 228/228/228 +f 89/89/89 209/209/209 230/230/230 +f 207/207/207 93/93/93 209/209/209 +f 122/122/122 158/158/158 207/207/207 +f 240/240/240 54/54/54 122/122/122 +f 160/160/160 55/55/55 240/240/240 +f 157/157/157 94/94/94 160/160/160 +f 108/108/108 155/155/155 167/167/167 +f 236/236/236 178/178/178 194/194/194 +f 155/155/155 133/133/133 111/111/111 +f 61/61/61 77/77/77 236/236/236 +f 228/228/228 227/227/227 90/90/90 +f 90/90/90 241/241/241 216/216/216 +f 216/216/216 12/12/12 218/218/218 +f 218/218/218 242/242/242 219/219/219 +f 125/125/125 31/31/31 214/214/214 +f 219/219/219 121/121/121 97/97/97 +f 97/97/97 225/225/225 125/125/125 +f 194/194/194 234/234/234 195/195/195 +f 137/137/137 141/141/141 243/243/243 +f 211/211/211 202/202/202 212/212/212 +f 105/105/105 104/104/104 211/211/211 +f 436/436/436 244/244/244 246/246/246 +f 5/5/5 4/4/4 248/248/248 +f 369/369/369 249/249/249 251/251/251 +f 248/248/248 247/247/247 253/253/253 +f 250/250/250 254/254/254 256/256/256 +f 250/250/250 249/249/249 254/254/254 +f 411/411/411 258/258/258 260/260/260 +f 430/430/430 18/18/18 262/262/262 +f 413/413/413 263/263/263 265/265/265 +f 253/253/253 252/252/252 267/267/267 +f 27/27/27 26/26/26 269/269/269 +f 427/427/427 270/270/270 272/272/272 +f 402/402/402 273/273/273 275/275/275 +f 267/267/267 266/266/266 277/277/277 +f 408/408/408 278/278/278 280/280/280 +f 327/327/327 267/267/267 281/281/281 +f 435/435/435 282/282/282 263/263/263 +f 409/409/409 283/283/283 285/285/285 +f 48/48/48 286/286/286 49/49/49 +f 429/429/429 288/288/288 290/290/290 +f 401/401/401 291/291/291 293/293/293 +f 402/402/402 297/297/297 273/273/273 +f 285/285/285 299/299/299 301/301/301 +f 328/328/328 302/302/302 304/304/304 +f 444/444/444 305/305/305 307/307/307 +f 364/364/364 308/308/308 70/70/70 +f 433/433/433 310/310/310 312/312/312 +f 290/290/290 289/289/289 314/314/314 +f 413/413/413 315/315/315 317/317/317 +f 79/79/79 318/318/318 48/48/48 +f 297/297/297 314/314/314 298/298/298 +f 314/314/314 313/313/313 319/319/319 +f 287/287/287 321/321/321 49/49/49 +f 302/302/302 323/323/323 324/324/324 +f 430/430/430 262/262/262 326/326/326 +f 267/267/267 327/327/327 253/253/253 +f 343/343/343 329/329/329 331/331/331 +f 464/464/464 332/332/332 334/334/334 +f 391/391/391 336/336/336 338/338/338 +f 307/307/307 306/306/306 258/258/258 +f 101/101/101 329/329/329 102/102/102 +f 459/459/459 340/340/340 342/342/342 +f 329/329/329 343/343/343 339/339/339 +f 446/446/446 304/304/304 346/346/346 +f 256/256/256 347/347/347 349/349/349 +f 454/454/454 350/350/350 352/352/352 +f 393/393/393 353/353/353 355/355/355 +f 271/271/271 356/356/356 272/272/272 +f 424/424/424 299/299/299 359/359/359 +f 347/347/347 256/256/256 360/360/360 +f 375/375/375 361/361/361 363/363/363 +f 308/308/308 364/364/364 366/366/366 +f 410/410/410 275/275/275 326/326/326 +f 411/411/411 260/260/260 269/269/269 +f 297/297/297 368/368/368 314/314/314 +f 264/264/264 282/282/282 251/251/251 +f 442/442/442 370/370/370 372/372/372 +f 363/363/363 373/373/373 375/375/375 +f 398/398/398 376/376/376 378/378/378 +f 385/385/385 379/379/379 381/381/381 +f 403/403/403 382/382/382 384/384/384 +f 363/363/363 379/379/379 373/373/373 +f 436/436/436 386/386/386 388/388/388 +f 340/340/340 389/389/389 341/341/341 +f 451/451/451 390/390/390 147/147/147 +f 366/366/366 336/336/336 308/308/308 +f 323/323/323 392/392/392 315/315/315 +f 421/421/421 393/393/393 394/394/394 +f 248/248/248 253/253/253 395/395/395 +f 318/318/318 79/79/79 396/396/396 +f 348/348/348 324/324/324 349/349/349 +f 409/409/409 397/397/397 283/283/283 +f 460/460/460 398/398/398 346/346/346 +f 464/464/464 334/334/334 399/399/399 +f 370/370/370 400/400/400 371/371/371 +f 332/332/332 291/291/291 333/333/333 +f 283/283/283 402/402/402 284/284/284 +f 432/432/432 371/371/371 379/379/379 +f 283/283/283 368/368/368 402/402/402 +f 288/288/288 403/403/403 289/289/289 +f 389/389/389 404/404/404 387/387/387 +f 431/431/431 405/405/405 247/247/247 +f 303/303/303 302/302/302 348/348/348 +f 304/304/304 406/406/406 345/345/345 +f 465/465/465 271/271/271 406/406/406 +f 252/252/252 405/405/405 266/266/266 +f 392/392/392 409/409/409 316/316/316 +f 266/266/266 408/408/408 276/276/276 +f 410/410/410 358/358/358 275/275/275 +f 445/445/445 410/410/410 325/325/325 +f 416/416/416 374/374/374 411/411/411 +f 177/177/177 412/412/412 101/101/101 +f 455/455/455 389/389/389 317/317/317 +f 289/289/289 384/384/384 313/313/313 +f 339/339/339 415/415/415 268/268/268 +f 313/313/313 414/414/414 320/320/320 +f 349/349/349 265/265/265 251/251/251 +f 374/374/374 373/373/373 258/258/258 +f 404/404/404 418/418/418 388/388/388 +f 420/420/420 184/184/184 321/321/321 +f 465/465/465 303/303/303 271/271/271 +f 466/466/466 186/186/186 420/420/420 +f 102/102/102 339/339/339 26/26/26 +f 256/256/256 349/349/349 250/250/250 +f 312/312/312 311/311/311 394/394/394 +f 414/414/414 422/422/422 417/417/417 +f 412/412/412 177/177/177 338/338/338 +f 383/383/383 422/422/422 384/384/384 +f 426/426/426 300/300/300 424/424/424 +f 461/461/461 425/425/425 426/426/426 +f 270/270/270 427/427/427 351/351/351 +f 278/278/278 408/408/408 428/428/428 +f 391/391/391 198/198/198 308/308/308 +f 290/290/290 368/368/368 429/429/429 +f 18/18/18 430/430/430 199/199/199 +f 467/467/467 428/428/428 431/431/431 +f 379/379/379 363/363/363 432/432/432 +f 468/468/468 310/310/310 434/434/434 +f 415/415/415 375/375/375 416/416/416 +f 459/459/459 435/435/435 340/340/340 +f 244/244/244 436/436/436 419/419/419 +f 269/269/269 268/268/268 411/411/411 +f 269/269/269 367/367/367 27/27/27 +f 406/406/406 270/270/270 407/407/407 +f 382/382/382 403/403/403 279/279/279 +f 356/356/356 303/303/303 347/347/347 +f 400/400/400 341/341/341 386/386/386 +f 389/389/389 340/340/340 413/413/413 +f 415/415/415 438/438/438 375/375/375 +f 451/451/451 147/147/147 439/439/439 +f 339/339/339 344/344/344 415/415/415 +f 198/198/198 391/391/391 210/210/210 +f 447/447/447 365/365/365 390/390/390 +f 444/444/444 385/385/385 246/246/246 +f 329/329/329 412/412/412 330/330/330 +f 305/305/305 444/444/444 245/245/245 +f 358/358/358 410/410/410 359/359/359 +f 337/337/337 443/443/443 338/338/338 +f 281/281/281 392/392/392 327/327/327 +f 446/446/446 220/220/220 395/395/395 +f 451/451/451 439/439/439 377/377/377 +f 395/395/395 222/222/222 248/248/248 +f 431/431/431 247/247/247 223/223/223 +f 467/467/467 431/431/431 224/224/224 +f 307/307/307 373/373/373 444/444/444 +f 400/400/400 370/370/370 341/341/341 +f 413/413/413 265/265/265 315/315/315 +f 327/327/327 323/323/323 328/328/328 +f 357/357/357 356/356/356 360/360/360 +f 395/395/395 328/328/328 446/446/446 +f 427/427/427 365/365/365 352/352/352 +f 376/376/376 449/449/449 377/377/377 +f 299/299/299 285/285/285 358/358/358 +f 396/396/396 430/430/430 274/274/274 +f 390/390/390 451/451/451 447/447/447 +f 466/466/466 420/420/420 423/423/423 +f 420/420/420 321/321/321 417/417/417 +f 321/321/321 287/287/287 320/320/320 +f 287/287/287 286/286/286 319/319/319 +f 286/286/286 318/318/318 298/298/298 +f 418/418/418 404/404/404 453/453/453 +f 403/403/403 288/288/288 280/280/280 +f 288/288/288 429/429/429 276/276/276 +f 429/429/429 397/397/397 277/277/277 +f 397/397/397 409/409/409 281/281/281 +f 316/316/316 285/285/285 317/317/317 +f 386/386/386 436/436/436 381/381/381 +f 449/449/449 454/454/454 447/447/447 +f 404/404/404 389/389/389 452/452/452 +f 235/235/235 390/390/390 70/70/70 +f 273/273/273 318/318/318 274/274/274 +f 465/465/465 406/406/406 303/303/303 +f 425/425/425 456/456/456 300/300/300 +f 350/350/350 457/457/457 351/351/351 +f 346/346/346 378/378/378 446/446/446 +f 238/238/238 220/220/220 439/439/439 +f 457/457/457 458/458/458 407/407/407 +f 434/434/434 433/433/433 459/459/459 +f 442/442/442 441/441/441 370/370/370 +f 433/433/433 312/312/312 435/435/435 +f 312/312/312 394/394/394 282/282/282 +f 394/394/394 355/355/355 369/369/369 +f 355/355/355 354/354/354 249/249/249 +f 295/295/295 343/343/343 450/450/450 +f 294/294/294 344/344/344 295/295/295 +f 294/294/294 334/334/334 344/344/344 +f 334/334/334 333/333/333 438/438/438 +f 333/333/333 401/401/401 361/361/361 +f 401/401/401 293/293/293 362/362/362 +f 293/293/293 372/372/372 432/432/432 +f 454/454/454 449/449/449 398/398/398 +f 458/458/458 457/457/457 460/460/460 +f 458/458/458 460/460/460 345/345/345 +f 452/452/452 455/455/455 425/425/425 +f 454/454/454 398/398/398 350/350/350 +f 455/455/455 317/317/317 456/456/456 +f 257/257/257 354/354/354 331/331/331 +f 254/254/254 257/257/257 330/330/330 +f 255/255/255 254/254/254 443/443/443 +f 360/360/360 255/255/255 337/337/337 +f 427/427/427 272/272/272 365/365/365 +f 357/357/357 360/360/360 336/336/336 +f 272/272/272 357/357/357 366/366/366 +f 453/453/453 452/452/452 461/461/461 +f 400/400/400 386/386/386 380/380/380 +f 468/468/468 434/434/434 462/462/462 +f 434/434/434 459/459/459 441/441/441 +# 852 faces + diff --git a/python/server/effects/1.png b/python/server/effects/1.png new file mode 100644 index 0000000000000000000000000000000000000000..1634b44da36811349e25a31de118184a2fa989cb GIT binary patch literal 7334 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 F{U3N8Zv6lN literal 0 HcmV?d00001 diff --git a/python/server/effects/11.png b/python/server/effects/11.png new file mode 100644 index 0000000000000000000000000000000000000000..0515230b2b31ab1b055da40bd423df9ece387c9c GIT binary patch literal 4224 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 KTXo0b#s2_S%qlqm literal 0 HcmV?d00001 diff --git a/python/server/effects/27.png b/python/server/effects/27.png new file mode 100644 index 0000000000000000000000000000000000000000..2ba965094dcba36837b22d9d5c07feddfbdfc7e8 GIT binary patch literal 1882 zcmeHF`%hB`6h5~t7m&boFa!Zf+z6rsL7)QTDJTyqbOHecMw>+*hG%&cgtj-ZY-56u*dYKg4G#;s3_u}M3K*ee*eH3iO9tb-u*3qg`ShJ5!dZcaY$64hL(fC|gsqw^ zXz4+WAb^KAP4sL7vNkKckWd(tn^wqWbFRY0%=Bz_)5AMo0icTTkf7KSWbGx9zeu+L zl>dlK1dsY zOT6(cH`n+e?(-r?r9WU}v6RiYPabLhtd6h|h&rnP^nr@q{o<7u9q7x^Tfyn%^gX#+uhwNZ4R>N!nmFKb5AC35>tC&a-eG4^C2X z-DEAN#8hy*bk^HN7UZ!;x}_p3}C~PJ!M? z#iq2DGrBg1K;+Pks6cLr zG)ilT8IMitpIq;MEpjrf+b+W(?R8B8CvmjR_6pA zo9{G)w`<~8p@}oN?G^UPhBBlWA+L81oS*^3FtZQ(gywZm=IGSHa;XWcW_G81%t-b; z{iu9(2|!L!gWR_|zlXRs+yhvF4P8^W;dEx-ySth`Nz0&;K)oz)^QmXII2$;5ieIUP z_O;u9ZzaL}%MCE~Z#>`?(-x?s62(5kC3%l_L9(KI%}Q1*0_)G+MFy%o8M;`?j@Y5k zNzEpBUQVt}gfzEKwbfXO>-I*PbAWsyJM-iu!;X__z$%pu>%xd&nPyPY|GpA@nE#Iq b$WQ30?pfULM+Ofcc?S`GAu6Q(Jged#l4Y`B literal 0 HcmV?d00001 diff --git a/python/server/effects/32.png b/python/server/effects/32.png new file mode 100644 index 0000000000000000000000000000000000000000..1ad5dc86f3da5447e43aad8f952fac8c702bc780 GIT binary patch literal 2940 zcmeHI|2Gr*8-LGLq1+lS^Cha0%9qNQFe2sKh=oLlJ44YbTN#aQX6jQ>p{tp`;T91- z2v@$&7NYX)78-ZhnpjqGeH%8jyZa}6&iVYwg`R{xM}%QG^fzJdc9PK7(lmP>yl+ zbp@b0Yx7#f1_k~(-aRBf5FZ^+jEFl6Jg_mb5&6}OC;-%!k#4Rh6CvNnx-$)ebpd}M zUDHeHOoK{?dmMqAYBfR|J|f+K>0tN@RWIgacB3%0QFfX;t0N+6F^ADFlrye@^q{Op z^E4If(QK7SqxA_yPUYU^CHH9z-~l;CNi0bVqC&$jNCjiDor zh@#_u=fFjxC<7twCLZ!B+yw!*;n@ow9k1>bQUCNEO*n&LGGggxSmTc4U+#OfC8$F{ z$TlWA1t|$dAt>ScnVwX(uJl*Nb)pbmgNzK+&88_c;!-`cD@mGfAN&X)malMNvAD>OaXj@ zA#Ca+X30`rXCCPur3J@iYKq3Z*&nPn03EM9wT3Yq=gE4VWQ1BG%CR9UV=5ejwxKU9 z6Gim{YL5S_78<(tCBY8fg5}*Oo`osRDY>8 zQ12J=lHE&5!B5?>cWKW8GzePvG|LP;TAW~8#AKeXQJ_4oW9&I=NSar}beI^fhf~q- zX7B)%6p0r-naLOO&~oF*=EW8Gq4Q5&DtMM~;FzGr|II@k&`eKg%5kReE0>+a9s3=m zf5C>It6xP5TRK%iqLuCY88K;OQ^`oJi+WwERep6!2xs#aP4M^nE-bp&Q)hAe;F%_y z@&$56ZmeRN>|OKPXPc^zr?YG)5Vv~IwrB%;g6$_Eg5~V(V~*01pJpi>f|PT;(pn74nI|xwYt67BL}fn}3l4X>PAJ6eADbAda>ML@v5?Qlpj7j#)y z#%4d-n|Y-u$`QhL&n;Q*Zlchj>tv%VX5BWS@B>yhBQ8(Kl(Z7TMM?4Pmm% zDB|t@oQ)~)^%b;+ck2W$$XB?fSkMymZe@mhxrfXwuuNaS9&gjQT+cP6&bT>D@d5^h zR|w}d@Uy8;7 zIb1{T$CUMw0j)71GHlUxG`|EJP=6~Aa3<(D6nL?*Ip;|?er0Qd(7 zZ?JnQJ+Xx9WLp8rx3#d=5LZ>cVkF6PN-hiMxNh&gyB6V^wEcj2!^2D6TI}C~MGSLt zPp}w{b00IhB4W5XWrlnmJpJ{eQIZKB8|GI1zSR1g0qb$Q4wtZ3{qCMhj;v~k*O~`t z1G$g5qMzsIZsavhP-;S%Q3Yo{%#Os|mSLvDyx9S_&{w9DazDwf5GOR^LeZItOl~1+ zz;2tN&<`&iN}DYz4h|RK4tuOh-*~wl&Xp+x^OuMMJk=0@Q*Y&vB!f1``GU*be?KwO L-OsJ^DCX)vHc0AV literal 0 HcmV?d00001 diff --git a/python/server/effects/37.png b/python/server/effects/37.png new file mode 100644 index 0000000000000000000000000000000000000000..d77ffbb686024e41fbd918e857ad0a191e8726e2 GIT binary patch literal 5274 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 C$l@#j literal 0 HcmV?d00001 diff --git a/python/server/effects/4.png b/python/server/effects/4.png new file mode 100644 index 0000000000000000000000000000000000000000..0cb9a8a501c0327eef57d273065d6b5a2cc9cabb GIT binary patch literal 14879 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 literal 0 HcmV?d00001 diff --git a/python/server/effects/40.png b/python/server/effects/40.png new file mode 100644 index 0000000000000000000000000000000000000000..914ec08a22c0383487ca7d0103fa0ed2e31cadc5 GIT binary patch literal 5239 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 literal 0 HcmV?d00001 diff --git a/python/server/effects/48.png b/python/server/effects/48.png new file mode 100644 index 0000000000000000000000000000000000000000..1b7ee8bfd6063e62a3420b5b8159f9f78def1b25 GIT binary patch literal 1632 zcmeAS@N?(olHy`uVBq!ia0y~yU;;9k7&zE~)R&4Yzkn2Hfk$L9Q1B=SGj?99e-9L7 zEDmyaVpw-h<|UBBlJ4m1$iT3%pZiZDE0E7u;u=vBoS#-wo>-L1;Fg)5n>cUdv}6Vb z*4v&gjv*C{Z|~kM6gCuKNRT~jt@qH2Lv{y?7l-HrJ_FGNtq$u3zBzmz?0)Qp>`t@Z z^tN`|G9R&@UUUCUU-I0VkF%FtjhZe5v}6>FhQMeD&?*FaoToR0D?h(8eY&U1)|D4a z@76Lg99zxvX|m8|A^Eaf*DLp575+X$h2g=bqYL(HeZ0W)=JK;&hZ{K$oS$30w*8yX z^@)}YaRSi{21SM^>h%oo?hLv7`+fVDI-Wazu)cLrh}V~h~H*q zC}8~be&yd?r}nRW`TxJ?!|NxVIwSuT-(Ik9zZb)S%BhT%g3O<7 zDsX|hue#V)2JWv63S#Nvy_+^+{IS@PyD*y zFI~)DP=}^ioKqD z%HsFhKR;Kx#MZ`7-plx3^Un`2T5IaDQj*+v5M`?SG!UEoNPHn}tEf zJ%w@K@%Nv8FRPvVeYWY}Wj{A~ey)Gz=j#AYeShikk%e{wFZ38`l_c<*YqLH+TE3`cl3=F> ONS&vvpUXO@geCwm4<2R! literal 0 HcmV?d00001 diff --git a/python/server/effects/49.png b/python/server/effects/49.png new file mode 100644 index 0000000000000000000000000000000000000000..f56d4b501d4a1a2a9bd5a0f8398a584a9ddbd57c GIT binary patch literal 8727 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 J@_${Q{SSFaR-XU> literal 0 HcmV?d00001 diff --git a/python/server/effects/5.png b/python/server/effects/5.png new file mode 100644 index 0000000000000000000000000000000000000000..7a6da023955710643df03b8fdade9ef8146d6197 GIT binary patch literal 7804 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 literal 0 HcmV?d00001 diff --git a/python/server/effects/53.png b/python/server/effects/53.png new file mode 100644 index 0000000000000000000000000000000000000000..29ead5465068ddb6d92ba321f7971a7ff1b15eb3 GIT binary patch literal 4328 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 GyYn9qRQAsR literal 0 HcmV?d00001 diff --git a/python/server/effects/56.png b/python/server/effects/56.png new file mode 100644 index 0000000000000000000000000000000000000000..5c397a719dfb4774efb650181a1f0722c78759f2 GIT binary patch literal 4316 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 literal 0 HcmV?d00001 diff --git a/python/server/effects/59.png b/python/server/effects/59.png new file mode 100644 index 0000000000000000000000000000000000000000..9747bb133972503435474145ebe35f95faee5926 GIT binary patch literal 3782 zcmeHJXIGQi7JdVQbWlgBf^9$$2oOQ8Gyz4#NFOjXqXdv%4Z#4x7F0l#UZkls=}K`3 zfmabC2>~UcSEUVs5PGP|W$yR8*8G6kYn`>*bJjll*&p_KW^H*@R7ge$007Zz=9g^& zfM?(20R;H>)f$Gry{`m=%n_mc!M48-#y5-spe9jx z_cq_YFBW#?W|&=|XIS{{5D&o2+sprUZcUo|e!}?LWn+5`ggJWsDQeyoSi+Gu`HwF@ zc$#5*$XFm#;%KmYoG_o{pTEcnX}*%)7XrLKgob(- zpD+M6UlbVlU`zH}-kg}2P>sp^RvUa8dVxWUgDXfvs;wHIM6&DRX)7hG@yYQ!(%pRU z%VVqt1`&s7yesFrf(xKO=K&Xc;oiByF2ZY9wW=bcKk5%&0}o6Qqc??mTKBGV#^+8| zp!CPzmBsjC?t!qoS~X2gn(p$HO3IV|dwHnvnbt_IQP^1c+apyS86HiA>@BKq9DK>R zJzG?^8tSwCDfNd7*MK#umxGIzVj4ufHRPB??Uk?Q9wc_piyay%4^FANz@4R1cM8Rk zlRoKD;}J~0jCAcVJGURcK`!djcVY@k*xb2fr`7)51<$k04fmeB+vkxVw=Y^?x3kXDjO`Xa1(qOL7e zN&_f#6%1mhvn%)_F)a=JGIswoUcvq>eG7A&@UXM7qhHf zHa|IAqd4tDGWE7e={2>f4Z&PSFpp>NkNwLQ=jfcTKjARCc~XBLN?}G@x!)lBu(v(< zYmNv0ApaC31CH$}z5Y*k`gGtn4&oxV#`qd#ilC+Muu!dIwNCWQWoA51*2%2Lds>Pg zd4*+|ONvQB3(UJpL%nuOR`vQFUR8~|zfoNxuRDp2Q#YO3)5$>Mlo}rL$po?SLUeKL z+xRL$8tU1U68vhpwM|^~6W)=poTNH=YO)G8mb^@q!R2kys=ik1|D}(%J>iP`qe@&% zOicaGP0snWImUE6t_yR0RlIE|3h8Ju8&=cAxzauhGqf9GUg0Y97je|HbF1HMpmM}( zg!OSWJuSo3<-vIIFt_mc3QMSAnQ;nhGcVo>6{$Pv4{>oWDrli@BHKwY`7}|h_iEVc zLx-1syMN@h&XCWyZk%a*EaNeOjcU?~@$Fb!&68$PFt~PZJAOKRL`{+WBKJQ4O)E~V zW0__(Rfx!43rWC7xn!)*yPM&cG5toeOsXJBiRadfu z_o6*fRf!N~rp>q27^$!Zwtm_X?pT^P`&>YG~;o=C4Bi(r4PXEd?PZ>$h8yNm!Yp@udGn|57my{F5h zxst=-!ENqlQ@x*4MqcP>jwc-dW&vLHnc2vS@1L23&iIatNa3OMc~x{7;(q@W^~O9m zhhTo1s!{;Y<2GXC;**5H$8?8Hn}xosuxRz6Oe*!z7X`}rI&q-+f8{EGJJ`och5N`g^*3f7 zbSX$SRJ4=Wm@(?)l`8J(dT5kmD_lI>sO$hNNk!mB7JtJhX9!ylO+QuA_JnBg6Z@#l z7*ffTpKl~5bb*0eb^ViFbVYQqL7}S_wp?2z-oY~{kc@HrEI>=1;}ks?gIhBhE*Qg@ zjuKP%V*Ewq8*<3#YKfwLZ)b(~;D`{0f8DL|LjB+}vDQc&>Ett0pRp8Xm{tj9-G=_X z6&h3~G|ci#rNTKydJwoB!r=5o*tl?~+f0#fvX@r9MF=$N{M_iSLdFNTb6y%GJ|neE z*=%cv3rR!679rkBd(6FYNI9bTa1eCk`|nSmDnQ>TbcE##20$sZzYh_9`)0Jh&p z{?jl9<-P49q>^kbWQ@o&3)ys# zy7!~#0iyj%LW7sgCmNOuZ~P};(0?)ip8>^Lk|X5EiPY~&Nq>W`U9r4eX@Y$CUj|9$ AQvd(} literal 0 HcmV?d00001 diff --git a/python/server/effects/6.png b/python/server/effects/6.png new file mode 100644 index 0000000000000000000000000000000000000000..414cf0e122a3f2f83a1bc74563af06010991e21e GIT binary patch literal 4814 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 VH+?jb{Fnm3_4uh{6-Thi{{y8BwWU}0|o0MuuQ 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 literal 0 HcmV?d00001 diff --git a/python/server/effects/68.png b/python/server/effects/68.png new file mode 100644 index 0000000000000000000000000000000000000000..fe86f2fa90412c1de0cb13fda25f20fb527a116a GIT binary patch literal 6173 zcmeHL`7_&%^M9+Wt*hc`wWy;giYjs6`luraN?k$FYDyGwHg45}y4uHCN}kqL;y$X0 zv#Ru=;ubegG;Y$w5j5oE^ZgILzkhaSXOEfP*?GxWvs7f5Wq{ub~yGaoq_Tt*?J|rtyPrpYh{5 z2fFZMS%U3#*Yr6liPt|gleVP7RQ}vfx++GXXg9gJje>RN*QVC0kM!3Zt?0YEyCv)I z?3g%v$Z2{1qyHfQ{8^jrl=yC^*bh4XXe)ct9R{1R0z_Qo>}F{8xIWqqoplHO$+v8s z?~Tc^i9w-yC@Bpo-jeOtE09?jtkiMax}j|775%EvW+LwcBkrV z=^L_kGLGn1=9ELi#7fKbg6-Ow&#zp*U=&d|t>lk1vUf+H6YgL4ZYazfv)51@SLYR7 zEyb=AV(|1DQCSomJ6gln$l3I_p}69uhVxg zkLU9?&5!=T{$ttbU)ZpkV4 z09b}9fM<(ava!y+?gP;Lh|g7m{noF9Y(xpgf zU1o8%*;0_L`o`dXI%ofCS4BA|?U>hVvDVi&3i}Y45a2eNtCQ4g-{o>pxT`J+JmK|q z*2?q$dK6RBpLJeKqJSkx$EVx(p@)5{xQ9MD9`E^wb~LG|kUn)NQu&l!GCRKnHS;B= z=rP;RsZh@efv=H zIMB#V%()cv!nU*1gh}gHw+nARDHis4qz&ID8_$s1;F3U3iQ{1}DqsDu{MWrb_QlG{dP}1IizhKah6)~-6?G2*p2WqDGW>JepnFTQ3FkYlMPG@ z)6yfvmAMN-nz8y@Me2XqpWF&0YZ`1hVQRuyyANbXi&=onZ)Pp|@s,t86k^Oe1I z;F!fg+9o$k&L1x>{zZ4^{_!!ar%d#$GHuV2G(?+6#v|D}&*$15Vys16ju|(FIBx+3 z{M%a8cR%FJRL^)Ml{3<-b?mOyO>39?VRhVCQvoL)HDq%U%^**=#kaCf0IOi_2&l6E z5?Zrh!_&kE-8BiCara8^ zaCdr=r=;Tti&=U4(&f*QKkr0Q&tNaRdGeuk@WGM$hI-c}N5y?u^zs zoJdgIGB?E$Bm5#w+l$Z0Ypv7k?yto%f{9Fl-s-2fE&N}{*ZAqGM~jRJLl#D!7UoibazNkCiyX*TAy>1O2G z>Sw?pjOatERk>UwW@_bq4rnP`@QK`_ZmdYBqlNB0QnIwZBZ&!N_>*4gUKOk@;RhTY z(=u9gyi+n`@98HKbDmfy4Nj=g<(s$*SIl940$CTwT6gar9$JMW7?yKd zm`a_E`_lR@qyp&}{nU5=SDz%~s@Od=Q%RmW0TPp=K1xa_3Sg~QO0jBqS7uW;Ry%ey zY*Z929)wOy-ET3gEY;OR!oTO_o-UFqE&753sV#IR>VrBUTE!EmnQLHA;)6uNgzDTS z#d#eBl|6Us!OSbn7&x$RqtKTbZm@O{^sI3ql(q5W)Q$cD z#?*6r)zC7{=uS#(*=f=moh`||xU}l0e3?(+NpN{;l}~X*YMlAgH~ph`VoajFJ81K8 z7)cD$+R@F4Wc6q%G}Cjit`t?E(xOlF>l^81?9LD7>MC8iJiY{h4=BwL<7oqqkKL~0 zWswH4mEEw3iHQ^SRGY(;iTkj5W(k|5qi`2$BElzyI3!D9zU*IigfPr}m-pzB99RQ) zQYv}pFsHlg5g?LLZ`V=ncT(HkTs*~Ls3EFImGLe+X<@r{tt2JNYKjq*L@aH)cw!a$ z`#A`eHEf_r{)qr_sU2__=67k8XNUT804EVi0nmo2IE1!=smY=jIyJyT(!S*$NxZ{G zKOqvtZNG&{iy?FNwd?m~9j_w-OO4+hnm%7}*gpm{4V0*+GPYDqNE@mxN2v>Y2P4{W$`eoDc=ivFqm+u*R2rJo z2y+H{VOylZKHmt0FfN!2LLHKMQL|{oa~y%HJ(Y_1DE4I_qL`OYMkJ@ zAELJ?7OW1!EXq%t3%VK#@+RnEPcL2?WsK}zb4K;V_6~7&X44s@`olGl0gQwk_3Mc7 zn}HY{9W1z$l=>00CoX52l0USa_lR=jD~=bk6YNYNC+m(J4fVcnZO7cm$0$$}e3&MN z57_nHNi`Nxf48Q~j2dPQO1jJ-HU?xB0%{y@CuG^Jys07P&-g5+PSavKYW%j%tk7Xg zEYxpfst3%9C{c`sMKR&7?+TL-&*ib2!^&%mwuH=PXWLvopns|#y_3_alzEV(+E#7Y zlFHFZ%sD7I!0GPKc}Ltx@RgG3t4FG#XBWJgu_~DCw4-Q5aeXqcK$4%M` zzoSt+^+znzkJ&FhZ%bO}NBo*^{E2t|PK)4lGfg|~GekOlBEQC|q_4Qp$XL**c>Du3 zXviskFy{aRV&3y=X|)!t11^LZxod zeZgu8Vv(w^vH+xzf23@JmM;eOqx?7?gnAv;!oFOkeVNmX`&!Bi!yi@A^--7LQ2A1D zk))s09IHZnJ=_F;5S6!`FRvBU+M2%F5$l|K8GMma=JpZMQ634G<7cf}up_m}yRN}) zg@cFLah?+5*)CJg@VvYU^t7%VsqYc;H@7*KJS*XoDF$m3b&%9b^kG5x^N=7ulcDT402(effmyX27qHDw; zl?ps@@#R&-T-#rB((O057Q}ON)Dn9PxfN!ssNcL{u`TT#J3jazk0I&KP&EX#Vha?m z2+OW(B?x8@SU`-Qi(O<`AiIx`@1XaEy9LQzrgj-dDVFOwpoG6!ZUvSAiTrqe$#pl=CYTIIc#pG_>z%EAHlq0)^X5c8 zJxepZZS)&i&3H-w#?}h)vHiNz$L6Au4qVSTVYNl>Bo`ybMeBBvw51xn?-HvXRt2;r zbppg_UA!-C^^?DIcV98$zMgVk^?a)AE#7sNRV7DVib^m4u*`w|%E`$eJz=#&VAIE{ zV-2-VN{a)RxJVHdYs{T;ElK^m`{lZhnP2%eLO!$|x2o#N$HvTs$?qkUF6+uO+^;vmYxR;76VFJFys))3s4;=P z9mLMAsGVQ-7A!n&q3Qi>6c3H+EU(kp)^u+o!QnqYXG{Z{mhAeJ&1iRaW=J0IQ1W@b zw1&Zn-$f&_6|E;_AaGA3+pkq)4snei=>{KYSLQ{clZQQIsUJXa0m(#UBmEl%ZX@=a zVdj|qxvrb1sT1~dL+j!K@;HVlAd=za(z=b{(o0Ib|3Oq3l`?Ce{x*L@dABRVGBmvj zw!S4uToIwg9kH6U^d6ZOO+?i#oV<*gOW*N`5WJ|)6mY8 zcr_L)^IYbh?u909GVQ3~@i;98tn43(N-x-! zwNd;^cKFQ*@A>qIvtRl~j0_*PD9RKO>D`7B+4Q-%e6;hnd!!uU>b4^AE-t$7^t>(~ zqxjh2zO=7H>xXB|y?o4A`?C%8HWt>SG<1Y~-Zg5a0#k9)Dl3%+?btoGouAjMhGo~duIfgZ~j>Ttb*ovy7N#~o>o>2EPmRiZs-uiWKR#hO| z(4PanK&iw?_K&s~TfL3{)<3ZOt_3L(5l#uewC*AOb3T)Vr?^+k{IQYrd_7Az`_b}~ zpHsFSk7NHjEH-^z796AziP?faWyu}Yt1VFuRBf7d!r1xePWMtj>dcuGZaL!Xm%I~3 z3Nu>6jbrHznVy~(XbhH~xt>lblq?#*-xcFs%RYD7tP&Td;`)QbZu_hk&NhzGA3!2F zsSU@!r=0m&@5$GI(G=&6HNySrlt~}&f823vgM)2BOHYFm1m5I7f2Qth5feG=0EmO!~O{R(n5C74d++9VQ0c+SKB8v?@~$QKq=r{p&@VoXymP z@{K>@8+ue#O-#IMpx#_lRpkb;P|&z9Ols=5p+@n(8_-LccXE$~)ltGu6k_IYQq#tw zIC9qa#^R%moo&*}VRpgqs&WpfM>~b!xri_k3r|dix48&nMom zl;FFbHsC^<9A{MvqpfZr<%cKS$l`OWy6Q1RXgpGWaE_Mya^&eaG4zHNSMCf%cQ#TF z)q|q2SO;698HXpqqP-i>>+-@~$9L&Q4c?#nm*B(bD3KL}-KgedbsbEsIX~^+z0y*@ zBo!rp1N)OfJs&1ftVUuUZhw@MDbZ`qy2utH#8x-ADjG!&KfTdb^keY_d8|v-^E(9< zgBPb)*5~OqbW3rK`xhrhPuxdEqxLqLUMtLIYGCxd#W_v>g8Bz~YCH$~VXGPdul9Dc z#q2QBqx*i5$kdjxFJ%KE*tb-KLRFu{_%B2q<~PkRR1%5Uu9vgiH)dNQ@Q4n|@kvx| za$7HjKC6R1G3>FM@(^~qf+lo1`Qa+;2wY+-FbXt>t8KJGWH%Jeb;~C9wtD?YSh2wcL|GNfhb!Vv9+D4?XWUM)yDlJ zV%+H6@87(kWYsHRxzAK`tY@t}w`Ts!Rat4$0Z*e%e-9M)JzhUNgpvKj=J)ZstLEXjE literal 0 HcmV?d00001 diff --git a/python/server/effects/7.png b/python/server/effects/7.png new file mode 100644 index 0000000000000000000000000000000000000000..884f1e6fe43535320affd69a5ff6c750ba499854 GIT binary patch literal 7259 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 literal 0 HcmV?d00001 diff --git a/python/server/effects/71.png b/python/server/effects/71.png new file mode 100644 index 0000000000000000000000000000000000000000..73feea9effcf0cfac6d9c72b001974e4fd83ca3c GIT binary patch literal 5725 zcmeHL_fr#E(+&`-1zr$QkaDkuCPgqt0f~4K1eDOFg9u^}h%_MtLVK@@s8K@^q+Jn^ z5_*RO5R?)_fP_v!=`~0~5+Ee`xPQd=+k0kq_Utor<~;N4IXgR>Y-4SHOhR4)0011b zxNT|&009`OzvUcm4}TaQc|X(-U*uqg;s5$hD z<)YwQkL?K&Y_GMiq5(H7x~{giR^=7|d4Mln0@Nn`qHX-xnT=!r_zXOx^1t;z1^!i_ z>NHEbDlBwhjNt3gUq7%xwo{^QZsM{4@kB?BeOvXhXa;S8@fu0+TCWruk0G7&eoX0) zcJIHh?(a8hq27c0mK*nV%|>rLVrEu%$cz=Ji%TA8s+b_IcmM0Z|4y5|Q+#I$r7G9xbs}UTQ-X@Uw5B$crDS zvWXgoBPvs@FZirn-#Ub2aQ*yprwR^Ch*JIy7uW^>93>D}I9-pn*-MRF?)JW!=hKXj zWkCDrHezC+r!Pj6wcow**Y7?igklo5t_db2)twFa`%;~v z^%`%(>@S6Ur+rL}wTc@l=&xDE)y@h6(Yx{=iTm%D;RJ*JuB7tGqyR{D13jituH9?b zm3!BbykiEio{IiPuT!o=Ce~4PRKQ^HTEi)L0LT+JgO3?UViofZ2B4X^wU|l_(7nPa z&*Kp^Uu4exll75^8gC?88j5u?{mTc5mdW@NDoR&e`n7`(IbCHD@LyEhPhd+r7&CFX z*(lP$lc8Kuf3$oL{6=G=hNDQsKHxFa$izAA-n((U zKOgJwYLi3&^T4T689@2G47KIniR|#>{jIn~+Tto>iA_%LOW`mxvQ92?3Cn1?@zTJ< zL~uIs=%kwH#Z9w&u)&ciBclhL$@M27mtx_{2lMLQgzrrlyc@8=Qkh z6gKl}dl`NTM&$%E%>!%oVrKmZ{3y>o-Ea-dNo%1U)}pmK+4Y#}TH415YGpc|YNuoh z^YV`z@eXNE&#^stf+>#pLD$!3%gB#BassGfE&+aLv_@>TbUwqD)b#+7hJ=QRqTf~a*7leo zgDSWnphLTl*pb%-tm+EL=*jU|qkBIe;o(M6g5xF#)`c5}5j{hW$P3jP#W{H%arkfj z7D1IKdM1TOHg~_AYp`I~^pk=$F3{^wSE-s+?a+UF9#wA_U_qy)7H z(>IP~h6`ML=hPPv+h`rR7Md62q{%_2Dnp$5pObe^P4%`KS72~BTqNO~r7s{?bMdU7 zTihMps%^YoF|DuKS1^7gdT`caRR%ufBoQN^o zS3@2o%k8r>zK7z*1h^h3m+P1>?wIYN;yn7N3LkO3K8@!Vno9j%cb)vX7HPHTtFDu} zwOCsi}(iXuI&s7DT8i#5+p>vv! z%neM-M&z8jOF#y!quNuO+EJ!U+)>o@J^tm*7q>Sv`c&=6EokW;tIzobf6o@N3xuPc z8VLOJP8BHscKd!tNuQYMjgyRA?0J0g?f}XKU+Yzh1ic<56iwH|{u#^!1q$Vom%{H0x`B!_r zRRT}@ux2Gs8(o5@W~tuS0!fpIRIwhk%SDZ^aTa$U|H}Im7rx}lc$ zhhY3}#XR!O7I#AUJbqb>HrL9#yO-?`OG+bgzv=Bgr@XrK5&#kW)Z=j}WDz=FX7VUI za&j4YirX$I7!R_6j&CMETv}-D=0j+=bY1IiXTinIlSQ|()9Iwb12=WP=L}~ZM(h^j zQnGjFx|OjU)_<^6(oXOe`;_lVfdP``p2g86tHLH6}zCx25H`)pL#9h-pKXv%$3t}<)*vwPU z?JmT*^?Rk$!S$vcWKxV#|XmPRz{LM8M0Y9Nyin`m9@ zM5<*CWK%@g*2Pp;Ds4F~mEL8?GX!BvmD5N}$SQpn>995wjkd&XR-&D_TO;(qEclQl zS4nl(To%ScVKOf1Vx_;L>NF)J3r`glcZ z#b2}~q0_Bo!pldV^JBf<)ceW#2RG;XpY8LEy$Esv$rAh&*p(Nn?X#%UdNOLBg$DUi zhi~91{)4l)Ku6XWttJa@gu3l+2Xe)1QD3L`-TeHK_x5 zva!gX;i`lkGpFKjwV)eMva(LPb3D!bLN!5DVK%s`OeL|m_h?K}`uOZKJt3%_XC?VL z%mA=WY^lH*csLll73Y<{B$~*a&-4)c{iHC z;s&{f)epZu$r~dFwsXNqQeIqYv&)jP{!ZNY^H|t^V9Ez&5AoRwcH8(>Q0oaQaOm$7 z*iEtH&-8#)iM|mv;M-ned4;9%(cr@GD|1Sx>M!Bx@@@S%&#T1?vb* zIl?3L8h7LMEy>&{cViMPpys4GEQw+gZ_6vo$@pk!Y*wT)OnZ0!g~~4s72@`rfe4kK zspRBZFnXp2Yc6eZN>-n7Ow{>VSqZI`Be7))fN4)3gv+Gy*mA-+=58>2t)4@xTv2lfpUl4SceAfUKJ zAN9ax4IkU0)oBn|7@Ds{c?G?>;FC%o%RjoQ@~7Yad&GSlS!%hQzPZrJ$#p2&K5&O z09sTuFv+_g`&6OGD`Dhlhi$OktVW{%Na{sUcrBQp71ZDoEwE(`u{@J&dG{SYQtFy` zMZ0_xwQM#MMY4KZ3|nv${Kb^Z)Osz~1VlWoq7b`XOR*F~#AwLe&9$dQ+>NMgXSW={ z)#=+E(U5SH=$EFvL)iz$3$R}#PdtNDj zN;Tf&-A92de{O&VEh0;IGd|0Sy^_&%)c4j)tvZTmKyMBvG@b!b+abEMi!oMC?J4U* z43>=5;h9QmMP?Gv9XqKS{Rt9|2qK6`?2c-1n;zvV1iYu zzddi8ff95o#vJ=#)#V44jMl(OEL?0&n*H9}HBrq;KB76b{qWd-C8ewI^qudQF@di- zvR!Sv#kE8nXV!2}ZI)*pw&6vdDo+NHn=R!XKF!U;kL)x#Twq|j(X49p`^bYoE;p}| z+cC@Vix?ThKS(phsP`X(>ue`OnBz@p%dPnD;^P-{P7Ye+Hik8pcvLA)cJy}O6>T+J z{=j&YZ>%AF^s26h$97)%g3ZoMYGdzz(XOqYNSJmPRl>GD`Zc?r_k$4#&@EAIGbe(Bbe+-fY~eFeDpD=~%stm4m#nan3^ei`|FhF)FkQabJWSt}Ka(i4X91sJ z)f!fB=NiQx4QZ96uC$HLY%Dc}83o>X>#lilr5@5p-a+x-5ky@cD?hc*RR-lC1v={o zYQ_R?MHl3{o2^QZU}(%1UdZ)Jic2$_X6t$>*}kw?Z8cKko7SFgUyq~&qqqz_KB?P! z%4*OS`p}kTg(%^jQA(#T9yX=q7We7h`844&M1AU%-vlRzi63^k*W^SfSR~ZUZd^3f z#&p$<+q&=+A|{-BaCT;eMrw;lCLbMPeCLUHfZtvk<&0eHtUAXP{6LBmeW1jdg{fCY zpp1ji{}jh4kF6nJtbR$ATO*CF^S47=XUBfBt>Lo8+bFAMuXN;Fz<|Bm#Nlw{`(Dgp z_wGqRgV!#`Re5J(HWJR3I|u7|hQL;AsmkyjPY4u(xl+m)SmROCZ^8C4J>_xjwSi|M zBiFY-L-MZa0gURSZ^GP|1+G3bJ@y!ZtD6@U1Ul~-#__7srL?}Z;vyPVN1S`QQtGn2 zGea?*`_Wkq!yMVIl$<-0Hk!C~6BpLvK#MBu%8`()ta-H>&&o7ENok`$1OOefr3rL3 zP(sI@F^5>K#CW;rI93_OVZ)sJ6AY$?C;I$v1or=`z_=q{a_qy=LIv`)!M_(-+_E;U Ixapnvf2=^WFZ1X5L@k>6v-vIcA>cGxM3}$nf-VR#MPZ001bt zx;T0R0F}5lqmABqbHXQCpnhEf{x!vK)K@9K#1O@J&{epWcFaT+Ny=uWjJFOk)x~Q5-hf{(mcm6V0rVxf!Ft4KwH+v6WR+{E6 zE>zd@8QF0dU#-QS`pT8-o5p>QqwHF^*%y?75PA7c@RO+O%I(+ysmm1k&$|(Z)NP_E z2cABX1_kydnwhhENOf0hnff8|dram4sp+wwL{lqrif>|8FMqFxSQDamNk0D!3$S3IUj7 zaqp>&XiVX(jGsciXFJrSB=9e@jV}g5(o(yC0QtT_!Bmz|D7C}Z^r*I&$V7x~wB`Yj zK)1wbUmQ1{43OPv&FQc)J&4gK9%FT155oH*cKQ)H8!OS^f@xs&bUE#iV9?c_8=d5{ z!f%1PIi4d|Wgz`hM+zphdHhn`&dP~nGNe&Lh+^cU;R@nbpigsQa*dc5-h_1(%3&g$ z^zNQWxiXL)vAmGhYBrIGc-Ev3KvSLU)AgboVuYp{AkoGKkhNAA71d46!ALs_TaOT-)+ zLRZ_-!->ZG?}hhZvjkZr+?j5b(YRL)H`iw$^ES(Y&w2$AA34)FswaMOO_|+0AOZNF?iD~Gz3s)IrcjUfXvX_3ZuYH@(8jH@PxEwTKmuk%yogRLp9iS`H>W1tG>?ujUBEE$@PV#e z1PF}Ok(FcrBn^LuwL6EBmVC@Y_N3f}c+geRvW}7l^AS zk(Aks-im6F+&`ee>PP`Jdw5OXyk{{{m4zM$rEC1KVaE9vyJ5VJzZc0Gtnv^0I8bLp z{T=3|)jD6!%vg+3lWlhE&$#D$KhOJly!6`7utMT*Z%1OeyIrpDK|RVM&|2n_PWp2&tQ|9vFH1h)^&m)>kSCJtoRXuY95X?hgVbciQr5nSeu_ zcU?~srCMoPeU8r#{GS~t6)r6$GeW{us=`LnfTDo@*3QqM|`Bld}pdQ$ zy|&qhTAnTlS482Qbv6;^UQu=pPXw6}kY^U~-jt zEk1gNFouD44?106uf6da{=PPso}wqKQ{}8Qg2)78v*Gf$os^rW=WcsYT<^+sAKakF zoC%+fPRTe;49%ld*=iQ|mKP&;W~?1VF!{O1xP+{2Gz}?}r;`W0CDZ%AM3DaBb<1;h zVi)R?_)qHTFnh8)u#Z7!;~GlwCIydrNM2>?6Yc_eGyf8qs7{mAVLca)DvFJ$6f4)? zvF@Ip*W#PZMN1aGgepicokc4f;exN;>yKl~WSM3I+_|b^=jI+H6d^Xu`>252Q1C^(*u!WyISwk&@8sX|PBy zYgZk9`Jqj0=ME>4Ye(Nt`q-%AS&N@ek!p*SHpio4HNG%;8NrI{dT*59>!+5 z)r;E1gm0w!=U9e%n2n;3jaop*x+u3)W-*~w98##(d!JjsW9j)P&Cba$I#L%$Ayin^ z`ot|OyZ{CGkwpDpE39SymJO`y;m??$XFkz;l=y8kZJAnh-<;6GPWF1ZBlP1e z7rIfW2R356uQ1{ASB&Wq&|l4Iq9466L^W?#zvd(Vd*8FKRIzjIT5at-_2?I$rVsKD K^K13N7yb*x^?Mxv literal 0 HcmV?d00001 diff --git a/python/server/effects/78.png b/python/server/effects/78.png new file mode 100644 index 0000000000000000000000000000000000000000..ceb0313a6615f1588d679ae60431eb139272d171 GIT binary patch literal 2590 zcmeHI`&$xr7yqJ$cWIfr%zK({rTKcnrwNi}UNSGKkq#DCDw$edGjBn2%ki4JG9|@j zIj1ffcu8|2LXNCgQfz6aq8MsU&=@*J1mR_W#{0ZG&vTy7IiDZS^*PTWMTQ3%8(10u z0E|O|1EK)X(wJI652}H`u8nSKKtDY=E=xl`|63uXw*-lXgk(hp9R;*ut0j%2gZB^f z2cWIOPx=e_v@toX$f*WkR&_N8-1S6L41rvl9jg>? zi(LXi{9O;}nbOppan2WUtDPki2U^#>JxH5^#`A1xW#l@1O9{97j6*47Pk60lpwIE72KTXV~oaAS&yj?>qB z<^{ZbrZE*!!JLsHBo?}$HOJ!yTP&s&`+=s*EPoFYIQo#B0zjFmeE)6?*jm8Pd|mab(dJ+SDhe?9RmY8uB$f9>17u6myt2 zow@dabJ^z6Q`P}#K1nb?hpOH@rkXBB^pT}sk_1W0P7dls?}Xwzywi*u>zStgFh(=m z|1eD5^z4q3r{(j#tAMEpFFf^(X_pj+6oq__O;dpd~{Y@sQ?|m#yD@pj?1d>wd^}V>yNe80sKHuqHCc9 z6Ry3CD2IrLVk31xx+n9s3WFR(REp$HyZxCC>}3FG^kJ!>`seExDvz@rHOD%8B8<_* z62I7YTaAq9$^p*UL?0qKfhvo~%3K>+#**&lQ6IBjx8{bs^zH<5nEuThUnL}~a z*G~0K`D8?7?!>wF%#fGgU)>E_kLFCwUNntaZ{!r@*0f}{;(nO&Te4O~kO)Cj+L0Iq zPuQ@aPMe|c=x>&H`=SdVeJ{szkXi!SeX5MIT2vd`aqzKf&q{V*^TSRUd*@e{&hDkY zcd2~qiX5XOSJHnJD?sW^?i(n@*UJ4K#oTqk-SENE&^XV({0$(6-F02xUjR+Y&|UR} zxBpZZy$9C*T^le3bFalTT!MW(eQQ&in|GH*GE>Bdoz(uud+K12VEjH!QP!artG;;K&f^= zR5njvB%Jp`0qn7mx}b^7`}Fg(@w9rvy%2fAX|lD)Yl)9V%G%y}J?+lD?Aev&m@=H-S`TX+c*#Ot(E zi*}_^RdFQepVqe#=m+~%ADOFB&m8L?z3_A4A&vj1zR;(AwxCRC%rRl4mi=9L$no$1 J+R^y0{|i+FJd^+c literal 0 HcmV?d00001 diff --git a/python/server/effects/80.png b/python/server/effects/80.png new file mode 100644 index 0000000000000000000000000000000000000000..e6a60dacb4672976becac38be51d34e42ce4d62f GIT binary patch literal 2103 zcmeHI`BM^j6#wFZ;gP9R+jvKX?W${Ad6ZXPA+v~XnP_I=uE&^zM<}?!f=9MBYuIY$ zg{Cz{=?a>+nYL*jXu4sTqKFacmI;^?DuT=Y89UpXdGmRn&%Bw>%;$&qu7+WdCWe-V z000wIaNtP*bhM)m*ap>tBJ1Ub7GP@-E#ICI6q#`^qKs6fB)EXcCZ8*Po<0p^i6 zc#6N?*pmMav2%3B2qIe;_kT~m6wMS61-oDE@s`#qKM_L{I;P_Yxsq)?=X*jeg-t4A zVanW?YI;)Z^rgNe@PAHV_XwZQkEpC&QxBSr?`6PkU2(P4iR^syVWO)ziTb=><@RHH zNK~c|2JQxjnsG9904^8)LK@gzICW+1sJI>FAR-Is5jKUr41S_5eF9_;569htxsS-) znVx@O{v@jmA9jW9*NBz~B*`YZs*=1@2iP*n@bUgfZWp~QKBKBUJD0q2x@0NXABG$> zmW!gUyXp#w>2FDQAx2*pE4W;4Y4lk9AkIO2NWjE)YJ#j7uM#DhcH&u<^~ozTidmHF zP(R(Qi9Yi<=WUHHFk%;}O3@2jJcI?s=K<%mMC9_O!jIE@-6n4}-JHJta7*l>I7S!T z<8T$SB@~U<+j@pzJXf&Y7l2a{hgS%*TTzwQE9A;E9}TjP^6K@_ad|Zr_E`tkb)PWb z$qd3^s&gZd=EJc!eVtgTR*gqaAmqzIl6!tEyvLg@Dw87dpi{lBPBDfqJasXNJQe|Y zVqVWuq8G}C#&27sg$)v(&ifKg3ka-C=|La2y|il{&r5W)i^qT*WCZBO!GErx z77$#l0BGzE2iXtq^I=D=)4jWK7JJH^Il52;`?5XlLf_8@!hHd_%i&-iQpZ}k<~F;_ zBZgQEWa;Dlu0`TAdugXHZ=q3O-QPI^9W98@K8U;^)S%SmE^pWGIF?{@g|?mh96nVk z5z0*bM;UTwd0MlC_TmwnVks+Sm%9C;G0A(?~SQPA=( z!sbJC6liAYg4O-SBm@^dP#&yGR<5p*@Nw(svQ95QT2hkn(9B!oY9lygYbs?2>X@%j zTP$nO;QMC(w6n0D^KIh{uIXde+C-OB+*S(XujD~T^#j1c#EajH+|Y_rVV63pewnU{ zHZ~oYj=cYkW$5jO=a;~IZ`@Ox=}A(nbD7|ThbTne4FRODP>KU$yz~P}q*hauvvsQF zmrBm$aM{2NEJyX79x$rG=8BU0R+JOzBx!wrb%3F8bThB+TkFQ!tffIu36U1;amGam-{_3-Pk_DXr_p%?VJ!0H*zLe?)Bo~Kpf zdQ8bOfp?y0EZsO%yL2}{VWW>a0m;_K!rY6gKEuB3zQImv<5)vsWp`=^sprT6M}z6t zYdwtkU++)~kGGGe;cnYG?Xm&$n7X>gSDrUY@=dqeiy{B@)AYoA!$QRIXB~%DYrj7L Ms31%r+aH(v59@_8MgRZ+ literal 0 HcmV?d00001 diff --git a/python/server/effects/81.png b/python/server/effects/81.png new file mode 100644 index 0000000000000000000000000000000000000000..7895d2aba8403dd444b3fd0d8d14f235a269cdda GIT binary patch literal 3275 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 literal 0 HcmV?d00001 diff --git a/python/server/effects/82.png b/python/server/effects/82.png new file mode 100644 index 0000000000000000000000000000000000000000..2425e5cf64cd47c0acf011098a5452b787f98779 GIT binary patch literal 5111 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 list[int]: + """枚举 effects/.png 中的 n。""" + ids: list[int] = [] + if not self.paths.effects_dir.is_dir(): + return ids + for p in self.paths.effects_dir.iterdir(): + if p.suffix.lower() != ".png": + continue + try: + n = int(p.stem) + except ValueError: + continue + if 1 <= n <= 99: + ids.append(n) + return sorted(ids) + + def render(self, image_bytes: bytes, effect_id: int) -> bytes: + if len(image_bytes) > self.max_image_bytes: + raise ValueError("image too large") + + effect_rgba = self._load_effect(effect_id) # (H,W,4) uint8 + + # 1. 解码 + 处理 EXIF orientation → RGB ndarray + img_rgb = self._decode_input(image_bytes) + h, w = img_rgb.shape[:2] + + # 2. MediaPipe 检测,挑最大人脸 + landmarks_norm = self._detect_largest_face(img_rgb) # (N,2) ∈ [0,1]² (N>=468) + + # 3. obj 顶点 → 像素坐标 + dst_xy = self._compute_dst_vertices(landmarks_norm, w, h) + + # 4. warp + 混合 + out = img_rgb.copy() + self._composite(out, effect_rgba, dst_xy) + + # 5. 编码 PNG + return self._encode_png(out) + + # ---------- internals ---------- + + def _load_effect(self, effect_id: int) -> np.ndarray: + if not (1 <= effect_id <= 99): + raise EffectNotFoundError(f"effect_id out of range: {effect_id}") + with self._cache_lock: + cached = self._effect_cache.get(effect_id) + if cached is not None: + return cached + png_path = self.paths.effects_dir / f"{effect_id}.png" + if not png_path.is_file(): + raise EffectNotFoundError(f"effect {effect_id} not found") + # 用 PIL 解码以保证 RGBA 一致;OpenCV imread 对部分 PNG 会丢 alpha + img = Image.open(png_path).convert("RGBA") + arr = np.array(img, dtype=np.uint8) # (H,W,4) RGBA + with self._cache_lock: + self._effect_cache[effect_id] = arr + return arr + + def _decode_input(self, image_bytes: bytes) -> np.ndarray: + try: + pil = Image.open(io.BytesIO(image_bytes)) + pil = ImageOps.exif_transpose(pil) # 处理手机 EXIF 旋转 + pil = pil.convert("RGB") + except Exception as e: + raise ValueError(f"invalid image: {e}") from e + return np.array(pil, dtype=np.uint8) + + def _ensure_landmarker(self): + if self._landmarker is not None: + return + with self._landmarker_lock: + if self._landmarker is not None: + return + # 延迟 import,避免单元测试时强依赖 mediapipe + from mediapipe.tasks import python as mp_python + from mediapipe.tasks.python import vision as mp_vision + + model_path = self._find_model_file() + base_options = mp_python.BaseOptions(model_asset_path=str(model_path)) + options = mp_vision.FaceLandmarkerOptions( + base_options=base_options, + running_mode=mp_vision.RunningMode.IMAGE, + num_faces=5, # 检测最多 5 张,挑最大那张 + min_face_detection_confidence=0.5, + min_face_presence_confidence=0.5, + min_tracking_confidence=0.5, + output_face_blendshapes=False, + output_facial_transformation_matrixes=False, + ) + self._landmarker = mp_vision.FaceLandmarker.create_from_options(options) + + def _find_model_file(self) -> Path: + """优先用本服务 assets 下的,找不到再回退到仓库 app/src/main/assets。""" + local = self.paths.obj_path.parent / "face_landmarker.task" + if local.is_file(): + return local + # 回退到仓库 app/src/main/assets/face_landmarker.task(Android SDK 用同一份) + repo_root = self.paths.obj_path.resolve().parents[3] + fallback = repo_root / "app" / "src" / "main" / "assets" / "face_landmarker.task" + if fallback.is_file(): + return fallback + raise FileNotFoundError( + "face_landmarker.task not found; place it under " + f"{local} or {fallback}" + ) + + def _detect_largest_face(self, img_rgb: np.ndarray) -> np.ndarray: + self._ensure_landmarker() + import mediapipe as mp + + mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=img_rgb) + with self._landmarker_lock: + result = self._landmarker.detect(mp_image) + + faces = result.face_landmarks or [] + if not faces: + raise NoFaceError("no face detected") + + # 选 bbox 面积最大的那张 + def bbox_area(landmarks) -> float: + xs = [lm.x for lm in landmarks] + ys = [lm.y for lm in landmarks] + return (max(xs) - min(xs)) * (max(ys) - min(ys)) + + biggest = max(faces, key=bbox_area) + # 转 ndarray,只取 xy + n = len(biggest) + arr = np.empty((n, 2), dtype=np.float32) + for i, lm in enumerate(biggest): + arr[i, 0] = lm.x + arr[i, 1] = lm.y + return arr + + def _compute_dst_vertices( + self, landmarks_norm: np.ndarray, w: int, h: int + ) -> np.ndarray: + """ + landmarks_norm: (N, 2) ∈ [0,1]² + 返回 (468, 2) float32 像素坐标,对应 mesh 的 468 个顶点。 + """ + n_landmarks = landmarks_norm.shape[0] + if self._index_map.max() >= n_landmarks: + raise RuntimeError( + f"INDEX_MAP references landmark index {int(self._index_map.max())} " + f"but mediapipe returned only {n_landmarks} landmarks" + ) + picked = landmarks_norm[self._index_map] # (468, 2) + out = np.empty_like(picked) + out[:, 0] = picked[:, 0] * w + out[:, 1] = picked[:, 1] * h + return out.astype(np.float32) + + def _composite( + self, + canvas_rgb: np.ndarray, + effect_rgba: np.ndarray, + dst_xy: np.ndarray, + ) -> None: + """ + 在 canvas_rgb(uint8 H×W×3,原地修改)上对 mesh 每个三角形: + 从 effect_rgba 取对应 src 三角形 → warpAffine 到 dst → alpha 混合。 + """ + eh, ew = effect_rgba.shape[:2] + canvas_h, canvas_w = canvas_rgb.shape[:2] + uvs = self._mesh.uvs # (468, 2) + tris = self._mesh.triangles # (852, 3) + + # 把 UV 一次性转成 effect 像素坐标 + src_pts_all = np.empty_like(uvs) + src_pts_all[:, 0] = uvs[:, 0] * ew + src_pts_all[:, 1] = uvs[:, 1] * eh + + effect_rgb = effect_rgba[..., :3] + effect_a = effect_rgba[..., 3] + + for tri in tris: + i0, i1, i2 = int(tri[0]), int(tri[1]), int(tri[2]) + src_tri = np.float32([src_pts_all[i0], src_pts_all[i1], src_pts_all[i2]]) + dst_tri = np.float32([dst_xy[i0], dst_xy[i1], dst_xy[i2]]) + + # 用 dst bbox 限定计算区域,避免对全画布 warp + x_min = int(np.floor(dst_tri[:, 0].min())) + y_min = int(np.floor(dst_tri[:, 1].min())) + x_max = int(np.ceil(dst_tri[:, 0].max())) + y_max = int(np.ceil(dst_tri[:, 1].max())) + + # clip 到画布 + x_min_c = max(0, x_min) + y_min_c = max(0, y_min) + x_max_c = min(canvas_w, x_max) + y_max_c = min(canvas_h, y_max) + if x_max_c <= x_min_c or y_max_c <= y_min_c: + continue + + box_w = x_max_c - x_min_c + box_h = y_max_c - y_min_c + + # 构造从 src → 局部 bbox 坐标系(左上为原点)的仿射 + dst_tri_local = dst_tri - np.array([x_min_c, y_min_c], dtype=np.float32) + M = cv2.getAffineTransform(src_tri, dst_tri_local) + + # 给 RGB 和 alpha 分别 warp 到 bbox 大小 + warped_rgb = cv2.warpAffine( + effect_rgb, + M, + (box_w, box_h), + flags=cv2.INTER_LINEAR, + borderMode=cv2.BORDER_REPLICATE, + ) + warped_a = cv2.warpAffine( + effect_a, + M, + (box_w, box_h), + flags=cv2.INTER_LINEAR, + borderMode=cv2.BORDER_CONSTANT, + borderValue=0, + ) + + # 限制只在三角形内部混合(防止 bbox 多余像素污染) + tri_mask = np.zeros((box_h, box_w), dtype=np.uint8) + cv2.fillConvexPoly( + tri_mask, + dst_tri_local.astype(np.int32), + 255, + lineType=cv2.LINE_AA, + ) + alpha = ( + warped_a.astype(np.float32) * (tri_mask.astype(np.float32) / 255.0) + ) / 255.0 + alpha = alpha[..., None] # (h,w,1) + + roi = canvas_rgb[y_min_c:y_max_c, x_min_c:x_max_c].astype(np.float32) + blended = roi * (1.0 - alpha) + warped_rgb.astype(np.float32) * alpha + canvas_rgb[y_min_c:y_max_c, x_min_c:x_max_c] = np.clip( + blended, 0, 255 + ).astype(np.uint8) + + def _encode_png(self, img_rgb: np.ndarray) -> bytes: + pil = Image.fromarray(img_rgb) + buf = io.BytesIO() + pil.save(buf, format="PNG") + return buf.getvalue() diff --git a/python/server/index_map.py b/python/server/index_map.py new file mode 100644 index 0000000..bcf7ae4 --- /dev/null +++ b/python/server/index_map.py @@ -0,0 +1,61 @@ +""" +OBJ 顶点索引 → MediaPipe FaceLandmarker landmark 索引的映射表。 + +直接从 vulkan/hardcode_data.h::indexMap[468] 同步而来。意义: + obj 顶点 i 在画面中的位置 = mediapipe_landmarks[INDEX_MAP[i]] + +注意:face_picture_3dmax.obj 的顶点数量必须正好 468,与本表长度一致。 +若以后换 obj,需要重新生成本表。 +""" + +INDEX_MAP = [ + 127, 34, 139, 11, 0, 37, 232, 231, 120, 72, + 39, 128, 121, 47, 104, 69, 67, 175, 171, 148, + 118, 50, 101, 73, 40, 9, 151, 108, 48, 115, + 131, 194, 204, 211, 74, 185, 80, 42, 183, 92, + 186, 230, 229, 202, 212, 214, 83, 18, 17, 76, + 61, 146, 160, 29, 30, 56, 157, 173, 106, 135, + 192, 203, 165, 98, 21, 71, 68, 51, 45, 4, + 144, 24, 23, 77, 91, 205, 187, 201, 200, 182, + 90, 181, 85, 84, 206, 36, 140, 193, 189, 244, + 159, 158, 28, 247, 246, 161, 236, 3, 196, 54, + 168, 8, 117, 228, 31, 55, 97, 99, 126, 100, + 166, 79, 218, 155, 154, 26, 209, 49, 136, 150, + 217, 223, 52, 53, 134, 170, 43, 119, 226, 130, + 63, 238, 20, 242, 46, 70, 156, 78, 62, 96, + 143, 227, 123, 111, 44, 125, 19, 216, 153, 22, + 167, 208, 142, 57, 60, 35, 113, 27, 210, 225, + 137, 116, 41, 38, 129, 64, 240, 102, 207, 184, + 169, 149, 176, 105, 66, 122, 6, 147, 65, 107, + 89, 180, 93, 15, 86, 14, 87, 145, 88, 179, + 95, 138, 172, 215, 58, 219, 81, 195, 199, 82, + 163, 110, 234, 109, 235, 191, 222, 141, 221, 197, + 25, 7, 33, 220, 237, 245, 162, 188, 174, 2, + 241, 164, 12, 13, 198, 133, 112, 243, 239, 190, + 32, 178, 132, 177, 1, 213, 59, 94, 75, 224, + 233, 114, 124, 356, 389, 368, 302, 267, 452, 350, + 349, 303, 269, 357, 343, 277, 453, 333, 332, 297, + 152, 377, 347, 348, 330, 304, 270, 336, 337, 278, + 279, 360, 418, 262, 431, 408, 409, 310, 415, 407, + 410, 450, 422, 430, 434, 313, 314, 306, 307, 375, + 387, 388, 260, 286, 414, 398, 335, 406, 364, 367, + 416, 423, 358, 327, 251, 284, 298, 281, 5, 373, + 374, 253, 320, 321, 425, 427, 411, 421, 405, 404, + 315, 16, 426, 266, 400, 369, 322, 391, 417, 465, + 464, 386, 257, 258, 466, 456, 399, 419, 285, 346, + 340, 261, 413, 441, 460, 328, 355, 371, 329, 392, + 439, 438, 382, 341, 256, 429, 420, 394, 379, 437, + 443, 444, 283, 275, 440, 363, 338, 273, 451, 446, + 342, 467, 293, 334, 282, 458, 461, 462, 276, 353, + 383, 308, 324, 325, 300, 372, 345, 447, 352, 274, + 248, 436, 381, 252, 393, 428, 287, 250, 384, 265, + 259, 424, 292, 366, 271, 294, 455, 272, 432, 395, + 299, 351, 280, 319, 295, 296, 403, 323, 454, 316, + 380, 318, 402, 365, 435, 397, 344, 311, 291, 396, + 268, 445, 254, 339, 449, 264, 10, 442, 370, 263, + 255, 359, 412, 301, 378, 326, 457, 362, 459, 463, + 354, 401, 361, 309, 376, 433, 289, 305, 448, 290, + 288, 249, 103, 385, 331, 317, 312, 390, +] + +assert len(INDEX_MAP) == 468, f"INDEX_MAP must have 468 entries, got {len(INDEX_MAP)}" diff --git a/python/server/main.py b/python/server/main.py new file mode 100644 index 0000000..8b3ee79 --- /dev/null +++ b/python/server/main.py @@ -0,0 +1,62 @@ +""" +FastAPI 入口。启动: + + python -m uvicorn server.main:app --host 0.0.0.0 --port 8000 + +或在 python/ 目录下: + + uvicorn server.main:app --host 0.0.0.0 --port 8000 +""" + +from __future__ import annotations + +from pathlib import Path + +from fastapi import FastAPI, File, Form, HTTPException, UploadFile +from fastapi.responses import JSONResponse, Response + +from .face_renderer import ( + EffectNotFoundError, + FaceRenderer, + NoFaceError, + RendererPaths, +) + +# 路径相对本文件,避免 cwd 不同时找不到资源 +_SERVER_DIR = Path(__file__).resolve().parent +_PATHS = RendererPaths( + obj_path=_SERVER_DIR / "assets" / "face_picture_3dmax.obj", + effects_dir=_SERVER_DIR / "effects", +) + +app = FastAPI(title="Face SDK Web", version="0.1.0") +renderer = FaceRenderer(_PATHS) + + +@app.get("/health") +def health() -> dict: + return {"ok": True} + + +@app.get("/effects") +def list_effects() -> dict: + return {"effects": renderer.list_effect_ids()} + + +@app.post("/render") +async def render( + image: UploadFile = File(...), + effect_id: int = Form(...), +) -> Response: + image_bytes = await image.read() + if not image_bytes: + raise HTTPException(status_code=400, detail="empty image") + try: + png_bytes = renderer.render(image_bytes, effect_id) + except NoFaceError: + return JSONResponse(status_code=400, content={"error": "no_face"}) + except EffectNotFoundError as e: + raise HTTPException(status_code=404, detail=str(e)) + except ValueError as e: + raise HTTPException(status_code=400, detail=str(e)) + return Response(content=png_bytes, media_type="image/png") diff --git a/python/server/mesh.py b/python/server/mesh.py new file mode 100644 index 0000000..5452b58 --- /dev/null +++ b/python/server/mesh.py @@ -0,0 +1,75 @@ +""" +解析 face_picture_3dmax.obj,得到顶点 UV 和三角形索引。 + +OBJ 约定:v 顶点 / vt UV / vn 法线,f 三元组 v/vt/vn 索引(1-based)。 +本服务只需要每个顶点的 UV 和三角形顶点索引——3D 顶点位置在 SDK 里也只是 +占位(运行时被 MediaPipe landmark 覆盖),这里同样无需读 v。 + +★ 与 vulkan/FaceApp.cpp::LoadOBJ 一致,UV 的 V 分量取 (1 - v),把 OBJ 的 + bottom-up 约定翻成 top-down,与图像(OpenCV/Pillow)一致。 +""" + +from dataclasses import dataclass +from pathlib import Path + +import numpy as np + + +@dataclass +class FaceMesh: + # (468, 2) float32, 每个顶点的 UV,V 已翻转,∈ [0,1]² + uvs: np.ndarray + # (852, 3) int32, 每个三角形的 3 个顶点索引(0-based,指向 uvs 第一维) + triangles: np.ndarray + + +def load_face_mesh(obj_path: str | Path) -> FaceMesh: + obj_path = Path(obj_path) + text = obj_path.read_text(encoding="utf-8", errors="ignore") + + pos_count = 0 + uv_list: list[tuple[float, float]] = [] + # OBJ 的 face 用 v/vt/vn,三个索引可能不同;但本工程的 obj 三者一一对齐 + # (pos_index == uv_index == normal_index),所以我们只看 v 索引来索引 UV + # 列表也成立。这里仍然显式校验以防换 obj 时出错。 + triangles: list[tuple[int, int, int]] = [] + + for raw in text.splitlines(): + line = raw.strip() + if not line or line.startswith("#"): + continue + parts = line.split() + tag = parts[0] + + if tag == "v": + pos_count += 1 + elif tag == "vt": + u = float(parts[1]) + v = float(parts[2]) + uv_list.append((u, 1.0 - v)) # V 翻转 + elif tag == "f": + if len(parts) != 4: + raise ValueError(f"only triangle faces supported, got: {line}") + tri: list[int] = [] + for token in parts[1:]: + # 形如 "v/vt/vn" 或 "v//vn" 或 "v" + seg = token.split("/") + v_idx = int(seg[0]) - 1 # OBJ 1-based → 0-based + vt_idx = int(seg[1]) - 1 if len(seg) > 1 and seg[1] else v_idx + if v_idx != vt_idx: + raise ValueError( + f"this loader assumes pos_idx == uv_idx, " + f"got v={v_idx + 1} vt={vt_idx + 1} in line: {line}" + ) + tri.append(v_idx) + triangles.append((tri[0], tri[1], tri[2])) + + if pos_count != len(uv_list): + raise ValueError( + f"vertex count {pos_count} != uv count {len(uv_list)}; " + "obj loader assumes 1:1 correspondence" + ) + + uvs = np.asarray(uv_list, dtype=np.float32) + tris = np.asarray(triangles, dtype=np.int32) + return FaceMesh(uvs=uvs, triangles=tris)