57862207 vor 1 Jahr
Commit
b6e385cc81
100 geänderte Dateien mit 59170 neuen und 0 gelöschten Zeilen
  1. BIN
      1k_face2_0_1.jpg
  2. BIN
      DMAP需求文档3.0-0903.docx
  3. 24 0
      README.md
  4. 5 0
      babel.config.js
  5. 19 0
      jsconfig.json
  6. 20919 0
      package-lock.json
  7. 53 0
      package.json
  8. BIN
      public/.DS_Store
  9. 36218 0
      public/HOUSEPLAY.bak.js
  10. 3 0
      public/HOUSEPLAY.bak.liu.js
  11. 3 0
      public/HOUSEPLAY.js
  12. 3 0
      public/HOUSEPLAY2.js
  13. BIN
      public/cert/.DS_Store
  14. 63 0
      public/cert/2022/zh3x.cn.crt
  15. 17 0
      public/cert/2022/zh3x.cn.csr
  16. 27 0
      public/cert/2022/zh3x.cn.key
  17. 35 0
      public/cert/2022/zh3x.cn.pem
  18. 28 0
      public/cert/2022/zh3x.cn_ca.crt
  19. 91 0
      public/cert/zh3x.cn.cer
  20. 91 0
      public/cert/zh3x.cn.crt
  21. 118 0
      public/cert/zh3x.cn.key
  22. 91 0
      public/cert/zh3x.cn.pem
  23. 91 0
      public/cert/zh3x.cn_ca.crt
  24. 422 0
      public/curves/CurveExtras.js
  25. 80 0
      public/curves/NURBSCurve.js
  26. 52 0
      public/curves/NURBSSurface.js
  27. 487 0
      public/curves/NURBSUtils.js
  28. BIN
      public/favicon.ico
  29. 31 0
      public/gltf/draco_decoder.js
  30. BIN
      public/gltf/draco_decoder.wasm
  31. 33 0
      public/gltf/draco_encoder.js
  32. 119 0
      public/gltf/draco_wasm_wrapper.js
  33. BIN
      public/images/.DS_Store
  34. BIN
      public/images/01.png
  35. BIN
      public/images/3DVR.PNG
  36. BIN
      public/images/3D_button.png
  37. BIN
      public/images/3D_button_active.png
  38. BIN
      public/images/3d.png
  39. BIN
      public/images/Close.png
  40. BIN
      public/images/Spinner_t.gif
  41. BIN
      public/images/VR-active.png
  42. BIN
      public/images/add-icon-active.png
  43. BIN
      public/images/add-icon.png
  44. BIN
      public/images/aibee_entry_img.png
  45. BIN
      public/images/arc_surface_2x.png
  46. BIN
      public/images/audio_pause@3x_128x128.png
  47. BIN
      public/images/audio_play@3x_128x128.png
  48. BIN
      public/images/audiooff_128x128.png
  49. BIN
      public/images/audiooff_24x24.png
  50. BIN
      public/images/audiooff_38x38.png
  51. BIN
      public/images/audiooff_70x70.jpg
  52. BIN
      public/images/audioon_128x128.png
  53. BIN
      public/images/audioon_128x128_hover.png
  54. BIN
      public/images/audioon_24x24.png
  55. BIN
      public/images/audioon_38x38.png
  56. BIN
      public/images/audioon_70x70.png
  57. BIN
      public/images/audiotag_n_20_60x60.png
  58. BIN
      public/images/audiotag_n_20_60x60_hover.png
  59. BIN
      public/images/back-black.png
  60. BIN
      public/images/back-white.png
  61. BIN
      public/images/back_button.png
  62. 47 0
      public/images/ball-triangle.svg
  63. BIN
      public/images/bg.jpg
  64. BIN
      public/images/bigclose_56x56.png
  65. BIN
      public/images/bone_node_choosed_2x.png
  66. BIN
      public/images/bone_node_default_2x.png
  67. BIN
      public/images/center_logo.png
  68. BIN
      public/images/center_white_logo.png
  69. BIN
      public/images/click-walk.png
  70. BIN
      public/images/close_40x40.png
  71. BIN
      public/images/colpick_arrows.png
  72. BIN
      public/images/colpick_indic.gif
  73. BIN
      public/images/colpick_overlay.png
  74. BIN
      public/images/colpick_select.gif
  75. BIN
      public/images/colpick_slider.png
  76. BIN
      public/images/compass.png
  77. BIN
      public/images/compass_128.png
  78. BIN
      public/images/compass_128_1.png
  79. BIN
      public/images/compass_512x512.png
  80. BIN
      public/images/compass_512x512.png.png
  81. BIN
      public/images/compassall.png
  82. BIN
      public/images/compassoutdoor.png
  83. BIN
      public/images/compassoutdoor_512x512.png
  84. BIN
      public/images/compassoutdoor_f_512x512.png
  85. BIN
      public/images/compassscale.png
  86. BIN
      public/images/compassscale_512x512.png
  87. BIN
      public/images/compassscale_f_512x512.png
  88. BIN
      public/images/css_sprites.png
  89. BIN
      public/images/css_sprites2.png
  90. BIN
      public/images/css_sprites3.png
  91. BIN
      public/images/css_sprites4.png
  92. BIN
      public/images/current-select.png
  93. BIN
      public/images/cursor.png
  94. BIN
      public/images/defaultBg_mobile.jpg
  95. BIN
      public/images/defaultBg_pc.jpg
  96. BIN
      public/images/default_head_icon.png
  97. BIN
      public/images/defaultloading.png
  98. BIN
      public/images/defaultloading_pre.png
  99. BIN
      public/images/del_test_cursor.png
  100. 0 0
      public/images/delete-active-icon.png

BIN
1k_face2_0_1.jpg


BIN
DMAP需求文档3.0-0903.docx


+ 24 - 0
README.md

@@ -0,0 +1,24 @@
+# dmap-front
+
+## Project setup
+```
+npm install
+```
+
+### Compiles and hot-reloads for development
+```
+npm run serve
+```
+
+### Compiles and minifies for production
+```
+npm run build
+```
+
+### Lints and fixes files
+```
+npm run lint
+```
+
+### Customize configuration
+See [Configuration Reference](https://cli.vuejs.org/config/).

+ 5 - 0
babel.config.js

@@ -0,0 +1,5 @@
+module.exports = {
+  presets: [
+    '@vue/cli-plugin-babel/preset'
+  ]
+}

+ 19 - 0
jsconfig.json

@@ -0,0 +1,19 @@
+{
+  "compilerOptions": {
+    "target": "es5",
+    "module": "esnext",
+    "baseUrl": "./",
+    "moduleResolution": "node",
+    "paths": {
+      "@/*": [
+        "src/*"
+      ]
+    },
+    "lib": [
+      "esnext",
+      "dom",
+      "dom.iterable",
+      "scripthost"
+    ]
+  }
+}

Datei-Diff unterdrückt, da er zu groß ist
+ 20919 - 0
package-lock.json


+ 53 - 0
package.json

@@ -0,0 +1,53 @@
+{
+  "name": "dmap-front",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "serve": "vue-cli-service serve",
+    "build": "vue-cli-service build",
+    "lint": "vue-cli-service lint"
+  },
+  "dependencies": {
+    "axios": "^0.18.1",
+    "core-js": "^3.8.3",
+    "element-ui": "^2.15.14",
+    "less": "^4.2.0",
+    "less-loader": "^11.1.3",
+    "mitt": "^3.0.1",
+    "three": "^0.100.0",
+    "vue": "^2.6.14",
+    "vue-router": "^3.6.5",
+    "vue-socket.io": "^3.0.10",
+    "vuex": "^3.0.1"
+  },
+  "devDependencies": {
+    "@babel/core": "^7.12.16",
+    "@babel/eslint-parser": "^7.12.16",
+    "@iconify/vue": "^4.1.1",
+    "@vue/cli-plugin-babel": "~5.0.0",
+    "@vue/cli-plugin-eslint": "~5.0.0",
+    "@vue/cli-service": "~5.0.0",
+    "eslint": "^7.32.0",
+    "eslint-plugin-vue": "^8.0.3",
+    "vue-template-compiler": "^2.6.14"
+  },
+  "eslintConfig": {
+    "root": true,
+    "env": {
+      "node": true
+    },
+    "extends": [
+      "plugin:vue/essential",
+      "eslint:recommended"
+    ],
+    "parserOptions": {
+      "parser": "@babel/eslint-parser"
+    },
+    "rules": {}
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not dead"
+  ]
+}

BIN
public/.DS_Store


Datei-Diff unterdrückt, da er zu groß ist
+ 36218 - 0
public/HOUSEPLAY.bak.js


Datei-Diff unterdrückt, da er zu groß ist
+ 3 - 0
public/HOUSEPLAY.bak.liu.js


Datei-Diff unterdrückt, da er zu groß ist
+ 3 - 0
public/HOUSEPLAY.js


Datei-Diff unterdrückt, da er zu groß ist
+ 3 - 0
public/HOUSEPLAY2.js


BIN
public/cert/.DS_Store


+ 63 - 0
public/cert/2022/zh3x.cn.crt

@@ -0,0 +1,63 @@
+-----BEGIN CERTIFICATE-----
+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
+rhu/wQnOQORDB/eN/w==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIErjCCA5agAwIBAgIQBYAmfwbylVM0jhwYWl7uLjANBgkqhkiG9w0BAQsFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
+QTAeFw0xNzEyMDgxMjI4MjZaFw0yNzEyMDgxMjI4MjZaMHIxCzAJBgNVBAYTAkNO
+MSUwIwYDVQQKExxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMR0wGwYDVQQL
+ExREb21haW4gVmFsaWRhdGVkIFNTTDEdMBsGA1UEAxMUVHJ1c3RBc2lhIFRMUyBS
+U0EgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgWa9X+ph+wAm8
+Yh1Fk1MjKbQ5QwBOOKVaZR/OfCh+F6f93u7vZHGcUU/lvVGgUQnbzJhR1UV2epJa
+e+m7cxnXIKdD0/VS9btAgwJszGFvwoqXeaCqFoP71wPmXjjUwLT70+qvX4hdyYfO
+JcjeTz5QKtg8zQwxaK9x4JT9CoOmoVdVhEBAiD3DwR5fFgOHDwwGxdJWVBvktnoA
+zjdTLXDdbSVC5jZ0u8oq9BiTDv7jAlsB5F8aZgvSZDOQeFrwaOTbKWSEInEhnchK
+ZTD1dz6aBlk1xGEI5PZWAnVAba/ofH33ktymaTDsE6xRDnW97pDkimCRak6CEbfe
+3dXw6OV5AgMBAAGjggFPMIIBSzAdBgNVHQ4EFgQUf9OZ86BHDjEAVlYijrfMnt3K
+AYowHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDgYDVR0PAQH/BAQD
+AgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAG
+AQH/AgEAMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3Au
+ZGlnaWNlcnQuY29tMEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2lj
+ZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RDQS5jcmwwTAYDVR0gBEUwQzA3Bglg
+hkgBhv1sAQIwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29t
+L0NQUzAIBgZngQwBAgEwDQYJKoZIhvcNAQELBQADggEBAK3dVOj5dlv4MzK2i233
+lDYvyJ3slFY2X2HKTYGte8nbK6i5/fsDImMYihAkp6VaNY/en8WZ5qcrQPVLuJrJ
+DSXT04NnMeZOQDUoj/NHAmdfCBB/h1bZ5OGK6Sf1h5Yx/5wR4f3TUoPgGlnU7EuP
+ISLNdMRiDrXntcImDAiRvkh5GJuH4YCVE6XEntqaNIgGkRwxKSgnU3Id3iuFbW9F
+UQ9Qqtb1GX91AJ7i4153TikGgYCdwYkBURD8gSVe8OAco6IfZOYt/TEwii1Ivi1C
+qnuUlWpsF1LdQNIdfbW3TSe0BhQa7ifbVIfvPWHYOu3rkg1ZeMo6XRU9B4n5VyJY
+RmE=
+-----END CERTIFICATE-----

+ 17 - 0
public/cert/2022/zh3x.cn.csr

