//1.04 function parse_3d_file(e,r){switch(e.split(".").pop().toLowerCase()){case"stl":return parse_stl_bin(r);case"obj":return parse_obj(r);case"vf":return parse_vf(arrayBufferToString(r));default:return"Unknown file type"}}function arrayBufferToString(e,r,t){if("undefined"!=typeof TextDecoder)return new TextDecoder("utf-8").decode(e);for(var a=new Uint8Array(e),n=a.length,o="",l=0;ln&&(c=n-l),o+=String.fromCharCode.apply(null,a.subarray(l,l+c))}return o}function parse_stl_ascii(e){try{var r=arrayBufferToString(e),t=[],a=[],n={};r=(r=(r=(r=(r=(r=(r=(r=(r=(r=(r=(r=r.replace(/\r/,"\n")).replace(/^solid[^\n]*/,"")).replace(/\n/g," ")).replace(/facet normal /g,"")).replace(/outer loop/g,"")).replace(/vertex /g,"")).replace(/endloop/g,"")).replace(/endfacet/g,"")).replace(/endsolid[^\n]*/,"")).replace(/facet/g,"")).replace(/\s+/g," ")).replace(/^\s+/,"");for(var o,l=0,c=r.split(" "),s=[],i=c.length/12-1,f=0;f-1&&(def_red_color=d.getUint8(u+6,!0)/31,def_green_color=d.getUint8(u+7,!0)/31,def_blue_color=d.getUint8(u+8,!0)/31);var g=80;try{var h=d.getUint32(g,!0)}catch(e){return"Can't parse file"}var v=84+50*h;if(e.byteLength!=v)return parse_stl_ascii(e);try{for(g+=4;h--;)g+=12,null==(r=f[[t=d.getFloat32(g,!0),a=d.getFloat32(g+4,!0),n=d.getFloat32(g+8,!0)]])&&(r=s.length,s.push(new Array(t,a,n)),f[[t,a,n]]=r),o=r,g+=12,null==(r=f[[t=d.getFloat32(g,!0),a=d.getFloat32(g+4,!0),n=d.getFloat32(g+8,!0)]])&&(r=s.length,s.push(new Array(t,a,n)),f[[t,a,n]]=r),l=r,g+=12,null==(r=f[[t=d.getFloat32(g,!0),a=d.getFloat32(g+4,!0),n=d.getFloat32(g+8,!0)]])&&(r=s.length,s.push(new Array(t,a,n)),f[[t,a,n]]=r),c=r,u>-1?(g+=12,face_color=d.getUint16(g,!0),32768==face_color||65535==face_color?(color_red=def_red_color,color_green=def_green_color,color_blue=def_blue_color):(p=!1,color_red=(31&face_color)/31,color_green=((992&face_color)>>5)/31,color_blue=((31744&face_color)>>10)/31),i.push(new Array(o,l,c,color_red,color_green,color_blue)),g+=2):(i.push(new Array(o,l,c)),g+=14);return f=null,{vertices:s,faces:i,colors:u>-1&&!p}}catch(e){return"Can't parse file"}}function parse_vf(e){var r=JSON.parse(e),t=[],a=[];try{var n=r.vertices.length;for(i=0;i=0?e-1:e+s.length}function n(e,r,t,n){u.push(new Array(a(e),a(r),a(t)))}function o(e,r,t){void 0===e[3]?(n(e[0],e[1],e[2]),void 0!==r&&r.length>0&&(r[0],r[1],r[2])):(void 0!==t&&t.length>0?(n(e[0],e[1],e[3],(t[0],t[1],t[3])),n(e[1],e[2],e[3],(t[1],t[2],t[3]))):(n(e[0],e[1],e[3]),n(e[1],e[2],e[3])),void 0!==r&&r.length>0&&(r[0],r[1],r[3],r[1],r[2],r[3]))}/^o /gm.test(r);for(var l,c,s=[],i=[],f=[],u=[],d=/v( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/,p=/vn( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/,g=/vt( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/,h=/f( +-?\d+)( +-?\d+)( +-?\d+)( +-?\d+)?/,v=/f( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))?/,_=/f( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))?/,y=/f( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))?/,w=r.split("\n"),A=0;A