diff --git a/build/player/bodymovin.js b/build/player/bodymovin.js
index 2ad1715..e9c108f 100644
--- a/build/player/bodymovin.js
+++ b/build/player/bodymovin.js
@@ -1,3 +1,3 @@
-(function(window){function Matrix(t){var e=this;e._t=e.transform,e.a=e.d=1,e.b=e.c=e.e=e.f=0,e.props=[1,0,0,1,0,0],e.cssParts=["matrix(","",")"],e.a1=e.b1=e.c1=e.d1=e.e1=e.f1=0,e.context=t,e.cos=e.sin=0,t&&t.setTransform(1,0,0,1,0,0)}function matrixManagerFunction(){var t=new Matrix,e=function(t,e,a,i,s,r,n,o,h){var l,p,m,d,u,c,f;return l=$M([[1,0,0,0],[0,Math.cos(t),Math.sin(-t),0],[0,Math.sin(t),Math.cos(t),0],[0,0,0,1]]),p=$M([[Math.cos(e),0,Math.sin(e),0],[0,1,0,0],[Math.sin(-e),0,Math.cos(e),0],[0,0,0,1]]),m=$M([[Math.cos(a),Math.sin(-a),0,0],[Math.sin(a),Math.cos(a),0,0],[0,0,1,0],[0,0,0,1]]),u=$M([[i,0,0,0],[0,s,0,0],[0,0,r,0],[0,0,0,1]]),c=l.x(p).x(m).x(u),c=c.transpose(),f=$M([[1,0,0,0],[0,1,0,0],[0,0,1,0],[n,o,h,1]]),c=c.x(f),d="matrix3d(",d+=c.e(1,1).toFixed(5)+","+c.e(1,2).toFixed(5)+","+c.e(1,3).toFixed(5)+","+c.e(1,4).toFixed(5)+",",d+=c.e(2,1).toFixed(5)+","+c.e(2,2).toFixed(5)+","+c.e(2,3).toFixed(5)+","+c.e(2,4).toFixed(5)+",",d+=c.e(3,1).toFixed(5)+","+c.e(3,2).toFixed(5)+","+c.e(3,3).toFixed(5)+","+c.e(3,4).toFixed(5)+",",d+=c.e(4,1).toFixed(5)+","+c.e(4,2).toFixed(5)+","+c.e(4,3).toFixed(5)+","+c.e(4,4).toFixed(5),d+=")"},a=function(e,a,i,s,r){return t.reset().translate(s,r).rotate(e).scale(a,i).toCSS()},i=function(e,a,i,s,r){return t.reset().translate(s,r).rotate(e).scale(a,i).toArray()},s=function(t){return a(t.r,t.s[0],t.s[1],t.p[0],t.p[1])},r=function(t,i){return i?e(-t.tr.r[0],t.tr.r[1],t.tr.r[2],t.tr.s[0],t.tr.s[1],t.tr.s[2],t.tr.p[0],t.tr.p[1],t.tr.p[2]):a(t.tr.r[2],t.tr.s[0],t.tr.s[1],t.tr.p[0],t.tr.p[1])},n=function(t,i){return i?e(-t.r[0],t.r[1],t.r[2],t.s[0],t.s[1],t.s[2],t.p[0],t.p[1],t.p[2]):a(t.r[2],t.s[0],t.s[1],t.p[0],t.p[1])},o=function(t,e){return e?null:i(t.r[2],t.s[0],t.s[1],t.p[0],t.p[1])};return{get2DMatrix:s,getMatrix:r,getMatrix2:n,getMatrixArray:o,getMatrixArrayFromParams:i,getMatrix2FromParams:a}}function styleDiv(t){t.style.position="absolute",t.style.top=0,t.style.left=0,t.style.display="block",t.style.verticalAlign="top",t.style.backfaceVisibility=t.style.webkitBackfaceVisibility="hidden",styleUnselectableDiv(t)}function styleUnselectableDiv(t){t.style.userSelect="none",t.style.MozUserSelect="none",t.style.webkitUserSelect="none",t.style.oUserSelect="none"}function randomString(t,e){void 0===e&&(e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890");var a,i="";for(a=t;a>0;--a)i+=e[Math.round(Math.random()*(e.length-1))];return i}function componentToHex(t){var e=t.toString(16);return 1==e.length?"0"+e:e}function fillToRgba(t,e){if(!cachedColors[t]){var a=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);cachedColors[t]=parseInt(a[1],16)+","+parseInt(a[2],16)+","+parseInt(a[3],16)}return"rgba("+cachedColors[t]+","+e+")"}function createElement(t,e,a){if(!e){var i=Object.create(t.prototype,a),s={};return i&&"[object Function]"===s.toString.call(i.init)&&i.init(),i}e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.prototype.parent=t.prototype}function defineDescriptor(t,e,a,i){var s={writable:!1,configurable:!1,enumerable:!1,value:a};if(i)for(var r in i)s[r]=i[r];var n={};t&&"[object Function]"===n.toString.call(t)&&(t=t.prototype),Object.defineProperty(t,e,s)}function defineAccessor(t,e,a){var i,s={enumerable:!1,configurable:!1,get:function(){return i},set:function(t){i=t}};if(a)for(var r in a)s[r]=a[r];var n={};t&&"[object Function]"===n.toString.call(t)&&(t=t.prototype),Object.defineProperty(t,e,s)}function bezFunction(){function t(t,e,a,i,s,r){return o.abs((a-t)*(r-e)-(s-t)*(i-e))<1e-5}function e(t){return n[t].fnc}function a(t,e,a,i,s){if(s||(s=("bez_"+t+"_"+e+"_"+a+"_"+i).replace(/\./g,"p")),n[s])return n[s];var r,o,h,l,p,m;return n[s]=function(s,n,d,u,c){var f=n/c;s=f;for(var y,g=0;++g<14&&(h=3*t,o=3*(a-t)-h,r=1-h-o,y=s*(h+s*(o+s*r))-f,!(Math.abs(y)<.001));)s-=y/(h+s*(2*o+3*r*s));m=3*e,p=3*(i-e)-m,l=1-m-p;var v=s*(m+s*(p+s*l));return u*v+d},n[s]}function i(e){var a,i,s,r,n,o,h,l=e.s,p=e.e,m=e.to,d=e.ti,u=500,c=0,f=null,y={points:[],segmentLength:0};for((l[0]!=p[0]||l[1]!=p[1])&&t(l[0],l[1],p[0],p[1],l[0]+m[0],l[1]+m[1])&&t(l[0],l[1],p[0],p[1],p[0]+d[0],p[1]+d[1])&&(u=2),s=m.length,a=0;u>a;a+=1){for(h=[],n=a/(u-1),o=0,i=0;s>i;i+=1)r=Math.pow(1-n,3)*l[i]+3*Math.pow(1-n,2)*n*(l[i]+m[i])+3*(1-n)*Math.pow(n,2)*(p[i]+d[i])+Math.pow(n,3)*p[i],h.push(r),null!==f&&(o+=Math.pow(h[i]-f[i],2));o=Math.sqrt(o),c+=o,y.points.push({partialLength:o,cumulatedLength:c,point:h}),f=h}y.segmentLength=c,e.bezierData=y}function s(t,e){var a=e.segments,i=a.length,s=Math.floor((i-1)*t),r=t*e.addedLength,n=0;if(r==a[s].l)return a[s].p;for(var o=a[s].l>r?-1:1,h=!0;h;)a[s].l<=r&&a[s+1].l>r?(n=(r-a[s].l)/(a[s+1].l-a[s].l),h=!1):s+=o,(0>s||s>=i-1)&&(h=!1);return a[s].p+(a[s+1].p-a[s].p)*n}function r(t,e,a,i,r,n,o){var h={pt1:[],pt2:[],pt3:[],pt4:[]};r=0>r?0:r;var l=s(r,o);n=n>1?1:n;var p,m=s(n,o),d=t.length,u=1-l,c=1-m,f=[],y=[],g=[],v=[];for(p=0;d>p;p+=1)f[p]=u*u*u*t[p]+(l*u*u+u*l*u+u*u*l)*a[p]+(l*l*u+u*l*l+l*u*l)*i[p]+l*l*l*e[p],y[p]=u*u*c*t[p]+(l*u*c+u*l*c+u*u*m)*a[p]+(l*l*c+u*l*m+l*u*m)*i[p]+l*l*m*e[p],g[p]=u*c*c*t[p]+(l*c*c+u*m*c+u*c*m)*a[p]+(l*m*c+u*m*m+l*c*m)*i[p]+l*m*m*e[p],v[p]=c*c*c*t[p]+(m*c*c+c*m*c+c*c*m)*a[p]+(m*m*c+c*m*m+m*c*m)*i[p]+m*m*m*e[p];return h.pt1=f,h.pt2=v,h.pt3=y,h.pt4=g,h}var n=[],o=Math,h=function(){var e={};return function(a,i,s,r){var n=(a.join("_")+"_"+i.join("_")+"_"+s.join("_")+"_"+r.join("_")).replace(/\./g,"p");if(e[n])return e[n];var o,h,l,p,m,d,u=100,c=0,f=[],y=[],g={addedLength:0,segments:[]};for((a[0]!=i[0]||a[1]!=i[1])&&t(a[0],a[1],i[0],i[1],s[0],s[1])&&t(a[0],a[1],i[0],i[1],r[0],r[1])&&(u=2),l=s.length,o=0;u>o;o+=1){for(m=o/(u-1),d=0,h=0;l>h;h+=1)p=Math.pow(1-m,3)*a[h]+3*Math.pow(1-m,2)*m*s[h]+3*(1-m)*Math.pow(m,2)*r[h]+Math.pow(m,3)*i[h],f[h]=p,null!==y[h]&&(d+=Math.pow(f[h]-y[h],2)),y[h]=f[h];d&&(d=Math.sqrt(d),c+=d),g.segments.push({l:c,p:m})}return g.addedLength=c,e[n]=g,g}}();return{getEasingCurve:a,getEasingCurveByIndex:e,getBezierLength:h,getNewSegment:r,buildBezierData:i}}function dataFunctionManager(){function t(t,e,a){var i,s=h(t,e,a),r=[];for(i=0;e>i;i+=1)r.push(Math.floor(s[i]*x));return r}function e(t,e){var a,i,s,r=t.length;for(a=0;r>a;a+=1)if(void 0!==t[a].t)if(t[a].s instanceof Array)for(s=t[a].s.length,i=0;s>i;i+=1)t[a].s[i]*=e,void 0!=t[a].e&&(t[a].e[i]*=e);else t[a].s&&(t[a].s*=e,t[a].e&&(t[a].e*=e));else t[a]=t[a]*e}function a(n,h){h||(h=n);var l,p,m,d,u,c,f,y,g,v,x=n.length;for(c=0;x>c;c+=1){if(m=n[c],l=m.outPoint-m.startTime,p=m.startTime,m.layerName=o(m.layerName),m.parent&&(m.parent=o(m.parent)),m.renderedFrame={},m.renderedData={},d=[],u=-1,m.tm&&(m.trmp=m.tm,m.tm=t(m.tm,l,p)),m.ks.o instanceof Array?e(m.ks.o,.01):m.ks.o/=100,m.ks.s instanceof Array?e(m.ks.s,.01):m.ks.s/=100,m.ks.r instanceof Array?e(m.ks.r,C):m.ks.r*=C,m.hasMask){var E=m.masksProperties;for(y=E.length,f=0;y>f;f+=1)if(E[f].pt.i)r(E[f].pt);else for(v=E[f].pt.length,g=0;v>g;g+=1)E[f].pt[g].s&&r(E[f].pt[g].s[0]),E[f].pt[g].e&&r(E[f].pt[g].e[0])}"PreCompLayer"==m.type?m.refId&&!m.layers?m.layers=i(m.refId,h):a(m.layers,h):"ShapeLayer"==m.type&&s(m.shapes)}}function i(t,e,a){a||(a=e);var s,r=e.length;for(s=0;r>s;s+=1){if(e[s].compId==t)return e[s].layers||(e[s].layers=i(e[s].refId,a)),e[s].layers;if("PreCompLayer"==e[s].type){var n=i(t,e[s].layers,a);if(n)return n}}return null}function s(t,a){var i,n,o,h,l=t.length,p=a?a:!1;for(i=l-1;i>=0;i-=1)if(t[i].renderedData=[],"tm"==t[i].ty&&(p=!0),"fl"==t[i].ty||"st"==t[i].ty)t[i].o instanceof Array?e(t[i].o,.01):t[i].o*=.01;else if("sh"==t[i].ty)if(t[i].trimmed=p,t[i].ks.i)r(t[i].ks);else for(o=t[i].ks.length,n=0;o>n;n+=1)t[i].ks[n].s&&(r(t[i].ks[n].s[0]),r(t[i].ks[n].e[0]));else"gr"==t[i].ty?s(t[i].it,p):"tr"==t[i].ty?(h=t[i],h.renderedData=[],h.o instanceof Array?e(h.o,.01):h.o/=100,h.s instanceof Array?e(h.s,.01):h.s/=100,h.r instanceof Array?e(h.r,C):h.r*=C):"rc"==t[i].ty&&(t[i].trimmed=p,t[i].trimmed=!0)}function r(t){var e,a=t.i.length;for(e=0;a>e;e+=1)t.i[e][0]+=t.v[e][0],t.i[e][1]+=t.v[e][1],t.o[e][0]+=t.v[e][0],t.o[e][1]+=t.v[e][1]}function n(t){b[t._id]={data:t,renderedFrames:[]},x=t.animation.frameRate,a(t.animation.layers)}function o(t){return t=t.replace(/ /g,"_"),t=t.replace(/-/g,"_"),t=t.replace(/\./g,"_"),t=t.replace(/\//g,"_")}function h(t,e,a){var i,s,r=[];if(!(t instanceof Array)||null===t[0].t)return r.push(t),r;var n,o;r=[];var h,l,p,m=[];s=t.length;var d,u,c;for(i=0;s>i;i+=1)n=t[i],n.t-=a;var f=0,y=0;for(i=0;e>i;i+=1){h=f;for(var g=!1;s-1>h;){if(n=t[h],o=t[h+1],i<n.t&&0===h){for(p=n.s.length,m=[],l=0;p>l;l+=1)m.push(n.s[l]);r.push(m),g=!0,f!=h&&(f=h,y=0);break}if(i>=n.t&&i<o.t){if(m=[],n.to){d=bez.getEasingCurve(n.o.x,n.o.y,n.i.x,n.i.y)("",i-n.t,0,1,o.t-n.t),u=n.bezierData;var v,x,E=u.segmentLength*d;for(l=y;l<u.points.length;){if(0===i||0===E||0===d){m=u.points[l].point,y=l;break}if(l==u.points.length-1)m=u.points[l].point;else if(E>u.points[l].partialLength&&E<u.points[l+1].partialLength){for(v=u.points[l].point.length,x=(E-u.points[l].partialLength)/(u.points[l+1].partialLength-u.points[l].partialLength),c=0;v>c;c+=1)m.push(u.points[l].point[c]+(u.points[l+1].point[c]-u.points[l].point[c])*x);y=l;break}l+=1}}else{var b,C,S,w;n.s.forEach(function(t,e){if(1!==n.h&&(n.o.x instanceof Array?(b=n.o.x[e],C=n.o.y[e],S=n.i.x[e],w=n.i.y[e]):(b=n.o.x,C=n.o.y,S=n.i.x,w=n.i.y),d=bez.getEasingCurve(b,C,S,w)("",i-n.t,0,1,o.t-n.t)),t.i){var a={i:[],o:[],v:[]};t.i.forEach(function(i,s){var r=[],o=[],h=[];i.forEach(function(a,i){1===n.h?(r.push(a),o.push(t.o[s][i]),h.push(t.v[s][i])):(r.push(a+(n.e[e].i[s][i]-a)*d),o.push(t.o[s][i]+(n.e[e].o[s][i]-t.o[s][i])*d),h.push(t.v[s][i]+(n.e[e].v[s][i]-t.v[s][i])*d))}),a.i.push(r),a.o.push(o),a.v.push(h)}),m.push(a)}else m.push(1===n.h?t:t+(n.e[e]-t)*d)})}r.push(m),g=!0,f!=h&&(f=h,y=0);break}h+=1}g===!1&&(n=t[t.length-2],m=[],n.e.forEach(function(t){m.push(t)}),r.push(m))}for(h=r.length;e>h;)r.push(m),h+=1;return r}function l(t,e,a,i){var s,r,n,o,h,l;if(!t.length)return"p"==i.type?(D.px=t,D.py=t):"s"==i.type?(D.sx=t,D.sy=t):"r"==i.type&&(D.r=t),i.toArray?[t]:t;if(void 0===t[0].t)return"p"==i.type?(D.px=t[0],D.py=t[1]):"s"==i.type?(D.sx=t[0],D.sy=t[1]):"r"==i.type&&(D.r=t[0]),t;h=0,l=t.length-1;for(var p=1,m=!0;!(!m||(s=t[h],r=t[h+1],h==l-1&&e>=r.t-a)||r.t-a>e&&1==p);){if(r.t-a<e&&-1==p){h+=1,s=t[h],r=t[h+1];break}l-1>h&&1==p||h>0&&-1==p?h+=p:m=!1}s.to&&!s.bezierData&&bez.buildBezierData(s);var d,u,c,f,y,g=0;if("default"==i.type&&(n=[]),s.to){if(o=s.bezierData,e>=r.t-a)return"p"==i.type?(D.px=o.points[o.points.length-1].point[0],D.py=o.points[o.points.length-1].point[1]):"s"==i.type?(D.sx=o.points[o.points.length-1].point[0],D.sy=o.points[o.points.length-1].point[1]):"r"==i.type&&(D.r=o.points[o.points.length-1].point[0]),o.points[o.points.length-1].point;if(e<s.t-a)return"p"==i.type?(D.px=o.points[0].point[0],D.py=o.points[0].point[1]):"s"==i.type?(D.sx=o.points[0].point[0],D.sy=o.points[0].point[1]):"r"==i.type&&(D.r=o.points[0].point[0]),o.points[0].point;s.__fnct?y=s.__fnct:(y=bez.getEasingCurve(s.o.x,s.o.y,s.i.x,s.i.y,s.n),s.__fnct=y),c=y("",e-(s.t-a),0,1,r.t-a-(s.t-a));var v,x=o.segmentLength*c,E=0;for(p=1,m=!0,f=o.points.length;m;){if(E+=o.points[g].partialLength*p,0===x||0===c){"p"==i.type?(D.px=o.points[g].point[0],D.py=o.points[g].point[1]):"s"==i.type?(D.sx=o.points[g].point[0],D.sy=o.points[g].point[1]):"r"==i.type?D.r=o.points[g].point[0]:n=o.points[g].point;break}if(g==o.points.length-1){"p"==i.type?(D.px=o.points[g].point[0],D.py=o.points[g].point[1]):"s"==i.type?(D.sx=o.points[g].point[0],D.sy=o.points[g].point[1]):"r"==i.type?D.r=o.points[g].point[0]:n=o.points[g].point;break}if(x>E&&x<E+o.points[g+1].partialLength){if(v=(x-E)/o.points[g+1].partialLength,"p"==i.type)D.px=o.points[g].point[0]+(o.points[g+1].point[0]-o.points[g].point[0])*v,D.py=o.points[g].point[1]+(o.points[g+1].point[1]-o.points[g].point[1])*v;else if("s"==i.type)D.sx=o.points[g].point[0]+(o.points[g+1].point[0]-o.points[g].point[0])*v,D.sy=o.points[g].point[1]+(o.points[g+1].point[1]-o.points[g].point[1])*v;else if("r"==i.type)D.r=o.points[g].point[0]+(o.points[g+1].point[0]-o.points[g].point[0])*v;else for(u=o.points[g].point.length,d=0;u>d;d+=1)n.push(o.points[g].point[d]+(o.points[g+1].point[d]-o.points[g].point[d])*v);break}f-1>g&&1==p||g>0&&-1==p?g+=p:m=!1}}else{var b,C,S,w,M=!1;for(l=s.s.length,h=0;l>h;h+=1)1!==s.h&&(s.o.x instanceof Array?(M=!0,b=s.o.x[h]?s.o.x[h]:s.o.x[0],C=s.o.y[h]?s.o.y[h]:s.o.y[0],S=s.i.x[h]?s.i.x[h]:s.i.x[0],w=s.i.y[h]?s.i.y[h]:s.i.y[0],s.__fnct||(s.__fnct=[])):(M=!1,b=s.o.x,C=s.o.y,S=s.i.x,w=s.i.y),M?s.__fnct[h]?y=s.__fnct[h]:(y=bez.getEasingCurve(b,C,S,w),s.__fnct[h]=y):s.__fnct?y=s.__fnct:(y=bez.getEasingCurve(b,C,S,w),s.__fnct=y),c=e>=r.t-a?1:e<s.t-a?0:y("",e-(s.t-a),0,1,r.t-a-(s.t-a))),1===s.h?"p"==i.type?0===h?D.px=s.s[h]:1==h&&(D.py=s.s[h]):"s"==i.type?0===h?D.sx=s.s[h]:1==h&&(D.sy=s.s[h]):"r"==i.type?D.r=s.s[h]:n.push(s.s[h]):"p"==i.type?0===h?D.px=s.s[h]+(s.e[h]-s.s[h])*c:1==h&&(D.py=s.s[h]+(s.e[h]-s.s[h])*c):"s"==i.type?0===h?D.sx=s.s[h]+(s.e[h]-s.s[h])*c:1==h&&(D.sy=s.s[h]+(s.e[h]-s.s[h])*c):"r"==i.type?D.r=s.s[h]+(s.e[h]-s.s[h])*c:n.push(s.s[h]+(s.e[h]-s.s[h])*c)}return n}function p(t,e){if(!t.__lengths){t.__lengths=[],t.__totalLength=0;var a,i=t.v,s=t.o,r=t.i,n=i.length;for(a=0;n-1>a;a+=1)t.__lengths.push(bez.getBezierLength(i[a],i[a+1],s[a],r[a+1])),t.__totalLength+=t.__lengths[a].addedLength;e&&(t.__lengths.push(bez.getBezierLength(i[a],i[0],s[a],r[0])),t.__totalLength+=t.__lengths[a].addedLength)}}function m(t,e,a,i,s,r){var n=r&&r.length>0,o={};o.closed=s?t.cl:t.closed;var h=s?t.pt:t.ks;if(h.v)return o.pathNodes=n?"svg"==i?w(h,o.closed,r,!1):w(h,o.closed,r,!1):"svg"==i?h:h,o;t={i:[],o:[],v:[]};var l,p,m,d,u,c,f,y=[];if(e<h[0].t-a){if(!h.__minValue){for(p=h[0].s[0].i.length,l=0;p>l;l+=1){for(u=[],c=[],f=[],d=h[0].s[0].i[l].length,m=0;d>m;m+=1)u.push(h[0].s[0].i[l][m]),c.push(h[0].s[0].o[l][m]),f.push(h[0].s[0].v[l][m]);t.i.push(u),t.o.push(c),t.v.push(f)}y.push(t),"svg"!=i||n?h.__minValue=y[0]:h.__minValueN=y[0]}return o.pathNodes=n?"svg"==i?w(h.__minValue,o.closed,r,!1):w(h.__minValue,o.closed,r,!1):"svg"==i?h.__minValueN:h.__minValue,o}if(e>h[h.length-1].t-a){if(!h.__maxValue){var g=h.length-2;for(p=h[g].s[0].i.length,l=0;p>l;l+=1){for(u=[],c=[],f=[],d=h[g].s[0].i[l].length,m=0;d>m;m+=1)u.push(h[g].e[0].i[l][m]),c.push(h[g].e[0].o[l][m]),f.push(h[g].e[0].v[l][m]);t.i.push(u),t.o.push(c),t.v.push(f)}y.push(t),"svg"!=i||n?h.__maxValue=y[0]:h.__maxValueN=y[0]}return o.pathNodes=n?"svg"==i?w(h.__maxValue,o.closed,r,!1):w(h.__maxValue,o.closed,r,!1):"svg"==i?h.__maxValueN:h.__maxValue,o}for(var v,x,E=0,b=h.length-1,C=1,S=!0;S&&(v=h[E],x=h[E+1],!(x.t-a>e&&1==C));)b-1>E&&1==C||E>0&&-1==C?E+=C:S=!1;var D,M,F,I,P;if(1!==v.h){D=v.o.x,M=v.o.y,F=v.i.x,I=v.i.y;var A;v.__fnct?A=v.__fnct:(A=bez.getEasingCurve(D,M,F,I),v.__fnct=A),P=A("",e-(v.t-a),0,1,x.t-a-(v.t-a)),e>=x.t-a?P=1:e<v.t-a&&(P=0)}if(1===v.h&&v.__hValue)y.push(v.__hValue);else for(t={i:[],o:[],v:[]},p=v.s[0].i.length,l=0;p>l;l+=1){for(u=[],c=[],f=[],d=v.s[0].i[l].length,m=0;d>m;m+=1)1===v.h?(u.push(v.s[0].i[l][m]),c.push(v.s[0].o[l][m]),f.push(v.s[0].v[l][m])):(u.push(v.s[0].i[l][m]+(v.e[0].i[l][m]-v.s[0].i[l][m])*P),c.push(v.s[0].o[l][m]+(v.e[0].o[l][m]-v.s[0].o[l][m])*P),f.push(v.s[0].v[l][m]+(v.e[0].v[l][m]-v.s[0].v[l][m])*P));t.i.push(u),t.o.push(c),t.v.push(f),1===v.h&&(v.__hValue=t),y.push(t)}return o.pathNodes=n?"svg"==i?w(y[0],o.closed,r,!1):w(y[0],o.closed,r,!1):"svg"==i?y[0]:y[0],o}function d(t,e,a){var i,s,r,n,o,h,p,u,f,y=t.length;for(u=0;y>u;u+=1)if(f=t[u],n=e-f.startTime,!f.an[n]){if(i={},S.arrayFlag=!1,S.type="default",i.a=l(f.ks.a,n,f.startTime,S),i.o=l(f.ks.o,n,f.startTime,S),S.arrayFlag=!1,S.type="p",l(f.ks.p,n,f.startTime,S),S.arrayFlag=!0,S.type="r",l(f.ks.r,n,f.startTime,S),S.arrayFlag=!0,S.type="s",l(f.ks.s,n,f.startTime,S),p={},p.an={tr:i},S.arrayFlag=!1,S.type="default","canvas"==a?p.an.matrixArray=E.getMatrixArrayFromParams(D.r,D.sx,D.sy,D.px,D.py):(p.an.matrixArray=E.getMatrixArrayFromParams(D.r,D.sx,D.sy,D.px,D.py),p.an.matrixValue=E.getMatrix2FromParams(D.r,D.sx,D.sy,D.px,D.py)+"translate("+-i.a[0]+" "+-i.a[1]+")"),f.renderedData[n]=p,f.hasMask)for(s=f.masksProperties,h=s.length,o=0;h>o;o+=1)s[o].paths||(s[o].paths=[],s[o].opacity=[]),s[o].paths[n]=m(s[o],n,f.startTime,a,!0),s[o].opacity[n]=l(s[o].o,n,f.startTime,S),s[o].opacity[n]=s[o].opacity[n]instanceof Array?s[o].opacity[n][0]/100:s[o].opacity[n]/100;e<f.inPoint||e>f.outPoint||("PreCompLayer"==f.type?(r=f.tm?f.tm[n]<0?0:n>=f.tm.length?f.tm[f.tm.length-1]:f.tm[n]:n,void 0===r&&(r=l(f.trmp,n,0,S)[0]*x,f.tm[n]=r),d(f.layers,r,a)):"ShapeLayer"==f.type&&c(f.shapes,n,f.startTime,a))}}function u(t,e,a){var i=[],s=[],r=[],n=a/2;return a*=1,i.push([t[0]+e[0]/2,t[1]-e[1]/2+a]),r.push(i[0]),s.push([t[0]+e[0]/2,t[1]-e[1]/2+n]),i.push([t[0]+e[0]/2,t[1]+e[1]/2-a]),r.push([t[0]+e[0]/2,t[1]+e[1]/2-n]),s.push(i[1]),i.push([t[0]+e[0]/2-a,t[1]+e[1]/2]),r.push(i[2]),s.push([t[0]+e[0]/2-n,t[1]+e[1]/2]),i.push([t[0]-e[0]/2+a,t[1]+e[1]/2]),r.push([t[0]-e[0]/2+n,t[1]+e[1]/2]),s.push(i[3]),i.push([t[0]-e[0]/2,t[1]+e[1]/2-a]),r.push(i[4]),s.push([t[0]-e[0]/2,t[1]+e[1]/2-n]),i.push([t[0]-e[0]/2,t[1]-e[1]/2+a]),r.push([t[0]-e[0]/2,t[1]-e[1]/2+n]),s.push(i[5]),i.push([t[0]-e[0]/2+a,t[1]-e[1]/2]),r.push(i[6]),s.push([t[0]-e[0]/2+n,t[1]-e[1]/2]),i.push([t[0]+e[0]/2-a,t[1]-e[1]/2]),r.push([t[0]+e[0]/2-n,t[1]-e[1]/2]),s.push(i[7]),{v:i,o:r,i:s,c:!0}}function c(t,e,a,i,s){var r,n,o,h,p,d,y,g,v,x,b=t.length;s||(s=[]);var C,M,F,I,P;for(r=b-1;r>=0;r-=1)if(n=t[r],"sh"==n.ty)n.renderedData[e]={path:m(n,e,a,i,!1,s)};else if("fl"==n.ty)o=l(n.c,e,a,S),h=l(n.o,e,a,S),n.renderedData[e]={opacity:h instanceof Array?h[0]:h},"canvas"==i?(f(o),n.renderedData[e].color=o):n.renderedData[e].color=rgbToHex(Math.round(o[0]),Math.round(o[1]),Math.round(o[2]));else if("rc"==n.ty)p=l(n.p,e,a,S),d=l(n.s,e,a,S),y=l(n.r,e,a,S),n.trimmed?(n.renderedData[e]={path:{closed:!0}},"svg"==i?n.renderedData[e].path.pathString=w(u(p,d,y),!0,s,!0):n.renderedData[e].path.pathNodes=w(u(p,d,y),!0,s,!1)):n.renderedData[e]={position:p,size:d,roundness:y};else if("el"==n.ty){if(p=l(n.p,e,a,S),d=l(n.s,e,a,S),n.renderedData[e]={p:p,size:d},"svg"==i){var A,_,k,T,L="";L+="M"+p[0]+","+(p[1]-d[1]/2),A=p[0]-d[0]/2*.55,_=p[1]-d[1]/2,k=p[0]-d[0]/2,T=p[1]-d[1]/2*.55,L+=" C"+A+","+_+" "+k+","+T+" "+(p[0]-d[0]/2)+","+p[1],A=p[0]-d[0]/2,_=p[1]+d[1]/2*.55,k=p[0]-d[0]/2*.55,T=p[1]+d[1]/2,L+=" C"+A+","+_+" "+k+","+T+" "+p[0]+","+(p[1]+d[1]/2),A=p[0]+d[0]/2*.55,_=p[1]+d[1]/2,k=p[0]+d[0]/2,T=p[1]+d[1]/2*.55,L+=" C"+A+","+_+" "+k+","+T+" "+(p[0]+d[0]/2)+","+p[1],A=p[0]+d[0]/2,_=p[1]-d[1]/2*.55,k=p[0]+d[0]/2*.55,T=p[1]-d[1]/2,L+=" C"+A+","+_+" "+k+","+T+" "+p[0]+","+(p[1]-d[1]/2);var N={v:[],i:[],o:[]};N.v.push([p[0],p[1]-d[1]/2]),N.o.push([p[0]-d[0]/2*.55,p[1]-d[1]/2]),N.i.push([p[0]+d[0]/2*.55,p[1]-d[1]/2]),N.v.push([p[0]-d[0]/2,p[1]]),N.o.push([p[0]-d[0]/2,p[1]+d[1]/2*.55]),N.i.push([p[0]-d[0]/2,p[1]-d[1]/2*.55]),N.v.push([p[0],p[1]+d[1]/2]),N.o.push([p[0]+d[0]/2*.55,p[1]+d[1]/2]),N.i.push([p[0]-d[0]/2*.55,p[1]+d[1]/2]),N.v.push([p[0]+d[0]/2,p[1]]),N.o.push([p[0]+d[0]/2,p[1]-d[1]/2*.55]),N.i.push([p[0]+d[0]/2,p[1]+d[1]/2*.55]),n.renderedData[e].path={pathString:L,pathNodes:N},n.closed=!0}}else if("st"==n.ty){if(g=l(n.c,e,a,S),v=l(n.o,e,a,S),x=l(n.w,e,a,S),n.renderedData[e]={opacity:v instanceof Array?v[0]:v,width:x instanceof Array?x[0]:x},n.d){var V=[];P=n.d.length;var z;for(I=0;P>I;I+=1)z=l(n.d[I].v,e,a,S),V.push({v:z instanceof Array?z[0]:z,n:n.d[I].n});n.renderedData[e].dashes=V}"canvas"==i?(f(g),n.renderedData[e].color=g):n.renderedData[e].color=rgbToHex(Math.round(g[0]),Math.round(g[1]),Math.round(g[2]))}else if("tr"==n.ty)n.renderedData[e]={a:l(n.a,e,a,S),o:l(n.o,e,a,S)},S.arrayFlag=!0,S.type="s",l(n.s,e,a,S),S.arrayFlag=!0,S.type="r",l(n.r,e,a,S),S.arrayFlag=!1,S.type="p",l(n.p,e,a,S),S.arrayFlag=!1,S.type="default","canvas"==i?n.renderedData[e].mtArr=E.getMatrixArrayFromParams(D.r,D.sx,D.sy,D.px,D.py):(n.renderedData[e].mtArr=E.getMatrixArrayFromParams(D.r,D.sx,D.sy,D.px,D.py),n.renderedData[e].mt=E.getMatrix2FromParams(D.r,D.sx,D.sy,D.px,D.py));else if("tm"==n.ty){C=l(n.s,e,a,S),M=l(n.e,e,a,S),F=l(n.o,e,a,S);var R={s:C,e:M,o:F};s.push(R),n.renderedData[e]=R}else"gr"==n.ty&&c(n.it,e,a,i,s)}function f(t){var e,a=t.length;for(e=0;a>e;e+=1)t[e]=Math.round(t[e])}function y(t,e){for(var a=1;a>0;){if(e+=1,e>=t.data.animation.totalFrames){t.renderFinished=!0;break}t.renderedFrames[e]||(g(t.data._id,e),a-=1)}}function g(t,e){return 2==b[t].renderedFrames[e]?void(b[t].renderFinished||y(b[t],e)):(x=b[t].data.animation.frameRate,b[t].renderedFrames[e]=2,void d(b[t].data.animation.layers,e,b[t].data._animType))}function v(t){var e,a=b[t].data,i=a.animation.totalFrames,s=[];for(e=0;i>e;e+=1)s.push({num:e,data:g(t,e)})}var x=0,E=new MatrixManager,b={},C=Math.PI/180,S={arrayFlag:!1},w=function(){function t(t,r,n,p){i[o]=r,e[o+1]=n,a[o+1]=p,h?a[o]=t:(l+=" M"+t.join(","),h=!0,s[o]=t),l+=" C"+r.join(",")+" "+n.join(",")+" "+p.join(","),o+=1}var e,a,i,s,r,n,o,h=!1,l="";return function(m,d,u,c){p(m,d);var f,y=u.length,g=m;for(a=e=i=s=null,f=y-1;f>=0;f-=1){var v=[],x=u[f].o%360/360;if(0!=x||0!=u[f].s||100!=u[f].e){l="",h=!1,e=[],i=[],a=[],s=[],r=[],n=0,0>x&&(x+=1);var E=u[f].s/100+x,b=u[f].e/100+x;if(E==b)return c?"":{};if(E>b){var C=E;E=b,b=C}1>=b?v.push({s:g.__totalLength*E,e:g.__totalLength*b}):E>=1?v.push({s:g.__totalLength*(E-1),e:g.__totalLength*(b-1)}):(v.push({s:g.__totalLength*E,e:g.__totalLength}),v.push({s:0,e:g.__totalLength*(b-1)}));var S,w,D,M=[],F=[],I=[];M=g.v,F=g.o,I=g.i,S=g.__lengths,D=M.length;var P,A,_=0,k=0,T=v.length;for(o=0,P=0;T>P;P+=1){for(_=0,w=1;D>w;w++)if(k=S[w-1].addedLength,_+k<v[P].s)_+=k;else{if(_>v[P].e)break;v[P].s<=_&&v[P].e>=_+k?t(M[w-1],F[w-1],I[w],M[w],S[w-1]):(A=bez.getNewSegment(M[w-1],M[w],F[w-1],I[w],(v[P].s-_)/k,(v[P].e-_)/k,S[w-1]),t(A.pt1,A.pt3,A.pt4,A.pt2)),_+=k}d!==!1?_>v[P].e||(k=S[w-1].addedLength,v[P].s<=_&&v[P].e>=_+k?t(M[w-1],F[w-1],I[0],M[0],S[w-1]):(A=bez.getNewSegment(M[w-1],M[0],F[w-1],I[0],(v[P].s-_)/k,(v[P].e-_)/k,S[w-1]),t(A.pt1,A.pt3,A.pt4,A.pt2))):h=!1}d=!1}}if(a?(M=a,F=i,I=e):(M=g.v,F=g.o,I=g.i,s=[]),D=M.length,c){for(l="",w=1;D>w;w++)s[w-1]?l+="M"+s[w-1].join(","):1==w&&(l+="M"+M[0].join(",")),l+=" C"+F[w-1].join(",")+" "+I[w].join(",")+" "+M[w].join(",");return d!==!1&&(l+=" C"+F[w-1].join(",")+" "+I[0].join(",")+" "+M[0].join(",")),l}return{i:I,o:F,v:M,s:s,c:d}}}(),D={r:0,sx:1,sy:1,px:1,py:1},M={};return M.completeData=n,M.renderFrame=g,M.renderAllFrames=v,M}function SVGRenderer(t){this.animationItem=t,this.layers=null,this.lastFrame=-1,this.globalData={frameNum:-1},this.elements=[]}function CanvasRenderer(t,e){this.animationItem=t,this.renderConfig=e?e:{clearCanvas:!0,context:null,scaleMode:"fit"},this.lastFrame=-1,this.globalData={frameNum:-1},this.elements=[]}function MaskElement(t){this.data=null,this.element=null,this.globalData=t,this.paths=[]}function ICompElement(t,e,a,i){this.parent.constructor.call(this,t,e,a,i),this.layers=t.layers}function IImageElement(t,e,a,i){this.animationItem=e,this.assets=this.animationItem.getAssets(),this.path=this.animationItem.getPath(),this.parent.constructor.call(this,t,e,a,i)}function IShapeElement(t,e,a,i){this.shapes=[],this.parent.constructor.call(this,t,e,a,i)}function ShapeItemElement(t,e,a){this.stylesList=[],this.viewData=[],this.currentMatrix=new Matrix,this.shape=e,this.data=t,this.globalData=a,this.searchShapes(this.data,this.viewData),styleUnselectableDiv(this.shape)}function ISolidElement(t,e,a,i){this.parent.constructor.call(this,t,e,a,i)}function ITextElement(t,e,a,i){this.parent.constructor.call(this,t,e,a,i)}function CVBaseElement(t,e){this.data=t,this.globalData=e,this.canvasContext=e.canvasContext,this.currentAnimData=null,this.renderFrame=!1,this.init()}function CVCompElement(t,e){this.parent.constructor.call(this,t,e),this.layers=t.layers}function CVImageElement(t,e){this.animationItem=renderer.animationItem,this.assets=this.animationItem.getAssets(),this.path=this.animationItem.getPath(),this.parent.constructor.call(this,t,e),this.animationItem.pendingElements+=1}function CVShapeElement(t,e){this.shapes=[],this.parent.constructor.call(this,t,e)}function CVShapeItemElement(t,e,a){this.data=t,this.globalData=a,this.canvasContext=a.canvasContext,this.frameNum=-1,this.dataLength=this.data.length,this.mainFlag=e,this.stylesList=[],this.ownStylesList=[],this.stylesPool=[],this.currentStylePoolPos=0,this.currentMatrix=document.createElementNS("http://www.w3.org/2000/svg","svg").createSVGMatrix(),this.mat=document.createElementNS("http://www.w3.org/2000/svg","svg").createSVGMatrix();var i,s=this.dataLength-1;this.renderedPaths={};var r;for(i=s;i>=0;i-=1)"gr"==this.data[i].ty?this.data[i].item=new CVShapeItemElement(this.data[i].it,!1,this.globalData):("st"==this.data[i].ty||"fl"==this.data[i].ty)&&(r={type:"fill",styleOpacity:0,opacity:0,value:"rgba(0,0,0,0)",closed:!1},"fl"==this.data[i].ty?r.type="fill":(r.type="stroke",r.width=0),this.stylesPool.push(r))}function CVSolidElement(t,e){this.parent.constructor.call(this,t,e)}function CVTextElement(t,e){this.parent.constructor.call(this,t,e)}function CVMaskElement(){}var svgNS="http://www.w3.org/2000/svg";Matrix.prototype={concat:function(t){return this.clone()._t(t.a,t.b,t.c,t.d,t.e,t.f)},flipX:function(){return this._t(-1,0,0,1,0,0)},flipY:function(){return this._t(1,0,0,-1,0,0)},reflectVector:function(t,e){var a=this.applyToPoint(0,1),i=2*(a.x*t+a.y*e);return t-=i*a.x,e-=i*a.y,{x:t,y:e}},reset:function(){return this.setTransform(1,0,0,1,0,0)},rotate:function(t){return 0===t?this:(this.cos=Math.cos(t),this.sin=Math.sin(t),this._t(this.cos,this.sin,-this.sin,this.cos,0,0))},rotateFromVector:function(t,e){return this.rotate(Math.atan2(e,t))},rotateDeg:function(t){return this.rotate(t*Math.PI/180)},scaleU:function(t){return this._t(t,0,0,t,0,0)},scale:function(t,e){return 1==t&&1==e?this:this._t(t,0,0,e,0,0)},scaleX:function(t){return this._t(t,0,0,1,0,0)},scaleY:function(t){return this._t(1,0,0,t,0,0)},shear:function(t,e){return this._t(1,e,t,1,0,0)},shearX:function(t){return this._t(1,0,t,1,0,0)},shearY:function(t){return this._t(1,t,0,1,0,0)},skew:function(t,e){return this.shear(Math.tan(t),Math.tan(e))},skewX:function(t){return this.shearX(Math.tan(t))},skewY:function(t){return this.shearY(Math.tan(t))},setTransform:function(t,e,a,i,s,r){return this.props[0]=t,this.props[1]=e,this.props[2]=a,this.props[3]=i,this.props[4]=s,this.props[5]=r,this._x()},translate:function(t,e){return this._t(1,0,0,1,t,e)},translateX:function(t){return this._t(1,0,0,1,t,0)},translateY:function(t){return this._t(1,0,0,1,0,t)},transform:function(t,e,a,i,s,r){return this.a1=this.props[0],this.b1=this.props[1],this.c1=this.props[2],this.d1=this.props[3],this.e1=this.props[4],this.f1=this.props[5],this.props[0]=this.a1*t+this.c1*e,this.props[1]=this.b1*t+this.d1*e,this.props[2]=this.a1*a+this.c1*i,this.props[3]=this.b1*a+this.d1*i,this.props[4]=this.a1*s+this.c1*r+this.e1,this.props[5]=this.b1*s+this.d1*r+this.f1,this._x()},divide:function(t){if(!t.isInvertible())throw"Input matrix is not invertible";var e=t.inverse();return this._t(e.a,e.b,e.c,e.d,e.e,e.f)},divideScalar:function(t){var e=this;return e.a/=t,e.b/=t,e.c/=t,e.d/=t,e.e/=t,e.f/=t,e._x()},inverse:function(){if(this.isIdentity())return new Matrix;if(this.isInvertible()){var t=this,e=t.a,a=t.b,i=t.c,s=t.d,r=t.e,n=t.f,o=new Matrix,h=e*s-a*i;return o.a=s/h,o.b=-a/h,o.c=-i/h,o.d=e/h,o.e=(i*n-s*r)/h,o.f=-(e*n-a*r)/h,o}throw"Matrix is not invertible."},interpolate:function(t,e,a){var i=this,s=a?new Matrix(a):new Matrix;return s.a=i.a+(t.a-i.a)*e,s.b=i.b+(t.b-i.b)*e,s.c=i.c+(t.c-i.c)*e,s.d=i.d+(t.d-i.d)*e,s.e=i.e+(t.e-i.e)*e,s.f=i.f+(t.f-i.f)*e,s._x()},interpolateAnim:function(t,e,a){var i=this,s=a?new Matrix(a):new Matrix,r=i.decompose(),n=t.decompose(),o=r.rotation+(n.rotation-r.rotation)*e,h=r.translate.x+(n.translate.x-r.translate.x)*e,l=r.translate.y+(n.translate.y-r.translate.y)*e,p=r.scale.x+(n.scale.x-r.scale.x)*e,m=r.scale.y+(n.scale.y-r.scale.y)*e;return s.translate(h,l),s.rotate(o),s.scale(p,m),s._x()},decompose:function(t){var e=this.props[0],a=this.props[1],i=this.props[2],s=this.props[3],r=Math.acos,n=Math.atan,o=Math.sqrt,h=Math.PI,l={x:this.props[4],y:this.props[5]},p=0,m={x:1,y:1},d={x:0,y:0},u=e*s-a*i;if(t)e?(d={x:n(i/e),y:n(a/e)},m={x:e,y:u/e}):a?(p=.5*h,m={x:a,y:u/a},d.x=n(s/a)):(m={x:i,y:s},d.x=.25*h);else if(e||a){var c=o(e*e+a*a);p=a>0?r(e/c):-r(e/c),m={x:c,y:u/c},d.x=n((e*i+a*s)/(c*c))}else if(i||s){var f=o(i*i+s*s);p=.5*h-(s>0?r(-i/f):-r(i/f)),m={x:u/f,y:f},d.y=n((e*i+a*s)/(f*f))}else m={x:0,y:0};return{scale:m,translate:l,rotation:p,skew:d}},determinant:function(){return this.a*this.d-this.b*this.c},applyToPoint:function(t,e){return{x:t*this.props[0]+e*this.props[2]+this.props[4],y:t*this.props[1]+e*this.props[3]+this.props[5]}},applyToPointStringified:function(t,e){return t*this.props[0]+e*this.props[2]+this.props[4]+","+(t*this.props[1]+e*this.props[3]+this.props[5])},applyToArray:function(t){var e,a,i=0,s=[];if("number"==typeof t[0])for(a=t.length;a>i;)e=this.applyToPoint(t[i++],t[i++]),s.push(e.x,e.y);else for(a=t.length,i=0;a>i;i++)s.push(this.applyToPoint(t[i].x,t[i].y));return s},applyToTypedArray:function(t,e){for(var a,i=0,s=t.length,r=e?new Float64Array(s):new Float32Array(s);s>i;)a=this.applyToPoint(t[i],t[i+1]),r[i++]=a.x,r[i++]=a.y;return r},applyToContext:function(t){var e=this;return t.setTransform(e.a,e.b,e.c,e.d,e.e,e.f),e},isIdentity:function(){var t=this;return t._q(t.a,1)&&t._q(t.b,0)&&t._q(t.c,0)&&t._q(t.d,1)&&t._q(t.e,0)&&t._q(t.f,0)},isInvertible:function(){return!this._q(this.determinant(),0)},isValid:function(){return!this._q(this.a*this.d,0)},clone:function(t){var e=this,a=new Matrix;return a.a=e.a,a.b=e.b,a.c=e.c,a.d=e.d,a.e=e.e,a.f=e.f,t||(a.context=e.context),a},isEqual:function(t){var e=this,a=e._q;return a(e.a,t.a)&&a(e.b,t.b)&&a(e.c,t.c)&&a(e.d,t.d)&&a(e.e,t.e)&&a(e.f,t.f)},toArray:function(){return[this.props[0],this.props[1],this.props[2],this.props[3],this.props[4],this.props[5]]},toCSS:function(){return this.cssParts[1]=this.props.join(","),this.cssParts.join("")},toJSON:function(){var t=this;return'{"a":'+t.a+',"b":'+t.b+',"c":'+t.c+',"d":'+t.d+',"e":'+t.e+',"f":'+t.f+"}"},toString:function(){return""+this.toArray()},_q:function(t,e){return Math.abs(t-e)<1e-14},_x:function(){return this.context&&this.context.setTransform(this.a,this.b,this.c,this.d,this.e,this.f),this}},void 0===CanvasRenderingContext2D.prototype.ellipse&&(CanvasRenderingContext2D.prototype.ellipse=function(t,e,a,i,s,r,n,o){this.save(),this.translate(t,e),this.rotate(s),this.scale(a,i),this.arc(0,0,1,r,n,o),this.restore()}),("function"!=typeof Path2D||"function"!=typeof Path2D.prototype.addPath||"function"!=typeof Path2D.prototype.ellipse)&&!function(){function t(t){if(this.ops_=[],void 0!==t)if("string"==typeof t)try{this.ops_=parser.parse(t)}catch(e){}else{if(!t.hasOwnProperty("ops_"))throw"Error: "+typeof t+"is not a valid argument to Path";this.ops_=t.ops_.slice(0)}}function e(t){return function(){var e,a=arguments.length,i=[];for(e=0;a>e;e+=1)i.push(arguments[e]);this.ops_.push({type:t,args:i})}}for(var a=CanvasRenderingContext2D.prototype,i=["closePath","moveTo","lineTo","quadraticCurveTo","bezierCurveTo","rect","arc","arcTo","ellipse"],s=0;s<i.length;s++){var r=i[s];t.prototype[r]=e(r)}t.prototype.addPath=function(t,e){var a=!1;!e||1==e.a&&0==e.b&&0==e.c&&1==e.d&&0==e.e&&0==e.f||(a=!0,this.ops_.push({type:"save",args:[]}),this.ops_.push({type:"transform",args:[e.a,e.b,e.c,e.d,e.e,e.f]})),this.ops_=this.ops_.concat(t.ops_),a&&this.ops_.push({type:"restore",args:[]})};var n=a.fill,o=a.stroke,h=a.clip;a.fill=function(e){if(e instanceof t){this.beginPath();for(var i=0,s=e.ops_.length;s>i;i++){var r=e.ops_[i];a[r.type].apply(this,r.args)}s=arguments.length;var o=[];for(i=1;s>i;i+=1)o.push(arguments[i]);n.apply(this,o)}else n.apply(this,arguments)},a.stroke=function(e){if(e instanceof t){this.beginPath();for(var i=0,s=e.ops_.length;s>i;i++){var r=e.ops_[i];
-a[r.type].apply(this,r.args)}o.call(this)}else o.call(this)},a.clip=function(e){if(e instanceof t){this.beginPath();for(var i=0,s=e.ops_.length;s>i;i++){var r=e.ops_[i];a[r.type].apply(this,r.args)}s=arguments.length;var n=[];for(i=1;s>i;i+=1)n.push(arguments[i]);h.apply(this,n)}else h.apply(this,arguments)},Path2D=t}();var MatrixManager=matrixManagerFunction;!function(){for(var t=0,e=["ms","moz","webkit","o"],a=0;a<e.length&&!window.requestAnimationFrame;++a)window.requestAnimationFrame=window[e[a]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e[a]+"CancelAnimationFrame"]||window[e[a]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(e){var a=(new Date).getTime(),i=Math.max(0,16-(a-t)),s=window.setTimeout(function(){e(a+i)},i);return t=a+i,s}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)})}();var subframeEnabled=!1,cachedColors={},rgbToHex=function(){var t,e,a=[];for(t=0;256>t;t+=1)e=t.toString(16),a[t]=1==e.length?"0"+e:e;return function(t,e,i){return 0>t&&(t=0),0>e&&(e=0),0>i&&(i=0),"#"+a[t]+a[e]+a[i]}}(),fillColorToString=function(){var t=[];return function(e,a){return t[e[0]]||(t[e[0]]=[]),t[e[0]][e[1]]||(t[e[0]][e[1]]=[]),t[e[0]][e[1]][e[2]]||(void 0!==a&&(e[3]=a),t[e[0]][e[1]][e[2]]="rgba("+e.join(",")+")"),t[e[0]][e[1]][e[2]]}}(),bez=bezFunction(),dataManager=dataFunctionManager();SVGRenderer.prototype.buildItems=function(t,e,a){var i,s=0,r=t.length;for(a||(a=this.elements),e||(e=this.animationItem.container),i=r-1;i>=0;i--)if("StillLayer"==t[i].type)s++,a[i]=this.createImage(t[i],e);else if("PreCompLayer"==t[i].type){a[i]=this.createComp(t[i],e);var n=[];this.buildItems(t[i].layers,a[i].getDomElement(),n),a[i].setElements(n)}else a[i]="SolidLayer"==t[i].type?this.createSolid(t[i],e):"ShapeLayer"==t[i].type?this.createShape(t[i],e):"TextLayer"==t[i].type?this.createText(t[i],e):this.createBase(t[i],e)},SVGRenderer.prototype.createBase=function(t,e){return new BaseElement(t,this.animationItem,e,this.globalData)},SVGRenderer.prototype.createShape=function(t,e){return new IShapeElement(t,this.animationItem,e,this.globalData)},SVGRenderer.prototype.createText=function(t,e){return new ITextElement(t,this.animationItem,e,this.globalData)},SVGRenderer.prototype.createImage=function(t,e){return new IImageElement(t,this.animationItem,e,this.globalData)},SVGRenderer.prototype.createComp=function(t,e){return new ICompElement(t,this.animationItem,e,this.globalData)},SVGRenderer.prototype.createSolid=function(t,e){return new ISolidElement(t,this.animationItem,e,this.globalData)},SVGRenderer.prototype.configAnimation=function(t){this.animationItem.container=document.createElementNS(svgNS,"svg"),this.animationItem.container.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.animationItem.container.setAttribute("width",t.animation.compWidth),this.animationItem.container.setAttribute("height",t.animation.compHeight),this.animationItem.container.setAttribute("viewBox","0 0 "+t.animation.compWidth+" "+t.animation.compHeight),this.animationItem.container.setAttribute("preserveAspectRatio","xMidYMid meet"),this.animationItem.container.style.width="100%",this.animationItem.container.style.height="100%",this.animationItem.container.style.transformOrigin=this.animationItem.container.style.mozTransformOrigin=this.animationItem.container.style.webkitTransformOrigin=this.animationItem.container.style["-webkit-transform"]="0px 0px 0px",this.animationItem.wrapper.appendChild(this.animationItem.container);var e=document.createElementNS(svgNS,"defs");this.globalData.defs=e,this.animationItem.container.appendChild(e);var a=document.createElementNS(svgNS,"clipPath"),i=document.createElementNS(svgNS,"rect");i.setAttribute("width",t.animation.compWidth),i.setAttribute("height",t.animation.compHeight),i.setAttribute("x",0),i.setAttribute("y",0),a.setAttribute("id","animationMask"),a.appendChild(i);var s=document.createElementNS(svgNS,"g");s.setAttribute("clip-path","url(#animationMask)"),this.animationItem.container.appendChild(s),e.appendChild(a),this.animationItem.container=s,this.layers=t.animation.layers},SVGRenderer.prototype.buildStage=function(t,e,a){var i,s,r=e.length;for(a||(a=this.elements),i=r-1;i>=0;i--)s=e[i],s.parent&&this.buildItemParenting(s,a[i],e,s.parent,a),a[i].setMainElement(),"PreCompLayer"==s.type&&this.buildStage(a[i].getComposingElement(),s.layers,a[i].getElements())},SVGRenderer.prototype.buildItemParenting=function(t,e,a,i,s){t.parents||(t.parents=[]);for(var r=0,n=a.length;n>r;){if(a[r].layerName==i){e.getHierarchy().push(s[r]),a[r].parent&&this.buildItemParenting(t,e,a,a[r].parent,s);break}r+=1}},SVGRenderer.prototype.updateContainerSize=function(){},SVGRenderer.prototype.renderFrame=function(t){if(this.lastFrame!=t){this.lastFrame=t,this.globalData.frameNum=t;var e,a=this.layers.length;for(e=0;a>e;e++)this.elements[e].prepareFrame(t-this.layers[e].startTime);for(e=0;a>e;e++)this.elements[e].renderFrame(t-this.layers[e].startTime)}},CanvasRenderer.prototype.buildItems=function(t,e){e||(e=this.elements);var a,i=0,s=t.length;for(a=0;s>a;a++)if("StillLayer"==t[a].type)i++,e.push(this.createImage(t[a]));else if("PreCompLayer"==t[a].type){e.push(this.createComp(t[a]));var r=[];this.buildItems(t[a].layers,r),e[e.length-1].setElements(r)}else e.push("SolidLayer"==t[a].type?this.createSolid(t[a]):"ShapeLayer"==t[a].type?this.createShape(t[a]):"TextLayer"==t[a].type?this.createText(t[a]):this.createBase(t[a]))},CanvasRenderer.prototype.createBase=function(t){return new CVBaseElement(t,this.globalData)},CanvasRenderer.prototype.createShape=function(t){return new CVShapeElement(t,this.globalData)},CanvasRenderer.prototype.createText=function(t){return new CVTextElement(t,this.globalData)},CanvasRenderer.prototype.createImage=function(t){return new CVImageElement(t,this.globalData)},CanvasRenderer.prototype.createComp=function(t){return new CVCompElement(t,this.globalData)},CanvasRenderer.prototype.createSolid=function(t){return new CVSolidElement(t,this.globalData)},CanvasRenderer.prototype.configAnimation=function(t){this.animationItem.wrapper?(this.animationItem.container=document.createElement("canvas"),this.animationItem.container.style.width="100%",this.animationItem.container.style.height="100%",this.animationItem.container.style.transformOrigin=this.animationItem.container.style.mozTransformOrigin=this.animationItem.container.style.webkitTransformOrigin=this.animationItem.container.style["-webkit-transform"]="0px 0px 0px",this.animationItem.wrapper.appendChild(this.animationItem.container),this.canvasContext=this.animationItem.container.getContext("2d")):this.canvasContext=this.renderConfig.context,this.globalData.canvasContext=this.canvasContext,this.layers=t.animation.layers,this.transformCanvas={},this.transformCanvas.w=t.animation.compWidth,this.transformCanvas.h=t.animation.compHeight,this.updateContainerSize()},CanvasRenderer.prototype.updateContainerSize=function(){var t,e;if(this.animationItem.wrapper&&this.animationItem.container?(t=this.animationItem.wrapper.offsetWidth,e=this.animationItem.wrapper.offsetHeight,this.animationItem.container.setAttribute("width",t),this.animationItem.container.setAttribute("height",e)):(t=this.canvasContext.canvas.width,e=this.canvasContext.canvas.height),"fit"==this.renderConfig.scaleMode){var a=t/e,i=this.transformCanvas.w/this.transformCanvas.h;i>a?(this.transformCanvas.sx=t/this.transformCanvas.w,this.transformCanvas.sy=t/this.transformCanvas.w,this.transformCanvas.tx=0,this.transformCanvas.ty=(e-this.transformCanvas.h*(t/this.transformCanvas.w))/2):(this.transformCanvas.sx=e/this.transformCanvas.h,this.transformCanvas.sy=e/this.transformCanvas.h,this.transformCanvas.tx=(t-this.transformCanvas.w*(e/this.transformCanvas.h))/2,this.transformCanvas.ty=0)}else this.transformCanvas.sx=1,this.transformCanvas.sy=1,this.transformCanvas.tx=0,this.transformCanvas.ty=0},CanvasRenderer.prototype.buildStage=function(t,e,a){a||(a=this.elements);var i,s,r=e.length;for(i=r-1;i>=0;i--)s=e[i],s.parent&&this.buildItemHierarchy(s,a[i],e,s.parent,a),"PreCompLayer"==s.type&&this.buildStage(null,s.layers,a[i].getElements())},CanvasRenderer.prototype.buildItemHierarchy=function(t,e,a,i,s){for(var r=0,n=a.length;n>r;){if(a[r].layerName==i){e.getHierarchy().push(s[r]),void 0===a[r].parent||this.buildItemHierarchy(t,e,a,a[r].parent,s);break}r+=1}},CanvasRenderer.prototype.prepareFrame=function(t){var e,a=this.elements.length;for(e=0;a>e;e++)this.elements[e].prepareFrame(t-this.layers[e].startTime)},CanvasRenderer.prototype.draw=function(){var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.elements[t].draw()},CanvasRenderer.prototype.renderFrame=function(t){(this.lastFrame!=t||this.renderConfig.clearCanvas!==!0)&&(this.lastFrame=t,this.globalData.frameNum=t,this.renderConfig.clearCanvas===!0?this.canvasContext.canvas.width=this.canvasContext.canvas.width:this.canvasContext.save(),this.canvasContext.transform(this.transformCanvas.sx,0,0,this.transformCanvas.sy,this.transformCanvas.tx,this.transformCanvas.ty),this.canvasContext.beginPath(),this.canvasContext.rect(0,0,this.transformCanvas.w,this.transformCanvas.h),this.canvasContext.clip(),this.prepareFrame(t),this.draw(),this.renderConfig.clearCanvas!==!0&&this.canvasContext.restore())},MaskElement.prototype.init=function(){this.registeredEffects=[],this.masksProperties=this.data.masksProperties,this.totalMasks=this.masksProperties.length;var t=this.element.maskedElement,e=this.globalData.defs,a=0,i=this.masksProperties.length;this.layerSize=this.element.getLayerSize(),this.maskElement=document.createElementNS(svgNS,"clipPath");var s,r=this.data.masksProperties;for(a=0;i>a;a++)r[a].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath()),s=document.createElementNS(svgNS,"path"),r[a].cl?s.setAttribute("fill","#ffffff"):(s.setAttribute("fill","none"),s.setAttribute("stroke","#ffffff"),s.setAttribute("stroke-width","1"),s.setAttribute("stroke-miterlimit","10")),s.setAttribute("clip-rule","nonzero"),this.maskElement.appendChild(s),r[a].elem=s,r[a].lastPath="";var n=randomString(10);this.maskElement.setAttribute("id",n),t.setAttribute("clip-path","url(#"+n+")"),e.appendChild(this.maskElement)},MaskElement.prototype.renderFrame=function(t){var e,a=this.data.masksProperties.length;for(e=0;a>e;e++)this.drawPath(this.data.masksProperties[e],this.data.masksProperties[e].paths[t].pathNodes)},MaskElement.prototype.processMaskFromEffects=function(t,e){var a,i=this.registeredEffects.length;for(a=0;i>a;a++)this.registeredEffects[a].renderMask(t,e)},MaskElement.prototype.registerEffect=function(t){this.registeredEffects.push(t)},MaskElement.prototype.getMaskelement=function(){return this.maskElement},MaskElement.prototype.createLayerSolidPath=function(){var t="M0,0 ";return t+="h"+this.layerSize.w,t+="v"+this.layerSize.h,t+="h"+-this.layerSize.w,t+="v"+-this.layerSize.h},MaskElement.prototype.drawPath=function(t,e){var a="";if(e.__renderedString)a=e.__renderedString;else{var i,s=e.v.length;for(i=1;s>i;i+=1)1==i&&(a+=" M"+e.v[0][0]+","+e.v[0][1]),a+=" C"+e.o[i-1][0]+","+e.o[i-1][1]+" "+e.i[i][0]+","+e.i[i][1]+" "+e.v[i][0]+","+e.v[i][1];t.cl&&(a+=" C"+e.o[i-1][0]+","+e.o[i-1][1]+" "+e.i[0][0]+","+e.i[0][1]+" "+e.v[0][0]+","+e.v[0][1]),e.__renderedString=a}t.lastPath!==a&&(t.inv?t.elem.setAttribute("d",this.solidPath+a):t.elem.setAttribute("d",a),t.lastPath=a)};var BaseElement=function(t,e,a,i){this.animationItem=e,this.globalData=i,this.data=t,this.ownMatrix=new Matrix,this.finalTransform={mat:new Matrix,op:1},this.renderedFrames=[],this.lastData={},this.parentContainer=a,this.init()};BaseElement.prototype.init=function(){this.createElements(),this.data.hasMask&&this.addMasks(this.data),this.data.eff&&this.createEffectsManager(this.data)},BaseElement.prototype.createElements=function(){this.data.hasMask?(this.layerElement=document.createElementNS(svgNS,"g"),this.parentContainer.appendChild(this.layerElement),this.maskedElement=this.layerElement):this.layerElement=this.parentContainer},BaseElement.prototype.prepareFrame=function(t){this.currentAnimData=this.data.renderedData[t].an,this.data.renderedFrame.tr=this.currentAnimData.matrixValue;var e=this.currentAnimData.matrixArray;this.ownMatrix.reset(),this.ownMatrix.transform(e[0],e[1],e[2],e[3],e[4],e[5]),this.ownMatrix.translate(-this.currentAnimData.tr.a[0],-this.currentAnimData.tr.a[1])},BaseElement.prototype.renderFrame=function(t,e){if("NullLayer"!=this.data.type){if(this.data.inPoint-this.data.startTime<=t&&this.data.outPoint-this.data.startTime>=t?(this.isVisible!==!0&&(this.isVisible=!0),this.finalTransform.opacity=1):(this.isVisible!==!1&&(this.isVisible=!1),this.finalTransform.opacity=0),this.data.eff&&this.effectsManager.renderFrame(t,this.currentAnimData.mk),t===this.data.renderedFrame.num)return this.isVisible;if(this.data.hasMask&&this.maskManager.renderFrame(t),this.finalTransform.opacity*=this.currentAnimData.tr.o,e&&(this.finalTransform.mat.reset(),i=e.mat.props,this.finalTransform.mat.transform(i[0],i[1],i[2],i[3],i[4],i[5]),this.finalTransform.opacity*=e.opacity),this.hierarchy){var a,i,s=this.hierarchy.length;for(e||this.finalTransform.mat.reset(),a=s-1;a>=0;a-=1)i=this.hierarchy[a].ownMatrix.props,this.finalTransform.mat.transform(i[0],i[1],i[2],i[3],i[4],i[5]);i=this.ownMatrix.props,this.finalTransform.mat.transform(i[0],i[1],i[2],i[3],i[4],i[5])}else this.isVisible&&(e?(i=this.ownMatrix.props,this.finalTransform.mat.transform(i[0],i[1],i[2],i[3],i[4],i[5])):this.finalTransform.mat=this.ownMatrix);if(this.data.hasMask){this.renderedFrames[this.globalData.frameNum]||(this.renderedFrames[this.globalData.frameNum]={tr:"matrix("+this.finalTransform.mat.props.join(",")+")",o:this.finalTransform.opacity});var r=this.renderedFrames[this.globalData.frameNum];this.lastData.tr!=r.tr&&(this.lastData.tr=r.tr,this.layerElement.setAttribute("transform",r.tr)),this.lastData.o!==r.o&&(this.lastData.o=r.o,this.layerElement.setAttribute("opacity",r.o))}return this.isVisible}},BaseElement.prototype.getDomElement=function(){return this.layerElement},BaseElement.prototype.setMainElement=function(){this.mainElement=this.layerElement},BaseElement.prototype.getMaskManager=function(){return this.maskManager},BaseElement.prototype.addMasks=function(t){var e={data:{value:t},element:{value:this},globalData:{value:this.globalData}};this.maskManager=createElement(MaskElement,null,e)},BaseElement.prototype.createEffectsManager=function(t){var e={effects:{value:t.eff},element:{value:this}};this.effectsManager=createElement(EffectsManager,null,e)},BaseElement.prototype.getType=function(){return this.type},BaseElement.prototype.getLayerSize=function(){return"TextLayer"==this.data.type?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}},BaseElement.prototype.getHierarchy=function(){return this.hierarchy||(this.hierarchy=[]),this.hierarchy},BaseElement.prototype.hide=function(){},createElement(BaseElement,ICompElement),ICompElement.prototype.getComposingElement=function(){return this.layerElement},ICompElement.prototype.hide=function(){if(!this.hidden){var t,e=this.elements.length;for(t=0;e>t;t+=1)this.elements[t].hide();this.hidden=!0}},ICompElement.prototype.renderFrame=function(t,e){var a=this.parent.renderFrame.call(this,t,e);if(a===!1)return void this.hide();this.hidden=!1;var i,s=this.layers.length,r=this.data.tm?this.data.tm[t]<0?0:t>=this.data.tm.length?this.data.tm[this.data.tm.length-1]:this.data.tm[t]:t;for(i=0;s>i;i+=1)this.elements[i].prepareFrame(r-this.layers[i].startTime);for(i=0;s>i;i+=1)this.data.hasMask?this.elements[i].renderFrame(r-this.layers[i].startTime):this.elements[i].renderFrame(r-this.layers[i].startTime,this.finalTransform)},ICompElement.prototype.setElements=function(t){this.elements=t},ICompElement.prototype.getElements=function(){return this.elements},createElement(BaseElement,IImageElement),IImageElement.prototype.createElements=function(){var t=this,e=function(){t.image.setAttributeNS("http://www.w3.org/1999/xlink","href",t.path+t.assets[t.data.assetId].path),t.maskedElement=t.image,t.animationItem.elementLoaded()},a=new Image;a.addEventListener("load",e,!1),a.addEventListener("error",e,!1),a.src=this.path+this.assets[this.data.assetId].path,this.parent.createElements.call(this),this.image=document.createElementNS(svgNS,"image"),this.image.setAttribute("width",this.data.width+"px"),this.image.setAttribute("height",this.data.height+"px"),this.layerElement.appendChild(this.image)},IImageElement.prototype.hide=function(){this.hidden||this.data.hasMask||(this.image.setAttribute("opacity","0"),this.hidden=!0)},IImageElement.prototype.renderFrame=function(t,e){var a=this.parent.renderFrame.call(this,t,e);if(a===!1)return void this.hide();if(this.hidden=!1,!this.data.hasMask){this.renderedFrames[this.globalData.frameNum]||(this.renderedFrames[this.globalData.frameNum]={tr:"matrix("+this.finalTransform.mat.props.join(",")+")",o:this.finalTransform.opacity});var i=this.renderedFrames[this.globalData.frameNum];this.lastData.tr!=i.tr&&(this.lastData.tr=i.tr,this.image.setAttribute("transform",i.tr)),this.lastData.o!==i.o&&(this.lastData.o=i.o,this.image.setAttribute("opacity",i.o))}},createElement(BaseElement,IShapeElement),IShapeElement.prototype.createElements=function(){this.parent.createElements.call(this),this.mainShape=new ShapeItemElement(this.data.shapes,this.layerElement,this.globalData)},IShapeElement.prototype.renderFrame=function(t,e){var a=this.parent.renderFrame.call(this,t,e);return a===!1?void this.hide():void this.renderShapes(t)},IShapeElement.prototype.hide=function(){this.hidden||(this.mainShape.hideShape(),this.hidden=!0)},IShapeElement.prototype.renderShapes=function(t){this.hidden=!1,this.data.hasMask?this.mainShape.renderShape(t):this.mainShape.renderShape(t,this.finalTransform)},ShapeItemElement.prototype.searchShapes=function(t,e){var a,i,s,r=t.length-1,n=[];for(a=r;a>=0;a-=1)if("fl"==t[a].ty||"st"==t[a].ty){e[a]={renderedFrames:[],lastData:{c:"",o:-1,w:""}};var o=document.createElementNS(svgNS,"path");this.shape.appendChild(o),this.stylesList.push({pathElement:o,type:t[a].ty,d:""}),e[a].style=this.stylesList[this.stylesList.length-1],n.push(e[a].style)}else if("gr"==t[a].ty)e[a]={it:[]},this.searchShapes(t[a].it,e[a].it);else if("tr"==t[a].ty)e[a]={transform:{mat:new Matrix,opacity:1}};else if("sh"==t[a].ty||"rc"==t[a].ty||"el"==t[a].ty)for(e[a]={elements:[],renderedFrames:[],styles:[],lastData:{d:"",o:"",tr:""}},s=this.stylesList.length,i=0;s>i;i+=1)this.stylesList[i].closed||(e[a].styles.push(this.stylesList[i]),"st"==this.stylesList[i].type&&(this.stylesList[i].pathElement.setAttribute("fill-opacity",0),this.stylesList[i].pathElement.setAttribute("stroke-linejoin","round"),this.stylesList[i].pathElement.setAttribute("stroke-linecap","round")));for(r=n.length,a=0;r>a;a+=1)n[a].closed=!0},ShapeItemElement.prototype.getElement=function(){return this.shape},ShapeItemElement.prototype.hideShape=function(){var t,e=this.stylesList.length;for(t=e-1;t>=0;t-=1)this.stylesList[t].pathElement.setAttribute("d","")},ShapeItemElement.prototype.renderShape=function(t,e,a,i){var s,r;if(!a)for(a=this.data,r=this.stylesList.length,s=0;r>s;s+=1)this.stylesList[s].d="";i||(i=this.viewData),this.frameNum=t,r=a.length-1;var n,o;for(n=e,s=r;s>=0;s-=1)if("tr"==a[s].ty){var h=a[s].renderedData[t].mtArr;if(n=i[s].transform,o=n.mat,o.reset(),e){var l=e.mat.props;n.opacity=e.opacity,n.opacity*=a[s].renderedData[t].o,o.transform(l[0],l[1],l[2],l[3],l[4],l[5])}else n.opacity=a[s].renderedData[t].o;o.transform(h[0],h[1],h[2],h[3],h[4],h[5]).translate(-a[s].renderedData[t].a[0],-a[s].renderedData[t].a[1])}else"sh"==a[s].ty?this.renderPath(a[s],i[s],t,n):"el"==a[s].ty?this.renderPath(a[s],i[s],t,n):"rc"==a[s].ty?a[s].trimmed?this.renderPath(a[s],i[s],t,n):this.renderRect(a[s],i[s],t,n):"fl"==a[s].ty?this.renderFill(a[s],i[s],t,n):"st"==a[s].ty?this.renderStroke(a[s],i[s],t,n):"gr"==a[s].ty?this.renderShape(t,n,a[s].it,i[s].it):"tm"==a[s].ty;for(r=this.stylesList.length,s=0;r>s;s+=1)this.stylesList[s].pathElement.setAttribute("d",this.stylesList[s].d)},ShapeItemElement.prototype.renderPath=function(t,e,a,i){if(!e.renderedFrames[this.globalData.frameNum]){var s=t.renderedData[a].path.pathNodes;if(!s.v)return;var r,n=s.v.length,o=s.s?s.s:[],h="";for(r=1;n>r;r+=1)o[r-1]?h+=" M"+i.mat.applyToPointStringified(o[r-1][0],o[r-1][1]):1==r&&(h+=" M"+i.mat.applyToPointStringified(s.v[0][0],s.v[0][1])),h+=" C"+i.mat.applyToPointStringified(s.o[r-1][0],s.o[r-1][1])+" "+i.mat.applyToPointStringified(s.i[r][0],s.i[r][1])+" "+i.mat.applyToPointStringified(s.v[r][0],s.v[r][1]);!t.closed||t.trimmed&&!s.c||(h+=" C"+i.mat.applyToPointStringified(s.o[r-1][0],s.o[r-1][1])+" "+i.mat.applyToPointStringified(s.i[0][0],s.i[0][1])+" "+i.mat.applyToPointStringified(s.v[0][0],s.v[0][1])),e.renderedFrames[this.globalData.frameNum]={dTr:h}}var l=e.renderedFrames[this.globalData.frameNum];for(n=e.styles.length,r=0;n>r;r+=1)e.styles[r].d+=l.dTr},ShapeItemElement.prototype.renderFill=function(t,e,a,i){var s=t.renderedData[a],r=e.style;e.renderedFrames[this.globalData.frameNum]||(e.renderedFrames[this.globalData.frameNum]={c:s.color,o:s.opacity*i.opacity});var n=e.renderedFrames[this.globalData.frameNum],o=n.c,h=n.o;e.lastData.c!=o&&r.pathElement.setAttribute("fill",o),e.lastData.o!=h&&r.pathElement.setAttribute("fill-opacity",h),e.lastData.c=o,e.lastData.o=h},ShapeItemElement.prototype.renderStroke=function(t,e,a,i){var s=t.renderedData[a],r=e.style;e.renderedFrames[this.globalData.frameNum]||(e.renderedFrames[this.globalData.frameNum]={c:s.color,o:s.opacity*i.opacity,w:s.width},s.dashes&&(e.renderedFrames[this.globalData.frameNum].d=s.dashes));var n=e.renderedFrames[this.globalData.frameNum],o=n.c,h=n.o,l=n.w,p=n.d;if(p){var m,d=p.length,u="",c="";for(m=0;d>m;m+=1)"o"!=p[m].n?u+=" "+p[m].v:c+=p[m].v}e.lastData.c!=o&&r.pathElement.setAttribute("stroke",o),e.lastData.o!=h&&r.pathElement.setAttribute("stroke-opacity",h),e.lastData.w!=l&&r.pathElement.setAttribute("stroke-width",l),p&&(e.lastData.da!=u&&r.pathElement.setAttribute("stroke-dasharray",u),e.lastData["do"]!=c&&r.pathElement.setAttribute("stroke-dashoffset",c)),e.lastData.c=o,e.lastData.o=h,e.lastData.w=l,p&&(e.lastData.da=u,e.lastData["do"]=c)},createElement(BaseElement,ISolidElement),ISolidElement.prototype.createElements=function(){this.parent.createElements.call(this);var t=document.createElementNS(svgNS,"rect");t.setAttribute("width",this.data.width),t.setAttribute("height",this.data.height),t.setAttribute("fill",this.data.color),this.layerElement.appendChild(t),this.rectElement=t},ISolidElement.prototype.hide=function(){this.hidden||this.data.hasMask||(this.rectElement.setAttribute("opacity","0"),this.hidden=!0)},ISolidElement.prototype.renderFrame=function(t,e){var a=this.parent.renderFrame.call(this,t,e);if(a===!1)return void this.hide();if(this.hidden&&(this.lastData.o=-1,this.hidden=!1),!this.data.hasMask){this.renderedFrames[this.globalData.frameNum]||(this.renderedFrames[this.globalData.frameNum]={tr:"matrix("+this.finalTransform.mat.props.join(",")+")",o:this.finalTransform.opacity});var i=this.renderedFrames[this.globalData.frameNum];this.lastData.tr!=i.tr&&(this.lastData.tr=i.tr,this.rectElement.setAttribute("transform",i.tr)),this.lastData.o!==i.o&&(this.lastData.o=i.o,this.rectElement.setAttribute("opacity",i.o))}},createElement(BaseElement,ITextElement),ITextElement.prototype.createElements=function(){this.svgElem=document.createElementNS(svgNS,"g");var t=document.createElementNS(svgNS,"text");t.textContent=this.data.textData.text,t.setAttribute("fill",this.data.textData.fillColor),t.setAttribute("x","0"),t.setAttribute("y",this.data.textData.height-(this.data.textData.fontSize-this.data.textData.height)/2),this.svgElem.setAttribute("width",this.data.textData.width),this.svgElem.setAttribute("height",this.data.textData.height),this.svgElem.style.transform=this.svgElem.style.webkitTransform="translate("+this.data.textData.xOffset+"px,"+this.data.textData.yOffset+"px)",t.setAttribute("font-size",this.data.textData.fontSize),t.setAttribute("font-family","Arial, sans-serif"),this.svgElem.appendChild(t),this.parent.createElements.call(this),this.anchorElement.appendChild(this.svgElem),this.maskedElement=t},CVBaseElement.prototype.init=function(){this.createElements(),this.data.hasMask&&this.addMasks(this.data),this.data.eff&&this.createEffectsManager(this.data)},CVBaseElement.prototype.createElements=function(){},CVBaseElement.prototype.prepareFrame=function(t){return this.data.inPoint-this.data.startTime<=t&&this.data.outPoint-this.data.startTime>=t?(this.renderFrame=!0,this.currentAnimData=this.data.renderedData[t].an,void(this.data.hasMask&&this.maskManager.prepareFrame(t))):(this.renderFrame=!1,this.currentAnimData=this.data.renderedData[t].an,!1)},CVBaseElement.prototype.draw=function(t){if("NullLayer"!=this.data.type){if(t!==!1&&this.canvasContext.save(),!this.renderFrame)return!1;var e,a=this.canvasContext;if(this.hierarchy){var i,s,r=this.hierarchy.length;for(i=r-1;i>=0;i-=1)s=this.hierarchy[i].getCurrentAnimData(),e=s.matrixArray,a.transform(e[0],e[1],e[2],e[3],e[4],e[5]),a.translate(-s.tr.a[0],-s.tr.a[1])}a.globalAlpha=a.globalAlpha*this.currentAnimData.tr.o,e=this.currentAnimData.matrixArray,a.transform(e[0],e[1],e[2],e[3],e[4],e[5]),a.translate(-this.currentAnimData.tr.a[0],-this.currentAnimData.tr.a[1]),this.data.hasMask&&this.maskManager.draw(),t!==!1&&this.canvasContext.restore()}},CVBaseElement.prototype.getCurrentAnimData=function(){return this.currentAnimData},CVBaseElement.prototype.addMasks=function(t){var e={data:{value:t},element:{value:this}};this.maskManager=createElement(CVMaskElement,null,e)},CVBaseElement.prototype.createEffectsManager=function(t){var e={effects:{value:t.eff},element:{value:this}};this.effectsManager=createElement(EffectsManager,null,e)},CVBaseElement.prototype.getType=function(){return this.type},CVBaseElement.prototype.getHierarchy=function(){return this.hierarchy||(this.hierarchy=[]),this.hierarchy},CVBaseElement.prototype.getLayerSize=function(){return"TextLayer"==this.data.type?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}},createElement(CVBaseElement,CVCompElement),CVCompElement.prototype.prepareFrame=function(t){var e=this.parent.prepareFrame.call(this,t);if(e!==!1){var a,i=this.elements.length,s=this.data.tm?this.data.tm[t]<0?0:t>=this.data.tm.length?this.data.tm[this.data.tm.length-1]:this.data.tm[t]:t;for(a=0;i>a;a+=1)this.elements[a].prepareFrame(s-this.layers[a].startTime)}},CVCompElement.prototype.draw=function(){if(this.canvasContext.save(),this.parent.draw.call(this,!1)===!1)return void this.canvasContext.restore();var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.elements[t].draw();this.canvasContext.restore()},CVCompElement.prototype.setElements=function(t){this.elements=t},CVCompElement.prototype.getElements=function(){return this.elements},createElement(CVBaseElement,CVImageElement),CVImageElement.prototype.createElements=function(){var t=this,e=function(){t.animationItem.elementLoaded()},a=function(){t.failed=!0,t.animationItem.elementLoaded()};this.img=new Image,this.img.addEventListener("load",e,!1),this.img.addEventListener("error",a,!1),this.img.src=this.path+this.assets[this.data.assetId].path,this.parent.createElements.call(this)},CVImageElement.prototype.draw=function(){if(!this.failed){if(this.canvasContext.save(),this.parent.draw.call(this,!1)===!1)return void this.canvasContext.restore();var t=this.canvasContext;t.drawImage(this.img,0,0),this.canvasContext.restore()}},createElement(CVBaseElement,CVShapeElement),CVShapeElement.prototype.createElements=function(){this.parent.createElements.call(this),this.mainShape=new CVShapeItemElement(this.data.shapes,!0,this.globalData)},CVShapeElement.prototype.prepareFrame=function(t){var e=this.parent.prepareFrame.call(this,t);e!==!1&&this.mainShape.prepareFrame(t)},CVShapeElement.prototype.draw=function(){return this.canvasContext.save(),this.parent.draw.call(this,!1)===!1?void this.canvasContext.restore():(this.drawShapes(),void this.canvasContext.restore())},CVShapeElement.prototype.drawShapes=function(){this.mainShape.renderShape()},CVShapeItemElement.prototype.drawPaths=function(t){var e;if(t){var a=[];e=this.stylesList}else e=this.renderedPaths[this.globalData.frameNum];var i,s=e.length,r=this.canvasContext;for(r.save(),r.lineCap="round",r.lineJoin="round",i=0;s>i;i+=1)"stroke"==e[i].type?(r.globalAlpha*=e[i].opacity,r.strokeStyle=e[i].value,r.lineWidth=e[i].width,e[i].dasharray?(r.setLineDash(e[i].dasharray),r.lineDashOffset=e[i].dashoffset):(r.setLineDash([]),r.lineDashOffset=0),r.stroke(e[i].path),t&&(a.push({type:e[i].type,opacity:e[i].opacity,value:e[i].value,width:e[i].width,path:e[i].path}),e[i].dasharray&&(a[a.length-1].dasharray=e[i].dasharray,a[a.length-1].dashoffset=e[i].dashoffset))):"fill"==e[i].type&&(r.globalAlpha*=e[i].opacity,r.fillStyle=e[i].value,r.fill(e[i].path),t&&a.push({type:e[i].type,opacity:e[i].opacity,value:e[i].value,path:e[i].path}));r.restore(),t&&(this.renderedPaths[this.globalData.frameNum]=a)},CVShapeItemElement.prototype.prepareFrame=function(t){this.frameNum=t;var e,a=this.dataLength-1;for(e=a;e>=0;e-=1)"gr"==this.data[e].ty&&this.data[e].item.prepareFrame(t)},CVShapeItemElement.prototype.renderShape=function(t,e){if(this.renderedPaths[this.globalData.frameNum])return void this.drawPaths(!1);this.opacityMultiplier=1;var a,i;for(this.ownStylesList.length=0,this.currentStylePoolPos=0,t?this.stylesList=t:this.stylesList.length=0,e?this.currentMatrix=e:(this.currentMatrix.a=this.currentMatrix.d=1,this.currentMatrix.b=this.currentMatrix.c=this.currentMatrix.e=this.currentMatrix.f=0),i=this.dataLength-1,a=i;a>=0;a-=1)"gr"==this.data[a].ty?this.data[a].item.renderShape(this.stylesList,this.currentMatrix):"tr"==this.data[a].ty?this.renderTransform(this.data[a]):"sh"==this.data[a].ty?this.renderPath(this.data[a]):"el"==this.data[a].ty?this.renderEllipse(this.data[a]):"rc"==this.data[a].ty?this.data[a].trimmed?this.renderPath(this.data[a]):this.renderRect(this.data[a]):"fl"==this.data[a].ty?this.renderFill(this.data[a]):"st"==this.data[a].ty&&this.renderStroke(this.data[a]);if(this.mainFlag)this.drawPaths(!0);else for(i=this.ownStylesList.length,a=0;i>a;a+=1)this.ownStylesList[a].closed=!0},CVShapeItemElement.prototype.renderTransform=function(t){var e=t.renderedData[this.frameNum],a=e.mtArr;this.mat.a=a[0],this.mat.b=a[1],this.mat.c=a[2],this.mat.d=a[3],this.mat.e=a[4],this.mat.f=a[5],this.mat=this.mat.translate(-e.a[0],-e.a[1]),this.opacityMultiplier*=e.o,this.currentMatrix=this.currentMatrix.multiply(this.mat)},CVShapeItemElement.prototype.renderPath=function(t){if(t.trimmed){var e=this.canvasContext;e.lineCap="round",e.lineJoin="round"}var a=t.renderedData[this.frameNum].path,i=new Path2D,s=a.pathNodes;if(s instanceof Array&&(s=s[0]),s.v){var r,n=s.v.length,o=s.s?s.s:[];for(r=1;n>r;r+=1)o[r-1]?i.moveTo(o[r-1][0],o[r-1][1]):1==r&&i.moveTo(s.v[0][0],s.v[0][1]),i.bezierCurveTo(s.o[r-1][0],s.o[r-1][1],s.i[r][0],s.i[r][1],s.v[r][0],s.v[r][1]);!a.closed||t.trimmed&&!s.c||i.bezierCurveTo(s.o[r-1][0],s.o[r-1][1],s.i[0][0],s.i[0][1],s.v[0][0],s.v[0][1]),this.addPathToStyles(i)}},CVShapeItemElement.prototype.renderEllipse=function(t){var e=new Path2D,a=t.renderedData[this.frameNum];e.moveTo(a.p[0]+a.size[0]/2,a.p[1]),e.ellipse(a.p[0],a.p[1],a.size[0]/2,a.size[1]/2,0,0,2*Math.PI,!1),this.addPathToStyles(e)},CVShapeItemElement.prototype.renderRect=function(t){var e=new Path2D,a=t.renderedData[this.frameNum],i=a.roundness;if(0===i)e.rect(a.position[0]-a.size[0]/2,a.position[1]-a.size[1]/2,a.size[0],a.size[1]);else{var s=a.position[0]-a.size[0]/2,r=a.position[1]-a.size[1]/2,n=a.size[0],o=a.size[1];i instanceof Array&&(i=i[0]),i>n/2&&(i=n/2),i>o/2&&(i=o/2),e.moveTo(s+i,r),e.lineTo(s+n-i,r),e.quadraticCurveTo(s+n,r,s+n,r+i),e.lineTo(s+n,r+o-i),e.quadraticCurveTo(s+n,r+o,s+n-i,r+o),e.lineTo(s+i,r+o),e.quadraticCurveTo(s,r+o,s,r+o-i),e.lineTo(s,r+i),e.quadraticCurveTo(s,r,s+i,r)
-}this.addPathToStyles(e)},CVShapeItemElement.prototype.addPathToStyles=function(t){var e,a=this.stylesList.length,i=!0,s=0;for(e=a-1;e>=0;e-=1)this.stylesList[e].closed||("stroke"==this.stylesList[e].type?(this.stylesList[e].width>s&&this.stylesList[e].path.addPath(t,this.currentMatrix),1==this.stylesList[e].styleOpacity&&1==this.stylesList[e].opacity&&(s=this.stylesList[e].width)):i&&"fill"==this.stylesList[e].type&&(this.stylesList[e].path.addPath(t,this.currentMatrix),1==this.stylesList[e].styleOpacity&&1==this.stylesList[e].opacity&&(i=!1)))},CVShapeItemElement.prototype.renderFill=function(t){var e=t.renderedData[this.frameNum];return t.fillEnabled!==!1?(this.stylesPool[this.currentStylePoolPos].path=new Path2D,this.stylesPool[this.currentStylePoolPos].closed=!1,this.stylesPool[this.currentStylePoolPos].styleOpacity=e.opacity<1?e.opacity:1,this.stylesPool[this.currentStylePoolPos].opacity=this.opacityMultiplier,this.stylesPool[this.currentStylePoolPos].value=e.opacity<1?fillColorToString(e.color,e.opacity):fillColorToString(e.color),this.stylesList.push(this.stylesPool[this.currentStylePoolPos]),this.ownStylesList.push(this.stylesList[this.stylesList.length-1]),void(this.currentStylePoolPos+=1)):(this.stylesList.push(this.stylesPool[this.currentStylePoolPos]),this.ownStylesList.push(this.stylesList[this.stylesList.length-1]),void(this.currentStylePoolPos+=1))},CVShapeItemElement.prototype.renderStroke=function(t){var e=t.renderedData[this.frameNum];if(this.data.strokeEnabled!==!1){if(this.stylesPool[this.currentStylePoolPos].path=new Path2D,this.stylesPool[this.currentStylePoolPos].closed=!1,this.stylesPool[this.currentStylePoolPos].styleOpacity=e.opacity<1?e.opacity:1,this.stylesPool[this.currentStylePoolPos].width=e.width,this.stylesPool[this.currentStylePoolPos].opacity=this.opacityMultiplier,this.stylesPool[this.currentStylePoolPos].value=e.opacity<1?fillColorToString(e.color,e.opacity):fillColorToString(e.color),e.dashes){var a,i=e.dashes,s=i.length,r=[],n="";for(a=0;s>a;a+=1)"o"!=i[a].n?r.push(i[a].v):n=i[a].v;this.stylesPool[this.currentStylePoolPos].dasharray=r,this.stylesPool[this.currentStylePoolPos].dashoffset=n}return this.stylesList.push(this.stylesPool[this.currentStylePoolPos]),this.ownStylesList.push(this.stylesList[this.stylesList.length-1]),void(this.currentStylePoolPos+=1)}this.stylesList.push(this.stylesPool[this.currentStylePoolPos]),this.ownStylesList.push(this.stylesList[this.stylesList.length-1]),this.currentStylePoolPos+=1},createElement(CVBaseElement,CVSolidElement),CVSolidElement.prototype.draw=function(){if(this.canvasContext.save(),this.parent.draw.call(this,!1)===!1)return void this.canvasContext.restore();var t=this.canvasContext;t.fillStyle=this.data.color,t.fillRect(0,0,this.data.width,this.data.height),this.canvasContext.restore()},createElement(CVBaseElement,CVTextElement),CVTextElement.prototype.createElements=function(){this.svgElem=document.createElementNS(svgNS,"g");var t=document.createElementNS(svgNS,"text");t.textContent=this.data.textData.text,t.setAttribute("fill",this.data.textData.fillColor),t.setAttribute("x","0"),t.setAttribute("y",this.data.textData.height-(this.data.textData.fontSize-this.data.textData.height)/2),this.svgElem.setAttribute("width",this.data.textData.width),this.svgElem.setAttribute("height",this.data.textData.height),this.svgElem.style.transform=this.svgElem.style.webkitTransform="translate("+this.data.textData.xOffset+"px,"+this.data.textData.yOffset+"px)",t.setAttribute("font-size",this.data.textData.fontSize),t.setAttribute("font-family","Arial, sans-serif"),this.svgElem.appendChild(t),this.parent.createElements.call(this),this.anchorElement.appendChild(this.svgElem),this.maskedElement=t},CVMaskElement.prototype.init=function(){this.registeredEffects=[],this.masksProperties=this.data.masksProperties,this.totalMasks=this.masksProperties.length,this.ctx=this.element.canvasContext,this.layerSize=this.element.getLayerSize()},CVMaskElement.prototype.prepareFrame=function(t){this.frameNum=t},CVMaskElement.prototype.draw=function(){var t,e=this.data.masksProperties.length;for(this.ctx.beginPath(),t=0;e>t;t++)this.masksProperties[t].inv?this.createInvertedMask(this.masksProperties[t],this.frameNum):this.drawShape(this.ctx,this.data.masksProperties[t].paths[this.frameNum].pathNodes);this.ctx.closePath(),this.ctx.clip()},CVMaskElement.prototype.drawShape=function(t,e){var a,i=e.v.length;for(t.moveTo(e.v[0][0],e.v[0][1]),a=1;i>a;a++)t.bezierCurveTo(e.o[a-1][0],e.o[a-1][1],e.i[a][0],e.i[a][1],e.v[a][0],e.v[a][1]);t.bezierCurveTo(e.o[a-1][0],e.o[a-1][1],e.i[0][0],e.i[0][1],e.v[0][0],e.v[0][1])},CVMaskElement.prototype.createInvertedMask=function(){};var animationManager=function(){function t(t){if(!t)return null;for(var e=0;v>e;){if(f[e].elem==t&&null!==f[e].elem)return f[e].animation;e+=1}var a=new AnimationItem;return a.setData(t),f.push({elem:t,animation:a}),v+=1,a}function e(t){var e=new AnimationItem;return e.setParams(t),f.push({elem:null,animation:e}),v+=1,e}function a(t,e){var a;for(a=0;v>a;a+=1)f[a].animation.setSpeed(t,e)}function i(t,e){var a;for(a=0;v>a;a+=1)f[a].animation.setDirection(t,e)}function s(t){var e;for(e=0;v>e;e+=1)f[e].animation.play(t)}function r(t,e){g=!1,y=Date.now();var a;for(a=0;v>a;a+=1)f[a].animation.moveFrame(t,e)}function n(){var t,e=Date.now(),a=e-y;for(t=0;v>t;t+=1)f[t].animation.advanceTime(a);y=e,requestAnimationFrame(n)}function o(t){var e;for(e=0;v>e;e+=1)f[e].animation.pause(t)}function h(t,e,a){var i;for(i=0;v>i;i+=1)f[i].animation.goToAndStop(t,e,a)}function l(t){var e;for(e=0;v>e;e+=1)f[e].animation.stop(t)}function p(t){var e;for(e=0;v>e;e+=1)f[e].animation.togglePause(t)}function m(){var e=document.getElementsByClassName("bodymovin");Array.prototype.forEach.call(e,t)}function d(){var t;for(t=0;v>t;t+=1)f[t].animation.resize()}function u(){y=Date.now(),requestAnimationFrame(n)}var c={},f=[],y=0,g=!0,v=0;return setTimeout(u,0),c.registerAnimation=t,c.loadAnimation=e,c.setSpeed=a,c.setDirection=i,c.play=s,c.moveFrame=r,c.pause=o,c.stop=l,c.togglePause=p,c.searchAnimations=m,c.resize=d,c.start=u,c.goToAndStop=h,c}(),AnimationItem=function(){this.name="",this.path="",this.isLoaded=!1,this.currentFrame=0,this.currentRawFrame=0,this.totalFrames=0,this.frameRate=0,this.frameMult=0,this.playSpeed=1,this.playDirection=1,this.pendingElements=0,this.playCount=0,this.prerenderFramesFlag=!0,this.repeat="indefinite",this.animationData={},this.layers=[],this.assets=[],this.isPaused=!0,this.isScrolling=!1,this.autoplay=!1,this.loop=!0,this.renderer=null,this.animationID=randomString(10),this.renderedFrameCount=0,this.scaleMode="fit",this.math=Math};AnimationItem.prototype.setParams=function(t){var e=this;t.context&&(this.context=t.context),t.wrapper&&(this.wrapper=t.wrapper);var a=t.animType?t.animType:"canvas";switch(a){case"canvas":this.renderer=new CanvasRenderer(this,t.renderer);break;case"svg":this.renderer=new SVGRenderer(this,t.renderer)}if(this.animType=a,""===t.loop||null===t.loop||(this.loop=t.loop===!1?!1:t.loop===!0?!0:parseInt(t.loop)),this.autoplay="autoplay"in t?t.autoplay:!0,this.name=t.name?t.name:"",this.prerenderFramesFlag="prerender"in t?t.prerender:!0,t.animationData)e.configAnimation(t.animationData);else if(t.path){"json"!=t.path.substr(-4)&&("/"!=t.path.substr(-1,1)&&(t.path+="/"),t.path+="data.json");var i=new XMLHttpRequest;this.path=t.path.substr(0,t.path.lastIndexOf("/")+1),i.open("GET",t.path,!0),i.send(),i.onreadystatechange=function(){if(4==i.readyState)if(200==i.status)e.configAnimation(JSON.parse(i.responseText));else try{var t=JSON.parse(i.responseText);e.configAnimation(t)}catch(a){}}}},AnimationItem.prototype.setData=function(t){var e={wrapper:t},a=t.attributes;e.path=a.getNamedItem("data-animation-path")?a.getNamedItem("data-animation-path").value:a.getNamedItem("data-bm-path")?a.getNamedItem("data-bm-path").value:a.getNamedItem("bm-path")?a.getNamedItem("bm-path").value:"",e.animType=a.getNamedItem("data-anim-type")?a.getNamedItem("data-anim-type").value:a.getNamedItem("data-bm-type")?a.getNamedItem("data-bm-type").value:a.getNamedItem("bm-type")?a.getNamedItem("bm-type").value:"canvas";var i=a.getNamedItem("data-anim-loop")?a.getNamedItem("data-anim-loop").value:a.getNamedItem("data-bm-loop")?a.getNamedItem("data-bm-loop").value:a.getNamedItem("bm-loop")?a.getNamedItem("bm-loop").value:"";""===i||(e.loop="false"===i?!1:"true"===i?!0:parseInt(i)),e.name=a.getNamedItem("data-name")?a.getNamedItem("data-name").value:a.getNamedItem("data-bm-name")?a.getNamedItem("data-bm-name").value:a.getNamedItem("bm-name")?a.getNamedItem("bm-name").value:"";var s=a.getNamedItem("data-anim-prerender")?a.getNamedItem("data-anim-prerender").value:a.getNamedItem("data-bm-prerender")?a.getNamedItem("data-bm-prerender").value:a.getNamedItem("bm-prerender")?a.getNamedItem("bm-prerender").value:"";"false"===s&&(e.prerender=!1),this.setParams(e)},AnimationItem.prototype.configAnimation=function(t){this.renderer.configAnimation(t),this.animationData=t,this.animationData._id=this.animationID,this.animationData._animType=this.animType,this.layers=this.animationData.animation.layers,this.assets=this.animationData.assets,this.totalFrames=this.animationData.animation.totalFrames,this.frameRate=this.animationData.animation.frameRate,this.firstFrame=Math.round(this.animationData.animation.ff*this.frameRate),this.frameMult=this.animationData.animation.frameRate/1e3,dataManager.completeData(this.animationData),this.renderer.buildItems(this.animationData.animation.layers),this.updaFrameModifier(),this.checkLoaded()},AnimationItem.prototype.elementLoaded=function(){this.pendingElements--,this.checkLoaded()},AnimationItem.prototype.checkLoaded=function(){this.renderer.buildStage(this.container,this.layers),0===this.pendingElements&&(this.prerenderFramesFlag?(this.prerenderFrames(0),dataManager.renderFrame(this.animationID,this.currentFrame+this.firstFrame),this.renderer.renderFrame(this.currentFrame+this.firstFrame)):(this.isLoaded=!0,this.gotoFrame(),this.autoplay&&this.play()))},AnimationItem.prototype.prerenderFrames=function(t){t||(t=0),this.renderedFrameCount===this.totalFrames?(this.isLoaded=!0,this.gotoFrame(),this.autoplay&&this.play()):(dataManager.renderFrame(this.animationID,this.renderedFrameCount+this.firstFrame),this.renderedFrameCount+=1,t>5?setTimeout(this.prerenderFrames.bind(this),0):(t+=1,this.prerenderFrames(t)))},AnimationItem.prototype.resize=function(){this.renderer.updateContainerSize()},AnimationItem.prototype.gotoFrame=function(){this.currentFrame=subframeEnabled?this.math.round(100*this.currentRawFrame)/100:this.math.floor(this.currentRawFrame),this.renderFrame()},AnimationItem.prototype.renderFrame=function(){this.isLoaded!==!1&&(dataManager.renderFrame(this.animationID,this.currentFrame+this.firstFrame),this.renderer.renderFrame(this.currentFrame+this.firstFrame))},AnimationItem.prototype.play=function(t){t&&this.name!=t||this.isPaused===!0&&(this.isPaused=!1)},AnimationItem.prototype.pause=function(t){t&&this.name!=t||this.isPaused===!1&&(this.isPaused=!0)},AnimationItem.prototype.togglePause=function(t){t&&this.name!=t||(this.isPaused===!0?(this.isPaused=!1,this.play()):(this.isPaused=!0,this.pause()))},AnimationItem.prototype.stop=function(t){t&&this.name!=t||(this.isPaused=!0,this.currentFrame=this.currentRawFrame=0,this.playCount=0,this.gotoFrame())},AnimationItem.prototype.goToAndStop=function(t,e,a){a&&this.name!=a||(this.setCurrentRawFrameValue(e?t:t*this.frameModifier),this.isPaused=!0)},AnimationItem.prototype.advanceTime=function(t){this.isPaused!==!0&&this.isScrolling!==!0&&this.isLoaded!==!1&&this.setCurrentRawFrameValue(this.currentRawFrame+t*this.frameModifier)},AnimationItem.prototype.updateAnimation=function(t){this.setCurrentRawFrameValue(this.totalFrames*t)},AnimationItem.prototype.moveFrame=function(t,e){e&&this.name!=e||this.setCurrentRawFrameValue(this.currentRawFrame+t)},AnimationItem.prototype.setCurrentRawFrameValue=function(t){if(this.currentRawFrame=t,this.currentRawFrame>=this.totalFrames){if(this.loop===!1)return this.currentRawFrame=this.totalFrames-1,this.gotoFrame(),void this.pause();if(this.playCount+=1,this.loop!==!0&&this.playCount==this.loop)return this.currentRawFrame=this.totalFrames-1,this.gotoFrame(),void this.pause()}else if(this.currentRawFrame<0)return this.playCount-=1,this.playCount<0&&(this.playCount=0),this.loop===!1?(this.currentRawFrame=0,this.gotoFrame(),void this.pause()):(this.currentRawFrame=this.totalFrames+this.currentRawFrame,void this.gotoFrame());this.currentRawFrame=this.currentRawFrame%this.totalFrames,this.gotoFrame()},AnimationItem.prototype.setSpeed=function(t){this.playSpeed=t,this.updaFrameModifier()},AnimationItem.prototype.setDirection=function(t){this.playDirection=0>t?-1:1,this.updaFrameModifier()},AnimationItem.prototype.updaFrameModifier=function(){this.frameModifier=this.frameMult*this.playSpeed*this.playDirection},AnimationItem.prototype.getPath=function(){return this.path},AnimationItem.prototype.getAssets=function(){return this.assets},function(t){function e(t){animationManager.play(t)}function a(t){animationManager.pause(t)}function i(t){animationManager.togglePause(t)}function s(t,e){animationManager.setSpeed(t,e)}function r(t,e){animationManager.setDirection(t,e)}function n(t){animationManager.stop(t)}function o(t){animationManager.moveFrame(t)}function h(){animationManager.searchAnimations()}function l(t){return animationManager.registerAnimation(t)}function p(){animationManager.resize()}function m(){animationManager.start()}function d(t,e,a){animationManager.goToAndStop(t,e,a)}function u(t){subframeEnabled=t}function c(t){return animationManager.loadAnimation(t)}function f(){"complete"===document.readyState&&(clearInterval(g),h())}var y={};y.play=e,y.pause=a,y.togglePause=i,y.setSpeed=s,y.setDirection=r,y.stop=n,y.moveFrame=o,y.searchAnimations=h,y.registerAnimation=l,y.loadAnimation=c,y.setSubframeRendering=u,y.resize=p,y.start=m,y.goToAndStop=d,y.checkReady=f,t.bodymovin=y;var g=setInterval(f,100)}(window);}(window));
\ No newline at end of file
+(function(window){function Matrix(t){var e=this;e._t=e.transform,e.a=e.d=1,e.b=e.c=e.e=e.f=0,e.props=[1,0,0,1,0,0],e.cssParts=["matrix(","",")"],e.a1=e.b1=e.c1=e.d1=e.e1=e.f1=0,e.context=t,e.cos=e.sin=0,t&&t.setTransform(1,0,0,1,0,0)}function matrixManagerFunction(){var t=new Matrix,e=function(t,e,a,i,s,r,n,o,h){var l,p,m,d,u,c,f;return l=$M([[1,0,0,0],[0,Math.cos(t),Math.sin(-t),0],[0,Math.sin(t),Math.cos(t),0],[0,0,0,1]]),p=$M([[Math.cos(e),0,Math.sin(e),0],[0,1,0,0],[Math.sin(-e),0,Math.cos(e),0],[0,0,0,1]]),m=$M([[Math.cos(a),Math.sin(-a),0,0],[Math.sin(a),Math.cos(a),0,0],[0,0,1,0],[0,0,0,1]]),u=$M([[i,0,0,0],[0,s,0,0],[0,0,r,0],[0,0,0,1]]),c=l.x(p).x(m).x(u),c=c.transpose(),f=$M([[1,0,0,0],[0,1,0,0],[0,0,1,0],[n,o,h,1]]),c=c.x(f),d="matrix3d(",d+=c.e(1,1).toFixed(5)+","+c.e(1,2).toFixed(5)+","+c.e(1,3).toFixed(5)+","+c.e(1,4).toFixed(5)+",",d+=c.e(2,1).toFixed(5)+","+c.e(2,2).toFixed(5)+","+c.e(2,3).toFixed(5)+","+c.e(2,4).toFixed(5)+",",d+=c.e(3,1).toFixed(5)+","+c.e(3,2).toFixed(5)+","+c.e(3,3).toFixed(5)+","+c.e(3,4).toFixed(5)+",",d+=c.e(4,1).toFixed(5)+","+c.e(4,2).toFixed(5)+","+c.e(4,3).toFixed(5)+","+c.e(4,4).toFixed(5),d+=")"},a=function(e,a,i,s,r){return t.reset().translate(s,r).rotate(e).scale(a,i).toCSS()},i=function(e,a,i,s,r){return t.reset().translate(s,r).rotate(e).scale(a,i).toArray()},s=function(t){return a(t.r,t.s[0],t.s[1],t.p[0],t.p[1])},r=function(t,i){return i?e(-t.tr.r[0],t.tr.r[1],t.tr.r[2],t.tr.s[0],t.tr.s[1],t.tr.s[2],t.tr.p[0],t.tr.p[1],t.tr.p[2]):a(t.tr.r[2],t.tr.s[0],t.tr.s[1],t.tr.p[0],t.tr.p[1])},n=function(t,i){return i?e(-t.r[0],t.r[1],t.r[2],t.s[0],t.s[1],t.s[2],t.p[0],t.p[1],t.p[2]):a(t.r[2],t.s[0],t.s[1],t.p[0],t.p[1])},o=function(t,e){return e?null:i(t.r[2],t.s[0],t.s[1],t.p[0],t.p[1])};return{get2DMatrix:s,getMatrix:r,getMatrix2:n,getMatrixArray:o,getMatrixArrayFromParams:i,getMatrix2FromParams:a}}function styleDiv(t){t.style.position="absolute",t.style.top=0,t.style.left=0,t.style.display="block",t.style.verticalAlign="top",t.style.backfaceVisibility=t.style.webkitBackfaceVisibility="hidden",styleUnselectableDiv(t)}function styleUnselectableDiv(t){t.style.userSelect="none",t.style.MozUserSelect="none",t.style.webkitUserSelect="none",t.style.oUserSelect="none"}function randomString(t,e){void 0===e&&(e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890");var a,i="";for(a=t;a>0;--a)i+=e[Math.round(Math.random()*(e.length-1))];return i}function componentToHex(t){var e=t.toString(16);return 1==e.length?"0"+e:e}function fillToRgba(t,e){if(!cachedColors[t]){var a=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);cachedColors[t]=parseInt(a[1],16)+","+parseInt(a[2],16)+","+parseInt(a[3],16)}return"rgba("+cachedColors[t]+","+e+")"}function createElement(t,e,a){if(!e){var i=Object.create(t.prototype,a),s={};return i&&"[object Function]"===s.toString.call(i.init)&&i.init(),i}e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.prototype.parent=t.prototype}function defineDescriptor(t,e,a,i){var s={writable:!1,configurable:!1,enumerable:!1,value:a};if(i)for(var r in i)s[r]=i[r];var n={};t&&"[object Function]"===n.toString.call(t)&&(t=t.prototype),Object.defineProperty(t,e,s)}function defineAccessor(t,e,a){var i,s={enumerable:!1,configurable:!1,get:function(){return i},set:function(t){i=t}};if(a)for(var r in a)s[r]=a[r];var n={};t&&"[object Function]"===n.toString.call(t)&&(t=t.prototype),Object.defineProperty(t,e,s)}function bezFunction(){function t(t,e,a,i,s,r){return o.abs((a-t)*(r-e)-(s-t)*(i-e))<1e-5}function e(t){return n[t].fnc}function a(t,e,a,i,s){if(s||(s=("bez_"+t+"_"+e+"_"+a+"_"+i).replace(/\./g,"p")),n[s])return n[s];var r,o,h,l,p,m;return n[s]=function(s,n,d,u,c){var f=n/c;s=f;for(var y,g=0;++g<14&&(h=3*t,o=3*(a-t)-h,r=1-h-o,y=s*(h+s*(o+s*r))-f,!(Math.abs(y)<.001));)s-=y/(h+s*(2*o+3*r*s));m=3*e,p=3*(i-e)-m,l=1-m-p;var v=s*(m+s*(p+s*l));return u*v+d},n[s]}function i(e){var a,i,s,r,n,o,h,l=e.s,p=e.e,m=e.to,d=e.ti,u=500,c=0,f=null,y={points:[],segmentLength:0};for((l[0]!=p[0]||l[1]!=p[1])&&t(l[0],l[1],p[0],p[1],l[0]+m[0],l[1]+m[1])&&t(l[0],l[1],p[0],p[1],p[0]+d[0],p[1]+d[1])&&(u=2),s=m.length,a=0;u>a;a+=1){for(h=[],n=a/(u-1),o=0,i=0;s>i;i+=1)r=Math.pow(1-n,3)*l[i]+3*Math.pow(1-n,2)*n*(l[i]+m[i])+3*(1-n)*Math.pow(n,2)*(p[i]+d[i])+Math.pow(n,3)*p[i],h.push(r),null!==f&&(o+=Math.pow(h[i]-f[i],2));o=Math.sqrt(o),c+=o,y.points.push({partialLength:o,cumulatedLength:c,point:h}),f=h}y.segmentLength=c,e.bezierData=y}function s(t,e){var a=e.segments,i=a.length,s=Math.floor((i-1)*t),r=t*e.addedLength,n=0;if(r==a[s].l)return a[s].p;for(var o=a[s].l>r?-1:1,h=!0;h;)a[s].l<=r&&a[s+1].l>r?(n=(r-a[s].l)/(a[s+1].l-a[s].l),h=!1):s+=o,(0>s||s>=i-1)&&(h=!1);return a[s].p+(a[s+1].p-a[s].p)*n}function r(t,e,a,i,r,n,o){var h={pt1:[],pt2:[],pt3:[],pt4:[]};r=0>r?0:r;var l=s(r,o);n=n>1?1:n;var p,m=s(n,o),d=t.length,u=1-l,c=1-m,f=[],y=[],g=[],v=[];for(p=0;d>p;p+=1)f[p]=u*u*u*t[p]+(l*u*u+u*l*u+u*u*l)*a[p]+(l*l*u+u*l*l+l*u*l)*i[p]+l*l*l*e[p],y[p]=u*u*c*t[p]+(l*u*c+u*l*c+u*u*m)*a[p]+(l*l*c+u*l*m+l*u*m)*i[p]+l*l*m*e[p],g[p]=u*c*c*t[p]+(l*c*c+u*m*c+u*c*m)*a[p]+(l*m*c+u*m*m+l*c*m)*i[p]+l*m*m*e[p],v[p]=c*c*c*t[p]+(m*c*c+c*m*c+c*c*m)*a[p]+(m*m*c+c*m*m+m*c*m)*i[p]+m*m*m*e[p];return h.pt1=f,h.pt2=v,h.pt3=y,h.pt4=g,h}var n=[],o=Math,h=function(){var e={};return function(a,i,s,r){var n=(a.join("_")+"_"+i.join("_")+"_"+s.join("_")+"_"+r.join("_")).replace(/\./g,"p");if(e[n])return e[n];var o,h,l,p,m,d,u=100,c=0,f=[],y=[],g={addedLength:0,segments:[]};for((a[0]!=i[0]||a[1]!=i[1])&&t(a[0],a[1],i[0],i[1],s[0],s[1])&&t(a[0],a[1],i[0],i[1],r[0],r[1])&&(u=2),l=s.length,o=0;u>o;o+=1){for(m=o/(u-1),d=0,h=0;l>h;h+=1)p=Math.pow(1-m,3)*a[h]+3*Math.pow(1-m,2)*m*s[h]+3*(1-m)*Math.pow(m,2)*r[h]+Math.pow(m,3)*i[h],f[h]=p,null!==y[h]&&(d+=Math.pow(f[h]-y[h],2)),y[h]=f[h];d&&(d=Math.sqrt(d),c+=d),g.segments.push({l:c,p:m})}return g.addedLength=c,e[n]=g,g}}();return{getEasingCurve:a,getEasingCurveByIndex:e,getBezierLength:h,getNewSegment:r,buildBezierData:i}}function dataFunctionManager(){function t(t,e,a){var i,s=h(t,e,a),r=[];for(i=0;e>i;i+=1)r.push(Math.floor(s[i]*x));return r}function e(t,e){var a,i,s,r=t.length;for(a=0;r>a;a+=1)if(void 0!==t[a].t)if(t[a].s instanceof Array)for(s=t[a].s.length,i=0;s>i;i+=1)t[a].s[i]*=e,void 0!=t[a].e&&(t[a].e[i]*=e);else t[a].s&&(t[a].s*=e,t[a].e&&(t[a].e*=e));else t[a]=t[a]*e}function a(n,h){h||(h=n);var l,p,m,d,u,c,f,y,g,v,x=n.length;for(c=0;x>c;c+=1){if(m=n[c],l=m.outPoint-m.startTime,p=m.startTime,m.layerName=o(m.layerName),m.parent&&(m.parent=o(m.parent)),m.renderedFrame={},m.renderedData={},d=[],u=-1,m.tm&&(m.trmp=m.tm,m.tm=t(m.tm,l,p)),m.ks.o instanceof Array?e(m.ks.o,.01):m.ks.o/=100,m.ks.s instanceof Array?e(m.ks.s,.01):m.ks.s/=100,m.ks.r instanceof Array?e(m.ks.r,C):m.ks.r*=C,m.hasMask){var E=m.masksProperties;for(y=E.length,f=0;y>f;f+=1)if(E[f].pt.i)r(E[f].pt);else for(v=E[f].pt.length,g=0;v>g;g+=1)E[f].pt[g].s&&r(E[f].pt[g].s[0]),E[f].pt[g].e&&r(E[f].pt[g].e[0])}"PreCompLayer"==m.type?m.refId&&!m.layers?m.layers=i(m.refId,h):a(m.layers,h):"ShapeLayer"==m.type&&s(m.shapes)}}function i(t,e,a){a||(a=e);var s,r=e.length;for(s=0;r>s;s+=1){if(e[s].compId==t)return e[s].layers||(e[s].layers=i(e[s].refId,a)),e[s].layers;if("PreCompLayer"==e[s].type){var n=i(t,e[s].layers,a);if(n)return n}}return null}function s(t,a){var i,n,o,h,l=t.length,p=a?a:!1;for(i=l-1;i>=0;i-=1)if(t[i].renderedData=[],"tm"==t[i].ty&&(p=!0),"fl"==t[i].ty||"st"==t[i].ty)t[i].o instanceof Array?e(t[i].o,.01):t[i].o*=.01;else if("sh"==t[i].ty)if(t[i].trimmed=p,t[i].ks.i)r(t[i].ks);else for(o=t[i].ks.length,n=0;o>n;n+=1)t[i].ks[n].s&&(r(t[i].ks[n].s[0]),r(t[i].ks[n].e[0]));else"gr"==t[i].ty?s(t[i].it,p):"tr"==t[i].ty?(h=t[i],h.renderedData=[],h.o instanceof Array?e(h.o,.01):h.o/=100,h.s instanceof Array?e(h.s,.01):h.s/=100,h.r instanceof Array?e(h.r,C):h.r*=C):"rc"==t[i].ty&&(t[i].trimmed=p,t[i].trimmed=!0)}function r(t){var e,a=t.i.length;for(e=0;a>e;e+=1)t.i[e][0]+=t.v[e][0],t.i[e][1]+=t.v[e][1],t.o[e][0]+=t.v[e][0],t.o[e][1]+=t.v[e][1]}function n(t){b[t._id]={data:t,renderedFrames:[]},x=t.animation.frameRate,a(t.animation.layers)}function o(t){return t=t.replace(/ /g,"_"),t=t.replace(/-/g,"_"),t=t.replace(/\./g,"_"),t=t.replace(/\//g,"_")}function h(t,e,a){var i,s,r=[];if(!(t instanceof Array)||null===t[0].t)return r.push(t),r;var n,o;r=[];var h,l,p,m=[];s=t.length;var d,u,c;for(i=0;s>i;i+=1)n=t[i],n.t-=a;var f=0,y=0;for(i=0;e>i;i+=1){h=f;for(var g=!1;s-1>h;){if(n=t[h],o=t[h+1],i<n.t&&0===h){for(p=n.s.length,m=[],l=0;p>l;l+=1)m.push(n.s[l]);r.push(m),g=!0,f!=h&&(f=h,y=0);break}if(i>=n.t&&i<o.t){if(m=[],n.to){d=bez.getEasingCurve(n.o.x,n.o.y,n.i.x,n.i.y)("",i-n.t,0,1,o.t-n.t),u=n.bezierData;var v,x,E=u.segmentLength*d;for(l=y;l<u.points.length;){if(0===i||0===E||0===d){m=u.points[l].point,y=l;break}if(l==u.points.length-1)m=u.points[l].point;else if(E>u.points[l].partialLength&&E<u.points[l+1].partialLength){for(v=u.points[l].point.length,x=(E-u.points[l].partialLength)/(u.points[l+1].partialLength-u.points[l].partialLength),c=0;v>c;c+=1)m.push(u.points[l].point[c]+(u.points[l+1].point[c]-u.points[l].point[c])*x);y=l;break}l+=1}}else{var b,C,S,w;n.s.forEach(function(t,e){if(1!==n.h&&(n.o.x instanceof Array?(b=n.o.x[e],C=n.o.y[e],S=n.i.x[e],w=n.i.y[e]):(b=n.o.x,C=n.o.y,S=n.i.x,w=n.i.y),d=bez.getEasingCurve(b,C,S,w)("",i-n.t,0,1,o.t-n.t)),t.i){var a={i:[],o:[],v:[]};t.i.forEach(function(i,s){var r=[],o=[],h=[];i.forEach(function(a,i){1===n.h?(r.push(a),o.push(t.o[s][i]),h.push(t.v[s][i])):(r.push(a+(n.e[e].i[s][i]-a)*d),o.push(t.o[s][i]+(n.e[e].o[s][i]-t.o[s][i])*d),h.push(t.v[s][i]+(n.e[e].v[s][i]-t.v[s][i])*d))}),a.i.push(r),a.o.push(o),a.v.push(h)}),m.push(a)}else m.push(1===n.h?t:t+(n.e[e]-t)*d)})}r.push(m),g=!0,f!=h&&(f=h,y=0);break}h+=1}g===!1&&(n=t[t.length-2],m=[],n.e.forEach(function(t){m.push(t)}),r.push(m))}for(h=r.length;e>h;)r.push(m),h+=1;return r}function l(t,e,a,i){var s,r,n,o,h,l;if(!t.length)return"p"==i.type?(D.px=t,D.py=t):"s"==i.type?(D.sx=t,D.sy=t):"r"==i.type&&(D.r=t),i.toArray?[t]:t;if(void 0===t[0].t)return"p"==i.type?(D.px=t[0],D.py=t[1]):"s"==i.type?(D.sx=t[0],D.sy=t[1]):"r"==i.type&&(D.r=t[0]),t;h=0,l=t.length-1;for(var p=1,m=!0;!(!m||(s=t[h],r=t[h+1],h==l-1&&e>=r.t-a)||r.t-a>e&&1==p);){if(r.t-a<e&&-1==p){h+=1,s=t[h],r=t[h+1];break}l-1>h&&1==p||h>0&&-1==p?h+=p:m=!1}s.to&&!s.bezierData&&bez.buildBezierData(s);var d,u,c,f,y,g=0;if("default"==i.type&&(n=[]),s.to){if(o=s.bezierData,e>=r.t-a)return"p"==i.type?(D.px=o.points[o.points.length-1].point[0],D.py=o.points[o.points.length-1].point[1]):"s"==i.type?(D.sx=o.points[o.points.length-1].point[0],D.sy=o.points[o.points.length-1].point[1]):"r"==i.type&&(D.r=o.points[o.points.length-1].point[0]),o.points[o.points.length-1].point;if(e<s.t-a)return"p"==i.type?(D.px=o.points[0].point[0],D.py=o.points[0].point[1]):"s"==i.type?(D.sx=o.points[0].point[0],D.sy=o.points[0].point[1]):"r"==i.type&&(D.r=o.points[0].point[0]),o.points[0].point;s.__fnct?y=s.__fnct:(y=bez.getEasingCurve(s.o.x,s.o.y,s.i.x,s.i.y,s.n),s.__fnct=y),c=y("",e-(s.t-a),0,1,r.t-a-(s.t-a));var v,x=o.segmentLength*c,E=0;for(p=1,m=!0,f=o.points.length;m;){if(E+=o.points[g].partialLength*p,0===x||0===c){"p"==i.type?(D.px=o.points[g].point[0],D.py=o.points[g].point[1]):"s"==i.type?(D.sx=o.points[g].point[0],D.sy=o.points[g].point[1]):"r"==i.type?D.r=o.points[g].point[0]:n=o.points[g].point;break}if(g==o.points.length-1){"p"==i.type?(D.px=o.points[g].point[0],D.py=o.points[g].point[1]):"s"==i.type?(D.sx=o.points[g].point[0],D.sy=o.points[g].point[1]):"r"==i.type?D.r=o.points[g].point[0]:n=o.points[g].point;break}if(x>E&&x<E+o.points[g+1].partialLength){if(v=(x-E)/o.points[g+1].partialLength,"p"==i.type)D.px=o.points[g].point[0]+(o.points[g+1].point[0]-o.points[g].point[0])*v,D.py=o.points[g].point[1]+(o.points[g+1].point[1]-o.points[g].point[1])*v;else if("s"==i.type)D.sx=o.points[g].point[0]+(o.points[g+1].point[0]-o.points[g].point[0])*v,D.sy=o.points[g].point[1]+(o.points[g+1].point[1]-o.points[g].point[1])*v;else if("r"==i.type)D.r=o.points[g].point[0]+(o.points[g+1].point[0]-o.points[g].point[0])*v;else for(u=o.points[g].point.length,d=0;u>d;d+=1)n.push(o.points[g].point[d]+(o.points[g+1].point[d]-o.points[g].point[d])*v);break}f-1>g&&1==p||g>0&&-1==p?g+=p:m=!1}}else{var b,C,S,w,M=!1;for(l=s.s.length,h=0;l>h;h+=1)1!==s.h&&(s.o.x instanceof Array?(M=!0,b=s.o.x[h]?s.o.x[h]:s.o.x[0],C=s.o.y[h]?s.o.y[h]:s.o.y[0],S=s.i.x[h]?s.i.x[h]:s.i.x[0],w=s.i.y[h]?s.i.y[h]:s.i.y[0],s.__fnct||(s.__fnct=[])):(M=!1,b=s.o.x,C=s.o.y,S=s.i.x,w=s.i.y),M?s.__fnct[h]?y=s.__fnct[h]:(y=bez.getEasingCurve(b,C,S,w),s.__fnct[h]=y):s.__fnct?y=s.__fnct:(y=bez.getEasingCurve(b,C,S,w),s.__fnct=y),c=e>=r.t-a?1:e<s.t-a?0:y("",e-(s.t-a),0,1,r.t-a-(s.t-a))),1===s.h?"p"==i.type?0===h?D.px=s.s[h]:1==h&&(D.py=s.s[h]):"s"==i.type?0===h?D.sx=s.s[h]:1==h&&(D.sy=s.s[h]):"r"==i.type?D.r=s.s[h]:n.push(s.s[h]):"p"==i.type?0===h?D.px=s.s[h]+(s.e[h]-s.s[h])*c:1==h&&(D.py=s.s[h]+(s.e[h]-s.s[h])*c):"s"==i.type?0===h?D.sx=s.s[h]+(s.e[h]-s.s[h])*c:1==h&&(D.sy=s.s[h]+(s.e[h]-s.s[h])*c):"r"==i.type?D.r=s.s[h]+(s.e[h]-s.s[h])*c:n.push(s.s[h]+(s.e[h]-s.s[h])*c)}return n}function p(t,e){if(!t.__lengths){t.__lengths=[],t.__totalLength=0;var a,i=t.v,s=t.o,r=t.i,n=i.length;for(a=0;n-1>a;a+=1)t.__lengths.push(bez.getBezierLength(i[a],i[a+1],s[a],r[a+1])),t.__totalLength+=t.__lengths[a].addedLength;e&&(t.__lengths.push(bez.getBezierLength(i[a],i[0],s[a],r[0])),t.__totalLength+=t.__lengths[a].addedLength)}}function m(t,e,a,i,s,r){var n=r&&r.length>0,o={};o.closed=s?t.cl:t.closed;var h=s?t.pt:t.ks;if(h.v)return o.pathNodes=n?w(h,o.closed,r,!1):"svg"==i?h:h,o;t={i:[],o:[],v:[]};var l,p,m,d,u,c,f,y=[];if(e<h[0].t-a){if(!h.__minValue){for(p=h[0].s[0].i.length,l=0;p>l;l+=1){for(u=[],c=[],f=[],d=h[0].s[0].i[l].length,m=0;d>m;m+=1)u.push(h[0].s[0].i[l][m]),c.push(h[0].s[0].o[l][m]),f.push(h[0].s[0].v[l][m]);t.i.push(u),t.o.push(c),t.v.push(f)}y.push(t),"svg"!=i||n?h.__minValue=y[0]:h.__minValueN=y[0]}return o.pathNodes=n?w(h.__minValue,o.closed,r,!1):"svg"==i?h.__minValueN:h.__minValue,o}if(e>h[h.length-1].t-a){if(!h.__maxValue){var g=h.length-2;for(p=h[g].s[0].i.length,l=0;p>l;l+=1){for(u=[],c=[],f=[],d=h[g].s[0].i[l].length,m=0;d>m;m+=1)u.push(h[g].e[0].i[l][m]),c.push(h[g].e[0].o[l][m]),f.push(h[g].e[0].v[l][m]);t.i.push(u),t.o.push(c),t.v.push(f)}y.push(t),"svg"!=i||n?h.__maxValue=y[0]:h.__maxValueN=y[0]}return o.pathNodes=n?w(h.__maxValue,o.closed,r,!1):"svg"==i?h.__maxValueN:h.__maxValue,o}for(var v,x,E=0,b=h.length-1,C=1,S=!0;S&&(v=h[E],x=h[E+1],!(x.t-a>e&&1==C));)b-1>E&&1==C||E>0&&-1==C?E+=C:S=!1;var D,M,I,F,P;if(1!==v.h){D=v.o.x,M=v.o.y,I=v.i.x,F=v.i.y;var A;v.__fnct?A=v.__fnct:(A=bez.getEasingCurve(D,M,I,F),v.__fnct=A),P=A("",e-(v.t-a),0,1,x.t-a-(v.t-a)),e>=x.t-a?P=1:e<v.t-a&&(P=0)}if(1===v.h&&v.__hValue)y.push(v.__hValue);else for(t={i:[],o:[],v:[]},p=v.s[0].i.length,l=0;p>l;l+=1){for(u=[],c=[],f=[],d=v.s[0].i[l].length,m=0;d>m;m+=1)1===v.h?(u.push(v.s[0].i[l][m]),c.push(v.s[0].o[l][m]),f.push(v.s[0].v[l][m])):(u.push(v.s[0].i[l][m]+(v.e[0].i[l][m]-v.s[0].i[l][m])*P),c.push(v.s[0].o[l][m]+(v.e[0].o[l][m]-v.s[0].o[l][m])*P),f.push(v.s[0].v[l][m]+(v.e[0].v[l][m]-v.s[0].v[l][m])*P));t.i.push(u),t.o.push(c),t.v.push(f),1===v.h&&(v.__hValue=t),y.push(t)}return o.pathNodes=n?w(y[0],o.closed,r,!1):"svg"==i?y[0]:y[0],o}function d(t,e,a){var i,s,r,n,o,h,p,u,f,y=t.length;for(u=0;y>u;u+=1)if(f=t[u],n=e-f.startTime,!f.an[n]){if(i={},S.arrayFlag=!1,S.type="default",i.a=l(f.ks.a,n,f.startTime,S),i.o=l(f.ks.o,n,f.startTime,S),S.arrayFlag=!1,S.type="p",l(f.ks.p,n,f.startTime,S),S.arrayFlag=!0,S.type="r",l(f.ks.r,n,f.startTime,S),S.arrayFlag=!0,S.type="s",l(f.ks.s,n,f.startTime,S),p={},p.an={tr:i},S.arrayFlag=!1,S.type="default",p.an.matrixArray="canvas"==a?E.getMatrixArrayFromParams(D.r,D.sx,D.sy,D.px,D.py):E.getMatrixArrayFromParams(D.r,D.sx,D.sy,D.px,D.py),f.renderedData[n]=p,f.hasMask)for(s=f.masksProperties,h=s.length,o=0;h>o;o+=1)s[o].paths||(s[o].paths=[],s[o].opacity=[]),s[o].paths[n]=m(s[o],n,f.startTime,a,!0),s[o].opacity[n]=l(s[o].o,n,f.startTime,S),s[o].opacity[n]=s[o].opacity[n]instanceof Array?s[o].opacity[n][0]/100:s[o].opacity[n]/100;e<f.inPoint||e>f.outPoint||("PreCompLayer"==f.type?(r=f.tm?f.tm[n]<0?0:n>=f.tm.length?f.tm[f.tm.length-1]:f.tm[n]:n,void 0===r&&(r=l(f.trmp,n,0,S)[0]*x,f.tm[n]=r),d(f.layers,r,a)):"ShapeLayer"==f.type&&c(f.shapes,n,f.startTime,a))}}function u(t,e,a){var i=[],s=[],r=[],n=a/2;return a*=1,i.push([t[0]+e[0]/2,t[1]-e[1]/2+a]),r.push(i[0]),s.push([t[0]+e[0]/2,t[1]-e[1]/2+n]),i.push([t[0]+e[0]/2,t[1]+e[1]/2-a]),r.push([t[0]+e[0]/2,t[1]+e[1]/2-n]),s.push(i[1]),i.push([t[0]+e[0]/2-a,t[1]+e[1]/2]),r.push(i[2]),s.push([t[0]+e[0]/2-n,t[1]+e[1]/2]),i.push([t[0]-e[0]/2+a,t[1]+e[1]/2]),r.push([t[0]-e[0]/2+n,t[1]+e[1]/2]),s.push(i[3]),i.push([t[0]-e[0]/2,t[1]+e[1]/2-a]),r.push(i[4]),s.push([t[0]-e[0]/2,t[1]+e[1]/2-n]),i.push([t[0]-e[0]/2,t[1]-e[1]/2+a]),r.push([t[0]-e[0]/2,t[1]-e[1]/2+n]),s.push(i[5]),i.push([t[0]-e[0]/2+a,t[1]-e[1]/2]),r.push(i[6]),s.push([t[0]-e[0]/2+n,t[1]-e[1]/2]),i.push([t[0]+e[0]/2-a,t[1]-e[1]/2]),r.push([t[0]+e[0]/2-n,t[1]-e[1]/2]),s.push(i[7]),{v:i,o:r,i:s,c:!0}}function c(t,e,a,i,s){var r,n,o,h,p,d,y,g,v,x,b=t.length;s||(s=[]);var C,M,I,F,P;for(r=b-1;r>=0;r-=1)if(n=t[r],"sh"==n.ty)n.renderedData[e]={path:m(n,e,a,i,!1,s)};else if("fl"==n.ty)o=l(n.c,e,a,S),h=l(n.o,e,a,S),n.renderedData[e]={opacity:h instanceof Array?h[0]:h},"canvas"==i?(f(o),n.renderedData[e].color=o):n.renderedData[e].color=rgbToHex(Math.round(o[0]),Math.round(o[1]),Math.round(o[2]));else if("rc"==n.ty)p=l(n.p,e,a,S),d=l(n.s,e,a,S),y=l(n.r,e,a,S),n.trimmed?(n.renderedData[e]={path:{closed:!0}},n.renderedData[e].path.pathNodes=w(u(p,d,y),!0,s,!1)):n.renderedData[e]={position:p,size:d,roundness:y};else if("el"==n.ty){if(p=l(n.p,e,a,S),d=l(n.s,e,a,S),n.renderedData[e]={p:p,size:d},"svg"==i){var A={v:[],i:[],o:[]};A.v.push([p[0],p[1]-d[1]/2]),A.o.push([p[0]-d[0]/2*.55,p[1]-d[1]/2]),A.i.push([p[0]+d[0]/2*.55,p[1]-d[1]/2]),A.v.push([p[0]-d[0]/2,p[1]]),A.o.push([p[0]-d[0]/2,p[1]+d[1]/2*.55]),A.i.push([p[0]-d[0]/2,p[1]-d[1]/2*.55]),A.v.push([p[0],p[1]+d[1]/2]),A.o.push([p[0]+d[0]/2*.55,p[1]+d[1]/2]),A.i.push([p[0]-d[0]/2*.55,p[1]+d[1]/2]),A.v.push([p[0]+d[0]/2,p[1]]),A.o.push([p[0]+d[0]/2,p[1]-d[1]/2*.55]),A.i.push([p[0]+d[0]/2,p[1]+d[1]/2*.55]),n.renderedData[e].path={pathNodes:A},n.closed=!0}}else if("st"==n.ty){if(g=l(n.c,e,a,S),v=l(n.o,e,a,S),x=l(n.w,e,a,S),n.renderedData[e]={opacity:v instanceof Array?v[0]:v,width:x instanceof Array?x[0]:x},n.d){var _=[];P=n.d.length;var k;for(F=0;P>F;F+=1)k=l(n.d[F].v,e,a,S),_.push({v:k instanceof Array?k[0]:k,n:n.d[F].n});n.renderedData[e].dashes=_}"canvas"==i?(f(g),n.renderedData[e].color=g):n.renderedData[e].color=rgbToHex(Math.round(g[0]),Math.round(g[1]),Math.round(g[2]))}else if("tr"==n.ty)n.renderedData[e]={a:l(n.a,e,a,S),o:l(n.o,e,a,S)},S.arrayFlag=!0,S.type="s",l(n.s,e,a,S),S.arrayFlag=!0,S.type="r",l(n.r,e,a,S),S.arrayFlag=!1,S.type="p",l(n.p,e,a,S),S.arrayFlag=!1,S.type="default",n.renderedData[e].mtArr="canvas"==i?E.getMatrixArrayFromParams(D.r,D.sx,D.sy,D.px,D.py):E.getMatrixArrayFromParams(D.r,D.sx,D.sy,D.px,D.py);else if("tm"==n.ty){C=l(n.s,e,a,S),M=l(n.e,e,a,S),I=l(n.o,e,a,S);var T={s:C,e:M,o:I};s.push(T),n.renderedData[e]=T}else"gr"==n.ty&&c(n.it,e,a,i,s)}function f(t){var e,a=t.length;for(e=0;a>e;e+=1)t[e]=Math.round(t[e])}function y(t,e){for(var a=1;a>0;){if(e+=1,e>=t.data.animation.totalFrames){t.renderFinished=!0;break}t.renderedFrames[e]||(g(t.data._id,e),a-=1)}}function g(t,e){return 2==b[t].renderedFrames[e]?void(b[t].renderFinished||y(b[t],e)):(x=b[t].data.animation.frameRate,b[t].renderedFrames[e]=2,void d(b[t].data.animation.layers,e,b[t].data._animType))}function v(t){var e,a=b[t].data,i=a.animation.totalFrames,s=[];for(e=0;i>e;e+=1)s.push({num:e,data:g(t,e)})}var x=0,E=new MatrixManager,b={},C=Math.PI/180,S={arrayFlag:!1},w=function(){function t(t,r,n,p){i[o]=r,e[o+1]=n,a[o+1]=p,h?a[o]=t:(l+=" M"+t.join(","),h=!0,s[o]=t),l+=" C"+r.join(",")+" "+n.join(",")+" "+p.join(","),o+=1}var e,a,i,s,r,n,o,h=!1,l="";return function(m,d,u,c){p(m,d);var f,y=u.length,g=m;for(a=e=i=s=null,f=y-1;f>=0;f-=1){var v=[],x=u[f].o%360/360;if(0!=x||0!=u[f].s||100!=u[f].e){l="",h=!1,e=[],i=[],a=[],s=[],r=[],n=0,0>x&&(x+=1);var E=u[f].s/100+x,b=u[f].e/100+x;if(E==b)return c?"":{};if(E>b){var C=E;E=b,b=C}1>=b?v.push({s:g.__totalLength*E,e:g.__totalLength*b}):E>=1?v.push({s:g.__totalLength*(E-1),e:g.__totalLength*(b-1)}):(v.push({s:g.__totalLength*E,e:g.__totalLength}),v.push({s:0,e:g.__totalLength*(b-1)}));var S,w,D,M=[],I=[],F=[];M=g.v,I=g.o,F=g.i,S=g.__lengths,D=M.length;var P,A,_=0,k=0,T=v.length;for(o=0,P=0;T>P;P+=1){for(_=0,w=1;D>w;w++)if(k=S[w-1].addedLength,_+k<v[P].s)_+=k;else{if(_>v[P].e)break;v[P].s<=_&&v[P].e>=_+k?t(M[w-1],I[w-1],F[w],M[w],S[w-1]):(A=bez.getNewSegment(M[w-1],M[w],I[w-1],F[w],(v[P].s-_)/k,(v[P].e-_)/k,S[w-1]),t(A.pt1,A.pt3,A.pt4,A.pt2)),_+=k}d!==!1?_>v[P].e||(k=S[w-1].addedLength,v[P].s<=_&&v[P].e>=_+k?t(M[w-1],I[w-1],F[0],M[0],S[w-1]):(A=bez.getNewSegment(M[w-1],M[0],I[w-1],F[0],(v[P].s-_)/k,(v[P].e-_)/k,S[w-1]),t(A.pt1,A.pt3,A.pt4,A.pt2))):h=!1}d=!1}}if(a?(M=a,I=i,F=e):(M=g.v,I=g.o,F=g.i,s=[]),D=M.length,c){for(l="",w=1;D>w;w++)s[w-1]?l+="M"+s[w-1].join(","):1==w&&(l+="M"+M[0].join(",")),l+=" C"+I[w-1].join(",")+" "+F[w].join(",")+" "+M[w].join(",");return d!==!1&&(l+=" C"+I[w-1].join(",")+" "+F[0].join(",")+" "+M[0].join(",")),l}return{i:F,o:I,v:M,s:s,c:d}}}(),D={r:0,sx:1,sy:1,px:1,py:1},M={};return M.completeData=n,M.renderFrame=g,M.renderAllFrames=v,M}function SVGRenderer(t){this.animationItem=t,this.layers=null,this.lastFrame=-1,this.globalData={frameNum:-1},this.elements=[]}function CanvasRenderer(t,e){this.animationItem=t,this.renderConfig=e?e:{clearCanvas:!0,context:null,scaleMode:"fit"},this.lastFrame=-1,this.globalData={frameNum:-1},this.elements=[]}function MaskElement(t){this.data=null,this.element=null,this.globalData=t,this.paths=[]}function ICompElement(t,e,a,i){this.parent.constructor.call(this,t,e,a,i),this.layers=t.layers}function IImageElement(t,e,a,i){this.animationItem=e,this.assets=this.animationItem.getAssets(),this.path=this.animationItem.getPath(),this.parent.constructor.call(this,t,e,a,i)}function IShapeElement(t,e,a,i){this.shapes=[],this.parent.constructor.call(this,t,e,a,i)}function ShapeItemElement(t,e,a){this.stylesList=[],this.viewData=[],this.currentMatrix=new Matrix,this.shape=e,this.data=t,this.globalData=a,this.searchShapes(this.data,this.viewData),styleUnselectableDiv(this.shape)}function ISolidElement(t,e,a,i){this.parent.constructor.call(this,t,e,a,i)}function ITextElement(t,e,a,i){this.parent.constructor.call(this,t,e,a,i)}function CVBaseElement(t,e){this.data=t,this.globalData=e,this.canvasContext=e.canvasContext,this.currentAnimData=null,this.renderFrame=!1,this.init()}function CVCompElement(t,e){this.parent.constructor.call(this,t,e),this.layers=t.layers}function CVImageElement(t,e){this.animationItem=renderer.animationItem,this.assets=this.animationItem.getAssets(),this.path=this.animationItem.getPath(),this.parent.constructor.call(this,t,e),this.animationItem.pendingElements+=1}function CVShapeElement(t,e){this.shapes=[],this.parent.constructor.call(this,t,e)}function CVShapeItemElement(t,e,a){this.data=t,this.globalData=a,this.canvasContext=a.canvasContext,this.frameNum=-1,this.dataLength=this.data.length,this.mainFlag=e,this.stylesList=[],this.ownStylesList=[],this.stylesPool=[],this.currentStylePoolPos=0,this.currentMatrix=document.createElementNS("http://www.w3.org/2000/svg","svg").createSVGMatrix(),this.mat=document.createElementNS("http://www.w3.org/2000/svg","svg").createSVGMatrix();var i,s=this.dataLength-1;this.renderedPaths={};var r;for(i=s;i>=0;i-=1)"gr"==this.data[i].ty?this.data[i].item=new CVShapeItemElement(this.data[i].it,!1,this.globalData):("st"==this.data[i].ty||"fl"==this.data[i].ty)&&(r={type:"fill",styleOpacity:0,opacity:0,value:"rgba(0,0,0,0)",closed:!1},"fl"==this.data[i].ty?r.type="fill":(r.type="stroke",r.width=0),this.stylesPool.push(r))}function CVSolidElement(t,e){this.parent.constructor.call(this,t,e)}function CVTextElement(t,e){this.parent.constructor.call(this,t,e)}function CVMaskElement(){}var svgNS="http://www.w3.org/2000/svg";Matrix.prototype={concat:function(t){return this.clone()._t(t.a,t.b,t.c,t.d,t.e,t.f)},flipX:function(){return this._t(-1,0,0,1,0,0)},flipY:function(){return this._t(1,0,0,-1,0,0)},reflectVector:function(t,e){var a=this.applyToPoint(0,1),i=2*(a.x*t+a.y*e);return t-=i*a.x,e-=i*a.y,{x:t,y:e}},reset:function(){return this.setTransform(1,0,0,1,0,0)},rotate:function(t){return 0===t?this:(this.cos=Math.cos(t),this.sin=Math.sin(t),this._t(this.cos,this.sin,-this.sin,this.cos,0,0))},rotateFromVector:function(t,e){return this.rotate(Math.atan2(e,t))},rotateDeg:function(t){return this.rotate(t*Math.PI/180)},scaleU:function(t){return this._t(t,0,0,t,0,0)},scale:function(t,e){return 1==t&&1==e?this:this._t(t,0,0,e,0,0)},scaleX:function(t){return this._t(t,0,0,1,0,0)},scaleY:function(t){return this._t(1,0,0,t,0,0)},shear:function(t,e){return this._t(1,e,t,1,0,0)},shearX:function(t){return this._t(1,0,t,1,0,0)},shearY:function(t){return this._t(1,t,0,1,0,0)},skew:function(t,e){return this.shear(Math.tan(t),Math.tan(e))},skewX:function(t){return this.shearX(Math.tan(t))},skewY:function(t){return this.shearY(Math.tan(t))},setTransform:function(t,e,a,i,s,r){return this.props[0]=t,this.props[1]=e,this.props[2]=a,this.props[3]=i,this.props[4]=s,this.props[5]=r,this._x()},translate:function(t,e){return this._t(1,0,0,1,t,e)},translateX:function(t){return this._t(1,0,0,1,t,0)},translateY:function(t){return this._t(1,0,0,1,0,t)},transform:function(t,e,a,i,s,r){return this.a1=this.props[0],this.b1=this.props[1],this.c1=this.props[2],this.d1=this.props[3],this.e1=this.props[4],this.f1=this.props[5],this.props[0]=this.a1*t+this.c1*e,this.props[1]=this.b1*t+this.d1*e,this.props[2]=this.a1*a+this.c1*i,this.props[3]=this.b1*a+this.d1*i,this.props[4]=this.a1*s+this.c1*r+this.e1,this.props[5]=this.b1*s+this.d1*r+this.f1,this._x()},divide:function(t){if(!t.isInvertible())throw"Input matrix is not invertible";var e=t.inverse();return this._t(e.a,e.b,e.c,e.d,e.e,e.f)},divideScalar:function(t){var e=this;return e.a/=t,e.b/=t,e.c/=t,e.d/=t,e.e/=t,e.f/=t,e._x()},inverse:function(){if(this.isIdentity())return new Matrix;if(this.isInvertible()){var t=this,e=t.a,a=t.b,i=t.c,s=t.d,r=t.e,n=t.f,o=new Matrix,h=e*s-a*i;return o.a=s/h,o.b=-a/h,o.c=-i/h,o.d=e/h,o.e=(i*n-s*r)/h,o.f=-(e*n-a*r)/h,o}throw"Matrix is not invertible."},interpolate:function(t,e,a){var i=this,s=a?new Matrix(a):new Matrix;return s.a=i.a+(t.a-i.a)*e,s.b=i.b+(t.b-i.b)*e,s.c=i.c+(t.c-i.c)*e,s.d=i.d+(t.d-i.d)*e,s.e=i.e+(t.e-i.e)*e,s.f=i.f+(t.f-i.f)*e,s._x()},interpolateAnim:function(t,e,a){var i=this,s=a?new Matrix(a):new Matrix,r=i.decompose(),n=t.decompose(),o=r.rotation+(n.rotation-r.rotation)*e,h=r.translate.x+(n.translate.x-r.translate.x)*e,l=r.translate.y+(n.translate.y-r.translate.y)*e,p=r.scale.x+(n.scale.x-r.scale.x)*e,m=r.scale.y+(n.scale.y-r.scale.y)*e;return s.translate(h,l),s.rotate(o),s.scale(p,m),s._x()},decompose:function(t){var e=this.props[0],a=this.props[1],i=this.props[2],s=this.props[3],r=Math.acos,n=Math.atan,o=Math.sqrt,h=Math.PI,l={x:this.props[4],y:this.props[5]},p=0,m={x:1,y:1},d={x:0,y:0},u=e*s-a*i;if(t)e?(d={x:n(i/e),y:n(a/e)},m={x:e,y:u/e}):a?(p=.5*h,m={x:a,y:u/a},d.x=n(s/a)):(m={x:i,y:s},d.x=.25*h);else if(e||a){var c=o(e*e+a*a);p=a>0?r(e/c):-r(e/c),m={x:c,y:u/c},d.x=n((e*i+a*s)/(c*c))}else if(i||s){var f=o(i*i+s*s);p=.5*h-(s>0?r(-i/f):-r(i/f)),m={x:u/f,y:f},d.y=n((e*i+a*s)/(f*f))}else m={x:0,y:0};return{scale:m,translate:l,rotation:p,skew:d}},determinant:function(){return this.a*this.d-this.b*this.c},applyToPoint:function(t,e){return{x:t*this.props[0]+e*this.props[2]+this.props[4],y:t*this.props[1]+e*this.props[3]+this.props[5]}},applyToPointStringified:function(t,e){return t*this.props[0]+e*this.props[2]+this.props[4]+","+(t*this.props[1]+e*this.props[3]+this.props[5])},applyToArray:function(t){var e,a,i=0,s=[];if("number"==typeof t[0])for(a=t.length;a>i;)e=this.applyToPoint(t[i++],t[i++]),s.push(e.x,e.y);else for(a=t.length,i=0;a>i;i++)s.push(this.applyToPoint(t[i].x,t[i].y));return s},applyToTypedArray:function(t,e){for(var a,i=0,s=t.length,r=e?new Float64Array(s):new Float32Array(s);s>i;)a=this.applyToPoint(t[i],t[i+1]),r[i++]=a.x,r[i++]=a.y;return r},applyToContext:function(t){var e=this;return t.setTransform(e.a,e.b,e.c,e.d,e.e,e.f),e},isIdentity:function(){var t=this;return t._q(t.a,1)&&t._q(t.b,0)&&t._q(t.c,0)&&t._q(t.d,1)&&t._q(t.e,0)&&t._q(t.f,0)},isInvertible:function(){return!this._q(this.determinant(),0)},isValid:function(){return!this._q(this.a*this.d,0)},clone:function(t){var e=this,a=new Matrix;return a.a=e.a,a.b=e.b,a.c=e.c,a.d=e.d,a.e=e.e,a.f=e.f,t||(a.context=e.context),a},isEqual:function(t){var e=this,a=e._q;return a(e.a,t.a)&&a(e.b,t.b)&&a(e.c,t.c)&&a(e.d,t.d)&&a(e.e,t.e)&&a(e.f,t.f)},toArray:function(){return[this.props[0],this.props[1],this.props[2],this.props[3],this.props[4],this.props[5]]},toCSS:function(){return this.cssParts[1]=this.props.join(","),this.cssParts.join("")},toJSON:function(){var t=this;return'{"a":'+t.a+',"b":'+t.b+',"c":'+t.c+',"d":'+t.d+',"e":'+t.e+',"f":'+t.f+"}"},toString:function(){return""+this.toArray()},_q:function(t,e){return Math.abs(t-e)<1e-14},_x:function(){return this.context&&this.context.setTransform(this.a,this.b,this.c,this.d,this.e,this.f),this}},void 0===CanvasRenderingContext2D.prototype.ellipse&&(CanvasRenderingContext2D.prototype.ellipse=function(t,e,a,i,s,r,n,o){this.save(),this.translate(t,e),this.rotate(s),this.scale(a,i),this.arc(0,0,1,r,n,o),this.restore()}),("function"!=typeof Path2D||"function"!=typeof Path2D.prototype.addPath||"function"!=typeof Path2D.prototype.ellipse)&&!function(){function t(t){if(this.ops_=[],void 0!==t)if("string"==typeof t)try{this.ops_=parser.parse(t)}catch(e){}else{if(!t.hasOwnProperty("ops_"))throw"Error: "+typeof t+"is not a valid argument to Path";this.ops_=t.ops_.slice(0)}}function e(t){return function(){var e,a=arguments.length,i=[];for(e=0;a>e;e+=1)i.push(arguments[e]);this.ops_.push({type:t,args:i})}}for(var a=CanvasRenderingContext2D.prototype,i=["closePath","moveTo","lineTo","quadraticCurveTo","bezierCurveTo","rect","arc","arcTo","ellipse"],s=0;s<i.length;s++){var r=i[s];t.prototype[r]=e(r)}t.prototype.addPath=function(t,e){var a=!1;!e||1==e.a&&0==e.b&&0==e.c&&1==e.d&&0==e.e&&0==e.f||(a=!0,this.ops_.push({type:"save",args:[]}),this.ops_.push({type:"transform",args:[e.a,e.b,e.c,e.d,e.e,e.f]})),this.ops_=this.ops_.concat(t.ops_),a&&this.ops_.push({type:"restore",args:[]})};var n=a.fill,o=a.stroke,h=a.clip;a.fill=function(e){if(e instanceof t){this.beginPath();for(var i=0,s=e.ops_.length;s>i;i++){var r=e.ops_[i];a[r.type].apply(this,r.args)}s=arguments.length;var o=[];for(i=1;s>i;i+=1)o.push(arguments[i]);n.apply(this,o)}else n.apply(this,arguments)},a.stroke=function(e){if(e instanceof t){this.beginPath();for(var i=0,s=e.ops_.length;s>i;i++){var r=e.ops_[i];a[r.type].apply(this,r.args)}o.call(this)}else o.call(this)},a.clip=function(e){if(e instanceof t){this.beginPath();for(var i=0,s=e.ops_.length;s>i;i++){var r=e.ops_[i];a[r.type].apply(this,r.args)}s=arguments.length;var n=[];for(i=1;s>i;i+=1)n.push(arguments[i]);h.apply(this,n)}else h.apply(this,arguments)},Path2D=t}();var MatrixManager=matrixManagerFunction;!function(){for(var t=0,e=["ms","moz","webkit","o"],a=0;a<e.length&&!window.requestAnimationFrame;++a)window.requestAnimationFrame=window[e[a]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e[a]+"CancelAnimationFrame"]||window[e[a]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(e){var a=(new Date).getTime(),i=Math.max(0,16-(a-t)),s=window.setTimeout(function(){e(a+i)},i);return t=a+i,s}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)})}();var subframeEnabled=!1,cachedColors={},rgbToHex=function(){var t,e,a=[];
+for(t=0;256>t;t+=1)e=t.toString(16),a[t]=1==e.length?"0"+e:e;return function(t,e,i){return 0>t&&(t=0),0>e&&(e=0),0>i&&(i=0),"#"+a[t]+a[e]+a[i]}}(),fillColorToString=function(){var t=[];return function(e,a){return t[e[0]]||(t[e[0]]=[]),t[e[0]][e[1]]||(t[e[0]][e[1]]=[]),t[e[0]][e[1]][e[2]]||(void 0!==a&&(e[3]=a),t[e[0]][e[1]][e[2]]="rgba("+e.join(",")+")"),t[e[0]][e[1]][e[2]]}}(),bez=bezFunction(),dataManager=dataFunctionManager();SVGRenderer.prototype.buildItems=function(t,e,a){var i,s=0,r=t.length;for(a||(a=this.elements),e||(e=this.animationItem.container),i=r-1;i>=0;i--)if("StillLayer"==t[i].type)s++,a[i]=this.createImage(t[i],e);else if("PreCompLayer"==t[i].type){a[i]=this.createComp(t[i],e);var n=[];this.buildItems(t[i].layers,a[i].getDomElement(),n),a[i].setElements(n)}else a[i]="SolidLayer"==t[i].type?this.createSolid(t[i],e):"ShapeLayer"==t[i].type?this.createShape(t[i],e):"TextLayer"==t[i].type?this.createText(t[i],e):this.createBase(t[i],e)},SVGRenderer.prototype.createBase=function(t,e){return new BaseElement(t,this.animationItem,e,this.globalData)},SVGRenderer.prototype.createShape=function(t,e){return new IShapeElement(t,this.animationItem,e,this.globalData)},SVGRenderer.prototype.createText=function(t,e){return new ITextElement(t,this.animationItem,e,this.globalData)},SVGRenderer.prototype.createImage=function(t,e){return new IImageElement(t,this.animationItem,e,this.globalData)},SVGRenderer.prototype.createComp=function(t,e){return new ICompElement(t,this.animationItem,e,this.globalData)},SVGRenderer.prototype.createSolid=function(t,e){return new ISolidElement(t,this.animationItem,e,this.globalData)},SVGRenderer.prototype.configAnimation=function(t){this.animationItem.container=document.createElementNS(svgNS,"svg"),this.animationItem.container.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.animationItem.container.setAttribute("width",t.animation.compWidth),this.animationItem.container.setAttribute("height",t.animation.compHeight),this.animationItem.container.setAttribute("viewBox","0 0 "+t.animation.compWidth+" "+t.animation.compHeight),this.animationItem.container.setAttribute("preserveAspectRatio","xMidYMid meet"),this.animationItem.container.style.width="100%",this.animationItem.container.style.height="100%",this.animationItem.container.style.transformOrigin=this.animationItem.container.style.mozTransformOrigin=this.animationItem.container.style.webkitTransformOrigin=this.animationItem.container.style["-webkit-transform"]="0px 0px 0px",this.animationItem.wrapper.appendChild(this.animationItem.container);var e=document.createElementNS(svgNS,"defs");this.globalData.defs=e,this.animationItem.container.appendChild(e);var a=document.createElementNS(svgNS,"clipPath"),i=document.createElementNS(svgNS,"rect");i.setAttribute("width",t.animation.compWidth),i.setAttribute("height",t.animation.compHeight),i.setAttribute("x",0),i.setAttribute("y",0),a.setAttribute("id","animationMask"),a.appendChild(i);var s=document.createElementNS(svgNS,"g");s.setAttribute("clip-path","url(#animationMask)"),this.animationItem.container.appendChild(s),e.appendChild(a),this.animationItem.container=s,this.layers=t.animation.layers},SVGRenderer.prototype.buildStage=function(t,e,a){var i,s,r=e.length;for(a||(a=this.elements),i=r-1;i>=0;i--)s=e[i],s.parent&&this.buildItemParenting(s,a[i],e,s.parent,a),a[i].setMainElement(),"PreCompLayer"==s.type&&this.buildStage(a[i].getComposingElement(),s.layers,a[i].getElements())},SVGRenderer.prototype.buildItemParenting=function(t,e,a,i,s){t.parents||(t.parents=[]);for(var r=0,n=a.length;n>r;){if(a[r].layerName==i){e.getHierarchy().push(s[r]),a[r].parent&&this.buildItemParenting(t,e,a,a[r].parent,s);break}r+=1}},SVGRenderer.prototype.updateContainerSize=function(){},SVGRenderer.prototype.renderFrame=function(t){if(this.lastFrame!=t){this.lastFrame=t,this.globalData.frameNum=t;var e,a=this.layers.length;for(e=0;a>e;e++)this.elements[e].prepareFrame(t-this.layers[e].startTime);for(e=0;a>e;e++)this.elements[e].renderFrame(t-this.layers[e].startTime)}},CanvasRenderer.prototype.buildItems=function(t,e){e||(e=this.elements);var a,i=0,s=t.length;for(a=0;s>a;a++)if("StillLayer"==t[a].type)i++,e.push(this.createImage(t[a]));else if("PreCompLayer"==t[a].type){e.push(this.createComp(t[a]));var r=[];this.buildItems(t[a].layers,r),e[e.length-1].setElements(r)}else e.push("SolidLayer"==t[a].type?this.createSolid(t[a]):"ShapeLayer"==t[a].type?this.createShape(t[a]):"TextLayer"==t[a].type?this.createText(t[a]):this.createBase(t[a]))},CanvasRenderer.prototype.createBase=function(t){return new CVBaseElement(t,this.globalData)},CanvasRenderer.prototype.createShape=function(t){return new CVShapeElement(t,this.globalData)},CanvasRenderer.prototype.createText=function(t){return new CVTextElement(t,this.globalData)},CanvasRenderer.prototype.createImage=function(t){return new CVImageElement(t,this.globalData)},CanvasRenderer.prototype.createComp=function(t){return new CVCompElement(t,this.globalData)},CanvasRenderer.prototype.createSolid=function(t){return new CVSolidElement(t,this.globalData)},CanvasRenderer.prototype.configAnimation=function(t){this.animationItem.wrapper?(this.animationItem.container=document.createElement("canvas"),this.animationItem.container.style.width="100%",this.animationItem.container.style.height="100%",this.animationItem.container.style.transformOrigin=this.animationItem.container.style.mozTransformOrigin=this.animationItem.container.style.webkitTransformOrigin=this.animationItem.container.style["-webkit-transform"]="0px 0px 0px",this.animationItem.wrapper.appendChild(this.animationItem.container),this.canvasContext=this.animationItem.container.getContext("2d")):this.canvasContext=this.renderConfig.context,this.globalData.canvasContext=this.canvasContext,this.layers=t.animation.layers,this.transformCanvas={},this.transformCanvas.w=t.animation.compWidth,this.transformCanvas.h=t.animation.compHeight,this.updateContainerSize()},CanvasRenderer.prototype.updateContainerSize=function(){var t,e;if(this.animationItem.wrapper&&this.animationItem.container?(t=this.animationItem.wrapper.offsetWidth,e=this.animationItem.wrapper.offsetHeight,this.animationItem.container.setAttribute("width",t),this.animationItem.container.setAttribute("height",e)):(t=this.canvasContext.canvas.width,e=this.canvasContext.canvas.height),"fit"==this.renderConfig.scaleMode){var a=t/e,i=this.transformCanvas.w/this.transformCanvas.h;i>a?(this.transformCanvas.sx=t/this.transformCanvas.w,this.transformCanvas.sy=t/this.transformCanvas.w,this.transformCanvas.tx=0,this.transformCanvas.ty=(e-this.transformCanvas.h*(t/this.transformCanvas.w))/2):(this.transformCanvas.sx=e/this.transformCanvas.h,this.transformCanvas.sy=e/this.transformCanvas.h,this.transformCanvas.tx=(t-this.transformCanvas.w*(e/this.transformCanvas.h))/2,this.transformCanvas.ty=0)}else this.transformCanvas.sx=1,this.transformCanvas.sy=1,this.transformCanvas.tx=0,this.transformCanvas.ty=0},CanvasRenderer.prototype.buildStage=function(t,e,a){a||(a=this.elements);var i,s,r=e.length;for(i=r-1;i>=0;i--)s=e[i],s.parent&&this.buildItemHierarchy(s,a[i],e,s.parent,a),"PreCompLayer"==s.type&&this.buildStage(null,s.layers,a[i].getElements())},CanvasRenderer.prototype.buildItemHierarchy=function(t,e,a,i,s){for(var r=0,n=a.length;n>r;){if(a[r].layerName==i){e.getHierarchy().push(s[r]),void 0===a[r].parent||this.buildItemHierarchy(t,e,a,a[r].parent,s);break}r+=1}},CanvasRenderer.prototype.prepareFrame=function(t){var e,a=this.elements.length;for(e=0;a>e;e++)this.elements[e].prepareFrame(t-this.layers[e].startTime)},CanvasRenderer.prototype.draw=function(){var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.elements[t].draw()},CanvasRenderer.prototype.renderFrame=function(t){(this.lastFrame!=t||this.renderConfig.clearCanvas!==!0)&&(this.lastFrame=t,this.globalData.frameNum=t,this.renderConfig.clearCanvas===!0?this.canvasContext.canvas.width=this.canvasContext.canvas.width:this.canvasContext.save(),this.canvasContext.transform(this.transformCanvas.sx,0,0,this.transformCanvas.sy,this.transformCanvas.tx,this.transformCanvas.ty),this.canvasContext.beginPath(),this.canvasContext.rect(0,0,this.transformCanvas.w,this.transformCanvas.h),this.canvasContext.clip(),this.prepareFrame(t),this.draw(),this.renderConfig.clearCanvas!==!0&&this.canvasContext.restore())},MaskElement.prototype.init=function(){this.registeredEffects=[],this.masksProperties=this.data.masksProperties,this.totalMasks=this.masksProperties.length;var t=this.element.maskedElement,e=this.globalData.defs,a=0,i=this.masksProperties.length;this.layerSize=this.element.getLayerSize(),this.maskElement=document.createElementNS(svgNS,"clipPath");var s,r=this.data.masksProperties;for(a=0;i>a;a++)r[a].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath()),s=document.createElementNS(svgNS,"path"),r[a].cl?s.setAttribute("fill","#ffffff"):(s.setAttribute("fill","none"),s.setAttribute("stroke","#ffffff"),s.setAttribute("stroke-width","1"),s.setAttribute("stroke-miterlimit","10")),s.setAttribute("clip-rule","nonzero"),this.maskElement.appendChild(s),r[a].elem=s,r[a].lastPath="";var n=randomString(10);this.maskElement.setAttribute("id",n),t.setAttribute("clip-path","url(#"+n+")"),e.appendChild(this.maskElement)},MaskElement.prototype.renderFrame=function(t){var e,a=this.data.masksProperties.length;for(e=0;a>e;e++)this.drawPath(this.data.masksProperties[e],this.data.masksProperties[e].paths[t].pathNodes)},MaskElement.prototype.processMaskFromEffects=function(t,e){var a,i=this.registeredEffects.length;for(a=0;i>a;a++)this.registeredEffects[a].renderMask(t,e)},MaskElement.prototype.registerEffect=function(t){this.registeredEffects.push(t)},MaskElement.prototype.getMaskelement=function(){return this.maskElement},MaskElement.prototype.createLayerSolidPath=function(){var t="M0,0 ";return t+="h"+this.layerSize.w,t+="v"+this.layerSize.h,t+="h"+-this.layerSize.w,t+="v"+-this.layerSize.h},MaskElement.prototype.drawPath=function(t,e){var a="";if(e.__renderedString)a=e.__renderedString;else{var i,s=e.v.length;for(i=1;s>i;i+=1)1==i&&(a+=" M"+e.v[0][0]+","+e.v[0][1]),a+=" C"+e.o[i-1][0]+","+e.o[i-1][1]+" "+e.i[i][0]+","+e.i[i][1]+" "+e.v[i][0]+","+e.v[i][1];t.cl&&(a+=" C"+e.o[i-1][0]+","+e.o[i-1][1]+" "+e.i[0][0]+","+e.i[0][1]+" "+e.v[0][0]+","+e.v[0][1]),e.__renderedString=a}t.lastPath!==a&&(t.inv?t.elem.setAttribute("d",this.solidPath+a):t.elem.setAttribute("d",a),t.lastPath=a)};var BaseElement=function(t,e,a,i){this.animationItem=e,this.globalData=i,this.data=t,this.ownMatrix=new Matrix,this.finalTransform={mat:new Matrix,op:1},this.renderedFrames=[],this.lastData={},this.parentContainer=a,this.init()};BaseElement.prototype.init=function(){this.createElements(),this.data.hasMask&&this.addMasks(this.data),this.data.eff&&this.createEffectsManager(this.data)},BaseElement.prototype.createElements=function(){this.data.hasMask?(this.layerElement=document.createElementNS(svgNS,"g"),this.parentContainer.appendChild(this.layerElement),this.maskedElement=this.layerElement):this.layerElement=this.parentContainer},BaseElement.prototype.prepareFrame=function(t){this.currentAnimData=this.data.renderedData[t].an,this.data.renderedFrame.tr=this.currentAnimData.matrixValue;var e=this.currentAnimData.matrixArray;this.ownMatrix.reset(),this.ownMatrix.transform(e[0],e[1],e[2],e[3],e[4],e[5]),this.ownMatrix.translate(-this.currentAnimData.tr.a[0],-this.currentAnimData.tr.a[1])},BaseElement.prototype.renderFrame=function(t,e){if("NullLayer"!=this.data.type){if(this.data.inPoint-this.data.startTime<=t&&this.data.outPoint-this.data.startTime>=t?(this.isVisible!==!0&&(this.isVisible=!0),this.finalTransform.opacity=1):(this.isVisible!==!1&&(this.isVisible=!1),this.finalTransform.opacity=0),this.data.eff&&this.effectsManager.renderFrame(t,this.currentAnimData.mk),t===this.data.renderedFrame.num)return this.isVisible;if(this.data.hasMask&&this.maskManager.renderFrame(t),this.finalTransform.opacity*=this.currentAnimData.tr.o,e&&(this.finalTransform.mat.reset(),i=e.mat.props,this.finalTransform.mat.transform(i[0],i[1],i[2],i[3],i[4],i[5]),this.finalTransform.opacity*=e.opacity),this.hierarchy){var a,i,s=this.hierarchy.length;for(e||this.finalTransform.mat.reset(),a=s-1;a>=0;a-=1)i=this.hierarchy[a].ownMatrix.props,this.finalTransform.mat.transform(i[0],i[1],i[2],i[3],i[4],i[5]);i=this.ownMatrix.props,this.finalTransform.mat.transform(i[0],i[1],i[2],i[3],i[4],i[5])}else this.isVisible&&(e?(i=this.ownMatrix.props,this.finalTransform.mat.transform(i[0],i[1],i[2],i[3],i[4],i[5])):this.finalTransform.mat=this.ownMatrix);if(this.data.hasMask){this.renderedFrames[this.globalData.frameNum]||(this.renderedFrames[this.globalData.frameNum]={tr:"matrix("+this.finalTransform.mat.props.join(",")+")",o:this.finalTransform.opacity});var r=this.renderedFrames[this.globalData.frameNum];this.lastData.tr!=r.tr&&(this.lastData.tr=r.tr,this.layerElement.setAttribute("transform",r.tr)),this.lastData.o!==r.o&&(this.lastData.o=r.o,this.layerElement.setAttribute("opacity",r.o))}return this.isVisible}},BaseElement.prototype.getDomElement=function(){return this.layerElement},BaseElement.prototype.setMainElement=function(){this.mainElement=this.layerElement},BaseElement.prototype.getMaskManager=function(){return this.maskManager},BaseElement.prototype.addMasks=function(t){var e={data:{value:t},element:{value:this},globalData:{value:this.globalData}};this.maskManager=createElement(MaskElement,null,e)},BaseElement.prototype.createEffectsManager=function(t){var e={effects:{value:t.eff},element:{value:this}};this.effectsManager=createElement(EffectsManager,null,e)},BaseElement.prototype.getType=function(){return this.type},BaseElement.prototype.getLayerSize=function(){return"TextLayer"==this.data.type?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}},BaseElement.prototype.getHierarchy=function(){return this.hierarchy||(this.hierarchy=[]),this.hierarchy},BaseElement.prototype.hide=function(){},createElement(BaseElement,ICompElement),ICompElement.prototype.getComposingElement=function(){return this.layerElement},ICompElement.prototype.hide=function(){if(!this.hidden){var t,e=this.elements.length;for(t=0;e>t;t+=1)this.elements[t].hide();this.hidden=!0}},ICompElement.prototype.renderFrame=function(t,e){var a=this.parent.renderFrame.call(this,t,e);if(a===!1)return void this.hide();this.hidden=!1;var i,s=this.layers.length,r=this.data.tm?this.data.tm[t]<0?0:t>=this.data.tm.length?this.data.tm[this.data.tm.length-1]:this.data.tm[t]:t;for(i=0;s>i;i+=1)this.elements[i].prepareFrame(r-this.layers[i].startTime);for(i=0;s>i;i+=1)this.data.hasMask?this.elements[i].renderFrame(r-this.layers[i].startTime):this.elements[i].renderFrame(r-this.layers[i].startTime,this.finalTransform)},ICompElement.prototype.setElements=function(t){this.elements=t},ICompElement.prototype.getElements=function(){return this.elements},createElement(BaseElement,IImageElement),IImageElement.prototype.createElements=function(){var t=this,e=function(){t.image.setAttributeNS("http://www.w3.org/1999/xlink","href",t.path+t.assets[t.data.assetId].path),t.maskedElement=t.image,t.animationItem.elementLoaded()},a=new Image;a.addEventListener("load",e,!1),a.addEventListener("error",e,!1),a.src=this.path+this.assets[this.data.assetId].path,this.parent.createElements.call(this),this.image=document.createElementNS(svgNS,"image"),this.image.setAttribute("width",this.data.width+"px"),this.image.setAttribute("height",this.data.height+"px"),this.layerElement.appendChild(this.image)},IImageElement.prototype.hide=function(){this.hidden||this.data.hasMask||(this.image.setAttribute("opacity","0"),this.hidden=!0)},IImageElement.prototype.renderFrame=function(t,e){var a=this.parent.renderFrame.call(this,t,e);if(a===!1)return void this.hide();if(this.hidden=!1,!this.data.hasMask){this.renderedFrames[this.globalData.frameNum]||(this.renderedFrames[this.globalData.frameNum]={tr:"matrix("+this.finalTransform.mat.props.join(",")+")",o:this.finalTransform.opacity});var i=this.renderedFrames[this.globalData.frameNum];this.lastData.tr!=i.tr&&(this.lastData.tr=i.tr,this.image.setAttribute("transform",i.tr)),this.lastData.o!==i.o&&(this.lastData.o=i.o,this.image.setAttribute("opacity",i.o))}},createElement(BaseElement,IShapeElement),IShapeElement.prototype.createElements=function(){this.parent.createElements.call(this),this.mainShape=new ShapeItemElement(this.data.shapes,this.layerElement,this.globalData)},IShapeElement.prototype.renderFrame=function(t,e){var a=this.parent.renderFrame.call(this,t,e);return a===!1?void this.hide():void this.renderShapes(t)},IShapeElement.prototype.hide=function(){this.hidden||(this.mainShape.hideShape(),this.hidden=!0)},IShapeElement.prototype.renderShapes=function(t){this.hidden=!1,this.data.hasMask?this.mainShape.renderShape(t):this.mainShape.renderShape(t,this.finalTransform)},ShapeItemElement.prototype.searchShapes=function(t,e){var a,i,s,r=t.length-1,n=[];for(a=r;a>=0;a-=1)if("fl"==t[a].ty||"st"==t[a].ty){e[a]={renderedFrames:[],lastData:{c:"",o:-1,w:""}};var o=document.createElementNS(svgNS,"path");this.shape.appendChild(o),this.stylesList.push({pathElement:o,type:t[a].ty,d:""}),e[a].style=this.stylesList[this.stylesList.length-1],n.push(e[a].style)}else if("gr"==t[a].ty)e[a]={it:[]},this.searchShapes(t[a].it,e[a].it);else if("tr"==t[a].ty)e[a]={transform:{mat:new Matrix,opacity:1}};else if("sh"==t[a].ty||"rc"==t[a].ty||"el"==t[a].ty)for(e[a]={elements:[],renderedFrames:[],styles:[],lastData:{d:"",o:"",tr:""}},s=this.stylesList.length,i=0;s>i;i+=1)this.stylesList[i].closed||(e[a].styles.push(this.stylesList[i]),"st"==this.stylesList[i].type&&(this.stylesList[i].pathElement.setAttribute("fill-opacity",0),this.stylesList[i].pathElement.setAttribute("stroke-linejoin","round"),this.stylesList[i].pathElement.setAttribute("stroke-linecap","round")));for(r=n.length,a=0;r>a;a+=1)n[a].closed=!0},ShapeItemElement.prototype.getElement=function(){return this.shape},ShapeItemElement.prototype.hideShape=function(){var t,e=this.stylesList.length;for(t=e-1;t>=0;t-=1)this.stylesList[t].pathElement.setAttribute("d","")},ShapeItemElement.prototype.renderShape=function(t,e,a,i){var s,r;if(!a)for(a=this.data,r=this.stylesList.length,s=0;r>s;s+=1)this.stylesList[s].d="";i||(i=this.viewData),this.frameNum=t,r=a.length-1;var n,o;for(n=e,s=r;s>=0;s-=1)if("tr"==a[s].ty){var h=a[s].renderedData[t].mtArr;if(n=i[s].transform,o=n.mat,o.reset(),e){var l=e.mat.props;n.opacity=e.opacity,n.opacity*=a[s].renderedData[t].o,o.transform(l[0],l[1],l[2],l[3],l[4],l[5])}else n.opacity=a[s].renderedData[t].o;o.transform(h[0],h[1],h[2],h[3],h[4],h[5]).translate(-a[s].renderedData[t].a[0],-a[s].renderedData[t].a[1])}else"sh"==a[s].ty?this.renderPath(a[s],i[s],t,n):"el"==a[s].ty?this.renderPath(a[s],i[s],t,n):"rc"==a[s].ty?a[s].trimmed?this.renderPath(a[s],i[s],t,n):this.renderRect(a[s],i[s],t,n):"fl"==a[s].ty?this.renderFill(a[s],i[s],t,n):"st"==a[s].ty?this.renderStroke(a[s],i[s],t,n):"gr"==a[s].ty?this.renderShape(t,n,a[s].it,i[s].it):"tm"==a[s].ty;for(r=this.stylesList.length,s=0;r>s;s+=1)this.stylesList[s].pathElement.setAttribute("d",this.stylesList[s].d)},ShapeItemElement.prototype.renderPath=function(t,e,a,i){if(!e.renderedFrames[this.globalData.frameNum]){var s=t.renderedData[a].path.pathNodes;if(!s.v)return;var r,n=s.v.length,o=s.s?s.s:[],h="";for(r=1;n>r;r+=1)o[r-1]?h+=" M"+i.mat.applyToPointStringified(o[r-1][0],o[r-1][1]):1==r&&(h+=" M"+i.mat.applyToPointStringified(s.v[0][0],s.v[0][1])),h+=" C"+i.mat.applyToPointStringified(s.o[r-1][0],s.o[r-1][1])+" "+i.mat.applyToPointStringified(s.i[r][0],s.i[r][1])+" "+i.mat.applyToPointStringified(s.v[r][0],s.v[r][1]);!t.closed||t.trimmed&&!s.c||(h+=" C"+i.mat.applyToPointStringified(s.o[r-1][0],s.o[r-1][1])+" "+i.mat.applyToPointStringified(s.i[0][0],s.i[0][1])+" "+i.mat.applyToPointStringified(s.v[0][0],s.v[0][1])),e.renderedFrames[this.globalData.frameNum]={dTr:h}}var l=e.renderedFrames[this.globalData.frameNum];for(n=e.styles.length,r=0;n>r;r+=1)e.styles[r].d+=l.dTr},ShapeItemElement.prototype.renderFill=function(t,e,a,i){var s=t.renderedData[a],r=e.style;e.renderedFrames[this.globalData.frameNum]||(e.renderedFrames[this.globalData.frameNum]={c:s.color,o:s.opacity*i.opacity});var n=e.renderedFrames[this.globalData.frameNum],o=n.c,h=n.o;e.lastData.c!=o&&r.pathElement.setAttribute("fill",o),e.lastData.o!=h&&r.pathElement.setAttribute("fill-opacity",h),e.lastData.c=o,e.lastData.o=h},ShapeItemElement.prototype.renderStroke=function(t,e,a,i){var s=t.renderedData[a],r=e.style;e.renderedFrames[this.globalData.frameNum]||(e.renderedFrames[this.globalData.frameNum]={c:s.color,o:s.opacity*i.opacity,w:s.width},s.dashes&&(e.renderedFrames[this.globalData.frameNum].d=s.dashes));var n=e.renderedFrames[this.globalData.frameNum],o=n.c,h=n.o,l=n.w,p=n.d;if(p){var m,d=p.length,u="",c="";for(m=0;d>m;m+=1)"o"!=p[m].n?u+=" "+p[m].v:c+=p[m].v}e.lastData.c!=o&&r.pathElement.setAttribute("stroke",o),e.lastData.o!=h&&r.pathElement.setAttribute("stroke-opacity",h),e.lastData.w!=l&&r.pathElement.setAttribute("stroke-width",l),p&&(e.lastData.da!=u&&r.pathElement.setAttribute("stroke-dasharray",u),e.lastData["do"]!=c&&r.pathElement.setAttribute("stroke-dashoffset",c)),e.lastData.c=o,e.lastData.o=h,e.lastData.w=l,p&&(e.lastData.da=u,e.lastData["do"]=c)},createElement(BaseElement,ISolidElement),ISolidElement.prototype.createElements=function(){this.parent.createElements.call(this);var t=document.createElementNS(svgNS,"rect");t.setAttribute("width",this.data.width),t.setAttribute("height",this.data.height),t.setAttribute("fill",this.data.color),this.layerElement.appendChild(t),this.rectElement=t},ISolidElement.prototype.hide=function(){this.hidden||this.data.hasMask||(this.rectElement.setAttribute("opacity","0"),this.hidden=!0)},ISolidElement.prototype.renderFrame=function(t,e){var a=this.parent.renderFrame.call(this,t,e);if(a===!1)return void this.hide();if(this.hidden&&(this.lastData.o=-1,this.hidden=!1),!this.data.hasMask){this.renderedFrames[this.globalData.frameNum]||(this.renderedFrames[this.globalData.frameNum]={tr:"matrix("+this.finalTransform.mat.props.join(",")+")",o:this.finalTransform.opacity});var i=this.renderedFrames[this.globalData.frameNum];this.lastData.tr!=i.tr&&(this.lastData.tr=i.tr,this.rectElement.setAttribute("transform",i.tr)),this.lastData.o!==i.o&&(this.lastData.o=i.o,this.rectElement.setAttribute("opacity",i.o))}},createElement(BaseElement,ITextElement),ITextElement.prototype.createElements=function(){this.svgElem=document.createElementNS(svgNS,"g");var t=document.createElementNS(svgNS,"text");t.textContent=this.data.textData.text,t.setAttribute("fill",this.data.textData.fillColor),t.setAttribute("x","0"),t.setAttribute("y",this.data.textData.height-(this.data.textData.fontSize-this.data.textData.height)/2),this.svgElem.setAttribute("width",this.data.textData.width),this.svgElem.setAttribute("height",this.data.textData.height),this.svgElem.style.transform=this.svgElem.style.webkitTransform="translate("+this.data.textData.xOffset+"px,"+this.data.textData.yOffset+"px)",t.setAttribute("font-size",this.data.textData.fontSize),t.setAttribute("font-family","Arial, sans-serif"),this.svgElem.appendChild(t),this.parent.createElements.call(this),this.anchorElement.appendChild(this.svgElem),this.maskedElement=t},CVBaseElement.prototype.init=function(){this.createElements(),this.data.hasMask&&this.addMasks(this.data),this.data.eff&&this.createEffectsManager(this.data)},CVBaseElement.prototype.createElements=function(){},CVBaseElement.prototype.prepareFrame=function(t){return this.data.inPoint-this.data.startTime<=t&&this.data.outPoint-this.data.startTime>=t?(this.renderFrame=!0,this.currentAnimData=this.data.renderedData[t].an,void(this.data.hasMask&&this.maskManager.prepareFrame(t))):(this.renderFrame=!1,this.currentAnimData=this.data.renderedData[t].an,!1)},CVBaseElement.prototype.draw=function(t){if("NullLayer"!=this.data.type){if(t!==!1&&this.canvasContext.save(),!this.renderFrame)return!1;var e,a=this.canvasContext;if(this.hierarchy){var i,s,r=this.hierarchy.length;for(i=r-1;i>=0;i-=1)s=this.hierarchy[i].getCurrentAnimData(),e=s.matrixArray,a.transform(e[0],e[1],e[2],e[3],e[4],e[5]),a.translate(-s.tr.a[0],-s.tr.a[1])}a.globalAlpha=a.globalAlpha*this.currentAnimData.tr.o,e=this.currentAnimData.matrixArray,a.transform(e[0],e[1],e[2],e[3],e[4],e[5]),a.translate(-this.currentAnimData.tr.a[0],-this.currentAnimData.tr.a[1]),this.data.hasMask&&this.maskManager.draw(),t!==!1&&this.canvasContext.restore()}},CVBaseElement.prototype.getCurrentAnimData=function(){return this.currentAnimData},CVBaseElement.prototype.addMasks=function(t){var e={data:{value:t},element:{value:this}};this.maskManager=createElement(CVMaskElement,null,e)},CVBaseElement.prototype.createEffectsManager=function(t){var e={effects:{value:t.eff},element:{value:this}};this.effectsManager=createElement(EffectsManager,null,e)},CVBaseElement.prototype.getType=function(){return this.type},CVBaseElement.prototype.getHierarchy=function(){return this.hierarchy||(this.hierarchy=[]),this.hierarchy},CVBaseElement.prototype.getLayerSize=function(){return"TextLayer"==this.data.type?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}},createElement(CVBaseElement,CVCompElement),CVCompElement.prototype.prepareFrame=function(t){var e=this.parent.prepareFrame.call(this,t);if(e!==!1){var a,i=this.elements.length,s=this.data.tm?this.data.tm[t]<0?0:t>=this.data.tm.length?this.data.tm[this.data.tm.length-1]:this.data.tm[t]:t;for(a=0;i>a;a+=1)this.elements[a].prepareFrame(s-this.layers[a].startTime)}},CVCompElement.prototype.draw=function(){if(this.canvasContext.save(),this.parent.draw.call(this,!1)===!1)return void this.canvasContext.restore();var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.elements[t].draw();this.canvasContext.restore()},CVCompElement.prototype.setElements=function(t){this.elements=t},CVCompElement.prototype.getElements=function(){return this.elements},createElement(CVBaseElement,CVImageElement),CVImageElement.prototype.createElements=function(){var t=this,e=function(){t.animationItem.elementLoaded()},a=function(){t.failed=!0,t.animationItem.elementLoaded()};this.img=new Image,this.img.addEventListener("load",e,!1),this.img.addEventListener("error",a,!1),this.img.src=this.path+this.assets[this.data.assetId].path,this.parent.createElements.call(this)},CVImageElement.prototype.draw=function(){if(!this.failed){if(this.canvasContext.save(),this.parent.draw.call(this,!1)===!1)return void this.canvasContext.restore();var t=this.canvasContext;t.drawImage(this.img,0,0),this.canvasContext.restore()}},createElement(CVBaseElement,CVShapeElement),CVShapeElement.prototype.createElements=function(){this.parent.createElements.call(this),this.mainShape=new CVShapeItemElement(this.data.shapes,!0,this.globalData)},CVShapeElement.prototype.prepareFrame=function(t){var e=this.parent.prepareFrame.call(this,t);e!==!1&&this.mainShape.prepareFrame(t)},CVShapeElement.prototype.draw=function(){return this.canvasContext.save(),this.parent.draw.call(this,!1)===!1?void this.canvasContext.restore():(this.drawShapes(),void this.canvasContext.restore())},CVShapeElement.prototype.drawShapes=function(){this.mainShape.renderShape()},CVShapeItemElement.prototype.drawPaths=function(t){var e;if(t){var a=[];e=this.stylesList}else e=this.renderedPaths[this.globalData.frameNum];var i,s=e.length,r=this.canvasContext;for(r.save(),r.lineCap="round",r.lineJoin="round",i=0;s>i;i+=1)"stroke"==e[i].type?(r.globalAlpha*=e[i].opacity,r.strokeStyle=e[i].value,r.lineWidth=e[i].width,e[i].dasharray?(r.setLineDash(e[i].dasharray),r.lineDashOffset=e[i].dashoffset):(r.setLineDash([]),r.lineDashOffset=0),r.stroke(e[i].path),t&&(a.push({type:e[i].type,opacity:e[i].opacity,value:e[i].value,width:e[i].width,path:e[i].path}),e[i].dasharray&&(a[a.length-1].dasharray=e[i].dasharray,a[a.length-1].dashoffset=e[i].dashoffset))):"fill"==e[i].type&&(r.globalAlpha*=e[i].opacity,r.fillStyle=e[i].value,r.fill(e[i].path),t&&a.push({type:e[i].type,opacity:e[i].opacity,value:e[i].value,path:e[i].path}));r.restore(),t&&(this.renderedPaths[this.globalData.frameNum]=a)},CVShapeItemElement.prototype.prepareFrame=function(t){this.frameNum=t;var e,a=this.dataLength-1;for(e=a;e>=0;e-=1)"gr"==this.data[e].ty&&this.data[e].item.prepareFrame(t)},CVShapeItemElement.prototype.renderShape=function(t,e){if(this.renderedPaths[this.globalData.frameNum])return void this.drawPaths(!1);this.opacityMultiplier=1;var a,i;for(this.ownStylesList.length=0,this.currentStylePoolPos=0,t?this.stylesList=t:this.stylesList.length=0,e?this.currentMatrix=e:(this.currentMatrix.a=this.currentMatrix.d=1,this.currentMatrix.b=this.currentMatrix.c=this.currentMatrix.e=this.currentMatrix.f=0),i=this.dataLength-1,a=i;a>=0;a-=1)"gr"==this.data[a].ty?this.data[a].item.renderShape(this.stylesList,this.currentMatrix):"tr"==this.data[a].ty?this.renderTransform(this.data[a]):"sh"==this.data[a].ty?this.renderPath(this.data[a]):"el"==this.data[a].ty?this.renderEllipse(this.data[a]):"rc"==this.data[a].ty?this.data[a].trimmed?this.renderPath(this.data[a]):this.renderRect(this.data[a]):"fl"==this.data[a].ty?this.renderFill(this.data[a]):"st"==this.data[a].ty&&this.renderStroke(this.data[a]);if(this.mainFlag)this.drawPaths(!0);else for(i=this.ownStylesList.length,a=0;i>a;a+=1)this.ownStylesList[a].closed=!0},CVShapeItemElement.prototype.renderTransform=function(t){var e=t.renderedData[this.frameNum],a=e.mtArr;this.mat.a=a[0],this.mat.b=a[1],this.mat.c=a[2],this.mat.d=a[3],this.mat.e=a[4],this.mat.f=a[5],this.mat=this.mat.translate(-e.a[0],-e.a[1]),this.opacityMultiplier*=e.o,this.currentMatrix=this.currentMatrix.multiply(this.mat)},CVShapeItemElement.prototype.renderPath=function(t){if(t.trimmed){var e=this.canvasContext;e.lineCap="round",e.lineJoin="round"}var a=t.renderedData[this.frameNum].path,i=new Path2D,s=a.pathNodes;if(s instanceof Array&&(s=s[0]),s.v){var r,n=s.v.length,o=s.s?s.s:[];for(r=1;n>r;r+=1)o[r-1]?i.moveTo(o[r-1][0],o[r-1][1]):1==r&&i.moveTo(s.v[0][0],s.v[0][1]),i.bezierCurveTo(s.o[r-1][0],s.o[r-1][1],s.i[r][0],s.i[r][1],s.v[r][0],s.v[r][1]);!a.closed||t.trimmed&&!s.c||i.bezierCurveTo(s.o[r-1][0],s.o[r-1][1],s.i[0][0],s.i[0][1],s.v[0][0],s.v[0][1]),this.addPathToStyles(i)}},CVShapeItemElement.prototype.renderEllipse=function(t){var e=new Path2D,a=t.renderedData[this.frameNum];e.moveTo(a.p[0]+a.size[0]/2,a.p[1]),e.ellipse(a.p[0],a.p[1],a.size[0]/2,a.size[1]/2,0,0,2*Math.PI,!1),this.addPathToStyles(e)},CVShapeItemElement.prototype.renderRect=function(t){var e=new Path2D,a=t.renderedData[this.frameNum],i=a.roundness;if(0===i)e.rect(a.position[0]-a.size[0]/2,a.position[1]-a.size[1]/2,a.size[0],a.size[1]);else{var s=a.position[0]-a.size[0]/2,r=a.position[1]-a.size[1]/2,n=a.size[0],o=a.size[1];i instanceof Array&&(i=i[0]),i>n/2&&(i=n/2),i>o/2&&(i=o/2),e.moveTo(s+i,r),e.lineTo(s+n-i,r),e.quadraticCurveTo(s+n,r,s+n,r+i),e.lineTo(s+n,r+o-i),e.quadraticCurveTo(s+n,r+o,s+n-i,r+o),e.lineTo(s+i,r+o),e.quadraticCurveTo(s,r+o,s,r+o-i),e.lineTo(s,r+i),e.quadraticCurveTo(s,r,s+i,r)}this.addPathToStyles(e)},CVShapeItemElement.prototype.addPathToStyles=function(t){var e,a=this.stylesList.length,i=!0,s=0;for(e=a-1;e>=0;e-=1)this.stylesList[e].closed||("stroke"==this.stylesList[e].type?(this.stylesList[e].width>s&&this.stylesList[e].path.addPath(t,this.currentMatrix),1==this.stylesList[e].styleOpacity&&1==this.stylesList[e].opacity&&(s=this.stylesList[e].width)):i&&"fill"==this.stylesList[e].type&&(this.stylesList[e].path.addPath(t,this.currentMatrix),1==this.stylesList[e].styleOpacity&&1==this.stylesList[e].opacity&&(i=!1)))},CVShapeItemElement.prototype.renderFill=function(t){var e=t.renderedData[this.frameNum];return t.fillEnabled!==!1?(this.stylesPool[this.currentStylePoolPos].path=new Path2D,this.stylesPool[this.currentStylePoolPos].closed=!1,this.stylesPool[this.currentStylePoolPos].styleOpacity=e.opacity<1?e.opacity:1,this.stylesPool[this.currentStylePoolPos].opacity=this.opacityMultiplier,this.stylesPool[this.currentStylePoolPos].value=e.opacity<1?fillColorToString(e.color,e.opacity):fillColorToString(e.color),this.stylesList.push(this.stylesPool[this.currentStylePoolPos]),this.ownStylesList.push(this.stylesList[this.stylesList.length-1]),void(this.currentStylePoolPos+=1)):(this.stylesList.push(this.stylesPool[this.currentStylePoolPos]),this.ownStylesList.push(this.stylesList[this.stylesList.length-1]),void(this.currentStylePoolPos+=1))
+},CVShapeItemElement.prototype.renderStroke=function(t){var e=t.renderedData[this.frameNum];if(this.data.strokeEnabled!==!1){if(this.stylesPool[this.currentStylePoolPos].path=new Path2D,this.stylesPool[this.currentStylePoolPos].closed=!1,this.stylesPool[this.currentStylePoolPos].styleOpacity=e.opacity<1?e.opacity:1,this.stylesPool[this.currentStylePoolPos].width=e.width,this.stylesPool[this.currentStylePoolPos].opacity=this.opacityMultiplier,this.stylesPool[this.currentStylePoolPos].value=e.opacity<1?fillColorToString(e.color,e.opacity):fillColorToString(e.color),e.dashes){var a,i=e.dashes,s=i.length,r=[],n="";for(a=0;s>a;a+=1)"o"!=i[a].n?r.push(i[a].v):n=i[a].v;this.stylesPool[this.currentStylePoolPos].dasharray=r,this.stylesPool[this.currentStylePoolPos].dashoffset=n}return this.stylesList.push(this.stylesPool[this.currentStylePoolPos]),this.ownStylesList.push(this.stylesList[this.stylesList.length-1]),void(this.currentStylePoolPos+=1)}this.stylesList.push(this.stylesPool[this.currentStylePoolPos]),this.ownStylesList.push(this.stylesList[this.stylesList.length-1]),this.currentStylePoolPos+=1},createElement(CVBaseElement,CVSolidElement),CVSolidElement.prototype.draw=function(){if(this.canvasContext.save(),this.parent.draw.call(this,!1)===!1)return void this.canvasContext.restore();var t=this.canvasContext;t.fillStyle=this.data.color,t.fillRect(0,0,this.data.width,this.data.height),this.canvasContext.restore()},createElement(CVBaseElement,CVTextElement),CVTextElement.prototype.createElements=function(){this.svgElem=document.createElementNS(svgNS,"g");var t=document.createElementNS(svgNS,"text");t.textContent=this.data.textData.text,t.setAttribute("fill",this.data.textData.fillColor),t.setAttribute("x","0"),t.setAttribute("y",this.data.textData.height-(this.data.textData.fontSize-this.data.textData.height)/2),this.svgElem.setAttribute("width",this.data.textData.width),this.svgElem.setAttribute("height",this.data.textData.height),this.svgElem.style.transform=this.svgElem.style.webkitTransform="translate("+this.data.textData.xOffset+"px,"+this.data.textData.yOffset+"px)",t.setAttribute("font-size",this.data.textData.fontSize),t.setAttribute("font-family","Arial, sans-serif"),this.svgElem.appendChild(t),this.parent.createElements.call(this),this.anchorElement.appendChild(this.svgElem),this.maskedElement=t},CVMaskElement.prototype.init=function(){this.registeredEffects=[],this.masksProperties=this.data.masksProperties,this.totalMasks=this.masksProperties.length,this.ctx=this.element.canvasContext,this.layerSize=this.element.getLayerSize()},CVMaskElement.prototype.prepareFrame=function(t){this.frameNum=t},CVMaskElement.prototype.draw=function(){var t,e=this.data.masksProperties.length;for(this.ctx.beginPath(),t=0;e>t;t++)this.masksProperties[t].inv?this.createInvertedMask(this.masksProperties[t],this.frameNum):this.drawShape(this.ctx,this.data.masksProperties[t].paths[this.frameNum].pathNodes);this.ctx.closePath(),this.ctx.clip()},CVMaskElement.prototype.drawShape=function(t,e){var a,i=e.v.length;for(t.moveTo(e.v[0][0],e.v[0][1]),a=1;i>a;a++)t.bezierCurveTo(e.o[a-1][0],e.o[a-1][1],e.i[a][0],e.i[a][1],e.v[a][0],e.v[a][1]);t.bezierCurveTo(e.o[a-1][0],e.o[a-1][1],e.i[0][0],e.i[0][1],e.v[0][0],e.v[0][1])},CVMaskElement.prototype.createInvertedMask=function(){};var animationManager=function(){function t(t){if(!t)return null;for(var e=0;v>e;){if(f[e].elem==t&&null!==f[e].elem)return f[e].animation;e+=1}var a=new AnimationItem;return a.setData(t),f.push({elem:t,animation:a}),v+=1,a}function e(t){var e=new AnimationItem;return e.setParams(t),f.push({elem:null,animation:e}),v+=1,e}function a(t,e){var a;for(a=0;v>a;a+=1)f[a].animation.setSpeed(t,e)}function i(t,e){var a;for(a=0;v>a;a+=1)f[a].animation.setDirection(t,e)}function s(t){var e;for(e=0;v>e;e+=1)f[e].animation.play(t)}function r(t,e){g=!1,y=Date.now();var a;for(a=0;v>a;a+=1)f[a].animation.moveFrame(t,e)}function n(){var t,e=Date.now(),a=e-y;for(t=0;v>t;t+=1)f[t].animation.advanceTime(a);y=e,requestAnimationFrame(n)}function o(t){var e;for(e=0;v>e;e+=1)f[e].animation.pause(t)}function h(t,e,a){var i;for(i=0;v>i;i+=1)f[i].animation.goToAndStop(t,e,a)}function l(t){var e;for(e=0;v>e;e+=1)f[e].animation.stop(t)}function p(t){var e;for(e=0;v>e;e+=1)f[e].animation.togglePause(t)}function m(){var e=document.getElementsByClassName("bodymovin");Array.prototype.forEach.call(e,t)}function d(){var t;for(t=0;v>t;t+=1)f[t].animation.resize()}function u(){y=Date.now(),requestAnimationFrame(n)}var c={},f=[],y=0,g=!0,v=0;return setTimeout(u,0),c.registerAnimation=t,c.loadAnimation=e,c.setSpeed=a,c.setDirection=i,c.play=s,c.moveFrame=r,c.pause=o,c.stop=l,c.togglePause=p,c.searchAnimations=m,c.resize=d,c.start=u,c.goToAndStop=h,c}(),AnimationItem=function(){this.name="",this.path="",this.isLoaded=!1,this.currentFrame=0,this.currentRawFrame=0,this.totalFrames=0,this.frameRate=0,this.frameMult=0,this.playSpeed=1,this.playDirection=1,this.pendingElements=0,this.playCount=0,this.prerenderFramesFlag=!0,this.repeat="indefinite",this.animationData={},this.layers=[],this.assets=[],this.isPaused=!0,this.isScrolling=!1,this.autoplay=!1,this.loop=!0,this.renderer=null,this.animationID=randomString(10),this.renderedFrameCount=0,this.scaleMode="fit",this.math=Math};AnimationItem.prototype.setParams=function(t){var e=this;t.context&&(this.context=t.context),t.wrapper&&(this.wrapper=t.wrapper);var a=t.animType?t.animType:"canvas";switch(a){case"canvas":this.renderer=new CanvasRenderer(this,t.renderer);break;case"svg":this.renderer=new SVGRenderer(this,t.renderer)}if(this.animType=a,""===t.loop||null===t.loop||(this.loop=t.loop===!1?!1:t.loop===!0?!0:parseInt(t.loop)),this.autoplay="autoplay"in t?t.autoplay:!0,this.name=t.name?t.name:"",this.prerenderFramesFlag="prerender"in t?t.prerender:!0,t.animationData)e.configAnimation(t.animationData);else if(t.path){"json"!=t.path.substr(-4)&&("/"!=t.path.substr(-1,1)&&(t.path+="/"),t.path+="data.json");var i=new XMLHttpRequest;this.path=t.path.substr(0,t.path.lastIndexOf("/")+1),i.open("GET",t.path,!0),i.send(),i.onreadystatechange=function(){if(4==i.readyState)if(200==i.status)e.configAnimation(JSON.parse(i.responseText));else try{var t=JSON.parse(i.responseText);e.configAnimation(t)}catch(a){}}}},AnimationItem.prototype.setData=function(t){var e={wrapper:t},a=t.attributes;e.path=a.getNamedItem("data-animation-path")?a.getNamedItem("data-animation-path").value:a.getNamedItem("data-bm-path")?a.getNamedItem("data-bm-path").value:a.getNamedItem("bm-path")?a.getNamedItem("bm-path").value:"",e.animType=a.getNamedItem("data-anim-type")?a.getNamedItem("data-anim-type").value:a.getNamedItem("data-bm-type")?a.getNamedItem("data-bm-type").value:a.getNamedItem("bm-type")?a.getNamedItem("bm-type").value:"canvas";var i=a.getNamedItem("data-anim-loop")?a.getNamedItem("data-anim-loop").value:a.getNamedItem("data-bm-loop")?a.getNamedItem("data-bm-loop").value:a.getNamedItem("bm-loop")?a.getNamedItem("bm-loop").value:"";""===i||(e.loop="false"===i?!1:"true"===i?!0:parseInt(i)),e.name=a.getNamedItem("data-name")?a.getNamedItem("data-name").value:a.getNamedItem("data-bm-name")?a.getNamedItem("data-bm-name").value:a.getNamedItem("bm-name")?a.getNamedItem("bm-name").value:"";var s=a.getNamedItem("data-anim-prerender")?a.getNamedItem("data-anim-prerender").value:a.getNamedItem("data-bm-prerender")?a.getNamedItem("data-bm-prerender").value:a.getNamedItem("bm-prerender")?a.getNamedItem("bm-prerender").value:"";"false"===s&&(e.prerender=!1),this.setParams(e)},AnimationItem.prototype.configAnimation=function(t){this.renderer.configAnimation(t),this.animationData=t,this.animationData._id=this.animationID,this.animationData._animType=this.animType,this.layers=this.animationData.animation.layers,this.assets=this.animationData.assets,this.totalFrames=this.animationData.animation.totalFrames,this.frameRate=this.animationData.animation.frameRate,this.firstFrame=Math.round(this.animationData.animation.ff*this.frameRate),this.frameMult=this.animationData.animation.frameRate/1e3,dataManager.completeData(this.animationData),this.renderer.buildItems(this.animationData.animation.layers),this.updaFrameModifier(),this.checkLoaded()},AnimationItem.prototype.elementLoaded=function(){this.pendingElements--,this.checkLoaded()},AnimationItem.prototype.checkLoaded=function(){this.renderer.buildStage(this.container,this.layers),0===this.pendingElements&&(this.prerenderFramesFlag?(this.prerenderFrames(0),dataManager.renderFrame(this.animationID,this.currentFrame+this.firstFrame),this.renderer.renderFrame(this.currentFrame+this.firstFrame)):(this.isLoaded=!0,this.gotoFrame(),this.autoplay&&this.play()))},AnimationItem.prototype.prerenderFrames=function(t){t||(t=0),this.renderedFrameCount===this.totalFrames?(this.isLoaded=!0,this.gotoFrame(),this.autoplay&&this.play()):(dataManager.renderFrame(this.animationID,this.renderedFrameCount+this.firstFrame),this.renderedFrameCount+=1,t>5?setTimeout(this.prerenderFrames.bind(this),0):(t+=1,this.prerenderFrames(t)))},AnimationItem.prototype.resize=function(){this.renderer.updateContainerSize()},AnimationItem.prototype.gotoFrame=function(){this.currentFrame=subframeEnabled?this.math.round(100*this.currentRawFrame)/100:this.math.floor(this.currentRawFrame),this.renderFrame()},AnimationItem.prototype.renderFrame=function(){this.isLoaded!==!1&&(dataManager.renderFrame(this.animationID,this.currentFrame+this.firstFrame),this.renderer.renderFrame(this.currentFrame+this.firstFrame))},AnimationItem.prototype.play=function(t){t&&this.name!=t||this.isPaused===!0&&(this.isPaused=!1)},AnimationItem.prototype.pause=function(t){t&&this.name!=t||this.isPaused===!1&&(this.isPaused=!0)},AnimationItem.prototype.togglePause=function(t){t&&this.name!=t||(this.isPaused===!0?(this.isPaused=!1,this.play()):(this.isPaused=!0,this.pause()))},AnimationItem.prototype.stop=function(t){t&&this.name!=t||(this.isPaused=!0,this.currentFrame=this.currentRawFrame=0,this.playCount=0,this.gotoFrame())},AnimationItem.prototype.goToAndStop=function(t,e,a){a&&this.name!=a||(this.setCurrentRawFrameValue(e?t:t*this.frameModifier),this.isPaused=!0)},AnimationItem.prototype.advanceTime=function(t){this.isPaused!==!0&&this.isScrolling!==!0&&this.isLoaded!==!1&&this.setCurrentRawFrameValue(this.currentRawFrame+t*this.frameModifier)},AnimationItem.prototype.updateAnimation=function(t){this.setCurrentRawFrameValue(this.totalFrames*t)},AnimationItem.prototype.moveFrame=function(t,e){e&&this.name!=e||this.setCurrentRawFrameValue(this.currentRawFrame+t)},AnimationItem.prototype.setCurrentRawFrameValue=function(t){if(this.currentRawFrame=t,this.currentRawFrame>=this.totalFrames){if(this.loop===!1)return this.currentRawFrame=this.totalFrames-1,this.gotoFrame(),void this.pause();if(this.playCount+=1,this.loop!==!0&&this.playCount==this.loop)return this.currentRawFrame=this.totalFrames-1,this.gotoFrame(),void this.pause()}else if(this.currentRawFrame<0)return this.playCount-=1,this.playCount<0&&(this.playCount=0),this.loop===!1?(this.currentRawFrame=0,this.gotoFrame(),void this.pause()):(this.currentRawFrame=this.totalFrames+this.currentRawFrame,void this.gotoFrame());this.currentRawFrame=this.currentRawFrame%this.totalFrames,this.gotoFrame()},AnimationItem.prototype.setSpeed=function(t){this.playSpeed=t,this.updaFrameModifier()},AnimationItem.prototype.setDirection=function(t){this.playDirection=0>t?-1:1,this.updaFrameModifier()},AnimationItem.prototype.updaFrameModifier=function(){this.frameModifier=this.frameMult*this.playSpeed*this.playDirection},AnimationItem.prototype.getPath=function(){return this.path},AnimationItem.prototype.getAssets=function(){return this.assets},function(t){function e(t){animationManager.play(t)}function a(t){animationManager.pause(t)}function i(t){animationManager.togglePause(t)}function s(t,e){animationManager.setSpeed(t,e)}function r(t,e){animationManager.setDirection(t,e)}function n(t){animationManager.stop(t)}function o(t){animationManager.moveFrame(t)}function h(){animationManager.searchAnimations()}function l(t){return animationManager.registerAnimation(t)}function p(){animationManager.resize()}function m(){animationManager.start()}function d(t,e,a){animationManager.goToAndStop(t,e,a)}function u(t){subframeEnabled=t}function c(t){return animationManager.loadAnimation(t)}function f(){"complete"===document.readyState&&(clearInterval(g),h())}var y={};y.play=e,y.pause=a,y.togglePause=i,y.setSpeed=s,y.setDirection=r,y.stop=n,y.moveFrame=o,y.searchAnimations=h,y.registerAnimation=l,y.loadAnimation=c,y.setSubframeRendering=u,y.resize=p,y.start=m,y.goToAndStop=d,y.checkReady=f,t.bodymovin=y;var g=setInterval(f,100)}(window);}(window));
\ No newline at end of file
diff --git a/player/js/utils/DataManager.js b/player/js/utils/DataManager.js
index e0f312a..f7bfeee 100644
--- a/player/js/utils/DataManager.js
+++ b/player/js/utils/DataManager.js
@@ -624,11 +624,7 @@
                     pathData.pathNodes = keyframes;
                 }
             }else{
-                if(renderType == 'svg'){
-                    pathData.pathNodes = trimPath(keyframes,pathData.closed, trimData, false);
-                }else{
-                    pathData.pathNodes = trimPath(keyframes,pathData.closed, trimData, false);
-                }
+                pathData.pathNodes = trimPath(keyframes,pathData.closed, trimData, false);
             }
             return pathData;
         }else{
@@ -671,11 +667,7 @@
                         pathData.pathNodes = keyframes.__minValue;
                     }
                 }else{
-                    if(renderType == 'svg'){
-                        pathData.pathNodes = trimPath(keyframes.__minValue,pathData.closed, trimData, false);
-                    }else{
-                        pathData.pathNodes = trimPath(keyframes.__minValue,pathData.closed, trimData, false);
-                    }
+                    pathData.pathNodes = trimPath(keyframes.__minValue,pathData.closed, trimData, false);
                 }
                 return pathData;
             }else if(frameNum > keyframes[keyframes.length - 1].t-offsetTime){
@@ -710,11 +702,7 @@
                         pathData.pathNodes = keyframes.__maxValue;
                     }
                 }else{
-                    if(renderType == 'svg'){
-                        pathData.pathNodes = trimPath(keyframes.__maxValue,pathData.closed, trimData, false);
-                    }else{
-                        pathData.pathNodes = trimPath(keyframes.__maxValue,pathData.closed, trimData, false);
-                    }
+                    pathData.pathNodes = trimPath(keyframes.__maxValue,pathData.closed, trimData, false);
                 }
                 return pathData;
             }else{
@@ -803,11 +791,7 @@
                         pathData.pathNodes = propertyArray[0];
                     }
                 }else{
-                    if(renderType == 'svg'){
-                        pathData.pathNodes = trimPath(propertyArray[0],pathData.closed, trimData, false);
-                    }else{
-                        pathData.pathNodes = trimPath(propertyArray[0],pathData.closed, trimData, false);
-                    }
+                    pathData.pathNodes = trimPath(propertyArray[0],pathData.closed, trimData, false);
                 }
                 return pathData;
             }