@@ -0,0 +1,17 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIICpDCCAYwCAQAwXzELMAkGA1UEBhMCQ04xDjAMBgNVBAgMBUh1bmFuMREwDwYD
+VQQHDAhDaGFuZ3NoYTENMAsGA1UECgwEemgzeDEMMAoGA1UECwwDZGV2MRAwDgYD
+VQQDDAd6aDN4LmNuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8mbz
+CwmZ9c9YSVKRHZ+D99kiO0f2sOR9BMDidba8pFB7tIk1SUTbcpYdjgs1cx0dcZIL
+EU4tyw00nLUNjrUeyRCJK5FXECf46Hb4PvEM1r5YlftXwwxMSsQMvhgMZ04Y5NB+
+oI8uXNV3PcBiRaOl/P/TJDzB+bE+fIVI+seoEVqkaMqnAaMdmDviSTe79vCkdEaH
+UsU50BIT7GkTXQZSyRgliYwENGXPp7pD7ygzDpf+iMrCDkbmjsL2fur6ix1YmZEK
+SwExpYZt9tW4N+jjwuHxBxJC1E9D6fg8EQrTPJom45TV58gpuUBcpMkt+G94OZxY
+ucOdG6M3Q4ZATS9+QwIDAQABoAAwDQYJKoZIhvcNAQELBQADggEBAKCdZNlk9Gg9
+O+ytUQSSL6+zHj47Uv6gDtXEFwFQf4Z80i4pBWAIsFm05EM2gJTiGokfde2gD/cE
+FUuMSLnguf4cjK5FVBrBNWdOPlxZHFtsoZSCFwXOgVvNjD+RJdvulUB5o04YdBhL
+H/OJMVoQVQcXO+s/jcR4TKgXItSQjilopo2UzmeTijUYmX/tRP0YOvmBva1j2qxg
++k8j1DQkYNK3M15duAg8WEBu7khCfiAGpDNFaZ5y4wFqyQi3k1wnR3gU3TDIRtjz
+OCgCO8eifp+UAtOCMTf88tmmwYC5O0dirXSYQrUGR9hLSlLnTq6BzLGHWQEy/11+
+FfWd3326VtI=
+-----END CERTIFICATE REQUEST-----

+ 27 - 0
public/cert/2022/zh3x.cn.key

@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEogIBAAKCAQEAnITju6zkDQyIXHLXp1sacWuR1a4/+BgGpV4s1CGR2XWOzR6W
+WMwm2Z3v9Y2277xZy9T3oGdycCZe8JuNK28rvPi0gA8bZevC0upWk17nJ0TJmk2E
+oKACZmLl8Ug2gVfIg73PcztGS8hsngxaCYvlczBTCumfYV0FpPKAL/nS7SjoKobs
+ZUZtY50BeIOLJGnmGaKb3NMMQzPqFehse5W60UsQQo79LWSf70jHi3IFg+eZ6MtN
+ntizLglB3vteczIXn9+RWXrgyPLE3BU/KovbiWjTXtCPivIEDyplnR4hsXyrxlVL
+Bq/m9aLOgZH9Zug9jYrOVKFEEQwgQJ8LuNIt+QIDAQABAoIBAAQ40PBHv/s1S0ss
+GrKpglIiJSPy4EfxH6JvuCzs2WNuDdECX4BBGdYCUhNTyZDCqheVlMGOHMqskaBy
+9QjsMHgM1jNDRQ7NIDCX2zKR4NFrjsvDhh2ePKZV9K7Qbvjy8luRtTIeEehlfVQ6
+OtEEWycjO/A2IE3sPY9cbmECP60U4+QYVIM7OCPNCiahOgH8/lvIJveW3nAYYq/F
+lGztMfblMBkJY54BsT8+6UImpuI8dh/quHSgZX5UaQH7h/M6D+Xp+UgXaqGOpWTN
+X5BRof8AQXgQZsmHOCEC3ImsJDfenUyqSKDmzrFNIDsXweCd5PwuMbrwH/niaB53
+dNCjUrECgYEAyIe3fU3wuJrY0uiQqUMKsBBIm/CYlm7fpia1V8wTRgwmjVc/Oa5b
+3GcDI9z6Rt7dSEFcgbSYotbpfIkMt7r/CMR0hemrtquapMh3Ew7tVogwYnQNTDyT
+qzEV/V9lnfUUHVXFGgO/ngKXyzpBHufQ3oWRy+lyFVIzPhQ/eUcjj8kCgYEAx9CW
+bBVaLYgWUPFp9BDJOw2Ua4U3o3T1eW0bPhPB4EZieXYzng2L0cZ1ZBlzGYBMWAgI
+oYsFSEi0eb2QlJ3gub8YctSEMoYNcFdHi4SlmZdU10cpEG0rrpHZUPOObQjsoDxC
+8HCphJQk4zT5fZedq8Jk30hDVIQts5FaCM2npLECgYAYISyVKWHD9O4OQunVVDnf
+Abaa/RJ/V4wV5CaCEA5pqWCiNVNoT3DCTqr0D80V5g9eeG73NJIBVjb2Q0+CdD/o
+ACu9SWbeLjwHhA+//VXVycF4t1o6SDfEq71npakGnszy0rVK8hSGoO0/CR146JAb
+lpr6nHab1i5QVANnRoYi8QKBgF215dYq7XANMuojTp24gafAZqtGfyGZ6MZZ9TzX
+50VXvTdZyDuH/tsTSFr51JFRKnzex617la6g6oNt9DC/GnYCuWShZp6LYCIfzN4S
+B9hQsOmF5ixeBu6IWHMuxs08Mj20BXDeZaJYGDS204ujX77+HHDbYzhwBT8CHEek
+q8sBAoGAN/8tXFHXNuohT/UDHKTDcAxggL4ipTm0bcgBNvaaLrodcEKevuZeZIc6
+xCYrFy9jMNeHcNZo4NEV7AkVXGbCUpVOrLeZCGcSUEBjTKjGL5dFnNPc0G5w27IS
+YM45uG+Id9nI/Zzqu8wPGijjnHU6pw9YOStOdtSh9knaYcEtsCc=
+-----END RSA PRIVATE KEY-----

+ 35 - 0
public/cert/2022/zh3x.cn.pem

@@ -0,0 +1,35 @@
+-----BEGIN CERTIFICATE-----
+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
+rhu/wQnOQORDB/eN/w==
+-----END CERTIFICATE-----

+ 28 - 0
public/cert/2022/zh3x.cn_ca.crt

@@ -0,0 +1,28 @@
+-----BEGIN CERTIFICATE-----
+MIIErjCCA5agAwIBAgIQBYAmfwbylVM0jhwYWl7uLjANBgkqhkiG9w0BAQsFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
+QTAeFw0xNzEyMDgxMjI4MjZaFw0yNzEyMDgxMjI4MjZaMHIxCzAJBgNVBAYTAkNO
+MSUwIwYDVQQKExxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMR0wGwYDVQQL
+ExREb21haW4gVmFsaWRhdGVkIFNTTDEdMBsGA1UEAxMUVHJ1c3RBc2lhIFRMUyBS
+U0EgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgWa9X+ph+wAm8
+Yh1Fk1MjKbQ5QwBOOKVaZR/OfCh+F6f93u7vZHGcUU/lvVGgUQnbzJhR1UV2epJa
+e+m7cxnXIKdD0/VS9btAgwJszGFvwoqXeaCqFoP71wPmXjjUwLT70+qvX4hdyYfO
+JcjeTz5QKtg8zQwxaK9x4JT9CoOmoVdVhEBAiD3DwR5fFgOHDwwGxdJWVBvktnoA
+zjdTLXDdbSVC5jZ0u8oq9BiTDv7jAlsB5F8aZgvSZDOQeFrwaOTbKWSEInEhnchK
+ZTD1dz6aBlk1xGEI5PZWAnVAba/ofH33ktymaTDsE6xRDnW97pDkimCRak6CEbfe
+3dXw6OV5AgMBAAGjggFPMIIBSzAdBgNVHQ4EFgQUf9OZ86BHDjEAVlYijrfMnt3K
+AYowHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDgYDVR0PAQH/BAQD
+AgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAG
+AQH/AgEAMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3Au
+ZGlnaWNlcnQuY29tMEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2lj
+ZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RDQS5jcmwwTAYDVR0gBEUwQzA3Bglg
+hkgBhv1sAQIwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29t
+L0NQUzAIBgZngQwBAgEwDQYJKoZIhvcNAQELBQADggEBAK3dVOj5dlv4MzK2i233
+lDYvyJ3slFY2X2HKTYGte8nbK6i5/fsDImMYihAkp6VaNY/en8WZ5qcrQPVLuJrJ
+DSXT04NnMeZOQDUoj/NHAmdfCBB/h1bZ5OGK6Sf1h5Yx/5wR4f3TUoPgGlnU7EuP
+ISLNdMRiDrXntcImDAiRvkh5GJuH4YCVE6XEntqaNIgGkRwxKSgnU3Id3iuFbW9F
+UQ9Qqtb1GX91AJ7i4153TikGgYCdwYkBURD8gSVe8OAco6IfZOYt/TEwii1Ivi1C
+qnuUlWpsF1LdQNIdfbW3TSe0BhQa7ifbVIfvPWHYOu3rkg1ZeMo6XRU9B4n5VyJY
+RmE=
+-----END CERTIFICATE-----

+ 91 - 0
public/cert/zh3x.cn.cer

