conflict fix
diff --git a/docs/json/properties/doubleKeyframe.json b/docs/json/properties/doubleKeyframe.json
index 378a450..cb2e08f 100644
--- a/docs/json/properties/doubleKeyframe.json
+++ b/docs/json/properties/doubleKeyframe.json
@@ -2,11 +2,6 @@
   "$schema": "http://json-schema.org/draft-04/schema#",
   "type": "object",
   "properties": {
-    "e": {
-      "description": "End value of keyframe segment.",
-      "extended_name": "End",
-      "type": "number"
-    },
     "s": {
       "description": "Start value of keyframe segment.",
       "extended_name": "Start",
@@ -50,11 +45,6 @@
         }
       },
       "type": "object"
-    },
-    "nm": {
-      "description": "Bezier curve name. Used for caching.",
-      "extended_name": "Name",
-      "type": "number"
     }
   }
 }
\ No newline at end of file
diff --git a/docs/json/properties/multiDimensional.json b/docs/json/properties/multiDimensional.json
index eae973e..b22d7c5 100644
--- a/docs/json/properties/multiDimensional.json
+++ b/docs/json/properties/multiDimensional.json
@@ -16,11 +16,6 @@
       "description": "Property Index. Used for expressions.",
       "extended_name": "Property Index",
       "type": "string"
-    },
-    "a": {
-      "description": "Defines if property is animated",
-      "extended_name": "Animated",
-      "type": "number"
     }
   }
 }
diff --git a/docs/json/properties/multiDimensionalKeyframed.json b/docs/json/properties/multiDimensionalKeyframed.json
index 593afc3..d9a03fb 100644
--- a/docs/json/properties/multiDimensionalKeyframed.json
+++ b/docs/json/properties/multiDimensionalKeyframed.json
@@ -30,11 +30,6 @@
       "description": "Out Spatial Tangent. Only for spatial properties. Array of numbers.",
       "extended_name": "Out Tangent",
       "type": "array"
-    },
-    "a": {
-      "description": "Defines if property is animated",
-      "extended_name": "Animated",
-      "type": "number"
     }
   }
 }
diff --git a/docs/json/properties/offsetKeyframe.json b/docs/json/properties/offsetKeyframe.json
index 5769cfd..40d561e 100644
--- a/docs/json/properties/offsetKeyframe.json
+++ b/docs/json/properties/offsetKeyframe.json
@@ -2,14 +2,6 @@
   "$schema": "http://json-schema.org/draft-04/schema#",
   "type": "object",
   "properties": {
-    "e": {
-      "description": "End value of keyframe segment.",
-      "extended_name": "End",
-      "items": {
-        "type": "number"
-      },
-      "type": "array"
-    },
     "s": {
       "description": "Start value of keyframe segment.",
       "extended_name": "Start",
@@ -56,11 +48,6 @@
         }
       },
       "type": "object"
-    },
-    "nm": {
-      "description": "Bezier curve name. Used for caching.",
-      "extended_name": "Name",
-      "type": "number"
     }
   }
 }
\ No newline at end of file
diff --git a/docs/json/properties/shapeKeyframed.json b/docs/json/properties/shapeKeyframed.json
index 15b3cae..c744c05 100644
--- a/docs/json/properties/shapeKeyframed.json
+++ b/docs/json/properties/shapeKeyframed.json
@@ -30,11 +30,6 @@
       "description": "Out Spatial Tangent. Only for spatial properties. Array of numbers.",
       "extended_name": "Out Tangent",
       "type": "array"
-    },
-    "a": {
-      "description": "Defines if property is animated",
-      "extended_name": "Animated",
-      "type": "number"
     }
   }
 }
diff --git a/docs/json/properties/shapePropKeyframe.json b/docs/json/properties/shapePropKeyframe.json
index 8c64d47..47d2cdd 100644
--- a/docs/json/properties/shapePropKeyframe.json
+++ b/docs/json/properties/shapePropKeyframe.json
@@ -2,15 +2,6 @@
   "$schema": "http://json-schema.org/draft-04/schema#",
   "type": "object",
   "properties": {
-    "e": {
-      "description": "End value of keyframe segment.",
-      "extended_name": "End",
-      "items": {
-        "type": "object",
-        "$ref": "#/properties/shapeProp"
-      },
-      "type": "array"
-    },
     "s": {
       "description": "Start value of keyframe segment.",
       "extended_name": "Start",
@@ -58,11 +49,6 @@
         }
       },
       "type": "object"
