separating view data out of model data on shapes
diff --git a/player/index.html b/player/index.html
index 166bae6..2824f52 100644
--- a/player/index.html
+++ b/player/index.html
@@ -36,6 +36,6 @@
     <!-- endbuild -->
 </head>
 <body style="background-color:#666; margin: 0px;height: 100%; font-family: sans-serif;font-size: 10px">
-<div style="width:100%;height:100%;background-color:#000;display:inline-block" class="bodymovin" data-bm-path="exports/letters/full" data-bm-type="canvas" data-bm-loop="true" data-bm-prerender="true"></div>
+<div style="width:100%;height:100%;background-color:#000;display:inline-block" class="bodymovin" data-bm-path="exports/letters/d_reduced" data-bm-type="svg" data-bm-loop="true" data-bm-prerender="true"></div>
 </body>
 </html>
diff --git a/player/js/elements/ShapeItemElement.js b/player/js/elements/ShapeItemElement.js
index aa286de..488895e 100644
--- a/player/js/elements/ShapeItemElement.js
+++ b/player/js/elements/ShapeItemElement.js
@@ -1,10 +1,11 @@
 function ShapeItemElement(data,parentElement,globalData){
     this.stylesList = [];
+    this.viewData = [];
     this.currentMatrix = new Matrix();
     this.shape = parentElement;
     this.data = data;
     this.globalData = globalData;
-    this.searchShapes(this.data);
+    this.searchShapes(this.data,this.viewData);
     styleUnselectableDiv(this.shape);
     this.currentTrim = {
         s:0,
@@ -14,7 +15,7 @@
     }
 }
 