@@ -0,0 +1,91 @@
+-----BEGIN CERTIFICATE-----
+MIIGZjCCBM6gAwIBAgIRALFtDf8LJJnkbuRhtXejQiAwDQYJKoZIhvcNAQEMBQAw
+WTELMAkGA1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dpZXMs
+IEluYy4xIzAhBgNVBAMTGlRydXN0QXNpYSBSU0EgRFYgVExTIENBIEcyMB4XDTIz
+MDYxNTAwMDAwMFoXDTI0MDYxNDIzNTk1OVowEjEQMA4GA1UEAxMHemgzeC5jbjCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKUIFMhBQA9qR6IHyb54ZEk9
+WfH1YouCzWU2ZfrUCKLZcyrLXutX2hhNUDC5L+IENOJxuPuMLz1v4Ik1njl4EiXw
+iNw2uIfY5wVaCkIqHCxFcKiwqZE+ADGWkkDre3+2cdRof0FJ0HeZ+/oSV2mxYIXP
+nHqJKv3bC71rh7GbHZLXKYBc52sbIvuG54b69kRhECSrRUgQW7ElPsvlmfiTsmZ6
+3nwrUKEjLfcAMRB0oHTAGfccUyk9ry5a44eo+9Uz8LHUmc4a6EZCbL6c+znKSKCe
+LsJDz1Rcro10+DDktlENDjPVyxDtFW0vJITQygj4mqVi9HQr4ky6FdE3uhGXBh8C
+AwEAAaOCAu4wggLqMB8GA1UdIwQYMBaAFF86fBEQfgxncWHci6O1AANn9VccMB0G
+A1UdDgQWBBQuMGNZu5hYiE3kg6H9ft/EJag8izAOBgNVHQ8BAf8EBAMCBaAwDAYD
+VR0TAQH/BAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwSQYDVR0g
+BEIwQDA0BgsrBgEEAbIxAQICMTAlMCMGCCsGAQUFBwIBFhdodHRwczovL3NlY3Rp
+Z28uY29tL0NQUzAIBgZngQwBAgEwfQYIKwYBBQUHAQEEcTBvMEIGCCsGAQUFBzAC
+hjZodHRwOi8vY3J0LnRydXN0LXByb3ZpZGVyLmNuL1RydXN0QXNpYVJTQURWVExT
+Q0FHMi5jcnQwKQYIKwYBBQUHMAGGHWh0dHA6Ly9vY3NwLnRydXN0LXByb3ZpZGVy
+LmNuMB8GA1UdEQQYMBaCB3poM3guY26CC3d3dy56aDN4LmNuMIIBfgYKKwYBBAHW
+eQIEAgSCAW4EggFqAWgAdQB2/4g/Crb7lVHCYcz1h7o0tKTNuyncaEIKn+ZnTFo6
+dAAAAYi+A+S+AAAEAwBGMEQCIAiKvryjV1VcD1RWKIbMlFa52rSO1r20/IzdaiSV
+DCYDAiBl+lkCNnG2HomHWdCeXy1dTtCgPqD3YJTW3YRsSyuz6gB3ANq2v2s/tbYi
+n5vCu1xr6HCRcWy7UYSFNL2kPTBI1/urAAABiL4D5RQAAAQDAEgwRgIhAKq09Mi/
+NsvJo/rHBBsPkX+NKJavDzI2zGa30ZLj1aqJAiEA6ya9tUdVBknAkizqopTB5vYZ
+j8tse75rdGMIecVUFF0AdgDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1
+mwAAAYi+A+TqAAAEAwBHMEUCIFkD1yKHLAmChwDXBqxh2R1eN3xQ0J0V4xoAPfE/
+kVagAiEA+wBT87BEpoi6GroIa0r8wEG5B1LOxK5KP66/CMjSq1YwDQYJKoZIhvcN
+AQEMBQADggGBAFMdQUX7JE8J+fUeDUnTo1pN2pHanRCYXr/d9IHUaoAeNoABTl62
+7wAH8WOqpKjXhgeZ/7stM8BEtAkyVspzullJP+i6oFRZ/aRqD220nwP8NulmOkFo
+g7cZpP0NJWzKuSryflOpm6E6mdpK/CSSgTBeEqxHJJ4sNhAehLTS2PAvXVdLqH8T
+taB+W4VnK2vIsedYJBZA7xs+6I/X9veFH2WN1b6ZZkAh72JfUcnDtm7yKCB6gbBG
+ynZa+T9mOZhPq/R0HVr5BeTJWomWLJTdbtR7/rkb3HWG0PrbZ+ktQiDyWgKykf08
+LNoUszAS//3gyHGi7CYngh5QK8jkdvAR4QLUbf/FjFvZuTFHdgy7aE8TXjM9Qs2z
+Gqf9b+2RCJ8kfBEOuSdeRtlPRu5+czN/Uq3UfDskHLf0SSJt2y1sgFOrnkwXYnwd
+FTxkYP7pMe6ZtxBHZ+pVq6dlFgehTNwkVK6ZCdKScZ0NGvK6z2rocGMMscty9Fef
+bPdig2AycBjxxg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFBzCCA++gAwIBAgIRALIM7VUuMaC/NDp1KHQ76aswDQYJKoZIhvcNAQELBQAw
+ezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
+BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0yMjAxMTAwMDAwMDBaFw0y
+ODEyMzEyMzU5NTlaMFkxCzAJBgNVBAYTAkNOMSUwIwYDVQQKExxUcnVzdEFzaWEg
+VGVjaG5vbG9naWVzLCBJbmMuMSMwIQYDVQQDExpUcnVzdEFzaWEgUlNBIERWIFRM
+UyBDQSBHMjCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAKjGDe0GSaBs
+Yl/VhMaTM6GhfR1TAt4mrhN8zfAMwEfLZth+N2ie5ULbW8YvSGzhqkDhGgSBlafm
+qq05oeESrIJQyz24j7icGeGyIZ/jIChOOvjt4M8EVi3O0Se7E6RAgVYcX+QWVp5c
+Sy+l7XrrtL/pDDL9Bngnq/DVfjCzm5ZYUb1PpyvYTP7trsV+yYOCNmmwQvB4yVjf
+IIpHC1OcsPBntMUGeH1Eja4D+qJYhGOxX9kpa+2wTCW06L8T6OhkpJWYn5JYiht5
+8exjAR7b8Zi3DeG9oZO5o6Qvhl3f8uGU8lK1j9jCUN/18mI/5vZJ76i+hsgdlfZB
+Rh5lmAQjD80M9TY+oD4MYUqB5XrigPfFAUwXFGehhlwCVw7y6+5kpbq/NpvM5Ba8
+SeQYUUuMA8RXpTtGlrrTPqJryfa55hTuX/ThhX4gcCVkbyujo0CYr+Uuc14IOyNY
+1fD0/qORbllbgV41wiy/2ZUWZQUodqHWkjT1CwIMbQOY5jmrSYGBwwIDAQABo4IB
+JjCCASIwHwYDVR0jBBgwFoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYDVR0OBBYE
+FF86fBEQfgxncWHci6O1AANn9VccMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8E
+CDAGAQH/AgEAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAiBgNVHSAE
+GzAZMA0GCysGAQQBsjEBAgIxMAgGBmeBDAECATBDBgNVHR8EPDA6MDigNqA0hjJo
+dHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNy
+bDA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9k
+b2NhLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAHMUom5cxIje2IiFU7mOCsBr2F6CY
+eU5cyfQ/Aep9kAXYUDuWsaT85721JxeXFYkf4D/cgNd9+hxT8ZeDOJrn+ysqR7NO
+2K9AdqTdIY2uZPKmvgHOkvH2gQD6jc05eSPOwdY/10IPvmpgUKaGOa/tyygL8Og4
+3tYyoHipMMnS4OiYKakDJny0XVuchIP7ZMKiP07Q3FIuSS4omzR77kmc75/6Q9dP
+v4wa90UCOn1j6r7WhMmX3eT3Gsdj3WMe9bYD0AFuqa6MDyjIeXq08mVGraXiw73s
+Zale8OMckn/BU3O/3aFNLHLfET2H2hT6Wb3nwxjpLIfXmSVcVd8A58XH0g==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb
+MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
+GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj
+YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL
+MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
+BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM
+GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua
+BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe
+3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4
+YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR
+rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm
+ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU
+oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
+MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v
+QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t
+b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF
+AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q
+GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
+Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2
+G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi
+l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3
+smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
+-----END CERTIFICATE-----

+ 91 - 0
public/cert/zh3x.cn.crt

@@ -0,0 +1,91 @@
+-----BEGIN CERTIFICATE-----
+MIIGZjCCBM6gAwIBAgIRALFtDf8LJJnkbuRhtXejQiAwDQYJKoZIhvcNAQEMBQAw
+WTELMAkGA1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dpZXMs
+IEluYy4xIzAhBgNVBAMTGlRydXN0QXNpYSBSU0EgRFYgVExTIENBIEcyMB4XDTIz
+MDYxNTAwMDAwMFoXDTI0MDYxNDIzNTk1OVowEjEQMA4GA1UEAxMHemgzeC5jbjCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKUIFMhBQA9qR6IHyb54ZEk9
+WfH1YouCzWU2ZfrUCKLZcyrLXutX2hhNUDC5L+IENOJxuPuMLz1v4Ik1njl4EiXw
+iNw2uIfY5wVaCkIqHCxFcKiwqZE+ADGWkkDre3+2cdRof0FJ0HeZ+/oSV2mxYIXP
+nHqJKv3bC71rh7GbHZLXKYBc52sbIvuG54b69kRhECSrRUgQW7ElPsvlmfiTsmZ6
+3nwrUKEjLfcAMRB0oHTAGfccUyk9ry5a44eo+9Uz8LHUmc4a6EZCbL6c+znKSKCe
+LsJDz1Rcro10+DDktlENDjPVyxDtFW0vJITQygj4mqVi9HQr4ky6FdE3uhGXBh8C
+AwEAAaOCAu4wggLqMB8GA1UdIwQYMBaAFF86fBEQfgxncWHci6O1AANn9VccMB0G
+A1UdDgQWBBQuMGNZu5hYiE3kg6H9ft/EJag8izAOBgNVHQ8BAf8EBAMCBaAwDAYD
+VR0TAQH/BAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwSQYDVR0g
+BEIwQDA0BgsrBgEEAbIxAQICMTAlMCMGCCsGAQUFBwIBFhdodHRwczovL3NlY3Rp
+Z28uY29tL0NQUzAIBgZngQwBAgEwfQYIKwYBBQUHAQEEcTBvMEIGCCsGAQUFBzAC
+hjZodHRwOi8vY3J0LnRydXN0LXByb3ZpZGVyLmNuL1RydXN0QXNpYVJTQURWVExT
+Q0FHMi5jcnQwKQYIKwYBBQUHMAGGHWh0dHA6Ly9vY3NwLnRydXN0LXByb3ZpZGVy
+LmNuMB8GA1UdEQQYMBaCB3poM3guY26CC3d3dy56aDN4LmNuMIIBfgYKKwYBBAHW
+eQIEAgSCAW4EggFqAWgAdQB2/4g/Crb7lVHCYcz1h7o0tKTNuyncaEIKn+ZnTFo6
+dAAAAYi+A+S+AAAEAwBGMEQCIAiKvryjV1VcD1RWKIbMlFa52rSO1r20/IzdaiSV
+DCYDAiBl+lkCNnG2HomHWdCeXy1dTtCgPqD3YJTW3YRsSyuz6gB3ANq2v2s/tbYi
+n5vCu1xr6HCRcWy7UYSFNL2kPTBI1/urAAABiL4D5RQAAAQDAEgwRgIhAKq09Mi/
+NsvJo/rHBBsPkX+NKJavDzI2zGa30ZLj1aqJAiEA6ya9tUdVBknAkizqopTB5vYZ
+j8tse75rdGMIecVUFF0AdgDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1
+mwAAAYi+A+TqAAAEAwBHMEUCIFkD1yKHLAmChwDXBqxh2R1eN3xQ0J0V4xoAPfE/
+kVagAiEA+wBT87BEpoi6GroIa0r8wEG5B1LOxK5KP66/CMjSq1YwDQYJKoZIhvcN
+AQEMBQADggGBAFMdQUX7JE8J+fUeDUnTo1pN2pHanRCYXr/d9IHUaoAeNoABTl62
+7wAH8WOqpKjXhgeZ/7stM8BEtAkyVspzullJP+i6oFRZ/aRqD220nwP8NulmOkFo
+g7cZpP0NJWzKuSryflOpm6E6mdpK/CSSgTBeEqxHJJ4sNhAehLTS2PAvXVdLqH8T
+taB+W4VnK2vIsedYJBZA7xs+6I/X9veFH2WN1b6ZZkAh72JfUcnDtm7yKCB6gbBG
+ynZa+T9mOZhPq/R0HVr5BeTJWomWLJTdbtR7/rkb3HWG0PrbZ+ktQiDyWgKykf08
+LNoUszAS//3gyHGi7CYngh5QK8jkdvAR4QLUbf/FjFvZuTFHdgy7aE8TXjM9Qs2z
+Gqf9b+2RCJ8kfBEOuSdeRtlPRu5+czN/Uq3UfDskHLf0SSJt2y1sgFOrnkwXYnwd
+FTxkYP7pMe6ZtxBHZ+pVq6dlFgehTNwkVK6ZCdKScZ0NGvK6z2rocGMMscty9Fef
+bPdig2AycBjxxg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFBzCCA++gAwIBAgIRALIM7VUuMaC/NDp1KHQ76aswDQYJKoZIhvcNAQELBQAw
+ezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
+BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0yMjAxMTAwMDAwMDBaFw0y
+ODEyMzEyMzU5NTlaMFkxCzAJBgNVBAYTAkNOMSUwIwYDVQQKExxUcnVzdEFzaWEg
+VGVjaG5vbG9naWVzLCBJbmMuMSMwIQYDVQQDExpUcnVzdEFzaWEgUlNBIERWIFRM
+UyBDQSBHMjCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAKjGDe0GSaBs
+Yl/VhMaTM6GhfR1TAt4mrhN8zfAMwEfLZth+N2ie5ULbW8YvSGzhqkDhGgSBlafm
+qq05oeESrIJQyz24j7icGeGyIZ/jIChOOvjt4M8EVi3O0Se7E6RAgVYcX+QWVp5c
+Sy+l7XrrtL/pDDL9Bngnq/DVfjCzm5ZYUb1PpyvYTP7trsV+yYOCNmmwQvB4yVjf
+IIpHC1OcsPBntMUGeH1Eja4D+qJYhGOxX9kpa+2wTCW06L8T6OhkpJWYn5JYiht5
+8exjAR7b8Zi3DeG9oZO5o6Qvhl3f8uGU8lK1j9jCUN/18mI/5vZJ76i+hsgdlfZB
+Rh5lmAQjD80M9TY+oD4MYUqB5XrigPfFAUwXFGehhlwCVw7y6+5kpbq/NpvM5Ba8
+SeQYUUuMA8RXpTtGlrrTPqJryfa55hTuX/ThhX4gcCVkbyujo0CYr+Uuc14IOyNY
+1fD0/qORbllbgV41wiy/2ZUWZQUodqHWkjT1CwIMbQOY5jmrSYGBwwIDAQABo4IB
+JjCCASIwHwYDVR0jBBgwFoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYDVR0OBBYE
+FF86fBEQfgxncWHci6O1AANn9VccMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8E
+CDAGAQH/AgEAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAiBgNVHSAE
+GzAZMA0GCysGAQQBsjEBAgIxMAgGBmeBDAECATBDBgNVHR8EPDA6MDigNqA0hjJo
+dHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNy
+bDA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9k
+b2NhLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAHMUom5cxIje2IiFU7mOCsBr2F6CY
+eU5cyfQ/Aep9kAXYUDuWsaT85721JxeXFYkf4D/cgNd9+hxT8ZeDOJrn+ysqR7NO
+2K9AdqTdIY2uZPKmvgHOkvH2gQD6jc05eSPOwdY/10IPvmpgUKaGOa/tyygL8Og4
+3tYyoHipMMnS4OiYKakDJny0XVuchIP7ZMKiP07Q3FIuSS4omzR77kmc75/6Q9dP
+v4wa90UCOn1j6r7WhMmX3eT3Gsdj3WMe9bYD0AFuqa6MDyjIeXq08mVGraXiw73s
+Zale8OMckn/BU3O/3aFNLHLfET2H2hT6Wb3nwxjpLIfXmSVcVd8A58XH0g==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb
+MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
+GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj
+YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL
+MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
+BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM
+GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua
+BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe
+3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4
+YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR
+rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm
+ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU
+oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
+MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v
+QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t
+b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF
+AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q
+GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
+Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2
+G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi
+l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3
+smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
+-----END CERTIFICATE-----