-    },
-    "nm": {
-      "description": "Bezier curve name. Used for caching.",
-      "extended_name": "Name",
-      "type": "number"
     }
   }
 }
\ No newline at end of file
diff --git a/docs/json/properties/value.json b/docs/json/properties/value.json
index a3636f5..bf9b044 100644
--- a/docs/json/properties/value.json
+++ b/docs/json/properties/value.json
@@ -16,11 +16,6 @@
       "description": "Property Index. Used for expressions.",
       "extended_name": "Property Index",
       "type": "string"
-    },
-    "a": {
-      "description": "Defines if property is animated",
-      "extended_name": "Animated",
-      "type": "number"
     }
   }
 }
diff --git a/docs/json/properties/valueKeyframe.json b/docs/json/properties/valueKeyframe.json
index 297341d..4aa78e7 100644
--- a/docs/json/properties/valueKeyframe.json
+++ b/docs/json/properties/valueKeyframe.json
@@ -2,11 +2,6 @@
   "$schema": "http://json-schema.org/draft-04/schema",
   "type": "object",
   "properties": {
-    "e": {
-      "description": "End value of keyframe segment.",
-      "extended_name": "End",
-      "type": "number"
-    },
     "s": {
       "description": "Start value of keyframe segment.",
       "extended_name": "Start",
diff --git a/docs/json/properties/valueKeyframed.json b/docs/json/properties/valueKeyframed.json
index 9c9598e..83bd084 100644
--- a/docs/json/properties/valueKeyframed.json
+++ b/docs/json/properties/valueKeyframed.json
@@ -20,11 +20,6 @@
       "description": "Property Index. Used for expressions.",
       "extended_name": "Property Index",
       "type": "string"
-    },
-    "a": {
-      "description": "Defines if property is animated",
-      "extended_name": "Animated",
-      "type": "number"
     }
   }
 }
diff --git a/player/index.html b/player/index.html
index 0b5eed4..12ac929 100644
--- a/player/index.html
+++ b/player/index.html
@@ -174,17 +174,7 @@
         path: 'exports/render/data.json'
     };
     // lottie.setQuality('low');
-    setTimeout(()=>{
-        anim = lottie.loadAnimation(animData);
-        anim.setSubframe(false);
-        // anim.setSpeed(0.1);
-
-        anim.addEventListener('DOMLoaded', function() {
-            setTimeout(()=>{
-                
-            },0)
-        })
-    },0)
+    anim = lottie.loadAnimation(animData);
 
 </script>
 </body>
diff --git a/player/js/utils/PropertyFactory.js b/player/js/utils/PropertyFactory.js
index 0c0aff0..6e991fc 100644
--- a/player/js/utils/PropertyFactory.js
+++ b/player/js/utils/PropertyFactory.js
@@ -39,9 +39,10 @@
         var k, kLen, perc, jLen, j, fnc;
         var nextKeyTime = nextKeyData.t - offsetTime;
         var keyTime = keyData.t - offsetTime;
