partial
diff --git a/player/index.html b/player/index.html
index a131b05..b70253a 100644
--- a/player/index.html
+++ b/player/index.html
@@ -2,6 +2,7 @@
 <meta charset="UTF-8">
 <head>
     <!-- build:js bodymovin.js -->
+    <script src="http://code.jquery.com/jquery-1.11.2.min.js"></script>
     <script src="js/main.js"></script>
     <script src="js/3rd_party/transformation-matrix.js"></script>
     <script src="js/utils/MatrixManager.js"></script>
@@ -35,6 +36,40 @@
     <!-- endbuild -->
 </head>
 <body style="background-color:#666; margin: 0px;height: 100%; font-family: sans-serif;font-size: 10px">
-<div style="width:510px;height:676px;background-color:#000" class="bodymovin" data-bm-path="exports/mcangel" data-bm-type="canvas" data-bm-loop="true" data-bm-prerender="true"></div>
+<div style="width:510px;height:676px;background-color:#000" class="bodymovin" data-bm-path="exports/mcangel" data-bm-type="svg" data-bm-loop="true" data-bm-prerender="true"></div>
+<script>
+    var pathsArray = [];
+    var uniquePaths = [];
+    var nanCount = 0;
+    function getUniquePaths(){
+        $.each(pathsArray, function(i, el){
+            if($.inArray(el, uniquePaths) === -1) uniquePaths.push(el);
+        });
+    }
+
+    function count() {
+        pathsArray.sort();
+
+        var current = null;
+        var cnt = 0;
+        for (var i = 0; i < pathsArray.length; i++) {
+            if (pathsArray[i] != current) {
+                if (cnt > 1) {
+                    document.write(current + ' comes --> ' + cnt + ' times<br>');
+                    //document.write(cnt + ' times<br>');
+                }
+                current = pathsArray[i];
+                cnt = 1;
+            } else {
+                cnt++;
+            }
+        }
+        if (cnt > 0) {
+            document.write(current + ' comes --> ' + cnt + ' times');
+            //document.write(cnt + ' times');
+        }
+
+    }
+</script>
 </body>
 </html>
diff --git a/player/js/utils/DataManager.js b/player/js/utils/DataManager.js
index 8799ea3..d6b09e9 100644
--- a/player/js/utils/DataManager.js
+++ b/player/js/utils/DataManager.js
@@ -628,6 +628,53 @@
         return propertyArray;
     }
 
+    function interpolateShape(shapeData, frameNum, offsetTime, renderType){
+        var pathData = {};
+        pathData.closed = shapeData.closed;
+        var keyframes = shapeData.ks;
+        if(keyframes['v']){
+            if(renderType == 'svg'){
+                if(!keyframes.__pathString){
+                    keyframes.__pathString = createPathString(keyframes,pathData.closed);
+                }
+                pathData.pathString = keyframes.__pathString;
+            }
+            pathData.pathNodes = keyframes;
+            return pathData;
+        }else{
+            if(frameNum < keyframes[0].t-offsetTime){
+                var shapeData = {
+                    i: [],
+                    o: [],
+                    v: []
+                };
+                var jLen = keyframes[0].s[0].i.length;
+                for(j=0;j<jLen;j+=1){
+                    var coordsIData = [];
+                    var coordsOData = [];
+                    var coordsVData = [];
+                    kLen = keyData.s[i].i[j].length;
+                    for(k=0;k<kLen;k+=1){
+                        if(keyData.h === 1){
+                            coordsIData.push(keyData.s[i].i[j][k]);
+                            coordsOData.push(keyData.s[i].o[j][k]);
+                            coordsVData.push(keyData.s[i].v[j][k]);
+                        }else{
+                            coordsIData.push(keyData.s[i].i[j][k]+(keyData.e[i].i[j][k]-keyData.s[i].i[j][k])*perc);
+                            coordsOData.push(keyData.s[i].o[j][k]+(keyData.e[i].o[j][k]-keyData.s[i].o[j][k])*perc);
+                            coordsVData.push(keyData.s[i].v[j][k]+(keyData.e[i].v[j][k]-keyData.s[i].v[j][k])*perc);
+                        }
+                    }
+                    shapeData.i.push(coordsIData);
+                    shapeData.o.push(coordsOData);
+                    shapeData.v.push(coordsVData);
+                }
+            }
+            return false;
+        }
+
+    }
+
     function createPathString(paths,closed){
         var pathV,pathO,pathI;
         var pathString = '';
@@ -664,6 +711,7 @@
                 pathString += " C"+pathO[k-1].join(',') + " "+pathI[0].join(',') + " "+pathV[0].join(',');
             }
         }
+        pathsArray.push(pathString);
         return pathString;
     }
 
@@ -736,11 +784,12 @@
                     maskProps[i].opacity[offsettedFrameNum] = maskProps[i].opacity[offsettedFrameNum] instanceof Array ? maskProps[i].opacity[offsettedFrameNum][0]/100 : maskProps[i].opacity[offsettedFrameNum]/100;
                 }
             }
+            if((frameNum < item.inPoint || frameNum > item.outPoint)){
+               continue;
+            }
             if(item.type == 'PreCompLayer'){
-                if(!(frameNum < item.inPoint || frameNum > item.outPoint)){
-                    timeRemapped = item.tm ? item.tm[offsettedFrameNum] < 0 ? 0 : item.tm[offsettedFrameNum] : offsettedFrameNum;
-                    iterateLayers(item.layers,timeRemapped,renderType);
-                }
+                timeRemapped = item.tm ? item.tm[offsettedFrameNum] < 0 ? 0 : item.tm[offsettedFrameNum] : offsettedFrameNum;
+                iterateLayers(item.layers,timeRemapped,renderType);
             }else if(item.type == 'ShapeLayer'){
                 len = item.shapes.length;
                 for(i=0;i<len;i+=1){
@@ -781,13 +830,16 @@
                         }
                     }
                     if(shapeItem.ks){
-                        shape = getInterpolatedValue(shapeItem.ks,offsettedFrameNum, item.startTime,interpolatedParams);
-                        shapeData.path = {
-                            pathNodes: shape,
-                            closed: shapeItem.closed
-                        };
-                        if(renderType == 'svg'){
-                            shapeData.path.pathString = createPathString(shape,shapeItem.closed);
+                        shapeData.path = interpolateShape(shapeItem,offsettedFrameNum, item.startTime,renderType);
+                        if(shapeData.path == false){
+                            shape = getInterpolatedValue(shapeItem.ks,offsettedFrameNum, item.startTime,interpolatedParams);
+                            shapeData.path = {
+                                pathNodes: shape,
+                                closed: shapeItem.closed
+                            };
+                            if(renderType == 'svg'){
+                                shapeData.path.pathString = createPathString(shape,shapeItem.closed);
+                            }
                         }
                     }else if(shapeItem.el){
                         elmPos = getInterpolatedValue(shapeItem.el.p,offsettedFrameNum, item.startTime,interpolatedParams);