-ShapeItemElement.prototype.searchShapes = function(arr){
+ShapeItemElement.prototype.searchShapes = function(arr,data){
     var i, len = arr.length - 1;
     var j, jLen;
     var k, kLen;
@@ -22,36 +23,45 @@
     var ownArrays = [];
     for(i=len;i>=0;i-=1){
         if(arr[i].ty == 'fl' || arr[i].ty == 'st'){
-            arr[i].renderedFrames = [];
-            arr[i].lastData = {
-                c: '',
-                o:'',
-                w: ''
+            data[i] = {
+                renderedFrames : [],
+                lastData : {
+                    c: '',
+                    o:'',
+                    w: ''
+                }
             };
             this.stylesList.push({
                 elements: [],
                 type: arr[i].ty,
                 d: ''
             });
-            arr[i].style = this.stylesList[this.stylesList.length - 1];
-            ownArrays.push(arr[i].style);
+            data[i].style = this.stylesList[this.stylesList.length - 1];
+            ownArrays.push(data[i].style);
         }else if(arr[i].ty == 'gr'){
-            this.searchShapes(arr[i].it);
+            data[i] = {
+                it: []
+            };
+            this.searchShapes(arr[i].it,data[i].it);
         }else if(arr[i].ty == 'tr'){
-            arr[i].transform = {
-                mat: new Matrix(),
-                opacity: 1
+            data[i] = {
+                transform : {
+                    mat: new Matrix(),
+                    opacity: 1
+                }
             };
         }else if(arr[i].ty == 'sh'){
-            arr[i].elements = [];
-            arr[i].renderedFrames = [];
-            arr[i].lastData = {
-                d: '',
-                o:'',
-                tr:''
+            data[i] = {
+                elements : [],
+                renderedFrames : [],
+                lastData : {
+                    d: '',
+                    o:'',
+                    tr:''
+                }
             };
             jLen = this.stylesList.length;
-            kLen = arr[i].ks.v ? arr[i].ks.v.length :  arr[i].ks[0].s[0].v.length;
+            //kLen = arr[i].ks.v ? arr[i].ks.v.length :  arr[i].ks[0].s[0].v.length;
             for(j=0;j<jLen;j+=1){
                 if(!this.stylesList[j].closed){
                     pathNode = document.createElementNS(svgNS, "path");
@@ -65,7 +75,7 @@
                         pathNode.__items.push(pathNode.createSVGPathSegCurvetoCubicAbs(0,0,0,0,0,0));
                         pathNode.pathSegList.appendItem(pathNode.__items[k]);
                     }*/
-                    arr[i].elements.push(pathNode);
+                    data[i].elements.push(pathNode);
                     this.shape.appendChild(pathNode);
                     this.stylesList[j].elements.push(pathNode);
                     if(this.stylesList[j].type == 'st'){
@@ -77,18 +87,19 @@
             }
 
         }else if(arr[i].ty == 'rc'){
-            arr[i].elements = [];
-            arr[i].renderedFrames = [];
-            arr[i].lastData = {
-                roundness: '',
-                w: '',
-                h: '',
-                x: '',
-                y:'',
-                o:'',
-                tr:''
-            };
-            arr[i].renderedFrames = [];
+            data[i] = {
+                elements : [],
+                renderedFrames : [],
+                lastData : {
+                    roundness: '',
+                    w: '',
+                    h: '',
+                    x: '',
+                    y:'',
+                    o:'',
+                    tr:''
+                }
+            }
             jLen = this.stylesList.length;
             for(j=0;j<jLen;j+=1){
                 if(!this.stylesList[j].closed){
@@ -97,7 +108,7 @@
                     }else{
                         pathNode = document.createElementNS(svgNS, "rect");
                     }
-                    arr[i].elements.push(pathNode);
+                    data[i].elements.push(pathNode);
                     this.shape.appendChild(pathNode);
                     this.stylesList[j].elements.push(pathNode);
                     if(this.stylesList[j].type == 'st'){
@@ -111,21 +122,23 @@
             }
 
         }else if(arr[i].ty == 'el'){
-            arr[i].elements = [];
-            arr[i].renderedFrames = [];
-            arr[i].lastData = {
-                cx: '',
-                cy: '',
-                rx: '',
-                ry: '',
-                o:'',
-                tr:''
+            data[i] = {
+                elements : [],
+                renderedFrames : [],
+                lastData : {
+                    cx: '',
+                    cy: '',
+                    rx: '',
+                    ry: '',
+                    o:'',
+                    tr:''
+                }
             };
             jLen = this.stylesList.length;
             for(j=0;j<jLen;j+=1){
                 if(!this.stylesList[j].closed){
                     pathNode = document.createElementNS(svgNS, "ellipse");
-                    arr[i].elements.push(pathNode);
+                    data[i].elements.push(pathNode);
                     this.shape.appendChild(pathNode);
                     this.stylesList[j].elements.push(pathNode);
                     if(this.stylesList[j].type == 'st'){
@@ -146,18 +159,21 @@
     return this.shape;
 };
 
-ShapeItemElement.prototype.hideShape = function(items){
+ShapeItemElement.prototype.hideShape = function(items,data){
     if(!items){
         items = this.data;
     }
+    if(!data){
+        data = this.viewData;
+    }
     var i, len = this.stylesList.length;
     var j, jLen;
     var elements;
     len = items.length - 1;
     for(i=len;i>=0;i-=1){
         if(items[i].ty == 'sh' || items[i].ty == 'el' || items[i].ty == 'rc'){
-            items[i].lastData.o = '';
-            elements = items[i].elements;
+            data[i].lastData.o = '';
+            elements = data[i].elements;
             jLen = elements.length;
             for(j=0;j<jLen;j+=1){
                 elements[j].setAttribute('opacity','0');
@@ -166,15 +182,18 @@
             }
 
         }else if(items[i].ty == 'gr'){
-            this.hideShape(items[i].it);
+            this.hideShape(items[i].it,data[i].it);
         }
     }
 };
 
-ShapeItemElement.prototype.renderShape = function(num,parentTransform,items){
+ShapeItemElement.prototype.renderShape = function(num,parentTransform,items,data){
     if(!items){
         items = this.data;
     }
+    if(!data){
+        data = this.viewData;
+    }
     if(this.currentTrim.active){
         this.currentTrim.active = false;
     }
@@ -187,7 +206,7 @@
     for(i=len;i>=0;i-=1){
         if(items[i].ty == 'tr'){
             var mtArr = items[i].renderedData[num].mtArr;
-            groupTransform = items[i].transform;
+            groupTransform = data[i].transform;
             groupMatrix = groupTransform.mat;
             groupMatrix.reset();
             if(parentTransform){
@@ -200,40 +219,40 @@
             }
             groupMatrix.transform(mtArr[0],mtArr[1],mtArr[2],mtArr[3],mtArr[4],mtArr[5]).translate(-items[i].renderedData[num].a[0],-items[i].renderedData[num].a[1]);
         }else if(items[i].ty == 'sh'){
-            this.renderPath(items[i],num,groupTransform);
+            this.renderPath(items[i],data[i],num,groupTransform);
         }else if(items[i].ty == 'el'){
-            this.renderEllipse(items[i],num,groupTransform);
+            this.renderEllipse(items[i],data[i],num,groupTransform);
         }else if(items[i].ty == 'rc'){
             if(items[i].trimmed){
-                this.renderPath(items[i],num,groupTransform);
+                this.renderPath(items[i],data[i],num,groupTransform);
             }else{
-                this.renderRect(items[i],num,groupTransform);
+                this.renderRect(items[i],data[i],num,groupTransform);
             }
         }else if(items[i].ty == 'fl'){
-            this.renderFill(items[i],num);
+            this.renderFill(items[i],data[i],num);
         }else if(items[i].ty == 'st'){
-            this.renderStroke(items[i],num);
+            this.renderStroke(items[i],data[i],num);
         }else if(items[i].ty == 'gr'){
-            this.renderShape(num,groupTransform,items[i].it);
+            this.renderShape(num,groupTransform,items[i].it,data[i].it);
         }else if(items[i].ty == 'tm'){
             //
         }
     }
 };
 
-ShapeItemElement.prototype.renderPath = function(pathData,num,transform){
-    if(!pathData.renderedFrames[this.globalData.frameNum]){
-        pathData.renderedFrames[this.globalData.frameNum] = {
+ShapeItemElement.prototype.renderPath = function(pathData,viewData,num,transform){
+    if(!viewData.renderedFrames[this.globalData.frameNum]){
+        viewData.renderedFrames[this.globalData.frameNum] = {
             d: pathData.renderedData[num].path.pathString,
             tr: 'matrix('+transform.mat.props.join(',')+')',
             o: transform.opacity
         };
     }
-    var renderedFrameData = pathData.renderedFrames[this.globalData.frameNum];
+    var renderedFrameData = viewData.renderedFrames[this.globalData.frameNum];
     var pathString = renderedFrameData.d;
     var transformString = renderedFrameData.tr;
     var opacity = renderedFrameData.o;
-    var elements = pathData.elements;
+    var elements = viewData.elements;
     var i, len = elements.length;
     var pathNodes = pathData.renderedData[num].path.pathNodes;
     //var j, jLen = pathNodes.v.length;
@@ -289,26 +308,26 @@
                 item.y2 = pathNodes.i[0][1];
             }
         }*/
-        if(pathData.lastData.d != pathString){
+        if(viewData.lastData.d != pathString){
             elements[i].setAttribute('d',pathString);
         }
-        if(pathData.lastData.tr != transformString){
+        if(viewData.lastData.tr != transformString){
             elements[i].setAttribute('transform',transformString);
         }
-        if(pathData.lastData.o != opacity){
+        if(viewData.lastData.o != opacity){
             elements[i].setAttribute('opacity',opacity);
         }
     }
-    pathData.lastData.d = pathString;
-    pathData.lastData.tr = transformString;
-    pathData.lastData.o = opacity;
+    viewData.lastData.d = pathString;
+    viewData.lastData.tr = transformString;
+    viewData.lastData.o = opacity;
 };
 
 
-ShapeItemElement.prototype.renderEllipse = function(ellipseData,num,transform){
+ShapeItemElement.prototype.renderEllipse = function(ellipseData,viewData,num,transform){
     var ellipseAttrs = ellipseData.renderedData[num];
-    if(!ellipseData.renderedFrames[this.globalData.frameNum]){
-        ellipseData.renderedFrames[this.globalData.frameNum] = {
+    if(!viewData.renderedFrames[this.globalData.frameNum]){
+        viewData.renderedFrames[this.globalData.frameNum] = {
             cx: ellipseAttrs.p[0],
             cy: ellipseAttrs.p[1],
             rx: ellipseAttrs.size[0]/2,
@@ -317,7 +336,7 @@
             o: transform.opacity
         };
     }
-    var renderedFrameData = ellipseData.renderedFrames[this.globalData.frameNum];
+    var renderedFrameData = viewData.renderedFrames[this.globalData.frameNum];
     var cx = renderedFrameData.cx;
     var cy = renderedFrameData.cy;
     var rx = renderedFrameData.rx;
@@ -325,41 +344,41 @@
     var tr = renderedFrameData.tr;
     var o = renderedFrameData.o;
 
-    var elements = ellipseData.elements;
+    var elements = viewData.elements;
     var i, len = elements.length;
     for(i=0;i<len;i+=1){
-        if(ellipseData.lastData.cx != cx){
+        if(viewData.lastData.cx != cx){
             elements[i].setAttribute('cx',cx);
         }
-        if(ellipseData.lastData.cy != cy){
+        if(viewData.lastData.cy != cy){
             elements[i].setAttribute('cy',cy);
         }
-        if(ellipseData.lastData.rx != rx){
+        if(viewData.lastData.rx != rx){
             elements[i].setAttribute('rx',rx);
         }
-        if(ellipseData.lastData.ry != ry){
+        if(viewData.lastData.ry != ry){
             elements[i].setAttribute('ry',ry);
         }
-        if(ellipseData.lastData.tr != tr){
+        if(viewData.lastData.tr != tr){
             elements[i].setAttribute('transform',tr);
         }
-        if(ellipseData.lastData.o != o){
+        if(viewData.lastData.o != o){
             elements[i].setAttribute('opacity',o);
         }
     }
-    ellipseData.lastData.cx = cx;
-    ellipseData.lastData.cy = cy;
-    ellipseData.lastData.rx = rx;
-    ellipseData.lastData.ry = ry;
-    ellipseData.lastData.tr = tr;
-    ellipseData.lastData.o = o;
+    viewData.lastData.cx = cx;
+    viewData.lastData.cy = cy;
+    viewData.lastData.rx = rx;
+    viewData.lastData.ry = ry;
+    viewData.lastData.tr = tr;
+    viewData.lastData.o = o;
 };
 
-ShapeItemElement.prototype.renderRect = function(rectData,num,transform){
-    var elements = rectData.elements;
+ShapeItemElement.prototype.renderRect = function(rectData,viewData,num,transform){
+    var elements = viewData.elements;
     var rectAttrs = rectData.renderedData[num];
     var roundness;
-    if(!rectData.renderedFrames[this.globalData.frameNum]){
+    if(!viewData.renderedFrames[this.globalData.frameNum]){
         roundness = rectAttrs.roundness;
 
         if(roundness > rectAttrs.size[0]/2){
@@ -368,7 +387,7 @@
         if(roundness > rectAttrs.size[1]/2){
             roundness = rectAttrs.size[1]/2;
         }
-        rectData.renderedFrames[this.globalData.frameNum] = {
+        viewData.renderedFrames[this.globalData.frameNum] = {
             round: roundness,
             w: rectAttrs.size[0],
             h: rectAttrs.size[1],
@@ -378,7 +397,7 @@
             o: transform.opacity
         };
     }
-    var renderedFrameData = rectData.renderedFrames[this.globalData.frameNum];
+    var renderedFrameData = viewData.renderedFrames[this.globalData.frameNum];
     roundness = renderedFrameData.round;
     var w = renderedFrameData.w;
     var h = renderedFrameData.h;
@@ -388,82 +407,80 @@
     var o = renderedFrameData.o;
     var i, len = elements.length;
     for(i=0;i<len;i+=1){
-        if(rectData.lastData.roundness != roundness){
+        if(viewData.lastData.roundness != roundness){
             elements[i].setAttribute('rx',roundness);
             elements[i].setAttribute('ry',roundness);
         }
-        if(rectData.lastData.w != w){
+        if(viewData.lastData.w != w){
             elements[i].setAttribute('width',w);
         }
-        if(rectData.lastData.h != h){
+        if(viewData.lastData.h != h){
             elements[i].setAttribute('height',h);
         }
-        if(rectData.lastData.x != x){
+        if(viewData.lastData.x != x){
             elements[i].setAttribute('x',x);
         }
-        if(rectData.lastData.y != y){
+        if(viewData.lastData.y != y){
             elements[i].setAttribute('y',y);
         }
-        if(rectData.lastData.tr != tr){
+        if(viewData.lastData.tr != tr){
             elements[i].setAttribute('transform',tr);
         }
-        if(rectData.lastData.o != o){
+        if(viewData.lastData.o != o){
             elements[i].setAttribute('opacity',o);
         }
     }
-    rectData.lastData.roundness = roundness;
-    rectData.lastData.w = w;
-    rectData.lastData.h = h;
-    rectData.lastData.x = x;
-    rectData.lastData.y = y;
-    rectData.lastData.o = o;
+    viewData.lastData.roundness = roundness;
+    viewData.lastData.w = w;
+    viewData.lastData.h = h;
+    viewData.lastData.x = x;
+    viewData.lastData.y = y;
+    viewData.lastData.o = o;
 };
 
-ShapeItemElement.prototype.renderFill = function(styleData,num){
+ShapeItemElement.prototype.renderFill = function(styleData,viewData,num){
     var fillData = styleData.renderedData[num];
-    var styleElem = styleData.style;
-    if(!styleData.renderedFrames[this.globalData.frameNum]){
-        styleData.renderedFrames[this.globalData.frameNum] = {
+    var styleElem = viewData.style;
+    if(!viewData.renderedFrames[this.globalData.frameNum]){
+        viewData.renderedFrames[this.globalData.frameNum] = {
             c: fillData.color,
             o: fillData.opacity
         }
     }
 
-    var renderedFrameData = styleData.renderedFrames[this.globalData.frameNum];
+    var renderedFrameData = viewData.renderedFrames[this.globalData.frameNum];
     var c = renderedFrameData.c;
     var o = renderedFrameData.o;
 
     var elements = styleElem.elements;
     var i, len = elements.length;
     for(i=0;i<len;i+=1){
-        if(styleData.lastData.c != c){
+        if(viewData.lastData.c != c){
             elements[i].setAttribute('fill',c);
         }
-        if(styleData.lastData.o != o){
+        if(viewData.lastData.o != o){
             elements[i].setAttribute('fill-opacity',o);
         }
     }
-    styleData.lastData.c = c;
-    styleData.lastData.o = o;
+    viewData.lastData.c = c;
+    viewData.lastData.o = o;
 };
 
-ShapeItemElement.prototype.renderStroke = function(styleData,num){
-    /*stroke-dasharray: 10 10 20;
-     stroke-dashoffset: 276;*/
+ShapeItemElement.prototype.renderStroke = function(styleData,viewData,num){
     var fillData = styleData.renderedData[num];
-    var styleElem = styleData.style;
-    if(!styleData.renderedFrames[this.globalData.frameNum]){
-        styleData.renderedFrames[this.globalData.frameNum] = {
+    var styleElem = viewData.style;
+    if(!viewData.renderedFrames[this.globalData.frameNum]){
+        viewData.renderedFrames[this.globalData.frameNum] = {
             c: fillData.color,
             o: fillData.opacity,
             w: fillData.width
         };
         if(fillData.dashes){
-            styleData.renderedFrames[this.globalData.frameNum].d = fillData.dashes;
+            viewData.renderedFrames[this.globalData.frameNum].d = fillData.dashes;
         }
     }
 
-    var renderedFrameData = styleData.renderedFrames[this.globalData.frameNum];
+    var renderedFrameData = viewData.renderedFrames[this.globalData.frameNum];
     var c = renderedFrameData.c;
     var o = renderedFrameData.o;
     var w = renderedFrameData.w;
@@ -484,29 +501,29 @@
     var elements = styleElem.elements;
     var i, len = elements.length;
     for(i=0;i<len;i+=1){
-        if(styleData.lastData.c != c){
+        if(viewData.lastData.c != c){
             elements[i].setAttribute('stroke',c);
         }
-        if(styleData.lastData.o != o){
+        if(viewData.lastData.o != o){
             elements[i].setAttribute('stroke-opacity',o);
         }
-        if(styleData.lastData.w != w){
+        if(viewData.lastData.w != w){
             elements[i].setAttribute('stroke-width',w);
         }
         if(d){
-            if(styleData.lastData.da != dasharray){
+            if(viewData.lastData.da != dasharray){
                 elements[i].setAttribute('stroke-dasharray',dasharray);
             }
-            if(styleData.lastData.do != dashoffset){
+            if(viewData.lastData.do != dashoffset){
                 elements[i].setAttribute('stroke-dashoffset',dashoffset);
             }
         }
     }
-    styleData.lastData.c = c;
-    styleData.lastData.o = o;
-    styleData.lastData.w = w;
+    viewData.lastData.c = c;
+    viewData.lastData.o = o;
+    viewData.lastData.w = w;
     if(d){
-        styleData.lastData.da = dasharray;
-        styleData.lastData.do = dashoffset;
+        viewData.lastData.da = dasharray;
+        viewData.lastData.do = dashoffset;
     }
 };
\ No newline at end of file