@@ -1060,7 +1044,6 @@
                 renderedData.an.matrixArray = matrixInstance.getMatrixArrayFromParams(matrixParams[0],matrixParams[1],matrixParams[2],matrixParams[3],matrixParams[4]);
             }else{
                 renderedData.an.matrixArray = matrixInstance.getMatrixArrayFromParams(matrixParams[0],matrixParams[1],matrixParams[2],matrixParams[3],matrixParams[4]);
-                //renderedData.an.matrixValue = matrixInstance.getMatrix2FromParams(matrixParams[0],matrixParams[1],matrixParams[2],matrixParams[3],matrixParams[4]) + 'translate('+ -dataOb.a[0]+' '+ -dataOb.a[1]+')';
             }
             item.renderedData[offsettedFrameNum] = renderedData;
             if(item.hasMask){
@@ -1180,17 +1163,7 @@
                             closed: true
                         }
                     };
-                    /*if(renderType == 'svg'){
-                     pathData.pathString = trimPath(keyframes,pathData.closed, trimData, true);
-                     }else{
-                     pathData.pathNodes = trimPath(keyframes,pathData.closed, trimData, false);
-                     }*/
-                    if(renderType == 'svg'){
-                        //shapeItem.renderedData[offsettedFrameNum].path.pathString = convertRectToPath(elmPos,elmSize,elmRound,renderType);
-                        shapeItem.renderedData[offsettedFrameNum].path.pathString = trimPath(convertRectToPath(elmPos,elmSize,elmRound),true, addedTrim, true);
-                    }else{
-                        shapeItem.renderedData[offsettedFrameNum].path.pathNodes = trimPath(convertRectToPath(elmPos,elmSize,elmRound),true, addedTrim, false);
-                    }
+                    shapeItem.renderedData[offsettedFrameNum].path.pathNodes = trimPath(convertRectToPath(elmPos,elmSize,elmRound),true, addedTrim, false);
                 }
             }else if(shapeItem.ty == 'el'){
                 elmPos = getInterpolatedValue(shapeItem.p,offsettedFrameNum, startTime,interpolatedParams);
diff --git a/projects/BODYMOVIN.zip b/projects/BODYMOVIN.zip
new file mode 100644
index 0000000..c6f561f
--- /dev/null
+++ b/projects/BODYMOVIN.zip
Binary files differ
