├── src
├── web-paint
│ ├── src
│ │ ├── EventBus.ts
│ │ ├── interfaces
│ │ │ ├── IPoint.ts
│ │ │ ├── PenType.ts
│ │ │ └── IDrawCommand.ts
│ │ ├── MouseState.ts
│ │ ├── App.style.ts
│ │ ├── components
│ │ │ ├── Toolbar.style.ts
│ │ │ ├── DecimalSlider.tsx
│ │ │ ├── Toolbar.tsx
│ │ │ └── Canvas.tsx
│ │ ├── index.tsx
│ │ ├── index.ejs
│ │ ├── store
│ │ │ └── index.ts
│ │ └── App.tsx
│ ├── assets
│ │ └── logo.png
│ ├── tslint.json
│ ├── tsconfig.json
│ ├── build
│ │ ├── webpack.prod.conf.js
│ │ ├── webpack.dev.conf.js
│ │ └── webpack.base.conf.js
│ └── package.json
├── SoftwareRenderer
│ ├── SoftwareRenderer
│ │ ├── Libs
│ │ │ └── FadeJson.dll
│ │ ├── Surface.cs
│ │ ├── Camera.cs
│ │ ├── App.config
│ │ ├── Program.cs
│ │ ├── Properties
│ │ │ └── AssemblyInfo.cs
│ │ ├── GraphicsBuffer.cs
│ │ ├── Mesh.cs
│ │ ├── app.manifest
│ │ ├── AppDelegate.cs
│ │ ├── Vector.cs
│ │ ├── SoftwareRenderer.csproj
│ │ ├── GraphicsDevice.cs
│ │ ├── Matrix.cs
│ │ └── Contents
│ │ │ └── monkey.babylon
│ └── SoftwareRenderer.sln
├── mod-manager
│ ├── config.py
│ ├── mm.spec
│ ├── mm.py
│ ├── utils.py
│ ├── push_mods.py
│ └── pull_mods.py
├── BrainfuckInterpreter
│ ├── BrainfuckInterpreter
│ │ ├── App.config
│ │ ├── Program.cs
│ │ ├── Properties
│ │ │ └── AssemblyInfo.cs
│ │ ├── Interpreter.cs
│ │ └── BrainfuckInterpreter.csproj
│ ├── BrainfuckInterpreter.sln
│ ├── .gitattributes
│ └── .gitignore
└── knn-hanwriting-digit-in-60-line
│ └── recognizer.py
├── README.md
├── .gitattributes
└── .gitignore
/src/web-paint/src/EventBus.ts:
--------------------------------------------------------------------------------
1 | import Vue from "vue";
2 |
3 | export default new Vue();
4 |
--------------------------------------------------------------------------------
/src/web-paint/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fanyang89/ToysFactory/HEAD/src/web-paint/assets/logo.png
--------------------------------------------------------------------------------
/src/web-paint/src/interfaces/IPoint.ts:
--------------------------------------------------------------------------------
1 | interface IPoint {
2 | x: number;
3 | y: number;
4 | }
5 |
6 | export default IPoint;
7 |
--------------------------------------------------------------------------------
/src/SoftwareRenderer/SoftwareRenderer/Libs/FadeJson.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fanyang89/ToysFactory/HEAD/src/SoftwareRenderer/SoftwareRenderer/Libs/FadeJson.dll
--------------------------------------------------------------------------------
/src/web-paint/src/MouseState.ts:
--------------------------------------------------------------------------------
1 | enum MouseState {
2 | OutsideCanvas,
3 | InsideCanvasMouseUp,
4 | InsideCanvasMouseDown,
5 | }
6 |
7 | export default MouseState;
8 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Toys Factory
2 |
3 | ## Toy List
4 |
5 | * Software Renderer
6 | * web-paint(like mspaint)
7 | * 60 行手写 kNN 识别手写数字
8 | * 随手写的Minecraft mod同步
9 |
10 | ## License
11 |
12 | MIT License
13 |
--------------------------------------------------------------------------------
/src/SoftwareRenderer/SoftwareRenderer/Surface.cs:
--------------------------------------------------------------------------------
1 | namespace SoftwareRenderer
2 | {
3 | public struct Surface
4 | {
5 | public int A;
6 | public int B;
7 | public int C;
8 | }
9 | }
--------------------------------------------------------------------------------
/src/web-paint/src/interfaces/PenType.ts:
--------------------------------------------------------------------------------
1 | enum PenType {
2 | Line = "line",
3 | Lines = "lines",
4 | Point = "point",
5 | Circle = "circle",
6 | Rect = "rect",
7 | }
8 |
9 | export default PenType;
10 |
--------------------------------------------------------------------------------
/src/mod-manager/config.py:
--------------------------------------------------------------------------------
1 | import utils
2 |
3 | access_key = ''
4 | secret_key = ''
5 | base_uri = ''
6 | bucket_name = ''
7 | tmp_dir = './.tmp'
8 | is_push_allowed = False
9 | mod_dir = utils.search_mod_dir()
10 |
--------------------------------------------------------------------------------
/src/SoftwareRenderer/SoftwareRenderer/Camera.cs:
--------------------------------------------------------------------------------
1 | namespace SoftwareRenderer
2 | {
3 | public class Camera
4 | {
5 | public Vector Position { get; set; }
6 | public Vector Target { get; set; }
7 | }
8 | }
--------------------------------------------------------------------------------
/src/SoftwareRenderer/SoftwareRenderer/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/src/BrainfuckInterpreter/BrainfuckInterpreter/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/src/web-paint/src/App.style.ts:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 |
3 | const style: React.CSSProperties = {
4 | logo: {
5 | height: "31px",
6 | borderRadius: "6px",
7 | margin: "16px 24px 16px 0",
8 | float: "left",
9 | },
10 | };
11 |
12 | export default style;
13 |
--------------------------------------------------------------------------------
/src/SoftwareRenderer/SoftwareRenderer/Program.cs:
--------------------------------------------------------------------------------
1 | namespace SoftwareRenderer
2 | {
3 | internal static class Program
4 | {
5 | private static void Main(string[] args) {
6 | using (var app = new AppDelegate()) {
7 | app.Run();
8 | }
9 | }
10 | }
11 | }
--------------------------------------------------------------------------------
/src/web-paint/src/components/Toolbar.style.ts:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 |
3 | interface IToolbarStyle {
4 | buttonGroup: React.CSSProperties;
5 | }
6 |
7 | const style: IToolbarStyle = {
8 | buttonGroup: {
9 | marginLeft: "8px",
10 | marginRight: "8px",
11 | },
12 | };
13 |
14 | export default style;
15 |
--------------------------------------------------------------------------------
/src/web-paint/tslint.json:
--------------------------------------------------------------------------------
1 | {
2 | "defaultSeverity": "error",
3 | "extends": ["tslint:recommended"],
4 | "jsRules": {},
5 | "rules": {
6 | "object-literal-key-quotes": [true, "as-needed"],
7 | "arrow-parens": [true, "ban-single-arg-parens"],
8 | "no-empty": false
9 | },
10 | "rulesDirectory": []
11 | }
12 |
--------------------------------------------------------------------------------
/src/web-paint/src/index.tsx:
--------------------------------------------------------------------------------
1 | import "antd/dist/antd.min.css";
2 | import * as React from "react";
3 | import * as ReactDOM from "react-dom";
4 | import App from "./App";
5 | import Store from "./store";
6 |
7 | const store = new Store();
8 | const app = ;
9 |
10 | ReactDOM.render(app, document.getElementById("app") as HTMLElement);
11 |
--------------------------------------------------------------------------------
/src/web-paint/src/interfaces/IDrawCommand.ts:
--------------------------------------------------------------------------------
1 | import { Color } from "react-color";
2 | import IPoint from "../interfaces/IPoint";
3 | import PenType from "../interfaces/PenType";
4 |
5 | interface IDrawCommand {
6 | type: PenType;
7 | path: IPoint[];
8 | lineWidth: number;
9 | lineColor: string;
10 | fillColor: string;
11 | }
12 |
13 | export default IDrawCommand;
14 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
4 | # Custom for Visual Studio
5 | *.cs diff=csharp
6 |
7 | # Standard to msysgit
8 | *.doc diff=astextplain
9 | *.DOC diff=astextplain
10 | *.docx diff=astextplain
11 | *.DOCX diff=astextplain
12 | *.dot diff=astextplain
13 | *.DOT diff=astextplain
14 | *.pdf diff=astextplain
15 | *.PDF diff=astextplain
16 | *.rtf diff=astextplain
17 | *.RTF diff=astextplain
18 |
--------------------------------------------------------------------------------
/src/BrainfuckInterpreter/BrainfuckInterpreter/Program.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace BrainfuckInterpreter
4 | {
5 | internal static class Program
6 | {
7 | private static void Main(string[] args)
8 | {
9 | Console.WriteLine("Brainfuck Intepreter. Written by fuis. 2016-12-2");
10 | var interpreter = new Interpreter();
11 | while (true)
12 | {
13 | Console.Write("$ ");
14 | interpreter.Execute(Console.ReadLine());
15 | }
16 | }
17 | }
18 | }
--------------------------------------------------------------------------------
/src/web-paint/src/index.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | <%= htmlWebpackPlugin.options.title %>
10 |
11 |
12 |
13 |
14 |
15 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/src/web-paint/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "outDir": "build/dist",
4 | "module": "commonjs",
5 | "target": "es5",
6 | "lib": ["es6", "dom", "es2016", "es2017", "esnext"],
7 | "sourceMap": true,
8 | "allowJs": false,
9 | "jsx": "react",
10 | "moduleResolution": "node",
11 | "rootDir": "src",
12 | "noImplicitReturns": true,
13 | "noImplicitThis": true,
14 | "noImplicitAny": true,
15 | "strictNullChecks": true,
16 | "experimentalDecorators": true,
17 | "allowSyntheticDefaultImports": true
18 | },
19 | "exclude": ["node_modules", "**/*.spec.ts", "build", "dist"],
20 | "include": ["src/**/*"]
21 | }
22 |
--------------------------------------------------------------------------------
/src/web-paint/src/store/index.ts:
--------------------------------------------------------------------------------
1 | import { observable } from "mobx";
2 | import { Color } from "react-color";
3 | import IDrawCommand from "../interfaces/IDrawCommand";
4 | import PenType from "../interfaces/PenType";
5 | import MouseState from "../MouseState";
6 |
7 | class Store {
8 | @observable public drawCommands: IDrawCommand[] = [];
9 | @observable public mouseState: MouseState;
10 | @observable public drawType: PenType = PenType.Lines;
11 | @observable public lineWidth: number = 3;
12 | @observable public lineColor: string = "red";
13 | @observable public fillColor: string = "#000";
14 | @observable public isFileNameDialogShow = false;
15 | @observable public fileName: string;
16 | }
17 |
18 | export default Store;
19 |
--------------------------------------------------------------------------------
/src/web-paint/build/webpack.prod.conf.js:
--------------------------------------------------------------------------------
1 | const HtmlWebpackPlugin = require("html-webpack-plugin");
2 | const webpack = require("webpack");
3 | const baseConfig = require("./webpack.base.conf");
4 |
5 | var prodConfig = Object.assign({}, baseConfig);
6 |
7 | prodConfig.devtool = "";
8 |
9 | prodConfig.plugins = [
10 | new webpack.DefinePlugin({
11 | "process.env": {
12 | NODE_ENV: JSON.stringify("production"),
13 | },
14 | }),
15 | new webpack.optimize.CommonsChunkPlugin({
16 | name: "vendor",
17 | minChunks: ({ resource }) =>
18 | resource &&
19 | resource.indexOf("node_modules") >= 0 &&
20 | resource.match(/\.js$/),
21 | }),
22 | new HtmlWebpackPlugin({
23 | template: "./src/index.ejs",
24 | title: "WebPaint",
25 | }),
26 | new webpack.optimize.UglifyJsPlugin(),
27 | new webpack.optimize.AggressiveMergingPlugin(),
28 | ];
29 |
30 | module.exports = prodConfig;
31 |
--------------------------------------------------------------------------------
/src/mod-manager/mm.spec:
--------------------------------------------------------------------------------
1 | # -*- mode: python -*-
2 |
3 | block_cipher = None
4 |
5 |
6 | a = Analysis(['mm.py'],
7 | pathex=['D:\\Workspace\\great-fire-world\\mod-manager'],
8 | binaries=[],
9 | datas=[],
10 | hiddenimports=[],
11 | hookspath=[],
12 | runtime_hooks=[],
13 | excludes=[],
14 | win_no_prefer_redirects=False,
15 | win_private_assemblies=False,
16 | cipher=block_cipher)
17 | pyz = PYZ(a.pure, a.zipped_data,
18 | cipher=block_cipher)
19 | exe = EXE(pyz,
20 | a.scripts,
21 | exclude_binaries=True,
22 | name='mm',
23 | debug=False,
24 | strip=False,
25 | upx=True,
26 | console=True )
27 | coll = COLLECT(exe,
28 | a.binaries,
29 | a.zipfiles,
30 | a.datas,
31 | strip=False,
32 | upx=True,
33 | name='mm')
34 |
--------------------------------------------------------------------------------
/src/web-paint/build/webpack.dev.conf.js:
--------------------------------------------------------------------------------
1 | const baseConfig = require("./webpack.base.conf");
2 | const webpack = require("webpack");
3 | const HtmlWebpackPlugin = require("html-webpack-plugin");
4 | const path = require("path");
5 |
6 | var devConfig = Object.assign({}, baseConfig);
7 |
8 | devConfig.devServer = {
9 | compress: true,
10 | port: 9000,
11 | hot: true,
12 | lazy: false,
13 | noInfo: true,
14 | overlay: true,
15 | open: true,
16 | };
17 |
18 | devConfig.plugins = [
19 | new webpack.DefinePlugin({
20 | "process.env": {
21 | NODE_ENV: JSON.stringify("development"),
22 | },
23 | }),
24 | new webpack.HotModuleReplacementPlugin(),
25 | new webpack.optimize.CommonsChunkPlugin({
26 | name: "vendor",
27 | minChunks: ({ resource }) =>
28 | resource &&
29 | resource.indexOf("node_modules") >= 0 &&
30 | resource.match(/\.js$/),
31 | }),
32 | new HtmlWebpackPlugin({
33 | template: "./src/index.ejs",
34 | title: "WebPaint",
35 | }),
36 | ];
37 |
38 | module.exports = devConfig;
39 |
--------------------------------------------------------------------------------
/src/SoftwareRenderer/SoftwareRenderer.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio 14
4 | VisualStudioVersion = 14.0.24720.0
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SoftwareRenderer", "SoftwareRenderer\SoftwareRenderer.csproj", "{2A47D0E8-32C8-4BC3-9C1F-A74D690BE7E7}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|Any CPU = Debug|Any CPU
11 | Release|Any CPU = Release|Any CPU
12 | EndGlobalSection
13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
14 | {2A47D0E8-32C8-4BC3-9C1F-A74D690BE7E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
15 | {2A47D0E8-32C8-4BC3-9C1F-A74D690BE7E7}.Debug|Any CPU.Build.0 = Debug|Any CPU
16 | {2A47D0E8-32C8-4BC3-9C1F-A74D690BE7E7}.Release|Any CPU.ActiveCfg = Release|Any CPU
17 | {2A47D0E8-32C8-4BC3-9C1F-A74D690BE7E7}.Release|Any CPU.Build.0 = Release|Any CPU
18 | EndGlobalSection
19 | GlobalSection(SolutionProperties) = preSolution
20 | HideSolutionNode = FALSE
21 | EndGlobalSection
22 | EndGlobal
23 |
--------------------------------------------------------------------------------
/src/SoftwareRenderer/SoftwareRenderer/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.InteropServices;
3 |
4 | // 有关程序集的一般信息由以下
5 | // 控制。更改这些特性值可修改
6 | // 与程序集关联的信息。
7 | [assembly: AssemblyTitle("SoftwareRenderer")]
8 | [assembly: AssemblyDescription("")]
9 | [assembly: AssemblyConfiguration("")]
10 | [assembly: AssemblyCompany("")]
11 | [assembly: AssemblyProduct("SoftwareRenderer")]
12 | [assembly: AssemblyCopyright("Copyright © 2016")]
13 | [assembly: AssemblyTrademark("")]
14 | [assembly: AssemblyCulture("")]
15 |
16 | //将 ComVisible 设置为 false 将使此程序集中的类型
17 | //对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型,
18 | //请将此类型的 ComVisible 特性设置为 true。
19 | [assembly: ComVisible(false)]
20 |
21 | // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
22 | [assembly: Guid("2a47d0e8-32c8-4bc3-9c1f-a74d690be7e7")]
23 |
24 | // 程序集的版本信息由下列四个值组成:
25 | //
26 | // 主版本
27 | // 次版本
28 | // 生成号
29 | // 修订号
30 | //
31 | //可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
32 | // 方法是按如下所示使用“*”: :
33 | // [assembly: AssemblyVersion("1.0.*")]
34 | [assembly: AssemblyVersion("1.0.0.0")]
35 | [assembly: AssemblyFileVersion("1.0.0.0")]
--------------------------------------------------------------------------------
/src/BrainfuckInterpreter/BrainfuckInterpreter.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio 15
4 | VisualStudioVersion = 15.0.25914.0
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BrainfuckInterpreter", "BrainfuckInterpreter\BrainfuckInterpreter.csproj", "{71B8010B-4D2B-4A32-9ECC-D6C9D9F95C33}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|Any CPU = Debug|Any CPU
11 | Release|Any CPU = Release|Any CPU
12 | EndGlobalSection
13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
14 | {71B8010B-4D2B-4A32-9ECC-D6C9D9F95C33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
15 | {71B8010B-4D2B-4A32-9ECC-D6C9D9F95C33}.Debug|Any CPU.Build.0 = Debug|Any CPU
16 | {71B8010B-4D2B-4A32-9ECC-D6C9D9F95C33}.Release|Any CPU.ActiveCfg = Release|Any CPU
17 | {71B8010B-4D2B-4A32-9ECC-D6C9D9F95C33}.Release|Any CPU.Build.0 = Release|Any CPU
18 | EndGlobalSection
19 | GlobalSection(SolutionProperties) = preSolution
20 | HideSolutionNode = FALSE
21 | EndGlobalSection
22 | EndGlobal
23 |
--------------------------------------------------------------------------------
/src/mod-manager/mm.py:
--------------------------------------------------------------------------------
1 | import os
2 | import sys
3 | import config
4 | from push_mods import push
5 | from pull_mods import pull
6 |
7 |
8 | def help():
9 | print('eg. Type "mm pull" or "mm" to sync with remote.')
10 | print('eg. Type "mm push" push mods to remote.')
11 |
12 |
13 | def main():
14 | # 创建临时文件夹
15 | if not os.path.isdir(config.tmp_dir):
16 | os.mkdir(config.tmp_dir)
17 |
18 | if len(sys.argv) == 1:
19 | pull()
20 | return
21 |
22 | if len(sys.argv) >= 2:
23 | help()
24 | return
25 |
26 | cmd = sys.argv[1]
27 | if cmd == 'push':
28 | if not config.is_push_allowed:
29 | print("You don't have permission to push")
30 | return
31 | else:
32 | push()
33 | print('Done.')
34 | return
35 | elif cmd == 'help':
36 | help()
37 | return
38 | elif cmd == 'pull':
39 | pull()
40 | return
41 | else:
42 | print('Unknown command line arguments.')
43 | help()
44 | return
45 |
46 |
47 | if __name__ == '__main__':
48 | main()
49 |
--------------------------------------------------------------------------------
/src/BrainfuckInterpreter/BrainfuckInterpreter/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // 有关程序集的一般信息由以下
6 | // 控制。更改这些特性值可修改
7 | // 与程序集关联的信息。
8 | [assembly: AssemblyTitle("BrainfuckInterpreter")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("BrainfuckInterpreter")]
13 | [assembly: AssemblyCopyright("Copyright © 2016")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // 将 ComVisible 设置为 false 会使此程序集中的类型
18 | //对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
19 | //请将此类型的 ComVisible 特性设置为 true。
20 | [assembly: ComVisible(false)]
21 |
22 | // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
23 | [assembly: Guid("71b8010b-4d2b-4a32-9ecc-d6c9d9f95c33")]
24 |
25 | // 程序集的版本信息由下列四个值组成:
26 | //
27 | // 主版本
28 | // 次版本
29 | // 生成号
30 | // 修订号
31 | //
32 | // 可以指定所有值,也可以使用“生成号”和“修订号”的默认值
33 | // 方法是按如下所示使用“*”: :
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/src/SoftwareRenderer/SoftwareRenderer/GraphicsBuffer.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Drawing;
3 |
4 | namespace SoftwareRenderer
5 | {
6 | public class GraphicsBuffer : IDisposable
7 | {
8 | public GraphicsBuffer(int width, int height, Camera camera) {
9 | Current = new Bitmap(width, height);
10 | CurrentGraphicsDevice = new GraphicsDevice(Current, camera);
11 | Background = new Bitmap(width, height);
12 | BackgroundGraphicsDevice = new GraphicsDevice(Background, camera);
13 | }
14 |
15 | public Bitmap Background { get; private set; }
16 | public GraphicsDevice BackgroundGraphicsDevice { get; private set; }
17 | public Bitmap Current { get; private set; }
18 | public GraphicsDevice CurrentGraphicsDevice { get; private set; }
19 |
20 | public void SwapBuffers() {
21 | var t = Current;
22 | Current = Background;
23 | Background = t;
24 | }
25 |
26 | public void Dispose() {
27 | CurrentGraphicsDevice.Dispose();
28 | Current.Dispose();
29 | BackgroundGraphicsDevice.Dispose();
30 | Background.Dispose();
31 | }
32 | }
33 | }
--------------------------------------------------------------------------------
/src/web-paint/src/components/DecimalSlider.tsx:
--------------------------------------------------------------------------------
1 | import { Col, InputNumber, Row, Slider } from "antd";
2 | import * as React from "react";
3 |
4 | interface IDecimalSliderProps {
5 | onChange?: (value: number) => void;
6 | value: number;
7 | }
8 |
9 | class DecimalSlider extends React.Component {
10 | public constructor(props: IDecimalSliderProps) {
11 | super(props);
12 | }
13 |
14 | public onChange(value: any) {
15 | this.setState({ value });
16 | if (this.props.onChange) {
17 | this.props.onChange(value);
18 | }
19 | }
20 |
21 | public render() {
22 | return (
23 |
24 |
25 | this.onChange(e)}
29 | value={this.props.value}
30 | step={0.01}
31 | />
32 |
33 |
34 | this.onChange(e)}
41 | />
42 |
43 |
44 | );
45 | }
46 | }
47 |
48 | export default DecimalSlider;
49 |
--------------------------------------------------------------------------------
/src/mod-manager/utils.py:
--------------------------------------------------------------------------------
1 | import os
2 | import qiniu
3 | import config
4 | import requests
5 | import json
6 | import glob
7 |
8 |
9 | def search_mod_dir():
10 | possible_dirs = [
11 | './../.minecraft/mods',
12 | './../../.minecraft/mods',
13 | './.minecraft/mods'
14 | ]
15 | results = [dir for dir in possible_dirs if os.path.isdir(dir)]
16 | if not results:
17 | raise Exception('Minecraft mod dir not found.')
18 | if len(results) > 1:
19 | raise Exception('More than one Minecraft mod dir found.')
20 | return os.path.abspath(results[0])
21 |
22 |
23 | def get_local_mods():
24 | postfixes = ['*.jar', '*.litemod']
25 | patterns = [os.path.join(config.mod_dir, it) for it in postfixes]
26 | mod_abspath_list = sum([glob.glob(it, recursive=False)
27 | for it in patterns], [])
28 | return set([os.path.basename(it) for it in mod_abspath_list])
29 |
30 |
31 | def get_remote_mods():
32 | q = qiniu.Auth(config.access_key, config.secret_key)
33 | info_url = 'http://{}/{}'.format(config.base_uri, 'index.json')
34 | private_url = q.private_download_url(info_url)
35 | response = requests.get(private_url)
36 | assert response.status_code == 200
37 | if response.status_code != 200:
38 | raise Exception('Failed to get remote mod list.')
39 | return set(json.loads(response.text))
40 |
--------------------------------------------------------------------------------
/src/web-paint/build/webpack.base.conf.js:
--------------------------------------------------------------------------------
1 | const webpack = require("webpack");
2 | const path = require("path");
3 | const HtmlWebpackPlugin = require("html-webpack-plugin");
4 |
5 | const workspaceRoot = path.resolve(path.join(__dirname, "../"));
6 |
7 | module.exports = {
8 | resolve: {
9 | extensions: [".ts", ".tsx", ".js", ".jsx", ".css", ".less"],
10 | alias: {
11 | "@": path.join(workspaceRoot, "src"),
12 | },
13 | },
14 | devtool: "cheap-module-eval-source-map",
15 | entry: path.join(workspaceRoot, "src/index.tsx"),
16 | output: {
17 | path: path.resolve(workspaceRoot, "dist"),
18 | filename: "[name].js",
19 | libraryTarget: "umd",
20 | },
21 | module: {
22 | loaders: [
23 | {
24 | test: /\.css$/,
25 | loader: "style-loader!css-loader",
26 | },
27 | {
28 | test: /\.less$/,
29 | loader: "style-loader!css-loader!less-loader",
30 | },
31 | {
32 | test: /\.tsx?$/,
33 | loader: "ts-loader",
34 | },
35 | {
36 | test: /\.(png|svg|jpg|gif)$/,
37 | loader: "file-loader",
38 | options: {
39 | name: "[name].[ext]",
40 | outputPath: "assets/",
41 | },
42 | },
43 | {
44 | test: /\.(woff|woff2|eot|ttf|otf)$/,
45 | loader: "file-loader",
46 | options: {
47 | name: "[name].[ext]",
48 | outputPath: "assets/",
49 | },
50 | },
51 | ],
52 | },
53 | };
54 |
--------------------------------------------------------------------------------
/src/mod-manager/push_mods.py:
--------------------------------------------------------------------------------
1 | import qiniu
2 | import os
3 | import config
4 | import progressbar
5 | import utils
6 | import json
7 |
8 |
9 | def push():
10 | local_mods = utils.get_local_mods()
11 | remote_mods = utils.get_remote_mods()
12 | intersection = remote_mods & local_mods
13 |
14 | push_list = local_mods - intersection
15 | remove_list = remote_mods - intersection
16 |
17 | if not remove_list and not push_list:
18 | print('Nothing changed.')
19 | return
20 |
21 | q = qiniu.Auth(config.access_key, config.secret_key)
22 | bucket = qiniu.BucketManager(q)
23 |
24 | # 删除mod
25 | if not remove_list:
26 | print('Removing mods at remote.')
27 | bar = progressbar.ProgressBar()
28 | for mod_name in bar(remove_list):
29 | ret, info = bucket.delete(config.bucket_name, mod_name)
30 |
31 | # 上传mod
32 | print('Pushing mods to remote.')
33 | bar = progressbar.ProgressBar()
34 | for mod_name in bar(push_list):
35 | token = q.upload_token(config.bucket_name, mod_name)
36 | abspath = os.path.join(config.mod_dir, mod_name)
37 | ret, info = qiniu.put_file(token, mod_name, abspath)
38 | assert ret['hash'] == qiniu.etag(abspath)
39 |
40 | # 更新mod列表
41 | print('Updating mod index.')
42 | index_filename = 'index.json'
43 | index_path = os.path.join(config.tmp_dir, index_filename)
44 | with open(index_path, 'w') as fp:
45 | json.dump(list(local_mods), fp)
46 | token = q.upload_token(config.bucket_name, index_filename)
47 | ret, info = qiniu.put_file(token, index_filename, index_path)
48 |
--------------------------------------------------------------------------------
/src/web-paint/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "web-paint",
3 | "version": "1.0.0",
4 | "description": "web-paint",
5 | "main": "index.js",
6 | "repository": {
7 | "git": null
8 | },
9 | "scripts": {
10 | "dev": "webpack-dev-server --config build/webpack.dev.conf.js",
11 | "dev:build": "webpack --config build/webpack.dev.conf.js",
12 | "build": "webpack --config build/webpack.prod.conf.js"
13 | },
14 | "author": "YangFan789 ",
15 | "license": "MIT",
16 | "dependencies": {
17 | "@types/file-saver": "^1.3.0",
18 | "@types/radium": "^0.18.23",
19 | "@types/react": "^15.6.1",
20 | "@types/react-color": "^2.13.3",
21 | "@types/react-dom": "^15.5.1",
22 | "@types/webpack": "^3.8.1",
23 | "antd": "^2.13.10",
24 | "file-saver": "^1.3.3",
25 | "jquery": "^3.2.1",
26 | "lodash": "^4.17.4",
27 | "mobx": "^3.3.1",
28 | "mobx-react": "^4.3.4",
29 | "ngprogress": "^1.1.1",
30 | "radium": "^0.19.6",
31 | "react": "^15.6.1",
32 | "react-color": "^2.13.8",
33 | "react-dom": "^15.5.1",
34 | "react-router": "^4.2.0",
35 | "vue": "^2.5.3"
36 | },
37 | "devDependencies": {
38 | "css-loader": "^0.28.7",
39 | "file-loader": "^1.1.5",
40 | "html-webpack-plugin": "^2.30.1",
41 | "less": "^2.7.3",
42 | "less-loader": "^4.0.5",
43 | "path": "^0.12.7",
44 | "style-loader": "^0.19.0",
45 | "ts-lint": "^4.5.1",
46 | "ts-loader": "^3.1.1",
47 | "typescript": "^2.6.1",
48 | "uglifyjs-webpack-plugin": "^1.0.1",
49 | "url-loader": "^0.6.2",
50 | "webpack": "^3.8.1",
51 | "webpack-dev-server": "^2.9.4"
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/src/knn-hanwriting-digit-in-60-line/recognizer.py:
--------------------------------------------------------------------------------
1 | import os
2 |
3 | train_data = [[] for i in range(10)]
4 |
5 |
6 | def matrix_from_file(path):
7 | matrix = [([0] * 32) for i in range(32)]
8 | with open(path, 'r') as f:
9 | lines = f.readlines()
10 | for i in range(32):
11 | for j in range(32):
12 | matrix[i][j] = int(lines[i][j])
13 | return matrix
14 |
15 |
16 | def init_train_data():
17 | train_data_folder = 'data/train/'
18 | train_file_path = os.listdir(train_data_folder)
19 | for path in train_file_path:
20 | digit = int(path[0])
21 | matrix = matrix_from_file(train_data_folder + path)
22 | train_data[digit].append(matrix)
23 |
24 |
25 | def matrix_distance(A, B):
26 | sum = 0.0
27 | for i in range(32):
28 | for j in range(32):
29 | sum += (A[i][j] - B[i][j]) ** 2
30 |
31 | return sum ** 0.5
32 |
33 |
34 | def classify(X, k):
35 | result = [[str(x), 0.0] for x in range(10)]
36 | for i in range(10):
37 | for Y in train_data[i]:
38 | result[i][1] += matrix_distance(X, Y)
39 | result.sort(key=lambda r: r[1])
40 | return result[0:k]
41 |
42 |
43 | def test():
44 | test_file_path = os.listdir('data/test/')
45 | total = len(test_file_path)
46 | c = 0
47 | for p in test_file_path:
48 | X = matrix_from_file('data/test/' + p)
49 | result = classify(X, 1)
50 | correct_result = p[0]
51 | if str(correct_result) == result[0][0]:
52 | c += 1
53 | print "Correct %d/%d" % (c, total)
54 |
55 |
56 | if __name__ == "__main__":
57 | init_train_data()
58 | test()
59 |
--------------------------------------------------------------------------------
/src/web-paint/src/App.tsx:
--------------------------------------------------------------------------------
1 | import { Breadcrumb, Button, Card, Icon, Layout, Menu } from "antd";
2 | import { observer } from "mobx-react";
3 | import * as Radium from "radium";
4 | import * as React from "react";
5 | import style from "./App.style";
6 | import Canvas from "./components/Canvas";
7 | import Toolbar from "./components/Toolbar";
8 | import Store from "./store";
9 |
10 | const { Header, Content, Footer } = Layout;
11 | const ButtonGroup = Button.Group;
12 |
13 | interface IAppProps {
14 | store: Store;
15 | }
16 |
17 | @Radium
18 | @observer
19 | class App extends React.Component {
20 | public render() {
21 | const store = this.props.store;
22 | return (
23 |
24 |
25 |
26 | WebPaint
27 |
28 |
29 |
30 |
51 |
52 |
53 | );
54 | }
55 | }
56 |
57 | export default App;
58 |
--------------------------------------------------------------------------------
/src/mod-manager/pull_mods.py:
--------------------------------------------------------------------------------
1 | import qiniu
2 | import os
3 | import config
4 | import progressbar
5 | import utils
6 | import requests
7 |
8 |
9 | def download_file(url, path, filename):
10 | req = requests.get(url)
11 | with open(os.path.join(path, filename), 'wb') as f:
12 | for chunk in req.iter_content(chunk_size=1024):
13 | if chunk:
14 | f.write(chunk)
15 | return
16 |
17 |
18 | def pull():
19 | local_mods = utils.get_local_mods()
20 | remote_mods = utils.get_remote_mods()
21 | intersection = remote_mods & local_mods
22 |
23 | pull_list = remote_mods - intersection
24 | remove_list = local_mods - intersection
25 |
26 | if not remove_list and not pull_list:
27 | print('Nothing changed.')
28 | return
29 |
30 | q = qiniu.Auth(config.access_key, config.secret_key)
31 | bucket = qiniu.BucketManager(q)
32 |
33 | # 删除mod
34 | if remove_list:
35 | print('Remove local useless mods.')
36 | bar = progressbar.ProgressBar()
37 | for mod_name in bar(remove_list):
38 | abspath = os.path.join(config.mod_dir, mod_name)
39 | os.remove(abspath)
40 |
41 | # 下载mod
42 | if pull_list:
43 | print('Downloading mods from remote.')
44 | bar = progressbar.ProgressBar()
45 | for mod_name in bar(pull_list):
46 | download_path = os.path.join(config.tmp_dir, mod_name)
47 | base_url = 'http://{}/{}'.format(config.base_uri, mod_name)
48 | private_url = q.private_download_url(base_url)
49 | download_file(private_url, config.tmp_dir, mod_name)
50 | ret, info = bucket.stat(config.bucket_name, mod_name)
51 | assert ret['hash'] == qiniu.etag(download_path)
52 | os.rename(download_path, os.path.join(config.mod_dir, mod_name))
53 |
--------------------------------------------------------------------------------
/src/BrainfuckInterpreter/BrainfuckInterpreter/Interpreter.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace BrainfuckInterpreter
4 | {
5 | internal class Interpreter
6 | {
7 | private readonly char[] _memory;
8 |
9 | public Interpreter(int memorySize = 1000)
10 | {
11 | _memory = new char[memorySize];
12 | }
13 |
14 | public void Execute(string code)
15 | {
16 | var currentMemoryPosition = 0;
17 | var pos = 0;
18 | while (pos < code.Length)
19 | {
20 | var ins = code[pos];
21 | switch (ins)
22 | {
23 | case '>':
24 | currentMemoryPosition++;
25 | break;
26 | case '<':
27 | currentMemoryPosition--;
28 | break;
29 | case '+':
30 | _memory[currentMemoryPosition]++;
31 | break;
32 | case '-':
33 | _memory[currentMemoryPosition]--;
34 | break;
35 | case '.':
36 | Console.Write(_memory[currentMemoryPosition]);
37 | break;
38 | case ',':
39 | _memory[currentMemoryPosition] = (char)Console.Read();
40 | break;
41 | case '[':
42 | if (_memory[currentMemoryPosition] == 0)
43 | {
44 | while (code[pos] != ']')
45 | {
46 | pos++;
47 | }
48 | }
49 | break;
50 | case ']':
51 | if (_memory[currentMemoryPosition] != 0)
52 | {
53 | while (code[pos] != '[')
54 | {
55 | pos--;
56 | }
57 | }
58 | break;
59 | }
60 | pos++;
61 | }
62 | }
63 | }
64 | }
--------------------------------------------------------------------------------
/src/SoftwareRenderer/SoftwareRenderer/Mesh.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using FadeJson;
3 |
4 | namespace SoftwareRenderer
5 | {
6 | public class Mesh
7 | {
8 | //Hide default ctor
9 | private Mesh() { }
10 |
11 | public Vector Position { get; set; } = Vector.Zero;
12 | public Vector Rotation { get; set; } = Vector.Zero;
13 | public Surface[] Surfaces { get; private set; }
14 | public Vector[] Vertices { get; private set; }
15 |
16 | public static Mesh[] FromBabylonModel(string fileName) {
17 | var j = JsonValue.FromFile(fileName);
18 | var meshes = new List();
19 |
20 | foreach (var jmesh in j["meshes"].Values) {
21 | var mesh = new Mesh();
22 |
23 | var uvCount = jmesh["uvCount"].ValueOf();
24 | var verticesStep = new[] { 6, 8, 10 }[uvCount];
25 | var vertices = new List();
26 | var verticesArray = jmesh["vertices"];
27 | var verticesCount = verticesArray.Count / verticesStep;
28 | for (var i = 0; i < verticesCount; i++) {
29 | var x = (float)verticesArray[i * verticesStep].ValueOf();
30 | var y = (float)verticesArray[i * verticesStep + 1].ValueOf();
31 | var z = (float)verticesArray[i * verticesStep + 2].ValueOf();
32 | vertices.Add(new Vector(x, y, z));
33 | }
34 | mesh.Vertices = vertices.ToArray();
35 |
36 | var indices = jmesh["indices"];
37 | var surfaceCount = indices.Count / 3;
38 | var surfaceList = new List();
39 | for (var i = 0; i < surfaceCount; i++) {
40 | var a = indices[i * 3].ValueOf();
41 | var b = indices[i * 3 + 1].ValueOf();
42 | var c = indices[i * 3 + 2].ValueOf();
43 | surfaceList.Add(new Surface { A = a, B = b, C = c });
44 | }
45 | mesh.Surfaces = surfaceList.ToArray();
46 |
47 | var position = jmesh["position"];
48 | mesh.Position = new Vector(
49 | (float)position[0].ValueOf(),
50 | (float)position[1].ValueOf(),
51 | (float)position[2].ValueOf()
52 | );
53 | meshes.Add(mesh);
54 | }
55 | return meshes.ToArray();
56 | }
57 | }
58 | }
--------------------------------------------------------------------------------
/src/BrainfuckInterpreter/BrainfuckInterpreter/BrainfuckInterpreter.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | {71B8010B-4D2B-4A32-9ECC-D6C9D9F95C33}
8 | Exe
9 | BrainfuckInterpreter
10 | BrainfuckInterpreter
11 | v4.6.2
12 | 512
13 | true
14 |
15 |
16 | AnyCPU
17 | true
18 | full
19 | false
20 | bin\Debug\
21 | DEBUG;TRACE
22 | prompt
23 | 4
24 |
25 |
26 | AnyCPU
27 | pdbonly
28 | true
29 | bin\Release\
30 | TRACE
31 | prompt
32 | 4
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
--------------------------------------------------------------------------------
/src/BrainfuckInterpreter/.gitattributes:
--------------------------------------------------------------------------------
1 | ###############################################################################
2 | # Set default behavior to automatically normalize line endings.
3 | ###############################################################################
4 | * text=auto
5 |
6 | ###############################################################################
7 | # Set default behavior for command prompt diff.
8 | #
9 | # This is need for earlier builds of msysgit that does not have it on by
10 | # default for csharp files.
11 | # Note: This is only used by command line
12 | ###############################################################################
13 | #*.cs diff=csharp
14 |
15 | ###############################################################################
16 | # Set the merge driver for project and solution files
17 | #
18 | # Merging from the command prompt will add diff markers to the files if there
19 | # are conflicts (Merging from VS is not affected by the settings below, in VS
20 | # the diff markers are never inserted). Diff markers may cause the following
21 | # file extensions to fail to load in VS. An alternative would be to treat
22 | # these files as binary and thus will always conflict and require user
23 | # intervention with every merge. To do so, just uncomment the entries below
24 | ###############################################################################
25 | #*.sln merge=binary
26 | #*.csproj merge=binary
27 | #*.vbproj merge=binary
28 | #*.vcxproj merge=binary
29 | #*.vcproj merge=binary
30 | #*.dbproj merge=binary
31 | #*.fsproj merge=binary
32 | #*.lsproj merge=binary
33 | #*.wixproj merge=binary
34 | #*.modelproj merge=binary
35 | #*.sqlproj merge=binary
36 | #*.wwaproj merge=binary
37 |
38 | ###############################################################################
39 | # behavior for image files
40 | #
41 | # image files are treated as binary by default.
42 | ###############################################################################
43 | #*.jpg binary
44 | #*.png binary
45 | #*.gif binary
46 |
47 | ###############################################################################
48 | # diff behavior for common document formats
49 | #
50 | # Convert binary document formats to text before diffing them. This feature
51 | # is only available from the command line. Turn it on by uncommenting the
52 | # entries below.
53 | ###############################################################################
54 | #*.doc diff=astextplain
55 | #*.DOC diff=astextplain
56 | #*.docx diff=astextplain
57 | #*.DOCX diff=astextplain
58 | #*.dot diff=astextplain
59 | #*.DOT diff=astextplain
60 | #*.pdf diff=astextplain
61 | #*.PDF diff=astextplain
62 | #*.rtf diff=astextplain
63 | #*.RTF diff=astextplain
64 |
--------------------------------------------------------------------------------
/src/SoftwareRenderer/SoftwareRenderer/app.manifest:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
51 |
52 |
53 | true
54 |
55 |
56 |
57 |
58 |
72 |
73 |
74 |
--------------------------------------------------------------------------------
/src/SoftwareRenderer/SoftwareRenderer/AppDelegate.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Diagnostics;
3 | using System.Drawing;
4 | using System.Threading;
5 | using System.Windows.Forms;
6 |
7 | namespace SoftwareRenderer
8 | {
9 | public class AppDelegate : IDisposable
10 | {
11 | private const int Height = 768;
12 | private const int MaxFps = 24;
13 | private const int Width = 1024;
14 | private readonly Font defaultFont = new Font(new FontFamily("Microsoft Yahei Mono"), 14);
15 | private readonly TimeSpan maxBreakTime = TimeSpan.FromSeconds(2);
16 | private readonly TimeSpan maxElapsedTime = TimeSpan.FromMilliseconds(1000.0 / MaxFps);
17 | private GraphicsBuffer buffer;
18 | private Camera camera;
19 | private Form form;
20 | private Graphics formGraphics;
21 | private Mesh[] meshes;
22 |
23 | public AppDelegate() {
24 | LoadContent();
25 | }
26 |
27 | public void Dispose() {
28 | formGraphics.Dispose();
29 | buffer.Dispose();
30 | }
31 |
32 | public void Run() {
33 | var stopwatch = new Stopwatch();
34 | var deltatime = maxElapsedTime;
35 |
36 | form.Show();
37 |
38 | while (!form.IsDisposed) {
39 | stopwatch.Start();
40 |
41 | Update(deltatime);
42 | Render(deltatime);
43 | buffer.SwapBuffers();
44 | Present();
45 | Application.DoEvents();
46 | if (stopwatch.Elapsed < maxElapsedTime) {
47 | Thread.Sleep(maxElapsedTime - stopwatch.Elapsed);
48 | }
49 |
50 | stopwatch.Stop();
51 | deltatime = stopwatch.Elapsed;
52 | if (deltatime > maxBreakTime) {
53 | deltatime = maxElapsedTime;
54 | }
55 | stopwatch.Reset();
56 | }
57 | }
58 |
59 | private void LoadContent() {
60 | form = new Form {
61 | Size = new Size(Width, Height),
62 | StartPosition = FormStartPosition.CenterScreen
63 | };
64 | formGraphics = form.CreateGraphics();
65 | camera = new Camera { Position = new Vector(0, 0, 10), Target = Vector.Zero };
66 | buffer = new GraphicsBuffer(Width, Height, camera);
67 | meshes = Mesh.FromBabylonModel("Contents/monkey.babylon");
68 | }
69 |
70 | private void Present() {
71 | formGraphics.DrawImage(buffer.Current, Point.Empty);
72 | }
73 |
74 | private void Render(TimeSpan dt) {
75 | var device = buffer.BackgroundGraphicsDevice;
76 | device.Clear(Color.White);
77 | device.DrawMeshes(meshes, Color.CadetBlue);
78 | device.DrawString($"FPS: {1000.0 / dt.Milliseconds:F2}", defaultFont, Brushes.Black, 0, 0);
79 | }
80 |
81 | private void Update(TimeSpan dt) {
82 | foreach (var mesh in meshes) {
83 | mesh.Rotation += new Vector(0, 0.1f, 0);
84 | }
85 | }
86 | }
87 | }
--------------------------------------------------------------------------------
/src/SoftwareRenderer/SoftwareRenderer/Vector.cs:
--------------------------------------------------------------------------------
1 | using System.Drawing;
2 |
3 | namespace SoftwareRenderer
4 | {
5 | public struct Vector
6 | {
7 | public Vector(float x, float y, float z) {
8 | Values = new float[3];
9 | Values[0] = x;
10 | Values[1] = y;
11 | Values[2] = z;
12 | }
13 |
14 | public Vector(float value) {
15 | Values = new float[3];
16 | Values[0] = value;
17 | Values[1] = value;
18 | Values[2] = value;
19 | }
20 |
21 | public float Length =>
22 | (float)System.Math.Sqrt(Values[0] * Values[0] + Values[1] * Values[1] + Values[2] * Values[2])
23 | ;
24 |
25 | public static Vector One => new Vector(1);
26 |
27 | public static Vector UnitX => new Vector(1, 0, 0);
28 |
29 | public static Vector UnitY => new Vector(0, 1, 0);
30 |
31 | public static Vector UnitZ => new Vector(0, 0, 1);
32 |
33 | public float X
34 | {
35 | get { return Values[0]; }
36 | set { Values[0] = value; }
37 | }
38 |
39 | public float Y
40 | {
41 | get { return Values[1]; }
42 | set { Values[1] = value; }
43 | }
44 |
45 | public float Z
46 | {
47 | get { return Values[2]; }
48 | set { Values[2] = value; }
49 | }
50 |
51 | public static Vector Zero => new Vector(0);
52 | private float[] Values { get; }
53 |
54 | public static implicit operator Point(Vector v) {
55 | return new Point((int)v.X, (int)v.Y);
56 | }
57 |
58 | public static implicit operator PointF(Vector v) {
59 | return new PointF(v.X, v.Y);
60 | }
61 |
62 | public static Vector operator -(Vector a, Vector b) {
63 | return new Vector(0) {
64 | Values = {
65 | [0] = a.Values[0] - b.Values[0],
66 | [1] = a.Values[1] - b.Values[1],
67 | [2] = a.Values[2] - b.Values[2]
68 | }
69 | };
70 | }
71 |
72 | public static Vector operator *(Vector a, float factor) {
73 | return new Vector(0) {
74 | Values = {
75 | [0] = a.Values[0]*factor,
76 | [1] = a.Values[1]*factor,
77 | [2] = a.Values[2]*factor
78 | }
79 | };
80 | }
81 |
82 | public static Vector operator /(Vector a, float factor) {
83 | return new Vector(0) {
84 | Values = {
85 | [0] = a.Values[0]/factor,
86 | [1] = a.Values[1]/factor,
87 | [2] = a.Values[2]/factor
88 | }
89 | };
90 | }
91 |
92 | public static Vector operator +(Vector a, Vector b) {
93 | return new Vector(0) {
94 | Values = {
95 | [0] = a.Values[0] + b.Values[0],
96 | [1] = a.Values[1] + b.Values[1],
97 | [2] = a.Values[2] + b.Values[2]
98 | }
99 | };
100 | }
101 |
102 | public Vector Cross(Vector v) {
103 | return new Vector(Y * v.Z - Z * v.Y, Z * v.X - X * v.Z, X * v.Y - Y * v.X);
104 | }
105 |
106 | public float Dot(Vector v) {
107 | return X * v.X + Y * v.Y + Z * v.Z;
108 | }
109 |
110 | public Vector Interpolate(Vector v, float factor) {
111 | return this + (v - this) * factor;
112 | }
113 | public Vector Normalize() {
114 | var length = Length;
115 | var factor = 0f;
116 | if (length > 0) {
117 | factor = 1.0f / length;
118 | }
119 | return new Vector(X * factor, Y * factor, Z * factor);
120 | }
121 | }
122 | }
--------------------------------------------------------------------------------
/src/SoftwareRenderer/SoftwareRenderer/SoftwareRenderer.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | {2A47D0E8-32C8-4BC3-9C1F-A74D690BE7E7}
8 | WinExe
9 | Properties
10 | SoftwareRenderer
11 | SoftwareRenderer
12 | v4.6.1
13 | 512
14 | true
15 |
16 |
17 | AnyCPU
18 | true
19 | full
20 | false
21 | bin\Debug\
22 | DEBUG;TRACE
23 | prompt
24 | 4
25 | true
26 |
27 |
28 | AnyCPU
29 | pdbonly
30 | true
31 | bin\Release\
32 | TRACE
33 | prompt
34 | 4
35 | true
36 |
37 |
38 |
39 |
40 |
41 | app.manifest
42 |
43 |
44 |
45 | False
46 | Libs\FadeJson.dll
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 | PreserveNewest
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
90 |
--------------------------------------------------------------------------------
/src/web-paint/src/components/Toolbar.tsx:
--------------------------------------------------------------------------------
1 | import { Button, Popover, Radio } from "antd";
2 | import { observer } from "mobx-react";
3 | import * as React from "react";
4 | import { ColorResult, SketchPicker } from "react-color";
5 | import * as ReactDOM from "react-dom";
6 | import DecimalSlider from "../components/DecimalSlider";
7 | import EventBus from "../EventBus";
8 | import PenType from "../interfaces/PenType";
9 | import Store from "../store";
10 | import Style from "./Toolbar.style";
11 |
12 | const ButtonGroup = Button.Group;
13 |
14 | interface IToolbarProps {
15 | store: Store;
16 | }
17 |
18 | @observer
19 | class Toolbar extends React.Component {
20 | private store: Store;
21 |
22 | public constructor(props: IToolbarProps) {
23 | super(props);
24 | this.store = this.props.store;
25 | }
26 |
27 | public render() {
28 | return (
29 |
30 |
31 |
37 |
38 |
39 |
40 |
44 | 铅笔
45 | 直线
46 | 矩形
47 | 正圆
48 |
49 |
50 |
51 |
52 | (this.store.lineWidth = e)}
59 | />
60 | }
61 | arrowPointAtCenter>
62 |
63 |
64 | this.onLineColorChange(e)}
70 | />
71 | }
72 | arrowPointAtCenter
73 | mouseLeaveDelay={0.2}>
74 |
75 |
76 | this.onFillColorChange(e)}
83 | />
84 | }
85 | arrowPointAtCenter>
86 |
87 |
88 |
89 |
90 |
91 |
97 |
98 |
99 |
100 |
106 |
107 |
108 | );
109 | }
110 |
111 | private onLineColorChange(e: ColorResult) {
112 | this.store.lineColor = e.hex;
113 | }
114 |
115 | private onFillColorChange(e: ColorResult) {
116 | this.store.fillColor = e.hex;
117 | }
118 |
119 | private onBtnClearClick(e: React.FormEvent) {
120 | EventBus.$emit("canvas:clearCommands");
121 | }
122 |
123 | private onBtnSaveClick(e: React.FormEvent) {
124 | EventBus.$emit("canvas:save");
125 | }
126 |
127 | private onBtnUndoClick(e: React.FormEvent) {
128 | EventBus.$emit("canvas:undo");
129 | }
130 |
131 | private onDrawTypeChanged(e: any) {
132 | this.props.store.drawType = e.target.value;
133 | }
134 | }
135 |
136 | export default Toolbar;
137 |
--------------------------------------------------------------------------------
/src/SoftwareRenderer/SoftwareRenderer/GraphicsDevice.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Drawing;
3 | using System.Drawing.Imaging;
4 | using System.Runtime.InteropServices;
5 |
6 | namespace SoftwareRenderer
7 | {
8 | public class GraphicsDevice : IDisposable
9 | {
10 | private readonly byte[] bytes;
11 | private readonly Camera camera;
12 | private readonly Bitmap canvas;
13 | private readonly Graphics canvasGraphics;
14 |
15 | private readonly byte[] emptyBytes;
16 | private readonly float[] zBuffer;
17 |
18 | private Color lastClearColor;
19 |
20 | public GraphicsDevice(Bitmap bitmap, Camera camera) {
21 | canvas = bitmap;
22 | this.camera = camera;
23 | canvasGraphics = Graphics.FromImage(canvas);
24 | bytes = new byte[Width * Height * 4];
25 | emptyBytes = new byte[Width * Height * 4];
26 | zBuffer = new float[Width * Height];
27 | }
28 |
29 | private int Height => canvas.Height;
30 | private int Width => canvas.Width;
31 |
32 | public void Clear(Color color) {
33 | Flush();
34 | if (color != lastClearColor) {
35 | for (var i = 0; i < emptyBytes.Length; i += 4) {
36 | emptyBytes[i] = color.B;
37 | emptyBytes[i + 1] = color.G;
38 | emptyBytes[i + 2] = color.R;
39 | emptyBytes[i + 3] = color.A;
40 | }
41 | lastClearColor = color;
42 | }
43 | Array.Clear(zBuffer, 0, zBuffer.Length);
44 | Array.Copy(emptyBytes, bytes, emptyBytes.Length);
45 | }
46 |
47 | public void Dispose() {
48 | canvasGraphics.Dispose();
49 | }
50 |
51 | public void DrawLine(Vector p0, Vector p1, Color color) {
52 | canvasGraphics.DrawLine(new Pen(color), p0, p1);
53 | }
54 |
55 | public void DrawMeshes(Mesh[] meshes, Color color) {
56 | var view = Matrix.LookAtLH(camera.Position, camera.Target, Vector.UnitY);
57 | var projection = Matrix.PerspectiveFovLH((float)(Math.PI / 4.0), (float)Width / Height, 0.1f, 1);
58 |
59 | foreach (var mesh in meshes) {
60 | var rotation = Matrix.Rotation(mesh.Rotation);
61 | var translation = Matrix.Translation(mesh.Position);
62 | var world = rotation * translation;
63 | var transform = world * view * projection;
64 |
65 | foreach (var face in mesh.Surfaces) {
66 | var v1 = Project(mesh.Vertices[face.A], transform);
67 | var v2 = Project(mesh.Vertices[face.B], transform);
68 | var v3 = Project(mesh.Vertices[face.C], transform);
69 | DrawTriangle(v1, v2, v3, color);
70 | }
71 | }
72 | }
73 |
74 | public void DrawPoint(Vector point, Color color) {
75 | DrawPoint((int)point.X, (int)point.Y, point.Z, color);
76 | }
77 |
78 | public void DrawPoint(int x, int y, Color color) {
79 | SetPixel(x, y, color);
80 | }
81 |
82 | public void DrawPoint(int x, int y, float z, Color color) {
83 | var index = y * Width + x;
84 | if (zBuffer[index] > z) {
85 | return;
86 | }
87 | zBuffer[index] = z;
88 | SetPixel(x, y, color);
89 | }
90 |
91 | public void DrawString(string str, Font font, Brush brush, float x, float y) {
92 | canvasGraphics.DrawString(str, font, brush, x, y);
93 | }
94 |
95 | public void DrawTriangle(Vector pa, Vector pb, Vector pc, Color color) {
96 | var a = pa - pb;
97 | var b = pc - pb;
98 | var n = a.Cross(b);
99 | var v = camera.Target - camera.Position;
100 | if (n.Dot(v) >= 0) {
101 | return;
102 | }
103 | DrawLine(pa, pb, color);
104 | DrawLine(pa, pc, color);
105 | DrawLine(pc, pb, color);
106 | }
107 |
108 | public void Flush() {
109 | var bits = canvas.LockBits(new Rectangle(0, 0, Width, Height), ImageLockMode.WriteOnly, canvas.PixelFormat);
110 | Marshal.Copy(bytes, 0, bits.Scan0, bytes.Length);
111 | canvas.UnlockBits(bits);
112 | }
113 |
114 | private Vector Project(Vector coord, Matrix transformMatrix) {
115 | var p = transformMatrix.Transform(coord);
116 | p.X = p.X * Width + Width / 2f;
117 | p.Y = -p.Y * Height + Height / 2f;
118 | return p;
119 | }
120 |
121 | private void SetPixel(int x, int y, Color color) {
122 | if (x < 0 || x >= Width || y < 0 || y >= Height) {
123 | return;
124 | }
125 | var index = (x + y * Width) * 4;
126 | bytes[index] = color.B;
127 | bytes[index + 1] = color.G;
128 | bytes[index + 2] = color.R;
129 | bytes[index + 3] = color.A;
130 | }
131 | }
132 | }
--------------------------------------------------------------------------------
/src/BrainfuckInterpreter/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 |
4 | # User-specific files
5 | *.suo
6 | *.user
7 | *.userosscache
8 | *.sln.docstates
9 |
10 | # User-specific files (MonoDevelop/Xamarin Studio)
11 | *.userprefs
12 |
13 | # Build results
14 | [Dd]ebug/
15 | [Dd]ebugPublic/
16 | [Rr]elease/
17 | [Rr]eleases/
18 | x64/
19 | x86/
20 | bld/
21 | [Bb]in/
22 | [Oo]bj/
23 | [Ll]og/
24 |
25 | # Visual Studio 2015 cache/options directory
26 | .vs/
27 | # Uncomment if you have tasks that create the project's static files in wwwroot
28 | #wwwroot/
29 |
30 | # MSTest test Results
31 | [Tt]est[Rr]esult*/
32 | [Bb]uild[Ll]og.*
33 |
34 | # NUNIT
35 | *.VisualState.xml
36 | TestResult.xml
37 |
38 | # Build Results of an ATL Project
39 | [Dd]ebugPS/
40 | [Rr]eleasePS/
41 | dlldata.c
42 |
43 | # DNX
44 | project.lock.json
45 | project.fragment.lock.json
46 | artifacts/
47 |
48 | *_i.c
49 | *_p.c
50 | *_i.h
51 | *.ilk
52 | *.meta
53 | *.obj
54 | *.pch
55 | *.pdb
56 | *.pgc
57 | *.pgd
58 | *.rsp
59 | *.sbr
60 | *.tlb
61 | *.tli
62 | *.tlh
63 | *.tmp
64 | *.tmp_proj
65 | *.log
66 | *.vspscc
67 | *.vssscc
68 | .builds
69 | *.pidb
70 | *.svclog
71 | *.scc
72 |
73 | # Chutzpah Test files
74 | _Chutzpah*
75 |
76 | # Visual C++ cache files
77 | ipch/
78 | *.aps
79 | *.ncb
80 | *.opendb
81 | *.opensdf
82 | *.sdf
83 | *.cachefile
84 | *.VC.db
85 | *.VC.VC.opendb
86 |
87 | # Visual Studio profiler
88 | *.psess
89 | *.vsp
90 | *.vspx
91 | *.sap
92 |
93 | # TFS 2012 Local Workspace
94 | $tf/
95 |
96 | # Guidance Automation Toolkit
97 | *.gpState
98 |
99 | # ReSharper is a .NET coding add-in
100 | _ReSharper*/
101 | *.[Rr]e[Ss]harper
102 | *.DotSettings.user
103 |
104 | # JustCode is a .NET coding add-in
105 | .JustCode
106 |
107 | # TeamCity is a build add-in
108 | _TeamCity*
109 |
110 | # DotCover is a Code Coverage Tool
111 | *.dotCover
112 |
113 | # NCrunch
114 | _NCrunch_*
115 | .*crunch*.local.xml
116 | nCrunchTemp_*
117 |
118 | # MightyMoose
119 | *.mm.*
120 | AutoTest.Net/
121 |
122 | # Web workbench (sass)
123 | .sass-cache/
124 |
125 | # Installshield output folder
126 | [Ee]xpress/
127 |
128 | # DocProject is a documentation generator add-in
129 | DocProject/buildhelp/
130 | DocProject/Help/*.HxT
131 | DocProject/Help/*.HxC
132 | DocProject/Help/*.hhc
133 | DocProject/Help/*.hhk
134 | DocProject/Help/*.hhp
135 | DocProject/Help/Html2
136 | DocProject/Help/html
137 |
138 | # Click-Once directory
139 | publish/
140 |
141 | # Publish Web Output
142 | *.[Pp]ublish.xml
143 | *.azurePubxml
144 | # TODO: Comment the next line if you want to checkin your web deploy settings
145 | # but database connection strings (with potential passwords) will be unencrypted
146 | #*.pubxml
147 | *.publishproj
148 |
149 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
150 | # checkin your Azure Web App publish settings, but sensitive information contained
151 | # in these scripts will be unencrypted
152 | PublishScripts/
153 |
154 | # NuGet Packages
155 | *.nupkg
156 | # The packages folder can be ignored because of Package Restore
157 | **/packages/*
158 | # except build/, which is used as an MSBuild target.
159 | !**/packages/build/
160 | # Uncomment if necessary however generally it will be regenerated when needed
161 | #!**/packages/repositories.config
162 | # NuGet v3's project.json files produces more ignoreable files
163 | *.nuget.props
164 | *.nuget.targets
165 |
166 | # Microsoft Azure Build Output
167 | csx/
168 | *.build.csdef
169 |
170 | # Microsoft Azure Emulator
171 | ecf/
172 | rcf/
173 |
174 | # Windows Store app package directories and files
175 | AppPackages/
176 | BundleArtifacts/
177 | Package.StoreAssociation.xml
178 | _pkginfo.txt
179 |
180 | # Visual Studio cache files
181 | # files ending in .cache can be ignored
182 | *.[Cc]ache
183 | # but keep track of directories ending in .cache
184 | !*.[Cc]ache/
185 |
186 | # Others
187 | ClientBin/
188 | ~$*
189 | *~
190 | *.dbmdl
191 | *.dbproj.schemaview
192 | *.jfm
193 | *.pfx
194 | *.publishsettings
195 | node_modules/
196 | orleans.codegen.cs
197 |
198 | # Since there are multiple workflows, uncomment next line to ignore bower_components
199 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
200 | #bower_components/
201 |
202 | # RIA/Silverlight projects
203 | Generated_Code/
204 |
205 | # Backup & report files from converting an old project file
206 | # to a newer Visual Studio version. Backup files are not needed,
207 | # because we have git ;-)
208 | _UpgradeReport_Files/
209 | Backup*/
210 | UpgradeLog*.XML
211 | UpgradeLog*.htm
212 |
213 | # SQL Server files
214 | *.mdf
215 | *.ldf
216 |
217 | # Business Intelligence projects
218 | *.rdl.data
219 | *.bim.layout
220 | *.bim_*.settings
221 |
222 | # Microsoft Fakes
223 | FakesAssemblies/
224 |
225 | # GhostDoc plugin setting file
226 | *.GhostDoc.xml
227 |
228 | # Node.js Tools for Visual Studio
229 | .ntvs_analysis.dat
230 |
231 | # Visual Studio 6 build log
232 | *.plg
233 |
234 | # Visual Studio 6 workspace options file
235 | *.opt
236 |
237 | # Visual Studio LightSwitch build output
238 | **/*.HTMLClient/GeneratedArtifacts
239 | **/*.DesktopClient/GeneratedArtifacts
240 | **/*.DesktopClient/ModelManifest.xml
241 | **/*.Server/GeneratedArtifacts
242 | **/*.Server/ModelManifest.xml
243 | _Pvt_Extensions
244 |
245 | # Paket dependency manager
246 | .paket/paket.exe
247 | paket-files/
248 |
249 | # FAKE - F# Make
250 | .fake/
251 |
252 | # JetBrains Rider
253 | .idea/
254 | *.sln.iml
255 |
256 | # CodeRush
257 | .cr/
258 |
259 | # Python Tools for Visual Studio (PTVS)
260 | __pycache__/
261 | *.pyc
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 |
4 | # User-specific files
5 | *.suo
6 | *.user
7 | *.userosscache
8 | *.sln.docstates
9 |
10 | # User-specific files (MonoDevelop/Xamarin Studio)
11 | *.userprefs
12 |
13 | # Build results
14 | [Dd]ebug/
15 | [Dd]ebugPublic/
16 | [Rr]elease/
17 | [Rr]eleases/
18 | x64/
19 | x86/
20 | bld/
21 | [Bb]in/
22 | [Oo]bj/
23 |
24 | # Visual Studio 2015 cache/options directory
25 | .vs/
26 | # Uncomment if you have tasks that create the project's static files in wwwroot
27 | #wwwroot/
28 |
29 | # MSTest test Results
30 | [Tt]est[Rr]esult*/
31 | [Bb]uild[Ll]og.*
32 |
33 | # NUNIT
34 | *.VisualState.xml
35 | TestResult.xml
36 |
37 | # Build Results of an ATL Project
38 | [Dd]ebugPS/
39 | [Rr]eleasePS/
40 | dlldata.c
41 |
42 | # DNX
43 | project.lock.json
44 | artifacts/
45 |
46 | *_i.c
47 | *_p.c
48 | *_i.h
49 | *.ilk
50 | *.meta
51 | *.obj
52 | *.pch
53 | *.pdb
54 | *.pgc
55 | *.pgd
56 | *.rsp
57 | *.sbr
58 | *.tlb
59 | *.tli
60 | *.tlh
61 | *.tmp
62 | *.tmp_proj
63 | *.log
64 | *.vspscc
65 | *.vssscc
66 | .builds
67 | *.pidb
68 | *.svclog
69 | *.scc
70 |
71 | # Chutzpah Test files
72 | _Chutzpah*
73 |
74 | # Visual C++ cache files
75 | ipch/
76 | *.aps
77 | *.ncb
78 | *.opensdf
79 | *.sdf
80 | *.cachefile
81 |
82 | # Visual Studio profiler
83 | *.psess
84 | *.vsp
85 | *.vspx
86 | *.sap
87 |
88 | # TFS 2012 Local Workspace
89 | $tf/
90 |
91 | # Guidance Automation Toolkit
92 | *.gpState
93 |
94 | # ReSharper is a .NET coding add-in
95 | _ReSharper*/
96 | *.[Rr]e[Ss]harper
97 | *.DotSettings.user
98 |
99 | # JustCode is a .NET coding add-in
100 | .JustCode
101 |
102 | # TeamCity is a build add-in
103 | _TeamCity*
104 |
105 | # DotCover is a Code Coverage Tool
106 | *.dotCover
107 |
108 | # NCrunch
109 | _NCrunch_*
110 | .*crunch*.local.xml
111 | nCrunchTemp_*
112 |
113 | # MightyMoose
114 | *.mm.*
115 | AutoTest.Net/
116 |
117 | # Web workbench (sass)
118 | .sass-cache/
119 |
120 | # Installshield output folder
121 | [Ee]xpress/
122 |
123 | # DocProject is a documentation generator add-in
124 | DocProject/buildhelp/
125 | DocProject/Help/*.HxT
126 | DocProject/Help/*.HxC
127 | DocProject/Help/*.hhc
128 | DocProject/Help/*.hhk
129 | DocProject/Help/*.hhp
130 | DocProject/Help/Html2
131 | DocProject/Help/html
132 |
133 | # Click-Once directory
134 | publish/
135 |
136 | # Publish Web Output
137 | *.[Pp]ublish.xml
138 | *.azurePubxml
139 | # TODO: Comment the next line if you want to checkin your web deploy settings
140 | # but database connection strings (with potential passwords) will be unencrypted
141 | *.pubxml
142 | *.publishproj
143 |
144 | # NuGet Packages
145 | *.nupkg
146 | # The packages folder can be ignored because of Package Restore
147 | **/packages/*
148 | # except build/, which is used as an MSBuild target.
149 | !**/packages/build/
150 | # Uncomment if necessary however generally it will be regenerated when needed
151 | #!**/packages/repositories.config
152 |
153 | # Windows Azure Build Output
154 | csx/
155 | *.build.csdef
156 |
157 | # Windows Azure Emulator
158 | efc/
159 | rfc/
160 |
161 | # Windows Store app package directory
162 | AppPackages/
163 |
164 | # Visual Studio cache files
165 | # files ending in .cache can be ignored
166 | *.[Cc]ache
167 | # but keep track of directories ending in .cache
168 | !*.[Cc]ache/
169 |
170 | # Others
171 | ClientBin/
172 | [Ss]tyle[Cc]op.*
173 | ~$*
174 | *~
175 | *.dbmdl
176 | *.dbproj.schemaview
177 | *.pfx
178 | *.publishsettings
179 | node_modules/
180 | orleans.codegen.cs
181 |
182 | # RIA/Silverlight projects
183 | Generated_Code/
184 |
185 | # Backup & report files from converting an old project file
186 | # to a newer Visual Studio version. Backup files are not needed,
187 | # because we have git ;-)
188 | _UpgradeReport_Files/
189 | Backup*/
190 | UpgradeLog*.XML
191 | UpgradeLog*.htm
192 |
193 | # SQL Server files
194 | *.mdf
195 | *.ldf
196 |
197 | # Business Intelligence projects
198 | *.rdl.data
199 | *.bim.layout
200 | *.bim_*.settings
201 |
202 | # Microsoft Fakes
203 | FakesAssemblies/
204 |
205 | # GhostDoc plugin setting file
206 | *.GhostDoc.xml
207 |
208 | # Node.js Tools for Visual Studio
209 | .ntvs_analysis.dat
210 |
211 | # Visual Studio 6 build log
212 | *.plg
213 |
214 | # Visual Studio 6 workspace options file
215 | *.opt
216 |
217 | # Visual Studio LightSwitch build output
218 | **/*.HTMLClient/GeneratedArtifacts
219 | **/*.DesktopClient/GeneratedArtifacts
220 | **/*.DesktopClient/ModelManifest.xml
221 | **/*.Server/GeneratedArtifacts
222 | **/*.Server/ModelManifest.xml
223 | _Pvt_Extensions
224 |
225 | # Paket dependency manager
226 | .paket/paket.exe
227 |
228 | # FAKE - F# Make
229 | .fake/
230 |
231 | # =========================
232 | # Operating System Files
233 | # =========================
234 |
235 | # OSX
236 | # =========================
237 |
238 | .DS_Store
239 | .AppleDouble
240 | .LSOverride
241 |
242 | # Thumbnails
243 | ._*
244 |
245 | # Files that might appear in the root of a volume
246 | .DocumentRevisions-V100
247 | .fseventsd
248 | .Spotlight-V100
249 | .TemporaryItems
250 | .Trashes
251 | .VolumeIcon.icns
252 |
253 | # Directories potentially created on remote AFP share
254 | .AppleDB
255 | .AppleDesktop
256 | Network Trash Folder
257 | Temporary Items
258 | .apdisk
259 |
260 | # Windows
261 | # =========================
262 |
263 | # Windows image file caches
264 | Thumbs.db
265 | ehthumbs.db
266 |
267 | # Folder config file
268 | Desktop.ini
269 |
270 | # Recycle Bin used on file shares
271 | $RECYCLE.BIN/
272 |
273 | # Windows Installer files
274 | *.cab
275 | *.msi
276 | *.msm
277 | *.msp
278 |
279 | # Windows shortcuts
280 | *.lnk
281 |
282 | dist/
283 | .vscode
--------------------------------------------------------------------------------
/src/SoftwareRenderer/SoftwareRenderer/Matrix.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Linq;
3 |
4 | namespace SoftwareRenderer
5 | {
6 | public struct Matrix
7 | {
8 | public Matrix(float[] values = null) {
9 | Values = new float[16];
10 | if (values == null) {
11 | return;
12 | }
13 | for (var i = 0; i < Values.Length; i++) {
14 | Values[i] = values[i];
15 | }
16 | }
17 |
18 | public static Matrix Identity => new Matrix(new float[16] {
19 | 1, 0, 0, 0,
20 | 0, 1, 0, 0,
21 | 0, 0, 1, 0,
22 | 0, 0, 0, 1
23 | });
24 |
25 | public float[] Values { get; }
26 |
27 | public static Matrix LookAtLH(Vector eye, Vector target, Vector up) {
28 | var axisZ = (target - eye).Normalize();
29 | var axisX = up.Cross(axisZ).Normalize();
30 | var axisY = axisZ.Cross(axisX).Normalize();
31 |
32 | var eyeX = -axisX.Dot(eye);
33 | var eyeY = -axisY.Dot(eye);
34 | var eyeZ = -axisZ.Dot(eye);
35 |
36 | return new Matrix(new[] {
37 | axisX.X, axisY.X, axisZ.X, 0,
38 | axisX.Y, axisY.Y, axisZ.Y, 0,
39 | axisX.Z, axisY.Z, axisZ.Z, 0,
40 | eyeX, eyeY, eyeZ, 1
41 | });
42 | }
43 |
44 | public static bool operator !=(Matrix a, Matrix b) {
45 | return !(a == b);
46 | }
47 |
48 | public static Matrix operator *(Matrix a, Matrix b) {
49 | var values = new float[16];
50 | for (var index = 0; index < 16; index++) {
51 | var i = index / 4;
52 | var j = index % 4;
53 | values[index] =
54 | a.Values[i * 4] * b.Values[j] +
55 | a.Values[i * 4 + 1] * b.Values[1 * 4 + j] +
56 | a.Values[i * 4 + 2] * b.Values[2 * 4 + j] +
57 | a.Values[i * 4 + 3] * b.Values[3 * 4 + j];
58 | }
59 | return new Matrix(values);
60 | }
61 |
62 | public static bool operator ==(Matrix a, Matrix b) {
63 | return !a.Values.Where((t, i) => Math.Abs(t - b.Values[i]) > float.MinValue).Any();
64 | }
65 |
66 | public static Matrix PerspectiveFovLH(float fieldOfView, float aspect, float znear, float zfar) {
67 | var height = 1 / (float)Math.Tan(fieldOfView / 2);
68 | var width = height / aspect;
69 | return new Matrix(new[] {
70 | width, 0, 0, 0,
71 | 0, height, 0, 0,
72 | 0, 0, zfar/(zfar - znear), 1,
73 | 0, 0, znear*zfar/(znear - zfar), 0
74 | });
75 | }
76 |
77 | public static Matrix Rotation(Vector r) {
78 | var x = RotationX(r.X);
79 | var y = RotationY(r.Y);
80 | var z = RotationZ(r.Z);
81 | return z * x * y;
82 | }
83 |
84 | public static Matrix RotationX(float angle) {
85 | var s = (float)Math.Sin(angle);
86 | var c = (float)Math.Cos(angle);
87 | var values = new[] {
88 | 1, 0, 0, 0,
89 | 0, c, s, 0,
90 | 0, -s, c, 0,
91 | 0, 0, 0, 1
92 | };
93 | return new Matrix(values);
94 | }
95 |
96 | public static Matrix RotationY(float angle) {
97 | var s = (float)Math.Sin(angle);
98 | var c = (float)Math.Cos(angle);
99 | var values = new[] {
100 | c, 0, -s, 0,
101 | 0, 1, 0, 0,
102 | s, 0, c, 0,
103 | 0, 0, 0, 1
104 | };
105 | return new Matrix(values);
106 | }
107 |
108 | public static Matrix RotationZ(float angle) {
109 | var s = (float)Math.Sin(angle);
110 | var c = (float)Math.Cos(angle);
111 | var values = new[] {
112 | c, s, 0, 0,
113 | -s, c, 0, 0,
114 | 0, 0, 1, 0,
115 | 0, 0, 0, 1,
116 | };
117 | return new Matrix(values);
118 | }
119 |
120 | public static Matrix Scale(Vector s) {
121 | var values = new[] {
122 | s.X, 0, 0, 0,
123 | 0, s.Y, 0, 0,
124 | 0, 0, s.Z, 0,
125 | 0, 0, 0, 1
126 | };
127 | return new Matrix(values);
128 | }
129 |
130 | public static Matrix Translation(Vector t) {
131 | var values = new[] {
132 | 1, 0, 0, 0,
133 | 0, 1, 0, 0,
134 | 0, 0, 1, 0,
135 | t.X, t.Y, t.Z, 1
136 | };
137 | return new Matrix(values);
138 | }
139 |
140 | public bool Equals(Matrix other) {
141 | return Equals(Values, other.Values);
142 | }
143 |
144 | public override bool Equals(object obj) {
145 | if (ReferenceEquals(null, obj)) {
146 | return false;
147 | }
148 | return obj is Matrix && Equals((Matrix)obj);
149 | }
150 |
151 | public override int GetHashCode() {
152 | return Values?.GetHashCode() ?? 0;
153 | }
154 |
155 | public Vector Transform(Vector v) {
156 | var x = v.X * Values[0 * 4 + 0] + v.Y * Values[1 * 4 + 0] + v.Z * Values[2 * 4 + 0] + Values[3 * 4 + 0];
157 | var y = v.X * Values[0 * 4 + 1] + v.Y * Values[1 * 4 + 1] + v.Z * Values[2 * 4 + 1] + Values[3 * 4 + 1];
158 | var z = v.X * Values[0 * 4 + 2] + v.Y * Values[1 * 4 + 2] + v.Z * Values[2 * 4 + 2] + Values[3 * 4 + 2];
159 | var w = v.X * Values[0 * 4 + 3] + v.Y * Values[1 * 4 + 3] + v.Z * Values[2 * 4 + 3] + Values[3 * 4 + 3];
160 | return new Vector(x / w, y / w, z / w);
161 | }
162 | }
163 | }
--------------------------------------------------------------------------------
/src/web-paint/src/components/Canvas.tsx:
--------------------------------------------------------------------------------
1 | import { Card, Input, message, Modal } from "antd";
2 | import { saveAs } from "file-saver";
3 | import { autorun, IReactionDisposer } from "mobx";
4 | import { observer } from "mobx-react";
5 | import * as React from "react";
6 | import * as ReactDOM from "react-dom";
7 | import EventBus from "../EventBus";
8 | import IDrawCommand from "../interfaces/IDrawCommand";
9 | import IPoint from "../interfaces/IPoint";
10 | import PenType from "../interfaces/PenType";
11 | import MouseState from "../MouseState";
12 | import Store from "../store";
13 |
14 | interface ICanvasProps {
15 | id: string;
16 | width: number;
17 | height: number;
18 | store: Store;
19 | style: React.CSSProperties;
20 | }
21 |
22 | @observer
23 | class Canvas extends React.Component {
24 | private store: Store;
25 | private rect: any;
26 | private prevPath: IPoint[] = [];
27 | private drawDisposer: IReactionDisposer;
28 |
29 | public constructor(props: ICanvasProps) {
30 | super(props);
31 | this.store = props.store;
32 | }
33 |
34 | public clearCanvas() {
35 | const { width, height } = this.props;
36 | this.ctx.fillStyle = "#fff";
37 | this.ctx.fillRect(0, 0, width, height);
38 | }
39 |
40 | public clearCommands() {
41 | this.store.drawCommands = [];
42 | }
43 |
44 | public undo() {
45 | this.store.drawCommands.pop();
46 | }
47 |
48 | public draw(commands: IDrawCommand[]) {
49 | this.clearCanvas();
50 | commands.forEach(it => {
51 | this.drawCommand(it);
52 | });
53 | }
54 |
55 | public render() {
56 | const { width, height, id, style } = this.props;
57 | return (
58 |
59 |
71 | this.onSaveOk(e)}
75 | onCancel={e => this.onSaveCancel(e)}>
76 | (this.store.fileName = e.target.value)}
81 | />
82 |
83 |
84 | );
85 | }
86 |
87 | public componentDidMount() {
88 | this.drawDisposer = autorun(() => {
89 | this.draw(this.store.drawCommands);
90 | });
91 | EventBus.$on("canvas:clearCommands", this.clearCommands.bind(this));
92 | EventBus.$on("canvas:undo", this.undo.bind(this));
93 | EventBus.$on("canvas:save", this.save.bind(this));
94 | }
95 |
96 | public componentWillUnmount() {
97 | this.drawDisposer();
98 | }
99 |
100 | private get Position(): IPoint {
101 | const rect = ReactDOM.findDOMNode(this.canvas).getBoundingClientRect();
102 | return { x: rect.left, y: rect.top };
103 | }
104 |
105 | private get canvas(): HTMLCanvasElement {
106 | const canvas = document.getElementById(this.props.id);
107 | if (!canvas) {
108 | throw new Error("[FATAL] Canvas is null");
109 | }
110 | return canvas as HTMLCanvasElement;
111 | }
112 |
113 | private get ctx(): CanvasRenderingContext2D {
114 | const ctx = this.canvas.getContext("2d");
115 | if (!ctx) {
116 | throw new Error("[FATAL] ctx is null");
117 | }
118 | return ctx;
119 | }
120 |
121 | private drawCommand(command: IDrawCommand) {
122 | const ctx = this.ctx;
123 | const { fillColor, lineColor, lineWidth, type, path } = command;
124 |
125 | ctx.beginPath();
126 | ctx.lineWidth = lineWidth;
127 | ctx.strokeStyle = lineColor;
128 | ctx.fillStyle = fillColor;
129 | switch (type) {
130 | case PenType.Point: {
131 | const point = path[0];
132 | ctx.fillRect(point.x, point.y, 1, 1);
133 | break;
134 | }
135 | case PenType.Line: {
136 | const start = path[0];
137 | const end = path[1];
138 | ctx.moveTo(start.x, start.y);
139 | ctx.lineTo(end.x, end.y);
140 | break;
141 | }
142 | case PenType.Lines: {
143 | const fstPoint = path[0];
144 | ctx.moveTo(fstPoint.x, fstPoint.y);
145 | let prev = fstPoint;
146 | let cur: IPoint;
147 | for (let i = 1; i < path.length; i++) {
148 | cur = path[i];
149 | ctx.lineTo(cur.x, cur.y);
150 | ctx.moveTo(cur.x, cur.y);
151 | prev = cur;
152 | }
153 | break;
154 | }
155 | case PenType.Rect: {
156 | let { x, y } = path[0];
157 | let x1 = path[1].x;
158 | let y1 = path[1].y;
159 |
160 | const width = Math.abs(x1 - x);
161 | const height = Math.abs(y1 - y);
162 |
163 | if (x1 < x && y1 < y) {
164 | [x, x1] = [x1, x];
165 | [y, y1] = [y1, y];
166 | }
167 |
168 | if (x1 < x && y1 > y) {
169 | [x, y] = [x - width, y];
170 | [x1, y1] = [x1 + width, y1];
171 | }
172 |
173 | if (x1 > x && y1 < y) {
174 | [x, y] = [x, y - height];
175 | [x1, y1] = [x1, y1 + height];
176 | }
177 |
178 | ctx.fillStyle = lineColor;
179 | ctx.fillRect(
180 | x - lineWidth,
181 | y - lineWidth,
182 | width + lineWidth * 2,
183 | height + lineWidth * 2,
184 | );
185 | ctx.fillStyle = fillColor;
186 | ctx.fillRect(x, y, width, height);
187 |
188 | break;
189 | }
190 | case PenType.Circle: {
191 | const origin = path[0];
192 | const p = path[1];
193 | const offsetX = origin.x - p.x;
194 | const offsetY = origin.y - p.y;
195 | const radius = Math.sqrt(
196 | Math.abs(offsetX) ** 2 + Math.abs(offsetY) ** 2,
197 | );
198 | ctx.arc(origin.x, origin.y, radius, 0, 2 * Math.PI);
199 | ctx.fill();
200 | break;
201 | }
202 | }
203 | ctx.stroke();
204 | }
205 |
206 | private createDrawCommand(path: IPoint[]): IDrawCommand {
207 | const clone = (e: string) => JSON.parse(JSON.stringify({ str: e })).str;
208 |
209 | const type = this.store.drawType;
210 | const lineWidth = this.store.lineWidth;
211 | const lineColor = clone(this.store.lineColor);
212 | const fillColor = clone(this.store.fillColor);
213 |
214 | switch (type) {
215 | case PenType.Line: {
216 | return {
217 | type,
218 | path: [path[0], path[path.length - 1]],
219 | lineWidth,
220 | lineColor,
221 | fillColor,
222 | };
223 | }
224 | case PenType.Lines: {
225 | if (path.length === 1) {
226 | return {
227 | type: PenType.Point,
228 | path: [path[path.length - 1]],
229 | lineWidth,
230 | lineColor,
231 | fillColor,
232 | };
233 | }
234 | return { type, path, lineWidth, lineColor, fillColor };
235 | }
236 | case PenType.Rect: {
237 | return {
238 | type,
239 | path: [path[0], path[path.length - 1]],
240 | lineWidth,
241 | lineColor,
242 | fillColor,
243 | };
244 | }
245 | case PenType.Circle: {
246 | return {
247 | type,
248 | path: [path[0], path[path.length - 1]],
249 | lineWidth,
250 | lineColor,
251 | fillColor,
252 | };
253 | }
254 | default: {
255 | throw new Error("Cannot reach here");
256 | }
257 | }
258 | }
259 |
260 | private onMouseEnter(e: React.MouseEvent) {
261 | this.store.mouseState = MouseState.InsideCanvasMouseUp;
262 | }
263 |
264 | private onMouseLeave(e: React.MouseEvent) {
265 | this.store.mouseState = MouseState.OutsideCanvas;
266 | }
267 |
268 | private onMouseDown(e: React.MouseEvent) {
269 | this.store.mouseState = MouseState.InsideCanvasMouseDown;
270 | }
271 |
272 | private onMouseUp(e: React.MouseEvent) {
273 | this.store.mouseState = MouseState.InsideCanvasMouseUp;
274 |
275 | e.persist();
276 | let { x, y } = this.Position;
277 | x = e.pageX - x;
278 | y = e.pageY - y;
279 |
280 | const path = this.prevPath.length === 0 ? [{ x, y }] : this.prevPath;
281 |
282 | const command = this.createDrawCommand(path);
283 | // 提交画图命令
284 | this.store.drawCommands.push(command);
285 | // 清空之前的鼠标路径
286 | this.prevPath = [];
287 | }
288 |
289 | private onMouseMove(e: React.MouseEvent) {
290 | e.persist();
291 |
292 | // 鼠标坐标从屏幕坐标系转换成canvas坐标系
293 | let { x, y } = this.Position;
294 | x = e.pageX - x;
295 | y = e.pageY - y;
296 |
297 | // 鼠标在画布上左键按下并且拖动
298 | if (this.store.mouseState === MouseState.InsideCanvasMouseDown) {
299 | this.prevPath.push({ x, y } as IPoint);
300 | // 预览绘图结果
301 | const command = this.createDrawCommand(this.prevPath);
302 | this.draw(this.store.drawCommands);
303 | this.drawCommand(command);
304 | }
305 | }
306 |
307 | private save() {
308 | this.store.isFileNameDialogShow = true;
309 | }
310 |
311 | private onSaveCancel(e: React.MouseEvent) {
312 | this.store.isFileNameDialogShow = false;
313 | }
314 |
315 | private onSaveOk(e: React.MouseEvent) {
316 | this.canvas.toBlob(blob => {
317 | if (blob) {
318 | saveAs(blob, this.store.fileName);
319 | this.store.isFileNameDialogShow = false;
320 | } else {
321 | message.error("保存失败。将画布转换为文件时出错。");
322 | }
323 | });
324 | }
325 | }
326 |
327 | export default Canvas;
328 |
--------------------------------------------------------------------------------
/src/SoftwareRenderer/SoftwareRenderer/Contents/monkey.babylon:
--------------------------------------------------------------------------------
1 | {
2 | "autoClear": true,
3 | "clearColor": [ 0.0000, 0.0000, 0.0000 ],
4 | "ambientColor": [ 0.0000, 0.0000, 0.0000 ],
5 | "gravity": [ 0.0000, -9.8100, 0.0000 ],
6 | "cameras": [
7 | {
8 | "name": "Camera",
9 | "id": "Camera",
10 | "position": [ 7.4811, 5.3437, -6.5076 ],
11 | "target": [ -0.3174, 0.8953, 0.3125 ],
12 | "fov": 0.8576,
13 | "minZ": 0.1000,
14 | "maxZ": 100.0000,
15 | "speed": 1.0000,
16 | "inertia": 0.9000,
17 | "checkCollisions": false,
18 | "applyGravity": false,
19 | "ellipsoid": [ 0.2000, 0.9000, 0.2000 ]
20 | }
21 | ],
22 | "activeCamera": "Camera",
23 | "lights": [
24 | {
25 | "name": "Lamp",
26 | "id": "Lamp",
27 | "type": 0.0000,
28 | "data": [ 4.0762, 5.9039, 1.0055 ],
29 | "intensity": 1.0000,
30 | "diffuse": [ 1.0000, 1.0000, 1.0000 ],
31 | "specular": [ 1.0000, 1.0000, 1.0000 ]
32 | }
33 | ],
34 | "materials": [ ],
35 | "meshes": [
36 | {
37 | "name": "Suzanne",
38 | "id": "Suzanne",
39 | "position": [ 0.0000, 0.0000, 0.0000 ],
40 | "rotation": [ 0.0000, 0.0000, 0.0000 ],
41 | "scaling": [ 1.0000, 1.0000, 1.0000 ],
42 | "isVisible": true,
43 | "isEnabled": true,
44 | "checkCollisions": false,
45 | "billboardMode": 0,
46 | "uvCount": 0,
47 | "vertices": [ 0.4688, 0.2422, -0.7578, 0.9693, -0.0118, -0.2456, 0.4375, 0.1641, -0.7656, 0.7290, -0.6566, -0.1934, 0.5000, 0.0937, -0.6875, 0.6076, -0.5104, -0.6085, -0.5000, 0.0937, -0.6875, -0.6053, -0.5058, -0.6146, -0.4375, 0.1641, -0.7656, -0.7116, -0.6793, -0.1793, -0.5625, 0.2422, -0.6719, -0.8018, -0.0010, -0.5976, 0.5625, 0.2422, -0.6719, 0.8001, -0.0028, -0.5998, 0.5469, 0.0547, -0.5781, 0.6802, -0.5463, -0.4888, -0.5469, 0.0547, -0.5781, -0.6836, -0.5473, -0.4827, -0.6250, 0.2422, -0.5625, -0.8684, -0.0023, -0.4958, 0.3516, 0.0312, -0.7188, 0.0967, -0.7558, -0.6475, 0.3516, -0.0234, -0.6172, 0.1160, -0.8693, -0.4805, -0.3516, -0.0234, -0.6172, -0.1128, -0.8748, -0.4711, -0.3516, 0.0312, -0.7188, -0.0996, -0.7466, -0.6577, 0.3516, 0.1328, -0.7812, 0.0395, -0.9631, -0.2661, -0.3516, 0.1328, -0.7812, -0.0406, -0.9693, -0.2424, 0.2734, 0.1641, -0.7969, -0.6386, -0.6965, -0.3272, -0.2031, 0.0937, -0.7422, 0.4563, -0.5354, -0.7107, -0.2734, 0.1641, -0.7969, 0.6531, -0.6866, -0.3193, 0.2031, 0.0937, -0.7422, -0.4549, -0.5415, -0.7069, -0.1562, 0.0547, -0.6484, 0.5538, -0.6332, -0.5406, 0.1406, 0.2422, -0.7422, -0.6901, 0.0003, -0.7237, 0.0781, 0.2422, -0.6562, -0.8119, -0.0009, -0.5837, -0.0781, 0.2422, -0.6562, 0.8097, -0.0070, -0.5867, -0.1406, 0.2422, -0.7422, 0.6893, -0.0046, -0.7244, 0.2422, 0.2422, -0.7969, -0.9557, -0.0183, -0.2936, -0.2422, 0.2422, -0.7969, 0.9526, -0.0131, -0.3040, 0.2734, 0.3281, -0.7969, -0.6458, 0.6947, -0.3166, -0.2031, 0.3906, -0.7422, 0.4559, 0.5222, -0.7207, -0.2734, 0.3281, -0.7969, 0.6644, 0.6821, -0.3056, 0.2031, 0.3906, -0.7422, -0.4604, 0.5277, -0.7138, 0.1562, 0.4375, -0.6484, -0.5250, 0.6254, -0.5771, -0.1562, 0.4375, -0.6484, 0.5306, 0.6258, -0.5717, 0.3516, 0.4531, -0.7188, 0.1005, 0.7447, -0.6598, 0.3516, 0.5156, -0.6172, 0.1226, 0.8395, -0.5293, -0.3516, 0.5156, -0.6172, -0.1195, 0.8455, -0.5203, -0.3516, 0.4531, -0.7188, -0.1034, 0.7350, -0.6701, 0.3516, 0.3594, -0.7812, 0.0340, 0.9690, -0.2445, -0.3516, 0.3594, -0.7812, -0.0351, 0.9748, -0.2204, 0.4375, 0.3281, -0.7656, 0.7364, 0.6521, -0.1803, -0.5000, 0.3906, -0.6875, -0.6098, 0.4922, -0.6211, -0.4375, 0.3281, -0.7656, -0.7162, 0.6771, -0.1692, 0.5000, 0.3906, -0.6875, 0.6102, 0.4956, -0.6181, -0.5469, 0.4375, -0.5781, -0.6727, 0.5347, -0.5114, 0.5469, 0.4375, -0.5781, 0.6682, 0.5371, -0.5148, -0.4688, 0.2422, -0.7578, -0.9706, -0.0152, -0.2402, 0.4766, 0.2422, -0.7734, 0.9644, -0.0127, -0.2639, -0.4453, 0.3359, -0.7812, -0.7179, 0.6582, -0.2264, 0.4453, 0.3359, -0.7812, 0.7216, 0.6556, -0.2224, -0.3516, 0.3750, -0.8047, -0.0416, 0.9387, -0.3422, 0.2656, 0.3359, -0.8203, -0.6071, 0.6448, -0.4644, -0.2656, 0.3359, -0.8203, 0.6237, 0.6285, -0.4647, 0.2266, 0.2422, -0.8203, -0.9239, -0.0133, -0.3824, -0.2266, 0.2422, -0.8203, 0.9270, -0.0129, -0.3749, -0.2656, 0.1562, -0.8203, 0.6159, -0.6366, -0.4641, 0.2656, 0.1562, -0.8203, -0.5992, -0.6524, -0.4640, -0.3516, 0.1172, -0.8047, -0.0410, -0.9401, -0.3383, 0.4453, 0.1562, -0.7812, 0.7152, -0.6625, -0.2227, -0.4453, 0.1562, -0.7812, -0.7106, -0.6658, -0.2274, -0.4766, 0.2422, -0.7734, -0.9626, -0.0113, -0.2707, 0.3516, 0.2422, -0.8281, 0.1836, -0.0053, -0.9830, -0.3516, 0.2422, -0.8281, -0.1836, -0.0053, -0.9830, 0.3516, 0.1172, -0.8047, 0.0318, -0.9414, -0.3357, 0.3516, 0.3750, -0.8047, 0.0323, 0.9399, -0.3397, 0.1797, -0.9688, -0.5547, 0.1596, -0.9752, -0.1529, 0.1641, -0.9297, -0.6328, 0.1554, -0.7590, -0.6323, 0.0000, -0.9844, -0.5781, -0.0205, -0.9692, -0.2452, 0.0000, -0.9453, -0.6406, -0.0179, -0.7709, -0.6367, -0.1641, -0.9297, -0.6328, -0.1461, -0.7887, -0.5971, -0.1797, -0.9688, -0.5547, -0.1472, -0.9781, -0.1474, 0.3281, -0.9453, -0.5234, 0.5267, -0.8347, -0.1611, 0.2344, -0.9141, -0.6328, 0.3502, -0.6391, -0.6847, -0.2344, -0.9141, -0.6328, -0.3578, -0.6333, -0.6862, -0.3281, -0.9453, -0.5234, -0.6239, -0.7772, -0.0817, 0.3672, -0.8906, -0.5312, 0.9457, -0.2579, -0.1977, 0.2656, -0.8203, -0.6641, 0.5557, -0.2264, -0.8000, -0.2656, -0.8203, -0.6641, -0.5315, -0.2379, -0.8130, 0.3516, -0.6953, -0.5703, 0.9728, 0.1003, -0.2087, 0.2500, -0.7031, -0.6875, 0.5652, -0.0297, -0.8244, -0.2500, -0.7031, -0.6875, -0.5566, -0.0457, -0.8295, -0.3672, -0.8906, -0.5312, -0.9384, -0.3451, -0.0143, 0.3125, -0.4375, -0.5703, 0.9557, 0.2492, -0.1565, 0.2109, -0.4453, -0.7109, 0.5937, 0.1082, -0.7974, -0.2109, -0.4453, -0.7109, -0.5704, 0.0751, -0.8179, -0.3516, -0.6953, -0.5703, -0.9782, 0.0801, -0.1917, 0.2031, -0.1875, -0.5625, 0.8915, -0.3307, -0.3095, 0.4375, -0.1406, -0.5312, 0.3488, -0.9371, 0.0081, 0.3984, -0.0469, -0.6719, 0.3411, -0.5510, -0.7616, -0.3984, -0.0469, -0.6719, -0.4388, -0.5190, -0.7335, -0.4375, -0.1406, -0.5312, -0.3383, -0.9407, 0.0250, -0.1250, -0.1016, -0.8125, -0.0238, -0.2265, -0.9737, 0.6328, -0.0391, -0.5391, 0.5875, -0.7849, -0.1970, -0.6172, 0.0547, -0.6250, -0.4817, -0.3736, -0.7927, -0.6328, -0.0391, -0.5391, -0.5811, -0.7812, -0.2279, 0.8281, 0.1484, -0.4453, 0.9070, -0.4009, 0.1289, 0.7266, 0.2031, -0.6016, 0.5665, -0.3188, -0.7598, -0.7266, 0.2031, -0.6016, -0.5989, -0.2850, -0.7483, -0.8281, 0.1484, -0.4453, -0.9118, -0.3861, 0.1399, 0.8594, 0.4297, -0.5938, 0.8451, 0.4434, -0.2985, -0.7422, 0.3750, -0.6562, -0.4371, -0.4690, -0.7674, -0.8594, 0.4297, -0.5938, -0.8837, 0.3928, -0.2543, 0.7109, 0.4844, -0.6250, 0.5170, 0.8291, -0.2125, 0.7422, 0.3750, -0.6562, 0.4607, -0.1448, -0.8756, -0.6875, 0.4141, -0.7266, -0.3790, -0.1825, -0.9072, -0.7109, 0.4844, -0.6250, -0.4349, 0.8866, -0.1574, 0.4922, 0.6016, -0.6875, 0.5976, 0.7847, -0.1646, 0.6875, 0.4141, -0.7266, 0.4801, -0.1833, -0.8578, -0.4375, 0.5469, -0.7969, -0.3127, -0.0113, -0.9498, -0.4922, 0.6016, -0.6875, -0.6023, 0.7813, -0.1636, 0.3203, 0.7578, -0.7344, 0.2247, 0.9601, -0.1662, 0.3125, 0.6406, -0.8359, 0.2699, 0.2137, -0.9388, -0.3125, 0.6406, -0.8359, -0.2538, 0.2144, -0.9432, -0.3203, 0.7578, -0.7344, -0.2255, 0.9589, -0.1721, 0.1562, 0.7187, -0.7578, -0.5952, 0.7791, -0.1968, 0.2031, 0.6172, -0.8516, -0.1274, 0.1700, -0.9771, -0.2031, 0.6172, -0.8516, 0.1609, 0.1534, -0.9750, -0.1562, 0.7187, -0.7578, 0.6051, 0.7680, -0.2098, 0.0625, 0.4922, -0.7500, -0.8108, 0.5623, -0.1623, 0.1016, 0.4297, -0.8438, -0.0553, -0.0432, -0.9975, -0.1016, 0.4297, -0.8438, 0.0293, -0.1579, -0.9870, -0.0625, 0.4922, -0.7500, 0.8242, 0.5468, -0.1473, 0.0000, 0.4297, -0.7422, -0.0584, 0.9485, -0.3114, 0.0000, 0.3516, -0.8203, -0.0323, -0.0563, -0.9979, 0.1641, 0.4141, -0.7734, 0.3572, -0.2743, -0.8928, 0.2500, 0.4687, -0.7578, 0.2633, -0.1145, -0.9579, -0.2500, 0.4687, -0.7578, -0.2180, -0.1231, -0.9681, -0.1641, 0.4141, -0.7734, -0.2898, -0.2241, -0.9304, 0.3281, 0.4766, -0.7422, 0.1490, -0.1541, -0.9767, -0.3281, 0.4766, -0.7422, -0.1442, -0.1598, -0.9766, 0.4297, 0.4375, -0.7188, 0.2190, 0.0371, -0.9750, 0.4375, 0.5469, -0.7969, 0.3085, 0.0038, -0.9512, 0.6016, 0.3750, -0.6641, 0.2254, -0.3608, -0.9050, -0.4297, 0.4375, -0.7188, -0.1943, 0.0657, -0.9787, 0.6406, 0.2969, -0.6484, 0.3588, -0.1192, -0.9257, -0.6016, 0.3750, -0.6641, -0.2447, -0.3607, -0.9000, 0.6250, 0.1875, -0.6484, 0.4602, -0.1651, -0.8723, -0.6406, 0.2969, -0.6484, -0.3562, -0.1236, -0.9262, 0.4922, 0.0625, -0.6719, 0.4305, -0.3617, -0.8269, 0.6172, 0.0547, -0.6250, 0.5001, -0.3758, -0.7802, -0.4922, 0.0625, -0.6719, -0.4216, -0.4031, -0.8122, 0.3750, 0.0156, -0.7031, 0.1637, -0.5078, -0.8458, 0.2031, 0.0937, -0.7422, -0.1553, -0.3230, -0.9335, 0.1250, -0.1016, -0.8125, 0.0559, -0.2297, -0.9716, -0.3750, 0.0156, -0.7031, -0.3458, -0.3722, -0.8613, 0.1641, 0.1406, -0.7500, -0.2965, -0.2673, -0.9168, 0.0000, 0.0469, -0.7266, 0.0038, 0.0699, -0.9975, -0.1641, 0.1406, -0.7500, 0.2393, -0.3012, -0.9230, -0.2031, 0.0937, -0.7422, 0.1823, -0.2533, -0.9500, 0.1250, 0.3047, -0.7656, 0.0360, -0.2032, -0.9785, 0.0000, 0.2109, -0.7656, 0.0446, -0.2602, -0.9645, -0.1328, 0.2109, -0.7578, 0.1646, -0.1727, -0.9711, 0.1328, 0.2109, -0.7578, -0.1938, -0.1490, -0.9696, 0.0625, -0.8828, -0.6953, -0.0402, -0.3406, -0.9393, 0.0000, -0.8906, -0.6875, -0.0466, -0.3789, -0.9243, 0.1172, -0.8359, -0.7109, 0.1083, -0.3252, -0.9394, -0.0625, -0.8828, -0.6953, 0.0893, -0.4239, -0.9013, 0.1094, -0.7188, -0.7344, 0.1461, -0.1193, -0.9820, -0.1172, -0.8359, -0.7109, -0.1950, -0.2758, -0.9412, -0.1094, -0.7188, -0.7344, -0.1568, -0.1334, -0.9785, 0.0781, -0.4453, -0.7500, 0.1344, 0.0067, -0.9909, 0.1172, -0.6875, -0.7344, 0.1817, -0.0454, -0.9823, -0.1172, -0.6875, -0.7344, -0.1928, -0.0461, -0.9801, -0.0781, -0.4453, -0.7500, -0.1335, -0.0018, -0.9910, 0.0859, -0.2891, -0.7422, 0.5003, -0.4292, -0.7519, 0.0000, -0.3281, -0.7422, -0.0068, -0.4701, -0.8826, 0.0000, -0.4453, -0.7500, -0.0003, 0.0004, -1.0000, 0.0000, -0.6797, -0.7344, -0.0002, -0.0344, -0.9994, 0.0000, -0.7656, -0.7344, -0.0384, -0.5979, -0.8006, 0.1250, -0.2266, -0.7500, 0.8061, -0.3932, -0.4421, 0.1328, -0.2266, -0.7969, 0.9262, -0.2430, -0.2880, 0.0938, -0.2734, -0.7812, 0.5836, -0.6929, -0.4235, -0.0938, -0.2734, -0.7812, -0.5287, -0.7138, -0.4592, -0.1328, -0.2266, -0.7969, -0.9303, -0.2210, -0.2926, -0.0859, -0.2891, -0.7422, -0.4317, -0.4659, -0.7724, 0.1016, -0.1484, -0.7422, 0.0032, 0.1752, -0.9845, 0.1094, -0.1328, -0.7812, 0.6186, 0.7757, -0.1248, -0.1094, -0.1328, -0.7812, -0.6276, 0.7712, -0.1065, -0.1016, -0.1484, -0.7422, -0.0107, 0.0912, -0.9958, 0.0000, -0.1406, -0.7422, 0.0664, 0.3602, -0.9305, 0.0391, -0.1250, -0.7812, -0.2936, 0.9400, -0.1735, -0.0391, -0.1250, -0.7812, 0.2391, 0.9534, -0.1840, 0.0000, -0.1953, -0.7500, 0.1722, 0.8255, -0.5374, 0.0000, -0.1875, -0.7969, -0.0265, 0.9120, -0.4093, 0.0000, -0.3203, -0.7812, -0.0088, -0.8681, -0.4964, 0.0000, -0.2891, -0.8047, 0.0000, -0.5222, -0.8528, -0.0781, -0.2500, -0.8047, -0.3870, -0.7462, -0.5416, 0.0000, -0.2031, -0.8281, -0.0063, 0.1920, -0.9814, -0.0469, -0.1484, -0.8125, 0.1976, 0.5896, -0.7831, 0.0469, -0.1484, -0.8125, -0.1333, 0.5965, -0.7914, 0.0938, -0.1563, -0.8125, 0.3611, 0.4713, -0.8047, -0.0938, -0.1563, -0.8125, -0.3647, 0.4640, -0.8073, -0.1094, -0.2266, -0.8281, -0.4917, -0.2875, -0.8219, 0.1094, -0.2266, -0.8281, 0.4931, -0.2846, -0.8220, 0.0781, -0.2500, -0.8047, 0.3870, -0.7462, -0.5416, -0.1641, -0.2422, -0.7109, -0.8366, 0.0461, -0.5458, -0.1250, -0.2266, -0.7500, -0.8196, -0.2792, -0.5003, 0.1641, -0.2422, -0.7109, 0.7995, 0.0044, -0.6006, -0.1797, -0.3125, -0.7109, -0.6554, 0.1339, -0.7432, 0.1797, -0.3125, -0.7109, 0.6507, 0.1487, -0.7447, 0.2578, -0.3125, -0.5547, 0.9278, 0.3530, -0.1209, -0.2578, -0.3125, -0.5547, -0.9228, 0.3715, -0.1019, -0.3125, -0.4375, -0.5703, -0.9636, 0.2327, -0.1312, 0.2344, -0.2500, -0.5547, 0.9306, 0.3435, -0.1263, -0.2344, -0.2500, -0.5547, -0.9289, 0.3610, -0.0820, 0.0938, -0.7422, -0.7266, -0.1468, -0.5234, -0.8394, 0.0000, -0.7734, -0.7187, -0.0194, -0.9571, -0.2891, 0.0938, -0.8203, -0.7109, -0.6332, -0.0002, -0.7740, -0.0938, -0.7422, -0.7266, 0.2008, -0.4711, -0.8589, 0.0469, -0.8672, -0.6875, -0.3669, 0.6037, -0.7077, -0.0938, -0.8203, -0.7109, 0.6351, 0.0428, -0.7712, 0.0000, -0.8750, -0.6875, -0.0381, 0.5754, -0.8169, -0.0469, -0.8672, -0.6875, 0.4141, 0.5798, -0.7016, 0.0469, -0.8516, -0.6328, -0.3245, 0.4755, -0.8177, -0.0469, -0.8516, -0.6328, 0.2900, 0.4687, -0.8343, 0.0000, -0.8594, -0.6328, 0.0044, 0.5304, -0.8477, -0.0938, -0.8125, -0.6406, 0.6738, 0.1155, -0.7299, 0.0938, -0.8125, -0.6406, -0.6715, 0.1450, -0.7267, -0.0938, -0.7500, -0.6641, 0.5168, -0.7037, -0.4875, 0.0938, -0.7500, -0.6641, -0.5177, -0.7041, -0.4860, 0.0000, -0.7812, -0.6562, 0.0046, -0.6963, -0.7177, 0.1719, 0.2187, -0.7812, 0.1182, -0.0594, -0.9912, -0.1875, 0.1562, -0.7734, 0.0103, -0.0716, -0.9974, 0.1797, 0.2969, -0.7812, 0.2781, -0.1122, -0.9539, -0.1719, 0.2187, -0.7812, -0.1586, -0.0802, -0.9841, -0.1250, 0.3047, -0.7656, -0.0843, -0.0546, -0.9949, -0.1797, 0.2969, -0.7812, -0.2715, -0.0865, -0.9586, -0.2109, 0.3750, -0.7812, -0.1558, -0.0818, -0.9844, 0.2266, 0.1094, -0.7812, -0.0239, -0.1866, -0.9821, -0.2266, 0.1094, -0.7812, 0.0688, -0.1757, -0.9820, -0.3750, 0.0625, -0.7422, -0.2432, -0.1762, -0.9538, 0.4766, 0.1016, -0.7188, 0.3072, -0.0162, -0.9515, -0.4766, 0.1016, -0.7188, -0.2661, -0.0486, -0.9627, 0.5781, 0.1953, -0.6797, 0.2781, -0.0927, -0.9561, -0.5781, 0.1953, -0.6797, -0.2977, -0.0310, -0.9541, -0.6250, 0.1875, -0.6484, -0.4833, -0.2039, -0.8513, 0.5859, 0.2891, -0.6875, 0.1638, -0.0697, -0.9840, -0.5859, 0.2891, -0.6875, -0.1819, -0.0705, -0.9808, -0.5625, 0.3516, -0.6953, -0.3223, -0.0972, -0.9416, 0.5625, 0.3516, -0.6953, 0.2816, -0.0011, -0.9595, -0.4219, 0.3984, -0.7734, -0.0553, -0.1278, -0.9902, 0.3359, 0.4297, -0.7578, 0.1723, 0.1345, -0.9758, -0.3359, 0.4297, -0.7578, -0.1907, 0.1022, -0.9763, 0.2734, 0.4219, -0.7734, 0.1514, 0.0618, -0.9865, -0.2734, 0.4219, -0.7734, -0.1550, 0.1021, -0.9826, 0.2109, 0.3750, -0.7812, 0.2021, -0.1124, -0.9729, 0.2344, 0.3594, -0.7578, 0.4634, -0.3949, -0.7932, -0.2344, 0.3594, -0.7578, -0.5008, -0.4443, -0.7428, -0.2812, 0.3984, -0.7656, -0.3007, -0.2641, -0.9164, 0.2812, 0.3984, -0.7656, 0.1744, -0.2683, -0.9474, -0.3359, 0.4062, -0.7500, -0.0996, -0.3046, -0.9472, 0.4219, 0.3984, -0.7734, 0.1811, -0.1429, -0.9730, 0.3359, 0.4062, -0.7500, 0.0001, -0.3783, -0.9257, -0.4141, 0.3906, -0.7500, 0.2741, -0.8556, -0.4391, 0.4141, 0.3906, -0.7500, -0.1395, -0.9154, -0.3776, -0.5312, 0.3359, -0.6797, 0.1423, -0.5826, -0.8002, 0.5547, 0.2812, -0.6719, -0.3840, -0.1351, -0.9134, -0.5547, 0.2812, -0.6719, 0.4229, -0.1078, -0.8997, -0.5469, 0.2109, -0.6719, 0.1921, 0.1914, -0.9625, 0.4609, 0.1172, -0.7031, -0.1242, 0.6164, -0.7775, 0.3750, 0.0625, -0.7422, 0.2286, -0.1674, -0.9590, 0.3750, 0.0859, -0.7266, 0.1431, 0.5587, -0.8169, -0.4609, 0.1172, -0.7031, 0.1653, 0.6098, -0.7751, -0.3750, 0.0859, -0.7266, -0.1564, 0.5646, -0.8104, 0.2422, 0.1250, -0.7578, 0.4323, 0.5833, -0.6876, 0.1875, 0.1562, -0.7734, -0.0438, 0.0069, -0.9990, -0.2422, 0.1250, -0.7578, -0.4197, 0.6008, -0.6803, -0.2031, 0.1719, -0.7500, -0.6920, 0.2958, -0.6585, 0.1953, 0.2969, -0.7578, 0.7894, -0.2032, -0.5793, -0.1953, 0.2969, -0.7578, -0.7938, -0.2865, -0.5364, 0.1953, 0.2266, -0.7500, 0.8016, 0.0110, -0.5977, -0.1953, 0.2266, -0.7500, -0.7987, 0.0194, -0.6014, 0.2031, 0.1719, -0.7500, 0.6880, 0.2985, -0.6614, 0.0000, 0.4062, -0.6016, -0.0345, 0.8722, -0.4879, -0.1094, 0.4609, -0.6094, 0.5870, 0.7351, -0.3391, 0.1094, 0.4609, -0.6094, -0.4285, 0.8853, -0.1808, -0.1953, 0.6641, -0.6172, 0.4766, 0.5094, 0.7164, 0.3359, 0.6875, -0.5938, 0.1150, 0.6553, 0.7466, -0.3359, 0.6875, -0.5938, -0.1169, 0.6457, 0.7545, -0.4844, 0.5547, -0.5547, -0.2746, 0.8880, 0.3688, 0.4844, 0.5547, -0.5547, 0.2275, 0.8745, 0.4283, -0.6797, 0.4531, -0.4922, -0.3626, 0.9120, 0.1919, 0.7969, 0.4062, -0.4609, 0.6957, 0.5814, 0.4218, -0.7969, 0.4062, -0.4609, -0.7391, 0.6070, 0.2920, -0.7734, 0.1641, -0.3750, -0.8565, -0.4709, 0.2113, 0.6016, -0.0000, -0.4141, 0.5443, -0.8372, 0.0533, -0.6016, -0.0000, -0.4141, -0.6261, -0.7782, 0.0493, 0.4375, -0.0938, -0.4688, 0.4720, -0.8637, 0.1768, -0.4375, -0.0938, -0.4688, -0.3676, -0.9095, 0.1939, 0.0000, -0.5703, -0.3203, 0.0226, -0.2705, 0.9624, 0.0000, -0.4844, -0.2812, 0.0819, -0.7395, 0.6681, 0.1250, -0.5391, -0.3594, 0.2771, -0.3147, 0.9078, -0.1797, -0.4141, -0.2578, -0.6095, -0.7764, 0.1601, 0.0000, -0.8047, -0.3437, -0.0570, -0.3260, 0.9436, 0.1406, -0.7578, -0.3672, 0.2050, -0.1864, 0.9608, -0.1250, -0.5391, -0.3594, -0.4085, -0.2920, 0.8648, 0.0000, -0.9766, -0.4609, -0.0479, -0.8737, 0.4840, 0.1641, -0.9453, -0.4375, 0.0963, -0.7572, 0.6460, -0.1406, -0.7578, -0.3672, -0.1179, -0.1639, 0.9794, -0.1641, -0.9453, -0.4375, -0.0110, -0.7755, 0.6312, -0.3281, -0.9141, -0.3984, -0.6665, -0.4385, 0.6029, 0.3281, -0.9141, -0.3984, 0.5130, -0.4512, 0.7302, -0.2891, -0.7109, -0.3828, -0.6281, 0.0925, 0.7726, 0.2891, -0.7109, -0.3828, 0.6053, 0.0333, 0.7953, -0.2500, -0.5000, -0.3906, -0.6249, 0.1224, 0.7710, 0.2344, -0.3516, -0.4062, 0.8957, 0.2577, 0.3624, 0.2500, -0.5000, -0.3906, 0.7798, -0.0105, 0.6258, 0.1797, -0.4141, -0.2578, 0.6893, -0.6687, 0.2786, -0.2344, -0.3516, -0.4062, -0.9439, 0.1056, 0.3129, 0.2188, -0.2813, -0.4297, 0.9787, -0.1958, -0.0615, -0.2109, -0.2266, -0.4688, -0.9562, -0.1362, -0.2589, -0.2188, -0.2813, -0.4297, -0.9982, 0.0183, -0.0565, 0.2031, -0.1719, -0.5000, 0.7857, -0.5715, -0.2367, -0.2031, -0.1875, -0.5625, -0.9361, -0.3368, -0.1016, -0.2031, -0.1719, -0.5000, -0.7526, -0.5911, -0.2901, 0.0000, 0.0703, 0.8281, -0.0265, -0.2849, 0.9582, 0.3359, 0.0547, 0.6641, 0.4455, -0.3583, 0.8204, 0.0000, -0.1953, 0.6719, -0.0037, -0.6934, 0.7205, -0.3438, -0.1484, 0.5391, -0.5264, -0.6594, 0.5367, -0.3359, 0.0547, 0.6641, -0.4404, -0.3208, 0.8385, 0.3438, -0.1484, 0.5391, 0.5223, -0.6536, 0.5477, 0.0000, -0.3828, 0.3516, -0.0040, -0.9391, 0.3435, -0.2969, -0.3125, 0.2656, -0.5017, -0.8333, 0.2320, 0.2969, -0.3125, 0.2656, 0.5071, -0.8376, 0.2033, 0.2109, -0.3906, -0.1641, 0.5727, -0.8197, -0.0120, -0.2109, -0.3906, -0.1641, -0.5747, -0.8183, -0.0009, 0.0000, -0.4609, -0.1875, 0.0134, -0.9822, 0.1874, 0.7734, 0.1641, -0.3750, 0.9302, -0.3062, 0.2023, 0.7344, -0.0469, -0.0703, 0.7210, -0.6898, -0.0651, -0.7344, -0.0469, -0.0703, -0.7504, -0.6502, -0.1191, -0.8516, 0.2344, -0.0547, -0.9855, -0.1614, -0.0522, 0.0000, 0.5625, 0.8516, -0.0007, 0.3401, 0.9404, 0.4609, 0.4375, 0.7031, 0.4730, 0.1763, 0.8632, -0.4609, 0.4375, 0.7031, -0.5126, 0.1686, 0.8419, 0.0000, 0.8984, -0.2891, 0.0226, 0.8392, -0.5434, 0.4531, 0.8516, -0.2344, 0.4442, 0.7244, -0.5271, 0.0000, 0.9844, 0.0781, 0.0039, 0.9997, -0.0222, -0.4531, 0.9297, 0.0703, -0.4288, 0.9025, -0.0398, -0.4531, 0.8516, -0.2344, -0.4798, 0.7182, -0.5040, 0.4531, 0.9297, 0.0703, 0.4135, 0.9096, -0.0395, 0.4531, 0.8672, 0.3828, 0.3912, 0.8153, 0.4268, -0.4531, 0.8672, 0.3828, -0.4265, 0.7997, 0.4225, 0.0000, 0.8984, 0.5469, 0.0172, 0.8404, 0.5417, 0.6797, 0.4531, -0.4922, 0.3455, 0.9124, 0.2191, 0.7266, 0.4062, -0.3359, 0.7831, 0.6136, -0.1011, -0.7266, 0.4062, -0.3359, -0.6092, 0.7911, 0.0546, -0.6328, 0.4531, -0.2813, -0.4234, 0.8153, -0.3949, 0.6328, 0.4531, -0.2813, 0.3760, 0.7903, -0.4836, 0.6406, 0.7031, -0.0547, 0.6639, 0.6793, -0.3127, -0.7969, 0.5625, -0.1250, -0.7631, 0.4966, -0.4136, 0.7969, 0.5625, -0.1250, 0.7705, 0.5058, -0.3880, 0.7969, 0.6172, 0.1172, 0.8486, 0.5288, 0.0140, -0.7969, 0.6172, 0.1172, -0.8678, 0.4968, -0.0030, -0.6406, 0.7500, 0.1953, -0.6595, 0.7481, 0.0733, 0.6406, 0.7500, 0.1953, 0.6784, 0.7314, 0.0695, 0.7969, 0.5391, 0.3594, 0.8722, 0.3146, 0.3746, -0.7969, 0.5391, 0.3594, -0.8935, 0.2545, 0.3698, -0.6406, 0.6797, 0.4453, -0.4986, 0.5502, 0.6698, 0.7734, 0.2656, 0.4375, 0.7831, -0.1485, 0.6038, 0.6172, 0.3281, 0.5859, 0.6196, -0.0605, 0.7825, -0.6172, 0.3281, 0.5859, -0.6099, -0.0221, 0.7921, -0.7734, 0.2656, 0.4375, -0.6664, -0.0202, 0.7453, 0.6406, 0.6797, 0.4453, 0.6075, 0.5696, 0.5536, -0.6406, 0.7031, -0.0547, -0.6593, 0.6777, -0.3254, 0.4609, 0.5234, -0.4297, 0.3406, 0.8832, -0.3223, -0.4609, 0.5234, -0.4297, -0.3645, 0.9029, -0.2280, 0.0000, 0.5703, -0.5703, 0.0518, 0.5225, -0.8510, 0.1953, 0.6641, -0.6172, -0.4701, 0.5252, 0.7093, 0.8516, 0.2344, -0.0547, 0.9850, -0.1605, -0.0631, 0.8594, 0.3203, 0.0469, 0.9970, -0.0333, 0.0695, -0.8594, 0.3203, 0.0469, -0.9979, 0.0404, 0.0497, 0.8203, 0.3281, 0.2031, 0.9144, 0.2312, -0.3323, -0.8203, 0.3281, 0.2031, -0.8007, 0.5628, -0.2050, 0.4062, -0.1719, -0.1484, 0.5790, -0.8027, -0.1427, -0.4297, -0.1953, 0.2109, -0.5968, -0.7859, 0.1618, 0.5938, -0.1250, 0.1641, 0.3105, -0.9506, -0.0010, -0.4062, -0.1719, -0.1484, -0.5673, -0.8083, -0.1575, 0.2109, -0.2266, -0.4688, 0.8872, -0.1577, -0.4336, 0.6406, -0.0078, 0.4297, 0.3535, -0.5927, 0.7237, -0.4844, 0.0234, 0.5469, -0.5421, -0.4993, 0.6759, -0.6406, -0.0078, 0.4297, -0.2692, -0.6315, 0.7272, 0.4297, -0.1953, 0.2109, 0.5633, -0.8173, 0.1213, -0.5938, -0.1250, 0.1641, -0.2785, -0.9594, 0.0447, 0.4844, 0.0234, 0.5469, 0.5292, -0.5051, 0.6817, 1.0234, 0.4766, 0.3125, -0.0199, 0.8803, -0.4740, 0.8906, 0.4062, 0.2344, -0.2911, 0.7817, -0.5516, 1.0156, 0.4141, 0.2891, 0.5512, -0.0788, -0.8306, -0.9219, 0.3594, 0.2187, -0.4461, -0.0227, -0.8947, -0.8906, 0.4062, 0.2344, 0.3026, 0.7616, -0.5731, -1.0234, 0.4766, 0.3125, -0.0005, 0.8798, -0.4753, 1.1875, 0.4375, 0.3906, 0.3214, -0.0922, -0.9424, -1.1875, 0.4375, 0.3906, -0.3912, -0.1216, -0.9122, -1.0156, 0.4141, 0.2891, -0.5720, -0.1149, -0.8122, -1.2344, 0.5078, 0.4219, -0.3940, 0.8547, -0.3380, 1.2344, 0.5078, 0.4219, 0.3552, 0.8790, -0.3179, 1.3516, 0.3203, 0.4219, 0.7788, 0.1678, -0.6044, -1.2656, 0.2891, 0.4062, 0.1568, -0.0805, -0.9843, 1.2656, 0.2891, 0.4062, -0.1523, -0.1211, -0.9809, 1.2812, 0.0547, 0.4297, 0.6526, -0.4768, -0.5888, -1.2109, 0.0781, 0.4062, 0.0469, 0.3680, -0.9286, -1.3516, 0.3203, 0.4219, -0.7626, 0.1751, -0.6227, 1.2109, 0.0781, 0.4062, -0.0400, 0.3039, -0.9518, 1.0391, -0.1016, 0.3281, 0.5029, -0.7810, -0.3703, -1.0312, -0.0391, 0.3047, -0.4992, 0.2890, -0.8168, -1.2812, 0.0547, 0.4297, -0.6804, -0.4264, -0.5960, 1.0312, -0.0391, 0.3047, 0.5089, 0.3211, -0.7987, 0.8281, -0.0703, 0.1328, 0.3409, 0.3183, -0.8845, -0.8281, -0.0703, 0.1328, -0.3488, 0.2273, -0.9092, -0.7734, -0.1406, 0.1250, -0.0394, -0.6351, -0.7714, 1.0391, 0.0000, 0.3672, -0.1831, 0.9556, -0.2307, -0.8828, -0.0234, 0.2109, -0.2527, 0.8501, -0.4620, -1.0391, 0.0000, 0.3672, 0.1868, 0.9538, -0.2351, 1.1875, 0.0938, 0.4453, -0.8095, 0.5847, 0.0524, -1.1875, 0.0938, 0.4453, 0.7621, 0.6471, 0.0193, 1.2344, 0.2500, 0.4453, -0.9931, -0.0552, -0.1035, -1.2344, 0.2500, 0.4453, 0.9847, -0.0996, -0.1426, 1.1719, 0.3594, 0.4375, -0.1439, -0.7537, -0.6413, -1.1719, 0.3594, 0.4375, 0.1333, -0.7504, -0.6474, 1.0234, 0.3438, 0.3594, 0.5604, -0.6609, -0.4991, -1.0234, 0.3438, 0.3594, -0.5585, -0.6545, -0.5096, 0.9219, 0.3594, 0.2187, 0.4492, -0.0383, -0.8926, 0.9453, 0.3047, 0.2891, 0.6842, -0.5558, -0.4722, -0.9453, 0.3047, 0.2891, -0.7274, -0.5127, -0.4560, 0.7266, 0.0000, 0.0703, 0.8572, -0.4931, 0.1483, -0.7188, -0.0234, 0.1719, -0.7341, 0.1288, -0.6667, 0.7734, -0.1406, 0.1250, 0.0381, -0.6438, -0.7642, -0.7266, 0.0000, 0.0703, -0.9710, -0.2035, 0.1250, 0.8438, 0.2891, 0.2109, 0.3727, -0.2242, -0.9004, -0.8438, 0.2891, 0.2109, -0.7723, -0.2654, -0.5771, 0.8828, -0.0234, 0.2109, 0.2435, 0.8170, -0.5227, 0.8125, -0.0156, 0.2734, 0.5998, 0.5131, -0.6139, -0.8125, -0.0156, 0.2734, -0.7615, 0.4580, -0.4586, 0.8438, 0.0156, 0.2734, 0.8420, -0.1762, -0.5098, 0.7188, 0.0391, 0.1875, 0.9609, -0.1188, -0.2499, -0.7188, 0.0391, 0.1875, -0.9344, -0.0891, -0.3448, -0.8438, 0.0156, 0.2734, -0.8754, -0.1836, -0.4472, 0.7578, 0.0938, 0.2734, 0.8515, 0.0414, -0.5228, -0.8203, 0.0859, 0.2734, -0.5701, 0.7361, -0.3649, 0.8359, 0.1719, 0.2734, 0.6864, -0.6234, -0.3746, 0.7969, 0.2031, 0.2109, 0.8484, -0.4354, -0.3012, -0.7969, 0.2031, 0.2109, -0.8532, -0.4084, -0.3243, -0.8359, 0.1719, 0.2734, -0.7465, -0.5659, -0.3498, 0.8906, 0.2422, 0.2656, 0.7261, -0.4989, -0.4731, -0.8906, 0.2422, 0.2656, -0.6655, -0.5609, -0.4923, 0.7188, -0.0234, 0.1719, 0.7313, 0.1263, -0.6702, 0.8906, 0.2344, 0.3203, 0.6593, -0.4685, -0.5881, -0.8906, 0.2344, 0.3203, -0.6639, -0.4673, -0.5838, -0.9531, 0.2891, 0.3438, -0.6215, -0.4422, -0.6466, -0.8438, 0.1719, 0.3203, -0.5176, -0.4523, -0.7263, 0.7656, 0.0938, 0.3203, 0.7584, 0.2665, -0.5948, -0.7656, 0.0938, 0.3203, -0.7675, 0.2336, -0.5969, -0.7578, 0.0938, 0.2734, -0.9543, 0.1026, -0.2806, 0.8203, 0.0859, 0.2734, 0.4814, 0.6344, -0.6048, -0.8281, 0.0781, 0.3203, -0.4243, 0.4571, -0.7816, 0.8281, 0.0781, 0.3203, 0.4492, 0.3799, -0.8086, -0.8516, 0.0156, 0.3203, -0.6593, -0.3517, -0.6645, 0.8125, -0.0156, 0.3203, 0.6450, 0.3101, -0.6984, -0.8125, -0.0156, 0.3203, -0.7098, 0.3132, -0.6309, 0.8828, -0.0156, 0.2656, -0.0434, 0.9405, -0.3371, -0.8828, -0.0156, 0.2656, 0.0413, 0.9530, -0.3001, 0.9531, 0.2891, 0.3438, 0.6482, -0.4206, -0.6347, -1.0391, 0.3281, 0.4141, -0.5205, -0.2498, -0.8165, 1.0391, 0.3281, 0.4141, 0.4618, -0.3291, -0.8237, -1.1875, 0.3438, 0.4844, 0.2607, -0.5229, -0.8115, 1.2578, 0.2422, 0.4922, -0.7551, 0.0224, -0.6552, -1.2578, 0.2422, 0.4922, 0.7564, -0.0876, -0.6482, -1.2109, 0.0859, 0.4844, 0.5640, 0.5479, -0.6178, 1.2109, 0.0859, 0.4844, -0.6207, 0.4376, -0.6506, -1.0469, 0.0000, 0.4219, -0.0631, 0.7003, -0.7110, 0.8516, 0.0156, 0.3203, 0.2929, 0.3709, -0.8812, 0.8906, 0.1094, 0.3281, 0.1951, 0.0389, -0.9800, -0.9375, 0.0625, 0.3359, -0.3975, 0.1464, -0.9058, 0.9375, 0.0625, 0.3359, -0.1907, 0.5192, -0.8331, 0.9609, 0.1719, 0.3516, 0.3347, -0.0046, -0.9423, -1.0000, 0.1250, 0.3672, -0.4182, -0.0769, -0.9051, -0.8906, 0.1094, 0.3281, -0.1933, -0.0056, -0.9811, 1.0000, 0.1250, 0.3672, 0.4605, -0.0522, -0.8861, 1.0547, 0.1875, 0.3828, 0.3144, -0.1037, -0.9436, -1.0547, 0.1875, 0.3828, -0.3254, -0.1152, -0.9385, -1.0156, 0.2344, 0.3750, -0.2996, -0.0545, -0.9525, 1.0156, 0.2344, 0.3750, 0.3343, 0.1068, -0.9364, 1.0859, 0.2734, 0.3906, 0.2897, 0.3158, -0.9035, -1.1094, 0.2109, 0.3906, -0.4628, -0.3818, -0.8000, -1.0859, 0.2734, 0.3906, -0.3586, 0.3081, -0.8812, -0.9609, 0.1719, 0.3516, -0.3723, -0.0194, -0.9279, 0.8438, 0.1719, 0.3203, 0.5725, -0.4189, -0.7047, 1.0469, 0.0000, 0.4219, 0.1481, 0.7017, -0.6969, 1.1094, 0.2109, 0.3906, 0.3831, -0.0685, -0.9211, 1.1875, 0.3438, 0.4844, -0.2113, -0.5485, -0.8089, 0.7891, -0.1250, 0.3281, -0.1016, -0.8343, 0.5418, -0.7891, -0.1250, 0.3281, 0.0917, -0.8428, 0.5303, -1.0391, -0.0859, 0.4922, 0.0555, -0.6765, 0.7343, 1.0391, -0.0859, 0.4922, -0.0349, -0.6861, 0.7267, -1.0391, -0.1016, 0.3281, -0.4613, -0.7982, -0.3875, -1.3125, 0.0547, 0.5312, -0.6466, -0.4789, 0.5937, 1.3672, 0.2969, 0.5000, 0.9253, 0.0918, 0.3680, 1.2500, 0.4688, 0.5469, 0.2873, 0.6209, 0.7293, -1.3672, 0.2969, 0.5000, -0.9240, 0.0860, 0.3726, -1.2500, 0.4688, 0.5469, -0.2792, 0.5978, 0.7514, -1.0234, 0.4375, 0.4844, 0.4142, 0.5509, 0.7245, 1.0234, 0.4375, 0.4844, -0.4278, 0.5755, 0.6970, -0.8594, 0.3828, 0.3828, 0.6500, 0.5846, 0.4853, 1.3125, 0.0547, 0.5312, 0.6502, -0.5100, 0.5631, 0.8594, 0.3828, 0.3828, -0.6611, 0.5885, 0.4653, 0.6250, 0.2422, -0.5625, 0.8682, -0.0047, -0.4961, 0.1562, 0.0547, -0.6484, -0.5472, -0.6394, -0.5400, 0.5312, 0.3359, -0.6797, -0.1346, -0.5529, -0.8222, 0.5469, 0.2109, -0.6719, -0.1477, 0.1899, -0.9706 ],
48 | "indices": [ 0, 1, 2, 3, 4, 5, 6, 2, 7, 8, 3, 9, 2, 10, 11, 12, 13, 8, 1, 14, 10, 13, 15, 3, 14, 16, 10, 17, 18, 15, 10, 19, 11, 20, 17, 13, 19, 21, 22, 23, 24, 20, 16, 25, 21, 24, 26, 17, 25, 27, 21, 28, 29, 26, 21, 30, 31, 32, 28, 23, 30, 33, 34, 35, 36, 32, 27, 37, 33, 36, 38, 28, 37, 39, 33, 40, 41, 38, 33, 42, 34, 43, 40, 36, 42, 6, 44, 9, 5, 40, 39, 0, 42, 5, 45, 41, 0, 39, 46, 47, 41, 45, 39, 37, 48, 49, 38, 41, 37, 27, 50, 51, 29, 49, 27, 25, 52, 53, 26, 51, 25, 16, 52, 54, 18, 26, 16, 14, 55, 56, 15, 18, 14, 1, 57, 58, 4, 56, 1, 0, 46, 59, 45, 58, 60, 57, 46, 59, 58, 61, 62, 57, 60, 61, 58, 56, 60, 55, 62, 56, 54, 61, 60, 52, 55, 54, 53, 61, 60, 50, 52, 53, 51, 61, 60, 63, 50, 51, 49, 61, 60, 48, 63, 49, 47, 61, 60, 46, 48, 47, 59, 61, 64, 65, 66, 67, 68, 69, 70, 71, 64, 68, 72, 73, 74, 75, 71, 72, 76, 73, 77, 78, 75, 76, 79, 80, 81, 82, 78, 79, 83, 84, 85, 86, 87, 88, 89, 90, 86, 91, 87, 92, 93, 89, 91, 94, 95, 96, 97, 92, 94, 98, 95, 99, 100, 97, 98, 101, 102, 103, 104, 100, 101, 105, 106, 107, 108, 104, 105, 109, 110, 111, 112, 107, 109, 113, 114, 115, 116, 111, 113, 117, 118, 119, 120, 115, 117, 121, 122, 122, 121, 119, 123, 124, 118, 115, 125, 126, 124, 127, 110, 111, 128, 115, 129, 130, 127, 111, 107, 128, 131, 106, 129, 107, 103, 132, 133, 102, 131, 103, 99, 134, 135, 95, 133, 99, 96, 136, 137, 138, 135, 96, 92, 139, 140, 87, 138, 92, 88, 139, 141, 142, 87, 88, 90, 143, 141, 144, 145, 145, 146, 147, 123, 118, 148, 122, 119, 126, 148, 122, 149, 149, 122, 150, 145, 144, 151, 150, 146, 149, 152, 153, 67, 67, 153, 68, 154, 152, 65, 68, 155, 72, 156, 154, 75, 72, 157, 158, 82, 159, 160, 161, 162, 79, 156, 75, 78, 79, 76, 161, 163, 164, 159, 165, 164, 162, 160, 159, 165, 165, 162, 166, 167, 156, 166, 161, 158, 166, 168, 169, 170, 171, 172, 173, 174, 175, 168, 172, 176, 177, 178, 179, 174, 176, 180, 178, 181, 182, 179, 180, 182, 178, 164, 163, 183, 171, 173, 164, 183, 170, 184, 185, 171, 183, 182, 186, 179, 187, 186, 182, 179, 188, 189, 190, 187, 176, 175, 189, 169, 191, 190, 176, 169, 192, 193, 185, 191, 172, 186, 192, 188, 190, 191, 186, 186, 184, 192, 185, 184, 191, 178, 174, 142, 90, 177, 178, 174, 168, 142, 194, 195, 90, 168, 163, 196, 197, 173, 195, 163, 159, 198, 83, 162, 173, 81, 199, 82, 197, 200, 201, 199, 202, 198, 194, 203, 200, 85, 142, 196, 194, 90, 203, 156, 167, 204, 205, 167, 158, 154, 156, 206, 207, 158, 157, 152, 154, 208, 209, 157, 155, 153, 152, 210, 211, 155, 153, 210, 208, 212, 213, 211, 214, 208, 206, 212, 215, 209, 211, 206, 204, 216, 217, 207, 209, 204, 205, 218, 219, 205, 207, 219, 214, 212, 213, 214, 217, 218, 212, 216, 215, 213, 217, 151, 144, 220, 221, 146, 150, 148, 151, 222, 223, 150, 224, 123, 148, 222, 225, 224, 226, 144, 141, 227, 228, 147, 221, 141, 140, 227, 229, 143, 228, 140, 137, 230, 231, 139, 229, 137, 135, 232, 233, 234, 231, 135, 133, 235, 236, 136, 233, 133, 131, 235, 237, 134, 136, 131, 129, 238, 239, 132, 134, 129, 127, 240, 241, 128, 132, 127, 124, 242, 243, 125, 241, 124, 123, 242, 226, 126, 125, 242, 244, 245, 246, 226, 247, 240, 242, 248, 247, 243, 249, 250, 240, 251, 249, 241, 252, 238, 250, 253, 252, 239, 254, 235, 238, 255, 254, 237, 236, 232, 235, 255, 256, 236, 257, 230, 232, 258, 257, 233, 231, 259, 230, 260, 261, 231, 262, 227, 259, 263, 262, 229, 228, 264, 227, 263, 265, 228, 266, 244, 222, 267, 268, 225, 246, 222, 220, 269, 270, 223, 268, 220, 264, 271, 266, 221, 270, 121, 117, 272, 273, 120, 121, 117, 113, 274, 275, 116, 120, 113, 109, 276, 277, 112, 275, 109, 105, 276, 278, 108, 112, 105, 101, 279, 280, 104, 108, 101, 98, 281, 282, 100, 280, 98, 94, 281, 283, 97, 100, 94, 91, 284, 285, 93, 283, 91, 86, 286, 287, 89, 285, 288, 289, 290, 291, 289, 288, 292, 288, 293, 294, 288, 292, 295, 292, 296, 297, 292, 295, 64, 66, 295, 295, 66, 298, 70, 64, 296, 298, 69, 299, 74, 70, 300, 299, 73, 301, 77, 74, 302, 301, 80, 303, 302, 293, 290, 294, 297, 303, 302, 300, 296, 298, 299, 297, 304, 305, 306, 294, 303, 307, 81, 77, 305, 303, 84, 307, 199, 308, 202, 309, 310, 200, 81, 304, 199, 310, 307, 201, 85, 202, 311, 309, 203, 312, 85, 311, 86, 287, 313, 312, 314, 315, 316, 317, 318, 314, 316, 319, 320, 321, 317, 316, 320, 322, 323, 324, 321, 325, 325, 323, 306, 291, 324, 289, 304, 306, 308, 324, 291, 307, 326, 284, 327, 328, 285, 329, 330, 331, 314, 318, 332, 330, 333, 334, 335, 336, 337, 333, 335, 338, 339, 340, 336, 341, 341, 339, 331, 332, 340, 330, 342, 281, 343, 344, 282, 345, 346, 343, 347, 348, 344, 345, 347, 349, 350, 351, 348, 352, 353, 350, 354, 355, 351, 356, 357, 358, 354, 356, 359, 360, 331, 339, 361, 356, 340, 359, 339, 338, 353, 352, 336, 356, 338, 334, 347, 362, 337, 352, 334, 363, 346, 345, 364, 362, 279, 342, 363, 345, 280, 278, 365, 363, 333, 337, 364, 365, 274, 366, 276, 277, 275, 278, 274, 279, 363, 364, 278, 365, 272, 274, 365, 365, 273, 272, 281, 326, 343, 329, 283, 282, 367, 368, 349, 348, 369, 344, 368, 370, 350, 351, 371, 348, 357, 354, 370, 351, 355, 360, 323, 322, 372, 373, 321, 324, 327, 372, 374, 373, 375, 328, 284, 286, 372, 375, 287, 328, 286, 376, 308, 310, 309, 375, 308, 323, 372, 375, 324, 310, 286, 311, 376, 309, 313, 287, 357, 377, 358, 378, 379, 360, 331, 358, 315, 378, 359, 332, 374, 380, 377, 378, 373, 381, 322, 319, 380, 378, 317, 321, 315, 382, 319, 317, 378, 318, 383, 384, 385, 386, 387, 388, 383, 385, 389, 390, 391, 392, 393, 389, 394, 395, 390, 392, 394, 396, 397, 398, 395, 399, 397, 400, 401, 402, 398, 403, 401, 404, 405, 406, 402, 407, 404, 408, 405, 409, 410, 402, 400, 411, 404, 410, 412, 398, 396, 413, 411, 412, 414, 398, 389, 415, 413, 414, 416, 395, 385, 417, 389, 416, 418, 391, 385, 419, 420, 421, 386, 418, 327, 374, 422, 423, 381, 328, 374, 424, 405, 406, 407, 423, 367, 327, 422, 425, 328, 369, 370, 426, 419, 386, 427, 371, 405, 428, 429, 430, 409, 423, 431, 432, 429, 423, 433, 434, 435, 432, 431, 434, 433, 436, 437, 438, 435, 433, 439, 440, 426, 438, 441, 440, 439, 427, 419, 426, 420, 442, 427, 386, 368, 438, 370, 427, 439, 369, 368, 422, 438, 433, 425, 369, 422, 443, 432, 433, 423, 425, 420, 441, 444, 445, 442, 446, 441, 437, 444, 447, 440, 442, 437, 435, 448, 449, 450, 447, 435, 451, 448, 452, 436, 450, 451, 431, 453, 454, 434, 436, 431, 429, 455, 456, 430, 454, 429, 428, 457, 458, 409, 430, 417, 420, 459, 446, 421, 460, 415, 417, 461, 460, 418, 462, 413, 415, 463, 462, 416, 414, 411, 413, 463, 464, 414, 465, 408, 411, 466, 465, 412, 467, 428, 408, 457, 467, 410, 458, 453, 468, 469, 470, 454, 452, 469, 471, 472, 473, 470, 474, 472, 475, 476, 477, 473, 478, 479, 476, 480, 481, 477, 478, 461, 459, 479, 478, 446, 482, 444, 472, 459, 478, 483, 445, 444, 484, 472, 474, 447, 445, 453, 469, 484, 447, 474, 449, 455, 457, 468, 470, 458, 456, 485, 475, 457, 470, 473, 467, 466, 476, 485, 473, 477, 465, 463, 486, 466, 477, 481, 464, 487, 480, 486, 481, 482, 464, 461, 480, 487, 462, 482, 460, 401, 424, 488, 489, 407, 490, 397, 401, 491, 490, 492, 493, 394, 397, 494, 493, 403, 399, 393, 394, 495, 496, 399, 392, 383, 393, 495, 497, 392, 498, 384, 383, 499, 498, 388, 500, 499, 491, 488, 489, 490, 500, 499, 495, 491, 493, 497, 498, 495, 494, 501, 493, 496, 497, 357, 370, 384, 387, 371, 500, 357, 502, 377, 489, 500, 360, 374, 377, 488, 489, 379, 381, 6, 0, 2, 4, 45, 5, 503, 6, 7, 3, 5, 9, 7, 2, 11, 13, 3, 8, 2, 1, 10, 15, 4, 3, 16, 19, 10, 13, 17, 15, 19, 504, 11, 12, 20, 13, 504, 19, 22, 24, 17, 20, 19, 16, 21, 26, 18, 17, 27, 30, 21, 24, 28, 26, 22, 21, 31, 28, 24, 23, 31, 30, 34, 36, 28, 32, 30, 27, 33, 38, 29, 28, 39, 42, 33, 36, 40, 38, 42, 44, 34, 35, 43, 36, 6, 503, 44, 43, 9, 40, 0, 6, 42, 40, 5, 41, 39, 48, 46, 59, 47, 45, 37, 63, 48, 47, 49, 41, 63, 37, 50, 29, 38, 49, 50, 27, 52, 26, 29, 51, 16, 55, 52, 53, 54, 26, 14, 62, 55, 54, 56, 18, 62, 14, 57, 4, 15, 56, 57, 1, 46, 45, 4, 58, 65, 67, 66, 66, 67, 69, 71, 65, 64, 69, 68, 73, 70, 74, 71, 76, 80, 73, 74, 77, 75, 79, 84, 80, 77, 81, 78, 83, 201, 84, 142, 85, 87, 89, 312, 90, 91, 138, 87, 88, 92, 89, 138, 91, 95, 97, 93, 92, 98, 102, 95, 96, 99, 97, 101, 106, 102, 99, 103, 100, 105, 130, 106, 103, 107, 104, 130, 105, 110, 112, 108, 107, 110, 109, 114, 116, 112, 111, 114, 113, 118, 120, 116, 115, 118, 117, 122, 121, 120, 119, 124, 114, 118, 119, 115, 126, 114, 124, 110, 128, 125, 115, 130, 110, 127, 107, 132, 128, 106, 130, 129, 103, 134, 132, 102, 106, 131, 99, 136, 134, 95, 102, 133, 96, 234, 136, 138, 95, 135, 234, 96, 139, 137, 140, 138, 88, 143, 139, 140, 141, 87, 90, 147, 143, 142, 141, 145, 90, 145, 147, 118, 122, 148, 224, 122, 126, 151, 148, 149, 122, 224, 150, 149, 145, 151, 146, 145, 149, 65, 152, 67, 153, 155, 68, 71, 154, 65, 155, 157, 72, 154, 71, 75, 76, 72, 158, 78, 82, 160, 162, 83, 79, 160, 156, 78, 76, 158, 161, 164, 165, 159, 164, 173, 162, 166, 160, 165, 162, 161, 166, 156, 160, 166, 158, 167, 166, 163, 168, 170, 172, 195, 173, 175, 169, 168, 195, 172, 177, 179, 175, 174, 177, 176, 178, 178, 181, 179, 182, 181, 178, 163, 170, 183, 183, 171, 164, 170, 193, 184, 184, 185, 183, 186, 188, 179, 180, 187, 182, 175, 179, 189, 187, 180, 176, 189, 192, 169, 172, 191, 176, 170, 169, 193, 171, 185, 172, 192, 189, 188, 187, 190, 186, 184, 193, 192, 184, 186, 191, 145, 178, 142, 145, 90, 178, 168, 196, 142, 195, 177, 90, 163, 198, 196, 194, 197, 195, 159, 82, 198, 197, 83, 173, 199, 198, 82, 83, 197, 201, 202, 196, 198, 197, 194, 200, 202, 85, 196, 90, 312, 203, 167, 205, 204, 207, 205, 158, 156, 204, 206, 209, 207, 157, 154, 206, 208, 211, 209, 155, 152, 208, 210, 210, 211, 153, 214, 210, 212, 211, 210, 214, 206, 216, 212, 213, 215, 211, 204, 218, 216, 215, 217, 209, 205, 219, 218, 217, 219, 207, 218, 219, 212, 214, 219, 217, 144, 264, 220, 223, 221, 150, 151, 220, 222, 225, 223, 224, 244, 123, 222, 224, 126, 226, 264, 144, 227, 147, 146, 221, 140, 259, 227, 143, 147, 228, 259, 140, 230, 139, 143, 229, 230, 137, 232, 234, 139, 231, 232, 135, 235, 136, 234, 233, 131, 238, 235, 236, 237, 136, 129, 250, 238, 237, 239, 134, 250, 129, 240, 239, 241, 132, 240, 127, 242, 125, 128, 241, 123, 244, 242, 243, 226, 125, 248, 242, 245, 226, 243, 247, 251, 240, 248, 243, 241, 249, 253, 250, 251, 241, 239, 252, 505, 238, 253, 239, 237, 254, 238, 505, 255, 256, 254, 236, 506, 232, 255, 236, 233, 257, 232, 506, 258, 261, 257, 231, 230, 258, 260, 231, 229, 262, 259, 260, 263, 265, 262, 228, 271, 264, 263, 228, 221, 266, 245, 244, 267, 225, 226, 246, 267, 222, 269, 223, 225, 268, 269, 220, 271, 221, 223, 270, 117, 274, 272, 272, 273, 121, 113, 366, 274, 273, 275, 120, 366, 113, 276, 112, 116, 275, 105, 279, 276, 277, 278, 112, 101, 342, 279, 278, 280, 108, 342, 101, 281, 100, 104, 280, 94, 326, 281, 282, 283, 100, 326, 94, 284, 93, 97, 283, 284, 91, 286, 89, 93, 285, 289, 306, 290, 294, 291, 288, 288, 290, 293, 297, 294, 292, 292, 293, 296, 298, 297, 295, 296, 64, 295, 66, 69, 298, 300, 70, 296, 69, 73, 299, 302, 74, 300, 73, 80, 301, 305, 77, 302, 80, 84, 303, 305, 302, 290, 297, 301, 303, 293, 302, 296, 299, 301, 297, 305, 290, 306, 291, 294, 307, 304, 81, 305, 84, 201, 307, 308, 376, 202, 203, 309, 200, 304, 308, 199, 200, 310, 201, 202, 376, 311, 313, 309, 312, 311, 286, 86, 89, 287, 312, 315, 319, 316, 316, 317, 314, 319, 322, 320, 320, 321, 316, 325, 320, 323, 321, 320, 325, 289, 325, 306, 324, 325, 289, 306, 323, 308, 310, 324, 307, 367, 326, 327, 285, 283, 329, 331, 315, 314, 314, 318, 330, 334, 338, 335, 335, 336, 333, 341, 335, 339, 336, 335, 341, 330, 341, 331, 340, 341, 330, 346, 342, 343, 282, 280, 345, 343, 349, 347, 362, 348, 345, 353, 347, 350, 348, 362, 352, 361, 353, 354, 351, 352, 356, 358, 361, 354, 355, 356, 360, 358, 331, 361, 340, 332, 359, 361, 339, 353, 336, 340, 356, 353, 338, 347, 337, 336, 352, 347, 334, 346, 364, 337, 362, 342, 346, 363, 364, 345, 278, 363, 334, 333, 333, 337, 365, 279, 274, 276, 275, 273, 278, 365, 274, 363, 278, 273, 365, 326, 367, 343, 344, 329, 282, 343, 367, 349, 369, 329, 344, 349, 368, 350, 371, 369, 348, 354, 350, 370, 371, 351, 360, 322, 380, 372, 375, 373, 324, 372, 380, 374, 381, 373, 328, 327, 284, 372, 287, 285, 328, 372, 286, 308, 309, 287, 375, 377, 382, 358, 359, 378, 360, 358, 382, 315, 318, 378, 332, 380, 382, 377, 379, 378, 381, 319, 382, 380, 373, 378, 321, 384, 419, 385, 391, 386, 388, 393, 383, 389, 391, 388, 392, 389, 396, 394, 399, 395, 392, 396, 400, 397, 403, 398, 399, 400, 404, 401, 492, 402, 403, 424, 401, 405, 402, 492, 407, 408, 428, 405, 406, 409, 402, 411, 408, 404, 402, 410, 398, 400, 396, 411, 414, 395, 398, 396, 389, 413, 416, 390, 395, 417, 415, 389, 390, 416, 391, 417, 385, 420, 386, 391, 418, 374, 443, 422, 425, 423, 328, 443, 374, 405, 407, 381, 423, 368, 367, 422, 328, 329, 369, 384, 370, 419, 387, 386, 371, 443, 405, 429, 409, 406, 423, 432, 443, 429, 430, 423, 434, 451, 435, 431, 433, 450, 436, 438, 432, 435, 450, 433, 440, 438, 437, 441, 442, 440, 427, 426, 441, 420, 421, 442, 386, 438, 426, 370, 371, 427, 369, 422, 432, 438, 439, 433, 369, 459, 420, 444, 442, 421, 446, 437, 484, 444, 445, 447, 442, 484, 437, 448, 450, 440, 447, 451, 453, 448, 449, 452, 450, 431, 468, 453, 452, 454, 436, 468, 431, 455, 430, 434, 454, 455, 429, 457, 456, 458, 430, 461, 417, 459, 421, 418, 460, 487, 415, 461, 418, 416, 462, 415, 487, 463, 464, 462, 414, 466, 411, 463, 414, 412, 465, 485, 408, 466, 412, 410, 467, 408, 485, 457, 410, 409, 458, 468, 471, 469, 474, 470, 452, 471, 475, 472, 483, 473, 474, 479, 472, 476, 473, 483, 478, 476, 486, 480, 482, 481, 478, 480, 461, 479, 446, 460, 482, 472, 479, 459, 446, 478, 445, 484, 469, 472, 483, 474, 445, 448, 453, 484, 474, 452, 449, 457, 471, 468, 454, 470, 456, 475, 471, 457, 458, 470, 467, 476, 475, 485, 467, 473, 465, 486, 476, 466, 465, 477, 464, 463, 487, 486, 482, 462, 464, 491, 401, 488, 407, 492, 490, 501, 397, 491, 492, 403, 493, 397, 501, 494, 496, 493, 399, 394, 494, 495, 497, 496, 392, 499, 383, 495, 392, 388, 498, 502, 384, 499, 388, 387, 500, 502, 499, 488, 490, 498, 500, 495, 501, 491, 490, 493, 498, 502, 357, 384, 371, 360, 500, 502, 488, 377, 379, 489, 360, 424, 374, 488, 407, 489, 381 ],
49 | "subMeshes": [
50 | {
51 | "materialIndex": 0,
52 | "verticesStart": 0,
53 | "verticesCount": 507,
54 | "indexStart": 0,
55 | "indexCount": 2904
56 | }
57 | ]
58 | }
59 | ],
60 | "multiMaterials": [ ]
61 | }
--------------------------------------------------------------------------------