+ 118 - 0
public/cert/zh3x.cn.key

@@ -0,0 +1,118 @@
+-----BEGIN CERTIFICATE-----
+MIIGZjCCBM6gAwIBAgIRALFtDf8LJJnkbuRhtXejQiAwDQYJKoZIhvcNAQEMBQAw
+WTELMAkGA1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dpZXMs
+IEluYy4xIzAhBgNVBAMTGlRydXN0QXNpYSBSU0EgRFYgVExTIENBIEcyMB4XDTIz
+MDYxNTAwMDAwMFoXDTI0MDYxNDIzNTk1OVowEjEQMA4GA1UEAxMHemgzeC5jbjCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKUIFMhBQA9qR6IHyb54ZEk9
+WfH1YouCzWU2ZfrUCKLZcyrLXutX2hhNUDC5L+IENOJxuPuMLz1v4Ik1njl4EiXw
+iNw2uIfY5wVaCkIqHCxFcKiwqZE+ADGWkkDre3+2cdRof0FJ0HeZ+/oSV2mxYIXP
+nHqJKv3bC71rh7GbHZLXKYBc52sbIvuG54b69kRhECSrRUgQW7ElPsvlmfiTsmZ6
+3nwrUKEjLfcAMRB0oHTAGfccUyk9ry5a44eo+9Uz8LHUmc4a6EZCbL6c+znKSKCe
+LsJDz1Rcro10+DDktlENDjPVyxDtFW0vJITQygj4mqVi9HQr4ky6FdE3uhGXBh8C
+AwEAAaOCAu4wggLqMB8GA1UdIwQYMBaAFF86fBEQfgxncWHci6O1AANn9VccMB0G
+A1UdDgQWBBQuMGNZu5hYiE3kg6H9ft/EJag8izAOBgNVHQ8BAf8EBAMCBaAwDAYD
+VR0TAQH/BAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwSQYDVR0g
+BEIwQDA0BgsrBgEEAbIxAQICMTAlMCMGCCsGAQUFBwIBFhdodHRwczovL3NlY3Rp
+Z28uY29tL0NQUzAIBgZngQwBAgEwfQYIKwYBBQUHAQEEcTBvMEIGCCsGAQUFBzAC
+hjZodHRwOi8vY3J0LnRydXN0LXByb3ZpZGVyLmNuL1RydXN0QXNpYVJTQURWVExT
+Q0FHMi5jcnQwKQYIKwYBBQUHMAGGHWh0dHA6Ly9vY3NwLnRydXN0LXByb3ZpZGVy
+LmNuMB8GA1UdEQQYMBaCB3poM3guY26CC3d3dy56aDN4LmNuMIIBfgYKKwYBBAHW
+eQIEAgSCAW4EggFqAWgAdQB2/4g/Crb7lVHCYcz1h7o0tKTNuyncaEIKn+ZnTFo6
+dAAAAYi+A+S+AAAEAwBGMEQCIAiKvryjV1VcD1RWKIbMlFa52rSO1r20/IzdaiSV
+DCYDAiBl+lkCNnG2HomHWdCeXy1dTtCgPqD3YJTW3YRsSyuz6gB3ANq2v2s/tbYi
+n5vCu1xr6HCRcWy7UYSFNL2kPTBI1/urAAABiL4D5RQAAAQDAEgwRgIhAKq09Mi/
+NsvJo/rHBBsPkX+NKJavDzI2zGa30ZLj1aqJAiEA6ya9tUdVBknAkizqopTB5vYZ
+j8tse75rdGMIecVUFF0AdgDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1
+mwAAAYi+A+TqAAAEAwBHMEUCIFkD1yKHLAmChwDXBqxh2R1eN3xQ0J0V4xoAPfE/
+kVagAiEA+wBT87BEpoi6GroIa0r8wEG5B1LOxK5KP66/CMjSq1YwDQYJKoZIhvcN
+AQEMBQADggGBAFMdQUX7JE8J+fUeDUnTo1pN2pHanRCYXr/d9IHUaoAeNoABTl62
+7wAH8WOqpKjXhgeZ/7stM8BEtAkyVspzullJP+i6oFRZ/aRqD220nwP8NulmOkFo
+g7cZpP0NJWzKuSryflOpm6E6mdpK/CSSgTBeEqxHJJ4sNhAehLTS2PAvXVdLqH8T
+taB+W4VnK2vIsedYJBZA7xs+6I/X9veFH2WN1b6ZZkAh72JfUcnDtm7yKCB6gbBG
+ynZa+T9mOZhPq/R0HVr5BeTJWomWLJTdbtR7/rkb3HWG0PrbZ+ktQiDyWgKykf08
+LNoUszAS//3gyHGi7CYngh5QK8jkdvAR4QLUbf/FjFvZuTFHdgy7aE8TXjM9Qs2z
+Gqf9b+2RCJ8kfBEOuSdeRtlPRu5+czN/Uq3UfDskHLf0SSJt2y1sgFOrnkwXYnwd
+FTxkYP7pMe6ZtxBHZ+pVq6dlFgehTNwkVK6ZCdKScZ0NGvK6z2rocGMMscty9Fef
+bPdig2AycBjxxg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFBzCCA++gAwIBAgIRALIM7VUuMaC/NDp1KHQ76aswDQYJKoZIhvcNAQELBQAw
+ezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
+BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0yMjAxMTAwMDAwMDBaFw0y
+ODEyMzEyMzU5NTlaMFkxCzAJBgNVBAYTAkNOMSUwIwYDVQQKExxUcnVzdEFzaWEg
+VGVjaG5vbG9naWVzLCBJbmMuMSMwIQYDVQQDExpUcnVzdEFzaWEgUlNBIERWIFRM
+UyBDQSBHMjCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAKjGDe0GSaBs
+Yl/VhMaTM6GhfR1TAt4mrhN8zfAMwEfLZth+N2ie5ULbW8YvSGzhqkDhGgSBlafm
+qq05oeESrIJQyz24j7icGeGyIZ/jIChOOvjt4M8EVi3O0Se7E6RAgVYcX+QWVp5c
+Sy+l7XrrtL/pDDL9Bngnq/DVfjCzm5ZYUb1PpyvYTP7trsV+yYOCNmmwQvB4yVjf
+IIpHC1OcsPBntMUGeH1Eja4D+qJYhGOxX9kpa+2wTCW06L8T6OhkpJWYn5JYiht5
+8exjAR7b8Zi3DeG9oZO5o6Qvhl3f8uGU8lK1j9jCUN/18mI/5vZJ76i+hsgdlfZB
+Rh5lmAQjD80M9TY+oD4MYUqB5XrigPfFAUwXFGehhlwCVw7y6+5kpbq/NpvM5Ba8
+SeQYUUuMA8RXpTtGlrrTPqJryfa55hTuX/ThhX4gcCVkbyujo0CYr+Uuc14IOyNY
+1fD0/qORbllbgV41wiy/2ZUWZQUodqHWkjT1CwIMbQOY5jmrSYGBwwIDAQABo4IB
+JjCCASIwHwYDVR0jBBgwFoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYDVR0OBBYE
+FF86fBEQfgxncWHci6O1AANn9VccMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8E
+CDAGAQH/AgEAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAiBgNVHSAE
+GzAZMA0GCysGAQQBsjEBAgIxMAgGBmeBDAECATBDBgNVHR8EPDA6MDigNqA0hjJo
+dHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNy
+bDA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9k
+b2NhLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAHMUom5cxIje2IiFU7mOCsBr2F6CY
+eU5cyfQ/Aep9kAXYUDuWsaT85721JxeXFYkf4D/cgNd9+hxT8ZeDOJrn+ysqR7NO
+2K9AdqTdIY2uZPKmvgHOkvH2gQD6jc05eSPOwdY/10IPvmpgUKaGOa/tyygL8Og4
+3tYyoHipMMnS4OiYKakDJny0XVuchIP7ZMKiP07Q3FIuSS4omzR77kmc75/6Q9dP
+v4wa90UCOn1j6r7WhMmX3eT3Gsdj3WMe9bYD0AFuqa6MDyjIeXq08mVGraXiw73s
+Zale8OMckn/BU3O/3aFNLHLfET2H2hT6Wb3nwxjpLIfXmSVcVd8A58XH0g==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb
+MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
+GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj
+YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL
+MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
+BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM
+GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua
+BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe
+3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4
+YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR
+rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm
+ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU
+oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
+MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v
+QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t
+b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF
+AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q
+GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
+Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2
+G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi
+l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3
+smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
+-----END CERTIFICATE-----
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEApQgUyEFAD2pHogfJvnhkST1Z8fVii4LNZTZl+tQIotlzKste
+61faGE1QMLkv4gQ04nG4+4wvPW/giTWeOXgSJfCI3Da4h9jnBVoKQiocLEVwqLCp
+kT4AMZaSQOt7f7Zx1Gh/QUnQd5n7+hJXabFghc+ceokq/dsLvWuHsZsdktcpgFzn
+axsi+4bnhvr2RGEQJKtFSBBbsSU+y+WZ+JOyZnrefCtQoSMt9wAxEHSgdMAZ9xxT
+KT2vLlrjh6j71TPwsdSZzhroRkJsvpz7OcpIoJ4uwkPPVFyujXT4MOS2UQ0OM9XL
+EO0VbS8khNDKCPiapWL0dCviTLoV0Te6EZcGHwIDAQABAoIBAAXf5ESx1R+kJyzU
+fYquSwkz/S9fDn6sQNB+BiJOiVVdGG7pDC9xEj5N0XFykVd70kAcHG6D5N7/sp/5
+WYqh96kD4Qzpu8B5aNV1b5EMYhiNvj8BaH/XLUP9BqbEWyiTX4W+oVNuVu5MlaSN
+iGQNE6qfvQO8CnY8smdjQp8zyAxrVcgdI8ETHhq+Ue5+GE9QU0hYmuZsWBy6RjlY
+BRE2G8YpGnORIMlz+f6sVJ+r1nehmqeMFVAjgC00fb6nxoTsRfMt5aPthfucN+mE
+bdYpW1zBQql1IehFmA6XoP3SMsoBhAxfRJD40GpApBOk93eZimpJ7wrzhCpchwrl
+Smyh98ECgYEA6OOMPnyOHwTtBV5NNLIMUGtRfnMFz4XIWoolo23tfznWMeiYNtUg
+7QgWDyWQRjlapHN0F7VLXNynZ7HU6XhaovH64h5uAMkLoU42Vt7wAr5jESpj7fmd
+Mx7oTAmmywxQqjpRSH86h6Ns54l6BgeX5s11jdyXEBavny5XI/Gz618CgYEAtWil
+FneoC6CFxZUmBmsNm7vz56llFfHA7lm2CrUY5Wt4BZMVQxplctL7/JXq7qxqSfdH
+ynIczFUeDXWDFyAW7wVL31HVlOvLJHwdt6iDN8VCK3CXE0AX4Zin/4kBbqGjAMEA
+oz5maRBHcSEa1pkeM6BRxYZ0zHlznyihFK3RnUECgYEAjSPKjNwjrbzogIZkN/ln
+6R0BKKdA8EHd6LEsml02wBInM9wI08Ja0AxEgi17wHNl8aBezTd8Uu0PL5LgvBXK
+qFIKgBt9A1DUkY+68u7telwz4eVU5paOpLqogdyfjxMJmAD73fntWOK8T55Lq3fS
+oXgHNFBp5MA68ze8a/ZB2fUCgYAUA01jIyQ41Cat23xsbNb9fUi1H+z09Myx/tek
+asIqXSbKhqVr17elaT0/alKWrhKzwkH7RYeDy0gbeAFURcgB6nWqV17WpQSuK7sj
+jcWcG3jnTe58wy9fRfYSrMyppc9Tv/cQC0xE/vTCuEI7tnyseV1MCz9LZ4Kn5lWO
+8HYVgQKBgQDITGwL+Qd21eCuzCLh/go+awo/Dc9VeZiu0fhK9BAliJfVNWhBzZbI
+x8cFWqa6suIvCscmTdTAH1N46T6EEd211JClkPaat25DTwpikGN7xv+/jKeJMnMU
+Mf8zsKrwFoqXkiIFZQ7wOnz7Hmg4yW373faz1lPxDK+dYz1SlwLOXQ==
+-----END RSA PRIVATE KEY-----

