diff --git a/.vscode/launch.json b/.vscode/launch.json index e477ca7..d71c8c4 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,40 +1,40 @@ { - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - - "configurations": [ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", - { - "type": "node", - "request": "launch", - "name": "server-dev", - "runtimeExecutable": "npm", - "runtimeArgs": [ - "run-script", "dev" - ], - "cwd": "${workspaceRoot}/server/", - }, - { - "type": "node", - "request": "launch", - "name": "server-test-watch", - "runtimeExecutable": "npm", - "runtimeArgs": [ - "run-script", "test:watch" - ], - "cwd": "${workspaceRoot}/server/", - }, - { - "type": "node", - "request": "launch", - "name": "ui-dev", - "runtimeExecutable": "npm", - "runtimeArgs": [ - "run-script", "dev" - ], - "cwd": "${workspaceRoot}/ui/", - } - ] -} \ No newline at end of file + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "server-dev", + "runtimeExecutable": "npm", + "runtimeArgs": ["run-script", "dev"], + "cwd": "${workspaceRoot}/server/" + }, + { + "type": "node", + "request": "launch", + "name": "server-test-watch", + "runtimeExecutable": "npm", + "runtimeArgs": ["run-script", "test:watch"], + "cwd": "${workspaceRoot}/server/" + }, + { + "type": "node", + "request": "launch", + "name": "ui-dev", + "runtimeExecutable": "npm", + "runtimeArgs": ["run-script", "dev"], + "cwd": "${workspaceRoot}/ui/" + }, + { + "type": "chrome", + "request": "launch", + "name": "Launch debug chrome", + "url": "http://localhost:3000", + "webRoot": "${workspaceFolder}" + } + ] +} diff --git a/server/src/features/datasets/domain/exec_process_scenario.ts b/server/src/features/datasets/domain/exec_process_scenario.ts index c26e9f2..6524ac4 100644 --- a/server/src/features/datasets/domain/exec_process_scenario.ts +++ b/server/src/features/datasets/domain/exec_process_scenario.ts @@ -16,6 +16,7 @@ export class ExecDatasetProcessScenario extends CallbackStrategyWithIdQuery { return (await new IsHaveActiveProcessUseCase().call()).map(async () => { await DatasetDBModel.findById(id).updateOne({ processStatus: "RUN" }); model.local_path = `${model.local_path}/${FolderStructure.datasets}/`; + return new ExecProcessUseCase().call( `${model.project.rootDir}/`, `blenderproc run $PYTHON_BLENDER_PROC --cfg '${JSON.stringify(model)}'`, diff --git a/server/src/features/projects/domain/robossembler_assets_network_mapper_scenario.ts b/server/src/features/projects/domain/robossembler_assets_network_mapper_scenario.ts index 8625e9b..34fd9ef 100644 --- a/server/src/features/projects/domain/robossembler_assets_network_mapper_scenario.ts +++ b/server/src/features/projects/domain/robossembler_assets_network_mapper_scenario.ts @@ -12,6 +12,9 @@ export interface Parts { stlUrl: string; image: string; glUrl: string; + daeUrl: string; + objUrl: string; + solidType: string; } export class RobossemblerAssetsNetworkMapperScenario extends CallbackStrategyWithEmpty { @@ -35,7 +38,10 @@ export class RobossemblerAssetsNetworkMapperScenario extends CallbackStrategyWit el.stlUrl = `${assetAddress}${el.part_path}`; el.glUrl = `${assetLibsAddress}.glb`; + el.daeUrl = `${assetLibsAddress}.dae`; + el.objUrl = `${assetLibsAddress}.obj`; el.image = `${assetLibsAddress}.png`; + el.solidType = 'active' return el; }); return Result.ok(model); diff --git a/server/src/features/projects/domain/upload_file_to_to_project_scenario.ts b/server/src/features/projects/domain/upload_file_to_to_project_scenario.ts index df77d24..0e68312 100644 --- a/server/src/features/projects/domain/upload_file_to_to_project_scenario.ts +++ b/server/src/features/projects/domain/upload_file_to_to_project_scenario.ts @@ -13,6 +13,7 @@ export enum FolderStructure { weights = "weights", datasets = "datasets", behaviorTrees = "behavior_trees", + robots = "robots", } export class UploadCadFileToProjectScenario extends CallbackStrategyWithFileUpload { @@ -20,24 +21,23 @@ export class UploadCadFileToProjectScenario extends CallbackStrategyWithFileUplo idValidationExpression = new MongoIdValidation(); async call(file: IFile, id: string): ResponseBase { - return (await new ReadByIdDataBaseModelUseCase(ProjectDBModel).call(id)).map( - async (databaseModel) => - (await new CreateFileUseCase().call(`${databaseModel.rootDir}/${file.name}`, file.data)).map(async () => - ( - await new ExecProcessUseCase().call( - `${databaseModel.rootDir}/`, - `python3 $PYTHON_BLENDER --path '${databaseModel.rootDir}/assets/'`, - "" - ) - ).map(async () => - ( - await new CreateManyFolderScenario().call( - databaseModel.rootDir, - Object.keys(FolderStructure).map((el) => `/${el}`) - ) - ).map(() => Result.ok("file upload and save")) + return (await new ReadByIdDataBaseModelUseCase(ProjectDBModel).call(id)).map(async (databaseModel) => + (await new CreateFileUseCase().call(`${databaseModel.rootDir}/${file.name}`, file.data)).map(async () => + ( + await new ExecProcessUseCase().call( + `${databaseModel.rootDir}/`, + `python3 $PYTHON_BLENDER --path '${databaseModel.rootDir}/assets/'`, + "" ) + ).map(async () => + ( + await new CreateManyFolderScenario().call( + databaseModel.rootDir, + Object.keys(FolderStructure).map((el) => `/${el}`) + ) + ).map(() => Result.ok("file upload and save")) ) + ) ); } } diff --git a/ui/package-lock.json b/ui/package-lock.json index 0cc900a..79e9ff6 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -12,22 +12,9 @@ "@foxglove/rosmsg": "^5.0.4", "@foxglove/rosmsg2-serialization": "^2.0.3", "@foxglove/ws-protocol": "^0.7.3", - "@monaco-editor/react": "^4.6.0", - "@testing-library/jest-dom": "^5.17.0", - "@testing-library/react": "^13.4.0", - "@testing-library/user-event": "^13.5.0", - "@types/jest": "^27.5.2", - "@types/node": "^16.18.46", - "@types/react": "^18.2.21", - "@types/react-dom": "^18.2.7", - "@types/socket.io-client": "^3.0.0", - "@types/uuid": "^9.0.2", - "babylonjs": "^7.11.2", - "babylonjs-loaders": "^7.11.2", - "babylonjs-serializers": "^7.11.2", + "antd": "^4.24.15", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", - "formik-antd": "^2.0.4", "i18next": "^23.6.0", "just-clone": "^6.2.0", "mobx": "^6.10.0", @@ -36,8 +23,6 @@ "pattern-matching-ts": "^2.0.0", "react": "^18.2.0", "react-accessible-treeview": "^2.8.3", - "react-dnd": "^16.0.1", - "react-dnd-html5-backend": "^16.0.1", "react-dom": "^18.2.0", "react-i18next": "^13.3.1", "react-infinite-scroll-component": "^6.1.0", @@ -47,17 +32,12 @@ "rete-connection-plugin": "^2.0.0", "rete-react-plugin": "^2.0.4", "rete-render-utils": "^2.0.1", - "sass": "^1.66.1", - "serve": "^14.2.1", "socket.io-client": "^4.7.2", "source-map-loader": "^5.0.0", "styled-components": "^6.1.8", "three": "^0.165.0", - "three-stdlib": "^2.28.9", - "three-transform-controls": "^1.0.4", "ts-pattern": "^5.1.1", - "typescript": "^5.4", - "typescript-mixin": "^1.0.3", + "typescript": "^5.0.2", "urdf-loader": "^0.12.1", "uuid": "^9.0.1", "web-vitals": "^2.1.4", @@ -65,7 +45,13 @@ "xml-formatter": "^3.6.2" }, "devDependencies": { - "@types/three": "^0.158.3" + "@types/jest": "^27.5.2", + "@types/node": "^16.18.46", + "@types/react": "^18.2.21", + "@types/react-dom": "^18.2.7", + "@types/socket.io-client": "^3.0.0", + "@types/three": "^0.158.3", + "@types/uuid": "^9.0.2" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -76,11 +62,6 @@ "node": ">=0.10.0" } }, - "node_modules/@adobe/css-tools": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz", - "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==" - }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -108,7 +89,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz", "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", - "peer": true, "dependencies": { "@ctrl/tinycolor": "^3.4.0" } @@ -117,7 +97,6 @@ "version": "4.8.1", "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-4.8.1.tgz", "integrity": "sha512-JRAuiqllnMsiZIO8OvBOeFconprC3cnMpJ9MvXrHh+H5co9rlg8/aSHQfLf5jKKe18lUgRaIwC2pz8YxH9VuCA==", - "peer": true, "dependencies": { "@ant-design/colors": "^6.0.0", "@ant-design/icons-svg": "^4.3.0", @@ -137,14 +116,12 @@ "node_modules/@ant-design/icons-svg": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", - "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==", - "peer": true + "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==" }, "node_modules/@ant-design/react-slick": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.0.2.tgz", "integrity": "sha512-Wj8onxL/T8KQLFFiCA4t8eIRGpRR+UPgOdac2sYzonv+i0n3kXHmvHLLiOYL655DQx2Umii9Y9nNgL7ssu5haQ==", - "peer": true, "dependencies": { "@babel/runtime": "^7.10.4", "classnames": "^2.2.5", @@ -2518,7 +2495,6 @@ "version": "3.6.1", "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", - "peer": true, "engines": { "node": ">=10" } @@ -3176,30 +3152,6 @@ "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" }, - "node_modules/@monaco-editor/loader": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.4.0.tgz", - "integrity": "sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==", - "dependencies": { - "state-local": "^1.0.6" - }, - "peerDependencies": { - "monaco-editor": ">= 0.21.0 < 1" - } - }, - "node_modules/@monaco-editor/react": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.6.0.tgz", - "integrity": "sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==", - "dependencies": { - "@monaco-editor/loader": "^1.4.0" - }, - "peerDependencies": { - "monaco-editor": ">= 0.25.0 < 1", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", @@ -3322,7 +3274,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", - "peer": true, "dependencies": { "@babel/runtime": "^7.18.0", "classnames": "^2.3.2", @@ -3336,21 +3287,6 @@ "react-dom": ">=16.9.0" } }, - "node_modules/@react-dnd/asap": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-5.0.2.tgz", - "integrity": "sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==" - }, - "node_modules/@react-dnd/invariant": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-4.0.2.tgz", - "integrity": "sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw==" - }, - "node_modules/@react-dnd/shallowequal": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-4.0.2.tgz", - "integrity": "sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA==" - }, "node_modules/@remix-run/router": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.0.tgz", @@ -3698,108 +3634,6 @@ "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@testing-library/dom": { - "version": "9.3.4", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", - "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@testing-library/jest-dom": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", - "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", - "dependencies": { - "@adobe/css-tools": "^4.0.1", - "@babel/runtime": "^7.9.2", - "@types/testing-library__jest-dom": "^5.9.1", - "aria-query": "^5.0.0", - "chalk": "^3.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.5.6", - "lodash": "^4.17.15", - "redent": "^3.0.0" - }, - "engines": { - "node": ">=8", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/react": { - "version": "13.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz", - "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^8.5.0", - "@types/react-dom": "^18.0.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@testing-library/react/node_modules/@testing-library/dom": { - "version": "8.20.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", - "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@testing-library/user-event": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", - "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" - } - }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -3816,11 +3650,6 @@ "node": ">=10.13.0" } }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==" - }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -3892,11 +3721,6 @@ "@types/node": "*" } }, - "node_modules/@types/draco3d": { - "version": "1.4.9", - "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.9.tgz", - "integrity": "sha512-4MMUjMQb4yA5fJ4osXx+QxGHt0/ZSy4spT6jL1HM7Tn8OJEC35siqdnpOo+HxPhYjqEFumKfGVF9hJfdyKBIBA==" - }, "node_modules/@types/eslint": { "version": "8.56.2", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz", @@ -3950,16 +3774,6 @@ "@types/node": "*" } }, - "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", - "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", - "peer": true, - "dependencies": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" - } - }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -4003,6 +3817,7 @@ "version": "27.5.2", "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.5.2.tgz", "integrity": "sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==", + "dev": true, "dependencies": { "jest-matcher-utils": "^27.0.0", "pretty-format": "^27.0.0" @@ -4036,11 +3851,6 @@ "@types/node": "*" } }, - "node_modules/@types/offscreencanvas": { - "version": "2019.7.3", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", - "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==" - }, "node_modules/@types/parse-json": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", @@ -4054,7 +3864,8 @@ "node_modules/@types/prop-types": { "version": "15.7.11", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", + "dev": true }, "node_modules/@types/q": { "version": "1.5.8", @@ -4075,6 +3886,7 @@ "version": "18.2.55", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.55.tgz", "integrity": "sha512-Y2Tz5P4yz23brwm2d7jNon39qoAtMMmalOQv6+fEFt1mT+FcM3D841wDpoUvFXhaYenuROCy3FZYqdTjM7qVyA==", + "dev": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -4085,6 +3897,7 @@ "version": "18.2.19", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.19.tgz", "integrity": "sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==", + "dev": true, "dependencies": { "@types/react": "*" } @@ -4105,7 +3918,8 @@ "node_modules/@types/scheduler": { "version": "0.16.8", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", + "dev": true }, "node_modules/@types/semver": { "version": "7.5.7", @@ -4144,6 +3958,7 @@ "resolved": "https://registry.npmjs.org/@types/socket.io-client/-/socket.io-client-3.0.0.tgz", "integrity": "sha512-s+IPvFoEIjKA3RdJz/Z2dGR4gLgysKi8owcnrVwNjgvc01Lk68LJDDsG2GRqegFITcxmvCMYM7bhMpwEMlHmDg==", "deprecated": "This is a stub types definition. socket.io-client provides its own type definitions, so you do not need this installed.", + "dev": true, "dependencies": { "socket.io-client": "*" } @@ -4172,14 +3987,6 @@ "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.0.tgz", "integrity": "sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw==" }, - "node_modules/@types/testing-library__jest-dom": { - "version": "5.14.9", - "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", - "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==", - "dependencies": { - "@types/jest": "*" - } - }, "node_modules/@types/three": { "version": "0.158.3", "resolved": "https://registry.npmjs.org/@types/three/-/three-0.158.3.tgz", @@ -4200,7 +4007,8 @@ "node_modules/@types/uuid": { "version": "9.0.8", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", - "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==" + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", + "dev": true }, "node_modules/@types/validator": { "version": "13.11.9", @@ -4210,7 +4018,8 @@ "node_modules/@types/webxr": { "version": "0.5.14", "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.14.tgz", - "integrity": "sha512-UEMMm/Xn3DtEa+gpzUrOcDj+SJS1tk5YodjwOxcqStNhCfPcwgyC5Srg2ToVKyg2Fhq16Ffpb0UWUQHqoT9AMA==" + "integrity": "sha512-UEMMm/Xn3DtEa+gpzUrOcDj+SJS1tk5YodjwOxcqStNhCfPcwgyC5Srg2ToVKyg2Fhq16Ffpb0UWUQHqoT9AMA==", + "dev": true }, "node_modules/@types/ws": { "version": "8.5.10", @@ -4597,11 +4406,6 @@ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, - "node_modules/@zeit/schemas": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.29.0.tgz", - "integrity": "sha512-g5QiLIfbg3pLuYUJPlisNKY+epQJTcMDsOnVNkscrDP1oi7vmJnzOANYJI/1pZcVJ6umUkBv3aFtlg1UvUHGzA==" - }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", @@ -4765,32 +4569,6 @@ "ajv": "^6.9.1" } }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -4842,7 +4620,6 @@ "version": "4.24.15", "resolved": "https://registry.npmjs.org/antd/-/antd-4.24.15.tgz", "integrity": "sha512-pXCNJB8cTSjQdqeW5RNadraiYiJkMec/Qt0Zh+fEKUK9UqwmD4TxIYs/xnEbyQIVtHHwtl0fW684xql73KhCyQ==", - "peer": true, "dependencies": { "@ant-design/colors": "^6.0.0", "@ant-design/icons": "^4.8.1", @@ -4914,25 +4691,6 @@ "node": ">= 8" } }, - "node_modules/arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -4946,14 +4704,6 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dependencies": { - "deep-equal": "^2.0.5" - } - }, "node_modules/array-buffer-byte-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", @@ -4995,8 +4745,7 @@ "node_modules/array-tree-filter": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", - "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==", - "peer": true + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" }, "node_modules/array-union": { "version": "2.1.0", @@ -5145,8 +4894,7 @@ "node_modules/async-validator": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", - "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", - "peer": true + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" }, "node_modules/asynciterator.prototype": { "version": "1.0.0", @@ -5448,35 +5196,6 @@ "babel-plugin-transform-react-remove-prop-types": "^0.4.24" } }, - "node_modules/babylonjs": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/babylonjs/-/babylonjs-7.11.2.tgz", - "integrity": "sha512-OkrJhjpVHZTaUnr823rbhhfzbBVVqMdKDDFIOCVieOAz70Tgbw20gn0OULAF06QiAdnw6sP+q164vXCTmIpgKw==", - "hasInstallScript": true - }, - "node_modules/babylonjs-gltf2interface": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-7.11.2.tgz", - "integrity": "sha512-U13k7gViz42Ntu6BtgBenl5ZA6TuNl5JTKSUP9/LVR1muD2AiNYLx/ztiqJcr99EG8lG5m0UT5sBwhmFNW2orA==" - }, - "node_modules/babylonjs-loaders": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/babylonjs-loaders/-/babylonjs-loaders-7.11.2.tgz", - "integrity": "sha512-I/VN6gOA7JXnQcpmi+Ji9R7PCoQZN+lNoUwcC02OA2dsS9QtkFrqiXGWu7Wdx4aYX2gcRHgbdA3XcpBp/SN3sw==", - "dependencies": { - "babylonjs": "^7.11.2", - "babylonjs-gltf2interface": "^7.11.2" - } - }, - "node_modules/babylonjs-serializers": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/babylonjs-serializers/-/babylonjs-serializers-7.11.2.tgz", - "integrity": "sha512-VDxy552VVC7b1Wi/lnbCOr8C1FqbPtOvliOBEPUnUplTJ9n5CMH5ENNmXqpttmuryqSmjIBAS+4KBHgbEfvofw==", - "dependencies": { - "babylonjs": "^7.11.2", - "babylonjs-gltf2interface": "^7.11.2" - } - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -5592,60 +5311,6 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, - "node_modules/boxen": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", - "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.0", - "chalk": "^5.0.1", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/boxen/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -5849,20 +5514,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chalk-template": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", - "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", - "dependencies": { - "chalk": "^4.1.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/chalk-template?sponsor=1" - } - }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -5955,8 +5606,7 @@ "node_modules/classnames": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", - "peer": true + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" }, "node_modules/clean-css": { "version": "5.3.3", @@ -5977,33 +5627,6 @@ "node": ">=0.10.0" } }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clipboardy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz", - "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==", - "dependencies": { - "arch": "^2.2.0", - "execa": "^5.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -6251,8 +5874,7 @@ "node_modules/compute-scroll-into-view": { "version": "1.0.20", "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", - "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==", - "peer": true + "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==" }, "node_modules/concat-map": { "version": "0.0.1", @@ -6272,14 +5894,6 @@ "node": ">=0.8" } }, - "node_modules/content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/content-type": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", @@ -6310,7 +5924,6 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", - "peer": true, "dependencies": { "toggle-selection": "^1.0.6" } @@ -6644,11 +6257,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" - }, "node_modules/cssdb": { "version": "7.10.0", "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.10.0.tgz", @@ -6808,7 +6416,8 @@ "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true }, "node_modules/damerau-levenshtein": { "version": "1.0.8", @@ -6832,7 +6441,6 @@ "version": "2.30.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "peer": true, "dependencies": { "@babel/runtime": "^7.21.0" }, @@ -6847,8 +6455,7 @@ "node_modules/dayjs": { "version": "1.11.10", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", - "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==", - "peer": true + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" }, "node_modules/debug": { "version": "4.3.4", @@ -6876,59 +6483,11 @@ "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, - "node_modules/deepmerge": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", - "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/default-gateway": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", @@ -7085,16 +6644,6 @@ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" }, - "node_modules/dnd-core": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-16.0.1.tgz", - "integrity": "sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==", - "dependencies": { - "@react-dnd/asap": "^5.0.1", - "@react-dnd/invariant": "^4.0.1", - "redux": "^4.2.0" - } - }, "node_modules/dns-packet": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", @@ -7117,16 +6666,10 @@ "node": ">=6.0.0" } }, - "node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==" - }, "node_modules/dom-align": { "version": "1.12.4", "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz", - "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==", - "peer": true + "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==" }, "node_modules/dom-converter": { "version": "0.2.0", @@ -7229,11 +6772,6 @@ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" }, - "node_modules/draco3d": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", - "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==" - }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -7452,25 +6990,6 @@ "node": ">= 0.4" } }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/es-iterator-helpers": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.16.tgz", @@ -8359,14 +7878,6 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, - "node_modules/fast-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", - "dependencies": { - "punycode": "^1.3.2" - } - }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", @@ -8397,7 +7908,8 @@ "node_modules/fflate": { "version": "0.6.10", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", - "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==" + "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==", + "dev": true }, "node_modules/file-entry-cache": { "version": "6.0.1", @@ -8720,42 +8232,6 @@ "node": ">= 6" } }, - "node_modules/formik": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/formik/-/formik-2.4.5.tgz", - "integrity": "sha512-Gxlht0TD3vVdzMDHwkiNZqJ7Mvg77xQNfmBRrNtvzcHZs72TJppSTDKHpImCMJZwcWPBJ8jSQQ95GJzXFf1nAQ==", - "funding": [ - { - "type": "individual", - "url": "https://opencollective.com/formik" - } - ], - "peer": true, - "dependencies": { - "@types/hoist-non-react-statics": "^3.3.1", - "deepmerge": "^2.1.1", - "hoist-non-react-statics": "^3.3.0", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "react-fast-compare": "^2.0.1", - "tiny-warning": "^1.0.2", - "tslib": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/formik-antd": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/formik-antd/-/formik-antd-2.0.4.tgz", - "integrity": "sha512-3O87GtSFcwa+70pZuJu74yaWttiCnx4lJ4lbXcgx/WtLHSUAx9U2qlsxxwc7Nf7IeTQQbygijSCkqsKSCJHG6g==", - "peerDependencies": { - "antd": ">= 3.12.1 < 5", - "formik": ">= 1.4.1 < 3", - "react": ">= 16.8.0", - "react-dom": ">= 16.8.0" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -9165,14 +8641,6 @@ "he": "bin/he" } }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dependencies": { - "react-is": "^16.7.0" - } - }, "node_modules/hoopy": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", @@ -9506,7 +8974,9 @@ "node_modules/immutable": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", - "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==" + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", + "optional": true, + "peer": true }, "node_modules/import-fresh": { "version": "3.3.0", @@ -9557,14 +9027,6 @@ "node": ">=0.8.19" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -9605,21 +9067,6 @@ "node": ">= 10" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-array-buffer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", @@ -9874,17 +9321,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-port-reachable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-4.0.0.tgz", - "integrity": "sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -11170,7 +10606,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", - "peer": true, "dependencies": { "string-convert": "^0.2.0" } @@ -11381,12 +10816,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "peer": true - }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -11439,14 +10868,6 @@ "yallist": "^3.0.2" } }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "bin": { - "lz-string": "bin/bin.js" - } - }, "node_modules/magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", @@ -11596,14 +11017,6 @@ "node": ">=6" } }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "engines": { - "node": ">=4" - } - }, "node_modules/mini-css-extract-plugin": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.0.tgz", @@ -11766,17 +11179,10 @@ "version": "2.30.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "peer": true, "engines": { "node": "*" } }, - "node_modules/monaco-editor": { - "version": "0.46.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.46.0.tgz", - "integrity": "sha512-ADwtLIIww+9FKybWscd7OCfm9odsFYHImBRI1v9AviGce55QY8raT+9ihH8jX/E/e6QVSGM+pKj4jSUSRmALNQ==", - "peer": true - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -11949,21 +11355,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -12277,11 +11668,6 @@ "node": ">=0.10.0" } }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -12318,11 +11704,6 @@ "node": "14 || >=16.14" } }, - "node_modules/path-to-regexp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", - "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" - }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -13692,11 +13073,6 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, - "node_modules/potpack": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", - "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==" - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -13814,11 +13190,6 @@ "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, - "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" - }, "node_modules/q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -13882,14 +13253,6 @@ "safe-buffer": "^5.1.0" } }, - "node_modules/range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/raw-body": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", @@ -13923,25 +13286,10 @@ "node": ">=0.10.0" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, "node_modules/rc-align": { "version": "4.0.15", "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.15.tgz", "integrity": "sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA==", - "peer": true, "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", @@ -13958,7 +13306,6 @@ "version": "3.7.3", "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.7.3.tgz", "integrity": "sha512-KBpT+kzhxDW+hxPiNk4zaKa99+Lie2/8nnI11XF+FIOPl4Bj9VlFZi61GrnWzhLGA7VEN+dTxAkNOjkySDa0dA==", - "peer": true, "dependencies": { "@babel/runtime": "^7.12.5", "array-tree-filter": "^2.1.0", @@ -13976,7 +13323,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.0.1.tgz", "integrity": "sha512-k7nxDWxYF+jDI0ZcCvuvj71xONmWRVe5+1MKcERRR9MRyP3tZ69b+yUCSXXh+sik4/Hc9P5wHr2nnUoGS2zBjA==", - "peer": true, "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.3.2", @@ -13991,7 +13337,6 @@ "version": "3.4.2", "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.4.2.tgz", "integrity": "sha512-jpTwLgJzkhAgp2Wpi3xmbTbbYExg6fkptL67Uu5LCRVEj6wqmy0DHTjjeynsjOLsppHGHu41t1ELntZ0lEvS/Q==", - "peer": true, "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", @@ -14008,7 +13353,6 @@ "version": "9.0.2", "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.0.2.tgz", "integrity": "sha512-s3U+24xWUuB6Bn2Lk/Qt6rufy+uT+QvWkiFhNBcO9APLxcFFczWamaq7x9h8SCuhfc1nHcW4y8NbMsnAjNnWyg==", - "peer": true, "dependencies": { "@babel/runtime": "^7.10.1", "@rc-component/portal": "^1.0.0-8", @@ -14025,7 +13369,6 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-6.3.0.tgz", "integrity": "sha512-uBZVb3xTAR+dBV53d/bUhTctCw3pwcwJoM7g5aX+7vgwt2zzVzoJ6aqFjYJpBlZ9zp0dVYN8fV+hykFE7c4lig==", - "peer": true, "dependencies": { "@babel/runtime": "^7.10.1", "@rc-component/portal": "^1.1.1", @@ -14042,7 +13385,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.0.1.tgz", "integrity": "sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g==", - "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "classnames": "^2.2.6", @@ -14058,7 +13400,6 @@ "version": "1.38.2", "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.38.2.tgz", "integrity": "sha512-O83Oi1qPyEv31Sg+Jwvsj6pXc8uQI2BtIAkURr5lvEYHVggXJhdU/nynK8wY1gbw0qR48k731sN5ON4egRCROA==", - "peer": true, "dependencies": { "@babel/runtime": "^7.18.0", "async-validator": "^4.1.0", @@ -14076,7 +13417,6 @@ "version": "5.13.0", "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-5.13.0.tgz", "integrity": "sha512-iZTOmw5eWo2+gcrJMMcnd7SsxVHl3w5xlyCgsULUdJhJbnuI8i/AL0tVOsE7aLn9VfOh1qgDT3mC2G75/c7mqg==", - "peer": true, "dependencies": { "@babel/runtime": "^7.11.2", "@rc-component/portal": "^1.0.2", @@ -14094,7 +13434,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-0.1.4.tgz", "integrity": "sha512-FqDdNz+fV2dKNgfXzcSLKvC+jEs1709t7nD+WdfjrdSaOcefpgc7BUJYadc3usaING+b7ediMTfKxuJBsEFbXA==", - "peer": true, "dependencies": { "@babel/runtime": "^7.11.1", "classnames": "^2.2.1", @@ -14109,7 +13448,6 @@ "version": "7.3.11", "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-7.3.11.tgz", "integrity": "sha512-aMWPEjFeles6PQnMqP5eWpxzsvHm9rh1jQOWXExUEIxhX62Fyl/ptifLHOn17+waDG1T/YUb6flfJbvwRhHrbA==", - "peer": true, "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.5", @@ -14124,7 +13462,6 @@ "version": "1.13.1", "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-1.13.1.tgz", "integrity": "sha512-FCkaWw6JQygtOz0+Vxz/M/NWqrWHB9LwqlY2RtcuFqWJNFK9njijOOzTSsBGANliGufVUzx/xuPHmZPBV0+Hgw==", - "peer": true, "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.6", @@ -14142,7 +13479,6 @@ "version": "9.8.4", "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.8.4.tgz", "integrity": "sha512-lmw2j8I2fhdIzHmC9ajfImfckt0WDb2KVJJBBRIsxPEw2kGkEfjLMUoB1NgiNT/Q5cC8PdjGOGQjHJIJMwyNMw==", - "peer": true, "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", @@ -14160,7 +13496,6 @@ "version": "2.9.0", "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.0.tgz", "integrity": "sha512-XIU2+xLkdIr1/h6ohPZXyPBMvOmuyFZQ/T0xnawz+Rh+gh4FINcnZmMT5UTIj6hgI0VLDjTaPeRd+smJeSPqiQ==", - "peer": true, "dependencies": { "@babel/runtime": "^7.11.1", "classnames": "^2.2.1", @@ -14175,7 +13510,6 @@ "version": "4.6.1", "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-4.6.1.tgz", "integrity": "sha512-NSmFYwrrdY3+un1GvDAJQw62Xi9LNMSsoQyo95tuaYrcad5Bn9gJUL8AREufRxSQAQnr64u3LtP3EUyLYT6bhw==", - "peer": true, "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", @@ -14194,7 +13528,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.3.2.tgz", "integrity": "sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw==", - "peer": true, "dependencies": { "@babel/runtime": "^7.11.1", "classnames": "^2.2.1", @@ -14210,7 +13543,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.2.0.tgz", "integrity": "sha512-5tIXjB670WwwcAJzAqp2J+cOBS9W3cH/WU1EiYwXljuZ4vtZXKlY2Idq8FZrnYBz8KhN3vwPo9CoV/SJS6SL1w==", - "peer": true, "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.1" @@ -14224,7 +13556,6 @@ "version": "2.7.6", "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-2.7.6.tgz", "integrity": "sha512-H9if/BUJUZBOhPfWcPeT15JUI3/ntrG9muzERrXDkSoWmDj4yzmBvumozpxYrHwjcKnjyDGAke68d+whWwvhHA==", - "peer": true, "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.1", @@ -14247,7 +13578,6 @@ "version": "3.4.2", "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.4.2.tgz", "integrity": "sha512-iAGhwWU+tsayP+Jkl9T4+6rHeQTG9kDz8JAHZk4XtQOcYN5fj9H34NXNEdRdZx94VUDHMqCb1yOIvi8eJRh67w==", - "peer": true, "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.6", @@ -14262,7 +13592,6 @@ "version": "2.9.3", "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.9.3.tgz", "integrity": "sha512-2THssUSnRhtqIouQIIXqsZGzRczvp4WsH4WvGuhiwm+LG2fVpDUJliP9O1zeDOZvYfBE/Bup4SgHun/eCkbjgQ==", - "peer": true, "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.5", @@ -14280,7 +13609,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.0.tgz", "integrity": "sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q==", - "peer": true, "dependencies": { "@babel/runtime": "^7.20.7", "classnames": "^2.2.1", @@ -14296,7 +13624,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.1.2.tgz", "integrity": "sha512-qGo1bCr83ESXpXVOCXjFe1QJlCAQXyi9KCiy8eX3rIMYlTeJr/ftySIaTnYsitL18SvWf5ZEHsfqIWoX0EMfFQ==", - "peer": true, "dependencies": { "@babel/runtime": "^7.11.1", "classnames": "^2.2.1", @@ -14312,7 +13639,6 @@ "version": "14.1.18", "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.1.18.tgz", "integrity": "sha512-4JgY3oG2Yz68ECMUSCON7mtxuJvCSj+LJpHEg/AONaaVBxIIrmI/ZTuMJkyojall/X50YdBe5oMKqHHPNiPzEg==", - "peer": true, "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", @@ -14334,7 +13660,6 @@ "version": "10.0.1", "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.0.1.tgz", "integrity": "sha512-igTKF3zBet7oS/3yNiIlmU8KnZ45npmrmHlUUio8PNbIhzMcsh+oE/r2UD42Y6YD2D/s+kzCQkzQrPD6RY435Q==", - "peer": true, "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.5", @@ -14353,7 +13678,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-5.0.0.tgz", "integrity": "sha512-9TgRvnVYirdhbV0C3syJFj9EhCRqoJAsxt4i1rED5o8/ZcSv5TLIYyo4H8MCjLPvbe2R+oBAm/IYBEtC+OS1Rw==", - "peer": true, "dependencies": { "@babel/runtime": "^7.16.7", "classnames": "^2.2.3", @@ -14371,7 +13695,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-3.2.2.tgz", "integrity": "sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A==", - "peer": true, "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.1", @@ -14386,7 +13709,6 @@ "version": "7.26.0", "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.26.0.tgz", "integrity": "sha512-0cD8e6S+DTGAt5nBZQIPFYEaIukn17sfa5uFL98faHlH/whZzD8ii3dbFL4wmUDEL4BLybhYop+QUfZJ4CPvNQ==", - "peer": true, "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.5", @@ -14406,7 +13728,6 @@ "version": "12.5.10", "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-12.5.10.tgz", "integrity": "sha512-Ay0l0jtd4eXepFH9vWBvinBjqOpqzcsJTerBGwJy435P2S90Uu38q8U/mvc1sxUEVOXX5ZCFbxcWPnfG3dH+tQ==", - "peer": true, "dependencies": { "@babel/runtime": "^7.11.2", "classnames": "2.x", @@ -14428,7 +13749,6 @@ "version": "0.4.7", "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-0.4.7.tgz", "integrity": "sha512-IQPd1CDI3mnMlkFyzt2O4gQ2lxUsnBAeJEoZGJnkkXgORNqyM9qovdrCj9NzcRfpHgLdzaEbU3AmobNFGUznwQ==", - "peer": true, "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.1", @@ -14445,7 +13765,6 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-5.2.2.tgz", "integrity": "sha512-jtQzU/18S6EI3lhSGoDYhPqNpWajMtS5VV/ld1LwyfrDByQpYmw/LW6U7oFXXLukjfDHQ7Ju705A82PRNFWYhg==", - "peer": true, "dependencies": { "@babel/runtime": "^7.11.2", "classnames": "^2.3.1", @@ -14460,7 +13779,6 @@ "version": "5.7.12", "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.7.12.tgz", "integrity": "sha512-LXA5nY2hG5koIAlHW5sgXgLpOMz+bFRbnZZ+cCg0tQs4Wv1AmY7EDi1SK7iFXhslYockbqUerQan82jljoaItg==", - "peer": true, "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", @@ -14480,7 +13798,6 @@ "version": "5.5.5", "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.5.5.tgz", "integrity": "sha512-k2av7jF6tW9bIO4mQhaVdV4kJ1c54oxV3/hHVU+oD251Gb5JN+m1RbJFTMf1o0rAFqkvto33rxMdpafaGKQRJw==", - "peer": true, "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "2.x", @@ -14497,7 +13814,6 @@ "version": "5.3.4", "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.3.4.tgz", "integrity": "sha512-mQv+vas0TwKcjAO2izNPkqR4j86OemLRmvL2nOzdP9OWNWA1ivoTt5hzFqYNW9zACwmTezRiN8bttrC7cZzYSw==", - "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "classnames": "^2.2.6", @@ -14517,7 +13833,6 @@ "version": "4.3.6", "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.3.6.tgz", "integrity": "sha512-Bt7ESeG5tT3IY82fZcP+s0tQU2xmo1W6P3S8NboUUliquJLQYLkUcsaExi3IlBVr43GQMCjo30RA2o0i70+NjA==", - "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "classnames": "^2.2.5", @@ -14532,7 +13847,6 @@ "version": "5.38.1", "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.38.1.tgz", "integrity": "sha512-e4ZMs7q9XqwTuhIK7zBIVFltUtMSjphuPPQXHoHlzRzNdOwUxDejo0Zls5HYaJfRKNURcsS/ceKVULlhjBrxng==", - "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "react-is": "^18.2.0" @@ -14545,14 +13859,12 @@ "node_modules/rc-util/node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "peer": true + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, "node_modules/rc-virtual-list": { "version": "3.11.4", "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.11.4.tgz", "integrity": "sha512-NbBi0fvyIu26gP69nQBiWgUMTPX3mr4FcuBQiVqagU0BnuX8WQkiivnMs105JROeuUIFczLrlgUhLQwTWV1XDA==", - "peer": true, "dependencies": { "@babel/runtime": "^7.20.0", "classnames": "^2.2.6", @@ -14567,14 +13879,6 @@ "react-dom": ">=16.9.0" } }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -14660,43 +13964,6 @@ "node": ">= 12.13.0" } }, - "node_modules/react-dnd": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-16.0.1.tgz", - "integrity": "sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q==", - "dependencies": { - "@react-dnd/invariant": "^4.0.1", - "@react-dnd/shallowequal": "^4.0.1", - "dnd-core": "^16.0.1", - "fast-deep-equal": "^3.1.3", - "hoist-non-react-statics": "^3.3.2" - }, - "peerDependencies": { - "@types/hoist-non-react-statics": ">= 3.3.1", - "@types/node": ">= 12", - "@types/react": ">= 16", - "react": ">= 16.14" - }, - "peerDependenciesMeta": { - "@types/hoist-non-react-statics": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-dnd-html5-backend": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-16.0.1.tgz", - "integrity": "sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw==", - "dependencies": { - "dnd-core": "^16.0.1" - } - }, "node_modules/react-dom": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", @@ -14714,12 +13981,6 @@ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" }, - "node_modules/react-fast-compare": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", - "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==", - "peer": true - }, "node_modules/react-i18next": { "version": "13.5.0", "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-13.5.0.tgz", @@ -14938,26 +14199,6 @@ "node": ">=6.0.0" } }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/redux": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", - "dependencies": { - "@babel/runtime": "^7.9.2" - } - }, "node_modules/reflect-metadata": { "version": "0.1.14", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", @@ -15050,26 +14291,6 @@ "node": ">=4" } }, - "node_modules/registry-auth-token": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", - "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", - "dependencies": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", - "dependencies": { - "rc": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/regjsparser": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", @@ -15133,8 +14354,7 @@ "node_modules/resize-observer-polyfill": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", - "peer": true + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" }, "node_modules/resolve": { "version": "1.22.8", @@ -15472,6 +14692,8 @@ "version": "1.70.0", "resolved": "https://registry.npmjs.org/sass/-/sass-1.70.0.tgz", "integrity": "sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ==", + "optional": true, + "peer": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -15566,7 +14788,6 @@ "version": "2.2.31", "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz", "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==", - "peer": true, "dependencies": { "compute-scroll-into-view": "^1.0.20" } @@ -15675,64 +14896,6 @@ "randombytes": "^2.1.0" } }, - "node_modules/serve": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/serve/-/serve-14.2.1.tgz", - "integrity": "sha512-48er5fzHh7GCShLnNyPBRPEjs2I6QBozeGr02gaacROiyS/8ARADlj595j39iZXAqBbJHH/ivJJyPRWY9sQWZA==", - "dependencies": { - "@zeit/schemas": "2.29.0", - "ajv": "8.11.0", - "arg": "5.0.2", - "boxen": "7.0.0", - "chalk": "5.0.1", - "chalk-template": "0.4.0", - "clipboardy": "3.0.0", - "compression": "1.7.4", - "is-port-reachable": "4.0.0", - "serve-handler": "6.1.5", - "update-check": "1.5.4" - }, - "bin": { - "serve": "build/main.js" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/serve-handler": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", - "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", - "dependencies": { - "bytes": "3.0.0", - "content-disposition": "0.5.2", - "fast-url-parser": "1.1.3", - "mime-types": "2.1.18", - "minimatch": "3.1.2", - "path-is-inside": "1.0.2", - "path-to-regexp": "2.2.1", - "range-parser": "1.2.0" - } - }, - "node_modules/serve-handler/node_modules/mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-handler/node_modules/mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dependencies": { - "mime-db": "~1.33.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", @@ -15817,37 +14980,6 @@ "node": ">= 0.8.0" } }, - "node_modules/serve/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/serve/node_modules/chalk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", - "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/serve/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, "node_modules/set-function-length": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", @@ -16119,11 +15251,6 @@ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" }, - "node_modules/state-local": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", - "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==" - }, "node_modules/static-eval": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", @@ -16225,17 +15352,6 @@ "node": ">= 0.8" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -16247,8 +15363,7 @@ "node_modules/string-convert": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", - "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==", - "peer": true + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" }, "node_modules/string-length": { "version": "4.0.2", @@ -16448,17 +15563,6 @@ "node": ">=6" } }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -17021,27 +16125,6 @@ "resolved": "https://registry.npmjs.org/three/-/three-0.165.0.tgz", "integrity": "sha512-cc96IlVYGydeceu0e5xq70H8/yoVT/tXBxV/W8A/U6uOq7DXc4/s1Mkmnu6SqoYGhSRWWYFOhVwvq6V0VtbplA==" }, - "node_modules/three-stdlib": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.29.4.tgz", - "integrity": "sha512-XNzGCrz/uAk9XoLwd35eN7dQyI4ggXZTeqjcN034YdYBpBlNO9kmLHehl/0Nw9jCelblB7jla+unHAOIyLyV6Q==", - "dependencies": { - "@types/draco3d": "^1.4.0", - "@types/offscreencanvas": "^2019.6.4", - "@types/webxr": "^0.5.2", - "draco3d": "^1.4.1", - "fflate": "^0.6.9", - "potpack": "^1.0.1" - }, - "peerDependencies": { - "three": ">=0.128.0" - } - }, - "node_modules/three-transform-controls": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/three-transform-controls/-/three-transform-controls-1.0.4.tgz", - "integrity": "sha512-egZhx5zDBBuqSOeIqZR6lngVgvELKfKGNlSJOfwYBys1wwEJOKfd7R1HmREbcLs+T7NjtbHymz1fgz+ZBMFRog==" - }, "node_modules/throat": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", @@ -17051,7 +16134,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.0.tgz", "integrity": "sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==", - "peer": true, "engines": { "node": ">=12.22" } @@ -17061,12 +16143,6 @@ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", - "peer": true - }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -17094,8 +16170,7 @@ "node_modules/toggle-selection": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", - "peer": true + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" }, "node_modules/toidentifier": { "version": "1.0.1", @@ -17346,11 +16421,6 @@ "node": ">=14.17" } }, - "node_modules/typescript-mixin": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typescript-mixin/-/typescript-mixin-1.0.3.tgz", - "integrity": "sha512-+GbEURqtLnR0WY+P1IFv9r3MK4u96Elci85QWfBZWktIxI89DVLWAAKy858org2tbom61URDQvL1QtU72knzkQ==" - }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -17476,15 +16546,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/update-check": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.4.tgz", - "integrity": "sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==", - "dependencies": { - "registry-auth-token": "3.3.2", - "registry-url": "3.1.0" - } - }, "node_modules/urdf-loader": { "version": "0.12.1", "resolved": "https://registry.npmjs.org/urdf-loader/-/urdf-loader-0.12.1.tgz", @@ -18131,20 +17192,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", diff --git a/ui/package.json b/ui/package.json index b7ea1fc..24261bb 100644 --- a/ui/package.json +++ b/ui/package.json @@ -7,22 +7,9 @@ "@foxglove/rosmsg": "^5.0.4", "@foxglove/rosmsg2-serialization": "^2.0.3", "@foxglove/ws-protocol": "^0.7.3", - "@monaco-editor/react": "^4.6.0", - "@testing-library/jest-dom": "^5.17.0", - "@testing-library/react": "^13.4.0", - "@testing-library/user-event": "^13.5.0", - "@types/jest": "^27.5.2", - "@types/node": "^16.18.46", - "@types/react": "^18.2.21", - "@types/react-dom": "^18.2.7", - "@types/socket.io-client": "^3.0.0", - "@types/uuid": "^9.0.2", - "babylonjs": "^7.11.2", - "babylonjs-loaders": "^7.11.2", - "babylonjs-serializers": "^7.11.2", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", - "formik-antd": "^2.0.4", + "antd": "^4.24.15", "i18next": "^23.6.0", "just-clone": "^6.2.0", "mobx": "^6.10.0", @@ -31,8 +18,6 @@ "pattern-matching-ts": "^2.0.0", "react": "^18.2.0", "react-accessible-treeview": "^2.8.3", - "react-dnd": "^16.0.1", - "react-dnd-html5-backend": "^16.0.1", "react-dom": "^18.2.0", "react-i18next": "^13.3.1", "react-infinite-scroll-component": "^6.1.0", @@ -42,23 +27,21 @@ "rete-connection-plugin": "^2.0.0", "rete-react-plugin": "^2.0.4", "rete-render-utils": "^2.0.1", - "sass": "^1.66.1", - "serve": "^14.2.1", "socket.io-client": "^4.7.2", "source-map-loader": "^5.0.0", "styled-components": "^6.1.8", "three": "^0.165.0", - "three-stdlib": "^2.28.9", - "three-transform-controls": "^1.0.4", "ts-pattern": "^5.1.1", - "typescript": "^5.4", - "typescript-mixin": "^1.0.3", + "typescript": "^5.0.2", "urdf-loader": "^0.12.1", "uuid": "^9.0.1", "web-vitals": "^2.1.4", "ws": "^8.17.0", "xml-formatter": "^3.6.2" }, + "overrides": { + "typescript": "^5.0.2" + }, "scripts": { "dev": "react-scripts start", "build": "react-scripts build", @@ -68,7 +51,8 @@ }, "eslintConfig": { "extends": [ - "react-app" ] + "react-app" + ] }, "browserslist": { "production": [ @@ -83,6 +67,12 @@ ] }, "devDependencies": { - "@types/three": "^0.158.3" + "@types/three": "^0.158.3", + "@types/jest": "^27.5.2", + "@types/node": "^16.18.46", + "@types/react": "^18.2.21", + "@types/react-dom": "^18.2.7", + "@types/socket.io-client": "^3.0.0", + "@types/uuid": "^9.0.2" } -} +} \ No newline at end of file diff --git a/ui/readme.md b/ui/readme.md index 4ab672b..b8f5217 100644 --- a/ui/readme.md +++ b/ui/readme.md @@ -1,7 +1,9 @@ -# Установка зависимостей +# Установка зависимостей + ``` brew install mason ``` + ### Инициализация В корне проекта вызовите команду `init`, которая создаст папку `.mason/` @@ -39,9 +41,14 @@ mason new my_brick_name Для большей информации [читайте и смотрите примеры](https://github.com/felangel/mason/blob/master/packages/mason_cli/README.md) +# Добавить новую форму в деревья поведения +mason make form -o ./src/features/behavior_tree_builder/presentation/ui/forms + +# Добавить новую форму в Scene Manager + +mason make form -o ./src/features/scene_manager/presentation/forms -# Добавить новую форму -mason make form -o ./src/features/behavior_tree_builder/presentation/ui/forms # Добавить новый экран -mason make base_feature -o ./src/features/ \ No newline at end of file + +mason make base_feature -o ./src/features/ diff --git a/ui/src/core/assets/icons/check.svg b/ui/src/core/assets/icons/check.svg index b5bdded..f30550f 100644 --- a/ui/src/core/assets/icons/check.svg +++ b/ui/src/core/assets/icons/check.svg @@ -3,10 +3,10 @@ -strokeWidth +strokeWidth - + \ No newline at end of file diff --git a/ui/src/core/assets/icons/chevron.svg b/ui/src/core/assets/icons/chevron.svg index 3a2d4d2..0ddce4c 100644 --- a/ui/src/core/assets/icons/chevron.svg +++ b/ui/src/core/assets/icons/chevron.svg @@ -3,7 +3,7 @@ - + diff --git a/ui/src/core/extensions/extensions.ts b/ui/src/core/extensions/extensions.ts index b237062..efc6575 100644 --- a/ui/src/core/extensions/extensions.ts +++ b/ui/src/core/extensions/extensions.ts @@ -34,6 +34,7 @@ declare global { isNegative(): boolean; isEven(): boolean; isOdd(): boolean; + isEqualR(num: number): Result; } interface String { @@ -45,6 +46,7 @@ declare global { hasPattern(pattern: string): boolean; hasNoPattern(pattern: string): boolean; divideByIndex(index: number): string[]; + isEqualR(str: string): Result; } interface Map { diff --git a/ui/src/core/extensions/number.ts b/ui/src/core/extensions/number.ts index 19b8001..a77ca1c 100644 --- a/ui/src/core/extensions/number.ts +++ b/ui/src/core/extensions/number.ts @@ -1,3 +1,5 @@ +import { Result } from "../helper/result"; + export const NumberExtensions = () => { if (Number().fromArray === undefined) { Number.prototype.fromArray = function () { @@ -15,6 +17,14 @@ export const NumberExtensions = () => { return `${date.getUTCFullYear()}.${date.getMonth()}.${date.getDay()} ${date.getHours()}:${date.getMinutes()}`; }; } + if (Number().isEqualR === undefined) { + Number.prototype.isEqualR = function (num) { + if(this === num) { + return Result.ok(undefined) + } + return Result.error(undefined) + }; + } if (Number().isValid === undefined) { Number.prototype.isValid = function (str: string) { return !isNaN(Number(str)); diff --git a/ui/src/core/extensions/string.ts b/ui/src/core/extensions/string.ts index 0b6b350..700aaad 100644 --- a/ui/src/core/extensions/string.ts +++ b/ui/src/core/extensions/string.ts @@ -1,3 +1,5 @@ +import { Result } from "../helper/result"; + /* eslint-disable no-extend-native */ export const StringExtensions = () => { if ("".isEmpty === undefined) { @@ -10,6 +12,14 @@ export const StringExtensions = () => { return this.length !== 0; }; } + if ("".isEqualR === undefined) { + String.prototype.isEqualR = function (str) { + if (this === str) { + return Result.ok(String(this)); + } + return Result.error(undefined); + }; + } if ("".replaceMany === undefined) { String.prototype.replaceMany = function (searchValues: string[], replaceValue: string) { let result = this as string; @@ -44,13 +54,13 @@ export const StringExtensions = () => { return !this.hasPattern(pattern); }; } - if (''.divideByIndex === undefined) { + if ("".divideByIndex === undefined) { String.prototype.divideByIndex = function (index) { if (this.at(index) === undefined) { - return [] + return []; } - return [this.slice(0, index), this.slice(index+1, this.length)] - } + return [this.slice(0, index), this.slice(index + 1, this.length)]; + }; } }; diff --git a/ui/src/core/model/spawn_position_types.ts b/ui/src/core/model/spawn_position_types.ts new file mode 100644 index 0000000..ca08f31 --- /dev/null +++ b/ui/src/core/model/spawn_position_types.ts @@ -0,0 +1,3 @@ +export enum SpawnPositionTypes { + BoundBox = "BoundBox", +} diff --git a/ui/src/core/repository/babylon_repository.ts b/ui/src/core/repository/babylon_repository.ts index ce7c147..f156a9a 100644 --- a/ui/src/core/repository/babylon_repository.ts +++ b/ui/src/core/repository/babylon_repository.ts @@ -1,36 +1,36 @@ -import { Scene, Engine, MeshBuilder, FreeCamera, HemisphericLight, Vector3, SceneLoader } from 'babylonjs'; -import { GLTFFileLoader } from 'babylonjs-loaders'; +// import { Scene, Engine, MeshBuilder, FreeCamera, HemisphericLight, Vector3, SceneLoader } from 'babylonjs'; +// import { GLTFFileLoader } from 'babylonjs-loaders'; -export class BabylonRepository { - engine: Engine; - canvas: HTMLCanvasElement; - scene: Scene; - sceneLoader: SceneLoader - constructor(canvas: HTMLCanvasElement) { - this.sceneLoader = new SceneLoader(); - this.engine = new Engine(canvas, true); - this.scene = new Scene(this.engine); - this.engine.runRenderLoop(() => { - this.scene.render(); - }); - this.scene.createDefaultCameraOrLight(true, true, true); - new HemisphericLight("hemiLight", new Vector3(0, 1, 0)); - SceneLoader.RegisterPlugin(new GLTFFileLoader()) - SceneLoader.ImportMeshAsync("", - "http://localhost:4001/1dfc4e1a-9c1a-4fa2-96b2-19c86acb6ea4/assets/libs/objects/", - "sol_gear.glb", this.scene) +// export class BabylonRepository { +// engine: Engine; +// canvas: HTMLCanvasElement; +// scene: Scene; +// sceneLoader: SceneLoader +// constructor(canvas: HTMLCanvasElement) { +// this.sceneLoader = new SceneLoader(); +// this.engine = new Engine(canvas, true); +// this.scene = new Scene(this.engine); +// this.engine.runRenderLoop(() => { +// this.scene.render(); +// }); +// this.scene.createDefaultCameraOrLight(true, true, true); +// new HemisphericLight("hemiLight", new Vector3(0, 1, 0)); +// SceneLoader.RegisterPlugin(new GLTFFileLoader()) +// SceneLoader.ImportMeshAsync("", +// "http://localhost:4001/1dfc4e1a-9c1a-4fa2-96b2-19c86acb6ea4/assets/libs/objects/", +// "sol_gear.glb", this.scene) - } - deleteAllObjectsScene = () => this.scene.meshes.forEach((el) => this.scene.removeMesh(el, true)) +// } +// deleteAllObjectsScene = () => this.scene.meshes.forEach((el) => this.scene.removeMesh(el, true)) - loadHttp = (url: string) => { - const divide = url.divideByIndex(url.lastIndexOf('/')) +// loadHttp = (url: string) => { +// const divide = url.divideByIndex(url.lastIndexOf('/')) - SceneLoader.ImportMeshAsync("", - `${divide.at(0)}/`, - `${divide.at(1)}`, this.scene).then((frame) => { - }); +// SceneLoader.ImportMeshAsync("", +// `${divide.at(0)}/`, +// `${divide.at(1)}`, this.scene).then((frame) => { +// }); - } -} \ No newline at end of file +// } +// } \ No newline at end of file diff --git a/ui/src/core/repository/core_three_repository.ts b/ui/src/core/repository/core_three_repository.ts index d42ebfd..285d8da 100644 --- a/ui/src/core/repository/core_three_repository.ts +++ b/ui/src/core/repository/core_three_repository.ts @@ -21,23 +21,26 @@ import { Quaternion, MeshBasicMaterial, BoxGeometry, - MeshStandardMaterial + MeshStandardMaterial, } from "three"; import { TypedEvent } from "../helper/typed_event"; import { Result } from "../helper/result"; -import { GLTFLoader, OrbitControls, TransformControls, OBJLoader, STLLoader, ColladaLoader } from "three-stdlib"; +import { ColladaLoader } from "three/examples/jsm/loaders/ColladaLoader"; +import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader"; +import { OBJLoader } from "three/examples/jsm/loaders/OBJLoader"; +import { STLLoader } from "three/examples/jsm/loaders/STLLoader"; +import { OrbitControls, TransformControls } from "three/examples/jsm/Addons"; import { BaseSceneItemModel, CameraViewModel, StaticAssetItemModel, } from "../../features/scene_manager/model/scene_assets"; -import { SceneMode } from "../../features/scene_manager/model/scene_view"; -import { throttle } from "../helper/throttle"; -import { Asset, InstanceRgbCamera, RobossemblerAssets, SceneSimpleObject } from "../model/robossembler_assets"; -import { LoadingManager } from 'three'; -import { UrdfTransforms, coordsToQuaternion } from "../../features/simulations/tranforms_model"; -import URDFLoader, { URDFLink } from 'urdf-loader'; +import { LoadingManager } from "three"; +import { SceneMode } from "../../features/scene_manager/model/scene_view"; +import { UrdfTransforms, coordsToQuaternion } from "../../features/simulations/tranforms_model"; +import URDFLoader, { URDFLink } from "urdf-loader"; +import { ISolidSpawnHelper } from "../../features/scene_manager/presentation/scene_manager_store"; Object3D.DEFAULT_UP = new Vector3(0, 0, 1); @@ -45,7 +48,7 @@ export enum UserData { selectedObject = "selected_object", cameraInitialization = "camera_initialization", objectForMagnetism = "object_for_magnetism", - loadObject = 'load_object' + loadObject = "load_object", } interface IEventDraggingChange { @@ -58,10 +61,7 @@ interface IEmissiveCache { status: boolean; object3d: Object3D; } -type SceneFrames = { [K in string]: URDFLink; } - - - +type SceneFrames = { [K in string]: URDFLink }; export class CoreThreeRepository extends TypedEvent { scene = new Scene(); @@ -110,19 +110,22 @@ export class CoreThreeRepository extends TypedEvent { } deleteAllObjectsScene = () => { - - - this.getAllSceneNameModels().forEach((el) => this.scene.remove(this.scene.getObjectByName(el) as Object3D)) - } - + this.getAllSceneNameModels().forEach((el) => + this.scene.remove(this.scene.getObjectByName(el) as Object3D) + ); + }; + raiseAnObjectAboveZeroVector = (name: string) => { + const mesh = this.scene.getObjectByName(name) as Object3D; + mesh.position.sub(new Box3().setFromObject(mesh).min); + }; drawPoint(point: Vector3): Mesh { var cube = new Mesh(new BoxGeometry(0.5, 0.5, 0.5), new MeshBasicMaterial({ color: 0x0095dd })); cube.position.add(point); this.scene.add(cube); return cube; } - getCenterPoint = (object: Object3D) => object.getWorldPosition(new Box3().setFromObject(object).getCenter(object.position)); - + getCenterPoint = (object: Object3D) => + object.getWorldPosition(new Box3().setFromObject(object).getCenter(object.position)); makeCube(inc: number, vector?: Vector3, color?: string, size?: number) { const cube = new Mesh( @@ -151,55 +154,34 @@ export class CoreThreeRepository extends TypedEvent { cube.position.copy(vector); } this.scene.add(cube); + } + deleteSceneItem = (item: string) => + this.scene.children.forEach((el) => el.name.isEqualR(item).map(() => this.scene.remove(el))); - } - deleteSceneItem(item: BaseSceneItemModel) { - const updateScene = this.scene; - updateScene.children = item.deleteToScene(updateScene); - } loadUrdf = (urlPath: string) => { - this.urdfLoader.load( - urlPath, - robot => { - - this.scene.add(robot) - // @ts-expect-error - this.sceneFrame = robot.frames - - - } - ); - } - loadInstances(robossemblerAssets: RobossemblerAssets) { - robossemblerAssets.instances.forEach(async (el) => { - if (el instanceof InstanceRgbCamera) { - const cameraModel = CameraViewModel.fromInstanceRgbCamera(el); - cameraModel.mapPerspectiveCamera(this.htmlSceneWidth, this.htmlSceneHeight).forEach((el) => this.scene.add(el)); - this.emit(cameraModel); - } - if (el instanceof SceneSimpleObject) { - const asset = robossemblerAssets.getAssetAtInstance(el.instanceAt as string); - this.loader( - asset.meshPath, - () => { }, - asset.name, - new Vector3(el.position.x, el.position.y, el.position.z), - new Quaternion(el.quaternion[0], el.quaternion[1], el.quaternion[2], el.quaternion[3]) - ); - } + this.urdfLoader.load(urlPath, (robot) => { + this.scene.add(robot); + // @ts-expect-error + this.sceneFrame = robot.frames; }); - } - loadInstance(asset: Asset, loadCallback?: Function) { + }; + + solidSpawn( + solidSpawn: ISolidSpawnHelper, + loadCallback?: (obj: Object3D | undefined) => void, + vector3?: Vector3 + ) { this.loader( - asset.meshPath, - loadCallback ? loadCallback : () => { }, - asset.name, - new Vector3(Number(asset.posX), Number(asset.posY), Number(asset.posZ)), - new Quaternion(0, 0, 0, 0) + solidSpawn.url, + () => { + this.raiseAnObjectAboveZeroVector(solidSpawn.name); + if (loadCallback) loadCallback(this.scene.getObjectByName(solidSpawn.name)); + }, + solidSpawn.name, + vector3 ); } loadHttpAndPreview(path: string, name: string, loadCallback?: Function) { - this.loader( path, () => { @@ -209,7 +191,6 @@ export class CoreThreeRepository extends TypedEvent { name, new Vector3(0, 0, 0) ); - } setTransformMode(mode?: SceneMode) { @@ -218,10 +199,10 @@ export class CoreThreeRepository extends TypedEvent { this.transformControls.detach(); this.transformControls.dispose(); break; - case SceneMode.MOVING: + case SceneMode.Move: this.transformControls.setMode("translate"); break; - case SceneMode.ROTATE: + case SceneMode.Rotate: this.transformControls.setMode("rotate"); break; } @@ -275,7 +256,7 @@ export class CoreThreeRepository extends TypedEvent { } } - setRayCast(vector: Vector2): Result>[]> { + setRayCast = (vector: Vector2): Result>[]> => { const raycaster = new Raycaster(); raycaster.setFromCamera(vector, this.camera); const intersects = raycaster.intersectObjects(this.scene.children); @@ -284,16 +265,17 @@ export class CoreThreeRepository extends TypedEvent { } return Result.error(undefined); - } + }; - setRayCastAndGetFirstObjectAndPointToObject(vector: Vector2): Result { - this.setRayCast(vector).map((intersects) => { - if (intersects.length > 0) { - return Result.ok(intersects[0].point); - } - }); - return Result.error(undefined); - } + setRayCastAndGetFirstObjectAndPointToObject = (vector: Vector2): Result => + this.setRayCast(vector).fold( + (intersects) => { + if (intersects.isNotEmpty()) { + return Result.ok(intersects[0].point); + } + }, + () => Result.error(undefined) + ) as Result; light() { const ambientLight = new AmbientLight(0xffffff, 0.7); @@ -321,12 +303,7 @@ export class CoreThreeRepository extends TypedEvent { this.orbitControls.enabled = !e.value; }); this.transformControls.addEventListener("objectChange", (event) => { - //@ts-expect-error - const sceneObject = event.target.object; - //TODO:(IDONTSUDO) Trotting doesn't work, need to figure out why - const fn = () => this.watcherSceneEditorObject(sceneObject); - const [throttleFn] = throttle(fn, 1000); - throttleFn(); + this.watcherSceneEditorObject(event.target.object); }); } @@ -334,10 +311,10 @@ export class CoreThreeRepository extends TypedEvent { this.light(); this.addListeners(); const floor = new GridHelper(1000, 100, 0x888888, 0x444444); - floor.geometry.rotateX(Math.PI * 0.5) + floor.geometry.rotateX(Math.PI * 0.5); floor.userData = {}; floor.userData[UserData.cameraInitialization] = true; - floor.up.copy(new Vector3(0, 0, 1)) + floor.up.copy(new Vector3(0, 0, 1)); this.scene.add(floor); } @@ -372,10 +349,10 @@ export class CoreThreeRepository extends TypedEvent { this.glbLoader.load( url, (result) => { - this.scene.add(result.scene) - callBack() + this.scene.add(result.scene); + callBack(); }, - (err) => { } + (err) => {} ); break; case "obj": @@ -392,51 +369,47 @@ export class CoreThreeRepository extends TypedEvent { this.emit(new StaticAssetItemModel(el.name, el.position, el.quaternion)); this.scene.add(el); - callBack() + callBack(); }); }, - (err) => { } + (err) => {} ); break; case "dae": this.daeLoader.load( url, (result) => { - this.scene.add(result.scene.children[0]) + this.scene.add(result.scene); }, - (err) => { } + (err) => console.log(err) ); break; case "stl": this.stlLoader.load( url, (result) => { - - const material = new MeshStandardMaterial({ - color: 'red', - metalness: 0.35, - roughness: 1, - opacity: 1.0, - transparent: false, - }); - - - const mesh = new Mesh(result, material); + const mesh = new Mesh( + result, + new MeshStandardMaterial({ + color: "red", + metalness: 0.35, + roughness: 1, + opacity: 1.0, + transparent: false, + }) + ); mesh.name = name; - - - // var geometry = mesh.geometry; // geometry.computeBoundingBox(); // Вычисляем ограничивающий параллелепипед для геометрии - if (position) mesh.position.copy(position) + if (position) mesh.position.copy(position); this.scene.add(mesh); - callBack() + callBack(); }, - (err) => { } + (err) => {} ); break; } @@ -526,11 +499,10 @@ export class CoreThreeRepository extends TypedEvent { urdfTransforms = (urdfTransforms: UrdfTransforms) => { urdfTransforms.transforms.forEach((transform) => { if (this.sceneFrame) { - const currentLink = this.sceneFrame[transform?.child_frame_id ?? ""] + const currentLink = this.sceneFrame[transform?.child_frame_id ?? ""]; - currentLink.quaternion.copy(coordsToQuaternion(transform.transform.rotation)) + currentLink.quaternion.copy(coordsToQuaternion(transform.transform.rotation)); } - }) - - } + }); + }; } diff --git a/ui/src/core/ui/icons/icons.tsx b/ui/src/core/ui/icons/icons.tsx index 75dfb8f..94c1a8c 100644 --- a/ui/src/core/ui/icons/icons.tsx +++ b/ui/src/core/ui/icons/icons.tsx @@ -5,11 +5,12 @@ import { IStyle } from "../../model/style"; export interface IIconsProps extends IStyle { type: string; onClick?: Function; + height?: number; + width?: number; } export function Icon(props: IIconsProps) { - const icon = getIconSvg(props.type); - return icon.fold( + return getIconSvg(props.type, props.height, props.width).fold( (node) => { return (
=> { +const getIconSvg = ( + type: string, + height: number | undefined, + width: number | undefined +): Result => { switch (type) { case "": return Result.ok(); @@ -51,9 +56,9 @@ const getIconSvg = (type: string): Result => { ); @@ -64,65 +69,65 @@ const getIconSvg = (type: string): Result => { ); @@ -132,9 +137,9 @@ const getIconSvg = (type: string): Result => { ); @@ -367,7 +372,13 @@ const getIconSvg = (type: string): Result => { ); case "DeleteCircle": return Result.ok( - + => { ); + case "Solid": + return Result.ok( + + + + ); case "Camera": return Result.ok( @@ -460,6 +489,42 @@ const getIconSvg = (type: string): Result => { /> ); + case "Move": + return Result.ok( + + + + + + ); + case "Save": + return Result.ok( + + + + ); + case "Select": + return Result.ok( + + + + + ); + case "Rotate": + return Result.ok( + + + + ); case "Settings": return Result.ok( diff --git a/ui/src/features/all_projects/presentation/all_projects_store.ts b/ui/src/features/all_projects/presentation/all_projects_store.ts index d802e5d..e90553d 100644 --- a/ui/src/features/all_projects/presentation/all_projects_store.ts +++ b/ui/src/features/all_projects/presentation/all_projects_store.ts @@ -55,7 +55,7 @@ export class AllProjectStore extends ModalStore { } if (this.file === undefined) { message.error("загрузите файл"); - return; + return } this.isLoading = true; diff --git a/ui/src/features/behavior_tree_builder/model/primitive_view_model.ts b/ui/src/features/behavior_tree_builder/model/primitive_view_model.ts index 9de192b..cf97fc4 100644 --- a/ui/src/features/behavior_tree_builder/model/primitive_view_model.ts +++ b/ui/src/features/behavior_tree_builder/model/primitive_view_model.ts @@ -1,5 +1,4 @@ import { extensions } from "../../../core/extensions/extensions"; -import { Form } from "../presentation/ui/forms/forms"; import { ISkillView } from "../presentation/ui/skill_tree/skill_tree"; extensions(); diff --git a/ui/src/features/details/details_http_repository.ts b/ui/src/features/details/details_http_repository.ts index dd8d4b2..1c2d904 100644 --- a/ui/src/features/details/details_http_repository.ts +++ b/ui/src/features/details/details_http_repository.ts @@ -6,6 +6,10 @@ export interface Parts { material_path: string; stlUrl: string; image: string; + glUrl: string; + solidType: string; + daeUrl: string; + objUrl: string; } export class DetailsHttpRepository extends CoreHttpRepository { diff --git a/ui/src/features/details/details_store.ts b/ui/src/features/details/details_store.ts index dc9d476..a2b8965 100644 --- a/ui/src/features/details/details_store.ts +++ b/ui/src/features/details/details_store.ts @@ -29,6 +29,9 @@ export class DetailsStore extends UiDrawerFormState {}; init = async (navigate?: NavigateFunction | undefined): Promise => { await this.mapOk("parts", this.detailsHttpRepository.getAssetsActiveProject()); + + + this.detailsViewModel = this.parts.map((el) => { return { label: el.name, diff --git a/ui/src/features/details/details_three_repository.ts b/ui/src/features/details/details_three_repository.ts index 8eb1f8f..b2c3b53 100644 --- a/ui/src/features/details/details_three_repository.ts +++ b/ui/src/features/details/details_three_repository.ts @@ -2,20 +2,14 @@ import { Box3, GridHelper, Mesh, Object3D, Vector3 } from "three"; import { CoreThreeRepository } from "../../core/repository/core_three_repository"; export class DetailsThreeRepository extends CoreThreeRepository { - raiseAnObjectAboveZeroVector = (name: string) => { - const mesh = this.scene.getObjectByName(name) as Object3D; - mesh.position.sub(new Box3().setFromObject(mesh).min) - } - matchTwoPlacesInTheCenter = () => { - - } + loadHttpAndPreview = (path: string, name: string, loadCallback?: Function) => { this.loader( path, () => { this.raiseAnObjectAboveZeroVector(name) - console.log(this.getCenterPoint(this.scene.children.filter((el) => el instanceof GridHelper).at(0) as Object3D)) + this.getCenterPoint(this.scene.children.filter((el) => el instanceof GridHelper).at(0) as Object3D) }, name, new Vector3(0, 0, 0) diff --git a/ui/src/features/scene_manager/model/camera_view_model.ts b/ui/src/features/scene_manager/model/camera_view_model.ts new file mode 100644 index 0000000..e86be00 --- /dev/null +++ b/ui/src/features/scene_manager/model/camera_view_model.ts @@ -0,0 +1,30 @@ +import { Quaternion, Vector3 } from "three"; +import { SceneModelsTypes } from "./solid_body_model"; +import { Result } from "../../../core/helper/result"; +export enum CameraTypes { + RGB = "RGB", +} +export class CameraModel { + type = SceneModelsTypes.CAMERA; + + constructor( + public quaternion: Quaternion, + public vector3: Vector3, + public name: string, + public cameraType: CameraTypes, + public width: number, + public updateRate: number, + public fov: number, + public near: number, + public far: number, + public height: number, + public topic: string, + public parent?: string, + public fixed?: string + ) {} + validate = (): Result => { + return Result.ok(this); + }; + static empty = () => + new CameraModel(new Quaternion(0, 0, 0, 0), new Vector3(0, 0, 0), "", CameraTypes.RGB, 0, 0, 0, 0, 0, 0, ""); +} diff --git a/ui/src/features/scene_manager/model/scene_view.ts b/ui/src/features/scene_manager/model/scene_view.ts index d282fc7..3ce24e1 100644 --- a/ui/src/features/scene_manager/model/scene_view.ts +++ b/ui/src/features/scene_manager/model/scene_view.ts @@ -20,9 +20,8 @@ export interface SceneManagerView { } export enum SceneMode { - ROTATE = "Rotate", - MOVING = "Moving", - EMPTY = "Empty", - ADD_CAMERA = "Add camera", - MAGNETISM_MARKING = "magnetism_marking", + Rotate = "Rotate", + Move = "Move", + Select = "Select", + Save = 'Save', } diff --git a/ui/src/features/scene_manager/model/solid_body_model.ts b/ui/src/features/scene_manager/model/solid_body_model.ts new file mode 100644 index 0000000..734fc24 --- /dev/null +++ b/ui/src/features/scene_manager/model/solid_body_model.ts @@ -0,0 +1,30 @@ +import { Quaternion, Vector3 } from "three"; + +export enum SceneModelsTypes { + SOLID = "SOLID", + ROBOT = "ROBOT", + LIGHT = "LIGHT", + CAMERA = 'CAMERA' +} +export enum SolidBodyTypes { + ACTIVE = "ACTIVE", + STATIC = "STATIC", +} +interface ISpawnTypes { + type: "POINT"; + name: "123"; +} +export class SolidBodyModel { + type = SceneModelsTypes.SOLID; + spawn?: ISpawnTypes; + constructor( + public quaternion: Quaternion, + public vector3: Vector3, + public name: string, + public solidType: SolidBodyTypes | string, + public mesh: string, + public collisionMesh: string, + public inertia?: number, + public mass?: number + ) {} +} diff --git a/ui/src/features/scene_manager/presentation/components/spawn_position_types.tsx b/ui/src/features/scene_manager/presentation/components/spawn_position_types.tsx new file mode 100644 index 0000000..46366ed --- /dev/null +++ b/ui/src/features/scene_manager/presentation/components/spawn_position_types.tsx @@ -0,0 +1,14 @@ +import { SpawnPositionTypes } from "../../../../core/model/spawn_position_types"; +import { CoreButton } from "../../../../core/ui/button/button"; +import { CoreText, CoreTextType } from "../../../../core/ui/text/text"; + +export const SpawnPositionTypesForm = ({ onClick: onClick }: { onClick: Function }) => { + return ( + <> + + {Object.entries(SpawnPositionTypes).map(([_, value], i) => ( + onClick(value)} /> + ))} + + ); +}; diff --git a/ui/src/features/scene_manager/presentation/forms/camera/camera_form.tsx b/ui/src/features/scene_manager/presentation/forms/camera/camera_form.tsx index 3141552..b3ed464 100644 --- a/ui/src/features/scene_manager/presentation/forms/camera/camera_form.tsx +++ b/ui/src/features/scene_manager/presentation/forms/camera/camera_form.tsx @@ -1,31 +1,60 @@ import { NavigateFunction } from "react-router-dom"; -import { CoreError, FormState, UiDrawerFormState } from "../../../../../core/store/base_store"; +import { CoreError, FormState } from "../../../../../core/store/base_store"; import { CoreButton } from "../../../../../core/ui/button/button"; import { CameraViewModel } from "../../../model/scene_assets"; -import { IDefaultSceneManagerProps } from "../scene_manager_forms"; +import { IDefaultSceneManagerFormProps } from "../scene_manager_forms"; import React from "react"; import { CoreInput } from "../../../../../core/ui/input/input"; import { CoreText, CoreTextType } from "../../../../../core/ui/text/text"; import { message } from "antd"; +import { CameraModel, CameraTypes } from "../../../model/camera_view_model"; +import { CoreSelect } from "../../../../../core/ui/select/select"; -class CameraFormStore extends FormState { +class CameraFormStore extends FormState { errorHandingStrategy = (error: CoreError) => {}; init = async (navigate?: NavigateFunction | undefined) => {}; - viewModel: CameraViewModel = CameraViewModel.empty(); + viewModel: CameraModel = CameraModel.empty(); constructor() { super(); } } -export const CameraForm = (props: IDefaultSceneManagerProps) => { +export const CameraForm = (props: IDefaultSceneManagerFormProps) => { const [store] = React.useState(() => new CameraFormStore()); React.useEffect(() => { store.init(); }, []); return ( -
+
- store.updateForm({ cameraLink: text })} /> + + store.updateForm({ topic: text })} /> + store.updateForm({ name: text })} /> + Number().isValid(text)} + label={"Update Rate"} + onChange={(text) => store.updateForm({ updateRate: Number(text) })} + /> + Number().isValid(text)} + label={"Height"} + onChange={(text) => store.updateForm({ height: Number(text) })} + /> + Number().isValid(text)} + label={"Width"} + onChange={(text) => store.updateForm({ width: Number(text) })} + /> + v)} + value={store.viewModel.cameraType} + label={"Типы камер"} + onChange={(text) => store.updateForm({ cameraType: text as CameraTypes })} + />
{ onClick={() => store.viewModel.validate().fold( (model) => { - props.store.addNewCamera(model); + // props.store.addNewCamera(model); }, (error) => message.error(error) ) diff --git a/ui/src/features/scene_manager/presentation/forms/light/light_form.tsx b/ui/src/features/scene_manager/presentation/forms/light/light_form.tsx new file mode 100644 index 0000000..101f717 --- /dev/null +++ b/ui/src/features/scene_manager/presentation/forms/light/light_form.tsx @@ -0,0 +1,6 @@ +import { observer } from "mobx-react-lite"; +import { IDefaultSceneManagerFormProps } from "../scene_manager_forms"; + +export const LightForm = observer((props: IDefaultSceneManagerFormProps) => { + return <>; +}); diff --git a/ui/src/features/scene_manager/presentation/forms/light/light_store.tsx b/ui/src/features/scene_manager/presentation/forms/light/light_store.tsx new file mode 100644 index 0000000..afa5ea6 --- /dev/null +++ b/ui/src/features/scene_manager/presentation/forms/light/light_store.tsx @@ -0,0 +1,14 @@ +import { NavigateFunction } from "react-router-dom"; +import { FormState, CoreError } from "../../../../../core/store/base_store"; +import { LightViewModel } from "./light_view_model"; + +export class LightStore extends FormState { + viewModel: LightViewModel = LightViewModel.empty(); + constructor() { + super(); + } + errorHandingStrategy = (error: CoreError) => {}; + init(navigate?: NavigateFunction | undefined): Promise { + throw new Error("Method not implemented."); + } +} diff --git a/ui/src/features/scene_manager/presentation/forms/light/light_view_model.ts b/ui/src/features/scene_manager/presentation/forms/light/light_view_model.ts new file mode 100644 index 0000000..0feb6de --- /dev/null +++ b/ui/src/features/scene_manager/presentation/forms/light/light_view_model.ts @@ -0,0 +1,9 @@ +import { Result } from "../../../../../core/helper/result"; + +export class LightViewModel { + constructor() {} + isValid = (): Result => { + return Result.ok(this); + }; + static empty = () => new LightViewModel(); +} diff --git a/ui/src/features/scene_manager/presentation/forms/point/point_form.tsx b/ui/src/features/scene_manager/presentation/forms/point/point_form.tsx new file mode 100644 index 0000000..85811ba --- /dev/null +++ b/ui/src/features/scene_manager/presentation/forms/point/point_form.tsx @@ -0,0 +1,40 @@ +import React from "react"; +import { observer } from "mobx-react-lite"; +import { PointStore, PointStoreType } from "./point_store"; +import { IDefaultSceneManagerFormProps } from "../scene_manager_forms"; +import { CoreText, CoreTextType } from "../../../../../core/ui/text/text"; +import { CoreInput } from "../../../../../core/ui/input/input"; +import { CoreButton } from "../../../../../core/ui/button/button"; +import { match } from "ts-pattern"; +import { SpawnPositionTypesForm } from "../../components/spawn_position_types"; + +export const PointForm = observer((props: IDefaultSceneManagerFormProps) => { + const [store] = React.useState(() => new PointStore()); + React.useEffect(() => { + store.init(); + }, [store]); + + return ( +
+ {match(store.storeType) + .with(PointStoreType.initNewPoint, () => ( + <> + + store.updateForm({ name: text })} /> + store.onClickNext(PointStoreType.makeSceneSolidAndEditPosition)} + /> + + )) + .with(PointStoreType.makeSceneSolidAndEditPosition, () => ( + <> + + + )) + .otherwise(() => ( + <> + ))} +
+ ); +}); diff --git a/ui/src/features/scene_manager/presentation/forms/point/point_http_repository.ts b/ui/src/features/scene_manager/presentation/forms/point/point_http_repository.ts new file mode 100644 index 0000000..500d45c --- /dev/null +++ b/ui/src/features/scene_manager/presentation/forms/point/point_http_repository.ts @@ -0,0 +1,6 @@ +import { HttpRepository } from "../../../../../core/repository/http_repository"; + + +export class PointHttpRepository extends HttpRepository { + +} diff --git a/ui/src/features/scene_manager/presentation/forms/point/point_store.ts b/ui/src/features/scene_manager/presentation/forms/point/point_store.ts new file mode 100644 index 0000000..ca9d5b6 --- /dev/null +++ b/ui/src/features/scene_manager/presentation/forms/point/point_store.ts @@ -0,0 +1,26 @@ +import makeAutoObservable from "mobx-store-inheritance"; +import { NavigateFunction } from "react-router-dom"; +import { PointViewModel } from "./point_view_model"; +import { PointHttpRepository } from "./point_http_repository"; +import { FormState, CoreError } from "../../../../../core/store/base_store"; +import { SpawnPositionTypes } from "../../../../../core/model/spawn_position_types"; +export enum PointStoreType { + makeSceneSolidAndEditPosition = "makeSceneSolidAndEditPosition", + initNewPoint = "initNewPoint", +} +export class PointStore extends FormState { + onClickNext = (pointStoreType: PointStoreType) => (this.storeType = pointStoreType); + viewModel: PointViewModel = PointViewModel.empty(); + cameraDeviceHttpRepository: PointHttpRepository = new PointHttpRepository(); + storeType: PointStoreType = PointStoreType.initNewPoint; + spawnPositionTypes: SpawnPositionTypes; + constructor() { + super(); + makeAutoObservable(this); + } + selectSpawnType = (type: SpawnPositionTypes) => { + this.spawnPositionTypes = type; + }; + errorHandingStrategy = (error: CoreError) => {}; + init = async (navigate?: NavigateFunction | undefined) => {}; +} diff --git a/ui/src/features/scene_manager/presentation/forms/point/point_view_model.ts b/ui/src/features/scene_manager/presentation/forms/point/point_view_model.ts new file mode 100644 index 0000000..28795cb --- /dev/null +++ b/ui/src/features/scene_manager/presentation/forms/point/point_view_model.ts @@ -0,0 +1,16 @@ +import { Quaternion, Vector3 } from "three"; +import { Result } from "../../../../../core/helper/result"; + +export class PointViewModel { + type = "POINT"; + name: string; + vector3: Vector3; + quaternion: Quaternion; + constructor() {} + isValid(): Result { + return Result.ok(); + } + static empty() { + return new PointViewModel(); + } +} diff --git a/ui/src/features/scene_manager/presentation/forms/robot/robot_form.tsx b/ui/src/features/scene_manager/presentation/forms/robot/robot_form.tsx index e52dfd0..8eb6775 100644 --- a/ui/src/features/scene_manager/presentation/forms/robot/robot_form.tsx +++ b/ui/src/features/scene_manager/presentation/forms/robot/robot_form.tsx @@ -1,6 +1,6 @@ -import { IDefaultSceneManagerProps } from "../scene_manager_forms"; +import { IDefaultSceneManagerFormProps } from "../scene_manager_forms"; -export const RobotForm = (props: IDefaultSceneManagerProps) => { +export const RobotForm = (props: IDefaultSceneManagerFormProps) => { return
ROBOT
; }; diff --git a/ui/src/features/scene_manager/presentation/forms/scene_manager_forms.tsx b/ui/src/features/scene_manager/presentation/forms/scene_manager_forms.tsx index 07f30f9..0c00974 100644 --- a/ui/src/features/scene_manager/presentation/forms/scene_manager_forms.tsx +++ b/ui/src/features/scene_manager/presentation/forms/scene_manager_forms.tsx @@ -1,23 +1,37 @@ import { SceneMangerStore } from "../scene_manager_store"; import { CameraForm } from "./camera/camera_form"; +import { LightForm } from "./light/light_form"; +import { PointForm } from "./point/point_form"; import { RobotForm } from "./robot/robot_form"; import { SolidBodyForm } from "./solid_body/solid_body_form"; - +import { Trajectory } from "./trajectory/trajectory_form"; +import { ZoneForm } from "./zone/zone_form"; + export enum SceneManagerForms { robot = "robot", camera = "camera", - solidBody = "solidBody", + solidBody = "SolidBody", + previewSolidBody = "previewSolidBody", + light = "Light", + point = "point", + trajectory = "trajectory", + zone = "zone", } interface IForms { name: string; component: JSX.Element; } -export interface IDefaultSceneManagerProps { +export interface IDefaultSceneManagerFormProps { dependency: Object; store: SceneMangerStore; } + export const sceneManagerForms = (props: Object, store: SceneMangerStore): IForms[] => [ { name: SceneManagerForms.camera, component: }, { name: SceneManagerForms.robot, component: }, { name: SceneManagerForms.solidBody, component: }, + { name: SceneManagerForms.point, component: }, + { name: SceneManagerForms.light, component: }, + { name: SceneManagerForms.zone, component: }, + { name: SceneManagerForms.trajectory, component: }, ]; diff --git a/ui/src/features/scene_manager/presentation/forms/solid_body/solid_body_form.tsx b/ui/src/features/scene_manager/presentation/forms/solid_body/solid_body_form.tsx index 523ddc9..86f22be 100644 --- a/ui/src/features/scene_manager/presentation/forms/solid_body/solid_body_form.tsx +++ b/ui/src/features/scene_manager/presentation/forms/solid_body/solid_body_form.tsx @@ -1,5 +1,62 @@ -import { IDefaultSceneManagerProps } from "../scene_manager_forms"; +import React from "react"; +import { CoreText, CoreTextType } from "../../../../../core/ui/text/text"; +import { IDefaultSceneManagerFormProps } from "../scene_manager_forms"; +import { SolidBodyStore, SolidBodyStoreType } from "./solid_body_store"; +import { observer } from "mobx-react-lite"; +import { CoreButton } from "../../../../../core/ui/button/button"; +import { match } from "ts-pattern"; +import { SpawnPositionTypesForm } from "../../components/spawn_position_types"; -export const SolidBodyForm = (props:IDefaultSceneManagerProps) => { - return <>; -}; +export const SolidBodyForm = observer((props: IDefaultSceneManagerFormProps) => { + const [store] = React.useState(() => new SolidBodyStore(props.store)); + React.useEffect(() => { + store.init(); + }, []); + return ( +
+ {Object.hasOwn(props.dependency, "type") && Object.hasOwn(props.dependency, "name") ? ( + <> + x:{props.store.scene.find((el) => el.name.isEqual(props.store.selectedItemName ?? ""))?.vector3.x} + y:{props.store.scene.find((el) => el.name.isEqual(props.store.selectedItemName ?? ""))?.vector3.y} + y:{props.store.scene.find((el) => el.name.isEqual(props.store.selectedItemName ?? ""))?.vector3.z} + solidType:{props.store.scene.find((el) => el.name.isEqual(props.store.selectedItemName ?? ""))?.solidType} + + + ) : ( + <> + {match(store.solidBodyStoreType) + .with(SolidBodyStoreType.selectBody, () => ( + <> + + + {store.parts.map((el, i) => ( +
+ + + store.clickSelectBody(el)} /> +
+ ))} + + )) + .with(SolidBodyStoreType.selectSpawnPositionType, () => ( + <> + + + )) + .with(SolidBodyStoreType.spawn2DVector, () => ( + <> + {props.store.mousePosition ? ( + "" + ) : ( + + )} + + )) + .otherwise(() => ( + <> + ))} + + )} +
+ ); +}); diff --git a/ui/src/features/scene_manager/presentation/forms/solid_body/solid_body_store.tsx b/ui/src/features/scene_manager/presentation/forms/solid_body/solid_body_store.tsx index 078a062..18309f6 100644 --- a/ui/src/features/scene_manager/presentation/forms/solid_body/solid_body_store.tsx +++ b/ui/src/features/scene_manager/presentation/forms/solid_body/solid_body_store.tsx @@ -4,14 +4,14 @@ import { FormState, CoreError } from "../../../../../core/store/base_store"; import { CoreHttpRepository } from "../../../../../core/repository/http_repository"; import { Parts } from "../../../../details/details_http_repository"; import { Vector2 } from "three"; +import { SceneMangerStore } from "../../scene_manager_store"; +import { SpawnPositionTypes } from "../../../../../core/model/spawn_position_types"; export enum SolidBodyStoreType { selectBody = "selectBody", selectSpawnPositionType = "selectSpawnPositionType", spawn2DVector = "spawn2DVector", } -export enum SpawnPositionTypes { - BoundBox = "BoundBox", -} + export class SolidBodyStore extends FormState { viewModel: SolidBodyViewModel = SolidBodyViewModel.empty(); parts: Parts[] = []; @@ -20,20 +20,33 @@ export class SolidBodyStore extends FormState { solidBodyStoreType: SolidBodyStoreType = SolidBodyStoreType.selectBody; selectBody: Parts; spawnType: string; - errorHandingStrategy = (error: CoreError) => {}; - constructor() { + sceneManagerStore: SceneMangerStore; + vector2d?: Vector2; + + constructor(sceneManagerStore: SceneMangerStore) { super(); + this.sceneManagerStore = sceneManagerStore; makeAutoObservable(this); } - vector2d?: Vector2; init = async () => { this.mapOk("parts", this.coreHttpRepository.getAssetsActiveProject()); }; + errorHandingStrategy = (error: CoreError) => {}; + + dispose = () => {}; selectSpawnType = (type: string) => { this.spawnType = type; this.solidBodyStoreType = SolidBodyStoreType.spawn2DVector; + this.sceneManagerStore.mousePositionAwait = true; + this.sceneManagerStore.solidSpawnHelper = { + url: this.selectBody.objUrl, + name: this.selectBody.name, + isFinished: false, + solidType: this.selectBody.solidType, + type: this.spawnType, + }; + this.sceneManagerStore.activeFormType = undefined; }; - selectVector = () => {}; clickSelectBody = (el: Parts) => { this.selectBody = el; this.solidBodyStoreType = SolidBodyStoreType.selectSpawnPositionType; diff --git a/ui/src/features/scene_manager/presentation/forms/trajectory/trajectory_form.tsx b/ui/src/features/scene_manager/presentation/forms/trajectory/trajectory_form.tsx new file mode 100644 index 0000000..a066f31 --- /dev/null +++ b/ui/src/features/scene_manager/presentation/forms/trajectory/trajectory_form.tsx @@ -0,0 +1,13 @@ +import React from "react"; +import { observer } from "mobx-react-lite"; +import { TrajectoryStore } from "./trajectory_store"; +import { IDefaultSceneManagerFormProps } from "../scene_manager_forms"; + +export const Trajectory = observer((props: IDefaultSceneManagerFormProps) => { + const [store] = React.useState(() => new TrajectoryStore()); + React.useEffect(() => { + store.init(); + }, [store]); + + return <>Trajectory; +}); diff --git a/ui/src/features/scene_manager/presentation/forms/trajectory/trajectory_http_repository.ts b/ui/src/features/scene_manager/presentation/forms/trajectory/trajectory_http_repository.ts new file mode 100644 index 0000000..d1da9c7 --- /dev/null +++ b/ui/src/features/scene_manager/presentation/forms/trajectory/trajectory_http_repository.ts @@ -0,0 +1,3 @@ +import { HttpRepository } from "../../../../../core/repository/http_repository"; + +export class TrajectoryHttpRepository extends HttpRepository {} diff --git a/ui/src/features/scene_manager/presentation/forms/trajectory/trajectory_store.ts b/ui/src/features/scene_manager/presentation/forms/trajectory/trajectory_store.ts new file mode 100644 index 0000000..579bf85 --- /dev/null +++ b/ui/src/features/scene_manager/presentation/forms/trajectory/trajectory_store.ts @@ -0,0 +1,20 @@ +import makeAutoObservable from "mobx-store-inheritance"; +import { NavigateFunction } from "react-router-dom"; +import { TrajectoryViewModel } from "./trajectory_view_model"; +import { TrajectoryHttpRepository } from "./trajectory_http_repository"; +import { FormState, CoreError } from "../../../../../core/store/base_store"; + +export class TrajectoryStore extends FormState { + constructor() { + super(); + makeAutoObservable(this); + } + viewModel: TrajectoryViewModel = TrajectoryViewModel.empty(); + cameraDeviceHttpRepository: TrajectoryHttpRepository = new TrajectoryHttpRepository(); + errorHandingStrategy = (error: CoreError) => { } + init = async (navigate?: NavigateFunction | undefined) => { + + } + +} + \ No newline at end of file diff --git a/ui/src/features/scene_manager/presentation/forms/trajectory/trajectory_view_model.ts b/ui/src/features/scene_manager/presentation/forms/trajectory/trajectory_view_model.ts new file mode 100644 index 0000000..8d225c8 --- /dev/null +++ b/ui/src/features/scene_manager/presentation/forms/trajectory/trajectory_view_model.ts @@ -0,0 +1,12 @@ +import { Result } from "../../../../../core/helper/result"; + + +export class TrajectoryViewModel { + constructor() {} + isValid(): Result { + return Result.ok(); + } + static empty() { + return new TrajectoryViewModel(); + } +} diff --git a/ui/src/features/scene_manager/presentation/forms/zone/zone_form.tsx b/ui/src/features/scene_manager/presentation/forms/zone/zone_form.tsx new file mode 100644 index 0000000..822848a --- /dev/null +++ b/ui/src/features/scene_manager/presentation/forms/zone/zone_form.tsx @@ -0,0 +1,15 @@ +import React from "react"; +import { observer } from "mobx-react-lite"; +import { ZoneStore } from "./zone_store"; +import { IDefaultSceneManagerFormProps } from "../scene_manager_forms"; + + + +export const ZoneForm = observer((props: IDefaultSceneManagerFormProps) => { + const [store] = React.useState(() => new ZoneStore()); + React.useEffect(() => { + store.init(); + }, [store]); + + return <>zone; +}); diff --git a/ui/src/features/scene_manager/presentation/forms/zone/zone_http_repository.ts b/ui/src/features/scene_manager/presentation/forms/zone/zone_http_repository.ts new file mode 100644 index 0000000..dcb397d --- /dev/null +++ b/ui/src/features/scene_manager/presentation/forms/zone/zone_http_repository.ts @@ -0,0 +1,3 @@ +import { HttpRepository } from "../../../../../core/repository/http_repository"; + +export class ZoneHttpRepository extends HttpRepository {} diff --git a/ui/src/features/scene_manager/presentation/forms/zone/zone_store.ts b/ui/src/features/scene_manager/presentation/forms/zone/zone_store.ts new file mode 100644 index 0000000..89a7838 --- /dev/null +++ b/ui/src/features/scene_manager/presentation/forms/zone/zone_store.ts @@ -0,0 +1,19 @@ +import makeAutoObservable from "mobx-store-inheritance"; +import { NavigateFunction } from "react-router-dom"; +import { ZoneViewModel } from "./zone_view_model"; + import { ZoneHttpRepository } from "./zone_http_repository"; +import { FormState, CoreError } from "../../../../../core/store/base_store"; + +export class ZoneStore extends FormState { + constructor() { + super(); + makeAutoObservable(this); + } + viewModel: ZoneViewModel = ZoneViewModel.empty(); + cameraDeviceHttpRepository: ZoneHttpRepository = new ZoneHttpRepository(); + errorHandingStrategy = (error: CoreError) => { } + init = async (navigate?: NavigateFunction | undefined) => { + + } + +} diff --git a/ui/src/features/scene_manager/presentation/forms/zone/zone_view_model.ts b/ui/src/features/scene_manager/presentation/forms/zone/zone_view_model.ts new file mode 100644 index 0000000..dc9acf0 --- /dev/null +++ b/ui/src/features/scene_manager/presentation/forms/zone/zone_view_model.ts @@ -0,0 +1,14 @@ +import { Result } from "../../../../../core/helper/result"; + +export class ZoneViewModel { + name: string; + constructor(name: string) { + this.name = name; + } + isValid(): Result { + return Result.ok(); + } + static empty() { + return new ZoneViewModel(""); + } +} diff --git a/ui/src/features/scene_manager/presentation/scene_manager.tsx b/ui/src/features/scene_manager/presentation/scene_manager.tsx index 4de8eb8..8fae690 100644 --- a/ui/src/features/scene_manager/presentation/scene_manager.tsx +++ b/ui/src/features/scene_manager/presentation/scene_manager.tsx @@ -1,14 +1,13 @@ import * as React from "react"; import { DrawersSceneManager, SceneMangerStore, StoreMode } from "./scene_manager_store"; import { observer } from "mobx-react-lite"; +import { Drawer, Popover } from "antd"; import { useNavigate, useParams } from "react-router-dom"; import { MainPage } from "../../../core/ui/pages/main_page"; import { CoreText, CoreTextType } from "../../../core/ui/text/text"; -import { Drawer } from "antd"; import { CoreButton } from "../../../core/ui/button/button"; import { CoreInput } from "../../../core/ui/input/input"; import { DrawersDataset } from "../../dataset/dataset_store"; -import { Popover } from "antd"; import { Icon } from "../../../core/ui/icons/icons"; import { sceneManagerForms } from "./forms/scene_manager_forms"; @@ -34,6 +33,7 @@ export const SceneManger = observer(() => { return (
@@ -45,8 +45,8 @@ export const SceneManger = observer(() => { content={
{store.popoverItems.map((el, i) => ( -
el.fn()}> - +
el.fn()}> +
))}
@@ -56,11 +56,33 @@ export const SceneManger = observer(() => { +
+
+
+ {store.sceneHelperInstruments.map((el, i) => ( +
el.onClick()} + style={{ + marginTop: 4, + width: 50, + height: 50, + backgroundColor: el.isSelected ? "rgba(160, 132, 255, 1)" : "rgba(99, 81, 159, 1)", + border: "1px solid", + borderRadius: 5, + }} + > + +
+ ))} +
+
+
{
store.selectSceneItems(el.name, index, !el.isSelected)} > - +
+ store.deleteSceneItem(el)} + style={{ marginRight: 10 }} + />
))}
@@ -92,12 +128,12 @@ export const SceneManger = observer(() => { borderRadius: 7, backgroundColor: "white", margin: 10, - + overflow: "auto", }} > - {sceneManagerForms(store.activeFormDependency ?? {}, store).map((el) => { + {sceneManagerForms(store.activeFormDependency ?? {}, store).map((el, i) => { if (el.name.isEqual(store.activeFormType ?? "")) { - return <>{el.component}; + return {el.component}; } return <>; })} diff --git a/ui/src/features/scene_manager/presentation/scene_manager_store.ts b/ui/src/features/scene_manager/presentation/scene_manager_store.ts index 224d45e..3e2f7e7 100644 --- a/ui/src/features/scene_manager/presentation/scene_manager_store.ts +++ b/ui/src/features/scene_manager/presentation/scene_manager_store.ts @@ -1,17 +1,19 @@ import makeAutoObservable from "mobx-store-inheritance"; +import { Object3D, Object3DEventMap, Vector2 } from "three"; +import { message } from "antd"; import { CoreThreeRepository } from "../../../core/repository/core_three_repository"; -import { Object3D, Vector2 } from "three"; import { HttpError } from "../../../core/repository/http_repository"; import { UiDrawerFormState } from "../../../core/store/base_store"; import { UiBaseError } from "../../../core/model/ui_base_error"; import { SceneMenu, SceneMode } from "../model/scene_view"; import { BaseSceneItemModel, CameraViewModel, RobossemblerFiles, StaticAssetItemModel } from "../model/scene_assets"; import { SceneHttpRepository } from "../data/scene_http_repository"; -import { message } from "antd"; import { RobossemblerAssets } from "../../../core/model/robossembler_assets"; import { SceneViewModel } from "../model/scene_view_model"; import { SceneModel } from "../model/scene_model"; import { SceneManagerForms } from "./forms/scene_manager_forms"; +import { SolidBodyViewModel } from "./forms/solid_body/solid_body_view_model"; +import { SolidBodyModel } from "../model/solid_body_model"; export enum DrawersSceneManager { NewScene = "Новая сцена", @@ -20,6 +22,13 @@ export enum StoreMode { sceneInstance = "sceneInstance", allScenes = "allScenes", } +export interface ISolidSpawnHelper { + url: string; + solidType: string; + name: string; + isFinished: boolean; + type: string; +} interface IPopoverItem { name: string; fn: Function; @@ -27,18 +36,12 @@ interface IPopoverItem { interface SceneItems { fn: Function; name: string; + isSelected: boolean; icon: string; } export class SceneMangerStore extends UiDrawerFormState { - popoverItems: IPopoverItem[] = [ - { name: "Камера", fn: () => this.createNewForm(SceneManagerForms.camera, { store: this }) }, - { name: "Твердое тело", fn: () => this.createNewForm(SceneManagerForms.solidBody, { store: this }) }, - { name: "Робот", fn: () => this.createNewForm(SceneManagerForms.robot, { store: this }) }, - { name: "Точка", fn: () => {} }, - { name: "Траектория", fn: () => {} }, - { name: "Зона", fn: () => {} }, - ]; activeFormType?: string; + selectedItemName?: string; activeFormDependency?: Object; viewModel: SceneViewModel = SceneViewModel.empty(); sceneMode: SceneMode; @@ -55,19 +58,79 @@ export class SceneMangerStore extends UiDrawerFormState this.setMode(SceneMode.Select), isSelected: false }, + { icon: SceneMode.Move, onClick: () => this.setMode(SceneMode.Move), isSelected: false }, + { icon: SceneMode.Rotate, onClick: () => this.setMode(SceneMode.Rotate), isSelected: false }, + { + icon: SceneMode.Save, + onClick: () => { + this.setMode(SceneMode.Rotate); + this.sceneSave(); + }, + isSelected: false, + }, + ]; + popoverItems: IPopoverItem[] = [ + { name: "Камера", fn: () => this.createNewForm(SceneManagerForms.camera) }, + { name: "Твердое тело", fn: () => this.createNewForm(SceneManagerForms.solidBody) }, + { name: "Источник света", fn: () => this.createNewForm(SceneManagerForms.light) }, + { name: "Робот", fn: () => this.createNewForm(SceneManagerForms.robot) }, + { name: "Точка", fn: () => this.createNewForm(SceneManagerForms.point) }, + { name: "Траектория", fn: () => this.createNewForm(SceneManagerForms.trajectory) }, + { name: "Зона", fn: () => this.createNewForm(SceneManagerForms.zone) }, + ]; constructor() { super(DrawersSceneManager); makeAutoObservable(this); this.sceneItems = []; this.sceneHttpRepository = new SceneHttpRepository(); - this.sceneMode = SceneMode.EMPTY; + this.sceneMode = SceneMode.Select; this.sceneMenu = SceneMenu.empty(); } - createNewForm = (formType: SceneManagerForms, dependency: Object) => { - this.activeFormDependency = dependency; + sceneSave = () => {}; + selectSceneItems = (name: string, index: number, selected: boolean) => { + this.sceneItems.map((el, i) => i.isEqualR(index).map(() => (el.isSelected = selected))); + if (selected) { + this.createNewForm(SceneManagerForms.solidBody); + this.selectedItemName = name; + } + + if (!selected) { + this.createNewForm(undefined); + this.selectedItemName = undefined; + } + + this.activeFormDependency = { + type: "Preview", + name: name, + }; + }; + + setMode = (mode: SceneMode) => { + this.sceneHelperInstruments.map((el) => { + el.isSelected = false; + if (el.icon.isEqual(mode)) { + el.isSelected = true; + } + }); + this.sceneMode = mode; + this.coreThreeRepository?.setTransformMode(this.sceneMode); + this.sceneModeWatcher(); + }; + createNewForm = (formType: SceneManagerForms | undefined) => { + this.activeFormDependency = { + store: this, + }; this.activeFormType = formType; }; - makeSolid = () => {}; createNewScene = () => this.viewModel.valid().fold( async (s) => { @@ -78,12 +141,11 @@ export class SceneMangerStore extends UiDrawerFormState message.error(e) ); - deleteSceneItem(item: BaseSceneItemModel) { - const itm = this.sceneModels.filter((el) => el.id === item.id); - this.coreThreeRepository!.deleteSceneItem(itm[0]); - this.sceneModels = this.sceneModels.filter((el) => el.name !== item.name); + deleteSceneItem = (item: SceneItems) => { + this.sceneItems = this.sceneItems.filter((el) => !el.name.isEqual(item.name)); + this.coreThreeRepository?.deleteSceneItem(item.name); this.visibleSaveButton(); - } + }; visibleSaveButton = () => { this.isVisibleSaveButton = true; @@ -92,7 +154,8 @@ export class SceneMangerStore extends UiDrawerFormState { model.position = this.coreThreeRepository!.camera.position; model.quaternion = this.coreThreeRepository!.camera.quaternion; - this.sceneItems.push({ name: model.cameraLink, icon: "Camera", fn: () => {} }); + this.sceneItems.push({ name: model.cameraLink, icon: "Camera", fn: () => {}, isSelected: false }); + this.coreThreeRepository?.addSceneCamera(model); this.visibleSaveButton(); }; @@ -117,7 +180,7 @@ export class SceneMangerStore extends UiDrawerFormState { - if (this.sceneMode === undefined || this.sceneMode !== mode) { - this.sceneMode = mode; - } else if (this.sceneMode === mode) { - this.sceneMode = SceneMode.EMPTY; - } - this.coreThreeRepository?.setTransformMode(this.sceneMode); - this.sceneModeWatcher(); - }; + hiddenMenu = () => (this.isSceneMenuShow = false); sceneModeWatcher() {} @@ -155,20 +206,19 @@ export class SceneMangerStore extends UiDrawerFormState { - if (error.status === 404) { - this.errors.push(new UiBaseError(`${RobossemblerFiles.robossemblerAssets} not found to project`)); - } - }; + errorHandingStrategy = (error: HttpError) => + error.status + .isEqualR(404) + .map(() => this.errors.push(new UiBaseError(`${RobossemblerFiles.robossemblerAssets} not found to project`))); - async loadScene(canvasRef: HTMLCanvasElement) { + loadScene = (canvasRef: HTMLCanvasElement) => { this.canvasRef = canvasRef; - if (this.storeMode.isEqual(StoreMode.sceneInstance)) this.loadWebGl(canvasRef); + this.storeMode.isEqualR(StoreMode.sceneInstance).map(() => this.loadWebGl(canvasRef)); // await this.mapOk("robossemblerAssets", this.sceneHttpRepository.getRobossemblerAssets()); // if (this.robossemblerAssets) { // this.coreThreeRepository?.loadInstances(this.robossemblerAssets); // } - } + }; loadWebGl(canvasRef: HTMLCanvasElement): void { this.coreThreeRepository = new CoreThreeRepository(canvasRef as HTMLCanvasElement, this.watcherSceneEditorObject); @@ -176,56 +226,80 @@ export class SceneMangerStore extends UiDrawerFormState this.clickLister(event)); - window.addEventListener("mousedown", (e) => this.sceneContextMenu(e)); + canvasRef.addEventListener("click", (event) => this.clickLister(event, canvasRef.getBoundingClientRect().x)); + + canvasRef.addEventListener("mousedown", (e) => this.sceneContextMenu(e)); } - clickLister(event: MouseEvent) { + clickLister = (event: MouseEvent, offset: number = 0) => { const vector = new Vector2(); - vector.x = (event.clientX / window.innerWidth) * 2 - 1; - vector.y = -(event.clientY / window.innerHeight) * 2 + 1; - if (this.sceneMode === SceneMode.EMPTY) { + const boundingRect = this.canvasRef!.getBoundingClientRect(); + + vector.x = ((event.clientX - offset) / boundingRect.width) * 2 - 1; + vector.y = -(event.clientY / boundingRect.height) * 2 + 1; + if (this.mousePositionAwait && this.solidSpawnHelper) { + this.mousePositionAwait = false; + this.mousePosition = vector; + this.coreThreeRepository?.setRayCastAndGetFirstObjectAndPointToObject(vector).map((v3) => { + this.coreThreeRepository?.solidSpawn( + this.solidSpawnHelper as ISolidSpawnHelper, + (obj: Object3D | undefined) => { + const { solidType, name, url } = this.solidSpawnHelper as ISolidSpawnHelper; + this.scene.push(new SolidBodyModel(obj!.quaternion, obj!.position, name, solidType, url, url)); + this.sceneItems.push({ + name: String(this.solidSpawnHelper?.name), + icon: "Solid", + isSelected: false, + fn: () => this.createNewForm(SceneManagerForms.solidBody), + }); + }, + v3 + ); + }); + } + if (this.sceneMode.isEqual(SceneMode.Select)) { return; } - if (this.sceneMode === SceneMode.MOVING || this.sceneMode === SceneMode.ROTATE) { + if (this.sceneMode === SceneMode.Move || this.sceneMode === SceneMode.Rotate) { this.transformContollsCall(vector); } - } + }; - sceneContextMenu(e: MouseEvent): void { - if (e.button === 2) { + sceneContextMenu = (e: MouseEvent) => + e.button.isEqualR(2).map(() => { this.isSceneMenuShow = true; this.sceneMenu.x = e.clientX; this.sceneMenu.y = e.clientY; - } - } + }); - watcherThereObjects = (sceneItemModel: BaseSceneItemModel): void => { - this.sceneModels.push(sceneItemModel); + watcherThereObjects = (sceneItemModel: BaseSceneItemModel) => { + // this.sceneModels.push(sceneItemModel); + console.log(sceneItemModel); }; watcherSceneEditorObject = (mesh: Object3D) => { - this.sceneModels = this.sceneModels.map((el) => { - if (el.name === mesh.name) { - el.position = mesh.position; - el.quaternion = mesh.quaternion; - return el; - } - return el; - }); + this.scene = this.scene.map((el) => + el.name.isEqualR(mesh.name).fold( + () => { + el.vector3 = mesh.position; + el.quaternion = mesh.quaternion; + return el; + }, + () => el + ) + ); this.visibleSaveButton(); }; - transformContollsCall = (vector: Vector2) => { + transformContollsCall = (vector: Vector2) => this.coreThreeRepository?.setRayCastAndGetFirstObject(vector).fold( - (success) => this.coreThreeRepository?.setTransformControlsAttach(success), - (_error) => this.coreThreeRepository?.disposeTransformControlsMode() + (object) => this.coreThreeRepository?.setTransformControlsAttach(object), + (_) => this.coreThreeRepository?.disposeTransformControlsMode() ); - }; - dispose() { + dispose = () => { window.removeEventListener("click", this.clickLister); window.removeEventListener("mousedown", (e) => this.sceneContextMenu(e)); - } + }; } diff --git a/ui/tsconfig.json b/ui/tsconfig.json index 97fa729..12b2984 100644 --- a/ui/tsconfig.json +++ b/ui/tsconfig.json @@ -18,7 +18,8 @@ "useDefineForClassFields": true, "experimentalDecorators": true, "emitDecoratorMetadata": true, - "strictPropertyInitialization": false + "strictPropertyInitialization": false, + "sourceMap": true }, "types": ["babylonjs", "babylonjs-loaders"], "include": ["src"] diff --git a/ui/tslint.json b/ui/tslint.json index 1bed705..afbaa79 100644 --- a/ui/tslint.json +++ b/ui/tslint.json @@ -1,21 +1,27 @@ { "eslintConfig": { - "extends": ["react-app", "shared-config"], + "extends": [ + "react-app", + "shared-config" + ], "rules": { "additional-rule": "warn", - "no-extend-native":"off", - "react-hooks/exhaustive-deps":"off" + "no-extend-native": "off", + "react-hooks/exhaustive-deps": "off", + "array-callback-return": "off" }, "overrides": [ { - "files": ["**/*.ts?(x)"], + "files": [ + "**/*.ts?(x)" + ], "rules": { "additional-typescript-only-rule": "warn", "array-callback-return": "off", "react-hooks/exhaustive-deps": "off", - "no-extend-native":"off" + "no-extend-native": "off" } } ] } -} +} \ No newline at end of file diff --git a/web_p/blender/.DS_Store b/web_p/blender/.DS_Store new file mode 100644 index 0000000..7f72b3d Binary files /dev/null and b/web_p/blender/.DS_Store differ diff --git a/web_p/blender/assets/.DS_Store b/web_p/blender/assets/.DS_Store new file mode 100644 index 0000000..69ac421 Binary files /dev/null and b/web_p/blender/assets/.DS_Store differ diff --git a/web_p/blender/libs/.DS_Store b/web_p/blender/libs/.DS_Store new file mode 100644 index 0000000..cc2f424 Binary files /dev/null and b/web_p/blender/libs/.DS_Store differ diff --git a/web_p/blender/libs/objects/body_down.obj b/web_p/blender/libs/objects/body_down.obj new file mode 100644 index 0000000..ed263a3 --- /dev/null +++ b/web_p/blender/libs/objects/body_down.obj @@ -0,0 +1,2881 @@ +# Created by FreeCAD +v -25.688051 23.688070 4.999995 +v -25.688051 23.688070 19.999981 +v -25.657650 23.340759 4.999995 +v -25.657650 23.340759 19.999981 +v -25.567411 23.003990 19.999981 +v -25.567411 23.003990 4.999995 +v -25.420120 22.688030 19.999981 +v -25.420120 22.688030 4.999995 +v -25.220150 22.402460 4.999995 +v -25.220150 22.402460 19.999981 +v -24.973631 22.155941 19.999981 +v -24.973631 22.155941 4.999995 +v -24.688059 21.956018 19.999981 +v -24.688059 21.956018 4.999995 +v -24.372101 21.808680 4.999995 +v -24.372101 21.808680 19.999981 +v -24.035332 21.718441 4.999995 +v -24.035332 21.718441 19.999981 +v -23.688070 21.688040 19.999981 +v -23.688070 21.688040 4.999995 +v -23.340759 21.718441 19.999981 +v -23.340759 21.718441 4.999995 +v -23.003990 21.808680 4.999995 +v -23.003990 21.808680 19.999981 +v -22.688030 21.956018 4.999995 +v -22.688030 21.956018 19.999981 +v -22.402460 22.155941 19.999981 +v -22.402460 22.155941 4.999995 +v -22.155941 22.402460 19.999981 +v -22.155941 22.402460 4.999995 +v -21.956018 22.688030 4.999995 +v -21.956018 22.688030 19.999981 +v -21.808680 23.003990 4.999995 +v -21.808680 23.003990 19.999981 +v -21.718441 23.340759 19.999981 +v -21.718441 23.340759 4.999995 +v -21.688040 23.688070 19.999981 +v -21.688040 23.688070 4.999995 +v 21.688040 23.688070 4.999995 +v 21.688040 23.688070 19.999981 +v 21.718441 23.340759 4.999995 +v 21.718441 23.340759 19.999981 +v 21.808680 23.003990 19.999981 +v 21.808680 23.003990 4.999995 +v 21.956018 22.688030 19.999981 +v 21.956018 22.688030 4.999995 +v 22.155941 22.402460 4.999995 +v 22.155941 22.402460 19.999981 +v 22.402460 22.155941 19.999981 +v 22.402460 22.155941 4.999995 +v 22.688030 21.956018 19.999981 +v 22.688030 21.956018 4.999995 +v 23.003990 21.808680 4.999995 +v 23.003990 21.808680 19.999981 +v 23.340759 21.718441 4.999995 +v 23.340759 21.718441 19.999981 +v 23.688070 21.688040 19.999981 +v 23.688070 21.688040 4.999995 +v 24.035332 21.718441 19.999981 +v 24.035332 21.718441 4.999995 +v 24.372101 21.808680 4.999995 +v 24.372101 21.808680 19.999981 +v 24.688059 21.956018 4.999995 +v 24.688059 21.956018 19.999981 +v 24.973631 22.155941 19.999981 +v 24.973631 22.155941 4.999995 +v 25.220150 22.402460 19.999981 +v 25.220150 22.402460 4.999995 +v 25.420120 22.688030 4.999995 +v 25.420120 22.688030 19.999981 +v 25.567411 23.003990 4.999995 +v 25.567411 23.003990 19.999981 +v 25.657650 23.340759 19.999981 +v 25.657650 23.340759 4.999995 +v 25.688051 23.688070 19.999981 +v 25.688051 23.688070 4.999995 +v 21.688040 -23.688070 4.999995 +v 21.688040 -23.688070 19.999981 +v 21.718441 -24.035332 4.999995 +v 21.718441 -24.035332 19.999981 +v 21.808680 -24.372101 19.999981 +v 21.808680 -24.372101 4.999995 +v 21.956018 -24.688059 19.999981 +v 21.956018 -24.688059 4.999995 +v 22.155941 -24.973631 4.999995 +v 22.155941 -24.973631 19.999981 +v 22.402460 -25.220150 19.999981 +v 22.402460 -25.220150 4.999995 +v 22.688030 -25.420120 19.999981 +v 22.688030 -25.420120 4.999995 +v 23.003990 -25.567411 4.999995 +v 23.003990 -25.567411 19.999981 +v 23.340759 -25.657650 4.999995 +v 23.340759 -25.657650 19.999981 +v 23.688070 -25.688051 19.999981 +v 23.688070 -25.688051 4.999995 +v 24.035332 -25.657650 19.999981 +v 24.035332 -25.657650 4.999995 +v 24.372101 -25.567411 4.999995 +v 24.372101 -25.567411 19.999981 +v 24.688059 -25.420120 4.999995 +v 24.688059 -25.420120 19.999981 +v 24.973631 -25.220150 19.999981 +v 24.973631 -25.220150 4.999995 +v 25.220150 -24.973631 19.999981 +v 25.220150 -24.973631 4.999995 +v 25.420120 -24.688059 4.999995 +v 25.420120 -24.688059 19.999981 +v 25.567411 -24.372101 4.999995 +v 25.567411 -24.372101 19.999981 +v 25.657650 -24.035332 19.999981 +v 25.657650 -24.035332 4.999995 +v 25.688051 -23.688070 19.999981 +v 25.688051 -23.688070 4.999995 +v -25.688051 -23.688070 4.999995 +v -25.688051 -23.688070 19.999981 +v -25.657650 -24.035332 4.999995 +v -25.657650 -24.035332 19.999981 +v -25.567411 -24.372101 19.999981 +v -25.567411 -24.372101 4.999995 +v -25.420120 -24.688059 19.999981 +v -25.420120 -24.688059 4.999995 +v -25.220150 -24.973631 4.999995 +v -25.220150 -24.973631 19.999981 +v -24.973631 -25.220150 19.999981 +v -24.973631 -25.220150 4.999995 +v -24.688059 -25.420120 19.999981 +v -24.688059 -25.420120 4.999995 +v -24.372101 -25.567411 4.999995 +v -24.372101 -25.567411 19.999981 +v -24.035332 -25.657650 4.999995 +v -24.035332 -25.657650 19.999981 +v -23.688070 -25.688051 19.999981 +v -23.688070 -25.688051 4.999995 +v -23.340759 -25.657650 19.999981 +v -23.340759 -25.657650 4.999995 +v -23.003990 -25.567411 4.999995 +v -23.003990 -25.567411 19.999981 +v -22.688030 -25.420120 4.999995 +v -22.688030 -25.420120 19.999981 +v -22.402460 -25.220150 19.999981 +v -22.402460 -25.220150 4.999995 +v -22.155941 -24.973631 19.999981 +v -22.155941 -24.973631 4.999995 +v -21.956018 -24.688059 4.999995 +v -21.956018 -24.688059 19.999981 +v -21.808680 -24.372101 4.999995 +v -21.808680 -24.372101 19.999981 +v -21.718441 -24.035332 19.999981 +v -21.718441 -24.035332 4.999995 +v -21.688040 -23.688070 19.999981 +v -21.688040 -23.688070 4.999995 +v -7.499992 0.000000 0.000000 +v -7.386028 -1.302361 0.000000 +v -7.499992 0.000000 -4.999995 +v -7.386028 -1.302361 -4.999995 +v -7.047653 -2.565145 0.000000 +v -7.047653 -2.565145 -4.999995 +v -6.495177 -3.749966 0.000000 +v -6.495177 -3.749966 -4.999995 +v -5.745291 -4.820883 0.000000 +v -5.745291 -4.820883 -4.999995 +v -4.820883 -5.745291 -4.999995 +v -4.820883 -5.745291 0.000000 +v -3.749966 -6.495177 -4.999995 +v -3.749966 -6.495177 0.000000 +v -2.565145 -7.047653 0.000000 +v -2.565145 -7.047653 -4.999995 +v -1.302361 -7.386028 -4.999995 +v -1.302361 -7.386028 0.000000 +v 0.000000 -7.499992 -4.999995 +v 0.000000 -7.499992 0.000000 +v 1.302361 -7.386028 0.000000 +v 1.302361 -7.386028 -4.999995 +v 2.565145 -7.047653 -4.999995 +v 2.565145 -7.047653 0.000000 +v 3.749966 -6.495177 -4.999995 +v 3.749966 -6.495177 0.000000 +v 4.820883 -5.745291 0.000000 +v 4.820883 -5.745291 -4.999995 +v 5.745291 -4.820883 0.000000 +v 5.745291 -4.820883 -4.999995 +v 6.495177 -3.749966 0.000000 +v 6.495177 -3.749966 -4.999995 +v 7.047653 -2.565145 0.000000 +v 7.047653 -2.565145 -4.999995 +v 7.386028 -1.302361 0.000000 +v 7.386028 -1.302361 -4.999995 +v 7.499992 0.000000 0.000000 +v 7.499992 0.000000 -4.999995 +v 29.999969 0.000000 0.000000 +v 29.811321 -3.358900 0.000000 +v 29.999969 0.000000 19.999981 +v 29.811321 -3.358900 19.999981 +v 29.247820 -6.675601 19.999981 +v 29.247820 -6.675601 0.000000 +v 28.316490 -9.908318 19.999981 +v 28.316490 -9.908318 0.000000 +v 27.029030 -13.016460 19.999981 +v 27.029030 -13.016460 0.000000 +v 25.401711 -15.960930 19.999981 +v 25.401711 -15.960930 0.000000 +v 23.454901 -18.704651 0.000000 +v 23.454901 -18.704651 19.999981 +v 21.213171 -21.213171 0.000000 +v 21.213171 -21.213171 19.999981 +v 18.704651 -23.454901 19.999981 +v 18.704651 -23.454901 0.000000 +v 15.960930 -25.401711 19.999981 +v 15.960930 -25.401711 0.000000 +v 13.016460 -27.029030 19.999981 +v 13.016460 -27.029030 0.000000 +v 9.908318 -28.316490 0.000000 +v 9.908318 -28.316490 19.999981 +v 6.675601 -29.247820 0.000000 +v 6.675601 -29.247820 19.999981 +v 3.358900 -29.811321 0.000000 +v 3.358900 -29.811321 19.999981 +v 0.000000 -29.999969 0.000000 +v 0.000000 -29.999969 19.999981 +v -3.358900 -29.811321 0.000000 +v -3.358900 -29.811321 19.999981 +v -6.675601 -29.247820 0.000000 +v -6.675601 -29.247820 19.999981 +v -9.908318 -28.316490 19.999981 +v -9.908318 -28.316490 0.000000 +v -13.016460 -27.029030 0.000000 +v -13.016460 -27.029030 19.999981 +v -15.960930 -25.401711 19.999981 +v -15.960930 -25.401711 0.000000 +v -18.704651 -23.454901 0.000000 +v -18.704651 -23.454901 19.999981 +v -21.213171 -21.213171 0.000000 +v -21.213171 -21.213171 19.999981 +v -23.454901 -18.704651 0.000000 +v -23.454901 -18.704651 19.999981 +v -25.401711 -15.960930 0.000000 +v -25.401711 -15.960930 19.999981 +v -27.029030 -13.016460 0.000000 +v -27.029030 -13.016460 19.999981 +v -28.316490 -9.908318 19.999981 +v -28.316490 -9.908318 0.000000 +v -29.247820 -6.675601 19.999981 +v -29.247820 -6.675601 0.000000 +v -29.811321 -3.358900 0.000000 +v -29.811321 -3.358900 19.999981 +v -29.999969 0.000000 0.000000 +v -29.999969 0.000000 19.999981 +v -26.642080 -26.642080 19.999981 +v -28.367041 -24.675190 19.999981 +v -24.675190 -28.367041 19.999981 +v -22.499969 -29.820499 19.999981 +v -25.657650 -23.340759 19.999981 +v -29.820499 -22.499969 19.999981 +v -25.567411 -23.003990 19.999981 +v -25.420120 -22.688030 19.999981 +v -20.153641 -30.977539 19.999981 +v -25.220150 -22.402460 19.999981 +v -30.977539 -20.153641 19.999981 +v -24.973631 -22.155941 19.999981 +v -21.956018 -22.688030 19.999981 +v -21.808680 -23.003990 19.999981 +v -22.155941 -22.402460 19.999981 +v -22.402460 -22.155941 19.999981 +v -22.688030 -21.956018 19.999981 +v -23.003990 -21.808680 19.999981 +v -21.718441 -23.340759 19.999981 +v -23.340759 -21.718441 19.999981 +v -23.688070 -21.688040 19.999981 +v -24.035332 -21.718441 19.999981 +v -24.372101 -21.808680 19.999981 +v -24.688059 -21.956018 19.999981 +v -17.676350 -31.818502 19.999981 +v -31.818502 -17.676350 19.999981 +v -15.110490 -32.328842 19.999981 +v -12.499980 -32.499962 19.999981 +v -32.499962 -12.499980 19.999981 +v -32.328842 -15.110490 19.999981 +v -32.499962 12.499980 19.999981 +v -29.811321 3.358900 19.999981 +v -29.247820 6.675601 19.999981 +v 12.499980 -32.499962 19.999981 +v -28.316490 9.908318 19.999981 +v 15.110490 -32.328842 19.999981 +v 17.676350 -31.818502 19.999981 +v -27.029030 13.016460 19.999981 +v -31.818502 17.676350 19.999981 +v -32.328842 15.110490 19.999981 +v 20.153641 -30.977539 19.999981 +v -25.401711 15.960930 19.999981 +v -30.977539 20.153641 19.999981 +v -23.454901 18.704651 19.999981 +v -29.820499 22.499969 19.999981 +v 22.499969 -29.820499 19.999981 +v -28.367041 24.675190 19.999981 +v 24.675190 -28.367041 19.999981 +v -25.657650 24.035332 19.999981 +v 21.718441 -23.340759 19.999981 +v -25.567411 24.372101 19.999981 +v 21.808680 -23.003990 19.999981 +v 26.642080 -26.642080 19.999981 +v -21.213171 21.213171 19.999981 +v 21.956018 -22.688030 19.999981 +v 22.155941 -22.402460 19.999981 +v -26.642080 26.642080 19.999981 +v -25.420120 24.688059 19.999981 +v -25.220150 24.973631 19.999981 +v -24.973631 25.220150 19.999981 +v 22.402460 -22.155941 19.999981 +v -24.688059 25.420120 19.999981 +v 22.688030 -21.956018 19.999981 +v -24.372101 25.567411 19.999981 +v 23.003990 -21.808680 19.999981 +v 28.367041 -24.675190 19.999981 +v 25.657650 -23.340759 19.999981 +v -24.675190 28.367041 19.999981 +v -23.688070 25.688051 19.999981 +v -23.340759 25.657650 19.999981 +v -24.035332 25.657650 19.999981 +v 24.688059 -21.956018 19.999981 +v 24.973631 -22.155941 19.999981 +v 24.372101 -21.808680 19.999981 +v 24.035332 -21.718441 19.999981 +v 23.688070 -21.688040 19.999981 +v 23.340759 -21.718441 19.999981 +v -18.704651 23.454901 19.999981 +v -21.718441 24.035332 19.999981 +v -21.808680 24.372101 19.999981 +v -21.956018 24.688059 19.999981 +v -22.155941 24.973631 19.999981 +v 29.820499 -22.499969 19.999981 +v 25.567411 -23.003990 19.999981 +v 25.420120 -22.688030 19.999981 +v 25.220150 -22.402460 19.999981 +v -22.499969 29.820499 19.999981 +v -22.688030 25.420120 19.999981 +v -22.402460 25.220150 19.999981 +v -23.003990 25.567411 19.999981 +v -15.960930 25.401711 19.999981 +v 30.977539 -20.153641 19.999981 +v -20.153641 30.977539 19.999981 +v 31.818502 -17.676350 19.999981 +v -17.676350 31.818502 19.999981 +v -13.016460 27.029030 19.999981 +v 32.328842 -15.110490 19.999981 +v -15.110490 32.328842 19.999981 +v 32.499962 -12.499980 19.999981 +v -12.499980 32.499962 19.999981 +v -9.908318 28.316490 19.999981 +v -6.675601 29.247820 19.999981 +v -3.358900 29.811321 19.999981 +v 0.000000 29.999969 19.999981 +v 21.213171 21.213171 19.999981 +v 18.704651 23.454901 19.999981 +v 23.454901 18.704651 19.999981 +v 12.499980 32.499962 19.999981 +v 9.908318 28.316490 19.999981 +v 13.016460 27.029030 19.999981 +v 6.675601 29.247820 19.999981 +v 3.358900 29.811321 19.999981 +v 32.499962 12.499980 19.999981 +v 29.811321 3.358900 19.999981 +v 29.247820 6.675601 19.999981 +v 28.316490 9.908318 19.999981 +v 27.029030 13.016460 19.999981 +v 21.718441 24.035332 19.999981 +v 21.808680 24.372101 19.999981 +v 21.956018 24.688059 19.999981 +v 25.401711 15.960930 19.999981 +v 22.155941 24.973631 19.999981 +v 15.960930 25.401711 19.999981 +v 15.110490 32.328842 19.999981 +v 32.328842 15.110490 19.999981 +v 17.676350 31.818502 19.999981 +v 31.818502 17.676350 19.999981 +v 20.153641 30.977539 19.999981 +v 22.402460 25.220150 19.999981 +v 30.977539 20.153641 19.999981 +v 22.499969 29.820499 19.999981 +v 22.688030 25.420120 19.999981 +v 23.003990 25.567411 19.999981 +v 23.340759 25.657650 19.999981 +v 29.820499 22.499969 19.999981 +v 24.675190 28.367041 19.999981 +v 24.035332 25.657650 19.999981 +v 24.372101 25.567411 19.999981 +v 23.688070 25.688051 19.999981 +v 28.367041 24.675190 19.999981 +v 25.657650 24.035332 19.999981 +v 25.567411 24.372101 19.999981 +v 26.642080 26.642080 19.999981 +v 25.420120 24.688059 19.999981 +v 25.220150 24.973631 19.999981 +v 24.973631 25.220150 19.999981 +v 24.688059 25.420120 19.999981 +v 32.328842 -15.110490 -4.999995 +v 32.499962 -12.499980 -4.999995 +v 31.818502 -17.676350 -4.999995 +v 30.977539 -20.153641 -4.999995 +v 29.820499 -22.499969 -4.999995 +v 28.367041 -24.675190 -4.999995 +v 26.642080 -26.642080 -4.999995 +v 24.675190 -28.367041 -4.999995 +v 22.499969 -29.820499 -4.999995 +v 20.153641 -30.977539 -4.999995 +v 17.676350 -31.818502 -4.999995 +v 15.110490 -32.328842 -4.999995 +v 12.499980 -32.499962 -4.999995 +v 32.499962 12.499980 -4.999995 +v 12.499980 32.499962 -4.999995 +v 15.110490 32.328842 -4.999995 +v 17.676350 31.818502 -4.999995 +v 20.153641 30.977539 -4.999995 +v 22.499969 29.820499 -4.999995 +v 24.675190 28.367041 -4.999995 +v 26.642080 26.642080 -4.999995 +v 28.367041 24.675190 -4.999995 +v 29.820499 22.499969 -4.999995 +v 30.977539 20.153641 -4.999995 +v 31.818502 17.676350 -4.999995 +v 32.328842 15.110490 -4.999995 +v -12.499980 32.499962 -4.999995 +v -32.499962 12.499980 -4.999995 +v -32.328842 15.110490 -4.999995 +v -31.818502 17.676350 -4.999995 +v -30.977539 20.153641 -4.999995 +v -29.820499 22.499969 -4.999995 +v -28.367041 24.675190 -4.999995 +v -26.642080 26.642080 -4.999995 +v -24.675190 28.367041 -4.999995 +v -22.499969 29.820499 -4.999995 +v -20.153641 30.977539 -4.999995 +v -17.676350 31.818502 -4.999995 +v -15.110490 32.328842 -4.999995 +v -32.499962 -12.499980 -4.999995 +v -12.499980 -32.499962 -4.999995 +v -15.110490 -32.328842 -4.999995 +v -17.676350 -31.818502 -4.999995 +v -20.153641 -30.977539 -4.999995 +v -22.499969 -29.820499 -4.999995 +v -24.675190 -28.367041 -4.999995 +v -26.642080 -26.642080 -4.999995 +v -28.367041 -24.675190 -4.999995 +v -29.820499 -22.499969 -4.999995 +v -30.977539 -20.153641 -4.999995 +v -31.818502 -17.676350 -4.999995 +v -32.328842 -15.110490 -4.999995 +v -29.811321 3.358900 0.000000 +v -29.247820 6.675601 0.000000 +v -28.316490 9.908318 0.000000 +v -27.029030 13.016460 0.000000 +v -25.401711 15.960930 0.000000 +v -23.454901 18.704651 0.000000 +v -21.213171 21.213171 0.000000 +v -18.704651 23.454901 0.000000 +v -15.960930 25.401711 0.000000 +v -13.016460 27.029030 0.000000 +v -9.908318 28.316490 0.000000 +v -6.675601 29.247820 0.000000 +v -3.358900 29.811321 0.000000 +v 0.000000 29.999969 0.000000 +v 3.358900 29.811321 0.000000 +v 6.675601 29.247820 0.000000 +v 9.908318 28.316490 0.000000 +v 13.016460 27.029030 0.000000 +v 15.960930 25.401711 0.000000 +v 18.704651 23.454901 0.000000 +v 21.213171 21.213171 0.000000 +v 23.454901 18.704651 0.000000 +v 25.401711 15.960930 0.000000 +v 27.029030 13.016460 0.000000 +v 28.316490 9.908318 0.000000 +v 29.247820 6.675601 0.000000 +v 29.811321 3.358900 0.000000 +v 7.386028 1.302361 0.000000 +v 7.047653 2.565145 0.000000 +v 6.495177 3.749966 0.000000 +v 5.745291 4.820883 0.000000 +v 4.820883 5.745291 0.000000 +v 3.749966 6.495177 0.000000 +v 2.565145 7.047653 0.000000 +v 1.302361 7.386028 0.000000 +v 0.000000 7.499992 0.000000 +v -1.302361 7.386028 0.000000 +v -7.386028 1.302361 0.000000 +v -2.565145 7.047653 0.000000 +v -7.047653 2.565145 0.000000 +v -6.495177 3.749966 0.000000 +v -3.749966 6.495177 0.000000 +v -4.820883 5.745291 0.000000 +v -5.745291 4.820883 0.000000 +v 7.386028 1.302361 -4.999995 +v 7.047653 2.565145 -4.999995 +v 6.495177 3.749966 -4.999995 +v 5.745291 4.820883 -4.999995 +v 4.820883 5.745291 -4.999995 +v 1.302361 7.386028 -4.999995 +v 0.000000 7.499992 -4.999995 +v 2.565145 7.047653 -4.999995 +v 3.749966 6.495177 -4.999995 +v -3.749966 6.495177 -4.999995 +v -4.820883 5.745291 -4.999995 +v -2.565145 7.047653 -4.999995 +v -1.302361 7.386028 -4.999995 +v -7.386028 1.302361 -4.999995 +v -7.047653 2.565145 -4.999995 +v -6.495177 3.749966 -4.999995 +v -5.745291 4.820883 -4.999995 +v -21.718441 -23.340759 4.999995 +v -21.808680 -23.003990 4.999995 +v -21.956018 -22.688030 4.999995 +v -22.155941 -22.402460 4.999995 +v -22.402460 -22.155941 4.999995 +v -22.688030 -21.956018 4.999995 +v -23.003990 -21.808680 4.999995 +v -23.340759 -21.718441 4.999995 +v -23.688070 -21.688040 4.999995 +v -24.035332 -21.718441 4.999995 +v -24.372101 -21.808680 4.999995 +v -24.688059 -21.956018 4.999995 +v -24.973631 -22.155941 4.999995 +v -25.220150 -22.402460 4.999995 +v -25.420120 -22.688030 4.999995 +v -25.567411 -23.003990 4.999995 +v -25.657650 -23.340759 4.999995 +v 25.657650 -23.340759 4.999995 +v 25.567411 -23.003990 4.999995 +v 25.420120 -22.688030 4.999995 +v 25.220150 -22.402460 4.999995 +v 24.973631 -22.155941 4.999995 +v 24.688059 -21.956018 4.999995 +v 24.372101 -21.808680 4.999995 +v 24.035332 -21.718441 4.999995 +v 23.688070 -21.688040 4.999995 +v 23.340759 -21.718441 4.999995 +v 23.003990 -21.808680 4.999995 +v 22.688030 -21.956018 4.999995 +v 22.402460 -22.155941 4.999995 +v 22.155941 -22.402460 4.999995 +v 21.956018 -22.688030 4.999995 +v 21.808680 -23.003990 4.999995 +v 21.718441 -23.340759 4.999995 +v 25.657650 24.035332 4.999995 +v 25.567411 24.372101 4.999995 +v 25.420120 24.688059 4.999995 +v 25.220150 24.973631 4.999995 +v 24.973631 25.220150 4.999995 +v 24.688059 25.420120 4.999995 +v 24.372101 25.567411 4.999995 +v 24.035332 25.657650 4.999995 +v 23.688070 25.688051 4.999995 +v 23.340759 25.657650 4.999995 +v 23.003990 25.567411 4.999995 +v 22.688030 25.420120 4.999995 +v 22.402460 25.220150 4.999995 +v 22.155941 24.973631 4.999995 +v 21.956018 24.688059 4.999995 +v 21.808680 24.372101 4.999995 +v 21.718441 24.035332 4.999995 +v -21.718441 24.035332 4.999995 +v -21.808680 24.372101 4.999995 +v -21.956018 24.688059 4.999995 +v -22.155941 24.973631 4.999995 +v -22.402460 25.220150 4.999995 +v -22.688030 25.420120 4.999995 +v -23.003990 25.567411 4.999995 +v -23.340759 25.657650 4.999995 +v -23.688070 25.688051 4.999995 +v -24.035332 25.657650 4.999995 +v -24.372101 25.567411 4.999995 +v -24.688059 25.420120 4.999995 +v -24.973631 25.220150 4.999995 +v -25.220150 24.973631 4.999995 +v -25.420120 24.688059 4.999995 +v -25.567411 24.372101 4.999995 +v -25.657650 24.035332 4.999995 +vn 0.996191 0.087200 -0.000000 +vn 0.996191 0.087200 0.000000 +vn 0.965925 0.258823 0.000000 +vn 0.965925 0.258823 0.000000 +vn 0.906355 0.422516 0.000000 +vn 0.819136 0.573599 -0.000000 +vn 0.906355 0.422516 0.000000 +vn 0.819136 0.573599 0.000000 +vn 0.707107 0.707107 0.000000 +vn 0.707107 0.707107 0.000000 +vn 0.573505 0.819202 0.000000 +vn 0.422631 0.906302 -0.000000 +vn 0.573505 0.819202 0.000000 +vn 0.258823 0.965925 -0.000000 +vn 0.422631 0.906302 0.000000 +vn 0.258823 0.965925 0.000000 +vn 0.087212 0.996190 0.000000 +vn 0.087212 0.996190 0.000000 +vn -0.087200 0.996191 0.000000 +vn -0.258823 0.965925 0.000000 +vn -0.087200 0.996191 0.000000 +vn -0.422628 0.906303 0.000000 +vn -0.258823 0.965925 0.000000 +vn -0.422628 0.906303 0.000000 +vn -0.573507 0.819200 0.000000 +vn -0.573507 0.819200 0.000000 +vn -0.707107 0.707107 0.000000 +vn -0.819200 0.573507 0.000000 +vn -0.707107 0.707107 0.000000 +vn -0.819200 0.573507 0.000000 +vn -0.906303 0.422628 0.000000 +vn -0.906303 0.422628 0.000000 +vn -0.965925 0.258823 0.000000 +vn -0.965925 0.258823 0.000000 +vn -0.996191 0.087200 0.000000 +vn -0.996191 0.087200 0.000000 +vn 0.996191 0.087200 -0.000000 +vn 0.996191 0.087200 0.000000 +vn 0.965925 0.258823 0.000000 +vn 0.965925 0.258823 0.000000 +vn 0.906303 0.422628 0.000000 +vn 0.819200 0.573507 -0.000000 +vn 0.906303 0.422628 0.000000 +vn 0.819200 0.573507 0.000000 +vn 0.707107 0.707107 0.000000 +vn 0.707107 0.707107 0.000000 +vn 0.573507 0.819200 0.000000 +vn 0.422628 0.906303 -0.000000 +vn 0.573507 0.819200 0.000000 +vn 0.258823 0.965925 -0.000000 +vn 0.422628 0.906303 0.000000 +vn 0.258823 0.965925 0.000000 +vn 0.087200 0.996191 0.000000 +vn 0.087200 0.996191 0.000000 +vn -0.087212 0.996190 0.000000 +vn -0.258823 0.965925 0.000000 +vn -0.087212 0.996190 0.000000 +vn -0.422631 0.906302 0.000000 +vn -0.258823 0.965925 0.000000 +vn -0.422631 0.906302 0.000000 +vn -0.573505 0.819202 0.000000 +vn -0.573505 0.819202 0.000000 +vn -0.707107 0.707107 0.000000 +vn -0.819136 0.573599 0.000000 +vn -0.707107 0.707107 0.000000 +vn -0.819136 0.573599 0.000000 +vn -0.906355 0.422516 0.000000 +vn -0.906355 0.422516 0.000000 +vn -0.965925 0.258823 0.000000 +vn -0.965925 0.258823 0.000000 +vn -0.996191 0.087200 0.000000 +vn -0.996191 0.087200 0.000000 +vn 0.996190 0.087212 -0.000000 +vn 0.996190 0.087212 0.000000 +vn 0.965925 0.258823 0.000000 +vn 0.965925 0.258823 0.000000 +vn 0.906302 0.422631 0.000000 +vn 0.819202 0.573505 -0.000000 +vn 0.906302 0.422631 0.000000 +vn 0.819202 0.573505 0.000000 +vn 0.707107 0.707107 0.000000 +vn 0.707107 0.707107 0.000000 +vn 0.573599 0.819136 0.000000 +vn 0.422516 0.906355 -0.000000 +vn 0.573599 0.819136 0.000000 +vn 0.258823 0.965925 -0.000000 +vn 0.422516 0.906355 0.000000 +vn 0.258823 0.965925 0.000000 +vn 0.087200 0.996191 0.000000 +vn 0.087200 0.996191 0.000000 +vn -0.087212 0.996190 0.000000 +vn -0.258823 0.965925 0.000000 +vn -0.087212 0.996190 0.000000 +vn -0.422518 0.906354 0.000000 +vn -0.258823 0.965925 0.000000 +vn -0.422518 0.906354 0.000000 +vn -0.573597 0.819138 0.000000 +vn -0.573597 0.819138 0.000000 +vn -0.707107 0.707107 0.000000 +vn -0.819138 0.573597 0.000000 +vn -0.707107 0.707107 0.000000 +vn -0.819138 0.573597 0.000000 +vn -0.906354 0.422518 0.000000 +vn -0.906354 0.422518 0.000000 +vn -0.965925 0.258823 0.000000 +vn -0.965925 0.258823 0.000000 +vn -0.996190 0.087212 0.000000 +vn -0.996190 0.087212 0.000000 +vn 0.996190 0.087212 -0.000000 +vn 0.996190 0.087212 0.000000 +vn 0.965925 0.258823 0.000000 +vn 0.965925 0.258823 0.000000 +vn 0.906354 0.422518 0.000000 +vn 0.819138 0.573597 -0.000000 +vn 0.906354 0.422518 0.000000 +vn 0.819138 0.573597 0.000000 +vn 0.707107 0.707107 0.000000 +vn 0.707107 0.707107 0.000000 +vn 0.573597 0.819138 0.000000 +vn 0.422518 0.906354 -0.000000 +vn 0.573597 0.819138 0.000000 +vn 0.258823 0.965925 -0.000000 +vn 0.422518 0.906354 0.000000 +vn 0.258823 0.965925 0.000000 +vn 0.087212 0.996190 0.000000 +vn 0.087212 0.996190 0.000000 +vn -0.087200 0.996191 0.000000 +vn -0.258823 0.965925 0.000000 +vn -0.087200 0.996191 0.000000 +vn -0.422516 0.906355 0.000000 +vn -0.258823 0.965925 0.000000 +vn -0.422516 0.906355 0.000000 +vn -0.573599 0.819136 0.000000 +vn -0.573599 0.819136 0.000000 +vn -0.707107 0.707107 0.000000 +vn -0.819202 0.573505 0.000000 +vn -0.707107 0.707107 0.000000 +vn -0.819202 0.573505 0.000000 +vn -0.906302 0.422631 0.000000 +vn -0.906302 0.422631 0.000000 +vn -0.965925 0.258823 0.000000 +vn -0.965925 0.258823 0.000000 +vn -0.996190 0.087212 0.000000 +vn -0.996190 0.087212 0.000000 +vn 0.996193 0.087173 0.000000 +vn 0.996193 0.087173 0.000000 +vn 0.965923 0.258828 0.000000 +vn 0.965923 0.258828 0.000000 +vn 0.906312 0.422609 0.000000 +vn 0.906312 0.422609 0.000000 +vn 0.819144 0.573588 0.000000 +vn 0.819144 0.573588 0.000000 +vn 0.573588 0.819144 -0.000000 +vn 0.707107 0.707107 0.000000 +vn 0.707107 0.707107 0.000000 +vn 0.573588 0.819144 0.000000 +vn 0.422609 0.906312 0.000000 +vn 0.422609 0.906312 0.000000 +vn 0.087173 0.996193 -0.000000 +vn 0.258828 0.965923 0.000000 +vn 0.258828 0.965923 0.000000 +vn 0.087173 0.996193 0.000000 +vn -0.087173 0.996193 0.000000 +vn -0.087173 0.996193 0.000000 +vn -0.422609 0.906312 0.000000 +vn -0.258828 0.965923 0.000000 +vn -0.258828 0.965923 0.000000 +vn -0.422609 0.906312 0.000000 +vn -0.573588 0.819144 0.000000 +vn -0.573588 0.819144 0.000000 +vn -0.707107 0.707107 0.000000 +vn -0.707107 0.707107 0.000000 +vn -0.819144 0.573588 0.000000 +vn -0.819144 0.573588 0.000000 +vn -0.906312 0.422609 0.000000 +vn -0.906312 0.422609 0.000000 +vn -0.965923 0.258828 0.000000 +vn -0.965923 0.258828 0.000000 +vn -0.996193 0.087173 0.000000 +vn -0.996193 0.087173 0.000000 +vn -0.998427 0.056075 0.000000 +vn -0.998427 0.056075 0.000000 +vn -0.960917 0.276836 0.000000 +vn -0.985872 0.167498 0.000000 +vn -0.985872 0.167498 0.000000 +vn -0.960917 0.276836 0.000000 +vn -0.875227 0.483712 0.000000 +vn -0.923877 0.382690 0.000000 +vn -0.923877 0.382690 0.000000 +vn -0.875227 0.483712 0.000000 +vn -0.815556 0.578678 0.000000 +vn -0.815556 0.578678 0.000000 +vn -0.745645 0.666343 0.000000 +vn -0.745645 0.666343 0.000000 +vn -0.578678 0.815556 0.000000 +vn -0.666343 0.745645 0.000000 +vn -0.666343 0.745645 0.000000 +vn -0.483712 0.875227 0.000000 +vn -0.578678 0.815556 0.000000 +vn -0.483712 0.875227 0.000000 +vn -0.382690 0.923877 0.000000 +vn -0.382690 0.923877 0.000000 +vn -0.276836 0.960917 0.000000 +vn -0.276836 0.960917 0.000000 +vn -0.167498 0.985872 0.000000 +vn -0.167498 0.985872 0.000000 +vn -0.056075 0.998427 0.000000 +vn -0.056075 0.998427 0.000000 +vn 0.056075 0.998427 -0.000000 +vn 0.056075 0.998427 0.000000 +vn 0.167498 0.985872 -0.000000 +vn 0.276836 0.960917 0.000000 +vn 0.167498 0.985872 0.000000 +vn 0.276836 0.960917 0.000000 +vn 0.382690 0.923877 -0.000000 +vn 0.483712 0.875227 0.000000 +vn 0.382690 0.923877 0.000000 +vn 0.483712 0.875227 0.000000 +vn 0.578678 0.815556 0.000000 +vn 0.578678 0.815556 -0.000000 +vn 0.666343 0.745645 0.000000 +vn 0.666343 0.745645 -0.000000 +vn 0.745645 0.666343 0.000000 +vn 0.745645 0.666343 -0.000000 +vn 0.815556 0.578678 0.000000 +vn 0.815556 0.578678 -0.000000 +vn 0.875227 0.483712 0.000000 +vn 0.875227 0.483712 -0.000000 +vn 0.960917 0.276836 0.000000 +vn 0.923877 0.382690 0.000000 +vn 0.923877 0.382690 -0.000000 +vn 0.960917 0.276836 0.000000 +vn 0.985872 0.167498 0.000000 +vn 0.985872 0.167498 -0.000000 +vn 0.998427 0.056075 0.000000 +vn 0.998427 0.056075 -0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.997858 -0.065410 0.000000 +vn 0.980788 -0.195075 0.000000 +vn 0.997858 -0.065410 0.000000 +vn 0.946926 -0.321452 0.000000 +vn 0.980788 -0.195075 0.000000 +vn 0.896879 -0.442276 0.000000 +vn 0.946926 -0.321452 0.000000 +vn 0.831466 -0.555576 0.000000 +vn 0.896879 -0.442276 0.000000 +vn 0.751832 -0.659355 0.000000 +vn 0.831466 -0.555576 0.000000 +vn 0.659355 -0.751832 0.000000 +vn 0.751832 -0.659355 0.000000 +vn 0.555576 -0.831466 0.000000 +vn 0.659355 -0.751832 0.000000 +vn 0.442276 -0.896879 0.000000 +vn 0.555576 -0.831466 0.000000 +vn 0.321452 -0.946926 0.000000 +vn 0.442276 -0.896879 0.000000 +vn 0.195075 -0.980788 0.000000 +vn 0.321452 -0.946926 0.000000 +vn 0.065410 -0.997858 0.000000 +vn 0.195075 -0.980788 0.000000 +vn 0.065410 -0.997858 0.000000 +vn 1.000000 0.000000 -0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.065410 0.997858 -0.000000 +vn 0.195075 0.980788 -0.000000 +vn 0.065410 0.997858 -0.000000 +vn 0.321452 0.946926 -0.000000 +vn 0.195075 0.980788 -0.000000 +vn 0.442276 0.896879 -0.000000 +vn 0.321452 0.946926 -0.000000 +vn 0.555576 0.831466 -0.000000 +vn 0.442276 0.896879 -0.000000 +vn 0.659355 0.751832 -0.000000 +vn 0.555576 0.831466 -0.000000 +vn 0.751832 0.659355 -0.000000 +vn 0.659355 0.751832 -0.000000 +vn 0.831466 0.555576 -0.000000 +vn 0.751832 0.659355 -0.000000 +vn 0.831466 0.555576 -0.000000 +vn 0.946926 0.321452 -0.000000 +vn 0.896879 0.442276 -0.000000 +vn 0.896879 0.442276 0.000000 +vn 0.946926 0.321452 -0.000000 +vn 0.997858 0.065410 -0.000000 +vn 0.980788 0.195075 -0.000000 +vn 0.980788 0.195075 0.000000 +vn 0.997858 0.065410 -0.000000 +vn -0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn -0.997858 0.065410 0.000000 +vn -0.980788 0.195075 0.000000 +vn -0.997858 0.065410 0.000000 +vn -0.946926 0.321452 0.000000 +vn -0.980788 0.195075 0.000000 +vn -0.896879 0.442276 0.000000 +vn -0.946926 0.321452 0.000000 +vn -0.831466 0.555576 0.000000 +vn -0.896879 0.442276 0.000000 +vn -0.751832 0.659355 0.000000 +vn -0.831466 0.555576 0.000000 +vn -0.659355 0.751832 0.000000 +vn -0.751832 0.659355 0.000000 +vn -0.659355 0.751832 0.000000 +vn -0.442276 0.896879 0.000000 +vn -0.555576 0.831466 0.000000 +vn -0.555576 0.831466 0.000000 +vn -0.321452 0.946926 0.000000 +vn -0.442276 0.896879 0.000000 +vn -0.321452 0.946926 0.000000 +vn -0.065410 0.997858 0.000000 +vn -0.195075 0.980788 0.000000 +vn -0.195075 0.980788 0.000000 +vn -0.065410 0.997858 0.000000 +vn -1.000000 -0.000000 0.000000 +vn -1.000000 0.000000 -0.000000 +vn -0.065410 -0.997858 0.000000 +vn -0.195075 -0.980788 0.000000 +vn -0.065410 -0.997858 0.000000 +vn -0.321452 -0.946926 0.000000 +vn -0.195075 -0.980788 0.000000 +vn -0.442276 -0.896879 0.000000 +vn -0.321452 -0.946926 0.000000 +vn -0.555576 -0.831466 0.000000 +vn -0.442276 -0.896879 0.000000 +vn -0.659355 -0.751832 0.000000 +vn -0.555576 -0.831466 0.000000 +vn -0.751832 -0.659355 0.000000 +vn -0.659355 -0.751832 0.000000 +vn -0.751832 -0.659355 0.000000 +vn -0.896879 -0.442276 0.000000 +vn -0.831466 -0.555576 0.000000 +vn -0.831466 -0.555576 0.000000 +vn -0.946926 -0.321452 0.000000 +vn -0.896879 -0.442276 0.000000 +vn -0.980788 -0.195075 0.000000 +vn -0.946926 -0.321452 0.000000 +vn -0.997858 -0.065410 0.000000 +vn -0.980788 -0.195075 0.000000 +vn -0.997858 -0.065410 0.000000 +vn -0.000000 -1.000000 -0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.998427 -0.056075 0.000000 +vn 0.998427 -0.056075 0.000000 +vn 0.960917 -0.276836 0.000000 +vn 0.985872 -0.167498 0.000000 +vn 0.985872 -0.167498 0.000000 +vn 0.960917 -0.276836 0.000000 +vn 0.875227 -0.483712 0.000000 +vn 0.923877 -0.382690 0.000000 +vn 0.923877 -0.382690 0.000000 +vn 0.875227 -0.483712 0.000000 +vn 0.815556 -0.578678 0.000000 +vn 0.815556 -0.578678 0.000000 +vn 0.745645 -0.666343 0.000000 +vn 0.745645 -0.666343 0.000000 +vn 0.578678 -0.815556 0.000000 +vn 0.666343 -0.745645 0.000000 +vn 0.666343 -0.745645 0.000000 +vn 0.483712 -0.875227 0.000000 +vn 0.578678 -0.815556 0.000000 +vn 0.483712 -0.875227 0.000000 +vn 0.382690 -0.923877 0.000000 +vn 0.382690 -0.923877 0.000000 +vn 0.276836 -0.960917 0.000000 +vn 0.276836 -0.960917 0.000000 +vn 0.167498 -0.985872 0.000000 +vn 0.167498 -0.985872 0.000000 +vn 0.056075 -0.998427 0.000000 +vn 0.056075 -0.998427 0.000000 +vn -0.056075 -0.998427 0.000000 +vn -0.056075 -0.998427 0.000000 +vn -0.167498 -0.985872 0.000000 +vn -0.276836 -0.960917 -0.000000 +vn -0.167498 -0.985872 0.000000 +vn -0.276836 -0.960917 0.000000 +vn -0.382690 -0.923877 0.000000 +vn -0.483712 -0.875227 -0.000000 +vn -0.382690 -0.923877 0.000000 +vn -0.483712 -0.875227 0.000000 +vn -0.578678 -0.815556 0.000000 +vn -0.578678 -0.815556 0.000000 +vn -0.666343 -0.745645 0.000000 +vn -0.666343 -0.745645 0.000000 +vn -0.745645 -0.666343 0.000000 +vn -0.745645 -0.666343 0.000000 +vn -0.815556 -0.578678 0.000000 +vn -0.815556 -0.578678 0.000000 +vn -0.875227 -0.483712 0.000000 +vn -0.875227 -0.483712 0.000000 +vn -0.960917 -0.276836 -0.000000 +vn -0.923877 -0.382690 0.000000 +vn -0.923877 -0.382690 0.000000 +vn -0.960917 -0.276836 0.000000 +vn -0.985872 -0.167498 0.000000 +vn -0.985872 -0.167498 0.000000 +vn -0.998427 -0.056075 0.000000 +vn -0.998427 -0.056075 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.996193 -0.087173 -0.000000 +vn -0.996193 -0.087173 0.000000 +vn -0.965923 -0.258828 0.000000 +vn -0.965923 -0.258828 -0.000000 +vn -0.906312 -0.422609 0.000000 +vn -0.906312 -0.422609 -0.000000 +vn -0.819144 -0.573588 0.000000 +vn -0.819144 -0.573588 -0.000000 +vn -0.707107 -0.707107 0.000000 +vn -0.707107 -0.707107 -0.000000 +vn -0.573588 -0.819144 0.000000 +vn -0.573588 -0.819144 -0.000000 +vn -0.258828 -0.965923 0.000000 +vn -0.422609 -0.906312 0.000000 +vn -0.422609 -0.906312 -0.000000 +vn -0.087173 -0.996193 0.000000 +vn -0.258828 -0.965923 0.000000 +vn 0.087173 -0.996193 0.000000 +vn -0.087173 -0.996193 0.000000 +vn 0.087173 -0.996193 0.000000 +vn 0.422609 -0.906312 0.000000 +vn 0.258828 -0.965923 0.000000 +vn 0.258828 -0.965923 0.000000 +vn 0.422609 -0.906312 0.000000 +vn 0.573588 -0.819144 0.000000 +vn 0.573588 -0.819144 0.000000 +vn 0.819144 -0.573588 0.000000 +vn 0.707107 -0.707107 0.000000 +vn 0.707107 -0.707107 0.000000 +vn 0.819144 -0.573588 0.000000 +vn 0.906312 -0.422609 0.000000 +vn 0.965923 -0.258828 0.000000 +vn 0.906312 -0.422609 0.000000 +vn 0.965923 -0.258828 0.000000 +vn 0.996193 -0.087173 0.000000 +vn 0.996193 -0.087173 0.000000 +vn -0.996191 -0.087200 0.000000 +vn -0.965925 -0.258823 0.000000 +vn -0.996191 -0.087200 0.000000 +vn -0.965925 -0.258823 0.000000 +vn -0.906303 -0.422628 0.000000 +vn -0.819200 -0.573507 0.000000 +vn -0.906303 -0.422628 -0.000000 +vn -0.707107 -0.707107 0.000000 +vn -0.819200 -0.573507 0.000000 +vn -0.573507 -0.819200 0.000000 +vn -0.707107 -0.707107 0.000000 +vn -0.573507 -0.819200 0.000000 +vn -0.422628 -0.906303 0.000000 +vn -0.258823 -0.965925 0.000000 +vn -0.422628 -0.906303 -0.000000 +vn -0.087200 -0.996191 0.000000 +vn -0.258823 -0.965925 0.000000 +vn 0.087212 -0.996190 0.000000 +vn -0.087200 -0.996191 0.000000 +vn 0.258823 -0.965925 0.000000 +vn 0.087212 -0.996190 0.000000 +vn 0.422631 -0.906302 0.000000 +vn 0.258823 -0.965925 0.000000 +vn 0.573505 -0.819202 0.000000 +vn 0.422631 -0.906302 0.000000 +vn 0.573505 -0.819202 0.000000 +vn 0.707107 -0.707107 0.000000 +vn 0.707107 -0.707107 0.000000 +vn 0.819136 -0.573599 0.000000 +vn 0.819136 -0.573599 0.000000 +vn 0.906355 -0.422516 0.000000 +vn 0.906355 -0.422516 0.000000 +vn 0.965925 -0.258823 0.000000 +vn 0.965925 -0.258823 0.000000 +vn 0.996191 -0.087200 0.000000 +vn 0.996191 -0.087200 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.996191 -0.087200 0.000000 +vn -0.965925 -0.258823 0.000000 +vn -0.996191 -0.087200 0.000000 +vn -0.965925 -0.258823 0.000000 +vn -0.906355 -0.422516 0.000000 +vn -0.819136 -0.573599 0.000000 +vn -0.906355 -0.422516 -0.000000 +vn -0.707107 -0.707107 0.000000 +vn -0.819136 -0.573599 0.000000 +vn -0.573505 -0.819202 0.000000 +vn -0.707107 -0.707107 0.000000 +vn -0.573505 -0.819202 0.000000 +vn -0.422631 -0.906302 0.000000 +vn -0.258823 -0.965925 0.000000 +vn -0.422631 -0.906302 -0.000000 +vn -0.087212 -0.996190 0.000000 +vn -0.258823 -0.965925 0.000000 +vn 0.087200 -0.996191 0.000000 +vn -0.087212 -0.996190 0.000000 +vn 0.258823 -0.965925 0.000000 +vn 0.087200 -0.996191 0.000000 +vn 0.422628 -0.906303 0.000000 +vn 0.258823 -0.965925 0.000000 +vn 0.573507 -0.819200 0.000000 +vn 0.422628 -0.906303 0.000000 +vn 0.573507 -0.819200 0.000000 +vn 0.707107 -0.707107 0.000000 +vn 0.707107 -0.707107 0.000000 +vn 0.819200 -0.573507 0.000000 +vn 0.819200 -0.573507 0.000000 +vn 0.906303 -0.422628 0.000000 +vn 0.906303 -0.422628 0.000000 +vn 0.965925 -0.258823 0.000000 +vn 0.965925 -0.258823 0.000000 +vn 0.996191 -0.087200 0.000000 +vn 0.996191 -0.087200 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.996190 -0.087212 0.000000 +vn -0.965925 -0.258823 0.000000 +vn -0.996190 -0.087212 0.000000 +vn -0.965925 -0.258823 0.000000 +vn -0.906354 -0.422518 0.000000 +vn -0.819138 -0.573597 0.000000 +vn -0.906354 -0.422518 -0.000000 +vn -0.707107 -0.707107 0.000000 +vn -0.819138 -0.573597 0.000000 +vn -0.573597 -0.819138 0.000000 +vn -0.707107 -0.707107 0.000000 +vn -0.573597 -0.819138 0.000000 +vn -0.422518 -0.906354 0.000000 +vn -0.258823 -0.965925 0.000000 +vn -0.422518 -0.906354 -0.000000 +vn -0.087212 -0.996190 0.000000 +vn -0.258823 -0.965925 0.000000 +vn 0.087200 -0.996191 0.000000 +vn -0.087212 -0.996190 0.000000 +vn 0.258823 -0.965925 0.000000 +vn 0.087200 -0.996191 0.000000 +vn 0.422516 -0.906355 0.000000 +vn 0.258823 -0.965925 0.000000 +vn 0.573599 -0.819136 0.000000 +vn 0.422516 -0.906355 0.000000 +vn 0.573599 -0.819136 0.000000 +vn 0.707107 -0.707107 0.000000 +vn 0.707107 -0.707107 0.000000 +vn 0.819202 -0.573505 0.000000 +vn 0.819202 -0.573505 0.000000 +vn 0.906302 -0.422631 0.000000 +vn 0.906302 -0.422631 0.000000 +vn 0.965925 -0.258823 0.000000 +vn 0.965925 -0.258823 0.000000 +vn 0.996190 -0.087212 0.000000 +vn 0.996190 -0.087212 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn -0.996190 -0.087212 0.000000 +vn -0.965925 -0.258823 0.000000 +vn -0.996190 -0.087212 0.000000 +vn -0.965925 -0.258823 0.000000 +vn -0.906302 -0.422631 0.000000 +vn -0.819202 -0.573505 0.000000 +vn -0.906302 -0.422631 -0.000000 +vn -0.707107 -0.707107 0.000000 +vn -0.819202 -0.573505 0.000000 +vn -0.573599 -0.819136 0.000000 +vn -0.707107 -0.707107 0.000000 +vn -0.573599 -0.819136 0.000000 +vn -0.422516 -0.906355 0.000000 +vn -0.258823 -0.965925 0.000000 +vn -0.422516 -0.906355 -0.000000 +vn -0.087200 -0.996191 0.000000 +vn -0.258823 -0.965925 0.000000 +vn 0.087212 -0.996190 0.000000 +vn -0.087200 -0.996191 0.000000 +vn 0.258823 -0.965925 0.000000 +vn 0.087212 -0.996190 0.000000 +vn 0.422518 -0.906354 0.000000 +vn 0.258823 -0.965925 0.000000 +vn 0.573597 -0.819138 0.000000 +vn 0.422518 -0.906354 0.000000 +vn 0.573597 -0.819138 0.000000 +vn 0.707107 -0.707107 0.000000 +vn 0.707107 -0.707107 0.000000 +vn 0.819138 -0.573597 0.000000 +vn 0.819138 -0.573597 0.000000 +vn 0.906354 -0.422518 0.000000 +vn 0.906354 -0.422518 0.000000 +vn 0.965925 -0.258823 0.000000 +vn 0.965925 -0.258823 0.000000 +vn 0.996190 -0.087212 0.000000 +vn 0.996190 -0.087212 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +f 1//1 2//1 3//1 +f 2//2 4//2 3//2 +f 3//3 5//3 6//3 +f 4//4 5//4 3//4 +f 6//5 7//5 8//5 +f 8//6 7//6 9//6 +f 5//7 7//7 6//7 +f 7//8 10//8 9//8 +f 9//9 11//9 12//9 +f 10//10 11//10 9//10 +f 12//11 13//11 14//11 +f 14//12 13//12 15//12 +f 11//13 13//13 12//13 +f 15//14 16//14 17//14 +f 13//15 16//15 15//15 +f 16//16 18//16 17//16 +f 17//17 19//17 20//17 +f 18//18 19//18 17//18 +f 20//19 21//19 22//19 +f 22//20 21//20 23//20 +f 19//21 21//21 20//21 +f 23//22 24//22 25//22 +f 21//23 24//23 23//23 +f 24//24 26//24 25//24 +f 25//25 27//25 28//25 +f 26//26 27//26 25//26 +f 28//27 29//27 30//27 +f 30//28 29//28 31//28 +f 27//29 29//29 28//29 +f 29//30 32//30 31//30 +f 31//31 32//31 33//31 +f 32//32 34//32 33//32 +f 34//33 35//33 33//33 +f 33//34 35//34 36//34 +f 35//35 37//35 36//35 +f 36//36 37//36 38//36 +f 39//37 40//37 41//37 +f 40//38 42//38 41//38 +f 41//39 43//39 44//39 +f 42//40 43//40 41//40 +f 44//41 45//41 46//41 +f 46//42 45//42 47//42 +f 43//43 45//43 44//43 +f 45//44 48//44 47//44 +f 47//45 49//45 50//45 +f 48//46 49//46 47//46 +f 50//47 51//47 52//47 +f 52//48 51//48 53//48 +f 49//49 51//49 50//49 +f 53//50 54//50 55//50 +f 51//51 54//51 53//51 +f 54//52 56//52 55//52 +f 55//53 57//53 58//53 +f 56//54 57//54 55//54 +f 58//55 59//55 60//55 +f 60//56 59//56 61//56 +f 57//57 59//57 58//57 +f 61//58 62//58 63//58 +f 59//59 62//59 61//59 +f 62//60 64//60 63//60 +f 63//61 65//61 66//61 +f 64//62 65//62 63//62 +f 66//63 67//63 68//63 +f 68//64 67//64 69//64 +f 65//65 67//65 66//65 +f 67//66 70//66 69//66 +f 69//67 70//67 71//67 +f 70//68 72//68 71//68 +f 72//69 73//69 71//69 +f 71//70 73//70 74//70 +f 73//71 75//71 74//71 +f 74//72 75//72 76//72 +f 77//73 78//73 79//73 +f 78//74 80//74 79//74 +f 79//75 81//75 82//75 +f 80//76 81//76 79//76 +f 82//77 83//77 84//77 +f 84//78 83//78 85//78 +f 81//79 83//79 82//79 +f 83//80 86//80 85//80 +f 85//81 87//81 88//81 +f 86//82 87//82 85//82 +f 88//83 89//83 90//83 +f 90//84 89//84 91//84 +f 87//85 89//85 88//85 +f 91//86 92//86 93//86 +f 89//87 92//87 91//87 +f 92//88 94//88 93//88 +f 93//89 95//89 96//89 +f 94//90 95//90 93//90 +f 96//91 97//91 98//91 +f 98//92 97//92 99//92 +f 95//93 97//93 96//93 +f 99//94 100//94 101//94 +f 97//95 100//95 99//95 +f 100//96 102//96 101//96 +f 101//97 103//97 104//97 +f 102//98 103//98 101//98 +f 104//99 105//99 106//99 +f 106//100 105//100 107//100 +f 103//101 105//101 104//101 +f 105//102 108//102 107//102 +f 107//103 108//103 109//103 +f 108//104 110//104 109//104 +f 110//105 111//105 109//105 +f 109//106 111//106 112//106 +f 111//107 113//107 112//107 +f 112//108 113//108 114//108 +f 115//109 116//109 117//109 +f 116//110 118//110 117//110 +f 117//111 119//111 120//111 +f 118//112 119//112 117//112 +f 120//113 121//113 122//113 +f 122//114 121//114 123//114 +f 119//115 121//115 120//115 +f 121//116 124//116 123//116 +f 123//117 125//117 126//117 +f 124//118 125//118 123//118 +f 126//119 127//119 128//119 +f 128//120 127//120 129//120 +f 125//121 127//121 126//121 +f 129//122 130//122 131//122 +f 127//123 130//123 129//123 +f 130//124 132//124 131//124 +f 131//125 133//125 134//125 +f 132//126 133//126 131//126 +f 134//127 135//127 136//127 +f 136//128 135//128 137//128 +f 133//129 135//129 134//129 +f 137//130 138//130 139//130 +f 135//131 138//131 137//131 +f 138//132 140//132 139//132 +f 139//133 141//133 142//133 +f 140//134 141//134 139//134 +f 142//135 143//135 144//135 +f 144//136 143//136 145//136 +f 141//137 143//137 142//137 +f 143//138 146//138 145//138 +f 145//139 146//139 147//139 +f 146//140 148//140 147//140 +f 148//141 149//141 147//141 +f 147//142 149//142 150//142 +f 149//143 151//143 150//143 +f 150//144 151//144 152//144 +f 153//145 154//145 155//145 +f 155//146 154//146 156//146 +f 156//147 157//147 158//147 +f 154//148 157//148 156//148 +f 158//149 159//149 160//149 +f 157//150 159//150 158//150 +f 160//151 161//151 162//151 +f 159//152 161//152 160//152 +f 163//153 164//153 165//153 +f 162//154 164//154 163//154 +f 161//155 164//155 162//155 +f 164//156 166//156 165//156 +f 165//157 167//157 168//157 +f 166//158 167//158 165//158 +f 169//159 170//159 171//159 +f 168//160 170//160 169//160 +f 167//161 170//161 168//161 +f 170//162 172//162 171//162 +f 171//163 173//163 174//163 +f 172//164 173//164 171//164 +f 175//165 176//165 177//165 +f 174//166 176//166 175//166 +f 173//167 176//167 174//167 +f 176//168 178//168 177//168 +f 177//169 179//169 180//169 +f 178//170 179//170 177//170 +f 180//171 181//171 182//171 +f 179//172 181//172 180//172 +f 181//173 183//173 182//173 +f 182//174 183//174 184//174 +f 183//175 185//175 184//175 +f 184//176 185//176 186//176 +f 185//177 187//177 186//177 +f 186//178 187//178 188//178 +f 187//179 189//179 188//179 +f 188//180 189//180 190//180 +f 191//181 192//181 193//181 +f 193//182 192//182 194//182 +f 195//183 196//183 197//183 +f 194//184 196//184 195//184 +f 192//185 196//185 194//185 +f 196//186 198//186 197//186 +f 199//187 200//187 201//187 +f 197//188 200//188 199//188 +f 198//189 200//189 197//189 +f 200//190 202//190 201//190 +f 201//191 203//191 204//191 +f 202//192 203//192 201//192 +f 204//193 205//193 206//193 +f 203//194 205//194 204//194 +f 207//195 208//195 209//195 +f 206//196 208//196 207//196 +f 205//197 208//197 206//197 +f 209//198 210//198 211//198 +f 208//199 210//199 209//199 +f 210//200 212//200 211//200 +f 212//201 213//201 211//201 +f 211//202 213//202 214//202 +f 213//203 215//203 214//203 +f 214//204 215//204 216//204 +f 215//205 217//205 216//205 +f 216//206 217//206 218//206 +f 217//207 219//207 218//207 +f 218//208 219//208 220//208 +f 219//209 221//209 220//209 +f 220//210 221//210 222//210 +f 221//211 223//211 222//211 +f 224//212 223//212 225//212 +f 222//213 223//213 224//213 +f 223//214 226//214 225//214 +f 226//215 227//215 225//215 +f 228//216 227//216 229//216 +f 225//217 227//217 228//217 +f 227//218 230//218 229//218 +f 229//219 231//219 232//219 +f 230//220 231//220 229//220 +f 232//221 233//221 234//221 +f 231//222 233//222 232//222 +f 234//223 235//223 236//223 +f 233//224 235//224 234//224 +f 236//225 237//225 238//225 +f 235//226 237//226 236//226 +f 238//227 239//227 240//227 +f 237//228 239//228 238//228 +f 241//229 242//229 243//229 +f 240//230 242//230 241//230 +f 239//231 242//231 240//231 +f 242//232 244//232 243//232 +f 243//233 245//233 246//233 +f 244//234 245//234 243//234 +f 246//235 247//235 248//235 +f 245//236 247//236 246//236 +f 125//237 124//237 249//237 +f 127//238 125//238 249//238 +f 121//239 249//239 124//239 +f 119//240 250//240 249//240 +f 119//241 249//241 121//241 +f 130//242 249//242 251//242 +f 130//243 127//243 249//243 +f 132//244 130//244 251//244 +f 118//245 250//245 119//245 +f 133//246 132//246 251//246 +f 116//247 250//247 118//247 +f 135//248 251//248 252//248 +f 135//249 133//249 251//249 +f 253//250 254//250 250//250 +f 253//251 250//251 116//251 +f 138//252 135//252 252//252 +f 255//253 254//253 253//253 +f 140//254 138//254 252//254 +f 256//255 254//255 255//255 +f 141//256 252//256 257//256 +f 141//257 140//257 252//257 +f 258//258 259//258 254//258 +f 258//259 254//259 256//259 +f 143//260 141//260 257//260 +f 260//261 259//261 258//261 +f 234//262 261//262 262//262 +f 234//263 263//263 261//263 +f 234//264 264//264 263//264 +f 234//265 265//265 264//265 +f 234//266 266//266 265//266 +f 232//267 234//267 262//267 +f 232//268 267//268 151//268 +f 232//269 262//269 267//269 +f 232//270 146//270 143//270 +f 232//271 148//271 146//271 +f 232//272 149//272 148//272 +f 232//273 151//273 149//273 +f 236//274 266//274 234//274 +f 236//275 268//275 266//275 +f 236//276 269//276 268//276 +f 236//277 270//277 269//277 +f 236//278 271//278 270//278 +f 236//279 272//279 271//279 +f 236//280 260//280 272//280 +f 229//281 143//281 257//281 +f 229//282 232//282 143//282 +f 229//283 257//283 273//283 +f 238//284 259//284 260//284 +f 238//285 274//285 259//285 +f 238//286 260//286 236//286 +f 228//287 273//287 275//287 +f 228//288 275//288 276//288 +f 228//289 229//289 273//289 +f 240//290 277//290 278//290 +f 240//291 278//291 274//291 +f 240//292 274//292 238//292 +f 225//293 228//293 276//293 +f 241//294 277//294 240//294 +f 224//295 225//295 276//295 +f 243//296 277//296 241//296 +f 222//297 224//297 276//297 +f 246//298 277//298 243//298 +f 220//299 222//299 276//299 +f 248//300 277//300 246//300 +f 279//301 277//301 248//301 +f 279//302 280//302 281//302 +f 279//303 248//303 280//303 +f 282//304 218//304 220//304 +f 282//305 216//305 218//305 +f 282//306 220//306 276//306 +f 214//307 216//307 282//307 +f 283//308 279//308 281//308 +f 211//309 282//309 284//309 +f 211//310 284//310 285//310 +f 211//311 214//311 282//311 +f 286//312 287//312 288//312 +f 286//313 288//313 279//313 +f 286//314 279//314 283//314 +f 209//315 285//315 289//315 +f 209//316 211//316 285//316 +f 290//317 287//317 286//317 +f 290//318 291//318 287//318 +f 11//319 290//319 292//319 +f 11//320 291//320 290//320 +f 10//321 291//321 11//321 +f 10//322 293//322 291//322 +f 87//323 289//323 294//323 +f 86//324 207//324 209//324 +f 86//325 289//325 87//325 +f 86//326 209//326 289//326 +f 7//327 293//327 10//327 +f 13//328 11//328 292//328 +f 89//329 87//329 294//329 +f 83//330 207//330 86//330 +f 5//331 293//331 7//331 +f 16//332 13//332 292//332 +f 92//333 89//333 294//333 +f 81//334 207//334 83//334 +f 18//335 16//335 292//335 +f 4//336 293//336 5//336 +f 4//337 295//337 293//337 +f 94//338 294//338 296//338 +f 94//339 92//339 294//339 +f 80//340 207//340 81//340 +f 19//341 18//341 292//341 +f 2//342 295//342 4//342 +f 95//343 94//343 296//343 +f 78//344 207//344 80//344 +f 21//345 19//345 292//345 +f 297//346 295//346 2//346 +f 97//347 95//347 296//347 +f 298//348 207//348 78//348 +f 299//349 295//349 297//349 +f 24//350 21//350 292//350 +f 100//351 97//351 296//351 +f 300//352 207//352 298//352 +f 301//353 102//353 100//353 +f 301//354 103//354 102//354 +f 301//355 100//355 296//355 +f 302//356 24//356 292//356 +f 302//357 26//357 24//357 +f 302//358 27//358 26//358 +f 206//359 303//359 304//359 +f 206//360 300//360 303//360 +f 206//361 207//361 300//361 +f 305//362 295//362 299//362 +f 305//363 306//363 307//363 +f 305//364 299//364 306//364 +f 308//365 305//365 307//365 +f 29//366 27//366 302//366 +f 309//367 206//367 304//367 +f 105//368 103//368 301//368 +f 32//369 29//369 302//369 +f 310//370 305//370 308//370 +f 108//371 105//371 301//371 +f 311//372 206//372 309//372 +f 34//373 32//373 302//373 +f 312//374 305//374 310//374 +f 110//375 108//375 301//375 +f 313//376 206//376 311//376 +f 314//377 315//377 113//377 +f 314//378 111//378 110//378 +f 314//379 113//379 111//379 +f 314//380 110//380 301//380 +f 316//381 305//381 312//381 +f 316//382 317//382 318//382 +f 316//383 319//383 317//383 +f 316//384 312//384 319//384 +f 204//385 320//385 321//385 +f 204//386 322//386 320//386 +f 204//387 323//387 322//387 +f 204//388 324//388 323//388 +f 204//389 325//389 324//389 +f 204//390 313//390 325//390 +f 204//391 206//391 313//391 +f 326//392 34//392 302//392 +f 326//393 327//393 37//393 +f 326//394 328//394 327//394 +f 326//395 329//395 328//395 +f 326//396 330//396 329//396 +f 326//397 35//397 34//397 +f 326//398 37//398 35//398 +f 331//399 332//399 315//399 +f 331//400 333//400 332//400 +f 331//401 334//401 333//401 +f 331//402 315//402 314//402 +f 335//403 316//403 318//403 +f 335//404 336//404 337//404 +f 335//405 338//405 336//405 +f 335//406 318//406 338//406 +f 201//407 204//407 321//407 +f 339//408 330//408 326//408 +f 340//409 321//409 334//409 +f 340//410 334//410 331//410 +f 340//411 201//411 321//411 +f 341//412 337//412 330//412 +f 341//413 335//413 337//413 +f 341//414 330//414 339//414 +f 342//415 199//415 201//415 +f 342//416 201//416 340//416 +f 343//417 339//417 344//417 +f 343//418 341//418 339//418 +f 345//419 199//419 342//419 +f 346//420 343//420 344//420 +f 347//421 199//421 345//421 +f 347//422 197//422 199//422 +f 348//423 346//423 344//423 +f 348//424 344//424 349//424 +f 195//425 197//425 347//425 +f 350//426 348//426 349//426 +f 194//427 195//427 347//427 +f 351//428 348//428 350//428 +f 352//429 348//429 351//429 +f 193//430 194//430 347//430 +f 49//431 48//431 353//431 +f 45//432 353//432 48//432 +f 51//433 49//433 353//433 +f 43//434 354//434 353//434 +f 43//435 353//435 45//435 +f 54//436 353//436 355//436 +f 54//437 51//437 353//437 +f 356//438 348//438 352//438 +f 356//439 357//439 358//439 +f 356//440 359//440 357//440 +f 356//441 360//441 359//441 +f 356//442 352//442 360//442 +f 361//443 362//443 193//443 +f 361//444 363//444 362//444 +f 361//445 193//445 347//445 +f 361//446 364//446 363//446 +f 361//447 365//447 364//447 +f 42//448 354//448 43//448 +f 56//449 54//449 355//449 +f 40//450 354//450 42//450 +f 57//451 56//451 355//451 +f 59//452 57//452 355//452 +f 366//453 354//453 40//453 +f 367//454 354//454 366//454 +f 62//455 59//455 355//455 +f 368//456 354//456 367//456 +f 64//457 62//457 355//457 +f 65//458 355//458 369//458 +f 65//459 64//459 355//459 +f 370//460 371//460 354//460 +f 370//461 354//461 368//461 +f 372//462 356//462 358//462 +f 373//463 365//463 361//463 +f 374//464 358//464 371//464 +f 374//465 372//465 358//465 +f 375//466 369//466 365//466 +f 375//467 365//467 373//467 +f 376//468 370//468 377//468 +f 376//469 374//469 371//469 +f 376//470 371//470 370//470 +f 378//471 67//471 65//471 +f 378//472 369//472 375//472 +f 378//473 65//473 369//473 +f 379//474 377//474 380//474 +f 379//475 376//475 377//475 +f 379//476 381//476 382//476 +f 379//477 380//477 381//477 +f 383//478 67//478 378//478 +f 383//479 70//479 67//479 +f 383//480 72//480 70//480 +f 383//481 73//481 72//481 +f 384//482 379//482 382//482 +f 384//483 385//483 386//483 +f 384//484 387//484 385//484 +f 384//485 382//485 387//485 +f 388//486 75//486 73//486 +f 388//487 389//487 75//487 +f 388//488 390//488 389//488 +f 388//489 73//489 383//489 +f 391//490 384//490 386//490 +f 391//491 392//491 390//491 +f 391//492 393//492 392//492 +f 391//493 394//493 393//493 +f 391//494 395//494 394//494 +f 391//495 386//495 395//495 +f 391//496 390//496 388//496 +f 396//497 397//497 347//497 +f 396//498 345//498 342//498 +f 396//499 347//499 345//499 +f 398//500 342//500 340//500 +f 398//501 396//501 342//501 +f 399//502 340//502 331//502 +f 399//503 398//503 340//503 +f 400//504 331//504 314//504 +f 400//505 399//505 331//505 +f 401//506 314//506 301//506 +f 401//507 400//507 314//507 +f 402//508 301//508 296//508 +f 402//509 401//509 301//509 +f 403//510 296//510 294//510 +f 403//511 402//511 296//511 +f 404//512 294//512 289//512 +f 404//513 403//513 294//513 +f 405//514 289//514 285//514 +f 405//515 404//515 289//515 +f 406//516 285//516 284//516 +f 406//517 405//517 285//517 +f 407//518 284//518 282//518 +f 407//519 406//519 284//519 +f 408//520 407//520 282//520 +f 409//521 361//521 397//521 +f 397//522 361//522 347//522 +f 410//523 356//523 372//523 +f 411//524 372//524 374//524 +f 411//525 410//525 372//525 +f 412//526 374//526 376//526 +f 412//527 411//527 374//527 +f 413//528 376//528 379//528 +f 413//529 412//529 376//529 +f 414//530 379//530 384//530 +f 414//531 413//531 379//531 +f 415//532 384//532 391//532 +f 415//533 414//533 384//533 +f 416//534 391//534 388//534 +f 416//535 415//535 391//535 +f 417//536 388//536 383//536 +f 417//537 416//537 388//537 +f 418//538 417//538 383//538 +f 419//539 378//539 375//539 +f 419//540 383//540 378//540 +f 419//541 418//541 383//541 +f 420//542 419//542 375//542 +f 421//543 373//543 361//543 +f 421//544 375//544 373//544 +f 421//545 420//545 375//545 +f 409//546 421//546 361//546 +f 348//547 356//547 422//547 +f 422//548 356//548 410//548 +f 423//549 279//549 288//549 +f 424//550 288//550 287//550 +f 424//551 423//551 288//551 +f 425//552 287//552 291//552 +f 425//553 424//553 287//553 +f 426//554 291//554 293//554 +f 426//555 425//555 291//555 +f 427//556 293//556 295//556 +f 427//557 426//557 293//557 +f 428//558 295//558 305//558 +f 428//559 427//559 295//559 +f 429//560 305//560 316//560 +f 429//561 428//561 305//561 +f 430//562 429//562 316//562 +f 431//563 335//563 341//563 +f 431//564 316//564 335//564 +f 431//565 430//565 316//565 +f 432//566 341//566 343//566 +f 432//567 431//567 341//567 +f 433//568 432//568 343//568 +f 434//569 346//569 348//569 +f 434//570 343//570 346//570 +f 434//571 433//571 343//571 +f 422//572 434//572 348//572 +f 279//573 435//573 277//573 +f 279//574 423//574 435//574 +f 436//575 276//575 275//575 +f 437//576 275//576 273//576 +f 437//577 436//577 275//577 +f 438//578 273//578 257//578 +f 438//579 437//579 273//579 +f 439//580 257//580 252//580 +f 439//581 438//581 257//581 +f 440//582 252//582 251//582 +f 440//583 439//583 252//583 +f 441//584 251//584 249//584 +f 441//585 440//585 251//585 +f 442//586 249//586 250//586 +f 442//587 441//587 249//587 +f 443//588 442//588 250//588 +f 444//589 254//589 259//589 +f 444//590 250//590 254//590 +f 444//591 443//591 250//591 +f 445//592 259//592 274//592 +f 445//593 444//593 259//593 +f 446//594 274//594 278//594 +f 446//595 445//595 274//595 +f 447//596 278//596 277//596 +f 447//597 446//597 278//597 +f 435//598 447//598 277//598 +f 282//599 276//599 408//599 +f 408//600 276//600 436//600 +f 247//601 448//601 248//601 +f 248//602 448//602 280//602 +f 281//603 449//603 283//603 +f 280//604 449//604 281//604 +f 448//605 449//605 280//605 +f 449//606 450//606 283//606 +f 286//607 451//607 290//607 +f 283//608 451//608 286//608 +f 450//609 451//609 283//609 +f 451//610 452//610 290//610 +f 290//611 453//611 292//611 +f 452//612 453//612 290//612 +f 292//613 454//613 302//613 +f 453//614 454//614 292//614 +f 326//615 455//615 339//615 +f 302//616 455//616 326//616 +f 454//617 455//617 302//617 +f 339//618 456//618 344//618 +f 455//619 456//619 339//619 +f 456//620 457//620 344//620 +f 457//621 458//621 344//621 +f 344//622 458//622 349//622 +f 458//623 459//623 349//623 +f 349//624 459//624 350//624 +f 459//625 460//625 350//625 +f 350//626 460//626 351//626 +f 460//627 461//627 351//627 +f 351//628 461//628 352//628 +f 461//629 462//629 352//629 +f 352//630 462//630 360//630 +f 462//631 463//631 360//631 +f 359//632 463//632 357//632 +f 360//633 463//633 359//633 +f 463//634 464//634 357//634 +f 464//635 465//635 357//635 +f 358//636 465//636 371//636 +f 357//637 465//637 358//637 +f 465//638 466//638 371//638 +f 371//639 467//639 354//639 +f 466//640 467//640 371//640 +f 354//641 468//641 353//641 +f 467//642 468//642 354//642 +f 353//643 469//643 355//643 +f 468//644 469//644 353//644 +f 355//645 470//645 369//645 +f 469//646 470//646 355//646 +f 369//647 471//647 365//647 +f 470//648 471//648 369//648 +f 364//649 472//649 363//649 +f 365//650 472//650 364//650 +f 471//651 472//651 365//651 +f 472//652 473//652 363//652 +f 363//653 474//653 362//653 +f 473//654 474//654 363//654 +f 362//655 191//655 193//655 +f 474//656 191//656 362//656 +f 203//657 181//657 205//657 +f 202//658 181//658 203//658 +f 181//659 179//659 205//659 +f 208//660 179//660 210//660 +f 205//661 179//661 208//661 +f 200//662 183//662 202//662 +f 202//663 183//663 181//663 +f 179//664 178//664 210//664 +f 210//665 178//665 212//665 +f 213//666 176//666 215//666 +f 212//667 176//667 213//667 +f 178//668 176//668 212//668 +f 200//669 185//669 183//669 +f 198//670 185//670 200//670 +f 196//671 185//671 198//671 +f 176//672 173//672 215//672 +f 215//673 173//673 217//673 +f 196//674 187//674 185//674 +f 192//675 187//675 196//675 +f 219//676 172//676 221//676 +f 217//677 172//677 219//677 +f 173//678 172//678 217//678 +f 474//679 189//679 191//679 +f 192//680 189//680 187//680 +f 191//681 189//681 192//681 +f 221//682 170//682 223//682 +f 172//683 170//683 221//683 +f 473//684 475//684 474//684 +f 474//685 475//685 189//685 +f 226//686 167//686 227//686 +f 223//687 167//687 226//687 +f 170//688 167//688 223//688 +f 472//689 476//689 473//689 +f 471//690 476//690 472//690 +f 473//691 476//691 475//691 +f 167//692 166//692 227//692 +f 227//693 166//693 230//693 +f 470//694 477//694 471//694 +f 471//695 477//695 476//695 +f 230//696 164//696 231//696 +f 166//697 164//697 230//697 +f 469//698 478//698 470//698 +f 470//699 478//699 477//699 +f 164//700 233//700 231//700 +f 469//701 468//701 478//701 +f 164//702 161//702 233//702 +f 468//703 479//703 478//703 +f 161//704 235//704 233//704 +f 468//705 467//705 479//705 +f 161//706 237//706 235//706 +f 159//707 237//707 161//707 +f 467//708 466//708 479//708 +f 479//709 466//709 480//709 +f 157//710 239//710 159//710 +f 159//711 239//711 237//711 +f 466//712 465//712 480//712 +f 480//713 465//713 481//713 +f 157//714 242//714 239//714 +f 465//715 464//715 481//715 +f 464//716 463//716 481//716 +f 481//717 463//717 482//717 +f 157//718 244//718 242//718 +f 154//719 244//719 157//719 +f 463//720 462//720 482//720 +f 482//721 462//721 483//721 +f 154//722 245//722 244//722 +f 153//723 245//723 154//723 +f 153//724 247//724 245//724 +f 462//725 461//725 483//725 +f 461//726 460//726 483//726 +f 483//727 460//727 484//727 +f 153//728 448//728 247//728 +f 485//729 448//729 153//729 +f 460//730 459//730 484//730 +f 484//731 459//731 486//731 +f 485//732 449//732 448//732 +f 487//733 449//733 485//733 +f 459//734 458//734 486//734 +f 487//735 450//735 449//735 +f 487//736 451//736 450//736 +f 488//737 451//737 487//737 +f 458//738 457//738 486//738 +f 486//739 457//739 489//739 +f 489//740 456//740 490//740 +f 457//741 456//741 489//741 +f 488//742 452//742 451//742 +f 491//743 452//743 488//743 +f 491//744 453//744 452//744 +f 456//745 455//745 490//745 +f 490//746 454//746 491//746 +f 491//747 454//747 453//747 +f 455//748 454//748 490//748 +f 182//749 397//749 396//749 +f 182//750 396//750 398//750 +f 182//751 398//751 399//751 +f 182//752 399//752 400//752 +f 182//753 400//753 401//753 +f 182//754 401//754 402//754 +f 180//755 402//755 403//755 +f 180//756 403//756 404//756 +f 180//757 404//757 405//757 +f 180//758 405//758 406//758 +f 180//759 406//759 407//759 +f 180//760 407//760 408//760 +f 180//761 182//761 402//761 +f 184//762 397//762 182//762 +f 177//763 180//763 408//763 +f 175//764 177//764 408//764 +f 186//765 397//765 184//765 +f 174//766 175//766 408//766 +f 188//767 397//767 186//767 +f 171//768 408//768 436//768 +f 171//769 174//769 408//769 +f 190//770 397//770 188//770 +f 190//771 409//771 397//771 +f 169//772 171//772 436//772 +f 492//773 409//773 190//773 +f 168//774 169//774 436//774 +f 493//775 409//775 492//775 +f 165//776 168//776 436//776 +f 494//777 409//777 493//777 +f 163//778 436//778 437//778 +f 163//779 437//779 438//779 +f 163//780 438//780 439//780 +f 163//781 439//781 440//781 +f 163//782 440//782 441//782 +f 163//783 165//783 436//783 +f 495//784 417//784 418//784 +f 495//785 418//785 419//785 +f 495//786 419//786 420//786 +f 495//787 420//787 421//787 +f 495//788 421//788 409//788 +f 495//789 409//789 494//789 +f 442//790 163//790 441//790 +f 416//791 417//791 495//791 +f 162//792 163//792 442//792 +f 496//793 416//793 495//793 +f 443//794 162//794 442//794 +f 415//795 416//795 496//795 +f 444//796 162//796 443//796 +f 414//797 415//797 496//797 +f 445//798 162//798 444//798 +f 413//799 414//799 496//799 +f 446//800 162//800 445//800 +f 412//801 413//801 496//801 +f 447//802 162//802 446//802 +f 411//803 412//803 496//803 +f 435//804 162//804 447//804 +f 435//805 160//805 162//805 +f 435//806 158//806 160//806 +f 435//807 156//807 158//807 +f 435//808 155//808 156//808 +f 410//809 411//809 496//809 +f 410//810 497//810 498//810 +f 410//811 499//811 497//811 +f 410//812 500//812 499//812 +f 410//813 496//813 500//813 +f 422//814 410//814 498//814 +f 422//815 501//815 502//815 +f 422//816 503//816 501//816 +f 422//817 504//817 503//817 +f 422//818 498//818 504//818 +f 423//819 505//819 155//819 +f 423//820 506//820 505//820 +f 423//821 507//821 506//821 +f 423//822 508//822 507//822 +f 423//823 155//823 435//823 +f 434//824 422//824 502//824 +f 424//825 508//825 423//825 +f 433//826 434//826 502//826 +f 425//827 508//827 424//827 +f 432//828 433//828 502//828 +f 426//829 508//829 425//829 +f 431//830 432//830 502//830 +f 427//831 508//831 426//831 +f 430//832 431//832 502//832 +f 428//833 508//833 427//833 +f 429//834 508//834 428//834 +f 429//835 430//835 502//835 +f 429//836 502//836 508//836 +f 189//837 475//837 190//837 +f 190//838 475//838 492//838 +f 492//839 476//839 493//839 +f 475//840 476//840 492//840 +f 493//841 477//841 494//841 +f 476//842 477//842 493//842 +f 494//843 478//843 495//843 +f 477//844 478//844 494//844 +f 495//845 479//845 496//845 +f 478//846 479//846 495//846 +f 496//847 480//847 500//847 +f 479//848 480//848 496//848 +f 499//849 481//849 497//849 +f 500//850 481//850 499//850 +f 480//851 481//851 500//851 +f 497//852 482//852 498//852 +f 481//853 482//853 497//853 +f 498//854 483//854 504//854 +f 482//855 483//855 498//855 +f 483//856 484//856 504//856 +f 503//857 486//857 501//857 +f 504//858 486//858 503//858 +f 484//859 486//859 504//859 +f 486//860 489//860 501//860 +f 501//861 490//861 502//861 +f 489//862 490//862 501//862 +f 508//863 491//863 507//863 +f 502//864 491//864 508//864 +f 490//865 491//865 502//865 +f 491//866 488//866 507//866 +f 488//867 487//867 507//867 +f 506//868 487//868 505//868 +f 507//869 487//869 506//869 +f 487//870 485//870 505//870 +f 485//871 153//871 505//871 +f 505//872 153//872 155//872 +f 152//873 151//873 509//873 +f 509//874 267//874 510//874 +f 151//875 267//875 509//875 +f 267//876 262//876 510//876 +f 510//877 261//877 511//877 +f 511//878 261//878 512//878 +f 262//879 261//879 510//879 +f 512//880 263//880 513//880 +f 261//881 263//881 512//881 +f 513//882 264//882 514//882 +f 263//883 264//883 513//883 +f 264//884 265//884 514//884 +f 514//885 266//885 515//885 +f 515//886 266//886 516//886 +f 265//887 266//887 514//887 +f 516//888 268//888 517//888 +f 266//889 268//889 516//889 +f 517//890 269//890 518//890 +f 268//891 269//891 517//891 +f 518//892 270//892 519//892 +f 269//893 270//893 518//893 +f 519//894 271//894 520//894 +f 270//895 271//895 519//895 +f 520//896 272//896 521//896 +f 271//897 272//897 520//897 +f 272//898 260//898 521//898 +f 521//899 258//899 522//899 +f 260//900 258//900 521//900 +f 258//901 256//901 522//901 +f 522//902 256//902 523//902 +f 256//903 255//903 523//903 +f 523//904 255//904 524//904 +f 255//905 253//905 524//905 +f 524//906 253//906 525//906 +f 253//907 116//907 525//907 +f 525//908 116//908 115//908 +f 128//909 123//909 126//909 +f 137//910 134//910 136//910 +f 522//911 523//911 524//911 +f 144//912 139//912 142//912 +f 145//913 139//913 144//913 +f 147//914 137//914 139//914 +f 147//915 134//915 137//915 +f 147//916 139//916 145//916 +f 519//917 520//917 521//917 +f 519//918 521//918 522//918 +f 519//919 524//919 525//919 +f 519//920 522//920 524//920 +f 517//921 518//921 519//921 +f 152//922 147//922 150//922 +f 510//923 152//923 509//923 +f 514//924 515//924 516//924 +f 514//925 516//925 517//925 +f 513//926 510//926 511//926 +f 513//927 511//927 512//927 +f 513//928 525//928 115//928 +f 513//929 115//929 117//929 +f 513//930 117//930 120//930 +f 513//931 120//931 122//931 +f 513//932 122//932 123//932 +f 513//933 128//933 129//933 +f 513//934 129//934 131//934 +f 513//935 131//935 134//935 +f 513//936 123//936 128//936 +f 513//937 134//937 147//937 +f 513//938 519//938 525//938 +f 513//939 152//939 510//939 +f 513//940 147//940 152//940 +f 513//941 514//941 517//941 +f 513//942 517//942 519//942 +f 114//943 113//943 526//943 +f 526//944 315//944 527//944 +f 113//945 315//945 526//945 +f 315//946 332//946 527//946 +f 527//947 333//947 528//947 +f 528//948 333//948 529//948 +f 332//949 333//949 527//949 +f 529//950 334//950 530//950 +f 333//951 334//951 529//951 +f 530//952 321//952 531//952 +f 334//953 321//953 530//953 +f 321//954 320//954 531//954 +f 531//955 322//955 532//955 +f 532//956 322//956 533//956 +f 320//957 322//957 531//957 +f 533//958 323//958 534//958 +f 322//959 323//959 533//959 +f 534//960 324//960 535//960 +f 323//961 324//961 534//961 +f 535//962 325//962 536//962 +f 324//963 325//963 535//963 +f 536//964 313//964 537//964 +f 325//965 313//965 536//965 +f 537//966 311//966 538//966 +f 313//967 311//967 537//967 +f 311//968 309//968 538//968 +f 538//969 304//969 539//969 +f 309//970 304//970 538//970 +f 304//971 303//971 539//971 +f 539//972 303//972 540//972 +f 303//973 300//973 540//973 +f 540//974 300//974 541//974 +f 300//975 298//975 541//975 +f 541//976 298//976 542//976 +f 298//977 78//977 542//977 +f 542//978 78//978 77//978 +f 96//979 91//979 93//979 +f 541//980 542//980 77//980 +f 541//981 77//981 79//981 +f 541//982 79//982 82//982 +f 104//983 98//983 99//983 +f 104//984 99//984 101//984 +f 538//985 539//985 540//985 +f 537//986 540//986 541//986 +f 537//987 82//987 84//987 +f 537//988 84//988 85//988 +f 537//989 541//989 82//989 +f 537//990 538//990 540//990 +f 109//991 106//991 107//991 +f 535//992 536//992 537//992 +f 114//993 109//993 112//993 +f 114//994 106//994 109//994 +f 526//995 106//995 114//995 +f 532//996 533//996 534//996 +f 532//997 534//997 535//997 +f 530//998 526//998 527//998 +f 530//999 527//999 528//999 +f 530//1000 528//1000 529//1000 +f 530//1001 531//1001 532//1001 +f 530//1002 85//1002 88//1002 +f 530//1003 88//1003 90//1003 +f 530//1004 90//1004 91//1004 +f 530//1005 96//1005 98//1005 +f 530//1006 104//1006 106//1006 +f 530//1007 91//1007 96//1007 +f 530//1008 98//1008 104//1008 +f 530//1009 537//1009 85//1009 +f 530//1010 535//1010 537//1010 +f 530//1011 532//1011 535//1011 +f 530//1012 106//1012 526//1012 +f 76//1013 75//1013 543//1013 +f 543//1014 389//1014 544//1014 +f 75//1015 389//1015 543//1015 +f 389//1016 390//1016 544//1016 +f 544//1017 392//1017 545//1017 +f 545//1018 392//1018 546//1018 +f 390//1019 392//1019 544//1019 +f 546//1020 393//1020 547//1020 +f 392//1021 393//1021 546//1021 +f 547//1022 394//1022 548//1022 +f 393//1023 394//1023 547//1023 +f 394//1024 395//1024 548//1024 +f 548//1025 386//1025 549//1025 +f 549//1026 386//1026 550//1026 +f 395//1027 386//1027 548//1027 +f 550//1028 385//1028 551//1028 +f 386//1029 385//1029 550//1029 +f 551//1030 387//1030 552//1030 +f 385//1031 387//1031 551//1031 +f 552//1032 382//1032 553//1032 +f 387//1033 382//1033 552//1033 +f 553//1034 381//1034 554//1034 +f 382//1035 381//1035 553//1035 +f 554//1036 380//1036 555//1036 +f 381//1037 380//1037 554//1037 +f 380//1038 377//1038 555//1038 +f 555//1039 370//1039 556//1039 +f 377//1040 370//1040 555//1040 +f 370//1041 368//1041 556//1041 +f 556//1042 368//1042 557//1042 +f 368//1043 367//1043 557//1043 +f 557//1044 367//1044 558//1044 +f 367//1045 366//1045 558//1045 +f 558//1046 366//1046 559//1046 +f 366//1047 40//1047 559//1047 +f 559//1048 40//1048 39//1048 +f 58//1049 53//1049 55//1049 +f 558//1050 559//1050 39//1050 +f 558//1051 39//1051 41//1051 +f 558//1052 41//1052 44//1052 +f 66//1053 60//1053 61//1053 +f 66//1054 61//1054 63//1054 +f 555//1055 556//1055 557//1055 +f 554//1056 557//1056 558//1056 +f 554//1057 44//1057 46//1057 +f 554//1058 46//1058 47//1058 +f 554//1059 558//1059 44//1059 +f 554//1060 555//1060 557//1060 +f 71//1061 68//1061 69//1061 +f 552//1062 553//1062 554//1062 +f 76//1063 71//1063 74//1063 +f 76//1064 68//1064 71//1064 +f 543//1065 68//1065 76//1065 +f 549//1066 550//1066 551//1066 +f 549//1067 551//1067 552//1067 +f 547//1068 543//1068 544//1068 +f 547//1069 544//1069 545//1069 +f 547//1070 545//1070 546//1070 +f 547//1071 548//1071 549//1071 +f 547//1072 47//1072 50//1072 +f 547//1073 50//1073 52//1073 +f 547//1074 52//1074 53//1074 +f 547//1075 58//1075 60//1075 +f 547//1076 66//1076 68//1076 +f 547//1077 53//1077 58//1077 +f 547//1078 60//1078 66//1078 +f 547//1079 554//1079 47//1079 +f 547//1080 552//1080 554//1080 +f 547//1081 549//1081 552//1081 +f 547//1082 68//1082 543//1082 +f 38//1083 37//1083 560//1083 +f 560//1084 327//1084 561//1084 +f 37//1085 327//1085 560//1085 +f 327//1086 328//1086 561//1086 +f 561//1087 329//1087 562//1087 +f 562//1088 329//1088 563//1088 +f 328//1089 329//1089 561//1089 +f 563//1090 330//1090 564//1090 +f 329//1091 330//1091 563//1091 +f 564//1092 337//1092 565//1092 +f 330//1093 337//1093 564//1093 +f 337//1094 336//1094 565//1094 +f 565//1095 338//1095 566//1095 +f 566//1096 338//1096 567//1096 +f 336//1097 338//1097 565//1097 +f 567//1098 318//1098 568//1098 +f 338//1099 318//1099 567//1099 +f 568//1100 317//1100 569//1100 +f 318//1101 317//1101 568//1101 +f 569//1102 319//1102 570//1102 +f 317//1103 319//1103 569//1103 +f 570//1104 312//1104 571//1104 +f 319//1105 312//1105 570//1105 +f 571//1106 310//1106 572//1106 +f 312//1107 310//1107 571//1107 +f 310//1108 308//1108 572//1108 +f 572//1109 307//1109 573//1109 +f 308//1110 307//1110 572//1110 +f 307//1111 306//1111 573//1111 +f 573//1112 306//1112 574//1112 +f 306//1113 299//1113 574//1113 +f 574//1114 299//1114 575//1114 +f 299//1115 297//1115 575//1115 +f 575//1116 297//1116 576//1116 +f 297//1117 2//1117 576//1117 +f 576//1118 2//1118 1//1118 +f 14//1119 9//1119 12//1119 +f 23//1120 20//1120 22//1120 +f 573//1121 574//1121 575//1121 +f 30//1122 25//1122 28//1122 +f 31//1123 25//1123 30//1123 +f 33//1124 23//1124 25//1124 +f 33//1125 20//1125 23//1125 +f 33//1126 25//1126 31//1126 +f 570//1127 571//1127 572//1127 +f 570//1128 572//1128 573//1128 +f 570//1129 575//1129 576//1129 +f 570//1130 573//1130 575//1130 +f 568//1131 569//1131 570//1131 +f 38//1132 33//1132 36//1132 +f 561//1133 38//1133 560//1133 +f 565//1134 566//1134 567//1134 +f 565//1135 567//1135 568//1135 +f 564//1136 561//1136 562//1136 +f 564//1137 562//1137 563//1137 +f 564//1138 576//1138 1//1138 +f 564//1139 1//1139 3//1139 +f 564//1140 3//1140 6//1140 +f 564//1141 6//1141 8//1141 +f 564//1142 8//1142 9//1142 +f 564//1143 14//1143 15//1143 +f 564//1144 15//1144 17//1144 +f 564//1145 17//1145 20//1145 +f 564//1146 9//1146 14//1146 +f 564//1147 20//1147 33//1147 +f 564//1148 570//1148 576//1148 +f 564//1149 38//1149 561//1149 +f 564//1150 33//1150 38//1150 +f 564//1151 565//1151 568//1151 +f 564//1152 568//1152 570//1152 diff --git a/web_p/blender/libs/objects/body_up.obj b/web_p/blender/libs/objects/body_up.obj new file mode 100644 index 0000000..03b7799 --- /dev/null +++ b/web_p/blender/libs/objects/body_up.obj @@ -0,0 +1,2913 @@ +# Created by FreeCAD +v 25.688051 -23.688070 0.000000 +v 25.657650 -24.035332 0.000000 +v 25.688051 -23.688070 10.999970 +v 25.657650 -24.035332 10.999970 +v 25.567411 -24.372101 0.000000 +v 25.567411 -24.372101 10.999970 +v 25.420120 -24.688059 0.000000 +v 25.420120 -24.688059 10.999970 +v 25.220150 -24.973631 0.000000 +v 25.220150 -24.973631 10.999970 +v 24.973631 -25.220150 10.999970 +v 24.973631 -25.220150 0.000000 +v 24.688059 -25.420120 10.999970 +v 24.688059 -25.420120 0.000000 +v 24.372101 -25.567411 10.999970 +v 24.372101 -25.567411 0.000000 +v 24.035332 -25.657650 0.000000 +v 24.035332 -25.657650 10.999970 +v 23.688070 -25.688051 0.000000 +v 23.688070 -25.688051 10.999970 +v 23.340759 -25.657650 10.999970 +v 23.340759 -25.657650 0.000000 +v 23.003990 -25.567411 0.000000 +v 23.003990 -25.567411 10.999970 +v 22.688030 -25.420120 0.000000 +v 22.688030 -25.420120 10.999970 +v 22.402460 -25.220150 0.000000 +v 22.402460 -25.220150 10.999970 +v 22.155941 -24.973631 0.000000 +v 22.155941 -24.973631 10.999970 +v 21.956018 -24.688059 0.000000 +v 21.956018 -24.688059 10.999970 +v 21.808680 -24.372101 0.000000 +v 21.808680 -24.372101 10.999970 +v 21.718441 -24.035332 0.000000 +v 21.718441 -24.035332 10.999970 +v 21.688040 -23.688070 10.999970 +v 21.688040 -23.688070 0.000000 +v -21.688040 -23.688070 0.000000 +v -21.718441 -24.035332 0.000000 +v -21.688040 -23.688070 10.999970 +v -21.718441 -24.035332 10.999970 +v -21.808680 -24.372101 0.000000 +v -21.808680 -24.372101 10.999970 +v -21.956018 -24.688059 0.000000 +v -21.956018 -24.688059 10.999970 +v -22.155941 -24.973631 0.000000 +v -22.155941 -24.973631 10.999970 +v -22.402460 -25.220150 10.999970 +v -22.402460 -25.220150 0.000000 +v -22.688030 -25.420120 10.999970 +v -22.688030 -25.420120 0.000000 +v -23.003990 -25.567411 10.999970 +v -23.003990 -25.567411 0.000000 +v -23.340759 -25.657650 0.000000 +v -23.340759 -25.657650 10.999970 +v -23.688070 -25.688051 0.000000 +v -23.688070 -25.688051 10.999970 +v -24.035332 -25.657650 10.999970 +v -24.035332 -25.657650 0.000000 +v -24.372101 -25.567411 0.000000 +v -24.372101 -25.567411 10.999970 +v -24.688059 -25.420120 0.000000 +v -24.688059 -25.420120 10.999970 +v -24.973631 -25.220150 0.000000 +v -24.973631 -25.220150 10.999970 +v -25.220150 -24.973631 0.000000 +v -25.220150 -24.973631 10.999970 +v -25.420120 -24.688059 0.000000 +v -25.420120 -24.688059 10.999970 +v -25.567411 -24.372101 0.000000 +v -25.567411 -24.372101 10.999970 +v -25.657650 -24.035332 0.000000 +v -25.657650 -24.035332 10.999970 +v -25.688051 -23.688070 10.999970 +v -25.688051 -23.688070 0.000000 +v -21.688040 23.688070 0.000000 +v -21.718441 23.340759 0.000000 +v -21.688040 23.688070 10.999970 +v -21.718441 23.340759 10.999970 +v -21.808680 23.003990 0.000000 +v -21.808680 23.003990 10.999970 +v -21.956018 22.688030 0.000000 +v -21.956018 22.688030 10.999970 +v -22.155941 22.402460 0.000000 +v -22.155941 22.402460 10.999970 +v -22.402460 22.155941 10.999970 +v -22.402460 22.155941 0.000000 +v -22.688030 21.956018 10.999970 +v -22.688030 21.956018 0.000000 +v -23.003990 21.808680 10.999970 +v -23.003990 21.808680 0.000000 +v -23.340759 21.718441 0.000000 +v -23.340759 21.718441 10.999970 +v -23.688070 21.688040 0.000000 +v -23.688070 21.688040 10.999970 +v -24.035332 21.718441 10.999970 +v -24.035332 21.718441 0.000000 +v -24.372101 21.808680 0.000000 +v -24.372101 21.808680 10.999970 +v -24.688059 21.956018 0.000000 +v -24.688059 21.956018 10.999970 +v -24.973631 22.155941 0.000000 +v -24.973631 22.155941 10.999970 +v -25.220150 22.402460 0.000000 +v -25.220150 22.402460 10.999970 +v -25.420120 22.688030 0.000000 +v -25.420120 22.688030 10.999970 +v -25.567411 23.003990 0.000000 +v -25.567411 23.003990 10.999970 +v -25.657650 23.340759 0.000000 +v -25.657650 23.340759 10.999970 +v -25.688051 23.688070 10.999970 +v -25.688051 23.688070 0.000000 +v 25.688051 23.688070 0.000000 +v 25.657650 23.340759 0.000000 +v 25.688051 23.688070 10.999970 +v 25.657650 23.340759 10.999970 +v 25.567411 23.003990 0.000000 +v 25.567411 23.003990 10.999970 +v 25.420120 22.688030 0.000000 +v 25.420120 22.688030 10.999970 +v 25.220150 22.402460 0.000000 +v 25.220150 22.402460 10.999970 +v 24.973631 22.155941 10.999970 +v 24.973631 22.155941 0.000000 +v 24.688059 21.956018 10.999970 +v 24.688059 21.956018 0.000000 +v 24.372101 21.808680 10.999970 +v 24.372101 21.808680 0.000000 +v 24.035332 21.718441 0.000000 +v 24.035332 21.718441 10.999970 +v 23.688070 21.688040 0.000000 +v 23.688070 21.688040 10.999970 +v 23.340759 21.718441 10.999970 +v 23.340759 21.718441 0.000000 +v 23.003990 21.808680 0.000000 +v 23.003990 21.808680 10.999970 +v 22.688030 21.956018 0.000000 +v 22.688030 21.956018 10.999970 +v 22.402460 22.155941 0.000000 +v 22.402460 22.155941 10.999970 +v 22.155941 22.402460 0.000000 +v 22.155941 22.402460 10.999970 +v 21.956018 22.688030 0.000000 +v 21.956018 22.688030 10.999970 +v 21.808680 23.003990 0.000000 +v 21.808680 23.003990 10.999970 +v 21.718441 23.340759 0.000000 +v 21.718441 23.340759 10.999970 +v 21.688040 23.688070 10.999970 +v 21.688040 23.688070 0.000000 +v 8.249998 0.000000 5.999982 +v 8.124649 -1.432597 5.999982 +v 8.249998 0.000000 10.999970 +v 8.124649 -1.432597 10.999970 +v 7.752418 -2.821624 5.999982 +v 7.752418 -2.821624 10.999970 +v 7.144689 -4.124999 5.999982 +v 7.144689 -4.124999 10.999970 +v 6.319820 -5.302965 5.999982 +v 6.319820 -5.302965 10.999970 +v 5.302965 -6.319820 5.999982 +v 5.302965 -6.319820 10.999970 +v 4.124999 -7.144689 10.999970 +v 4.124999 -7.144689 5.999982 +v 2.821624 -7.752418 10.999970 +v 2.821624 -7.752418 5.999982 +v 1.432597 -8.124649 5.999982 +v 1.432597 -8.124649 10.999970 +v 0.000000 -8.249998 5.999982 +v 0.000000 -8.249998 10.999970 +v -1.432597 -8.124649 5.999982 +v -1.432597 -8.124649 10.999970 +v -2.821624 -7.752418 5.999982 +v -2.821624 -7.752418 10.999970 +v -4.124999 -7.144689 5.999982 +v -4.124999 -7.144689 10.999970 +v -5.302965 -6.319820 5.999982 +v -5.302965 -6.319820 10.999970 +v -6.319820 -5.302965 5.999982 +v -6.319820 -5.302965 10.999970 +v -7.144689 -4.124999 5.999982 +v -7.144689 -4.124999 10.999970 +v -7.752418 -2.821624 5.999982 +v -7.752418 -2.821624 10.999970 +v -8.124649 -1.432597 10.999970 +v -8.124649 -1.432597 5.999982 +v -8.249998 0.000000 5.999982 +v -8.249998 0.000000 10.999970 +v 29.999969 0.000000 0.000000 +v 29.811321 -3.358900 0.000000 +v 29.999969 0.000000 5.999982 +v 29.811321 -3.358900 5.999982 +v 29.247820 -6.675601 0.000000 +v 29.247820 -6.675601 5.999982 +v 28.316490 -9.908318 0.000000 +v 28.316490 -9.908318 5.999982 +v 27.029030 -13.016460 0.000000 +v 27.029030 -13.016460 5.999982 +v 25.401711 -15.960930 5.999982 +v 25.401711 -15.960930 0.000000 +v 23.454901 -18.704651 5.999982 +v 23.454901 -18.704651 0.000000 +v 21.213171 -21.213171 0.000000 +v 21.213171 -21.213171 5.999982 +v 18.704651 -23.454901 0.000000 +v 18.704651 -23.454901 5.999982 +v 15.960930 -25.401711 0.000000 +v 15.960930 -25.401711 5.999982 +v 13.016460 -27.029030 0.000000 +v 13.016460 -27.029030 5.999982 +v 9.908318 -28.316490 0.000000 +v 9.908318 -28.316490 5.999982 +v 6.675601 -29.247820 5.999982 +v 6.675601 -29.247820 0.000000 +v 3.358900 -29.811321 0.000000 +v 3.358900 -29.811321 5.999982 +v 0.000000 -29.999969 0.000000 +v 0.000000 -29.999969 5.999982 +v -3.358900 -29.811321 0.000000 +v -3.358900 -29.811321 5.999982 +v -6.675601 -29.247820 0.000000 +v -6.675601 -29.247820 5.999982 +v -9.908318 -28.316490 0.000000 +v -9.908318 -28.316490 5.999982 +v -13.016460 -27.029030 5.999982 +v -13.016460 -27.029030 0.000000 +v -15.960930 -25.401711 5.999982 +v -15.960930 -25.401711 0.000000 +v -18.704651 -23.454901 5.999982 +v -18.704651 -23.454901 0.000000 +v -21.213171 -21.213171 5.999982 +v -21.213171 -21.213171 0.000000 +v -23.454901 -18.704651 5.999982 +v -23.454901 -18.704651 0.000000 +v -25.401711 -15.960930 5.999982 +v -25.401711 -15.960930 0.000000 +v -27.029030 -13.016460 5.999982 +v -27.029030 -13.016460 0.000000 +v -28.316490 -9.908318 0.000000 +v -28.316490 -9.908318 5.999982 +v -29.247820 -6.675601 5.999982 +v -29.247820 -6.675601 0.000000 +v -29.811321 -3.358900 5.999982 +v -29.811321 -3.358900 0.000000 +v -29.999969 0.000000 0.000000 +v -29.999969 0.000000 5.999982 +v -26.642080 -26.642080 0.000000 +v -28.367041 -24.675190 0.000000 +v -24.675190 -28.367041 0.000000 +v -29.820499 -22.499969 0.000000 +v -25.657650 -23.340759 0.000000 +v -22.499969 -29.820499 0.000000 +v -25.567411 -23.003990 0.000000 +v -25.420120 -22.688030 0.000000 +v -25.220150 -22.402460 0.000000 +v -30.977539 -20.153641 0.000000 +v -20.153641 -30.977539 0.000000 +v -24.973631 -22.155941 0.000000 +v -23.003990 -21.808680 0.000000 +v -22.688030 -21.956018 0.000000 +v -22.402460 -22.155941 0.000000 +v -22.155941 -22.402460 0.000000 +v -21.956018 -22.688030 0.000000 +v -21.808680 -23.003990 0.000000 +v -21.718441 -23.340759 0.000000 +v -24.688059 -21.956018 0.000000 +v -24.372101 -21.808680 0.000000 +v -24.035332 -21.718441 0.000000 +v -23.688070 -21.688040 0.000000 +v -23.340759 -21.718441 0.000000 +v -17.676350 -31.818502 0.000000 +v -31.818502 -17.676350 0.000000 +v -15.110490 -32.328842 0.000000 +v -12.499980 -32.499962 0.000000 +v -32.499962 -12.499980 0.000000 +v -32.328842 -15.110490 0.000000 +v -29.811321 3.358900 0.000000 +v -32.499962 12.499980 0.000000 +v -29.247820 6.675601 0.000000 +v 12.499980 -32.499962 0.000000 +v -28.316490 9.908318 0.000000 +v 15.110490 -32.328842 0.000000 +v 17.676350 -31.818502 0.000000 +v -31.818502 17.676350 0.000000 +v -27.029030 13.016460 0.000000 +v -32.328842 15.110490 0.000000 +v 20.153641 -30.977539 0.000000 +v -30.977539 20.153641 0.000000 +v -25.401711 15.960930 0.000000 +v -29.820499 22.499969 0.000000 +v -23.454901 18.704651 0.000000 +v 22.499969 -29.820499 0.000000 +v -28.367041 24.675190 0.000000 +v 24.675190 -28.367041 0.000000 +v -25.657650 24.035332 0.000000 +v 21.718441 -23.340759 0.000000 +v -25.567411 24.372101 0.000000 +v 21.808680 -23.003990 0.000000 +v 26.642080 -26.642080 0.000000 +v 21.956018 -22.688030 0.000000 +v 22.155941 -22.402460 0.000000 +v -21.213171 21.213171 0.000000 +v -26.642080 26.642080 0.000000 +v -25.420120 24.688059 0.000000 +v -25.220150 24.973631 0.000000 +v -24.973631 25.220150 0.000000 +v 22.402460 -22.155941 0.000000 +v -24.688059 25.420120 0.000000 +v 22.688030 -21.956018 0.000000 +v -24.372101 25.567411 0.000000 +v 23.003990 -21.808680 0.000000 +v 28.367041 -24.675190 0.000000 +v 25.657650 -23.340759 0.000000 +v -24.675190 28.367041 0.000000 +v -24.035332 25.657650 0.000000 +v -23.688070 25.688051 0.000000 +v -23.340759 25.657650 0.000000 +v 23.340759 -21.718441 0.000000 +v 23.688070 -21.688040 0.000000 +v 24.035332 -21.718441 0.000000 +v 24.372101 -21.808680 0.000000 +v 24.688059 -21.956018 0.000000 +v 24.973631 -22.155941 0.000000 +v -18.704651 23.454901 0.000000 +v -22.155941 24.973631 0.000000 +v -21.956018 24.688059 0.000000 +v -21.808680 24.372101 0.000000 +v -21.718441 24.035332 0.000000 +v 29.820499 -22.499969 0.000000 +v 25.220150 -22.402460 0.000000 +v 25.420120 -22.688030 0.000000 +v 25.567411 -23.003990 0.000000 +v -22.499969 29.820499 0.000000 +v -23.003990 25.567411 0.000000 +v -22.688030 25.420120 0.000000 +v -22.402460 25.220150 0.000000 +v -15.960930 25.401711 0.000000 +v 30.977539 -20.153641 0.000000 +v -20.153641 30.977539 0.000000 +v 31.818502 -17.676350 0.000000 +v -17.676350 31.818502 0.000000 +v -13.016460 27.029030 0.000000 +v 32.328842 -15.110490 0.000000 +v -15.110490 32.328842 0.000000 +v 32.499962 -12.499980 0.000000 +v -12.499980 32.499962 0.000000 +v -9.908318 28.316490 0.000000 +v -6.675601 29.247820 0.000000 +v -3.358900 29.811321 0.000000 +v 0.000000 29.999969 0.000000 +v 21.213171 21.213171 0.000000 +v 18.704651 23.454901 0.000000 +v 23.454901 18.704651 0.000000 +v 9.908318 28.316490 0.000000 +v 12.499980 32.499962 0.000000 +v 13.016460 27.029030 0.000000 +v 6.675601 29.247820 0.000000 +v 3.358900 29.811321 0.000000 +v 32.499962 12.499980 0.000000 +v 29.811321 3.358900 0.000000 +v 29.247820 6.675601 0.000000 +v 28.316490 9.908318 0.000000 +v 27.029030 13.016460 0.000000 +v 21.718441 24.035332 0.000000 +v 21.808680 24.372101 0.000000 +v 21.956018 24.688059 0.000000 +v 25.401711 15.960930 0.000000 +v 15.960930 25.401711 0.000000 +v 22.155941 24.973631 0.000000 +v 15.110490 32.328842 0.000000 +v 32.328842 15.110490 0.000000 +v 17.676350 31.818502 0.000000 +v 31.818502 17.676350 0.000000 +v 20.153641 30.977539 0.000000 +v 22.402460 25.220150 0.000000 +v 30.977539 20.153641 0.000000 +v 22.499969 29.820499 0.000000 +v 22.688030 25.420120 0.000000 +v 23.003990 25.567411 0.000000 +v 23.340759 25.657650 0.000000 +v 29.820499 22.499969 0.000000 +v 24.675190 28.367041 0.000000 +v 23.688070 25.688051 0.000000 +v 24.035332 25.657650 0.000000 +v 24.372101 25.567411 0.000000 +v 28.367041 24.675190 0.000000 +v 25.567411 24.372101 0.000000 +v 25.657650 24.035332 0.000000 +v 26.642080 26.642080 0.000000 +v 24.688059 25.420120 0.000000 +v 24.973631 25.220150 0.000000 +v 25.220150 24.973631 0.000000 +v 25.420120 24.688059 0.000000 +v 32.499962 -12.499980 10.999970 +v 32.328842 -15.110490 10.999970 +v 31.818502 -17.676350 10.999970 +v 30.977539 -20.153641 10.999970 +v 29.820499 -22.499969 10.999970 +v 28.367041 -24.675190 10.999970 +v 26.642080 -26.642080 10.999970 +v 24.675190 -28.367041 10.999970 +v 22.499969 -29.820499 10.999970 +v 20.153641 -30.977539 10.999970 +v 17.676350 -31.818502 10.999970 +v 15.110490 -32.328842 10.999970 +v 12.499980 -32.499962 10.999970 +v 32.499962 12.499980 10.999970 +v 12.499980 32.499962 10.999970 +v 15.110490 32.328842 10.999970 +v 17.676350 31.818502 10.999970 +v 20.153641 30.977539 10.999970 +v 22.499969 29.820499 10.999970 +v 24.675190 28.367041 10.999970 +v 26.642080 26.642080 10.999970 +v 28.367041 24.675190 10.999970 +v 29.820499 22.499969 10.999970 +v 30.977539 20.153641 10.999970 +v 31.818502 17.676350 10.999970 +v 32.328842 15.110490 10.999970 +v -12.499980 32.499962 10.999970 +v -32.499962 12.499980 10.999970 +v -32.328842 15.110490 10.999970 +v -31.818502 17.676350 10.999970 +v -30.977539 20.153641 10.999970 +v -29.820499 22.499969 10.999970 +v -28.367041 24.675190 10.999970 +v -26.642080 26.642080 10.999970 +v -24.675190 28.367041 10.999970 +v -22.499969 29.820499 10.999970 +v -20.153641 30.977539 10.999970 +v -17.676350 31.818502 10.999970 +v -15.110490 32.328842 10.999970 +v -32.499962 -12.499980 10.999970 +v -12.499980 -32.499962 10.999970 +v -15.110490 -32.328842 10.999970 +v -17.676350 -31.818502 10.999970 +v -20.153641 -30.977539 10.999970 +v -22.499969 -29.820499 10.999970 +v -24.675190 -28.367041 10.999970 +v -26.642080 -26.642080 10.999970 +v -28.367041 -24.675190 10.999970 +v -29.820499 -22.499969 10.999970 +v -30.977539 -20.153641 10.999970 +v -31.818502 -17.676350 10.999970 +v -32.328842 -15.110490 10.999970 +v -29.811321 3.358900 5.999982 +v -29.247820 6.675601 5.999982 +v -28.316490 9.908318 5.999982 +v -27.029030 13.016460 5.999982 +v -25.401711 15.960930 5.999982 +v -23.454901 18.704651 5.999982 +v -21.213171 21.213171 5.999982 +v -18.704651 23.454901 5.999982 +v -15.960930 25.401711 5.999982 +v -13.016460 27.029030 5.999982 +v -9.908318 28.316490 5.999982 +v -6.675601 29.247820 5.999982 +v -3.358900 29.811321 5.999982 +v 0.000000 29.999969 5.999982 +v 3.358900 29.811321 5.999982 +v 6.675601 29.247820 5.999982 +v 9.908318 28.316490 5.999982 +v 13.016460 27.029030 5.999982 +v 15.960930 25.401711 5.999982 +v 18.704651 23.454901 5.999982 +v 21.213171 21.213171 5.999982 +v 23.454901 18.704651 5.999982 +v 25.401711 15.960930 5.999982 +v 27.029030 13.016460 5.999982 +v 28.316490 9.908318 5.999982 +v 29.247820 6.675601 5.999982 +v 29.811321 3.358900 5.999982 +v -8.124649 1.432597 5.999982 +v -7.752418 2.821624 5.999982 +v -7.144689 4.124999 5.999982 +v -6.319820 5.302965 5.999982 +v -5.302965 6.319820 5.999982 +v -4.124999 7.144689 5.999982 +v -2.821624 7.752418 5.999982 +v -1.432597 8.124649 5.999982 +v 0.000000 8.249998 5.999982 +v 8.124649 1.432597 5.999982 +v 1.432597 8.124649 5.999982 +v 2.821624 7.752418 5.999982 +v 7.752418 2.821624 5.999982 +v 7.144689 4.124999 5.999982 +v 4.124999 7.144689 5.999982 +v 5.302965 6.319820 5.999982 +v 6.319820 5.302965 5.999982 +v -25.657650 -23.340759 10.999970 +v -25.567411 -23.003990 10.999970 +v -25.420120 -22.688030 10.999970 +v -25.220150 -22.402460 10.999970 +v -24.973631 -22.155941 10.999970 +v -24.688059 -21.956018 10.999970 +v -24.372101 -21.808680 10.999970 +v -24.035332 -21.718441 10.999970 +v -23.688070 -21.688040 10.999970 +v -23.340759 -21.718441 10.999970 +v -21.718441 -23.340759 10.999970 +v -23.003990 -21.808680 10.999970 +v -21.808680 -23.003990 10.999970 +v -22.402460 -22.155941 10.999970 +v -22.155941 -22.402460 10.999970 +v -21.956018 -22.688030 10.999970 +v -22.688030 -21.956018 10.999970 +v -8.124649 1.432597 10.999970 +v -7.752418 2.821624 10.999970 +v -25.657650 24.035332 10.999970 +v 21.718441 -23.340759 10.999970 +v -7.144689 4.124999 10.999970 +v -25.567411 24.372101 10.999970 +v 21.808680 -23.003990 10.999970 +v -6.319820 5.302965 10.999970 +v 21.956018 -22.688030 10.999970 +v 22.155941 -22.402460 10.999970 +v -25.420120 24.688059 10.999970 +v -25.220150 24.973631 10.999970 +v -24.973631 25.220150 10.999970 +v -24.688059 25.420120 10.999970 +v 22.402460 -22.155941 10.999970 +v 22.688030 -21.956018 10.999970 +v -5.302965 6.319820 10.999970 +v -24.372101 25.567411 10.999970 +v 23.003990 -21.808680 10.999970 +v -4.124999 7.144689 10.999970 +v 25.657650 -23.340759 10.999970 +v -24.035332 25.657650 10.999970 +v -23.688070 25.688051 10.999970 +v -23.340759 25.657650 10.999970 +v -2.821624 7.752418 10.999970 +v 25.220150 -22.402460 10.999970 +v 25.420120 -22.688030 10.999970 +v 25.567411 -23.003990 10.999970 +v -23.003990 25.567411 10.999970 +v -22.688030 25.420120 10.999970 +v -22.402460 25.220150 10.999970 +v 24.688059 -21.956018 10.999970 +v 24.973631 -22.155941 10.999970 +v -22.155941 24.973631 10.999970 +v -21.956018 24.688059 10.999970 +v 24.035332 -21.718441 10.999970 +v 24.372101 -21.808680 10.999970 +v -21.808680 24.372101 10.999970 +v -21.718441 24.035332 10.999970 +v 23.688070 -21.688040 10.999970 +v 23.340759 -21.718441 10.999970 +v -1.432597 8.124649 10.999970 +v 0.000000 8.249998 10.999970 +v 5.302965 6.319820 10.999970 +v 6.319820 5.302965 10.999970 +v 7.144689 4.124999 10.999970 +v 4.124999 7.144689 10.999970 +v 7.752418 2.821624 10.999970 +v 2.821624 7.752418 10.999970 +v 1.432597 8.124649 10.999970 +v 8.124649 1.432597 10.999970 +v 21.718441 24.035332 10.999970 +v 21.808680 24.372101 10.999970 +v 21.956018 24.688059 10.999970 +v 22.155941 24.973631 10.999970 +v 22.402460 25.220150 10.999970 +v 22.688030 25.420120 10.999970 +v 23.003990 25.567411 10.999970 +v 23.340759 25.657650 10.999970 +v 23.688070 25.688051 10.999970 +v 24.035332 25.657650 10.999970 +v 24.372101 25.567411 10.999970 +v 25.567411 24.372101 10.999970 +v 25.657650 24.035332 10.999970 +v 24.688059 25.420120 10.999970 +v 24.973631 25.220150 10.999970 +v 25.220150 24.973631 10.999970 +v 25.420120 24.688059 10.999970 +vn -0.996190 0.087212 0.000000 +vn -0.996190 0.087212 0.000000 +vn -0.965925 0.258823 0.000000 +vn -0.965925 0.258823 0.000000 +vn -0.906354 0.422518 0.000000 +vn -0.906354 0.422518 0.000000 +vn -0.819138 0.573597 0.000000 +vn -0.707107 0.707107 0.000000 +vn -0.819138 0.573597 0.000000 +vn -0.573597 0.819138 0.000000 +vn -0.707107 0.707107 0.000000 +vn -0.422518 0.906354 0.000000 +vn -0.573597 0.819138 0.000000 +vn -0.422518 0.906354 0.000000 +vn -0.258823 0.965925 0.000000 +vn -0.258823 0.965925 0.000000 +vn -0.087212 0.996190 0.000000 +vn 0.087200 0.996191 0.000000 +vn -0.087212 0.996190 0.000000 +vn 0.087200 0.996191 0.000000 +vn 0.258823 0.965925 0.000000 +vn 0.258823 0.965925 -0.000000 +vn 0.422516 0.906355 0.000000 +vn 0.422516 0.906355 -0.000000 +vn 0.573599 0.819136 0.000000 +vn 0.573599 0.819136 -0.000000 +vn 0.707107 0.707107 0.000000 +vn 0.707107 0.707107 -0.000000 +vn 0.819202 0.573505 -0.000000 +vn 0.819202 0.573505 0.000000 +vn 0.906302 0.422631 -0.000000 +vn 0.906302 0.422631 0.000000 +vn 0.965925 0.258823 -0.000000 +vn 0.965925 0.258823 0.000000 +vn 0.996190 0.087212 0.000000 +vn 0.996190 0.087212 0.000000 +vn -0.996190 0.087212 0.000000 +vn -0.996190 0.087212 0.000000 +vn -0.965925 0.258823 0.000000 +vn -0.965925 0.258823 0.000000 +vn -0.906302 0.422631 0.000000 +vn -0.906302 0.422631 0.000000 +vn -0.819202 0.573505 0.000000 +vn -0.707107 0.707107 0.000000 +vn -0.819202 0.573505 0.000000 +vn -0.573599 0.819136 0.000000 +vn -0.707107 0.707107 0.000000 +vn -0.422516 0.906355 0.000000 +vn -0.573599 0.819136 0.000000 +vn -0.422516 0.906355 0.000000 +vn -0.258823 0.965925 0.000000 +vn -0.258823 0.965925 0.000000 +vn -0.087200 0.996191 0.000000 +vn 0.087212 0.996190 0.000000 +vn -0.087200 0.996191 0.000000 +vn 0.087212 0.996190 0.000000 +vn 0.258823 0.965925 0.000000 +vn 0.258823 0.965925 -0.000000 +vn 0.422518 0.906354 0.000000 +vn 0.422518 0.906354 -0.000000 +vn 0.573597 0.819138 0.000000 +vn 0.573597 0.819138 -0.000000 +vn 0.707107 0.707107 0.000000 +vn 0.707107 0.707107 -0.000000 +vn 0.819138 0.573597 -0.000000 +vn 0.819138 0.573597 0.000000 +vn 0.906354 0.422518 -0.000000 +vn 0.906354 0.422518 0.000000 +vn 0.965925 0.258823 -0.000000 +vn 0.965925 0.258823 0.000000 +vn 0.996190 0.087212 0.000000 +vn 0.996190 0.087212 0.000000 +vn -0.996191 0.087200 0.000000 +vn -0.996191 0.087200 0.000000 +vn -0.965925 0.258823 0.000000 +vn -0.965925 0.258823 0.000000 +vn -0.906303 0.422628 0.000000 +vn -0.906303 0.422628 0.000000 +vn -0.819200 0.573507 0.000000 +vn -0.707107 0.707107 0.000000 +vn -0.819200 0.573507 0.000000 +vn -0.573507 0.819200 0.000000 +vn -0.707107 0.707107 0.000000 +vn -0.422628 0.906303 0.000000 +vn -0.573507 0.819200 0.000000 +vn -0.422628 0.906303 0.000000 +vn -0.258823 0.965925 0.000000 +vn -0.258823 0.965925 0.000000 +vn -0.087200 0.996191 0.000000 +vn 0.087212 0.996190 0.000000 +vn -0.087200 0.996191 0.000000 +vn 0.087212 0.996190 0.000000 +vn 0.258823 0.965925 0.000000 +vn 0.258823 0.965925 -0.000000 +vn 0.422631 0.906302 0.000000 +vn 0.422631 0.906302 -0.000000 +vn 0.573505 0.819202 0.000000 +vn 0.573505 0.819202 -0.000000 +vn 0.707107 0.707107 0.000000 +vn 0.707107 0.707107 -0.000000 +vn 0.819136 0.573599 -0.000000 +vn 0.819136 0.573599 0.000000 +vn 0.906355 0.422516 -0.000000 +vn 0.906355 0.422516 0.000000 +vn 0.965925 0.258823 -0.000000 +vn 0.965925 0.258823 0.000000 +vn 0.996191 0.087200 0.000000 +vn 0.996191 0.087200 0.000000 +vn -0.996191 0.087200 0.000000 +vn -0.996191 0.087200 0.000000 +vn -0.965925 0.258823 0.000000 +vn -0.965925 0.258823 0.000000 +vn -0.906355 0.422516 0.000000 +vn -0.906355 0.422516 0.000000 +vn -0.819136 0.573599 0.000000 +vn -0.707107 0.707107 0.000000 +vn -0.819136 0.573599 0.000000 +vn -0.573505 0.819202 0.000000 +vn -0.707107 0.707107 0.000000 +vn -0.422631 0.906302 0.000000 +vn -0.573505 0.819202 0.000000 +vn -0.422631 0.906302 0.000000 +vn -0.258823 0.965925 0.000000 +vn -0.258823 0.965925 0.000000 +vn -0.087212 0.996190 0.000000 +vn 0.087200 0.996191 0.000000 +vn -0.087212 0.996190 0.000000 +vn 0.087200 0.996191 0.000000 +vn 0.258823 0.965925 0.000000 +vn 0.258823 0.965925 -0.000000 +vn 0.422628 0.906303 0.000000 +vn 0.422628 0.906303 -0.000000 +vn 0.573507 0.819200 0.000000 +vn 0.573507 0.819200 -0.000000 +vn 0.707107 0.707107 0.000000 +vn 0.707107 0.707107 -0.000000 +vn 0.819200 0.573507 -0.000000 +vn 0.819200 0.573507 0.000000 +vn 0.906303 0.422628 -0.000000 +vn 0.906303 0.422628 0.000000 +vn 0.965925 0.258823 -0.000000 +vn 0.965925 0.258823 0.000000 +vn 0.996191 0.087200 0.000000 +vn 0.996191 0.087200 0.000000 +vn -0.996194 0.087165 0.000000 +vn -0.996194 0.087165 0.000000 +vn -0.965918 0.258847 0.000000 +vn -0.965918 0.258847 0.000000 +vn -0.906320 0.422593 0.000000 +vn -0.906320 0.422593 0.000000 +vn -0.819136 0.573599 0.000000 +vn -0.819136 0.573599 0.000000 +vn -0.707107 0.707107 0.000000 +vn -0.707107 0.707107 0.000000 +vn -0.422593 0.906320 0.000000 +vn -0.573599 0.819136 0.000000 +vn -0.573599 0.819136 0.000000 +vn -0.422593 0.906320 0.000000 +vn -0.258847 0.965918 0.000000 +vn -0.258847 0.965918 0.000000 +vn -0.087165 0.996194 0.000000 +vn -0.087165 0.996194 0.000000 +vn 0.087165 0.996194 0.000000 +vn 0.087165 0.996194 -0.000000 +vn 0.258847 0.965918 0.000000 +vn 0.258847 0.965918 -0.000000 +vn 0.422593 0.906320 0.000000 +vn 0.422593 0.906320 -0.000000 +vn 0.573599 0.819136 0.000000 +vn 0.573599 0.819136 -0.000000 +vn 0.707107 0.707107 0.000000 +vn 0.707107 0.707107 -0.000000 +vn 0.819136 0.573599 -0.000000 +vn 0.819136 0.573599 0.000000 +vn 0.906320 0.422593 -0.000000 +vn 0.965918 0.258847 0.000000 +vn 0.906320 0.422593 0.000000 +vn 0.965918 0.258847 0.000000 +vn 0.996194 0.087165 -0.000000 +vn 0.996194 0.087165 0.000000 +vn -0.998427 0.056075 0.000000 +vn -0.998427 0.056075 0.000000 +vn -0.985872 0.167498 0.000000 +vn -0.985872 0.167498 0.000000 +vn -0.960917 0.276836 0.000000 +vn -0.960917 0.276836 0.000000 +vn -0.923877 0.382690 0.000000 +vn -0.923877 0.382690 0.000000 +vn -0.815556 0.578678 0.000000 +vn -0.875227 0.483712 0.000000 +vn -0.875227 0.483712 0.000000 +vn -0.815556 0.578678 0.000000 +vn -0.745645 0.666343 0.000000 +vn -0.745645 0.666343 0.000000 +vn -0.666343 0.745645 0.000000 +vn -0.666343 0.745645 0.000000 +vn -0.578678 0.815556 0.000000 +vn -0.578678 0.815556 0.000000 +vn -0.483712 0.875227 0.000000 +vn -0.483712 0.875227 0.000000 +vn -0.382690 0.923877 0.000000 +vn -0.276836 0.960917 0.000000 +vn -0.382690 0.923877 0.000000 +vn -0.276836 0.960917 0.000000 +vn -0.167498 0.985872 0.000000 +vn -0.167498 0.985872 0.000000 +vn -0.056075 0.998427 0.000000 +vn -0.056075 0.998427 0.000000 +vn 0.056075 0.998427 -0.000000 +vn 0.056075 0.998427 0.000000 +vn 0.167498 0.985872 -0.000000 +vn 0.167498 0.985872 0.000000 +vn 0.276836 0.960917 -0.000000 +vn 0.382690 0.923877 0.000000 +vn 0.276836 0.960917 0.000000 +vn 0.382690 0.923877 0.000000 +vn 0.483712 0.875227 0.000000 +vn 0.483712 0.875227 0.000000 +vn 0.666343 0.745645 0.000000 +vn 0.578678 0.815556 0.000000 +vn 0.578678 0.815556 -0.000000 +vn 0.666343 0.745645 0.000000 +vn 0.815556 0.578678 0.000000 +vn 0.745645 0.666343 0.000000 +vn 0.745645 0.666343 -0.000000 +vn 0.875227 0.483712 0.000000 +vn 0.815556 0.578678 0.000000 +vn 0.875227 0.483712 0.000000 +vn 0.923877 0.382690 0.000000 +vn 0.923877 0.382690 -0.000000 +vn 0.985872 0.167498 0.000000 +vn 0.960917 0.276836 0.000000 +vn 0.960917 0.276836 -0.000000 +vn 0.985872 0.167498 0.000000 +vn 0.998427 0.056075 0.000000 +vn 0.998427 0.056075 -0.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.997859 -0.065410 0.000000 +vn 0.997859 -0.065410 0.000000 +vn 0.946926 -0.321452 0.000000 +vn 0.980788 -0.195075 0.000000 +vn 0.980788 -0.195075 0.000000 +vn 0.946926 -0.321452 0.000000 +vn 0.831466 -0.555576 0.000000 +vn 0.896879 -0.442276 0.000000 +vn 0.896879 -0.442276 0.000000 +vn 0.831466 -0.555576 0.000000 +vn 0.751832 -0.659355 0.000000 +vn 0.751832 -0.659355 0.000000 +vn 0.659355 -0.751832 0.000000 +vn 0.659355 -0.751832 0.000000 +vn 0.442276 -0.896879 0.000000 +vn 0.555576 -0.831466 0.000000 +vn 0.555576 -0.831466 0.000000 +vn 0.442276 -0.896879 0.000000 +vn 0.321452 -0.946926 0.000000 +vn 0.321452 -0.946926 0.000000 +vn 0.195075 -0.980788 0.000000 +vn 0.195075 -0.980788 0.000000 +vn 0.065410 -0.997859 0.000000 +vn 0.065410 -0.997859 0.000000 +vn 1.000000 0.000000 0.000000 +vn 1.000000 0.000000 -0.000000 +vn 0.065410 0.997859 -0.000000 +vn 0.195075 0.980788 -0.000000 +vn 0.065410 0.997859 -0.000000 +vn 0.195075 0.980788 -0.000000 +vn 0.321452 0.946926 -0.000000 +vn 0.321452 0.946926 0.000000 +vn 0.442276 0.896879 -0.000000 +vn 0.442276 0.896879 0.000000 +vn 0.659355 0.751832 -0.000000 +vn 0.555576 0.831466 -0.000000 +vn 0.555576 0.831466 0.000000 +vn 0.659355 0.751832 -0.000000 +vn 0.751832 0.659355 -0.000000 +vn 0.751832 0.659355 0.000000 +vn 0.831466 0.555576 -0.000000 +vn 0.831466 0.555576 0.000000 +vn 0.896879 0.442276 -0.000000 +vn 0.896879 0.442276 0.000000 +vn 0.946926 0.321452 -0.000000 +vn 0.946926 0.321452 0.000000 +vn 0.980788 0.195075 -0.000000 +vn 0.980788 0.195075 0.000000 +vn 0.997859 0.065410 -0.000000 +vn 0.997859 0.065410 0.000000 +vn -0.000000 1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn -0.997859 0.065410 0.000000 +vn -0.997859 0.065410 0.000000 +vn -0.946926 0.321452 0.000000 +vn -0.980788 0.195075 0.000000 +vn -0.980788 0.195075 0.000000 +vn -0.946926 0.321452 0.000000 +vn -0.831466 0.555576 0.000000 +vn -0.896879 0.442276 0.000000 +vn -0.896879 0.442276 0.000000 +vn -0.831466 0.555576 0.000000 +vn -0.751832 0.659355 0.000000 +vn -0.751832 0.659355 0.000000 +vn -0.659355 0.751832 0.000000 +vn -0.659355 0.751832 0.000000 +vn -0.555576 0.831466 0.000000 +vn -0.555576 0.831466 0.000000 +vn -0.442276 0.896879 0.000000 +vn -0.442276 0.896879 0.000000 +vn -0.321452 0.946926 0.000000 +vn -0.321452 0.946926 0.000000 +vn -0.195075 0.980788 0.000000 +vn -0.195075 0.980788 0.000000 +vn -0.065410 0.997859 0.000000 +vn -0.065410 0.997859 0.000000 +vn -1.000000 -0.000000 -0.000000 +vn -1.000000 0.000000 0.000000 +vn -0.065410 -0.997859 0.000000 +vn -0.065410 -0.997859 0.000000 +vn -0.321452 -0.946926 0.000000 +vn -0.195075 -0.980788 0.000000 +vn -0.195075 -0.980788 0.000000 +vn -0.321452 -0.946926 0.000000 +vn -0.555576 -0.831466 0.000000 +vn -0.442276 -0.896879 0.000000 +vn -0.442276 -0.896879 0.000000 +vn -0.555576 -0.831466 0.000000 +vn -0.659355 -0.751832 0.000000 +vn -0.659355 -0.751832 0.000000 +vn -0.751832 -0.659355 0.000000 +vn -0.751832 -0.659355 0.000000 +vn -0.896879 -0.442276 0.000000 +vn -0.831466 -0.555576 0.000000 +vn -0.831466 -0.555576 0.000000 +vn -0.896879 -0.442276 0.000000 +vn -0.946926 -0.321452 0.000000 +vn -0.946926 -0.321452 0.000000 +vn -0.980788 -0.195075 0.000000 +vn -0.980788 -0.195075 0.000000 +vn -0.997859 -0.065410 0.000000 +vn -0.997859 -0.065410 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.998427 -0.056075 0.000000 +vn 0.998427 -0.056075 0.000000 +vn 0.985872 -0.167498 0.000000 +vn 0.985872 -0.167498 0.000000 +vn 0.960917 -0.276836 0.000000 +vn 0.960917 -0.276836 0.000000 +vn 0.923877 -0.382690 0.000000 +vn 0.923877 -0.382690 0.000000 +vn 0.815556 -0.578678 0.000000 +vn 0.875227 -0.483712 0.000000 +vn 0.875227 -0.483712 0.000000 +vn 0.815556 -0.578678 0.000000 +vn 0.745645 -0.666343 0.000000 +vn 0.745645 -0.666343 0.000000 +vn 0.666343 -0.745645 0.000000 +vn 0.666343 -0.745645 0.000000 +vn 0.578678 -0.815556 0.000000 +vn 0.578678 -0.815556 0.000000 +vn 0.483712 -0.875227 0.000000 +vn 0.483712 -0.875227 0.000000 +vn 0.382690 -0.923877 0.000000 +vn 0.276836 -0.960917 0.000000 +vn 0.382690 -0.923877 0.000000 +vn 0.276836 -0.960917 0.000000 +vn 0.167498 -0.985872 0.000000 +vn 0.167498 -0.985872 0.000000 +vn 0.056075 -0.998427 0.000000 +vn 0.056075 -0.998427 0.000000 +vn -0.056075 -0.998427 0.000000 +vn -0.056075 -0.998427 0.000000 +vn -0.167498 -0.985872 0.000000 +vn -0.167498 -0.985872 0.000000 +vn -0.276836 -0.960917 0.000000 +vn -0.382690 -0.923877 -0.000000 +vn -0.276836 -0.960917 0.000000 +vn -0.382690 -0.923877 0.000000 +vn -0.483712 -0.875227 -0.000000 +vn -0.483712 -0.875227 0.000000 +vn -0.666343 -0.745645 -0.000000 +vn -0.578678 -0.815556 0.000000 +vn -0.578678 -0.815556 0.000000 +vn -0.666343 -0.745645 0.000000 +vn -0.815556 -0.578678 -0.000000 +vn -0.745645 -0.666343 0.000000 +vn -0.745645 -0.666343 0.000000 +vn -0.875227 -0.483712 -0.000000 +vn -0.815556 -0.578678 0.000000 +vn -0.875227 -0.483712 0.000000 +vn -0.923877 -0.382690 0.000000 +vn -0.923877 -0.382690 0.000000 +vn -0.985872 -0.167498 -0.000000 +vn -0.960917 -0.276836 0.000000 +vn -0.960917 -0.276836 0.000000 +vn -0.985872 -0.167498 0.000000 +vn -0.998427 -0.056075 0.000000 +vn -0.998427 -0.056075 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.996194 -0.087165 0.000000 +vn 0.996194 -0.087165 0.000000 +vn 0.965918 -0.258847 0.000000 +vn 0.965918 -0.258847 0.000000 +vn 0.819136 -0.573599 0.000000 +vn 0.906320 -0.422593 0.000000 +vn 0.906320 -0.422593 0.000000 +vn 0.819136 -0.573599 0.000000 +vn 0.707107 -0.707107 0.000000 +vn 0.707107 -0.707107 0.000000 +vn 0.573599 -0.819136 0.000000 +vn 0.573599 -0.819136 0.000000 +vn 0.422593 -0.906320 0.000000 +vn 0.422593 -0.906320 0.000000 +vn 0.258847 -0.965918 0.000000 +vn 0.258847 -0.965918 0.000000 +vn 0.087165 -0.996194 0.000000 +vn 0.087165 -0.996194 0.000000 +vn -0.087165 -0.996194 0.000000 +vn -0.087165 -0.996194 0.000000 +vn -0.258847 -0.965918 0.000000 +vn -0.258847 -0.965918 0.000000 +vn -0.422593 -0.906320 0.000000 +vn -0.422593 -0.906320 0.000000 +vn -0.573599 -0.819136 0.000000 +vn -0.573599 -0.819136 0.000000 +vn -0.707107 -0.707107 0.000000 +vn -0.707107 -0.707107 0.000000 +vn -0.819136 -0.573599 0.000000 +vn -0.819136 -0.573599 0.000000 +vn -0.906320 -0.422593 0.000000 +vn -0.906320 -0.422593 0.000000 +vn -0.965918 -0.258847 0.000000 +vn -0.965918 -0.258847 0.000000 +vn -0.996194 -0.087165 0.000000 +vn -0.996194 -0.087165 0.000000 +vn 0.996190 -0.087212 0.000000 +vn 0.996190 -0.087212 0.000000 +vn 0.965925 -0.258823 0.000000 +vn 0.906302 -0.422631 0.000000 +vn 0.965925 -0.258823 0.000000 +vn 0.906302 -0.422631 0.000000 +vn 0.819202 -0.573505 0.000000 +vn 0.819202 -0.573505 0.000000 +vn 0.707107 -0.707107 0.000000 +vn 0.573599 -0.819136 0.000000 +vn 0.707107 -0.707107 0.000000 +vn 0.573599 -0.819136 0.000000 +vn 0.422516 -0.906355 0.000000 +vn 0.422516 -0.906355 0.000000 +vn 0.258823 -0.965925 0.000000 +vn 0.258823 -0.965925 0.000000 +vn 0.087200 -0.996191 0.000000 +vn 0.087200 -0.996191 0.000000 +vn -0.087212 -0.996190 0.000000 +vn -0.087212 -0.996190 0.000000 +vn -0.258823 -0.965925 0.000000 +vn -0.422518 -0.906354 -0.000000 +vn -0.258823 -0.965925 0.000000 +vn -0.422518 -0.906354 0.000000 +vn -0.573597 -0.819138 0.000000 +vn -0.573597 -0.819138 0.000000 +vn -0.707107 -0.707107 0.000000 +vn -0.707107 -0.707107 0.000000 +vn -0.819138 -0.573597 0.000000 +vn -0.819138 -0.573597 0.000000 +vn -0.906354 -0.422518 0.000000 +vn -0.906354 -0.422518 0.000000 +vn -0.965925 -0.258823 0.000000 +vn -0.965925 -0.258823 0.000000 +vn -0.996190 -0.087212 0.000000 +vn -0.996190 -0.087212 0.000000 +vn 0.996190 -0.087212 0.000000 +vn 0.996190 -0.087212 0.000000 +vn 0.965925 -0.258823 0.000000 +vn 0.906354 -0.422518 0.000000 +vn 0.965925 -0.258823 0.000000 +vn 0.906354 -0.422518 0.000000 +vn 0.819138 -0.573597 0.000000 +vn 0.819138 -0.573597 0.000000 +vn 0.707107 -0.707107 0.000000 +vn 0.573597 -0.819138 0.000000 +vn 0.707107 -0.707107 0.000000 +vn 0.573597 -0.819138 0.000000 +vn 0.422518 -0.906354 0.000000 +vn 0.422518 -0.906354 0.000000 +vn 0.258823 -0.965925 0.000000 +vn 0.258823 -0.965925 0.000000 +vn 0.087212 -0.996190 0.000000 +vn 0.087212 -0.996190 0.000000 +vn -0.087200 -0.996191 0.000000 +vn -0.087200 -0.996191 0.000000 +vn -0.258823 -0.965925 0.000000 +vn -0.422516 -0.906355 -0.000000 +vn -0.258823 -0.965925 0.000000 +vn -0.422516 -0.906355 0.000000 +vn -0.573599 -0.819136 0.000000 +vn -0.573599 -0.819136 0.000000 +vn -0.707107 -0.707107 0.000000 +vn -0.707107 -0.707107 0.000000 +vn -0.819202 -0.573505 0.000000 +vn -0.819202 -0.573505 0.000000 +vn -0.906302 -0.422631 0.000000 +vn -0.906302 -0.422631 0.000000 +vn -0.965925 -0.258823 0.000000 +vn -0.965925 -0.258823 0.000000 +vn -0.996190 -0.087212 0.000000 +vn -0.996190 -0.087212 0.000000 +vn 0.996191 -0.087200 0.000000 +vn 0.996191 -0.087200 0.000000 +vn 0.965925 -0.258823 0.000000 +vn 0.906355 -0.422516 0.000000 +vn 0.965925 -0.258823 0.000000 +vn 0.906355 -0.422516 0.000000 +vn 0.819136 -0.573599 0.000000 +vn 0.819136 -0.573599 0.000000 +vn 0.707107 -0.707107 0.000000 +vn 0.573505 -0.819202 0.000000 +vn 0.707107 -0.707107 0.000000 +vn 0.573505 -0.819202 0.000000 +vn 0.422631 -0.906302 0.000000 +vn 0.422631 -0.906302 0.000000 +vn 0.258823 -0.965925 0.000000 +vn 0.258823 -0.965925 0.000000 +vn 0.087212 -0.996190 0.000000 +vn 0.087212 -0.996190 0.000000 +vn -0.087200 -0.996191 0.000000 +vn -0.087200 -0.996191 0.000000 +vn -0.258823 -0.965925 0.000000 +vn -0.422628 -0.906303 -0.000000 +vn -0.258823 -0.965925 0.000000 +vn -0.422628 -0.906303 0.000000 +vn -0.573507 -0.819200 0.000000 +vn -0.573507 -0.819200 0.000000 +vn -0.707107 -0.707107 0.000000 +vn -0.707107 -0.707107 0.000000 +vn -0.819200 -0.573507 0.000000 +vn -0.819200 -0.573507 0.000000 +vn -0.906303 -0.422628 0.000000 +vn -0.906303 -0.422628 0.000000 +vn -0.965925 -0.258823 0.000000 +vn -0.965925 -0.258823 0.000000 +vn -0.996191 -0.087200 0.000000 +vn -0.996191 -0.087200 0.000000 +vn 0.996191 -0.087200 0.000000 +vn 0.996191 -0.087200 0.000000 +vn 0.965925 -0.258823 0.000000 +vn 0.906303 -0.422628 0.000000 +vn 0.965925 -0.258823 0.000000 +vn 0.906303 -0.422628 0.000000 +vn 0.819200 -0.573507 0.000000 +vn 0.819200 -0.573507 0.000000 +vn 0.707107 -0.707107 0.000000 +vn 0.573507 -0.819200 0.000000 +vn 0.707107 -0.707107 0.000000 +vn 0.573507 -0.819200 0.000000 +vn 0.422628 -0.906303 0.000000 +vn 0.422628 -0.906303 0.000000 +vn 0.258823 -0.965925 0.000000 +vn 0.258823 -0.965925 0.000000 +vn 0.087200 -0.996191 0.000000 +vn 0.087200 -0.996191 0.000000 +vn -0.087212 -0.996190 0.000000 +vn -0.087212 -0.996190 0.000000 +vn -0.258823 -0.965925 0.000000 +vn -0.422631 -0.906302 -0.000000 +vn -0.258823 -0.965925 0.000000 +vn -0.422631 -0.906302 0.000000 +vn -0.573505 -0.819202 0.000000 +vn -0.573505 -0.819202 0.000000 +vn -0.707107 -0.707107 0.000000 +vn -0.707107 -0.707107 0.000000 +vn -0.819136 -0.573599 0.000000 +vn -0.819136 -0.573599 0.000000 +vn -0.906355 -0.422516 0.000000 +vn -0.906355 -0.422516 0.000000 +vn -0.965925 -0.258823 0.000000 +vn -0.965925 -0.258823 0.000000 +vn -0.996191 -0.087200 0.000000 +vn -0.996191 -0.087200 0.000000 +f 1//1 2//1 3//1 +f 3//2 2//2 4//2 +f 4//3 5//3 6//3 +f 2//4 5//4 4//4 +f 6//5 7//5 8//5 +f 5//6 7//6 6//6 +f 8//7 9//7 10//7 +f 10//8 9//8 11//8 +f 7//9 9//9 8//9 +f 11//10 12//10 13//10 +f 9//11 12//11 11//11 +f 13//12 14//12 15//12 +f 12//13 14//13 13//13 +f 14//14 16//14 15//14 +f 15//15 17//15 18//15 +f 16//16 17//16 15//16 +f 18//17 19//17 20//17 +f 20//18 19//18 21//18 +f 17//19 19//19 18//19 +f 19//20 22//20 21//20 +f 21//21 23//21 24//21 +f 22//22 23//22 21//22 +f 24//23 25//23 26//23 +f 23//24 25//24 24//24 +f 26//25 27//25 28//25 +f 25//26 27//26 26//26 +f 28//27 29//27 30//27 +f 27//28 29//28 28//28 +f 29//29 31//29 30//29 +f 30//30 31//30 32//30 +f 31//31 33//31 32//31 +f 32//32 33//32 34//32 +f 33//33 35//33 34//33 +f 34//34 35//34 36//34 +f 36//35 35//35 37//35 +f 35//36 38//36 37//36 +f 39//37 40//37 41//37 +f 41//38 40//38 42//38 +f 42//39 43//39 44//39 +f 40//40 43//40 42//40 +f 44//41 45//41 46//41 +f 43//42 45//42 44//42 +f 46//43 47//43 48//43 +f 48//44 47//44 49//44 +f 45//45 47//45 46//45 +f 49//46 50//46 51//46 +f 47//47 50//47 49//47 +f 51//48 52//48 53//48 +f 50//49 52//49 51//49 +f 52//50 54//50 53//50 +f 53//51 55//51 56//51 +f 54//52 55//52 53//52 +f 56//53 57//53 58//53 +f 58//54 57//54 59//54 +f 55//55 57//55 56//55 +f 57//56 60//56 59//56 +f 59//57 61//57 62//57 +f 60//58 61//58 59//58 +f 62//59 63//59 64//59 +f 61//60 63//60 62//60 +f 64//61 65//61 66//61 +f 63//62 65//62 64//62 +f 66//63 67//63 68//63 +f 65//64 67//64 66//64 +f 67//65 69//65 68//65 +f 68//66 69//66 70//66 +f 69//67 71//67 70//67 +f 70//68 71//68 72//68 +f 71//69 73//69 72//69 +f 72//70 73//70 74//70 +f 74//71 73//71 75//71 +f 73//72 76//72 75//72 +f 77//73 78//73 79//73 +f 79//74 78//74 80//74 +f 80//75 81//75 82//75 +f 78//76 81//76 80//76 +f 82//77 83//77 84//77 +f 81//78 83//78 82//78 +f 84//79 85//79 86//79 +f 86//80 85//80 87//80 +f 83//81 85//81 84//81 +f 87//82 88//82 89//82 +f 85//83 88//83 87//83 +f 89//84 90//84 91//84 +f 88//85 90//85 89//85 +f 90//86 92//86 91//86 +f 91//87 93//87 94//87 +f 92//88 93//88 91//88 +f 94//89 95//89 96//89 +f 96//90 95//90 97//90 +f 93//91 95//91 94//91 +f 95//92 98//92 97//92 +f 97//93 99//93 100//93 +f 98//94 99//94 97//94 +f 100//95 101//95 102//95 +f 99//96 101//96 100//96 +f 102//97 103//97 104//97 +f 101//98 103//98 102//98 +f 104//99 105//99 106//99 +f 103//100 105//100 104//100 +f 105//101 107//101 106//101 +f 106//102 107//102 108//102 +f 107//103 109//103 108//103 +f 108//104 109//104 110//104 +f 109//105 111//105 110//105 +f 110//106 111//106 112//106 +f 112//107 111//107 113//107 +f 111//108 114//108 113//108 +f 115//109 116//109 117//109 +f 117//110 116//110 118//110 +f 118//111 119//111 120//111 +f 116//112 119//112 118//112 +f 120//113 121//113 122//113 +f 119//114 121//114 120//114 +f 122//115 123//115 124//115 +f 124//116 123//116 125//116 +f 121//117 123//117 122//117 +f 125//118 126//118 127//118 +f 123//119 126//119 125//119 +f 127//120 128//120 129//120 +f 126//121 128//121 127//121 +f 128//122 130//122 129//122 +f 129//123 131//123 132//123 +f 130//124 131//124 129//124 +f 132//125 133//125 134//125 +f 134//126 133//126 135//126 +f 131//127 133//127 132//127 +f 133//128 136//128 135//128 +f 135//129 137//129 138//129 +f 136//130 137//130 135//130 +f 138//131 139//131 140//131 +f 137//132 139//132 138//132 +f 140//133 141//133 142//133 +f 139//134 141//134 140//134 +f 142//135 143//135 144//135 +f 141//136 143//136 142//136 +f 143//137 145//137 144//137 +f 144//138 145//138 146//138 +f 145//139 147//139 146//139 +f 146//140 147//140 148//140 +f 147//141 149//141 148//141 +f 148//142 149//142 150//142 +f 150//143 149//143 151//143 +f 149//144 152//144 151//144 +f 153//145 154//145 155//145 +f 155//146 154//146 156//146 +f 156//147 157//147 158//147 +f 154//148 157//148 156//148 +f 158//149 159//149 160//149 +f 157//150 159//150 158//150 +f 160//151 161//151 162//151 +f 159//152 161//152 160//152 +f 162//153 163//153 164//153 +f 161//154 163//154 162//154 +f 165//155 166//155 167//155 +f 164//156 166//156 165//156 +f 163//157 166//157 164//157 +f 166//158 168//158 167//158 +f 167//159 169//159 170//159 +f 168//160 169//160 167//160 +f 170//161 171//161 172//161 +f 169//162 171//162 170//162 +f 172//163 173//163 174//163 +f 171//164 173//164 172//164 +f 174//165 175//165 176//165 +f 173//166 175//166 174//166 +f 176//167 177//167 178//167 +f 175//168 177//168 176//168 +f 178//169 179//169 180//169 +f 177//170 179//170 178//170 +f 180//171 181//171 182//171 +f 179//172 181//172 180//172 +f 181//173 183//173 182//173 +f 182//174 183//174 184//174 +f 183//175 185//175 184//175 +f 186//176 185//176 187//176 +f 184//177 185//177 186//177 +f 185//178 188//178 187//178 +f 188//179 189//179 187//179 +f 187//180 189//180 190//180 +f 191//181 192//181 193//181 +f 193//182 192//182 194//182 +f 194//183 195//183 196//183 +f 192//184 195//184 194//184 +f 196//185 197//185 198//185 +f 195//186 197//186 196//186 +f 198//187 199//187 200//187 +f 197//188 199//188 198//188 +f 201//189 202//189 203//189 +f 200//190 202//190 201//190 +f 199//191 202//191 200//191 +f 202//192 204//192 203//192 +f 203//193 205//193 206//193 +f 204//194 205//194 203//194 +f 206//195 207//195 208//195 +f 205//196 207//196 206//196 +f 208//197 209//197 210//197 +f 207//198 209//198 208//198 +f 209//199 211//199 210//199 +f 210//200 211//200 212//200 +f 211//201 213//201 212//201 +f 214//202 213//202 215//202 +f 212//203 213//203 214//203 +f 213//204 216//204 215//204 +f 216//205 217//205 215//205 +f 215//206 217//206 218//206 +f 217//207 219//207 218//207 +f 218//208 219//208 220//208 +f 219//209 221//209 220//209 +f 220//210 221//210 222//210 +f 221//211 223//211 222//211 +f 222//212 223//212 224//212 +f 223//213 225//213 224//213 +f 226//214 225//214 227//214 +f 224//215 225//215 226//215 +f 225//216 228//216 227//216 +f 227//217 228//217 229//217 +f 228//218 230//218 229//218 +f 231//219 232//219 233//219 +f 229//220 232//220 231//220 +f 230//221 232//221 229//221 +f 232//222 234//222 233//222 +f 235//223 236//223 237//223 +f 233//224 236//224 235//224 +f 234//225 236//225 233//225 +f 237//226 238//226 239//226 +f 236//227 238//227 237//227 +f 238//228 240//228 239//228 +f 239//229 241//229 242//229 +f 240//230 241//230 239//230 +f 243//231 244//231 245//231 +f 242//232 244//232 243//232 +f 241//233 244//233 242//233 +f 244//234 246//234 245//234 +f 245//235 247//235 248//235 +f 246//236 247//236 245//236 +f 67//237 65//237 249//237 +f 249//238 69//238 67//238 +f 65//239 63//239 249//239 +f 250//240 71//240 249//240 +f 249//241 71//241 69//241 +f 249//242 61//242 251//242 +f 63//243 61//243 249//243 +f 250//244 73//244 71//244 +f 61//245 60//245 251//245 +f 250//246 76//246 73//246 +f 60//247 57//247 251//247 +f 252//248 253//248 250//248 +f 250//249 253//249 76//249 +f 251//250 55//250 254//250 +f 57//251 55//251 251//251 +f 252//252 255//252 253//252 +f 55//253 54//253 254//253 +f 252//254 256//254 255//254 +f 54//255 52//255 254//255 +f 252//256 257//256 256//256 +f 258//257 257//257 252//257 +f 52//258 50//258 254//258 +f 254//259 50//259 259//259 +f 258//260 260//260 257//260 +f 50//261 47//261 259//261 +f 261//262 234//262 262//262 +f 262//263 234//263 263//263 +f 263//264 234//264 264//264 +f 264//265 234//265 265//265 +f 265//266 234//266 266//266 +f 266//267 232//267 267//267 +f 267//268 232//268 39//268 +f 234//269 232//269 266//269 +f 39//270 232//270 40//270 +f 40//271 232//271 43//271 +f 43//272 232//272 45//272 +f 45//273 232//273 47//273 +f 260//274 236//274 268//274 +f 268//275 236//275 269//275 +f 269//276 236//276 270//276 +f 270//277 236//277 271//277 +f 271//278 236//278 272//278 +f 272//279 236//279 261//279 +f 261//280 236//280 234//280 +f 232//281 230//281 47//281 +f 259//282 230//282 273//282 +f 47//283 230//283 259//283 +f 258//284 238//284 260//284 +f 274//285 238//285 258//285 +f 260//286 238//286 236//286 +f 230//287 228//287 273//287 +f 273//288 228//288 275//288 +f 275//289 228//289 276//289 +f 277//290 240//290 278//290 +f 278//291 240//291 274//291 +f 274//292 240//292 238//292 +f 228//293 225//293 276//293 +f 277//294 241//294 240//294 +f 225//295 223//295 276//295 +f 277//296 244//296 241//296 +f 223//297 221//297 276//297 +f 277//298 246//298 244//298 +f 221//299 219//299 276//299 +f 277//300 247//300 246//300 +f 279//301 280//301 281//301 +f 247//302 280//302 279//302 +f 277//303 280//303 247//303 +f 217//304 282//304 219//304 +f 216//305 282//305 217//305 +f 219//306 282//306 276//306 +f 216//307 213//307 282//307 +f 280//308 283//308 281//308 +f 282//309 211//309 284//309 +f 284//310 211//310 285//310 +f 213//311 211//311 282//311 +f 286//312 287//312 288//312 +f 288//313 287//313 280//313 +f 280//314 287//314 283//314 +f 211//315 209//315 285//315 +f 285//316 209//316 289//316 +f 290//317 291//317 286//317 +f 286//318 291//318 287//318 +f 292//319 105//319 290//319 +f 290//320 103//320 291//320 +f 291//321 103//321 293//321 +f 105//322 103//322 290//322 +f 209//323 29//323 289//323 +f 207//324 29//324 209//324 +f 29//325 27//325 289//325 +f 289//326 27//326 294//326 +f 292//327 107//327 105//327 +f 103//328 101//328 293//328 +f 207//329 31//329 29//329 +f 27//330 25//330 294//330 +f 292//331 109//331 107//331 +f 101//332 99//332 293//332 +f 207//333 33//333 31//333 +f 25//334 23//334 294//334 +f 295//335 111//335 292//335 +f 292//336 111//336 109//336 +f 99//337 98//337 293//337 +f 207//338 35//338 33//338 +f 294//339 22//339 296//339 +f 23//340 22//340 294//340 +f 295//341 114//341 111//341 +f 98//342 95//342 293//342 +f 207//343 38//343 35//343 +f 22//344 19//344 296//344 +f 295//345 297//345 114//345 +f 95//346 93//346 293//346 +f 207//347 298//347 38//347 +f 19//348 17//348 296//348 +f 93//349 92//349 293//349 +f 295//350 299//350 297//350 +f 207//351 300//351 298//351 +f 17//352 16//352 296//352 +f 12//353 301//353 14//353 +f 14//354 301//354 16//354 +f 16//355 301//355 296//355 +f 300//356 205//356 302//356 +f 302//357 205//357 303//357 +f 207//358 205//358 300//358 +f 88//359 304//359 90//359 +f 90//360 304//360 92//360 +f 92//361 304//361 293//361 +f 299//362 305//362 306//362 +f 306//363 305//363 307//363 +f 295//364 305//364 299//364 +f 88//365 85//365 304//365 +f 305//366 308//366 307//366 +f 205//367 309//367 303//367 +f 12//368 9//368 301//368 +f 85//369 83//369 304//369 +f 305//370 310//370 308//370 +f 205//371 311//371 309//371 +f 9//372 7//372 301//372 +f 305//373 312//373 310//373 +f 83//374 81//374 304//374 +f 205//375 313//375 311//375 +f 7//376 5//376 301//376 +f 5//377 314//377 301//377 +f 1//378 314//378 2//378 +f 2//379 314//379 5//379 +f 315//380 314//380 1//380 +f 312//381 316//381 317//381 +f 317//382 316//382 318//382 +f 318//383 316//383 319//383 +f 305//384 316//384 312//384 +f 205//385 204//385 313//385 +f 313//386 204//386 320//386 +f 320//387 204//387 321//387 +f 321//388 204//388 322//388 +f 322//389 204//389 323//389 +f 323//390 204//390 324//390 +f 324//391 204//391 325//391 +f 77//392 326//392 78//392 +f 78//393 326//393 81//393 +f 81//394 326//394 304//394 +f 327//395 326//395 328//395 +f 328//396 326//396 329//396 +f 329//397 326//397 330//397 +f 330//398 326//398 77//398 +f 315//399 331//399 314//399 +f 332//400 331//400 333//400 +f 333//401 331//401 334//401 +f 334//402 331//402 315//402 +f 316//403 335//403 319//403 +f 319//404 335//404 336//404 +f 336//405 335//405 337//405 +f 337//406 335//406 338//406 +f 204//407 202//407 325//407 +f 327//408 339//408 326//408 +f 202//409 340//409 325//409 +f 332//410 340//410 331//410 +f 325//411 340//411 332//411 +f 335//412 341//412 338//412 +f 327//413 341//413 339//413 +f 338//414 341//414 327//414 +f 202//415 342//415 340//415 +f 199//416 342//416 202//416 +f 339//417 343//417 344//417 +f 341//418 343//418 339//418 +f 199//419 345//419 342//419 +f 343//420 346//420 344//420 +f 199//421 347//421 345//421 +f 197//422 347//422 199//422 +f 346//423 348//423 344//423 +f 344//424 348//424 349//424 +f 197//425 195//425 347//425 +f 348//426 350//426 349//426 +f 348//427 351//427 350//427 +f 195//428 192//428 347//428 +f 192//429 191//429 347//429 +f 348//430 352//430 351//430 +f 353//431 143//431 141//431 +f 353//432 145//432 143//432 +f 141//433 139//433 353//433 +f 354//434 147//434 353//434 +f 353//435 147//435 145//435 +f 353//436 137//436 355//436 +f 139//437 137//437 353//437 +f 356//438 357//438 358//438 +f 359//439 357//439 356//439 +f 360//440 357//440 359//440 +f 352//441 357//441 360//441 +f 348//442 357//442 352//442 +f 191//443 361//443 347//443 +f 362//444 361//444 191//444 +f 363//445 361//445 362//445 +f 364//446 361//446 363//446 +f 365//447 361//447 364//447 +f 137//448 136//448 355//448 +f 354//449 149//449 147//449 +f 136//450 133//450 355//450 +f 354//451 152//451 149//451 +f 354//452 366//452 152//452 +f 133//453 131//453 355//453 +f 131//454 130//454 355//454 +f 354//455 367//455 366//455 +f 130//456 128//456 355//456 +f 354//457 368//457 367//457 +f 355//458 126//458 369//458 +f 128//459 126//459 355//459 +f 370//460 371//460 354//460 +f 354//461 371//461 368//461 +f 357//462 372//462 358//462 +f 365//463 373//463 361//463 +f 358//464 374//464 370//464 +f 372//465 374//465 358//465 +f 365//466 375//466 373//466 +f 369//467 375//467 365//467 +f 374//468 376//468 370//468 +f 371//469 376//469 377//469 +f 370//470 376//470 371//470 +f 369//471 378//471 375//471 +f 123//472 378//472 126//472 +f 126//473 378//473 369//473 +f 376//474 379//474 377//474 +f 377//475 379//475 380//475 +f 380//476 379//476 381//476 +f 381//477 379//477 382//477 +f 116//478 383//478 119//478 +f 119//479 383//479 121//479 +f 121//480 383//480 123//480 +f 123//481 383//481 378//481 +f 382//482 384//482 385//482 +f 385//483 384//483 386//483 +f 386//484 384//484 387//484 +f 379//485 384//485 382//485 +f 116//486 388//486 383//486 +f 115//487 388//487 116//487 +f 389//488 388//488 390//488 +f 390//489 388//489 115//489 +f 384//490 391//490 387//490 +f 389//491 391//491 388//491 +f 387//492 391//492 392//492 +f 392//493 391//493 393//493 +f 393//494 391//494 394//494 +f 394//495 391//495 395//495 +f 395//496 391//496 389//496 +f 345//497 347//497 396//497 +f 345//498 396//498 397//498 +f 342//499 398//499 399//499 +f 342//500 397//500 398//500 +f 342//501 345//501 397//501 +f 340//502 342//502 399//502 +f 331//503 400//503 401//503 +f 331//504 399//504 400//504 +f 331//505 340//505 399//505 +f 314//506 331//506 401//506 +f 301//507 401//507 402//507 +f 301//508 314//508 401//508 +f 296//509 402//509 403//509 +f 296//510 301//510 402//510 +f 294//511 404//511 405//511 +f 294//512 403//512 404//512 +f 294//513 296//513 403//513 +f 289//514 294//514 405//514 +f 285//515 405//515 406//515 +f 285//516 289//516 405//516 +f 284//517 406//517 407//517 +f 284//518 285//518 406//518 +f 282//519 407//519 408//519 +f 282//520 284//520 407//520 +f 347//521 409//521 396//521 +f 361//522 409//522 347//522 +f 357//523 410//523 411//523 +f 372//524 411//524 412//524 +f 372//525 357//525 411//525 +f 374//526 372//526 412//526 +f 376//527 412//527 413//527 +f 376//528 374//528 412//528 +f 379//529 413//529 414//529 +f 379//530 376//530 413//530 +f 384//531 415//531 416//531 +f 384//532 414//532 415//532 +f 384//533 379//533 414//533 +f 391//534 384//534 416//534 +f 388//535 416//535 417//535 +f 388//536 391//536 416//536 +f 383//537 417//537 418//537 +f 383//538 388//538 417//538 +f 378//539 418//539 419//539 +f 378//540 383//540 418//540 +f 375//541 419//541 420//541 +f 375//542 378//542 419//542 +f 373//543 420//543 421//543 +f 373//544 375//544 420//544 +f 361//545 421//545 409//545 +f 361//546 373//546 421//546 +f 422//547 410//547 348//547 +f 348//548 410//548 357//548 +f 288//549 280//549 423//549 +f 288//550 423//550 424//550 +f 286//551 425//551 426//551 +f 286//552 424//552 425//552 +f 286//553 288//553 424//553 +f 290//554 286//554 426//554 +f 292//555 427//555 428//555 +f 292//556 426//556 427//556 +f 292//557 290//557 426//557 +f 295//558 292//558 428//558 +f 305//559 428//559 429//559 +f 305//560 295//560 428//560 +f 316//561 429//561 430//561 +f 316//562 305//562 429//562 +f 335//563 430//563 431//563 +f 335//564 316//564 430//564 +f 341//565 431//565 432//565 +f 341//566 335//566 431//566 +f 343//567 432//567 433//567 +f 343//568 341//568 432//568 +f 346//569 433//569 434//569 +f 346//570 343//570 433//570 +f 348//571 434//571 422//571 +f 348//572 346//572 434//572 +f 423//573 280//573 435//573 +f 435//574 280//574 277//574 +f 275//575 276//575 436//575 +f 275//576 436//576 437//576 +f 273//577 438//577 439//577 +f 273//578 437//578 438//578 +f 273//579 275//579 437//579 +f 259//580 273//580 439//580 +f 254//581 440//581 441//581 +f 254//582 439//582 440//582 +f 254//583 259//583 439//583 +f 251//584 254//584 441//584 +f 249//585 441//585 442//585 +f 249//586 251//586 441//586 +f 250//587 442//587 443//587 +f 250//588 249//588 442//588 +f 252//589 444//589 445//589 +f 252//590 443//590 444//590 +f 252//591 250//591 443//591 +f 258//592 252//592 445//592 +f 274//593 445//593 446//593 +f 274//594 258//594 445//594 +f 278//595 446//595 447//595 +f 278//596 274//596 446//596 +f 277//597 447//597 435//597 +f 277//598 278//598 447//598 +f 276//599 408//599 436//599 +f 282//600 408//600 276//600 +f 247//601 279//601 248//601 +f 248//602 279//602 448//602 +f 448//603 281//603 449//603 +f 279//604 281//604 448//604 +f 449//605 283//605 450//605 +f 281//606 283//606 449//606 +f 450//607 287//607 451//607 +f 283//608 287//608 450//608 +f 452//609 291//609 453//609 +f 451//610 291//610 452//610 +f 287//611 291//611 451//611 +f 291//612 293//612 453//612 +f 453//613 304//613 454//613 +f 293//614 304//614 453//614 +f 454//615 326//615 455//615 +f 304//616 326//616 454//616 +f 455//617 339//617 456//617 +f 326//618 339//618 455//618 +f 339//619 344//619 456//619 +f 456//620 344//620 457//620 +f 344//621 349//621 457//621 +f 458//622 349//622 459//622 +f 457//623 349//623 458//623 +f 349//624 350//624 459//624 +f 350//625 351//625 459//625 +f 459//626 351//626 460//626 +f 351//627 352//627 460//627 +f 460//628 352//628 461//628 +f 352//629 360//629 461//629 +f 461//630 360//630 462//630 +f 360//631 359//631 462//631 +f 462//632 359//632 463//632 +f 359//633 356//633 463//633 +f 464//634 356//634 465//634 +f 463//635 356//635 464//635 +f 356//636 358//636 465//636 +f 465//637 358//637 466//637 +f 358//638 370//638 466//638 +f 467//639 354//639 468//639 +f 466//640 354//640 467//640 +f 370//641 354//641 466//641 +f 354//642 353//642 468//642 +f 469//643 355//643 470//643 +f 468//644 355//644 469//644 +f 353//645 355//645 468//645 +f 470//646 369//646 471//646 +f 355//647 369//647 470//647 +f 369//648 365//648 471//648 +f 471//649 364//649 472//649 +f 365//650 364//650 471//650 +f 473//651 363//651 474//651 +f 472//652 363//652 473//652 +f 364//653 363//653 472//653 +f 363//654 362//654 474//654 +f 474//655 191//655 193//655 +f 362//656 191//656 474//656 +f 233//657 179//657 231//657 +f 231//658 179//658 229//658 +f 233//659 181//659 179//659 +f 237//660 181//660 235//660 +f 235//661 181//661 233//661 +f 229//662 177//662 227//662 +f 179//663 177//663 229//663 +f 239//664 183//664 237//664 +f 237//665 183//665 181//665 +f 227//666 175//666 226//666 +f 226//667 175//667 224//667 +f 177//668 175//668 227//668 +f 243//669 185//669 242//669 +f 242//670 185//670 239//670 +f 239//671 185//671 183//671 +f 224//672 173//672 222//672 +f 175//673 173//673 224//673 +f 245//674 188//674 243//674 +f 243//675 188//675 185//675 +f 222//676 171//676 220//676 +f 173//677 171//677 222//677 +f 220//678 171//678 218//678 +f 245//679 189//679 188//679 +f 448//680 189//680 248//680 +f 248//681 189//681 245//681 +f 171//682 169//682 218//682 +f 218//683 169//683 215//683 +f 449//684 475//684 448//684 +f 448//685 475//685 189//685 +f 215//686 168//686 214//686 +f 214//687 168//687 212//687 +f 169//688 168//688 215//688 +f 449//689 476//689 475//689 +f 451//690 476//690 450//690 +f 450//691 476//691 449//691 +f 212//692 166//692 210//692 +f 168//693 166//693 212//693 +f 452//694 477//694 451//694 +f 451//695 477//695 476//695 +f 210//696 163//696 208//696 +f 166//697 163//697 210//697 +f 453//698 478//698 452//698 +f 452//699 478//699 477//699 +f 163//700 206//700 208//700 +f 453//701 454//701 478//701 +f 163//702 161//702 206//702 +f 454//703 479//703 478//703 +f 161//704 203//704 206//704 +f 454//705 455//705 479//705 +f 161//706 201//706 203//706 +f 159//707 201//707 161//707 +f 479//708 456//708 480//708 +f 455//709 456//709 479//709 +f 159//710 200//710 201//710 +f 157//711 200//711 159//711 +f 456//712 457//712 480//712 +f 480//713 457//713 481//713 +f 157//714 198//714 200//714 +f 457//715 458//715 481//715 +f 481//716 459//716 482//716 +f 458//717 459//717 481//717 +f 157//718 196//718 198//718 +f 154//719 196//719 157//719 +f 154//720 194//720 196//720 +f 153//721 194//721 154//721 +f 459//722 460//722 482//722 +f 482//723 460//723 483//723 +f 153//724 193//724 194//724 +f 460//725 461//725 483//725 +f 153//726 474//726 193//726 +f 484//727 474//727 153//727 +f 461//728 462//728 483//728 +f 483//729 462//729 485//729 +f 462//730 463//730 485//730 +f 485//731 463//731 486//731 +f 484//732 473//732 474//732 +f 487//733 473//733 484//733 +f 487//734 472//734 473//734 +f 463//735 464//735 486//735 +f 487//736 471//736 472//736 +f 488//737 471//737 487//737 +f 486//738 465//738 489//738 +f 464//739 465//739 486//739 +f 489//740 466//740 490//740 +f 465//741 466//741 489//741 +f 491//742 470//742 488//742 +f 488//743 470//743 471//743 +f 491//744 469//744 470//744 +f 466//745 467//745 490//745 +f 491//746 468//746 469//746 +f 490//747 468//747 491//747 +f 467//748 468//748 490//748 +f 66//749 68//749 442//749 +f 70//750 442//750 68//750 +f 64//751 66//751 442//751 +f 72//752 442//752 70//752 +f 72//753 443//753 442//753 +f 62//754 442//754 441//754 +f 62//755 64//755 442//755 +f 74//756 443//756 72//756 +f 59//757 62//757 441//757 +f 75//758 443//758 74//758 +f 58//759 59//759 441//759 +f 492//760 444//760 443//760 +f 492//761 443//761 75//761 +f 56//762 441//762 440//762 +f 56//763 58//763 441//763 +f 493//764 444//764 492//764 +f 53//765 56//765 440//765 +f 51//766 53//766 440//766 +f 494//767 444//767 493//767 +f 495//768 445//768 444//768 +f 495//769 444//769 494//769 +f 49//770 440//770 439//770 +f 49//771 51//771 440//771 +f 496//772 445//772 495//772 +f 48//773 49//773 439//773 +f 497//774 446//774 445//774 +f 497//775 445//775 496//775 +f 46//776 439//776 438//776 +f 46//777 48//777 439//777 +f 44//778 46//778 438//778 +f 498//779 446//779 497//779 +f 42//780 44//780 438//780 +f 42//781 438//781 437//781 +f 499//782 447//782 446//782 +f 499//783 446//783 498//783 +f 500//784 447//784 499//784 +f 41//785 42//785 437//785 +f 435//786 447//786 500//786 +f 435//787 500//787 501//787 +f 436//788 502//788 41//788 +f 436//789 41//789 437//789 +f 503//790 435//790 501//790 +f 504//791 502//791 436//791 +f 180//792 505//792 506//792 +f 180//793 506//793 507//793 +f 182//794 508//794 505//794 +f 182//795 505//795 180//795 +f 184//796 508//796 182//796 +f 184//797 503//797 508//797 +f 178//798 507//798 504//798 +f 178//799 180//799 507//799 +f 176//800 504//800 436//800 +f 176//801 178//801 504//801 +f 186//802 435//802 503//802 +f 186//803 503//803 184//803 +f 174//804 176//804 436//804 +f 187//805 435//805 186//805 +f 172//806 436//806 408//806 +f 172//807 174//807 436//807 +f 190//808 423//808 435//808 +f 190//809 435//809 187//809 +f 170//810 172//810 408//810 +f 509//811 423//811 190//811 +f 167//812 170//812 408//812 +f 510//813 423//813 509//813 +f 106//814 427//814 426//814 +f 104//815 106//815 426//815 +f 28//816 405//816 404//816 +f 30//817 405//817 28//817 +f 108//818 427//818 106//818 +f 102//819 426//819 425//819 +f 102//820 104//820 426//820 +f 32//821 406//821 405//821 +f 32//822 405//822 30//822 +f 26//823 28//823 404//823 +f 110//824 427//824 108//824 +f 100//825 102//825 425//825 +f 34//826 406//826 32//826 +f 24//827 26//827 404//827 +f 112//828 427//828 110//828 +f 112//829 428//829 427//829 +f 97//830 100//830 425//830 +f 97//831 425//831 424//831 +f 36//832 407//832 406//832 +f 36//833 406//833 34//833 +f 21//834 404//834 403//834 +f 21//835 24//835 404//835 +f 113//836 428//836 112//836 +f 96//837 424//837 423//837 +f 96//838 97//838 424//838 +f 37//839 408//839 407//839 +f 37//840 407//840 36//840 +f 20//841 21//841 403//841 +f 511//842 428//842 113//842 +f 94//843 96//843 423//843 +f 18//844 20//844 403//844 +f 512//845 408//845 37//845 +f 91//846 94//846 423//846 +f 91//847 510//847 513//847 +f 91//848 423//848 510//848 +f 514//849 428//849 511//849 +f 15//850 18//850 403//850 +f 515//851 408//851 512//851 +f 515//852 165//852 167//852 +f 515//853 167//853 408//853 +f 89//854 513//854 516//854 +f 89//855 91//855 513//855 +f 517//856 164//856 165//856 +f 517//857 165//857 515//857 +f 87//858 89//858 516//858 +f 518//859 164//859 517//859 +f 402//860 15//860 403//860 +f 402//861 11//861 13//861 +f 402//862 13//862 15//862 +f 429//863 428//863 514//863 +f 429//864 514//864 519//864 +f 429//865 519//865 520//865 +f 521//866 429//866 520//866 +f 10//867 11//867 402//867 +f 522//868 429//868 521//868 +f 8//869 10//869 402//869 +f 162//870 518//870 523//870 +f 162//871 523//871 524//871 +f 162//872 164//872 518//872 +f 525//873 84//873 86//873 +f 525//874 86//874 87//874 +f 525//875 87//875 516//875 +f 526//876 429//876 522//876 +f 6//877 8//877 402//877 +f 160//878 162//878 524//878 +f 160//879 524//879 527//879 +f 528//880 82//880 84//880 +f 528//881 84//881 525//881 +f 401//882 529//882 3//882 +f 401//883 3//883 4//883 +f 401//884 4//884 6//884 +f 401//885 6//885 402//885 +f 430//886 526//886 530//886 +f 430//887 530//887 531//887 +f 430//888 531//888 532//888 +f 430//889 429//889 526//889 +f 158//890 160//890 527//890 +f 533//891 82//891 528//891 +f 400//892 534//892 535//892 +f 400//893 535//893 536//893 +f 400//894 536//894 529//894 +f 400//895 529//895 401//895 +f 431//896 430//896 532//896 +f 431//897 532//897 537//897 +f 431//898 537//898 538//898 +f 431//899 538//899 539//899 +f 399//900 534//900 400//900 +f 399//901 540//901 541//901 +f 399//902 541//902 534//902 +f 432//903 539//903 542//903 +f 432//904 542//904 543//904 +f 432//905 431//905 539//905 +f 398//906 544//906 545//906 +f 398//907 545//907 540//907 +f 398//908 540//908 399//908 +f 433//909 543//909 546//909 +f 433//910 546//910 547//910 +f 433//911 432//911 543//911 +f 397//912 548//912 544//912 +f 397//913 544//913 398//913 +f 434//914 547//914 79//914 +f 434//915 433//915 547//915 +f 396//916 156//916 158//916 +f 396//917 155//917 156//917 +f 396//918 158//918 527//918 +f 396//919 527//919 549//919 +f 396//920 549//920 548//920 +f 396//921 548//921 397//921 +f 422//922 550//922 551//922 +f 422//923 533//923 550//923 +f 422//924 79//924 80//924 +f 422//925 80//925 82//925 +f 422//926 82//926 533//926 +f 422//927 434//927 79//927 +f 144//928 552//928 553//928 +f 144//929 553//929 142//929 +f 140//930 553//930 554//930 +f 140//931 142//931 553//931 +f 146//932 555//932 552//932 +f 146//933 552//933 144//933 +f 138//934 140//934 554//934 +f 138//935 554//935 556//935 +f 148//936 555//936 146//936 +f 148//937 557//937 555//937 +f 410//938 558//938 557//938 +f 410//939 551//939 558//939 +f 410//940 422//940 551//940 +f 410//941 557//941 148//941 +f 409//942 138//942 556//942 +f 409//943 559//943 155//943 +f 409//944 556//944 559//944 +f 409//945 155//945 396//945 +f 150//946 410//946 148//946 +f 135//947 138//947 409//947 +f 151//948 410//948 150//948 +f 134//949 135//949 409//949 +f 411//950 410//950 151//950 +f 411//951 151//951 560//951 +f 421//952 134//952 409//952 +f 421//953 132//953 134//953 +f 412//954 411//954 560//954 +f 412//955 560//955 561//955 +f 412//956 561//956 562//956 +f 420//957 132//957 421//957 +f 420//958 127//958 129//958 +f 420//959 129//959 132//959 +f 413//960 412//960 562//960 +f 413//961 562//961 563//961 +f 413//962 563//962 564//962 +f 419//963 127//963 420//963 +f 419//964 124//964 125//964 +f 419//965 125//965 127//965 +f 414//966 413//966 564//966 +f 414//967 564//967 565//967 +f 414//968 565//968 566//968 +f 414//969 566//969 567//969 +f 418//970 118//970 120//970 +f 418//971 120//971 122//971 +f 418//972 122//972 124//972 +f 418//973 124//973 419//973 +f 415//974 414//974 567//974 +f 415//975 567//975 568//975 +f 415//976 568//976 569//976 +f 415//977 569//977 570//977 +f 417//978 118//978 418//978 +f 417//979 571//979 572//979 +f 417//980 572//980 117//980 +f 417//981 117//981 118//981 +f 416//982 571//982 417//982 +f 416//983 415//983 570//983 +f 416//984 570//984 573//984 +f 416//985 573//985 574//985 +f 416//986 574//986 575//986 +f 416//987 575//987 576//987 +f 416//988 576//988 571//988 +f 189//989 475//989 190//989 +f 190//990 475//990 509//990 +f 509//991 476//991 510//991 +f 475//992 476//992 509//992 +f 513//993 477//993 516//993 +f 510//994 477//994 513//994 +f 476//995 477//995 510//995 +f 477//996 478//996 516//996 +f 516//997 479//997 525//997 +f 478//998 479//998 516//998 +f 525//999 480//999 528//999 +f 479//1000 480//1000 525//1000 +f 528//1001 481//1001 533//1001 +f 480//1002 481//1002 528//1002 +f 533//1003 482//1003 550//1003 +f 481//1004 482//1004 533//1004 +f 550//1005 483//1005 551//1005 +f 482//1006 483//1006 550//1006 +f 551//1007 485//1007 558//1007 +f 483//1008 485//1008 551//1008 +f 558//1009 486//1009 557//1009 +f 485//1010 486//1010 558//1010 +f 557//1011 489//1011 555//1011 +f 486//1012 489//1012 557//1012 +f 555//1013 490//1013 552//1013 +f 489//1014 490//1014 555//1014 +f 552//1015 491//1015 553//1015 +f 490//1016 491//1016 552//1016 +f 491//1017 488//1017 553//1017 +f 553//1018 488//1018 554//1018 +f 488//1019 487//1019 554//1019 +f 554//1020 487//1020 556//1020 +f 487//1021 484//1021 556//1021 +f 556//1022 484//1022 559//1022 +f 484//1023 153//1023 559//1023 +f 559//1024 153//1024 155//1024 +f 152//1025 366//1025 151//1025 +f 151//1026 366//1026 560//1026 +f 560//1027 367//1027 561//1027 +f 561//1028 367//1028 562//1028 +f 366//1029 367//1029 560//1029 +f 367//1030 368//1030 562//1030 +f 562//1031 371//1031 563//1031 +f 368//1032 371//1032 562//1032 +f 563//1033 377//1033 564//1033 +f 564//1034 377//1034 565//1034 +f 371//1035 377//1035 563//1035 +f 377//1036 380//1036 565//1036 +f 565//1037 381//1037 566//1037 +f 380//1038 381//1038 565//1038 +f 566//1039 382//1039 567//1039 +f 381//1040 382//1040 566//1040 +f 567//1041 385//1041 568//1041 +f 382//1042 385//1042 567//1042 +f 568//1043 386//1043 569//1043 +f 385//1044 386//1044 568//1044 +f 569//1045 387//1045 570//1045 +f 570//1046 387//1046 573//1046 +f 386//1047 387//1047 569//1047 +f 387//1048 392//1048 573//1048 +f 573//1049 393//1049 574//1049 +f 392//1050 393//1050 573//1050 +f 574//1051 394//1051 575//1051 +f 393//1052 394//1052 574//1052 +f 394//1053 395//1053 575//1053 +f 575//1054 395//1054 576//1054 +f 395//1055 389//1055 576//1055 +f 576//1056 389//1056 571//1056 +f 389//1057 390//1057 571//1057 +f 571//1058 390//1058 572//1058 +f 390//1059 115//1059 572//1059 +f 572//1060 115//1060 117//1060 +f 114//1061 297//1061 113//1061 +f 113//1062 297//1062 511//1062 +f 511//1063 299//1063 514//1063 +f 514//1064 299//1064 519//1064 +f 297//1065 299//1065 511//1065 +f 299//1066 306//1066 519//1066 +f 519//1067 307//1067 520//1067 +f 306//1068 307//1068 519//1068 +f 520//1069 308//1069 521//1069 +f 521//1070 308//1070 522//1070 +f 307//1071 308//1071 520//1071 +f 308//1072 310//1072 522//1072 +f 522//1073 312//1073 526//1073 +f 310//1074 312//1074 522//1074 +f 526//1075 317//1075 530//1075 +f 312//1076 317//1076 526//1076 +f 530//1077 318//1077 531//1077 +f 317//1078 318//1078 530//1078 +f 531//1079 319//1079 532//1079 +f 318//1080 319//1080 531//1080 +f 532//1081 336//1081 537//1081 +f 537//1082 336//1082 538//1082 +f 319//1083 336//1083 532//1083 +f 336//1084 337//1084 538//1084 +f 538//1085 338//1085 539//1085 +f 337//1086 338//1086 538//1086 +f 539//1087 327//1087 542//1087 +f 338//1088 327//1088 539//1088 +f 327//1089 328//1089 542//1089 +f 542//1090 328//1090 543//1090 +f 328//1091 329//1091 543//1091 +f 543//1092 329//1092 546//1092 +f 329//1093 330//1093 546//1093 +f 546//1094 330//1094 547//1094 +f 330//1095 77//1095 547//1095 +f 547//1096 77//1096 79//1096 +f 76//1097 253//1097 75//1097 +f 75//1098 253//1098 492//1098 +f 492//1099 255//1099 493//1099 +f 493//1100 255//1100 494//1100 +f 253//1101 255//1101 492//1101 +f 255//1102 256//1102 494//1102 +f 494//1103 257//1103 495//1103 +f 256//1104 257//1104 494//1104 +f 495//1105 260//1105 496//1105 +f 496//1106 260//1106 497//1106 +f 257//1107 260//1107 495//1107 +f 260//1108 268//1108 497//1108 +f 497//1109 269//1109 498//1109 +f 268//1110 269//1110 497//1110 +f 498//1111 270//1111 499//1111 +f 269//1112 270//1112 498//1112 +f 499//1113 271//1113 500//1113 +f 270//1114 271//1114 499//1114 +f 500//1115 272//1115 501//1115 +f 271//1116 272//1116 500//1116 +f 501//1117 261//1117 503//1117 +f 503//1118 261//1118 508//1118 +f 272//1119 261//1119 501//1119 +f 261//1120 262//1120 508//1120 +f 508//1121 263//1121 505//1121 +f 262//1122 263//1122 508//1122 +f 505//1123 264//1123 506//1123 +f 263//1124 264//1124 505//1124 +f 264//1125 265//1125 506//1125 +f 506//1126 265//1126 507//1126 +f 265//1127 266//1127 507//1127 +f 507//1128 266//1128 504//1128 +f 266//1129 267//1129 504//1129 +f 504//1130 267//1130 502//1130 +f 267//1131 39//1131 502//1131 +f 502//1132 39//1132 41//1132 +f 38//1133 298//1133 37//1133 +f 37//1134 298//1134 512//1134 +f 512//1135 300//1135 515//1135 +f 515//1136 300//1136 517//1136 +f 298//1137 300//1137 512//1137 +f 300//1138 302//1138 517//1138 +f 517//1139 303//1139 518//1139 +f 302//1140 303//1140 517//1140 +f 518//1141 309//1141 523//1141 +f 523//1142 309//1142 524//1142 +f 303//1143 309//1143 518//1143 +f 309//1144 311//1144 524//1144 +f 524//1145 313//1145 527//1145 +f 311//1146 313//1146 524//1146 +f 527//1147 320//1147 549//1147 +f 313//1148 320//1148 527//1148 +f 549//1149 321//1149 548//1149 +f 320//1150 321//1150 549//1150 +f 548//1151 322//1151 544//1151 +f 321//1152 322//1152 548//1152 +f 544//1153 323//1153 545//1153 +f 545//1154 323//1154 540//1154 +f 322//1155 323//1155 544//1155 +f 323//1156 324//1156 540//1156 +f 540//1157 325//1157 541//1157 +f 324//1158 325//1158 540//1158 +f 541//1159 332//1159 534//1159 +f 325//1160 332//1160 541//1160 +f 332//1161 333//1161 534//1161 +f 534//1162 333//1162 535//1162 +f 333//1163 334//1163 535//1163 +f 535//1164 334//1164 536//1164 +f 334//1165 315//1165 536//1165 +f 536//1166 315//1166 529//1166 +f 315//1167 1//1167 529//1167 +f 529//1168 1//1168 3//1168 diff --git a/web_p/renderBOPdataset.py b/web_p/renderBOPdataset.py index 56b2ffd..c6834bc 100755 --- a/web_p/renderBOPdataset.py +++ b/web_p/renderBOPdataset.py @@ -6,6 +6,7 @@ import blenderproc as bproc Используется модуль blenderproc 02.05.2024 @shalenikol release 0.1 + 02.07.2024 @shalenikol release 0.2 """ import numpy as np import argparse @@ -13,25 +14,37 @@ import random import os import shutil import json +from pathlib import Path + +import bpy VHACD_PATH = "blenderproc_resources/vhacd" DIR_MODELS = "models" +DIR_MESH = "assets/libs/objects/" #"assets/mesh/" FILE_LOG_SCENE = "res.txt" FILE_RBS_INFO = "rbs_info.json" FILE_GT_COCO = "scene_gt_coco.json" +EXT_MODELS = ".fbx" +TEXTURE_TMPL = "*.jpg" Not_Categories_Name = True # наименование категории в COCO-аннотации отсутствует +def _get_list_texture(rel_path: str) -> list: + # local_path/texture/ + loc = os.path.dirname(os.path.dirname(rnd_par.output_dir)) + path = os.path.join(loc, rel_path) + return list(Path(path).absolute().rglob(TEXTURE_TMPL)) + def _get_path_model(name_model: str) -> str: # TODO on name_model find path for mesh (model.fbx) - # local_path/assets/mesh/ + # local_path/assets/libs/objects # assets/mesh/ loc = os.path.dirname(os.path.dirname(rnd_par.output_dir)) - return os.path.join(loc, "assets/mesh/"+name_model+".fbx") + return os.path.join(loc, DIR_MESH + name_model + EXT_MODELS) def _get_path_object(name_obj: str) -> str: # TODO on name_obj find path for scene object (object.fbx) loc = os.path.dirname(os.path.dirname(rnd_par.output_dir)) - return os.path.join(loc, "assets/mesh/"+name_obj+".fbx") + return os.path.join(loc, DIR_MESH + name_obj + EXT_MODELS) def convert2relative(height, width, bbox): """ @@ -43,11 +56,14 @@ def convert2relative(height, width, bbox): return x/width, y/height, w/width, h/height def render() -> int: + i = 0 for obj in all_meshs: # Make the object actively participate in the physics simulation obj.enable_rigidbody(active=True, collision_shape="COMPOUND") # Also use convex decomposition as collision shapes obj.build_convex_decomposition_collision_shape(VHACD_PATH) + i += 1 + # print(f"{i} : {obj.get_name()}") objs = all_meshs + rnd_par.scene.objs @@ -85,13 +101,26 @@ def render() -> int: # Цикл рендеринга # Do multiple times: Position the shapenet objects using the physics simulator and render X images with random camera poses for r in range(rnd_par.n_series): + print(f"********** Series : {r+1}") + is_texture = True if "texture_path" in rnd_par.models_randomization else False + if is_texture: + val = rnd_par.models_randomization["texture_path"] + l_texture = _get_list_texture(val) + image = bpy.data.images.load(filepath=str(l_texture[r % len(l_texture)])) # один случайный объект в кадре / все заданные объекты - random_obj = random.choice(range(rnd_par.scene.n_obj)) + random_obj = random.choice(range(rnd_par.models.n_item)) meshs = [] - for i,o in enumerate(all_meshs): #objs + for i,o in enumerate(all_meshs): # активные модели if rnd_par.single_object and i != random_obj: continue meshs += [o] + if is_texture: + mats = o.get_materials() + for mat in mats: + # image = bpy.data.images.load(filepath=str(random.choice(l_texture))) + mat.set_principled_shader_value("Base Color", image) + + for i,o in enumerate(rnd_par.scene.objs): # объекты сцены rnd_mat = rnd_par.scene.obj_data[i]["material_randomization"] mats = o.get_materials() #[0] for mat in mats: @@ -99,10 +128,17 @@ def render() -> int: mat.set_principled_shader_value("Specular", random.uniform(val[0], val[1])) val = rnd_mat["roughness"] mat.set_principled_shader_value("Roughness", random.uniform(val[0], val[1])) - val = rnd_mat["base_color"] - mat.set_principled_shader_value("Base Color", np.random.uniform(val[0], val[1])) val = rnd_mat["metallic"] mat.set_principled_shader_value("Metallic", random.uniform(val[0], val[1])) + if "texture_path" in rnd_mat: # путь к текстурам (*.jpg) + val = rnd_mat["texture_path"] + val = _get_list_texture(val) + image = bpy.data.images.load(filepath=str(random.choice(val))) + mat.set_principled_shader_value("Base Color", image) + else: + val = rnd_mat["base_color"] + mat.set_principled_shader_value("Base Color", np.random.uniform(val[0], val[1])) + # mat.set_principled_shader_value("Base Color", image) # Randomly set the color and energy for i,l in enumerate(ls): @@ -225,7 +261,7 @@ def render() -> int: cat["name"] = rnd_par.models.names[i] #obj_names[i] with open(coco_file, "w") as fh: - json.dump(data, fh, indent=0) + json.dump(data, fh, indent=1) def explore(path: str): if not os.path.isdir(path): @@ -331,7 +367,7 @@ if __name__ == "__main__": models_randomization = ds_cfg["models_randomization"] rnd_par = lambda: None - rnd_par.single_object = True + rnd_par.single_object = False # True rnd_par.ds_name = cfg["name"] rnd_par.output_dir = cfg["local_path"] rnd_par.dataset_objs = cfg["dataSetObjects"] @@ -343,6 +379,7 @@ if __name__ == "__main__": rnd_par.center_shell = cam_pos["center_shell"] rnd_par.radius_range = cam_pos["radius_range"] rnd_par.elevation_range = cam_pos["elevation_range"] + rnd_par.models_randomization = models_randomization rnd_par.loc_range_low = models_randomization["loc_range_low"] rnd_par.loc_range_high = models_randomization["loc_range_high"] @@ -353,8 +390,7 @@ if __name__ == "__main__": bproc.init() all_meshs = [] - ret = _get_models(rnd_par, rnd_par.dataset_objs) - if ret <= 0: + if _get_models(rnd_par, rnd_par.dataset_objs) <= 0: print("Error: no models in config") exit(-4) if _get_scene(rnd_par, ds_cfg["scene"]) == 0: diff --git a/web_p/robot_builder/base.dae b/web_p/robot_builder/base.dae new file mode 120000 index 0000000..dd414ea --- /dev/null +++ b/web_p/robot_builder/base.dae @@ -0,0 +1 @@ +/home/idontsudo/robossembler_ws/src/rbs_gripper/meshes/visual/base.dae \ No newline at end of file diff --git a/web_p/robot_builder/ee_link.dae b/web_p/robot_builder/ee_link.dae new file mode 120000 index 0000000..e5119f7 --- /dev/null +++ b/web_p/robot_builder/ee_link.dae @@ -0,0 +1 @@ +/home/idontsudo/robossembler_ws/src/rbs_arm/meshes/visual/ee_link.dae \ No newline at end of file diff --git a/web_p/robot_builder/finger.dae b/web_p/robot_builder/finger.dae new file mode 120000 index 0000000..24fae92 --- /dev/null +++ b/web_p/robot_builder/finger.dae @@ -0,0 +1 @@ +/home/idontsudo/robossembler_ws/src/rbs_gripper/meshes/visual/finger.dae \ No newline at end of file diff --git a/web_p/robot_builder/fork_link.dae b/web_p/robot_builder/fork_link.dae new file mode 120000 index 0000000..e54a645 --- /dev/null +++ b/web_p/robot_builder/fork_link.dae @@ -0,0 +1 @@ +/home/idontsudo/robossembler_ws/src/rbs_arm/meshes/visual/fork_link.dae \ No newline at end of file diff --git a/web_p/robot_builder/main_link.dae b/web_p/robot_builder/main_link.dae new file mode 120000 index 0000000..a6a70d4 --- /dev/null +++ b/web_p/robot_builder/main_link.dae @@ -0,0 +1 @@ +/home/idontsudo/robossembler_ws/src/rbs_arm/meshes/visual/main_link.dae \ No newline at end of file diff --git a/web_p/robot_builder/robot.xml b/web_p/robot_builder/robot.xml new file mode 100644 index 0000000..928451e --- /dev/null +++ b/web_p/robot_builder/robot.xml @@ -0,0 +1,346 @@ +n n n n n n n n n n n n n n n n n n n n n n n n n n n n n 0.8 0.8 0.8 1n 0.6 + 0.6 + 0.6 1n 1.0 1.0 1.0n truen 0 + 0 0 + 1n n n + /base_link_d.png n + /base_link_n.png + n + /base_link_ao.png + n + /base_link_r.png + n n n n n n n n n + n n n n n n n n n n n n n n n n n n n n n n n n n + ign_ros2_control/IgnitionSystemn n n n n n n n n n n n n n n n n n n n n n n n 0.8 0.8 0.8 1n 0.6 + 0.6 + 0.6 1n 1.0 1.0 1.0n truen 0 + 0 0 + 1n n n + /fork_d.png + n + /fork_n.png + n + /fork_ao.png + n + /fork_r.png + n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n + ign_ros2_control/IgnitionSystemn n n n n n n n n n n n n n n n n n n n n n n n 0.8 0.8 0.8 1n 0.6 + 0.6 + 0.6 1n 1.0 1.0 1.0n truen 0 + 0 0 + 1n n n + /main_link_d.png + n + /main_link_n.png + n + /main_link_ao.png + n + /main_link_r.png + n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n + ign_ros2_control/IgnitionSystemn n n n n n n n n n n n n n n n n n n n n n n n 0.8 0.8 0.8 1n 0.6 + 0.6 + 0.6 1n 1.0 1.0 1.0n truen 0 + 0 0 + 1n n n + /fork_d.png + n + /fork_n.png + n + /fork_ao.png + n + /fork_r.png + n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n + ign_ros2_control/IgnitionSystemn n n n n n n n n n n n n n n n n n n n n n n n 0.8 0.8 0.8 1n 0.6 + 0.6 + 0.6 1n 1.0 1.0 1.0n truen 0 + 0 0 + 1n n n + /main_link_d.png + n + /main_link_n.png + n + /main_link_ao.png + n + /main_link_r.png + n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n + ign_ros2_control/IgnitionSystemn n n n n n n n n n n n n n n n n n n n n n n n 0.8 0.8 0.8 1n 0.6 + 0.6 + 0.6 1n 1.0 1.0 1.0n truen 0 + 0 0 + 1n n n + /fork_d.png + n + /fork_n.png + n + /fork_ao.png + n + /fork_r.png + n n n n n n n n n n n n n n n n n + n n n n n n n n n n n n n n n n n n n n n n n + ign_ros2_control/IgnitionSystemn n n n n n n n n n + n n n n n n n n n n n n n + n 0.8 0.8 0.8 1n 0.6 0.6 0.6 1n 1.0 + 1.0 1.0n truen 0 0 0 1n + n n + /ee_link_d.png + n + /ee_link_n.png + n + /ee_link_ao.png + n + /ee_link_r.png + n n n n n n n n n n ign_ros2_control/IgnitionSystemn n + n n n 0.000n n n n n n n n n n 0.000n n n n n n n n n rbs_gripper_r_finger_joint + n 1 n n n n n n n n n n n n n n n n n n n n n n + n n n n n n n n n n n n n n n n n n n n n n + n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n + n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n ign_ros2_control/IgnitionFtsn n n n + n n n n n n n n + truen n true + n + 50n truen ft_datan + n + sensorn child_to_parentn + n n n n n + /home/idontsudo/robossembler_ws/install/rbs_arm/share/rbs_arm/config/rbs_arm0_controllers.yaml + n n n n n n \ No newline at end of file diff --git a/web_p/robot_builder/rotor.dae b/web_p/robot_builder/rotor.dae new file mode 120000 index 0000000..adf4bca --- /dev/null +++ b/web_p/robot_builder/rotor.dae @@ -0,0 +1 @@ +/home/idontsudo/robossembler_ws/src/rbs_gripper/meshes/visual/rotor.dae \ No newline at end of file diff --git a/web_p/robot_builder/start_link.dae b/web_p/robot_builder/start_link.dae new file mode 120000 index 0000000..17dd44e --- /dev/null +++ b/web_p/robot_builder/start_link.dae @@ -0,0 +1 @@ +/home/idontsudo/robossembler_ws/src/rbs_arm/meshes/visual/start_link.dae \ No newline at end of file diff --git a/web_p/train_Dope.py b/web_p/train_Dope.py index aaea238..f9908bc 100644 --- a/web_p/train_Dope.py +++ b/web_p/train_Dope.py @@ -1,20 +1,531 @@ """ - train_Dope + train_Dope Общая задача: оценка позиции объекта (Pose estimation) Реализуемая функция: обучение нейросетевой модели DOPE по заданному BOP-датасету - python3 $PYTHON_EDUCATION --path /Users/idontsudo/webservice/server/build/public/7065d6b6-c8a3-48c5-9679-bb8f3a690296 \ + python3 $PYTHON_EDUCATION --path /Users/user/webservice/server/build/public/7065d6b6-c8a3-48c5-9679-bb8f3a690296 \ --name test1234 --datasetName 32123213 - 25.04.2024 @shalenikol release 0.1 + 08.05.2024 @shalenikol release 0.1 """ import os +import json +import shutil +import numpy as np +import transforms3d as t3d -def train_Dope_i(path:str, wname:str, dname:str, outpath:str, epochs:int): - results = f"torchrun --nproc_per_node=1 train.py --local_rank 0 --data {os.path.join(path,dname)} --object fork" \ - + f" -e {epochs} --batchsize 16 --exts jpg --imagesize 640 --pretrained" \ - + " --net_path /home/shalenikol/fork_work/dope_training/output/weights_2996/net_epoch_47.pth" - print(results) +FILE_RBS_INFO = "rbs_info.json" +FILE_CAMERA = "camera.json" +FILE_GT = "scene_gt.json" +FILE_GT_COCO = "scene_gt_coco.json" +FILE_GT_INFO = "scene_gt_info.json" + +FILE_MODEL = "epoch" +EXT_MODEL = ".pth" +EXT_RGB = "jpg" +DIR_ROOT_DS = "dataset_dope" +DIR_TRAIN_OUT = "out_weights" + +MODEL_SCALE = 1000 # исходная модель в метрах, преобразуем в мм (для DOPE) + +# Own_Numbering_Files = True # наименование image-файлов: собственная нумерация +nn_image = 0 +K_intrinsic = [] +model_info = [] +camera_data = {} +im_width = 0 + +nb_update_network = 0 +# [ +# [min(x), min(y), min(z)], +# [min(x), max(y), min(z)], +# [min(x), max(y), max(z)], +# [min(x), min(y), max(z)], +# [max(x), min(y), max(z)], +# [max(x), max(y), min(z)], +# [max(x), max(y), max(z)], +# [max(x), min(y), max(z)], +# [xc, yc, zc] # min + (max - min) / 2 +# ] + +def trans_3Dto2D_point_in_camera(xyz, K_m, R_m2c, t_m2c): + """ + xyz : 3D-координаты точки + K_m : внутренняя матрица камеры 3х3 + R_m2c : матрица поворота 3х3 + t_m2c : вектор перемещения 3х1 + return [u,v] + """ + K = np.array(K_m) + r = np.array(R_m2c) + r.shape = (3, 3) + t = np.array(t_m2c) + t.shape = (3, 1) + T = np.concatenate((r, t), axis=1) + + P_m = np.array(xyz) + P_m.resize(4) + P_m[-1] = 1.0 + P_m.shape = (4, 1) + + # Project (X, Y, Z, 1) into cameras coordinate system + P_c = T @ P_m # 4x1 + # Apply camera intrinsics to map (Xc, Yc, Zc) to p=(x, y, z) + p = K @ P_c + # Normalize by z to get (u,v,1) + uv = (p / p[2][0])[:-1] + return uv.flatten().tolist() + +def gt_parse(path: str, out_dir: str): + global nn_image + with open(os.path.join(path, FILE_GT_COCO), "r") as fh: + coco_data = json.load(fh) + with open(os.path.join(path, FILE_GT), "r") as fh: + gt_data = json.load(fh) + with open(os.path.join(path, FILE_GT_INFO), "r") as fh: + gt_info = json.load(fh) + + for img in coco_data["images"]: + rgb_file = os.path.join(path, img["file_name"]) + if os.path.isfile(rgb_file): + # if Own_Numbering_Files: + ext = os.path.splitext(rgb_file)[1] # only ext + f = f"{nn_image:06}" + out_img = os.path.join(out_dir, f + ext) + # else: + # f = os.path.split(rgb_file)[1] # filename with extension + # f = os.path.splitext(f)[0] # only filename + # out_img = out_dir + shutil.copy2(rgb_file, out_img) + out_file = os.path.join(out_dir,f+".json") + nn_image += 1 + + # full annotation of the one image + all_data = camera_data.copy() + cat_names = {obj["id"]: obj["name"] for obj in coco_data["categories"]} + id_img = img["id"] # 0, 1, 2 ... + sid_img = str(id_img) # "0", "1", "2" ... + img_info = gt_info[sid_img] + img_gt = gt_data[sid_img] + img_idx = 0 # object index on the image + objs = [] + for ann in coco_data["annotations"]: + if ann["image_id"] == id_img: + item = ann["category_id"] + obj_data = {} + obj_data["class"] = cat_names[item] + x, y, width, height = ann["bbox"] + obj_data["bounding_box"] = {"top_left":[x,y], "bottom_right":[x+width,y+height]} + + # visibility from FILE_GT_INFO + item_info = img_info[img_idx] + obj_data["visibility"] = item_info["visib_fract"] + + # location from FILE_GT + item_gt = img_gt[img_idx] + obj_id = item_gt["obj_id"] - 1 # index with 0 + cam_R_m2c = item_gt["cam_R_m2c"] + cam_t_m2c = item_gt["cam_t_m2c"] + obj_data["location"] = cam_t_m2c + q = t3d.quaternions.mat2quat(np.array(cam_R_m2c)) + obj_data["quaternion_xyzw"] = [q[1], q[2], q[3], q[0]] + + cuboid_xyz = model_info[obj_id] + obj_data["projected_cuboid"] = [ + trans_3Dto2D_point_in_camera(cub, K_intrinsic, cam_R_m2c, cam_t_m2c) + for cub in cuboid_xyz + ] + + objs.append(obj_data) + img_idx += 1 + + all_data["objects"] = objs + with open(out_file, "w") as fh: + json.dump(all_data, fh, indent=2) + +def explore(path: str, res_dir: str): + if not os.path.isdir(path): + return + folders = [ + os.path.join(path, o) + for o in os.listdir(path) + if os.path.isdir(os.path.join(path, o)) + ] + for path_entry in folders: + if os.path.isfile(os.path.join(path_entry,FILE_GT_COCO)) and \ + os.path.isfile(os.path.join(path_entry,FILE_GT_INFO)) and \ + os.path.isfile(os.path.join(path_entry,FILE_GT)): + gt_parse(path_entry, res_dir) + else: + explore(path_entry, res_dir) + +def BOP2DOPE_dataset(dpath: str, out_dir: str) -> str: + """ Convert BOP-dataset to YOLO format for train """ + res_dir = os.path.join(out_dir, DIR_ROOT_DS) + if os.path.isdir(res_dir): + shutil.rmtree(res_dir) + os.mkdir(res_dir) + + explore(dpath, res_dir) + + return out_dir + +def train(dopepath:str, wname:str, epochs:int, pretrain: bool, lname: list): + import random + # try: + import configparser as configparser + # except ImportError: + # import ConfigParser as configparser + import torch + # import torch.nn.parallel + import torch.optim as optim + import torch.utils.data + import torchvision.transforms as transforms + from torch.autograd import Variable + import datetime + from tensorboardX import SummaryWriter + + from models_dope import DopeNetwork + from utils_dope import CleanVisiiDopeLoader #, VisualizeBeliefMap, save_image + + import warnings + warnings.filterwarnings("ignore") + + os.environ["CUDA_VISIBLE_DEVICES"] = "0,1,2,3,4,5,6,7" + + torch.autograd.set_detect_anomaly(False) + torch.autograd.profiler.profile(False) + torch.autograd.gradcheck = False + torch.backends.cudnn.benchmark = True + + start_time = datetime.datetime.now() + print("start:", start_time.strftime("%m/%d/%Y, %H:%M:%S")) + + res_model = os.path.join(dopepath, wname + EXT_MODEL) + + local_rank = 0 + opt = lambda: None + opt.use_s3 = False + opt.train_buckets = [] + opt.endpoint = None + opt.lr=0.0001 + opt.loginterval=100 + opt.sigma=0.5 # 4 + opt.nbupdates=None + # opt.save=False + # opt.option="default" + # opt.gpuids=[0] + + opt.namefile=FILE_MODEL + opt.workers=8 + opt.batchsize=16 + + opt.data = [os.path.join(dopepath, DIR_ROOT_DS)] + opt.outf = os.path.join(dopepath, DIR_TRAIN_OUT) + opt.object = lname #["fork"] + opt.exts = [EXT_RGB] + # opt.imagesize = im_width + opt.epochs = epochs + opt.pretrained = pretrain + opt.net_path = res_model if pretrain else None + opt.manualseed = random.randint(1, 10000) + + # # Validate Arguments + # if opt.use_s3 and (opt.train_buckets is None or opt.endpoint is None): + # raise ValueError( + # "--train_buckets and --endpoint must be specified if training with data from s3 bucket." + # ) + # if not opt.use_s3 and opt.data is None: + # raise ValueError("--data field must be specified.") + + os.makedirs(opt.outf, exist_ok=True) + + # if local_rank == 0: + # writer = SummaryWriter(opt.outf + "/runs/") + random.seed(opt.manualseed) + torch.cuda.set_device(local_rank) + # torch.distributed.init_process_group(backend="nccl", init_method="env://") + torch.manual_seed(opt.manualseed) + torch.cuda.manual_seed_all(opt.manualseed) + + # # Data Augmentation + # if not opt.save: + # contrast = 0.2 + # brightness = 0.2 + # noise = 0.1 + # normal_imgs = [0.59, 0.25] + # transform = transforms.Compose( + # [ + # AddRandomContrast(0.2), + # AddRandomBrightness(0.2), + # transforms.Resize(opt.imagesize), + # ] + # ) + # else: + # contrast = 0.00001 + # brightness = 0.00001 + # noise = 0.00001 + # normal_imgs = None + # transform = transforms.Compose( + # [transforms.Resize(opt.imagesize), transforms.ToTensor()] + # ) + + # Load Model + net = DopeNetwork() + output_size = 50 + # opt.sigma = 0.5 + + train_dataset = CleanVisiiDopeLoader( + opt.data, + sigma=opt.sigma, + output_size=output_size, + extensions=opt.exts, + objects=opt.object, + use_s3=opt.use_s3, + buckets=opt.train_buckets, + endpoint_url=opt.endpoint, + ) + trainingdata = torch.utils.data.DataLoader( + train_dataset, + batch_size=opt.batchsize, + shuffle=True, + num_workers=opt.workers, + pin_memory=True, + ) + if not trainingdata is None: + print(f"training data: {len(trainingdata)} batches") + + print("Loading Model...") + net = net.cuda() + # net = torch.nn.parallel.DistributedDataParallel( + # net.cuda(), device_ids=[local_rank], output_device=local_rank + # ) + if opt.pretrained: + if opt.net_path is not None: + net.load_state_dict(torch.load(opt.net_path)) + else: + print("Error: Did not specify path to pretrained weights.") + quit() + + parameters = filter(lambda p: p.requires_grad, net.parameters()) + optimizer = optim.Adam(parameters, lr=opt.lr) + + print("ready to train!") + + global nb_update_network + nb_update_network = 0 + # best_results = {"epoch": None, "passed": None, "add_mean": None, "add_std": None} + + scaler = torch.cuda.amp.GradScaler() + + def _runnetwork(epoch, train_loader): #, syn=False + global nb_update_network + # net + net.train() + + loss_avg_to_log = {} + loss_avg_to_log["loss"] = [] + loss_avg_to_log["loss_affinities"] = [] + loss_avg_to_log["loss_belief"] = [] + loss_avg_to_log["loss_class"] = [] + for batch_idx, targets in enumerate(train_loader): + optimizer.zero_grad() + + data = Variable(targets["img"].cuda()) + target_belief = Variable(targets["beliefs"].cuda()) + target_affinities = Variable(targets["affinities"].cuda()) + + output_belief, output_aff = net(data) + + loss = None + + loss_belief = torch.tensor(0).float().cuda() + loss_affinities = torch.tensor(0).float().cuda() + loss_class = torch.tensor(0).float().cuda() + + for stage in range(len(output_aff)): # output, each belief map layers. + loss_affinities += ( + (output_aff[stage] - target_affinities) + * (output_aff[stage] - target_affinities) + ).mean() + + loss_belief += ( + (output_belief[stage] - target_belief) + * (output_belief[stage] - target_belief) + ).mean() + + loss = loss_affinities + loss_belief + + # if batch_idx == 0: + # post = "train" + # if local_rank == 0: + # for i_output in range(1): + # # input images + # writer.add_image( + # f"{post}_input_{i_output}", + # targets["img_original"][i_output], + # epoch, + # dataformats="CWH", + # ) + # # belief maps gt + # imgs = VisualizeBeliefMap(target_belief[i_output]) + # img, grid = save_image( + # imgs, "some_img.png", mean=0, std=1, nrow=3, save=False + # ) + # writer.add_image( + # f"{post}_belief_ground_truth_{i_output}", + # grid, + # epoch, + # dataformats="CWH", + # ) + # # belief maps guess + # imgs = VisualizeBeliefMap(output_belief[-1][i_output]) + # img, grid = save_image( + # imgs, "some_img.png", mean=0, std=1, nrow=3, save=False + # ) + # writer.add_image( + # f"{post}_belief_guess_{i_output}", + # grid, + # epoch, + # dataformats="CWH", + # ) + + loss.backward() + + optimizer.step() + + nb_update_network += 1 + + # log the loss + loss_avg_to_log["loss"].append(loss.item()) + loss_avg_to_log["loss_class"].append(loss_class.item()) + loss_avg_to_log["loss_affinities"].append(loss_affinities.item()) + loss_avg_to_log["loss_belief"].append(loss_belief.item()) + + if batch_idx % opt.loginterval == 0: + print( + "Train Epoch: {} [{}/{} ({:.0f}%)] \tLoss: {:.15f} \tLocal Rank: {}".format( + epoch, + batch_idx * len(data), + len(train_loader.dataset), + 100.0 * batch_idx / len(train_loader), + loss.item(), + local_rank, + ) + ) + # # log the loss values + # if local_rank == 0: + # writer.add_scalar("loss/train_loss", np.mean(loss_avg_to_log["loss"]), epoch) + # writer.add_scalar("loss/train_cls", np.mean(loss_avg_to_log["loss_class"]), epoch) + # writer.add_scalar("loss/train_aff", np.mean(loss_avg_to_log["loss_affinities"]), epoch) + # writer.add_scalar("loss/train_bel", np.mean(loss_avg_to_log["loss_belief"]), epoch) + + for epoch in range(1, opt.epochs + 1): + + _runnetwork(epoch, trainingdata) + + try: + if local_rank == 0: + torch.save( + net.state_dict(), + f"{opt.outf}/{opt.namefile}_{str(epoch).zfill(3)}.pth", + ) + except Exception as e: + print(f"Encountered Exception: {e}") + + if not opt.nbupdates is None and nb_update_network > int(opt.nbupdates): + break + + # if local_rank == 0: + # save result model + torch.save(net.state_dict(), res_model) #os.path.join(dopepath, wname + EXT_MODEL)) + # else: + # torch.save( + # net.state_dict(), + # f"{opt.outf}/{opt.namefile}_{str(epoch).zfill(3)}_rank_{local_rank}.pth", + # ) + + print("end:", datetime.datetime.now().strftime("%m/%d/%Y, %H:%M:%S")) + print("Total time taken: ", str(datetime.datetime.now() - start_time).split(".")[0]) + +def train_Dope_i(path:str, wname:str, dname:str, outpath:str, epochs:int, pretrain: bool): + """ Main procedure for train DOPE model """ + global K_intrinsic, model_info, camera_data, im_width + + if not os.path.isdir(outpath): + print(f"Invalid output path '{outpath}'") + exit(-1) + out_dir = os.path.join(outpath, wname) + ds_path = os.path.join(path, dname) + + if not os.path.isdir(ds_path): + print(f"{ds_path} : no BOP directory") + return "" + + camera_json = os.path.join(ds_path, FILE_CAMERA) + if not os.path.isfile(camera_json): + print(f"{camera_json} : no intrinsic camera file") + return "" + + rbs_info = os.path.join(ds_path, FILE_RBS_INFO) + if not os.path.isfile(rbs_info): + print(f"{rbs_info} : no dataset info file") + return "" + + camera_data = {} + with open(camera_json, "r") as fh: + data = json.load(fh) + keys = ["cx","cy","fx","fy"] + intrinsic = {k: data[k] for k in keys} + im_height = data["height"] + im_width = data["width"] + camera_data["camera_data"] = dict(intrinsic=intrinsic, height=im_height, width=im_width) + K_intrinsic = [ + [data["fx"], 0.0, data["cx"]], + [0.0, data["fy"], data["cy"]], + [0.0, 0.0, 1.0] + ] + # calc cuboid + center + with open(rbs_info, "r") as fh: + info = json.load(fh) + # список имён объектов + list_name = list(map(lambda x: x["name"], info)) + # in FILE_RBS_INFO model numbering from smallest to largest + model_info = [] + for m_info in info: + cub = np.array(m_info["cuboid"]) * MODEL_SCALE + xyz_min = cub.min(axis=0) + xyz_max = cub.max(axis=0) + # [xc, yc, zc] # min + (max - min) / 2 + center = [] + for i in range(3): + center.append(xyz_min[i] + (xyz_max[i]- xyz_min[i]) / 2) + c = np.array(center, ndmin=2) + model_info.append(np.append(cub, c, axis=0)) + + if pretrain: + # продолжить обучение + if not os.path.isdir(out_dir): + print(f"No dir '{out_dir}'") + exit(-2) + dpath = out_dir + # model_path = os.path.join(dpath, wname + ".pt") + else: + # обучение сначала + if not os.path.isdir(out_dir): + os.mkdir(out_dir) + + dpath = BOP2DOPE_dataset(ds_path, out_dir) + if len(dpath) == 0: + print(f"Error in convert dataset '{ds_path}' to '{outpath}'") + exit(-4) + # model_path = os.path.join(dpath, FILE_BASEMODEL) + + # results = f"python train.py --local_rank 0 --data {dpath} --object fork" \ + # + f" -e {epochs} --batchsize 16 --exts jpg --imagesize 640 --pretrained" \ + # + " --net_path /home/shalenikol/fork_work/dope_training/output/weights_2996/net_epoch_47.pth" + # print(results) + train(dpath, wname, epochs, pretrain, list_name) import argparse @@ -25,6 +536,7 @@ if __name__ == "__main__": parser.add_argument("--datasetName", required=True, help="String with dataset name") parser.add_argument("--outpath", default="weights", help="Output path for weights") parser.add_argument("--epoch", default=3, help="How many training epochs") + parser.add_argument('--pretrain', action="store_true", help="Use pretraining") args = parser.parse_args() - train_Dope_i(args.path, args.name, args.datasetName, args.outpath, args.epoch) + train_Dope_i(args.path, args.name, args.datasetName, args.outpath, args.epoch, args.pretrain) diff --git a/web_p/train_Yolo.py b/web_p/train_Yolo.py index 7482603..1eaf7a0 100644 --- a/web_p/train_Yolo.py +++ b/web_p/train_Yolo.py @@ -28,7 +28,7 @@ DIR_COCO_DS = "rbs_coco" DIR_RGB_DS = "images" DIR_LABELS_DS = "labels" -SZ_SERIES = 5 # number of train images per validation images +SZ_SERIES = 15 # number of train images per validation images nn_image = 0 f1 = f2 = None @@ -166,7 +166,6 @@ def train_YoloV8(path:str, wname:str, dname:str, outpath:str, epochs:int, pretra shutil.copy2(wf, os.path.join(dpath, wname + ".pt")) shutil.rmtree(results.save_dir) - # print(f"\n ********\n{wf}") if __name__ == "__main__": import argparse