+        var endValue;
         if (keyData.to) {
             if (!keyData.bezierData) {
-                bez.buildBezierData(keyData);
+                keyData.bezierData = bez.buildBezierData(keyData.s, nextKeyData.s || keyData.e, keyData.to, keyData.ti);
             }
             var bezierData = keyData.bezierData;
             if (frameNum >= nextKeyTime || frameNum < keyTime) {
@@ -95,18 +96,19 @@
         } else {
             var outX, outY, inX, inY, keyValue;
             len = keyData.s.length;
+            endValue = nextKeyData.s || keyData.e;
             if (this.sh && keyData.h !== 1) {
                 if (frameNum >= nextKeyTime) {
-                    newValue[0] = keyData.e[0];
-                    newValue[1] = keyData.e[1];
-                    newValue[2] = keyData.e[2];
+                    newValue[0] = endValue[0];
+                    newValue[1] = endValue[1];
+                    newValue[2] = endValue[2];
                 } else if (frameNum <= keyTime) {
                     newValue[0] = keyData.s[0];
                     newValue[1] = keyData.s[1];
                     newValue[2] = keyData.s[2];
                 } else {
                     var quatStart = createQuaternion(keyData.s);
-                    var quatEnd = createQuaternion(keyData.e);
+                    var quatEnd = createQuaternion(endValue);
                     var time = (frameNum - keyTime) / (nextKeyTime - keyTime);
                     quaternionToEuler(newValue, slerp(quatStart, quatEnd, time));
                 }
@@ -149,7 +151,8 @@
                         }
                     }
 
-                    keyValue = keyData.h === 1 ? keyData.s[i] : keyData.s[i] + (keyData.e[i] - keyData.s[i]) * perc;
+                    endValue = nextKeyData.s || keyData.e;
+                    keyValue = keyData.h === 1 ? keyData.s[i] : keyData.s[i] + (endValue[i] - keyData.s[i]) * perc;
 
                     if (len === 1) {
                         newValue = keyValue;
@@ -411,19 +414,7 @@
 
     function getProp(elem,data,type, mult, container) {
         var p;
-        if(data.a === 0){
-            if(type === 0) {
-                p = new ValueProperty(elem,data,mult, container);
-            } else {
-                p = new MultiDimensionalProperty(elem,data, mult, container);
-            }
-        } else if(data.a === 1){
-            if(type === 0) {
-                p = new KeyframedValueProperty(elem,data,mult, container);
-            } else {
-                p = new KeyframedMultidimensionalProperty(elem,data, mult, container);
-            }
-        } else if(!data.k.length){
+        if(!data.k.length){
             p = new ValueProperty(elem,data, mult, container);
         }else if(typeof(data.k[0]) === 'number'){
             p = new MultiDimensionalProperty(elem,data, mult, container);
diff --git a/player/js/utils/TransformProperty.js b/player/js/utils/TransformProperty.js
index 0fc0861..e49279e 100644
--- a/player/js/utils/TransformProperty.js
+++ b/player/js/utils/TransformProperty.js
@@ -90,7 +90,7 @@
                 }
                 this.v.rotate(-Math.atan2(v1[1] - v2[1], v1[0] - v2[0]));
             }
-            if(this.data.p.s){
+            if(this.data.p && this.data.p.s){
                 if(this.data.p.z) {
                     this.v.translate(this.px.v, this.py.v, -this.pz.v);
                 } else {
@@ -158,18 +158,16 @@
         this.pre = new Matrix();
         this.appliedTransformations = 0;
         this.initDynamicPropertyContainer(container || elem);
-        if(data.p.s){
+        if(data.p && data.p.s){
             this.px = PropertyFactory.getProp(elem,data.p.x,0,0,this);
             this.py = PropertyFactory.getProp(elem,data.p.y,0,0,this);
             if(data.p.z){
                 this.pz = PropertyFactory.getProp(elem,data.p.z,0,0,this);
             }
         }else{
-            this.p = PropertyFactory.getProp(elem,data.p,1,0,this);
+            this.p = PropertyFactory.getProp(elem,data.p || {k:[0,0,0]},1,0,this);
         }
-        if(data.r) {
-            this.r = PropertyFactory.getProp(elem, data.r, 0, degToRads, this);
-        } else if(data.rx) {
+        if(data.rx) {
             this.rx = PropertyFactory.getProp(elem, data.rx, 0, degToRads, this);
             this.ry = PropertyFactory.getProp(elem, data.ry, 0, degToRads, this);
             this.rz = PropertyFactory.getProp(elem, data.rz, 0, degToRads, this);
@@ -182,17 +180,15 @@
             this.or = PropertyFactory.getProp(elem, data.or, 1, degToRads, this);
             //sh Indicates it needs to be capped between -180 and 180
             this.or.sh = true;
+        } else {
+            this.r = PropertyFactory.getProp(elem, data.r || {k: 0}, 0, degToRads, this);
         }
         if(data.sk){
             this.sk = PropertyFactory.getProp(elem, data.sk, 0, degToRads, this);
             this.sa = PropertyFactory.getProp(elem, data.sa, 0, degToRads, this);
         }
-        if(data.a) {
-            this.a = PropertyFactory.getProp(elem,data.a,1,0,this);
-        }
-        if(data.s) {
-            this.s = PropertyFactory.getProp(elem,data.s,1,0.01,this);
-        }
+        this.a = PropertyFactory.getProp(elem,data.a || {k:[0,0,0]},1,0,this);
+        this.s = PropertyFactory.getProp(elem,data.s || {k:[100,100,100]},1,0.01,this);
         // Opacity is not part of the transform properties, that's why it won't use this.dynamicProperties. That way transforms won't get updated if opacity changes.
         if(data.o){
             this.o = PropertyFactory.getProp(elem,data.o,0,0.01,elem);
diff --git a/player/js/utils/bez.js b/player/js/utils/bez.js
index 2ddfbe0..3bb4711 100644
--- a/player/js/utils/bez.js
+++ b/player/js/utils/bez.js
@@ -99,45 +99,39 @@
 
         var storedData = {};
 
-        return function (keyData){
-            var pt1 = keyData.s;
-            var pt2 = keyData.e;
-            var pt3 = keyData.to;
-            var pt4 = keyData.ti;
+        return function (pt1, pt2, pt3, pt4){
             var bezierName = (pt1[0]+'_'+pt1[1]+'_'+pt2[0]+'_'+pt2[1]+'_'+pt3[0]+'_'+pt3[1]+'_'+pt4[0]+'_'+pt4[1]).replace(/\./g, 'p');
-            if(storedData[bezierName]){
-                keyData.bezierData = storedData[bezierName];
-                return;
-            }
-            var curveSegments = defaultCurveSegments;
-            var k, i, len;
-            var ptCoord,perc,addedLength = 0;
-            var ptDistance;
-            var point,lastPoint = null;
-            if (pt1.length === 2 && (pt1[0] != pt2[0] || pt1[1] != pt2[1]) && pointOnLine2D(pt1[0],pt1[1],pt2[0],pt2[1],pt1[0]+pt3[0],pt1[1]+pt3[1]) && pointOnLine2D(pt1[0],pt1[1],pt2[0],pt2[1],pt2[0]+pt4[0],pt2[1]+pt4[1])){
-                curveSegments = 2;
-            }
-            var bezierData = new BezierData(curveSegments);
-            len = pt3.length;
-            for (k = 0; k < curveSegments; k += 1) {
-                point = createSizedArray(len);
-                perc = k / (curveSegments - 1);
-                ptDistance = 0;
-                for (i = 0; i < len; i += 1){
-                    ptCoord = bm_pow(1-perc,3)*pt1[i]+3*bm_pow(1-perc,2)*perc*(pt1[i] + pt3[i])+3*(1-perc)*bm_pow(perc,2)*(pt2[i] + pt4[i])+bm_pow(perc,3)*pt2[i];
-                    point[i] = ptCoord;
-                    if(lastPoint !== null){
-                        ptDistance += bm_pow(point[i] - lastPoint[i],2);
-                    }
+            if(!storedData[bezierName]){
+                var curveSegments = defaultCurveSegments;
+                var k, i, len;
+                var ptCoord,perc,addedLength = 0;
+                var ptDistance;
+                var point,lastPoint = null;
+                if (pt1.length === 2 && (pt1[0] != pt2[0] || pt1[1] != pt2[1]) && pointOnLine2D(pt1[0],pt1[1],pt2[0],pt2[1],pt1[0]+pt3[0],pt1[1]+pt3[1]) && pointOnLine2D(pt1[0],pt1[1],pt2[0],pt2[1],pt2[0]+pt4[0],pt2[1]+pt4[1])){
+                    curveSegments = 2;
                 }
-                ptDistance = bm_sqrt(ptDistance);
-                addedLength += ptDistance;
-                bezierData.points[k] = new PointData(ptDistance, point);
-                lastPoint = point;
+                var bezierData = new BezierData(curveSegments);
+                len = pt3.length;
+                for (k = 0; k < curveSegments; k += 1) {
+                    point = createSizedArray(len);
+                    perc = k / (curveSegments - 1);
+                    ptDistance = 0;
+                    for (i = 0; i < len; i += 1){
+                        ptCoord = bm_pow(1-perc,3)*pt1[i]+3*bm_pow(1-perc,2)*perc*(pt1[i] + pt3[i])+3*(1-perc)*bm_pow(perc,2)*(pt2[i] + pt4[i])+bm_pow(perc,3)*pt2[i];
+                        point[i] = ptCoord;
+                        if(lastPoint !== null){
+                            ptDistance += bm_pow(point[i] - lastPoint[i],2);
+                        }
+                    }
+                    ptDistance = bm_sqrt(ptDistance);
+                    addedLength += ptDistance;
+                    bezierData.points[k] = new PointData(ptDistance, point);
+                    lastPoint = point;
+                }
+                bezierData.segmentLength = addedLength;
+                storedData[bezierName] = bezierData;
             }
-            bezierData.segmentLength = addedLength;
-            keyData.bezierData = bezierData;
-            storedData[bezierName] = bezierData;
+            return storedData[bezierName];
         };
     }());
 
diff --git a/player/js/utils/helpers/blendModes.js b/player/js/utils/helpers/blendModes.js
index 5166f74..fef305e 100644
--- a/player/js/utils/helpers/blendModes.js
+++ b/player/js/utils/helpers/blendModes.js
@@ -1,6 +1,7 @@
 var getBlendMode = (function() {
 
 	var blendModeEnums = {
+        0:'source-over',
         1:'multiply',
         2:'screen',
         3:'overlay',
diff --git a/player/js/utils/shapes/ShapeProperty.js b/player/js/utils/shapes/ShapeProperty.js
index c301eae..34dd68d 100644
--- a/player/js/utils/shapes/ShapeProperty.js
+++ b/player/js/utils/shapes/ShapeProperty.js
@@ -11,11 +11,12 @@
             isHold = true;
             iterationIndex = 0;
         }else if(frameNum >= kf[kf.length - 1].t-this.offsetTime){
-            if(kf[kf.length - 2].h === 1){
+            keyPropS = kf[kf.length - 1].s ? kf[kf.length - 1].s[0] : kf[kf.length - 2].e[0];
+            /*if(kf[kf.length - 1].s){
                 keyPropS = kf[kf.length - 1].s[0];
             }else{
                 keyPropS = kf[kf.length - 2].e[0];
-            }
+            }*/
             isHold = true;
         }else{
             var i = iterationIndex;
@@ -49,7 +50,7 @@
                     }
                     perc = fnc((frameNum-(keyData.t-this.offsetTime))/((nextKeyData.t-this.offsetTime)-(keyData.t-this.offsetTime)));
                 }
-                keyPropE = keyData.e[0];
+                keyPropE = nextKeyData.s ? nextKeyData.s[0] : keyData.e[0];
             }
             keyPropS = keyData.s[0];
         }
@@ -471,7 +472,7 @@
         if(type === 3 || type === 4){
             var dataProp = type === 3 ? data.pt : data.ks;
             var keys = dataProp.k;
-            if(dataProp.a === 1 || keys.length){
+            if(keys.length){
                 prop = new KeyframedShapeProperty(elem, data, type);
             }else{
                 prop = new ShapeProperty(elem, data, type);
diff --git a/player/js/utils/text/TextAnimatorProperty.js b/player/js/utils/text/TextAnimatorProperty.js
index 4a77e7e..f79d664 100644
--- a/player/js/utils/text/TextAnimatorProperty.js
+++ b/player/js/utils/text/TextAnimatorProperty.js
@@ -66,32 +66,26 @@
                 segments: []
             };
             len = paths._length - 1;
-            var pathData;
+            var bezierData;
             totalLength = 0;
             for (i = 0; i < len; i += 1) {
-                pathData = {
-                    s: paths.v[i],
-                    e: paths.v[i + 1],
-                    to: [paths.o[i][0] - paths.v[i][0], paths.o[i][1] - paths.v[i][1]],
-                    ti: [paths.i[i + 1][0] - paths.v[i + 1][0], paths.i[i + 1][1] - paths.v[i + 1][1]]
-                };
-                bez.buildBezierData(pathData);
-                pathInfo.tLength += pathData.bezierData.segmentLength;
-                pathInfo.segments.push(pathData);
-                totalLength += pathData.bezierData.segmentLength;
+                bezierData = bez.buildBezierData(paths.v[i]
+                    , paths.v[i + 1]
+                    , [paths.o[i][0] - paths.v[i][0], paths.o[i][1] - paths.v[i][1]]
+                    , [paths.i[i + 1][0] - paths.v[i + 1][0], paths.i[i + 1][1] - paths.v[i + 1][1]]);
+                pathInfo.tLength += bezierData.segmentLength;
+                pathInfo.segments.push(bezierData);
+                totalLength += bezierData.segmentLength;
             }
             i = len;
             if (mask.v.c) {
-                pathData = {
-                    s: paths.v[i],
-                    e: paths.v[0],
-                    to: [paths.o[i][0] - paths.v[i][0], paths.o[i][1] - paths.v[i][1]],
-                    ti: [paths.i[0][0] - paths.v[0][0], paths.i[0][1] - paths.v[0][1]]
-                };
-                bez.buildBezierData(pathData);
-                pathInfo.tLength += pathData.bezierData.segmentLength;
-                pathInfo.segments.push(pathData);
-                totalLength += pathData.bezierData.segmentLength;
+                bezierData = bez.buildBezierData(paths.v[i]
+                    , paths.v[0]
+                    , [paths.o[i][0] - paths.v[i][0], paths.o[i][1] - paths.v[i][1]]
+                    , [paths.i[0][0] - paths.v[0][0], paths.i[0][1] - paths.v[0][1]]);
+                pathInfo.tLength += bezierData.segmentLength;
+                pathInfo.segments.push(bezierData);
+                totalLength += bezierData.segmentLength;
             }
             this._pathData.pi = pathInfo;
         }
@@ -108,20 +102,20 @@
                 currentLength = -Math.abs(currentLength) % pathInfo.tLength;
             }
             segmentInd = segments.length - 1;
-            points = segments[segmentInd].bezierData.points;
+            points = segments[segmentInd].points;
             pointInd = points.length - 1;
             while (currentLength < 0) {
                 currentLength += points[pointInd].partialLength;
                 pointInd -= 1;
                 if (pointInd < 0) {
                     segmentInd -= 1;
-                    points = segments[segmentInd].bezierData.points;
+                    points = segments[segmentInd].points;
                     pointInd = points.length - 1;
                 }
             }
 
         }
-        points = segments[segmentInd].bezierData.points;
+        points = segments[segmentInd].points;
         prevPoint = points[pointInd - 1];
         currentPoint = points[pointInd];
         partialLength = currentPoint.partialLength;
@@ -209,7 +203,7 @@
             if(this._hasMaskedPath) {
                 segmentInd = initSegmentInd;
                 pointInd = initPointInd;
-                points = segments[segmentInd].bezierData.points;
+                points = segments[segmentInd].points;
                 prevPoint = points[pointInd - 1];
                 currentPoint = points[pointInd];
                 partialLength = currentPoint.partialLength;
@@ -280,13 +274,13 @@
                                 if (mask.v.c) {
                                     pointInd = 0;
                                     segmentInd = 0;
-                                    points = segments[segmentInd].bezierData.points;
+                                    points = segments[segmentInd].points;
                                 } else {
                                     segmentLength -= currentPoint.partialLength;
                                     points = null;
                                 }
                             } else {
-                                points = segments[segmentInd].bezierData.points;
+                                points = segments[segmentInd].points;
                             }
                         }
                         if (points) {