+ 91 - 0
public/cert/zh3x.cn.pem

@@ -0,0 +1,91 @@
+-----BEGIN CERTIFICATE-----
+MIIGZjCCBM6gAwIBAgIRALFtDf8LJJnkbuRhtXejQiAwDQYJKoZIhvcNAQEMBQAw
+WTELMAkGA1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dpZXMs
+IEluYy4xIzAhBgNVBAMTGlRydXN0QXNpYSBSU0EgRFYgVExTIENBIEcyMB4XDTIz
+MDYxNTAwMDAwMFoXDTI0MDYxNDIzNTk1OVowEjEQMA4GA1UEAxMHemgzeC5jbjCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKUIFMhBQA9qR6IHyb54ZEk9
+WfH1YouCzWU2ZfrUCKLZcyrLXutX2hhNUDC5L+IENOJxuPuMLz1v4Ik1njl4EiXw
+iNw2uIfY5wVaCkIqHCxFcKiwqZE+ADGWkkDre3+2cdRof0FJ0HeZ+/oSV2mxYIXP
+nHqJKv3bC71rh7GbHZLXKYBc52sbIvuG54b69kRhECSrRUgQW7ElPsvlmfiTsmZ6
+3nwrUKEjLfcAMRB0oHTAGfccUyk9ry5a44eo+9Uz8LHUmc4a6EZCbL6c+znKSKCe
+LsJDz1Rcro10+DDktlENDjPVyxDtFW0vJITQygj4mqVi9HQr4ky6FdE3uhGXBh8C
+AwEAAaOCAu4wggLqMB8GA1UdIwQYMBaAFF86fBEQfgxncWHci6O1AANn9VccMB0G
+A1UdDgQWBBQuMGNZu5hYiE3kg6H9ft/EJag8izAOBgNVHQ8BAf8EBAMCBaAwDAYD
+VR0TAQH/BAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwSQYDVR0g
+BEIwQDA0BgsrBgEEAbIxAQICMTAlMCMGCCsGAQUFBwIBFhdodHRwczovL3NlY3Rp
+Z28uY29tL0NQUzAIBgZngQwBAgEwfQYIKwYBBQUHAQEEcTBvMEIGCCsGAQUFBzAC
+hjZodHRwOi8vY3J0LnRydXN0LXByb3ZpZGVyLmNuL1RydXN0QXNpYVJTQURWVExT
+Q0FHMi5jcnQwKQYIKwYBBQUHMAGGHWh0dHA6Ly9vY3NwLnRydXN0LXByb3ZpZGVy
+LmNuMB8GA1UdEQQYMBaCB3poM3guY26CC3d3dy56aDN4LmNuMIIBfgYKKwYBBAHW
+eQIEAgSCAW4EggFqAWgAdQB2/4g/Crb7lVHCYcz1h7o0tKTNuyncaEIKn+ZnTFo6
+dAAAAYi+A+S+AAAEAwBGMEQCIAiKvryjV1VcD1RWKIbMlFa52rSO1r20/IzdaiSV
+DCYDAiBl+lkCNnG2HomHWdCeXy1dTtCgPqD3YJTW3YRsSyuz6gB3ANq2v2s/tbYi
+n5vCu1xr6HCRcWy7UYSFNL2kPTBI1/urAAABiL4D5RQAAAQDAEgwRgIhAKq09Mi/
+NsvJo/rHBBsPkX+NKJavDzI2zGa30ZLj1aqJAiEA6ya9tUdVBknAkizqopTB5vYZ
+j8tse75rdGMIecVUFF0AdgDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1
+mwAAAYi+A+TqAAAEAwBHMEUCIFkD1yKHLAmChwDXBqxh2R1eN3xQ0J0V4xoAPfE/
+kVagAiEA+wBT87BEpoi6GroIa0r8wEG5B1LOxK5KP66/CMjSq1YwDQYJKoZIhvcN
+AQEMBQADggGBAFMdQUX7JE8J+fUeDUnTo1pN2pHanRCYXr/d9IHUaoAeNoABTl62
+7wAH8WOqpKjXhgeZ/7stM8BEtAkyVspzullJP+i6oFRZ/aRqD220nwP8NulmOkFo
+g7cZpP0NJWzKuSryflOpm6E6mdpK/CSSgTBeEqxHJJ4sNhAehLTS2PAvXVdLqH8T
+taB+W4VnK2vIsedYJBZA7xs+6I/X9veFH2WN1b6ZZkAh72JfUcnDtm7yKCB6gbBG
+ynZa+T9mOZhPq/R0HVr5BeTJWomWLJTdbtR7/rkb3HWG0PrbZ+ktQiDyWgKykf08
+LNoUszAS//3gyHGi7CYngh5QK8jkdvAR4QLUbf/FjFvZuTFHdgy7aE8TXjM9Qs2z
+Gqf9b+2RCJ8kfBEOuSdeRtlPRu5+czN/Uq3UfDskHLf0SSJt2y1sgFOrnkwXYnwd
+FTxkYP7pMe6ZtxBHZ+pVq6dlFgehTNwkVK6ZCdKScZ0NGvK6z2rocGMMscty9Fef
+bPdig2AycBjxxg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFBzCCA++gAwIBAgIRALIM7VUuMaC/NDp1KHQ76aswDQYJKoZIhvcNAQELBQAw
+ezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
+BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0yMjAxMTAwMDAwMDBaFw0y
+ODEyMzEyMzU5NTlaMFkxCzAJBgNVBAYTAkNOMSUwIwYDVQQKExxUcnVzdEFzaWEg
+VGVjaG5vbG9naWVzLCBJbmMuMSMwIQYDVQQDExpUcnVzdEFzaWEgUlNBIERWIFRM
+UyBDQSBHMjCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAKjGDe0GSaBs
+Yl/VhMaTM6GhfR1TAt4mrhN8zfAMwEfLZth+N2ie5ULbW8YvSGzhqkDhGgSBlafm
+qq05oeESrIJQyz24j7icGeGyIZ/jIChOOvjt4M8EVi3O0Se7E6RAgVYcX+QWVp5c
+Sy+l7XrrtL/pDDL9Bngnq/DVfjCzm5ZYUb1PpyvYTP7trsV+yYOCNmmwQvB4yVjf
+IIpHC1OcsPBntMUGeH1Eja4D+qJYhGOxX9kpa+2wTCW06L8T6OhkpJWYn5JYiht5
+8exjAR7b8Zi3DeG9oZO5o6Qvhl3f8uGU8lK1j9jCUN/18mI/5vZJ76i+hsgdlfZB
+Rh5lmAQjD80M9TY+oD4MYUqB5XrigPfFAUwXFGehhlwCVw7y6+5kpbq/NpvM5Ba8
+SeQYUUuMA8RXpTtGlrrTPqJryfa55hTuX/ThhX4gcCVkbyujo0CYr+Uuc14IOyNY
+1fD0/qORbllbgV41wiy/2ZUWZQUodqHWkjT1CwIMbQOY5jmrSYGBwwIDAQABo4IB
+JjCCASIwHwYDVR0jBBgwFoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYDVR0OBBYE
+FF86fBEQfgxncWHci6O1AANn9VccMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8E
+CDAGAQH/AgEAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAiBgNVHSAE
+GzAZMA0GCysGAQQBsjEBAgIxMAgGBmeBDAECATBDBgNVHR8EPDA6MDigNqA0hjJo
+dHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNy
+bDA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9k
+b2NhLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAHMUom5cxIje2IiFU7mOCsBr2F6CY
+eU5cyfQ/Aep9kAXYUDuWsaT85721JxeXFYkf4D/cgNd9+hxT8ZeDOJrn+ysqR7NO
+2K9AdqTdIY2uZPKmvgHOkvH2gQD6jc05eSPOwdY/10IPvmpgUKaGOa/tyygL8Og4
+3tYyoHipMMnS4OiYKakDJny0XVuchIP7ZMKiP07Q3FIuSS4omzR77kmc75/6Q9dP
+v4wa90UCOn1j6r7WhMmX3eT3Gsdj3WMe9bYD0AFuqa6MDyjIeXq08mVGraXiw73s
+Zale8OMckn/BU3O/3aFNLHLfET2H2hT6Wb3nwxjpLIfXmSVcVd8A58XH0g==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb
+MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
+GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj
+YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL
+MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
+BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM
+GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua
+BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe
+3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4
+YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR
+rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm
+ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU
+oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
+MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v
+QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t
+b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF
+AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q
+GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
+Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2
+G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi
+l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3
+smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
+-----END CERTIFICATE-----

+ 91 - 0
public/cert/zh3x.cn_ca.crt

