{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Hands on tropical geometry\n",
    "\n",
    "This is a minimal tutorial for 3d-printing tropical surfaces and tropical curves. The resulting digital models can also be used for high quality renders. \n",
    "\n",
    "For questions on or beyond the tutorial, visit the polymake forums: \n",
    "https://forum.polymake.org/"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Basic preperations for this notebook\n",
    "\n",
    "<font color='red'>*This code cell should run before any of the others*</font>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "script(\"files/3d_printing_with_x3d/3d_printing_helping_subs.pl\");   # loading helper scripts \n",
    "# needs to be done before\n",
    "application \"tropical\";\n",
    "\n",
    "$x3d_dir=\"/tmp/x3ds/\";                   # designated folder for x3d files (leave empty for current folder)\n",
    "if (!-d $x3d_dir) { mkdir $x3d_dir; }    # create the folder if it does not exist"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Tropical surfaces"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### A: creating tropical surfaces in polymake\n",
    "\n",
    "A tropical surface in euclidean 3-space is also a tropical hypersurface, and the simplest way to create a tropical hypersurface is by specifying a tropical polynomial which cuts it out. This can be done through a suitable string. Note that **the polynomial needs to be homogeneous** and that the first coordinate will be set to 1 for the affine picture. To control which variable comes first, one can supplement an array of variable names."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<!--\n",
       "polymake for knusper\n",
       "Thu Aug 27 10:34:29 2020\n",
       "TQuadric\n",
       "-->\n",
       "\n",
       "\n",
       "<html>\n",
       "   <head>\n",
       "      <meta charset=utf-8>\n",
       "      <title>TQuadric</title>\n",
       "      <style>\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "*/\n",
       "         html {overflow: scroll;}\n",
       "         strong{font-size: 18px;}\n",
       "         canvas { z-index: 8; }\n",
       "         input[type='radio'] {margin-left:0;}\n",
       "         input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;}\n",
       "         .group{padding-bottom: 15px;}\n",
       "         .settings * {z-index: 11; }\n",
       "         .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;}\n",
       "         .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} \n",
       "         .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;}\n",
       "         .showSettingsButton{visibility: visible; z-index: 12; position: absolute }\n",
       "         .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5}\n",
       "         button{margin-left: 0; margin-top: 10px}\n",
       "         img{cursor: pointer;}\n",
       "         .suboption{padding-top: 15px;}\n",
       "         #model20409812203 { width: 100%; height: 100%; }\n",
       "         .threejs_container { width: 100%; height: 75vh;}\n",
       "         .settings{max-height: 74vh} \n",
       "         input[type=range] {\n",
       "           -webkit-appearance: none;\n",
       "           padding:0; \n",
       "           width:90%; \n",
       "           margin-left: auto;\n",
       "           margin-right: auto;\n",
       "           margin-top: 15px;\n",
       "           margin-bottom: 15px;\n",
       "           display: block;\t\n",
       "         }\n",
       "         input[type=range]:focus {\n",
       "           outline: none;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-runnable-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "           -webkit-appearance: none;\n",
       "           margin-top: -5px;\n",
       "         }\n",
       "         input[type=range]:focus::-webkit-slider-runnable-track {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]::-moz-range-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-moz-range-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]::-ms-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           background: transparent;\n",
       "           border-color: transparent;\n",
       "           color: transparent;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_END\n",
       "*/\n",
       "\t\t</style>\n",
       "   </head>\n",
       "<body>\n",
       "   <div class='threejs_container'>\n",
       "\t\t<div id='settings_0' class='settings'>\n",
       "\t\t\t<div class=group id='explode_0'>\n",
       "\t\t\t\t<strong>Explode</strong>\n",
       "\t\t\t\t<input id='explodeRange_0' type='range' min=0 max=6 step=0.01 value=0>\n",
       "\t\t\t\t<div class=indented><input id='explodeCheckbox_0' type='checkbox'>Automatic explosion</div>\n",
       "\t\t\t\t<div class=suboption>Exploding speed</div>\n",
       "\t\t\t\t<input id='explodingSpeedRange_0' type='range' min=0 max=0.5 step=0.001 value=0.05>\n",
       "\t\t\t</div>\n",
       "\t\n",
       "\t\t\t<div class=group id='transparency_0' class='transparency'>\n",
       "\t\t\t\t<strong>Transparency</strong>\n",
       "\t\t\t\t<input id='transparencyRange_0' type='range' min=0 max=1 step=0.01 value=0>\n",
       "\t\t\t</div>\n",
       "\t\t\t\n",
       "\t\t\t<div class=group id='rotation_0'>\n",
       "\t\t\t\t<strong>Rotation</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationX_0'> x-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationY_0'> y-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationZ_0'> z-axis</div>\n",
       "\t\t\t\t\t<button id='resetButton_0'>Reset</button>\n",
       "\t\t\t\t</div>\n",
       "\n",
       "\t\t\t\t<div class=suboption>Rotation speed</div>\n",
       "\t\t\t\t<input id='rotationSpeedRange_0' type='range' min=0 max=5 step=0.01 value=2>\n",
       "\t\t\t</div>\n",
       "\n",
       "\n",
       "\t\t\t<div class=group id='display_0'>\n",
       "\t\t\t\t<strong>Display</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div id='shownObjectTypesList_0' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t\t<div class=suboption>Objects</div>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t   <div id='shownObjectsList_0' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "         \n",
       "         <div class=group id='camera_0'>\n",
       "            <strong>Camera</strong>\n",
       "            <div class=indented>\n",
       "               <form>\n",
       "                  <select id=\"cameraType_0\">\n",
       "                     <option value='perspective' selected> Perspective<br></option>\n",
       "                     <option value='orthographic' > Orthographic<br></option>\n",
       "                  </select>\n",
       "               </form>\n",
       "            </div>\n",
       "         </div>\n",
       "\n",
       "\t\t\t<div class=group id='svg_0'>\n",
       "\t\t\t\t<strong>SVG</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<form>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='download' id='download_0' checked> Download<br>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='tab' id='tab_0' > New tab<br>\n",
       "\t\t\t\t\t</form>\n",
       "\t\t\t\t\t<button id='takeScreenshot_0'>Screenshot</button>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "\n",
       "\t\t</div>\t<!-- end of settings -->\n",
       "\t\t<img id='hideSettingsButton_0' class='hideSettingsButton' src='/kernelspecs/polymake/close.svg' width=20px\">\n",
       "\t\t<img id='showSettingsButton_0' class='showSettingsButton' src='/kernelspecs/polymake/menu.svg' width=20px\">\n",
       "<div id=\"model20409812203\"></div>\n",
       "</div>\n",
       "   <script>\n",
       "    requirejs.config({\n",
       "      paths: {\n",
       "        three: '/kernelspecs/polymake/three',\n",
       "        TrackballControls: '/kernelspecs/polymake/TrackballControls',\n",
       "        OrbitControls: '/kernelspecs/polymake/OrbitControls',\n",
       "        Projector: '/kernelspecs/polymake/Projector',\n",
       "        SVGRenderer: '/kernelspecs/polymake/SVGRenderer',\n",
       "        WEBGL: '/kernelspecs/polymake/WebGL',\n",
       "      },\n",
       "      shim: {\n",
       "        'three': { exports: 'THREE'},\n",
       "        'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' },\n",
       "        'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' },\n",
       "        'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' },\n",
       "        'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' },\n",
       "        'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' },\n",
       "      }\n",
       "    });\n",
       "    \n",
       "    require(['three'],function(THREE){\n",
       "        window.THREE = THREE;\n",
       "      require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'],\n",
       "               function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) {\n",
       "    THREE.TrackballControls = TrackballControls;\n",
       "    THREE.OrbitControls = OrbitControls;\n",
       "    THREE.Projector = Projector;\n",
       "    THREE.SVGRenderer = SVGRenderer;\n",
       "    THREE.WEBGL = WEBGL;\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "\n",
       "const intervalLength = 25; // for automatic animations\n",
       "const explodableModel = true; \n",
       "const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false };\n",
       "const foldables = [];\n",
       "\n",
       "var three = document.getElementById(\"model20409812203\");\n",
       "var scene = new THREE.Scene();\n",
       "var renderer = new THREE.WebGLRenderer( { antialias: true } );\n",
       "var svgRenderer = new THREE.SVGRenderer( { antialias: true } );\n",
       "renderer.setPixelRatio( window.devicePixelRatio );\n",
       "renderer.setClearColor(0xFFFFFF, 1);\n",
       "svgRenderer.setClearColor(0xFFFFFF, 1);\n",
       "three.appendChild(renderer.domElement);\n",
       "\n",
       "var frustumSize = 4;\n",
       "var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()];\n",
       "cameras.forEach(function(cam) {\n",
       "    cam.position.set(0, 0, 5);\n",
       "    cam.lookAt(0, 0, 0);  \n",
       "    cam.up.set(0, 1, 0);         \n",
       "});\n",
       "var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)];\n",
       "var camera, control;\n",
       "\n",
       "controls[0].zoomSpeed = 0.2;\n",
       "controls[0].rotateSpeed = 4;\n",
       "\n",
       "\n",
       "// class to allow move points together with labels and spheres\n",
       "var PMPoint = function (x,y,z) {\n",
       "   this.vector = new THREE.Vector3(x,y,z);\n",
       "   this.sprite = null;\n",
       "   this.sphere = null;\n",
       "}\n",
       "PMPoint.prototype.addLabel = function(labelsprite) {\n",
       "   this.sprite = labelsprite;\n",
       "   this.sprite.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.addSphere = function(spheremesh) {\n",
       "   this.sphere = spheremesh;\n",
       "   this.sphere.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.set = function(x,y,z) {\n",
       "   this.vector.set(x,y,z);\n",
       "   if (this.sprite) {\n",
       "      this.sprite.position.copy(this.vector);\n",
       "   }\n",
       "   if (this.sphere) {\n",
       "      this.sphere.position.copy(this.vector);\n",
       "   }\n",
       "}\n",
       "PMPoint.prototype.radius = function() {\n",
       "   if (this.sphere) {\n",
       "      return this.sphere.geometry.parameters.radius;\n",
       "   } else {\n",
       "      return 0;\n",
       "   }\n",
       "};\n",
       "// select the target node\n",
       "var target = document.querySelector('#model20409812203');\n",
       "\n",
       "// create an observer instance\n",
       "var observer = new MutationObserver(function(mutations) {\n",
       "   mutations.forEach(function(mutation) {\n",
       "      if (mutation.removedNodes && mutation.removedNodes.length > 0) {\n",
       "         cancelAnimationFrame(renderId);\n",
       "         observer.disconnect();\n",
       "         console.log(\"cancelled frame \"+renderId);\n",
       "      }\n",
       "   });\n",
       "});\n",
       "\n",
       "// configuration of the observer:\n",
       "var config = { childList: true, characterData: true }\n",
       "\n",
       "// pass in the target node, as well as the observer options\n",
       "while (target) {\n",
       "   if (target.className==\"output\") {\n",
       "      observer.observe(target, config);\n",
       "      break;\n",
       "   }\n",
       "   target = target.parentNode;\n",
       "}\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "var obj0 = new THREE.Object3D();\n",
       "obj0.name = \"unnamed__1\";\n",
       "obj0.userData.explodable = 1;\n",
       "obj0.userData.points = [];\n",
       "obj0.userData.points.push(new PMPoint(0, 0, 0));\n",
       "obj0.userData.points.push(new PMPoint(0, -1, 0));\n",
       "obj0.userData.points.push(new PMPoint(-1, -2, -1));\n",
       "obj0.userData.points.push(new PMPoint(-2, -2, -2));\n",
       "\n",
       "obj0.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj0.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj0.userData.facets = [[2, 1, 0, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj0.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj0);\n",
       "scene.add(obj0);\n",
       "\n",
       "var obj1 = new THREE.Object3D();\n",
       "obj1.name = \"unnamed__2\";\n",
       "obj1.userData.explodable = 1;\n",
       "obj1.userData.points = [];\n",
       "obj1.userData.points.push(new PMPoint(0, 0, -1));\n",
       "obj1.userData.points.push(new PMPoint(0, 0, 0));\n",
       "obj1.userData.points.push(new PMPoint(2, 0, 0));\n",
       "obj1.userData.points.push(new PMPoint(2, 0, -1));\n",
       "\n",
       "obj1.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj1.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj1.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj1.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj1.userData.facets = [[0, 1, 2, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj1.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj1);\n",
       "scene.add(obj1);\n",
       "\n",
       "var obj2 = new THREE.Object3D();\n",
       "obj2.name = \"unnamed__3\";\n",
       "obj2.userData.explodable = 1;\n",
       "obj2.userData.points = [];\n",
       "obj2.userData.points.push(new PMPoint(-1, 0, 0));\n",
       "obj2.userData.points.push(new PMPoint(0, 0, 0));\n",
       "obj2.userData.points.push(new PMPoint(0, 0, 2));\n",
       "obj2.userData.points.push(new PMPoint(-1, 0, 2));\n",
       "\n",
       "obj2.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj2.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj2.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj2.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj2.userData.facets = [[0, 3, 2, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj2.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj2);\n",
       "scene.add(obj2);\n",
       "\n",
       "var obj3 = new THREE.Object3D();\n",
       "obj3.name = \"unnamed__4\";\n",
       "obj3.userData.explodable = 1;\n",
       "obj3.userData.points = [];\n",
       "obj3.userData.points.push(new PMPoint(1, 1, 1));\n",
       "obj3.userData.points.push(new PMPoint(0, 0, 0));\n",
       "obj3.userData.points.push(new PMPoint(0, 2, 0));\n",
       "obj3.userData.points.push(new PMPoint(1, 2, 1));\n",
       "\n",
       "obj3.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj3.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj3.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj3.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj3.userData.facets = [[0, 3, 2, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj3.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj3);\n",
       "scene.add(obj3);\n",
       "\n",
       "var obj4 = new THREE.Object3D();\n",
       "obj4.name = \"unnamed__5\";\n",
       "obj4.userData.explodable = 1;\n",
       "obj4.userData.points = [];\n",
       "obj4.userData.points.push(new PMPoint(2, 0, -1));\n",
       "obj4.userData.points.push(new PMPoint(0, 0, -1));\n",
       "obj4.userData.points.push(new PMPoint(-1, -1, -2));\n",
       "obj4.userData.points.push(new PMPoint(2, -1, -2));\n",
       "\n",
       "obj4.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj4.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj4.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj4.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj4.userData.facets = [[1, 0, 3, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj4.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj4);\n",
       "scene.add(obj4);\n",
       "\n",
       "var obj5 = new THREE.Object3D();\n",
       "obj5.name = \"unnamed__6\";\n",
       "obj5.userData.explodable = 1;\n",
       "obj5.userData.points = [];\n",
       "obj5.userData.points.push(new PMPoint(2, 0, -1));\n",
       "obj5.userData.points.push(new PMPoint(0, 0, -1));\n",
       "obj5.userData.points.push(new PMPoint(0, 2, -1));\n",
       "obj5.userData.points.push(new PMPoint(2, 2, -1));\n",
       "\n",
       "obj5.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj5.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj5.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj5.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj5.userData.facets = [[0, 3, 2, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj5.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj5);\n",
       "scene.add(obj5);\n",
       "\n",
       "var obj6 = new THREE.Object3D();\n",
       "obj6.name = \"unnamed__7\";\n",
       "obj6.userData.explodable = 1;\n",
       "obj6.userData.points = [];\n",
       "obj6.userData.points.push(new PMPoint(0, 0, -1));\n",
       "obj6.userData.points.push(new PMPoint(0, 0, 0));\n",
       "obj6.userData.points.push(new PMPoint(-2, -2, -2));\n",
       "obj6.userData.points.push(new PMPoint(-1, -1, -2));\n",
       "\n",
       "obj6.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj6.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj6.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj6.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj6.userData.facets = [[2, 1, 0, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj6.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj6);\n",
       "scene.add(obj6);\n",
       "\n",
       "var obj7 = new THREE.Object3D();\n",
       "obj7.name = \"unnamed__8\";\n",
       "obj7.userData.explodable = 1;\n",
       "obj7.userData.points = [];\n",
       "obj7.userData.points.push(new PMPoint(0, 0, 0));\n",
       "obj7.userData.points.push(new PMPoint(-1, 0, 0));\n",
       "obj7.userData.points.push(new PMPoint(-2, -1, -1));\n",
       "obj7.userData.points.push(new PMPoint(-2, -2, -2));\n",
       "\n",
       "obj7.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj7.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj7.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj7.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj7.userData.facets = [[2, 1, 0, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj7.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj7);\n",
       "scene.add(obj7);\n",
       "\n",
       "var obj8 = new THREE.Object3D();\n",
       "obj8.name = \"unnamed__9\";\n",
       "obj8.userData.explodable = 1;\n",
       "obj8.userData.points = [];\n",
       "obj8.userData.points.push(new PMPoint(0, 0, 0));\n",
       "obj8.userData.points.push(new PMPoint(0, 0, -1));\n",
       "obj8.userData.points.push(new PMPoint(0, 2, 0));\n",
       "obj8.userData.points.push(new PMPoint(0, 2, -1));\n",
       "\n",
       "obj8.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj8.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj8.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj8.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj8.userData.facets = [[1, 0, 2, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj8.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj8);\n",
       "scene.add(obj8);\n",
       "\n",
       "var obj9 = new THREE.Object3D();\n",
       "obj9.name = \"unnamed__10\";\n",
       "obj9.userData.explodable = 1;\n",
       "obj9.userData.points = [];\n",
       "obj9.userData.points.push(new PMPoint(0, 0, 0));\n",
       "obj9.userData.points.push(new PMPoint(-1, 0, 0));\n",
       "obj9.userData.points.push(new PMPoint(0, 2, 0));\n",
       "obj9.userData.points.push(new PMPoint(-1, 2, 0));\n",
       "\n",
       "obj9.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj9.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj9.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj9.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj9.userData.facets = [[0, 2, 3, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj9.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj9);\n",
       "scene.add(obj9);\n",
       "\n",
       "var obj10 = new THREE.Object3D();\n",
       "obj10.name = \"unnamed__11\";\n",
       "obj10.userData.explodable = 1;\n",
       "obj10.userData.points = [];\n",
       "obj10.userData.points.push(new PMPoint(0, 0, -1));\n",
       "obj10.userData.points.push(new PMPoint(0, 2, -1));\n",
       "obj10.userData.points.push(new PMPoint(-1, -1, -2));\n",
       "obj10.userData.points.push(new PMPoint(-1, 2, -2));\n",
       "\n",
       "obj10.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj10.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj10.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj10.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj10.userData.facets = [[0, 1, 3, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj10.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj10);\n",
       "scene.add(obj10);\n",
       "\n",
       "var obj11 = new THREE.Object3D();\n",
       "obj11.name = \"unnamed__12\";\n",
       "obj11.userData.explodable = 1;\n",
       "obj11.userData.points = [];\n",
       "obj11.userData.points.push(new PMPoint(0, -1, 0));\n",
       "obj11.userData.points.push(new PMPoint(2, -1, 0));\n",
       "obj11.userData.points.push(new PMPoint(2, -2, -1));\n",
       "obj11.userData.points.push(new PMPoint(-1, -2, -1));\n",
       "\n",
       "obj11.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj11.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj11.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj11.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj11.userData.facets = [[0, 1, 2, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj11.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj11);\n",
       "scene.add(obj11);\n",
       "\n",
       "var obj12 = new THREE.Object3D();\n",
       "obj12.name = \"unnamed__13\";\n",
       "obj12.userData.explodable = 1;\n",
       "obj12.userData.points = [];\n",
       "obj12.userData.points.push(new PMPoint(0, -1, 0));\n",
       "obj12.userData.points.push(new PMPoint(0, -1, 2));\n",
       "obj12.userData.points.push(new PMPoint(-1, -2, 2));\n",
       "obj12.userData.points.push(new PMPoint(-1, -2, -1));\n",
       "\n",
       "obj12.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj12.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj12.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj12.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj12.userData.facets = [[0, 1, 2, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj12.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj12);\n",
       "scene.add(obj12);\n",
       "\n",
       "var obj13 = new THREE.Object3D();\n",
       "obj13.name = \"unnamed__14\";\n",
       "obj13.userData.explodable = 1;\n",
       "obj13.userData.points = [];\n",
       "obj13.userData.points.push(new PMPoint(0, -1, 0));\n",
       "obj13.userData.points.push(new PMPoint(0, 0, 0));\n",
       "obj13.userData.points.push(new PMPoint(2, 0, 0));\n",
       "obj13.userData.points.push(new PMPoint(2, -1, 0));\n",
       "\n",
       "obj13.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj13.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj13.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj13.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj13.userData.facets = [[0, 1, 2, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj13.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj13);\n",
       "scene.add(obj13);\n",
       "\n",
       "var obj14 = new THREE.Object3D();\n",
       "obj14.name = \"unnamed__15\";\n",
       "obj14.userData.explodable = 1;\n",
       "obj14.userData.points = [];\n",
       "obj14.userData.points.push(new PMPoint(0, -1, 0));\n",
       "obj14.userData.points.push(new PMPoint(0, 0, 0));\n",
       "obj14.userData.points.push(new PMPoint(0, 0, 2));\n",
       "obj14.userData.points.push(new PMPoint(0, -1, 2));\n",
       "\n",
       "obj14.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj14.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj14.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj14.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj14.userData.facets = [[0, 3, 2, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj14.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj14);\n",
       "scene.add(obj14);\n",
       "\n",
       "var obj15 = new THREE.Object3D();\n",
       "obj15.name = \"unnamed__16\";\n",
       "obj15.userData.explodable = 1;\n",
       "obj15.userData.points = [];\n",
       "obj15.userData.points.push(new PMPoint(0, 0, 0));\n",
       "obj15.userData.points.push(new PMPoint(1, 1, 1));\n",
       "obj15.userData.points.push(new PMPoint(2, 0, 0));\n",
       "obj15.userData.points.push(new PMPoint(2, 1, 1));\n",
       "\n",
       "obj15.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj15.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj15.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj15.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj15.userData.facets = [[0, 2, 3, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj15.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj15);\n",
       "scene.add(obj15);\n",
       "\n",
       "var obj16 = new THREE.Object3D();\n",
       "obj16.name = \"unnamed__17\";\n",
       "obj16.userData.explodable = 1;\n",
       "obj16.userData.points = [];\n",
       "obj16.userData.points.push(new PMPoint(0, 0, 0));\n",
       "obj16.userData.points.push(new PMPoint(1, 1, 1));\n",
       "obj16.userData.points.push(new PMPoint(0, 0, 2));\n",
       "obj16.userData.points.push(new PMPoint(1, 1, 2));\n",
       "\n",
       "obj16.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj16.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj16.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj16.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj16.userData.facets = [[0, 2, 3, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj16.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj16);\n",
       "scene.add(obj16);\n",
       "\n",
       "var obj17 = new THREE.Object3D();\n",
       "obj17.name = \"unnamed__18\";\n",
       "obj17.userData.explodable = 1;\n",
       "obj17.userData.points = [];\n",
       "obj17.userData.points.push(new PMPoint(0, -1, 0));\n",
       "obj17.userData.points.push(new PMPoint(2, -1, 0));\n",
       "obj17.userData.points.push(new PMPoint(0, -1, 2));\n",
       "obj17.userData.points.push(new PMPoint(2, -1, 2));\n",
       "\n",
       "obj17.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj17.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj17.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj17.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj17.userData.facets = [[0, 2, 3, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj17.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj17);\n",
       "scene.add(obj17);\n",
       "\n",
       "var obj18 = new THREE.Object3D();\n",
       "obj18.name = \"unnamed__19\";\n",
       "obj18.userData.explodable = 1;\n",
       "obj18.userData.points = [];\n",
       "obj18.userData.points.push(new PMPoint(-1, 0, 2));\n",
       "obj18.userData.points.push(new PMPoint(-1, 0, 0));\n",
       "obj18.userData.points.push(new PMPoint(-2, -1, -1));\n",
       "obj18.userData.points.push(new PMPoint(-2, -1, 2));\n",
       "\n",
       "obj18.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj18.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj18.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj18.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj18.userData.facets = [[1, 0, 3, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj18.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj18);\n",
       "scene.add(obj18);\n",
       "\n",
       "var obj19 = new THREE.Object3D();\n",
       "obj19.name = \"unnamed__20\";\n",
       "obj19.userData.explodable = 1;\n",
       "obj19.userData.points = [];\n",
       "obj19.userData.points.push(new PMPoint(-1, 2, 0));\n",
       "obj19.userData.points.push(new PMPoint(-1, 0, 0));\n",
       "obj19.userData.points.push(new PMPoint(-1, 0, 2));\n",
       "obj19.userData.points.push(new PMPoint(-1, 2, 2));\n",
       "\n",
       "obj19.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj19.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj19.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj19.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj19.userData.facets = [[0, 3, 2, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj19.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj19);\n",
       "scene.add(obj19);\n",
       "\n",
       "var obj20 = new THREE.Object3D();\n",
       "obj20.name = \"unnamed__21\";\n",
       "obj20.userData.explodable = 1;\n",
       "obj20.userData.points = [];\n",
       "obj20.userData.points.push(new PMPoint(-1, 0, 0));\n",
       "obj20.userData.points.push(new PMPoint(-1, 2, 0));\n",
       "obj20.userData.points.push(new PMPoint(-2, 2, -1));\n",
       "obj20.userData.points.push(new PMPoint(-2, -1, -1));\n",
       "\n",
       "obj20.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj20.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj20.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj20.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj20.userData.facets = [[0, 1, 2, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj20.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj20);\n",
       "scene.add(obj20);\n",
       "\n",
       "var obj21 = new THREE.Object3D();\n",
       "obj21.name = \"unnamed__22\";\n",
       "obj21.userData.explodable = 1;\n",
       "obj21.userData.points = [];\n",
       "obj21.userData.points.push(new PMPoint(2, 1, 1));\n",
       "obj21.userData.points.push(new PMPoint(1, 1, 1));\n",
       "obj21.userData.points.push(new PMPoint(1, 2, 1));\n",
       "obj21.userData.points.push(new PMPoint(2, 2, 1));\n",
       "\n",
       "obj21.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj21.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj21.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj21.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj21.userData.facets = [[0, 3, 2, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj21.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj21);\n",
       "scene.add(obj21);\n",
       "\n",
       "var obj22 = new THREE.Object3D();\n",
       "obj22.name = \"unnamed__23\";\n",
       "obj22.userData.explodable = 1;\n",
       "obj22.userData.points = [];\n",
       "obj22.userData.points.push(new PMPoint(1, 2, 1));\n",
       "obj22.userData.points.push(new PMPoint(1, 1, 1));\n",
       "obj22.userData.points.push(new PMPoint(1, 1, 2));\n",
       "obj22.userData.points.push(new PMPoint(1, 2, 2));\n",
       "\n",
       "obj22.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj22.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj22.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj22.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj22.userData.facets = [[0, 3, 2, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj22.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj22);\n",
       "scene.add(obj22);\n",
       "\n",
       "var obj23 = new THREE.Object3D();\n",
       "obj23.name = \"unnamed__24\";\n",
       "obj23.userData.explodable = 1;\n",
       "obj23.userData.points = [];\n",
       "obj23.userData.points.push(new PMPoint(1, 1, 1));\n",
       "obj23.userData.points.push(new PMPoint(2, 1, 1));\n",
       "obj23.userData.points.push(new PMPoint(1, 1, 2));\n",
       "obj23.userData.points.push(new PMPoint(2, 1, 2));\n",
       "\n",
       "obj23.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj23.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj23.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj23.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj23.userData.facets = [[0, 2, 3, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj23.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj23);\n",
       "scene.add(obj23);\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "function textSpriteMaterial(message, parameters) {\n",
       "    if ( parameters === undefined ) parameters = {};\n",
       "    var fontface = \"Helvetica\";\n",
       "    var fontsize = parameters.hasOwnProperty(\"fontsize\") ? parameters[\"fontsize\"] : 15;\n",
       "    fontsize = fontsize*10;\n",
       "    var lines = message.split('\\\\n');\n",
       "    var size = 512;\n",
       "    for(var i = 0; i<lines.length; i++){\n",
       "        var tmp = lines[i].length;\n",
       "        while(tmp*fontsize > size){\n",
       "           fontsize--;\n",
       "        }\n",
       "    }\n",
       "    \n",
       "    var canvas = document.createElement('canvas');\n",
       "    canvas.width = size;\n",
       "    canvas.height = size;\n",
       "    var context = canvas.getContext('2d');\n",
       "    context.fillStyle = \"rgba(255, 255, 255, 0)\";\n",
       "    context.fill();\n",
       "    context.font = fontsize + \"px \" + fontface;\n",
       "    \n",
       "    // text color\n",
       "    context.fillStyle = \"rgba(0, 0, 0, 1.0)\";\n",
       "     for(var i = 0; i<lines.length; i++){\n",
       "        context.fillText(lines[i], size/2, size/2+i*fontsize);\n",
       "     }\n",
       "    \n",
       "    // canvas contents will be used for a texture\n",
       "    var texture = new THREE.Texture(canvas);\n",
       "    texture.needsUpdate = true;\n",
       "    \n",
       "    var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 });\n",
       "    return spriteMaterial;\n",
       "}\n",
       "\n",
       "\n",
       "// ---------------------- INITIALIZING OBJECTS--------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function init_object(obj) {\n",
       "    if (obj.userData.hasOwnProperty(\"pointmaterial\")) {\n",
       "        init_points(obj);\n",
       "        modelContains.points = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"pointlabels\")) {\n",
       "        init_pointlabels(obj);\n",
       "        modelContains.pointlabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgematerial\")) {\n",
       "        init_lines(obj);\n",
       "        modelContains.lines = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgelabels\")) {\n",
       "        init_edgelabels(obj);\n",
       "        modelContains.edgelabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"arrowstyle\")) {\n",
       "        init_arrowheads(obj);\n",
       "        modelContains.arrowheads = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"facetmaterial\")) {\n",
       "        init_faces(obj);\n",
       "        modelContains.faces = true;\n",
       "    }\n",
       "}\n",
       "\n",
       "function init_points(obj) {\n",
       "    var pointgroup = new THREE.Group();\n",
       "    pointgroup.name = \"points\";\n",
       "    var points = obj.userData.points;\n",
       "    var radii = obj.userData.pointradii;\n",
       "    var materials = obj.userData.pointmaterial;\n",
       "    var geometry,material;\n",
       "    if (!Array.isArray(radii)) {\n",
       "        geometry = new THREE.SphereBufferGeometry(radii);  \n",
       "    }\n",
       "    if (!Array.isArray(materials)) {\n",
       "        material = materials;\n",
       "    }\n",
       "    for (var i=0; i<points.length; i++) {\n",
       "        var point = points[i];\n",
       "        if (Array.isArray(radii)) {\n",
       "            if (radii[i] == 0) {\n",
       "                continue;\n",
       "            }\n",
       "            geometry = new THREE.SphereBufferGeometry(radii[i]);  \n",
       "        } \n",
       "        if (Array.isArray(materials)) {\n",
       "            material = materials[i];     \n",
       "        } \n",
       "        var sphere = new THREE.Mesh(geometry, material);\n",
       "        point.addSphere(sphere);\n",
       "        pointgroup.add(sphere);\n",
       "    }\n",
       "    obj.add(pointgroup);\n",
       "}\n",
       "\n",
       "function init_pointlabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var labels = obj.userData.pointlabels;\n",
       "    var pointlabels = new THREE.Group();\n",
       "    pointlabels.name = \"pointlabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(pointlabels);\n",
       "}\n",
       "\n",
       "function init_lines(obj) {\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var points = obj.userData.points;\n",
       "    var materials = obj.userData.edgematerial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 );\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position', bufattr);\n",
       "    if (Array.isArray(materials)) {     \n",
       "        for (var i=0; i<materials.length; i++) {\n",
       "            geometry.addGroup(2*i,2,i);\n",
       "        }\n",
       "    }\n",
       "    var lines = new THREE.LineSegments(geometry, materials);\n",
       "    lines.name = \"lines\";\n",
       "    obj.add(lines);\n",
       "    updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "function init_edgelabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var labels = obj.userData.edgelabels;\n",
       "    var edgelabels = new THREE.Group();\n",
       "    edgelabels.name = \"edgelabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            edgelabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(edgelabels);\n",
       "}\n",
       "\n",
       "function init_arrowheads(obj) {\n",
       "    var arrowheads = new THREE.Group();\n",
       "    arrowheads.name = \"arrowheads\";\n",
       "    var arrowstyle = obj.userData.arrowstyle;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var edgematerials = obj.userData.edgematerial;\n",
       "    var points = obj.userData.points;\n",
       "    var material;\n",
       "    if (!Array.isArray(edgematerials)) {\n",
       "        material = new THREE.MeshBasicMaterial( {color: edgematerials.color} );\n",
       "    }\n",
       "\n",
       "    for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "        var start = points[edgeindices[i]];\n",
       "        var end = points[edgeindices[i+1]];\n",
       "        var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius();\n",
       "        if (dist <= 0) {\n",
       "            continue;\n",
       "        }\n",
       "        var dir = new THREE.Vector3().subVectors(end.vector,start.vector);\n",
       "        dir.normalize();\n",
       "        var axis = new THREE.Vector3().set(dir.z,0,-dir.x);\n",
       "        axis.normalize();\n",
       "        var radians = Math.acos( dir.y );\n",
       "        var radius = dist/25;\n",
       "        var height = dist/5;\n",
       "        var geometry = new THREE.ConeBufferGeometry(radius,height);\n",
       "        var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2));\n",
       "        if (Array.isArray(edgematerials)) {\n",
       "            material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} );\n",
       "        }\n",
       "        var cone = new THREE.Mesh( geometry, material );\n",
       "        cone.quaternion.setFromAxisAngle(axis,radians);;\n",
       "        cone.position.copy(position);;\n",
       "        arrowheads.add(cone);\n",
       "    }\n",
       "    obj.add(arrowheads);\n",
       "}\n",
       "\n",
       "function init_faces(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var facets = obj.userData.facets;\n",
       "    obj.userData.triangleindices = [];\n",
       "    for (var i=0; i<facets.length; i++) {\n",
       "        facet = facets[i];\n",
       "        for (var t=0; t<facet.length-2; t++) {\n",
       "            obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]);  \n",
       "        }\n",
       "    }\n",
       "    var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute(bufarr,3);\n",
       "    \n",
       "    var materials = obj.userData.facetmaterial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position',bufattr);\n",
       "    if (Array.isArray(materials)) {\n",
       "        var tricount = 0;\n",
       "        var facet;\n",
       "        for (var i=0; i<facets.length; i++) {\n",
       "            facet = facets[i];\n",
       "            geometry.addGroup(tricount,(facet.length-2)*3,i);\n",
       "            tricount += (facet.length-2)*3;\n",
       "        }\n",
       "    }\n",
       "    var mesh = new THREE.Mesh(geometry, materials);\n",
       "    mesh.name = \"faces\";\n",
       "    obj.add(mesh); \n",
       "    updateFacesPosition(obj);\n",
       "}\n",
       "// //INITIALIZING\n",
       "\n",
       "\n",
       "function updateFacesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.triangleindices;\n",
       "    var faces = obj.getObjectByName(\"faces\");\n",
       "    var ba = faces.geometry.getAttribute(\"position\");\n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    faces.geometry.attributes.position.needsUpdate = true;\n",
       "    \n",
       "}\n",
       "\n",
       "function updateEdgesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.edgeindices;\n",
       "    var lines = obj.getObjectByName(\"lines\");\n",
       "    var ba = lines.geometry.getAttribute(\"position\"); \n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    lines.geometry.attributes.position.needsUpdate = true;\n",
       "}\n",
       "\n",
       "function onWindowResize() {\n",
       "    renderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    svgRenderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "function updateCamera() {\n",
       "    var width = three.clientWidth;\n",
       "    var height = three.clientHeight;\n",
       "    var aspect = width / height;\n",
       "    if (camera.type == \"OrthographicCamera\") {\n",
       "        camera.left = frustumSize * aspect / - 2;\n",
       "        camera.right = frustumSize * aspect / 2;\n",
       "        camera.top = frustumSize / 2;\n",
       "        camera.bottom = - frustumSize / 2;\n",
       "    } else if (camera.type == \"PerspectiveCamera\") {\n",
       "        camera.aspect = aspect;\n",
       "    }\n",
       "    camera.updateProjectionMatrix();\n",
       "}\n",
       "\n",
       "function changeCamera(event) {\n",
       "    var selindex = event.currentTarget.selectedIndex;\n",
       "    camera = cameras[selindex];\n",
       "    control = controls[selindex];\n",
       "    control.enabled = true; \n",
       "    for (var i=0; i<controls.length; i++) {\n",
       "        if (i!=selindex) {\n",
       "            controls[i].enabled = false;\n",
       "        }\n",
       "    }\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "var camtypenode = document.getElementById('cameraType_0');\n",
       "camtypenode.onchange = changeCamera;\n",
       "camtypenode.dispatchEvent(new Event('change'));\n",
       "\n",
       "onWindowResize();\n",
       "window.addEventListener('resize', onWindowResize);\t\n",
       "\n",
       "\n",
       "var xRotationEnabled = false;\n",
       "var yRotationEnabled = false;\n",
       "var zRotationEnabled = false;\n",
       "var rotationSpeedFactor = 1;\n",
       "var settingsShown = false;\n",
       "var labelsShown = true;\n",
       "var intervals = [];\n",
       "var timeouts = [];\n",
       "var explodingSpeed = 0.05;\n",
       "var explodeScale = 0;\n",
       "var XMLS = new XMLSerializer();\n",
       "var svgElement;\n",
       "var renderId;\n",
       "\n",
       "var render = function () {\n",
       "\n",
       "\trenderId = requestAnimationFrame(render);\n",
       "\n",
       "//\tcomment in for automatic explosion\n",
       "//\texplode(updateFactor());\n",
       "\n",
       "    var phi = 0.02 * rotationSpeedFactor;\n",
       "\n",
       "    if (xRotationEnabled) {\n",
       "        scene.rotation.x += phi;\n",
       "    }\n",
       "    if (yRotationEnabled) {\n",
       "        scene.rotation.y += phi;\n",
       "    }\n",
       "    if (zRotationEnabled) {\n",
       "        scene.rotation.z += phi;\n",
       "    }\n",
       "\n",
       "    control.update();\n",
       "    renderer.render(scene, camera);\n",
       "};\n",
       "\n",
       "if ( THREE.WEBGL.isWebGLAvailable() ) {\n",
       "\trender();\n",
       "} else {\n",
       "\tvar warning = WEBGL.getWebGLErrorMessage();\n",
       "\tthree.appendChild( warning );\n",
       "}\n",
       "    \n",
       "function changeTransparency() {\n",
       "    var opacity = 1-Number(event.currentTarget.value);\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        child = scene.children[i];\n",
       "        if ( child.userData.hasOwnProperty(\"facetmaterial\") ) {\n",
       "            if (Array.isArray(child.userData.facetmaterial)) {\n",
       "                for (var j=0; j<child.userData.facetmaterial.length; j++) {\n",
       "                    child.userData.facetmaterial[j].opacity = opacity;\n",
       "                }\n",
       "            } else {\n",
       "                child.userData.facetmaterial.opacity = opacity;\n",
       "            }    \n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function changeRotationX(event){\n",
       "    xRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationY(event){\n",
       "    yRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationZ(event){\n",
       "    zRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "\n",
       "function changeRotationSpeedFactor(event){\n",
       "    rotationSpeedFactor = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function resetScene(){\n",
       "    scene.rotation.set(0,0,0);\n",
       "    camera.position.set(0,0,5);\n",
       "    camera.up.set(0,1,0);\n",
       "}\n",
       "\n",
       "function showSettings(event){\n",
       "    document.getElementById('settings_0').style.visibility = 'visible';\n",
       "    document.getElementById('showSettingsButton_0').style.visibility = 'hidden';\n",
       "    document.getElementById('hideSettingsButton_0').style.visibility = 'visible';\n",
       "    settingsShown = true;\n",
       "}\n",
       "\n",
       "function hideSettings(event){\n",
       "    document.getElementById('settings_0').style.visibility = 'hidden';\n",
       "    document.getElementById('showSettingsButton_0').style.visibility = 'visible';\n",
       "    document.getElementById('hideSettingsButton_0').style.visibility = 'hidden';\n",
       "    settingsShown = false;\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "var pos = 150* Math.PI;\n",
       "\n",
       "function updateFactor() {\n",
       "    pos++;\n",
       "    return Math.sin(.01*pos)+1;\n",
       "}\n",
       "\n",
       "// ------------------------ FOLDING ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "// rotate point p around axis defined by points p1 and p2 by given angle\n",
       "function rotate(p, p1, p2, angle ){   \n",
       "    angle = -angle;\n",
       "    var x = p.x, y = p.y, z = p.z, \n",
       "    a = p1.x, b = p1.y, c = p1.z, \n",
       "    u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z;\n",
       "    var result = [];\n",
       "    var L = u*u + v*v + w*w;\n",
       "    var sqrt = Math.sqrt;\n",
       "    var cos = Math.cos;\n",
       "    var sin = Math.sin;\n",
       "\n",
       "    result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L;\n",
       "    result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L;\n",
       "    result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L;\n",
       "\n",
       "    return result;\n",
       "}\n",
       "\n",
       "var fold = function(event){\n",
       "    var obj = foldables[Number(event.currentTarget.name)];\n",
       "    var foldvalue = Number(event.currentTarget.value);\n",
       "    var scale = foldvalue - obj.userData.oldscale;\n",
       "\n",
       "    for (var j=0; j<obj.userData.axes.length; j++) {\n",
       "        rotateVertices(obj, j, scale);\n",
       "    }\n",
       "    update(obj);\n",
       "    obj.userData.oldscale += scale;\n",
       "    lookAtBarycenter(obj);\n",
       "}\n",
       "\n",
       "function lookAtBarycenter(obj){\n",
       "    control.target = barycenter(obj);\n",
       "}\n",
       "\n",
       "function barycenter(obj) {\n",
       "    var center = new THREE.Vector3(0,0,0);\n",
       "    var points = obj.userData.points;\n",
       "    for (var i=0; i<points.length; i++){\n",
       "        center.add(points[i].vector);\n",
       "    }\n",
       "    center.divideScalar(points.length);\n",
       "    return center;\n",
       "}\n",
       "\n",
       "function rotateVertices(obj, edge, scale) {\n",
       "    var axes = obj.userData.axes;\n",
       "    var subtrees = obj.userData.subtrees;\n",
       "    var points = obj.userData.points;\n",
       "    var angles = obj.userData.angles;\n",
       "    if (edge < axes.length){\n",
       "        for (var j=0; j<subtrees[edge].length; j++){\n",
       "            var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge]));\n",
       "            points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]);\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function update(obj) {\n",
       "   updateFacesPosition(obj);\n",
       "   updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "if (foldables.length) {\n",
       "    var settings = document.getElementById('settings_0');\n",
       "    var foldDiv = document.createElement('div');\n",
       "    foldDiv.id = 'fold_0';\n",
       "    var title = document.createElement('strong');\n",
       "    title.innerHTML = 'Fold';\n",
       "    foldDiv.appendChild(title);\n",
       "    foldDiv.className = 'group';\n",
       "    for (var i=0; i<foldables.length; i++) {\n",
       "        var range = document.createElement('input');\n",
       "        range.type = 'range';\n",
       "        range.min = 0;\n",
       "        range.max = 1;\n",
       "        range.value = 0;\n",
       "        range.step = 0.001;\n",
       "        range.name = String(i);\n",
       "        range.oninput = fold;\n",
       "        foldDiv.appendChild(range);\n",
       "    }\n",
       "    lookAtBarycenter(foldables[0]);\n",
       "    settings.insertBefore(foldDiv,settings.childNodes[0]);\n",
       "}\n",
       "\n",
       "    \n",
       "// ---------------------- EXPLOSION ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "if (explodableModel) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        obj = scene.children[i];\n",
       "        if ( obj.userData.explodable ) {\n",
       "            computeCentroid(obj);\n",
       "        }\n",
       "    }\n",
       "    document.getElementById('explodeRange_0').oninput = triggerExplode;\n",
       "    document.getElementById('explodeCheckbox_0').onchange = triggerAutomaticExplode;\n",
       "    document.getElementById('explodingSpeedRange_0').oninput = setExplodingSpeed;\n",
       "}\n",
       "\n",
       "function computeCentroid(obj) {\n",
       "    centroid = new THREE.Vector3();\n",
       "    obj.userData.points.forEach(function(pmpoint) {\n",
       "        centroid.add(pmpoint.vector);\t\t\t\n",
       "    });\n",
       "    centroid.divideScalar(obj.userData.points.length);\n",
       "    obj.userData.centroid = centroid;\n",
       "}\n",
       "\n",
       "function explode(factor) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        var obj = scene.children[i];\n",
       "        if (obj.userData.hasOwnProperty(\"centroid\")) { \n",
       "            var c = obj.userData.centroid;\n",
       "            obj.position.set(c.x*factor, c.y*factor, c.z*factor);\n",
       "        }\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function triggerExplode(event){\n",
       "    explodeScale = Number(event.currentTarget.value);\n",
       "    explode(explodeScale);\n",
       "}\n",
       "\n",
       "function setExplodingSpeed(event){\n",
       "    explodingSpeed = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function triggerAutomaticExplode(event){\n",
       "    if (event.currentTarget.checked){\n",
       "        startExploding();\n",
       "    } else {\n",
       "        clearIntervals();\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function startExploding(){\n",
       "    intervals.push(setInterval(explodingInterval, 25));\n",
       "}\n",
       "\n",
       "\n",
       "function explodingInterval(){\n",
       "    explodeScale += explodingSpeed;\n",
       "    if (explodeScale <= 6){ \n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else{\n",
       "        explode(6);\n",
       "        explodeScale = 6;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startUnexploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_0').value = explodeScale;\n",
       "}\n",
       "\n",
       "\n",
       "function startUnexploding(){\n",
       "    intervals.push(setInterval(unexplodingInterval, 25));\n",
       "}\n",
       "\n",
       "function unexplodingInterval(){\n",
       "    explodeScale -= explodingSpeed;\n",
       "    if (explodeScale >= 0){\t\n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else {\n",
       "        explode(0);\n",
       "        explodeScale = 0;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startExploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_0').value = explodeScale;\n",
       "}\n",
       "\n",
       "function clearIntervals(){\n",
       "    intervals.forEach(function(interval){\n",
       "        clearInterval(interval);\n",
       "    });\n",
       "    intervals = [];\n",
       "    timeouts.forEach(function(timeout){\n",
       "        clearTimeout(timeout);\n",
       "    });\n",
       "    timeouts = [];\n",
       "}\n",
       "\n",
       "// ---------------------- DISPLAY --------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "const objectTypeInnerHTMLs = { points: \"Points\", pointlabels: \"Point labels\", lines: \"Edges\", edgelabels: \"Edge labels\", faces: \"Faces\", arrowheads: \"Arrow heads\" };\n",
       "const objectTypeVisible = {};\n",
       "Object.assign(objectTypeVisible,modelContains);\n",
       "const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort();\n",
       "const shownObjectTypesList = document.getElementById('shownObjectTypesList_0');\n",
       "\n",
       "function setVisibility(bool,objname) {\n",
       "    for (var i=0; i<scene.children.length; i++){\n",
       "        var obj = scene.children[i].getObjectByName(objname);\n",
       "        if (obj) {\n",
       "            obj.visible = bool;\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function toggleObjectTypeVisibility(event){\n",
       "    var name = event.currentTarget.name;\n",
       "    var checked = event.currentTarget.checked;\n",
       "    objectTypeVisible[name] = checked;\n",
       "    setVisibility(checked,name);\n",
       "}\n",
       "\n",
       "for (var i=0; i<sortedObjectTypeKeys.length; i++){\n",
       "    var key = sortedObjectTypeKeys[i];\n",
       "    if (modelContains[key]) {\n",
       "        var objTypeNode = document.createElement('span');\n",
       "        objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>';\n",
       "        var checkbox = document.createElement('input');\n",
       "        checkbox.type = 'checkbox';\n",
       "        checkbox.checked = true;\n",
       "        checkbox.name = key;\n",
       "        checkbox.onchange = toggleObjectTypeVisibility;\n",
       "        shownObjectTypesList.appendChild(checkbox);\n",
       "        shownObjectTypesList.appendChild(objTypeNode);\n",
       "    }\n",
       "}\n",
       "\n",
       "// ------------------------------------------------------\n",
       "\n",
       "function toggleObjectVisibility(event){\n",
       "    var nr = Number(event.currentTarget.name);\n",
       "    scene.children[nr].visible = event.currentTarget.checked;\n",
       "}\n",
       "\n",
       "// append checkboxes for displaying or hiding objects\n",
       "var shownObjectsList = document.getElementById('shownObjectsList_0');\n",
       "for (var i=0; i<scene.children.length; i++){\n",
       "    obj = scene.children[i];\n",
       "    var objNode = document.createElement('span');\n",
       "    objNode.innerHTML = obj.name + '<br>';\n",
       "    var checkbox = document.createElement('input');\n",
       "    checkbox.type = 'checkbox';\n",
       "    checkbox.checked = true;\n",
       "    checkbox.name = String(i);\n",
       "    checkbox.onchange = toggleObjectVisibility;\n",
       "    shownObjectsList.appendChild(checkbox);\n",
       "    shownObjectsList.appendChild(objNode);\n",
       "}\n",
       "\n",
       "// ---------------------- SVG ------------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function takeSvgScreenshot() {\n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(false,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(false,\"edgelabels\");\n",
       "    }\n",
       "    svgRenderer.render(scene,camera);\n",
       "    svgElement = XMLS.serializeToString(svgRenderer.domElement);\n",
       "    \n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(true,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(true,\"edgelabels\");\n",
       "    }\n",
       "\n",
       "    if (document.getElementById('tab_0').checked){\n",
       "        //show in new tab\n",
       "        var myWindow = window.open(\"\",\"\");\n",
       "        myWindow.document.body.innerHTML = svgElement;\n",
       "    } else{\n",
       "        // download svg file \n",
       "        download(\"screenshot.svg\", svgElement);\n",
       "    }\n",
       "}\n",
       "\n",
       "function download(filename, text) {\n",
       "    var element = document.createElement('a');\n",
       "    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));\n",
       "    element.setAttribute('download', filename);\n",
       "\n",
       "    element.style.display = 'none';\n",
       "    document.body.appendChild(element);\n",
       "\n",
       "    element.click();\n",
       "\n",
       "    document.body.removeChild(element);\n",
       "}\n",
       "\n",
       "\n",
       "document.getElementById('transparencyRange_0').oninput = changeTransparency;\n",
       "document.getElementById('changeRotationX_0').onchange = changeRotationX;\n",
       "document.getElementById('changeRotationY_0').onchange = changeRotationY;\n",
       "document.getElementById('changeRotationZ_0').onchange = changeRotationZ;\n",
       "document.getElementById('resetButton_0').onclick = resetScene;\n",
       "document.getElementById('rotationSpeedRange_0').oninput = changeRotationSpeedFactor;\n",
       "document.getElementById('takeScreenshot_0').onclick = takeSvgScreenshot;\n",
       "document.getElementById('showSettingsButton_0').onclick = showSettings;\n",
       "document.getElementById('hideSettingsButton_0').onclick = hideSettings;\n",
       "\n",
       "\n",
       "// ------------------ SHORTCUTS --------------------------------------------\n",
       "// -------------------------------------------------------------------------\n",
       "\n",
       "/**\n",
       " * http://www.openjs.com/scripts/events/keyboard_shortcuts/\n",
       " * Version : 2.01.B\n",
       " * By Binny V A\n",
       " * License : BSD\n",
       " */\n",
       "shortcut = {\n",
       "\t'all_shortcuts':{},//All the shortcuts are stored in this array\n",
       "\t'add': function(shortcut_combination,callback,opt) {\n",
       "\t\t//Provide a set of default options\n",
       "\t\tvar default_options = {\n",
       "\t\t\t'type':'keydown',\n",
       "\t\t\t'propagate':false,\n",
       "\t\t\t'disable_in_input':false,\n",
       "\t\t\t'target':document,\n",
       "\t\t\t'keycode':false\n",
       "\t\t}\n",
       "\t\tif(!opt) opt = default_options;\n",
       "\t\telse {\n",
       "\t\t\tfor(var dfo in default_options) {\n",
       "\t\t\t\tif(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\n",
       "\t\tvar ele = opt.target;\n",
       "\t\tif(typeof opt.target == 'string') ele = document.getElementById(opt.target);\n",
       "\t\tvar ths = this;\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\n",
       "\t\t//The function to be called at keypress\n",
       "\t\tvar func = function(e) {\n",
       "\t\t\te = e || window.event;\n",
       "\t\t\t\n",
       "\t\t\tif(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields\n",
       "\t\t\t\tvar element;\n",
       "\t\t\t\tif(e.target) element=e.target;\n",
       "\t\t\t\telse if(e.srcElement) element=e.srcElement;\n",
       "\t\t\t\tif(element.nodeType==3) element=element.parentNode;\n",
       "\n",
       "\t\t\t\tif(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\t//Find Which key is pressed\n",
       "\t\t\tif (e.keyCode) code = e.keyCode;\n",
       "\t\t\telse if (e.which) code = e.which;\n",
       "\t\t\tvar character = String.fromCharCode(code).toLowerCase();\n",
       "\t\t\t\n",
       "\t\t\tif(code == 188) character=\",\"; //If the user presses , when the type is onkeydown\n",
       "\t\t\tif(code == 190) character=\".\"; //If the user presses , when the type is onkeydown\n",
       "\n",
       "\t\t\tvar keys = shortcut_combination.split(\"+\");\n",
       "\t\t\t//Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked\n",
       "\t\t\tvar kp = 0;\n",
       "\t\t\t\n",
       "\t\t\t//Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken\n",
       "\t\t\tvar shift_nums = {\n",
       "\t\t\t\t\"`\":\"~\",\n",
       "\t\t\t\t\"1\":\"!\",\n",
       "\t\t\t\t\"2\":\"@\",\n",
       "\t\t\t\t\"3\":\"#\",\n",
       "\t\t\t\t\"4\":\"$\",\n",
       "\t\t\t\t\"5\":\"%\",\n",
       "\t\t\t\t\"6\":\"^\",\n",
       "\t\t\t\t\"7\":\"&\",\n",
       "\t\t\t\t\"8\":\"*\",\n",
       "\t\t\t\t\"9\":\"(\",\n",
       "\t\t\t\t\"0\":\")\",\n",
       "\t\t\t\t\"-\":\"_\",\n",
       "\t\t\t\t\"=\":\"+\",\n",
       "\t\t\t\t\";\":\":\",\n",
       "\t\t\t\t\"'\":\"\\\"\",\n",
       "\t\t\t\t\",\":\"<\",\n",
       "\t\t\t\t\".\":\">\",\n",
       "\t\t\t\t\"/\":\"?\",\n",
       "\t\t\t\t\"\\\\\":\"|\"\n",
       "\t\t\t}\n",
       "\t\t\t//Special Keys - and their codes\n",
       "\t\t\tvar special_keys = {\n",
       "\t\t\t\t'esc':27,\n",
       "\t\t\t\t'escape':27,\n",
       "\t\t\t\t'tab':9,\n",
       "\t\t\t\t'space':32,\n",
       "\t\t\t\t'return':13,\n",
       "\t\t\t\t'enter':13,\n",
       "\t\t\t\t'backspace':8,\n",
       "\t\n",
       "\t\t\t\t'scrolllock':145,\n",
       "\t\t\t\t'scroll_lock':145,\n",
       "\t\t\t\t'scroll':145,\n",
       "\t\t\t\t'capslock':20,\n",
       "\t\t\t\t'caps_lock':20,\n",
       "\t\t\t\t'caps':20,\n",
       "\t\t\t\t'numlock':144,\n",
       "\t\t\t\t'num_lock':144,\n",
       "\t\t\t\t'num':144,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pause':19,\n",
       "\t\t\t\t'break':19,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'insert':45,\n",
       "\t\t\t\t'home':36,\n",
       "\t\t\t\t'delete':46,\n",
       "\t\t\t\t'end':35,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pageup':33,\n",
       "\t\t\t\t'page_up':33,\n",
       "\t\t\t\t'pu':33,\n",
       "\t\n",
       "\t\t\t\t'pagedown':34,\n",
       "\t\t\t\t'page_down':34,\n",
       "\t\t\t\t'pd':34,\n",
       "\t\n",
       "\t\t\t\t'left':37,\n",
       "\t\t\t\t'up':38,\n",
       "\t\t\t\t'right':39,\n",
       "\t\t\t\t'down':40,\n",
       "\t\n",
       "\t\t\t\t'f1':112,\n",
       "\t\t\t\t'f2':113,\n",
       "\t\t\t\t'f3':114,\n",
       "\t\t\t\t'f4':115,\n",
       "\t\t\t\t'f5':116,\n",
       "\t\t\t\t'f6':117,\n",
       "\t\t\t\t'f7':118,\n",
       "\t\t\t\t'f8':119,\n",
       "\t\t\t\t'f9':120,\n",
       "\t\t\t\t'f10':121,\n",
       "\t\t\t\t'f11':122,\n",
       "\t\t\t\t'f12':123\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\tvar modifiers = { \n",
       "\t\t\t\tshift: { wanted:false, pressed:false},\n",
       "\t\t\t\tctrl : { wanted:false, pressed:false},\n",
       "\t\t\t\talt  : { wanted:false, pressed:false},\n",
       "\t\t\t\tmeta : { wanted:false, pressed:false}\t//Meta is Mac specific\n",
       "\t\t\t};\n",
       "                        \n",
       "\t\t\tif(e.ctrlKey)\tmodifiers.ctrl.pressed = true;\n",
       "\t\t\tif(e.shiftKey)\tmodifiers.shift.pressed = true;\n",
       "\t\t\tif(e.altKey)\tmodifiers.alt.pressed = true;\n",
       "\t\t\tif(e.metaKey)   modifiers.meta.pressed = true;\n",
       "                        \n",
       "\t\t\tfor(var i=0; k=keys[i],i<keys.length; i++) {\n",
       "\t\t\t\t//Modifiers\n",
       "\t\t\t\tif(k == 'ctrl' || k == 'control') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.ctrl.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'shift') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.shift.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'alt') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.alt.wanted = true;\n",
       "\t\t\t\t} else if(k == 'meta') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.meta.wanted = true;\n",
       "\t\t\t\t} else if(k.length > 1) { //If it is a special key\n",
       "\t\t\t\t\tif(special_keys[k] == code) kp++;\n",
       "\t\t\t\t\t\n",
       "\t\t\t\t} else if(opt['keycode']) {\n",
       "\t\t\t\t\tif(opt['keycode'] == code) kp++;\n",
       "\n",
       "\t\t\t\t} else { //The special keys did not match\n",
       "\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\telse {\n",
       "\t\t\t\t\t\tif(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase\n",
       "\t\t\t\t\t\t\tcharacter = shift_nums[character]; \n",
       "\t\t\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\t\t}\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t\t\n",
       "\t\t\tif(kp == keys.length && \n",
       "\t\t\t\t\t\tmodifiers.ctrl.pressed == modifiers.ctrl.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.shift.pressed == modifiers.shift.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.alt.pressed == modifiers.alt.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.meta.pressed == modifiers.meta.wanted) {\n",
       "\t\t\t\tcallback(e);\n",
       "\t\n",
       "\t\t\t\tif(!opt['propagate']) { //Stop the event\n",
       "\t\t\t\t\t//e.cancelBubble is supported by IE - this will kill the bubbling process.\n",
       "\t\t\t\t\te.cancelBubble = true;\n",
       "\t\t\t\t\te.returnValue = false;\n",
       "\t\n",
       "\t\t\t\t\t//e.stopPropagation works in Firefox.\n",
       "\t\t\t\t\tif (e.stopPropagation) {\n",
       "\t\t\t\t\t\te.stopPropagation();\n",
       "\t\t\t\t\t\te.preventDefault();\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t\treturn false;\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\t\tthis.all_shortcuts[shortcut_combination] = {\n",
       "\t\t\t'callback':func, \n",
       "\t\t\t'target':ele, \n",
       "\t\t\t'event': opt['type']\n",
       "\t\t};\n",
       "\t\t//Attach the function with the event\n",
       "\t\tif(ele.addEventListener) ele.addEventListener(opt['type'], func, false);\n",
       "\t\telse if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);\n",
       "\t\telse ele['on'+opt['type']] = func;\n",
       "\t},\n",
       "\n",
       "\t//Remove the shortcut - just specify the shortcut and I will remove the binding\n",
       "\t'remove':function(shortcut_combination) {\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\t\tvar binding = this.all_shortcuts[shortcut_combination];\n",
       "\t\tdelete(this.all_shortcuts[shortcut_combination])\n",
       "\t\tif(!binding) return;\n",
       "\t\tvar type = binding['event'];\n",
       "\t\tvar ele = binding['target'];\n",
       "\t\tvar callback = binding['callback'];\n",
       "\n",
       "\t\tif(ele.detachEvent) ele.detachEvent('on'+type, callback);\n",
       "\t\telse if(ele.removeEventListener) ele.removeEventListener(type, callback, false);\n",
       "\t\telse ele['on'+type] = false;\n",
       "\t}\n",
       "}\n",
       "\n",
       "shortcut.add(\"Alt+Left\",function() {\n",
       "\tvar event = new Event('click');\n",
       "\tif (settingsShown){\n",
       "\t\tdocument.getElementById('hideSettingsButton_0').dispatchEvent(event);\n",
       "\t} else {\n",
       "\t\tdocument.getElementById('showSettingsButton_0').dispatchEvent(event);\n",
       "\t}\n",
       "});\n",
       "\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "});});\n",
       "      </script>\n",
       "   </body>\n",
       "</html>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<details><summary><pre style=\"display:inline\"><small>Click here for additional output</small></pre></summary>\n",
       "<pre>\n",
       "polymake: used package atint\n",
       "  [[wiki:external_software#a-tint]] is an extension for tropical intersection theory.\n",
       "  (C) 2011 - 2015 Simon Hampe, simon.hampe@googlemail.com\n",
       "  See also: https://github.com/simonhampe/atint \n",
       "polymake: used package cdd\n",
       "  cddlib\n",
       "  Implementation of the double description method of Motzkin et al.\n",
       "  Copyright by Komei Fukuda.\n",
       "  http://www-oldurls.inf.ethz.ch/personal/fukudak/cdd_home/\n",
       "\n",
       "polymake: used package threejs\n",
       "   Three.js is a lightweight cross-browser JavaScript library/API used to create and display animated 3D computer graphics on a Web browser.\n",
       "   See http://github.com/mrdoob for the source code.\n",
       "\n",
       "</pre>\n",
       "</details>\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "$quadric = toTropicalPolynomial(\"min(1+2*w, 1+2*x, 1+2*y, 1+2*z, w+x, w+y, w+z, x+y, x+z, y+z)\", qw( w x y z ));\n",
    "$TQuadric = new Hypersurface<Min>(POLYNOMIAL=>$quadric);\n",
    "$TQuadric->VISUAL;"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Alternatively, one can specify the polynomial through an exponent matrix and a coefficient vector."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<!--\n",
       "polymake for knusper\n",
       "Thu Aug 27 10:34:29 2020\n",
       "TQuadric\n",
       "-->\n",
       "\n",
       "\n",
       "<html>\n",
       "   <head>\n",
       "      <meta charset=utf-8>\n",
       "      <title>TQuadric</title>\n",
       "      <style>\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "*/\n",
       "         html {overflow: scroll;}\n",
       "         strong{font-size: 18px;}\n",
       "         canvas { z-index: 8; }\n",
       "         input[type='radio'] {margin-left:0;}\n",
       "         input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;}\n",
       "         .group{padding-bottom: 15px;}\n",
       "         .settings * {z-index: 11; }\n",
       "         .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;}\n",
       "         .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} \n",
       "         .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;}\n",
       "         .showSettingsButton{visibility: visible; z-index: 12; position: absolute }\n",
       "         .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5}\n",
       "         button{margin-left: 0; margin-top: 10px}\n",
       "         img{cursor: pointer;}\n",
       "         .suboption{padding-top: 15px;}\n",
       "         #model75900328540 { width: 100%; height: 100%; }\n",
       "         .threejs_container { width: 100%; height: 75vh;}\n",
       "         .settings{max-height: 74vh} \n",
       "         input[type=range] {\n",
       "           -webkit-appearance: none;\n",
       "           padding:0; \n",
       "           width:90%; \n",
       "           margin-left: auto;\n",
       "           margin-right: auto;\n",
       "           margin-top: 15px;\n",
       "           margin-bottom: 15px;\n",
       "           display: block;\t\n",
       "         }\n",
       "         input[type=range]:focus {\n",
       "           outline: none;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-runnable-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "           -webkit-appearance: none;\n",
       "           margin-top: -5px;\n",
       "         }\n",
       "         input[type=range]:focus::-webkit-slider-runnable-track {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]::-moz-range-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-moz-range-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]::-ms-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           background: transparent;\n",
       "           border-color: transparent;\n",
       "           color: transparent;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_END\n",
       "*/\n",
       "\t\t</style>\n",
       "   </head>\n",
       "<body>\n",
       "   <div class='threejs_container'>\n",
       "\t\t<div id='settings_1' class='settings'>\n",
       "\t\t\t<div class=group id='explode_1'>\n",
       "\t\t\t\t<strong>Explode</strong>\n",
       "\t\t\t\t<input id='explodeRange_1' type='range' min=0 max=6 step=0.01 value=0>\n",
       "\t\t\t\t<div class=indented><input id='explodeCheckbox_1' type='checkbox'>Automatic explosion</div>\n",
       "\t\t\t\t<div class=suboption>Exploding speed</div>\n",
       "\t\t\t\t<input id='explodingSpeedRange_1' type='range' min=0 max=0.5 step=0.001 value=0.05>\n",
       "\t\t\t</div>\n",
       "\t\n",
       "\t\t\t<div class=group id='transparency_1' class='transparency'>\n",
       "\t\t\t\t<strong>Transparency</strong>\n",
       "\t\t\t\t<input id='transparencyRange_1' type='range' min=0 max=1 step=0.01 value=0>\n",
       "\t\t\t</div>\n",
       "\t\t\t\n",
       "\t\t\t<div class=group id='rotation_1'>\n",
       "\t\t\t\t<strong>Rotation</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationX_1'> x-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationY_1'> y-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationZ_1'> z-axis</div>\n",
       "\t\t\t\t\t<button id='resetButton_1'>Reset</button>\n",
       "\t\t\t\t</div>\n",
       "\n",
       "\t\t\t\t<div class=suboption>Rotation speed</div>\n",
       "\t\t\t\t<input id='rotationSpeedRange_1' type='range' min=0 max=5 step=0.01 value=2>\n",
       "\t\t\t</div>\n",
       "\n",
       "\n",
       "\t\t\t<div class=group id='display_1'>\n",
       "\t\t\t\t<strong>Display</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div id='shownObjectTypesList_1' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t\t<div class=suboption>Objects</div>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t   <div id='shownObjectsList_1' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "         \n",
       "         <div class=group id='camera_1'>\n",
       "            <strong>Camera</strong>\n",
       "            <div class=indented>\n",
       "               <form>\n",
       "                  <select id=\"cameraType_1\">\n",
       "                     <option value='perspective' selected> Perspective<br></option>\n",
       "                     <option value='orthographic' > Orthographic<br></option>\n",
       "                  </select>\n",
       "               </form>\n",
       "            </div>\n",
       "         </div>\n",
       "\n",
       "\t\t\t<div class=group id='svg_1'>\n",
       "\t\t\t\t<strong>SVG</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<form>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='download' id='download_1' checked> Download<br>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='tab' id='tab_1' > New tab<br>\n",
       "\t\t\t\t\t</form>\n",
       "\t\t\t\t\t<button id='takeScreenshot_1'>Screenshot</button>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "\n",
       "\t\t</div>\t<!-- end of settings -->\n",
       "\t\t<img id='hideSettingsButton_1' class='hideSettingsButton' src='/kernelspecs/polymake/close.svg' width=20px\">\n",
       "\t\t<img id='showSettingsButton_1' class='showSettingsButton' src='/kernelspecs/polymake/menu.svg' width=20px\">\n",
       "<div id=\"model75900328540\"></div>\n",
       "</div>\n",
       "   <script>\n",
       "    requirejs.config({\n",
       "      paths: {\n",
       "        three: '/kernelspecs/polymake/three',\n",
       "        TrackballControls: '/kernelspecs/polymake/TrackballControls',\n",
       "        OrbitControls: '/kernelspecs/polymake/OrbitControls',\n",
       "        Projector: '/kernelspecs/polymake/Projector',\n",
       "        SVGRenderer: '/kernelspecs/polymake/SVGRenderer',\n",
       "        WEBGL: '/kernelspecs/polymake/WebGL',\n",
       "      },\n",
       "      shim: {\n",
       "        'three': { exports: 'THREE'},\n",
       "        'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' },\n",
       "        'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' },\n",
       "        'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' },\n",
       "        'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' },\n",
       "        'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' },\n",
       "      }\n",
       "    });\n",
       "    \n",
       "    require(['three'],function(THREE){\n",
       "        window.THREE = THREE;\n",
       "      require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'],\n",
       "               function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) {\n",
       "    THREE.TrackballControls = TrackballControls;\n",
       "    THREE.OrbitControls = OrbitControls;\n",
       "    THREE.Projector = Projector;\n",
       "    THREE.SVGRenderer = SVGRenderer;\n",
       "    THREE.WEBGL = WEBGL;\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "\n",
       "const intervalLength = 25; // for automatic animations\n",
       "const explodableModel = true; \n",
       "const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false };\n",
       "const foldables = [];\n",
       "\n",
       "var three = document.getElementById(\"model75900328540\");\n",
       "var scene = new THREE.Scene();\n",
       "var renderer = new THREE.WebGLRenderer( { antialias: true } );\n",
       "var svgRenderer = new THREE.SVGRenderer( { antialias: true } );\n",
       "renderer.setPixelRatio( window.devicePixelRatio );\n",
       "renderer.setClearColor(0xFFFFFF, 1);\n",
       "svgRenderer.setClearColor(0xFFFFFF, 1);\n",
       "three.appendChild(renderer.domElement);\n",
       "\n",
       "var frustumSize = 4;\n",
       "var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()];\n",
       "cameras.forEach(function(cam) {\n",
       "    cam.position.set(0, 0, 5);\n",
       "    cam.lookAt(0, 0, 0);  \n",
       "    cam.up.set(0, 1, 0);         \n",
       "});\n",
       "var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)];\n",
       "var camera, control;\n",
       "\n",
       "controls[0].zoomSpeed = 0.2;\n",
       "controls[0].rotateSpeed = 4;\n",
       "\n",
       "\n",
       "// class to allow move points together with labels and spheres\n",
       "var PMPoint = function (x,y,z) {\n",
       "   this.vector = new THREE.Vector3(x,y,z);\n",
       "   this.sprite = null;\n",
       "   this.sphere = null;\n",
       "}\n",
       "PMPoint.prototype.addLabel = function(labelsprite) {\n",
       "   this.sprite = labelsprite;\n",
       "   this.sprite.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.addSphere = function(spheremesh) {\n",
       "   this.sphere = spheremesh;\n",
       "   this.sphere.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.set = function(x,y,z) {\n",
       "   this.vector.set(x,y,z);\n",
       "   if (this.sprite) {\n",
       "      this.sprite.position.copy(this.vector);\n",
       "   }\n",
       "   if (this.sphere) {\n",
       "      this.sphere.position.copy(this.vector);\n",
       "   }\n",
       "}\n",
       "PMPoint.prototype.radius = function() {\n",
       "   if (this.sphere) {\n",
       "      return this.sphere.geometry.parameters.radius;\n",
       "   } else {\n",
       "      return 0;\n",
       "   }\n",
       "};\n",
       "// select the target node\n",
       "var target = document.querySelector('#model75900328540');\n",
       "\n",
       "// create an observer instance\n",
       "var observer = new MutationObserver(function(mutations) {\n",
       "   mutations.forEach(function(mutation) {\n",
       "      if (mutation.removedNodes && mutation.removedNodes.length > 0) {\n",
       "         cancelAnimationFrame(renderId);\n",
       "         observer.disconnect();\n",
       "         console.log(\"cancelled frame \"+renderId);\n",
       "      }\n",
       "   });\n",
       "});\n",
       "\n",
       "// configuration of the observer:\n",
       "var config = { childList: true, characterData: true }\n",
       "\n",
       "// pass in the target node, as well as the observer options\n",
       "while (target) {\n",
       "   if (target.className==\"output\") {\n",
       "      observer.observe(target, config);\n",
       "      break;\n",
       "   }\n",
       "   target = target.parentNode;\n",
       "}\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "var obj0 = new THREE.Object3D();\n",
       "obj0.name = \"unnamed__1\";\n",
       "obj0.userData.explodable = 1;\n",
       "obj0.userData.points = [];\n",
       "obj0.userData.points.push(new PMPoint(1, 2, 1));\n",
       "obj0.userData.points.push(new PMPoint(1, 1, 1));\n",
       "obj0.userData.points.push(new PMPoint(1, 1, 2));\n",
       "obj0.userData.points.push(new PMPoint(1, 2, 2));\n",
       "\n",
       "obj0.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj0.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj0.userData.facets = [[0, 3, 2, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj0.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj0);\n",
       "scene.add(obj0);\n",
       "\n",
       "var obj1 = new THREE.Object3D();\n",
       "obj1.name = \"unnamed__2\";\n",
       "obj1.userData.explodable = 1;\n",
       "obj1.userData.points = [];\n",
       "obj1.userData.points.push(new PMPoint(-1, 2, 0));\n",
       "obj1.userData.points.push(new PMPoint(-1, 0, 0));\n",
       "obj1.userData.points.push(new PMPoint(-1, 0, 2));\n",
       "obj1.userData.points.push(new PMPoint(-1, 2, 2));\n",
       "\n",
       "obj1.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj1.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj1.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj1.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj1.userData.facets = [[0, 3, 2, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj1.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj1);\n",
       "scene.add(obj1);\n",
       "\n",
       "var obj2 = new THREE.Object3D();\n",
       "obj2.name = \"unnamed__3\";\n",
       "obj2.userData.explodable = 1;\n",
       "obj2.userData.points = [];\n",
       "obj2.userData.points.push(new PMPoint(1, 1, 1));\n",
       "obj2.userData.points.push(new PMPoint(2, 1, 1));\n",
       "obj2.userData.points.push(new PMPoint(1, 1, 2));\n",
       "obj2.userData.points.push(new PMPoint(2, 1, 2));\n",
       "\n",
       "obj2.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj2.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj2.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj2.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj2.userData.facets = [[0, 2, 3, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj2.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj2);\n",
       "scene.add(obj2);\n",
       "\n",
       "var obj3 = new THREE.Object3D();\n",
       "obj3.name = \"unnamed__4\";\n",
       "obj3.userData.explodable = 1;\n",
       "obj3.userData.points = [];\n",
       "obj3.userData.points.push(new PMPoint(0, -1, 0));\n",
       "obj3.userData.points.push(new PMPoint(2, -1, 0));\n",
       "obj3.userData.points.push(new PMPoint(0, -1, 2));\n",
       "obj3.userData.points.push(new PMPoint(2, -1, 2));\n",
       "\n",
       "obj3.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj3.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj3.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj3.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj3.userData.facets = [[0, 2, 3, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj3.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj3);\n",
       "scene.add(obj3);\n",
       "\n",
       "var obj4 = new THREE.Object3D();\n",
       "obj4.name = \"unnamed__5\";\n",
       "obj4.userData.explodable = 1;\n",
       "obj4.userData.points = [];\n",
       "obj4.userData.points.push(new PMPoint(0, 0, 0));\n",
       "obj4.userData.points.push(new PMPoint(1, 1, 1));\n",
       "obj4.userData.points.push(new PMPoint(0, 0, 2));\n",
       "obj4.userData.points.push(new PMPoint(1, 1, 2));\n",
       "\n",
       "obj4.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj4.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj4.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj4.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj4.userData.facets = [[0, 2, 3, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj4.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj4);\n",
       "scene.add(obj4);\n",
       "\n",
       "var obj5 = new THREE.Object3D();\n",
       "obj5.name = \"unnamed__6\";\n",
       "obj5.userData.explodable = 1;\n",
       "obj5.userData.points = [];\n",
       "obj5.userData.points.push(new PMPoint(2, 1, 1));\n",
       "obj5.userData.points.push(new PMPoint(1, 1, 1));\n",
       "obj5.userData.points.push(new PMPoint(1, 2, 1));\n",
       "obj5.userData.points.push(new PMPoint(2, 2, 1));\n",
       "\n",
       "obj5.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj5.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj5.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj5.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj5.userData.facets = [[0, 3, 2, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj5.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj5);\n",
       "scene.add(obj5);\n",
       "\n",
       "var obj6 = new THREE.Object3D();\n",
       "obj6.name = \"unnamed__7\";\n",
       "obj6.userData.explodable = 1;\n",
       "obj6.userData.points = [];\n",
       "obj6.userData.points.push(new PMPoint(2, 0, -1));\n",
       "obj6.userData.points.push(new PMPoint(0, 0, -1));\n",
       "obj6.userData.points.push(new PMPoint(0, 2, -1));\n",
       "obj6.userData.points.push(new PMPoint(2, 2, -1));\n",
       "\n",
       "obj6.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj6.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj6.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj6.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj6.userData.facets = [[0, 3, 2, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj6.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj6);\n",
       "scene.add(obj6);\n",
       "\n",
       "var obj7 = new THREE.Object3D();\n",
       "obj7.name = \"unnamed__8\";\n",
       "obj7.userData.explodable = 1;\n",
       "obj7.userData.points = [];\n",
       "obj7.userData.points.push(new PMPoint(1, 1, 1));\n",
       "obj7.userData.points.push(new PMPoint(0, 0, 0));\n",
       "obj7.userData.points.push(new PMPoint(0, 2, 0));\n",
       "obj7.userData.points.push(new PMPoint(1, 2, 1));\n",
       "\n",
       "obj7.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj7.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj7.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj7.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj7.userData.facets = [[0, 3, 2, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj7.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj7);\n",
       "scene.add(obj7);\n",
       "\n",
       "var obj8 = new THREE.Object3D();\n",
       "obj8.name = \"unnamed__9\";\n",
       "obj8.userData.explodable = 1;\n",
       "obj8.userData.points = [];\n",
       "obj8.userData.points.push(new PMPoint(0, 0, 0));\n",
       "obj8.userData.points.push(new PMPoint(1, 1, 1));\n",
       "obj8.userData.points.push(new PMPoint(2, 0, 0));\n",
       "obj8.userData.points.push(new PMPoint(2, 1, 1));\n",
       "\n",
       "obj8.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj8.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj8.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj8.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj8.userData.facets = [[0, 2, 3, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj8.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj8);\n",
       "scene.add(obj8);\n",
       "\n",
       "var obj9 = new THREE.Object3D();\n",
       "obj9.name = \"unnamed__10\";\n",
       "obj9.userData.explodable = 1;\n",
       "obj9.userData.points = [];\n",
       "obj9.userData.points.push(new PMPoint(-1, 0, 2));\n",
       "obj9.userData.points.push(new PMPoint(-1, 0, 0));\n",
       "obj9.userData.points.push(new PMPoint(-2, -1, -1));\n",
       "obj9.userData.points.push(new PMPoint(-2, -1, 2));\n",
       "\n",
       "obj9.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj9.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj9.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj9.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj9.userData.facets = [[1, 0, 3, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj9.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj9);\n",
       "scene.add(obj9);\n",
       "\n",
       "var obj10 = new THREE.Object3D();\n",
       "obj10.name = \"unnamed__11\";\n",
       "obj10.userData.explodable = 1;\n",
       "obj10.userData.points = [];\n",
       "obj10.userData.points.push(new PMPoint(0, -1, 0));\n",
       "obj10.userData.points.push(new PMPoint(0, -1, 2));\n",
       "obj10.userData.points.push(new PMPoint(-1, -2, 2));\n",
       "obj10.userData.points.push(new PMPoint(-1, -2, -1));\n",
       "\n",
       "obj10.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj10.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj10.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj10.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj10.userData.facets = [[0, 1, 2, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj10.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj10);\n",
       "scene.add(obj10);\n",
       "\n",
       "var obj11 = new THREE.Object3D();\n",
       "obj11.name = \"unnamed__12\";\n",
       "obj11.userData.explodable = 1;\n",
       "obj11.userData.points = [];\n",
       "obj11.userData.points.push(new PMPoint(-1, 0, 0));\n",
       "obj11.userData.points.push(new PMPoint(0, 0, 0));\n",
       "obj11.userData.points.push(new PMPoint(0, 0, 2));\n",
       "obj11.userData.points.push(new PMPoint(-1, 0, 2));\n",
       "\n",
       "obj11.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj11.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj11.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj11.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj11.userData.facets = [[0, 3, 2, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj11.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj11);\n",
       "scene.add(obj11);\n",
       "\n",
       "var obj12 = new THREE.Object3D();\n",
       "obj12.name = \"unnamed__13\";\n",
       "obj12.userData.explodable = 1;\n",
       "obj12.userData.points = [];\n",
       "obj12.userData.points.push(new PMPoint(0, -1, 0));\n",
       "obj12.userData.points.push(new PMPoint(0, 0, 0));\n",
       "obj12.userData.points.push(new PMPoint(0, 0, 2));\n",
       "obj12.userData.points.push(new PMPoint(0, -1, 2));\n",
       "\n",
       "obj12.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj12.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj12.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj12.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj12.userData.facets = [[0, 3, 2, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj12.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj12);\n",
       "scene.add(obj12);\n",
       "\n",
       "var obj13 = new THREE.Object3D();\n",
       "obj13.name = \"unnamed__14\";\n",
       "obj13.userData.explodable = 1;\n",
       "obj13.userData.points = [];\n",
       "obj13.userData.points.push(new PMPoint(-1, 0, 0));\n",
       "obj13.userData.points.push(new PMPoint(-1, 2, 0));\n",
       "obj13.userData.points.push(new PMPoint(-2, 2, -1));\n",
       "obj13.userData.points.push(new PMPoint(-2, -1, -1));\n",
       "\n",
       "obj13.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj13.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj13.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj13.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj13.userData.facets = [[0, 1, 2, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj13.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj13);\n",
       "scene.add(obj13);\n",
       "\n",
       "var obj14 = new THREE.Object3D();\n",
       "obj14.name = \"unnamed__15\";\n",
       "obj14.userData.explodable = 1;\n",
       "obj14.userData.points = [];\n",
       "obj14.userData.points.push(new PMPoint(0, 0, -1));\n",
       "obj14.userData.points.push(new PMPoint(0, 2, -1));\n",
       "obj14.userData.points.push(new PMPoint(-1, -1, -2));\n",
       "obj14.userData.points.push(new PMPoint(-1, 2, -2));\n",
       "\n",
       "obj14.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj14.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj14.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj14.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj14.userData.facets = [[0, 1, 3, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj14.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj14);\n",
       "scene.add(obj14);\n",
       "\n",
       "var obj15 = new THREE.Object3D();\n",
       "obj15.name = \"unnamed__16\";\n",
       "obj15.userData.explodable = 1;\n",
       "obj15.userData.points = [];\n",
       "obj15.userData.points.push(new PMPoint(0, 0, 0));\n",
       "obj15.userData.points.push(new PMPoint(-1, 0, 0));\n",
       "obj15.userData.points.push(new PMPoint(0, 2, 0));\n",
       "obj15.userData.points.push(new PMPoint(-1, 2, 0));\n",
       "\n",
       "obj15.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj15.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj15.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj15.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj15.userData.facets = [[0, 2, 3, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj15.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj15);\n",
       "scene.add(obj15);\n",
       "\n",
       "var obj16 = new THREE.Object3D();\n",
       "obj16.name = \"unnamed__17\";\n",
       "obj16.userData.explodable = 1;\n",
       "obj16.userData.points = [];\n",
       "obj16.userData.points.push(new PMPoint(0, 0, 0));\n",
       "obj16.userData.points.push(new PMPoint(0, 0, -1));\n",
       "obj16.userData.points.push(new PMPoint(0, 2, 0));\n",
       "obj16.userData.points.push(new PMPoint(0, 2, -1));\n",
       "\n",
       "obj16.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj16.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj16.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj16.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj16.userData.facets = [[1, 0, 2, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj16.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj16);\n",
       "scene.add(obj16);\n",
       "\n",
       "var obj17 = new THREE.Object3D();\n",
       "obj17.name = \"unnamed__18\";\n",
       "obj17.userData.explodable = 1;\n",
       "obj17.userData.points = [];\n",
       "obj17.userData.points.push(new PMPoint(0, 0, 0));\n",
       "obj17.userData.points.push(new PMPoint(-1, 0, 0));\n",
       "obj17.userData.points.push(new PMPoint(-2, -1, -1));\n",
       "obj17.userData.points.push(new PMPoint(-2, -2, -2));\n",
       "\n",
       "obj17.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj17.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj17.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj17.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj17.userData.facets = [[2, 1, 0, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj17.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj17);\n",
       "scene.add(obj17);\n",
       "\n",
       "var obj18 = new THREE.Object3D();\n",
       "obj18.name = \"unnamed__19\";\n",
       "obj18.userData.explodable = 1;\n",
       "obj18.userData.points = [];\n",
       "obj18.userData.points.push(new PMPoint(0, -1, 0));\n",
       "obj18.userData.points.push(new PMPoint(2, -1, 0));\n",
       "obj18.userData.points.push(new PMPoint(2, -2, -1));\n",
       "obj18.userData.points.push(new PMPoint(-1, -2, -1));\n",
       "\n",
       "obj18.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj18.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj18.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj18.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj18.userData.facets = [[0, 1, 2, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj18.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj18);\n",
       "scene.add(obj18);\n",
       "\n",
       "var obj19 = new THREE.Object3D();\n",
       "obj19.name = \"unnamed__20\";\n",
       "obj19.userData.explodable = 1;\n",
       "obj19.userData.points = [];\n",
       "obj19.userData.points.push(new PMPoint(2, 0, -1));\n",
       "obj19.userData.points.push(new PMPoint(0, 0, -1));\n",
       "obj19.userData.points.push(new PMPoint(-1, -1, -2));\n",
       "obj19.userData.points.push(new PMPoint(2, -1, -2));\n",
       "\n",
       "obj19.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj19.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj19.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj19.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj19.userData.facets = [[1, 0, 3, 2]];\n",
       "   <!-- Facet style -->\n",
       "obj19.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj19);\n",
       "scene.add(obj19);\n",
       "\n",
       "var obj20 = new THREE.Object3D();\n",
       "obj20.name = \"unnamed__21\";\n",
       "obj20.userData.explodable = 1;\n",
       "obj20.userData.points = [];\n",
       "obj20.userData.points.push(new PMPoint(0, -1, 0));\n",
       "obj20.userData.points.push(new PMPoint(0, 0, 0));\n",
       "obj20.userData.points.push(new PMPoint(2, 0, 0));\n",
       "obj20.userData.points.push(new PMPoint(2, -1, 0));\n",
       "\n",
       "obj20.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj20.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj20.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj20.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj20.userData.facets = [[0, 1, 2, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj20.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj20);\n",
       "scene.add(obj20);\n",
       "\n",
       "var obj21 = new THREE.Object3D();\n",
       "obj21.name = \"unnamed__22\";\n",
       "obj21.userData.explodable = 1;\n",
       "obj21.userData.points = [];\n",
       "obj21.userData.points.push(new PMPoint(0, 0, -1));\n",
       "obj21.userData.points.push(new PMPoint(0, 0, 0));\n",
       "obj21.userData.points.push(new PMPoint(2, 0, 0));\n",
       "obj21.userData.points.push(new PMPoint(2, 0, -1));\n",
       "\n",
       "obj21.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj21.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj21.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj21.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj21.userData.facets = [[0, 1, 2, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj21.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj21);\n",
       "scene.add(obj21);\n",
       "\n",
       "var obj22 = new THREE.Object3D();\n",
       "obj22.name = \"unnamed__23\";\n",
       "obj22.userData.explodable = 1;\n",
       "obj22.userData.points = [];\n",
       "obj22.userData.points.push(new PMPoint(0, 0, 0));\n",
       "obj22.userData.points.push(new PMPoint(0, -1, 0));\n",
       "obj22.userData.points.push(new PMPoint(-1, -2, -1));\n",
       "obj22.userData.points.push(new PMPoint(-2, -2, -2));\n",
       "\n",
       "obj22.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj22.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj22.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj22.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj22.userData.facets = [[2, 1, 0, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj22.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj22);\n",
       "scene.add(obj22);\n",
       "\n",
       "var obj23 = new THREE.Object3D();\n",
       "obj23.name = \"unnamed__24\";\n",
       "obj23.userData.explodable = 1;\n",
       "obj23.userData.points = [];\n",
       "obj23.userData.points.push(new PMPoint(0, 0, -1));\n",
       "obj23.userData.points.push(new PMPoint(0, 0, 0));\n",
       "obj23.userData.points.push(new PMPoint(-2, -2, -2));\n",
       "obj23.userData.points.push(new PMPoint(-1, -1, -2));\n",
       "\n",
       "obj23.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj23.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj23.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3];\n",
       "   <!-- Edge style -->\n",
       "obj23.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "obj23.userData.facets = [[2, 1, 0, 3]];\n",
       "   <!-- Facet style -->\n",
       "obj23.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj23);\n",
       "scene.add(obj23);\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "function textSpriteMaterial(message, parameters) {\n",
       "    if ( parameters === undefined ) parameters = {};\n",
       "    var fontface = \"Helvetica\";\n",
       "    var fontsize = parameters.hasOwnProperty(\"fontsize\") ? parameters[\"fontsize\"] : 15;\n",
       "    fontsize = fontsize*10;\n",
       "    var lines = message.split('\\\\n');\n",
       "    var size = 512;\n",
       "    for(var i = 0; i<lines.length; i++){\n",
       "        var tmp = lines[i].length;\n",
       "        while(tmp*fontsize > size){\n",
       "           fontsize--;\n",
       "        }\n",
       "    }\n",
       "    \n",
       "    var canvas = document.createElement('canvas');\n",
       "    canvas.width = size;\n",
       "    canvas.height = size;\n",
       "    var context = canvas.getContext('2d');\n",
       "    context.fillStyle = \"rgba(255, 255, 255, 0)\";\n",
       "    context.fill();\n",
       "    context.font = fontsize + \"px \" + fontface;\n",
       "    \n",
       "    // text color\n",
       "    context.fillStyle = \"rgba(0, 0, 0, 1.0)\";\n",
       "     for(var i = 0; i<lines.length; i++){\n",
       "        context.fillText(lines[i], size/2, size/2+i*fontsize);\n",
       "     }\n",
       "    \n",
       "    // canvas contents will be used for a texture\n",
       "    var texture = new THREE.Texture(canvas);\n",
       "    texture.needsUpdate = true;\n",
       "    \n",
       "    var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 });\n",
       "    return spriteMaterial;\n",
       "}\n",
       "\n",
       "\n",
       "// ---------------------- INITIALIZING OBJECTS--------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function init_object(obj) {\n",
       "    if (obj.userData.hasOwnProperty(\"pointmaterial\")) {\n",
       "        init_points(obj);\n",
       "        modelContains.points = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"pointlabels\")) {\n",
       "        init_pointlabels(obj);\n",
       "        modelContains.pointlabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgematerial\")) {\n",
       "        init_lines(obj);\n",
       "        modelContains.lines = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgelabels\")) {\n",
       "        init_edgelabels(obj);\n",
       "        modelContains.edgelabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"arrowstyle\")) {\n",
       "        init_arrowheads(obj);\n",
       "        modelContains.arrowheads = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"facetmaterial\")) {\n",
       "        init_faces(obj);\n",
       "        modelContains.faces = true;\n",
       "    }\n",
       "}\n",
       "\n",
       "function init_points(obj) {\n",
       "    var pointgroup = new THREE.Group();\n",
       "    pointgroup.name = \"points\";\n",
       "    var points = obj.userData.points;\n",
       "    var radii = obj.userData.pointradii;\n",
       "    var materials = obj.userData.pointmaterial;\n",
       "    var geometry,material;\n",
       "    if (!Array.isArray(radii)) {\n",
       "        geometry = new THREE.SphereBufferGeometry(radii);  \n",
       "    }\n",
       "    if (!Array.isArray(materials)) {\n",
       "        material = materials;\n",
       "    }\n",
       "    for (var i=0; i<points.length; i++) {\n",
       "        var point = points[i];\n",
       "        if (Array.isArray(radii)) {\n",
       "            if (radii[i] == 0) {\n",
       "                continue;\n",
       "            }\n",
       "            geometry = new THREE.SphereBufferGeometry(radii[i]);  \n",
       "        } \n",
       "        if (Array.isArray(materials)) {\n",
       "            material = materials[i];     \n",
       "        } \n",
       "        var sphere = new THREE.Mesh(geometry, material);\n",
       "        point.addSphere(sphere);\n",
       "        pointgroup.add(sphere);\n",
       "    }\n",
       "    obj.add(pointgroup);\n",
       "}\n",
       "\n",
       "function init_pointlabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var labels = obj.userData.pointlabels;\n",
       "    var pointlabels = new THREE.Group();\n",
       "    pointlabels.name = \"pointlabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(pointlabels);\n",
       "}\n",
       "\n",
       "function init_lines(obj) {\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var points = obj.userData.points;\n",
       "    var materials = obj.userData.edgematerial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 );\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position', bufattr);\n",
       "    if (Array.isArray(materials)) {     \n",
       "        for (var i=0; i<materials.length; i++) {\n",
       "            geometry.addGroup(2*i,2,i);\n",
       "        }\n",
       "    }\n",
       "    var lines = new THREE.LineSegments(geometry, materials);\n",
       "    lines.name = \"lines\";\n",
       "    obj.add(lines);\n",
       "    updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "function init_edgelabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var labels = obj.userData.edgelabels;\n",
       "    var edgelabels = new THREE.Group();\n",
       "    edgelabels.name = \"edgelabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            edgelabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(edgelabels);\n",
       "}\n",
       "\n",
       "function init_arrowheads(obj) {\n",
       "    var arrowheads = new THREE.Group();\n",
       "    arrowheads.name = \"arrowheads\";\n",
       "    var arrowstyle = obj.userData.arrowstyle;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var edgematerials = obj.userData.edgematerial;\n",
       "    var points = obj.userData.points;\n",
       "    var material;\n",
       "    if (!Array.isArray(edgematerials)) {\n",
       "        material = new THREE.MeshBasicMaterial( {color: edgematerials.color} );\n",
       "    }\n",
       "\n",
       "    for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "        var start = points[edgeindices[i]];\n",
       "        var end = points[edgeindices[i+1]];\n",
       "        var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius();\n",
       "        if (dist <= 0) {\n",
       "            continue;\n",
       "        }\n",
       "        var dir = new THREE.Vector3().subVectors(end.vector,start.vector);\n",
       "        dir.normalize();\n",
       "        var axis = new THREE.Vector3().set(dir.z,0,-dir.x);\n",
       "        axis.normalize();\n",
       "        var radians = Math.acos( dir.y );\n",
       "        var radius = dist/25;\n",
       "        var height = dist/5;\n",
       "        var geometry = new THREE.ConeBufferGeometry(radius,height);\n",
       "        var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2));\n",
       "        if (Array.isArray(edgematerials)) {\n",
       "            material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} );\n",
       "        }\n",
       "        var cone = new THREE.Mesh( geometry, material );\n",
       "        cone.quaternion.setFromAxisAngle(axis,radians);;\n",
       "        cone.position.copy(position);;\n",
       "        arrowheads.add(cone);\n",
       "    }\n",
       "    obj.add(arrowheads);\n",
       "}\n",
       "\n",
       "function init_faces(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var facets = obj.userData.facets;\n",
       "    obj.userData.triangleindices = [];\n",
       "    for (var i=0; i<facets.length; i++) {\n",
       "        facet = facets[i];\n",
       "        for (var t=0; t<facet.length-2; t++) {\n",
       "            obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]);  \n",
       "        }\n",
       "    }\n",
       "    var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute(bufarr,3);\n",
       "    \n",
       "    var materials = obj.userData.facetmaterial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position',bufattr);\n",
       "    if (Array.isArray(materials)) {\n",
       "        var tricount = 0;\n",
       "        var facet;\n",
       "        for (var i=0; i<facets.length; i++) {\n",
       "            facet = facets[i];\n",
       "            geometry.addGroup(tricount,(facet.length-2)*3,i);\n",
       "            tricount += (facet.length-2)*3;\n",
       "        }\n",
       "    }\n",
       "    var mesh = new THREE.Mesh(geometry, materials);\n",
       "    mesh.name = \"faces\";\n",
       "    obj.add(mesh); \n",
       "    updateFacesPosition(obj);\n",
       "}\n",
       "// //INITIALIZING\n",
       "\n",
       "\n",
       "function updateFacesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.triangleindices;\n",
       "    var faces = obj.getObjectByName(\"faces\");\n",
       "    var ba = faces.geometry.getAttribute(\"position\");\n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    faces.geometry.attributes.position.needsUpdate = true;\n",
       "    \n",
       "}\n",
       "\n",
       "function updateEdgesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.edgeindices;\n",
       "    var lines = obj.getObjectByName(\"lines\");\n",
       "    var ba = lines.geometry.getAttribute(\"position\"); \n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    lines.geometry.attributes.position.needsUpdate = true;\n",
       "}\n",
       "\n",
       "function onWindowResize() {\n",
       "    renderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    svgRenderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "function updateCamera() {\n",
       "    var width = three.clientWidth;\n",
       "    var height = three.clientHeight;\n",
       "    var aspect = width / height;\n",
       "    if (camera.type == \"OrthographicCamera\") {\n",
       "        camera.left = frustumSize * aspect / - 2;\n",
       "        camera.right = frustumSize * aspect / 2;\n",
       "        camera.top = frustumSize / 2;\n",
       "        camera.bottom = - frustumSize / 2;\n",
       "    } else if (camera.type == \"PerspectiveCamera\") {\n",
       "        camera.aspect = aspect;\n",
       "    }\n",
       "    camera.updateProjectionMatrix();\n",
       "}\n",
       "\n",
       "function changeCamera(event) {\n",
       "    var selindex = event.currentTarget.selectedIndex;\n",
       "    camera = cameras[selindex];\n",
       "    control = controls[selindex];\n",
       "    control.enabled = true; \n",
       "    for (var i=0; i<controls.length; i++) {\n",
       "        if (i!=selindex) {\n",
       "            controls[i].enabled = false;\n",
       "        }\n",
       "    }\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "var camtypenode = document.getElementById('cameraType_1');\n",
       "camtypenode.onchange = changeCamera;\n",
       "camtypenode.dispatchEvent(new Event('change'));\n",
       "\n",
       "onWindowResize();\n",
       "window.addEventListener('resize', onWindowResize);\t\n",
       "\n",
       "\n",
       "var xRotationEnabled = false;\n",
       "var yRotationEnabled = false;\n",
       "var zRotationEnabled = false;\n",
       "var rotationSpeedFactor = 1;\n",
       "var settingsShown = false;\n",
       "var labelsShown = true;\n",
       "var intervals = [];\n",
       "var timeouts = [];\n",
       "var explodingSpeed = 0.05;\n",
       "var explodeScale = 0;\n",
       "var XMLS = new XMLSerializer();\n",
       "var svgElement;\n",
       "var renderId;\n",
       "\n",
       "var render = function () {\n",
       "\n",
       "\trenderId = requestAnimationFrame(render);\n",
       "\n",
       "//\tcomment in for automatic explosion\n",
       "//\texplode(updateFactor());\n",
       "\n",
       "    var phi = 0.02 * rotationSpeedFactor;\n",
       "\n",
       "    if (xRotationEnabled) {\n",
       "        scene.rotation.x += phi;\n",
       "    }\n",
       "    if (yRotationEnabled) {\n",
       "        scene.rotation.y += phi;\n",
       "    }\n",
       "    if (zRotationEnabled) {\n",
       "        scene.rotation.z += phi;\n",
       "    }\n",
       "\n",
       "    control.update();\n",
       "    renderer.render(scene, camera);\n",
       "};\n",
       "\n",
       "if ( THREE.WEBGL.isWebGLAvailable() ) {\n",
       "\trender();\n",
       "} else {\n",
       "\tvar warning = WEBGL.getWebGLErrorMessage();\n",
       "\tthree.appendChild( warning );\n",
       "}\n",
       "    \n",
       "function changeTransparency() {\n",
       "    var opacity = 1-Number(event.currentTarget.value);\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        child = scene.children[i];\n",
       "        if ( child.userData.hasOwnProperty(\"facetmaterial\") ) {\n",
       "            if (Array.isArray(child.userData.facetmaterial)) {\n",
       "                for (var j=0; j<child.userData.facetmaterial.length; j++) {\n",
       "                    child.userData.facetmaterial[j].opacity = opacity;\n",
       "                }\n",
       "            } else {\n",
       "                child.userData.facetmaterial.opacity = opacity;\n",
       "            }    \n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function changeRotationX(event){\n",
       "    xRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationY(event){\n",
       "    yRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationZ(event){\n",
       "    zRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "\n",
       "function changeRotationSpeedFactor(event){\n",
       "    rotationSpeedFactor = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function resetScene(){\n",
       "    scene.rotation.set(0,0,0);\n",
       "    camera.position.set(0,0,5);\n",
       "    camera.up.set(0,1,0);\n",
       "}\n",
       "\n",
       "function showSettings(event){\n",
       "    document.getElementById('settings_1').style.visibility = 'visible';\n",
       "    document.getElementById('showSettingsButton_1').style.visibility = 'hidden';\n",
       "    document.getElementById('hideSettingsButton_1').style.visibility = 'visible';\n",
       "    settingsShown = true;\n",
       "}\n",
       "\n",
       "function hideSettings(event){\n",
       "    document.getElementById('settings_1').style.visibility = 'hidden';\n",
       "    document.getElementById('showSettingsButton_1').style.visibility = 'visible';\n",
       "    document.getElementById('hideSettingsButton_1').style.visibility = 'hidden';\n",
       "    settingsShown = false;\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "var pos = 150* Math.PI;\n",
       "\n",
       "function updateFactor() {\n",
       "    pos++;\n",
       "    return Math.sin(.01*pos)+1;\n",
       "}\n",
       "\n",
       "// ------------------------ FOLDING ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "// rotate point p around axis defined by points p1 and p2 by given angle\n",
       "function rotate(p, p1, p2, angle ){   \n",
       "    angle = -angle;\n",
       "    var x = p.x, y = p.y, z = p.z, \n",
       "    a = p1.x, b = p1.y, c = p1.z, \n",
       "    u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z;\n",
       "    var result = [];\n",
       "    var L = u*u + v*v + w*w;\n",
       "    var sqrt = Math.sqrt;\n",
       "    var cos = Math.cos;\n",
       "    var sin = Math.sin;\n",
       "\n",
       "    result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L;\n",
       "    result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L;\n",
       "    result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L;\n",
       "\n",
       "    return result;\n",
       "}\n",
       "\n",
       "var fold = function(event){\n",
       "    var obj = foldables[Number(event.currentTarget.name)];\n",
       "    var foldvalue = Number(event.currentTarget.value);\n",
       "    var scale = foldvalue - obj.userData.oldscale;\n",
       "\n",
       "    for (var j=0; j<obj.userData.axes.length; j++) {\n",
       "        rotateVertices(obj, j, scale);\n",
       "    }\n",
       "    update(obj);\n",
       "    obj.userData.oldscale += scale;\n",
       "    lookAtBarycenter(obj);\n",
       "}\n",
       "\n",
       "function lookAtBarycenter(obj){\n",
       "    control.target = barycenter(obj);\n",
       "}\n",
       "\n",
       "function barycenter(obj) {\n",
       "    var center = new THREE.Vector3(0,0,0);\n",
       "    var points = obj.userData.points;\n",
       "    for (var i=0; i<points.length; i++){\n",
       "        center.add(points[i].vector);\n",
       "    }\n",
       "    center.divideScalar(points.length);\n",
       "    return center;\n",
       "}\n",
       "\n",
       "function rotateVertices(obj, edge, scale) {\n",
       "    var axes = obj.userData.axes;\n",
       "    var subtrees = obj.userData.subtrees;\n",
       "    var points = obj.userData.points;\n",
       "    var angles = obj.userData.angles;\n",
       "    if (edge < axes.length){\n",
       "        for (var j=0; j<subtrees[edge].length; j++){\n",
       "            var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge]));\n",
       "            points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]);\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function update(obj) {\n",
       "   updateFacesPosition(obj);\n",
       "   updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "if (foldables.length) {\n",
       "    var settings = document.getElementById('settings_1');\n",
       "    var foldDiv = document.createElement('div');\n",
       "    foldDiv.id = 'fold_1';\n",
       "    var title = document.createElement('strong');\n",
       "    title.innerHTML = 'Fold';\n",
       "    foldDiv.appendChild(title);\n",
       "    foldDiv.className = 'group';\n",
       "    for (var i=0; i<foldables.length; i++) {\n",
       "        var range = document.createElement('input');\n",
       "        range.type = 'range';\n",
       "        range.min = 0;\n",
       "        range.max = 1;\n",
       "        range.value = 0;\n",
       "        range.step = 0.001;\n",
       "        range.name = String(i);\n",
       "        range.oninput = fold;\n",
       "        foldDiv.appendChild(range);\n",
       "    }\n",
       "    lookAtBarycenter(foldables[0]);\n",
       "    settings.insertBefore(foldDiv,settings.childNodes[0]);\n",
       "}\n",
       "\n",
       "    \n",
       "// ---------------------- EXPLOSION ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "if (explodableModel) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        obj = scene.children[i];\n",
       "        if ( obj.userData.explodable ) {\n",
       "            computeCentroid(obj);\n",
       "        }\n",
       "    }\n",
       "    document.getElementById('explodeRange_1').oninput = triggerExplode;\n",
       "    document.getElementById('explodeCheckbox_1').onchange = triggerAutomaticExplode;\n",
       "    document.getElementById('explodingSpeedRange_1').oninput = setExplodingSpeed;\n",
       "}\n",
       "\n",
       "function computeCentroid(obj) {\n",
       "    centroid = new THREE.Vector3();\n",
       "    obj.userData.points.forEach(function(pmpoint) {\n",
       "        centroid.add(pmpoint.vector);\t\t\t\n",
       "    });\n",
       "    centroid.divideScalar(obj.userData.points.length);\n",
       "    obj.userData.centroid = centroid;\n",
       "}\n",
       "\n",
       "function explode(factor) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        var obj = scene.children[i];\n",
       "        if (obj.userData.hasOwnProperty(\"centroid\")) { \n",
       "            var c = obj.userData.centroid;\n",
       "            obj.position.set(c.x*factor, c.y*factor, c.z*factor);\n",
       "        }\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function triggerExplode(event){\n",
       "    explodeScale = Number(event.currentTarget.value);\n",
       "    explode(explodeScale);\n",
       "}\n",
       "\n",
       "function setExplodingSpeed(event){\n",
       "    explodingSpeed = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function triggerAutomaticExplode(event){\n",
       "    if (event.currentTarget.checked){\n",
       "        startExploding();\n",
       "    } else {\n",
       "        clearIntervals();\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function startExploding(){\n",
       "    intervals.push(setInterval(explodingInterval, 25));\n",
       "}\n",
       "\n",
       "\n",
       "function explodingInterval(){\n",
       "    explodeScale += explodingSpeed;\n",
       "    if (explodeScale <= 6){ \n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else{\n",
       "        explode(6);\n",
       "        explodeScale = 6;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startUnexploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_1').value = explodeScale;\n",
       "}\n",
       "\n",
       "\n",
       "function startUnexploding(){\n",
       "    intervals.push(setInterval(unexplodingInterval, 25));\n",
       "}\n",
       "\n",
       "function unexplodingInterval(){\n",
       "    explodeScale -= explodingSpeed;\n",
       "    if (explodeScale >= 0){\t\n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else {\n",
       "        explode(0);\n",
       "        explodeScale = 0;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startExploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_1').value = explodeScale;\n",
       "}\n",
       "\n",
       "function clearIntervals(){\n",
       "    intervals.forEach(function(interval){\n",
       "        clearInterval(interval);\n",
       "    });\n",
       "    intervals = [];\n",
       "    timeouts.forEach(function(timeout){\n",
       "        clearTimeout(timeout);\n",
       "    });\n",
       "    timeouts = [];\n",
       "}\n",
       "\n",
       "// ---------------------- DISPLAY --------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "const objectTypeInnerHTMLs = { points: \"Points\", pointlabels: \"Point labels\", lines: \"Edges\", edgelabels: \"Edge labels\", faces: \"Faces\", arrowheads: \"Arrow heads\" };\n",
       "const objectTypeVisible = {};\n",
       "Object.assign(objectTypeVisible,modelContains);\n",
       "const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort();\n",
       "const shownObjectTypesList = document.getElementById('shownObjectTypesList_1');\n",
       "\n",
       "function setVisibility(bool,objname) {\n",
       "    for (var i=0; i<scene.children.length; i++){\n",
       "        var obj = scene.children[i].getObjectByName(objname);\n",
       "        if (obj) {\n",
       "            obj.visible = bool;\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function toggleObjectTypeVisibility(event){\n",
       "    var name = event.currentTarget.name;\n",
       "    var checked = event.currentTarget.checked;\n",
       "    objectTypeVisible[name] = checked;\n",
       "    setVisibility(checked,name);\n",
       "}\n",
       "\n",
       "for (var i=0; i<sortedObjectTypeKeys.length; i++){\n",
       "    var key = sortedObjectTypeKeys[i];\n",
       "    if (modelContains[key]) {\n",
       "        var objTypeNode = document.createElement('span');\n",
       "        objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>';\n",
       "        var checkbox = document.createElement('input');\n",
       "        checkbox.type = 'checkbox';\n",
       "        checkbox.checked = true;\n",
       "        checkbox.name = key;\n",
       "        checkbox.onchange = toggleObjectTypeVisibility;\n",
       "        shownObjectTypesList.appendChild(checkbox);\n",
       "        shownObjectTypesList.appendChild(objTypeNode);\n",
       "    }\n",
       "}\n",
       "\n",
       "// ------------------------------------------------------\n",
       "\n",
       "function toggleObjectVisibility(event){\n",
       "    var nr = Number(event.currentTarget.name);\n",
       "    scene.children[nr].visible = event.currentTarget.checked;\n",
       "}\n",
       "\n",
       "// append checkboxes for displaying or hiding objects\n",
       "var shownObjectsList = document.getElementById('shownObjectsList_1');\n",
       "for (var i=0; i<scene.children.length; i++){\n",
       "    obj = scene.children[i];\n",
       "    var objNode = document.createElement('span');\n",
       "    objNode.innerHTML = obj.name + '<br>';\n",
       "    var checkbox = document.createElement('input');\n",
       "    checkbox.type = 'checkbox';\n",
       "    checkbox.checked = true;\n",
       "    checkbox.name = String(i);\n",
       "    checkbox.onchange = toggleObjectVisibility;\n",
       "    shownObjectsList.appendChild(checkbox);\n",
       "    shownObjectsList.appendChild(objNode);\n",
       "}\n",
       "\n",
       "// ---------------------- SVG ------------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function takeSvgScreenshot() {\n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(false,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(false,\"edgelabels\");\n",
       "    }\n",
       "    svgRenderer.render(scene,camera);\n",
       "    svgElement = XMLS.serializeToString(svgRenderer.domElement);\n",
       "    \n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(true,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(true,\"edgelabels\");\n",
       "    }\n",
       "\n",
       "    if (document.getElementById('tab_1').checked){\n",
       "        //show in new tab\n",
       "        var myWindow = window.open(\"\",\"\");\n",
       "        myWindow.document.body.innerHTML = svgElement;\n",
       "    } else{\n",
       "        // download svg file \n",
       "        download(\"screenshot.svg\", svgElement);\n",
       "    }\n",
       "}\n",
       "\n",
       "function download(filename, text) {\n",
       "    var element = document.createElement('a');\n",
       "    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));\n",
       "    element.setAttribute('download', filename);\n",
       "\n",
       "    element.style.display = 'none';\n",
       "    document.body.appendChild(element);\n",
       "\n",
       "    element.click();\n",
       "\n",
       "    document.body.removeChild(element);\n",
       "}\n",
       "\n",
       "\n",
       "document.getElementById('transparencyRange_1').oninput = changeTransparency;\n",
       "document.getElementById('changeRotationX_1').onchange = changeRotationX;\n",
       "document.getElementById('changeRotationY_1').onchange = changeRotationY;\n",
       "document.getElementById('changeRotationZ_1').onchange = changeRotationZ;\n",
       "document.getElementById('resetButton_1').onclick = resetScene;\n",
       "document.getElementById('rotationSpeedRange_1').oninput = changeRotationSpeedFactor;\n",
       "document.getElementById('takeScreenshot_1').onclick = takeSvgScreenshot;\n",
       "document.getElementById('showSettingsButton_1').onclick = showSettings;\n",
       "document.getElementById('hideSettingsButton_1').onclick = hideSettings;\n",
       "\n",
       "\n",
       "// ------------------ SHORTCUTS --------------------------------------------\n",
       "// -------------------------------------------------------------------------\n",
       "\n",
       "/**\n",
       " * http://www.openjs.com/scripts/events/keyboard_shortcuts/\n",
       " * Version : 2.01.B\n",
       " * By Binny V A\n",
       " * License : BSD\n",
       " */\n",
       "shortcut = {\n",
       "\t'all_shortcuts':{},//All the shortcuts are stored in this array\n",
       "\t'add': function(shortcut_combination,callback,opt) {\n",
       "\t\t//Provide a set of default options\n",
       "\t\tvar default_options = {\n",
       "\t\t\t'type':'keydown',\n",
       "\t\t\t'propagate':false,\n",
       "\t\t\t'disable_in_input':false,\n",
       "\t\t\t'target':document,\n",
       "\t\t\t'keycode':false\n",
       "\t\t}\n",
       "\t\tif(!opt) opt = default_options;\n",
       "\t\telse {\n",
       "\t\t\tfor(var dfo in default_options) {\n",
       "\t\t\t\tif(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\n",
       "\t\tvar ele = opt.target;\n",
       "\t\tif(typeof opt.target == 'string') ele = document.getElementById(opt.target);\n",
       "\t\tvar ths = this;\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\n",
       "\t\t//The function to be called at keypress\n",
       "\t\tvar func = function(e) {\n",
       "\t\t\te = e || window.event;\n",
       "\t\t\t\n",
       "\t\t\tif(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields\n",
       "\t\t\t\tvar element;\n",
       "\t\t\t\tif(e.target) element=e.target;\n",
       "\t\t\t\telse if(e.srcElement) element=e.srcElement;\n",
       "\t\t\t\tif(element.nodeType==3) element=element.parentNode;\n",
       "\n",
       "\t\t\t\tif(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\t//Find Which key is pressed\n",
       "\t\t\tif (e.keyCode) code = e.keyCode;\n",
       "\t\t\telse if (e.which) code = e.which;\n",
       "\t\t\tvar character = String.fromCharCode(code).toLowerCase();\n",
       "\t\t\t\n",
       "\t\t\tif(code == 188) character=\",\"; //If the user presses , when the type is onkeydown\n",
       "\t\t\tif(code == 190) character=\".\"; //If the user presses , when the type is onkeydown\n",
       "\n",
       "\t\t\tvar keys = shortcut_combination.split(\"+\");\n",
       "\t\t\t//Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked\n",
       "\t\t\tvar kp = 0;\n",
       "\t\t\t\n",
       "\t\t\t//Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken\n",
       "\t\t\tvar shift_nums = {\n",
       "\t\t\t\t\"`\":\"~\",\n",
       "\t\t\t\t\"1\":\"!\",\n",
       "\t\t\t\t\"2\":\"@\",\n",
       "\t\t\t\t\"3\":\"#\",\n",
       "\t\t\t\t\"4\":\"$\",\n",
       "\t\t\t\t\"5\":\"%\",\n",
       "\t\t\t\t\"6\":\"^\",\n",
       "\t\t\t\t\"7\":\"&\",\n",
       "\t\t\t\t\"8\":\"*\",\n",
       "\t\t\t\t\"9\":\"(\",\n",
       "\t\t\t\t\"0\":\")\",\n",
       "\t\t\t\t\"-\":\"_\",\n",
       "\t\t\t\t\"=\":\"+\",\n",
       "\t\t\t\t\";\":\":\",\n",
       "\t\t\t\t\"'\":\"\\\"\",\n",
       "\t\t\t\t\",\":\"<\",\n",
       "\t\t\t\t\".\":\">\",\n",
       "\t\t\t\t\"/\":\"?\",\n",
       "\t\t\t\t\"\\\\\":\"|\"\n",
       "\t\t\t}\n",
       "\t\t\t//Special Keys - and their codes\n",
       "\t\t\tvar special_keys = {\n",
       "\t\t\t\t'esc':27,\n",
       "\t\t\t\t'escape':27,\n",
       "\t\t\t\t'tab':9,\n",
       "\t\t\t\t'space':32,\n",
       "\t\t\t\t'return':13,\n",
       "\t\t\t\t'enter':13,\n",
       "\t\t\t\t'backspace':8,\n",
       "\t\n",
       "\t\t\t\t'scrolllock':145,\n",
       "\t\t\t\t'scroll_lock':145,\n",
       "\t\t\t\t'scroll':145,\n",
       "\t\t\t\t'capslock':20,\n",
       "\t\t\t\t'caps_lock':20,\n",
       "\t\t\t\t'caps':20,\n",
       "\t\t\t\t'numlock':144,\n",
       "\t\t\t\t'num_lock':144,\n",
       "\t\t\t\t'num':144,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pause':19,\n",
       "\t\t\t\t'break':19,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'insert':45,\n",
       "\t\t\t\t'home':36,\n",
       "\t\t\t\t'delete':46,\n",
       "\t\t\t\t'end':35,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pageup':33,\n",
       "\t\t\t\t'page_up':33,\n",
       "\t\t\t\t'pu':33,\n",
       "\t\n",
       "\t\t\t\t'pagedown':34,\n",
       "\t\t\t\t'page_down':34,\n",
       "\t\t\t\t'pd':34,\n",
       "\t\n",
       "\t\t\t\t'left':37,\n",
       "\t\t\t\t'up':38,\n",
       "\t\t\t\t'right':39,\n",
       "\t\t\t\t'down':40,\n",
       "\t\n",
       "\t\t\t\t'f1':112,\n",
       "\t\t\t\t'f2':113,\n",
       "\t\t\t\t'f3':114,\n",
       "\t\t\t\t'f4':115,\n",
       "\t\t\t\t'f5':116,\n",
       "\t\t\t\t'f6':117,\n",
       "\t\t\t\t'f7':118,\n",
       "\t\t\t\t'f8':119,\n",
       "\t\t\t\t'f9':120,\n",
       "\t\t\t\t'f10':121,\n",
       "\t\t\t\t'f11':122,\n",
       "\t\t\t\t'f12':123\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\tvar modifiers = { \n",
       "\t\t\t\tshift: { wanted:false, pressed:false},\n",
       "\t\t\t\tctrl : { wanted:false, pressed:false},\n",
       "\t\t\t\talt  : { wanted:false, pressed:false},\n",
       "\t\t\t\tmeta : { wanted:false, pressed:false}\t//Meta is Mac specific\n",
       "\t\t\t};\n",
       "                        \n",
       "\t\t\tif(e.ctrlKey)\tmodifiers.ctrl.pressed = true;\n",
       "\t\t\tif(e.shiftKey)\tmodifiers.shift.pressed = true;\n",
       "\t\t\tif(e.altKey)\tmodifiers.alt.pressed = true;\n",
       "\t\t\tif(e.metaKey)   modifiers.meta.pressed = true;\n",
       "                        \n",
       "\t\t\tfor(var i=0; k=keys[i],i<keys.length; i++) {\n",
       "\t\t\t\t//Modifiers\n",
       "\t\t\t\tif(k == 'ctrl' || k == 'control') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.ctrl.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'shift') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.shift.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'alt') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.alt.wanted = true;\n",
       "\t\t\t\t} else if(k == 'meta') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.meta.wanted = true;\n",
       "\t\t\t\t} else if(k.length > 1) { //If it is a special key\n",
       "\t\t\t\t\tif(special_keys[k] == code) kp++;\n",
       "\t\t\t\t\t\n",
       "\t\t\t\t} else if(opt['keycode']) {\n",
       "\t\t\t\t\tif(opt['keycode'] == code) kp++;\n",
       "\n",
       "\t\t\t\t} else { //The special keys did not match\n",
       "\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\telse {\n",
       "\t\t\t\t\t\tif(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase\n",
       "\t\t\t\t\t\t\tcharacter = shift_nums[character]; \n",
       "\t\t\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\t\t}\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t\t\n",
       "\t\t\tif(kp == keys.length && \n",
       "\t\t\t\t\t\tmodifiers.ctrl.pressed == modifiers.ctrl.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.shift.pressed == modifiers.shift.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.alt.pressed == modifiers.alt.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.meta.pressed == modifiers.meta.wanted) {\n",
       "\t\t\t\tcallback(e);\n",
       "\t\n",
       "\t\t\t\tif(!opt['propagate']) { //Stop the event\n",
       "\t\t\t\t\t//e.cancelBubble is supported by IE - this will kill the bubbling process.\n",
       "\t\t\t\t\te.cancelBubble = true;\n",
       "\t\t\t\t\te.returnValue = false;\n",
       "\t\n",
       "\t\t\t\t\t//e.stopPropagation works in Firefox.\n",
       "\t\t\t\t\tif (e.stopPropagation) {\n",
       "\t\t\t\t\t\te.stopPropagation();\n",
       "\t\t\t\t\t\te.preventDefault();\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t\treturn false;\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\t\tthis.all_shortcuts[shortcut_combination] = {\n",
       "\t\t\t'callback':func, \n",
       "\t\t\t'target':ele, \n",
       "\t\t\t'event': opt['type']\n",
       "\t\t};\n",
       "\t\t//Attach the function with the event\n",
       "\t\tif(ele.addEventListener) ele.addEventListener(opt['type'], func, false);\n",
       "\t\telse if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);\n",
       "\t\telse ele['on'+opt['type']] = func;\n",
       "\t},\n",
       "\n",
       "\t//Remove the shortcut - just specify the shortcut and I will remove the binding\n",
       "\t'remove':function(shortcut_combination) {\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\t\tvar binding = this.all_shortcuts[shortcut_combination];\n",
       "\t\tdelete(this.all_shortcuts[shortcut_combination])\n",
       "\t\tif(!binding) return;\n",
       "\t\tvar type = binding['event'];\n",
       "\t\tvar ele = binding['target'];\n",
       "\t\tvar callback = binding['callback'];\n",
       "\n",
       "\t\tif(ele.detachEvent) ele.detachEvent('on'+type, callback);\n",
       "\t\telse if(ele.removeEventListener) ele.removeEventListener(type, callback, false);\n",
       "\t\telse ele['on'+type] = false;\n",
       "\t}\n",
       "}\n",
       "\n",
       "shortcut.add(\"Alt+Left\",function() {\n",
       "\tvar event = new Event('click');\n",
       "\tif (settingsShown){\n",
       "\t\tdocument.getElementById('hideSettingsButton_1').dispatchEvent(event);\n",
       "\t} else {\n",
       "\t\tdocument.getElementById('showSettingsButton_1').dispatchEvent(event);\n",
       "\t}\n",
       "});\n",
       "\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "});});\n",
       "      </script>\n",
       "   </body>\n",
       "</html>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "$mQuadric = [ [2,0,0,0], [0,2,0,0], [0,0,2,0], [0,0,0,2],\n",
    "              [1,1,0,0], [1,0,1,0], [1,0,0,1],\n",
    "              [0,1,1,0], [0,1,0,1], [0,0,1,1]];\n",
    "$cQuadric = [1,1,1,1,0,0,0,0,0,0];\n",
    "$TQuadric = new Hypersurface<Min>(MONOMIALS=>$mQuadric, COEFFICIENTS=>$cQuadric);\n",
    "$TQuadric->VISUAL;"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### B: exporting tropical surfaces from polymake\n",
    "\n",
    "There are many options one can pass to a VISUAL routine in Polymake in order to customize the look of the exported 3d-model. Some of them are useful for 3d printing, others should rather stay hidden. The most basic configuration is the following, which tells polymake not to visualize the vertices and edges."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "$surface_opts = {VertexStyle=>'hidden', EdgeStyle=>'hidden'};\n",
    "x3d($TQuadric->VISUAL($surface_opts), File=>$x3d_dir.\"filename.x3d\");"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "One can also explicitely specify the bounding box of the model. This is very useful when creating one model from multiple objects, e.g., a tropical curve on a tropical surface. The first line below creates a bounding box around the vertices of the tropical surface:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "$bFacets = polytope::bounding_box_facets($TQuadric->affine_chart->VERTICES,offset=>1,surplus_k=>0.4, make_cube=>1);\n",
    "x3d($TQuadric->VISUAL($surface_opts,BoundingFacets=>$bFacets),File=>$x3d_dir.\"TQuadric.x3d\");"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For more options, please see the polymake tutorial on visualization."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### C: solidifying tropical surfaces\n",
    "\n",
    "All 3d printable models need volume. This can be done by solidifying the surface in Blender and/or Polymake."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Option A: Blender"
   ]
  },
  {
   "attachments": {
    "beveled_quadric.jpeg": {
     "image/jpeg": "[encoded data, 410864 characters]"
    },
    "imported_quadric.jpeg": {
     "image/jpeg": "[encoded data, 453164 characters]"
    },
    "joined_quadric.jpeg": {
     "image/jpeg": "[encoded data, 365404 characters]"
    },
    "modifier_properties.jpeg": {
     "image/jpeg": "[encoded data, 337696 characters]"
    },
    "solidified_quadric.jpeg": {
     "image/jpeg": "[encoded data, 383400 characters]"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The following tutorial was made in blender 2.81.\n",
    "1. Import the previously exported x3d file of the surface,\n",
    "    ![imported_quadric.jpeg](attachment:imported_quadric.jpeg)\n",
    "\n",
    "2. Select all layers (click onselect single layer, press 'A') and join them\n",
    "    ![joined_quadric.jpeg](attachment:joined_quadric.jpeg)\n",
    "\n",
    "3. Select modifier properties\n",
    "    ![modifier_properties.jpeg](attachment:modifier_properties.jpeg)\n",
    "\n",
    "4. Add a **Solidify** modifier, set *Offset* to 0 and *Thickness* sufficiently large\n",
    "    ![solidified_quadric.jpeg](attachment:solidified_quadric.jpeg)\n",
    "\n",
    "5. Add a **Bevel** modifier and adjust *Segments*, *Width* (optional)  \n",
    "    ![beveled_quadric.jpeg](attachment:beveled_quadric.jpeg)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Option B: in polymake\n",
    "\n",
    "To solidify the surface in polymake, we need to decide on the planned size of the model and the desired cell thickness. A minimal thickness of 2mm is recommended for printing with plastics."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<!--\n",
       "polymake for knusper\n",
       "Thu Aug 27 10:34:31 2020\n",
       "_bounded\n",
       "-->\n",
       "\n",
       "\n",
       "<html>\n",
       "   <head>\n",
       "      <meta charset=utf-8>\n",
       "      <title>_bounded</title>\n",
       "      <style>\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "*/\n",
       "         html {overflow: scroll;}\n",
       "         strong{font-size: 18px;}\n",
       "         canvas { z-index: 8; }\n",
       "         input[type='radio'] {margin-left:0;}\n",
       "         input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;}\n",
       "         .group{padding-bottom: 15px;}\n",
       "         .settings * {z-index: 11; }\n",
       "         .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;}\n",
       "         .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} \n",
       "         .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;}\n",
       "         .showSettingsButton{visibility: visible; z-index: 12; position: absolute }\n",
       "         .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5}\n",
       "         button{margin-left: 0; margin-top: 10px}\n",
       "         img{cursor: pointer;}\n",
       "         .suboption{padding-top: 15px;}\n",
       "         #model27726393755 { width: 100%; height: 100%; }\n",
       "         .threejs_container { width: 100%; height: 75vh;}\n",
       "         .settings{max-height: 74vh} \n",
       "         input[type=range] {\n",
       "           -webkit-appearance: none;\n",
       "           padding:0; \n",
       "           width:90%; \n",
       "           margin-left: auto;\n",
       "           margin-right: auto;\n",
       "           margin-top: 15px;\n",
       "           margin-bottom: 15px;\n",
       "           display: block;\t\n",
       "         }\n",
       "         input[type=range]:focus {\n",
       "           outline: none;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-runnable-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "           -webkit-appearance: none;\n",
       "           margin-top: -5px;\n",
       "         }\n",
       "         input[type=range]:focus::-webkit-slider-runnable-track {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]::-moz-range-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-moz-range-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]::-ms-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           background: transparent;\n",
       "           border-color: transparent;\n",
       "           color: transparent;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_END\n",
       "*/\n",
       "\t\t</style>\n",
       "   </head>\n",
       "<body>\n",
       "   <div class='threejs_container'>\n",
       "\t\t<div id='settings_2' class='settings'>\n",
       "\t\t\t<div class=group id='explode_2'>\n",
       "\t\t\t\t<strong>Explode</strong>\n",
       "\t\t\t\t<input id='explodeRange_2' type='range' min=0 max=6 step=0.01 value=0>\n",
       "\t\t\t\t<div class=indented><input id='explodeCheckbox_2' type='checkbox'>Automatic explosion</div>\n",
       "\t\t\t\t<div class=suboption>Exploding speed</div>\n",
       "\t\t\t\t<input id='explodingSpeedRange_2' type='range' min=0 max=0.5 step=0.001 value=0.05>\n",
       "\t\t\t</div>\n",
       "\t\n",
       "\t\t\t<div class=group id='transparency_2' class='transparency'>\n",
       "\t\t\t\t<strong>Transparency</strong>\n",
       "\t\t\t\t<input id='transparencyRange_2' type='range' min=0 max=1 step=0.01 value=0>\n",
       "\t\t\t</div>\n",
       "\t\t\t\n",
       "\t\t\t<div class=group id='rotation_2'>\n",
       "\t\t\t\t<strong>Rotation</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationX_2'> x-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationY_2'> y-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationZ_2'> z-axis</div>\n",
       "\t\t\t\t\t<button id='resetButton_2'>Reset</button>\n",
       "\t\t\t\t</div>\n",
       "\n",
       "\t\t\t\t<div class=suboption>Rotation speed</div>\n",
       "\t\t\t\t<input id='rotationSpeedRange_2' type='range' min=0 max=5 step=0.01 value=2>\n",
       "\t\t\t</div>\n",
       "\n",
       "\n",
       "\t\t\t<div class=group id='display_2'>\n",
       "\t\t\t\t<strong>Display</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div id='shownObjectTypesList_2' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t\t<div class=suboption>Objects</div>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t   <div id='shownObjectsList_2' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "         \n",
       "         <div class=group id='camera_2'>\n",
       "            <strong>Camera</strong>\n",
       "            <div class=indented>\n",
       "               <form>\n",
       "                  <select id=\"cameraType_2\">\n",
       "                     <option value='perspective' selected> Perspective<br></option>\n",
       "                     <option value='orthographic' > Orthographic<br></option>\n",
       "                  </select>\n",
       "               </form>\n",
       "            </div>\n",
       "         </div>\n",
       "\n",
       "\t\t\t<div class=group id='svg_2'>\n",
       "\t\t\t\t<strong>SVG</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<form>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='download' id='download_2' checked> Download<br>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='tab' id='tab_2' > New tab<br>\n",
       "\t\t\t\t\t</form>\n",
       "\t\t\t\t\t<button id='takeScreenshot_2'>Screenshot</button>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "\n",
       "\t\t</div>\t<!-- end of settings -->\n",
       "\t\t<img id='hideSettingsButton_2' class='hideSettingsButton' src='/kernelspecs/polymake/close.svg' width=20px\">\n",
       "\t\t<img id='showSettingsButton_2' class='showSettingsButton' src='/kernelspecs/polymake/menu.svg' width=20px\">\n",
       "<div id=\"model27726393755\"></div>\n",
       "</div>\n",
       "   <script>\n",
       "    requirejs.config({\n",
       "      paths: {\n",
       "        three: '/kernelspecs/polymake/three',\n",
       "        TrackballControls: '/kernelspecs/polymake/TrackballControls',\n",
       "        OrbitControls: '/kernelspecs/polymake/OrbitControls',\n",
       "        Projector: '/kernelspecs/polymake/Projector',\n",
       "        SVGRenderer: '/kernelspecs/polymake/SVGRenderer',\n",
       "        WEBGL: '/kernelspecs/polymake/WebGL',\n",
       "      },\n",
       "      shim: {\n",
       "        'three': { exports: 'THREE'},\n",
       "        'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' },\n",
       "        'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' },\n",
       "        'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' },\n",
       "        'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' },\n",
       "        'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' },\n",
       "      }\n",
       "    });\n",
       "    \n",
       "    require(['three'],function(THREE){\n",
       "        window.THREE = THREE;\n",
       "      require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'],\n",
       "               function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) {\n",
       "    THREE.TrackballControls = TrackballControls;\n",
       "    THREE.OrbitControls = OrbitControls;\n",
       "    THREE.Projector = Projector;\n",
       "    THREE.SVGRenderer = SVGRenderer;\n",
       "    THREE.WEBGL = WEBGL;\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "\n",
       "const intervalLength = 25; // for automatic animations\n",
       "const explodableModel = true; \n",
       "const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false };\n",
       "const foldables = [];\n",
       "\n",
       "var three = document.getElementById(\"model27726393755\");\n",
       "var scene = new THREE.Scene();\n",
       "var renderer = new THREE.WebGLRenderer( { antialias: true } );\n",
       "var svgRenderer = new THREE.SVGRenderer( { antialias: true } );\n",
       "renderer.setPixelRatio( window.devicePixelRatio );\n",
       "renderer.setClearColor(0xFFFFFF, 1);\n",
       "svgRenderer.setClearColor(0xFFFFFF, 1);\n",
       "three.appendChild(renderer.domElement);\n",
       "\n",
       "var frustumSize = 4;\n",
       "var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()];\n",
       "cameras.forEach(function(cam) {\n",
       "    cam.position.set(0, 0, 5);\n",
       "    cam.lookAt(0, 0, 0);  \n",
       "    cam.up.set(0, 1, 0);         \n",
       "});\n",
       "var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)];\n",
       "var camera, control;\n",
       "\n",
       "controls[0].zoomSpeed = 0.2;\n",
       "controls[0].rotateSpeed = 4;\n",
       "\n",
       "\n",
       "// class to allow move points together with labels and spheres\n",
       "var PMPoint = function (x,y,z) {\n",
       "   this.vector = new THREE.Vector3(x,y,z);\n",
       "   this.sprite = null;\n",
       "   this.sphere = null;\n",
       "}\n",
       "PMPoint.prototype.addLabel = function(labelsprite) {\n",
       "   this.sprite = labelsprite;\n",
       "   this.sprite.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.addSphere = function(spheremesh) {\n",
       "   this.sphere = spheremesh;\n",
       "   this.sphere.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.set = function(x,y,z) {\n",
       "   this.vector.set(x,y,z);\n",
       "   if (this.sprite) {\n",
       "      this.sprite.position.copy(this.vector);\n",
       "   }\n",
       "   if (this.sphere) {\n",
       "      this.sphere.position.copy(this.vector);\n",
       "   }\n",
       "}\n",
       "PMPoint.prototype.radius = function() {\n",
       "   if (this.sphere) {\n",
       "      return this.sphere.geometry.parameters.radius;\n",
       "   } else {\n",
       "      return 0;\n",
       "   }\n",
       "};\n",
       "// select the target node\n",
       "var target = document.querySelector('#model27726393755');\n",
       "\n",
       "// create an observer instance\n",
       "var observer = new MutationObserver(function(mutations) {\n",
       "   mutations.forEach(function(mutation) {\n",
       "      if (mutation.removedNodes && mutation.removedNodes.length > 0) {\n",
       "         cancelAnimationFrame(renderId);\n",
       "         observer.disconnect();\n",
       "         console.log(\"cancelled frame \"+renderId);\n",
       "      }\n",
       "   });\n",
       "});\n",
       "\n",
       "// configuration of the observer:\n",
       "var config = { childList: true, characterData: true }\n",
       "\n",
       "// pass in the target node, as well as the observer options\n",
       "while (target) {\n",
       "   if (target.className==\"output\") {\n",
       "      observer.observe(target, config);\n",
       "      break;\n",
       "   }\n",
       "   target = target.parentNode;\n",
       "}\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "var obj0 = new THREE.Object3D();\n",
       "obj0.name = \"_bounded\";\n",
       "obj0.userData.explodable = 1;\n",
       "obj0.userData.points = [];\n",
       "obj0.userData.points.push(new PMPoint(1.056, 2.8, 1));\n",
       "obj0.userData.points.push(new PMPoint(0.944, 2.8, 1));\n",
       "obj0.userData.points.push(new PMPoint(0.944, 1, 1));\n",
       "obj0.userData.points.push(new PMPoint(1.056, 1, 1));\n",
       "obj0.userData.points.push(new PMPoint(0.944, 1, 2.8));\n",
       "obj0.userData.points.push(new PMPoint(1.056, 1, 2.8));\n",
       "obj0.userData.points.push(new PMPoint(0.944, 2.8, 2.8));\n",
       "obj0.userData.points.push(new PMPoint(1.056, 2.8, 2.8));\n",
       "\n",
       "obj0.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj0.userData.facets = [[5, 3, 0, 7], [1, 2, 4, 6], [2, 3, 5, 4], [0, 3, 2, 1], [7, 0, 1, 6], [5, 7, 6, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj0.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj0);\n",
       "scene.add(obj0);\n",
       "\n",
       "var obj1 = new THREE.Object3D();\n",
       "obj1.name = \"_bounded\";\n",
       "obj1.userData.explodable = 1;\n",
       "obj1.userData.points = [];\n",
       "obj1.userData.points.push(new PMPoint(-1.056, 2.8, 0));\n",
       "obj1.userData.points.push(new PMPoint(-0.944, 2.8, 0));\n",
       "obj1.userData.points.push(new PMPoint(-0.944, 0, 0));\n",
       "obj1.userData.points.push(new PMPoint(-1.056, 0, 0));\n",
       "obj1.userData.points.push(new PMPoint(-0.944, 0, 2.8));\n",
       "obj1.userData.points.push(new PMPoint(-1.056, 0, 2.8));\n",
       "obj1.userData.points.push(new PMPoint(-0.944, 2.8, 2.8));\n",
       "obj1.userData.points.push(new PMPoint(-1.056, 2.8, 2.8));\n",
       "\n",
       "obj1.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj1.userData.facets = [[4, 2, 1, 6], [0, 3, 5, 7], [3, 2, 4, 5], [1, 2, 3, 0], [6, 1, 0, 7], [4, 6, 7, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj1.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj1);\n",
       "scene.add(obj1);\n",
       "\n",
       "var obj2 = new THREE.Object3D();\n",
       "obj2.name = \"_bounded\";\n",
       "obj2.userData.explodable = 1;\n",
       "obj2.userData.points = [];\n",
       "obj2.userData.points.push(new PMPoint(2.8, 1.056, 1));\n",
       "obj2.userData.points.push(new PMPoint(2.8, 0.944, 1));\n",
       "obj2.userData.points.push(new PMPoint(1, 0.944, 1));\n",
       "obj2.userData.points.push(new PMPoint(1, 1.056, 1));\n",
       "obj2.userData.points.push(new PMPoint(1, 0.944, 2.8));\n",
       "obj2.userData.points.push(new PMPoint(1, 1.056, 2.8));\n",
       "obj2.userData.points.push(new PMPoint(2.8, 0.944, 2.8));\n",
       "obj2.userData.points.push(new PMPoint(2.8, 1.056, 2.8));\n",
       "\n",
       "obj2.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj2.userData.facets = [[3, 5, 7, 0], [4, 5, 3, 2], [6, 4, 2, 1], [3, 0, 1, 2], [0, 7, 6, 1], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj2.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj2);\n",
       "scene.add(obj2);\n",
       "\n",
       "var obj3 = new THREE.Object3D();\n",
       "obj3.name = \"_bounded\";\n",
       "obj3.userData.explodable = 1;\n",
       "obj3.userData.points = [];\n",
       "obj3.userData.points.push(new PMPoint(2.8, -1.056, 0));\n",
       "obj3.userData.points.push(new PMPoint(2.8, -0.944, 0));\n",
       "obj3.userData.points.push(new PMPoint(0, -0.944, 0));\n",
       "obj3.userData.points.push(new PMPoint(0, -1.056, 0));\n",
       "obj3.userData.points.push(new PMPoint(0, -0.944, 2.8));\n",
       "obj3.userData.points.push(new PMPoint(0, -1.056, 2.8));\n",
       "obj3.userData.points.push(new PMPoint(2.8, -0.944, 2.8));\n",
       "obj3.userData.points.push(new PMPoint(2.8, -1.056, 2.8));\n",
       "\n",
       "obj3.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj3.userData.facets = [[2, 4, 6, 1], [5, 4, 2, 3], [7, 5, 3, 0], [2, 1, 0, 3], [1, 6, 7, 0], [6, 4, 5, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj3.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj3);\n",
       "scene.add(obj3);\n",
       "\n",
       "var obj4 = new THREE.Object3D();\n",
       "obj4.name = \"_bounded\";\n",
       "obj4.userData.explodable = 1;\n",
       "obj4.userData.points = [];\n",
       "obj4.userData.points.push(new PMPoint(0.960402, 1.0396, 1));\n",
       "obj4.userData.points.push(new PMPoint(1.0396, 0.960402, 1));\n",
       "obj4.userData.points.push(new PMPoint(0.039598, -0.039598, 0));\n",
       "obj4.userData.points.push(new PMPoint(-0.039598, 0.039598, 0));\n",
       "obj4.userData.points.push(new PMPoint(0.039598, -0.039598, 2.8));\n",
       "obj4.userData.points.push(new PMPoint(-0.039598, 0.039598, 2.8));\n",
       "obj4.userData.points.push(new PMPoint(1.0396, 0.960402, 2.8));\n",
       "obj4.userData.points.push(new PMPoint(0.960402, 1.0396, 2.8));\n",
       "\n",
       "obj4.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj4.userData.facets = [[5, 3, 2, 4], [0, 3, 5, 7], [1, 0, 7, 6], [4, 2, 1, 6], [2, 3, 0, 1], [5, 4, 6, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj4.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj4);\n",
       "scene.add(obj4);\n",
       "\n",
       "var obj5 = new THREE.Object3D();\n",
       "obj5.name = \"_bounded\";\n",
       "obj5.userData.explodable = 1;\n",
       "obj5.userData.points = [];\n",
       "obj5.userData.points.push(new PMPoint(2.8, 1, 1.056));\n",
       "obj5.userData.points.push(new PMPoint(2.8, 1, 0.944));\n",
       "obj5.userData.points.push(new PMPoint(1, 1, 0.944));\n",
       "obj5.userData.points.push(new PMPoint(1, 1, 1.056));\n",
       "obj5.userData.points.push(new PMPoint(1, 2.8, 0.944));\n",
       "obj5.userData.points.push(new PMPoint(1, 2.8, 1.056));\n",
       "obj5.userData.points.push(new PMPoint(2.8, 2.8, 0.944));\n",
       "obj5.userData.points.push(new PMPoint(2.8, 2.8, 1.056));\n",
       "\n",
       "obj5.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj5.userData.facets = [[5, 3, 0, 7], [2, 3, 5, 4], [0, 3, 2, 1], [1, 2, 4, 6], [7, 0, 1, 6], [5, 7, 6, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj5.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj5);\n",
       "scene.add(obj5);\n",
       "\n",
       "var obj6 = new THREE.Object3D();\n",
       "obj6.name = \"_bounded\";\n",
       "obj6.userData.explodable = 1;\n",
       "obj6.userData.points = [];\n",
       "obj6.userData.points.push(new PMPoint(2.8, 0, -1.056));\n",
       "obj6.userData.points.push(new PMPoint(2.8, 0, -0.944));\n",
       "obj6.userData.points.push(new PMPoint(0, 0, -0.944));\n",
       "obj6.userData.points.push(new PMPoint(0, 0, -1.056));\n",
       "obj6.userData.points.push(new PMPoint(0, 2.8, -0.944));\n",
       "obj6.userData.points.push(new PMPoint(0, 2.8, -1.056));\n",
       "obj6.userData.points.push(new PMPoint(2.8, 2.8, -0.944));\n",
       "obj6.userData.points.push(new PMPoint(2.8, 2.8, -1.056));\n",
       "\n",
       "obj6.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj6.userData.facets = [[4, 2, 1, 6], [3, 2, 4, 5], [1, 2, 3, 0], [0, 3, 5, 7], [6, 1, 0, 7], [4, 6, 7, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj6.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj6);\n",
       "scene.add(obj6);\n",
       "\n",
       "var obj7 = new THREE.Object3D();\n",
       "obj7.name = \"_bounded\";\n",
       "obj7.userData.explodable = 1;\n",
       "obj7.userData.points = [];\n",
       "obj7.userData.points.push(new PMPoint(0.960402, 1, 1.0396));\n",
       "obj7.userData.points.push(new PMPoint(1.0396, 1, 0.960402));\n",
       "obj7.userData.points.push(new PMPoint(0.039598, 0, -0.039598));\n",
       "obj7.userData.points.push(new PMPoint(-0.039598, 0, 0.039598));\n",
       "obj7.userData.points.push(new PMPoint(0.039598, 2.8, -0.039598));\n",
       "obj7.userData.points.push(new PMPoint(-0.039598, 2.8, 0.039598));\n",
       "obj7.userData.points.push(new PMPoint(1.0396, 2.8, 0.960402));\n",
       "obj7.userData.points.push(new PMPoint(0.960402, 2.8, 1.0396));\n",
       "\n",
       "obj7.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj7.userData.facets = [[3, 5, 4, 2], [7, 5, 3, 0], [6, 7, 0, 1], [2, 4, 6, 1], [3, 2, 1, 0], [4, 5, 7, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj7.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj7);\n",
       "scene.add(obj7);\n",
       "\n",
       "var obj8 = new THREE.Object3D();\n",
       "obj8.name = \"_bounded\";\n",
       "obj8.userData.explodable = 1;\n",
       "obj8.userData.points = [];\n",
       "obj8.userData.points.push(new PMPoint(1, 0.960402, 1.0396));\n",
       "obj8.userData.points.push(new PMPoint(1, 1.0396, 0.960402));\n",
       "obj8.userData.points.push(new PMPoint(0, 0.039598, -0.039598));\n",
       "obj8.userData.points.push(new PMPoint(0, -0.039598, 0.039598));\n",
       "obj8.userData.points.push(new PMPoint(2.8, 0.039598, -0.039598));\n",
       "obj8.userData.points.push(new PMPoint(2.8, -0.039598, 0.039598));\n",
       "obj8.userData.points.push(new PMPoint(2.8, 1.0396, 0.960402));\n",
       "obj8.userData.points.push(new PMPoint(2.8, 0.960402, 1.0396));\n",
       "\n",
       "obj8.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj8.userData.facets = [[5, 3, 2, 4], [0, 3, 5, 7], [1, 0, 7, 6], [4, 2, 1, 6], [2, 3, 0, 1], [5, 4, 6, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj8.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj8);\n",
       "scene.add(obj8);\n",
       "\n",
       "var obj9 = new THREE.Object3D();\n",
       "obj9.name = \"_bounded\";\n",
       "obj9.userData.explodable = 1;\n",
       "obj9.userData.points = [];\n",
       "obj9.userData.points.push(new PMPoint(-1.0396, 0.039598, 2.8));\n",
       "obj9.userData.points.push(new PMPoint(-0.960402, -0.039598, 2.8));\n",
       "obj9.userData.points.push(new PMPoint(-0.960402, -0.039598, 0));\n",
       "obj9.userData.points.push(new PMPoint(-1.0396, 0.039598, 0));\n",
       "obj9.userData.points.push(new PMPoint(-2.8, -1.8792, -1.8396));\n",
       "obj9.userData.points.push(new PMPoint(-2.8, -1.7208, -1.7604));\n",
       "obj9.userData.points.push(new PMPoint(-2.8, -1.8792, 2.8));\n",
       "obj9.userData.points.push(new PMPoint(-2.8, -1.7208, 2.8));\n",
       "\n",
       "obj9.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj9.userData.facets = [[2, 1, 6, 4], [0, 1, 2, 3], [7, 0, 3, 5], [2, 4, 5, 3], [4, 6, 7, 5], [6, 1, 0, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj9.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj9);\n",
       "scene.add(obj9);\n",
       "\n",
       "var obj10 = new THREE.Object3D();\n",
       "obj10.name = \"_bounded\";\n",
       "obj10.userData.explodable = 1;\n",
       "obj10.userData.points = [];\n",
       "obj10.userData.points.push(new PMPoint(0.039598, -1.0396, 2.8));\n",
       "obj10.userData.points.push(new PMPoint(-0.039598, -0.960402, 2.8));\n",
       "obj10.userData.points.push(new PMPoint(-0.039598, -0.960402, 0));\n",
       "obj10.userData.points.push(new PMPoint(0.039598, -1.0396, 0));\n",
       "obj10.userData.points.push(new PMPoint(-1.8792, -2.8, -1.8396));\n",
       "obj10.userData.points.push(new PMPoint(-1.7208, -2.8, -1.7604));\n",
       "obj10.userData.points.push(new PMPoint(-1.8792, -2.8, 2.8));\n",
       "obj10.userData.points.push(new PMPoint(-1.7208, -2.8, 2.8));\n",
       "\n",
       "obj10.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj10.userData.facets = [[3, 0, 7, 5], [1, 0, 3, 2], [6, 1, 2, 4], [3, 5, 4, 2], [5, 7, 6, 4], [7, 0, 1, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj10.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj10);\n",
       "scene.add(obj10);\n",
       "\n",
       "var obj11 = new THREE.Object3D();\n",
       "obj11.name = \"_bounded\";\n",
       "obj11.userData.explodable = 1;\n",
       "obj11.userData.points = [];\n",
       "obj11.userData.points.push(new PMPoint(-1, -0.056, 0));\n",
       "obj11.userData.points.push(new PMPoint(-1, 0.056, 0));\n",
       "obj11.userData.points.push(new PMPoint(0, 0.056, 0));\n",
       "obj11.userData.points.push(new PMPoint(0, -0.056, 0));\n",
       "obj11.userData.points.push(new PMPoint(0, 0.056, 2.8));\n",
       "obj11.userData.points.push(new PMPoint(0, -0.056, 2.8));\n",
       "obj11.userData.points.push(new PMPoint(-1, 0.056, 2.8));\n",
       "obj11.userData.points.push(new PMPoint(-1, -0.056, 2.8));\n",
       "\n",
       "obj11.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj11.userData.facets = [[7, 0, 3, 5], [1, 0, 7, 6], [2, 1, 6, 4], [5, 3, 2, 4], [3, 0, 1, 2], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj11.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj11);\n",
       "scene.add(obj11);\n",
       "\n",
       "var obj12 = new THREE.Object3D();\n",
       "obj12.name = \"_bounded\";\n",
       "obj12.userData.explodable = 1;\n",
       "obj12.userData.points = [];\n",
       "obj12.userData.points.push(new PMPoint(-0.056, -1, 0));\n",
       "obj12.userData.points.push(new PMPoint(-0.056, 0, 0));\n",
       "obj12.userData.points.push(new PMPoint(0.056, 0, 0));\n",
       "obj12.userData.points.push(new PMPoint(0.056, -1, 0));\n",
       "obj12.userData.points.push(new PMPoint(0.056, 0, 2.8));\n",
       "obj12.userData.points.push(new PMPoint(0.056, -1, 2.8));\n",
       "obj12.userData.points.push(new PMPoint(-0.056, 0, 2.8));\n",
       "obj12.userData.points.push(new PMPoint(-0.056, -1, 2.8));\n",
       "\n",
       "obj12.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj12.userData.facets = [[7, 0, 3, 5], [1, 0, 7, 6], [2, 1, 6, 4], [5, 3, 2, 4], [3, 0, 1, 2], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj12.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj12);\n",
       "scene.add(obj12);\n",
       "\n",
       "var obj13 = new THREE.Object3D();\n",
       "obj13.name = \"_bounded\";\n",
       "obj13.userData.explodable = 1;\n",
       "obj13.userData.points = [];\n",
       "obj13.userData.points.push(new PMPoint(-1.0396, 2.8, 0.039598));\n",
       "obj13.userData.points.push(new PMPoint(-0.960402, 2.8, -0.039598));\n",
       "obj13.userData.points.push(new PMPoint(-0.960402, 0, -0.039598));\n",
       "obj13.userData.points.push(new PMPoint(-1.0396, 0, 0.039598));\n",
       "obj13.userData.points.push(new PMPoint(-2.8, -1.8396, -1.8792));\n",
       "obj13.userData.points.push(new PMPoint(-2.8, -1.7604, -1.7208));\n",
       "obj13.userData.points.push(new PMPoint(-2.8, 2.8, -1.8792));\n",
       "obj13.userData.points.push(new PMPoint(-2.8, 2.8, -1.7208));\n",
       "\n",
       "obj13.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj13.userData.facets = [[1, 2, 4, 6], [3, 2, 1, 0], [4, 2, 3, 5], [5, 3, 0, 7], [6, 4, 5, 7], [1, 6, 7, 0]];\n",
       "   <!-- Facet style -->\n",
       "obj13.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj13);\n",
       "scene.add(obj13);\n",
       "\n",
       "var obj14 = new THREE.Object3D();\n",
       "obj14.name = \"_bounded\";\n",
       "obj14.userData.explodable = 1;\n",
       "obj14.userData.points = [];\n",
       "obj14.userData.points.push(new PMPoint(0.039598, 2.8, -1.0396));\n",
       "obj14.userData.points.push(new PMPoint(-0.039598, 2.8, -0.960402));\n",
       "obj14.userData.points.push(new PMPoint(-0.039598, 0, -0.960402));\n",
       "obj14.userData.points.push(new PMPoint(0.039598, 0, -1.0396));\n",
       "obj14.userData.points.push(new PMPoint(-1.8792, -1.8396, -2.8));\n",
       "obj14.userData.points.push(new PMPoint(-1.7208, -1.7604, -2.8));\n",
       "obj14.userData.points.push(new PMPoint(-1.8792, 2.8, -2.8));\n",
       "obj14.userData.points.push(new PMPoint(-1.7208, 2.8, -2.8));\n",
       "\n",
       "obj14.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj14.userData.facets = [[0, 3, 5, 7], [2, 3, 0, 1], [5, 3, 2, 4], [4, 2, 1, 6], [0, 7, 6, 1], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj14.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj14);\n",
       "scene.add(obj14);\n",
       "\n",
       "var obj15 = new THREE.Object3D();\n",
       "obj15.name = \"_bounded\";\n",
       "obj15.userData.explodable = 1;\n",
       "obj15.userData.points = [];\n",
       "obj15.userData.points.push(new PMPoint(-1, 0, -0.056));\n",
       "obj15.userData.points.push(new PMPoint(-1, 0, 0.056));\n",
       "obj15.userData.points.push(new PMPoint(0, 0, 0.056));\n",
       "obj15.userData.points.push(new PMPoint(0, 0, -0.056));\n",
       "obj15.userData.points.push(new PMPoint(0, 2.8, 0.056));\n",
       "obj15.userData.points.push(new PMPoint(0, 2.8, -0.056));\n",
       "obj15.userData.points.push(new PMPoint(-1, 2.8, 0.056));\n",
       "obj15.userData.points.push(new PMPoint(-1, 2.8, -0.056));\n",
       "\n",
       "obj15.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj15.userData.facets = [[0, 7, 5, 3], [6, 7, 0, 1], [4, 6, 1, 2], [3, 5, 4, 2], [0, 3, 2, 1], [5, 7, 6, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj15.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj15);\n",
       "scene.add(obj15);\n",
       "\n",
       "var obj16 = new THREE.Object3D();\n",
       "obj16.name = \"_bounded\";\n",
       "obj16.userData.explodable = 1;\n",
       "obj16.userData.points = [];\n",
       "obj16.userData.points.push(new PMPoint(-0.056, 0, -1));\n",
       "obj16.userData.points.push(new PMPoint(-0.056, 0, 0));\n",
       "obj16.userData.points.push(new PMPoint(0.056, 0, 0));\n",
       "obj16.userData.points.push(new PMPoint(0.056, 0, -1));\n",
       "obj16.userData.points.push(new PMPoint(0.056, 2.8, 0));\n",
       "obj16.userData.points.push(new PMPoint(0.056, 2.8, -1));\n",
       "obj16.userData.points.push(new PMPoint(-0.056, 2.8, 0));\n",
       "obj16.userData.points.push(new PMPoint(-0.056, 2.8, -1));\n",
       "\n",
       "obj16.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj16.userData.facets = [[0, 7, 5, 3], [6, 7, 0, 1], [4, 6, 1, 2], [3, 5, 4, 2], [0, 3, 2, 1], [5, 7, 6, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj16.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj16);\n",
       "scene.add(obj16);\n",
       "\n",
       "var obj17 = new THREE.Object3D();\n",
       "obj17.name = \"_bounded\";\n",
       "obj17.userData.explodable = 1;\n",
       "obj17.userData.points = [];\n",
       "obj17.userData.points.push(new PMPoint(-2.7604, -2.8, -2.7208));\n",
       "obj17.userData.points.push(new PMPoint(-1, -0.039598, 0.039598));\n",
       "obj17.userData.points.push(new PMPoint(-1, 0.039598, -0.039598));\n",
       "obj17.userData.points.push(new PMPoint(0, 0.039598, -0.039598));\n",
       "obj17.userData.points.push(new PMPoint(0, -0.039598, 0.039598));\n",
       "obj17.userData.points.push(new PMPoint(-2.7604, -2.7208, -2.8));\n",
       "obj17.userData.points.push(new PMPoint(-2.8, -1.7604, -1.8396));\n",
       "obj17.userData.points.push(new PMPoint(-2.8, -2.7208, -2.8));\n",
       "obj17.userData.points.push(new PMPoint(-2.8, -1.8396, -1.7604));\n",
       "obj17.userData.points.push(new PMPoint(-2.8, -2.8, -2.7208));\n",
       "obj17.userData.points.push(new PMPoint(-2.8, -2.8, -2.8));\n",
       "\n",
       "obj17.userData.edgeindices = [1, 2, 2, 3, 0, 4, 1, 4, 3, 4, 3, 5, 2, 6, 5, 7, 6, 7, 1, 8, 6, 8, 0, 9, 8, 9, 0, 10, 5, 10, 7, 10, 9, 10];\n",
       "obj17.userData.facets = [[8, 1, 2, 6], [4, 1, 8, 9, 0], [3, 4, 0, 10, 5], [6, 2, 3, 5, 7], [2, 1, 4, 3], [8, 6, 7, 10, 9], [9, 10, 0], [7, 5, 10]];\n",
       "   <!-- Facet style -->\n",
       "obj17.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj17);\n",
       "scene.add(obj17);\n",
       "\n",
       "var obj18 = new THREE.Object3D();\n",
       "obj18.name = \"_bounded\";\n",
       "obj18.userData.explodable = 1;\n",
       "obj18.userData.points = [];\n",
       "obj18.userData.points.push(new PMPoint(2.8, -1.0396, 0.039598));\n",
       "obj18.userData.points.push(new PMPoint(2.8, -0.960402, -0.039598));\n",
       "obj18.userData.points.push(new PMPoint(0, -0.960402, -0.039598));\n",
       "obj18.userData.points.push(new PMPoint(0, -1.0396, 0.039598));\n",
       "obj18.userData.points.push(new PMPoint(-1.8396, -2.8, -1.8792));\n",
       "obj18.userData.points.push(new PMPoint(-1.7604, -2.8, -1.7208));\n",
       "obj18.userData.points.push(new PMPoint(2.8, -2.8, -1.8792));\n",
       "obj18.userData.points.push(new PMPoint(2.8, -2.8, -1.7208));\n",
       "\n",
       "obj18.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj18.userData.facets = [[2, 1, 6, 4], [0, 1, 2, 3], [2, 4, 5, 3], [7, 0, 3, 5], [6, 1, 0, 7], [4, 6, 7, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj18.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj18);\n",
       "scene.add(obj18);\n",
       "\n",
       "var obj19 = new THREE.Object3D();\n",
       "obj19.name = \"_bounded\";\n",
       "obj19.userData.explodable = 1;\n",
       "obj19.userData.points = [];\n",
       "obj19.userData.points.push(new PMPoint(2.8, 0.039598, -1.0396));\n",
       "obj19.userData.points.push(new PMPoint(2.8, -0.039598, -0.960402));\n",
       "obj19.userData.points.push(new PMPoint(0, -0.039598, -0.960402));\n",
       "obj19.userData.points.push(new PMPoint(0, 0.039598, -1.0396));\n",
       "obj19.userData.points.push(new PMPoint(-1.8396, -1.8792, -2.8));\n",
       "obj19.userData.points.push(new PMPoint(-1.7604, -1.7208, -2.8));\n",
       "obj19.userData.points.push(new PMPoint(2.8, -1.8792, -2.8));\n",
       "obj19.userData.points.push(new PMPoint(2.8, -1.7208, -2.8));\n",
       "\n",
       "obj19.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj19.userData.facets = [[3, 0, 7, 5], [1, 0, 3, 2], [3, 5, 4, 2], [6, 1, 2, 4], [7, 0, 1, 6], [5, 7, 6, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj19.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj19);\n",
       "scene.add(obj19);\n",
       "\n",
       "var obj20 = new THREE.Object3D();\n",
       "obj20.name = \"_bounded\";\n",
       "obj20.userData.explodable = 1;\n",
       "obj20.userData.points = [];\n",
       "obj20.userData.points.push(new PMPoint(0, -1, -0.056));\n",
       "obj20.userData.points.push(new PMPoint(0, -1, 0.056));\n",
       "obj20.userData.points.push(new PMPoint(0, 0, 0.056));\n",
       "obj20.userData.points.push(new PMPoint(0, 0, -0.056));\n",
       "obj20.userData.points.push(new PMPoint(2.8, 0, 0.056));\n",
       "obj20.userData.points.push(new PMPoint(2.8, 0, -0.056));\n",
       "obj20.userData.points.push(new PMPoint(2.8, -1, 0.056));\n",
       "obj20.userData.points.push(new PMPoint(2.8, -1, -0.056));\n",
       "\n",
       "obj20.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj20.userData.facets = [[7, 0, 3, 5], [1, 0, 7, 6], [2, 1, 6, 4], [5, 3, 2, 4], [3, 0, 1, 2], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj20.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj20);\n",
       "scene.add(obj20);\n",
       "\n",
       "var obj21 = new THREE.Object3D();\n",
       "obj21.name = \"_bounded\";\n",
       "obj21.userData.explodable = 1;\n",
       "obj21.userData.points = [];\n",
       "obj21.userData.points.push(new PMPoint(0, -0.056, -1));\n",
       "obj21.userData.points.push(new PMPoint(0, -0.056, 0));\n",
       "obj21.userData.points.push(new PMPoint(0, 0.056, 0));\n",
       "obj21.userData.points.push(new PMPoint(0, 0.056, -1));\n",
       "obj21.userData.points.push(new PMPoint(2.8, 0.056, 0));\n",
       "obj21.userData.points.push(new PMPoint(2.8, 0.056, -1));\n",
       "obj21.userData.points.push(new PMPoint(2.8, -0.056, 0));\n",
       "obj21.userData.points.push(new PMPoint(2.8, -0.056, -1));\n",
       "\n",
       "obj21.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj21.userData.facets = [[7, 0, 3, 5], [1, 0, 7, 6], [2, 1, 6, 4], [5, 3, 2, 4], [3, 0, 1, 2], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj21.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj21);\n",
       "scene.add(obj21);\n",
       "\n",
       "var obj22 = new THREE.Object3D();\n",
       "obj22.name = \"_bounded\";\n",
       "obj22.userData.explodable = 1;\n",
       "obj22.userData.points = [];\n",
       "obj22.userData.points.push(new PMPoint(-2.7208, -2.8, -2.8));\n",
       "obj22.userData.points.push(new PMPoint(-1.7604, -2.8, -1.8396));\n",
       "obj22.userData.points.push(new PMPoint(-1.8396, -2.8, -1.7604));\n",
       "obj22.userData.points.push(new PMPoint(-0.039598, -1, 0.039598));\n",
       "obj22.userData.points.push(new PMPoint(0.039598, -1, -0.039598));\n",
       "obj22.userData.points.push(new PMPoint(0.039598, 0, -0.039598));\n",
       "obj22.userData.points.push(new PMPoint(-0.039598, 0, 0.039598));\n",
       "obj22.userData.points.push(new PMPoint(-2.7208, -2.7604, -2.8));\n",
       "obj22.userData.points.push(new PMPoint(-2.8, -2.7604, -2.7208));\n",
       "obj22.userData.points.push(new PMPoint(-2.8, -2.8, -2.7208));\n",
       "obj22.userData.points.push(new PMPoint(-2.8, -2.8, -2.8));\n",
       "\n",
       "obj22.userData.edgeindices = [0, 1, 1, 2, 2, 3, 1, 4, 3, 4, 4, 5, 3, 6, 5, 6, 0, 7, 5, 7, 6, 8, 2, 9, 8, 9, 0, 10, 7, 10, 8, 10, 9, 10];\n",
       "obj22.userData.facets = [[2, 3, 6, 8, 9], [4, 3, 2, 1], [5, 4, 1, 0, 7], [8, 6, 5, 7, 10], [6, 3, 4, 5], [9, 8, 10], [2, 9, 10, 0, 1], [10, 7, 0]];\n",
       "   <!-- Facet style -->\n",
       "obj22.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj22);\n",
       "scene.add(obj22);\n",
       "\n",
       "var obj23 = new THREE.Object3D();\n",
       "obj23.name = \"_bounded\";\n",
       "obj23.userData.explodable = 1;\n",
       "obj23.userData.points = [];\n",
       "obj23.userData.points.push(new PMPoint(-2.7208, -2.8, -2.8));\n",
       "obj23.userData.points.push(new PMPoint(-2.7208, -2.8, -2.7604));\n",
       "obj23.userData.points.push(new PMPoint(-0.039598, 0.039598, -1));\n",
       "obj23.userData.points.push(new PMPoint(0.039598, -0.039598, -1));\n",
       "obj23.userData.points.push(new PMPoint(0.039598, -0.039598, 0));\n",
       "obj23.userData.points.push(new PMPoint(-0.039598, 0.039598, 0));\n",
       "obj23.userData.points.push(new PMPoint(-1.7604, -1.8396, -2.8));\n",
       "obj23.userData.points.push(new PMPoint(-1.8396, -1.7604, -2.8));\n",
       "obj23.userData.points.push(new PMPoint(-2.8, -2.7208, -2.7604));\n",
       "obj23.userData.points.push(new PMPoint(-2.8, -2.7208, -2.8));\n",
       "obj23.userData.points.push(new PMPoint(-2.8, -2.8, -2.8));\n",
       "\n",
       "obj23.userData.edgeindices = [0, 1, 2, 3, 1, 4, 3, 4, 2, 5, 4, 5, 0, 6, 3, 6, 2, 7, 6, 7, 5, 8, 7, 9, 8, 9, 0, 10, 1, 10, 8, 10, 9, 10];\n",
       "obj23.userData.facets = [[7, 2, 3, 6], [5, 2, 7, 9, 8], [4, 5, 8, 10, 1], [6, 3, 4, 1, 0], [3, 2, 5, 4], [9, 10, 8], [0, 1, 10], [7, 6, 0, 10, 9]];\n",
       "   <!-- Facet style -->\n",
       "obj23.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj23);\n",
       "scene.add(obj23);\n",
       "\n",
       "var obj24 = new THREE.Object3D();\n",
       "obj24.name = \"_bounded\";\n",
       "obj24.userData.explodable = 1;\n",
       "obj24.userData.points = [];\n",
       "obj24.userData.points.push(new PMPoint(-1.056, 2.8, 0));\n",
       "obj24.userData.points.push(new PMPoint(-0.944, 2.8, 0));\n",
       "obj24.userData.points.push(new PMPoint(-0.944, 0, 0));\n",
       "obj24.userData.points.push(new PMPoint(-1.056, 0, 0));\n",
       "obj24.userData.points.push(new PMPoint(-0.944, 0, 2.8));\n",
       "obj24.userData.points.push(new PMPoint(-1.056, 0, 2.8));\n",
       "obj24.userData.points.push(new PMPoint(-0.944, 2.8, 2.8));\n",
       "obj24.userData.points.push(new PMPoint(-1.056, 2.8, 2.8));\n",
       "\n",
       "obj24.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj24.userData.facets = [[4, 2, 1, 6], [0, 3, 5, 7], [3, 2, 4, 5], [1, 2, 3, 0], [6, 1, 0, 7], [4, 6, 7, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj24.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj24);\n",
       "scene.add(obj24);\n",
       "\n",
       "var obj25 = new THREE.Object3D();\n",
       "obj25.name = \"_bounded\";\n",
       "obj25.userData.explodable = 1;\n",
       "obj25.userData.points = [];\n",
       "obj25.userData.points.push(new PMPoint(2.8, 1.056, 1));\n",
       "obj25.userData.points.push(new PMPoint(2.8, 0.944, 1));\n",
       "obj25.userData.points.push(new PMPoint(1, 0.944, 1));\n",
       "obj25.userData.points.push(new PMPoint(1, 1.056, 1));\n",
       "obj25.userData.points.push(new PMPoint(1, 0.944, 2.8));\n",
       "obj25.userData.points.push(new PMPoint(1, 1.056, 2.8));\n",
       "obj25.userData.points.push(new PMPoint(2.8, 0.944, 2.8));\n",
       "obj25.userData.points.push(new PMPoint(2.8, 1.056, 2.8));\n",
       "\n",
       "obj25.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj25.userData.facets = [[3, 5, 7, 0], [4, 5, 3, 2], [6, 4, 2, 1], [3, 0, 1, 2], [0, 7, 6, 1], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj25.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj25);\n",
       "scene.add(obj25);\n",
       "\n",
       "var obj26 = new THREE.Object3D();\n",
       "obj26.name = \"_bounded\";\n",
       "obj26.userData.explodable = 1;\n",
       "obj26.userData.points = [];\n",
       "obj26.userData.points.push(new PMPoint(2.8, -1.056, 0));\n",
       "obj26.userData.points.push(new PMPoint(2.8, -0.944, 0));\n",
       "obj26.userData.points.push(new PMPoint(0, -0.944, 0));\n",
       "obj26.userData.points.push(new PMPoint(0, -1.056, 0));\n",
       "obj26.userData.points.push(new PMPoint(0, -0.944, 2.8));\n",
       "obj26.userData.points.push(new PMPoint(0, -1.056, 2.8));\n",
       "obj26.userData.points.push(new PMPoint(2.8, -0.944, 2.8));\n",
       "obj26.userData.points.push(new PMPoint(2.8, -1.056, 2.8));\n",
       "\n",
       "obj26.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj26.userData.facets = [[2, 4, 6, 1], [5, 4, 2, 3], [7, 5, 3, 0], [2, 1, 0, 3], [1, 6, 7, 0], [6, 4, 5, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj26.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj26);\n",
       "scene.add(obj26);\n",
       "\n",
       "var obj27 = new THREE.Object3D();\n",
       "obj27.name = \"_bounded\";\n",
       "obj27.userData.explodable = 1;\n",
       "obj27.userData.points = [];\n",
       "obj27.userData.points.push(new PMPoint(0.960402, 1.0396, 1));\n",
       "obj27.userData.points.push(new PMPoint(1.0396, 0.960402, 1));\n",
       "obj27.userData.points.push(new PMPoint(0.039598, -0.039598, 0));\n",
       "obj27.userData.points.push(new PMPoint(-0.039598, 0.039598, 0));\n",
       "obj27.userData.points.push(new PMPoint(0.039598, -0.039598, 2.8));\n",
       "obj27.userData.points.push(new PMPoint(-0.039598, 0.039598, 2.8));\n",
       "obj27.userData.points.push(new PMPoint(1.0396, 0.960402, 2.8));\n",
       "obj27.userData.points.push(new PMPoint(0.960402, 1.0396, 2.8));\n",
       "\n",
       "obj27.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj27.userData.facets = [[5, 3, 2, 4], [0, 3, 5, 7], [1, 0, 7, 6], [4, 2, 1, 6], [2, 3, 0, 1], [5, 4, 6, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj27.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj27);\n",
       "scene.add(obj27);\n",
       "\n",
       "var obj28 = new THREE.Object3D();\n",
       "obj28.name = \"_bounded\";\n",
       "obj28.userData.explodable = 1;\n",
       "obj28.userData.points = [];\n",
       "obj28.userData.points.push(new PMPoint(2.8, 1, 1.056));\n",
       "obj28.userData.points.push(new PMPoint(2.8, 1, 0.944));\n",
       "obj28.userData.points.push(new PMPoint(1, 1, 0.944));\n",
       "obj28.userData.points.push(new PMPoint(1, 1, 1.056));\n",
       "obj28.userData.points.push(new PMPoint(1, 2.8, 0.944));\n",
       "obj28.userData.points.push(new PMPoint(1, 2.8, 1.056));\n",
       "obj28.userData.points.push(new PMPoint(2.8, 2.8, 0.944));\n",
       "obj28.userData.points.push(new PMPoint(2.8, 2.8, 1.056));\n",
       "\n",
       "obj28.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj28.userData.facets = [[5, 3, 0, 7], [2, 3, 5, 4], [0, 3, 2, 1], [1, 2, 4, 6], [7, 0, 1, 6], [5, 7, 6, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj28.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj28);\n",
       "scene.add(obj28);\n",
       "\n",
       "var obj29 = new THREE.Object3D();\n",
       "obj29.name = \"_bounded\";\n",
       "obj29.userData.explodable = 1;\n",
       "obj29.userData.points = [];\n",
       "obj29.userData.points.push(new PMPoint(2.8, 0, -1.056));\n",
       "obj29.userData.points.push(new PMPoint(2.8, 0, -0.944));\n",
       "obj29.userData.points.push(new PMPoint(0, 0, -0.944));\n",
       "obj29.userData.points.push(new PMPoint(0, 0, -1.056));\n",
       "obj29.userData.points.push(new PMPoint(0, 2.8, -0.944));\n",
       "obj29.userData.points.push(new PMPoint(0, 2.8, -1.056));\n",
       "obj29.userData.points.push(new PMPoint(2.8, 2.8, -0.944));\n",
       "obj29.userData.points.push(new PMPoint(2.8, 2.8, -1.056));\n",
       "\n",
       "obj29.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj29.userData.facets = [[4, 2, 1, 6], [3, 2, 4, 5], [1, 2, 3, 0], [0, 3, 5, 7], [6, 1, 0, 7], [4, 6, 7, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj29.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj29);\n",
       "scene.add(obj29);\n",
       "\n",
       "var obj30 = new THREE.Object3D();\n",
       "obj30.name = \"_bounded\";\n",
       "obj30.userData.explodable = 1;\n",
       "obj30.userData.points = [];\n",
       "obj30.userData.points.push(new PMPoint(0.960402, 1, 1.0396));\n",
       "obj30.userData.points.push(new PMPoint(1.0396, 1, 0.960402));\n",
       "obj30.userData.points.push(new PMPoint(0.039598, 0, -0.039598));\n",
       "obj30.userData.points.push(new PMPoint(-0.039598, 0, 0.039598));\n",
       "obj30.userData.points.push(new PMPoint(0.039598, 2.8, -0.039598));\n",
       "obj30.userData.points.push(new PMPoint(-0.039598, 2.8, 0.039598));\n",
       "obj30.userData.points.push(new PMPoint(1.0396, 2.8, 0.960402));\n",
       "obj30.userData.points.push(new PMPoint(0.960402, 2.8, 1.0396));\n",
       "\n",
       "obj30.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj30.userData.facets = [[3, 5, 4, 2], [7, 5, 3, 0], [6, 7, 0, 1], [2, 4, 6, 1], [3, 2, 1, 0], [4, 5, 7, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj30.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj30);\n",
       "scene.add(obj30);\n",
       "\n",
       "var obj31 = new THREE.Object3D();\n",
       "obj31.name = \"_bounded\";\n",
       "obj31.userData.explodable = 1;\n",
       "obj31.userData.points = [];\n",
       "obj31.userData.points.push(new PMPoint(1, 0.960402, 1.0396));\n",
       "obj31.userData.points.push(new PMPoint(1, 1.0396, 0.960402));\n",
       "obj31.userData.points.push(new PMPoint(0, 0.039598, -0.039598));\n",
       "obj31.userData.points.push(new PMPoint(0, -0.039598, 0.039598));\n",
       "obj31.userData.points.push(new PMPoint(2.8, 0.039598, -0.039598));\n",
       "obj31.userData.points.push(new PMPoint(2.8, -0.039598, 0.039598));\n",
       "obj31.userData.points.push(new PMPoint(2.8, 1.0396, 0.960402));\n",
       "obj31.userData.points.push(new PMPoint(2.8, 0.960402, 1.0396));\n",
       "\n",
       "obj31.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj31.userData.facets = [[5, 3, 2, 4], [0, 3, 5, 7], [1, 0, 7, 6], [4, 2, 1, 6], [2, 3, 0, 1], [5, 4, 6, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj31.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj31);\n",
       "scene.add(obj31);\n",
       "\n",
       "var obj32 = new THREE.Object3D();\n",
       "obj32.name = \"_bounded\";\n",
       "obj32.userData.explodable = 1;\n",
       "obj32.userData.points = [];\n",
       "obj32.userData.points.push(new PMPoint(-1.0396, 0.039598, 2.8));\n",
       "obj32.userData.points.push(new PMPoint(-0.960402, -0.039598, 2.8));\n",
       "obj32.userData.points.push(new PMPoint(-0.960402, -0.039598, 0));\n",
       "obj32.userData.points.push(new PMPoint(-1.0396, 0.039598, 0));\n",
       "obj32.userData.points.push(new PMPoint(-2.8, -1.8792, -1.8396));\n",
       "obj32.userData.points.push(new PMPoint(-2.8, -1.7208, -1.7604));\n",
       "obj32.userData.points.push(new PMPoint(-2.8, -1.8792, 2.8));\n",
       "obj32.userData.points.push(new PMPoint(-2.8, -1.7208, 2.8));\n",
       "\n",
       "obj32.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj32.userData.facets = [[2, 1, 6, 4], [0, 1, 2, 3], [7, 0, 3, 5], [2, 4, 5, 3], [4, 6, 7, 5], [6, 1, 0, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj32.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj32);\n",
       "scene.add(obj32);\n",
       "\n",
       "var obj33 = new THREE.Object3D();\n",
       "obj33.name = \"_bounded\";\n",
       "obj33.userData.explodable = 1;\n",
       "obj33.userData.points = [];\n",
       "obj33.userData.points.push(new PMPoint(0.039598, -1.0396, 2.8));\n",
       "obj33.userData.points.push(new PMPoint(-0.039598, -0.960402, 2.8));\n",
       "obj33.userData.points.push(new PMPoint(-0.039598, -0.960402, 0));\n",
       "obj33.userData.points.push(new PMPoint(0.039598, -1.0396, 0));\n",
       "obj33.userData.points.push(new PMPoint(-1.8792, -2.8, -1.8396));\n",
       "obj33.userData.points.push(new PMPoint(-1.7208, -2.8, -1.7604));\n",
       "obj33.userData.points.push(new PMPoint(-1.8792, -2.8, 2.8));\n",
       "obj33.userData.points.push(new PMPoint(-1.7208, -2.8, 2.8));\n",
       "\n",
       "obj33.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj33.userData.facets = [[3, 0, 7, 5], [1, 0, 3, 2], [6, 1, 2, 4], [3, 5, 4, 2], [5, 7, 6, 4], [7, 0, 1, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj33.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj33);\n",
       "scene.add(obj33);\n",
       "\n",
       "var obj34 = new THREE.Object3D();\n",
       "obj34.name = \"_bounded\";\n",
       "obj34.userData.explodable = 1;\n",
       "obj34.userData.points = [];\n",
       "obj34.userData.points.push(new PMPoint(-1, -0.056, 0));\n",
       "obj34.userData.points.push(new PMPoint(-1, 0.056, 0));\n",
       "obj34.userData.points.push(new PMPoint(0, 0.056, 0));\n",
       "obj34.userData.points.push(new PMPoint(0, -0.056, 0));\n",
       "obj34.userData.points.push(new PMPoint(0, 0.056, 2.8));\n",
       "obj34.userData.points.push(new PMPoint(0, -0.056, 2.8));\n",
       "obj34.userData.points.push(new PMPoint(-1, 0.056, 2.8));\n",
       "obj34.userData.points.push(new PMPoint(-1, -0.056, 2.8));\n",
       "\n",
       "obj34.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj34.userData.facets = [[7, 0, 3, 5], [1, 0, 7, 6], [2, 1, 6, 4], [5, 3, 2, 4], [3, 0, 1, 2], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj34.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj34);\n",
       "scene.add(obj34);\n",
       "\n",
       "var obj35 = new THREE.Object3D();\n",
       "obj35.name = \"_bounded\";\n",
       "obj35.userData.explodable = 1;\n",
       "obj35.userData.points = [];\n",
       "obj35.userData.points.push(new PMPoint(-0.056, -1, 0));\n",
       "obj35.userData.points.push(new PMPoint(-0.056, 0, 0));\n",
       "obj35.userData.points.push(new PMPoint(0.056, 0, 0));\n",
       "obj35.userData.points.push(new PMPoint(0.056, -1, 0));\n",
       "obj35.userData.points.push(new PMPoint(0.056, 0, 2.8));\n",
       "obj35.userData.points.push(new PMPoint(0.056, -1, 2.8));\n",
       "obj35.userData.points.push(new PMPoint(-0.056, 0, 2.8));\n",
       "obj35.userData.points.push(new PMPoint(-0.056, -1, 2.8));\n",
       "\n",
       "obj35.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj35.userData.facets = [[7, 0, 3, 5], [1, 0, 7, 6], [2, 1, 6, 4], [5, 3, 2, 4], [3, 0, 1, 2], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj35.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj35);\n",
       "scene.add(obj35);\n",
       "\n",
       "var obj36 = new THREE.Object3D();\n",
       "obj36.name = \"_bounded\";\n",
       "obj36.userData.explodable = 1;\n",
       "obj36.userData.points = [];\n",
       "obj36.userData.points.push(new PMPoint(-1.0396, 2.8, 0.039598));\n",
       "obj36.userData.points.push(new PMPoint(-0.960402, 2.8, -0.039598));\n",
       "obj36.userData.points.push(new PMPoint(-0.960402, 0, -0.039598));\n",
       "obj36.userData.points.push(new PMPoint(-1.0396, 0, 0.039598));\n",
       "obj36.userData.points.push(new PMPoint(-2.8, -1.8396, -1.8792));\n",
       "obj36.userData.points.push(new PMPoint(-2.8, -1.7604, -1.7208));\n",
       "obj36.userData.points.push(new PMPoint(-2.8, 2.8, -1.8792));\n",
       "obj36.userData.points.push(new PMPoint(-2.8, 2.8, -1.7208));\n",
       "\n",
       "obj36.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj36.userData.facets = [[1, 2, 4, 6], [3, 2, 1, 0], [4, 2, 3, 5], [5, 3, 0, 7], [6, 4, 5, 7], [1, 6, 7, 0]];\n",
       "   <!-- Facet style -->\n",
       "obj36.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj36);\n",
       "scene.add(obj36);\n",
       "\n",
       "var obj37 = new THREE.Object3D();\n",
       "obj37.name = \"_bounded\";\n",
       "obj37.userData.explodable = 1;\n",
       "obj37.userData.points = [];\n",
       "obj37.userData.points.push(new PMPoint(0.039598, 2.8, -1.0396));\n",
       "obj37.userData.points.push(new PMPoint(-0.039598, 2.8, -0.960402));\n",
       "obj37.userData.points.push(new PMPoint(-0.039598, 0, -0.960402));\n",
       "obj37.userData.points.push(new PMPoint(0.039598, 0, -1.0396));\n",
       "obj37.userData.points.push(new PMPoint(-1.8792, -1.8396, -2.8));\n",
       "obj37.userData.points.push(new PMPoint(-1.7208, -1.7604, -2.8));\n",
       "obj37.userData.points.push(new PMPoint(-1.8792, 2.8, -2.8));\n",
       "obj37.userData.points.push(new PMPoint(-1.7208, 2.8, -2.8));\n",
       "\n",
       "obj37.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj37.userData.facets = [[0, 3, 5, 7], [2, 3, 0, 1], [5, 3, 2, 4], [4, 2, 1, 6], [0, 7, 6, 1], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj37.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj37);\n",
       "scene.add(obj37);\n",
       "\n",
       "var obj38 = new THREE.Object3D();\n",
       "obj38.name = \"_bounded\";\n",
       "obj38.userData.explodable = 1;\n",
       "obj38.userData.points = [];\n",
       "obj38.userData.points.push(new PMPoint(-1, 0, -0.056));\n",
       "obj38.userData.points.push(new PMPoint(-1, 0, 0.056));\n",
       "obj38.userData.points.push(new PMPoint(0, 0, 0.056));\n",
       "obj38.userData.points.push(new PMPoint(0, 0, -0.056));\n",
       "obj38.userData.points.push(new PMPoint(0, 2.8, 0.056));\n",
       "obj38.userData.points.push(new PMPoint(0, 2.8, -0.056));\n",
       "obj38.userData.points.push(new PMPoint(-1, 2.8, 0.056));\n",
       "obj38.userData.points.push(new PMPoint(-1, 2.8, -0.056));\n",
       "\n",
       "obj38.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj38.userData.facets = [[0, 7, 5, 3], [6, 7, 0, 1], [4, 6, 1, 2], [3, 5, 4, 2], [0, 3, 2, 1], [5, 7, 6, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj38.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj38);\n",
       "scene.add(obj38);\n",
       "\n",
       "var obj39 = new THREE.Object3D();\n",
       "obj39.name = \"_bounded\";\n",
       "obj39.userData.explodable = 1;\n",
       "obj39.userData.points = [];\n",
       "obj39.userData.points.push(new PMPoint(-0.056, 0, -1));\n",
       "obj39.userData.points.push(new PMPoint(-0.056, 0, 0));\n",
       "obj39.userData.points.push(new PMPoint(0.056, 0, 0));\n",
       "obj39.userData.points.push(new PMPoint(0.056, 0, -1));\n",
       "obj39.userData.points.push(new PMPoint(0.056, 2.8, 0));\n",
       "obj39.userData.points.push(new PMPoint(0.056, 2.8, -1));\n",
       "obj39.userData.points.push(new PMPoint(-0.056, 2.8, 0));\n",
       "obj39.userData.points.push(new PMPoint(-0.056, 2.8, -1));\n",
       "\n",
       "obj39.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj39.userData.facets = [[0, 7, 5, 3], [6, 7, 0, 1], [4, 6, 1, 2], [3, 5, 4, 2], [0, 3, 2, 1], [5, 7, 6, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj39.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj39);\n",
       "scene.add(obj39);\n",
       "\n",
       "var obj40 = new THREE.Object3D();\n",
       "obj40.name = \"_bounded\";\n",
       "obj40.userData.explodable = 1;\n",
       "obj40.userData.points = [];\n",
       "obj40.userData.points.push(new PMPoint(-2.7604, -2.8, -2.7208));\n",
       "obj40.userData.points.push(new PMPoint(-1, -0.039598, 0.039598));\n",
       "obj40.userData.points.push(new PMPoint(-1, 0.039598, -0.039598));\n",
       "obj40.userData.points.push(new PMPoint(0, 0.039598, -0.039598));\n",
       "obj40.userData.points.push(new PMPoint(0, -0.039598, 0.039598));\n",
       "obj40.userData.points.push(new PMPoint(-2.7604, -2.7208, -2.8));\n",
       "obj40.userData.points.push(new PMPoint(-2.8, -1.7604, -1.8396));\n",
       "obj40.userData.points.push(new PMPoint(-2.8, -2.7208, -2.8));\n",
       "obj40.userData.points.push(new PMPoint(-2.8, -1.8396, -1.7604));\n",
       "obj40.userData.points.push(new PMPoint(-2.8, -2.8, -2.7208));\n",
       "obj40.userData.points.push(new PMPoint(-2.8, -2.8, -2.8));\n",
       "\n",
       "obj40.userData.edgeindices = [1, 2, 2, 3, 0, 4, 1, 4, 3, 4, 3, 5, 2, 6, 5, 7, 6, 7, 1, 8, 6, 8, 0, 9, 8, 9, 0, 10, 5, 10, 7, 10, 9, 10];\n",
       "obj40.userData.facets = [[8, 1, 2, 6], [4, 1, 8, 9, 0], [3, 4, 0, 10, 5], [6, 2, 3, 5, 7], [2, 1, 4, 3], [8, 6, 7, 10, 9], [9, 10, 0], [7, 5, 10]];\n",
       "   <!-- Facet style -->\n",
       "obj40.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj40);\n",
       "scene.add(obj40);\n",
       "\n",
       "var obj41 = new THREE.Object3D();\n",
       "obj41.name = \"_bounded\";\n",
       "obj41.userData.explodable = 1;\n",
       "obj41.userData.points = [];\n",
       "obj41.userData.points.push(new PMPoint(2.8, -1.0396, 0.039598));\n",
       "obj41.userData.points.push(new PMPoint(2.8, -0.960402, -0.039598));\n",
       "obj41.userData.points.push(new PMPoint(0, -0.960402, -0.039598));\n",
       "obj41.userData.points.push(new PMPoint(0, -1.0396, 0.039598));\n",
       "obj41.userData.points.push(new PMPoint(-1.8396, -2.8, -1.8792));\n",
       "obj41.userData.points.push(new PMPoint(-1.7604, -2.8, -1.7208));\n",
       "obj41.userData.points.push(new PMPoint(2.8, -2.8, -1.8792));\n",
       "obj41.userData.points.push(new PMPoint(2.8, -2.8, -1.7208));\n",
       "\n",
       "obj41.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj41.userData.facets = [[2, 1, 6, 4], [0, 1, 2, 3], [2, 4, 5, 3], [7, 0, 3, 5], [6, 1, 0, 7], [4, 6, 7, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj41.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj41);\n",
       "scene.add(obj41);\n",
       "\n",
       "var obj42 = new THREE.Object3D();\n",
       "obj42.name = \"_bounded\";\n",
       "obj42.userData.explodable = 1;\n",
       "obj42.userData.points = [];\n",
       "obj42.userData.points.push(new PMPoint(2.8, 0.039598, -1.0396));\n",
       "obj42.userData.points.push(new PMPoint(2.8, -0.039598, -0.960402));\n",
       "obj42.userData.points.push(new PMPoint(0, -0.039598, -0.960402));\n",
       "obj42.userData.points.push(new PMPoint(0, 0.039598, -1.0396));\n",
       "obj42.userData.points.push(new PMPoint(-1.8396, -1.8792, -2.8));\n",
       "obj42.userData.points.push(new PMPoint(-1.7604, -1.7208, -2.8));\n",
       "obj42.userData.points.push(new PMPoint(2.8, -1.8792, -2.8));\n",
       "obj42.userData.points.push(new PMPoint(2.8, -1.7208, -2.8));\n",
       "\n",
       "obj42.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj42.userData.facets = [[3, 0, 7, 5], [1, 0, 3, 2], [3, 5, 4, 2], [6, 1, 2, 4], [7, 0, 1, 6], [5, 7, 6, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj42.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj42);\n",
       "scene.add(obj42);\n",
       "\n",
       "var obj43 = new THREE.Object3D();\n",
       "obj43.name = \"_bounded\";\n",
       "obj43.userData.explodable = 1;\n",
       "obj43.userData.points = [];\n",
       "obj43.userData.points.push(new PMPoint(0, -1, -0.056));\n",
       "obj43.userData.points.push(new PMPoint(0, -1, 0.056));\n",
       "obj43.userData.points.push(new PMPoint(0, 0, 0.056));\n",
       "obj43.userData.points.push(new PMPoint(0, 0, -0.056));\n",
       "obj43.userData.points.push(new PMPoint(2.8, 0, 0.056));\n",
       "obj43.userData.points.push(new PMPoint(2.8, 0, -0.056));\n",
       "obj43.userData.points.push(new PMPoint(2.8, -1, 0.056));\n",
       "obj43.userData.points.push(new PMPoint(2.8, -1, -0.056));\n",
       "\n",
       "obj43.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj43.userData.facets = [[7, 0, 3, 5], [1, 0, 7, 6], [2, 1, 6, 4], [5, 3, 2, 4], [3, 0, 1, 2], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj43.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj43);\n",
       "scene.add(obj43);\n",
       "\n",
       "var obj44 = new THREE.Object3D();\n",
       "obj44.name = \"_bounded\";\n",
       "obj44.userData.explodable = 1;\n",
       "obj44.userData.points = [];\n",
       "obj44.userData.points.push(new PMPoint(0, -0.056, -1));\n",
       "obj44.userData.points.push(new PMPoint(0, -0.056, 0));\n",
       "obj44.userData.points.push(new PMPoint(0, 0.056, 0));\n",
       "obj44.userData.points.push(new PMPoint(0, 0.056, -1));\n",
       "obj44.userData.points.push(new PMPoint(2.8, 0.056, 0));\n",
       "obj44.userData.points.push(new PMPoint(2.8, 0.056, -1));\n",
       "obj44.userData.points.push(new PMPoint(2.8, -0.056, 0));\n",
       "obj44.userData.points.push(new PMPoint(2.8, -0.056, -1));\n",
       "\n",
       "obj44.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj44.userData.facets = [[7, 0, 3, 5], [1, 0, 7, 6], [2, 1, 6, 4], [5, 3, 2, 4], [3, 0, 1, 2], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj44.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj44);\n",
       "scene.add(obj44);\n",
       "\n",
       "var obj45 = new THREE.Object3D();\n",
       "obj45.name = \"_bounded\";\n",
       "obj45.userData.explodable = 1;\n",
       "obj45.userData.points = [];\n",
       "obj45.userData.points.push(new PMPoint(-2.7208, -2.8, -2.8));\n",
       "obj45.userData.points.push(new PMPoint(-1.7604, -2.8, -1.8396));\n",
       "obj45.userData.points.push(new PMPoint(-1.8396, -2.8, -1.7604));\n",
       "obj45.userData.points.push(new PMPoint(-0.039598, -1, 0.039598));\n",
       "obj45.userData.points.push(new PMPoint(0.039598, -1, -0.039598));\n",
       "obj45.userData.points.push(new PMPoint(0.039598, 0, -0.039598));\n",
       "obj45.userData.points.push(new PMPoint(-0.039598, 0, 0.039598));\n",
       "obj45.userData.points.push(new PMPoint(-2.7208, -2.7604, -2.8));\n",
       "obj45.userData.points.push(new PMPoint(-2.8, -2.7604, -2.7208));\n",
       "obj45.userData.points.push(new PMPoint(-2.8, -2.8, -2.7208));\n",
       "obj45.userData.points.push(new PMPoint(-2.8, -2.8, -2.8));\n",
       "\n",
       "obj45.userData.edgeindices = [0, 1, 1, 2, 2, 3, 1, 4, 3, 4, 4, 5, 3, 6, 5, 6, 0, 7, 5, 7, 6, 8, 2, 9, 8, 9, 0, 10, 7, 10, 8, 10, 9, 10];\n",
       "obj45.userData.facets = [[2, 3, 6, 8, 9], [4, 3, 2, 1], [5, 4, 1, 0, 7], [8, 6, 5, 7, 10], [6, 3, 4, 5], [9, 8, 10], [2, 9, 10, 0, 1], [10, 7, 0]];\n",
       "   <!-- Facet style -->\n",
       "obj45.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj45);\n",
       "scene.add(obj45);\n",
       "\n",
       "var obj46 = new THREE.Object3D();\n",
       "obj46.name = \"_bounded\";\n",
       "obj46.userData.explodable = 1;\n",
       "obj46.userData.points = [];\n",
       "obj46.userData.points.push(new PMPoint(-2.7208, -2.8, -2.8));\n",
       "obj46.userData.points.push(new PMPoint(-2.7208, -2.8, -2.7604));\n",
       "obj46.userData.points.push(new PMPoint(-0.039598, 0.039598, -1));\n",
       "obj46.userData.points.push(new PMPoint(0.039598, -0.039598, -1));\n",
       "obj46.userData.points.push(new PMPoint(0.039598, -0.039598, 0));\n",
       "obj46.userData.points.push(new PMPoint(-0.039598, 0.039598, 0));\n",
       "obj46.userData.points.push(new PMPoint(-1.7604, -1.8396, -2.8));\n",
       "obj46.userData.points.push(new PMPoint(-1.8396, -1.7604, -2.8));\n",
       "obj46.userData.points.push(new PMPoint(-2.8, -2.7208, -2.7604));\n",
       "obj46.userData.points.push(new PMPoint(-2.8, -2.7208, -2.8));\n",
       "obj46.userData.points.push(new PMPoint(-2.8, -2.8, -2.8));\n",
       "\n",
       "obj46.userData.edgeindices = [0, 1, 2, 3, 1, 4, 3, 4, 2, 5, 4, 5, 0, 6, 3, 6, 2, 7, 6, 7, 5, 8, 7, 9, 8, 9, 0, 10, 1, 10, 8, 10, 9, 10];\n",
       "obj46.userData.facets = [[7, 2, 3, 6], [5, 2, 7, 9, 8], [4, 5, 8, 10, 1], [6, 3, 4, 1, 0], [3, 2, 5, 4], [9, 10, 8], [0, 1, 10], [7, 6, 0, 10, 9]];\n",
       "   <!-- Facet style -->\n",
       "obj46.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj46);\n",
       "scene.add(obj46);\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "function textSpriteMaterial(message, parameters) {\n",
       "    if ( parameters === undefined ) parameters = {};\n",
       "    var fontface = \"Helvetica\";\n",
       "    var fontsize = parameters.hasOwnProperty(\"fontsize\") ? parameters[\"fontsize\"] : 15;\n",
       "    fontsize = fontsize*10;\n",
       "    var lines = message.split('\\\\n');\n",
       "    var size = 512;\n",
       "    for(var i = 0; i<lines.length; i++){\n",
       "        var tmp = lines[i].length;\n",
       "        while(tmp*fontsize > size){\n",
       "           fontsize--;\n",
       "        }\n",
       "    }\n",
       "    \n",
       "    var canvas = document.createElement('canvas');\n",
       "    canvas.width = size;\n",
       "    canvas.height = size;\n",
       "    var context = canvas.getContext('2d');\n",
       "    context.fillStyle = \"rgba(255, 255, 255, 0)\";\n",
       "    context.fill();\n",
       "    context.font = fontsize + \"px \" + fontface;\n",
       "    \n",
       "    // text color\n",
       "    context.fillStyle = \"rgba(0, 0, 0, 1.0)\";\n",
       "     for(var i = 0; i<lines.length; i++){\n",
       "        context.fillText(lines[i], size/2, size/2+i*fontsize);\n",
       "     }\n",
       "    \n",
       "    // canvas contents will be used for a texture\n",
       "    var texture = new THREE.Texture(canvas);\n",
       "    texture.needsUpdate = true;\n",
       "    \n",
       "    var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 });\n",
       "    return spriteMaterial;\n",
       "}\n",
       "\n",
       "\n",
       "// ---------------------- INITIALIZING OBJECTS--------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function init_object(obj) {\n",
       "    if (obj.userData.hasOwnProperty(\"pointmaterial\")) {\n",
       "        init_points(obj);\n",
       "        modelContains.points = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"pointlabels\")) {\n",
       "        init_pointlabels(obj);\n",
       "        modelContains.pointlabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgematerial\")) {\n",
       "        init_lines(obj);\n",
       "        modelContains.lines = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgelabels\")) {\n",
       "        init_edgelabels(obj);\n",
       "        modelContains.edgelabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"arrowstyle\")) {\n",
       "        init_arrowheads(obj);\n",
       "        modelContains.arrowheads = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"facetmaterial\")) {\n",
       "        init_faces(obj);\n",
       "        modelContains.faces = true;\n",
       "    }\n",
       "}\n",
       "\n",
       "function init_points(obj) {\n",
       "    var pointgroup = new THREE.Group();\n",
       "    pointgroup.name = \"points\";\n",
       "    var points = obj.userData.points;\n",
       "    var radii = obj.userData.pointradii;\n",
       "    var materials = obj.userData.pointmaterial;\n",
       "    var geometry,material;\n",
       "    if (!Array.isArray(radii)) {\n",
       "        geometry = new THREE.SphereBufferGeometry(radii);  \n",
       "    }\n",
       "    if (!Array.isArray(materials)) {\n",
       "        material = materials;\n",
       "    }\n",
       "    for (var i=0; i<points.length; i++) {\n",
       "        var point = points[i];\n",
       "        if (Array.isArray(radii)) {\n",
       "            if (radii[i] == 0) {\n",
       "                continue;\n",
       "            }\n",
       "            geometry = new THREE.SphereBufferGeometry(radii[i]);  \n",
       "        } \n",
       "        if (Array.isArray(materials)) {\n",
       "            material = materials[i];     \n",
       "        } \n",
       "        var sphere = new THREE.Mesh(geometry, material);\n",
       "        point.addSphere(sphere);\n",
       "        pointgroup.add(sphere);\n",
       "    }\n",
       "    obj.add(pointgroup);\n",
       "}\n",
       "\n",
       "function init_pointlabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var labels = obj.userData.pointlabels;\n",
       "    var pointlabels = new THREE.Group();\n",
       "    pointlabels.name = \"pointlabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(pointlabels);\n",
       "}\n",
       "\n",
       "function init_lines(obj) {\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var points = obj.userData.points;\n",
       "    var materials = obj.userData.edgematerial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 );\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position', bufattr);\n",
       "    if (Array.isArray(materials)) {     \n",
       "        for (var i=0; i<materials.length; i++) {\n",
       "            geometry.addGroup(2*i,2,i);\n",
       "        }\n",
       "    }\n",
       "    var lines = new THREE.LineSegments(geometry, materials);\n",
       "    lines.name = \"lines\";\n",
       "    obj.add(lines);\n",
       "    updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "function init_edgelabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var labels = obj.userData.edgelabels;\n",
       "    var edgelabels = new THREE.Group();\n",
       "    edgelabels.name = \"edgelabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            edgelabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(edgelabels);\n",
       "}\n",
       "\n",
       "function init_arrowheads(obj) {\n",
       "    var arrowheads = new THREE.Group();\n",
       "    arrowheads.name = \"arrowheads\";\n",
       "    var arrowstyle = obj.userData.arrowstyle;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var edgematerials = obj.userData.edgematerial;\n",
       "    var points = obj.userData.points;\n",
       "    var material;\n",
       "    if (!Array.isArray(edgematerials)) {\n",
       "        material = new THREE.MeshBasicMaterial( {color: edgematerials.color} );\n",
       "    }\n",
       "\n",
       "    for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "        var start = points[edgeindices[i]];\n",
       "        var end = points[edgeindices[i+1]];\n",
       "        var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius();\n",
       "        if (dist <= 0) {\n",
       "            continue;\n",
       "        }\n",
       "        var dir = new THREE.Vector3().subVectors(end.vector,start.vector);\n",
       "        dir.normalize();\n",
       "        var axis = new THREE.Vector3().set(dir.z,0,-dir.x);\n",
       "        axis.normalize();\n",
       "        var radians = Math.acos( dir.y );\n",
       "        var radius = dist/25;\n",
       "        var height = dist/5;\n",
       "        var geometry = new THREE.ConeBufferGeometry(radius,height);\n",
       "        var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2));\n",
       "        if (Array.isArray(edgematerials)) {\n",
       "            material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} );\n",
       "        }\n",
       "        var cone = new THREE.Mesh( geometry, material );\n",
       "        cone.quaternion.setFromAxisAngle(axis,radians);;\n",
       "        cone.position.copy(position);;\n",
       "        arrowheads.add(cone);\n",
       "    }\n",
       "    obj.add(arrowheads);\n",
       "}\n",
       "\n",
       "function init_faces(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var facets = obj.userData.facets;\n",
       "    obj.userData.triangleindices = [];\n",
       "    for (var i=0; i<facets.length; i++) {\n",
       "        facet = facets[i];\n",
       "        for (var t=0; t<facet.length-2; t++) {\n",
       "            obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]);  \n",
       "        }\n",
       "    }\n",
       "    var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute(bufarr,3);\n",
       "    \n",
       "    var materials = obj.userData.facetmaterial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position',bufattr);\n",
       "    if (Array.isArray(materials)) {\n",
       "        var tricount = 0;\n",
       "        var facet;\n",
       "        for (var i=0; i<facets.length; i++) {\n",
       "            facet = facets[i];\n",
       "            geometry.addGroup(tricount,(facet.length-2)*3,i);\n",
       "            tricount += (facet.length-2)*3;\n",
       "        }\n",
       "    }\n",
       "    var mesh = new THREE.Mesh(geometry, materials);\n",
       "    mesh.name = \"faces\";\n",
       "    obj.add(mesh); \n",
       "    updateFacesPosition(obj);\n",
       "}\n",
       "// //INITIALIZING\n",
       "\n",
       "\n",
       "function updateFacesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.triangleindices;\n",
       "    var faces = obj.getObjectByName(\"faces\");\n",
       "    var ba = faces.geometry.getAttribute(\"position\");\n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    faces.geometry.attributes.position.needsUpdate = true;\n",
       "    \n",
       "}\n",
       "\n",
       "function updateEdgesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.edgeindices;\n",
       "    var lines = obj.getObjectByName(\"lines\");\n",
       "    var ba = lines.geometry.getAttribute(\"position\"); \n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    lines.geometry.attributes.position.needsUpdate = true;\n",
       "}\n",
       "\n",
       "function onWindowResize() {\n",
       "    renderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    svgRenderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "function updateCamera() {\n",
       "    var width = three.clientWidth;\n",
       "    var height = three.clientHeight;\n",
       "    var aspect = width / height;\n",
       "    if (camera.type == \"OrthographicCamera\") {\n",
       "        camera.left = frustumSize * aspect / - 2;\n",
       "        camera.right = frustumSize * aspect / 2;\n",
       "        camera.top = frustumSize / 2;\n",
       "        camera.bottom = - frustumSize / 2;\n",
       "    } else if (camera.type == \"PerspectiveCamera\") {\n",
       "        camera.aspect = aspect;\n",
       "    }\n",
       "    camera.updateProjectionMatrix();\n",
       "}\n",
       "\n",
       "function changeCamera(event) {\n",
       "    var selindex = event.currentTarget.selectedIndex;\n",
       "    camera = cameras[selindex];\n",
       "    control = controls[selindex];\n",
       "    control.enabled = true; \n",
       "    for (var i=0; i<controls.length; i++) {\n",
       "        if (i!=selindex) {\n",
       "            controls[i].enabled = false;\n",
       "        }\n",
       "    }\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "var camtypenode = document.getElementById('cameraType_2');\n",
       "camtypenode.onchange = changeCamera;\n",
       "camtypenode.dispatchEvent(new Event('change'));\n",
       "\n",
       "onWindowResize();\n",
       "window.addEventListener('resize', onWindowResize);\t\n",
       "\n",
       "\n",
       "var xRotationEnabled = false;\n",
       "var yRotationEnabled = false;\n",
       "var zRotationEnabled = false;\n",
       "var rotationSpeedFactor = 1;\n",
       "var settingsShown = false;\n",
       "var labelsShown = true;\n",
       "var intervals = [];\n",
       "var timeouts = [];\n",
       "var explodingSpeed = 0.05;\n",
       "var explodeScale = 0;\n",
       "var XMLS = new XMLSerializer();\n",
       "var svgElement;\n",
       "var renderId;\n",
       "\n",
       "var render = function () {\n",
       "\n",
       "\trenderId = requestAnimationFrame(render);\n",
       "\n",
       "//\tcomment in for automatic explosion\n",
       "//\texplode(updateFactor());\n",
       "\n",
       "    var phi = 0.02 * rotationSpeedFactor;\n",
       "\n",
       "    if (xRotationEnabled) {\n",
       "        scene.rotation.x += phi;\n",
       "    }\n",
       "    if (yRotationEnabled) {\n",
       "        scene.rotation.y += phi;\n",
       "    }\n",
       "    if (zRotationEnabled) {\n",
       "        scene.rotation.z += phi;\n",
       "    }\n",
       "\n",
       "    control.update();\n",
       "    renderer.render(scene, camera);\n",
       "};\n",
       "\n",
       "if ( THREE.WEBGL.isWebGLAvailable() ) {\n",
       "\trender();\n",
       "} else {\n",
       "\tvar warning = WEBGL.getWebGLErrorMessage();\n",
       "\tthree.appendChild( warning );\n",
       "}\n",
       "    \n",
       "function changeTransparency() {\n",
       "    var opacity = 1-Number(event.currentTarget.value);\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        child = scene.children[i];\n",
       "        if ( child.userData.hasOwnProperty(\"facetmaterial\") ) {\n",
       "            if (Array.isArray(child.userData.facetmaterial)) {\n",
       "                for (var j=0; j<child.userData.facetmaterial.length; j++) {\n",
       "                    child.userData.facetmaterial[j].opacity = opacity;\n",
       "                }\n",
       "            } else {\n",
       "                child.userData.facetmaterial.opacity = opacity;\n",
       "            }    \n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function changeRotationX(event){\n",
       "    xRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationY(event){\n",
       "    yRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationZ(event){\n",
       "    zRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "\n",
       "function changeRotationSpeedFactor(event){\n",
       "    rotationSpeedFactor = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function resetScene(){\n",
       "    scene.rotation.set(0,0,0);\n",
       "    camera.position.set(0,0,5);\n",
       "    camera.up.set(0,1,0);\n",
       "}\n",
       "\n",
       "function showSettings(event){\n",
       "    document.getElementById('settings_2').style.visibility = 'visible';\n",
       "    document.getElementById('showSettingsButton_2').style.visibility = 'hidden';\n",
       "    document.getElementById('hideSettingsButton_2').style.visibility = 'visible';\n",
       "    settingsShown = true;\n",
       "}\n",
       "\n",
       "function hideSettings(event){\n",
       "    document.getElementById('settings_2').style.visibility = 'hidden';\n",
       "    document.getElementById('showSettingsButton_2').style.visibility = 'visible';\n",
       "    document.getElementById('hideSettingsButton_2').style.visibility = 'hidden';\n",
       "    settingsShown = false;\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "var pos = 150* Math.PI;\n",
       "\n",
       "function updateFactor() {\n",
       "    pos++;\n",
       "    return Math.sin(.01*pos)+1;\n",
       "}\n",
       "\n",
       "// ------------------------ FOLDING ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "// rotate point p around axis defined by points p1 and p2 by given angle\n",
       "function rotate(p, p1, p2, angle ){   \n",
       "    angle = -angle;\n",
       "    var x = p.x, y = p.y, z = p.z, \n",
       "    a = p1.x, b = p1.y, c = p1.z, \n",
       "    u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z;\n",
       "    var result = [];\n",
       "    var L = u*u + v*v + w*w;\n",
       "    var sqrt = Math.sqrt;\n",
       "    var cos = Math.cos;\n",
       "    var sin = Math.sin;\n",
       "\n",
       "    result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L;\n",
       "    result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L;\n",
       "    result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L;\n",
       "\n",
       "    return result;\n",
       "}\n",
       "\n",
       "var fold = function(event){\n",
       "    var obj = foldables[Number(event.currentTarget.name)];\n",
       "    var foldvalue = Number(event.currentTarget.value);\n",
       "    var scale = foldvalue - obj.userData.oldscale;\n",
       "\n",
       "    for (var j=0; j<obj.userData.axes.length; j++) {\n",
       "        rotateVertices(obj, j, scale);\n",
       "    }\n",
       "    update(obj);\n",
       "    obj.userData.oldscale += scale;\n",
       "    lookAtBarycenter(obj);\n",
       "}\n",
       "\n",
       "function lookAtBarycenter(obj){\n",
       "    control.target = barycenter(obj);\n",
       "}\n",
       "\n",
       "function barycenter(obj) {\n",
       "    var center = new THREE.Vector3(0,0,0);\n",
       "    var points = obj.userData.points;\n",
       "    for (var i=0; i<points.length; i++){\n",
       "        center.add(points[i].vector);\n",
       "    }\n",
       "    center.divideScalar(points.length);\n",
       "    return center;\n",
       "}\n",
       "\n",
       "function rotateVertices(obj, edge, scale) {\n",
       "    var axes = obj.userData.axes;\n",
       "    var subtrees = obj.userData.subtrees;\n",
       "    var points = obj.userData.points;\n",
       "    var angles = obj.userData.angles;\n",
       "    if (edge < axes.length){\n",
       "        for (var j=0; j<subtrees[edge].length; j++){\n",
       "            var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge]));\n",
       "            points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]);\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function update(obj) {\n",
       "   updateFacesPosition(obj);\n",
       "   updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "if (foldables.length) {\n",
       "    var settings = document.getElementById('settings_2');\n",
       "    var foldDiv = document.createElement('div');\n",
       "    foldDiv.id = 'fold_2';\n",
       "    var title = document.createElement('strong');\n",
       "    title.innerHTML = 'Fold';\n",
       "    foldDiv.appendChild(title);\n",
       "    foldDiv.className = 'group';\n",
       "    for (var i=0; i<foldables.length; i++) {\n",
       "        var range = document.createElement('input');\n",
       "        range.type = 'range';\n",
       "        range.min = 0;\n",
       "        range.max = 1;\n",
       "        range.value = 0;\n",
       "        range.step = 0.001;\n",
       "        range.name = String(i);\n",
       "        range.oninput = fold;\n",
       "        foldDiv.appendChild(range);\n",
       "    }\n",
       "    lookAtBarycenter(foldables[0]);\n",
       "    settings.insertBefore(foldDiv,settings.childNodes[0]);\n",
       "}\n",
       "\n",
       "    \n",
       "// ---------------------- EXPLOSION ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "if (explodableModel) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        obj = scene.children[i];\n",
       "        if ( obj.userData.explodable ) {\n",
       "            computeCentroid(obj);\n",
       "        }\n",
       "    }\n",
       "    document.getElementById('explodeRange_2').oninput = triggerExplode;\n",
       "    document.getElementById('explodeCheckbox_2').onchange = triggerAutomaticExplode;\n",
       "    document.getElementById('explodingSpeedRange_2').oninput = setExplodingSpeed;\n",
       "}\n",
       "\n",
       "function computeCentroid(obj) {\n",
       "    centroid = new THREE.Vector3();\n",
       "    obj.userData.points.forEach(function(pmpoint) {\n",
       "        centroid.add(pmpoint.vector);\t\t\t\n",
       "    });\n",
       "    centroid.divideScalar(obj.userData.points.length);\n",
       "    obj.userData.centroid = centroid;\n",
       "}\n",
       "\n",
       "function explode(factor) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        var obj = scene.children[i];\n",
       "        if (obj.userData.hasOwnProperty(\"centroid\")) { \n",
       "            var c = obj.userData.centroid;\n",
       "            obj.position.set(c.x*factor, c.y*factor, c.z*factor);\n",
       "        }\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function triggerExplode(event){\n",
       "    explodeScale = Number(event.currentTarget.value);\n",
       "    explode(explodeScale);\n",
       "}\n",
       "\n",
       "function setExplodingSpeed(event){\n",
       "    explodingSpeed = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function triggerAutomaticExplode(event){\n",
       "    if (event.currentTarget.checked){\n",
       "        startExploding();\n",
       "    } else {\n",
       "        clearIntervals();\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function startExploding(){\n",
       "    intervals.push(setInterval(explodingInterval, 25));\n",
       "}\n",
       "\n",
       "\n",
       "function explodingInterval(){\n",
       "    explodeScale += explodingSpeed;\n",
       "    if (explodeScale <= 6){ \n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else{\n",
       "        explode(6);\n",
       "        explodeScale = 6;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startUnexploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_2').value = explodeScale;\n",
       "}\n",
       "\n",
       "\n",
       "function startUnexploding(){\n",
       "    intervals.push(setInterval(unexplodingInterval, 25));\n",
       "}\n",
       "\n",
       "function unexplodingInterval(){\n",
       "    explodeScale -= explodingSpeed;\n",
       "    if (explodeScale >= 0){\t\n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else {\n",
       "        explode(0);\n",
       "        explodeScale = 0;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startExploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_2').value = explodeScale;\n",
       "}\n",
       "\n",
       "function clearIntervals(){\n",
       "    intervals.forEach(function(interval){\n",
       "        clearInterval(interval);\n",
       "    });\n",
       "    intervals = [];\n",
       "    timeouts.forEach(function(timeout){\n",
       "        clearTimeout(timeout);\n",
       "    });\n",
       "    timeouts = [];\n",
       "}\n",
       "\n",
       "// ---------------------- DISPLAY --------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "const objectTypeInnerHTMLs = { points: \"Points\", pointlabels: \"Point labels\", lines: \"Edges\", edgelabels: \"Edge labels\", faces: \"Faces\", arrowheads: \"Arrow heads\" };\n",
       "const objectTypeVisible = {};\n",
       "Object.assign(objectTypeVisible,modelContains);\n",
       "const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort();\n",
       "const shownObjectTypesList = document.getElementById('shownObjectTypesList_2');\n",
       "\n",
       "function setVisibility(bool,objname) {\n",
       "    for (var i=0; i<scene.children.length; i++){\n",
       "        var obj = scene.children[i].getObjectByName(objname);\n",
       "        if (obj) {\n",
       "            obj.visible = bool;\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function toggleObjectTypeVisibility(event){\n",
       "    var name = event.currentTarget.name;\n",
       "    var checked = event.currentTarget.checked;\n",
       "    objectTypeVisible[name] = checked;\n",
       "    setVisibility(checked,name);\n",
       "}\n",
       "\n",
       "for (var i=0; i<sortedObjectTypeKeys.length; i++){\n",
       "    var key = sortedObjectTypeKeys[i];\n",
       "    if (modelContains[key]) {\n",
       "        var objTypeNode = document.createElement('span');\n",
       "        objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>';\n",
       "        var checkbox = document.createElement('input');\n",
       "        checkbox.type = 'checkbox';\n",
       "        checkbox.checked = true;\n",
       "        checkbox.name = key;\n",
       "        checkbox.onchange = toggleObjectTypeVisibility;\n",
       "        shownObjectTypesList.appendChild(checkbox);\n",
       "        shownObjectTypesList.appendChild(objTypeNode);\n",
       "    }\n",
       "}\n",
       "\n",
       "// ------------------------------------------------------\n",
       "\n",
       "function toggleObjectVisibility(event){\n",
       "    var nr = Number(event.currentTarget.name);\n",
       "    scene.children[nr].visible = event.currentTarget.checked;\n",
       "}\n",
       "\n",
       "// append checkboxes for displaying or hiding objects\n",
       "var shownObjectsList = document.getElementById('shownObjectsList_2');\n",
       "for (var i=0; i<scene.children.length; i++){\n",
       "    obj = scene.children[i];\n",
       "    var objNode = document.createElement('span');\n",
       "    objNode.innerHTML = obj.name + '<br>';\n",
       "    var checkbox = document.createElement('input');\n",
       "    checkbox.type = 'checkbox';\n",
       "    checkbox.checked = true;\n",
       "    checkbox.name = String(i);\n",
       "    checkbox.onchange = toggleObjectVisibility;\n",
       "    shownObjectsList.appendChild(checkbox);\n",
       "    shownObjectsList.appendChild(objNode);\n",
       "}\n",
       "\n",
       "// ---------------------- SVG ------------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function takeSvgScreenshot() {\n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(false,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(false,\"edgelabels\");\n",
       "    }\n",
       "    svgRenderer.render(scene,camera);\n",
       "    svgElement = XMLS.serializeToString(svgRenderer.domElement);\n",
       "    \n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(true,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(true,\"edgelabels\");\n",
       "    }\n",
       "\n",
       "    if (document.getElementById('tab_2').checked){\n",
       "        //show in new tab\n",
       "        var myWindow = window.open(\"\",\"\");\n",
       "        myWindow.document.body.innerHTML = svgElement;\n",
       "    } else{\n",
       "        // download svg file \n",
       "        download(\"screenshot.svg\", svgElement);\n",
       "    }\n",
       "}\n",
       "\n",
       "function download(filename, text) {\n",
       "    var element = document.createElement('a');\n",
       "    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));\n",
       "    element.setAttribute('download', filename);\n",
       "\n",
       "    element.style.display = 'none';\n",
       "    document.body.appendChild(element);\n",
       "\n",
       "    element.click();\n",
       "\n",
       "    document.body.removeChild(element);\n",
       "}\n",
       "\n",
       "\n",
       "document.getElementById('transparencyRange_2').oninput = changeTransparency;\n",
       "document.getElementById('changeRotationX_2').onchange = changeRotationX;\n",
       "document.getElementById('changeRotationY_2').onchange = changeRotationY;\n",
       "document.getElementById('changeRotationZ_2').onchange = changeRotationZ;\n",
       "document.getElementById('resetButton_2').onclick = resetScene;\n",
       "document.getElementById('rotationSpeedRange_2').oninput = changeRotationSpeedFactor;\n",
       "document.getElementById('takeScreenshot_2').onclick = takeSvgScreenshot;\n",
       "document.getElementById('showSettingsButton_2').onclick = showSettings;\n",
       "document.getElementById('hideSettingsButton_2').onclick = hideSettings;\n",
       "\n",
       "\n",
       "// ------------------ SHORTCUTS --------------------------------------------\n",
       "// -------------------------------------------------------------------------\n",
       "\n",
       "/**\n",
       " * http://www.openjs.com/scripts/events/keyboard_shortcuts/\n",
       " * Version : 2.01.B\n",
       " * By Binny V A\n",
       " * License : BSD\n",
       " */\n",
       "shortcut = {\n",
       "\t'all_shortcuts':{},//All the shortcuts are stored in this array\n",
       "\t'add': function(shortcut_combination,callback,opt) {\n",
       "\t\t//Provide a set of default options\n",
       "\t\tvar default_options = {\n",
       "\t\t\t'type':'keydown',\n",
       "\t\t\t'propagate':false,\n",
       "\t\t\t'disable_in_input':false,\n",
       "\t\t\t'target':document,\n",
       "\t\t\t'keycode':false\n",
       "\t\t}\n",
       "\t\tif(!opt) opt = default_options;\n",
       "\t\telse {\n",
       "\t\t\tfor(var dfo in default_options) {\n",
       "\t\t\t\tif(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\n",
       "\t\tvar ele = opt.target;\n",
       "\t\tif(typeof opt.target == 'string') ele = document.getElementById(opt.target);\n",
       "\t\tvar ths = this;\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\n",
       "\t\t//The function to be called at keypress\n",
       "\t\tvar func = function(e) {\n",
       "\t\t\te = e || window.event;\n",
       "\t\t\t\n",
       "\t\t\tif(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields\n",
       "\t\t\t\tvar element;\n",
       "\t\t\t\tif(e.target) element=e.target;\n",
       "\t\t\t\telse if(e.srcElement) element=e.srcElement;\n",
       "\t\t\t\tif(element.nodeType==3) element=element.parentNode;\n",
       "\n",
       "\t\t\t\tif(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\t//Find Which key is pressed\n",
       "\t\t\tif (e.keyCode) code = e.keyCode;\n",
       "\t\t\telse if (e.which) code = e.which;\n",
       "\t\t\tvar character = String.fromCharCode(code).toLowerCase();\n",
       "\t\t\t\n",
       "\t\t\tif(code == 188) character=\",\"; //If the user presses , when the type is onkeydown\n",
       "\t\t\tif(code == 190) character=\".\"; //If the user presses , when the type is onkeydown\n",
       "\n",
       "\t\t\tvar keys = shortcut_combination.split(\"+\");\n",
       "\t\t\t//Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked\n",
       "\t\t\tvar kp = 0;\n",
       "\t\t\t\n",
       "\t\t\t//Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken\n",
       "\t\t\tvar shift_nums = {\n",
       "\t\t\t\t\"`\":\"~\",\n",
       "\t\t\t\t\"1\":\"!\",\n",
       "\t\t\t\t\"2\":\"@\",\n",
       "\t\t\t\t\"3\":\"#\",\n",
       "\t\t\t\t\"4\":\"$\",\n",
       "\t\t\t\t\"5\":\"%\",\n",
       "\t\t\t\t\"6\":\"^\",\n",
       "\t\t\t\t\"7\":\"&\",\n",
       "\t\t\t\t\"8\":\"*\",\n",
       "\t\t\t\t\"9\":\"(\",\n",
       "\t\t\t\t\"0\":\")\",\n",
       "\t\t\t\t\"-\":\"_\",\n",
       "\t\t\t\t\"=\":\"+\",\n",
       "\t\t\t\t\";\":\":\",\n",
       "\t\t\t\t\"'\":\"\\\"\",\n",
       "\t\t\t\t\",\":\"<\",\n",
       "\t\t\t\t\".\":\">\",\n",
       "\t\t\t\t\"/\":\"?\",\n",
       "\t\t\t\t\"\\\\\":\"|\"\n",
       "\t\t\t}\n",
       "\t\t\t//Special Keys - and their codes\n",
       "\t\t\tvar special_keys = {\n",
       "\t\t\t\t'esc':27,\n",
       "\t\t\t\t'escape':27,\n",
       "\t\t\t\t'tab':9,\n",
       "\t\t\t\t'space':32,\n",
       "\t\t\t\t'return':13,\n",
       "\t\t\t\t'enter':13,\n",
       "\t\t\t\t'backspace':8,\n",
       "\t\n",
       "\t\t\t\t'scrolllock':145,\n",
       "\t\t\t\t'scroll_lock':145,\n",
       "\t\t\t\t'scroll':145,\n",
       "\t\t\t\t'capslock':20,\n",
       "\t\t\t\t'caps_lock':20,\n",
       "\t\t\t\t'caps':20,\n",
       "\t\t\t\t'numlock':144,\n",
       "\t\t\t\t'num_lock':144,\n",
       "\t\t\t\t'num':144,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pause':19,\n",
       "\t\t\t\t'break':19,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'insert':45,\n",
       "\t\t\t\t'home':36,\n",
       "\t\t\t\t'delete':46,\n",
       "\t\t\t\t'end':35,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pageup':33,\n",
       "\t\t\t\t'page_up':33,\n",
       "\t\t\t\t'pu':33,\n",
       "\t\n",
       "\t\t\t\t'pagedown':34,\n",
       "\t\t\t\t'page_down':34,\n",
       "\t\t\t\t'pd':34,\n",
       "\t\n",
       "\t\t\t\t'left':37,\n",
       "\t\t\t\t'up':38,\n",
       "\t\t\t\t'right':39,\n",
       "\t\t\t\t'down':40,\n",
       "\t\n",
       "\t\t\t\t'f1':112,\n",
       "\t\t\t\t'f2':113,\n",
       "\t\t\t\t'f3':114,\n",
       "\t\t\t\t'f4':115,\n",
       "\t\t\t\t'f5':116,\n",
       "\t\t\t\t'f6':117,\n",
       "\t\t\t\t'f7':118,\n",
       "\t\t\t\t'f8':119,\n",
       "\t\t\t\t'f9':120,\n",
       "\t\t\t\t'f10':121,\n",
       "\t\t\t\t'f11':122,\n",
       "\t\t\t\t'f12':123\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\tvar modifiers = { \n",
       "\t\t\t\tshift: { wanted:false, pressed:false},\n",
       "\t\t\t\tctrl : { wanted:false, pressed:false},\n",
       "\t\t\t\talt  : { wanted:false, pressed:false},\n",
       "\t\t\t\tmeta : { wanted:false, pressed:false}\t//Meta is Mac specific\n",
       "\t\t\t};\n",
       "                        \n",
       "\t\t\tif(e.ctrlKey)\tmodifiers.ctrl.pressed = true;\n",
       "\t\t\tif(e.shiftKey)\tmodifiers.shift.pressed = true;\n",
       "\t\t\tif(e.altKey)\tmodifiers.alt.pressed = true;\n",
       "\t\t\tif(e.metaKey)   modifiers.meta.pressed = true;\n",
       "                        \n",
       "\t\t\tfor(var i=0; k=keys[i],i<keys.length; i++) {\n",
       "\t\t\t\t//Modifiers\n",
       "\t\t\t\tif(k == 'ctrl' || k == 'control') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.ctrl.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'shift') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.shift.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'alt') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.alt.wanted = true;\n",
       "\t\t\t\t} else if(k == 'meta') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.meta.wanted = true;\n",
       "\t\t\t\t} else if(k.length > 1) { //If it is a special key\n",
       "\t\t\t\t\tif(special_keys[k] == code) kp++;\n",
       "\t\t\t\t\t\n",
       "\t\t\t\t} else if(opt['keycode']) {\n",
       "\t\t\t\t\tif(opt['keycode'] == code) kp++;\n",
       "\n",
       "\t\t\t\t} else { //The special keys did not match\n",
       "\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\telse {\n",
       "\t\t\t\t\t\tif(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase\n",
       "\t\t\t\t\t\t\tcharacter = shift_nums[character]; \n",
       "\t\t\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\t\t}\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t\t\n",
       "\t\t\tif(kp == keys.length && \n",
       "\t\t\t\t\t\tmodifiers.ctrl.pressed == modifiers.ctrl.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.shift.pressed == modifiers.shift.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.alt.pressed == modifiers.alt.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.meta.pressed == modifiers.meta.wanted) {\n",
       "\t\t\t\tcallback(e);\n",
       "\t\n",
       "\t\t\t\tif(!opt['propagate']) { //Stop the event\n",
       "\t\t\t\t\t//e.cancelBubble is supported by IE - this will kill the bubbling process.\n",
       "\t\t\t\t\te.cancelBubble = true;\n",
       "\t\t\t\t\te.returnValue = false;\n",
       "\t\n",
       "\t\t\t\t\t//e.stopPropagation works in Firefox.\n",
       "\t\t\t\t\tif (e.stopPropagation) {\n",
       "\t\t\t\t\t\te.stopPropagation();\n",
       "\t\t\t\t\t\te.preventDefault();\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t\treturn false;\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\t\tthis.all_shortcuts[shortcut_combination] = {\n",
       "\t\t\t'callback':func, \n",
       "\t\t\t'target':ele, \n",
       "\t\t\t'event': opt['type']\n",
       "\t\t};\n",
       "\t\t//Attach the function with the event\n",
       "\t\tif(ele.addEventListener) ele.addEventListener(opt['type'], func, false);\n",
       "\t\telse if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);\n",
       "\t\telse ele['on'+opt['type']] = func;\n",
       "\t},\n",
       "\n",
       "\t//Remove the shortcut - just specify the shortcut and I will remove the binding\n",
       "\t'remove':function(shortcut_combination) {\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\t\tvar binding = this.all_shortcuts[shortcut_combination];\n",
       "\t\tdelete(this.all_shortcuts[shortcut_combination])\n",
       "\t\tif(!binding) return;\n",
       "\t\tvar type = binding['event'];\n",
       "\t\tvar ele = binding['target'];\n",
       "\t\tvar callback = binding['callback'];\n",
       "\n",
       "\t\tif(ele.detachEvent) ele.detachEvent('on'+type, callback);\n",
       "\t\telse if(ele.removeEventListener) ele.removeEventListener(type, callback, false);\n",
       "\t\telse ele['on'+type] = false;\n",
       "\t}\n",
       "}\n",
       "\n",
       "shortcut.add(\"Alt+Left\",function() {\n",
       "\tvar event = new Event('click');\n",
       "\tif (settingsShown){\n",
       "\t\tdocument.getElementById('hideSettingsButton_2').dispatchEvent(event);\n",
       "\t} else {\n",
       "\t\tdocument.getElementById('showSettingsButton_2').dispatchEvent(event);\n",
       "\t}\n",
       "});\n",
       "\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "});});\n",
       "      </script>\n",
       "   </body>\n",
       "</html>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "$total_mm = 100;  #planned size of the model  \n",
    "$surface_mm = 2;  #desired cell thickness\n",
    "\n",
    "$bFacets = polytope::bounding_box_facets($TQuadric->affine_chart->VERTICES,offset=>1,surplus_k=>0.4, make_cube=>1);\n",
    "$diam = $bFacets->[0]->[0] + $bFacets->[1]->[0];\n",
    "$surface_abs = $surface_mm * $diam/$total_mm;     #absolute surface thickness in the x3d file\n",
    "$solidifiedQuadricCells = solidify_2d_pcom($TQuadric->affine_chart,$surface_abs);\n",
    "@solidifiedQuadricCellsVis = map { $_->VISUAL($surface_opts,BoundingFacets=>$bFacets) } @$solidifiedQuadricCells;\n",
    "x3d(compose(@solidifiedQuadricCellsVis),File=>$x3d_dir.\"TQuadricSolidified.x3d\");\n",
    "compose(@solidifiedQuadricCellsVis);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Tropical Curves"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### A: creating tropical curves in polymake\n",
    "\n",
    "The simplest way to construct tropical curves in polymake is to write them as the stable intersection of two tropical hypersurfaces."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<!--\n",
       "polymake for knusper\n",
       "Thu Aug 27 10:34:32 2020\n",
       "unnamed\n",
       "-->\n",
       "\n",
       "\n",
       "<html>\n",
       "   <head>\n",
       "      <meta charset=utf-8>\n",
       "      <title>unnamed</title>\n",
       "      <style>\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "*/\n",
       "         html {overflow: scroll;}\n",
       "         strong{font-size: 18px;}\n",
       "         canvas { z-index: 8; }\n",
       "         input[type='radio'] {margin-left:0;}\n",
       "         input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;}\n",
       "         .group{padding-bottom: 15px;}\n",
       "         .settings * {z-index: 11; }\n",
       "         .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;}\n",
       "         .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} \n",
       "         .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;}\n",
       "         .showSettingsButton{visibility: visible; z-index: 12; position: absolute }\n",
       "         .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5}\n",
       "         button{margin-left: 0; margin-top: 10px}\n",
       "         img{cursor: pointer;}\n",
       "         .suboption{padding-top: 15px;}\n",
       "         #model13179050604 { width: 100%; height: 100%; }\n",
       "         .threejs_container { width: 100%; height: 75vh;}\n",
       "         .settings{max-height: 74vh} \n",
       "         input[type=range] {\n",
       "           -webkit-appearance: none;\n",
       "           padding:0; \n",
       "           width:90%; \n",
       "           margin-left: auto;\n",
       "           margin-right: auto;\n",
       "           margin-top: 15px;\n",
       "           margin-bottom: 15px;\n",
       "           display: block;\t\n",
       "         }\n",
       "         input[type=range]:focus {\n",
       "           outline: none;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-runnable-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "           -webkit-appearance: none;\n",
       "           margin-top: -5px;\n",
       "         }\n",
       "         input[type=range]:focus::-webkit-slider-runnable-track {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]::-moz-range-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-moz-range-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]::-ms-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           background: transparent;\n",
       "           border-color: transparent;\n",
       "           color: transparent;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_END\n",
       "*/\n",
       "\t\t</style>\n",
       "   </head>\n",
       "<body>\n",
       "   <div class='threejs_container'>\n",
       "\t\t<div id='settings_3' class='settings'>\n",
       "\t\t\t<div class=group id='explode_3'>\n",
       "\t\t\t\t<strong>Explode</strong>\n",
       "\t\t\t\t<input id='explodeRange_3' type='range' min=0 max=6 step=0.01 value=0>\n",
       "\t\t\t\t<div class=indented><input id='explodeCheckbox_3' type='checkbox'>Automatic explosion</div>\n",
       "\t\t\t\t<div class=suboption>Exploding speed</div>\n",
       "\t\t\t\t<input id='explodingSpeedRange_3' type='range' min=0 max=0.5 step=0.001 value=0.05>\n",
       "\t\t\t</div>\n",
       "\t\n",
       "\t\t\t<div class=group id='transparency_3' class='transparency'>\n",
       "\t\t\t\t<strong>Transparency</strong>\n",
       "\t\t\t\t<input id='transparencyRange_3' type='range' min=0 max=1 step=0.01 value=0>\n",
       "\t\t\t</div>\n",
       "\t\t\t\n",
       "\t\t\t<div class=group id='rotation_3'>\n",
       "\t\t\t\t<strong>Rotation</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationX_3'> x-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationY_3'> y-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationZ_3'> z-axis</div>\n",
       "\t\t\t\t\t<button id='resetButton_3'>Reset</button>\n",
       "\t\t\t\t</div>\n",
       "\n",
       "\t\t\t\t<div class=suboption>Rotation speed</div>\n",
       "\t\t\t\t<input id='rotationSpeedRange_3' type='range' min=0 max=5 step=0.01 value=2>\n",
       "\t\t\t</div>\n",
       "\n",
       "\n",
       "\t\t\t<div class=group id='display_3'>\n",
       "\t\t\t\t<strong>Display</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div id='shownObjectTypesList_3' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t\t<div class=suboption>Objects</div>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t   <div id='shownObjectsList_3' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "         \n",
       "         <div class=group id='camera_3'>\n",
       "            <strong>Camera</strong>\n",
       "            <div class=indented>\n",
       "               <form>\n",
       "                  <select id=\"cameraType_3\">\n",
       "                     <option value='perspective' selected> Perspective<br></option>\n",
       "                     <option value='orthographic' > Orthographic<br></option>\n",
       "                  </select>\n",
       "               </form>\n",
       "            </div>\n",
       "         </div>\n",
       "\n",
       "\t\t\t<div class=group id='svg_3'>\n",
       "\t\t\t\t<strong>SVG</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<form>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='download' id='download_3' checked> Download<br>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='tab' id='tab_3' > New tab<br>\n",
       "\t\t\t\t\t</form>\n",
       "\t\t\t\t\t<button id='takeScreenshot_3'>Screenshot</button>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "\n",
       "\t\t</div>\t<!-- end of settings -->\n",
       "\t\t<img id='hideSettingsButton_3' class='hideSettingsButton' src='/kernelspecs/polymake/close.svg' width=20px\">\n",
       "\t\t<img id='showSettingsButton_3' class='showSettingsButton' src='/kernelspecs/polymake/menu.svg' width=20px\">\n",
       "<div id=\"model13179050604\"></div>\n",
       "</div>\n",
       "   <script>\n",
       "    requirejs.config({\n",
       "      paths: {\n",
       "        three: '/kernelspecs/polymake/three',\n",
       "        TrackballControls: '/kernelspecs/polymake/TrackballControls',\n",
       "        OrbitControls: '/kernelspecs/polymake/OrbitControls',\n",
       "        Projector: '/kernelspecs/polymake/Projector',\n",
       "        SVGRenderer: '/kernelspecs/polymake/SVGRenderer',\n",
       "        WEBGL: '/kernelspecs/polymake/WebGL',\n",
       "      },\n",
       "      shim: {\n",
       "        'three': { exports: 'THREE'},\n",
       "        'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' },\n",
       "        'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' },\n",
       "        'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' },\n",
       "        'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' },\n",
       "        'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' },\n",
       "      }\n",
       "    });\n",
       "    \n",
       "    require(['three'],function(THREE){\n",
       "        window.THREE = THREE;\n",
       "      require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'],\n",
       "               function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) {\n",
       "    THREE.TrackballControls = TrackballControls;\n",
       "    THREE.OrbitControls = OrbitControls;\n",
       "    THREE.Projector = Projector;\n",
       "    THREE.SVGRenderer = SVGRenderer;\n",
       "    THREE.WEBGL = WEBGL;\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "\n",
       "const intervalLength = 25; // for automatic animations\n",
       "const explodableModel = true; \n",
       "const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false };\n",
       "const foldables = [];\n",
       "\n",
       "var three = document.getElementById(\"model13179050604\");\n",
       "var scene = new THREE.Scene();\n",
       "var renderer = new THREE.WebGLRenderer( { antialias: true } );\n",
       "var svgRenderer = new THREE.SVGRenderer( { antialias: true } );\n",
       "renderer.setPixelRatio( window.devicePixelRatio );\n",
       "renderer.setClearColor(0xFFFFFF, 1);\n",
       "svgRenderer.setClearColor(0xFFFFFF, 1);\n",
       "three.appendChild(renderer.domElement);\n",
       "\n",
       "var frustumSize = 4;\n",
       "var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()];\n",
       "cameras.forEach(function(cam) {\n",
       "    cam.position.set(0, 0, 5);\n",
       "    cam.lookAt(0, 0, 0);  \n",
       "    cam.up.set(0, 1, 0);         \n",
       "});\n",
       "var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)];\n",
       "var camera, control;\n",
       "\n",
       "controls[0].zoomSpeed = 0.2;\n",
       "controls[0].rotateSpeed = 4;\n",
       "\n",
       "\n",
       "// class to allow move points together with labels and spheres\n",
       "var PMPoint = function (x,y,z) {\n",
       "   this.vector = new THREE.Vector3(x,y,z);\n",
       "   this.sprite = null;\n",
       "   this.sphere = null;\n",
       "}\n",
       "PMPoint.prototype.addLabel = function(labelsprite) {\n",
       "   this.sprite = labelsprite;\n",
       "   this.sprite.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.addSphere = function(spheremesh) {\n",
       "   this.sphere = spheremesh;\n",
       "   this.sphere.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.set = function(x,y,z) {\n",
       "   this.vector.set(x,y,z);\n",
       "   if (this.sprite) {\n",
       "      this.sprite.position.copy(this.vector);\n",
       "   }\n",
       "   if (this.sphere) {\n",
       "      this.sphere.position.copy(this.vector);\n",
       "   }\n",
       "}\n",
       "PMPoint.prototype.radius = function() {\n",
       "   if (this.sphere) {\n",
       "      return this.sphere.geometry.parameters.radius;\n",
       "   } else {\n",
       "      return 0;\n",
       "   }\n",
       "};\n",
       "// select the target node\n",
       "var target = document.querySelector('#model13179050604');\n",
       "\n",
       "// create an observer instance\n",
       "var observer = new MutationObserver(function(mutations) {\n",
       "   mutations.forEach(function(mutation) {\n",
       "      if (mutation.removedNodes && mutation.removedNodes.length > 0) {\n",
       "         cancelAnimationFrame(renderId);\n",
       "         observer.disconnect();\n",
       "         console.log(\"cancelled frame \"+renderId);\n",
       "      }\n",
       "   });\n",
       "});\n",
       "\n",
       "// configuration of the observer:\n",
       "var config = { childList: true, characterData: true }\n",
       "\n",
       "// pass in the target node, as well as the observer options\n",
       "while (target) {\n",
       "   if (target.className==\"output\") {\n",
       "      observer.observe(target, config);\n",
       "      break;\n",
       "   }\n",
       "   target = target.parentNode;\n",
       "}\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "var obj0 = new THREE.Object3D();\n",
       "obj0.name = \"unnamed__1\";\n",
       "obj0.userData.explodable = 1;\n",
       "obj0.userData.points = [];\n",
       "obj0.userData.points.push(new PMPoint(-0.625, -0.5, 0));\n",
       "obj0.userData.points.push(new PMPoint(-1, -0.875, 0));\n",
       "\n",
       "obj0.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj0.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj0);\n",
       "scene.add(obj0);\n",
       "\n",
       "var obj1 = new THREE.Object3D();\n",
       "obj1.name = \"unnamed__2\";\n",
       "obj1.userData.explodable = 1;\n",
       "obj1.userData.points = [];\n",
       "obj1.userData.points.push(new PMPoint(-1, -0.875, 0));\n",
       "obj1.userData.points.push(new PMPoint(-1, -0.875, 3.25));\n",
       "\n",
       "obj1.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj1.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj1.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj1.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj1);\n",
       "scene.add(obj1);\n",
       "\n",
       "var obj2 = new THREE.Object3D();\n",
       "obj2.name = \"unnamed__3\";\n",
       "obj2.userData.explodable = 1;\n",
       "obj2.userData.points = [];\n",
       "obj2.userData.points.push(new PMPoint(-1, -0.875, 0));\n",
       "obj2.userData.points.push(new PMPoint(-2, -1.875, -1));\n",
       "\n",
       "obj2.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj2.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj2.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj2.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj2);\n",
       "scene.add(obj2);\n",
       "\n",
       "var obj3 = new THREE.Object3D();\n",
       "obj3.name = \"unnamed__4\";\n",
       "obj3.userData.explodable = 1;\n",
       "obj3.userData.points = [];\n",
       "obj3.userData.points.push(new PMPoint(-0.75, 0, -0.5));\n",
       "obj3.userData.points.push(new PMPoint(-1, 0, -0.75));\n",
       "\n",
       "obj3.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj3.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj3.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj3.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj3);\n",
       "scene.add(obj3);\n",
       "\n",
       "var obj4 = new THREE.Object3D();\n",
       "obj4.name = \"unnamed__5\";\n",
       "obj4.userData.explodable = 1;\n",
       "obj4.userData.points = [];\n",
       "obj4.userData.points.push(new PMPoint(-1, 0, -0.75));\n",
       "obj4.userData.points.push(new PMPoint(-1, 3.25, -0.75));\n",
       "\n",
       "obj4.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj4.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj4.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj4.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj4);\n",
       "scene.add(obj4);\n",
       "\n",
       "var obj5 = new THREE.Object3D();\n",
       "obj5.name = \"unnamed__6\";\n",
       "obj5.userData.explodable = 1;\n",
       "obj5.userData.points = [];\n",
       "obj5.userData.points.push(new PMPoint(-1, 0, -0.75));\n",
       "obj5.userData.points.push(new PMPoint(-2, -1, -1.75));\n",
       "\n",
       "obj5.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj5.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj5.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj5.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj5);\n",
       "scene.add(obj5);\n",
       "\n",
       "var obj6 = new THREE.Object3D();\n",
       "obj6.name = \"unnamed__7\";\n",
       "obj6.userData.explodable = 1;\n",
       "obj6.userData.points = [];\n",
       "obj6.userData.points.push(new PMPoint(0, -0.625, -0.5));\n",
       "obj6.userData.points.push(new PMPoint(0, -1, -0.875));\n",
       "\n",
       "obj6.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj6.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj6.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj6.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj6);\n",
       "scene.add(obj6);\n",
       "\n",
       "var obj7 = new THREE.Object3D();\n",
       "obj7.name = \"unnamed__8\";\n",
       "obj7.userData.explodable = 1;\n",
       "obj7.userData.points = [];\n",
       "obj7.userData.points.push(new PMPoint(0, -1, -0.875));\n",
       "obj7.userData.points.push(new PMPoint(3.25, -1, -0.875));\n",
       "\n",
       "obj7.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj7.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj7.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj7.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj7);\n",
       "scene.add(obj7);\n",
       "\n",
       "var obj8 = new THREE.Object3D();\n",
       "obj8.name = \"unnamed__9\";\n",
       "obj8.userData.explodable = 1;\n",
       "obj8.userData.points = [];\n",
       "obj8.userData.points.push(new PMPoint(0, -1, -0.875));\n",
       "obj8.userData.points.push(new PMPoint(-1, -2, -1.875));\n",
       "\n",
       "obj8.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj8.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj8.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj8.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj8);\n",
       "scene.add(obj8);\n",
       "\n",
       "var obj9 = new THREE.Object3D();\n",
       "obj9.name = \"unnamed__10\";\n",
       "obj9.userData.explodable = 1;\n",
       "obj9.userData.points = [];\n",
       "obj9.userData.points.push(new PMPoint(-0.5, 0.5, 0.5));\n",
       "obj9.userData.points.push(new PMPoint(-0.5, 0, 0));\n",
       "\n",
       "obj9.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj9.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj9.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj9.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj9);\n",
       "scene.add(obj9);\n",
       "\n",
       "var obj10 = new THREE.Object3D();\n",
       "obj10.name = \"unnamed__11\";\n",
       "obj10.userData.explodable = 1;\n",
       "obj10.userData.points = [];\n",
       "obj10.userData.points.push(new PMPoint(-0.5, 0, 0));\n",
       "obj10.userData.points.push(new PMPoint(-0.5, -0.25, 0));\n",
       "\n",
       "obj10.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj10.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj10.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj10.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj10);\n",
       "scene.add(obj10);\n",
       "\n",
       "var obj11 = new THREE.Object3D();\n",
       "obj11.name = \"unnamed__12\";\n",
       "obj11.userData.explodable = 1;\n",
       "obj11.userData.points = [];\n",
       "obj11.userData.points.push(new PMPoint(-0.5, 0.5, 0.5));\n",
       "obj11.userData.points.push(new PMPoint(-0.5, 0.5, 3.25));\n",
       "\n",
       "obj11.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj11.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj11.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj11.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj11);\n",
       "scene.add(obj11);\n",
       "\n",
       "var obj12 = new THREE.Object3D();\n",
       "obj12.name = \"unnamed__13\";\n",
       "obj12.userData.explodable = 1;\n",
       "obj12.userData.points = [];\n",
       "obj12.userData.points.push(new PMPoint(-0.5, 0.5, 0.5));\n",
       "obj12.userData.points.push(new PMPoint(-0.5, 3.25, 0.5));\n",
       "\n",
       "obj12.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj12.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj12.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj12.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj12);\n",
       "scene.add(obj12);\n",
       "\n",
       "var obj13 = new THREE.Object3D();\n",
       "obj13.name = \"unnamed__14\";\n",
       "obj13.userData.explodable = 1;\n",
       "obj13.userData.points = [];\n",
       "obj13.userData.points.push(new PMPoint(2, 2, 2.25));\n",
       "obj13.userData.points.push(new PMPoint(2, 2, 3.25));\n",
       "\n",
       "obj13.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj13.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj13.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj13.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj13);\n",
       "scene.add(obj13);\n",
       "\n",
       "var obj14 = new THREE.Object3D();\n",
       "obj14.name = \"unnamed__15\";\n",
       "obj14.userData.explodable = 1;\n",
       "obj14.userData.points = [];\n",
       "obj14.userData.points.push(new PMPoint(2, 2, 2.25));\n",
       "obj14.userData.points.push(new PMPoint(3.25, 2, 2.25));\n",
       "\n",
       "obj14.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj14.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj14.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj14.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj14);\n",
       "scene.add(obj14);\n",
       "\n",
       "var obj15 = new THREE.Object3D();\n",
       "obj15.name = \"unnamed__16\";\n",
       "obj15.userData.explodable = 1;\n",
       "obj15.userData.points = [];\n",
       "obj15.userData.points.push(new PMPoint(-0.5, -0.25, 0));\n",
       "obj15.userData.points.push(new PMPoint(-0.625, -0.5, 0));\n",
       "\n",
       "obj15.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj15.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj15.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj15.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj15);\n",
       "scene.add(obj15);\n",
       "\n",
       "var obj16 = new THREE.Object3D();\n",
       "obj16.name = \"unnamed__17\";\n",
       "obj16.userData.explodable = 1;\n",
       "obj16.userData.points = [];\n",
       "obj16.userData.points.push(new PMPoint(0.5, -0.5, 0.5));\n",
       "obj16.userData.points.push(new PMPoint(0, -0.5, 0));\n",
       "\n",
       "obj16.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj16.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj16.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj16.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj16);\n",
       "scene.add(obj16);\n",
       "\n",
       "var obj17 = new THREE.Object3D();\n",
       "obj17.name = \"unnamed__18\";\n",
       "obj17.userData.explodable = 1;\n",
       "obj17.userData.points = [];\n",
       "obj17.userData.points.push(new PMPoint(0, -0.5, 0));\n",
       "obj17.userData.points.push(new PMPoint(-0.625, -0.5, 0));\n",
       "\n",
       "obj17.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj17.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj17.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj17.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj17);\n",
       "scene.add(obj17);\n",
       "\n",
       "var obj18 = new THREE.Object3D();\n",
       "obj18.name = \"unnamed__19\";\n",
       "obj18.userData.explodable = 1;\n",
       "obj18.userData.points = [];\n",
       "obj18.userData.points.push(new PMPoint(0, -0.5, 0));\n",
       "obj18.userData.points.push(new PMPoint(0, -0.5, -0.25));\n",
       "\n",
       "obj18.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj18.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj18.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj18.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj18);\n",
       "scene.add(obj18);\n",
       "\n",
       "var obj19 = new THREE.Object3D();\n",
       "obj19.name = \"unnamed__20\";\n",
       "obj19.userData.explodable = 1;\n",
       "obj19.userData.points = [];\n",
       "obj19.userData.points.push(new PMPoint(0.5, -0.5, 0.5));\n",
       "obj19.userData.points.push(new PMPoint(0.5, -0.5, 3.25));\n",
       "\n",
       "obj19.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj19.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj19.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj19.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj19);\n",
       "scene.add(obj19);\n",
       "\n",
       "var obj20 = new THREE.Object3D();\n",
       "obj20.name = \"unnamed__21\";\n",
       "obj20.userData.explodable = 1;\n",
       "obj20.userData.points = [];\n",
       "obj20.userData.points.push(new PMPoint(0.5, -0.5, 0.5));\n",
       "obj20.userData.points.push(new PMPoint(3.25, -0.5, 0.5));\n",
       "\n",
       "obj20.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj20.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj20.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj20.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj20);\n",
       "scene.add(obj20);\n",
       "\n",
       "var obj21 = new THREE.Object3D();\n",
       "obj21.name = \"unnamed__22\";\n",
       "obj21.userData.explodable = 1;\n",
       "obj21.userData.points = [];\n",
       "obj21.userData.points.push(new PMPoint(0.75, 1, 1.25));\n",
       "obj21.userData.points.push(new PMPoint(0.75, 1, 3.25));\n",
       "\n",
       "obj21.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj21.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj21.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj21.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj21);\n",
       "scene.add(obj21);\n",
       "\n",
       "var obj22 = new THREE.Object3D();\n",
       "obj22.name = \"unnamed__23\";\n",
       "obj22.userData.explodable = 1;\n",
       "obj22.userData.points = [];\n",
       "obj22.userData.points.push(new PMPoint(2, 2, 2.25));\n",
       "obj22.userData.points.push(new PMPoint(2, 3.25, 2.25));\n",
       "\n",
       "obj22.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj22.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj22.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj22.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj22);\n",
       "scene.add(obj22);\n",
       "\n",
       "var obj23 = new THREE.Object3D();\n",
       "obj23.name = \"unnamed__24\";\n",
       "obj23.userData.explodable = 1;\n",
       "obj23.userData.points = [];\n",
       "obj23.userData.points.push(new PMPoint(-0.5, 0, 0));\n",
       "obj23.userData.points.push(new PMPoint(-0.75, 0, -0.5));\n",
       "\n",
       "obj23.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj23.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj23.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj23.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj23);\n",
       "scene.add(obj23);\n",
       "\n",
       "var obj24 = new THREE.Object3D();\n",
       "obj24.name = \"unnamed__25\";\n",
       "obj24.userData.explodable = 1;\n",
       "obj24.userData.points = [];\n",
       "obj24.userData.points.push(new PMPoint(0, -0.5, -0.25));\n",
       "obj24.userData.points.push(new PMPoint(0, -0.625, -0.5));\n",
       "\n",
       "obj24.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj24.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj24.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj24.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj24);\n",
       "scene.add(obj24);\n",
       "\n",
       "var obj25 = new THREE.Object3D();\n",
       "obj25.name = \"unnamed__26\";\n",
       "obj25.userData.explodable = 1;\n",
       "obj25.userData.points = [];\n",
       "obj25.userData.points.push(new PMPoint(0, 0, -0.5));\n",
       "obj25.userData.points.push(new PMPoint(0.5, 0.5, -0.5));\n",
       "\n",
       "obj25.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj25.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj25.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj25.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj25);\n",
       "scene.add(obj25);\n",
       "\n",
       "var obj26 = new THREE.Object3D();\n",
       "obj26.name = \"unnamed__27\";\n",
       "obj26.userData.explodable = 1;\n",
       "obj26.userData.points = [];\n",
       "obj26.userData.points.push(new PMPoint(0, 0, -0.5));\n",
       "obj26.userData.points.push(new PMPoint(-0.75, 0, -0.5));\n",
       "\n",
       "obj26.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj26.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj26.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj26.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj26);\n",
       "scene.add(obj26);\n",
       "\n",
       "var obj27 = new THREE.Object3D();\n",
       "obj27.name = \"unnamed__28\";\n",
       "obj27.userData.explodable = 1;\n",
       "obj27.userData.points = [];\n",
       "obj27.userData.points.push(new PMPoint(0, 0, -0.5));\n",
       "obj27.userData.points.push(new PMPoint(0, -0.625, -0.5));\n",
       "\n",
       "obj27.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj27.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj27.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj27.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj27);\n",
       "scene.add(obj27);\n",
       "\n",
       "var obj28 = new THREE.Object3D();\n",
       "obj28.name = \"unnamed__29\";\n",
       "obj28.userData.explodable = 1;\n",
       "obj28.userData.points = [];\n",
       "obj28.userData.points.push(new PMPoint(0.5, 0.5, -0.5));\n",
       "obj28.userData.points.push(new PMPoint(0.5, 3.25, -0.5));\n",
       "\n",
       "obj28.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj28.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj28.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj28.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj28);\n",
       "scene.add(obj28);\n",
       "\n",
       "var obj29 = new THREE.Object3D();\n",
       "obj29.name = \"unnamed__30\";\n",
       "obj29.userData.explodable = 1;\n",
       "obj29.userData.points = [];\n",
       "obj29.userData.points.push(new PMPoint(0.5, 0.5, -0.5));\n",
       "obj29.userData.points.push(new PMPoint(3.25, 0.5, -0.5));\n",
       "\n",
       "obj29.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj29.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj29.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj29.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj29);\n",
       "scene.add(obj29);\n",
       "\n",
       "var obj30 = new THREE.Object3D();\n",
       "obj30.name = \"unnamed__31\";\n",
       "obj30.userData.explodable = 1;\n",
       "obj30.userData.points = [];\n",
       "obj30.userData.points.push(new PMPoint(0.5, 1, 1));\n",
       "obj30.userData.points.push(new PMPoint(-0.5, 0, 0));\n",
       "\n",
       "obj30.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj30.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj30.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj30.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj30);\n",
       "scene.add(obj30);\n",
       "\n",
       "var obj31 = new THREE.Object3D();\n",
       "obj31.name = \"unnamed__32\";\n",
       "obj31.userData.explodable = 1;\n",
       "obj31.userData.points = [];\n",
       "obj31.userData.points.push(new PMPoint(0.5, 1, 1));\n",
       "obj31.userData.points.push(new PMPoint(0.75, 1, 1.25));\n",
       "\n",
       "obj31.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj31.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj31.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj31.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj31);\n",
       "scene.add(obj31);\n",
       "\n",
       "var obj32 = new THREE.Object3D();\n",
       "obj32.name = \"unnamed__33\";\n",
       "obj32.userData.explodable = 1;\n",
       "obj32.userData.points = [];\n",
       "obj32.userData.points.push(new PMPoint(0.5, 1, 1));\n",
       "obj32.userData.points.push(new PMPoint(0.5, 3.25, 1));\n",
       "\n",
       "obj32.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj32.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj32.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj32.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj32);\n",
       "scene.add(obj32);\n",
       "\n",
       "var obj33 = new THREE.Object3D();\n",
       "obj33.name = \"unnamed__34\";\n",
       "obj33.userData.explodable = 1;\n",
       "obj33.userData.points = [];\n",
       "obj33.userData.points.push(new PMPoint(1, 0.75, 1));\n",
       "obj33.userData.points.push(new PMPoint(0, -0.25, 0));\n",
       "\n",
       "obj33.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj33.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj33.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj33.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj33);\n",
       "scene.add(obj33);\n",
       "\n",
       "var obj34 = new THREE.Object3D();\n",
       "obj34.name = \"unnamed__35\";\n",
       "obj34.userData.explodable = 1;\n",
       "obj34.userData.points = [];\n",
       "obj34.userData.points.push(new PMPoint(0, -0.25, 0));\n",
       "obj34.userData.points.push(new PMPoint(-0.5, -0.25, 0));\n",
       "\n",
       "obj34.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj34.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj34.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj34.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj34);\n",
       "scene.add(obj34);\n",
       "\n",
       "var obj35 = new THREE.Object3D();\n",
       "obj35.name = \"unnamed__36\";\n",
       "obj35.userData.explodable = 1;\n",
       "obj35.userData.points = [];\n",
       "obj35.userData.points.push(new PMPoint(0, -0.25, 0));\n",
       "obj35.userData.points.push(new PMPoint(0, -0.5, -0.25));\n",
       "\n",
       "obj35.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj35.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj35.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj35.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj35);\n",
       "scene.add(obj35);\n",
       "\n",
       "var obj36 = new THREE.Object3D();\n",
       "obj36.name = \"unnamed__37\";\n",
       "obj36.userData.explodable = 1;\n",
       "obj36.userData.points = [];\n",
       "obj36.userData.points.push(new PMPoint(0.75, 1, 1.25));\n",
       "obj36.userData.points.push(new PMPoint(1, 1, 1.25));\n",
       "\n",
       "obj36.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj36.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj36.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj36.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj36);\n",
       "scene.add(obj36);\n",
       "\n",
       "var obj37 = new THREE.Object3D();\n",
       "obj37.name = \"unnamed__38\";\n",
       "obj37.userData.explodable = 1;\n",
       "obj37.userData.points = [];\n",
       "obj37.userData.points.push(new PMPoint(1, 0.75, 1));\n",
       "obj37.userData.points.push(new PMPoint(1, 1, 1.25));\n",
       "\n",
       "obj37.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj37.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj37.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj37.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj37);\n",
       "scene.add(obj37);\n",
       "\n",
       "var obj38 = new THREE.Object3D();\n",
       "obj38.name = \"unnamed__39\";\n",
       "obj38.userData.explodable = 1;\n",
       "obj38.userData.points = [];\n",
       "obj38.userData.points.push(new PMPoint(1, 0.75, 1));\n",
       "obj38.userData.points.push(new PMPoint(3.25, 0.75, 1));\n",
       "\n",
       "obj38.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj38.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj38.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj38.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj38);\n",
       "scene.add(obj38);\n",
       "\n",
       "var obj39 = new THREE.Object3D();\n",
       "obj39.name = \"unnamed__40\";\n",
       "obj39.userData.explodable = 1;\n",
       "obj39.userData.points = [];\n",
       "obj39.userData.points.push(new PMPoint(1, 1, 1.25));\n",
       "obj39.userData.points.push(new PMPoint(2, 2, 2.25));\n",
       "\n",
       "obj39.userData.pointradii = 0.002;\n",
       "   <!-- Vertex style -->\n",
       "obj39.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj39.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj39.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj39);\n",
       "scene.add(obj39);\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "function textSpriteMaterial(message, parameters) {\n",
       "    if ( parameters === undefined ) parameters = {};\n",
       "    var fontface = \"Helvetica\";\n",
       "    var fontsize = parameters.hasOwnProperty(\"fontsize\") ? parameters[\"fontsize\"] : 15;\n",
       "    fontsize = fontsize*10;\n",
       "    var lines = message.split('\\\\n');\n",
       "    var size = 512;\n",
       "    for(var i = 0; i<lines.length; i++){\n",
       "        var tmp = lines[i].length;\n",
       "        while(tmp*fontsize > size){\n",
       "           fontsize--;\n",
       "        }\n",
       "    }\n",
       "    \n",
       "    var canvas = document.createElement('canvas');\n",
       "    canvas.width = size;\n",
       "    canvas.height = size;\n",
       "    var context = canvas.getContext('2d');\n",
       "    context.fillStyle = \"rgba(255, 255, 255, 0)\";\n",
       "    context.fill();\n",
       "    context.font = fontsize + \"px \" + fontface;\n",
       "    \n",
       "    // text color\n",
       "    context.fillStyle = \"rgba(0, 0, 0, 1.0)\";\n",
       "     for(var i = 0; i<lines.length; i++){\n",
       "        context.fillText(lines[i], size/2, size/2+i*fontsize);\n",
       "     }\n",
       "    \n",
       "    // canvas contents will be used for a texture\n",
       "    var texture = new THREE.Texture(canvas);\n",
       "    texture.needsUpdate = true;\n",
       "    \n",
       "    var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 });\n",
       "    return spriteMaterial;\n",
       "}\n",
       "\n",
       "\n",
       "// ---------------------- INITIALIZING OBJECTS--------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function init_object(obj) {\n",
       "    if (obj.userData.hasOwnProperty(\"pointmaterial\")) {\n",
       "        init_points(obj);\n",
       "        modelContains.points = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"pointlabels\")) {\n",
       "        init_pointlabels(obj);\n",
       "        modelContains.pointlabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgematerial\")) {\n",
       "        init_lines(obj);\n",
       "        modelContains.lines = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgelabels\")) {\n",
       "        init_edgelabels(obj);\n",
       "        modelContains.edgelabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"arrowstyle\")) {\n",
       "        init_arrowheads(obj);\n",
       "        modelContains.arrowheads = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"facetmaterial\")) {\n",
       "        init_faces(obj);\n",
       "        modelContains.faces = true;\n",
       "    }\n",
       "}\n",
       "\n",
       "function init_points(obj) {\n",
       "    var pointgroup = new THREE.Group();\n",
       "    pointgroup.name = \"points\";\n",
       "    var points = obj.userData.points;\n",
       "    var radii = obj.userData.pointradii;\n",
       "    var materials = obj.userData.pointmaterial;\n",
       "    var geometry,material;\n",
       "    if (!Array.isArray(radii)) {\n",
       "        geometry = new THREE.SphereBufferGeometry(radii);  \n",
       "    }\n",
       "    if (!Array.isArray(materials)) {\n",
       "        material = materials;\n",
       "    }\n",
       "    for (var i=0; i<points.length; i++) {\n",
       "        var point = points[i];\n",
       "        if (Array.isArray(radii)) {\n",
       "            if (radii[i] == 0) {\n",
       "                continue;\n",
       "            }\n",
       "            geometry = new THREE.SphereBufferGeometry(radii[i]);  \n",
       "        } \n",
       "        if (Array.isArray(materials)) {\n",
       "            material = materials[i];     \n",
       "        } \n",
       "        var sphere = new THREE.Mesh(geometry, material);\n",
       "        point.addSphere(sphere);\n",
       "        pointgroup.add(sphere);\n",
       "    }\n",
       "    obj.add(pointgroup);\n",
       "}\n",
       "\n",
       "function init_pointlabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var labels = obj.userData.pointlabels;\n",
       "    var pointlabels = new THREE.Group();\n",
       "    pointlabels.name = \"pointlabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(pointlabels);\n",
       "}\n",
       "\n",
       "function init_lines(obj) {\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var points = obj.userData.points;\n",
       "    var materials = obj.userData.edgematerial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 );\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position', bufattr);\n",
       "    if (Array.isArray(materials)) {     \n",
       "        for (var i=0; i<materials.length; i++) {\n",
       "            geometry.addGroup(2*i,2,i);\n",
       "        }\n",
       "    }\n",
       "    var lines = new THREE.LineSegments(geometry, materials);\n",
       "    lines.name = \"lines\";\n",
       "    obj.add(lines);\n",
       "    updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "function init_edgelabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var labels = obj.userData.edgelabels;\n",
       "    var edgelabels = new THREE.Group();\n",
       "    edgelabels.name = \"edgelabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            edgelabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(edgelabels);\n",
       "}\n",
       "\n",
       "function init_arrowheads(obj) {\n",
       "    var arrowheads = new THREE.Group();\n",
       "    arrowheads.name = \"arrowheads\";\n",
       "    var arrowstyle = obj.userData.arrowstyle;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var edgematerials = obj.userData.edgematerial;\n",
       "    var points = obj.userData.points;\n",
       "    var material;\n",
       "    if (!Array.isArray(edgematerials)) {\n",
       "        material = new THREE.MeshBasicMaterial( {color: edgematerials.color} );\n",
       "    }\n",
       "\n",
       "    for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "        var start = points[edgeindices[i]];\n",
       "        var end = points[edgeindices[i+1]];\n",
       "        var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius();\n",
       "        if (dist <= 0) {\n",
       "            continue;\n",
       "        }\n",
       "        var dir = new THREE.Vector3().subVectors(end.vector,start.vector);\n",
       "        dir.normalize();\n",
       "        var axis = new THREE.Vector3().set(dir.z,0,-dir.x);\n",
       "        axis.normalize();\n",
       "        var radians = Math.acos( dir.y );\n",
       "        var radius = dist/25;\n",
       "        var height = dist/5;\n",
       "        var geometry = new THREE.ConeBufferGeometry(radius,height);\n",
       "        var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2));\n",
       "        if (Array.isArray(edgematerials)) {\n",
       "            material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} );\n",
       "        }\n",
       "        var cone = new THREE.Mesh( geometry, material );\n",
       "        cone.quaternion.setFromAxisAngle(axis,radians);;\n",
       "        cone.position.copy(position);;\n",
       "        arrowheads.add(cone);\n",
       "    }\n",
       "    obj.add(arrowheads);\n",
       "}\n",
       "\n",
       "function init_faces(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var facets = obj.userData.facets;\n",
       "    obj.userData.triangleindices = [];\n",
       "    for (var i=0; i<facets.length; i++) {\n",
       "        facet = facets[i];\n",
       "        for (var t=0; t<facet.length-2; t++) {\n",
       "            obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]);  \n",
       "        }\n",
       "    }\n",
       "    var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute(bufarr,3);\n",
       "    \n",
       "    var materials = obj.userData.facetmaterial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position',bufattr);\n",
       "    if (Array.isArray(materials)) {\n",
       "        var tricount = 0;\n",
       "        var facet;\n",
       "        for (var i=0; i<facets.length; i++) {\n",
       "            facet = facets[i];\n",
       "            geometry.addGroup(tricount,(facet.length-2)*3,i);\n",
       "            tricount += (facet.length-2)*3;\n",
       "        }\n",
       "    }\n",
       "    var mesh = new THREE.Mesh(geometry, materials);\n",
       "    mesh.name = \"faces\";\n",
       "    obj.add(mesh); \n",
       "    updateFacesPosition(obj);\n",
       "}\n",
       "// //INITIALIZING\n",
       "\n",
       "\n",
       "function updateFacesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.triangleindices;\n",
       "    var faces = obj.getObjectByName(\"faces\");\n",
       "    var ba = faces.geometry.getAttribute(\"position\");\n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    faces.geometry.attributes.position.needsUpdate = true;\n",
       "    \n",
       "}\n",
       "\n",
       "function updateEdgesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.edgeindices;\n",
       "    var lines = obj.getObjectByName(\"lines\");\n",
       "    var ba = lines.geometry.getAttribute(\"position\"); \n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    lines.geometry.attributes.position.needsUpdate = true;\n",
       "}\n",
       "\n",
       "function onWindowResize() {\n",
       "    renderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    svgRenderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "function updateCamera() {\n",
       "    var width = three.clientWidth;\n",
       "    var height = three.clientHeight;\n",
       "    var aspect = width / height;\n",
       "    if (camera.type == \"OrthographicCamera\") {\n",
       "        camera.left = frustumSize * aspect / - 2;\n",
       "        camera.right = frustumSize * aspect / 2;\n",
       "        camera.top = frustumSize / 2;\n",
       "        camera.bottom = - frustumSize / 2;\n",
       "    } else if (camera.type == \"PerspectiveCamera\") {\n",
       "        camera.aspect = aspect;\n",
       "    }\n",
       "    camera.updateProjectionMatrix();\n",
       "}\n",
       "\n",
       "function changeCamera(event) {\n",
       "    var selindex = event.currentTarget.selectedIndex;\n",
       "    camera = cameras[selindex];\n",
       "    control = controls[selindex];\n",
       "    control.enabled = true; \n",
       "    for (var i=0; i<controls.length; i++) {\n",
       "        if (i!=selindex) {\n",
       "            controls[i].enabled = false;\n",
       "        }\n",
       "    }\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "var camtypenode = document.getElementById('cameraType_3');\n",
       "camtypenode.onchange = changeCamera;\n",
       "camtypenode.dispatchEvent(new Event('change'));\n",
       "\n",
       "onWindowResize();\n",
       "window.addEventListener('resize', onWindowResize);\t\n",
       "\n",
       "\n",
       "var xRotationEnabled = false;\n",
       "var yRotationEnabled = false;\n",
       "var zRotationEnabled = false;\n",
       "var rotationSpeedFactor = 1;\n",
       "var settingsShown = false;\n",
       "var labelsShown = true;\n",
       "var intervals = [];\n",
       "var timeouts = [];\n",
       "var explodingSpeed = 0.05;\n",
       "var explodeScale = 0;\n",
       "var XMLS = new XMLSerializer();\n",
       "var svgElement;\n",
       "var renderId;\n",
       "\n",
       "var render = function () {\n",
       "\n",
       "\trenderId = requestAnimationFrame(render);\n",
       "\n",
       "//\tcomment in for automatic explosion\n",
       "//\texplode(updateFactor());\n",
       "\n",
       "    var phi = 0.02 * rotationSpeedFactor;\n",
       "\n",
       "    if (xRotationEnabled) {\n",
       "        scene.rotation.x += phi;\n",
       "    }\n",
       "    if (yRotationEnabled) {\n",
       "        scene.rotation.y += phi;\n",
       "    }\n",
       "    if (zRotationEnabled) {\n",
       "        scene.rotation.z += phi;\n",
       "    }\n",
       "\n",
       "    control.update();\n",
       "    renderer.render(scene, camera);\n",
       "};\n",
       "\n",
       "if ( THREE.WEBGL.isWebGLAvailable() ) {\n",
       "\trender();\n",
       "} else {\n",
       "\tvar warning = WEBGL.getWebGLErrorMessage();\n",
       "\tthree.appendChild( warning );\n",
       "}\n",
       "    \n",
       "function changeTransparency() {\n",
       "    var opacity = 1-Number(event.currentTarget.value);\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        child = scene.children[i];\n",
       "        if ( child.userData.hasOwnProperty(\"facetmaterial\") ) {\n",
       "            if (Array.isArray(child.userData.facetmaterial)) {\n",
       "                for (var j=0; j<child.userData.facetmaterial.length; j++) {\n",
       "                    child.userData.facetmaterial[j].opacity = opacity;\n",
       "                }\n",
       "            } else {\n",
       "                child.userData.facetmaterial.opacity = opacity;\n",
       "            }    \n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function changeRotationX(event){\n",
       "    xRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationY(event){\n",
       "    yRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationZ(event){\n",
       "    zRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "\n",
       "function changeRotationSpeedFactor(event){\n",
       "    rotationSpeedFactor = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function resetScene(){\n",
       "    scene.rotation.set(0,0,0);\n",
       "    camera.position.set(0,0,5);\n",
       "    camera.up.set(0,1,0);\n",
       "}\n",
       "\n",
       "function showSettings(event){\n",
       "    document.getElementById('settings_3').style.visibility = 'visible';\n",
       "    document.getElementById('showSettingsButton_3').style.visibility = 'hidden';\n",
       "    document.getElementById('hideSettingsButton_3').style.visibility = 'visible';\n",
       "    settingsShown = true;\n",
       "}\n",
       "\n",
       "function hideSettings(event){\n",
       "    document.getElementById('settings_3').style.visibility = 'hidden';\n",
       "    document.getElementById('showSettingsButton_3').style.visibility = 'visible';\n",
       "    document.getElementById('hideSettingsButton_3').style.visibility = 'hidden';\n",
       "    settingsShown = false;\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "var pos = 150* Math.PI;\n",
       "\n",
       "function updateFactor() {\n",
       "    pos++;\n",
       "    return Math.sin(.01*pos)+1;\n",
       "}\n",
       "\n",
       "// ------------------------ FOLDING ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "// rotate point p around axis defined by points p1 and p2 by given angle\n",
       "function rotate(p, p1, p2, angle ){   \n",
       "    angle = -angle;\n",
       "    var x = p.x, y = p.y, z = p.z, \n",
       "    a = p1.x, b = p1.y, c = p1.z, \n",
       "    u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z;\n",
       "    var result = [];\n",
       "    var L = u*u + v*v + w*w;\n",
       "    var sqrt = Math.sqrt;\n",
       "    var cos = Math.cos;\n",
       "    var sin = Math.sin;\n",
       "\n",
       "    result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L;\n",
       "    result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L;\n",
       "    result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L;\n",
       "\n",
       "    return result;\n",
       "}\n",
       "\n",
       "var fold = function(event){\n",
       "    var obj = foldables[Number(event.currentTarget.name)];\n",
       "    var foldvalue = Number(event.currentTarget.value);\n",
       "    var scale = foldvalue - obj.userData.oldscale;\n",
       "\n",
       "    for (var j=0; j<obj.userData.axes.length; j++) {\n",
       "        rotateVertices(obj, j, scale);\n",
       "    }\n",
       "    update(obj);\n",
       "    obj.userData.oldscale += scale;\n",
       "    lookAtBarycenter(obj);\n",
       "}\n",
       "\n",
       "function lookAtBarycenter(obj){\n",
       "    control.target = barycenter(obj);\n",
       "}\n",
       "\n",
       "function barycenter(obj) {\n",
       "    var center = new THREE.Vector3(0,0,0);\n",
       "    var points = obj.userData.points;\n",
       "    for (var i=0; i<points.length; i++){\n",
       "        center.add(points[i].vector);\n",
       "    }\n",
       "    center.divideScalar(points.length);\n",
       "    return center;\n",
       "}\n",
       "\n",
       "function rotateVertices(obj, edge, scale) {\n",
       "    var axes = obj.userData.axes;\n",
       "    var subtrees = obj.userData.subtrees;\n",
       "    var points = obj.userData.points;\n",
       "    var angles = obj.userData.angles;\n",
       "    if (edge < axes.length){\n",
       "        for (var j=0; j<subtrees[edge].length; j++){\n",
       "            var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge]));\n",
       "            points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]);\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function update(obj) {\n",
       "   updateFacesPosition(obj);\n",
       "   updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "if (foldables.length) {\n",
       "    var settings = document.getElementById('settings_3');\n",
       "    var foldDiv = document.createElement('div');\n",
       "    foldDiv.id = 'fold_3';\n",
       "    var title = document.createElement('strong');\n",
       "    title.innerHTML = 'Fold';\n",
       "    foldDiv.appendChild(title);\n",
       "    foldDiv.className = 'group';\n",
       "    for (var i=0; i<foldables.length; i++) {\n",
       "        var range = document.createElement('input');\n",
       "        range.type = 'range';\n",
       "        range.min = 0;\n",
       "        range.max = 1;\n",
       "        range.value = 0;\n",
       "        range.step = 0.001;\n",
       "        range.name = String(i);\n",
       "        range.oninput = fold;\n",
       "        foldDiv.appendChild(range);\n",
       "    }\n",
       "    lookAtBarycenter(foldables[0]);\n",
       "    settings.insertBefore(foldDiv,settings.childNodes[0]);\n",
       "}\n",
       "\n",
       "    \n",
       "// ---------------------- EXPLOSION ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "if (explodableModel) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        obj = scene.children[i];\n",
       "        if ( obj.userData.explodable ) {\n",
       "            computeCentroid(obj);\n",
       "        }\n",
       "    }\n",
       "    document.getElementById('explodeRange_3').oninput = triggerExplode;\n",
       "    document.getElementById('explodeCheckbox_3').onchange = triggerAutomaticExplode;\n",
       "    document.getElementById('explodingSpeedRange_3').oninput = setExplodingSpeed;\n",
       "}\n",
       "\n",
       "function computeCentroid(obj) {\n",
       "    centroid = new THREE.Vector3();\n",
       "    obj.userData.points.forEach(function(pmpoint) {\n",
       "        centroid.add(pmpoint.vector);\t\t\t\n",
       "    });\n",
       "    centroid.divideScalar(obj.userData.points.length);\n",
       "    obj.userData.centroid = centroid;\n",
       "}\n",
       "\n",
       "function explode(factor) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        var obj = scene.children[i];\n",
       "        if (obj.userData.hasOwnProperty(\"centroid\")) { \n",
       "            var c = obj.userData.centroid;\n",
       "            obj.position.set(c.x*factor, c.y*factor, c.z*factor);\n",
       "        }\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function triggerExplode(event){\n",
       "    explodeScale = Number(event.currentTarget.value);\n",
       "    explode(explodeScale);\n",
       "}\n",
       "\n",
       "function setExplodingSpeed(event){\n",
       "    explodingSpeed = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function triggerAutomaticExplode(event){\n",
       "    if (event.currentTarget.checked){\n",
       "        startExploding();\n",
       "    } else {\n",
       "        clearIntervals();\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function startExploding(){\n",
       "    intervals.push(setInterval(explodingInterval, 25));\n",
       "}\n",
       "\n",
       "\n",
       "function explodingInterval(){\n",
       "    explodeScale += explodingSpeed;\n",
       "    if (explodeScale <= 6){ \n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else{\n",
       "        explode(6);\n",
       "        explodeScale = 6;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startUnexploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_3').value = explodeScale;\n",
       "}\n",
       "\n",
       "\n",
       "function startUnexploding(){\n",
       "    intervals.push(setInterval(unexplodingInterval, 25));\n",
       "}\n",
       "\n",
       "function unexplodingInterval(){\n",
       "    explodeScale -= explodingSpeed;\n",
       "    if (explodeScale >= 0){\t\n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else {\n",
       "        explode(0);\n",
       "        explodeScale = 0;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startExploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_3').value = explodeScale;\n",
       "}\n",
       "\n",
       "function clearIntervals(){\n",
       "    intervals.forEach(function(interval){\n",
       "        clearInterval(interval);\n",
       "    });\n",
       "    intervals = [];\n",
       "    timeouts.forEach(function(timeout){\n",
       "        clearTimeout(timeout);\n",
       "    });\n",
       "    timeouts = [];\n",
       "}\n",
       "\n",
       "// ---------------------- DISPLAY --------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "const objectTypeInnerHTMLs = { points: \"Points\", pointlabels: \"Point labels\", lines: \"Edges\", edgelabels: \"Edge labels\", faces: \"Faces\", arrowheads: \"Arrow heads\" };\n",
       "const objectTypeVisible = {};\n",
       "Object.assign(objectTypeVisible,modelContains);\n",
       "const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort();\n",
       "const shownObjectTypesList = document.getElementById('shownObjectTypesList_3');\n",
       "\n",
       "function setVisibility(bool,objname) {\n",
       "    for (var i=0; i<scene.children.length; i++){\n",
       "        var obj = scene.children[i].getObjectByName(objname);\n",
       "        if (obj) {\n",
       "            obj.visible = bool;\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function toggleObjectTypeVisibility(event){\n",
       "    var name = event.currentTarget.name;\n",
       "    var checked = event.currentTarget.checked;\n",
       "    objectTypeVisible[name] = checked;\n",
       "    setVisibility(checked,name);\n",
       "}\n",
       "\n",
       "for (var i=0; i<sortedObjectTypeKeys.length; i++){\n",
       "    var key = sortedObjectTypeKeys[i];\n",
       "    if (modelContains[key]) {\n",
       "        var objTypeNode = document.createElement('span');\n",
       "        objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>';\n",
       "        var checkbox = document.createElement('input');\n",
       "        checkbox.type = 'checkbox';\n",
       "        checkbox.checked = true;\n",
       "        checkbox.name = key;\n",
       "        checkbox.onchange = toggleObjectTypeVisibility;\n",
       "        shownObjectTypesList.appendChild(checkbox);\n",
       "        shownObjectTypesList.appendChild(objTypeNode);\n",
       "    }\n",
       "}\n",
       "\n",
       "// ------------------------------------------------------\n",
       "\n",
       "function toggleObjectVisibility(event){\n",
       "    var nr = Number(event.currentTarget.name);\n",
       "    scene.children[nr].visible = event.currentTarget.checked;\n",
       "}\n",
       "\n",
       "// append checkboxes for displaying or hiding objects\n",
       "var shownObjectsList = document.getElementById('shownObjectsList_3');\n",
       "for (var i=0; i<scene.children.length; i++){\n",
       "    obj = scene.children[i];\n",
       "    var objNode = document.createElement('span');\n",
       "    objNode.innerHTML = obj.name + '<br>';\n",
       "    var checkbox = document.createElement('input');\n",
       "    checkbox.type = 'checkbox';\n",
       "    checkbox.checked = true;\n",
       "    checkbox.name = String(i);\n",
       "    checkbox.onchange = toggleObjectVisibility;\n",
       "    shownObjectsList.appendChild(checkbox);\n",
       "    shownObjectsList.appendChild(objNode);\n",
       "}\n",
       "\n",
       "// ---------------------- SVG ------------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function takeSvgScreenshot() {\n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(false,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(false,\"edgelabels\");\n",
       "    }\n",
       "    svgRenderer.render(scene,camera);\n",
       "    svgElement = XMLS.serializeToString(svgRenderer.domElement);\n",
       "    \n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(true,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(true,\"edgelabels\");\n",
       "    }\n",
       "\n",
       "    if (document.getElementById('tab_3').checked){\n",
       "        //show in new tab\n",
       "        var myWindow = window.open(\"\",\"\");\n",
       "        myWindow.document.body.innerHTML = svgElement;\n",
       "    } else{\n",
       "        // download svg file \n",
       "        download(\"screenshot.svg\", svgElement);\n",
       "    }\n",
       "}\n",
       "\n",
       "function download(filename, text) {\n",
       "    var element = document.createElement('a');\n",
       "    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));\n",
       "    element.setAttribute('download', filename);\n",
       "\n",
       "    element.style.display = 'none';\n",
       "    document.body.appendChild(element);\n",
       "\n",
       "    element.click();\n",
       "\n",
       "    document.body.removeChild(element);\n",
       "}\n",
       "\n",
       "\n",
       "document.getElementById('transparencyRange_3').oninput = changeTransparency;\n",
       "document.getElementById('changeRotationX_3').onchange = changeRotationX;\n",
       "document.getElementById('changeRotationY_3').onchange = changeRotationY;\n",
       "document.getElementById('changeRotationZ_3').onchange = changeRotationZ;\n",
       "document.getElementById('resetButton_3').onclick = resetScene;\n",
       "document.getElementById('rotationSpeedRange_3').oninput = changeRotationSpeedFactor;\n",
       "document.getElementById('takeScreenshot_3').onclick = takeSvgScreenshot;\n",
       "document.getElementById('showSettingsButton_3').onclick = showSettings;\n",
       "document.getElementById('hideSettingsButton_3').onclick = hideSettings;\n",
       "\n",
       "\n",
       "// ------------------ SHORTCUTS --------------------------------------------\n",
       "// -------------------------------------------------------------------------\n",
       "\n",
       "/**\n",
       " * http://www.openjs.com/scripts/events/keyboard_shortcuts/\n",
       " * Version : 2.01.B\n",
       " * By Binny V A\n",
       " * License : BSD\n",
       " */\n",
       "shortcut = {\n",
       "\t'all_shortcuts':{},//All the shortcuts are stored in this array\n",
       "\t'add': function(shortcut_combination,callback,opt) {\n",
       "\t\t//Provide a set of default options\n",
       "\t\tvar default_options = {\n",
       "\t\t\t'type':'keydown',\n",
       "\t\t\t'propagate':false,\n",
       "\t\t\t'disable_in_input':false,\n",
       "\t\t\t'target':document,\n",
       "\t\t\t'keycode':false\n",
       "\t\t}\n",
       "\t\tif(!opt) opt = default_options;\n",
       "\t\telse {\n",
       "\t\t\tfor(var dfo in default_options) {\n",
       "\t\t\t\tif(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\n",
       "\t\tvar ele = opt.target;\n",
       "\t\tif(typeof opt.target == 'string') ele = document.getElementById(opt.target);\n",
       "\t\tvar ths = this;\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\n",
       "\t\t//The function to be called at keypress\n",
       "\t\tvar func = function(e) {\n",
       "\t\t\te = e || window.event;\n",
       "\t\t\t\n",
       "\t\t\tif(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields\n",
       "\t\t\t\tvar element;\n",
       "\t\t\t\tif(e.target) element=e.target;\n",
       "\t\t\t\telse if(e.srcElement) element=e.srcElement;\n",
       "\t\t\t\tif(element.nodeType==3) element=element.parentNode;\n",
       "\n",
       "\t\t\t\tif(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\t//Find Which key is pressed\n",
       "\t\t\tif (e.keyCode) code = e.keyCode;\n",
       "\t\t\telse if (e.which) code = e.which;\n",
       "\t\t\tvar character = String.fromCharCode(code).toLowerCase();\n",
       "\t\t\t\n",
       "\t\t\tif(code == 188) character=\",\"; //If the user presses , when the type is onkeydown\n",
       "\t\t\tif(code == 190) character=\".\"; //If the user presses , when the type is onkeydown\n",
       "\n",
       "\t\t\tvar keys = shortcut_combination.split(\"+\");\n",
       "\t\t\t//Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked\n",
       "\t\t\tvar kp = 0;\n",
       "\t\t\t\n",
       "\t\t\t//Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken\n",
       "\t\t\tvar shift_nums = {\n",
       "\t\t\t\t\"`\":\"~\",\n",
       "\t\t\t\t\"1\":\"!\",\n",
       "\t\t\t\t\"2\":\"@\",\n",
       "\t\t\t\t\"3\":\"#\",\n",
       "\t\t\t\t\"4\":\"$\",\n",
       "\t\t\t\t\"5\":\"%\",\n",
       "\t\t\t\t\"6\":\"^\",\n",
       "\t\t\t\t\"7\":\"&\",\n",
       "\t\t\t\t\"8\":\"*\",\n",
       "\t\t\t\t\"9\":\"(\",\n",
       "\t\t\t\t\"0\":\")\",\n",
       "\t\t\t\t\"-\":\"_\",\n",
       "\t\t\t\t\"=\":\"+\",\n",
       "\t\t\t\t\";\":\":\",\n",
       "\t\t\t\t\"'\":\"\\\"\",\n",
       "\t\t\t\t\",\":\"<\",\n",
       "\t\t\t\t\".\":\">\",\n",
       "\t\t\t\t\"/\":\"?\",\n",
       "\t\t\t\t\"\\\\\":\"|\"\n",
       "\t\t\t}\n",
       "\t\t\t//Special Keys - and their codes\n",
       "\t\t\tvar special_keys = {\n",
       "\t\t\t\t'esc':27,\n",
       "\t\t\t\t'escape':27,\n",
       "\t\t\t\t'tab':9,\n",
       "\t\t\t\t'space':32,\n",
       "\t\t\t\t'return':13,\n",
       "\t\t\t\t'enter':13,\n",
       "\t\t\t\t'backspace':8,\n",
       "\t\n",
       "\t\t\t\t'scrolllock':145,\n",
       "\t\t\t\t'scroll_lock':145,\n",
       "\t\t\t\t'scroll':145,\n",
       "\t\t\t\t'capslock':20,\n",
       "\t\t\t\t'caps_lock':20,\n",
       "\t\t\t\t'caps':20,\n",
       "\t\t\t\t'numlock':144,\n",
       "\t\t\t\t'num_lock':144,\n",
       "\t\t\t\t'num':144,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pause':19,\n",
       "\t\t\t\t'break':19,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'insert':45,\n",
       "\t\t\t\t'home':36,\n",
       "\t\t\t\t'delete':46,\n",
       "\t\t\t\t'end':35,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pageup':33,\n",
       "\t\t\t\t'page_up':33,\n",
       "\t\t\t\t'pu':33,\n",
       "\t\n",
       "\t\t\t\t'pagedown':34,\n",
       "\t\t\t\t'page_down':34,\n",
       "\t\t\t\t'pd':34,\n",
       "\t\n",
       "\t\t\t\t'left':37,\n",
       "\t\t\t\t'up':38,\n",
       "\t\t\t\t'right':39,\n",
       "\t\t\t\t'down':40,\n",
       "\t\n",
       "\t\t\t\t'f1':112,\n",
       "\t\t\t\t'f2':113,\n",
       "\t\t\t\t'f3':114,\n",
       "\t\t\t\t'f4':115,\n",
       "\t\t\t\t'f5':116,\n",
       "\t\t\t\t'f6':117,\n",
       "\t\t\t\t'f7':118,\n",
       "\t\t\t\t'f8':119,\n",
       "\t\t\t\t'f9':120,\n",
       "\t\t\t\t'f10':121,\n",
       "\t\t\t\t'f11':122,\n",
       "\t\t\t\t'f12':123\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\tvar modifiers = { \n",
       "\t\t\t\tshift: { wanted:false, pressed:false},\n",
       "\t\t\t\tctrl : { wanted:false, pressed:false},\n",
       "\t\t\t\talt  : { wanted:false, pressed:false},\n",
       "\t\t\t\tmeta : { wanted:false, pressed:false}\t//Meta is Mac specific\n",
       "\t\t\t};\n",
       "                        \n",
       "\t\t\tif(e.ctrlKey)\tmodifiers.ctrl.pressed = true;\n",
       "\t\t\tif(e.shiftKey)\tmodifiers.shift.pressed = true;\n",
       "\t\t\tif(e.altKey)\tmodifiers.alt.pressed = true;\n",
       "\t\t\tif(e.metaKey)   modifiers.meta.pressed = true;\n",
       "                        \n",
       "\t\t\tfor(var i=0; k=keys[i],i<keys.length; i++) {\n",
       "\t\t\t\t//Modifiers\n",
       "\t\t\t\tif(k == 'ctrl' || k == 'control') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.ctrl.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'shift') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.shift.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'alt') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.alt.wanted = true;\n",
       "\t\t\t\t} else if(k == 'meta') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.meta.wanted = true;\n",
       "\t\t\t\t} else if(k.length > 1) { //If it is a special key\n",
       "\t\t\t\t\tif(special_keys[k] == code) kp++;\n",
       "\t\t\t\t\t\n",
       "\t\t\t\t} else if(opt['keycode']) {\n",
       "\t\t\t\t\tif(opt['keycode'] == code) kp++;\n",
       "\n",
       "\t\t\t\t} else { //The special keys did not match\n",
       "\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\telse {\n",
       "\t\t\t\t\t\tif(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase\n",
       "\t\t\t\t\t\t\tcharacter = shift_nums[character]; \n",
       "\t\t\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\t\t}\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t\t\n",
       "\t\t\tif(kp == keys.length && \n",
       "\t\t\t\t\t\tmodifiers.ctrl.pressed == modifiers.ctrl.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.shift.pressed == modifiers.shift.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.alt.pressed == modifiers.alt.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.meta.pressed == modifiers.meta.wanted) {\n",
       "\t\t\t\tcallback(e);\n",
       "\t\n",
       "\t\t\t\tif(!opt['propagate']) { //Stop the event\n",
       "\t\t\t\t\t//e.cancelBubble is supported by IE - this will kill the bubbling process.\n",
       "\t\t\t\t\te.cancelBubble = true;\n",
       "\t\t\t\t\te.returnValue = false;\n",
       "\t\n",
       "\t\t\t\t\t//e.stopPropagation works in Firefox.\n",
       "\t\t\t\t\tif (e.stopPropagation) {\n",
       "\t\t\t\t\t\te.stopPropagation();\n",
       "\t\t\t\t\t\te.preventDefault();\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t\treturn false;\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\t\tthis.all_shortcuts[shortcut_combination] = {\n",
       "\t\t\t'callback':func, \n",
       "\t\t\t'target':ele, \n",
       "\t\t\t'event': opt['type']\n",
       "\t\t};\n",
       "\t\t//Attach the function with the event\n",
       "\t\tif(ele.addEventListener) ele.addEventListener(opt['type'], func, false);\n",
       "\t\telse if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);\n",
       "\t\telse ele['on'+opt['type']] = func;\n",
       "\t},\n",
       "\n",
       "\t//Remove the shortcut - just specify the shortcut and I will remove the binding\n",
       "\t'remove':function(shortcut_combination) {\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\t\tvar binding = this.all_shortcuts[shortcut_combination];\n",
       "\t\tdelete(this.all_shortcuts[shortcut_combination])\n",
       "\t\tif(!binding) return;\n",
       "\t\tvar type = binding['event'];\n",
       "\t\tvar ele = binding['target'];\n",
       "\t\tvar callback = binding['callback'];\n",
       "\n",
       "\t\tif(ele.detachEvent) ele.detachEvent('on'+type, callback);\n",
       "\t\telse if(ele.removeEventListener) ele.removeEventListener(type, callback, false);\n",
       "\t\telse ele['on'+type] = false;\n",
       "\t}\n",
       "}\n",
       "\n",
       "shortcut.add(\"Alt+Left\",function() {\n",
       "\tvar event = new Event('click');\n",
       "\tif (settingsShown){\n",
       "\t\tdocument.getElementById('hideSettingsButton_3').dispatchEvent(event);\n",
       "\t} else {\n",
       "\t\tdocument.getElementById('showSettingsButton_3').dispatchEvent(event);\n",
       "\t}\n",
       "});\n",
       "\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "});});\n",
       "      </script>\n",
       "   </body>\n",
       "</html>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "$mQuadric = [ [2,0,0,0], [0,2,0,0], [0,0,2,0], [0,0,0,2],\n",
    "              [1,1,0,0], [1,0,1,0], [1,0,0,1],\n",
    "              [0,1,1,0], [0,1,0,1], [0,0,1,1]];\n",
    "$cQuadric = [1,-1/4,-2/4,-3/4,-3/4,-4/4,-5/4,2/4,0,-2/4];\n",
    "$TQuadric = new Hypersurface<Min>(MONOMIALS=>$mQuadric, COEFFICIENTS=>$cQuadric);\n",
    "$mCubic = [ [3,0,0,0], [0,3,0,0], [0,0,3,0], [0,0,0,3],\n",
    "            [1,1,1,0], [1,1,0,1], [1,0,1,1], [0,1,1,1],\n",
    "            [2,1,0,0], [2,0,1,0], [2,0,0,1],\n",
    "            [1,2,0,0], [1,0,2,0], [1,0,0,2],\n",
    "            [0,2,1,0], [0,2,0,1], [0,1,2,0],\n",
    "            [0,1,0,2], [0,0,2,1], [0,0,1,2]];\n",
    "$cCubic = [3,3,3,3,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1];\n",
    "$TCubic = new Hypersurface<Min>(MONOMIALS=>$mCubic, COEFFICIENTS=>$cCubic);\n",
    "$TSextic = intersect($TQuadric,$TCubic);\n",
    "$TSextic->VISUAL;"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### B: exporting tropical curves from polymake\n",
    "\n",
    "Unlike tropical hypersurfaces, preparing tropical curves for a 3d print is a bit more involved process. Since there is no satisfying way to solidify lines in default blender, we recommend using Polymake for solidification.\n",
    "\n",
    "For that, we need to decide on a bounding box, the planned size of the model, and the desired edge / vertex thickness. The first line below creates a bounding box based on the vertices of the tropical curve:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "$bFacets = polytope::bounding_box_facets($TSextic->affine_chart->VERTICES,offset=>1,surplus_k=>0.4, make_cube=>1);\n",
    "$total_mm = 100; #planned size of the model   \n",
    "$edges_mm = 2;   #desired edge diameter\n",
    "$vertex_mm = 2;  #desired vertex diameter\n",
    "\n",
    "$diam = $bFacets->[0]->[0] + $bFacets->[1]->[0];\n",
    "$vertex_diam = ($vertex_mm*$diam/$total_mm)/(1-$vertex_mm/$total_mm);\n",
    "$edges_diam = ($edges_mm*$diam/$total_mm)/(1-$vertex_mm/$total_mm);\n",
    "# this subroutine (sourced above) returns a set of VISUAL options that\n",
    "# make sure the curve ends up with the the calculated dimensions in the x3d file\n",
    "$curve_opts = x3dprint_curve_opts($vertex_diam,$edges_diam);\n",
    "\n",
    "# curves should be bounded beforehand to ensure all new vertices are also shown correctly\n",
    "$bPolytope = new polytope::Polytope(FACETS=>$bFacets);\n",
    "$bComplex = new fan::PolyhedralComplex(fan::check_fan_objects(($bPolytope)));\n",
    "$TSexticBounded = pcom_common_ref($TSextic->affine_chart, $bComplex);\n",
    "# export the curve\n",
    "x3d($TSexticBounded->VISUAL($curve_opts),File=>$x3d_dir.\"TSextic.x3d\");"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Step 3: framing tropical curves in polymake\n",
    "\n",
    "For 3d-printing we recommend crafting a frame which stabilizes the curve. The easiest way to craft a frame is using the intersection of the bounding box facets and one of the two tropical hypersurfaces which cut out the curve."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<!--\n",
       "polymake for knusper\n",
       "Thu Aug 27 10:34:41 2020\n",
       "pcom:\n",
       "-->\n",
       "\n",
       "\n",
       "<html>\n",
       "   <head>\n",
       "      <meta charset=utf-8>\n",
       "      <title>pcom:</title>\n",
       "      <style>\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "*/\n",
       "         html {overflow: scroll;}\n",
       "         strong{font-size: 18px;}\n",
       "         canvas { z-index: 8; }\n",
       "         input[type='radio'] {margin-left:0;}\n",
       "         input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;}\n",
       "         .group{padding-bottom: 15px;}\n",
       "         .settings * {z-index: 11; }\n",
       "         .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;}\n",
       "         .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} \n",
       "         .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;}\n",
       "         .showSettingsButton{visibility: visible; z-index: 12; position: absolute }\n",
       "         .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5}\n",
       "         button{margin-left: 0; margin-top: 10px}\n",
       "         img{cursor: pointer;}\n",
       "         .suboption{padding-top: 15px;}\n",
       "         #model9712938884 { width: 100%; height: 100%; }\n",
       "         .threejs_container { width: 100%; height: 75vh;}\n",
       "         .settings{max-height: 74vh} \n",
       "         input[type=range] {\n",
       "           -webkit-appearance: none;\n",
       "           padding:0; \n",
       "           width:90%; \n",
       "           margin-left: auto;\n",
       "           margin-right: auto;\n",
       "           margin-top: 15px;\n",
       "           margin-bottom: 15px;\n",
       "           display: block;\t\n",
       "         }\n",
       "         input[type=range]:focus {\n",
       "           outline: none;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-runnable-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "           -webkit-appearance: none;\n",
       "           margin-top: -5px;\n",
       "         }\n",
       "         input[type=range]:focus::-webkit-slider-runnable-track {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]::-moz-range-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-moz-range-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]::-ms-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           background: transparent;\n",
       "           border-color: transparent;\n",
       "           color: transparent;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_END\n",
       "*/\n",
       "\t\t</style>\n",
       "   </head>\n",
       "<body>\n",
       "   <div class='threejs_container'>\n",
       "\t\t<div id='settings_4' class='settings'>\n",
       "\t\t\t<div class=group id='explode_4'>\n",
       "\t\t\t\t<strong>Explode</strong>\n",
       "\t\t\t\t<input id='explodeRange_4' type='range' min=0 max=6 step=0.01 value=0>\n",
       "\t\t\t\t<div class=indented><input id='explodeCheckbox_4' type='checkbox'>Automatic explosion</div>\n",
       "\t\t\t\t<div class=suboption>Exploding speed</div>\n",
       "\t\t\t\t<input id='explodingSpeedRange_4' type='range' min=0 max=0.5 step=0.001 value=0.05>\n",
       "\t\t\t</div>\n",
       "\t\n",
       "\t\t\t<div class=group id='transparency_4' class='transparency'>\n",
       "\t\t\t\t<strong>Transparency</strong>\n",
       "\t\t\t\t<input id='transparencyRange_4' type='range' min=0 max=1 step=0.01 value=0>\n",
       "\t\t\t</div>\n",
       "\t\t\t\n",
       "\t\t\t<div class=group id='rotation_4'>\n",
       "\t\t\t\t<strong>Rotation</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationX_4'> x-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationY_4'> y-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationZ_4'> z-axis</div>\n",
       "\t\t\t\t\t<button id='resetButton_4'>Reset</button>\n",
       "\t\t\t\t</div>\n",
       "\n",
       "\t\t\t\t<div class=suboption>Rotation speed</div>\n",
       "\t\t\t\t<input id='rotationSpeedRange_4' type='range' min=0 max=5 step=0.01 value=2>\n",
       "\t\t\t</div>\n",
       "\n",
       "\n",
       "\t\t\t<div class=group id='display_4'>\n",
       "\t\t\t\t<strong>Display</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div id='shownObjectTypesList_4' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t\t<div class=suboption>Objects</div>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t   <div id='shownObjectsList_4' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "         \n",
       "         <div class=group id='camera_4'>\n",
       "            <strong>Camera</strong>\n",
       "            <div class=indented>\n",
       "               <form>\n",
       "                  <select id=\"cameraType_4\">\n",
       "                     <option value='perspective' selected> Perspective<br></option>\n",
       "                     <option value='orthographic' > Orthographic<br></option>\n",
       "                  </select>\n",
       "               </form>\n",
       "            </div>\n",
       "         </div>\n",
       "\n",
       "\t\t\t<div class=group id='svg_4'>\n",
       "\t\t\t\t<strong>SVG</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<form>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='download' id='download_4' checked> Download<br>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='tab' id='tab_4' > New tab<br>\n",
       "\t\t\t\t\t</form>\n",
       "\t\t\t\t\t<button id='takeScreenshot_4'>Screenshot</button>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "\n",
       "\t\t</div>\t<!-- end of settings -->\n",
       "\t\t<img id='hideSettingsButton_4' class='hideSettingsButton' src='/kernelspecs/polymake/close.svg' width=20px\">\n",
       "\t\t<img id='showSettingsButton_4' class='showSettingsButton' src='/kernelspecs/polymake/menu.svg' width=20px\">\n",
       "<div id=\"model9712938884\"></div>\n",
       "</div>\n",
       "   <script>\n",
       "    requirejs.config({\n",
       "      paths: {\n",
       "        three: '/kernelspecs/polymake/three',\n",
       "        TrackballControls: '/kernelspecs/polymake/TrackballControls',\n",
       "        OrbitControls: '/kernelspecs/polymake/OrbitControls',\n",
       "        Projector: '/kernelspecs/polymake/Projector',\n",
       "        SVGRenderer: '/kernelspecs/polymake/SVGRenderer',\n",
       "        WEBGL: '/kernelspecs/polymake/WebGL',\n",
       "      },\n",
       "      shim: {\n",
       "        'three': { exports: 'THREE'},\n",
       "        'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' },\n",
       "        'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' },\n",
       "        'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' },\n",
       "        'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' },\n",
       "        'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' },\n",
       "      }\n",
       "    });\n",
       "    \n",
       "    require(['three'],function(THREE){\n",
       "        window.THREE = THREE;\n",
       "      require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'],\n",
       "               function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) {\n",
       "    THREE.TrackballControls = TrackballControls;\n",
       "    THREE.OrbitControls = OrbitControls;\n",
       "    THREE.Projector = Projector;\n",
       "    THREE.SVGRenderer = SVGRenderer;\n",
       "    THREE.WEBGL = WEBGL;\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "\n",
       "const intervalLength = 25; // for automatic animations\n",
       "const explodableModel = true; \n",
       "const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false };\n",
       "const foldables = [];\n",
       "\n",
       "var three = document.getElementById(\"model9712938884\");\n",
       "var scene = new THREE.Scene();\n",
       "var renderer = new THREE.WebGLRenderer( { antialias: true } );\n",
       "var svgRenderer = new THREE.SVGRenderer( { antialias: true } );\n",
       "renderer.setPixelRatio( window.devicePixelRatio );\n",
       "renderer.setClearColor(0xFFFFFF, 1);\n",
       "svgRenderer.setClearColor(0xFFFFFF, 1);\n",
       "three.appendChild(renderer.domElement);\n",
       "\n",
       "var frustumSize = 4;\n",
       "var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()];\n",
       "cameras.forEach(function(cam) {\n",
       "    cam.position.set(0, 0, 5);\n",
       "    cam.lookAt(0, 0, 0);  \n",
       "    cam.up.set(0, 1, 0);         \n",
       "});\n",
       "var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)];\n",
       "var camera, control;\n",
       "\n",
       "controls[0].zoomSpeed = 0.2;\n",
       "controls[0].rotateSpeed = 4;\n",
       "\n",
       "\n",
       "// class to allow move points together with labels and spheres\n",
       "var PMPoint = function (x,y,z) {\n",
       "   this.vector = new THREE.Vector3(x,y,z);\n",
       "   this.sprite = null;\n",
       "   this.sphere = null;\n",
       "}\n",
       "PMPoint.prototype.addLabel = function(labelsprite) {\n",
       "   this.sprite = labelsprite;\n",
       "   this.sprite.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.addSphere = function(spheremesh) {\n",
       "   this.sphere = spheremesh;\n",
       "   this.sphere.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.set = function(x,y,z) {\n",
       "   this.vector.set(x,y,z);\n",
       "   if (this.sprite) {\n",
       "      this.sprite.position.copy(this.vector);\n",
       "   }\n",
       "   if (this.sphere) {\n",
       "      this.sphere.position.copy(this.vector);\n",
       "   }\n",
       "}\n",
       "PMPoint.prototype.radius = function() {\n",
       "   if (this.sphere) {\n",
       "      return this.sphere.geometry.parameters.radius;\n",
       "   } else {\n",
       "      return 0;\n",
       "   }\n",
       "};\n",
       "// select the target node\n",
       "var target = document.querySelector('#model9712938884');\n",
       "\n",
       "// create an observer instance\n",
       "var observer = new MutationObserver(function(mutations) {\n",
       "   mutations.forEach(function(mutation) {\n",
       "      if (mutation.removedNodes && mutation.removedNodes.length > 0) {\n",
       "         cancelAnimationFrame(renderId);\n",
       "         observer.disconnect();\n",
       "         console.log(\"cancelled frame \"+renderId);\n",
       "      }\n",
       "   });\n",
       "});\n",
       "\n",
       "// configuration of the observer:\n",
       "var config = { childList: true, characterData: true }\n",
       "\n",
       "// pass in the target node, as well as the observer options\n",
       "while (target) {\n",
       "   if (target.className==\"output\") {\n",
       "      observer.observe(target, config);\n",
       "      break;\n",
       "   }\n",
       "   target = target.parentNode;\n",
       "}\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "var obj0 = new THREE.Object3D();\n",
       "obj0.name = \"unnamed__1\";\n",
       "obj0.userData.explodable = 1;\n",
       "obj0.userData.points = [];\n",
       "obj0.userData.points.push(new PMPoint(4.5, -0.625, -0.5));\n",
       "obj0.userData.points.push(new PMPoint(4.5, -3.2, -3.075));\n",
       "\n",
       "obj0.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj0.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj0);\n",
       "scene.add(obj0);\n",
       "\n",
       "var obj1 = new THREE.Object3D();\n",
       "obj1.name = \"unnamed__2\";\n",
       "obj1.userData.explodable = 1;\n",
       "obj1.userData.points = [];\n",
       "obj1.userData.points.push(new PMPoint(4.5, 2, 2.25));\n",
       "obj1.userData.points.push(new PMPoint(4.5, 2, 4.5));\n",
       "\n",
       "obj1.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj1.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj1.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj1.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj1);\n",
       "scene.add(obj1);\n",
       "\n",
       "var obj2 = new THREE.Object3D();\n",
       "obj2.name = \"unnamed__3\";\n",
       "obj2.userData.explodable = 1;\n",
       "obj2.userData.points = [];\n",
       "obj2.userData.points.push(new PMPoint(4.5, -0.5, -0.25));\n",
       "obj2.userData.points.push(new PMPoint(4.5, -0.5, 4.5));\n",
       "\n",
       "obj2.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj2.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj2.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj2.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj2);\n",
       "scene.add(obj2);\n",
       "\n",
       "var obj3 = new THREE.Object3D();\n",
       "obj3.name = \"unnamed__4\";\n",
       "obj3.userData.explodable = 1;\n",
       "obj3.userData.points = [];\n",
       "obj3.userData.points.push(new PMPoint(4.5, 2, 2.25));\n",
       "obj3.userData.points.push(new PMPoint(4.5, 4.5, 2.25));\n",
       "\n",
       "obj3.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj3.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj3.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj3.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj3);\n",
       "scene.add(obj3);\n",
       "\n",
       "var obj4 = new THREE.Object3D();\n",
       "obj4.name = \"unnamed__5\";\n",
       "obj4.userData.explodable = 1;\n",
       "obj4.userData.points = [];\n",
       "obj4.userData.points.push(new PMPoint(4.5, -0.625, -0.5));\n",
       "obj4.userData.points.push(new PMPoint(4.5, -0.5, -0.25));\n",
       "\n",
       "obj4.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj4.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj4.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj4.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj4);\n",
       "scene.add(obj4);\n",
       "\n",
       "var obj5 = new THREE.Object3D();\n",
       "obj5.name = \"unnamed__6\";\n",
       "obj5.userData.explodable = 1;\n",
       "obj5.userData.points = [];\n",
       "obj5.userData.points.push(new PMPoint(4.5, -0.625, -0.5));\n",
       "obj5.userData.points.push(new PMPoint(4.5, 4.5, -0.5));\n",
       "\n",
       "obj5.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj5.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj5.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj5.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj5);\n",
       "scene.add(obj5);\n",
       "\n",
       "var obj6 = new THREE.Object3D();\n",
       "obj6.name = \"unnamed__7\";\n",
       "obj6.userData.explodable = 1;\n",
       "obj6.userData.points = [];\n",
       "obj6.userData.points.push(new PMPoint(4.5, 2, 2.25));\n",
       "obj6.userData.points.push(new PMPoint(4.5, -0.5, -0.25));\n",
       "\n",
       "obj6.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj6.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj6.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj6.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj6);\n",
       "scene.add(obj6);\n",
       "\n",
       "var obj7 = new THREE.Object3D();\n",
       "obj7.name = \"unnamed__8\";\n",
       "obj7.userData.explodable = 1;\n",
       "obj7.userData.points = [];\n",
       "obj7.userData.points.push(new PMPoint(-3.2, -3.075, -2.95));\n",
       "obj7.userData.points.push(new PMPoint(-3.2, -3.075, 4.5));\n",
       "\n",
       "obj7.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj7.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj7.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj7.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj7);\n",
       "scene.add(obj7);\n",
       "\n",
       "var obj8 = new THREE.Object3D();\n",
       "obj8.name = \"unnamed__9\";\n",
       "obj8.userData.explodable = 1;\n",
       "obj8.userData.points = [];\n",
       "obj8.userData.points.push(new PMPoint(-3.2, -3.075, -2.95));\n",
       "obj8.userData.points.push(new PMPoint(-3.2, 4.5, -2.95));\n",
       "\n",
       "obj8.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj8.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj8.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj8.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj8);\n",
       "scene.add(obj8);\n",
       "\n",
       "var obj9 = new THREE.Object3D();\n",
       "obj9.name = \"unnamed__10\";\n",
       "obj9.userData.explodable = 1;\n",
       "obj9.userData.points = [];\n",
       "obj9.userData.points.push(new PMPoint(-3.2, -3.075, -2.95));\n",
       "obj9.userData.points.push(new PMPoint(-3.2, -3.2, -3.075));\n",
       "\n",
       "obj9.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj9.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj9.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj9.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj9);\n",
       "scene.add(obj9);\n",
       "\n",
       "var obj10 = new THREE.Object3D();\n",
       "obj10.name = \"unnamed__11\";\n",
       "obj10.userData.explodable = 1;\n",
       "obj10.userData.points = [];\n",
       "obj10.userData.points.push(new PMPoint(-3.2, 4.5, -2.95));\n",
       "obj10.userData.points.push(new PMPoint(-0.75, 4.5, -0.5));\n",
       "\n",
       "obj10.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj10.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj10.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj10.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj10);\n",
       "scene.add(obj10);\n",
       "\n",
       "var obj11 = new THREE.Object3D();\n",
       "obj11.name = \"unnamed__12\";\n",
       "obj11.userData.explodable = 1;\n",
       "obj11.userData.points = [];\n",
       "obj11.userData.points.push(new PMPoint(1.75, 4.5, 2.25));\n",
       "obj11.userData.points.push(new PMPoint(1.75, 4.5, 4.5));\n",
       "\n",
       "obj11.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj11.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj11.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj11.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj11);\n",
       "scene.add(obj11);\n",
       "\n",
       "var obj12 = new THREE.Object3D();\n",
       "obj12.name = \"unnamed__13\";\n",
       "obj12.userData.explodable = 1;\n",
       "obj12.userData.points = [];\n",
       "obj12.userData.points.push(new PMPoint(-0.5, 4.5, 0));\n",
       "obj12.userData.points.push(new PMPoint(-0.5, 4.5, 4.5));\n",
       "\n",
       "obj12.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj12.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj12.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj12.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj12);\n",
       "scene.add(obj12);\n",
       "\n",
       "var obj13 = new THREE.Object3D();\n",
       "obj13.name = \"unnamed__14\";\n",
       "obj13.userData.explodable = 1;\n",
       "obj13.userData.points = [];\n",
       "obj13.userData.points.push(new PMPoint(4.5, 4.5, 2.25));\n",
       "obj13.userData.points.push(new PMPoint(1.75, 4.5, 2.25));\n",
       "\n",
       "obj13.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj13.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj13.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj13.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj13);\n",
       "scene.add(obj13);\n",
       "\n",
       "var obj14 = new THREE.Object3D();\n",
       "obj14.name = \"unnamed__15\";\n",
       "obj14.userData.explodable = 1;\n",
       "obj14.userData.points = [];\n",
       "obj14.userData.points.push(new PMPoint(-0.75, 4.5, -0.5));\n",
       "obj14.userData.points.push(new PMPoint(-0.5, 4.5, 0));\n",
       "\n",
       "obj14.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj14.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj14.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj14.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj14);\n",
       "scene.add(obj14);\n",
       "\n",
       "var obj15 = new THREE.Object3D();\n",
       "obj15.name = \"unnamed__16\";\n",
       "obj15.userData.explodable = 1;\n",
       "obj15.userData.points = [];\n",
       "obj15.userData.points.push(new PMPoint(4.5, 4.5, -0.5));\n",
       "obj15.userData.points.push(new PMPoint(-0.75, 4.5, -0.5));\n",
       "\n",
       "obj15.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj15.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj15.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj15.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj15);\n",
       "scene.add(obj15);\n",
       "\n",
       "var obj16 = new THREE.Object3D();\n",
       "obj16.name = \"unnamed__17\";\n",
       "obj16.userData.explodable = 1;\n",
       "obj16.userData.points = [];\n",
       "obj16.userData.points.push(new PMPoint(1.75, 4.5, 2.25));\n",
       "obj16.userData.points.push(new PMPoint(-0.5, 4.5, 0));\n",
       "\n",
       "obj16.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj16.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj16.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj16.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj16);\n",
       "scene.add(obj16);\n",
       "\n",
       "var obj17 = new THREE.Object3D();\n",
       "obj17.name = \"unnamed__18\";\n",
       "obj17.userData.explodable = 1;\n",
       "obj17.userData.points = [];\n",
       "obj17.userData.points.push(new PMPoint(4.5, -3.2, -3.075));\n",
       "obj17.userData.points.push(new PMPoint(-3.2, -3.2, -3.075));\n",
       "\n",
       "obj17.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj17.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj17.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj17.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj17);\n",
       "scene.add(obj17);\n",
       "\n",
       "var obj18 = new THREE.Object3D();\n",
       "obj18.name = \"unnamed__19\";\n",
       "obj18.userData.explodable = 1;\n",
       "obj18.userData.points = [];\n",
       "obj18.userData.points.push(new PMPoint(-3.2, -3.075, 4.5));\n",
       "obj18.userData.points.push(new PMPoint(-0.625, -0.5, 4.5));\n",
       "\n",
       "obj18.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj18.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj18.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj18.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj18);\n",
       "scene.add(obj18);\n",
       "\n",
       "var obj19 = new THREE.Object3D();\n",
       "obj19.name = \"unnamed__20\";\n",
       "obj19.userData.explodable = 1;\n",
       "obj19.userData.points = [];\n",
       "obj19.userData.points.push(new PMPoint(1.75, 4.5, 4.5));\n",
       "obj19.userData.points.push(new PMPoint(1.75, 2, 4.5));\n",
       "\n",
       "obj19.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj19.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj19.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj19.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj19);\n",
       "scene.add(obj19);\n",
       "\n",
       "var obj20 = new THREE.Object3D();\n",
       "obj20.name = \"unnamed__21\";\n",
       "obj20.userData.explodable = 1;\n",
       "obj20.userData.points = [];\n",
       "obj20.userData.points.push(new PMPoint(-0.5, 4.5, 4.5));\n",
       "obj20.userData.points.push(new PMPoint(-0.5, -0.25, 4.5));\n",
       "\n",
       "obj20.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj20.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj20.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj20.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj20);\n",
       "scene.add(obj20);\n",
       "\n",
       "var obj21 = new THREE.Object3D();\n",
       "obj21.name = \"unnamed__22\";\n",
       "obj21.userData.explodable = 1;\n",
       "obj21.userData.points = [];\n",
       "obj21.userData.points.push(new PMPoint(4.5, 2, 4.5));\n",
       "obj21.userData.points.push(new PMPoint(1.75, 2, 4.5));\n",
       "\n",
       "obj21.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj21.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj21.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj21.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj21);\n",
       "scene.add(obj21);\n",
       "\n",
       "var obj22 = new THREE.Object3D();\n",
       "obj22.name = \"unnamed__23\";\n",
       "obj22.userData.explodable = 1;\n",
       "obj22.userData.points = [];\n",
       "obj22.userData.points.push(new PMPoint(-0.625, -0.5, 4.5));\n",
       "obj22.userData.points.push(new PMPoint(-0.5, -0.25, 4.5));\n",
       "\n",
       "obj22.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj22.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj22.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj22.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj22);\n",
       "scene.add(obj22);\n",
       "\n",
       "var obj23 = new THREE.Object3D();\n",
       "obj23.name = \"unnamed__24\";\n",
       "obj23.userData.explodable = 1;\n",
       "obj23.userData.points = [];\n",
       "obj23.userData.points.push(new PMPoint(4.5, -0.5, 4.5));\n",
       "obj23.userData.points.push(new PMPoint(-0.625, -0.5, 4.5));\n",
       "\n",
       "obj23.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj23.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj23.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj23.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj23);\n",
       "scene.add(obj23);\n",
       "\n",
       "var obj24 = new THREE.Object3D();\n",
       "obj24.name = \"unnamed__25\";\n",
       "obj24.userData.explodable = 1;\n",
       "obj24.userData.points = [];\n",
       "obj24.userData.points.push(new PMPoint(1.75, 2, 4.5));\n",
       "obj24.userData.points.push(new PMPoint(-0.5, -0.25, 4.5));\n",
       "\n",
       "obj24.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj24.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj24.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj24.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj24);\n",
       "scene.add(obj24);\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "function textSpriteMaterial(message, parameters) {\n",
       "    if ( parameters === undefined ) parameters = {};\n",
       "    var fontface = \"Helvetica\";\n",
       "    var fontsize = parameters.hasOwnProperty(\"fontsize\") ? parameters[\"fontsize\"] : 15;\n",
       "    fontsize = fontsize*10;\n",
       "    var lines = message.split('\\\\n');\n",
       "    var size = 512;\n",
       "    for(var i = 0; i<lines.length; i++){\n",
       "        var tmp = lines[i].length;\n",
       "        while(tmp*fontsize > size){\n",
       "           fontsize--;\n",
       "        }\n",
       "    }\n",
       "    \n",
       "    var canvas = document.createElement('canvas');\n",
       "    canvas.width = size;\n",
       "    canvas.height = size;\n",
       "    var context = canvas.getContext('2d');\n",
       "    context.fillStyle = \"rgba(255, 255, 255, 0)\";\n",
       "    context.fill();\n",
       "    context.font = fontsize + \"px \" + fontface;\n",
       "    \n",
       "    // text color\n",
       "    context.fillStyle = \"rgba(0, 0, 0, 1.0)\";\n",
       "     for(var i = 0; i<lines.length; i++){\n",
       "        context.fillText(lines[i], size/2, size/2+i*fontsize);\n",
       "     }\n",
       "    \n",
       "    // canvas contents will be used for a texture\n",
       "    var texture = new THREE.Texture(canvas);\n",
       "    texture.needsUpdate = true;\n",
       "    \n",
       "    var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 });\n",
       "    return spriteMaterial;\n",
       "}\n",
       "\n",
       "\n",
       "// ---------------------- INITIALIZING OBJECTS--------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function init_object(obj) {\n",
       "    if (obj.userData.hasOwnProperty(\"pointmaterial\")) {\n",
       "        init_points(obj);\n",
       "        modelContains.points = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"pointlabels\")) {\n",
       "        init_pointlabels(obj);\n",
       "        modelContains.pointlabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgematerial\")) {\n",
       "        init_lines(obj);\n",
       "        modelContains.lines = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgelabels\")) {\n",
       "        init_edgelabels(obj);\n",
       "        modelContains.edgelabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"arrowstyle\")) {\n",
       "        init_arrowheads(obj);\n",
       "        modelContains.arrowheads = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"facetmaterial\")) {\n",
       "        init_faces(obj);\n",
       "        modelContains.faces = true;\n",
       "    }\n",
       "}\n",
       "\n",
       "function init_points(obj) {\n",
       "    var pointgroup = new THREE.Group();\n",
       "    pointgroup.name = \"points\";\n",
       "    var points = obj.userData.points;\n",
       "    var radii = obj.userData.pointradii;\n",
       "    var materials = obj.userData.pointmaterial;\n",
       "    var geometry,material;\n",
       "    if (!Array.isArray(radii)) {\n",
       "        geometry = new THREE.SphereBufferGeometry(radii);  \n",
       "    }\n",
       "    if (!Array.isArray(materials)) {\n",
       "        material = materials;\n",
       "    }\n",
       "    for (var i=0; i<points.length; i++) {\n",
       "        var point = points[i];\n",
       "        if (Array.isArray(radii)) {\n",
       "            if (radii[i] == 0) {\n",
       "                continue;\n",
       "            }\n",
       "            geometry = new THREE.SphereBufferGeometry(radii[i]);  \n",
       "        } \n",
       "        if (Array.isArray(materials)) {\n",
       "            material = materials[i];     \n",
       "        } \n",
       "        var sphere = new THREE.Mesh(geometry, material);\n",
       "        point.addSphere(sphere);\n",
       "        pointgroup.add(sphere);\n",
       "    }\n",
       "    obj.add(pointgroup);\n",
       "}\n",
       "\n",
       "function init_pointlabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var labels = obj.userData.pointlabels;\n",
       "    var pointlabels = new THREE.Group();\n",
       "    pointlabels.name = \"pointlabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(pointlabels);\n",
       "}\n",
       "\n",
       "function init_lines(obj) {\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var points = obj.userData.points;\n",
       "    var materials = obj.userData.edgematerial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 );\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position', bufattr);\n",
       "    if (Array.isArray(materials)) {     \n",
       "        for (var i=0; i<materials.length; i++) {\n",
       "            geometry.addGroup(2*i,2,i);\n",
       "        }\n",
       "    }\n",
       "    var lines = new THREE.LineSegments(geometry, materials);\n",
       "    lines.name = \"lines\";\n",
       "    obj.add(lines);\n",
       "    updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "function init_edgelabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var labels = obj.userData.edgelabels;\n",
       "    var edgelabels = new THREE.Group();\n",
       "    edgelabels.name = \"edgelabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            edgelabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(edgelabels);\n",
       "}\n",
       "\n",
       "function init_arrowheads(obj) {\n",
       "    var arrowheads = new THREE.Group();\n",
       "    arrowheads.name = \"arrowheads\";\n",
       "    var arrowstyle = obj.userData.arrowstyle;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var edgematerials = obj.userData.edgematerial;\n",
       "    var points = obj.userData.points;\n",
       "    var material;\n",
       "    if (!Array.isArray(edgematerials)) {\n",
       "        material = new THREE.MeshBasicMaterial( {color: edgematerials.color} );\n",
       "    }\n",
       "\n",
       "    for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "        var start = points[edgeindices[i]];\n",
       "        var end = points[edgeindices[i+1]];\n",
       "        var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius();\n",
       "        if (dist <= 0) {\n",
       "            continue;\n",
       "        }\n",
       "        var dir = new THREE.Vector3().subVectors(end.vector,start.vector);\n",
       "        dir.normalize();\n",
       "        var axis = new THREE.Vector3().set(dir.z,0,-dir.x);\n",
       "        axis.normalize();\n",
       "        var radians = Math.acos( dir.y );\n",
       "        var radius = dist/25;\n",
       "        var height = dist/5;\n",
       "        var geometry = new THREE.ConeBufferGeometry(radius,height);\n",
       "        var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2));\n",
       "        if (Array.isArray(edgematerials)) {\n",
       "            material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} );\n",
       "        }\n",
       "        var cone = new THREE.Mesh( geometry, material );\n",
       "        cone.quaternion.setFromAxisAngle(axis,radians);;\n",
       "        cone.position.copy(position);;\n",
       "        arrowheads.add(cone);\n",
       "    }\n",
       "    obj.add(arrowheads);\n",
       "}\n",
       "\n",
       "function init_faces(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var facets = obj.userData.facets;\n",
       "    obj.userData.triangleindices = [];\n",
       "    for (var i=0; i<facets.length; i++) {\n",
       "        facet = facets[i];\n",
       "        for (var t=0; t<facet.length-2; t++) {\n",
       "            obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]);  \n",
       "        }\n",
       "    }\n",
       "    var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute(bufarr,3);\n",
       "    \n",
       "    var materials = obj.userData.facetmaterial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position',bufattr);\n",
       "    if (Array.isArray(materials)) {\n",
       "        var tricount = 0;\n",
       "        var facet;\n",
       "        for (var i=0; i<facets.length; i++) {\n",
       "            facet = facets[i];\n",
       "            geometry.addGroup(tricount,(facet.length-2)*3,i);\n",
       "            tricount += (facet.length-2)*3;\n",
       "        }\n",
       "    }\n",
       "    var mesh = new THREE.Mesh(geometry, materials);\n",
       "    mesh.name = \"faces\";\n",
       "    obj.add(mesh); \n",
       "    updateFacesPosition(obj);\n",
       "}\n",
       "// //INITIALIZING\n",
       "\n",
       "\n",
       "function updateFacesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.triangleindices;\n",
       "    var faces = obj.getObjectByName(\"faces\");\n",
       "    var ba = faces.geometry.getAttribute(\"position\");\n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    faces.geometry.attributes.position.needsUpdate = true;\n",
       "    \n",
       "}\n",
       "\n",
       "function updateEdgesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.edgeindices;\n",
       "    var lines = obj.getObjectByName(\"lines\");\n",
       "    var ba = lines.geometry.getAttribute(\"position\"); \n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    lines.geometry.attributes.position.needsUpdate = true;\n",
       "}\n",
       "\n",
       "function onWindowResize() {\n",
       "    renderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    svgRenderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "function updateCamera() {\n",
       "    var width = three.clientWidth;\n",
       "    var height = three.clientHeight;\n",
       "    var aspect = width / height;\n",
       "    if (camera.type == \"OrthographicCamera\") {\n",
       "        camera.left = frustumSize * aspect / - 2;\n",
       "        camera.right = frustumSize * aspect / 2;\n",
       "        camera.top = frustumSize / 2;\n",
       "        camera.bottom = - frustumSize / 2;\n",
       "    } else if (camera.type == \"PerspectiveCamera\") {\n",
       "        camera.aspect = aspect;\n",
       "    }\n",
       "    camera.updateProjectionMatrix();\n",
       "}\n",
       "\n",
       "function changeCamera(event) {\n",
       "    var selindex = event.currentTarget.selectedIndex;\n",
       "    camera = cameras[selindex];\n",
       "    control = controls[selindex];\n",
       "    control.enabled = true; \n",
       "    for (var i=0; i<controls.length; i++) {\n",
       "        if (i!=selindex) {\n",
       "            controls[i].enabled = false;\n",
       "        }\n",
       "    }\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "var camtypenode = document.getElementById('cameraType_4');\n",
       "camtypenode.onchange = changeCamera;\n",
       "camtypenode.dispatchEvent(new Event('change'));\n",
       "\n",
       "onWindowResize();\n",
       "window.addEventListener('resize', onWindowResize);\t\n",
       "\n",
       "\n",
       "var xRotationEnabled = false;\n",
       "var yRotationEnabled = false;\n",
       "var zRotationEnabled = false;\n",
       "var rotationSpeedFactor = 1;\n",
       "var settingsShown = false;\n",
       "var labelsShown = true;\n",
       "var intervals = [];\n",
       "var timeouts = [];\n",
       "var explodingSpeed = 0.05;\n",
       "var explodeScale = 0;\n",
       "var XMLS = new XMLSerializer();\n",
       "var svgElement;\n",
       "var renderId;\n",
       "\n",
       "var render = function () {\n",
       "\n",
       "\trenderId = requestAnimationFrame(render);\n",
       "\n",
       "//\tcomment in for automatic explosion\n",
       "//\texplode(updateFactor());\n",
       "\n",
       "    var phi = 0.02 * rotationSpeedFactor;\n",
       "\n",
       "    if (xRotationEnabled) {\n",
       "        scene.rotation.x += phi;\n",
       "    }\n",
       "    if (yRotationEnabled) {\n",
       "        scene.rotation.y += phi;\n",
       "    }\n",
       "    if (zRotationEnabled) {\n",
       "        scene.rotation.z += phi;\n",
       "    }\n",
       "\n",
       "    control.update();\n",
       "    renderer.render(scene, camera);\n",
       "};\n",
       "\n",
       "if ( THREE.WEBGL.isWebGLAvailable() ) {\n",
       "\trender();\n",
       "} else {\n",
       "\tvar warning = WEBGL.getWebGLErrorMessage();\n",
       "\tthree.appendChild( warning );\n",
       "}\n",
       "    \n",
       "function changeTransparency() {\n",
       "    var opacity = 1-Number(event.currentTarget.value);\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        child = scene.children[i];\n",
       "        if ( child.userData.hasOwnProperty(\"facetmaterial\") ) {\n",
       "            if (Array.isArray(child.userData.facetmaterial)) {\n",
       "                for (var j=0; j<child.userData.facetmaterial.length; j++) {\n",
       "                    child.userData.facetmaterial[j].opacity = opacity;\n",
       "                }\n",
       "            } else {\n",
       "                child.userData.facetmaterial.opacity = opacity;\n",
       "            }    \n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function changeRotationX(event){\n",
       "    xRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationY(event){\n",
       "    yRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationZ(event){\n",
       "    zRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "\n",
       "function changeRotationSpeedFactor(event){\n",
       "    rotationSpeedFactor = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function resetScene(){\n",
       "    scene.rotation.set(0,0,0);\n",
       "    camera.position.set(0,0,5);\n",
       "    camera.up.set(0,1,0);\n",
       "}\n",
       "\n",
       "function showSettings(event){\n",
       "    document.getElementById('settings_4').style.visibility = 'visible';\n",
       "    document.getElementById('showSettingsButton_4').style.visibility = 'hidden';\n",
       "    document.getElementById('hideSettingsButton_4').style.visibility = 'visible';\n",
       "    settingsShown = true;\n",
       "}\n",
       "\n",
       "function hideSettings(event){\n",
       "    document.getElementById('settings_4').style.visibility = 'hidden';\n",
       "    document.getElementById('showSettingsButton_4').style.visibility = 'visible';\n",
       "    document.getElementById('hideSettingsButton_4').style.visibility = 'hidden';\n",
       "    settingsShown = false;\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "var pos = 150* Math.PI;\n",
       "\n",
       "function updateFactor() {\n",
       "    pos++;\n",
       "    return Math.sin(.01*pos)+1;\n",
       "}\n",
       "\n",
       "// ------------------------ FOLDING ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "// rotate point p around axis defined by points p1 and p2 by given angle\n",
       "function rotate(p, p1, p2, angle ){   \n",
       "    angle = -angle;\n",
       "    var x = p.x, y = p.y, z = p.z, \n",
       "    a = p1.x, b = p1.y, c = p1.z, \n",
       "    u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z;\n",
       "    var result = [];\n",
       "    var L = u*u + v*v + w*w;\n",
       "    var sqrt = Math.sqrt;\n",
       "    var cos = Math.cos;\n",
       "    var sin = Math.sin;\n",
       "\n",
       "    result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L;\n",
       "    result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L;\n",
       "    result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L;\n",
       "\n",
       "    return result;\n",
       "}\n",
       "\n",
       "var fold = function(event){\n",
       "    var obj = foldables[Number(event.currentTarget.name)];\n",
       "    var foldvalue = Number(event.currentTarget.value);\n",
       "    var scale = foldvalue - obj.userData.oldscale;\n",
       "\n",
       "    for (var j=0; j<obj.userData.axes.length; j++) {\n",
       "        rotateVertices(obj, j, scale);\n",
       "    }\n",
       "    update(obj);\n",
       "    obj.userData.oldscale += scale;\n",
       "    lookAtBarycenter(obj);\n",
       "}\n",
       "\n",
       "function lookAtBarycenter(obj){\n",
       "    control.target = barycenter(obj);\n",
       "}\n",
       "\n",
       "function barycenter(obj) {\n",
       "    var center = new THREE.Vector3(0,0,0);\n",
       "    var points = obj.userData.points;\n",
       "    for (var i=0; i<points.length; i++){\n",
       "        center.add(points[i].vector);\n",
       "    }\n",
       "    center.divideScalar(points.length);\n",
       "    return center;\n",
       "}\n",
       "\n",
       "function rotateVertices(obj, edge, scale) {\n",
       "    var axes = obj.userData.axes;\n",
       "    var subtrees = obj.userData.subtrees;\n",
       "    var points = obj.userData.points;\n",
       "    var angles = obj.userData.angles;\n",
       "    if (edge < axes.length){\n",
       "        for (var j=0; j<subtrees[edge].length; j++){\n",
       "            var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge]));\n",
       "            points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]);\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function update(obj) {\n",
       "   updateFacesPosition(obj);\n",
       "   updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "if (foldables.length) {\n",
       "    var settings = document.getElementById('settings_4');\n",
       "    var foldDiv = document.createElement('div');\n",
       "    foldDiv.id = 'fold_4';\n",
       "    var title = document.createElement('strong');\n",
       "    title.innerHTML = 'Fold';\n",
       "    foldDiv.appendChild(title);\n",
       "    foldDiv.className = 'group';\n",
       "    for (var i=0; i<foldables.length; i++) {\n",
       "        var range = document.createElement('input');\n",
       "        range.type = 'range';\n",
       "        range.min = 0;\n",
       "        range.max = 1;\n",
       "        range.value = 0;\n",
       "        range.step = 0.001;\n",
       "        range.name = String(i);\n",
       "        range.oninput = fold;\n",
       "        foldDiv.appendChild(range);\n",
       "    }\n",
       "    lookAtBarycenter(foldables[0]);\n",
       "    settings.insertBefore(foldDiv,settings.childNodes[0]);\n",
       "}\n",
       "\n",
       "    \n",
       "// ---------------------- EXPLOSION ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "if (explodableModel) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        obj = scene.children[i];\n",
       "        if ( obj.userData.explodable ) {\n",
       "            computeCentroid(obj);\n",
       "        }\n",
       "    }\n",
       "    document.getElementById('explodeRange_4').oninput = triggerExplode;\n",
       "    document.getElementById('explodeCheckbox_4').onchange = triggerAutomaticExplode;\n",
       "    document.getElementById('explodingSpeedRange_4').oninput = setExplodingSpeed;\n",
       "}\n",
       "\n",
       "function computeCentroid(obj) {\n",
       "    centroid = new THREE.Vector3();\n",
       "    obj.userData.points.forEach(function(pmpoint) {\n",
       "        centroid.add(pmpoint.vector);\t\t\t\n",
       "    });\n",
       "    centroid.divideScalar(obj.userData.points.length);\n",
       "    obj.userData.centroid = centroid;\n",
       "}\n",
       "\n",
       "function explode(factor) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        var obj = scene.children[i];\n",
       "        if (obj.userData.hasOwnProperty(\"centroid\")) { \n",
       "            var c = obj.userData.centroid;\n",
       "            obj.position.set(c.x*factor, c.y*factor, c.z*factor);\n",
       "        }\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function triggerExplode(event){\n",
       "    explodeScale = Number(event.currentTarget.value);\n",
       "    explode(explodeScale);\n",
       "}\n",
       "\n",
       "function setExplodingSpeed(event){\n",
       "    explodingSpeed = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function triggerAutomaticExplode(event){\n",
       "    if (event.currentTarget.checked){\n",
       "        startExploding();\n",
       "    } else {\n",
       "        clearIntervals();\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function startExploding(){\n",
       "    intervals.push(setInterval(explodingInterval, 25));\n",
       "}\n",
       "\n",
       "\n",
       "function explodingInterval(){\n",
       "    explodeScale += explodingSpeed;\n",
       "    if (explodeScale <= 6){ \n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else{\n",
       "        explode(6);\n",
       "        explodeScale = 6;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startUnexploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_4').value = explodeScale;\n",
       "}\n",
       "\n",
       "\n",
       "function startUnexploding(){\n",
       "    intervals.push(setInterval(unexplodingInterval, 25));\n",
       "}\n",
       "\n",
       "function unexplodingInterval(){\n",
       "    explodeScale -= explodingSpeed;\n",
       "    if (explodeScale >= 0){\t\n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else {\n",
       "        explode(0);\n",
       "        explodeScale = 0;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startExploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_4').value = explodeScale;\n",
       "}\n",
       "\n",
       "function clearIntervals(){\n",
       "    intervals.forEach(function(interval){\n",
       "        clearInterval(interval);\n",
       "    });\n",
       "    intervals = [];\n",
       "    timeouts.forEach(function(timeout){\n",
       "        clearTimeout(timeout);\n",
       "    });\n",
       "    timeouts = [];\n",
       "}\n",
       "\n",
       "// ---------------------- DISPLAY --------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "const objectTypeInnerHTMLs = { points: \"Points\", pointlabels: \"Point labels\", lines: \"Edges\", edgelabels: \"Edge labels\", faces: \"Faces\", arrowheads: \"Arrow heads\" };\n",
       "const objectTypeVisible = {};\n",
       "Object.assign(objectTypeVisible,modelContains);\n",
       "const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort();\n",
       "const shownObjectTypesList = document.getElementById('shownObjectTypesList_4');\n",
       "\n",
       "function setVisibility(bool,objname) {\n",
       "    for (var i=0; i<scene.children.length; i++){\n",
       "        var obj = scene.children[i].getObjectByName(objname);\n",
       "        if (obj) {\n",
       "            obj.visible = bool;\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function toggleObjectTypeVisibility(event){\n",
       "    var name = event.currentTarget.name;\n",
       "    var checked = event.currentTarget.checked;\n",
       "    objectTypeVisible[name] = checked;\n",
       "    setVisibility(checked,name);\n",
       "}\n",
       "\n",
       "for (var i=0; i<sortedObjectTypeKeys.length; i++){\n",
       "    var key = sortedObjectTypeKeys[i];\n",
       "    if (modelContains[key]) {\n",
       "        var objTypeNode = document.createElement('span');\n",
       "        objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>';\n",
       "        var checkbox = document.createElement('input');\n",
       "        checkbox.type = 'checkbox';\n",
       "        checkbox.checked = true;\n",
       "        checkbox.name = key;\n",
       "        checkbox.onchange = toggleObjectTypeVisibility;\n",
       "        shownObjectTypesList.appendChild(checkbox);\n",
       "        shownObjectTypesList.appendChild(objTypeNode);\n",
       "    }\n",
       "}\n",
       "\n",
       "// ------------------------------------------------------\n",
       "\n",
       "function toggleObjectVisibility(event){\n",
       "    var nr = Number(event.currentTarget.name);\n",
       "    scene.children[nr].visible = event.currentTarget.checked;\n",
       "}\n",
       "\n",
       "// append checkboxes for displaying or hiding objects\n",
       "var shownObjectsList = document.getElementById('shownObjectsList_4');\n",
       "for (var i=0; i<scene.children.length; i++){\n",
       "    obj = scene.children[i];\n",
       "    var objNode = document.createElement('span');\n",
       "    objNode.innerHTML = obj.name + '<br>';\n",
       "    var checkbox = document.createElement('input');\n",
       "    checkbox.type = 'checkbox';\n",
       "    checkbox.checked = true;\n",
       "    checkbox.name = String(i);\n",
       "    checkbox.onchange = toggleObjectVisibility;\n",
       "    shownObjectsList.appendChild(checkbox);\n",
       "    shownObjectsList.appendChild(objNode);\n",
       "}\n",
       "\n",
       "// ---------------------- SVG ------------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function takeSvgScreenshot() {\n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(false,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(false,\"edgelabels\");\n",
       "    }\n",
       "    svgRenderer.render(scene,camera);\n",
       "    svgElement = XMLS.serializeToString(svgRenderer.domElement);\n",
       "    \n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(true,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(true,\"edgelabels\");\n",
       "    }\n",
       "\n",
       "    if (document.getElementById('tab_4').checked){\n",
       "        //show in new tab\n",
       "        var myWindow = window.open(\"\",\"\");\n",
       "        myWindow.document.body.innerHTML = svgElement;\n",
       "    } else{\n",
       "        // download svg file \n",
       "        download(\"screenshot.svg\", svgElement);\n",
       "    }\n",
       "}\n",
       "\n",
       "function download(filename, text) {\n",
       "    var element = document.createElement('a');\n",
       "    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));\n",
       "    element.setAttribute('download', filename);\n",
       "\n",
       "    element.style.display = 'none';\n",
       "    document.body.appendChild(element);\n",
       "\n",
       "    element.click();\n",
       "\n",
       "    document.body.removeChild(element);\n",
       "}\n",
       "\n",
       "\n",
       "document.getElementById('transparencyRange_4').oninput = changeTransparency;\n",
       "document.getElementById('changeRotationX_4').onchange = changeRotationX;\n",
       "document.getElementById('changeRotationY_4').onchange = changeRotationY;\n",
       "document.getElementById('changeRotationZ_4').onchange = changeRotationZ;\n",
       "document.getElementById('resetButton_4').onclick = resetScene;\n",
       "document.getElementById('rotationSpeedRange_4').oninput = changeRotationSpeedFactor;\n",
       "document.getElementById('takeScreenshot_4').onclick = takeSvgScreenshot;\n",
       "document.getElementById('showSettingsButton_4').onclick = showSettings;\n",
       "document.getElementById('hideSettingsButton_4').onclick = hideSettings;\n",
       "\n",
       "\n",
       "// ------------------ SHORTCUTS --------------------------------------------\n",
       "// -------------------------------------------------------------------------\n",
       "\n",
       "/**\n",
       " * http://www.openjs.com/scripts/events/keyboard_shortcuts/\n",
       " * Version : 2.01.B\n",
       " * By Binny V A\n",
       " * License : BSD\n",
       " */\n",
       "shortcut = {\n",
       "\t'all_shortcuts':{},//All the shortcuts are stored in this array\n",
       "\t'add': function(shortcut_combination,callback,opt) {\n",
       "\t\t//Provide a set of default options\n",
       "\t\tvar default_options = {\n",
       "\t\t\t'type':'keydown',\n",
       "\t\t\t'propagate':false,\n",
       "\t\t\t'disable_in_input':false,\n",
       "\t\t\t'target':document,\n",
       "\t\t\t'keycode':false\n",
       "\t\t}\n",
       "\t\tif(!opt) opt = default_options;\n",
       "\t\telse {\n",
       "\t\t\tfor(var dfo in default_options) {\n",
       "\t\t\t\tif(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\n",
       "\t\tvar ele = opt.target;\n",
       "\t\tif(typeof opt.target == 'string') ele = document.getElementById(opt.target);\n",
       "\t\tvar ths = this;\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\n",
       "\t\t//The function to be called at keypress\n",
       "\t\tvar func = function(e) {\n",
       "\t\t\te = e || window.event;\n",
       "\t\t\t\n",
       "\t\t\tif(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields\n",
       "\t\t\t\tvar element;\n",
       "\t\t\t\tif(e.target) element=e.target;\n",
       "\t\t\t\telse if(e.srcElement) element=e.srcElement;\n",
       "\t\t\t\tif(element.nodeType==3) element=element.parentNode;\n",
       "\n",
       "\t\t\t\tif(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\t//Find Which key is pressed\n",
       "\t\t\tif (e.keyCode) code = e.keyCode;\n",
       "\t\t\telse if (e.which) code = e.which;\n",
       "\t\t\tvar character = String.fromCharCode(code).toLowerCase();\n",
       "\t\t\t\n",
       "\t\t\tif(code == 188) character=\",\"; //If the user presses , when the type is onkeydown\n",
       "\t\t\tif(code == 190) character=\".\"; //If the user presses , when the type is onkeydown\n",
       "\n",
       "\t\t\tvar keys = shortcut_combination.split(\"+\");\n",
       "\t\t\t//Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked\n",
       "\t\t\tvar kp = 0;\n",
       "\t\t\t\n",
       "\t\t\t//Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken\n",
       "\t\t\tvar shift_nums = {\n",
       "\t\t\t\t\"`\":\"~\",\n",
       "\t\t\t\t\"1\":\"!\",\n",
       "\t\t\t\t\"2\":\"@\",\n",
       "\t\t\t\t\"3\":\"#\",\n",
       "\t\t\t\t\"4\":\"$\",\n",
       "\t\t\t\t\"5\":\"%\",\n",
       "\t\t\t\t\"6\":\"^\",\n",
       "\t\t\t\t\"7\":\"&\",\n",
       "\t\t\t\t\"8\":\"*\",\n",
       "\t\t\t\t\"9\":\"(\",\n",
       "\t\t\t\t\"0\":\")\",\n",
       "\t\t\t\t\"-\":\"_\",\n",
       "\t\t\t\t\"=\":\"+\",\n",
       "\t\t\t\t\";\":\":\",\n",
       "\t\t\t\t\"'\":\"\\\"\",\n",
       "\t\t\t\t\",\":\"<\",\n",
       "\t\t\t\t\".\":\">\",\n",
       "\t\t\t\t\"/\":\"?\",\n",
       "\t\t\t\t\"\\\\\":\"|\"\n",
       "\t\t\t}\n",
       "\t\t\t//Special Keys - and their codes\n",
       "\t\t\tvar special_keys = {\n",
       "\t\t\t\t'esc':27,\n",
       "\t\t\t\t'escape':27,\n",
       "\t\t\t\t'tab':9,\n",
       "\t\t\t\t'space':32,\n",
       "\t\t\t\t'return':13,\n",
       "\t\t\t\t'enter':13,\n",
       "\t\t\t\t'backspace':8,\n",
       "\t\n",
       "\t\t\t\t'scrolllock':145,\n",
       "\t\t\t\t'scroll_lock':145,\n",
       "\t\t\t\t'scroll':145,\n",
       "\t\t\t\t'capslock':20,\n",
       "\t\t\t\t'caps_lock':20,\n",
       "\t\t\t\t'caps':20,\n",
       "\t\t\t\t'numlock':144,\n",
       "\t\t\t\t'num_lock':144,\n",
       "\t\t\t\t'num':144,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pause':19,\n",
       "\t\t\t\t'break':19,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'insert':45,\n",
       "\t\t\t\t'home':36,\n",
       "\t\t\t\t'delete':46,\n",
       "\t\t\t\t'end':35,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pageup':33,\n",
       "\t\t\t\t'page_up':33,\n",
       "\t\t\t\t'pu':33,\n",
       "\t\n",
       "\t\t\t\t'pagedown':34,\n",
       "\t\t\t\t'page_down':34,\n",
       "\t\t\t\t'pd':34,\n",
       "\t\n",
       "\t\t\t\t'left':37,\n",
       "\t\t\t\t'up':38,\n",
       "\t\t\t\t'right':39,\n",
       "\t\t\t\t'down':40,\n",
       "\t\n",
       "\t\t\t\t'f1':112,\n",
       "\t\t\t\t'f2':113,\n",
       "\t\t\t\t'f3':114,\n",
       "\t\t\t\t'f4':115,\n",
       "\t\t\t\t'f5':116,\n",
       "\t\t\t\t'f6':117,\n",
       "\t\t\t\t'f7':118,\n",
       "\t\t\t\t'f8':119,\n",
       "\t\t\t\t'f9':120,\n",
       "\t\t\t\t'f10':121,\n",
       "\t\t\t\t'f11':122,\n",
       "\t\t\t\t'f12':123\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\tvar modifiers = { \n",
       "\t\t\t\tshift: { wanted:false, pressed:false},\n",
       "\t\t\t\tctrl : { wanted:false, pressed:false},\n",
       "\t\t\t\talt  : { wanted:false, pressed:false},\n",
       "\t\t\t\tmeta : { wanted:false, pressed:false}\t//Meta is Mac specific\n",
       "\t\t\t};\n",
       "                        \n",
       "\t\t\tif(e.ctrlKey)\tmodifiers.ctrl.pressed = true;\n",
       "\t\t\tif(e.shiftKey)\tmodifiers.shift.pressed = true;\n",
       "\t\t\tif(e.altKey)\tmodifiers.alt.pressed = true;\n",
       "\t\t\tif(e.metaKey)   modifiers.meta.pressed = true;\n",
       "                        \n",
       "\t\t\tfor(var i=0; k=keys[i],i<keys.length; i++) {\n",
       "\t\t\t\t//Modifiers\n",
       "\t\t\t\tif(k == 'ctrl' || k == 'control') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.ctrl.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'shift') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.shift.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'alt') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.alt.wanted = true;\n",
       "\t\t\t\t} else if(k == 'meta') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.meta.wanted = true;\n",
       "\t\t\t\t} else if(k.length > 1) { //If it is a special key\n",
       "\t\t\t\t\tif(special_keys[k] == code) kp++;\n",
       "\t\t\t\t\t\n",
       "\t\t\t\t} else if(opt['keycode']) {\n",
       "\t\t\t\t\tif(opt['keycode'] == code) kp++;\n",
       "\n",
       "\t\t\t\t} else { //The special keys did not match\n",
       "\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\telse {\n",
       "\t\t\t\t\t\tif(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase\n",
       "\t\t\t\t\t\t\tcharacter = shift_nums[character]; \n",
       "\t\t\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\t\t}\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t\t\n",
       "\t\t\tif(kp == keys.length && \n",
       "\t\t\t\t\t\tmodifiers.ctrl.pressed == modifiers.ctrl.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.shift.pressed == modifiers.shift.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.alt.pressed == modifiers.alt.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.meta.pressed == modifiers.meta.wanted) {\n",
       "\t\t\t\tcallback(e);\n",
       "\t\n",
       "\t\t\t\tif(!opt['propagate']) { //Stop the event\n",
       "\t\t\t\t\t//e.cancelBubble is supported by IE - this will kill the bubbling process.\n",
       "\t\t\t\t\te.cancelBubble = true;\n",
       "\t\t\t\t\te.returnValue = false;\n",
       "\t\n",
       "\t\t\t\t\t//e.stopPropagation works in Firefox.\n",
       "\t\t\t\t\tif (e.stopPropagation) {\n",
       "\t\t\t\t\t\te.stopPropagation();\n",
       "\t\t\t\t\t\te.preventDefault();\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t\treturn false;\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\t\tthis.all_shortcuts[shortcut_combination] = {\n",
       "\t\t\t'callback':func, \n",
       "\t\t\t'target':ele, \n",
       "\t\t\t'event': opt['type']\n",
       "\t\t};\n",
       "\t\t//Attach the function with the event\n",
       "\t\tif(ele.addEventListener) ele.addEventListener(opt['type'], func, false);\n",
       "\t\telse if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);\n",
       "\t\telse ele['on'+opt['type']] = func;\n",
       "\t},\n",
       "\n",
       "\t//Remove the shortcut - just specify the shortcut and I will remove the binding\n",
       "\t'remove':function(shortcut_combination) {\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\t\tvar binding = this.all_shortcuts[shortcut_combination];\n",
       "\t\tdelete(this.all_shortcuts[shortcut_combination])\n",
       "\t\tif(!binding) return;\n",
       "\t\tvar type = binding['event'];\n",
       "\t\tvar ele = binding['target'];\n",
       "\t\tvar callback = binding['callback'];\n",
       "\n",
       "\t\tif(ele.detachEvent) ele.detachEvent('on'+type, callback);\n",
       "\t\telse if(ele.removeEventListener) ele.removeEventListener(type, callback, false);\n",
       "\t\telse ele['on'+type] = false;\n",
       "\t}\n",
       "}\n",
       "\n",
       "shortcut.add(\"Alt+Left\",function() {\n",
       "\tvar event = new Event('click');\n",
       "\tif (settingsShown){\n",
       "\t\tdocument.getElementById('hideSettingsButton_4').dispatchEvent(event);\n",
       "\t} else {\n",
       "\t\tdocument.getElementById('showSettingsButton_4').dispatchEvent(event);\n",
       "\t}\n",
       "});\n",
       "\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "});});\n",
       "      </script>\n",
       "   </body>\n",
       "</html>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<!--\n",
       "polymake for knusper\n",
       "Thu Aug 27 10:34:43 2020\n",
       "pcom:\n",
       "-->\n",
       "\n",
       "\n",
       "<html>\n",
       "   <head>\n",
       "      <meta charset=utf-8>\n",
       "      <title>pcom:</title>\n",
       "      <style>\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "*/\n",
       "         html {overflow: scroll;}\n",
       "         strong{font-size: 18px;}\n",
       "         canvas { z-index: 8; }\n",
       "         input[type='radio'] {margin-left:0;}\n",
       "         input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;}\n",
       "         .group{padding-bottom: 15px;}\n",
       "         .settings * {z-index: 11; }\n",
       "         .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;}\n",
       "         .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} \n",
       "         .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;}\n",
       "         .showSettingsButton{visibility: visible; z-index: 12; position: absolute }\n",
       "         .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5}\n",
       "         button{margin-left: 0; margin-top: 10px}\n",
       "         img{cursor: pointer;}\n",
       "         .suboption{padding-top: 15px;}\n",
       "         #model13417174782 { width: 100%; height: 100%; }\n",
       "         .threejs_container { width: 100%; height: 75vh;}\n",
       "         .settings{max-height: 74vh} \n",
       "         input[type=range] {\n",
       "           -webkit-appearance: none;\n",
       "           padding:0; \n",
       "           width:90%; \n",
       "           margin-left: auto;\n",
       "           margin-right: auto;\n",
       "           margin-top: 15px;\n",
       "           margin-bottom: 15px;\n",
       "           display: block;\t\n",
       "         }\n",
       "         input[type=range]:focus {\n",
       "           outline: none;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-runnable-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "           -webkit-appearance: none;\n",
       "           margin-top: -5px;\n",
       "         }\n",
       "         input[type=range]:focus::-webkit-slider-runnable-track {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]::-moz-range-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-moz-range-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]::-ms-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           background: transparent;\n",
       "           border-color: transparent;\n",
       "           color: transparent;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_END\n",
       "*/\n",
       "\t\t</style>\n",
       "   </head>\n",
       "<body>\n",
       "   <div class='threejs_container'>\n",
       "\t\t<div id='settings_5' class='settings'>\n",
       "\t\t\t<div class=group id='explode_5'>\n",
       "\t\t\t\t<strong>Explode</strong>\n",
       "\t\t\t\t<input id='explodeRange_5' type='range' min=0 max=6 step=0.01 value=0>\n",
       "\t\t\t\t<div class=indented><input id='explodeCheckbox_5' type='checkbox'>Automatic explosion</div>\n",
       "\t\t\t\t<div class=suboption>Exploding speed</div>\n",
       "\t\t\t\t<input id='explodingSpeedRange_5' type='range' min=0 max=0.5 step=0.001 value=0.05>\n",
       "\t\t\t</div>\n",
       "\t\n",
       "\t\t\t<div class=group id='transparency_5' class='transparency'>\n",
       "\t\t\t\t<strong>Transparency</strong>\n",
       "\t\t\t\t<input id='transparencyRange_5' type='range' min=0 max=1 step=0.01 value=0>\n",
       "\t\t\t</div>\n",
       "\t\t\t\n",
       "\t\t\t<div class=group id='rotation_5'>\n",
       "\t\t\t\t<strong>Rotation</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationX_5'> x-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationY_5'> y-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationZ_5'> z-axis</div>\n",
       "\t\t\t\t\t<button id='resetButton_5'>Reset</button>\n",
       "\t\t\t\t</div>\n",
       "\n",
       "\t\t\t\t<div class=suboption>Rotation speed</div>\n",
       "\t\t\t\t<input id='rotationSpeedRange_5' type='range' min=0 max=5 step=0.01 value=2>\n",
       "\t\t\t</div>\n",
       "\n",
       "\n",
       "\t\t\t<div class=group id='display_5'>\n",
       "\t\t\t\t<strong>Display</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div id='shownObjectTypesList_5' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t\t<div class=suboption>Objects</div>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t   <div id='shownObjectsList_5' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "         \n",
       "         <div class=group id='camera_5'>\n",
       "            <strong>Camera</strong>\n",
       "            <div class=indented>\n",
       "               <form>\n",
       "                  <select id=\"cameraType_5\">\n",
       "                     <option value='perspective' selected> Perspective<br></option>\n",
       "                     <option value='orthographic' > Orthographic<br></option>\n",
       "                  </select>\n",
       "               </form>\n",
       "            </div>\n",
       "         </div>\n",
       "\n",
       "\t\t\t<div class=group id='svg_5'>\n",
       "\t\t\t\t<strong>SVG</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<form>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='download' id='download_5' checked> Download<br>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='tab' id='tab_5' > New tab<br>\n",
       "\t\t\t\t\t</form>\n",
       "\t\t\t\t\t<button id='takeScreenshot_5'>Screenshot</button>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "\n",
       "\t\t</div>\t<!-- end of settings -->\n",
       "\t\t<img id='hideSettingsButton_5' class='hideSettingsButton' src='/kernelspecs/polymake/close.svg' width=20px\">\n",
       "\t\t<img id='showSettingsButton_5' class='showSettingsButton' src='/kernelspecs/polymake/menu.svg' width=20px\">\n",
       "<div id=\"model13417174782\"></div>\n",
       "</div>\n",
       "   <script>\n",
       "    requirejs.config({\n",
       "      paths: {\n",
       "        three: '/kernelspecs/polymake/three',\n",
       "        TrackballControls: '/kernelspecs/polymake/TrackballControls',\n",
       "        OrbitControls: '/kernelspecs/polymake/OrbitControls',\n",
       "        Projector: '/kernelspecs/polymake/Projector',\n",
       "        SVGRenderer: '/kernelspecs/polymake/SVGRenderer',\n",
       "        WEBGL: '/kernelspecs/polymake/WebGL',\n",
       "      },\n",
       "      shim: {\n",
       "        'three': { exports: 'THREE'},\n",
       "        'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' },\n",
       "        'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' },\n",
       "        'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' },\n",
       "        'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' },\n",
       "        'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' },\n",
       "      }\n",
       "    });\n",
       "    \n",
       "    require(['three'],function(THREE){\n",
       "        window.THREE = THREE;\n",
       "      require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'],\n",
       "               function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) {\n",
       "    THREE.TrackballControls = TrackballControls;\n",
       "    THREE.OrbitControls = OrbitControls;\n",
       "    THREE.Projector = Projector;\n",
       "    THREE.SVGRenderer = SVGRenderer;\n",
       "    THREE.WEBGL = WEBGL;\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "\n",
       "const intervalLength = 25; // for automatic animations\n",
       "const explodableModel = true; \n",
       "const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false };\n",
       "const foldables = [];\n",
       "\n",
       "var three = document.getElementById(\"model13417174782\");\n",
       "var scene = new THREE.Scene();\n",
       "var renderer = new THREE.WebGLRenderer( { antialias: true } );\n",
       "var svgRenderer = new THREE.SVGRenderer( { antialias: true } );\n",
       "renderer.setPixelRatio( window.devicePixelRatio );\n",
       "renderer.setClearColor(0xFFFFFF, 1);\n",
       "svgRenderer.setClearColor(0xFFFFFF, 1);\n",
       "three.appendChild(renderer.domElement);\n",
       "\n",
       "var frustumSize = 4;\n",
       "var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()];\n",
       "cameras.forEach(function(cam) {\n",
       "    cam.position.set(0, 0, 5);\n",
       "    cam.lookAt(0, 0, 0);  \n",
       "    cam.up.set(0, 1, 0);         \n",
       "});\n",
       "var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)];\n",
       "var camera, control;\n",
       "\n",
       "controls[0].zoomSpeed = 0.2;\n",
       "controls[0].rotateSpeed = 4;\n",
       "\n",
       "\n",
       "// class to allow move points together with labels and spheres\n",
       "var PMPoint = function (x,y,z) {\n",
       "   this.vector = new THREE.Vector3(x,y,z);\n",
       "   this.sprite = null;\n",
       "   this.sphere = null;\n",
       "}\n",
       "PMPoint.prototype.addLabel = function(labelsprite) {\n",
       "   this.sprite = labelsprite;\n",
       "   this.sprite.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.addSphere = function(spheremesh) {\n",
       "   this.sphere = spheremesh;\n",
       "   this.sphere.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.set = function(x,y,z) {\n",
       "   this.vector.set(x,y,z);\n",
       "   if (this.sprite) {\n",
       "      this.sprite.position.copy(this.vector);\n",
       "   }\n",
       "   if (this.sphere) {\n",
       "      this.sphere.position.copy(this.vector);\n",
       "   }\n",
       "}\n",
       "PMPoint.prototype.radius = function() {\n",
       "   if (this.sphere) {\n",
       "      return this.sphere.geometry.parameters.radius;\n",
       "   } else {\n",
       "      return 0;\n",
       "   }\n",
       "};\n",
       "// select the target node\n",
       "var target = document.querySelector('#model13417174782');\n",
       "\n",
       "// create an observer instance\n",
       "var observer = new MutationObserver(function(mutations) {\n",
       "   mutations.forEach(function(mutation) {\n",
       "      if (mutation.removedNodes && mutation.removedNodes.length > 0) {\n",
       "         cancelAnimationFrame(renderId);\n",
       "         observer.disconnect();\n",
       "         console.log(\"cancelled frame \"+renderId);\n",
       "      }\n",
       "   });\n",
       "});\n",
       "\n",
       "// configuration of the observer:\n",
       "var config = { childList: true, characterData: true }\n",
       "\n",
       "// pass in the target node, as well as the observer options\n",
       "while (target) {\n",
       "   if (target.className==\"output\") {\n",
       "      observer.observe(target, config);\n",
       "      break;\n",
       "   }\n",
       "   target = target.parentNode;\n",
       "}\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "var obj0 = new THREE.Object3D();\n",
       "obj0.name = \"unnamed__1\";\n",
       "obj0.userData.explodable = 1;\n",
       "obj0.userData.points = [];\n",
       "obj0.userData.points.push(new PMPoint(4.5, 2, 2));\n",
       "obj0.userData.points.push(new PMPoint(4.5, 2, 4.5));\n",
       "\n",
       "obj0.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj0.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj0);\n",
       "scene.add(obj0);\n",
       "\n",
       "var obj1 = new THREE.Object3D();\n",
       "obj1.name = \"unnamed__2\";\n",
       "obj1.userData.explodable = 1;\n",
       "obj1.userData.points = [];\n",
       "obj1.userData.points.push(new PMPoint(4.5, 0, 1));\n",
       "obj1.userData.points.push(new PMPoint(4.5, 1, 1));\n",
       "\n",
       "obj1.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj1.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj1.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj1.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj1);\n",
       "scene.add(obj1);\n",
       "\n",
       "var obj2 = new THREE.Object3D();\n",
       "obj2.name = \"unnamed__3\";\n",
       "obj2.userData.explodable = 1;\n",
       "obj2.userData.points = [];\n",
       "obj2.userData.points.push(new PMPoint(4.5, 2, 2));\n",
       "obj2.userData.points.push(new PMPoint(4.5, 4.5, 2));\n",
       "\n",
       "obj2.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj2.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj2.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj2.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj2);\n",
       "scene.add(obj2);\n",
       "\n",
       "var obj3 = new THREE.Object3D();\n",
       "obj3.name = \"unnamed__4\";\n",
       "obj3.userData.explodable = 1;\n",
       "obj3.userData.points = [];\n",
       "obj3.userData.points.push(new PMPoint(4.5, 1, 1));\n",
       "obj3.userData.points.push(new PMPoint(4.5, 1, 0));\n",
       "\n",
       "obj3.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj3.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj3.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj3.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj3);\n",
       "scene.add(obj3);\n",
       "\n",
       "var obj4 = new THREE.Object3D();\n",
       "obj4.name = \"unnamed__5\";\n",
       "obj4.userData.explodable = 1;\n",
       "obj4.userData.points = [];\n",
       "obj4.userData.points.push(new PMPoint(4.5, 2, 2));\n",
       "obj4.userData.points.push(new PMPoint(4.5, 1, 1));\n",
       "\n",
       "obj4.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj4.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj4.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj4.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj4);\n",
       "scene.add(obj4);\n",
       "\n",
       "var obj5 = new THREE.Object3D();\n",
       "obj5.name = \"unnamed__6\";\n",
       "obj5.userData.explodable = 1;\n",
       "obj5.userData.points = [];\n",
       "obj5.userData.points.push(new PMPoint(4.5, -2, 0));\n",
       "obj5.userData.points.push(new PMPoint(4.5, -2, 4.5));\n",
       "\n",
       "obj5.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj5.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj5.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj5.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj5);\n",
       "scene.add(obj5);\n",
       "\n",
       "var obj6 = new THREE.Object3D();\n",
       "obj6.name = \"unnamed__7\";\n",
       "obj6.userData.explodable = 1;\n",
       "obj6.userData.points = [];\n",
       "obj6.userData.points.push(new PMPoint(4.5, 0, 1));\n",
       "obj6.userData.points.push(new PMPoint(4.5, -1, 0));\n",
       "\n",
       "obj6.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj6.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj6.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj6.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj6);\n",
       "scene.add(obj6);\n",
       "\n",
       "var obj7 = new THREE.Object3D();\n",
       "obj7.name = \"unnamed__8\";\n",
       "obj7.userData.explodable = 1;\n",
       "obj7.userData.points = [];\n",
       "obj7.userData.points.push(new PMPoint(4.5, 0, 1));\n",
       "obj7.userData.points.push(new PMPoint(4.5, 0, 4.5));\n",
       "\n",
       "obj7.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj7.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj7.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj7.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj7);\n",
       "scene.add(obj7);\n",
       "\n",
       "var obj8 = new THREE.Object3D();\n",
       "obj8.name = \"unnamed__9\";\n",
       "obj8.userData.explodable = 1;\n",
       "obj8.userData.points = [];\n",
       "obj8.userData.points.push(new PMPoint(4.5, 0, -2));\n",
       "obj8.userData.points.push(new PMPoint(4.5, 4.5, -2));\n",
       "\n",
       "obj8.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj8.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj8.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj8.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj8);\n",
       "scene.add(obj8);\n",
       "\n",
       "var obj9 = new THREE.Object3D();\n",
       "obj9.name = \"unnamed__10\";\n",
       "obj9.userData.explodable = 1;\n",
       "obj9.userData.points = [];\n",
       "obj9.userData.points.push(new PMPoint(4.5, 1, 0));\n",
       "obj9.userData.points.push(new PMPoint(4.5, 0, -1));\n",
       "\n",
       "obj9.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj9.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj9.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj9.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj9);\n",
       "scene.add(obj9);\n",
       "\n",
       "var obj10 = new THREE.Object3D();\n",
       "obj10.name = \"unnamed__11\";\n",
       "obj10.userData.explodable = 1;\n",
       "obj10.userData.points = [];\n",
       "obj10.userData.points.push(new PMPoint(4.5, 1, 0));\n",
       "obj10.userData.points.push(new PMPoint(4.5, 4.5, 0));\n",
       "\n",
       "obj10.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj10.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj10.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj10.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj10);\n",
       "scene.add(obj10);\n",
       "\n",
       "var obj11 = new THREE.Object3D();\n",
       "obj11.name = \"unnamed__12\";\n",
       "obj11.userData.explodable = 1;\n",
       "obj11.userData.points = [];\n",
       "obj11.userData.points.push(new PMPoint(4.5, -2, 0));\n",
       "obj11.userData.points.push(new PMPoint(4.5, -3.2, -1.2));\n",
       "\n",
       "obj11.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj11.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj11.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj11.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj11);\n",
       "scene.add(obj11);\n",
       "\n",
       "var obj12 = new THREE.Object3D();\n",
       "obj12.name = \"unnamed__13\";\n",
       "obj12.userData.explodable = 1;\n",
       "obj12.userData.points = [];\n",
       "obj12.userData.points.push(new PMPoint(4.5, -1, 0));\n",
       "obj12.userData.points.push(new PMPoint(4.5, -1, -1));\n",
       "\n",
       "obj12.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj12.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj12.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj12.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj12);\n",
       "scene.add(obj12);\n",
       "\n",
       "var obj13 = new THREE.Object3D();\n",
       "obj13.name = \"unnamed__14\";\n",
       "obj13.userData.explodable = 1;\n",
       "obj13.userData.points = [];\n",
       "obj13.userData.points.push(new PMPoint(4.5, -2, 0));\n",
       "obj13.userData.points.push(new PMPoint(4.5, -1, 0));\n",
       "\n",
       "obj13.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj13.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj13.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj13.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj13);\n",
       "scene.add(obj13);\n",
       "\n",
       "var obj14 = new THREE.Object3D();\n",
       "obj14.name = \"unnamed__15\";\n",
       "obj14.userData.explodable = 1;\n",
       "obj14.userData.points = [];\n",
       "obj14.userData.points.push(new PMPoint(4.5, 0, -2));\n",
       "obj14.userData.points.push(new PMPoint(4.5, -1.2, -3.2));\n",
       "\n",
       "obj14.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj14.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj14.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj14.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj14);\n",
       "scene.add(obj14);\n",
       "\n",
       "var obj15 = new THREE.Object3D();\n",
       "obj15.name = \"unnamed__16\";\n",
       "obj15.userData.explodable = 1;\n",
       "obj15.userData.points = [];\n",
       "obj15.userData.points.push(new PMPoint(4.5, 0, -1));\n",
       "obj15.userData.points.push(new PMPoint(4.5, -1, -1));\n",
       "\n",
       "obj15.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj15.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj15.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj15.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj15);\n",
       "scene.add(obj15);\n",
       "\n",
       "var obj16 = new THREE.Object3D();\n",
       "obj16.name = \"unnamed__17\";\n",
       "obj16.userData.explodable = 1;\n",
       "obj16.userData.points = [];\n",
       "obj16.userData.points.push(new PMPoint(4.5, 0, -2));\n",
       "obj16.userData.points.push(new PMPoint(4.5, 0, -1));\n",
       "\n",
       "obj16.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj16.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj16.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj16.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj16);\n",
       "scene.add(obj16);\n",
       "\n",
       "var obj17 = new THREE.Object3D();\n",
       "obj17.name = \"unnamed__18\";\n",
       "obj17.userData.explodable = 1;\n",
       "obj17.userData.points = [];\n",
       "obj17.userData.points.push(new PMPoint(4.5, -1, -1));\n",
       "obj17.userData.points.push(new PMPoint(4.5, -3.2, -3.2));\n",
       "\n",
       "obj17.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj17.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj17.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj17.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj17);\n",
       "scene.add(obj17);\n",
       "\n",
       "var obj18 = new THREE.Object3D();\n",
       "obj18.name = \"unnamed__19\";\n",
       "obj18.userData.explodable = 1;\n",
       "obj18.userData.points = [];\n",
       "obj18.userData.points.push(new PMPoint(-3.2, -1.2, -1.2));\n",
       "obj18.userData.points.push(new PMPoint(-3.2, -1.2, 4.5));\n",
       "\n",
       "obj18.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj18.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj18.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj18.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj18);\n",
       "scene.add(obj18);\n",
       "\n",
       "var obj19 = new THREE.Object3D();\n",
       "obj19.name = \"unnamed__20\";\n",
       "obj19.userData.explodable = 1;\n",
       "obj19.userData.points = [];\n",
       "obj19.userData.points.push(new PMPoint(-3.2, -3.2, -2.2));\n",
       "obj19.userData.points.push(new PMPoint(-3.2, -2.2, -2.2));\n",
       "\n",
       "obj19.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj19.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj19.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj19.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj19);\n",
       "scene.add(obj19);\n",
       "\n",
       "var obj20 = new THREE.Object3D();\n",
       "obj20.name = \"unnamed__21\";\n",
       "obj20.userData.explodable = 1;\n",
       "obj20.userData.points = [];\n",
       "obj20.userData.points.push(new PMPoint(-3.2, -1.2, -1.2));\n",
       "obj20.userData.points.push(new PMPoint(-3.2, 4.5, -1.2));\n",
       "\n",
       "obj20.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj20.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj20.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj20.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj20);\n",
       "scene.add(obj20);\n",
       "\n",
       "var obj21 = new THREE.Object3D();\n",
       "obj21.name = \"unnamed__22\";\n",
       "obj21.userData.explodable = 1;\n",
       "obj21.userData.points = [];\n",
       "obj21.userData.points.push(new PMPoint(-3.2, -2.2, -2.2));\n",
       "obj21.userData.points.push(new PMPoint(-3.2, -2.2, -3.2));\n",
       "\n",
       "obj21.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj21.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj21.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj21.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj21);\n",
       "scene.add(obj21);\n",
       "\n",
       "var obj22 = new THREE.Object3D();\n",
       "obj22.name = \"unnamed__23\";\n",
       "obj22.userData.explodable = 1;\n",
       "obj22.userData.points = [];\n",
       "obj22.userData.points.push(new PMPoint(-3.2, -1.2, -1.2));\n",
       "obj22.userData.points.push(new PMPoint(-3.2, -2.2, -2.2));\n",
       "\n",
       "obj22.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj22.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj22.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj22.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj22);\n",
       "scene.add(obj22);\n",
       "\n",
       "var obj23 = new THREE.Object3D();\n",
       "obj23.name = \"unnamed__24\";\n",
       "obj23.userData.explodable = 1;\n",
       "obj23.userData.points = [];\n",
       "obj23.userData.points.push(new PMPoint(-3.2, -3.2, -2.2));\n",
       "obj23.userData.points.push(new PMPoint(-3.2, -3.2, 4.5));\n",
       "\n",
       "obj23.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj23.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj23.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj23.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj23);\n",
       "scene.add(obj23);\n",
       "\n",
       "var obj24 = new THREE.Object3D();\n",
       "obj24.name = \"unnamed__25\";\n",
       "obj24.userData.explodable = 1;\n",
       "obj24.userData.points = [];\n",
       "obj24.userData.points.push(new PMPoint(-3.2, -2.2, -3.2));\n",
       "obj24.userData.points.push(new PMPoint(-3.2, 4.5, -3.2));\n",
       "\n",
       "obj24.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj24.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj24.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj24.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj24);\n",
       "scene.add(obj24);\n",
       "\n",
       "var obj25 = new THREE.Object3D();\n",
       "obj25.name = \"unnamed__26\";\n",
       "obj25.userData.explodable = 1;\n",
       "obj25.userData.points = [];\n",
       "obj25.userData.points.push(new PMPoint(2, 4.5, 2));\n",
       "obj25.userData.points.push(new PMPoint(2, 4.5, 4.5));\n",
       "\n",
       "obj25.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj25.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj25.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj25.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj25);\n",
       "scene.add(obj25);\n",
       "\n",
       "var obj26 = new THREE.Object3D();\n",
       "obj26.name = \"unnamed__27\";\n",
       "obj26.userData.explodable = 1;\n",
       "obj26.userData.points = [];\n",
       "obj26.userData.points.push(new PMPoint(0, 4.5, 1));\n",
       "obj26.userData.points.push(new PMPoint(1, 4.5, 1));\n",
       "\n",
       "obj26.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj26.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj26.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj26.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj26);\n",
       "scene.add(obj26);\n",
       "\n",
       "var obj27 = new THREE.Object3D();\n",
       "obj27.name = \"unnamed__28\";\n",
       "obj27.userData.explodable = 1;\n",
       "obj27.userData.points = [];\n",
       "obj27.userData.points.push(new PMPoint(4.5, 4.5, 2));\n",
       "obj27.userData.points.push(new PMPoint(2, 4.5, 2));\n",
       "\n",
       "obj27.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj27.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj27.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj27.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj27);\n",
       "scene.add(obj27);\n",
       "\n",
       "var obj28 = new THREE.Object3D();\n",
       "obj28.name = \"unnamed__29\";\n",
       "obj28.userData.explodable = 1;\n",
       "obj28.userData.points = [];\n",
       "obj28.userData.points.push(new PMPoint(1, 4.5, 1));\n",
       "obj28.userData.points.push(new PMPoint(1, 4.5, 0));\n",
       "\n",
       "obj28.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj28.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj28.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj28.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj28);\n",
       "scene.add(obj28);\n",
       "\n",
       "var obj29 = new THREE.Object3D();\n",
       "obj29.name = \"unnamed__30\";\n",
       "obj29.userData.explodable = 1;\n",
       "obj29.userData.points = [];\n",
       "obj29.userData.points.push(new PMPoint(2, 4.5, 2));\n",
       "obj29.userData.points.push(new PMPoint(1, 4.5, 1));\n",
       "\n",
       "obj29.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj29.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj29.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj29.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj29);\n",
       "scene.add(obj29);\n",
       "\n",
       "var obj30 = new THREE.Object3D();\n",
       "obj30.name = \"unnamed__31\";\n",
       "obj30.userData.explodable = 1;\n",
       "obj30.userData.points = [];\n",
       "obj30.userData.points.push(new PMPoint(-2, 4.5, 0));\n",
       "obj30.userData.points.push(new PMPoint(-2, 4.5, 4.5));\n",
       "\n",
       "obj30.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj30.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj30.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj30.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj30);\n",
       "scene.add(obj30);\n",
       "\n",
       "var obj31 = new THREE.Object3D();\n",
       "obj31.name = \"unnamed__32\";\n",
       "obj31.userData.explodable = 1;\n",
       "obj31.userData.points = [];\n",
       "obj31.userData.points.push(new PMPoint(0, 4.5, 1));\n",
       "obj31.userData.points.push(new PMPoint(-1, 4.5, 0));\n",
       "\n",
       "obj31.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj31.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj31.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj31.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj31);\n",
       "scene.add(obj31);\n",
       "\n",
       "var obj32 = new THREE.Object3D();\n",
       "obj32.name = \"unnamed__33\";\n",
       "obj32.userData.explodable = 1;\n",
       "obj32.userData.points = [];\n",
       "obj32.userData.points.push(new PMPoint(0, 4.5, 1));\n",
       "obj32.userData.points.push(new PMPoint(0, 4.5, 4.5));\n",
       "\n",
       "obj32.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj32.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj32.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj32.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj32);\n",
       "scene.add(obj32);\n",
       "\n",
       "var obj33 = new THREE.Object3D();\n",
       "obj33.name = \"unnamed__34\";\n",
       "obj33.userData.explodable = 1;\n",
       "obj33.userData.points = [];\n",
       "obj33.userData.points.push(new PMPoint(4.5, 4.5, -2));\n",
       "obj33.userData.points.push(new PMPoint(0, 4.5, -2));\n",
       "\n",
       "obj33.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj33.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj33.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj33.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj33);\n",
       "scene.add(obj33);\n",
       "\n",
       "var obj34 = new THREE.Object3D();\n",
       "obj34.name = \"unnamed__35\";\n",
       "obj34.userData.explodable = 1;\n",
       "obj34.userData.points = [];\n",
       "obj34.userData.points.push(new PMPoint(1, 4.5, 0));\n",
       "obj34.userData.points.push(new PMPoint(0, 4.5, -1));\n",
       "\n",
       "obj34.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj34.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj34.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj34.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj34);\n",
       "scene.add(obj34);\n",
       "\n",
       "var obj35 = new THREE.Object3D();\n",
       "obj35.name = \"unnamed__36\";\n",
       "obj35.userData.explodable = 1;\n",
       "obj35.userData.points = [];\n",
       "obj35.userData.points.push(new PMPoint(4.5, 4.5, 0));\n",
       "obj35.userData.points.push(new PMPoint(1, 4.5, 0));\n",
       "\n",
       "obj35.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj35.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj35.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj35.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj35);\n",
       "scene.add(obj35);\n",
       "\n",
       "var obj36 = new THREE.Object3D();\n",
       "obj36.name = \"unnamed__37\";\n",
       "obj36.userData.explodable = 1;\n",
       "obj36.userData.points = [];\n",
       "obj36.userData.points.push(new PMPoint(-3.2, 4.5, -1.2));\n",
       "obj36.userData.points.push(new PMPoint(-2, 4.5, 0));\n",
       "\n",
       "obj36.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj36.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj36.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj36.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj36);\n",
       "scene.add(obj36);\n",
       "\n",
       "var obj37 = new THREE.Object3D();\n",
       "obj37.name = \"unnamed__38\";\n",
       "obj37.userData.explodable = 1;\n",
       "obj37.userData.points = [];\n",
       "obj37.userData.points.push(new PMPoint(-1, 4.5, 0));\n",
       "obj37.userData.points.push(new PMPoint(-1, 4.5, -1));\n",
       "\n",
       "obj37.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj37.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj37.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj37.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj37);\n",
       "scene.add(obj37);\n",
       "\n",
       "var obj38 = new THREE.Object3D();\n",
       "obj38.name = \"unnamed__39\";\n",
       "obj38.userData.explodable = 1;\n",
       "obj38.userData.points = [];\n",
       "obj38.userData.points.push(new PMPoint(-2, 4.5, 0));\n",
       "obj38.userData.points.push(new PMPoint(-1, 4.5, 0));\n",
       "\n",
       "obj38.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj38.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj38.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj38.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj38);\n",
       "scene.add(obj38);\n",
       "\n",
       "var obj39 = new THREE.Object3D();\n",
       "obj39.name = \"unnamed__40\";\n",
       "obj39.userData.explodable = 1;\n",
       "obj39.userData.points = [];\n",
       "obj39.userData.points.push(new PMPoint(0, 4.5, -2));\n",
       "obj39.userData.points.push(new PMPoint(-1.2, 4.5, -3.2));\n",
       "\n",
       "obj39.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj39.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj39.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj39.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj39);\n",
       "scene.add(obj39);\n",
       "\n",
       "var obj40 = new THREE.Object3D();\n",
       "obj40.name = \"unnamed__41\";\n",
       "obj40.userData.explodable = 1;\n",
       "obj40.userData.points = [];\n",
       "obj40.userData.points.push(new PMPoint(0, 4.5, -1));\n",
       "obj40.userData.points.push(new PMPoint(-1, 4.5, -1));\n",
       "\n",
       "obj40.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj40.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj40.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj40.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj40);\n",
       "scene.add(obj40);\n",
       "\n",
       "var obj41 = new THREE.Object3D();\n",
       "obj41.name = \"unnamed__42\";\n",
       "obj41.userData.explodable = 1;\n",
       "obj41.userData.points = [];\n",
       "obj41.userData.points.push(new PMPoint(0, 4.5, -2));\n",
       "obj41.userData.points.push(new PMPoint(0, 4.5, -1));\n",
       "\n",
       "obj41.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj41.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj41.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj41.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj41);\n",
       "scene.add(obj41);\n",
       "\n",
       "var obj42 = new THREE.Object3D();\n",
       "obj42.name = \"unnamed__43\";\n",
       "obj42.userData.explodable = 1;\n",
       "obj42.userData.points = [];\n",
       "obj42.userData.points.push(new PMPoint(-3.2, 4.5, -3.2));\n",
       "obj42.userData.points.push(new PMPoint(-1, 4.5, -1));\n",
       "\n",
       "obj42.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj42.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj42.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj42.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj42);\n",
       "scene.add(obj42);\n",
       "\n",
       "var obj43 = new THREE.Object3D();\n",
       "obj43.name = \"unnamed__44\";\n",
       "obj43.userData.explodable = 1;\n",
       "obj43.userData.points = [];\n",
       "obj43.userData.points.push(new PMPoint(-1.2, -3.2, -1.2));\n",
       "obj43.userData.points.push(new PMPoint(-1.2, -3.2, 4.5));\n",
       "\n",
       "obj43.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj43.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj43.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj43.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj43);\n",
       "scene.add(obj43);\n",
       "\n",
       "var obj44 = new THREE.Object3D();\n",
       "obj44.name = \"unnamed__45\";\n",
       "obj44.userData.explodable = 1;\n",
       "obj44.userData.points = [];\n",
       "obj44.userData.points.push(new PMPoint(-3.2, -3.2, -2.2));\n",
       "obj44.userData.points.push(new PMPoint(-2.2, -3.2, -2.2));\n",
       "\n",
       "obj44.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj44.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj44.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj44.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj44);\n",
       "scene.add(obj44);\n",
       "\n",
       "var obj45 = new THREE.Object3D();\n",
       "obj45.name = \"unnamed__46\";\n",
       "obj45.userData.explodable = 1;\n",
       "obj45.userData.points = [];\n",
       "obj45.userData.points.push(new PMPoint(4.5, -3.2, -1.2));\n",
       "obj45.userData.points.push(new PMPoint(-1.2, -3.2, -1.2));\n",
       "\n",
       "obj45.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj45.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj45.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj45.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj45);\n",
       "scene.add(obj45);\n",
       "\n",
       "var obj46 = new THREE.Object3D();\n",
       "obj46.name = \"unnamed__47\";\n",
       "obj46.userData.explodable = 1;\n",
       "obj46.userData.points = [];\n",
       "obj46.userData.points.push(new PMPoint(-2.2, -3.2, -2.2));\n",
       "obj46.userData.points.push(new PMPoint(-2.2, -3.2, -3.2));\n",
       "\n",
       "obj46.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj46.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj46.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj46.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj46);\n",
       "scene.add(obj46);\n",
       "\n",
       "var obj47 = new THREE.Object3D();\n",
       "obj47.name = \"unnamed__48\";\n",
       "obj47.userData.explodable = 1;\n",
       "obj47.userData.points = [];\n",
       "obj47.userData.points.push(new PMPoint(-1.2, -3.2, -1.2));\n",
       "obj47.userData.points.push(new PMPoint(-2.2, -3.2, -2.2));\n",
       "\n",
       "obj47.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj47.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj47.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj47.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj47);\n",
       "scene.add(obj47);\n",
       "\n",
       "var obj48 = new THREE.Object3D();\n",
       "obj48.name = \"unnamed__49\";\n",
       "obj48.userData.explodable = 1;\n",
       "obj48.userData.points = [];\n",
       "obj48.userData.points.push(new PMPoint(4.5, -3.2, -3.2));\n",
       "obj48.userData.points.push(new PMPoint(-2.2, -3.2, -3.2));\n",
       "\n",
       "obj48.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj48.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj48.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj48.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj48);\n",
       "scene.add(obj48);\n",
       "\n",
       "var obj49 = new THREE.Object3D();\n",
       "obj49.name = \"unnamed__50\";\n",
       "obj49.userData.explodable = 1;\n",
       "obj49.userData.points = [];\n",
       "obj49.userData.points.push(new PMPoint(2, 4.5, 4.5));\n",
       "obj49.userData.points.push(new PMPoint(2, 2, 4.5));\n",
       "\n",
       "obj49.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj49.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj49.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj49.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj49);\n",
       "scene.add(obj49);\n",
       "\n",
       "var obj50 = new THREE.Object3D();\n",
       "obj50.name = \"unnamed__51\";\n",
       "obj50.userData.explodable = 1;\n",
       "obj50.userData.points = [];\n",
       "obj50.userData.points.push(new PMPoint(0, 1, 4.5));\n",
       "obj50.userData.points.push(new PMPoint(1, 1, 4.5));\n",
       "\n",
       "obj50.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj50.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj50.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj50.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj50);\n",
       "scene.add(obj50);\n",
       "\n",
       "var obj51 = new THREE.Object3D();\n",
       "obj51.name = \"unnamed__52\";\n",
       "obj51.userData.explodable = 1;\n",
       "obj51.userData.points = [];\n",
       "obj51.userData.points.push(new PMPoint(4.5, 2, 4.5));\n",
       "obj51.userData.points.push(new PMPoint(2, 2, 4.5));\n",
       "\n",
       "obj51.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj51.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj51.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj51.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj51);\n",
       "scene.add(obj51);\n",
       "\n",
       "var obj52 = new THREE.Object3D();\n",
       "obj52.name = \"unnamed__53\";\n",
       "obj52.userData.explodable = 1;\n",
       "obj52.userData.points = [];\n",
       "obj52.userData.points.push(new PMPoint(1, 1, 4.5));\n",
       "obj52.userData.points.push(new PMPoint(1, 0, 4.5));\n",
       "\n",
       "obj52.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj52.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj52.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj52.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj52);\n",
       "scene.add(obj52);\n",
       "\n",
       "var obj53 = new THREE.Object3D();\n",
       "obj53.name = \"unnamed__54\";\n",
       "obj53.userData.explodable = 1;\n",
       "obj53.userData.points = [];\n",
       "obj53.userData.points.push(new PMPoint(2, 2, 4.5));\n",
       "obj53.userData.points.push(new PMPoint(1, 1, 4.5));\n",
       "\n",
       "obj53.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj53.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj53.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj53.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj53);\n",
       "scene.add(obj53);\n",
       "\n",
       "var obj54 = new THREE.Object3D();\n",
       "obj54.name = \"unnamed__55\";\n",
       "obj54.userData.explodable = 1;\n",
       "obj54.userData.points = [];\n",
       "obj54.userData.points.push(new PMPoint(-2, 4.5, 4.5));\n",
       "obj54.userData.points.push(new PMPoint(-2, 0, 4.5));\n",
       "\n",
       "obj54.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj54.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj54.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj54.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj54);\n",
       "scene.add(obj54);\n",
       "\n",
       "var obj55 = new THREE.Object3D();\n",
       "obj55.name = \"unnamed__56\";\n",
       "obj55.userData.explodable = 1;\n",
       "obj55.userData.points = [];\n",
       "obj55.userData.points.push(new PMPoint(0, 1, 4.5));\n",
       "obj55.userData.points.push(new PMPoint(-1, 0, 4.5));\n",
       "\n",
       "obj55.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj55.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj55.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj55.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj55);\n",
       "scene.add(obj55);\n",
       "\n",
       "var obj56 = new THREE.Object3D();\n",
       "obj56.name = \"unnamed__57\";\n",
       "obj56.userData.explodable = 1;\n",
       "obj56.userData.points = [];\n",
       "obj56.userData.points.push(new PMPoint(0, 4.5, 4.5));\n",
       "obj56.userData.points.push(new PMPoint(0, 1, 4.5));\n",
       "\n",
       "obj56.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj56.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj56.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj56.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj56);\n",
       "scene.add(obj56);\n",
       "\n",
       "var obj57 = new THREE.Object3D();\n",
       "obj57.name = \"unnamed__58\";\n",
       "obj57.userData.explodable = 1;\n",
       "obj57.userData.points = [];\n",
       "obj57.userData.points.push(new PMPoint(4.5, -2, 4.5));\n",
       "obj57.userData.points.push(new PMPoint(0, -2, 4.5));\n",
       "\n",
       "obj57.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj57.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj57.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj57.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj57);\n",
       "scene.add(obj57);\n",
       "\n",
       "var obj58 = new THREE.Object3D();\n",
       "obj58.name = \"unnamed__59\";\n",
       "obj58.userData.explodable = 1;\n",
       "obj58.userData.points = [];\n",
       "obj58.userData.points.push(new PMPoint(1, 0, 4.5));\n",
       "obj58.userData.points.push(new PMPoint(0, -1, 4.5));\n",
       "\n",
       "obj58.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj58.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj58.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj58.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj58);\n",
       "scene.add(obj58);\n",
       "\n",
       "var obj59 = new THREE.Object3D();\n",
       "obj59.name = \"unnamed__60\";\n",
       "obj59.userData.explodable = 1;\n",
       "obj59.userData.points = [];\n",
       "obj59.userData.points.push(new PMPoint(4.5, 0, 4.5));\n",
       "obj59.userData.points.push(new PMPoint(1, 0, 4.5));\n",
       "\n",
       "obj59.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj59.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj59.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj59.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj59);\n",
       "scene.add(obj59);\n",
       "\n",
       "var obj60 = new THREE.Object3D();\n",
       "obj60.name = \"unnamed__61\";\n",
       "obj60.userData.explodable = 1;\n",
       "obj60.userData.points = [];\n",
       "obj60.userData.points.push(new PMPoint(-3.2, -1.2, 4.5));\n",
       "obj60.userData.points.push(new PMPoint(-2, 0, 4.5));\n",
       "\n",
       "obj60.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj60.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj60.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj60.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj60);\n",
       "scene.add(obj60);\n",
       "\n",
       "var obj61 = new THREE.Object3D();\n",
       "obj61.name = \"unnamed__62\";\n",
       "obj61.userData.explodable = 1;\n",
       "obj61.userData.points = [];\n",
       "obj61.userData.points.push(new PMPoint(-1, 0, 4.5));\n",
       "obj61.userData.points.push(new PMPoint(-1, -1, 4.5));\n",
       "\n",
       "obj61.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj61.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj61.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj61.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj61);\n",
       "scene.add(obj61);\n",
       "\n",
       "var obj62 = new THREE.Object3D();\n",
       "obj62.name = \"unnamed__63\";\n",
       "obj62.userData.explodable = 1;\n",
       "obj62.userData.points = [];\n",
       "obj62.userData.points.push(new PMPoint(-2, 0, 4.5));\n",
       "obj62.userData.points.push(new PMPoint(-1, 0, 4.5));\n",
       "\n",
       "obj62.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj62.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj62.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj62.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj62);\n",
       "scene.add(obj62);\n",
       "\n",
       "var obj63 = new THREE.Object3D();\n",
       "obj63.name = \"unnamed__64\";\n",
       "obj63.userData.explodable = 1;\n",
       "obj63.userData.points = [];\n",
       "obj63.userData.points.push(new PMPoint(-1.2, -3.2, 4.5));\n",
       "obj63.userData.points.push(new PMPoint(0, -2, 4.5));\n",
       "\n",
       "obj63.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj63.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj63.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj63.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj63);\n",
       "scene.add(obj63);\n",
       "\n",
       "var obj64 = new THREE.Object3D();\n",
       "obj64.name = \"unnamed__65\";\n",
       "obj64.userData.explodable = 1;\n",
       "obj64.userData.points = [];\n",
       "obj64.userData.points.push(new PMPoint(0, -1, 4.5));\n",
       "obj64.userData.points.push(new PMPoint(-1, -1, 4.5));\n",
       "\n",
       "obj64.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj64.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj64.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj64.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj64);\n",
       "scene.add(obj64);\n",
       "\n",
       "var obj65 = new THREE.Object3D();\n",
       "obj65.name = \"unnamed__66\";\n",
       "obj65.userData.explodable = 1;\n",
       "obj65.userData.points = [];\n",
       "obj65.userData.points.push(new PMPoint(0, -2, 4.5));\n",
       "obj65.userData.points.push(new PMPoint(0, -1, 4.5));\n",
       "\n",
       "obj65.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj65.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj65.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj65.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj65);\n",
       "scene.add(obj65);\n",
       "\n",
       "var obj66 = new THREE.Object3D();\n",
       "obj66.name = \"unnamed__67\";\n",
       "obj66.userData.explodable = 1;\n",
       "obj66.userData.points = [];\n",
       "obj66.userData.points.push(new PMPoint(-3.2, -3.2, 4.5));\n",
       "obj66.userData.points.push(new PMPoint(-1, -1, 4.5));\n",
       "\n",
       "obj66.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj66.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj66.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj66.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj66);\n",
       "scene.add(obj66);\n",
       "\n",
       "var obj67 = new THREE.Object3D();\n",
       "obj67.name = \"unnamed__68\";\n",
       "obj67.userData.explodable = 1;\n",
       "obj67.userData.points = [];\n",
       "obj67.userData.points.push(new PMPoint(-1.2, 4.5, -3.2));\n",
       "obj67.userData.points.push(new PMPoint(-1.2, -1.2, -3.2));\n",
       "\n",
       "obj67.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj67.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj67.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj67.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj67);\n",
       "scene.add(obj67);\n",
       "\n",
       "var obj68 = new THREE.Object3D();\n",
       "obj68.name = \"unnamed__69\";\n",
       "obj68.userData.explodable = 1;\n",
       "obj68.userData.points = [];\n",
       "obj68.userData.points.push(new PMPoint(-3.2, -2.2, -3.2));\n",
       "obj68.userData.points.push(new PMPoint(-2.2, -2.2, -3.2));\n",
       "\n",
       "obj68.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj68.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj68.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj68.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj68);\n",
       "scene.add(obj68);\n",
       "\n",
       "var obj69 = new THREE.Object3D();\n",
       "obj69.name = \"unnamed__70\";\n",
       "obj69.userData.explodable = 1;\n",
       "obj69.userData.points = [];\n",
       "obj69.userData.points.push(new PMPoint(4.5, -1.2, -3.2));\n",
       "obj69.userData.points.push(new PMPoint(-1.2, -1.2, -3.2));\n",
       "\n",
       "obj69.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj69.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj69.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj69.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj69);\n",
       "scene.add(obj69);\n",
       "\n",
       "var obj70 = new THREE.Object3D();\n",
       "obj70.name = \"unnamed__71\";\n",
       "obj70.userData.explodable = 1;\n",
       "obj70.userData.points = [];\n",
       "obj70.userData.points.push(new PMPoint(-2.2, -3.2, -3.2));\n",
       "obj70.userData.points.push(new PMPoint(-2.2, -2.2, -3.2));\n",
       "\n",
       "obj70.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj70.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj70.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj70.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj70);\n",
       "scene.add(obj70);\n",
       "\n",
       "var obj71 = new THREE.Object3D();\n",
       "obj71.name = \"unnamed__72\";\n",
       "obj71.userData.explodable = 1;\n",
       "obj71.userData.points = [];\n",
       "obj71.userData.points.push(new PMPoint(-1.2, -1.2, -3.2));\n",
       "obj71.userData.points.push(new PMPoint(-2.2, -2.2, -3.2));\n",
       "\n",
       "obj71.userData.pointradii = 0.02;\n",
       "   <!-- Vertex style -->\n",
       "obj71.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj71.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj71.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 1.5, transparent: false } );\n",
       "init_object(obj71);\n",
       "scene.add(obj71);\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "function textSpriteMaterial(message, parameters) {\n",
       "    if ( parameters === undefined ) parameters = {};\n",
       "    var fontface = \"Helvetica\";\n",
       "    var fontsize = parameters.hasOwnProperty(\"fontsize\") ? parameters[\"fontsize\"] : 15;\n",
       "    fontsize = fontsize*10;\n",
       "    var lines = message.split('\\\\n');\n",
       "    var size = 512;\n",
       "    for(var i = 0; i<lines.length; i++){\n",
       "        var tmp = lines[i].length;\n",
       "        while(tmp*fontsize > size){\n",
       "           fontsize--;\n",
       "        }\n",
       "    }\n",
       "    \n",
       "    var canvas = document.createElement('canvas');\n",
       "    canvas.width = size;\n",
       "    canvas.height = size;\n",
       "    var context = canvas.getContext('2d');\n",
       "    context.fillStyle = \"rgba(255, 255, 255, 0)\";\n",
       "    context.fill();\n",
       "    context.font = fontsize + \"px \" + fontface;\n",
       "    \n",
       "    // text color\n",
       "    context.fillStyle = \"rgba(0, 0, 0, 1.0)\";\n",
       "     for(var i = 0; i<lines.length; i++){\n",
       "        context.fillText(lines[i], size/2, size/2+i*fontsize);\n",
       "     }\n",
       "    \n",
       "    // canvas contents will be used for a texture\n",
       "    var texture = new THREE.Texture(canvas);\n",
       "    texture.needsUpdate = true;\n",
       "    \n",
       "    var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 });\n",
       "    return spriteMaterial;\n",
       "}\n",
       "\n",
       "\n",
       "// ---------------------- INITIALIZING OBJECTS--------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function init_object(obj) {\n",
       "    if (obj.userData.hasOwnProperty(\"pointmaterial\")) {\n",
       "        init_points(obj);\n",
       "        modelContains.points = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"pointlabels\")) {\n",
       "        init_pointlabels(obj);\n",
       "        modelContains.pointlabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgematerial\")) {\n",
       "        init_lines(obj);\n",
       "        modelContains.lines = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgelabels\")) {\n",
       "        init_edgelabels(obj);\n",
       "        modelContains.edgelabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"arrowstyle\")) {\n",
       "        init_arrowheads(obj);\n",
       "        modelContains.arrowheads = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"facetmaterial\")) {\n",
       "        init_faces(obj);\n",
       "        modelContains.faces = true;\n",
       "    }\n",
       "}\n",
       "\n",
       "function init_points(obj) {\n",
       "    var pointgroup = new THREE.Group();\n",
       "    pointgroup.name = \"points\";\n",
       "    var points = obj.userData.points;\n",
       "    var radii = obj.userData.pointradii;\n",
       "    var materials = obj.userData.pointmaterial;\n",
       "    var geometry,material;\n",
       "    if (!Array.isArray(radii)) {\n",
       "        geometry = new THREE.SphereBufferGeometry(radii);  \n",
       "    }\n",
       "    if (!Array.isArray(materials)) {\n",
       "        material = materials;\n",
       "    }\n",
       "    for (var i=0; i<points.length; i++) {\n",
       "        var point = points[i];\n",
       "        if (Array.isArray(radii)) {\n",
       "            if (radii[i] == 0) {\n",
       "                continue;\n",
       "            }\n",
       "            geometry = new THREE.SphereBufferGeometry(radii[i]);  \n",
       "        } \n",
       "        if (Array.isArray(materials)) {\n",
       "            material = materials[i];     \n",
       "        } \n",
       "        var sphere = new THREE.Mesh(geometry, material);\n",
       "        point.addSphere(sphere);\n",
       "        pointgroup.add(sphere);\n",
       "    }\n",
       "    obj.add(pointgroup);\n",
       "}\n",
       "\n",
       "function init_pointlabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var labels = obj.userData.pointlabels;\n",
       "    var pointlabels = new THREE.Group();\n",
       "    pointlabels.name = \"pointlabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(pointlabels);\n",
       "}\n",
       "\n",
       "function init_lines(obj) {\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var points = obj.userData.points;\n",
       "    var materials = obj.userData.edgematerial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 );\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position', bufattr);\n",
       "    if (Array.isArray(materials)) {     \n",
       "        for (var i=0; i<materials.length; i++) {\n",
       "            geometry.addGroup(2*i,2,i);\n",
       "        }\n",
       "    }\n",
       "    var lines = new THREE.LineSegments(geometry, materials);\n",
       "    lines.name = \"lines\";\n",
       "    obj.add(lines);\n",
       "    updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "function init_edgelabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var labels = obj.userData.edgelabels;\n",
       "    var edgelabels = new THREE.Group();\n",
       "    edgelabels.name = \"edgelabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            edgelabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(edgelabels);\n",
       "}\n",
       "\n",
       "function init_arrowheads(obj) {\n",
       "    var arrowheads = new THREE.Group();\n",
       "    arrowheads.name = \"arrowheads\";\n",
       "    var arrowstyle = obj.userData.arrowstyle;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var edgematerials = obj.userData.edgematerial;\n",
       "    var points = obj.userData.points;\n",
       "    var material;\n",
       "    if (!Array.isArray(edgematerials)) {\n",
       "        material = new THREE.MeshBasicMaterial( {color: edgematerials.color} );\n",
       "    }\n",
       "\n",
       "    for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "        var start = points[edgeindices[i]];\n",
       "        var end = points[edgeindices[i+1]];\n",
       "        var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius();\n",
       "        if (dist <= 0) {\n",
       "            continue;\n",
       "        }\n",
       "        var dir = new THREE.Vector3().subVectors(end.vector,start.vector);\n",
       "        dir.normalize();\n",
       "        var axis = new THREE.Vector3().set(dir.z,0,-dir.x);\n",
       "        axis.normalize();\n",
       "        var radians = Math.acos( dir.y );\n",
       "        var radius = dist/25;\n",
       "        var height = dist/5;\n",
       "        var geometry = new THREE.ConeBufferGeometry(radius,height);\n",
       "        var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2));\n",
       "        if (Array.isArray(edgematerials)) {\n",
       "            material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} );\n",
       "        }\n",
       "        var cone = new THREE.Mesh( geometry, material );\n",
       "        cone.quaternion.setFromAxisAngle(axis,radians);;\n",
       "        cone.position.copy(position);;\n",
       "        arrowheads.add(cone);\n",
       "    }\n",
       "    obj.add(arrowheads);\n",
       "}\n",
       "\n",
       "function init_faces(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var facets = obj.userData.facets;\n",
       "    obj.userData.triangleindices = [];\n",
       "    for (var i=0; i<facets.length; i++) {\n",
       "        facet = facets[i];\n",
       "        for (var t=0; t<facet.length-2; t++) {\n",
       "            obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]);  \n",
       "        }\n",
       "    }\n",
       "    var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute(bufarr,3);\n",
       "    \n",
       "    var materials = obj.userData.facetmaterial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position',bufattr);\n",
       "    if (Array.isArray(materials)) {\n",
       "        var tricount = 0;\n",
       "        var facet;\n",
       "        for (var i=0; i<facets.length; i++) {\n",
       "            facet = facets[i];\n",
       "            geometry.addGroup(tricount,(facet.length-2)*3,i);\n",
       "            tricount += (facet.length-2)*3;\n",
       "        }\n",
       "    }\n",
       "    var mesh = new THREE.Mesh(geometry, materials);\n",
       "    mesh.name = \"faces\";\n",
       "    obj.add(mesh); \n",
       "    updateFacesPosition(obj);\n",
       "}\n",
       "// //INITIALIZING\n",
       "\n",
       "\n",
       "function updateFacesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.triangleindices;\n",
       "    var faces = obj.getObjectByName(\"faces\");\n",
       "    var ba = faces.geometry.getAttribute(\"position\");\n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    faces.geometry.attributes.position.needsUpdate = true;\n",
       "    \n",
       "}\n",
       "\n",
       "function updateEdgesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.edgeindices;\n",
       "    var lines = obj.getObjectByName(\"lines\");\n",
       "    var ba = lines.geometry.getAttribute(\"position\"); \n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    lines.geometry.attributes.position.needsUpdate = true;\n",
       "}\n",
       "\n",
       "function onWindowResize() {\n",
       "    renderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    svgRenderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "function updateCamera() {\n",
       "    var width = three.clientWidth;\n",
       "    var height = three.clientHeight;\n",
       "    var aspect = width / height;\n",
       "    if (camera.type == \"OrthographicCamera\") {\n",
       "        camera.left = frustumSize * aspect / - 2;\n",
       "        camera.right = frustumSize * aspect / 2;\n",
       "        camera.top = frustumSize / 2;\n",
       "        camera.bottom = - frustumSize / 2;\n",
       "    } else if (camera.type == \"PerspectiveCamera\") {\n",
       "        camera.aspect = aspect;\n",
       "    }\n",
       "    camera.updateProjectionMatrix();\n",
       "}\n",
       "\n",
       "function changeCamera(event) {\n",
       "    var selindex = event.currentTarget.selectedIndex;\n",
       "    camera = cameras[selindex];\n",
       "    control = controls[selindex];\n",
       "    control.enabled = true; \n",
       "    for (var i=0; i<controls.length; i++) {\n",
       "        if (i!=selindex) {\n",
       "            controls[i].enabled = false;\n",
       "        }\n",
       "    }\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "var camtypenode = document.getElementById('cameraType_5');\n",
       "camtypenode.onchange = changeCamera;\n",
       "camtypenode.dispatchEvent(new Event('change'));\n",
       "\n",
       "onWindowResize();\n",
       "window.addEventListener('resize', onWindowResize);\t\n",
       "\n",
       "\n",
       "var xRotationEnabled = false;\n",
       "var yRotationEnabled = false;\n",
       "var zRotationEnabled = false;\n",
       "var rotationSpeedFactor = 1;\n",
       "var settingsShown = false;\n",
       "var labelsShown = true;\n",
       "var intervals = [];\n",
       "var timeouts = [];\n",
       "var explodingSpeed = 0.05;\n",
       "var explodeScale = 0;\n",
       "var XMLS = new XMLSerializer();\n",
       "var svgElement;\n",
       "var renderId;\n",
       "\n",
       "var render = function () {\n",
       "\n",
       "\trenderId = requestAnimationFrame(render);\n",
       "\n",
       "//\tcomment in for automatic explosion\n",
       "//\texplode(updateFactor());\n",
       "\n",
       "    var phi = 0.02 * rotationSpeedFactor;\n",
       "\n",
       "    if (xRotationEnabled) {\n",
       "        scene.rotation.x += phi;\n",
       "    }\n",
       "    if (yRotationEnabled) {\n",
       "        scene.rotation.y += phi;\n",
       "    }\n",
       "    if (zRotationEnabled) {\n",
       "        scene.rotation.z += phi;\n",
       "    }\n",
       "\n",
       "    control.update();\n",
       "    renderer.render(scene, camera);\n",
       "};\n",
       "\n",
       "if ( THREE.WEBGL.isWebGLAvailable() ) {\n",
       "\trender();\n",
       "} else {\n",
       "\tvar warning = WEBGL.getWebGLErrorMessage();\n",
       "\tthree.appendChild( warning );\n",
       "}\n",
       "    \n",
       "function changeTransparency() {\n",
       "    var opacity = 1-Number(event.currentTarget.value);\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        child = scene.children[i];\n",
       "        if ( child.userData.hasOwnProperty(\"facetmaterial\") ) {\n",
       "            if (Array.isArray(child.userData.facetmaterial)) {\n",
       "                for (var j=0; j<child.userData.facetmaterial.length; j++) {\n",
       "                    child.userData.facetmaterial[j].opacity = opacity;\n",
       "                }\n",
       "            } else {\n",
       "                child.userData.facetmaterial.opacity = opacity;\n",
       "            }    \n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function changeRotationX(event){\n",
       "    xRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationY(event){\n",
       "    yRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationZ(event){\n",
       "    zRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "\n",
       "function changeRotationSpeedFactor(event){\n",
       "    rotationSpeedFactor = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function resetScene(){\n",
       "    scene.rotation.set(0,0,0);\n",
       "    camera.position.set(0,0,5);\n",
       "    camera.up.set(0,1,0);\n",
       "}\n",
       "\n",
       "function showSettings(event){\n",
       "    document.getElementById('settings_5').style.visibility = 'visible';\n",
       "    document.getElementById('showSettingsButton_5').style.visibility = 'hidden';\n",
       "    document.getElementById('hideSettingsButton_5').style.visibility = 'visible';\n",
       "    settingsShown = true;\n",
       "}\n",
       "\n",
       "function hideSettings(event){\n",
       "    document.getElementById('settings_5').style.visibility = 'hidden';\n",
       "    document.getElementById('showSettingsButton_5').style.visibility = 'visible';\n",
       "    document.getElementById('hideSettingsButton_5').style.visibility = 'hidden';\n",
       "    settingsShown = false;\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "var pos = 150* Math.PI;\n",
       "\n",
       "function updateFactor() {\n",
       "    pos++;\n",
       "    return Math.sin(.01*pos)+1;\n",
       "}\n",
       "\n",
       "// ------------------------ FOLDING ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "// rotate point p around axis defined by points p1 and p2 by given angle\n",
       "function rotate(p, p1, p2, angle ){   \n",
       "    angle = -angle;\n",
       "    var x = p.x, y = p.y, z = p.z, \n",
       "    a = p1.x, b = p1.y, c = p1.z, \n",
       "    u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z;\n",
       "    var result = [];\n",
       "    var L = u*u + v*v + w*w;\n",
       "    var sqrt = Math.sqrt;\n",
       "    var cos = Math.cos;\n",
       "    var sin = Math.sin;\n",
       "\n",
       "    result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L;\n",
       "    result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L;\n",
       "    result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L;\n",
       "\n",
       "    return result;\n",
       "}\n",
       "\n",
       "var fold = function(event){\n",
       "    var obj = foldables[Number(event.currentTarget.name)];\n",
       "    var foldvalue = Number(event.currentTarget.value);\n",
       "    var scale = foldvalue - obj.userData.oldscale;\n",
       "\n",
       "    for (var j=0; j<obj.userData.axes.length; j++) {\n",
       "        rotateVertices(obj, j, scale);\n",
       "    }\n",
       "    update(obj);\n",
       "    obj.userData.oldscale += scale;\n",
       "    lookAtBarycenter(obj);\n",
       "}\n",
       "\n",
       "function lookAtBarycenter(obj){\n",
       "    control.target = barycenter(obj);\n",
       "}\n",
       "\n",
       "function barycenter(obj) {\n",
       "    var center = new THREE.Vector3(0,0,0);\n",
       "    var points = obj.userData.points;\n",
       "    for (var i=0; i<points.length; i++){\n",
       "        center.add(points[i].vector);\n",
       "    }\n",
       "    center.divideScalar(points.length);\n",
       "    return center;\n",
       "}\n",
       "\n",
       "function rotateVertices(obj, edge, scale) {\n",
       "    var axes = obj.userData.axes;\n",
       "    var subtrees = obj.userData.subtrees;\n",
       "    var points = obj.userData.points;\n",
       "    var angles = obj.userData.angles;\n",
       "    if (edge < axes.length){\n",
       "        for (var j=0; j<subtrees[edge].length; j++){\n",
       "            var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge]));\n",
       "            points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]);\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function update(obj) {\n",
       "   updateFacesPosition(obj);\n",
       "   updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "if (foldables.length) {\n",
       "    var settings = document.getElementById('settings_5');\n",
       "    var foldDiv = document.createElement('div');\n",
       "    foldDiv.id = 'fold_5';\n",
       "    var title = document.createElement('strong');\n",
       "    title.innerHTML = 'Fold';\n",
       "    foldDiv.appendChild(title);\n",
       "    foldDiv.className = 'group';\n",
       "    for (var i=0; i<foldables.length; i++) {\n",
       "        var range = document.createElement('input');\n",
       "        range.type = 'range';\n",
       "        range.min = 0;\n",
       "        range.max = 1;\n",
       "        range.value = 0;\n",
       "        range.step = 0.001;\n",
       "        range.name = String(i);\n",
       "        range.oninput = fold;\n",
       "        foldDiv.appendChild(range);\n",
       "    }\n",
       "    lookAtBarycenter(foldables[0]);\n",
       "    settings.insertBefore(foldDiv,settings.childNodes[0]);\n",
       "}\n",
       "\n",
       "    \n",
       "// ---------------------- EXPLOSION ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "if (explodableModel) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        obj = scene.children[i];\n",
       "        if ( obj.userData.explodable ) {\n",
       "            computeCentroid(obj);\n",
       "        }\n",
       "    }\n",
       "    document.getElementById('explodeRange_5').oninput = triggerExplode;\n",
       "    document.getElementById('explodeCheckbox_5').onchange = triggerAutomaticExplode;\n",
       "    document.getElementById('explodingSpeedRange_5').oninput = setExplodingSpeed;\n",
       "}\n",
       "\n",
       "function computeCentroid(obj) {\n",
       "    centroid = new THREE.Vector3();\n",
       "    obj.userData.points.forEach(function(pmpoint) {\n",
       "        centroid.add(pmpoint.vector);\t\t\t\n",
       "    });\n",
       "    centroid.divideScalar(obj.userData.points.length);\n",
       "    obj.userData.centroid = centroid;\n",
       "}\n",
       "\n",
       "function explode(factor) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        var obj = scene.children[i];\n",
       "        if (obj.userData.hasOwnProperty(\"centroid\")) { \n",
       "            var c = obj.userData.centroid;\n",
       "            obj.position.set(c.x*factor, c.y*factor, c.z*factor);\n",
       "        }\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function triggerExplode(event){\n",
       "    explodeScale = Number(event.currentTarget.value);\n",
       "    explode(explodeScale);\n",
       "}\n",
       "\n",
       "function setExplodingSpeed(event){\n",
       "    explodingSpeed = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function triggerAutomaticExplode(event){\n",
       "    if (event.currentTarget.checked){\n",
       "        startExploding();\n",
       "    } else {\n",
       "        clearIntervals();\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function startExploding(){\n",
       "    intervals.push(setInterval(explodingInterval, 25));\n",
       "}\n",
       "\n",
       "\n",
       "function explodingInterval(){\n",
       "    explodeScale += explodingSpeed;\n",
       "    if (explodeScale <= 6){ \n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else{\n",
       "        explode(6);\n",
       "        explodeScale = 6;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startUnexploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_5').value = explodeScale;\n",
       "}\n",
       "\n",
       "\n",
       "function startUnexploding(){\n",
       "    intervals.push(setInterval(unexplodingInterval, 25));\n",
       "}\n",
       "\n",
       "function unexplodingInterval(){\n",
       "    explodeScale -= explodingSpeed;\n",
       "    if (explodeScale >= 0){\t\n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else {\n",
       "        explode(0);\n",
       "        explodeScale = 0;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startExploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_5').value = explodeScale;\n",
       "}\n",
       "\n",
       "function clearIntervals(){\n",
       "    intervals.forEach(function(interval){\n",
       "        clearInterval(interval);\n",
       "    });\n",
       "    intervals = [];\n",
       "    timeouts.forEach(function(timeout){\n",
       "        clearTimeout(timeout);\n",
       "    });\n",
       "    timeouts = [];\n",
       "}\n",
       "\n",
       "// ---------------------- DISPLAY --------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "const objectTypeInnerHTMLs = { points: \"Points\", pointlabels: \"Point labels\", lines: \"Edges\", edgelabels: \"Edge labels\", faces: \"Faces\", arrowheads: \"Arrow heads\" };\n",
       "const objectTypeVisible = {};\n",
       "Object.assign(objectTypeVisible,modelContains);\n",
       "const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort();\n",
       "const shownObjectTypesList = document.getElementById('shownObjectTypesList_5');\n",
       "\n",
       "function setVisibility(bool,objname) {\n",
       "    for (var i=0; i<scene.children.length; i++){\n",
       "        var obj = scene.children[i].getObjectByName(objname);\n",
       "        if (obj) {\n",
       "            obj.visible = bool;\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function toggleObjectTypeVisibility(event){\n",
       "    var name = event.currentTarget.name;\n",
       "    var checked = event.currentTarget.checked;\n",
       "    objectTypeVisible[name] = checked;\n",
       "    setVisibility(checked,name);\n",
       "}\n",
       "\n",
       "for (var i=0; i<sortedObjectTypeKeys.length; i++){\n",
       "    var key = sortedObjectTypeKeys[i];\n",
       "    if (modelContains[key]) {\n",
       "        var objTypeNode = document.createElement('span');\n",
       "        objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>';\n",
       "        var checkbox = document.createElement('input');\n",
       "        checkbox.type = 'checkbox';\n",
       "        checkbox.checked = true;\n",
       "        checkbox.name = key;\n",
       "        checkbox.onchange = toggleObjectTypeVisibility;\n",
       "        shownObjectTypesList.appendChild(checkbox);\n",
       "        shownObjectTypesList.appendChild(objTypeNode);\n",
       "    }\n",
       "}\n",
       "\n",
       "// ------------------------------------------------------\n",
       "\n",
       "function toggleObjectVisibility(event){\n",
       "    var nr = Number(event.currentTarget.name);\n",
       "    scene.children[nr].visible = event.currentTarget.checked;\n",
       "}\n",
       "\n",
       "// append checkboxes for displaying or hiding objects\n",
       "var shownObjectsList = document.getElementById('shownObjectsList_5');\n",
       "for (var i=0; i<scene.children.length; i++){\n",
       "    obj = scene.children[i];\n",
       "    var objNode = document.createElement('span');\n",
       "    objNode.innerHTML = obj.name + '<br>';\n",
       "    var checkbox = document.createElement('input');\n",
       "    checkbox.type = 'checkbox';\n",
       "    checkbox.checked = true;\n",
       "    checkbox.name = String(i);\n",
       "    checkbox.onchange = toggleObjectVisibility;\n",
       "    shownObjectsList.appendChild(checkbox);\n",
       "    shownObjectsList.appendChild(objNode);\n",
       "}\n",
       "\n",
       "// ---------------------- SVG ------------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function takeSvgScreenshot() {\n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(false,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(false,\"edgelabels\");\n",
       "    }\n",
       "    svgRenderer.render(scene,camera);\n",
       "    svgElement = XMLS.serializeToString(svgRenderer.domElement);\n",
       "    \n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(true,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(true,\"edgelabels\");\n",
       "    }\n",
       "\n",
       "    if (document.getElementById('tab_5').checked){\n",
       "        //show in new tab\n",
       "        var myWindow = window.open(\"\",\"\");\n",
       "        myWindow.document.body.innerHTML = svgElement;\n",
       "    } else{\n",
       "        // download svg file \n",
       "        download(\"screenshot.svg\", svgElement);\n",
       "    }\n",
       "}\n",
       "\n",
       "function download(filename, text) {\n",
       "    var element = document.createElement('a');\n",
       "    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));\n",
       "    element.setAttribute('download', filename);\n",
       "\n",
       "    element.style.display = 'none';\n",
       "    document.body.appendChild(element);\n",
       "\n",
       "    element.click();\n",
       "\n",
       "    document.body.removeChild(element);\n",
       "}\n",
       "\n",
       "\n",
       "document.getElementById('transparencyRange_5').oninput = changeTransparency;\n",
       "document.getElementById('changeRotationX_5').onchange = changeRotationX;\n",
       "document.getElementById('changeRotationY_5').onchange = changeRotationY;\n",
       "document.getElementById('changeRotationZ_5').onchange = changeRotationZ;\n",
       "document.getElementById('resetButton_5').onclick = resetScene;\n",
       "document.getElementById('rotationSpeedRange_5').oninput = changeRotationSpeedFactor;\n",
       "document.getElementById('takeScreenshot_5').onclick = takeSvgScreenshot;\n",
       "document.getElementById('showSettingsButton_5').onclick = showSettings;\n",
       "document.getElementById('hideSettingsButton_5').onclick = hideSettings;\n",
       "\n",
       "\n",
       "// ------------------ SHORTCUTS --------------------------------------------\n",
       "// -------------------------------------------------------------------------\n",
       "\n",
       "/**\n",
       " * http://www.openjs.com/scripts/events/keyboard_shortcuts/\n",
       " * Version : 2.01.B\n",
       " * By Binny V A\n",
       " * License : BSD\n",
       " */\n",
       "shortcut = {\n",
       "\t'all_shortcuts':{},//All the shortcuts are stored in this array\n",
       "\t'add': function(shortcut_combination,callback,opt) {\n",
       "\t\t//Provide a set of default options\n",
       "\t\tvar default_options = {\n",
       "\t\t\t'type':'keydown',\n",
       "\t\t\t'propagate':false,\n",
       "\t\t\t'disable_in_input':false,\n",
       "\t\t\t'target':document,\n",
       "\t\t\t'keycode':false\n",
       "\t\t}\n",
       "\t\tif(!opt) opt = default_options;\n",
       "\t\telse {\n",
       "\t\t\tfor(var dfo in default_options) {\n",
       "\t\t\t\tif(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\n",
       "\t\tvar ele = opt.target;\n",
       "\t\tif(typeof opt.target == 'string') ele = document.getElementById(opt.target);\n",
       "\t\tvar ths = this;\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\n",
       "\t\t//The function to be called at keypress\n",
       "\t\tvar func = function(e) {\n",
       "\t\t\te = e || window.event;\n",
       "\t\t\t\n",
       "\t\t\tif(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields\n",
       "\t\t\t\tvar element;\n",
       "\t\t\t\tif(e.target) element=e.target;\n",
       "\t\t\t\telse if(e.srcElement) element=e.srcElement;\n",
       "\t\t\t\tif(element.nodeType==3) element=element.parentNode;\n",
       "\n",
       "\t\t\t\tif(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\t//Find Which key is pressed\n",
       "\t\t\tif (e.keyCode) code = e.keyCode;\n",
       "\t\t\telse if (e.which) code = e.which;\n",
       "\t\t\tvar character = String.fromCharCode(code).toLowerCase();\n",
       "\t\t\t\n",
       "\t\t\tif(code == 188) character=\",\"; //If the user presses , when the type is onkeydown\n",
       "\t\t\tif(code == 190) character=\".\"; //If the user presses , when the type is onkeydown\n",
       "\n",
       "\t\t\tvar keys = shortcut_combination.split(\"+\");\n",
       "\t\t\t//Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked\n",
       "\t\t\tvar kp = 0;\n",
       "\t\t\t\n",
       "\t\t\t//Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken\n",
       "\t\t\tvar shift_nums = {\n",
       "\t\t\t\t\"`\":\"~\",\n",
       "\t\t\t\t\"1\":\"!\",\n",
       "\t\t\t\t\"2\":\"@\",\n",
       "\t\t\t\t\"3\":\"#\",\n",
       "\t\t\t\t\"4\":\"$\",\n",
       "\t\t\t\t\"5\":\"%\",\n",
       "\t\t\t\t\"6\":\"^\",\n",
       "\t\t\t\t\"7\":\"&\",\n",
       "\t\t\t\t\"8\":\"*\",\n",
       "\t\t\t\t\"9\":\"(\",\n",
       "\t\t\t\t\"0\":\")\",\n",
       "\t\t\t\t\"-\":\"_\",\n",
       "\t\t\t\t\"=\":\"+\",\n",
       "\t\t\t\t\";\":\":\",\n",
       "\t\t\t\t\"'\":\"\\\"\",\n",
       "\t\t\t\t\",\":\"<\",\n",
       "\t\t\t\t\".\":\">\",\n",
       "\t\t\t\t\"/\":\"?\",\n",
       "\t\t\t\t\"\\\\\":\"|\"\n",
       "\t\t\t}\n",
       "\t\t\t//Special Keys - and their codes\n",
       "\t\t\tvar special_keys = {\n",
       "\t\t\t\t'esc':27,\n",
       "\t\t\t\t'escape':27,\n",
       "\t\t\t\t'tab':9,\n",
       "\t\t\t\t'space':32,\n",
       "\t\t\t\t'return':13,\n",
       "\t\t\t\t'enter':13,\n",
       "\t\t\t\t'backspace':8,\n",
       "\t\n",
       "\t\t\t\t'scrolllock':145,\n",
       "\t\t\t\t'scroll_lock':145,\n",
       "\t\t\t\t'scroll':145,\n",
       "\t\t\t\t'capslock':20,\n",
       "\t\t\t\t'caps_lock':20,\n",
       "\t\t\t\t'caps':20,\n",
       "\t\t\t\t'numlock':144,\n",
       "\t\t\t\t'num_lock':144,\n",
       "\t\t\t\t'num':144,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pause':19,\n",
       "\t\t\t\t'break':19,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'insert':45,\n",
       "\t\t\t\t'home':36,\n",
       "\t\t\t\t'delete':46,\n",
       "\t\t\t\t'end':35,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pageup':33,\n",
       "\t\t\t\t'page_up':33,\n",
       "\t\t\t\t'pu':33,\n",
       "\t\n",
       "\t\t\t\t'pagedown':34,\n",
       "\t\t\t\t'page_down':34,\n",
       "\t\t\t\t'pd':34,\n",
       "\t\n",
       "\t\t\t\t'left':37,\n",
       "\t\t\t\t'up':38,\n",
       "\t\t\t\t'right':39,\n",
       "\t\t\t\t'down':40,\n",
       "\t\n",
       "\t\t\t\t'f1':112,\n",
       "\t\t\t\t'f2':113,\n",
       "\t\t\t\t'f3':114,\n",
       "\t\t\t\t'f4':115,\n",
       "\t\t\t\t'f5':116,\n",
       "\t\t\t\t'f6':117,\n",
       "\t\t\t\t'f7':118,\n",
       "\t\t\t\t'f8':119,\n",
       "\t\t\t\t'f9':120,\n",
       "\t\t\t\t'f10':121,\n",
       "\t\t\t\t'f11':122,\n",
       "\t\t\t\t'f12':123\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\tvar modifiers = { \n",
       "\t\t\t\tshift: { wanted:false, pressed:false},\n",
       "\t\t\t\tctrl : { wanted:false, pressed:false},\n",
       "\t\t\t\talt  : { wanted:false, pressed:false},\n",
       "\t\t\t\tmeta : { wanted:false, pressed:false}\t//Meta is Mac specific\n",
       "\t\t\t};\n",
       "                        \n",
       "\t\t\tif(e.ctrlKey)\tmodifiers.ctrl.pressed = true;\n",
       "\t\t\tif(e.shiftKey)\tmodifiers.shift.pressed = true;\n",
       "\t\t\tif(e.altKey)\tmodifiers.alt.pressed = true;\n",
       "\t\t\tif(e.metaKey)   modifiers.meta.pressed = true;\n",
       "                        \n",
       "\t\t\tfor(var i=0; k=keys[i],i<keys.length; i++) {\n",
       "\t\t\t\t//Modifiers\n",
       "\t\t\t\tif(k == 'ctrl' || k == 'control') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.ctrl.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'shift') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.shift.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'alt') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.alt.wanted = true;\n",
       "\t\t\t\t} else if(k == 'meta') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.meta.wanted = true;\n",
       "\t\t\t\t} else if(k.length > 1) { //If it is a special key\n",
       "\t\t\t\t\tif(special_keys[k] == code) kp++;\n",
       "\t\t\t\t\t\n",
       "\t\t\t\t} else if(opt['keycode']) {\n",
       "\t\t\t\t\tif(opt['keycode'] == code) kp++;\n",
       "\n",
       "\t\t\t\t} else { //The special keys did not match\n",
       "\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\telse {\n",
       "\t\t\t\t\t\tif(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase\n",
       "\t\t\t\t\t\t\tcharacter = shift_nums[character]; \n",
       "\t\t\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\t\t}\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t\t\n",
       "\t\t\tif(kp == keys.length && \n",
       "\t\t\t\t\t\tmodifiers.ctrl.pressed == modifiers.ctrl.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.shift.pressed == modifiers.shift.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.alt.pressed == modifiers.alt.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.meta.pressed == modifiers.meta.wanted) {\n",
       "\t\t\t\tcallback(e);\n",
       "\t\n",
       "\t\t\t\tif(!opt['propagate']) { //Stop the event\n",
       "\t\t\t\t\t//e.cancelBubble is supported by IE - this will kill the bubbling process.\n",
       "\t\t\t\t\te.cancelBubble = true;\n",
       "\t\t\t\t\te.returnValue = false;\n",
       "\t\n",
       "\t\t\t\t\t//e.stopPropagation works in Firefox.\n",
       "\t\t\t\t\tif (e.stopPropagation) {\n",
       "\t\t\t\t\t\te.stopPropagation();\n",
       "\t\t\t\t\t\te.preventDefault();\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t\treturn false;\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\t\tthis.all_shortcuts[shortcut_combination] = {\n",
       "\t\t\t'callback':func, \n",
       "\t\t\t'target':ele, \n",
       "\t\t\t'event': opt['type']\n",
       "\t\t};\n",
       "\t\t//Attach the function with the event\n",
       "\t\tif(ele.addEventListener) ele.addEventListener(opt['type'], func, false);\n",
       "\t\telse if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);\n",
       "\t\telse ele['on'+opt['type']] = func;\n",
       "\t},\n",
       "\n",
       "\t//Remove the shortcut - just specify the shortcut and I will remove the binding\n",
       "\t'remove':function(shortcut_combination) {\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\t\tvar binding = this.all_shortcuts[shortcut_combination];\n",
       "\t\tdelete(this.all_shortcuts[shortcut_combination])\n",
       "\t\tif(!binding) return;\n",
       "\t\tvar type = binding['event'];\n",
       "\t\tvar ele = binding['target'];\n",
       "\t\tvar callback = binding['callback'];\n",
       "\n",
       "\t\tif(ele.detachEvent) ele.detachEvent('on'+type, callback);\n",
       "\t\telse if(ele.removeEventListener) ele.removeEventListener(type, callback, false);\n",
       "\t\telse ele['on'+type] = false;\n",
       "\t}\n",
       "}\n",
       "\n",
       "shortcut.add(\"Alt+Left\",function() {\n",
       "\tvar event = new Event('click');\n",
       "\tif (settingsShown){\n",
       "\t\tdocument.getElementById('hideSettingsButton_5').dispatchEvent(event);\n",
       "\t} else {\n",
       "\t\tdocument.getElementById('showSettingsButton_5').dispatchEvent(event);\n",
       "\t}\n",
       "});\n",
       "\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "});});\n",
       "      </script>\n",
       "   </body>\n",
       "</html>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "$qFrame = pcom_common_ref($bPolytope->BOUNDED_COMPLEX,$TQuadric->affine_chart);\n",
    "$cFrame = pcom_common_ref($bPolytope->BOUNDED_COMPLEX,$TCubic->affine_chart);\n",
    "$qFrame->VISUAL; # visualizing frames\n",
    "$cFrame->VISUAL;"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "These frames can be exported into separate models"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "x3d($qFrame->VISUAL($curve_opts),File=>$x3d_dir.\"QuadricFrame.x3d\"); # exporting frames\n",
    "x3d($cFrame->VISUAL($curve_opts),File=>$x3d_dir.\"CubicFrame.x3d\");"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Tropical curves on tropical surfaces\n",
    "\n",
    "3d-printing tropical curves on tropical surfaces is only minimally more involved than creating individual curves and surfaces. One straighforward way is to follow the previous tutorials for surfaces and curves while making sure that:\n",
    "\n",
    "1. the curve is well visible, i.e., that the curve is sufficiently thick,\n",
    "2. both curve and surface share the same bounding box.\n",
    "\n",
    "Below we show a more involved way, which leads to a better final model. In this example we will employ a boolean intersection modifier to the curve in blender and the model will end up with the exact same dimensions as the bounding cube."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Step 0: preparations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "$surface_opts = {VertexStyle=>'hidden',EdgeStyle=>'hidden'};\n",
    "\n",
    "$total_mm = 100; #planned size of the model   \n",
    "$curve_mm = 3;   #desired edge diameter\n",
    "$surface_mm = 2;  #desired surface thickness (for solidfying in polymake)\n",
    "$surface_abs = $surface_mm * $diam/$total_mm;\n",
    "$curve_diam = $curve_mm * $diam/$total_mm;\n",
    "$surface_opts = {VertexStyle=>'hidden',EdgeStyle=>'hidden'}; # hide vertex and edge labels\n",
    "$curve_opts = x3dprint_curve_opts($curve_diam,$edges_diam);\n",
    "\n",
    "$bFacets = polytope::bounding_box_facets($TCubic->affine_chart->VERTICES,offset=>1,surplus_k=>0.4, make_cube=>1);\n",
    "$diam = $bFacets->[0]->[0] + $bFacets->[1]->[0]; # diameter of the bounding box "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Export the solidified cubic, the bounding cube"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "$bPolytope = new polytope::Polytope(FACETS=>$bFacets);\n",
    "x3d(compose($bPolytope->VISUAL($surface_opts)),File=>$x3d_dir.\"BoundingCube.x3d\");\n",
    "\n",
    "$solidifiedCubicCells = solidify_2d_pcom($TCubic->affine_chart,$surface_abs);\n",
    "@solidifiedCubicCellsVis = map { $_->VISUAL($surface_opts,BoundingFacets=>$bFacets) } @$solidifiedCubicCells;\n",
    "x3d(compose(@solidifiedCubicCellsVis),File=>$x3d_dir.\"TCubicSolidified.x3d\");"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    " and the sextic curve with a bigger bounding box"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<!--\n",
       "polymake for knusper\n",
       "Thu Aug 27 10:34:51 2020\n",
       "_bounded\n",
       "-->\n",
       "\n",
       "\n",
       "<html>\n",
       "   <head>\n",
       "      <meta charset=utf-8>\n",
       "      <title>_bounded</title>\n",
       "      <style>\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "*/\n",
       "         html {overflow: scroll;}\n",
       "         strong{font-size: 18px;}\n",
       "         canvas { z-index: 8; }\n",
       "         input[type='radio'] {margin-left:0;}\n",
       "         input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;}\n",
       "         .group{padding-bottom: 15px;}\n",
       "         .settings * {z-index: 11; }\n",
       "         .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;}\n",
       "         .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} \n",
       "         .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;}\n",
       "         .showSettingsButton{visibility: visible; z-index: 12; position: absolute }\n",
       "         .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5}\n",
       "         button{margin-left: 0; margin-top: 10px}\n",
       "         img{cursor: pointer;}\n",
       "         .suboption{padding-top: 15px;}\n",
       "         #model67709558610 { width: 100%; height: 100%; }\n",
       "         .threejs_container { width: 100%; height: 75vh;}\n",
       "         .settings{max-height: 74vh} \n",
       "         input[type=range] {\n",
       "           -webkit-appearance: none;\n",
       "           padding:0; \n",
       "           width:90%; \n",
       "           margin-left: auto;\n",
       "           margin-right: auto;\n",
       "           margin-top: 15px;\n",
       "           margin-bottom: 15px;\n",
       "           display: block;\t\n",
       "         }\n",
       "         input[type=range]:focus {\n",
       "           outline: none;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-runnable-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-webkit-slider-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "           -webkit-appearance: none;\n",
       "           margin-top: -5px;\n",
       "         }\n",
       "         input[type=range]:focus::-webkit-slider-runnable-track {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]::-moz-range-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "           background: #E3E3E3;\n",
       "           border-radius: 0px;\n",
       "           border: 0px solid #000000;\n",
       "         }\n",
       "         input[type=range]::-moz-range-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]::-ms-track {\n",
       "           height: 4px;\n",
       "           cursor: pointer;\n",
       "           animate: 0.2s;\n",
       "           background: transparent;\n",
       "           border-color: transparent;\n",
       "           color: transparent;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "           border: 0px solid #000000;\n",
       "           border-radius: 0px;\n",
       "           box-shadow: 0px 0px 0px #000000;\n",
       "         }\n",
       "         input[type=range]::-ms-thumb {\n",
       "           box-shadow: 1px 1px 2px #B8B8B8;\n",
       "           border: 1px solid #ABABAB;\n",
       "           height: 13px;\n",
       "           width: 25px;\n",
       "           border-radius: 20px;\n",
       "           background: #E0E0E0;\n",
       "           cursor: pointer;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-lower {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "         input[type=range]:focus::-ms-fill-upper {\n",
       "           background: #E3E3E3;\n",
       "         }\n",
       "/*\n",
       "// COMMON_CODE_BLOCK_END\n",
       "*/\n",
       "\t\t</style>\n",
       "   </head>\n",
       "<body>\n",
       "   <div class='threejs_container'>\n",
       "\t\t<div id='settings_6' class='settings'>\n",
       "\t\t\t<div class=group id='explode_6'>\n",
       "\t\t\t\t<strong>Explode</strong>\n",
       "\t\t\t\t<input id='explodeRange_6' type='range' min=0 max=6 step=0.01 value=0>\n",
       "\t\t\t\t<div class=indented><input id='explodeCheckbox_6' type='checkbox'>Automatic explosion</div>\n",
       "\t\t\t\t<div class=suboption>Exploding speed</div>\n",
       "\t\t\t\t<input id='explodingSpeedRange_6' type='range' min=0 max=0.5 step=0.001 value=0.05>\n",
       "\t\t\t</div>\n",
       "\t\n",
       "\t\t\t<div class=group id='transparency_6' class='transparency'>\n",
       "\t\t\t\t<strong>Transparency</strong>\n",
       "\t\t\t\t<input id='transparencyRange_6' type='range' min=0 max=1 step=0.01 value=0>\n",
       "\t\t\t</div>\n",
       "\t\t\t\n",
       "\t\t\t<div class=group id='rotation_6'>\n",
       "\t\t\t\t<strong>Rotation</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationX_6'> x-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationY_6'> y-axis</div>\n",
       "\t\t\t\t\t<div><input type='checkbox' id='changeRotationZ_6'> z-axis</div>\n",
       "\t\t\t\t\t<button id='resetButton_6'>Reset</button>\n",
       "\t\t\t\t</div>\n",
       "\n",
       "\t\t\t\t<div class=suboption>Rotation speed</div>\n",
       "\t\t\t\t<input id='rotationSpeedRange_6' type='range' min=0 max=5 step=0.01 value=2>\n",
       "\t\t\t</div>\n",
       "\n",
       "\n",
       "\t\t\t<div class=group id='display_6'>\n",
       "\t\t\t\t<strong>Display</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<div id='shownObjectTypesList_6' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t\t<div class=suboption>Objects</div>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t   <div id='shownObjectsList_6' class='shownObjectsList'></div>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "         \n",
       "         <div class=group id='camera_6'>\n",
       "            <strong>Camera</strong>\n",
       "            <div class=indented>\n",
       "               <form>\n",
       "                  <select id=\"cameraType_6\">\n",
       "                     <option value='perspective' selected> Perspective<br></option>\n",
       "                     <option value='orthographic' > Orthographic<br></option>\n",
       "                  </select>\n",
       "               </form>\n",
       "            </div>\n",
       "         </div>\n",
       "\n",
       "\t\t\t<div class=group id='svg_6'>\n",
       "\t\t\t\t<strong>SVG</strong>\n",
       "\t\t\t\t<div class=indented>\n",
       "\t\t\t\t\t<form>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='download' id='download_6' checked> Download<br>\n",
       "\t\t\t\t\t\t<input type=\"radio\" name='screenshotMode' value='tab' id='tab_6' > New tab<br>\n",
       "\t\t\t\t\t</form>\n",
       "\t\t\t\t\t<button id='takeScreenshot_6'>Screenshot</button>\n",
       "\t\t\t\t</div>\n",
       "\t\t\t</div>\n",
       "\n",
       "\t\t</div>\t<!-- end of settings -->\n",
       "\t\t<img id='hideSettingsButton_6' class='hideSettingsButton' src='/kernelspecs/polymake/close.svg' width=20px\">\n",
       "\t\t<img id='showSettingsButton_6' class='showSettingsButton' src='/kernelspecs/polymake/menu.svg' width=20px\">\n",
       "<div id=\"model67709558610\"></div>\n",
       "</div>\n",
       "   <script>\n",
       "    requirejs.config({\n",
       "      paths: {\n",
       "        three: '/kernelspecs/polymake/three',\n",
       "        TrackballControls: '/kernelspecs/polymake/TrackballControls',\n",
       "        OrbitControls: '/kernelspecs/polymake/OrbitControls',\n",
       "        Projector: '/kernelspecs/polymake/Projector',\n",
       "        SVGRenderer: '/kernelspecs/polymake/SVGRenderer',\n",
       "        WEBGL: '/kernelspecs/polymake/WebGL',\n",
       "      },\n",
       "      shim: {\n",
       "        'three': { exports: 'THREE'},\n",
       "        'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' },\n",
       "        'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' },\n",
       "        'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' },\n",
       "        'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' },\n",
       "        'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' },\n",
       "      }\n",
       "    });\n",
       "    \n",
       "    require(['three'],function(THREE){\n",
       "        window.THREE = THREE;\n",
       "      require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'],\n",
       "               function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) {\n",
       "    THREE.TrackballControls = TrackballControls;\n",
       "    THREE.OrbitControls = OrbitControls;\n",
       "    THREE.Projector = Projector;\n",
       "    THREE.SVGRenderer = SVGRenderer;\n",
       "    THREE.WEBGL = WEBGL;\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "\n",
       "const intervalLength = 25; // for automatic animations\n",
       "const explodableModel = true; \n",
       "const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false };\n",
       "const foldables = [];\n",
       "\n",
       "var three = document.getElementById(\"model67709558610\");\n",
       "var scene = new THREE.Scene();\n",
       "var renderer = new THREE.WebGLRenderer( { antialias: true } );\n",
       "var svgRenderer = new THREE.SVGRenderer( { antialias: true } );\n",
       "renderer.setPixelRatio( window.devicePixelRatio );\n",
       "renderer.setClearColor(0xFFFFFF, 1);\n",
       "svgRenderer.setClearColor(0xFFFFFF, 1);\n",
       "three.appendChild(renderer.domElement);\n",
       "\n",
       "var frustumSize = 4;\n",
       "var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()];\n",
       "cameras.forEach(function(cam) {\n",
       "    cam.position.set(0, 0, 5);\n",
       "    cam.lookAt(0, 0, 0);  \n",
       "    cam.up.set(0, 1, 0);         \n",
       "});\n",
       "var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)];\n",
       "var camera, control;\n",
       "\n",
       "controls[0].zoomSpeed = 0.2;\n",
       "controls[0].rotateSpeed = 4;\n",
       "\n",
       "\n",
       "// class to allow move points together with labels and spheres\n",
       "var PMPoint = function (x,y,z) {\n",
       "   this.vector = new THREE.Vector3(x,y,z);\n",
       "   this.sprite = null;\n",
       "   this.sphere = null;\n",
       "}\n",
       "PMPoint.prototype.addLabel = function(labelsprite) {\n",
       "   this.sprite = labelsprite;\n",
       "   this.sprite.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.addSphere = function(spheremesh) {\n",
       "   this.sphere = spheremesh;\n",
       "   this.sphere.position.copy(this.vector);\n",
       "}\n",
       "PMPoint.prototype.set = function(x,y,z) {\n",
       "   this.vector.set(x,y,z);\n",
       "   if (this.sprite) {\n",
       "      this.sprite.position.copy(this.vector);\n",
       "   }\n",
       "   if (this.sphere) {\n",
       "      this.sphere.position.copy(this.vector);\n",
       "   }\n",
       "}\n",
       "PMPoint.prototype.radius = function() {\n",
       "   if (this.sphere) {\n",
       "      return this.sphere.geometry.parameters.radius;\n",
       "   } else {\n",
       "      return 0;\n",
       "   }\n",
       "};\n",
       "// select the target node\n",
       "var target = document.querySelector('#model67709558610');\n",
       "\n",
       "// create an observer instance\n",
       "var observer = new MutationObserver(function(mutations) {\n",
       "   mutations.forEach(function(mutation) {\n",
       "      if (mutation.removedNodes && mutation.removedNodes.length > 0) {\n",
       "         cancelAnimationFrame(renderId);\n",
       "         observer.disconnect();\n",
       "         console.log(\"cancelled frame \"+renderId);\n",
       "      }\n",
       "   });\n",
       "});\n",
       "\n",
       "// configuration of the observer:\n",
       "var config = { childList: true, characterData: true }\n",
       "\n",
       "// pass in the target node, as well as the observer options\n",
       "while (target) {\n",
       "   if (target.className==\"output\") {\n",
       "      observer.observe(target, config);\n",
       "      break;\n",
       "   }\n",
       "   target = target.parentNode;\n",
       "}\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "var obj0 = new THREE.Object3D();\n",
       "obj0.name = \"unnamed__1\";\n",
       "obj0.userData.explodable = 1;\n",
       "obj0.userData.points = [];\n",
       "obj0.userData.points.push(new PMPoint(-1, -0.0544472, 0.0544472));\n",
       "obj0.userData.points.push(new PMPoint(-1, 0.0544472, -0.0544472));\n",
       "obj0.userData.points.push(new PMPoint(0, -0.0544472, 0.0544472));\n",
       "obj0.userData.points.push(new PMPoint(0, 0.0544472, -0.0544472));\n",
       "obj0.userData.points.push(new PMPoint(0, 0.945553, 1.05445));\n",
       "obj0.userData.points.push(new PMPoint(0, 1.05445, 0.945553));\n",
       "obj0.userData.points.push(new PMPoint(1, 0.945553, 1.05445));\n",
       "obj0.userData.points.push(new PMPoint(1, 1.05445, 0.945553));\n",
       "\n",
       "obj0.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 0, 4, 1, 5, 4, 5, 2, 6, 4, 6, 3, 7, 5, 7, 6, 7];\n",
       "obj0.userData.facets = [[0, 2, 6, 4], [3, 2, 0, 1], [0, 4, 5, 1], [7, 3, 1, 5], [6, 2, 3, 7], [4, 6, 7, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj0.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj0);\n",
       "scene.add(obj0);\n",
       "\n",
       "var obj1 = new THREE.Object3D();\n",
       "obj1.name = \"unnamed__2\";\n",
       "obj1.userData.explodable = 1;\n",
       "obj1.userData.points = [];\n",
       "obj1.userData.points.push(new PMPoint(0.945553, 0, 1.05445));\n",
       "obj1.userData.points.push(new PMPoint(1.05445, 0, 0.945553));\n",
       "obj1.userData.points.push(new PMPoint(-0.0544472, 0, 0.0544472));\n",
       "obj1.userData.points.push(new PMPoint(0.0544472, 0, -0.0544472));\n",
       "obj1.userData.points.push(new PMPoint(-0.0544472, -1, 0.0544472));\n",
       "obj1.userData.points.push(new PMPoint(0.0544472, -1, -0.0544472));\n",
       "obj1.userData.points.push(new PMPoint(0.945553, 1, 1.05445));\n",
       "obj1.userData.points.push(new PMPoint(1.05445, 1, 0.945553));\n",
       "\n",
       "obj1.userData.edgeindices = [0, 1, 2, 3, 0, 4, 2, 4, 1, 5, 3, 5, 4, 5, 0, 6, 2, 6, 1, 7, 3, 7, 6, 7];\n",
       "obj1.userData.facets = [[4, 5, 1, 0], [3, 5, 4, 2], [4, 0, 6, 2], [7, 3, 2, 6], [1, 5, 3, 7], [0, 1, 7, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj1.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj1);\n",
       "scene.add(obj1);\n",
       "\n",
       "var obj2 = new THREE.Object3D();\n",
       "obj2.name = \"unnamed__3\";\n",
       "obj2.userData.explodable = 1;\n",
       "obj2.userData.points = [];\n",
       "obj2.userData.points.push(new PMPoint(-0.0544472, 0.0544472, -1));\n",
       "obj2.userData.points.push(new PMPoint(0.0544472, -0.0544472, -1));\n",
       "obj2.userData.points.push(new PMPoint(-0.0544472, 0.0544472, 0));\n",
       "obj2.userData.points.push(new PMPoint(0.0544472, -0.0544472, 0));\n",
       "obj2.userData.points.push(new PMPoint(0.945553, 1.05445, 0));\n",
       "obj2.userData.points.push(new PMPoint(1.05445, 0.945553, 0));\n",
       "obj2.userData.points.push(new PMPoint(0.945553, 1.05445, 1));\n",
       "obj2.userData.points.push(new PMPoint(1.05445, 0.945553, 1));\n",
       "\n",
       "obj2.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 0, 4, 1, 5, 4, 5, 2, 6, 4, 6, 3, 7, 5, 7, 6, 7];\n",
       "obj2.userData.facets = [[1, 0, 4, 5], [2, 0, 1, 3], [4, 0, 2, 6], [6, 2, 3, 7], [1, 5, 7, 3], [5, 4, 6, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj2.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj2);\n",
       "scene.add(obj2);\n",
       "\n",
       "var obj3 = new THREE.Object3D();\n",
       "obj3.name = \"unnamed__4\";\n",
       "obj3.userData.explodable = 1;\n",
       "obj3.userData.points = [];\n",
       "obj3.userData.points.push(new PMPoint(-1, 0, 0.077));\n",
       "obj3.userData.points.push(new PMPoint(-1, 0, -0.077));\n",
       "obj3.userData.points.push(new PMPoint(0, 0, 0.077));\n",
       "obj3.userData.points.push(new PMPoint(0, 0, -0.077));\n",
       "obj3.userData.points.push(new PMPoint(-1, -1, 0.077));\n",
       "obj3.userData.points.push(new PMPoint(-1, -1, -0.077));\n",
       "obj3.userData.points.push(new PMPoint(0, -1, 0.077));\n",
       "obj3.userData.points.push(new PMPoint(0, -1, -0.077));\n",
       "\n",
       "obj3.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 0, 4, 1, 5, 4, 5, 2, 6, 4, 6, 3, 7, 5, 7, 6, 7];\n",
       "obj3.userData.facets = [[5, 1, 3, 7], [0, 1, 5, 4], [5, 7, 6, 4], [2, 0, 4, 6], [3, 1, 0, 2], [7, 3, 2, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj3.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj3);\n",
       "scene.add(obj3);\n",
       "\n",
       "var obj4 = new THREE.Object3D();\n",
       "obj4.name = \"unnamed__5\";\n",
       "obj4.userData.explodable = 1;\n",
       "obj4.userData.points = [];\n",
       "obj4.userData.points.push(new PMPoint(-1, 0.077, 0));\n",
       "obj4.userData.points.push(new PMPoint(-1, -0.077, 0));\n",
       "obj4.userData.points.push(new PMPoint(0, 0.077, -1));\n",
       "obj4.userData.points.push(new PMPoint(0, -0.077, -1));\n",
       "obj4.userData.points.push(new PMPoint(-1, 0.077, -1));\n",
       "obj4.userData.points.push(new PMPoint(-1, -0.077, -1));\n",
       "obj4.userData.points.push(new PMPoint(0, 0.077, 0));\n",
       "obj4.userData.points.push(new PMPoint(0, -0.077, 0));\n",
       "\n",
       "obj4.userData.edgeindices = [0, 1, 2, 3, 0, 4, 2, 4, 1, 5, 3, 5, 4, 5, 0, 6, 2, 6, 1, 7, 3, 7, 6, 7];\n",
       "obj4.userData.facets = [[5, 4, 2, 3], [0, 4, 5, 1], [5, 3, 7, 1], [6, 0, 1, 7], [2, 4, 0, 6], [3, 2, 6, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj4.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj4);\n",
       "scene.add(obj4);\n",
       "\n",
       "var obj5 = new THREE.Object3D();\n",
       "obj5.name = \"unnamed__6\";\n",
       "obj5.userData.explodable = 1;\n",
       "obj5.userData.points = [];\n",
       "obj5.userData.points.push(new PMPoint(0.077, 0, -1));\n",
       "obj5.userData.points.push(new PMPoint(-0.077, 0, -1));\n",
       "obj5.userData.points.push(new PMPoint(0.077, 0, 0));\n",
       "obj5.userData.points.push(new PMPoint(-0.077, 0, 0));\n",
       "obj5.userData.points.push(new PMPoint(0.077, -1, -1));\n",
       "obj5.userData.points.push(new PMPoint(-0.077, -1, -1));\n",
       "obj5.userData.points.push(new PMPoint(0.077, -1, 0));\n",
       "obj5.userData.points.push(new PMPoint(-0.077, -1, 0));\n",
       "\n",
       "obj5.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 0, 4, 1, 5, 4, 5, 2, 6, 4, 6, 3, 7, 5, 7, 6, 7];\n",
       "obj5.userData.facets = [[5, 1, 0, 4], [3, 1, 5, 7], [5, 4, 6, 7], [2, 3, 7, 6], [0, 1, 3, 2], [4, 0, 2, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj5.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj5);\n",
       "scene.add(obj5);\n",
       "\n",
       "var obj6 = new THREE.Object3D();\n",
       "obj6.name = \"_bounded\";\n",
       "obj6.userData.explodable = 1;\n",
       "obj6.userData.points = [];\n",
       "obj6.userData.points.push(new PMPoint(2.077, 4.6, 2));\n",
       "obj6.userData.points.push(new PMPoint(1.923, 4.6, 2));\n",
       "obj6.userData.points.push(new PMPoint(1.923, 2, 2));\n",
       "obj6.userData.points.push(new PMPoint(2.077, 2, 2));\n",
       "obj6.userData.points.push(new PMPoint(1.923, 2, 4.6));\n",
       "obj6.userData.points.push(new PMPoint(2.077, 2, 4.6));\n",
       "obj6.userData.points.push(new PMPoint(1.923, 4.6, 4.6));\n",
       "obj6.userData.points.push(new PMPoint(2.077, 4.6, 4.6));\n",
       "\n",
       "obj6.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj6.userData.facets = [[5, 3, 0, 7], [1, 2, 4, 6], [2, 3, 5, 4], [0, 3, 2, 1], [7, 0, 1, 6], [5, 7, 6, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj6.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj6);\n",
       "scene.add(obj6);\n",
       "\n",
       "var obj7 = new THREE.Object3D();\n",
       "obj7.name = \"_bounded\";\n",
       "obj7.userData.explodable = 1;\n",
       "obj7.userData.points = [];\n",
       "obj7.userData.points.push(new PMPoint(0, 1.077, 1));\n",
       "obj7.userData.points.push(new PMPoint(1, 1.077, 1));\n",
       "obj7.userData.points.push(new PMPoint(0, 0.923, 1));\n",
       "obj7.userData.points.push(new PMPoint(1, 0.923, 1));\n",
       "obj7.userData.points.push(new PMPoint(1, 0.923, 4.6));\n",
       "obj7.userData.points.push(new PMPoint(0, 0.923, 4.6));\n",
       "obj7.userData.points.push(new PMPoint(1, 1.077, 4.6));\n",
       "obj7.userData.points.push(new PMPoint(0, 1.077, 4.6));\n",
       "\n",
       "obj7.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 3, 4, 2, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj7.userData.facets = [[5, 2, 3, 4], [0, 2, 5, 7], [1, 0, 7, 6], [4, 3, 1, 6], [3, 2, 0, 1], [5, 4, 6, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj7.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj7);\n",
       "scene.add(obj7);\n",
       "\n",
       "var obj8 = new THREE.Object3D();\n",
       "obj8.name = \"_bounded\";\n",
       "obj8.userData.explodable = 1;\n",
       "obj8.userData.points = [];\n",
       "obj8.userData.points.push(new PMPoint(0, 1, 1.077));\n",
       "obj8.userData.points.push(new PMPoint(1, 1, 1.077));\n",
       "obj8.userData.points.push(new PMPoint(0, 1, 0.923));\n",
       "obj8.userData.points.push(new PMPoint(1, 1, 0.923));\n",
       "obj8.userData.points.push(new PMPoint(1, 4.6, 0.923));\n",
       "obj8.userData.points.push(new PMPoint(0, 4.6, 0.923));\n",
       "obj8.userData.points.push(new PMPoint(1, 4.6, 1.077));\n",
       "obj8.userData.points.push(new PMPoint(0, 4.6, 1.077));\n",
       "\n",
       "obj8.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 3, 4, 2, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj8.userData.facets = [[2, 5, 4, 3], [7, 5, 2, 0], [6, 7, 0, 1], [3, 4, 6, 1], [2, 3, 1, 0], [4, 5, 7, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj8.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj8);\n",
       "scene.add(obj8);\n",
       "\n",
       "var obj9 = new THREE.Object3D();\n",
       "obj9.name = \"_bounded\";\n",
       "obj9.userData.explodable = 1;\n",
       "obj9.userData.points = [];\n",
       "obj9.userData.points.push(new PMPoint(4.6, 2.077, 2));\n",
       "obj9.userData.points.push(new PMPoint(4.6, 1.923, 2));\n",
       "obj9.userData.points.push(new PMPoint(2, 1.923, 2));\n",
       "obj9.userData.points.push(new PMPoint(2, 2.077, 2));\n",
       "obj9.userData.points.push(new PMPoint(2, 1.923, 4.6));\n",
       "obj9.userData.points.push(new PMPoint(2, 2.077, 4.6));\n",
       "obj9.userData.points.push(new PMPoint(4.6, 1.923, 4.6));\n",
       "obj9.userData.points.push(new PMPoint(4.6, 2.077, 4.6));\n",
       "\n",
       "obj9.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj9.userData.facets = [[3, 5, 7, 0], [4, 5, 3, 2], [6, 4, 2, 1], [3, 0, 1, 2], [0, 7, 6, 1], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj9.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj9);\n",
       "scene.add(obj9);\n",
       "\n",
       "var obj10 = new THREE.Object3D();\n",
       "obj10.name = \"_bounded\";\n",
       "obj10.userData.explodable = 1;\n",
       "obj10.userData.points = [];\n",
       "obj10.userData.points.push(new PMPoint(1.077, 0, 1));\n",
       "obj10.userData.points.push(new PMPoint(1.077, 1, 1));\n",
       "obj10.userData.points.push(new PMPoint(0.923, 0, 1));\n",
       "obj10.userData.points.push(new PMPoint(0.923, 1, 1));\n",
       "obj10.userData.points.push(new PMPoint(0.923, 1, 4.6));\n",
       "obj10.userData.points.push(new PMPoint(0.923, 0, 4.6));\n",
       "obj10.userData.points.push(new PMPoint(1.077, 1, 4.6));\n",
       "obj10.userData.points.push(new PMPoint(1.077, 0, 4.6));\n",
       "\n",
       "obj10.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 3, 4, 2, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj10.userData.facets = [[5, 2, 0, 7], [3, 2, 5, 4], [1, 3, 4, 6], [7, 0, 1, 6], [0, 2, 3, 1], [5, 7, 6, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj10.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj10);\n",
       "scene.add(obj10);\n",
       "\n",
       "var obj11 = new THREE.Object3D();\n",
       "obj11.name = \"_bounded\";\n",
       "obj11.userData.explodable = 1;\n",
       "obj11.userData.points = [];\n",
       "obj11.userData.points.push(new PMPoint(1, 0, 1.077));\n",
       "obj11.userData.points.push(new PMPoint(1, 1, 1.077));\n",
       "obj11.userData.points.push(new PMPoint(1, 0, 0.923));\n",
       "obj11.userData.points.push(new PMPoint(1, 1, 0.923));\n",
       "obj11.userData.points.push(new PMPoint(4.6, 1, 0.923));\n",
       "obj11.userData.points.push(new PMPoint(4.6, 0, 0.923));\n",
       "obj11.userData.points.push(new PMPoint(4.6, 1, 1.077));\n",
       "obj11.userData.points.push(new PMPoint(4.6, 0, 1.077));\n",
       "\n",
       "obj11.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 3, 4, 2, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj11.userData.facets = [[5, 2, 3, 4], [0, 2, 5, 7], [1, 0, 7, 6], [4, 3, 1, 6], [3, 2, 0, 1], [5, 4, 6, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj11.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj11);\n",
       "scene.add(obj11);\n",
       "\n",
       "var obj12 = new THREE.Object3D();\n",
       "obj12.name = \"_bounded\";\n",
       "obj12.userData.explodable = 1;\n",
       "obj12.userData.points = [];\n",
       "obj12.userData.points.push(new PMPoint(1.94555, 2.05445, 2));\n",
       "obj12.userData.points.push(new PMPoint(2.05445, 1.94555, 2));\n",
       "obj12.userData.points.push(new PMPoint(1.05445, 0.945553, 1));\n",
       "obj12.userData.points.push(new PMPoint(0.945553, 1.05445, 1));\n",
       "obj12.userData.points.push(new PMPoint(1.05445, 0.945553, 4.6));\n",
       "obj12.userData.points.push(new PMPoint(0.945553, 1.05445, 4.6));\n",
       "obj12.userData.points.push(new PMPoint(2.05445, 1.94555, 4.6));\n",
       "obj12.userData.points.push(new PMPoint(1.94555, 2.05445, 4.6));\n",
       "\n",
       "obj12.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj12.userData.facets = [[5, 3, 2, 4], [0, 3, 5, 7], [1, 0, 7, 6], [4, 2, 1, 6], [2, 3, 0, 1], [5, 4, 6, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj12.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj12);\n",
       "scene.add(obj12);\n",
       "\n",
       "var obj13 = new THREE.Object3D();\n",
       "obj13.name = \"_bounded\";\n",
       "obj13.userData.explodable = 1;\n",
       "obj13.userData.points = [];\n",
       "obj13.userData.points.push(new PMPoint(4.6, 2, 2.077));\n",
       "obj13.userData.points.push(new PMPoint(4.6, 2, 1.923));\n",
       "obj13.userData.points.push(new PMPoint(2, 2, 1.923));\n",
       "obj13.userData.points.push(new PMPoint(2, 2, 2.077));\n",
       "obj13.userData.points.push(new PMPoint(2, 4.6, 1.923));\n",
       "obj13.userData.points.push(new PMPoint(2, 4.6, 2.077));\n",
       "obj13.userData.points.push(new PMPoint(4.6, 4.6, 1.923));\n",
       "obj13.userData.points.push(new PMPoint(4.6, 4.6, 2.077));\n",
       "\n",
       "obj13.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj13.userData.facets = [[5, 3, 0, 7], [2, 3, 5, 4], [0, 3, 2, 1], [1, 2, 4, 6], [7, 0, 1, 6], [5, 7, 6, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj13.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj13);\n",
       "scene.add(obj13);\n",
       "\n",
       "var obj14 = new THREE.Object3D();\n",
       "obj14.name = \"_bounded\";\n",
       "obj14.userData.explodable = 1;\n",
       "obj14.userData.points = [];\n",
       "obj14.userData.points.push(new PMPoint(1.077, 1, 1));\n",
       "obj14.userData.points.push(new PMPoint(1.077, 1, 0));\n",
       "obj14.userData.points.push(new PMPoint(0.923, 1, 1));\n",
       "obj14.userData.points.push(new PMPoint(0.923, 1, 0));\n",
       "obj14.userData.points.push(new PMPoint(0.923, 4.6, 0));\n",
       "obj14.userData.points.push(new PMPoint(0.923, 4.6, 1));\n",
       "obj14.userData.points.push(new PMPoint(1.077, 4.6, 0));\n",
       "obj14.userData.points.push(new PMPoint(1.077, 4.6, 1));\n",
       "\n",
       "obj14.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 3, 4, 2, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj14.userData.facets = [[3, 4, 6, 1], [5, 4, 3, 2], [7, 5, 2, 0], [1, 6, 7, 0], [3, 1, 0, 2], [6, 4, 5, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj14.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj14);\n",
       "scene.add(obj14);\n",
       "\n",
       "var obj15 = new THREE.Object3D();\n",
       "obj15.name = \"_bounded\";\n",
       "obj15.userData.explodable = 1;\n",
       "obj15.userData.points = [];\n",
       "obj15.userData.points.push(new PMPoint(1, 1.077, 1));\n",
       "obj15.userData.points.push(new PMPoint(1, 1.077, 0));\n",
       "obj15.userData.points.push(new PMPoint(1, 0.923, 1));\n",
       "obj15.userData.points.push(new PMPoint(1, 0.923, 0));\n",
       "obj15.userData.points.push(new PMPoint(4.6, 0.923, 0));\n",
       "obj15.userData.points.push(new PMPoint(4.6, 0.923, 1));\n",
       "obj15.userData.points.push(new PMPoint(4.6, 1.077, 0));\n",
       "obj15.userData.points.push(new PMPoint(4.6, 1.077, 1));\n",
       "\n",
       "obj15.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 3, 4, 2, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj15.userData.facets = [[4, 3, 1, 6], [2, 3, 4, 5], [0, 2, 5, 7], [6, 1, 0, 7], [1, 3, 2, 0], [4, 6, 7, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj15.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj15);\n",
       "scene.add(obj15);\n",
       "\n",
       "var obj16 = new THREE.Object3D();\n",
       "obj16.name = \"_bounded\";\n",
       "obj16.userData.explodable = 1;\n",
       "obj16.userData.points = [];\n",
       "obj16.userData.points.push(new PMPoint(1.94555, 2, 2.05445));\n",
       "obj16.userData.points.push(new PMPoint(2.05445, 2, 1.94555));\n",
       "obj16.userData.points.push(new PMPoint(1.05445, 1, 0.945553));\n",
       "obj16.userData.points.push(new PMPoint(0.945553, 1, 1.05445));\n",
       "obj16.userData.points.push(new PMPoint(1.05445, 4.6, 0.945553));\n",
       "obj16.userData.points.push(new PMPoint(0.945553, 4.6, 1.05445));\n",
       "obj16.userData.points.push(new PMPoint(2.05445, 4.6, 1.94555));\n",
       "obj16.userData.points.push(new PMPoint(1.94555, 4.6, 2.05445));\n",
       "\n",
       "obj16.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj16.userData.facets = [[3, 5, 4, 2], [7, 5, 3, 0], [6, 7, 0, 1], [2, 4, 6, 1], [3, 2, 1, 0], [4, 5, 7, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj16.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj16);\n",
       "scene.add(obj16);\n",
       "\n",
       "var obj17 = new THREE.Object3D();\n",
       "obj17.name = \"_bounded\";\n",
       "obj17.userData.explodable = 1;\n",
       "obj17.userData.points = [];\n",
       "obj17.userData.points.push(new PMPoint(2, 1.94555, 2.05445));\n",
       "obj17.userData.points.push(new PMPoint(2, 2.05445, 1.94555));\n",
       "obj17.userData.points.push(new PMPoint(1, 1.05445, 0.945553));\n",
       "obj17.userData.points.push(new PMPoint(1, 0.945553, 1.05445));\n",
       "obj17.userData.points.push(new PMPoint(4.6, 1.05445, 0.945553));\n",
       "obj17.userData.points.push(new PMPoint(4.6, 0.945553, 1.05445));\n",
       "obj17.userData.points.push(new PMPoint(4.6, 2.05445, 1.94555));\n",
       "obj17.userData.points.push(new PMPoint(4.6, 1.94555, 2.05445));\n",
       "\n",
       "obj17.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj17.userData.facets = [[5, 3, 2, 4], [0, 3, 5, 7], [1, 0, 7, 6], [4, 2, 1, 6], [2, 3, 0, 1], [5, 4, 6, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj17.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj17);\n",
       "scene.add(obj17);\n",
       "\n",
       "var obj18 = new THREE.Object3D();\n",
       "obj18.name = \"_bounded\";\n",
       "obj18.userData.explodable = 1;\n",
       "obj18.userData.points = [];\n",
       "obj18.userData.points.push(new PMPoint(-2.077, 4.6, 0));\n",
       "obj18.userData.points.push(new PMPoint(-1.923, 4.6, 0));\n",
       "obj18.userData.points.push(new PMPoint(-1.923, 0, 0));\n",
       "obj18.userData.points.push(new PMPoint(-2.077, 0, 0));\n",
       "obj18.userData.points.push(new PMPoint(-1.923, 0, 4.6));\n",
       "obj18.userData.points.push(new PMPoint(-2.077, 0, 4.6));\n",
       "obj18.userData.points.push(new PMPoint(-1.923, 4.6, 4.6));\n",
       "obj18.userData.points.push(new PMPoint(-2.077, 4.6, 4.6));\n",
       "\n",
       "obj18.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj18.userData.facets = [[4, 2, 1, 6], [0, 3, 5, 7], [3, 2, 4, 5], [1, 2, 3, 0], [6, 1, 0, 7], [4, 6, 7, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj18.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj18);\n",
       "scene.add(obj18);\n",
       "\n",
       "var obj19 = new THREE.Object3D();\n",
       "obj19.name = \"_bounded\";\n",
       "obj19.userData.explodable = 1;\n",
       "obj19.userData.points = [];\n",
       "obj19.userData.points.push(new PMPoint(-1.05445, 0.0544472, 0));\n",
       "obj19.userData.points.push(new PMPoint(-0.0544472, 1.05445, 1));\n",
       "obj19.userData.points.push(new PMPoint(0.0544472, 0.945553, 1));\n",
       "obj19.userData.points.push(new PMPoint(-0.945553, -0.0544472, 0));\n",
       "obj19.userData.points.push(new PMPoint(0.0544472, 0.945553, 4.6));\n",
       "obj19.userData.points.push(new PMPoint(-0.945553, -0.0544472, 4.6));\n",
       "obj19.userData.points.push(new PMPoint(-0.0544472, 1.05445, 4.6));\n",
       "obj19.userData.points.push(new PMPoint(-1.05445, 0.0544472, 4.6));\n",
       "\n",
       "obj19.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj19.userData.facets = [[7, 0, 3, 5], [1, 0, 7, 6], [2, 1, 6, 4], [5, 3, 2, 4], [3, 0, 1, 2], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj19.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj19);\n",
       "scene.add(obj19);\n",
       "\n",
       "var obj20 = new THREE.Object3D();\n",
       "obj20.name = \"_bounded\";\n",
       "obj20.userData.explodable = 1;\n",
       "obj20.userData.points = [];\n",
       "obj20.userData.points.push(new PMPoint(-1.05445, 0, 0.0544472));\n",
       "obj20.userData.points.push(new PMPoint(-0.0544472, 1, 1.05445));\n",
       "obj20.userData.points.push(new PMPoint(0.0544472, 1, 0.945553));\n",
       "obj20.userData.points.push(new PMPoint(-0.945553, 0, -0.0544472));\n",
       "obj20.userData.points.push(new PMPoint(0.0544472, 4.6, 0.945553));\n",
       "obj20.userData.points.push(new PMPoint(-0.945553, 4.6, -0.0544472));\n",
       "obj20.userData.points.push(new PMPoint(-0.0544472, 4.6, 1.05445));\n",
       "obj20.userData.points.push(new PMPoint(-1.05445, 4.6, 0.0544472));\n",
       "\n",
       "obj20.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj20.userData.facets = [[0, 7, 5, 3], [6, 7, 0, 1], [4, 6, 1, 2], [3, 5, 4, 2], [0, 3, 2, 1], [5, 7, 6, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj20.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj20);\n",
       "scene.add(obj20);\n",
       "\n",
       "var obj21 = new THREE.Object3D();\n",
       "obj21.name = \"_bounded\";\n",
       "obj21.userData.explodable = 1;\n",
       "obj21.userData.points = [];\n",
       "obj21.userData.points.push(new PMPoint(-0.077, 4.6, 1));\n",
       "obj21.userData.points.push(new PMPoint(0.077, 4.6, 1));\n",
       "obj21.userData.points.push(new PMPoint(0.077, 1, 1));\n",
       "obj21.userData.points.push(new PMPoint(-0.077, 1, 1));\n",
       "obj21.userData.points.push(new PMPoint(0.077, 1, 4.6));\n",
       "obj21.userData.points.push(new PMPoint(-0.077, 1, 4.6));\n",
       "obj21.userData.points.push(new PMPoint(0.077, 4.6, 4.6));\n",
       "obj21.userData.points.push(new PMPoint(-0.077, 4.6, 4.6));\n",
       "\n",
       "obj21.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj21.userData.facets = [[4, 2, 1, 6], [0, 3, 5, 7], [3, 2, 4, 5], [1, 2, 3, 0], [6, 1, 0, 7], [4, 6, 7, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj21.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj21);\n",
       "scene.add(obj21);\n",
       "\n",
       "var obj22 = new THREE.Object3D();\n",
       "obj22.name = \"_bounded\";\n",
       "obj22.userData.explodable = 1;\n",
       "obj22.userData.points = [];\n",
       "obj22.userData.points.push(new PMPoint(4.6, -2.077, 0));\n",
       "obj22.userData.points.push(new PMPoint(4.6, -1.923, 0));\n",
       "obj22.userData.points.push(new PMPoint(0, -1.923, 0));\n",
       "obj22.userData.points.push(new PMPoint(0, -2.077, 0));\n",
       "obj22.userData.points.push(new PMPoint(0, -1.923, 4.6));\n",
       "obj22.userData.points.push(new PMPoint(0, -2.077, 4.6));\n",
       "obj22.userData.points.push(new PMPoint(4.6, -1.923, 4.6));\n",
       "obj22.userData.points.push(new PMPoint(4.6, -2.077, 4.6));\n",
       "\n",
       "obj22.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj22.userData.facets = [[2, 4, 6, 1], [5, 4, 2, 3], [7, 5, 3, 0], [2, 1, 0, 3], [1, 6, 7, 0], [6, 4, 5, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj22.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj22);\n",
       "scene.add(obj22);\n",
       "\n",
       "var obj23 = new THREE.Object3D();\n",
       "obj23.name = \"_bounded\";\n",
       "obj23.userData.explodable = 1;\n",
       "obj23.userData.points = [];\n",
       "obj23.userData.points.push(new PMPoint(0.0544472, -1.05445, 0));\n",
       "obj23.userData.points.push(new PMPoint(1.05445, -0.0544472, 1));\n",
       "obj23.userData.points.push(new PMPoint(0.945553, 0.0544472, 1));\n",
       "obj23.userData.points.push(new PMPoint(-0.0544472, -0.945553, 0));\n",
       "obj23.userData.points.push(new PMPoint(0.945553, 0.0544472, 4.6));\n",
       "obj23.userData.points.push(new PMPoint(-0.0544472, -0.945553, 4.6));\n",
       "obj23.userData.points.push(new PMPoint(1.05445, -0.0544472, 4.6));\n",
       "obj23.userData.points.push(new PMPoint(0.0544472, -1.05445, 4.6));\n",
       "\n",
       "obj23.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj23.userData.facets = [[5, 3, 0, 7], [2, 3, 5, 4], [1, 2, 4, 6], [7, 0, 1, 6], [0, 3, 2, 1], [5, 7, 6, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj23.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj23);\n",
       "scene.add(obj23);\n",
       "\n",
       "var obj24 = new THREE.Object3D();\n",
       "obj24.name = \"_bounded\";\n",
       "obj24.userData.explodable = 1;\n",
       "obj24.userData.points = [];\n",
       "obj24.userData.points.push(new PMPoint(0, -1.05445, 0.0544472));\n",
       "obj24.userData.points.push(new PMPoint(1, -0.0544472, 1.05445));\n",
       "obj24.userData.points.push(new PMPoint(1, 0.0544472, 0.945553));\n",
       "obj24.userData.points.push(new PMPoint(0, -0.945553, -0.0544472));\n",
       "obj24.userData.points.push(new PMPoint(4.6, 0.0544472, 0.945553));\n",
       "obj24.userData.points.push(new PMPoint(4.6, -0.945553, -0.0544472));\n",
       "obj24.userData.points.push(new PMPoint(4.6, -0.0544472, 1.05445));\n",
       "obj24.userData.points.push(new PMPoint(4.6, -1.05445, 0.0544472));\n",
       "\n",
       "obj24.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj24.userData.facets = [[7, 0, 3, 5], [1, 0, 7, 6], [2, 1, 6, 4], [5, 3, 2, 4], [3, 0, 1, 2], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj24.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj24);\n",
       "scene.add(obj24);\n",
       "\n",
       "var obj25 = new THREE.Object3D();\n",
       "obj25.name = \"_bounded\";\n",
       "obj25.userData.explodable = 1;\n",
       "obj25.userData.points = [];\n",
       "obj25.userData.points.push(new PMPoint(4.6, -0.077, 1));\n",
       "obj25.userData.points.push(new PMPoint(4.6, 0.077, 1));\n",
       "obj25.userData.points.push(new PMPoint(1, 0.077, 1));\n",
       "obj25.userData.points.push(new PMPoint(1, -0.077, 1));\n",
       "obj25.userData.points.push(new PMPoint(1, 0.077, 4.6));\n",
       "obj25.userData.points.push(new PMPoint(1, -0.077, 4.6));\n",
       "obj25.userData.points.push(new PMPoint(4.6, 0.077, 4.6));\n",
       "obj25.userData.points.push(new PMPoint(4.6, -0.077, 4.6));\n",
       "\n",
       "obj25.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj25.userData.facets = [[2, 4, 6, 1], [5, 4, 2, 3], [7, 5, 3, 0], [2, 1, 0, 3], [1, 6, 7, 0], [6, 4, 5, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj25.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj25);\n",
       "scene.add(obj25);\n",
       "\n",
       "var obj26 = new THREE.Object3D();\n",
       "obj26.name = \"_bounded\";\n",
       "obj26.userData.explodable = 1;\n",
       "obj26.userData.points = [];\n",
       "obj26.userData.points.push(new PMPoint(4.6, 0, -2.077));\n",
       "obj26.userData.points.push(new PMPoint(4.6, 0, -1.923));\n",
       "obj26.userData.points.push(new PMPoint(0, 0, -1.923));\n",
       "obj26.userData.points.push(new PMPoint(0, 0, -2.077));\n",
       "obj26.userData.points.push(new PMPoint(0, 4.6, -1.923));\n",
       "obj26.userData.points.push(new PMPoint(0, 4.6, -2.077));\n",
       "obj26.userData.points.push(new PMPoint(4.6, 4.6, -1.923));\n",
       "obj26.userData.points.push(new PMPoint(4.6, 4.6, -2.077));\n",
       "\n",
       "obj26.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj26.userData.facets = [[4, 2, 1, 6], [3, 2, 4, 5], [1, 2, 3, 0], [0, 3, 5, 7], [6, 1, 0, 7], [4, 6, 7, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj26.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj26);\n",
       "scene.add(obj26);\n",
       "\n",
       "var obj27 = new THREE.Object3D();\n",
       "obj27.name = \"_bounded\";\n",
       "obj27.userData.explodable = 1;\n",
       "obj27.userData.points = [];\n",
       "obj27.userData.points.push(new PMPoint(0.0544472, 0, -1.05445));\n",
       "obj27.userData.points.push(new PMPoint(1.05445, 1, -0.0544472));\n",
       "obj27.userData.points.push(new PMPoint(0.945553, 1, 0.0544472));\n",
       "obj27.userData.points.push(new PMPoint(-0.0544472, 0, -0.945553));\n",
       "obj27.userData.points.push(new PMPoint(0.945553, 4.6, 0.0544472));\n",
       "obj27.userData.points.push(new PMPoint(-0.0544472, 4.6, -0.945553));\n",
       "obj27.userData.points.push(new PMPoint(1.05445, 4.6, -0.0544472));\n",
       "obj27.userData.points.push(new PMPoint(0.0544472, 4.6, -1.05445));\n",
       "\n",
       "obj27.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj27.userData.facets = [[3, 5, 7, 0], [4, 5, 3, 2], [6, 4, 2, 1], [0, 7, 6, 1], [3, 0, 1, 2], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj27.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj27);\n",
       "scene.add(obj27);\n",
       "\n",
       "var obj28 = new THREE.Object3D();\n",
       "obj28.name = \"_bounded\";\n",
       "obj28.userData.explodable = 1;\n",
       "obj28.userData.points = [];\n",
       "obj28.userData.points.push(new PMPoint(0, 0.0544472, -1.05445));\n",
       "obj28.userData.points.push(new PMPoint(1, 1.05445, -0.0544472));\n",
       "obj28.userData.points.push(new PMPoint(1, 0.945553, 0.0544472));\n",
       "obj28.userData.points.push(new PMPoint(0, -0.0544472, -0.945553));\n",
       "obj28.userData.points.push(new PMPoint(4.6, 0.945553, 0.0544472));\n",
       "obj28.userData.points.push(new PMPoint(4.6, -0.0544472, -0.945553));\n",
       "obj28.userData.points.push(new PMPoint(4.6, 1.05445, -0.0544472));\n",
       "obj28.userData.points.push(new PMPoint(4.6, 0.0544472, -1.05445));\n",
       "\n",
       "obj28.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj28.userData.facets = [[5, 3, 0, 7], [2, 3, 5, 4], [1, 2, 4, 6], [7, 0, 1, 6], [0, 3, 2, 1], [5, 7, 6, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj28.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj28);\n",
       "scene.add(obj28);\n",
       "\n",
       "var obj29 = new THREE.Object3D();\n",
       "obj29.name = \"_bounded\";\n",
       "obj29.userData.explodable = 1;\n",
       "obj29.userData.points = [];\n",
       "obj29.userData.points.push(new PMPoint(4.6, 1, -0.077));\n",
       "obj29.userData.points.push(new PMPoint(4.6, 1, 0.077));\n",
       "obj29.userData.points.push(new PMPoint(1, 1, 0.077));\n",
       "obj29.userData.points.push(new PMPoint(1, 1, -0.077));\n",
       "obj29.userData.points.push(new PMPoint(1, 4.6, 0.077));\n",
       "obj29.userData.points.push(new PMPoint(1, 4.6, -0.077));\n",
       "obj29.userData.points.push(new PMPoint(4.6, 4.6, 0.077));\n",
       "obj29.userData.points.push(new PMPoint(4.6, 4.6, -0.077));\n",
       "\n",
       "obj29.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj29.userData.facets = [[4, 2, 1, 6], [3, 2, 4, 5], [1, 2, 3, 0], [0, 3, 5, 7], [6, 1, 0, 7], [4, 6, 7, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj29.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj29);\n",
       "scene.add(obj29);\n",
       "\n",
       "var obj30 = new THREE.Object3D();\n",
       "obj30.name = \"_bounded\";\n",
       "obj30.userData.explodable = 1;\n",
       "obj30.userData.points = [];\n",
       "obj30.userData.points.push(new PMPoint(-2.05445, 0.0544472, 4.6));\n",
       "obj30.userData.points.push(new PMPoint(-1.94555, -0.0544472, 4.6));\n",
       "obj30.userData.points.push(new PMPoint(-1.94555, -0.0544472, 0));\n",
       "obj30.userData.points.push(new PMPoint(-2.05445, 0.0544472, 0));\n",
       "obj30.userData.points.push(new PMPoint(-4.6, -2.70889, -2.65445));\n",
       "obj30.userData.points.push(new PMPoint(-4.6, -2.49111, -2.54555));\n",
       "obj30.userData.points.push(new PMPoint(-4.6, -2.70889, 4.6));\n",
       "obj30.userData.points.push(new PMPoint(-4.6, -2.49111, 4.6));\n",
       "\n",
       "obj30.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj30.userData.facets = [[2, 1, 6, 4], [0, 1, 2, 3], [7, 0, 3, 5], [2, 4, 5, 3], [4, 6, 7, 5], [6, 1, 0, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj30.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj30);\n",
       "scene.add(obj30);\n",
       "\n",
       "var obj31 = new THREE.Object3D();\n",
       "obj31.name = \"_bounded\";\n",
       "obj31.userData.explodable = 1;\n",
       "obj31.userData.points = [];\n",
       "obj31.userData.points.push(new PMPoint(-1.077, -1, 0));\n",
       "obj31.userData.points.push(new PMPoint(-1.077, 0, 0));\n",
       "obj31.userData.points.push(new PMPoint(-0.923, 0, 0));\n",
       "obj31.userData.points.push(new PMPoint(-0.923, -1, 0));\n",
       "obj31.userData.points.push(new PMPoint(-0.923, 0, 4.6));\n",
       "obj31.userData.points.push(new PMPoint(-0.923, -1, 4.6));\n",
       "obj31.userData.points.push(new PMPoint(-1.077, 0, 4.6));\n",
       "obj31.userData.points.push(new PMPoint(-1.077, -1, 4.6));\n",
       "\n",
       "obj31.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj31.userData.facets = [[7, 0, 3, 5], [1, 0, 7, 6], [2, 1, 6, 4], [5, 3, 2, 4], [3, 0, 1, 2], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj31.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj31);\n",
       "scene.add(obj31);\n",
       "\n",
       "var obj32 = new THREE.Object3D();\n",
       "obj32.name = \"_bounded\";\n",
       "obj32.userData.explodable = 1;\n",
       "obj32.userData.points = [];\n",
       "obj32.userData.points.push(new PMPoint(-4.54555, -4.6, -3.65445));\n",
       "obj32.userData.points.push(new PMPoint(-0.945553, 0, -0.0544472));\n",
       "obj32.userData.points.push(new PMPoint(-0.945553, -1, -0.0544472));\n",
       "obj32.userData.points.push(new PMPoint(-1.05445, -1, 0.0544472));\n",
       "obj32.userData.points.push(new PMPoint(-1.05445, 0, 0.0544472));\n",
       "obj32.userData.points.push(new PMPoint(-4.6, -3.54555, -3.49111));\n",
       "obj32.userData.points.push(new PMPoint(-4.6, -4.54555, -3.49111));\n",
       "obj32.userData.points.push(new PMPoint(-4.6, -3.65445, -3.70889));\n",
       "obj32.userData.points.push(new PMPoint(-4.6, -4.6, -3.70889));\n",
       "obj32.userData.points.push(new PMPoint(-4.6, -4.6, -3.6));\n",
       "\n",
       "obj32.userData.edgeindices = [0, 2, 1, 2, 2, 3, 1, 4, 3, 4, 4, 5, 3, 6, 5, 6, 1, 7, 5, 7, 0, 8, 7, 8, 0, 9, 6, 9, 8, 9];\n",
       "obj32.userData.facets = [[6, 3, 4, 5], [2, 3, 6, 9, 0], [1, 2, 0, 8, 7], [5, 4, 1, 7], [4, 3, 2, 1], [6, 5, 7, 8, 9], [9, 8, 0]];\n",
       "   <!-- Facet style -->\n",
       "obj32.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj32);\n",
       "scene.add(obj32);\n",
       "\n",
       "var obj33 = new THREE.Object3D();\n",
       "obj33.name = \"_bounded\";\n",
       "obj33.userData.explodable = 1;\n",
       "obj33.userData.points = [];\n",
       "obj33.userData.points.push(new PMPoint(-2, -0.077, 0));\n",
       "obj33.userData.points.push(new PMPoint(-2, 0.077, 0));\n",
       "obj33.userData.points.push(new PMPoint(-1, 0.077, 0));\n",
       "obj33.userData.points.push(new PMPoint(-1, -0.077, 0));\n",
       "obj33.userData.points.push(new PMPoint(-1, 0.077, 4.6));\n",
       "obj33.userData.points.push(new PMPoint(-1, -0.077, 4.6));\n",
       "obj33.userData.points.push(new PMPoint(-2, 0.077, 4.6));\n",
       "obj33.userData.points.push(new PMPoint(-2, -0.077, 4.6));\n",
       "\n",
       "obj33.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj33.userData.facets = [[7, 0, 3, 5], [1, 0, 7, 6], [2, 1, 6, 4], [5, 3, 2, 4], [3, 0, 1, 2], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj33.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj33);\n",
       "scene.add(obj33);\n",
       "\n",
       "var obj34 = new THREE.Object3D();\n",
       "obj34.name = \"_bounded\";\n",
       "obj34.userData.explodable = 1;\n",
       "obj34.userData.points = [];\n",
       "obj34.userData.points.push(new PMPoint(-2.05445, 4.6, 0.0544472));\n",
       "obj34.userData.points.push(new PMPoint(-1.94555, 4.6, -0.0544472));\n",
       "obj34.userData.points.push(new PMPoint(-1.94555, 0, -0.0544472));\n",
       "obj34.userData.points.push(new PMPoint(-2.05445, 0, 0.0544472));\n",
       "obj34.userData.points.push(new PMPoint(-4.6, -2.65445, -2.70889));\n",
       "obj34.userData.points.push(new PMPoint(-4.6, -2.54555, -2.49111));\n",
       "obj34.userData.points.push(new PMPoint(-4.6, 4.6, -2.70889));\n",
       "obj34.userData.points.push(new PMPoint(-4.6, 4.6, -2.49111));\n",
       "\n",
       "obj34.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj34.userData.facets = [[1, 2, 4, 6], [3, 2, 1, 0], [4, 2, 3, 5], [5, 3, 0, 7], [6, 4, 5, 7], [1, 6, 7, 0]];\n",
       "   <!-- Facet style -->\n",
       "obj34.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj34);\n",
       "scene.add(obj34);\n",
       "\n",
       "var obj35 = new THREE.Object3D();\n",
       "obj35.name = \"_bounded\";\n",
       "obj35.userData.explodable = 1;\n",
       "obj35.userData.points = [];\n",
       "obj35.userData.points.push(new PMPoint(-1.077, 0, -1));\n",
       "obj35.userData.points.push(new PMPoint(-1.077, 0, 0));\n",
       "obj35.userData.points.push(new PMPoint(-0.923, 0, 0));\n",
       "obj35.userData.points.push(new PMPoint(-0.923, 0, -1));\n",
       "obj35.userData.points.push(new PMPoint(-0.923, 4.6, 0));\n",
       "obj35.userData.points.push(new PMPoint(-0.923, 4.6, -1));\n",
       "obj35.userData.points.push(new PMPoint(-1.077, 4.6, 0));\n",
       "obj35.userData.points.push(new PMPoint(-1.077, 4.6, -1));\n",
       "\n",
       "obj35.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj35.userData.facets = [[0, 7, 5, 3], [6, 7, 0, 1], [4, 6, 1, 2], [3, 5, 4, 2], [0, 3, 2, 1], [5, 7, 6, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj35.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj35);\n",
       "scene.add(obj35);\n",
       "\n",
       "var obj36 = new THREE.Object3D();\n",
       "obj36.name = \"_bounded\";\n",
       "obj36.userData.explodable = 1;\n",
       "obj36.userData.points = [];\n",
       "obj36.userData.points.push(new PMPoint(-4.54555, -3.65445, -4.6));\n",
       "obj36.userData.points.push(new PMPoint(-0.945553, -0.0544472, 0));\n",
       "obj36.userData.points.push(new PMPoint(-0.945553, -0.0544472, -1));\n",
       "obj36.userData.points.push(new PMPoint(-1.05445, 0.0544472, -1));\n",
       "obj36.userData.points.push(new PMPoint(-1.05445, 0.0544472, 0));\n",
       "obj36.userData.points.push(new PMPoint(-4.6, -3.49111, -3.54555));\n",
       "obj36.userData.points.push(new PMPoint(-4.6, -3.49111, -4.54555));\n",
       "obj36.userData.points.push(new PMPoint(-4.6, -3.70889, -3.65445));\n",
       "obj36.userData.points.push(new PMPoint(-4.6, -3.70889, -4.6));\n",
       "obj36.userData.points.push(new PMPoint(-4.6, -3.6, -4.6));\n",
       "\n",
       "obj36.userData.edgeindices = [0, 2, 1, 2, 2, 3, 1, 4, 3, 4, 4, 5, 3, 6, 5, 6, 1, 7, 5, 7, 0, 8, 7, 8, 0, 9, 6, 9, 8, 9];\n",
       "obj36.userData.facets = [[6, 3, 2, 0, 9], [4, 3, 6, 5], [1, 4, 5, 7], [0, 2, 1, 7, 8], [2, 3, 4, 1], [6, 9, 8, 7, 5], [9, 0, 8]];\n",
       "   <!-- Facet style -->\n",
       "obj36.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj36);\n",
       "scene.add(obj36);\n",
       "\n",
       "var obj37 = new THREE.Object3D();\n",
       "obj37.name = \"_bounded\";\n",
       "obj37.userData.explodable = 1;\n",
       "obj37.userData.points = [];\n",
       "obj37.userData.points.push(new PMPoint(-2, 0, -0.077));\n",
       "obj37.userData.points.push(new PMPoint(-2, 0, 0.077));\n",
       "obj37.userData.points.push(new PMPoint(-1, 0, 0.077));\n",
       "obj37.userData.points.push(new PMPoint(-1, 0, -0.077));\n",
       "obj37.userData.points.push(new PMPoint(-1, 4.6, 0.077));\n",
       "obj37.userData.points.push(new PMPoint(-1, 4.6, -0.077));\n",
       "obj37.userData.points.push(new PMPoint(-2, 4.6, 0.077));\n",
       "obj37.userData.points.push(new PMPoint(-2, 4.6, -0.077));\n",
       "\n",
       "obj37.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj37.userData.facets = [[0, 7, 5, 3], [6, 7, 0, 1], [4, 6, 1, 2], [3, 5, 4, 2], [0, 3, 2, 1], [5, 7, 6, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj37.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj37);\n",
       "scene.add(obj37);\n",
       "\n",
       "var obj38 = new THREE.Object3D();\n",
       "obj38.name = \"_bounded\";\n",
       "obj38.userData.explodable = 1;\n",
       "obj38.userData.points = [];\n",
       "obj38.userData.points.push(new PMPoint(-2, -0.0544472, 0.0544472));\n",
       "obj38.userData.points.push(new PMPoint(-2, 0.0544472, -0.0544472));\n",
       "obj38.userData.points.push(new PMPoint(-1, 0.0544472, -0.0544472));\n",
       "obj38.userData.points.push(new PMPoint(-1, -0.0544472, 0.0544472));\n",
       "obj38.userData.points.push(new PMPoint(-4.6, -3.54555, -3.65445));\n",
       "obj38.userData.points.push(new PMPoint(-4.6, -3.65445, -3.54555));\n",
       "obj38.userData.points.push(new PMPoint(-4.6, -2.54555, -2.65445));\n",
       "obj38.userData.points.push(new PMPoint(-4.6, -2.65445, -2.54555));\n",
       "\n",
       "obj38.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj38.userData.facets = [[7, 0, 1, 6], [3, 0, 7, 5], [2, 3, 5, 4], [6, 1, 2, 4], [1, 0, 3, 2], [7, 6, 4, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj38.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj38);\n",
       "scene.add(obj38);\n",
       "\n",
       "var obj39 = new THREE.Object3D();\n",
       "obj39.name = \"_bounded\";\n",
       "obj39.userData.explodable = 1;\n",
       "obj39.userData.points = [];\n",
       "obj39.userData.points.push(new PMPoint(0.0544472, -2.05445, 4.6));\n",
       "obj39.userData.points.push(new PMPoint(-0.0544472, -1.94555, 4.6));\n",
       "obj39.userData.points.push(new PMPoint(-0.0544472, -1.94555, 0));\n",
       "obj39.userData.points.push(new PMPoint(0.0544472, -2.05445, 0));\n",
       "obj39.userData.points.push(new PMPoint(-2.70889, -4.6, -2.65445));\n",
       "obj39.userData.points.push(new PMPoint(-2.49111, -4.6, -2.54555));\n",
       "obj39.userData.points.push(new PMPoint(-2.70889, -4.6, 4.6));\n",
       "obj39.userData.points.push(new PMPoint(-2.49111, -4.6, 4.6));\n",
       "\n",
       "obj39.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj39.userData.facets = [[3, 0, 7, 5], [1, 0, 3, 2], [6, 1, 2, 4], [3, 5, 4, 2], [5, 7, 6, 4], [7, 0, 1, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj39.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj39);\n",
       "scene.add(obj39);\n",
       "\n",
       "var obj40 = new THREE.Object3D();\n",
       "obj40.name = \"_bounded\";\n",
       "obj40.userData.explodable = 1;\n",
       "obj40.userData.points = [];\n",
       "obj40.userData.points.push(new PMPoint(-1, -1.077, 0));\n",
       "obj40.userData.points.push(new PMPoint(0, -1.077, 0));\n",
       "obj40.userData.points.push(new PMPoint(0, -0.923, 0));\n",
       "obj40.userData.points.push(new PMPoint(-1, -0.923, 0));\n",
       "obj40.userData.points.push(new PMPoint(0, -0.923, 4.6));\n",
       "obj40.userData.points.push(new PMPoint(-1, -0.923, 4.6));\n",
       "obj40.userData.points.push(new PMPoint(0, -1.077, 4.6));\n",
       "obj40.userData.points.push(new PMPoint(-1, -1.077, 4.6));\n",
       "\n",
       "obj40.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj40.userData.facets = [[7, 0, 1, 6], [3, 0, 7, 5], [2, 3, 5, 4], [6, 1, 2, 4], [1, 0, 3, 2], [7, 6, 4, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj40.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj40);\n",
       "scene.add(obj40);\n",
       "\n",
       "var obj41 = new THREE.Object3D();\n",
       "obj41.name = \"_bounded\";\n",
       "obj41.userData.explodable = 1;\n",
       "obj41.userData.points = [];\n",
       "obj41.userData.points.push(new PMPoint(-4.54555, -4.6, -3.49111));\n",
       "obj41.userData.points.push(new PMPoint(-3.54555, -4.6, -3.49111));\n",
       "obj41.userData.points.push(new PMPoint(-3.65445, -4.6, -3.70889));\n",
       "obj41.userData.points.push(new PMPoint(-1, -0.945553, -0.0544472));\n",
       "obj41.userData.points.push(new PMPoint(0, -0.945553, -0.0544472));\n",
       "obj41.userData.points.push(new PMPoint(0, -1.05445, 0.0544472));\n",
       "obj41.userData.points.push(new PMPoint(-1, -1.05445, 0.0544472));\n",
       "obj41.userData.points.push(new PMPoint(-4.6, -4.54555, -3.65445));\n",
       "obj41.userData.points.push(new PMPoint(-4.6, -4.6, -3.70889));\n",
       "obj41.userData.points.push(new PMPoint(-4.6, -4.6, -3.6));\n",
       "\n",
       "obj41.userData.edgeindices = [0, 1, 1, 2, 2, 4, 3, 4, 1, 5, 4, 5, 0, 6, 3, 6, 5, 6, 3, 7, 2, 8, 7, 8, 0, 9, 7, 9, 8, 9];\n",
       "obj41.userData.facets = [[0, 6, 3, 7, 9], [5, 6, 0, 1], [4, 5, 1, 2], [7, 3, 4, 2, 8], [3, 6, 5, 4], [9, 7, 8], [0, 9, 8, 2, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj41.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj41);\n",
       "scene.add(obj41);\n",
       "\n",
       "var obj42 = new THREE.Object3D();\n",
       "obj42.name = \"_bounded\";\n",
       "obj42.userData.explodable = 1;\n",
       "obj42.userData.points = [];\n",
       "obj42.userData.points.push(new PMPoint(-0.077, -2, 0));\n",
       "obj42.userData.points.push(new PMPoint(0.077, -2, 0));\n",
       "obj42.userData.points.push(new PMPoint(0.077, -1, 0));\n",
       "obj42.userData.points.push(new PMPoint(-0.077, -1, 0));\n",
       "obj42.userData.points.push(new PMPoint(0.077, -1, 4.6));\n",
       "obj42.userData.points.push(new PMPoint(-0.077, -1, 4.6));\n",
       "obj42.userData.points.push(new PMPoint(0.077, -2, 4.6));\n",
       "obj42.userData.points.push(new PMPoint(-0.077, -2, 4.6));\n",
       "\n",
       "obj42.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj42.userData.facets = [[7, 0, 1, 6], [3, 0, 7, 5], [2, 3, 5, 4], [6, 1, 2, 4], [1, 0, 3, 2], [7, 6, 4, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj42.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj42);\n",
       "scene.add(obj42);\n",
       "\n",
       "var obj43 = new THREE.Object3D();\n",
       "obj43.name = \"_bounded\";\n",
       "obj43.userData.explodable = 1;\n",
       "obj43.userData.points = [];\n",
       "obj43.userData.points.push(new PMPoint(-4.49111, -4.6, 4.6));\n",
       "obj43.userData.points.push(new PMPoint(-4.49111, -4.6, -3.54555));\n",
       "obj43.userData.points.push(new PMPoint(-1.05445, -0.945553, 0));\n",
       "obj43.userData.points.push(new PMPoint(-0.945553, -1.05445, 0));\n",
       "obj43.userData.points.push(new PMPoint(-0.945553, -1.05445, 4.6));\n",
       "obj43.userData.points.push(new PMPoint(-1.05445, -0.945553, 4.6));\n",
       "obj43.userData.points.push(new PMPoint(-4.6, -4.49111, 4.6));\n",
       "obj43.userData.points.push(new PMPoint(-4.6, -4.49111, -3.54555));\n",
       "obj43.userData.points.push(new PMPoint(-4.6, -4.6, -3.6));\n",
       "obj43.userData.points.push(new PMPoint(-4.6, -4.6, 4.6));\n",
       "\n",
       "obj43.userData.edgeindices = [0, 1, 1, 3, 2, 3, 0, 4, 3, 4, 2, 5, 4, 5, 5, 6, 2, 7, 6, 7, 1, 8, 7, 8, 0, 9, 6, 9, 8, 9];\n",
       "obj43.userData.facets = [[3, 4, 0, 1], [5, 4, 3, 2], [6, 5, 2, 7], [3, 1, 8, 7, 2], [9, 6, 7, 8], [1, 0, 9, 8], [0, 4, 5, 6, 9]];\n",
       "   <!-- Facet style -->\n",
       "obj43.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj43);\n",
       "scene.add(obj43);\n",
       "\n",
       "var obj44 = new THREE.Object3D();\n",
       "obj44.name = \"_bounded\";\n",
       "obj44.userData.explodable = 1;\n",
       "obj44.userData.points = [];\n",
       "obj44.userData.points.push(new PMPoint(0.0544472, 4.6, -2.05445));\n",
       "obj44.userData.points.push(new PMPoint(-0.0544472, 4.6, -1.94555));\n",
       "obj44.userData.points.push(new PMPoint(-0.0544472, 0, -1.94555));\n",
       "obj44.userData.points.push(new PMPoint(0.0544472, 0, -2.05445));\n",
       "obj44.userData.points.push(new PMPoint(-2.70889, -2.65445, -4.6));\n",
       "obj44.userData.points.push(new PMPoint(-2.49111, -2.54555, -4.6));\n",
       "obj44.userData.points.push(new PMPoint(-2.70889, 4.6, -4.6));\n",
       "obj44.userData.points.push(new PMPoint(-2.49111, 4.6, -4.6));\n",
       "\n",
       "obj44.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj44.userData.facets = [[0, 3, 5, 7], [2, 3, 0, 1], [5, 3, 2, 4], [4, 2, 1, 6], [0, 7, 6, 1], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj44.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj44);\n",
       "scene.add(obj44);\n",
       "\n",
       "var obj45 = new THREE.Object3D();\n",
       "obj45.name = \"_bounded\";\n",
       "obj45.userData.explodable = 1;\n",
       "obj45.userData.points = [];\n",
       "obj45.userData.points.push(new PMPoint(-1, 0, -1.077));\n",
       "obj45.userData.points.push(new PMPoint(0, 0, -1.077));\n",
       "obj45.userData.points.push(new PMPoint(0, 0, -0.923));\n",
       "obj45.userData.points.push(new PMPoint(-1, 0, -0.923));\n",
       "obj45.userData.points.push(new PMPoint(0, 4.6, -0.923));\n",
       "obj45.userData.points.push(new PMPoint(-1, 4.6, -0.923));\n",
       "obj45.userData.points.push(new PMPoint(0, 4.6, -1.077));\n",
       "obj45.userData.points.push(new PMPoint(-1, 4.6, -1.077));\n",
       "\n",
       "obj45.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj45.userData.facets = [[0, 7, 6, 1], [5, 7, 0, 3], [4, 5, 3, 2], [1, 6, 4, 2], [0, 1, 2, 3], [6, 7, 5, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj45.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj45);\n",
       "scene.add(obj45);\n",
       "\n",
       "var obj46 = new THREE.Object3D();\n",
       "obj46.name = \"_bounded\";\n",
       "obj46.userData.explodable = 1;\n",
       "obj46.userData.points = [];\n",
       "obj46.userData.points.push(new PMPoint(-4.54555, -3.49111, -4.6));\n",
       "obj46.userData.points.push(new PMPoint(-3.54555, -3.49111, -4.6));\n",
       "obj46.userData.points.push(new PMPoint(-3.65445, -3.70889, -4.6));\n",
       "obj46.userData.points.push(new PMPoint(-1, -0.0544472, -0.945553));\n",
       "obj46.userData.points.push(new PMPoint(0, -0.0544472, -0.945553));\n",
       "obj46.userData.points.push(new PMPoint(0, 0.0544472, -1.05445));\n",
       "obj46.userData.points.push(new PMPoint(-1, 0.0544472, -1.05445));\n",
       "obj46.userData.points.push(new PMPoint(-4.6, -3.65445, -4.54555));\n",
       "obj46.userData.points.push(new PMPoint(-4.6, -3.70889, -4.6));\n",
       "obj46.userData.points.push(new PMPoint(-4.6, -3.6, -4.6));\n",
       "\n",
       "obj46.userData.edgeindices = [0, 1, 1, 2, 2, 4, 3, 4, 1, 5, 4, 5, 0, 6, 3, 6, 5, 6, 3, 7, 2, 8, 7, 8, 0, 9, 7, 9, 8, 9];\n",
       "obj46.userData.facets = [[7, 3, 6, 0, 9], [4, 3, 7, 8, 2], [5, 4, 2, 1], [0, 6, 5, 1], [6, 3, 4, 5], [7, 9, 8], [9, 0, 1, 2, 8]];\n",
       "   <!-- Facet style -->\n",
       "obj46.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj46);\n",
       "scene.add(obj46);\n",
       "\n",
       "var obj47 = new THREE.Object3D();\n",
       "obj47.name = \"_bounded\";\n",
       "obj47.userData.explodable = 1;\n",
       "obj47.userData.points = [];\n",
       "obj47.userData.points.push(new PMPoint(-0.077, 0, -2));\n",
       "obj47.userData.points.push(new PMPoint(0.077, 0, -2));\n",
       "obj47.userData.points.push(new PMPoint(0.077, 0, -1));\n",
       "obj47.userData.points.push(new PMPoint(-0.077, 0, -1));\n",
       "obj47.userData.points.push(new PMPoint(0.077, 4.6, -1));\n",
       "obj47.userData.points.push(new PMPoint(-0.077, 4.6, -1));\n",
       "obj47.userData.points.push(new PMPoint(0.077, 4.6, -2));\n",
       "obj47.userData.points.push(new PMPoint(-0.077, 4.6, -2));\n",
       "\n",
       "obj47.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj47.userData.facets = [[0, 7, 6, 1], [5, 7, 0, 3], [4, 5, 3, 2], [1, 6, 4, 2], [0, 1, 2, 3], [6, 7, 5, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj47.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj47);\n",
       "scene.add(obj47);\n",
       "\n",
       "var obj48 = new THREE.Object3D();\n",
       "obj48.name = \"_bounded\";\n",
       "obj48.userData.explodable = 1;\n",
       "obj48.userData.points = [];\n",
       "obj48.userData.points.push(new PMPoint(-4.49111, 4.6, -4.6));\n",
       "obj48.userData.points.push(new PMPoint(-4.49111, -3.54555, -4.6));\n",
       "obj48.userData.points.push(new PMPoint(-1.05445, 0, -0.945553));\n",
       "obj48.userData.points.push(new PMPoint(-0.945553, 0, -1.05445));\n",
       "obj48.userData.points.push(new PMPoint(-0.945553, 4.6, -1.05445));\n",
       "obj48.userData.points.push(new PMPoint(-1.05445, 4.6, -0.945553));\n",
       "obj48.userData.points.push(new PMPoint(-4.6, 4.6, -4.49111));\n",
       "obj48.userData.points.push(new PMPoint(-4.6, -3.54555, -4.49111));\n",
       "obj48.userData.points.push(new PMPoint(-4.6, -3.6, -4.6));\n",
       "obj48.userData.points.push(new PMPoint(-4.6, 4.6, -4.6));\n",
       "\n",
       "obj48.userData.edgeindices = [0, 1, 1, 3, 2, 3, 0, 4, 3, 4, 2, 5, 4, 5, 5, 6, 2, 7, 6, 7, 1, 8, 7, 8, 0, 9, 6, 9, 8, 9];\n",
       "obj48.userData.facets = [[4, 3, 1, 0], [2, 3, 4, 5], [1, 3, 2, 7, 8], [7, 2, 5, 6], [8, 7, 6, 9], [4, 0, 9, 6, 5], [0, 1, 8, 9]];\n",
       "   <!-- Facet style -->\n",
       "obj48.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj48);\n",
       "scene.add(obj48);\n",
       "\n",
       "var obj49 = new THREE.Object3D();\n",
       "obj49.name = \"_bounded\";\n",
       "obj49.userData.explodable = 1;\n",
       "obj49.userData.points = [];\n",
       "obj49.userData.points.push(new PMPoint(4.6, -2.05445, 0.0544472));\n",
       "obj49.userData.points.push(new PMPoint(4.6, -1.94555, -0.0544472));\n",
       "obj49.userData.points.push(new PMPoint(0, -1.94555, -0.0544472));\n",
       "obj49.userData.points.push(new PMPoint(0, -2.05445, 0.0544472));\n",
       "obj49.userData.points.push(new PMPoint(-2.65445, -4.6, -2.70889));\n",
       "obj49.userData.points.push(new PMPoint(-2.54555, -4.6, -2.49111));\n",
       "obj49.userData.points.push(new PMPoint(4.6, -4.6, -2.70889));\n",
       "obj49.userData.points.push(new PMPoint(4.6, -4.6, -2.49111));\n",
       "\n",
       "obj49.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj49.userData.facets = [[2, 1, 6, 4], [0, 1, 2, 3], [2, 4, 5, 3], [7, 0, 3, 5], [6, 1, 0, 7], [4, 6, 7, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj49.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj49);\n",
       "scene.add(obj49);\n",
       "\n",
       "var obj50 = new THREE.Object3D();\n",
       "obj50.name = \"_bounded\";\n",
       "obj50.userData.explodable = 1;\n",
       "obj50.userData.points = [];\n",
       "obj50.userData.points.push(new PMPoint(0, -1.077, -1));\n",
       "obj50.userData.points.push(new PMPoint(0, -1.077, 0));\n",
       "obj50.userData.points.push(new PMPoint(0, -0.923, 0));\n",
       "obj50.userData.points.push(new PMPoint(0, -0.923, -1));\n",
       "obj50.userData.points.push(new PMPoint(4.6, -0.923, 0));\n",
       "obj50.userData.points.push(new PMPoint(4.6, -0.923, -1));\n",
       "obj50.userData.points.push(new PMPoint(4.6, -1.077, 0));\n",
       "obj50.userData.points.push(new PMPoint(4.6, -1.077, -1));\n",
       "\n",
       "obj50.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj50.userData.facets = [[7, 0, 3, 5], [1, 0, 7, 6], [2, 1, 6, 4], [5, 3, 2, 4], [3, 0, 1, 2], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj50.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj50);\n",
       "scene.add(obj50);\n",
       "\n",
       "var obj51 = new THREE.Object3D();\n",
       "obj51.name = \"_bounded\";\n",
       "obj51.userData.explodable = 1;\n",
       "obj51.userData.points = [];\n",
       "obj51.userData.points.push(new PMPoint(-3.65445, -4.54555, -4.6));\n",
       "obj51.userData.points.push(new PMPoint(-0.0544472, -0.945553, 0));\n",
       "obj51.userData.points.push(new PMPoint(-0.0544472, -0.945553, -1));\n",
       "obj51.userData.points.push(new PMPoint(0.0544472, -1.05445, -1));\n",
       "obj51.userData.points.push(new PMPoint(0.0544472, -1.05445, 0));\n",
       "obj51.userData.points.push(new PMPoint(-3.49111, -4.6, -3.54555));\n",
       "obj51.userData.points.push(new PMPoint(-3.49111, -4.6, -4.54555));\n",
       "obj51.userData.points.push(new PMPoint(-3.70889, -4.6, -3.65445));\n",
       "obj51.userData.points.push(new PMPoint(-3.70889, -4.6, -4.6));\n",
       "obj51.userData.points.push(new PMPoint(-3.6, -4.6, -4.6));\n",
       "\n",
       "obj51.userData.edgeindices = [0, 2, 1, 2, 2, 3, 1, 4, 3, 4, 4, 5, 3, 6, 5, 6, 1, 7, 5, 7, 0, 8, 7, 8, 0, 9, 6, 9, 8, 9];\n",
       "obj51.userData.facets = [[0, 2, 3, 6, 9], [1, 2, 0, 8, 7], [4, 1, 7, 5], [6, 3, 4, 5], [3, 2, 1, 4], [9, 6, 5, 7, 8], [0, 9, 8]];\n",
       "   <!-- Facet style -->\n",
       "obj51.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj51);\n",
       "scene.add(obj51);\n",
       "\n",
       "var obj52 = new THREE.Object3D();\n",
       "obj52.name = \"_bounded\";\n",
       "obj52.userData.explodable = 1;\n",
       "obj52.userData.points = [];\n",
       "obj52.userData.points.push(new PMPoint(0, -2, -0.077));\n",
       "obj52.userData.points.push(new PMPoint(0, -2, 0.077));\n",
       "obj52.userData.points.push(new PMPoint(0, -1, 0.077));\n",
       "obj52.userData.points.push(new PMPoint(0, -1, -0.077));\n",
       "obj52.userData.points.push(new PMPoint(4.6, -1, 0.077));\n",
       "obj52.userData.points.push(new PMPoint(4.6, -1, -0.077));\n",
       "obj52.userData.points.push(new PMPoint(4.6, -2, 0.077));\n",
       "obj52.userData.points.push(new PMPoint(4.6, -2, -0.077));\n",
       "\n",
       "obj52.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj52.userData.facets = [[7, 0, 3, 5], [1, 0, 7, 6], [2, 1, 6, 4], [5, 3, 2, 4], [3, 0, 1, 2], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj52.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj52);\n",
       "scene.add(obj52);\n",
       "\n",
       "var obj53 = new THREE.Object3D();\n",
       "obj53.name = \"_bounded\";\n",
       "obj53.userData.explodable = 1;\n",
       "obj53.userData.points = [];\n",
       "obj53.userData.points.push(new PMPoint(-0.0544472, -2, 0.0544472));\n",
       "obj53.userData.points.push(new PMPoint(0.0544472, -2, -0.0544472));\n",
       "obj53.userData.points.push(new PMPoint(0.0544472, -1, -0.0544472));\n",
       "obj53.userData.points.push(new PMPoint(-0.0544472, -1, 0.0544472));\n",
       "obj53.userData.points.push(new PMPoint(-3.54555, -4.6, -3.65445));\n",
       "obj53.userData.points.push(new PMPoint(-3.65445, -4.6, -3.54555));\n",
       "obj53.userData.points.push(new PMPoint(-2.54555, -4.6, -2.65445));\n",
       "obj53.userData.points.push(new PMPoint(-2.65445, -4.6, -2.54555));\n",
       "\n",
       "obj53.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj53.userData.facets = [[7, 0, 3, 5], [1, 0, 7, 6], [2, 1, 6, 4], [5, 3, 2, 4], [3, 0, 1, 2], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj53.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj53);\n",
       "scene.add(obj53);\n",
       "\n",
       "var obj54 = new THREE.Object3D();\n",
       "obj54.name = \"_bounded\";\n",
       "obj54.userData.explodable = 1;\n",
       "obj54.userData.points = [];\n",
       "obj54.userData.points.push(new PMPoint(4.6, 0.0544472, -2.05445));\n",
       "obj54.userData.points.push(new PMPoint(4.6, -0.0544472, -1.94555));\n",
       "obj54.userData.points.push(new PMPoint(0, -0.0544472, -1.94555));\n",
       "obj54.userData.points.push(new PMPoint(0, 0.0544472, -2.05445));\n",
       "obj54.userData.points.push(new PMPoint(-2.65445, -2.70889, -4.6));\n",
       "obj54.userData.points.push(new PMPoint(-2.54555, -2.49111, -4.6));\n",
       "obj54.userData.points.push(new PMPoint(4.6, -2.70889, -4.6));\n",
       "obj54.userData.points.push(new PMPoint(4.6, -2.49111, -4.6));\n",
       "\n",
       "obj54.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj54.userData.facets = [[3, 0, 7, 5], [1, 0, 3, 2], [3, 5, 4, 2], [6, 1, 2, 4], [7, 0, 1, 6], [5, 7, 6, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj54.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj54);\n",
       "scene.add(obj54);\n",
       "\n",
       "var obj55 = new THREE.Object3D();\n",
       "obj55.name = \"_bounded\";\n",
       "obj55.userData.explodable = 1;\n",
       "obj55.userData.points = [];\n",
       "obj55.userData.points.push(new PMPoint(0, -1, -1.077));\n",
       "obj55.userData.points.push(new PMPoint(0, 0, -1.077));\n",
       "obj55.userData.points.push(new PMPoint(0, 0, -0.923));\n",
       "obj55.userData.points.push(new PMPoint(0, -1, -0.923));\n",
       "obj55.userData.points.push(new PMPoint(4.6, 0, -0.923));\n",
       "obj55.userData.points.push(new PMPoint(4.6, -1, -0.923));\n",
       "obj55.userData.points.push(new PMPoint(4.6, 0, -1.077));\n",
       "obj55.userData.points.push(new PMPoint(4.6, -1, -1.077));\n",
       "\n",
       "obj55.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj55.userData.facets = [[7, 0, 1, 6], [3, 0, 7, 5], [2, 3, 5, 4], [6, 1, 2, 4], [1, 0, 3, 2], [7, 6, 4, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj55.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj55);\n",
       "scene.add(obj55);\n",
       "\n",
       "var obj56 = new THREE.Object3D();\n",
       "obj56.name = \"_bounded\";\n",
       "obj56.userData.explodable = 1;\n",
       "obj56.userData.points = [];\n",
       "obj56.userData.points.push(new PMPoint(-3.49111, -3.54555, -4.6));\n",
       "obj56.userData.points.push(new PMPoint(-3.49111, -4.54555, -4.6));\n",
       "obj56.userData.points.push(new PMPoint(-3.70889, -3.65445, -4.6));\n",
       "obj56.userData.points.push(new PMPoint(-0.0544472, 0, -0.945553));\n",
       "obj56.userData.points.push(new PMPoint(-0.0544472, -1, -0.945553));\n",
       "obj56.userData.points.push(new PMPoint(0.0544472, -1, -1.05445));\n",
       "obj56.userData.points.push(new PMPoint(0.0544472, 0, -1.05445));\n",
       "obj56.userData.points.push(new PMPoint(-3.65445, -4.6, -4.54555));\n",
       "obj56.userData.points.push(new PMPoint(-3.70889, -4.6, -4.6));\n",
       "obj56.userData.points.push(new PMPoint(-3.6, -4.6, -4.6));\n",
       "\n",
       "obj56.userData.edgeindices = [0, 1, 0, 2, 2, 3, 3, 4, 1, 5, 4, 5, 0, 6, 3, 6, 5, 6, 4, 7, 2, 8, 7, 8, 1, 9, 7, 9, 8, 9];\n",
       "obj56.userData.facets = [[7, 4, 3, 2, 8], [5, 4, 7, 9, 1], [6, 5, 1, 0], [2, 3, 6, 0], [3, 4, 5, 6], [7, 8, 9], [8, 2, 0, 1, 9]];\n",
       "   <!-- Facet style -->\n",
       "obj56.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj56);\n",
       "scene.add(obj56);\n",
       "\n",
       "var obj57 = new THREE.Object3D();\n",
       "obj57.name = \"_bounded\";\n",
       "obj57.userData.explodable = 1;\n",
       "obj57.userData.points = [];\n",
       "obj57.userData.points.push(new PMPoint(0, -0.077, -2));\n",
       "obj57.userData.points.push(new PMPoint(0, 0.077, -2));\n",
       "obj57.userData.points.push(new PMPoint(0, 0.077, -1));\n",
       "obj57.userData.points.push(new PMPoint(0, -0.077, -1));\n",
       "obj57.userData.points.push(new PMPoint(4.6, 0.077, -1));\n",
       "obj57.userData.points.push(new PMPoint(4.6, -0.077, -1));\n",
       "obj57.userData.points.push(new PMPoint(4.6, 0.077, -2));\n",
       "obj57.userData.points.push(new PMPoint(4.6, -0.077, -2));\n",
       "\n",
       "obj57.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj57.userData.facets = [[7, 0, 1, 6], [3, 0, 7, 5], [2, 3, 5, 4], [6, 1, 2, 4], [1, 0, 3, 2], [7, 6, 4, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj57.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj57);\n",
       "scene.add(obj57);\n",
       "\n",
       "var obj58 = new THREE.Object3D();\n",
       "obj58.name = \"_bounded\";\n",
       "obj58.userData.explodable = 1;\n",
       "obj58.userData.points = [];\n",
       "obj58.userData.points.push(new PMPoint(-0.0544472, 0.0544472, -2));\n",
       "obj58.userData.points.push(new PMPoint(0.0544472, -0.0544472, -2));\n",
       "obj58.userData.points.push(new PMPoint(0.0544472, -0.0544472, -1));\n",
       "obj58.userData.points.push(new PMPoint(-0.0544472, 0.0544472, -1));\n",
       "obj58.userData.points.push(new PMPoint(-3.54555, -3.65445, -4.6));\n",
       "obj58.userData.points.push(new PMPoint(-3.65445, -3.54555, -4.6));\n",
       "obj58.userData.points.push(new PMPoint(-2.54555, -2.65445, -4.6));\n",
       "obj58.userData.points.push(new PMPoint(-2.65445, -2.54555, -4.6));\n",
       "\n",
       "obj58.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj58.userData.facets = [[7, 0, 1, 6], [3, 0, 7, 5], [2, 3, 5, 4], [6, 1, 2, 4], [1, 0, 3, 2], [7, 6, 4, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj58.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj58);\n",
       "scene.add(obj58);\n",
       "\n",
       "var obj59 = new THREE.Object3D();\n",
       "obj59.name = \"_bounded\";\n",
       "obj59.userData.explodable = 1;\n",
       "obj59.userData.points = [];\n",
       "obj59.userData.points.push(new PMPoint(4.6, -4.49111, -4.6));\n",
       "obj59.userData.points.push(new PMPoint(-3.54555, -4.49111, -4.6));\n",
       "obj59.userData.points.push(new PMPoint(0, -1.05445, -0.945553));\n",
       "obj59.userData.points.push(new PMPoint(0, -0.945553, -1.05445));\n",
       "obj59.userData.points.push(new PMPoint(4.6, -0.945553, -1.05445));\n",
       "obj59.userData.points.push(new PMPoint(4.6, -1.05445, -0.945553));\n",
       "obj59.userData.points.push(new PMPoint(4.6, -4.6, -4.49111));\n",
       "obj59.userData.points.push(new PMPoint(-3.54555, -4.6, -4.49111));\n",
       "obj59.userData.points.push(new PMPoint(-3.6, -4.6, -4.6));\n",
       "obj59.userData.points.push(new PMPoint(4.6, -4.6, -4.6));\n",
       "\n",
       "obj59.userData.edgeindices = [0, 1, 1, 3, 2, 3, 0, 4, 3, 4, 2, 5, 4, 5, 5, 6, 2, 7, 6, 7, 1, 8, 7, 8, 0, 9, 6, 9, 8, 9];\n",
       "obj59.userData.facets = [[3, 4, 0, 1], [5, 4, 3, 2], [3, 1, 8, 7, 2], [6, 5, 2, 7], [0, 4, 5, 6, 9], [9, 6, 7, 8], [1, 0, 9, 8]];\n",
       "   <!-- Facet style -->\n",
       "obj59.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj59);\n",
       "scene.add(obj59);\n",
       "\n",
       "var obj60 = new THREE.Object3D();\n",
       "obj60.name = \"unnamed__7\";\n",
       "obj60.userData.explodable = 1;\n",
       "obj60.userData.points = [];\n",
       "obj60.userData.points.push(new PMPoint(0.945553, 0, 1.05445));\n",
       "obj60.userData.points.push(new PMPoint(1.05445, 0, 0.945553));\n",
       "obj60.userData.points.push(new PMPoint(-0.0544472, 0, 0.0544472));\n",
       "obj60.userData.points.push(new PMPoint(0.0544472, 0, -0.0544472));\n",
       "obj60.userData.points.push(new PMPoint(-0.0544472, -1, 0.0544472));\n",
       "obj60.userData.points.push(new PMPoint(0.0544472, -1, -0.0544472));\n",
       "obj60.userData.points.push(new PMPoint(0.945553, 1, 1.05445));\n",
       "obj60.userData.points.push(new PMPoint(1.05445, 1, 0.945553));\n",
       "\n",
       "obj60.userData.edgeindices = [0, 1, 2, 3, 0, 4, 2, 4, 1, 5, 3, 5, 4, 5, 0, 6, 2, 6, 1, 7, 3, 7, 6, 7];\n",
       "obj60.userData.facets = [[4, 5, 1, 0], [3, 5, 4, 2], [4, 0, 6, 2], [7, 3, 2, 6], [1, 5, 3, 7], [0, 1, 7, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj60.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj60);\n",
       "scene.add(obj60);\n",
       "\n",
       "var obj61 = new THREE.Object3D();\n",
       "obj61.name = \"unnamed__8\";\n",
       "obj61.userData.explodable = 1;\n",
       "obj61.userData.points = [];\n",
       "obj61.userData.points.push(new PMPoint(-0.0544472, 0.0544472, -1));\n",
       "obj61.userData.points.push(new PMPoint(0.0544472, -0.0544472, -1));\n",
       "obj61.userData.points.push(new PMPoint(-0.0544472, 0.0544472, 0));\n",
       "obj61.userData.points.push(new PMPoint(0.0544472, -0.0544472, 0));\n",
       "obj61.userData.points.push(new PMPoint(0.945553, 1.05445, 0));\n",
       "obj61.userData.points.push(new PMPoint(1.05445, 0.945553, 0));\n",
       "obj61.userData.points.push(new PMPoint(0.945553, 1.05445, 1));\n",
       "obj61.userData.points.push(new PMPoint(1.05445, 0.945553, 1));\n",
       "\n",
       "obj61.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 0, 4, 1, 5, 4, 5, 2, 6, 4, 6, 3, 7, 5, 7, 6, 7];\n",
       "obj61.userData.facets = [[1, 0, 4, 5], [2, 0, 1, 3], [4, 0, 2, 6], [6, 2, 3, 7], [1, 5, 7, 3], [5, 4, 6, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj61.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj61);\n",
       "scene.add(obj61);\n",
       "\n",
       "var obj62 = new THREE.Object3D();\n",
       "obj62.name = \"unnamed__9\";\n",
       "obj62.userData.explodable = 1;\n",
       "obj62.userData.points = [];\n",
       "obj62.userData.points.push(new PMPoint(-1, 0, 0.077));\n",
       "obj62.userData.points.push(new PMPoint(-1, 0, -0.077));\n",
       "obj62.userData.points.push(new PMPoint(0, 0, 0.077));\n",
       "obj62.userData.points.push(new PMPoint(0, 0, -0.077));\n",
       "obj62.userData.points.push(new PMPoint(-1, -1, 0.077));\n",
       "obj62.userData.points.push(new PMPoint(-1, -1, -0.077));\n",
       "obj62.userData.points.push(new PMPoint(0, -1, 0.077));\n",
       "obj62.userData.points.push(new PMPoint(0, -1, -0.077));\n",
       "\n",
       "obj62.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 0, 4, 1, 5, 4, 5, 2, 6, 4, 6, 3, 7, 5, 7, 6, 7];\n",
       "obj62.userData.facets = [[5, 1, 3, 7], [0, 1, 5, 4], [5, 7, 6, 4], [2, 0, 4, 6], [3, 1, 0, 2], [7, 3, 2, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj62.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj62);\n",
       "scene.add(obj62);\n",
       "\n",
       "var obj63 = new THREE.Object3D();\n",
       "obj63.name = \"unnamed__10\";\n",
       "obj63.userData.explodable = 1;\n",
       "obj63.userData.points = [];\n",
       "obj63.userData.points.push(new PMPoint(-1, 0.077, 0));\n",
       "obj63.userData.points.push(new PMPoint(-1, -0.077, 0));\n",
       "obj63.userData.points.push(new PMPoint(0, 0.077, -1));\n",
       "obj63.userData.points.push(new PMPoint(0, -0.077, -1));\n",
       "obj63.userData.points.push(new PMPoint(-1, 0.077, -1));\n",
       "obj63.userData.points.push(new PMPoint(-1, -0.077, -1));\n",
       "obj63.userData.points.push(new PMPoint(0, 0.077, 0));\n",
       "obj63.userData.points.push(new PMPoint(0, -0.077, 0));\n",
       "\n",
       "obj63.userData.edgeindices = [0, 1, 2, 3, 0, 4, 2, 4, 1, 5, 3, 5, 4, 5, 0, 6, 2, 6, 1, 7, 3, 7, 6, 7];\n",
       "obj63.userData.facets = [[5, 4, 2, 3], [0, 4, 5, 1], [5, 3, 7, 1], [6, 0, 1, 7], [2, 4, 0, 6], [3, 2, 6, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj63.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj63);\n",
       "scene.add(obj63);\n",
       "\n",
       "var obj64 = new THREE.Object3D();\n",
       "obj64.name = \"unnamed__11\";\n",
       "obj64.userData.explodable = 1;\n",
       "obj64.userData.points = [];\n",
       "obj64.userData.points.push(new PMPoint(0.077, 0, -1));\n",
       "obj64.userData.points.push(new PMPoint(-0.077, 0, -1));\n",
       "obj64.userData.points.push(new PMPoint(0.077, 0, 0));\n",
       "obj64.userData.points.push(new PMPoint(-0.077, 0, 0));\n",
       "obj64.userData.points.push(new PMPoint(0.077, -1, -1));\n",
       "obj64.userData.points.push(new PMPoint(-0.077, -1, -1));\n",
       "obj64.userData.points.push(new PMPoint(0.077, -1, 0));\n",
       "obj64.userData.points.push(new PMPoint(-0.077, -1, 0));\n",
       "\n",
       "obj64.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 0, 4, 1, 5, 4, 5, 2, 6, 4, 6, 3, 7, 5, 7, 6, 7];\n",
       "obj64.userData.facets = [[5, 1, 0, 4], [3, 1, 5, 7], [5, 4, 6, 7], [2, 3, 7, 6], [0, 1, 3, 2], [4, 0, 2, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj64.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );\n",
       "init_object(obj64);\n",
       "scene.add(obj64);\n",
       "\n",
       "var obj65 = new THREE.Object3D();\n",
       "obj65.name = \"_bounded\";\n",
       "obj65.userData.explodable = 1;\n",
       "obj65.userData.points = [];\n",
       "obj65.userData.points.push(new PMPoint(2.077, 4.6, 2));\n",
       "obj65.userData.points.push(new PMPoint(1.923, 4.6, 2));\n",
       "obj65.userData.points.push(new PMPoint(1.923, 2, 2));\n",
       "obj65.userData.points.push(new PMPoint(2.077, 2, 2));\n",
       "obj65.userData.points.push(new PMPoint(1.923, 2, 4.6));\n",
       "obj65.userData.points.push(new PMPoint(2.077, 2, 4.6));\n",
       "obj65.userData.points.push(new PMPoint(1.923, 4.6, 4.6));\n",
       "obj65.userData.points.push(new PMPoint(2.077, 4.6, 4.6));\n",
       "\n",
       "obj65.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj65.userData.facets = [[5, 3, 0, 7], [1, 2, 4, 6], [2, 3, 5, 4], [0, 3, 2, 1], [7, 0, 1, 6], [5, 7, 6, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj65.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj65);\n",
       "scene.add(obj65);\n",
       "\n",
       "var obj66 = new THREE.Object3D();\n",
       "obj66.name = \"_bounded\";\n",
       "obj66.userData.explodable = 1;\n",
       "obj66.userData.points = [];\n",
       "obj66.userData.points.push(new PMPoint(0, 1.077, 1));\n",
       "obj66.userData.points.push(new PMPoint(1, 1.077, 1));\n",
       "obj66.userData.points.push(new PMPoint(0, 0.923, 1));\n",
       "obj66.userData.points.push(new PMPoint(1, 0.923, 1));\n",
       "obj66.userData.points.push(new PMPoint(1, 0.923, 4.6));\n",
       "obj66.userData.points.push(new PMPoint(0, 0.923, 4.6));\n",
       "obj66.userData.points.push(new PMPoint(1, 1.077, 4.6));\n",
       "obj66.userData.points.push(new PMPoint(0, 1.077, 4.6));\n",
       "\n",
       "obj66.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 3, 4, 2, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj66.userData.facets = [[5, 2, 3, 4], [0, 2, 5, 7], [1, 0, 7, 6], [4, 3, 1, 6], [3, 2, 0, 1], [5, 4, 6, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj66.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj66);\n",
       "scene.add(obj66);\n",
       "\n",
       "var obj67 = new THREE.Object3D();\n",
       "obj67.name = \"_bounded\";\n",
       "obj67.userData.explodable = 1;\n",
       "obj67.userData.points = [];\n",
       "obj67.userData.points.push(new PMPoint(0, 1, 1.077));\n",
       "obj67.userData.points.push(new PMPoint(1, 1, 1.077));\n",
       "obj67.userData.points.push(new PMPoint(0, 1, 0.923));\n",
       "obj67.userData.points.push(new PMPoint(1, 1, 0.923));\n",
       "obj67.userData.points.push(new PMPoint(1, 4.6, 0.923));\n",
       "obj67.userData.points.push(new PMPoint(0, 4.6, 0.923));\n",
       "obj67.userData.points.push(new PMPoint(1, 4.6, 1.077));\n",
       "obj67.userData.points.push(new PMPoint(0, 4.6, 1.077));\n",
       "\n",
       "obj67.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 3, 4, 2, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj67.userData.facets = [[2, 5, 4, 3], [7, 5, 2, 0], [6, 7, 0, 1], [3, 4, 6, 1], [2, 3, 1, 0], [4, 5, 7, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj67.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj67);\n",
       "scene.add(obj67);\n",
       "\n",
       "var obj68 = new THREE.Object3D();\n",
       "obj68.name = \"_bounded\";\n",
       "obj68.userData.explodable = 1;\n",
       "obj68.userData.points = [];\n",
       "obj68.userData.points.push(new PMPoint(4.6, 2.077, 2));\n",
       "obj68.userData.points.push(new PMPoint(4.6, 1.923, 2));\n",
       "obj68.userData.points.push(new PMPoint(2, 1.923, 2));\n",
       "obj68.userData.points.push(new PMPoint(2, 2.077, 2));\n",
       "obj68.userData.points.push(new PMPoint(2, 1.923, 4.6));\n",
       "obj68.userData.points.push(new PMPoint(2, 2.077, 4.6));\n",
       "obj68.userData.points.push(new PMPoint(4.6, 1.923, 4.6));\n",
       "obj68.userData.points.push(new PMPoint(4.6, 2.077, 4.6));\n",
       "\n",
       "obj68.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj68.userData.facets = [[3, 5, 7, 0], [4, 5, 3, 2], [6, 4, 2, 1], [3, 0, 1, 2], [0, 7, 6, 1], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj68.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj68);\n",
       "scene.add(obj68);\n",
       "\n",
       "var obj69 = new THREE.Object3D();\n",
       "obj69.name = \"_bounded\";\n",
       "obj69.userData.explodable = 1;\n",
       "obj69.userData.points = [];\n",
       "obj69.userData.points.push(new PMPoint(1.077, 0, 1));\n",
       "obj69.userData.points.push(new PMPoint(1.077, 1, 1));\n",
       "obj69.userData.points.push(new PMPoint(0.923, 0, 1));\n",
       "obj69.userData.points.push(new PMPoint(0.923, 1, 1));\n",
       "obj69.userData.points.push(new PMPoint(0.923, 1, 4.6));\n",
       "obj69.userData.points.push(new PMPoint(0.923, 0, 4.6));\n",
       "obj69.userData.points.push(new PMPoint(1.077, 1, 4.6));\n",
       "obj69.userData.points.push(new PMPoint(1.077, 0, 4.6));\n",
       "\n",
       "obj69.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 3, 4, 2, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj69.userData.facets = [[5, 2, 0, 7], [3, 2, 5, 4], [1, 3, 4, 6], [7, 0, 1, 6], [0, 2, 3, 1], [5, 7, 6, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj69.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj69);\n",
       "scene.add(obj69);\n",
       "\n",
       "var obj70 = new THREE.Object3D();\n",
       "obj70.name = \"_bounded\";\n",
       "obj70.userData.explodable = 1;\n",
       "obj70.userData.points = [];\n",
       "obj70.userData.points.push(new PMPoint(1, 0, 1.077));\n",
       "obj70.userData.points.push(new PMPoint(1, 1, 1.077));\n",
       "obj70.userData.points.push(new PMPoint(1, 0, 0.923));\n",
       "obj70.userData.points.push(new PMPoint(1, 1, 0.923));\n",
       "obj70.userData.points.push(new PMPoint(4.6, 1, 0.923));\n",
       "obj70.userData.points.push(new PMPoint(4.6, 0, 0.923));\n",
       "obj70.userData.points.push(new PMPoint(4.6, 1, 1.077));\n",
       "obj70.userData.points.push(new PMPoint(4.6, 0, 1.077));\n",
       "\n",
       "obj70.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 3, 4, 2, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj70.userData.facets = [[5, 2, 3, 4], [0, 2, 5, 7], [1, 0, 7, 6], [4, 3, 1, 6], [3, 2, 0, 1], [5, 4, 6, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj70.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj70);\n",
       "scene.add(obj70);\n",
       "\n",
       "var obj71 = new THREE.Object3D();\n",
       "obj71.name = \"_bounded\";\n",
       "obj71.userData.explodable = 1;\n",
       "obj71.userData.points = [];\n",
       "obj71.userData.points.push(new PMPoint(1.94555, 2.05445, 2));\n",
       "obj71.userData.points.push(new PMPoint(2.05445, 1.94555, 2));\n",
       "obj71.userData.points.push(new PMPoint(1.05445, 0.945553, 1));\n",
       "obj71.userData.points.push(new PMPoint(0.945553, 1.05445, 1));\n",
       "obj71.userData.points.push(new PMPoint(1.05445, 0.945553, 4.6));\n",
       "obj71.userData.points.push(new PMPoint(0.945553, 1.05445, 4.6));\n",
       "obj71.userData.points.push(new PMPoint(2.05445, 1.94555, 4.6));\n",
       "obj71.userData.points.push(new PMPoint(1.94555, 2.05445, 4.6));\n",
       "\n",
       "obj71.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj71.userData.facets = [[5, 3, 2, 4], [0, 3, 5, 7], [1, 0, 7, 6], [4, 2, 1, 6], [2, 3, 0, 1], [5, 4, 6, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj71.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj71);\n",
       "scene.add(obj71);\n",
       "\n",
       "var obj72 = new THREE.Object3D();\n",
       "obj72.name = \"_bounded\";\n",
       "obj72.userData.explodable = 1;\n",
       "obj72.userData.points = [];\n",
       "obj72.userData.points.push(new PMPoint(4.6, 2, 2.077));\n",
       "obj72.userData.points.push(new PMPoint(4.6, 2, 1.923));\n",
       "obj72.userData.points.push(new PMPoint(2, 2, 1.923));\n",
       "obj72.userData.points.push(new PMPoint(2, 2, 2.077));\n",
       "obj72.userData.points.push(new PMPoint(2, 4.6, 1.923));\n",
       "obj72.userData.points.push(new PMPoint(2, 4.6, 2.077));\n",
       "obj72.userData.points.push(new PMPoint(4.6, 4.6, 1.923));\n",
       "obj72.userData.points.push(new PMPoint(4.6, 4.6, 2.077));\n",
       "\n",
       "obj72.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj72.userData.facets = [[5, 3, 0, 7], [2, 3, 5, 4], [0, 3, 2, 1], [1, 2, 4, 6], [7, 0, 1, 6], [5, 7, 6, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj72.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj72);\n",
       "scene.add(obj72);\n",
       "\n",
       "var obj73 = new THREE.Object3D();\n",
       "obj73.name = \"_bounded\";\n",
       "obj73.userData.explodable = 1;\n",
       "obj73.userData.points = [];\n",
       "obj73.userData.points.push(new PMPoint(1.077, 1, 1));\n",
       "obj73.userData.points.push(new PMPoint(1.077, 1, 0));\n",
       "obj73.userData.points.push(new PMPoint(0.923, 1, 1));\n",
       "obj73.userData.points.push(new PMPoint(0.923, 1, 0));\n",
       "obj73.userData.points.push(new PMPoint(0.923, 4.6, 0));\n",
       "obj73.userData.points.push(new PMPoint(0.923, 4.6, 1));\n",
       "obj73.userData.points.push(new PMPoint(1.077, 4.6, 0));\n",
       "obj73.userData.points.push(new PMPoint(1.077, 4.6, 1));\n",
       "\n",
       "obj73.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 3, 4, 2, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj73.userData.facets = [[3, 4, 6, 1], [5, 4, 3, 2], [7, 5, 2, 0], [1, 6, 7, 0], [3, 1, 0, 2], [6, 4, 5, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj73.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj73);\n",
       "scene.add(obj73);\n",
       "\n",
       "var obj74 = new THREE.Object3D();\n",
       "obj74.name = \"_bounded\";\n",
       "obj74.userData.explodable = 1;\n",
       "obj74.userData.points = [];\n",
       "obj74.userData.points.push(new PMPoint(1, 1.077, 1));\n",
       "obj74.userData.points.push(new PMPoint(1, 1.077, 0));\n",
       "obj74.userData.points.push(new PMPoint(1, 0.923, 1));\n",
       "obj74.userData.points.push(new PMPoint(1, 0.923, 0));\n",
       "obj74.userData.points.push(new PMPoint(4.6, 0.923, 0));\n",
       "obj74.userData.points.push(new PMPoint(4.6, 0.923, 1));\n",
       "obj74.userData.points.push(new PMPoint(4.6, 1.077, 0));\n",
       "obj74.userData.points.push(new PMPoint(4.6, 1.077, 1));\n",
       "\n",
       "obj74.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 3, 4, 2, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj74.userData.facets = [[4, 3, 1, 6], [2, 3, 4, 5], [0, 2, 5, 7], [6, 1, 0, 7], [1, 3, 2, 0], [4, 6, 7, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj74.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj74);\n",
       "scene.add(obj74);\n",
       "\n",
       "var obj75 = new THREE.Object3D();\n",
       "obj75.name = \"_bounded\";\n",
       "obj75.userData.explodable = 1;\n",
       "obj75.userData.points = [];\n",
       "obj75.userData.points.push(new PMPoint(1.94555, 2, 2.05445));\n",
       "obj75.userData.points.push(new PMPoint(2.05445, 2, 1.94555));\n",
       "obj75.userData.points.push(new PMPoint(1.05445, 1, 0.945553));\n",
       "obj75.userData.points.push(new PMPoint(0.945553, 1, 1.05445));\n",
       "obj75.userData.points.push(new PMPoint(1.05445, 4.6, 0.945553));\n",
       "obj75.userData.points.push(new PMPoint(0.945553, 4.6, 1.05445));\n",
       "obj75.userData.points.push(new PMPoint(2.05445, 4.6, 1.94555));\n",
       "obj75.userData.points.push(new PMPoint(1.94555, 4.6, 2.05445));\n",
       "\n",
       "obj75.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj75.userData.facets = [[3, 5, 4, 2], [7, 5, 3, 0], [6, 7, 0, 1], [2, 4, 6, 1], [3, 2, 1, 0], [4, 5, 7, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj75.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj75);\n",
       "scene.add(obj75);\n",
       "\n",
       "var obj76 = new THREE.Object3D();\n",
       "obj76.name = \"_bounded\";\n",
       "obj76.userData.explodable = 1;\n",
       "obj76.userData.points = [];\n",
       "obj76.userData.points.push(new PMPoint(2, 1.94555, 2.05445));\n",
       "obj76.userData.points.push(new PMPoint(2, 2.05445, 1.94555));\n",
       "obj76.userData.points.push(new PMPoint(1, 1.05445, 0.945553));\n",
       "obj76.userData.points.push(new PMPoint(1, 0.945553, 1.05445));\n",
       "obj76.userData.points.push(new PMPoint(4.6, 1.05445, 0.945553));\n",
       "obj76.userData.points.push(new PMPoint(4.6, 0.945553, 1.05445));\n",
       "obj76.userData.points.push(new PMPoint(4.6, 2.05445, 1.94555));\n",
       "obj76.userData.points.push(new PMPoint(4.6, 1.94555, 2.05445));\n",
       "\n",
       "obj76.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj76.userData.facets = [[5, 3, 2, 4], [0, 3, 5, 7], [1, 0, 7, 6], [4, 2, 1, 6], [2, 3, 0, 1], [5, 4, 6, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj76.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj76);\n",
       "scene.add(obj76);\n",
       "\n",
       "var obj77 = new THREE.Object3D();\n",
       "obj77.name = \"_bounded\";\n",
       "obj77.userData.explodable = 1;\n",
       "obj77.userData.points = [];\n",
       "obj77.userData.points.push(new PMPoint(-2.077, 4.6, 0));\n",
       "obj77.userData.points.push(new PMPoint(-1.923, 4.6, 0));\n",
       "obj77.userData.points.push(new PMPoint(-1.923, 0, 0));\n",
       "obj77.userData.points.push(new PMPoint(-2.077, 0, 0));\n",
       "obj77.userData.points.push(new PMPoint(-1.923, 0, 4.6));\n",
       "obj77.userData.points.push(new PMPoint(-2.077, 0, 4.6));\n",
       "obj77.userData.points.push(new PMPoint(-1.923, 4.6, 4.6));\n",
       "obj77.userData.points.push(new PMPoint(-2.077, 4.6, 4.6));\n",
       "\n",
       "obj77.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj77.userData.facets = [[4, 2, 1, 6], [0, 3, 5, 7], [3, 2, 4, 5], [1, 2, 3, 0], [6, 1, 0, 7], [4, 6, 7, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj77.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj77);\n",
       "scene.add(obj77);\n",
       "\n",
       "var obj78 = new THREE.Object3D();\n",
       "obj78.name = \"_bounded\";\n",
       "obj78.userData.explodable = 1;\n",
       "obj78.userData.points = [];\n",
       "obj78.userData.points.push(new PMPoint(-1.05445, 0.0544472, 0));\n",
       "obj78.userData.points.push(new PMPoint(-0.0544472, 1.05445, 1));\n",
       "obj78.userData.points.push(new PMPoint(0.0544472, 0.945553, 1));\n",
       "obj78.userData.points.push(new PMPoint(-0.945553, -0.0544472, 0));\n",
       "obj78.userData.points.push(new PMPoint(0.0544472, 0.945553, 4.6));\n",
       "obj78.userData.points.push(new PMPoint(-0.945553, -0.0544472, 4.6));\n",
       "obj78.userData.points.push(new PMPoint(-0.0544472, 1.05445, 4.6));\n",
       "obj78.userData.points.push(new PMPoint(-1.05445, 0.0544472, 4.6));\n",
       "\n",
       "obj78.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj78.userData.facets = [[7, 0, 3, 5], [1, 0, 7, 6], [2, 1, 6, 4], [5, 3, 2, 4], [3, 0, 1, 2], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj78.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj78);\n",
       "scene.add(obj78);\n",
       "\n",
       "var obj79 = new THREE.Object3D();\n",
       "obj79.name = \"_bounded\";\n",
       "obj79.userData.explodable = 1;\n",
       "obj79.userData.points = [];\n",
       "obj79.userData.points.push(new PMPoint(-1.05445, 0, 0.0544472));\n",
       "obj79.userData.points.push(new PMPoint(-0.0544472, 1, 1.05445));\n",
       "obj79.userData.points.push(new PMPoint(0.0544472, 1, 0.945553));\n",
       "obj79.userData.points.push(new PMPoint(-0.945553, 0, -0.0544472));\n",
       "obj79.userData.points.push(new PMPoint(0.0544472, 4.6, 0.945553));\n",
       "obj79.userData.points.push(new PMPoint(-0.945553, 4.6, -0.0544472));\n",
       "obj79.userData.points.push(new PMPoint(-0.0544472, 4.6, 1.05445));\n",
       "obj79.userData.points.push(new PMPoint(-1.05445, 4.6, 0.0544472));\n",
       "\n",
       "obj79.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj79.userData.facets = [[0, 7, 5, 3], [6, 7, 0, 1], [4, 6, 1, 2], [3, 5, 4, 2], [0, 3, 2, 1], [5, 7, 6, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj79.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj79);\n",
       "scene.add(obj79);\n",
       "\n",
       "var obj80 = new THREE.Object3D();\n",
       "obj80.name = \"_bounded\";\n",
       "obj80.userData.explodable = 1;\n",
       "obj80.userData.points = [];\n",
       "obj80.userData.points.push(new PMPoint(-0.077, 4.6, 1));\n",
       "obj80.userData.points.push(new PMPoint(0.077, 4.6, 1));\n",
       "obj80.userData.points.push(new PMPoint(0.077, 1, 1));\n",
       "obj80.userData.points.push(new PMPoint(-0.077, 1, 1));\n",
       "obj80.userData.points.push(new PMPoint(0.077, 1, 4.6));\n",
       "obj80.userData.points.push(new PMPoint(-0.077, 1, 4.6));\n",
       "obj80.userData.points.push(new PMPoint(0.077, 4.6, 4.6));\n",
       "obj80.userData.points.push(new PMPoint(-0.077, 4.6, 4.6));\n",
       "\n",
       "obj80.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj80.userData.facets = [[4, 2, 1, 6], [0, 3, 5, 7], [3, 2, 4, 5], [1, 2, 3, 0], [6, 1, 0, 7], [4, 6, 7, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj80.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj80);\n",
       "scene.add(obj80);\n",
       "\n",
       "var obj81 = new THREE.Object3D();\n",
       "obj81.name = \"_bounded\";\n",
       "obj81.userData.explodable = 1;\n",
       "obj81.userData.points = [];\n",
       "obj81.userData.points.push(new PMPoint(4.6, -2.077, 0));\n",
       "obj81.userData.points.push(new PMPoint(4.6, -1.923, 0));\n",
       "obj81.userData.points.push(new PMPoint(0, -1.923, 0));\n",
       "obj81.userData.points.push(new PMPoint(0, -2.077, 0));\n",
       "obj81.userData.points.push(new PMPoint(0, -1.923, 4.6));\n",
       "obj81.userData.points.push(new PMPoint(0, -2.077, 4.6));\n",
       "obj81.userData.points.push(new PMPoint(4.6, -1.923, 4.6));\n",
       "obj81.userData.points.push(new PMPoint(4.6, -2.077, 4.6));\n",
       "\n",
       "obj81.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj81.userData.facets = [[2, 4, 6, 1], [5, 4, 2, 3], [7, 5, 3, 0], [2, 1, 0, 3], [1, 6, 7, 0], [6, 4, 5, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj81.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj81);\n",
       "scene.add(obj81);\n",
       "\n",
       "var obj82 = new THREE.Object3D();\n",
       "obj82.name = \"_bounded\";\n",
       "obj82.userData.explodable = 1;\n",
       "obj82.userData.points = [];\n",
       "obj82.userData.points.push(new PMPoint(0.0544472, -1.05445, 0));\n",
       "obj82.userData.points.push(new PMPoint(1.05445, -0.0544472, 1));\n",
       "obj82.userData.points.push(new PMPoint(0.945553, 0.0544472, 1));\n",
       "obj82.userData.points.push(new PMPoint(-0.0544472, -0.945553, 0));\n",
       "obj82.userData.points.push(new PMPoint(0.945553, 0.0544472, 4.6));\n",
       "obj82.userData.points.push(new PMPoint(-0.0544472, -0.945553, 4.6));\n",
       "obj82.userData.points.push(new PMPoint(1.05445, -0.0544472, 4.6));\n",
       "obj82.userData.points.push(new PMPoint(0.0544472, -1.05445, 4.6));\n",
       "\n",
       "obj82.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj82.userData.facets = [[5, 3, 0, 7], [2, 3, 5, 4], [1, 2, 4, 6], [7, 0, 1, 6], [0, 3, 2, 1], [5, 7, 6, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj82.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj82);\n",
       "scene.add(obj82);\n",
       "\n",
       "var obj83 = new THREE.Object3D();\n",
       "obj83.name = \"_bounded\";\n",
       "obj83.userData.explodable = 1;\n",
       "obj83.userData.points = [];\n",
       "obj83.userData.points.push(new PMPoint(0, -1.05445, 0.0544472));\n",
       "obj83.userData.points.push(new PMPoint(1, -0.0544472, 1.05445));\n",
       "obj83.userData.points.push(new PMPoint(1, 0.0544472, 0.945553));\n",
       "obj83.userData.points.push(new PMPoint(0, -0.945553, -0.0544472));\n",
       "obj83.userData.points.push(new PMPoint(4.6, 0.0544472, 0.945553));\n",
       "obj83.userData.points.push(new PMPoint(4.6, -0.945553, -0.0544472));\n",
       "obj83.userData.points.push(new PMPoint(4.6, -0.0544472, 1.05445));\n",
       "obj83.userData.points.push(new PMPoint(4.6, -1.05445, 0.0544472));\n",
       "\n",
       "obj83.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj83.userData.facets = [[7, 0, 3, 5], [1, 0, 7, 6], [2, 1, 6, 4], [5, 3, 2, 4], [3, 0, 1, 2], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj83.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj83);\n",
       "scene.add(obj83);\n",
       "\n",
       "var obj84 = new THREE.Object3D();\n",
       "obj84.name = \"_bounded\";\n",
       "obj84.userData.explodable = 1;\n",
       "obj84.userData.points = [];\n",
       "obj84.userData.points.push(new PMPoint(4.6, -0.077, 1));\n",
       "obj84.userData.points.push(new PMPoint(4.6, 0.077, 1));\n",
       "obj84.userData.points.push(new PMPoint(1, 0.077, 1));\n",
       "obj84.userData.points.push(new PMPoint(1, -0.077, 1));\n",
       "obj84.userData.points.push(new PMPoint(1, 0.077, 4.6));\n",
       "obj84.userData.points.push(new PMPoint(1, -0.077, 4.6));\n",
       "obj84.userData.points.push(new PMPoint(4.6, 0.077, 4.6));\n",
       "obj84.userData.points.push(new PMPoint(4.6, -0.077, 4.6));\n",
       "\n",
       "obj84.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj84.userData.facets = [[2, 4, 6, 1], [5, 4, 2, 3], [7, 5, 3, 0], [2, 1, 0, 3], [1, 6, 7, 0], [6, 4, 5, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj84.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj84);\n",
       "scene.add(obj84);\n",
       "\n",
       "var obj85 = new THREE.Object3D();\n",
       "obj85.name = \"_bounded\";\n",
       "obj85.userData.explodable = 1;\n",
       "obj85.userData.points = [];\n",
       "obj85.userData.points.push(new PMPoint(4.6, 0, -2.077));\n",
       "obj85.userData.points.push(new PMPoint(4.6, 0, -1.923));\n",
       "obj85.userData.points.push(new PMPoint(0, 0, -1.923));\n",
       "obj85.userData.points.push(new PMPoint(0, 0, -2.077));\n",
       "obj85.userData.points.push(new PMPoint(0, 4.6, -1.923));\n",
       "obj85.userData.points.push(new PMPoint(0, 4.6, -2.077));\n",
       "obj85.userData.points.push(new PMPoint(4.6, 4.6, -1.923));\n",
       "obj85.userData.points.push(new PMPoint(4.6, 4.6, -2.077));\n",
       "\n",
       "obj85.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj85.userData.facets = [[4, 2, 1, 6], [3, 2, 4, 5], [1, 2, 3, 0], [0, 3, 5, 7], [6, 1, 0, 7], [4, 6, 7, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj85.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj85);\n",
       "scene.add(obj85);\n",
       "\n",
       "var obj86 = new THREE.Object3D();\n",
       "obj86.name = \"_bounded\";\n",
       "obj86.userData.explodable = 1;\n",
       "obj86.userData.points = [];\n",
       "obj86.userData.points.push(new PMPoint(0.0544472, 0, -1.05445));\n",
       "obj86.userData.points.push(new PMPoint(1.05445, 1, -0.0544472));\n",
       "obj86.userData.points.push(new PMPoint(0.945553, 1, 0.0544472));\n",
       "obj86.userData.points.push(new PMPoint(-0.0544472, 0, -0.945553));\n",
       "obj86.userData.points.push(new PMPoint(0.945553, 4.6, 0.0544472));\n",
       "obj86.userData.points.push(new PMPoint(-0.0544472, 4.6, -0.945553));\n",
       "obj86.userData.points.push(new PMPoint(1.05445, 4.6, -0.0544472));\n",
       "obj86.userData.points.push(new PMPoint(0.0544472, 4.6, -1.05445));\n",
       "\n",
       "obj86.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj86.userData.facets = [[3, 5, 7, 0], [4, 5, 3, 2], [6, 4, 2, 1], [0, 7, 6, 1], [3, 0, 1, 2], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj86.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj86);\n",
       "scene.add(obj86);\n",
       "\n",
       "var obj87 = new THREE.Object3D();\n",
       "obj87.name = \"_bounded\";\n",
       "obj87.userData.explodable = 1;\n",
       "obj87.userData.points = [];\n",
       "obj87.userData.points.push(new PMPoint(0, 0.0544472, -1.05445));\n",
       "obj87.userData.points.push(new PMPoint(1, 1.05445, -0.0544472));\n",
       "obj87.userData.points.push(new PMPoint(1, 0.945553, 0.0544472));\n",
       "obj87.userData.points.push(new PMPoint(0, -0.0544472, -0.945553));\n",
       "obj87.userData.points.push(new PMPoint(4.6, 0.945553, 0.0544472));\n",
       "obj87.userData.points.push(new PMPoint(4.6, -0.0544472, -0.945553));\n",
       "obj87.userData.points.push(new PMPoint(4.6, 1.05445, -0.0544472));\n",
       "obj87.userData.points.push(new PMPoint(4.6, 0.0544472, -1.05445));\n",
       "\n",
       "obj87.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj87.userData.facets = [[5, 3, 0, 7], [2, 3, 5, 4], [1, 2, 4, 6], [7, 0, 1, 6], [0, 3, 2, 1], [5, 7, 6, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj87.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj87);\n",
       "scene.add(obj87);\n",
       "\n",
       "var obj88 = new THREE.Object3D();\n",
       "obj88.name = \"_bounded\";\n",
       "obj88.userData.explodable = 1;\n",
       "obj88.userData.points = [];\n",
       "obj88.userData.points.push(new PMPoint(4.6, 1, -0.077));\n",
       "obj88.userData.points.push(new PMPoint(4.6, 1, 0.077));\n",
       "obj88.userData.points.push(new PMPoint(1, 1, 0.077));\n",
       "obj88.userData.points.push(new PMPoint(1, 1, -0.077));\n",
       "obj88.userData.points.push(new PMPoint(1, 4.6, 0.077));\n",
       "obj88.userData.points.push(new PMPoint(1, 4.6, -0.077));\n",
       "obj88.userData.points.push(new PMPoint(4.6, 4.6, 0.077));\n",
       "obj88.userData.points.push(new PMPoint(4.6, 4.6, -0.077));\n",
       "\n",
       "obj88.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj88.userData.facets = [[4, 2, 1, 6], [3, 2, 4, 5], [1, 2, 3, 0], [0, 3, 5, 7], [6, 1, 0, 7], [4, 6, 7, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj88.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj88);\n",
       "scene.add(obj88);\n",
       "\n",
       "var obj89 = new THREE.Object3D();\n",
       "obj89.name = \"_bounded\";\n",
       "obj89.userData.explodable = 1;\n",
       "obj89.userData.points = [];\n",
       "obj89.userData.points.push(new PMPoint(-2.05445, 0.0544472, 4.6));\n",
       "obj89.userData.points.push(new PMPoint(-1.94555, -0.0544472, 4.6));\n",
       "obj89.userData.points.push(new PMPoint(-1.94555, -0.0544472, 0));\n",
       "obj89.userData.points.push(new PMPoint(-2.05445, 0.0544472, 0));\n",
       "obj89.userData.points.push(new PMPoint(-4.6, -2.70889, -2.65445));\n",
       "obj89.userData.points.push(new PMPoint(-4.6, -2.49111, -2.54555));\n",
       "obj89.userData.points.push(new PMPoint(-4.6, -2.70889, 4.6));\n",
       "obj89.userData.points.push(new PMPoint(-4.6, -2.49111, 4.6));\n",
       "\n",
       "obj89.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj89.userData.facets = [[2, 1, 6, 4], [0, 1, 2, 3], [7, 0, 3, 5], [2, 4, 5, 3], [4, 6, 7, 5], [6, 1, 0, 7]];\n",
       "   <!-- Facet style -->\n",
       "obj89.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj89);\n",
       "scene.add(obj89);\n",
       "\n",
       "var obj90 = new THREE.Object3D();\n",
       "obj90.name = \"_bounded\";\n",
       "obj90.userData.explodable = 1;\n",
       "obj90.userData.points = [];\n",
       "obj90.userData.points.push(new PMPoint(-1.077, -1, 0));\n",
       "obj90.userData.points.push(new PMPoint(-1.077, 0, 0));\n",
       "obj90.userData.points.push(new PMPoint(-0.923, 0, 0));\n",
       "obj90.userData.points.push(new PMPoint(-0.923, -1, 0));\n",
       "obj90.userData.points.push(new PMPoint(-0.923, 0, 4.6));\n",
       "obj90.userData.points.push(new PMPoint(-0.923, -1, 4.6));\n",
       "obj90.userData.points.push(new PMPoint(-1.077, 0, 4.6));\n",
       "obj90.userData.points.push(new PMPoint(-1.077, -1, 4.6));\n",
       "\n",
       "obj90.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj90.userData.facets = [[7, 0, 3, 5], [1, 0, 7, 6], [2, 1, 6, 4], [5, 3, 2, 4], [3, 0, 1, 2], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj90.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj90);\n",
       "scene.add(obj90);\n",
       "\n",
       "var obj91 = new THREE.Object3D();\n",
       "obj91.name = \"_bounded\";\n",
       "obj91.userData.explodable = 1;\n",
       "obj91.userData.points = [];\n",
       "obj91.userData.points.push(new PMPoint(-4.54555, -4.6, -3.65445));\n",
       "obj91.userData.points.push(new PMPoint(-0.945553, 0, -0.0544472));\n",
       "obj91.userData.points.push(new PMPoint(-0.945553, -1, -0.0544472));\n",
       "obj91.userData.points.push(new PMPoint(-1.05445, -1, 0.0544472));\n",
       "obj91.userData.points.push(new PMPoint(-1.05445, 0, 0.0544472));\n",
       "obj91.userData.points.push(new PMPoint(-4.6, -3.54555, -3.49111));\n",
       "obj91.userData.points.push(new PMPoint(-4.6, -4.54555, -3.49111));\n",
       "obj91.userData.points.push(new PMPoint(-4.6, -3.65445, -3.70889));\n",
       "obj91.userData.points.push(new PMPoint(-4.6, -4.6, -3.70889));\n",
       "obj91.userData.points.push(new PMPoint(-4.6, -4.6, -3.6));\n",
       "\n",
       "obj91.userData.edgeindices = [0, 2, 1, 2, 2, 3, 1, 4, 3, 4, 4, 5, 3, 6, 5, 6, 1, 7, 5, 7, 0, 8, 7, 8, 0, 9, 6, 9, 8, 9];\n",
       "obj91.userData.facets = [[6, 3, 4, 5], [2, 3, 6, 9, 0], [1, 2, 0, 8, 7], [5, 4, 1, 7], [4, 3, 2, 1], [6, 5, 7, 8, 9], [9, 8, 0]];\n",
       "   <!-- Facet style -->\n",
       "obj91.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj91);\n",
       "scene.add(obj91);\n",
       "\n",
       "var obj92 = new THREE.Object3D();\n",
       "obj92.name = \"_bounded\";\n",
       "obj92.userData.explodable = 1;\n",
       "obj92.userData.points = [];\n",
       "obj92.userData.points.push(new PMPoint(-2, -0.077, 0));\n",
       "obj92.userData.points.push(new PMPoint(-2, 0.077, 0));\n",
       "obj92.userData.points.push(new PMPoint(-1, 0.077, 0));\n",
       "obj92.userData.points.push(new PMPoint(-1, -0.077, 0));\n",
       "obj92.userData.points.push(new PMPoint(-1, 0.077, 4.6));\n",
       "obj92.userData.points.push(new PMPoint(-1, -0.077, 4.6));\n",
       "obj92.userData.points.push(new PMPoint(-2, 0.077, 4.6));\n",
       "obj92.userData.points.push(new PMPoint(-2, -0.077, 4.6));\n",
       "\n",
       "obj92.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj92.userData.facets = [[7, 0, 3, 5], [1, 0, 7, 6], [2, 1, 6, 4], [5, 3, 2, 4], [3, 0, 1, 2], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj92.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj92);\n",
       "scene.add(obj92);\n",
       "\n",
       "var obj93 = new THREE.Object3D();\n",
       "obj93.name = \"_bounded\";\n",
       "obj93.userData.explodable = 1;\n",
       "obj93.userData.points = [];\n",
       "obj93.userData.points.push(new PMPoint(-2.05445, 4.6, 0.0544472));\n",
       "obj93.userData.points.push(new PMPoint(-1.94555, 4.6, -0.0544472));\n",
       "obj93.userData.points.push(new PMPoint(-1.94555, 0, -0.0544472));\n",
       "obj93.userData.points.push(new PMPoint(-2.05445, 0, 0.0544472));\n",
       "obj93.userData.points.push(new PMPoint(-4.6, -2.65445, -2.70889));\n",
       "obj93.userData.points.push(new PMPoint(-4.6, -2.54555, -2.49111));\n",
       "obj93.userData.points.push(new PMPoint(-4.6, 4.6, -2.70889));\n",
       "obj93.userData.points.push(new PMPoint(-4.6, 4.6, -2.49111));\n",
       "\n",
       "obj93.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj93.userData.facets = [[1, 2, 4, 6], [3, 2, 1, 0], [4, 2, 3, 5], [5, 3, 0, 7], [6, 4, 5, 7], [1, 6, 7, 0]];\n",
       "   <!-- Facet style -->\n",
       "obj93.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj93);\n",
       "scene.add(obj93);\n",
       "\n",
       "var obj94 = new THREE.Object3D();\n",
       "obj94.name = \"_bounded\";\n",
       "obj94.userData.explodable = 1;\n",
       "obj94.userData.points = [];\n",
       "obj94.userData.points.push(new PMPoint(-1.077, 0, -1));\n",
       "obj94.userData.points.push(new PMPoint(-1.077, 0, 0));\n",
       "obj94.userData.points.push(new PMPoint(-0.923, 0, 0));\n",
       "obj94.userData.points.push(new PMPoint(-0.923, 0, -1));\n",
       "obj94.userData.points.push(new PMPoint(-0.923, 4.6, 0));\n",
       "obj94.userData.points.push(new PMPoint(-0.923, 4.6, -1));\n",
       "obj94.userData.points.push(new PMPoint(-1.077, 4.6, 0));\n",
       "obj94.userData.points.push(new PMPoint(-1.077, 4.6, -1));\n",
       "\n",
       "obj94.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj94.userData.facets = [[0, 7, 5, 3], [6, 7, 0, 1], [4, 6, 1, 2], [3, 5, 4, 2], [0, 3, 2, 1], [5, 7, 6, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj94.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj94);\n",
       "scene.add(obj94);\n",
       "\n",
       "var obj95 = new THREE.Object3D();\n",
       "obj95.name = \"_bounded\";\n",
       "obj95.userData.explodable = 1;\n",
       "obj95.userData.points = [];\n",
       "obj95.userData.points.push(new PMPoint(-4.54555, -3.65445, -4.6));\n",
       "obj95.userData.points.push(new PMPoint(-0.945553, -0.0544472, 0));\n",
       "obj95.userData.points.push(new PMPoint(-0.945553, -0.0544472, -1));\n",
       "obj95.userData.points.push(new PMPoint(-1.05445, 0.0544472, -1));\n",
       "obj95.userData.points.push(new PMPoint(-1.05445, 0.0544472, 0));\n",
       "obj95.userData.points.push(new PMPoint(-4.6, -3.49111, -3.54555));\n",
       "obj95.userData.points.push(new PMPoint(-4.6, -3.49111, -4.54555));\n",
       "obj95.userData.points.push(new PMPoint(-4.6, -3.70889, -3.65445));\n",
       "obj95.userData.points.push(new PMPoint(-4.6, -3.70889, -4.6));\n",
       "obj95.userData.points.push(new PMPoint(-4.6, -3.6, -4.6));\n",
       "\n",
       "obj95.userData.edgeindices = [0, 2, 1, 2, 2, 3, 1, 4, 3, 4, 4, 5, 3, 6, 5, 6, 1, 7, 5, 7, 0, 8, 7, 8, 0, 9, 6, 9, 8, 9];\n",
       "obj95.userData.facets = [[6, 3, 2, 0, 9], [4, 3, 6, 5], [1, 4, 5, 7], [0, 2, 1, 7, 8], [2, 3, 4, 1], [6, 9, 8, 7, 5], [9, 0, 8]];\n",
       "   <!-- Facet style -->\n",
       "obj95.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj95);\n",
       "scene.add(obj95);\n",
       "\n",
       "var obj96 = new THREE.Object3D();\n",
       "obj96.name = \"_bounded\";\n",
       "obj96.userData.explodable = 1;\n",
       "obj96.userData.points = [];\n",
       "obj96.userData.points.push(new PMPoint(-2, 0, -0.077));\n",
       "obj96.userData.points.push(new PMPoint(-2, 0, 0.077));\n",
       "obj96.userData.points.push(new PMPoint(-1, 0, 0.077));\n",
       "obj96.userData.points.push(new PMPoint(-1, 0, -0.077));\n",
       "obj96.userData.points.push(new PMPoint(-1, 4.6, 0.077));\n",
       "obj96.userData.points.push(new PMPoint(-1, 4.6, -0.077));\n",
       "obj96.userData.points.push(new PMPoint(-2, 4.6, 0.077));\n",
       "obj96.userData.points.push(new PMPoint(-2, 4.6, -0.077));\n",
       "\n",
       "obj96.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj96.userData.facets = [[0, 7, 5, 3], [6, 7, 0, 1], [4, 6, 1, 2], [3, 5, 4, 2], [0, 3, 2, 1], [5, 7, 6, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj96.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj96);\n",
       "scene.add(obj96);\n",
       "\n",
       "var obj97 = new THREE.Object3D();\n",
       "obj97.name = \"_bounded\";\n",
       "obj97.userData.explodable = 1;\n",
       "obj97.userData.points = [];\n",
       "obj97.userData.points.push(new PMPoint(-2, -0.0544472, 0.0544472));\n",
       "obj97.userData.points.push(new PMPoint(-2, 0.0544472, -0.0544472));\n",
       "obj97.userData.points.push(new PMPoint(-1, 0.0544472, -0.0544472));\n",
       "obj97.userData.points.push(new PMPoint(-1, -0.0544472, 0.0544472));\n",
       "obj97.userData.points.push(new PMPoint(-4.6, -3.54555, -3.65445));\n",
       "obj97.userData.points.push(new PMPoint(-4.6, -3.65445, -3.54555));\n",
       "obj97.userData.points.push(new PMPoint(-4.6, -2.54555, -2.65445));\n",
       "obj97.userData.points.push(new PMPoint(-4.6, -2.65445, -2.54555));\n",
       "\n",
       "obj97.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj97.userData.facets = [[7, 0, 1, 6], [3, 0, 7, 5], [2, 3, 5, 4], [6, 1, 2, 4], [1, 0, 3, 2], [7, 6, 4, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj97.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj97);\n",
       "scene.add(obj97);\n",
       "\n",
       "var obj98 = new THREE.Object3D();\n",
       "obj98.name = \"_bounded\";\n",
       "obj98.userData.explodable = 1;\n",
       "obj98.userData.points = [];\n",
       "obj98.userData.points.push(new PMPoint(0.0544472, -2.05445, 4.6));\n",
       "obj98.userData.points.push(new PMPoint(-0.0544472, -1.94555, 4.6));\n",
       "obj98.userData.points.push(new PMPoint(-0.0544472, -1.94555, 0));\n",
       "obj98.userData.points.push(new PMPoint(0.0544472, -2.05445, 0));\n",
       "obj98.userData.points.push(new PMPoint(-2.70889, -4.6, -2.65445));\n",
       "obj98.userData.points.push(new PMPoint(-2.49111, -4.6, -2.54555));\n",
       "obj98.userData.points.push(new PMPoint(-2.70889, -4.6, 4.6));\n",
       "obj98.userData.points.push(new PMPoint(-2.49111, -4.6, 4.6));\n",
       "\n",
       "obj98.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj98.userData.facets = [[3, 0, 7, 5], [1, 0, 3, 2], [6, 1, 2, 4], [3, 5, 4, 2], [5, 7, 6, 4], [7, 0, 1, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj98.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj98);\n",
       "scene.add(obj98);\n",
       "\n",
       "var obj99 = new THREE.Object3D();\n",
       "obj99.name = \"_bounded\";\n",
       "obj99.userData.explodable = 1;\n",
       "obj99.userData.points = [];\n",
       "obj99.userData.points.push(new PMPoint(-1, -1.077, 0));\n",
       "obj99.userData.points.push(new PMPoint(0, -1.077, 0));\n",
       "obj99.userData.points.push(new PMPoint(0, -0.923, 0));\n",
       "obj99.userData.points.push(new PMPoint(-1, -0.923, 0));\n",
       "obj99.userData.points.push(new PMPoint(0, -0.923, 4.6));\n",
       "obj99.userData.points.push(new PMPoint(-1, -0.923, 4.6));\n",
       "obj99.userData.points.push(new PMPoint(0, -1.077, 4.6));\n",
       "obj99.userData.points.push(new PMPoint(-1, -1.077, 4.6));\n",
       "\n",
       "obj99.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj99.userData.facets = [[7, 0, 1, 6], [3, 0, 7, 5], [2, 3, 5, 4], [6, 1, 2, 4], [1, 0, 3, 2], [7, 6, 4, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj99.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj99);\n",
       "scene.add(obj99);\n",
       "\n",
       "var obj100 = new THREE.Object3D();\n",
       "obj100.name = \"_bounded\";\n",
       "obj100.userData.explodable = 1;\n",
       "obj100.userData.points = [];\n",
       "obj100.userData.points.push(new PMPoint(-4.54555, -4.6, -3.49111));\n",
       "obj100.userData.points.push(new PMPoint(-3.54555, -4.6, -3.49111));\n",
       "obj100.userData.points.push(new PMPoint(-3.65445, -4.6, -3.70889));\n",
       "obj100.userData.points.push(new PMPoint(-1, -0.945553, -0.0544472));\n",
       "obj100.userData.points.push(new PMPoint(0, -0.945553, -0.0544472));\n",
       "obj100.userData.points.push(new PMPoint(0, -1.05445, 0.0544472));\n",
       "obj100.userData.points.push(new PMPoint(-1, -1.05445, 0.0544472));\n",
       "obj100.userData.points.push(new PMPoint(-4.6, -4.54555, -3.65445));\n",
       "obj100.userData.points.push(new PMPoint(-4.6, -4.6, -3.70889));\n",
       "obj100.userData.points.push(new PMPoint(-4.6, -4.6, -3.6));\n",
       "\n",
       "obj100.userData.edgeindices = [0, 1, 1, 2, 2, 4, 3, 4, 1, 5, 4, 5, 0, 6, 3, 6, 5, 6, 3, 7, 2, 8, 7, 8, 0, 9, 7, 9, 8, 9];\n",
       "obj100.userData.facets = [[0, 6, 3, 7, 9], [5, 6, 0, 1], [4, 5, 1, 2], [7, 3, 4, 2, 8], [3, 6, 5, 4], [9, 7, 8], [0, 9, 8, 2, 1]];\n",
       "   <!-- Facet style -->\n",
       "obj100.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj100);\n",
       "scene.add(obj100);\n",
       "\n",
       "var obj101 = new THREE.Object3D();\n",
       "obj101.name = \"_bounded\";\n",
       "obj101.userData.explodable = 1;\n",
       "obj101.userData.points = [];\n",
       "obj101.userData.points.push(new PMPoint(-0.077, -2, 0));\n",
       "obj101.userData.points.push(new PMPoint(0.077, -2, 0));\n",
       "obj101.userData.points.push(new PMPoint(0.077, -1, 0));\n",
       "obj101.userData.points.push(new PMPoint(-0.077, -1, 0));\n",
       "obj101.userData.points.push(new PMPoint(0.077, -1, 4.6));\n",
       "obj101.userData.points.push(new PMPoint(-0.077, -1, 4.6));\n",
       "obj101.userData.points.push(new PMPoint(0.077, -2, 4.6));\n",
       "obj101.userData.points.push(new PMPoint(-0.077, -2, 4.6));\n",
       "\n",
       "obj101.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj101.userData.facets = [[7, 0, 1, 6], [3, 0, 7, 5], [2, 3, 5, 4], [6, 1, 2, 4], [1, 0, 3, 2], [7, 6, 4, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj101.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj101);\n",
       "scene.add(obj101);\n",
       "\n",
       "var obj102 = new THREE.Object3D();\n",
       "obj102.name = \"_bounded\";\n",
       "obj102.userData.explodable = 1;\n",
       "obj102.userData.points = [];\n",
       "obj102.userData.points.push(new PMPoint(-4.49111, -4.6, 4.6));\n",
       "obj102.userData.points.push(new PMPoint(-4.49111, -4.6, -3.54555));\n",
       "obj102.userData.points.push(new PMPoint(-1.05445, -0.945553, 0));\n",
       "obj102.userData.points.push(new PMPoint(-0.945553, -1.05445, 0));\n",
       "obj102.userData.points.push(new PMPoint(-0.945553, -1.05445, 4.6));\n",
       "obj102.userData.points.push(new PMPoint(-1.05445, -0.945553, 4.6));\n",
       "obj102.userData.points.push(new PMPoint(-4.6, -4.49111, 4.6));\n",
       "obj102.userData.points.push(new PMPoint(-4.6, -4.49111, -3.54555));\n",
       "obj102.userData.points.push(new PMPoint(-4.6, -4.6, -3.6));\n",
       "obj102.userData.points.push(new PMPoint(-4.6, -4.6, 4.6));\n",
       "\n",
       "obj102.userData.edgeindices = [0, 1, 1, 3, 2, 3, 0, 4, 3, 4, 2, 5, 4, 5, 5, 6, 2, 7, 6, 7, 1, 8, 7, 8, 0, 9, 6, 9, 8, 9];\n",
       "obj102.userData.facets = [[3, 4, 0, 1], [5, 4, 3, 2], [6, 5, 2, 7], [3, 1, 8, 7, 2], [9, 6, 7, 8], [1, 0, 9, 8], [0, 4, 5, 6, 9]];\n",
       "   <!-- Facet style -->\n",
       "obj102.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj102);\n",
       "scene.add(obj102);\n",
       "\n",
       "var obj103 = new THREE.Object3D();\n",
       "obj103.name = \"_bounded\";\n",
       "obj103.userData.explodable = 1;\n",
       "obj103.userData.points = [];\n",
       "obj103.userData.points.push(new PMPoint(0.0544472, 4.6, -2.05445));\n",
       "obj103.userData.points.push(new PMPoint(-0.0544472, 4.6, -1.94555));\n",
       "obj103.userData.points.push(new PMPoint(-0.0544472, 0, -1.94555));\n",
       "obj103.userData.points.push(new PMPoint(0.0544472, 0, -2.05445));\n",
       "obj103.userData.points.push(new PMPoint(-2.70889, -2.65445, -4.6));\n",
       "obj103.userData.points.push(new PMPoint(-2.49111, -2.54555, -4.6));\n",
       "obj103.userData.points.push(new PMPoint(-2.70889, 4.6, -4.6));\n",
       "obj103.userData.points.push(new PMPoint(-2.49111, 4.6, -4.6));\n",
       "\n",
       "obj103.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj103.userData.facets = [[0, 3, 5, 7], [2, 3, 0, 1], [5, 3, 2, 4], [4, 2, 1, 6], [0, 7, 6, 1], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj103.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj103);\n",
       "scene.add(obj103);\n",
       "\n",
       "var obj104 = new THREE.Object3D();\n",
       "obj104.name = \"_bounded\";\n",
       "obj104.userData.explodable = 1;\n",
       "obj104.userData.points = [];\n",
       "obj104.userData.points.push(new PMPoint(-1, 0, -1.077));\n",
       "obj104.userData.points.push(new PMPoint(0, 0, -1.077));\n",
       "obj104.userData.points.push(new PMPoint(0, 0, -0.923));\n",
       "obj104.userData.points.push(new PMPoint(-1, 0, -0.923));\n",
       "obj104.userData.points.push(new PMPoint(0, 4.6, -0.923));\n",
       "obj104.userData.points.push(new PMPoint(-1, 4.6, -0.923));\n",
       "obj104.userData.points.push(new PMPoint(0, 4.6, -1.077));\n",
       "obj104.userData.points.push(new PMPoint(-1, 4.6, -1.077));\n",
       "\n",
       "obj104.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj104.userData.facets = [[0, 7, 6, 1], [5, 7, 0, 3], [4, 5, 3, 2], [1, 6, 4, 2], [0, 1, 2, 3], [6, 7, 5, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj104.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj104);\n",
       "scene.add(obj104);\n",
       "\n",
       "var obj105 = new THREE.Object3D();\n",
       "obj105.name = \"_bounded\";\n",
       "obj105.userData.explodable = 1;\n",
       "obj105.userData.points = [];\n",
       "obj105.userData.points.push(new PMPoint(-4.54555, -3.49111, -4.6));\n",
       "obj105.userData.points.push(new PMPoint(-3.54555, -3.49111, -4.6));\n",
       "obj105.userData.points.push(new PMPoint(-3.65445, -3.70889, -4.6));\n",
       "obj105.userData.points.push(new PMPoint(-1, -0.0544472, -0.945553));\n",
       "obj105.userData.points.push(new PMPoint(0, -0.0544472, -0.945553));\n",
       "obj105.userData.points.push(new PMPoint(0, 0.0544472, -1.05445));\n",
       "obj105.userData.points.push(new PMPoint(-1, 0.0544472, -1.05445));\n",
       "obj105.userData.points.push(new PMPoint(-4.6, -3.65445, -4.54555));\n",
       "obj105.userData.points.push(new PMPoint(-4.6, -3.70889, -4.6));\n",
       "obj105.userData.points.push(new PMPoint(-4.6, -3.6, -4.6));\n",
       "\n",
       "obj105.userData.edgeindices = [0, 1, 1, 2, 2, 4, 3, 4, 1, 5, 4, 5, 0, 6, 3, 6, 5, 6, 3, 7, 2, 8, 7, 8, 0, 9, 7, 9, 8, 9];\n",
       "obj105.userData.facets = [[7, 3, 6, 0, 9], [4, 3, 7, 8, 2], [5, 4, 2, 1], [0, 6, 5, 1], [6, 3, 4, 5], [7, 9, 8], [9, 0, 1, 2, 8]];\n",
       "   <!-- Facet style -->\n",
       "obj105.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj105);\n",
       "scene.add(obj105);\n",
       "\n",
       "var obj106 = new THREE.Object3D();\n",
       "obj106.name = \"_bounded\";\n",
       "obj106.userData.explodable = 1;\n",
       "obj106.userData.points = [];\n",
       "obj106.userData.points.push(new PMPoint(-0.077, 0, -2));\n",
       "obj106.userData.points.push(new PMPoint(0.077, 0, -2));\n",
       "obj106.userData.points.push(new PMPoint(0.077, 0, -1));\n",
       "obj106.userData.points.push(new PMPoint(-0.077, 0, -1));\n",
       "obj106.userData.points.push(new PMPoint(0.077, 4.6, -1));\n",
       "obj106.userData.points.push(new PMPoint(-0.077, 4.6, -1));\n",
       "obj106.userData.points.push(new PMPoint(0.077, 4.6, -2));\n",
       "obj106.userData.points.push(new PMPoint(-0.077, 4.6, -2));\n",
       "\n",
       "obj106.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj106.userData.facets = [[0, 7, 6, 1], [5, 7, 0, 3], [4, 5, 3, 2], [1, 6, 4, 2], [0, 1, 2, 3], [6, 7, 5, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj106.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj106);\n",
       "scene.add(obj106);\n",
       "\n",
       "var obj107 = new THREE.Object3D();\n",
       "obj107.name = \"_bounded\";\n",
       "obj107.userData.explodable = 1;\n",
       "obj107.userData.points = [];\n",
       "obj107.userData.points.push(new PMPoint(-4.49111, 4.6, -4.6));\n",
       "obj107.userData.points.push(new PMPoint(-4.49111, -3.54555, -4.6));\n",
       "obj107.userData.points.push(new PMPoint(-1.05445, 0, -0.945553));\n",
       "obj107.userData.points.push(new PMPoint(-0.945553, 0, -1.05445));\n",
       "obj107.userData.points.push(new PMPoint(-0.945553, 4.6, -1.05445));\n",
       "obj107.userData.points.push(new PMPoint(-1.05445, 4.6, -0.945553));\n",
       "obj107.userData.points.push(new PMPoint(-4.6, 4.6, -4.49111));\n",
       "obj107.userData.points.push(new PMPoint(-4.6, -3.54555, -4.49111));\n",
       "obj107.userData.points.push(new PMPoint(-4.6, -3.6, -4.6));\n",
       "obj107.userData.points.push(new PMPoint(-4.6, 4.6, -4.6));\n",
       "\n",
       "obj107.userData.edgeindices = [0, 1, 1, 3, 2, 3, 0, 4, 3, 4, 2, 5, 4, 5, 5, 6, 2, 7, 6, 7, 1, 8, 7, 8, 0, 9, 6, 9, 8, 9];\n",
       "obj107.userData.facets = [[4, 3, 1, 0], [2, 3, 4, 5], [1, 3, 2, 7, 8], [7, 2, 5, 6], [8, 7, 6, 9], [4, 0, 9, 6, 5], [0, 1, 8, 9]];\n",
       "   <!-- Facet style -->\n",
       "obj107.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj107);\n",
       "scene.add(obj107);\n",
       "\n",
       "var obj108 = new THREE.Object3D();\n",
       "obj108.name = \"_bounded\";\n",
       "obj108.userData.explodable = 1;\n",
       "obj108.userData.points = [];\n",
       "obj108.userData.points.push(new PMPoint(4.6, -2.05445, 0.0544472));\n",
       "obj108.userData.points.push(new PMPoint(4.6, -1.94555, -0.0544472));\n",
       "obj108.userData.points.push(new PMPoint(0, -1.94555, -0.0544472));\n",
       "obj108.userData.points.push(new PMPoint(0, -2.05445, 0.0544472));\n",
       "obj108.userData.points.push(new PMPoint(-2.65445, -4.6, -2.70889));\n",
       "obj108.userData.points.push(new PMPoint(-2.54555, -4.6, -2.49111));\n",
       "obj108.userData.points.push(new PMPoint(4.6, -4.6, -2.70889));\n",
       "obj108.userData.points.push(new PMPoint(4.6, -4.6, -2.49111));\n",
       "\n",
       "obj108.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj108.userData.facets = [[2, 1, 6, 4], [0, 1, 2, 3], [2, 4, 5, 3], [7, 0, 3, 5], [6, 1, 0, 7], [4, 6, 7, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj108.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj108);\n",
       "scene.add(obj108);\n",
       "\n",
       "var obj109 = new THREE.Object3D();\n",
       "obj109.name = \"_bounded\";\n",
       "obj109.userData.explodable = 1;\n",
       "obj109.userData.points = [];\n",
       "obj109.userData.points.push(new PMPoint(0, -1.077, -1));\n",
       "obj109.userData.points.push(new PMPoint(0, -1.077, 0));\n",
       "obj109.userData.points.push(new PMPoint(0, -0.923, 0));\n",
       "obj109.userData.points.push(new PMPoint(0, -0.923, -1));\n",
       "obj109.userData.points.push(new PMPoint(4.6, -0.923, 0));\n",
       "obj109.userData.points.push(new PMPoint(4.6, -0.923, -1));\n",
       "obj109.userData.points.push(new PMPoint(4.6, -1.077, 0));\n",
       "obj109.userData.points.push(new PMPoint(4.6, -1.077, -1));\n",
       "\n",
       "obj109.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj109.userData.facets = [[7, 0, 3, 5], [1, 0, 7, 6], [2, 1, 6, 4], [5, 3, 2, 4], [3, 0, 1, 2], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj109.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj109);\n",
       "scene.add(obj109);\n",
       "\n",
       "var obj110 = new THREE.Object3D();\n",
       "obj110.name = \"_bounded\";\n",
       "obj110.userData.explodable = 1;\n",
       "obj110.userData.points = [];\n",
       "obj110.userData.points.push(new PMPoint(-3.65445, -4.54555, -4.6));\n",
       "obj110.userData.points.push(new PMPoint(-0.0544472, -0.945553, 0));\n",
       "obj110.userData.points.push(new PMPoint(-0.0544472, -0.945553, -1));\n",
       "obj110.userData.points.push(new PMPoint(0.0544472, -1.05445, -1));\n",
       "obj110.userData.points.push(new PMPoint(0.0544472, -1.05445, 0));\n",
       "obj110.userData.points.push(new PMPoint(-3.49111, -4.6, -3.54555));\n",
       "obj110.userData.points.push(new PMPoint(-3.49111, -4.6, -4.54555));\n",
       "obj110.userData.points.push(new PMPoint(-3.70889, -4.6, -3.65445));\n",
       "obj110.userData.points.push(new PMPoint(-3.70889, -4.6, -4.6));\n",
       "obj110.userData.points.push(new PMPoint(-3.6, -4.6, -4.6));\n",
       "\n",
       "obj110.userData.edgeindices = [0, 2, 1, 2, 2, 3, 1, 4, 3, 4, 4, 5, 3, 6, 5, 6, 1, 7, 5, 7, 0, 8, 7, 8, 0, 9, 6, 9, 8, 9];\n",
       "obj110.userData.facets = [[0, 2, 3, 6, 9], [1, 2, 0, 8, 7], [4, 1, 7, 5], [6, 3, 4, 5], [3, 2, 1, 4], [9, 6, 5, 7, 8], [0, 9, 8]];\n",
       "   <!-- Facet style -->\n",
       "obj110.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj110);\n",
       "scene.add(obj110);\n",
       "\n",
       "var obj111 = new THREE.Object3D();\n",
       "obj111.name = \"_bounded\";\n",
       "obj111.userData.explodable = 1;\n",
       "obj111.userData.points = [];\n",
       "obj111.userData.points.push(new PMPoint(0, -2, -0.077));\n",
       "obj111.userData.points.push(new PMPoint(0, -2, 0.077));\n",
       "obj111.userData.points.push(new PMPoint(0, -1, 0.077));\n",
       "obj111.userData.points.push(new PMPoint(0, -1, -0.077));\n",
       "obj111.userData.points.push(new PMPoint(4.6, -1, 0.077));\n",
       "obj111.userData.points.push(new PMPoint(4.6, -1, -0.077));\n",
       "obj111.userData.points.push(new PMPoint(4.6, -2, 0.077));\n",
       "obj111.userData.points.push(new PMPoint(4.6, -2, -0.077));\n",
       "\n",
       "obj111.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj111.userData.facets = [[7, 0, 3, 5], [1, 0, 7, 6], [2, 1, 6, 4], [5, 3, 2, 4], [3, 0, 1, 2], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj111.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj111);\n",
       "scene.add(obj111);\n",
       "\n",
       "var obj112 = new THREE.Object3D();\n",
       "obj112.name = \"_bounded\";\n",
       "obj112.userData.explodable = 1;\n",
       "obj112.userData.points = [];\n",
       "obj112.userData.points.push(new PMPoint(-0.0544472, -2, 0.0544472));\n",
       "obj112.userData.points.push(new PMPoint(0.0544472, -2, -0.0544472));\n",
       "obj112.userData.points.push(new PMPoint(0.0544472, -1, -0.0544472));\n",
       "obj112.userData.points.push(new PMPoint(-0.0544472, -1, 0.0544472));\n",
       "obj112.userData.points.push(new PMPoint(-3.54555, -4.6, -3.65445));\n",
       "obj112.userData.points.push(new PMPoint(-3.65445, -4.6, -3.54555));\n",
       "obj112.userData.points.push(new PMPoint(-2.54555, -4.6, -2.65445));\n",
       "obj112.userData.points.push(new PMPoint(-2.65445, -4.6, -2.54555));\n",
       "\n",
       "obj112.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj112.userData.facets = [[7, 0, 3, 5], [1, 0, 7, 6], [2, 1, 6, 4], [5, 3, 2, 4], [3, 0, 1, 2], [7, 5, 4, 6]];\n",
       "   <!-- Facet style -->\n",
       "obj112.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj112);\n",
       "scene.add(obj112);\n",
       "\n",
       "var obj113 = new THREE.Object3D();\n",
       "obj113.name = \"_bounded\";\n",
       "obj113.userData.explodable = 1;\n",
       "obj113.userData.points = [];\n",
       "obj113.userData.points.push(new PMPoint(4.6, 0.0544472, -2.05445));\n",
       "obj113.userData.points.push(new PMPoint(4.6, -0.0544472, -1.94555));\n",
       "obj113.userData.points.push(new PMPoint(0, -0.0544472, -1.94555));\n",
       "obj113.userData.points.push(new PMPoint(0, 0.0544472, -2.05445));\n",
       "obj113.userData.points.push(new PMPoint(-2.65445, -2.70889, -4.6));\n",
       "obj113.userData.points.push(new PMPoint(-2.54555, -2.49111, -4.6));\n",
       "obj113.userData.points.push(new PMPoint(4.6, -2.70889, -4.6));\n",
       "obj113.userData.points.push(new PMPoint(4.6, -2.49111, -4.6));\n",
       "\n",
       "obj113.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj113.userData.facets = [[3, 0, 7, 5], [1, 0, 3, 2], [3, 5, 4, 2], [6, 1, 2, 4], [7, 0, 1, 6], [5, 7, 6, 4]];\n",
       "   <!-- Facet style -->\n",
       "obj113.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj113);\n",
       "scene.add(obj113);\n",
       "\n",
       "var obj114 = new THREE.Object3D();\n",
       "obj114.name = \"_bounded\";\n",
       "obj114.userData.explodable = 1;\n",
       "obj114.userData.points = [];\n",
       "obj114.userData.points.push(new PMPoint(0, -1, -1.077));\n",
       "obj114.userData.points.push(new PMPoint(0, 0, -1.077));\n",
       "obj114.userData.points.push(new PMPoint(0, 0, -0.923));\n",
       "obj114.userData.points.push(new PMPoint(0, -1, -0.923));\n",
       "obj114.userData.points.push(new PMPoint(4.6, 0, -0.923));\n",
       "obj114.userData.points.push(new PMPoint(4.6, -1, -0.923));\n",
       "obj114.userData.points.push(new PMPoint(4.6, 0, -1.077));\n",
       "obj114.userData.points.push(new PMPoint(4.6, -1, -1.077));\n",
       "\n",
       "obj114.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj114.userData.facets = [[7, 0, 1, 6], [3, 0, 7, 5], [2, 3, 5, 4], [6, 1, 2, 4], [1, 0, 3, 2], [7, 6, 4, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj114.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj114);\n",
       "scene.add(obj114);\n",
       "\n",
       "var obj115 = new THREE.Object3D();\n",
       "obj115.name = \"_bounded\";\n",
       "obj115.userData.explodable = 1;\n",
       "obj115.userData.points = [];\n",
       "obj115.userData.points.push(new PMPoint(-3.49111, -3.54555, -4.6));\n",
       "obj115.userData.points.push(new PMPoint(-3.49111, -4.54555, -4.6));\n",
       "obj115.userData.points.push(new PMPoint(-3.70889, -3.65445, -4.6));\n",
       "obj115.userData.points.push(new PMPoint(-0.0544472, 0, -0.945553));\n",
       "obj115.userData.points.push(new PMPoint(-0.0544472, -1, -0.945553));\n",
       "obj115.userData.points.push(new PMPoint(0.0544472, -1, -1.05445));\n",
       "obj115.userData.points.push(new PMPoint(0.0544472, 0, -1.05445));\n",
       "obj115.userData.points.push(new PMPoint(-3.65445, -4.6, -4.54555));\n",
       "obj115.userData.points.push(new PMPoint(-3.70889, -4.6, -4.6));\n",
       "obj115.userData.points.push(new PMPoint(-3.6, -4.6, -4.6));\n",
       "\n",
       "obj115.userData.edgeindices = [0, 1, 0, 2, 2, 3, 3, 4, 1, 5, 4, 5, 0, 6, 3, 6, 5, 6, 4, 7, 2, 8, 7, 8, 1, 9, 7, 9, 8, 9];\n",
       "obj115.userData.facets = [[7, 4, 3, 2, 8], [5, 4, 7, 9, 1], [6, 5, 1, 0], [2, 3, 6, 0], [3, 4, 5, 6], [7, 8, 9], [8, 2, 0, 1, 9]];\n",
       "   <!-- Facet style -->\n",
       "obj115.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj115);\n",
       "scene.add(obj115);\n",
       "\n",
       "var obj116 = new THREE.Object3D();\n",
       "obj116.name = \"_bounded\";\n",
       "obj116.userData.explodable = 1;\n",
       "obj116.userData.points = [];\n",
       "obj116.userData.points.push(new PMPoint(0, -0.077, -2));\n",
       "obj116.userData.points.push(new PMPoint(0, 0.077, -2));\n",
       "obj116.userData.points.push(new PMPoint(0, 0.077, -1));\n",
       "obj116.userData.points.push(new PMPoint(0, -0.077, -1));\n",
       "obj116.userData.points.push(new PMPoint(4.6, 0.077, -1));\n",
       "obj116.userData.points.push(new PMPoint(4.6, -0.077, -1));\n",
       "obj116.userData.points.push(new PMPoint(4.6, 0.077, -2));\n",
       "obj116.userData.points.push(new PMPoint(4.6, -0.077, -2));\n",
       "\n",
       "obj116.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj116.userData.facets = [[7, 0, 1, 6], [3, 0, 7, 5], [2, 3, 5, 4], [6, 1, 2, 4], [1, 0, 3, 2], [7, 6, 4, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj116.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj116);\n",
       "scene.add(obj116);\n",
       "\n",
       "var obj117 = new THREE.Object3D();\n",
       "obj117.name = \"_bounded\";\n",
       "obj117.userData.explodable = 1;\n",
       "obj117.userData.points = [];\n",
       "obj117.userData.points.push(new PMPoint(-0.0544472, 0.0544472, -2));\n",
       "obj117.userData.points.push(new PMPoint(0.0544472, -0.0544472, -2));\n",
       "obj117.userData.points.push(new PMPoint(0.0544472, -0.0544472, -1));\n",
       "obj117.userData.points.push(new PMPoint(-0.0544472, 0.0544472, -1));\n",
       "obj117.userData.points.push(new PMPoint(-3.54555, -3.65445, -4.6));\n",
       "obj117.userData.points.push(new PMPoint(-3.65445, -3.54555, -4.6));\n",
       "obj117.userData.points.push(new PMPoint(-2.54555, -2.65445, -4.6));\n",
       "obj117.userData.points.push(new PMPoint(-2.65445, -2.54555, -4.6));\n",
       "\n",
       "obj117.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 2, 4, 3, 5, 4, 5, 1, 6, 4, 6, 0, 7, 5, 7, 6, 7];\n",
       "obj117.userData.facets = [[7, 0, 1, 6], [3, 0, 7, 5], [2, 3, 5, 4], [6, 1, 2, 4], [1, 0, 3, 2], [7, 6, 4, 5]];\n",
       "   <!-- Facet style -->\n",
       "obj117.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj117);\n",
       "scene.add(obj117);\n",
       "\n",
       "var obj118 = new THREE.Object3D();\n",
       "obj118.name = \"_bounded\";\n",
       "obj118.userData.explodable = 1;\n",
       "obj118.userData.points = [];\n",
       "obj118.userData.points.push(new PMPoint(4.6, -4.49111, -4.6));\n",
       "obj118.userData.points.push(new PMPoint(-3.54555, -4.49111, -4.6));\n",
       "obj118.userData.points.push(new PMPoint(0, -1.05445, -0.945553));\n",
       "obj118.userData.points.push(new PMPoint(0, -0.945553, -1.05445));\n",
       "obj118.userData.points.push(new PMPoint(4.6, -0.945553, -1.05445));\n",
       "obj118.userData.points.push(new PMPoint(4.6, -1.05445, -0.945553));\n",
       "obj118.userData.points.push(new PMPoint(4.6, -4.6, -4.49111));\n",
       "obj118.userData.points.push(new PMPoint(-3.54555, -4.6, -4.49111));\n",
       "obj118.userData.points.push(new PMPoint(-3.6, -4.6, -4.6));\n",
       "obj118.userData.points.push(new PMPoint(4.6, -4.6, -4.6));\n",
       "\n",
       "obj118.userData.edgeindices = [0, 1, 1, 3, 2, 3, 0, 4, 3, 4, 2, 5, 4, 5, 5, 6, 2, 7, 6, 7, 1, 8, 7, 8, 0, 9, 6, 9, 8, 9];\n",
       "obj118.userData.facets = [[3, 4, 0, 1], [5, 4, 3, 2], [3, 1, 8, 7, 2], [6, 5, 2, 7], [0, 4, 5, 6, 9], [9, 6, 7, 8], [1, 0, 9, 8]];\n",
       "   <!-- Facet style -->\n",
       "obj118.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),\n",
       "new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];\n",
       "init_object(obj118);\n",
       "scene.add(obj118);\n",
       "\n",
       "var obj119 = new THREE.Object3D();\n",
       "obj119.name = \"unnamed__12\";\n",
       "obj119.userData.explodable = 1;\n",
       "obj119.userData.points = [];\n",
       "obj119.userData.points.push(new PMPoint(-0.625, -0.5, 0));\n",
       "obj119.userData.points.push(new PMPoint(-1, -0.875, 0));\n",
       "\n",
       "obj119.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj119.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj119.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj119.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj119);\n",
       "scene.add(obj119);\n",
       "\n",
       "var obj120 = new THREE.Object3D();\n",
       "obj120.name = \"unnamed__13\";\n",
       "obj120.userData.explodable = 1;\n",
       "obj120.userData.points = [];\n",
       "obj120.userData.points.push(new PMPoint(-1, -0.875, 0));\n",
       "obj120.userData.points.push(new PMPoint(-1, -0.875, 6));\n",
       "\n",
       "obj120.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj120.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj120.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj120.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj120);\n",
       "scene.add(obj120);\n",
       "\n",
       "var obj121 = new THREE.Object3D();\n",
       "obj121.name = \"unnamed__14\";\n",
       "obj121.userData.explodable = 1;\n",
       "obj121.userData.points = [];\n",
       "obj121.userData.points.push(new PMPoint(-1, -0.875, 0));\n",
       "obj121.userData.points.push(new PMPoint(-6, -5.875, -5));\n",
       "\n",
       "obj121.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj121.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj121.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj121.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj121);\n",
       "scene.add(obj121);\n",
       "\n",
       "var obj122 = new THREE.Object3D();\n",
       "obj122.name = \"unnamed__15\";\n",
       "obj122.userData.explodable = 1;\n",
       "obj122.userData.points = [];\n",
       "obj122.userData.points.push(new PMPoint(-0.75, 0, -0.5));\n",
       "obj122.userData.points.push(new PMPoint(-1, 0, -0.75));\n",
       "\n",
       "obj122.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj122.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj122.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj122.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj122);\n",
       "scene.add(obj122);\n",
       "\n",
       "var obj123 = new THREE.Object3D();\n",
       "obj123.name = \"unnamed__16\";\n",
       "obj123.userData.explodable = 1;\n",
       "obj123.userData.points = [];\n",
       "obj123.userData.points.push(new PMPoint(-1, 0, -0.75));\n",
       "obj123.userData.points.push(new PMPoint(-1, 6, -0.75));\n",
       "\n",
       "obj123.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj123.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj123.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj123.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj123);\n",
       "scene.add(obj123);\n",
       "\n",
       "var obj124 = new THREE.Object3D();\n",
       "obj124.name = \"unnamed__17\";\n",
       "obj124.userData.explodable = 1;\n",
       "obj124.userData.points = [];\n",
       "obj124.userData.points.push(new PMPoint(-1, 0, -0.75));\n",
       "obj124.userData.points.push(new PMPoint(-6, -5, -5.75));\n",
       "\n",
       "obj124.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj124.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj124.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj124.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj124);\n",
       "scene.add(obj124);\n",
       "\n",
       "var obj125 = new THREE.Object3D();\n",
       "obj125.name = \"unnamed__18\";\n",
       "obj125.userData.explodable = 1;\n",
       "obj125.userData.points = [];\n",
       "obj125.userData.points.push(new PMPoint(0, -0.625, -0.5));\n",
       "obj125.userData.points.push(new PMPoint(0, -1, -0.875));\n",
       "\n",
       "obj125.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj125.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj125.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj125.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj125);\n",
       "scene.add(obj125);\n",
       "\n",
       "var obj126 = new THREE.Object3D();\n",
       "obj126.name = \"unnamed__19\";\n",
       "obj126.userData.explodable = 1;\n",
       "obj126.userData.points = [];\n",
       "obj126.userData.points.push(new PMPoint(0, -1, -0.875));\n",
       "obj126.userData.points.push(new PMPoint(6, -1, -0.875));\n",
       "\n",
       "obj126.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj126.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj126.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj126.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj126);\n",
       "scene.add(obj126);\n",
       "\n",
       "var obj127 = new THREE.Object3D();\n",
       "obj127.name = \"unnamed__20\";\n",
       "obj127.userData.explodable = 1;\n",
       "obj127.userData.points = [];\n",
       "obj127.userData.points.push(new PMPoint(0, -1, -0.875));\n",
       "obj127.userData.points.push(new PMPoint(-5, -6, -5.875));\n",
       "\n",
       "obj127.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj127.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj127.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj127.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj127);\n",
       "scene.add(obj127);\n",
       "\n",
       "var obj128 = new THREE.Object3D();\n",
       "obj128.name = \"unnamed__21\";\n",
       "obj128.userData.explodable = 1;\n",
       "obj128.userData.points = [];\n",
       "obj128.userData.points.push(new PMPoint(-0.5, 0.5, 0.5));\n",
       "obj128.userData.points.push(new PMPoint(-0.5, 0, 0));\n",
       "\n",
       "obj128.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj128.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj128.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj128.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj128);\n",
       "scene.add(obj128);\n",
       "\n",
       "var obj129 = new THREE.Object3D();\n",
       "obj129.name = \"unnamed__22\";\n",
       "obj129.userData.explodable = 1;\n",
       "obj129.userData.points = [];\n",
       "obj129.userData.points.push(new PMPoint(-0.5, 0, 0));\n",
       "obj129.userData.points.push(new PMPoint(-0.5, -0.25, 0));\n",
       "\n",
       "obj129.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj129.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj129.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj129.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj129);\n",
       "scene.add(obj129);\n",
       "\n",
       "var obj130 = new THREE.Object3D();\n",
       "obj130.name = \"unnamed__23\";\n",
       "obj130.userData.explodable = 1;\n",
       "obj130.userData.points = [];\n",
       "obj130.userData.points.push(new PMPoint(-0.5, 0.5, 0.5));\n",
       "obj130.userData.points.push(new PMPoint(-0.5, 0.5, 6));\n",
       "\n",
       "obj130.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj130.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj130.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj130.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj130);\n",
       "scene.add(obj130);\n",
       "\n",
       "var obj131 = new THREE.Object3D();\n",
       "obj131.name = \"unnamed__24\";\n",
       "obj131.userData.explodable = 1;\n",
       "obj131.userData.points = [];\n",
       "obj131.userData.points.push(new PMPoint(-0.5, 0.5, 0.5));\n",
       "obj131.userData.points.push(new PMPoint(-0.5, 6, 0.5));\n",
       "\n",
       "obj131.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj131.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj131.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj131.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj131);\n",
       "scene.add(obj131);\n",
       "\n",
       "var obj132 = new THREE.Object3D();\n",
       "obj132.name = \"unnamed__25\";\n",
       "obj132.userData.explodable = 1;\n",
       "obj132.userData.points = [];\n",
       "obj132.userData.points.push(new PMPoint(2, 2, 2.25));\n",
       "obj132.userData.points.push(new PMPoint(2, 2, 6));\n",
       "\n",
       "obj132.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj132.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj132.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj132.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj132);\n",
       "scene.add(obj132);\n",
       "\n",
       "var obj133 = new THREE.Object3D();\n",
       "obj133.name = \"unnamed__26\";\n",
       "obj133.userData.explodable = 1;\n",
       "obj133.userData.points = [];\n",
       "obj133.userData.points.push(new PMPoint(2, 2, 2.25));\n",
       "obj133.userData.points.push(new PMPoint(6, 2, 2.25));\n",
       "\n",
       "obj133.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj133.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj133.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj133.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj133);\n",
       "scene.add(obj133);\n",
       "\n",
       "var obj134 = new THREE.Object3D();\n",
       "obj134.name = \"unnamed__27\";\n",
       "obj134.userData.explodable = 1;\n",
       "obj134.userData.points = [];\n",
       "obj134.userData.points.push(new PMPoint(-0.625, -0.5, 0));\n",
       "obj134.userData.points.push(new PMPoint(-0.5, -0.25, 0));\n",
       "\n",
       "obj134.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj134.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj134.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj134.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj134);\n",
       "scene.add(obj134);\n",
       "\n",
       "var obj135 = new THREE.Object3D();\n",
       "obj135.name = \"unnamed__28\";\n",
       "obj135.userData.explodable = 1;\n",
       "obj135.userData.points = [];\n",
       "obj135.userData.points.push(new PMPoint(0.5, -0.5, 0.5));\n",
       "obj135.userData.points.push(new PMPoint(0, -0.5, 0));\n",
       "\n",
       "obj135.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj135.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj135.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj135.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj135);\n",
       "scene.add(obj135);\n",
       "\n",
       "var obj136 = new THREE.Object3D();\n",
       "obj136.name = \"unnamed__29\";\n",
       "obj136.userData.explodable = 1;\n",
       "obj136.userData.points = [];\n",
       "obj136.userData.points.push(new PMPoint(-0.625, -0.5, 0));\n",
       "obj136.userData.points.push(new PMPoint(0, -0.5, 0));\n",
       "\n",
       "obj136.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj136.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj136.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj136.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj136);\n",
       "scene.add(obj136);\n",
       "\n",
       "var obj137 = new THREE.Object3D();\n",
       "obj137.name = \"unnamed__30\";\n",
       "obj137.userData.explodable = 1;\n",
       "obj137.userData.points = [];\n",
       "obj137.userData.points.push(new PMPoint(0, -0.5, 0));\n",
       "obj137.userData.points.push(new PMPoint(0, -0.5, -0.25));\n",
       "\n",
       "obj137.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj137.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj137.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj137.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj137);\n",
       "scene.add(obj137);\n",
       "\n",
       "var obj138 = new THREE.Object3D();\n",
       "obj138.name = \"unnamed__31\";\n",
       "obj138.userData.explodable = 1;\n",
       "obj138.userData.points = [];\n",
       "obj138.userData.points.push(new PMPoint(0.5, -0.5, 0.5));\n",
       "obj138.userData.points.push(new PMPoint(0.5, -0.5, 6));\n",
       "\n",
       "obj138.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj138.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj138.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj138.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj138);\n",
       "scene.add(obj138);\n",
       "\n",
       "var obj139 = new THREE.Object3D();\n",
       "obj139.name = \"unnamed__32\";\n",
       "obj139.userData.explodable = 1;\n",
       "obj139.userData.points = [];\n",
       "obj139.userData.points.push(new PMPoint(0.5, -0.5, 0.5));\n",
       "obj139.userData.points.push(new PMPoint(6, -0.5, 0.5));\n",
       "\n",
       "obj139.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj139.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj139.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj139.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj139);\n",
       "scene.add(obj139);\n",
       "\n",
       "var obj140 = new THREE.Object3D();\n",
       "obj140.name = \"unnamed__33\";\n",
       "obj140.userData.explodable = 1;\n",
       "obj140.userData.points = [];\n",
       "obj140.userData.points.push(new PMPoint(0.75, 1, 1.25));\n",
       "obj140.userData.points.push(new PMPoint(0.75, 1, 6));\n",
       "\n",
       "obj140.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj140.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj140.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj140.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj140);\n",
       "scene.add(obj140);\n",
       "\n",
       "var obj141 = new THREE.Object3D();\n",
       "obj141.name = \"unnamed__34\";\n",
       "obj141.userData.explodable = 1;\n",
       "obj141.userData.points = [];\n",
       "obj141.userData.points.push(new PMPoint(2, 2, 2.25));\n",
       "obj141.userData.points.push(new PMPoint(2, 6, 2.25));\n",
       "\n",
       "obj141.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj141.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj141.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj141.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj141);\n",
       "scene.add(obj141);\n",
       "\n",
       "var obj142 = new THREE.Object3D();\n",
       "obj142.name = \"unnamed__35\";\n",
       "obj142.userData.explodable = 1;\n",
       "obj142.userData.points = [];\n",
       "obj142.userData.points.push(new PMPoint(-0.75, 0, -0.5));\n",
       "obj142.userData.points.push(new PMPoint(-0.5, 0, 0));\n",
       "\n",
       "obj142.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj142.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj142.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj142.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj142);\n",
       "scene.add(obj142);\n",
       "\n",
       "var obj143 = new THREE.Object3D();\n",
       "obj143.name = \"unnamed__36\";\n",
       "obj143.userData.explodable = 1;\n",
       "obj143.userData.points = [];\n",
       "obj143.userData.points.push(new PMPoint(0, -0.625, -0.5));\n",
       "obj143.userData.points.push(new PMPoint(0, -0.5, -0.25));\n",
       "\n",
       "obj143.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj143.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj143.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj143.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj143);\n",
       "scene.add(obj143);\n",
       "\n",
       "var obj144 = new THREE.Object3D();\n",
       "obj144.name = \"unnamed__37\";\n",
       "obj144.userData.explodable = 1;\n",
       "obj144.userData.points = [];\n",
       "obj144.userData.points.push(new PMPoint(0, 0, -0.5));\n",
       "obj144.userData.points.push(new PMPoint(0.5, 0.5, -0.5));\n",
       "\n",
       "obj144.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj144.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj144.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj144.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj144);\n",
       "scene.add(obj144);\n",
       "\n",
       "var obj145 = new THREE.Object3D();\n",
       "obj145.name = \"unnamed__38\";\n",
       "obj145.userData.explodable = 1;\n",
       "obj145.userData.points = [];\n",
       "obj145.userData.points.push(new PMPoint(-0.75, 0, -0.5));\n",
       "obj145.userData.points.push(new PMPoint(0, 0, -0.5));\n",
       "\n",
       "obj145.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj145.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj145.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj145.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj145);\n",
       "scene.add(obj145);\n",
       "\n",
       "var obj146 = new THREE.Object3D();\n",
       "obj146.name = \"unnamed__39\";\n",
       "obj146.userData.explodable = 1;\n",
       "obj146.userData.points = [];\n",
       "obj146.userData.points.push(new PMPoint(0, -0.625, -0.5));\n",
       "obj146.userData.points.push(new PMPoint(0, 0, -0.5));\n",
       "\n",
       "obj146.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj146.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj146.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj146.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj146);\n",
       "scene.add(obj146);\n",
       "\n",
       "var obj147 = new THREE.Object3D();\n",
       "obj147.name = \"unnamed__40\";\n",
       "obj147.userData.explodable = 1;\n",
       "obj147.userData.points = [];\n",
       "obj147.userData.points.push(new PMPoint(0.5, 0.5, -0.5));\n",
       "obj147.userData.points.push(new PMPoint(0.5, 6, -0.5));\n",
       "\n",
       "obj147.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj147.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj147.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj147.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj147);\n",
       "scene.add(obj147);\n",
       "\n",
       "var obj148 = new THREE.Object3D();\n",
       "obj148.name = \"unnamed__41\";\n",
       "obj148.userData.explodable = 1;\n",
       "obj148.userData.points = [];\n",
       "obj148.userData.points.push(new PMPoint(0.5, 0.5, -0.5));\n",
       "obj148.userData.points.push(new PMPoint(6, 0.5, -0.5));\n",
       "\n",
       "obj148.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj148.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj148.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj148.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj148);\n",
       "scene.add(obj148);\n",
       "\n",
       "var obj149 = new THREE.Object3D();\n",
       "obj149.name = \"unnamed__42\";\n",
       "obj149.userData.explodable = 1;\n",
       "obj149.userData.points = [];\n",
       "obj149.userData.points.push(new PMPoint(-0.5, 0, 0));\n",
       "obj149.userData.points.push(new PMPoint(0.5, 1, 1));\n",
       "\n",
       "obj149.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj149.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj149.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj149.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj149);\n",
       "scene.add(obj149);\n",
       "\n",
       "var obj150 = new THREE.Object3D();\n",
       "obj150.name = \"unnamed__43\";\n",
       "obj150.userData.explodable = 1;\n",
       "obj150.userData.points = [];\n",
       "obj150.userData.points.push(new PMPoint(0.75, 1, 1.25));\n",
       "obj150.userData.points.push(new PMPoint(0.5, 1, 1));\n",
       "\n",
       "obj150.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj150.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj150.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj150.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj150);\n",
       "scene.add(obj150);\n",
       "\n",
       "var obj151 = new THREE.Object3D();\n",
       "obj151.name = \"unnamed__44\";\n",
       "obj151.userData.explodable = 1;\n",
       "obj151.userData.points = [];\n",
       "obj151.userData.points.push(new PMPoint(0.5, 1, 1));\n",
       "obj151.userData.points.push(new PMPoint(0.5, 6, 1));\n",
       "\n",
       "obj151.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj151.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj151.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj151.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj151);\n",
       "scene.add(obj151);\n",
       "\n",
       "var obj152 = new THREE.Object3D();\n",
       "obj152.name = \"unnamed__45\";\n",
       "obj152.userData.explodable = 1;\n",
       "obj152.userData.points = [];\n",
       "obj152.userData.points.push(new PMPoint(1, 0.75, 1));\n",
       "obj152.userData.points.push(new PMPoint(0, -0.25, 0));\n",
       "\n",
       "obj152.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj152.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj152.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj152.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj152);\n",
       "scene.add(obj152);\n",
       "\n",
       "var obj153 = new THREE.Object3D();\n",
       "obj153.name = \"unnamed__46\";\n",
       "obj153.userData.explodable = 1;\n",
       "obj153.userData.points = [];\n",
       "obj153.userData.points.push(new PMPoint(-0.5, -0.25, 0));\n",
       "obj153.userData.points.push(new PMPoint(0, -0.25, 0));\n",
       "\n",
       "obj153.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj153.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj153.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj153.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj153);\n",
       "scene.add(obj153);\n",
       "\n",
       "var obj154 = new THREE.Object3D();\n",
       "obj154.name = \"unnamed__47\";\n",
       "obj154.userData.explodable = 1;\n",
       "obj154.userData.points = [];\n",
       "obj154.userData.points.push(new PMPoint(0, -0.5, -0.25));\n",
       "obj154.userData.points.push(new PMPoint(0, -0.25, 0));\n",
       "\n",
       "obj154.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj154.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj154.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj154.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj154);\n",
       "scene.add(obj154);\n",
       "\n",
       "var obj155 = new THREE.Object3D();\n",
       "obj155.name = \"unnamed__48\";\n",
       "obj155.userData.explodable = 1;\n",
       "obj155.userData.points = [];\n",
       "obj155.userData.points.push(new PMPoint(0.75, 1, 1.25));\n",
       "obj155.userData.points.push(new PMPoint(1, 1, 1.25));\n",
       "\n",
       "obj155.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj155.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj155.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj155.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj155);\n",
       "scene.add(obj155);\n",
       "\n",
       "var obj156 = new THREE.Object3D();\n",
       "obj156.name = \"unnamed__49\";\n",
       "obj156.userData.explodable = 1;\n",
       "obj156.userData.points = [];\n",
       "obj156.userData.points.push(new PMPoint(1, 0.75, 1));\n",
       "obj156.userData.points.push(new PMPoint(1, 1, 1.25));\n",
       "\n",
       "obj156.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj156.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj156.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj156.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj156);\n",
       "scene.add(obj156);\n",
       "\n",
       "var obj157 = new THREE.Object3D();\n",
       "obj157.name = \"unnamed__50\";\n",
       "obj157.userData.explodable = 1;\n",
       "obj157.userData.points = [];\n",
       "obj157.userData.points.push(new PMPoint(1, 0.75, 1));\n",
       "obj157.userData.points.push(new PMPoint(6, 0.75, 1));\n",
       "\n",
       "obj157.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj157.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj157.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj157.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj157);\n",
       "scene.add(obj157);\n",
       "\n",
       "var obj158 = new THREE.Object3D();\n",
       "obj158.name = \"unnamed__51\";\n",
       "obj158.userData.explodable = 1;\n",
       "obj158.userData.points = [];\n",
       "obj158.userData.points.push(new PMPoint(2, 2, 2.25));\n",
       "obj158.userData.points.push(new PMPoint(1, 1, 1.25));\n",
       "\n",
       "obj158.userData.pointradii = 0.05775;\n",
       "   <!-- Vertex style -->\n",
       "obj158.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );\n",
       "obj158.userData.edgeindices = [1, 0];\n",
       "   <!-- Edge style -->\n",
       "obj158.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, depthTest: true, linewidth: 7.85714285714286, transparent: false } );\n",
       "init_object(obj158);\n",
       "scene.add(obj158);\n",
       "\n",
       "// COMMON_CODE_BLOCK_BEGIN\n",
       "function textSpriteMaterial(message, parameters) {\n",
       "    if ( parameters === undefined ) parameters = {};\n",
       "    var fontface = \"Helvetica\";\n",
       "    var fontsize = parameters.hasOwnProperty(\"fontsize\") ? parameters[\"fontsize\"] : 15;\n",
       "    fontsize = fontsize*10;\n",
       "    var lines = message.split('\\\\n');\n",
       "    var size = 512;\n",
       "    for(var i = 0; i<lines.length; i++){\n",
       "        var tmp = lines[i].length;\n",
       "        while(tmp*fontsize > size){\n",
       "           fontsize--;\n",
       "        }\n",
       "    }\n",
       "    \n",
       "    var canvas = document.createElement('canvas');\n",
       "    canvas.width = size;\n",
       "    canvas.height = size;\n",
       "    var context = canvas.getContext('2d');\n",
       "    context.fillStyle = \"rgba(255, 255, 255, 0)\";\n",
       "    context.fill();\n",
       "    context.font = fontsize + \"px \" + fontface;\n",
       "    \n",
       "    // text color\n",
       "    context.fillStyle = \"rgba(0, 0, 0, 1.0)\";\n",
       "     for(var i = 0; i<lines.length; i++){\n",
       "        context.fillText(lines[i], size/2, size/2+i*fontsize);\n",
       "     }\n",
       "    \n",
       "    // canvas contents will be used for a texture\n",
       "    var texture = new THREE.Texture(canvas);\n",
       "    texture.needsUpdate = true;\n",
       "    \n",
       "    var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 });\n",
       "    return spriteMaterial;\n",
       "}\n",
       "\n",
       "\n",
       "// ---------------------- INITIALIZING OBJECTS--------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function init_object(obj) {\n",
       "    if (obj.userData.hasOwnProperty(\"pointmaterial\")) {\n",
       "        init_points(obj);\n",
       "        modelContains.points = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"pointlabels\")) {\n",
       "        init_pointlabels(obj);\n",
       "        modelContains.pointlabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgematerial\")) {\n",
       "        init_lines(obj);\n",
       "        modelContains.lines = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"edgelabels\")) {\n",
       "        init_edgelabels(obj);\n",
       "        modelContains.edgelabels = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"arrowstyle\")) {\n",
       "        init_arrowheads(obj);\n",
       "        modelContains.arrowheads = true;\n",
       "    }\n",
       "    if (obj.userData.hasOwnProperty(\"facetmaterial\")) {\n",
       "        init_faces(obj);\n",
       "        modelContains.faces = true;\n",
       "    }\n",
       "}\n",
       "\n",
       "function init_points(obj) {\n",
       "    var pointgroup = new THREE.Group();\n",
       "    pointgroup.name = \"points\";\n",
       "    var points = obj.userData.points;\n",
       "    var radii = obj.userData.pointradii;\n",
       "    var materials = obj.userData.pointmaterial;\n",
       "    var geometry,material;\n",
       "    if (!Array.isArray(radii)) {\n",
       "        geometry = new THREE.SphereBufferGeometry(radii);  \n",
       "    }\n",
       "    if (!Array.isArray(materials)) {\n",
       "        material = materials;\n",
       "    }\n",
       "    for (var i=0; i<points.length; i++) {\n",
       "        var point = points[i];\n",
       "        if (Array.isArray(radii)) {\n",
       "            if (radii[i] == 0) {\n",
       "                continue;\n",
       "            }\n",
       "            geometry = new THREE.SphereBufferGeometry(radii[i]);  \n",
       "        } \n",
       "        if (Array.isArray(materials)) {\n",
       "            material = materials[i];     \n",
       "        } \n",
       "        var sphere = new THREE.Mesh(geometry, material);\n",
       "        point.addSphere(sphere);\n",
       "        pointgroup.add(sphere);\n",
       "    }\n",
       "    obj.add(pointgroup);\n",
       "}\n",
       "\n",
       "function init_pointlabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var labels = obj.userData.pointlabels;\n",
       "    var pointlabels = new THREE.Group();\n",
       "    pointlabels.name = \"pointlabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "\t        var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            point.addLabel(sprite);\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(pointlabels);\n",
       "}\n",
       "\n",
       "function init_lines(obj) {\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var points = obj.userData.points;\n",
       "    var materials = obj.userData.edgematerial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 );\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position', bufattr);\n",
       "    if (Array.isArray(materials)) {     \n",
       "        for (var i=0; i<materials.length; i++) {\n",
       "            geometry.addGroup(2*i,2,i);\n",
       "        }\n",
       "    }\n",
       "    var lines = new THREE.LineSegments(geometry, materials);\n",
       "    lines.name = \"lines\";\n",
       "    obj.add(lines);\n",
       "    updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "function init_edgelabels(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var labels = obj.userData.edgelabels;\n",
       "    var edgelabels = new THREE.Group();\n",
       "    edgelabels.name = \"edgelabels\";\n",
       "    if (Array.isArray(labels)) {\n",
       "        for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "            var point = points[i];\n",
       "            var spriteMaterial = textSpriteMaterial( labels[i] );\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            edgelabels.add(sprite);\n",
       "        }\n",
       "    } else {\n",
       "        var spriteMaterial = textSpriteMaterial( labels );\n",
       "        for (var i=0; i<points.length; i++) {\n",
       "            var point = points[i];\n",
       "            var sprite = new THREE.Sprite(spriteMaterial);\n",
       "            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[i]].vector,points[edgeindices[i+1]].vector).multiplyScalar(0.5));\n",
       "            pointlabels.add(sprite);\n",
       "        }\n",
       "    }\n",
       "    obj.add(edgelabels);\n",
       "}\n",
       "\n",
       "function init_arrowheads(obj) {\n",
       "    var arrowheads = new THREE.Group();\n",
       "    arrowheads.name = \"arrowheads\";\n",
       "    var arrowstyle = obj.userData.arrowstyle;\n",
       "    var edgeindices = obj.userData.edgeindices;\n",
       "    var edgematerials = obj.userData.edgematerial;\n",
       "    var points = obj.userData.points;\n",
       "    var material;\n",
       "    if (!Array.isArray(edgematerials)) {\n",
       "        material = new THREE.MeshBasicMaterial( {color: edgematerials.color} );\n",
       "    }\n",
       "\n",
       "    for (var i=0; i<edgeindices.length; i=i+2) {\n",
       "        var start = points[edgeindices[i]];\n",
       "        var end = points[edgeindices[i+1]];\n",
       "        var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius();\n",
       "        if (dist <= 0) {\n",
       "            continue;\n",
       "        }\n",
       "        var dir = new THREE.Vector3().subVectors(end.vector,start.vector);\n",
       "        dir.normalize();\n",
       "        var axis = new THREE.Vector3().set(dir.z,0,-dir.x);\n",
       "        axis.normalize();\n",
       "        var radians = Math.acos( dir.y );\n",
       "        var radius = dist/25;\n",
       "        var height = dist/5;\n",
       "        var geometry = new THREE.ConeBufferGeometry(radius,height);\n",
       "        var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2));\n",
       "        if (Array.isArray(edgematerials)) {\n",
       "            material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} );\n",
       "        }\n",
       "        var cone = new THREE.Mesh( geometry, material );\n",
       "        cone.quaternion.setFromAxisAngle(axis,radians);;\n",
       "        cone.position.copy(position);;\n",
       "        arrowheads.add(cone);\n",
       "    }\n",
       "    obj.add(arrowheads);\n",
       "}\n",
       "\n",
       "function init_faces(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var facets = obj.userData.facets;\n",
       "    obj.userData.triangleindices = [];\n",
       "    for (var i=0; i<facets.length; i++) {\n",
       "        facet = facets[i];\n",
       "        for (var t=0; t<facet.length-2; t++) {\n",
       "            obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]);  \n",
       "        }\n",
       "    }\n",
       "    var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 );\n",
       "    var bufattr = new THREE.Float32BufferAttribute(bufarr,3);\n",
       "    \n",
       "    var materials = obj.userData.facetmaterial;\n",
       "    var geometry = new THREE.BufferGeometry();\n",
       "    geometry.setAttribute('position',bufattr);\n",
       "    if (Array.isArray(materials)) {\n",
       "        var tricount = 0;\n",
       "        var facet;\n",
       "        for (var i=0; i<facets.length; i++) {\n",
       "            facet = facets[i];\n",
       "            geometry.addGroup(tricount,(facet.length-2)*3,i);\n",
       "            tricount += (facet.length-2)*3;\n",
       "        }\n",
       "    }\n",
       "    var mesh = new THREE.Mesh(geometry, materials);\n",
       "    mesh.name = \"faces\";\n",
       "    obj.add(mesh); \n",
       "    updateFacesPosition(obj);\n",
       "}\n",
       "// //INITIALIZING\n",
       "\n",
       "\n",
       "function updateFacesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.triangleindices;\n",
       "    var faces = obj.getObjectByName(\"faces\");\n",
       "    var ba = faces.geometry.getAttribute(\"position\");\n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    faces.geometry.attributes.position.needsUpdate = true;\n",
       "    \n",
       "}\n",
       "\n",
       "function updateEdgesPosition(obj) {\n",
       "    var points = obj.userData.points;\n",
       "    var indices = obj.userData.edgeindices;\n",
       "    var lines = obj.getObjectByName(\"lines\");\n",
       "    var ba = lines.geometry.getAttribute(\"position\"); \n",
       "    for (var i=0; i<indices.length; i++) {\n",
       "        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); \n",
       "    }\n",
       "    lines.geometry.attributes.position.needsUpdate = true;\n",
       "}\n",
       "\n",
       "function onWindowResize() {\n",
       "    renderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    svgRenderer.setSize( three.clientWidth, three.clientHeight );\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "function updateCamera() {\n",
       "    var width = three.clientWidth;\n",
       "    var height = three.clientHeight;\n",
       "    var aspect = width / height;\n",
       "    if (camera.type == \"OrthographicCamera\") {\n",
       "        camera.left = frustumSize * aspect / - 2;\n",
       "        camera.right = frustumSize * aspect / 2;\n",
       "        camera.top = frustumSize / 2;\n",
       "        camera.bottom = - frustumSize / 2;\n",
       "    } else if (camera.type == \"PerspectiveCamera\") {\n",
       "        camera.aspect = aspect;\n",
       "    }\n",
       "    camera.updateProjectionMatrix();\n",
       "}\n",
       "\n",
       "function changeCamera(event) {\n",
       "    var selindex = event.currentTarget.selectedIndex;\n",
       "    camera = cameras[selindex];\n",
       "    control = controls[selindex];\n",
       "    control.enabled = true; \n",
       "    for (var i=0; i<controls.length; i++) {\n",
       "        if (i!=selindex) {\n",
       "            controls[i].enabled = false;\n",
       "        }\n",
       "    }\n",
       "    updateCamera();\n",
       "}\n",
       "\n",
       "var camtypenode = document.getElementById('cameraType_6');\n",
       "camtypenode.onchange = changeCamera;\n",
       "camtypenode.dispatchEvent(new Event('change'));\n",
       "\n",
       "onWindowResize();\n",
       "window.addEventListener('resize', onWindowResize);\t\n",
       "\n",
       "\n",
       "var xRotationEnabled = false;\n",
       "var yRotationEnabled = false;\n",
       "var zRotationEnabled = false;\n",
       "var rotationSpeedFactor = 1;\n",
       "var settingsShown = false;\n",
       "var labelsShown = true;\n",
       "var intervals = [];\n",
       "var timeouts = [];\n",
       "var explodingSpeed = 0.05;\n",
       "var explodeScale = 0;\n",
       "var XMLS = new XMLSerializer();\n",
       "var svgElement;\n",
       "var renderId;\n",
       "\n",
       "var render = function () {\n",
       "\n",
       "\trenderId = requestAnimationFrame(render);\n",
       "\n",
       "//\tcomment in for automatic explosion\n",
       "//\texplode(updateFactor());\n",
       "\n",
       "    var phi = 0.02 * rotationSpeedFactor;\n",
       "\n",
       "    if (xRotationEnabled) {\n",
       "        scene.rotation.x += phi;\n",
       "    }\n",
       "    if (yRotationEnabled) {\n",
       "        scene.rotation.y += phi;\n",
       "    }\n",
       "    if (zRotationEnabled) {\n",
       "        scene.rotation.z += phi;\n",
       "    }\n",
       "\n",
       "    control.update();\n",
       "    renderer.render(scene, camera);\n",
       "};\n",
       "\n",
       "if ( THREE.WEBGL.isWebGLAvailable() ) {\n",
       "\trender();\n",
       "} else {\n",
       "\tvar warning = WEBGL.getWebGLErrorMessage();\n",
       "\tthree.appendChild( warning );\n",
       "}\n",
       "    \n",
       "function changeTransparency() {\n",
       "    var opacity = 1-Number(event.currentTarget.value);\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        child = scene.children[i];\n",
       "        if ( child.userData.hasOwnProperty(\"facetmaterial\") ) {\n",
       "            if (Array.isArray(child.userData.facetmaterial)) {\n",
       "                for (var j=0; j<child.userData.facetmaterial.length; j++) {\n",
       "                    child.userData.facetmaterial[j].opacity = opacity;\n",
       "                }\n",
       "            } else {\n",
       "                child.userData.facetmaterial.opacity = opacity;\n",
       "            }    \n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function changeRotationX(event){\n",
       "    xRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationY(event){\n",
       "    yRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "function changeRotationZ(event){\n",
       "    zRotationEnabled = event.currentTarget.checked;\n",
       "}\t\n",
       "\n",
       "\n",
       "function changeRotationSpeedFactor(event){\n",
       "    rotationSpeedFactor = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function resetScene(){\n",
       "    scene.rotation.set(0,0,0);\n",
       "    camera.position.set(0,0,5);\n",
       "    camera.up.set(0,1,0);\n",
       "}\n",
       "\n",
       "function showSettings(event){\n",
       "    document.getElementById('settings_6').style.visibility = 'visible';\n",
       "    document.getElementById('showSettingsButton_6').style.visibility = 'hidden';\n",
       "    document.getElementById('hideSettingsButton_6').style.visibility = 'visible';\n",
       "    settingsShown = true;\n",
       "}\n",
       "\n",
       "function hideSettings(event){\n",
       "    document.getElementById('settings_6').style.visibility = 'hidden';\n",
       "    document.getElementById('showSettingsButton_6').style.visibility = 'visible';\n",
       "    document.getElementById('hideSettingsButton_6').style.visibility = 'hidden';\n",
       "    settingsShown = false;\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "var pos = 150* Math.PI;\n",
       "\n",
       "function updateFactor() {\n",
       "    pos++;\n",
       "    return Math.sin(.01*pos)+1;\n",
       "}\n",
       "\n",
       "// ------------------------ FOLDING ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "// rotate point p around axis defined by points p1 and p2 by given angle\n",
       "function rotate(p, p1, p2, angle ){   \n",
       "    angle = -angle;\n",
       "    var x = p.x, y = p.y, z = p.z, \n",
       "    a = p1.x, b = p1.y, c = p1.z, \n",
       "    u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z;\n",
       "    var result = [];\n",
       "    var L = u*u + v*v + w*w;\n",
       "    var sqrt = Math.sqrt;\n",
       "    var cos = Math.cos;\n",
       "    var sin = Math.sin;\n",
       "\n",
       "    result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L;\n",
       "    result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L;\n",
       "    result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L;\n",
       "\n",
       "    return result;\n",
       "}\n",
       "\n",
       "var fold = function(event){\n",
       "    var obj = foldables[Number(event.currentTarget.name)];\n",
       "    var foldvalue = Number(event.currentTarget.value);\n",
       "    var scale = foldvalue - obj.userData.oldscale;\n",
       "\n",
       "    for (var j=0; j<obj.userData.axes.length; j++) {\n",
       "        rotateVertices(obj, j, scale);\n",
       "    }\n",
       "    update(obj);\n",
       "    obj.userData.oldscale += scale;\n",
       "    lookAtBarycenter(obj);\n",
       "}\n",
       "\n",
       "function lookAtBarycenter(obj){\n",
       "    control.target = barycenter(obj);\n",
       "}\n",
       "\n",
       "function barycenter(obj) {\n",
       "    var center = new THREE.Vector3(0,0,0);\n",
       "    var points = obj.userData.points;\n",
       "    for (var i=0; i<points.length; i++){\n",
       "        center.add(points[i].vector);\n",
       "    }\n",
       "    center.divideScalar(points.length);\n",
       "    return center;\n",
       "}\n",
       "\n",
       "function rotateVertices(obj, edge, scale) {\n",
       "    var axes = obj.userData.axes;\n",
       "    var subtrees = obj.userData.subtrees;\n",
       "    var points = obj.userData.points;\n",
       "    var angles = obj.userData.angles;\n",
       "    if (edge < axes.length){\n",
       "        for (var j=0; j<subtrees[edge].length; j++){\n",
       "            var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge]));\n",
       "            points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]);\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function update(obj) {\n",
       "   updateFacesPosition(obj);\n",
       "   updateEdgesPosition(obj);\n",
       "}\n",
       "\n",
       "if (foldables.length) {\n",
       "    var settings = document.getElementById('settings_6');\n",
       "    var foldDiv = document.createElement('div');\n",
       "    foldDiv.id = 'fold_6';\n",
       "    var title = document.createElement('strong');\n",
       "    title.innerHTML = 'Fold';\n",
       "    foldDiv.appendChild(title);\n",
       "    foldDiv.className = 'group';\n",
       "    for (var i=0; i<foldables.length; i++) {\n",
       "        var range = document.createElement('input');\n",
       "        range.type = 'range';\n",
       "        range.min = 0;\n",
       "        range.max = 1;\n",
       "        range.value = 0;\n",
       "        range.step = 0.001;\n",
       "        range.name = String(i);\n",
       "        range.oninput = fold;\n",
       "        foldDiv.appendChild(range);\n",
       "    }\n",
       "    lookAtBarycenter(foldables[0]);\n",
       "    settings.insertBefore(foldDiv,settings.childNodes[0]);\n",
       "}\n",
       "\n",
       "    \n",
       "// ---------------------- EXPLOSION ------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "if (explodableModel) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        obj = scene.children[i];\n",
       "        if ( obj.userData.explodable ) {\n",
       "            computeCentroid(obj);\n",
       "        }\n",
       "    }\n",
       "    document.getElementById('explodeRange_6').oninput = triggerExplode;\n",
       "    document.getElementById('explodeCheckbox_6').onchange = triggerAutomaticExplode;\n",
       "    document.getElementById('explodingSpeedRange_6').oninput = setExplodingSpeed;\n",
       "}\n",
       "\n",
       "function computeCentroid(obj) {\n",
       "    centroid = new THREE.Vector3();\n",
       "    obj.userData.points.forEach(function(pmpoint) {\n",
       "        centroid.add(pmpoint.vector);\t\t\t\n",
       "    });\n",
       "    centroid.divideScalar(obj.userData.points.length);\n",
       "    obj.userData.centroid = centroid;\n",
       "}\n",
       "\n",
       "function explode(factor) {\n",
       "    for (var i=0; i<scene.children.length; i++) {\n",
       "        var obj = scene.children[i];\n",
       "        if (obj.userData.hasOwnProperty(\"centroid\")) { \n",
       "            var c = obj.userData.centroid;\n",
       "            obj.position.set(c.x*factor, c.y*factor, c.z*factor);\n",
       "        }\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function triggerExplode(event){\n",
       "    explodeScale = Number(event.currentTarget.value);\n",
       "    explode(explodeScale);\n",
       "}\n",
       "\n",
       "function setExplodingSpeed(event){\n",
       "    explodingSpeed = Number(event.currentTarget.value);\n",
       "}\n",
       "\n",
       "function triggerAutomaticExplode(event){\n",
       "    if (event.currentTarget.checked){\n",
       "        startExploding();\n",
       "    } else {\n",
       "        clearIntervals();\n",
       "    }\t\n",
       "}\n",
       "\n",
       "function startExploding(){\n",
       "    intervals.push(setInterval(explodingInterval, 25));\n",
       "}\n",
       "\n",
       "\n",
       "function explodingInterval(){\n",
       "    explodeScale += explodingSpeed;\n",
       "    if (explodeScale <= 6){ \n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else{\n",
       "        explode(6);\n",
       "        explodeScale = 6;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startUnexploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_6').value = explodeScale;\n",
       "}\n",
       "\n",
       "\n",
       "function startUnexploding(){\n",
       "    intervals.push(setInterval(unexplodingInterval, 25));\n",
       "}\n",
       "\n",
       "function unexplodingInterval(){\n",
       "    explodeScale -= explodingSpeed;\n",
       "    if (explodeScale >= 0){\t\n",
       "        explode(explodeScale);\n",
       "    }\n",
       "    else {\n",
       "        explode(0);\n",
       "        explodeScale = 0;\n",
       "        clearIntervals();\n",
       "        timeouts.push(setTimeout(startExploding, 3000));\n",
       "    }\n",
       "    document.getElementById('explodeRange_6').value = explodeScale;\n",
       "}\n",
       "\n",
       "function clearIntervals(){\n",
       "    intervals.forEach(function(interval){\n",
       "        clearInterval(interval);\n",
       "    });\n",
       "    intervals = [];\n",
       "    timeouts.forEach(function(timeout){\n",
       "        clearTimeout(timeout);\n",
       "    });\n",
       "    timeouts = [];\n",
       "}\n",
       "\n",
       "// ---------------------- DISPLAY --------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "const objectTypeInnerHTMLs = { points: \"Points\", pointlabels: \"Point labels\", lines: \"Edges\", edgelabels: \"Edge labels\", faces: \"Faces\", arrowheads: \"Arrow heads\" };\n",
       "const objectTypeVisible = {};\n",
       "Object.assign(objectTypeVisible,modelContains);\n",
       "const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort();\n",
       "const shownObjectTypesList = document.getElementById('shownObjectTypesList_6');\n",
       "\n",
       "function setVisibility(bool,objname) {\n",
       "    for (var i=0; i<scene.children.length; i++){\n",
       "        var obj = scene.children[i].getObjectByName(objname);\n",
       "        if (obj) {\n",
       "            obj.visible = bool;\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "function toggleObjectTypeVisibility(event){\n",
       "    var name = event.currentTarget.name;\n",
       "    var checked = event.currentTarget.checked;\n",
       "    objectTypeVisible[name] = checked;\n",
       "    setVisibility(checked,name);\n",
       "}\n",
       "\n",
       "for (var i=0; i<sortedObjectTypeKeys.length; i++){\n",
       "    var key = sortedObjectTypeKeys[i];\n",
       "    if (modelContains[key]) {\n",
       "        var objTypeNode = document.createElement('span');\n",
       "        objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>';\n",
       "        var checkbox = document.createElement('input');\n",
       "        checkbox.type = 'checkbox';\n",
       "        checkbox.checked = true;\n",
       "        checkbox.name = key;\n",
       "        checkbox.onchange = toggleObjectTypeVisibility;\n",
       "        shownObjectTypesList.appendChild(checkbox);\n",
       "        shownObjectTypesList.appendChild(objTypeNode);\n",
       "    }\n",
       "}\n",
       "\n",
       "// ------------------------------------------------------\n",
       "\n",
       "function toggleObjectVisibility(event){\n",
       "    var nr = Number(event.currentTarget.name);\n",
       "    scene.children[nr].visible = event.currentTarget.checked;\n",
       "}\n",
       "\n",
       "// append checkboxes for displaying or hiding objects\n",
       "var shownObjectsList = document.getElementById('shownObjectsList_6');\n",
       "for (var i=0; i<scene.children.length; i++){\n",
       "    obj = scene.children[i];\n",
       "    var objNode = document.createElement('span');\n",
       "    objNode.innerHTML = obj.name + '<br>';\n",
       "    var checkbox = document.createElement('input');\n",
       "    checkbox.type = 'checkbox';\n",
       "    checkbox.checked = true;\n",
       "    checkbox.name = String(i);\n",
       "    checkbox.onchange = toggleObjectVisibility;\n",
       "    shownObjectsList.appendChild(checkbox);\n",
       "    shownObjectsList.appendChild(objNode);\n",
       "}\n",
       "\n",
       "// ---------------------- SVG ------------------------------------------------------\n",
       "// ---------------------------------------------------------------------------------\n",
       "\n",
       "function takeSvgScreenshot() {\n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(false,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(false,\"edgelabels\");\n",
       "    }\n",
       "    svgRenderer.render(scene,camera);\n",
       "    svgElement = XMLS.serializeToString(svgRenderer.domElement);\n",
       "    \n",
       "    if (objectTypeVisible[\"pointlabels\"]) {\n",
       "        setVisibility(true,\"pointlabels\");\n",
       "    }\n",
       "    if (objectTypeVisible[\"edgelabels\"]) {\n",
       "        setVisibility(true,\"edgelabels\");\n",
       "    }\n",
       "\n",
       "    if (document.getElementById('tab_6').checked){\n",
       "        //show in new tab\n",
       "        var myWindow = window.open(\"\",\"\");\n",
       "        myWindow.document.body.innerHTML = svgElement;\n",
       "    } else{\n",
       "        // download svg file \n",
       "        download(\"screenshot.svg\", svgElement);\n",
       "    }\n",
       "}\n",
       "\n",
       "function download(filename, text) {\n",
       "    var element = document.createElement('a');\n",
       "    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));\n",
       "    element.setAttribute('download', filename);\n",
       "\n",
       "    element.style.display = 'none';\n",
       "    document.body.appendChild(element);\n",
       "\n",
       "    element.click();\n",
       "\n",
       "    document.body.removeChild(element);\n",
       "}\n",
       "\n",
       "\n",
       "document.getElementById('transparencyRange_6').oninput = changeTransparency;\n",
       "document.getElementById('changeRotationX_6').onchange = changeRotationX;\n",
       "document.getElementById('changeRotationY_6').onchange = changeRotationY;\n",
       "document.getElementById('changeRotationZ_6').onchange = changeRotationZ;\n",
       "document.getElementById('resetButton_6').onclick = resetScene;\n",
       "document.getElementById('rotationSpeedRange_6').oninput = changeRotationSpeedFactor;\n",
       "document.getElementById('takeScreenshot_6').onclick = takeSvgScreenshot;\n",
       "document.getElementById('showSettingsButton_6').onclick = showSettings;\n",
       "document.getElementById('hideSettingsButton_6').onclick = hideSettings;\n",
       "\n",
       "\n",
       "// ------------------ SHORTCUTS --------------------------------------------\n",
       "// -------------------------------------------------------------------------\n",
       "\n",
       "/**\n",
       " * http://www.openjs.com/scripts/events/keyboard_shortcuts/\n",
       " * Version : 2.01.B\n",
       " * By Binny V A\n",
       " * License : BSD\n",
       " */\n",
       "shortcut = {\n",
       "\t'all_shortcuts':{},//All the shortcuts are stored in this array\n",
       "\t'add': function(shortcut_combination,callback,opt) {\n",
       "\t\t//Provide a set of default options\n",
       "\t\tvar default_options = {\n",
       "\t\t\t'type':'keydown',\n",
       "\t\t\t'propagate':false,\n",
       "\t\t\t'disable_in_input':false,\n",
       "\t\t\t'target':document,\n",
       "\t\t\t'keycode':false\n",
       "\t\t}\n",
       "\t\tif(!opt) opt = default_options;\n",
       "\t\telse {\n",
       "\t\t\tfor(var dfo in default_options) {\n",
       "\t\t\t\tif(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\n",
       "\t\tvar ele = opt.target;\n",
       "\t\tif(typeof opt.target == 'string') ele = document.getElementById(opt.target);\n",
       "\t\tvar ths = this;\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\n",
       "\t\t//The function to be called at keypress\n",
       "\t\tvar func = function(e) {\n",
       "\t\t\te = e || window.event;\n",
       "\t\t\t\n",
       "\t\t\tif(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields\n",
       "\t\t\t\tvar element;\n",
       "\t\t\t\tif(e.target) element=e.target;\n",
       "\t\t\t\telse if(e.srcElement) element=e.srcElement;\n",
       "\t\t\t\tif(element.nodeType==3) element=element.parentNode;\n",
       "\n",
       "\t\t\t\tif(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\t//Find Which key is pressed\n",
       "\t\t\tif (e.keyCode) code = e.keyCode;\n",
       "\t\t\telse if (e.which) code = e.which;\n",
       "\t\t\tvar character = String.fromCharCode(code).toLowerCase();\n",
       "\t\t\t\n",
       "\t\t\tif(code == 188) character=\",\"; //If the user presses , when the type is onkeydown\n",
       "\t\t\tif(code == 190) character=\".\"; //If the user presses , when the type is onkeydown\n",
       "\n",
       "\t\t\tvar keys = shortcut_combination.split(\"+\");\n",
       "\t\t\t//Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked\n",
       "\t\t\tvar kp = 0;\n",
       "\t\t\t\n",
       "\t\t\t//Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken\n",
       "\t\t\tvar shift_nums = {\n",
       "\t\t\t\t\"`\":\"~\",\n",
       "\t\t\t\t\"1\":\"!\",\n",
       "\t\t\t\t\"2\":\"@\",\n",
       "\t\t\t\t\"3\":\"#\",\n",
       "\t\t\t\t\"4\":\"$\",\n",
       "\t\t\t\t\"5\":\"%\",\n",
       "\t\t\t\t\"6\":\"^\",\n",
       "\t\t\t\t\"7\":\"&\",\n",
       "\t\t\t\t\"8\":\"*\",\n",
       "\t\t\t\t\"9\":\"(\",\n",
       "\t\t\t\t\"0\":\")\",\n",
       "\t\t\t\t\"-\":\"_\",\n",
       "\t\t\t\t\"=\":\"+\",\n",
       "\t\t\t\t\";\":\":\",\n",
       "\t\t\t\t\"'\":\"\\\"\",\n",
       "\t\t\t\t\",\":\"<\",\n",
       "\t\t\t\t\".\":\">\",\n",
       "\t\t\t\t\"/\":\"?\",\n",
       "\t\t\t\t\"\\\\\":\"|\"\n",
       "\t\t\t}\n",
       "\t\t\t//Special Keys - and their codes\n",
       "\t\t\tvar special_keys = {\n",
       "\t\t\t\t'esc':27,\n",
       "\t\t\t\t'escape':27,\n",
       "\t\t\t\t'tab':9,\n",
       "\t\t\t\t'space':32,\n",
       "\t\t\t\t'return':13,\n",
       "\t\t\t\t'enter':13,\n",
       "\t\t\t\t'backspace':8,\n",
       "\t\n",
       "\t\t\t\t'scrolllock':145,\n",
       "\t\t\t\t'scroll_lock':145,\n",
       "\t\t\t\t'scroll':145,\n",
       "\t\t\t\t'capslock':20,\n",
       "\t\t\t\t'caps_lock':20,\n",
       "\t\t\t\t'caps':20,\n",
       "\t\t\t\t'numlock':144,\n",
       "\t\t\t\t'num_lock':144,\n",
       "\t\t\t\t'num':144,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pause':19,\n",
       "\t\t\t\t'break':19,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'insert':45,\n",
       "\t\t\t\t'home':36,\n",
       "\t\t\t\t'delete':46,\n",
       "\t\t\t\t'end':35,\n",
       "\t\t\t\t\n",
       "\t\t\t\t'pageup':33,\n",
       "\t\t\t\t'page_up':33,\n",
       "\t\t\t\t'pu':33,\n",
       "\t\n",
       "\t\t\t\t'pagedown':34,\n",
       "\t\t\t\t'page_down':34,\n",
       "\t\t\t\t'pd':34,\n",
       "\t\n",
       "\t\t\t\t'left':37,\n",
       "\t\t\t\t'up':38,\n",
       "\t\t\t\t'right':39,\n",
       "\t\t\t\t'down':40,\n",
       "\t\n",
       "\t\t\t\t'f1':112,\n",
       "\t\t\t\t'f2':113,\n",
       "\t\t\t\t'f3':114,\n",
       "\t\t\t\t'f4':115,\n",
       "\t\t\t\t'f5':116,\n",
       "\t\t\t\t'f6':117,\n",
       "\t\t\t\t'f7':118,\n",
       "\t\t\t\t'f8':119,\n",
       "\t\t\t\t'f9':120,\n",
       "\t\t\t\t'f10':121,\n",
       "\t\t\t\t'f11':122,\n",
       "\t\t\t\t'f12':123\n",
       "\t\t\t}\n",
       "\t\n",
       "\t\t\tvar modifiers = { \n",
       "\t\t\t\tshift: { wanted:false, pressed:false},\n",
       "\t\t\t\tctrl : { wanted:false, pressed:false},\n",
       "\t\t\t\talt  : { wanted:false, pressed:false},\n",
       "\t\t\t\tmeta : { wanted:false, pressed:false}\t//Meta is Mac specific\n",
       "\t\t\t};\n",
       "                        \n",
       "\t\t\tif(e.ctrlKey)\tmodifiers.ctrl.pressed = true;\n",
       "\t\t\tif(e.shiftKey)\tmodifiers.shift.pressed = true;\n",
       "\t\t\tif(e.altKey)\tmodifiers.alt.pressed = true;\n",
       "\t\t\tif(e.metaKey)   modifiers.meta.pressed = true;\n",
       "                        \n",
       "\t\t\tfor(var i=0; k=keys[i],i<keys.length; i++) {\n",
       "\t\t\t\t//Modifiers\n",
       "\t\t\t\tif(k == 'ctrl' || k == 'control') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.ctrl.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'shift') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.shift.wanted = true;\n",
       "\n",
       "\t\t\t\t} else if(k == 'alt') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.alt.wanted = true;\n",
       "\t\t\t\t} else if(k == 'meta') {\n",
       "\t\t\t\t\tkp++;\n",
       "\t\t\t\t\tmodifiers.meta.wanted = true;\n",
       "\t\t\t\t} else if(k.length > 1) { //If it is a special key\n",
       "\t\t\t\t\tif(special_keys[k] == code) kp++;\n",
       "\t\t\t\t\t\n",
       "\t\t\t\t} else if(opt['keycode']) {\n",
       "\t\t\t\t\tif(opt['keycode'] == code) kp++;\n",
       "\n",
       "\t\t\t\t} else { //The special keys did not match\n",
       "\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\telse {\n",
       "\t\t\t\t\t\tif(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase\n",
       "\t\t\t\t\t\t\tcharacter = shift_nums[character]; \n",
       "\t\t\t\t\t\t\tif(character == k) kp++;\n",
       "\t\t\t\t\t\t}\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t\t\n",
       "\t\t\tif(kp == keys.length && \n",
       "\t\t\t\t\t\tmodifiers.ctrl.pressed == modifiers.ctrl.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.shift.pressed == modifiers.shift.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.alt.pressed == modifiers.alt.wanted &&\n",
       "\t\t\t\t\t\tmodifiers.meta.pressed == modifiers.meta.wanted) {\n",
       "\t\t\t\tcallback(e);\n",
       "\t\n",
       "\t\t\t\tif(!opt['propagate']) { //Stop the event\n",
       "\t\t\t\t\t//e.cancelBubble is supported by IE - this will kill the bubbling process.\n",
       "\t\t\t\t\te.cancelBubble = true;\n",
       "\t\t\t\t\te.returnValue = false;\n",
       "\t\n",
       "\t\t\t\t\t//e.stopPropagation works in Firefox.\n",
       "\t\t\t\t\tif (e.stopPropagation) {\n",
       "\t\t\t\t\t\te.stopPropagation();\n",
       "\t\t\t\t\t\te.preventDefault();\n",
       "\t\t\t\t\t}\n",
       "\t\t\t\t\treturn false;\n",
       "\t\t\t\t}\n",
       "\t\t\t}\n",
       "\t\t}\n",
       "\t\tthis.all_shortcuts[shortcut_combination] = {\n",
       "\t\t\t'callback':func, \n",
       "\t\t\t'target':ele, \n",
       "\t\t\t'event': opt['type']\n",
       "\t\t};\n",
       "\t\t//Attach the function with the event\n",
       "\t\tif(ele.addEventListener) ele.addEventListener(opt['type'], func, false);\n",
       "\t\telse if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);\n",
       "\t\telse ele['on'+opt['type']] = func;\n",
       "\t},\n",
       "\n",
       "\t//Remove the shortcut - just specify the shortcut and I will remove the binding\n",
       "\t'remove':function(shortcut_combination) {\n",
       "\t\tshortcut_combination = shortcut_combination.toLowerCase();\n",
       "\t\tvar binding = this.all_shortcuts[shortcut_combination];\n",
       "\t\tdelete(this.all_shortcuts[shortcut_combination])\n",
       "\t\tif(!binding) return;\n",
       "\t\tvar type = binding['event'];\n",
       "\t\tvar ele = binding['target'];\n",
       "\t\tvar callback = binding['callback'];\n",
       "\n",
       "\t\tif(ele.detachEvent) ele.detachEvent('on'+type, callback);\n",
       "\t\telse if(ele.removeEventListener) ele.removeEventListener(type, callback, false);\n",
       "\t\telse ele['on'+type] = false;\n",
       "\t}\n",
       "}\n",
       "\n",
       "shortcut.add(\"Alt+Left\",function() {\n",
       "\tvar event = new Event('click');\n",
       "\tif (settingsShown){\n",
       "\t\tdocument.getElementById('hideSettingsButton_6').dispatchEvent(event);\n",
       "\t} else {\n",
       "\t\tdocument.getElementById('showSettingsButton_6').dispatchEvent(event);\n",
       "\t}\n",
       "});\n",
       "\n",
       "\n",
       "// COMMON_CODE_BLOCK_END\n",
       "\n",
       "});});\n",
       "      </script>\n",
       "   </body>\n",
       "</html>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "$b2Facets = polytope::bounding_box_facets($TCubic->affine_chart->VERTICES,surplus_k=>1, make_cube=>1);\n",
    "# apply bounding beforehand\n",
    "$b2Polytope = new polytope::Polytope(FACETS=>$b2Facets);\n",
    "$b2Complex = new fan::PolyhedralComplex(fan::check_fan_objects(($b2Polytope)));\n",
    "$b2TSextic = pcom_common_ref($TSextic->affine_chart,$b2Complex);\n",
    "compose(@solidifiedCubicCellsVis,$b2TSextic->VISUAL($curve_opts));\n",
    "# exporting the uncut sextic curve\n",
    "x3d($b2TSextic->VISUAL($curve_opts),File=>$x3d_dir.\"UncutTSextic.x3d\");"
   ]
  },
  {
   "attachments": {
    "boolean_intersect_modifier.jpeg": {
     "image/jpeg": "[encoded data, 214048 characters]"
    },
    "boolean_intersect_modifier_applied.jpeg": {
     "image/jpeg": "[encoded data, 203732 characters]"
    },
    "sextic_in_cubic.jpeg": {
     "image/jpeg": "[encoded data, 235044 characters]"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###  Step A: applying the bounding cube to curves in Blender\n",
    "\n",
    "1. Import the x3d file of the curve and join all spheres and indexed faceset objects.\n",
    "3. Import the x3d file of the bounding cube.\n",
    "4. Add a boolean intersect modifier to the lines object\n",
    "    ![boolean_intersect_modifier.jpeg](attachment:boolean_intersect_modifier.jpeg)\n",
    "    \n",
    "5. Choose the cube object to intersect with.\n",
    "    ![boolean_intersect_modifier_applied.jpeg](attachment:boolean_intersect_modifier_applied.jpeg)\n",
    "        \n",
    "5. After clicking on apply you can delete the bounding cube and import the (solidified) cubic. \n",
    "    ![sextic_in_cubic.jpeg](attachment:sextic_in_cubic.jpeg)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Tropical lines on tropical cubic surfaces\n",
    "\n",
    "Polymake is capable of computing all tropical lines on a given tropical cubic surface. Here is how you make a model out of it"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "$mCubic2 = [ [3,0,0,0], [0,3,0,0], [0,0,3,0], [0,0,0,3],\n",
    "            [1,1,1,0], [1,1,0,1], [1,0,1,1], [0,1,1,1],\n",
    "            [2,1,0,0], [2,0,1,0], [2,0,0,1],\n",
    "            [1,2,0,0], [1,0,2,0], [1,0,0,2],\n",
    "            [0,2,1,0], [0,2,0,1], [0,1,2,0],\n",
    "            [0,1,0,2], [0,0,2,1], [0,0,1,2]];\n",
    "$cCubic2 = [3,3,3,3,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1];\n",
    "$TCubic2 = new Hypersurface<Min>(MONOMIALS=>$mCubic2, COEFFICIENTS=>$cCubic2);\n",
    "$linesInCubic = lines_in_cubic($TCubic->POLYNOMIAL);\n",
    "@lines = map { $_->representative } @{$linesInCubic->all_families};"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this model we are going to use the bounding cube intersection frame (as in a previous section) to round the edges of the surface. We will also keep the spheres as caps for our lines, hence the model will be one lines diameter bigger than the actual bounding box."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "$bFacets = polytope::bounding_box_facets($TCubic2->affine_chart->VERTICES,surplus_k=>0.4, make_cube=>1);\n",
    "$diam = $bFacets->[0]->[0] + $bFacets->[1]->[0];\n",
    "$total_mm = 100;  #planned size of the model   \n",
    "$surface_mm = 2;\n",
    "$frame_mm = $surface_mm;\n",
    "$lines_mm = 3;\n",
    "\n",
    "$surface_abs = ($surface_mm*$diam/$total_mm)/(1-$lines_mm/$total_mm);\n",
    "$frame_diam = ($frame_mm*$diam/$total_mm)/(1-$lines_mm/$total_mm);\n",
    "$lines_diam = ($lines_mm*$diam/$total_mm)/(1-$lines_mm/$total_mm);\n",
    "$surface_opts = {VertexStyle=>'hidden',EdgeStyle=>'hidden'};\n",
    "$frame_opts = x3dprint_curve_opts($frame_diam,$frame_diam);\n",
    "$lines_opts = x3dprint_curve_opts($lines_diam,$lines_diam);\n",
    "\n",
    "$bPolytope = new polytope::Polytope(FACETS=>$bFacets);\n",
    "$bComplex = new fan::PolyhedralComplex(fan::check_fan_objects(($bPolytope)));"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Please note that, in contrast to the examples before, the cubic is bound before solidifying. Otherwise the frame won't fit correctly"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "$TCubic2Bounded = pcom_common_ref($TCubic2->affine_chart,$bComplex);\n",
    "$solidifiedTCubic2Cells = solidify_2d_pcom($TCubic2Bounded,$surface_abs);\n",
    "@solidifiedTCubic2CellsVis = map { $_->VISUAL($surface_opts) } @$solidifiedTCubic2Cells;\n",
    "\n",
    "# the frame\n",
    "$c2frame = pcom_common_ref($TCubic2->affine_chart, $bPolytope->BOUNDED_COMPLEX);\n",
    "$c2frameVis = $c2frame->VISUAL($frame_opts);\n",
    "\n",
    "# the lines\n",
    "$bPolytope = new polytope::Polytope(FACETS=>$bFacets);\n",
    "@linesBounded = map { pcom_common_ref($_->affine_chart,$bComplex) } @lines;\n",
    "@linesVis = map { $_->VISUAL($lines_opts) } @linesBounded;\n",
    "x3d(compose(@solidifiedTCubic2CellsVis,$c2frameVis,@linesVis),File=>$x3d_dir.\"LinesInTCubic2SolidifiedRadiused.x3d\");"
   ]
  },
  {
   "attachments": {
    "lines_in_cubic_and_cubic.jpeg": {
     "image/jpeg": "[encoded data, 233728 characters]"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Which looks like this in blender\n",
    "![lines_in_cubic_and_cubic.jpeg](attachment:lines_in_cubic_and_cubic.jpeg)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "polymake-4.1",
   "language": "polymake",
   "name": "polymake"
  },
  "language_info": {
   "codemirror_mode": "perl",
   "file_extension": ".pl",
   "mimetype": "text/x-polymake",
   "name": "polymake"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