@@ -0,0 +1,91 @@
+-----BEGIN CERTIFICATE-----
+MIIGZjCCBM6gAwIBAgIRALFtDf8LJJnkbuRhtXejQiAwDQYJKoZIhvcNAQEMBQAw
+WTELMAkGA1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dpZXMs
+IEluYy4xIzAhBgNVBAMTGlRydXN0QXNpYSBSU0EgRFYgVExTIENBIEcyMB4XDTIz
+MDYxNTAwMDAwMFoXDTI0MDYxNDIzNTk1OVowEjEQMA4GA1UEAxMHemgzeC5jbjCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKUIFMhBQA9qR6IHyb54ZEk9
+WfH1YouCzWU2ZfrUCKLZcyrLXutX2hhNUDC5L+IENOJxuPuMLz1v4Ik1njl4EiXw
+iNw2uIfY5wVaCkIqHCxFcKiwqZE+ADGWkkDre3+2cdRof0FJ0HeZ+/oSV2mxYIXP
+nHqJKv3bC71rh7GbHZLXKYBc52sbIvuG54b69kRhECSrRUgQW7ElPsvlmfiTsmZ6
+3nwrUKEjLfcAMRB0oHTAGfccUyk9ry5a44eo+9Uz8LHUmc4a6EZCbL6c+znKSKCe
+LsJDz1Rcro10+DDktlENDjPVyxDtFW0vJITQygj4mqVi9HQr4ky6FdE3uhGXBh8C
+AwEAAaOCAu4wggLqMB8GA1UdIwQYMBaAFF86fBEQfgxncWHci6O1AANn9VccMB0G
+A1UdDgQWBBQuMGNZu5hYiE3kg6H9ft/EJag8izAOBgNVHQ8BAf8EBAMCBaAwDAYD
+VR0TAQH/BAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwSQYDVR0g
+BEIwQDA0BgsrBgEEAbIxAQICMTAlMCMGCCsGAQUFBwIBFhdodHRwczovL3NlY3Rp
+Z28uY29tL0NQUzAIBgZngQwBAgEwfQYIKwYBBQUHAQEEcTBvMEIGCCsGAQUFBzAC
+hjZodHRwOi8vY3J0LnRydXN0LXByb3ZpZGVyLmNuL1RydXN0QXNpYVJTQURWVExT
+Q0FHMi5jcnQwKQYIKwYBBQUHMAGGHWh0dHA6Ly9vY3NwLnRydXN0LXByb3ZpZGVy
+LmNuMB8GA1UdEQQYMBaCB3poM3guY26CC3d3dy56aDN4LmNuMIIBfgYKKwYBBAHW
+eQIEAgSCAW4EggFqAWgAdQB2/4g/Crb7lVHCYcz1h7o0tKTNuyncaEIKn+ZnTFo6
+dAAAAYi+A+S+AAAEAwBGMEQCIAiKvryjV1VcD1RWKIbMlFa52rSO1r20/IzdaiSV
+DCYDAiBl+lkCNnG2HomHWdCeXy1dTtCgPqD3YJTW3YRsSyuz6gB3ANq2v2s/tbYi
+n5vCu1xr6HCRcWy7UYSFNL2kPTBI1/urAAABiL4D5RQAAAQDAEgwRgIhAKq09Mi/
+NsvJo/rHBBsPkX+NKJavDzI2zGa30ZLj1aqJAiEA6ya9tUdVBknAkizqopTB5vYZ
+j8tse75rdGMIecVUFF0AdgDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1
+mwAAAYi+A+TqAAAEAwBHMEUCIFkD1yKHLAmChwDXBqxh2R1eN3xQ0J0V4xoAPfE/
+kVagAiEA+wBT87BEpoi6GroIa0r8wEG5B1LOxK5KP66/CMjSq1YwDQYJKoZIhvcN
+AQEMBQADggGBAFMdQUX7JE8J+fUeDUnTo1pN2pHanRCYXr/d9IHUaoAeNoABTl62
+7wAH8WOqpKjXhgeZ/7stM8BEtAkyVspzullJP+i6oFRZ/aRqD220nwP8NulmOkFo
+g7cZpP0NJWzKuSryflOpm6E6mdpK/CSSgTBeEqxHJJ4sNhAehLTS2PAvXVdLqH8T
+taB+W4VnK2vIsedYJBZA7xs+6I/X9veFH2WN1b6ZZkAh72JfUcnDtm7yKCB6gbBG
+ynZa+T9mOZhPq/R0HVr5BeTJWomWLJTdbtR7/rkb3HWG0PrbZ+ktQiDyWgKykf08
+LNoUszAS//3gyHGi7CYngh5QK8jkdvAR4QLUbf/FjFvZuTFHdgy7aE8TXjM9Qs2z
+Gqf9b+2RCJ8kfBEOuSdeRtlPRu5+czN/Uq3UfDskHLf0SSJt2y1sgFOrnkwXYnwd
+FTxkYP7pMe6ZtxBHZ+pVq6dlFgehTNwkVK6ZCdKScZ0NGvK6z2rocGMMscty9Fef
+bPdig2AycBjxxg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFBzCCA++gAwIBAgIRALIM7VUuMaC/NDp1KHQ76aswDQYJKoZIhvcNAQELBQAw
+ezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
+BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0yMjAxMTAwMDAwMDBaFw0y
+ODEyMzEyMzU5NTlaMFkxCzAJBgNVBAYTAkNOMSUwIwYDVQQKExxUcnVzdEFzaWEg
+VGVjaG5vbG9naWVzLCBJbmMuMSMwIQYDVQQDExpUcnVzdEFzaWEgUlNBIERWIFRM
+UyBDQSBHMjCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAKjGDe0GSaBs
+Yl/VhMaTM6GhfR1TAt4mrhN8zfAMwEfLZth+N2ie5ULbW8YvSGzhqkDhGgSBlafm
+qq05oeESrIJQyz24j7icGeGyIZ/jIChOOvjt4M8EVi3O0Se7E6RAgVYcX+QWVp5c
+Sy+l7XrrtL/pDDL9Bngnq/DVfjCzm5ZYUb1PpyvYTP7trsV+yYOCNmmwQvB4yVjf
+IIpHC1OcsPBntMUGeH1Eja4D+qJYhGOxX9kpa+2wTCW06L8T6OhkpJWYn5JYiht5
+8exjAR7b8Zi3DeG9oZO5o6Qvhl3f8uGU8lK1j9jCUN/18mI/5vZJ76i+hsgdlfZB
+Rh5lmAQjD80M9TY+oD4MYUqB5XrigPfFAUwXFGehhlwCVw7y6+5kpbq/NpvM5Ba8
+SeQYUUuMA8RXpTtGlrrTPqJryfa55hTuX/ThhX4gcCVkbyujo0CYr+Uuc14IOyNY
+1fD0/qORbllbgV41wiy/2ZUWZQUodqHWkjT1CwIMbQOY5jmrSYGBwwIDAQABo4IB
+JjCCASIwHwYDVR0jBBgwFoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYDVR0OBBYE
+FF86fBEQfgxncWHci6O1AANn9VccMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8E
+CDAGAQH/AgEAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAiBgNVHSAE
+GzAZMA0GCysGAQQBsjEBAgIxMAgGBmeBDAECATBDBgNVHR8EPDA6MDigNqA0hjJo
+dHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNy
+bDA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9k
+b2NhLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAHMUom5cxIje2IiFU7mOCsBr2F6CY
+eU5cyfQ/Aep9kAXYUDuWsaT85721JxeXFYkf4D/cgNd9+hxT8ZeDOJrn+ysqR7NO
+2K9AdqTdIY2uZPKmvgHOkvH2gQD6jc05eSPOwdY/10IPvmpgUKaGOa/tyygL8Og4
+3tYyoHipMMnS4OiYKakDJny0XVuchIP7ZMKiP07Q3FIuSS4omzR77kmc75/6Q9dP
+v4wa90UCOn1j6r7WhMmX3eT3Gsdj3WMe9bYD0AFuqa6MDyjIeXq08mVGraXiw73s
+Zale8OMckn/BU3O/3aFNLHLfET2H2hT6Wb3nwxjpLIfXmSVcVd8A58XH0g==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb
+MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
+GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj
+YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL
+MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
+BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM
+GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua
+BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe
+3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4
+YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR
+rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm
+ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU
+oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
+MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v
+QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t
+b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF
+AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q
+GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
+Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2
+G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi
+l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3
+smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
+-----END CERTIFICATE-----

+ 422 - 0
public/curves/CurveExtras.js

@@ -0,0 +1,422 @@
+import {
+	Curve,
+	Vector3
+} from 'three';
+
+/**
+ * A bunch of parametric curves
+ *
+ * Formulas collected from various sources
+ * http://mathworld.wolfram.com/HeartCurve.html
+ * http://en.wikipedia.org/wiki/Viviani%27s_curve
+ * http://www.mi.sanu.ac.rs/vismath/taylorapril2011/Taylor.pdf
+ * https://prideout.net/blog/old/blog/index.html@p=44.html
+ */
+
+// GrannyKnot
+
+class GrannyKnot extends Curve {
+
+	getPoint( t, optionalTarget = new Vector3() ) {
+
+		const point = optionalTarget;
+
+		t = 2 * Math.PI * t;
+
+		const x = - 0.22 * Math.cos( t ) - 1.28 * Math.sin( t ) - 0.44 * Math.cos( 3 * t ) - 0.78 * Math.sin( 3 * t );
+		const y = - 0.1 * Math.cos( 2 * t ) - 0.27 * Math.sin( 2 * t ) + 0.38 * Math.cos( 4 * t ) + 0.46 * Math.sin( 4 * t );
+		const z = 0.7 * Math.cos( 3 * t ) - 0.4 * Math.sin( 3 * t );
+
+		return point.set( x, y, z ).multiplyScalar( 20 );
+
+	}
+
+}
+
+// HeartCurve
+
+class HeartCurve extends Curve {
+
+	constructor( scale = 5 ) {
+
+		super();
+
+		this.scale = scale;
+
+	}
+
+	getPoint( t, optionalTarget = new Vector3() ) {
+
+		const point = optionalTarget;
+
+		t *= 2 * Math.PI;
+
+		const x = 16 * Math.pow( Math.sin( t ), 3 );
+		const y = 13 * Math.cos( t ) - 5 * Math.cos( 2 * t ) - 2 * Math.cos( 3 * t ) - Math.cos( 4 * t );
+		const z = 0;
+
+		return point.set( x, y, z ).multiplyScalar( this.scale );
+
+	}
+
+}
+
+// Viviani's Curve
+
+class VivianiCurve extends Curve {
+
+	constructor( scale = 70 ) {
+
+		super();
+
+		this.scale = scale;
+
+	}
+
+	getPoint( t, optionalTarget = new Vector3() ) {
+
+		const point = optionalTarget;
+
+		t = t * 4 * Math.PI; // normalized to 0..1
+		const a = this.scale / 2;
+
+		const x = a * ( 1 + Math.cos( t ) );
+		const y = a * Math.sin( t );
+		const z = 2 * a * Math.sin( t / 2 );
+
+		return point.set( x, y, z );
+
+	}
+
+}
+
+// KnotCurve
+
+class KnotCurve extends Curve {
+
+	getPoint( t, optionalTarget = new Vector3() ) {
+
+		const point = optionalTarget;
+
+		t *= 2 * Math.PI;
+
+		const R = 10;
+		const s = 50;
+
+		const x = s * Math.sin( t );
+		const y = Math.cos( t ) * ( R + s * Math.cos( t ) );
+		const z = Math.sin( t ) * ( R + s * Math.cos( t ) );
+
+		return point.set( x, y, z );
+
+	}
+
+}
+
+
+// HelixCurve
+
+class HelixCurve extends Curve {
+
+	getPoint( t, optionalTarget = new Vector3() ) {
+
+		const point = optionalTarget;
+
+		const a = 30; // radius
+		const b = 150; // height
+
+		const t2 = 2 * Math.PI * t * b / 30;
+
+		const x = Math.cos( t2 ) * a;
+		const y = Math.sin( t2 ) * a;
+		const z = b * t;
+
+		return point.set( x, y, z );
+
+	}
+
+}
+
+// TrefoilKnot
+
+class TrefoilKnot extends Curve {
+
+	constructor( scale = 10 ) {
+
+		super();
+
+		this.scale = scale;
+
+	}
+
+	getPoint( t, optionalTarget = new Vector3() ) {
+
+		const point = optionalTarget;
+
+		t *= Math.PI * 2;
+
+		const x = ( 2 + Math.cos( 3 * t ) ) * Math.cos( 2 * t );
+		const y = ( 2 + Math.cos( 3 * t ) ) * Math.sin( 2 * t );
+		const z = Math.sin( 3 * t );
+
+		return point.set( x, y, z ).multiplyScalar( this.scale );
+
+	}
+
+}
+
+// TorusKnot
+
+class TorusKnot extends Curve {
+
+	constructor( scale = 10 ) {
+
+		super();
+
+		this.scale = scale;
+
+	}
+
+	getPoint( t, optionalTarget = new Vector3() ) {
+
+		const point = optionalTarget;
+
+		const p = 3;
+		const q = 4;
+
+		t *= Math.PI * 2;
+
+		const x = ( 2 + Math.cos( q * t ) ) * Math.cos( p * t );
+		const y = ( 2 + Math.cos( q * t ) ) * Math.sin( p * t );
+		const z = Math.sin( q * t );
+
+		return point.set( x, y, z ).multiplyScalar( this.scale );
+
+	}
+
+}
+
+// CinquefoilKnot
+
+class CinquefoilKnot extends Curve {
+
+	constructor( scale = 10 ) {
+
+		super();
+
+		this.scale = scale;
+
+	}
+
+	getPoint( t, optionalTarget = new Vector3() ) {
+
+		const point = optionalTarget;
+
+		const p = 2;
+		const q = 5;
+
+		t *= Math.PI * 2;
+
+		const x = ( 2 + Math.cos( q * t ) ) * Math.cos( p * t );
+		const y = ( 2 + Math.cos( q * t ) ) * Math.sin( p * t );
+		const z = Math.sin( q * t );
+
+		return point.set( x, y, z ).multiplyScalar( this.scale );
+
+	}
+
+}
+
+
+// TrefoilPolynomialKnot
+
+class TrefoilPolynomialKnot extends Curve {
+
+	constructor( scale = 10 ) {
+
+		super();
+
+		this.scale = scale;
+
+	}
+
+	getPoint( t, optionalTarget = new Vector3() ) {
+
+		const point = optionalTarget;
+
+		t = t * 4 - 2;
+
+		const x = Math.pow( t, 3 ) - 3 * t;
+		const y = Math.pow( t, 4 ) - 4 * t * t;
+		const z = 1 / 5 * Math.pow( t, 5 ) - 2 * t;
+
+		return point.set( x, y, z ).multiplyScalar( this.scale );
+
+	}
+
+}
+
+function scaleTo( x, y, t ) {
+
+	const r = y - x;
+	return t * r + x;
+
+}
+
+// FigureEightPolynomialKnot
+
+class FigureEightPolynomialKnot extends Curve {
+
+	constructor( scale = 1 ) {
+
+		super();
+
+		this.scale = scale;
+
+	}
+
+	getPoint( t, optionalTarget = new Vector3() ) {
+
+		const point = optionalTarget;
+
+		t = scaleTo( - 4, 4, t );
+
+		const x = 2 / 5 * t * ( t * t - 7 ) * ( t * t - 10 );
+		const y = Math.pow( t, 4 ) - 13 * t * t;
+		const z = 1 / 10 * t * ( t * t - 4 ) * ( t * t - 9 ) * ( t * t - 12 );
+
+		return point.set( x, y, z ).multiplyScalar( this.scale );
+
+	}
+
+}
+
+// DecoratedTorusKnot4a
+
+class DecoratedTorusKnot4a extends Curve {
+
+	constructor( scale = 40 ) {
+
+		super();
+
+		this.scale = scale;
+
+	}
+
+	getPoint( t, optionalTarget = new Vector3() ) {
+
+		const point = optionalTarget;
+
+		t *= Math.PI * 2;
+
+		const x = Math.cos( 2 * t ) * ( 1 + 0.6 * ( Math.cos( 5 * t ) + 0.75 * Math.cos( 10 * t ) ) );
+		const y = Math.sin( 2 * t ) * ( 1 + 0.6 * ( Math.cos( 5 * t ) + 0.75 * Math.cos( 10 * t ) ) );
+		const z = 0.35 * Math.sin( 5 * t );
+
+		return point.set( x, y, z ).multiplyScalar( this.scale );
+
+	}
+
+}
+
+// DecoratedTorusKnot4b
+
+class DecoratedTorusKnot4b extends Curve {
+
+	constructor( scale = 40 ) {
+
+		super();
+
+		this.scale = scale;
+
+	}
+
+	getPoint( t, optionalTarget = new Vector3() ) {
+
+		const point = optionalTarget;
+
+		const fi = t * Math.PI * 2;
+
+		const x = Math.cos( 2 * fi ) * ( 1 + 0.45 * Math.cos( 3 * fi ) + 0.4 * Math.cos( 9 * fi ) );
+		const y = Math.sin( 2 * fi ) * ( 1 + 0.45 * Math.cos( 3 * fi ) + 0.4 * Math.cos( 9 * fi ) );
+		const z = 0.2 * Math.sin( 9 * fi );
+
+		return point.set( x, y, z ).multiplyScalar( this.scale );
+
+	}
+
+}
+
+
+// DecoratedTorusKnot5a
+
+class DecoratedTorusKnot5a extends Curve {
+
+	constructor( scale = 40 ) {
+
+		super();
+
+		this.scale = scale;
+
+	}
+
+	getPoint( t, optionalTarget = new Vector3() ) {
+
+		const point = optionalTarget;
+
+		const fi = t * Math.PI * 2;
+
+		const x = Math.cos( 3 * fi ) * ( 1 + 0.3 * Math.cos( 5 * fi ) + 0.5 * Math.cos( 10 * fi ) );
+		const y = Math.sin( 3 * fi ) * ( 1 + 0.3 * Math.cos( 5 * fi ) + 0.5 * Math.cos( 10 * fi ) );
+		const z = 0.2 * Math.sin( 20 * fi );
+
+		return point.set( x, y, z ).multiplyScalar( this.scale );
+
+	}
+
+}
+
+// DecoratedTorusKnot5c
+
+class DecoratedTorusKnot5c extends Curve {
+
+	constructor( scale = 40 ) {
+
+		super();
+
+		this.scale = scale;
+
+	}
+
+	getPoint( t, optionalTarget = new Vector3() ) {
+
+		const point = optionalTarget;
+
+		const fi = t * Math.PI * 2;
+
+		const x = Math.cos( 4 * fi ) * ( 1 + 0.5 * ( Math.cos( 5 * fi ) + 0.4 * Math.cos( 20 * fi ) ) );
+		const y = Math.sin( 4 * fi ) * ( 1 + 0.5 * ( Math.cos( 5 * fi ) + 0.4 * Math.cos( 20 * fi ) ) );
+		const z = 0.35 * Math.sin( 15 * fi );
+
+		return point.set( x, y, z ).multiplyScalar( this.scale );
+
+	}
+
+}
+
+export {
+	GrannyKnot,
+	HeartCurve,
+	VivianiCurve,
+	KnotCurve,
+	HelixCurve,
+	TrefoilKnot,
+	TorusKnot,
+	CinquefoilKnot,
+	TrefoilPolynomialKnot,
+	FigureEightPolynomialKnot,
+	DecoratedTorusKnot4a,
+	DecoratedTorusKnot4b,
+	DecoratedTorusKnot5a,
+	DecoratedTorusKnot5c
+};

+ 80 - 0
public/curves/NURBSCurve.js

@@ -0,0 +1,80 @@
+import {
+	Curve,
+	Vector3,
+	Vector4
+} from 'three';
+import * as NURBSUtils from '../curves/NURBSUtils.js';
+
+/**
+ * NURBS curve object
+ *
+ * Derives from Curve, overriding getPoint and getTangent.
+ *
+ * Implementation is based on (x, y [, z=0 [, w=1]]) control points with w=weight.
+ *
+ **/
+
+class NURBSCurve extends Curve {
+
+	constructor(
+		degree,
+		knots /* array of reals */,
+		controlPoints /* array of Vector(2|3|4) */,
+		startKnot /* index in knots */,
+		endKnot /* index in knots */
+	) {
+
+		super();
+
+		this.degree = degree;
+		this.knots = knots;
+		this.controlPoints = [];
+		// Used by periodic NURBS to remove hidden spans
+		this.startKnot = startKnot || 0;
+		this.endKnot = endKnot || ( this.knots.length - 1 );
+
+		for ( let i = 0; i < controlPoints.length; ++ i ) {
+
+			// ensure Vector4 for control points
+			const point = controlPoints[ i ];
+			this.controlPoints[ i ] = new Vector4( point.x, point.y, point.z, point.w );
+
+		}
+
+	}
+
+	getPoint( t, optionalTarget = new Vector3() ) {
+
+		const point = optionalTarget;
+
+		const u = this.knots[ this.startKnot ] + t * ( this.knots[ this.endKnot ] - this.knots[ this.startKnot ] ); // linear mapping t->u
+
+		// following results in (wx, wy, wz, w) homogeneous point
+		const hpoint = NURBSUtils.calcBSplinePoint( this.degree, this.knots, this.controlPoints, u );
+
+		if ( hpoint.w !== 1.0 ) {
+
+			// project to 3D space: (wx, wy, wz, w) -> (x, y, z, 1)
+			hpoint.divideScalar( hpoint.w );
+
+		}
+
+		return point.set( hpoint.x, hpoint.y, hpoint.z );
+
+	}
+
+	getTangent( t, optionalTarget = new Vector3() ) {
+
+		const tangent = optionalTarget;
+
+		const u = this.knots[ 0 ] + t * ( this.knots[ this.knots.length - 1 ] - this.knots[ 0 ] );
+		const ders = NURBSUtils.calcNURBSDerivatives( this.degree, this.knots, this.controlPoints, u, 1 );
+		tangent.copy( ders[ 1 ] ).normalize();
+
+		return tangent;
+
+	}
+
+}
+
+export { NURBSCurve };

+ 52 - 0
public/curves/NURBSSurface.js

@@ -0,0 +1,52 @@
+import {
+	Vector4
+} from 'three';
+import * as NURBSUtils from '../curves/NURBSUtils.js';
+
+/**
+ * NURBS surface object
+ *
+ * Implementation is based on (x, y [, z=0 [, w=1]]) control points with w=weight.
+ **/
+
+class NURBSSurface {
+
+	constructor( degree1, degree2, knots1, knots2 /* arrays of reals */, controlPoints /* array^2 of Vector(2|3|4) */ ) {
+
+		this.degree1 = degree1;
+		this.degree2 = degree2;
+		this.knots1 = knots1;
+		this.knots2 = knots2;
+		this.controlPoints = [];
+
+		const len1 = knots1.length - degree1 - 1;
+		const len2 = knots2.length - degree2 - 1;
+
+		// ensure Vector4 for control points
+		for ( let i = 0; i < len1; ++ i ) {
+
+			this.controlPoints[ i ] = [];
+
+			for ( let j = 0; j < len2; ++ j ) {
+
+				const point = controlPoints[ i ][ j ];
+				this.controlPoints[ i ][ j ] = new Vector4( point.x, point.y, point.z, point.w );
+
+			}
+
+		}
+
+	}
+
+	getPoint( t1, t2, target ) {
+
+		const u = this.knots1[ 0 ] + t1 * ( this.knots1[ this.knots1.length - 1 ] - this.knots1[ 0 ] ); // linear mapping t1->u
+		const v = this.knots2[ 0 ] + t2 * ( this.knots2[ this.knots2.length - 1 ] - this.knots2[ 0 ] ); // linear mapping t2->u
+
+		NURBSUtils.calcSurfacePoint( this.degree1, this.degree2, this.knots1, this.knots2, this.controlPoints, u, v, target );
+
+	}
+
+}
+
+export { NURBSSurface };

+ 487 - 0
public/curves/NURBSUtils.js

@@ -0,0 +1,487 @@
+import {
+	Vector3,
+	Vector4
+} from 'three';
+
+/**
+ * NURBS utils
+ *
+ * See NURBSCurve and NURBSSurface.
+ **/
+
+
+/**************************************************************
+ *	NURBS Utils
+ **************************************************************/
+
+/*
+Finds knot vector span.
+
+p : degree
+u : parametric value
+U : knot vector
+
+returns the span
+*/
+function findSpan( p, u, U ) {
+
+	const n = U.length - p - 1;
+
+	if ( u >= U[ n ] ) {
+
+		return n - 1;
+
+	}
+
+	if ( u <= U[ p ] ) {
+
+		return p;
+
+	}
+
+	let low = p;
+	let high = n;
+	let mid = Math.floor( ( low + high ) / 2 );
+
+	while ( u < U[ mid ] || u >= U[ mid + 1 ] ) {
+
+		if ( u < U[ mid ] ) {
+
+			high = mid;
+
+		} else {
+
+			low = mid;
+
+		}
+
+		mid = Math.floor( ( low + high ) / 2 );
+
+	}
+
+	return mid;
+
+}
+
+
+/*
+Calculate basis functions. See The NURBS Book, page 70, algorithm A2.2
+
+span : span in which u lies
+u    : parametric point
+p    : degree
+U    : knot vector
+
+returns array[p+1] with basis functions values.
+*/
+function calcBasisFunctions( span, u, p, U ) {
+
+	const N = [];
+	const left = [];
+	const right = [];
+	N[ 0 ] = 1.0;
+
+	for ( let j = 1; j <= p; ++ j ) {
+
+		left[ j ] = u - U[ span + 1 - j ];
+		right[ j ] = U[ span + j ] - u;
+
+		let saved = 0.0;
+
+		for ( let r = 0; r < j; ++ r ) {
+
+			const rv = right[ r + 1 ];
+			const lv = left[ j - r ];
+			const temp = N[ r ] / ( rv + lv );
+			N[ r ] = saved + rv * temp;
+			saved = lv * temp;
+
+		}
+
+		N[ j ] = saved;
+
+	}
+
+	return N;
+
+}
+
+
+/*
+Calculate B-Spline curve points. See The NURBS Book, page 82, algorithm A3.1.
+
+p : degree of B-Spline
+U : knot vector
+P : control points (x, y, z, w)
+u : parametric point
+
+returns point for given u
+*/
+function calcBSplinePoint( p, U, P, u ) {
+
+	const span = findSpan( p, u, U );
+	const N = calcBasisFunctions( span, u, p, U );
+	const C = new Vector4( 0, 0, 0, 0 );
+
+	for ( let j = 0; j <= p; ++ j ) {
+
+		const point = P[ span - p + j ];
+		const Nj = N[ j ];
+		const wNj = point.w * Nj;
+		C.x += point.x * wNj;
+		C.y += point.y * wNj;
+		C.z += point.z * wNj;
+		C.w += point.w * Nj;
+
+	}
+
+	return C;
+
+}
+
+
+/*
+Calculate basis functions derivatives. See The NURBS Book, page 72, algorithm A2.3.
+
+span : span in which u lies
+u    : parametric point
+p    : degree
+n    : number of derivatives to calculate
+U    : knot vector
+
+returns array[n+1][p+1] with basis functions derivatives
+*/
+function calcBasisFunctionDerivatives( span, u, p, n, U ) {
+
+	const zeroArr = [];
+	for ( let i = 0; i <= p; ++ i )
+		zeroArr[ i ] = 0.0;
+
+	const ders = [];
+
+	for ( let i = 0; i <= n; ++ i )
+		ders[ i ] = zeroArr.slice( 0 );
+
+	const ndu = [];
+
+	for ( let i = 0; i <= p; ++ i )
+		ndu[ i ] = zeroArr.slice( 0 );
+
+	ndu[ 0 ][ 0 ] = 1.0;
+
+	const left = zeroArr.slice( 0 );
+	const right = zeroArr.slice( 0 );
+
+	for ( let j = 1; j <= p; ++ j ) {
+
+		left[ j ] = u - U[ span + 1 - j ];
+		right[ j ] = U[ span + j ] - u;
+
+		let saved = 0.0;
+
+		for ( let r = 0; r < j; ++ r ) {
+
+			const rv = right[ r + 1 ];
+			const lv = left[ j - r ];
+			ndu[ j ][ r ] = rv + lv;
+
+			const temp = ndu[ r ][ j - 1 ] / ndu[ j ][ r ];
+			ndu[ r ][ j ] = saved + rv * temp;
+			saved = lv * temp;
+
+		}
+
+		ndu[ j ][ j ] = saved;
+
+	}
+
+	for ( let j = 0; j <= p; ++ j ) {
+
+		ders[ 0 ][ j ] = ndu[ j ][ p ];
+
+	}
+
+	for ( let r = 0; r <= p; ++ r ) {
+
+		let s1 = 0;
+		let s2 = 1;
+
+		const a = [];
+		for ( let i = 0; i <= p; ++ i ) {
+
+			a[ i ] = zeroArr.slice( 0 );
+
+		}
+
+		a[ 0 ][ 0 ] = 1.0;
+
+		for ( let k = 1; k <= n; ++ k ) {
+
+			let d = 0.0;
+			const rk = r - k;
+			const pk = p - k;
+
+			if ( r >= k ) {
+
+				a[ s2 ][ 0 ] = a[ s1 ][ 0 ] / ndu[ pk + 1 ][ rk ];
+				d = a[ s2 ][ 0 ] * ndu[ rk ][ pk ];
+
+			}
+
+			const j1 = ( rk >= - 1 ) ? 1 : - rk;
+			const j2 = ( r - 1 <= pk ) ? k - 1 : p - r;
+
+			for ( let j = j1; j <= j2; ++ j ) {
+
+				a[ s2 ][ j ] = ( a[ s1 ][ j ] - a[ s1 ][ j - 1 ] ) / ndu[ pk + 1 ][ rk + j ];
+				d += a[ s2 ][ j ] * ndu[ rk + j ][ pk ];
+
+			}
+
+			if ( r <= pk ) {
+
+				a[ s2 ][ k ] = - a[ s1 ][ k - 1 ] / ndu[ pk + 1 ][ r ];
+				d += a[ s2 ][ k ] * ndu[ r ][ pk ];
+
+			}
+
+			ders[ k ][ r ] = d;
+
+			const j = s1;
+			s1 = s2;
+			s2 = j;
+
+		}
+
+	}
+
+	let r = p;
+
+	for ( let k = 1; k <= n; ++ k ) {
+
+		for ( let j = 0; j <= p; ++ j ) {
+
+			ders[ k ][ j ] *= r;
+
+		}
+
+		r *= p - k;
+
+	}
+
+	return ders;
+
+}
+
+
+/*
+	Calculate derivatives of a B-Spline. See The NURBS Book, page 93, algorithm A3.2.
+
+	p  : degree
+	U  : knot vector
+	P  : control points
+	u  : Parametric points
+	nd : number of derivatives
+
+	returns array[d+1] with derivatives
+	*/
+function calcBSplineDerivatives( p, U, P, u, nd ) {
+
+	const du = nd < p ? nd : p;
+	const CK = [];
+	const span = findSpan( p, u, U );
+	const nders = calcBasisFunctionDerivatives( span, u, p, du, U );
+	const Pw = [];
+
+	for ( let i = 0; i < P.length; ++ i ) {
+
+		const point = P[ i ].clone();
+		const w = point.w;
+
+		point.x *= w;
+		point.y *= w;
+		point.z *= w;
+
+		Pw[ i ] = point;
+
+	}
+
+	for ( let k = 0; k <= du; ++ k ) {
+
+		const point = Pw[ span - p ].clone().multiplyScalar( nders[ k ][ 0 ] );
+
+		for ( let j = 1; j <= p; ++ j ) {
+
+			point.add( Pw[ span - p + j ].clone().multiplyScalar( nders[ k ][ j ] ) );
+
+		}
+
+		CK[ k ] = point;
+
+	}
+
+	for ( let k = du + 1; k <= nd + 1; ++ k ) {
+
+		CK[ k ] = new Vector4( 0, 0, 0 );
+
+	}
+
+	return CK;
+
+}
+
+
+/*
+Calculate "K over I"
+
+returns k!/(i!(k-i)!)
+*/
+function calcKoverI( k, i ) {
+
+	let nom = 1;
+
+	for ( let j = 2; j <= k; ++ j ) {
+
+		nom *= j;
+
+	}
+
+	let denom = 1;
+
+	for ( let j = 2; j <= i; ++ j ) {
+
+		denom *= j;
+
+	}
+
+	for ( let j = 2; j <= k - i; ++ j ) {
+
+		denom *= j;
+
+	}
+
+	return nom / denom;
+
+}
+
+
+/*
+Calculate derivatives (0-nd) of rational curve. See The NURBS Book, page 127, algorithm A4.2.
+
+Pders : result of function calcBSplineDerivatives
+
+returns array with derivatives for rational curve.
+*/
+function calcRationalCurveDerivatives( Pders ) {
+
+	const nd = Pders.length;
+	const Aders = [];
+	const wders = [];
+
+	for ( let i = 0; i < nd; ++ i ) {
+
+		const point = Pders[ i ];
+		Aders[ i ] = new Vector3( point.x, point.y, point.z );
+		wders[ i ] = point.w;
+
+	}
+
+	const CK = [];
+
+	for ( let k = 0; k < nd; ++ k ) {
+
+		const v = Aders[ k ].clone();
+
+		for ( let i = 1; i <= k; ++ i ) {
+
+			v.sub( CK[ k - i ].clone().multiplyScalar( calcKoverI( k, i ) * wders[ i ] ) );
+
+		}
+
+		CK[ k ] = v.divideScalar( wders[ 0 ] );
+
+	}
+
+	return CK;
+
+}
+
+
+/*
+Calculate NURBS curve derivatives. See The NURBS Book, page 127, algorithm A4.2.
+
+p  : degree
+U  : knot vector
+P  : control points in homogeneous space
+u  : parametric points
+nd : number of derivatives
+
+returns array with derivatives.
+*/
+function calcNURBSDerivatives( p, U, P, u, nd ) {
+
+	const Pders = calcBSplineDerivatives( p, U, P, u, nd );
+	return calcRationalCurveDerivatives( Pders );
+
+}
+
+
+/*
+Calculate rational B-Spline surface point. See The NURBS Book, page 134, algorithm A4.3.
+
+p1, p2 : degrees of B-Spline surface
+U1, U2 : knot vectors
+P      : control points (x, y, z, w)
+u, v   : parametric values
+
+returns point for given (u, v)
+*/
+function calcSurfacePoint( p, q, U, V, P, u, v, target ) {
+
+	const uspan = findSpan( p, u, U );
+	const vspan = findSpan( q, v, V );
+	const Nu = calcBasisFunctions( uspan, u, p, U );
+	const Nv = calcBasisFunctions( vspan, v, q, V );
+	const temp = [];
+
+	for ( let l = 0; l <= q; ++ l ) {
+
+		temp[ l ] = new Vector4( 0, 0, 0, 0 );
+		for ( let k = 0; k <= p; ++ k ) {
+
+			const point = P[ uspan - p + k ][ vspan - q + l ].clone();
+			const w = point.w;
+			point.x *= w;
+			point.y *= w;
+			point.z *= w;
+			temp[ l ].add( point.multiplyScalar( Nu[ k ] ) );
+
+		}
+
+	}
+
+	const Sw = new Vector4( 0, 0, 0, 0 );
+	for ( let l = 0; l <= q; ++ l ) {
+
+		Sw.add( temp[ l ].multiplyScalar( Nv[ l ] ) );
+
+	}
+
+	Sw.divideScalar( Sw.w );
+	target.set( Sw.x, Sw.y, Sw.z );
+
+}
+
+
+
+export {
+	findSpan,
+	calcBasisFunctions,
+	calcBSplinePoint,
+	calcBasisFunctionDerivatives,
+	calcBSplineDerivatives,
+	calcKoverI,
+	calcRationalCurveDerivatives,
+	calcNURBSDerivatives,
+	calcSurfacePoint,
+};

BIN
public/favicon.ico


Datei-Diff unterdrückt, da er zu groß ist
+ 31 - 0
public/gltf/draco_decoder.js


BIN
public/gltf/draco_decoder.wasm


Datei-Diff unterdrückt, da er zu groß ist
+ 33 - 0
public/gltf/draco_encoder.js


Datei-Diff unterdrückt, da er zu groß ist
+ 119 - 0
public/gltf/draco_wasm_wrapper.js


BIN
public/images/.DS_Store


BIN
public/images/01.png


BIN
public/images/3DVR.PNG


BIN
public/images/3D_button.png


BIN
public/images/3D_button_active.png


BIN
public/images/3d.png


BIN
public/images/Close.png


BIN
public/images/Spinner_t.gif


BIN
public/images/VR-active.png


BIN
public/images/add-icon-active.png


BIN
public/images/add-icon.png


BIN
public/images/aibee_entry_img.png


BIN
public/images/arc_surface_2x.png


BIN
public/images/audio_pause@3x_128x128.png


BIN
public/images/audio_play@3x_128x128.png


BIN
public/images/audiooff_128x128.png


BIN
public/images/audiooff_24x24.png


BIN
public/images/audiooff_38x38.png


BIN
public/images/audiooff_70x70.jpg


BIN
public/images/audioon_128x128.png


BIN
public/images/audioon_128x128_hover.png


BIN
public/images/audioon_24x24.png


BIN
public/images/audioon_38x38.png


BIN
public/images/audioon_70x70.png


BIN
public/images/audiotag_n_20_60x60.png


BIN
public/images/audiotag_n_20_60x60_hover.png


BIN
public/images/back-black.png


BIN
public/images/back-white.png


BIN
public/images/back_button.png


+ 47 - 0
public/images/ball-triangle.svg

@@ -0,0 +1,47 @@
+<!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL -->
+<!-- Todo: add easing -->
+<svg width="57" height="57" viewBox="0 0 57 57" xmlns="http://www.w3.org/2000/svg" stroke="#fff">
+    <g fill="none" fill-rule="evenodd">
+        <g transform="translate(1 1)" stroke-width="2">
+            <circle cx="5" cy="50" r="5">
+                <animate attributeName="cy"
+                     begin="0s" dur="2.2s"
+                     values="50;5;50;50"
+                     calcMode="linear"
+                     repeatCount="indefinite" />
+                <animate attributeName="cx"
+                     begin="0s" dur="2.2s"
+                     values="5;27;49;5"
+                     calcMode="linear"
+                     repeatCount="indefinite" />
+            </circle>
+            <circle cx="27" cy="5" r="5">
+                <animate attributeName="cy"
+                     begin="0s" dur="2.2s"
+                     from="5" to="5"
+                     values="5;50;50;5"
+                     calcMode="linear"
+                     repeatCount="indefinite" />
+                <animate attributeName="cx"
+                     begin="0s" dur="2.2s"
+                     from="27" to="27"
+                     values="27;49;5;27"
+                     calcMode="linear"
+                     repeatCount="indefinite" />
+            </circle>
+            <circle cx="49" cy="50" r="5">
+                <animate attributeName="cy"
+                     begin="0s" dur="2.2s"
+                     values="50;50;5;50"
+                     calcMode="linear"
+                     repeatCount="indefinite" />
+                <animate attributeName="cx"
+                     from="49" to="49"
+                     begin="0s" dur="2.2s"
+                     values="49;5;27;49"
+                     calcMode="linear"
+                     repeatCount="indefinite" />
+            </circle>
+        </g>
+    </g>
+</svg>

BIN
public/images/bg.jpg


BIN
public/images/bigclose_56x56.png


BIN
public/images/bone_node_choosed_2x.png


BIN
public/images/bone_node_default_2x.png


BIN
public/images/center_logo.png


BIN
public/images/center_white_logo.png


BIN
public/images/click-walk.png


BIN
public/images/close_40x40.png


BIN
public/images/colpick_arrows.png


BIN
public/images/colpick_indic.gif


BIN
public/images/colpick_overlay.png


BIN
public/images/colpick_select.gif


BIN
public/images/colpick_slider.png


BIN
public/images/compass.png


BIN
public/images/compass_128.png


BIN
public/images/compass_128_1.png


BIN
public/images/compass_512x512.png


BIN
public/images/compass_512x512.png.png


BIN
public/images/compassall.png


BIN
public/images/compassoutdoor.png


BIN
public/images/compassoutdoor_512x512.png


BIN
public/images/compassoutdoor_f_512x512.png


BIN
public/images/compassscale.png


BIN
public/images/compassscale_512x512.png


BIN
public/images/compassscale_f_512x512.png


BIN
public/images/css_sprites.png


BIN
public/images/css_sprites2.png


BIN
public/images/css_sprites3.png


BIN
public/images/css_sprites4.png


BIN
public/images/current-select.png


BIN
public/images/cursor.png


BIN
public/images/defaultBg_mobile.jpg


BIN
public/images/defaultBg_pc.jpg


BIN
public/images/default_head_icon.png


BIN
public/images/defaultloading.png


BIN
public/images/defaultloading_pre.png


BIN
public/images/del_test_cursor.png


+ 0 - 0
public/images/delete-active-icon.png


Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.