!function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof module&&module.exports?module.exports=e():t.bodymovin=e()}(window,function(){function t(){return{}}function e(t){mt=t?Math.round:function(t){return t}}function s(t){return Math.round(1e4*t)/1e4}function i(t){t.style.userSelect="none",t.style.MozUserSelect="none",t.style.webkitUserSelect="none",t.style.oUserSelect="none"}function a(t,e,s,i){this.type=t,this.currentTime=e,this.totalTime=s,this.direction=0>i?-1:1}function r(t,e){this.type=t,this.direction=0>e?-1:1}function n(t,e,s,i){this.type=t,this.currentLoop=e,this.totalLoops=s,this.direction=0>i?-1:1}function h(t,e,s){this.type=t,this.firstFrame=e,this.totalFrames=s}function o(t,e){this.type=t,this.target=e}function p(t,e){this._cbs[t]||(this._cbs[t]=[]),this._cbs[t].push(e)}function l(t,e){if(e){if(this._cbs[t]){for(var s=0,i=this._cbs[t].length;i>s;)this._cbs[t][s]===e&&(this._cbs[t].splice(s,1),s-=1,i-=1),s+=1;this._cbs[t].length||(this._cbs[t]=null)}}else this._cbs[t]=null}function f(t,e){if(this._cbs[t])for(var s=this._cbs[t].length,i=0;s>i;i++)this._cbs[t][i](e)}function m(t,e){void 0===e&&(e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890");var s,i="";for(s=t;s>0;--s)i+=e[Math.round(Math.random()*(e.length-1))];return i}function d(t,e,s){var i,a,r,n,h,o,p,l;switch(1===arguments.length&&(e=t.s,s=t.v,t=t.h),n=Math.floor(6*t),h=6*t-n,o=s*(1-e),p=s*(1-h*e),l=s*(1-(1-h)*e),n%6){case 0:i=s,a=l,r=o;break;case 1:i=p,a=s,r=o;break;case 2:i=o,a=s,r=l;break;case 3:i=o,a=p,r=s;break;case 4:i=l,a=o,r=s;break;case 5:i=s,a=o,r=p}return[i,a,r]}function c(t,e,s){1===arguments.length&&(e=t.g,s=t.b,t=t.r);var i,a=Math.max(t,e,s),r=Math.min(t,e,s),n=a-r,h=0===a?0:n/a,o=a/255;switch(a){case r:i=0;break;case t:i=e-s+n*(s>e?6:0),i/=6*n;break;case e:i=s-t+2*n,i/=6*n;break;case s:i=t-e+4*n,i/=6*n}return[i,h,o]}function u(t,e){var s=c(255*t[0],255*t[1],255*t[2]);return s[1]+=e,s[1]>1?s[1]=1:s[1]<=0&&(s[1]=0),d(s[0],s[1],s[2])}function v(t,e){var s=c(255*t[0],255*t[1],255*t[2]);return s[2]+=e,s[2]>1?s[2]=1:s[2]<0&&(s[2]=0),d(s[0],s[1],s[2])}function g(t,e){var s=c(255*t[0],255*t[1],255*t[2]);return s[0]+=e/360,s[0]>1?s[0]-=1:s[0]<0&&(s[0]+=1),d(s[0],s[1],s[2])}function y(t,e,s,i,a,r){this.o=t,this.sw=e,this.sc=s,this.fc=i,this.m=a,this.props=r}function b(t){var e,s,i=[],a=[],r=[],n={},h=0;t.c&&(i[0]=t.o[0],a[0]=t.i[0],r[0]=t.v[0],h=1),s=t.i.length;var o=s-1;for(e=h;s>e;e+=1)i.push(t.o[o]),a.push(t.i[o]),r.push(t.v[o]),o-=1;return n.i=i,n.o=a,n.v=r,n}function k(){}function P(t,e,s){if(!e){var i=Object.create(t.prototype,s),a={};return i&&"[object Function]"===a.toString.call(i.init)&&i.init(),i}e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.prototype._parent=t.prototype}function A(t,e){for(var s in t.prototype)t.prototype.hasOwnProperty(s)&&(e.prototype[s]=t.prototype[s])}function E(){function t(t,e,s,i,a,r){var n=t*i+e*a+s*r-a*i-r*t-s*e;return n>-1e-4&&1e-4>n}function e(e,s,i,a,r,n,h,o,p){return t(e,s,a,r,h,o)&&t(e,i,a,n,h,p)}function s(t){this.segmentLength=0,this.points=new Array(t)}function i(t,e){this.partialLength=t,this.point=e}function a(t,e){var s=e.segments,i=s.length,a=yt((i-1)*t),r=t*e.addedLength,n=0;if(r==s[a].l)return s[a].p;for(var h=s[a].l>r?-1:1,o=!0;o;)s[a].l<=r&&s[a+1].l>r?(n=(r-s[a].l)/(s[a+1].l-s[a].l),o=!1):a+=h,(0>a||a>=i-1)&&(o=!1);return s[a].p+(s[a+1].p-s[a].p)*n}function r(){this.pt1=new Array(2),this.pt2=new Array(2),this.pt3=new Array(2),this.pt4=new Array(2)}function n(t,e,s,i,n,h,o){var p=new r;n=0>n?0:n>1?1:n;var l=a(n,o);h=h>1?1:h;var f,m=a(h,o),d=t.length,c=1-l,u=1-m;for(f=0;d>f;f+=1)p.pt1[f]=Math.round(1e3*(c*c*c*t[f]+(l*c*c+c*l*c+c*c*l)*s[f]+(l*l*c+c*l*l+l*c*l)*i[f]+l*l*l*e[f]))/1e3,p.pt3[f]=Math.round(1e3*(c*c*u*t[f]+(l*c*u+c*l*u+c*c*m)*s[f]+(l*l*u+c*l*m+l*c*m)*i[f]+l*l*m*e[f]))/1e3,p.pt4[f]=Math.round(1e3*(c*u*u*t[f]+(l*u*u+c*m*u+c*u*m)*s[f]+(l*m*u+c*m*m+l*u*m)*i[f]+l*m*m*e[f]))/1e3,p.pt2[f]=Math.round(1e3*(u*u*u*t[f]+(m*u*u+u*m*u+u*u*m)*s[f]+(m*m*u+u*m*m+m*u*m)*i[f]+m*m*m*e[f]))/1e3;return p}var h=(Math,function(){function t(t,e){this.l=t,this.p=e}return function(e,s,i,a){var r,n,h,o,p,l,f=Pt,m=0,d=[],c=[],u={addedLength:0,segments:[]};for(h=i.length,r=0;f>r;r+=1){for(p=r/(f-1),l=0,n=0;h>n;n+=1)o=vt(1-p,3)*e[n]+3*vt(1-p,2)*p*i[n]+3*(1-p)*vt(p,2)*a[n]+vt(p,3)*s[n],d[n]=o,null!==c[n]&&(l+=vt(d[n]-c[n],2)),c[n]=d[n];l&&(l=gt(l),m+=l),u.segments.push(new t(m,p))}return u.addedLength=m,u}}()),o=function(){var e={};return function(a){var r=a.s,n=a.e,h=a.to,o=a.ti,p=(r.join("_")+"_"+n.join("_")+"_"+h.join("_")+"_"+o.join("_")).replace(/\./g,"p");if(e[p])return void(a.bezierData=e[p]);var l,f,m,d,c,u,v,g=Pt,y=0,b=null;2===r.length&&(r[0]!=n[0]||r[1]!=n[1])&&t(r[0],r[1],n[0],n[1],r[0]+h[0],r[1]+h[1])&&t(r[0],r[1],n[0],n[1],n[0]+o[0],n[1]+o[1])&&(g=2);var k=new s(g);for(m=h.length,l=0;g>l;l+=1){for(v=new Array(m),c=l/(g-1),u=0,f=0;m>f;f+=1)d=vt(1-c,3)*r[f]+3*vt(1-c,2)*c*(r[f]+h[f])+3*(1-c)*vt(c,2)*(n[f]+o[f])+vt(c,3)*n[f],v[f]=d,null!==b&&(u+=vt(v[f]-b[f],2));u=gt(u),y+=u,k.points[l]=new i(u,v),b=v}k.segmentLength=y,a.bezierData=k,e[p]=k}}();return{getBezierLength:h,getNewSegment:n,buildBezierData:o,pointOnLine2D:t,pointOnLine3D:e}}function M(){function t(a,r,h){var o,p,l,f,m,d,c,u,v=a.length;for(f=0;v>f;f+=1)if(o=a[f],"ks"in o&&!o.completed){if(o.completed=!0,o.tt&&(a[f-1].td=o.tt),p=[],l=-1,o.hasMask){var g=o.masksProperties;for(d=g.length,m=0;d>m;m+=1)if(g[m].pt.k.i)i(g[m].pt.k);else for(u=g[m].pt.k.length,c=0;u>c;c+=1)g[m].pt.k[c].s&&i(g[m].pt.k[c].s[0]),g[m].pt.k[c].e&&i(g[m].pt.k[c].e[0])}0===o.ty?(o.layers=e(o.refId,r),t(o.layers,r,h)):4===o.ty?s(o.shapes):5==o.ty&&n(o,h)}}function e(t,e){for(var s=0,i=e.length;i>s;){if(e[s].id===t)return e[s].layers;s+=1}}function s(t){var e,a,r,n=t.length,h=!1;for(e=n-1;e>=0;e-=1)if("sh"==t[e].ty){if(t[e].ks.k.i)i(t[e].ks.k);else for(r=t[e].ks.k.length,a=0;r>a;a+=1)t[e].ks.k[a].s&&i(t[e].ks.k[a].s[0]),t[e].ks.k[a].e&&i(t[e].ks.k[a].e[0]);h=!0}else"gr"==t[e].ty&&s(t[e].it)}function i(t){var e,s=t.i.length;for(e=0;s>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 a(t,e){var s=e?e.split("."):[100,100,100];return t[0]>s[0]?!0:s[0]>t[0]?!1:t[1]>s[1]?!0:s[1]>t[1]?!1:t[2]>s[2]?!0:s[2]>t[2]?!1:void 0}function r(e,s){e.__complete||(o(e),h(e),p(e),t(e.layers,e.assets,s),e.__complete=!0)}function n(t,e){var s,i,a=t.t.d.k,r=a.length;for(i=0;r>i;i+=1){var n=t.t.d.k[i].s;s=[];var h,o,p,l,f,m,d,c=0,u=t.t.m.g,v=0,g=0,y=0,b=[],k=0,P=0,A=e.getFontByName(n.f),E=0,M=A.fStyle.split(" "),F="normal",w="normal";for(o=M.length,h=0;o>h;h+=1)"italic"===M[h].toLowerCase()?w="italic":"bold"===M[h].toLowerCase()?F="700":"black"===M[h].toLowerCase()?F="900":"medium"===M[h].toLowerCase()?F="500":"regular"===M[h].toLowerCase()||"normal"===M[h].toLowerCase()?F="400":("light"===M[h].toLowerCase()||"thin"===M[h].toLowerCase())&&(F="200");if(n.fWeight=F,n.fStyle=w,o=n.t.length,n.sz){var S=n.sz[0],D=-1;for(h=0;o>h;h+=1)p=!1," "===n.t.charAt(h)?D=h:13===n.t.charCodeAt(h)&&(k=0,p=!0),e.chars?(d=e.getCharData(n.t.charAt(h),A.fStyle,A.fFamily),E=p?0:d.w*n.s/100):E=e.measureText(n.t.charAt(h),n.f,n.s),k+E>S?(-1===D?(n.t=n.t.substr(0,h)+"\r"+n.t.substr(h),o+=1):(h=D,n.t=n.t.substr(0,h)+"\r"+n.t.substr(h+1)),D=-1,k=0):k+=E;o=n.t.length}for(k=0,E=0,h=0;o>h;h+=1)if(p=!1," "===n.t.charAt(h)?l=" ":13===n.t.charCodeAt(h)?(b.push(k),P=k>P?k:P,k=0,l="",p=!0,y+=1):l=n.t.charAt(h),e.chars?(d=e.getCharData(n.t.charAt(h),A.fStyle,e.getFontByName(n.f).fFamily),E=p?0:d.w*n.s/100):E=e.measureText(l,n.f,n.s),k+=E,s.push({l:E,an:E,add:v,n:p,anIndexes:[],val:l,line:y}),2==u){if(v+=E,""==l||" "==l||h==o-1){for((""==l||" "==l)&&(v-=E);h>=g;)s[g].an=v,s[g].ind=c,s[g].extra=E,g+=1;c+=1,v=0}}else if(3==u){if(v+=E,""==l||h==o-1){for(""==l&&(v-=E);h>=g;)s[g].an=v,s[g].ind=c,s[g].extra=E,g+=1;v=0,c+=1}}else s[c].ind=c,s[c].extra=0,c+=1;if(n.l=s,P=k>P?k:P,b.push(k),n.sz)n.boxWidth=n.sz[0],n.justifyOffset=0;else switch(n.boxWidth=P,n.j){case 1:n.justifyOffset=-n.boxWidth;break;case 2:n.justifyOffset=-n.boxWidth/2;break;default:n.justifyOffset=0}n.lineWidths=b;var C=t.t.a;m=C.length;var x,T,I=[];for(f=0;m>f;f+=1){for(C[f].a.sc&&(n.strokeColorAnim=!0),C[f].a.sw&&(n.strokeWidthAnim=!0),(C[f].a.fc||C[f].a.fh||C[f].a.fs||C[f].a.fb)&&(n.fillColorAnim=!0),T=0,x=C[f].s.b,h=0;o>h;h+=1)s[h].anIndexes[f]=T,(1==x&&""!=s[h].val||2==x&&""!=s[h].val&&" "!=s[h].val||3==x&&(s[h].n||" "==s[h].val||h==o-1)||4==x&&(s[h].n||h==o-1))&&(1===C[f].s.rn&&I.push(T),T+=1);t.t.a[f].s.totalChars=T;var L,N=-1;if(1===C[f].s.rn)for(h=0;o>h;h+=1)N!=s[h].anIndexes[f]&&(N=s[h].anIndexes[f],L=I.splice(Math.floor(Math.random()*I.length),1)[0]),s[h].anIndexes[f]=L}0!==m||"m"in t.t.p||(t.singleShape=!0),n.yOffset=n.lh||1.2*n.s,n.ascent=A.ascent*n.s/100}}var h=function(){function t(t){var e=t.t.d;t.t.d={k:[{s:e,t:0}]}}function e(e){var s,i=e.length;for(s=0;i>s;s+=1)5===e[s].ty&&t(e[s])}var s=[4,4,14];return function(t){if(a(s,t.v)&&(e(t.layers),t.assets)){var i,r=t.assets.length;for(i=0;r>i;i+=1)t.assets[i].layers&&e(t.assets[i].layers)}}}(),o=function(){function t(e){var s,i,a,r=e.length;for(s=0;r>s;s+=1)if("gr"===e[s].ty)t(e[s].it);else if("fl"===e[s].ty||"st"===e[s].ty)if(e[s].c.k&&e[s].c.k[0].i)for(a=e[s].c.k.length,i=0;a>i;i+=1)e[s].c.k[i].s&&(e[s].c.k[i].s[0]/=255,e[s].c.k[i].s[1]/=255,e[s].c.k[i].s[2]/=255,e[s].c.k[i].s[3]/=255),e[s].c.k[i].e&&(e[s].c.k[i].e[0]/=255,e[s].c.k[i].e[1]/=255,e[s].c.k[i].e[2]/=255,e[s].c.k[i].e[3]/=255);else e[s].c.k[0]/=255,e[s].c.k[1]/=255,e[s].c.k[2]/=255,e[s].c.k[3]/=255}function e(e){var s,i=e.length;for(s=0;i>s;s+=1)4===e[s].ty&&t(e[s].shapes)}var s=[4,1,9];return function(t){if(a(s,t.v)&&(e(t.layers),t.assets)){var i,r=t.assets.length;for(i=0;r>i;i+=1)t.assets[i].layers&&e(t.assets[i].layers)}}}(),p=function(){function t(e){var s,i,a,r=e.length,n=!1;for(s=r-1;s>=0;s-=1)if("sh"==e[s].ty){if(e[s].ks.k.i)e[s].ks.k.c=e[s].closed;else for(a=e[s].ks.k.length,i=0;a>i;i+=1)e[s].ks.k[i].s&&(e[s].ks.k[i].s[0].c=e[s].closed),e[s].ks.k[i].e&&(e[s].ks.k[i].e[0].c=e[s].closed);n=!0}else"gr"==e[s].ty&&t(e[s].it)}function e(e){var s,i,a,r,n,h,o=e.length;for(i=0;o>i;i+=1){if(s=e[i],s.hasMask){var p=s.masksProperties;for(r=p.length,a=0;r>a;a+=1)if(p[a].pt.k.i)p[a].pt.k.c=p[a].cl;else for(h=p[a].pt.k.length,n=0;h>n;n+=1)p[a].pt.k[n].s&&(p[a].pt.k[n].s[0].c=p[a].cl),p[a].pt.k[n].e&&(p[a].pt.k[n].e[0].c=p[a].cl)}4===s.ty&&t(s.shapes)}}var s=[4,4,18];return function(t){if(a(s,t.v)&&(e(t.layers),t.assets)){var i,r=t.assets.length;for(i=0;r>i;i+=1)t.assets[i].layers&&e(t.assets[i].layers)}}}(),l={};return l.completeData=r,l}function F(){}function w(){}function S(){}function D(){}function C(t,e){this.animationItem=t,this.layers=null,this.renderedFrame=-1,this.globalData={frameNum:-1},this.renderConfig={preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet",progressiveLoad:e&&e.progressiveLoad||!1},this.elements=[],this.pendingElements=[],this.destroyed=!1}function x(t,e,s){this.dynamicProperties=[],this.data=t,this.element=e,this.globalData=s,this.paths=[],this.storedData=[],this.masksProperties=this.data.masksProperties,this.viewData=new Array(this.masksProperties.length),this.maskElement=null,this.firstFrame=!0;var i,a,r,n,h,o,p,l,f=this.globalData.defs,d=this.masksProperties.length,c=this.masksProperties,u=0,v=[],g=m(10),y="clipPath",b="clip-path";for(i=0;d>i;i++)if(("a"!==c[i].mode&&"n"!==c[i].mode||c[i].inv||100!==c[i].o.k)&&(y="mask",b="mask"),"s"!=c[i].mode&&"i"!=c[i].mode||0!=u?h=null:(h=document.createElementNS(dt,"rect"),h.setAttribute("fill","#ffffff"),h.setAttribute("width",this.element.comp.data?this.element.comp.data.w:this.element.globalData.compSize.w),h.setAttribute("height",this.element.comp.data?this.element.comp.data.h:this.element.globalData.compSize.h),v.push(h)),a=document.createElementNS(dt,"path"),"n"!=c[i].mode){if(u+=1,"s"==c[i].mode?a.setAttribute("fill","#000000"):a.setAttribute("fill","#ffffff"),a.setAttribute("clip-rule","nonzero"),0!==c[i].x.k){y="mask",b="mask",l=Dt.getProp(this.element,c[i].x,0,null,this.dynamicProperties);var k="fi_"+m(10);o=document.createElementNS(dt,"filter"),o.setAttribute("id",k),p=document.createElementNS(dt,"feMorphology"),p.setAttribute("operator","dilate"),p.setAttribute("in","SourceGraphic"),p.setAttribute("radius","0"),o.appendChild(p),f.appendChild(o),"s"==c[i].mode?a.setAttribute("stroke","#000000"):a.setAttribute("stroke","#ffffff")}else p=null,l=null;if(this.storedData[i]={elem:a,x:l,expan:p,lastPath:"",lastOperator:"",filterId:k,lastRadius:0},"i"==c[i].mode){n=v.length;var P=document.createElementNS(dt,"g");for(r=0;n>r;r+=1)P.appendChild(v[r]);var A=document.createElementNS(dt,"mask");A.setAttribute("mask-type","alpha"),A.setAttribute("id",g+"_"+u),A.appendChild(a),f.appendChild(A),P.setAttribute("mask","url(#"+g+"_"+u+")"),v.length=0,v.push(P)}else v.push(a);c[i].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath()),this.viewData[i]={elem:a,lastPath:"",op:Dt.getProp(this.element,c[i].o,0,.01,this.dynamicProperties),prop:Ct.getShapeProp(this.element,c[i],3,this.dynamicProperties,null)},h&&(this.viewData[i].invRect=h),this.viewData[i].prop.k||this.drawPath(c[i],this.viewData[i].prop.v,this.viewData[i])}else this.viewData[i]={op:Dt.getProp(this.element,c[i].o,0,.01,this.dynamicProperties),prop:Ct.getShapeProp(this.element,c[i],3,this.dynamicProperties,null),elem:a},f.appendChild(a);for(this.maskElement=document.createElementNS(dt,y),d=v.length,i=0;d>i;i+=1)this.maskElement.appendChild(v[i]);this.maskElement.setAttribute("id",g),u>0&&this.element.maskedElement.setAttribute(b,"url(#"+g+")"),f.appendChild(this.maskElement)}function T(){}function I(t,e,s,i,a){this.globalData=s,this.comp=i,this.data=t,this.matteElement=null,this.transformedElement=null,this.parentContainer=e,this.layerId=a?a.layerId:"ly_"+m(10),this.placeholder=a,this.init()}function L(t,e,s,i){}function N(t,e,s,i,a){this.textSpans=[],this.renderType="svg",this._parent.constructor.call(this,t,e,s,i,a)}function _(t,e){this.filterManager=e;var s=document.createElementNS(dt,"feColorMatrix");if(s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","linearRGB"),s.setAttribute("values","0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"),s.setAttribute("result","f1"),t.appendChild(s),s=document.createElementNS(dt,"feColorMatrix"),s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","sRGB"),s.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"),s.setAttribute("result","f2"),t.appendChild(s),this.matrixFilter=s,100!==e.effectElements[2].p.v||e.effectElements[2].p.k){var i=document.createElementNS(dt,"feMerge");t.appendChild(i);var a;a=document.createElementNS(dt,"feMergeNode"),a.setAttribute("in","SourceGraphic"),i.appendChild(a),a=document.createElementNS(dt,"feMergeNode"),a.setAttribute("in","f2"),i.appendChild(a)}}function V(t,e){this.filterManager=e;var s=document.createElementNS(dt,"feColorMatrix");s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","sRGB"),s.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"),t.appendChild(s),this.matrixFilter=s}function z(t,e){this.initialized=!1,this.filterManager=e,this.elem=t,this.paths=[]}function R(t,e){this.filterManager=e;var s=document.createElementNS(dt,"feColorMatrix");s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","linearRGB"),s.setAttribute("values","0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"),s.setAttribute("result","f1"),t.appendChild(s);var i=document.createElementNS(dt,"feComponentTransfer");i.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(i),this.matrixFilter=i;var a=document.createElementNS(dt,"feFuncR");a.setAttribute("type","table"),i.appendChild(a),this.feFuncR=a;var r=document.createElementNS(dt,"feFuncG");r.setAttribute("type","table"),i.appendChild(r),this.feFuncG=r;var n=document.createElementNS(dt,"feFuncB");n.setAttribute("type","table"),i.appendChild(n),this.feFuncB=n}function j(t,e){this.filterManager=e;var s=this.filterManager.effectElements,i=document.createElementNS(dt,"feComponentTransfer");(s[9].p.k||0!==s[9].p.v||s[10].p.k||1!==s[10].p.v||s[11].p.k||1!==s[11].p.v||s[12].p.k||0!==s[12].p.v||s[13].p.k||1!==s[13].p.v)&&(this.feFuncR=this.createFeFunc("feFuncR",i)),(s[16].p.k||0!==s[16].p.v||s[17].p.k||1!==s[17].p.v||s[18].p.k||1!==s[18].p.v||s[19].p.k||0!==s[19].p.v||s[20].p.k||1!==s[20].p.v)&&(this.feFuncG=this.createFeFunc("feFuncG",i)),(s[23].p.k||0!==s[23].p.v||s[24].p.k||1!==s[24].p.v||s[25].p.k||1!==s[25].p.v||s[26].p.k||0!==s[26].p.v||s[27].p.k||1!==s[27].p.v)&&(this.feFuncB=this.createFeFunc("feFuncB",i)),(s[30].p.k||0!==s[30].p.v||s[31].p.k||1!==s[31].p.v||s[32].p.k||1!==s[32].p.v||s[33].p.k||0!==s[33].p.v||s[34].p.k||1!==s[34].p.v)&&(this.feFuncA=this.createFeFunc("feFuncA",i)),(this.feFuncR||this.feFuncG||this.feFuncB||this.feFuncA)&&(i.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(i),i=document.createElementNS(dt,"feComponentTransfer")),(s[2].p.k||0!==s[2].p.v||s[3].p.k||1!==s[3].p.v||s[4].p.k||1!==s[4].p.v||s[5].p.k||0!==s[5].p.v||s[6].p.k||1!==s[6].p.v)&&(i.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(i),this.feFuncRComposed=this.createFeFunc("feFuncR",i),this.feFuncGComposed=this.createFeFunc("feFuncG",i),this.feFuncBComposed=this.createFeFunc("feFuncB",i))}function O(t){var e,s=t.data.ef.length,i=m(10),a=Lt.createFilter(i),r=0;this.filters=[];var n;for(e=0;s>e;e+=1)20===t.data.ef[e].ty?(r+=1,n=new _(a,t.effects.effectElements[e]),this.filters.push(n)):21===t.data.ef[e].ty?(r+=1,n=new V(a,t.effects.effectElements[e]),this.filters.push(n)):22===t.data.ef[e].ty?(n=new z(t,t.effects.effectElements[e]),this.filters.push(n)):23===t.data.ef[e].ty?(r+=1,n=new R(a,t.effects.effectElements[e]),this.filters.push(n)):24===t.data.ef[e].ty&&(r+=1,n=new j(a,t.effects.effectElements[e]),this.filters.push(n));r&&(t.globalData.defs.appendChild(a),t.layerElement.setAttribute("filter","url(#"+i+")"))}function B(t,e,s,i,a){this._parent.constructor.call(this,t,e,s,i,a),this.layers=t.layers,this.supports3d=!0,this.completeLayers=!1,this.pendingElements=[],this.elements=this.layers?Array.apply(null,{length:this.layers.length}):[],this.data.tm&&(this.tm=Dt.getProp(this,this.data.tm,0,s.frameRate,this.dynamicProperties)),this.data.xt?(this.layerElement=document.createElementNS(dt,"g"),this.buildAllItems()):s.progressiveLoad||this.buildAllItems()}function G(t,e,s,i,a){this.assetData=s.getAssetData(t.refId),this._parent.constructor.call(this,t,e,s,i,a)}function W(t,e,s,i,a){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.viewData=[],this.shapeModifiers=[],this._parent.constructor.call(this,t,e,s,i,a)}function q(t,e,s,i,a){this._parent.constructor.call(this,t,e,s,i,a)}function H(t){Nt.play(t)}function X(t){Nt.pause(t)}function Y(t){Nt.togglePause(t)}function U(t,e){Nt.setSpeed(t,e)}function Z(t,e){Nt.setDirection(t,e)}function K(t){Nt.stop(t)}function J(t){Nt.moveFrame(t)}function Q(){zt===!0?Nt.searchAnimations(Rt,zt,jt):Nt.searchAnimations()}function $(t){return Nt.registerAnimation(t)}function tt(){Nt.resize()}function et(){Nt.start()}function st(t,e,s){Nt.goToAndStop(t,e,s)}function it(t){ct=t}function at(t){return zt===!0&&(t.animationData=JSON.parse(Rt)),Nt.loadAnimation(t)}function rt(t){return Nt.destroy(t)}function nt(t){if("string"==typeof t)switch(t){case"high":Pt=200;break;case"medium":Pt=50;break;case"low":Pt=10}else!isNaN(t)&&t>1&&(Pt=t);e(Pt>=50?!1:!0)}function ht(t,e){"expressions"===t&&(ft=e)}function ot(t){switch(t){case"propertyFactory":return Dt;case"shapePropertyFactory":return Ct;case"matrix":return k}}function pt(){"complete"===document.readyState&&(clearInterval(qt),Q())}function lt(t){for(var e=Wt.split("&"),s=0;s<e.length;s++){var i=e[s].split("=");if(decodeURIComponent(i[0])==t)return decodeURIComponent(i[1])}}var ft,mt,dt="http://www.w3.org/2000/svg",ct=!0,ut=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),vt=(Math.round,Math.pow),gt=Math.sqrt,yt=(Math.abs,Math.floor),bt=(Math.max,Math.min),kt={};!function(){var t,e=Object.getOwnPropertyNames(Math),s=e.length;for(t=0;s>t;t+=1)kt[e[t]]=Math[e[t]]}(),kt.random=Math.random,kt.abs=function(t){var e=typeof t;if("object"===e&&t.length){var s,i=Array.apply(null,{length:t.length}),a=t.length;for(s=0;a>s;s+=1)i[s]=Math.abs(t[s]);return i}return Math.abs(t)};var Pt=75,At=Math.PI/180,Et=.5519;e(!1);var k=(function(){var t,e,s=[];for(t=0;256>t;t+=1)e=t.toString(16),s[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),"#"+s[t]+s[e]+s[i]}}(),function(){var t=[];return function(e,s){return void 0!==s&&(e[3]=s),t[e[0]]||(t[e[0]]={}),t[e[0]][e[1]]||(t[e[0]][e[1]]={}),t[e[0]][e[1]][e[2]]||(t[e[0]][e[1]][e[2]]={}),t[e[0]][e[1]][e[2]][e[3]]||(t[e[0]][e[1]][e[2]][e[3]]="rgba("+e.join(",")+")"),t[e[0]][e[1]][e[2]][e[3]]}}(),function(){function t(){return this.props[0]=1,this.props[1]=0,this.props[2]=0,this.props[3]=0,this.props[4]=0,this.props[5]=1,this.props[6]=0,this.props[7]=0,this.props[8]=0,this.props[9]=0,this.props[10]=1,this.props[11]=0,this.props[12]=0,this.props[13]=0,this.props[14]=0,this.props[15]=1,this}function e(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(e,-s,0,0,s,e,0,0,0,0,1,0,0,0,0,1)}function i(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(1,0,0,0,0,e,-s,0,0,s,e,0,0,0,0,1)}function a(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(e,0,s,0,0,1,0,0,-s,0,e,0,0,0,0,1)}function r(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(e,-s,0,0,s,e,0,0,0,0,1,0,0,0,0,1)}function n(t,e){return this._t(1,e,t,1,0,0)}function h(t,e){return this.shear(Math.tan(t),Math.tan(e))}function o(t,e){var s=Math.cos(e),i=Math.sin(e);return this._t(s,i,0,0,-i,s,0,0,0,0,1,0,0,0,0,1)._t(1,0,0,0,Math.tan(t),1,0,0,0,0,1,0,0,0,0,1)._t(s,-i,0,0,i,s,0,0,0,0,1,0,0,0,0,1)}function p(t,e,s){return s=isNaN(s)?1:s,1==t&&1==e&&1==s?this:this._t(t,0,0,0,0,e,0,0,0,0,s,0,0,0,0,1)}function l(t,e,s,i,a,r,n,h,o,p,l,f,m,d,c,u){return this.props[0]=t,this.props[1]=e,this.props[2]=s,this.props[3]=i,this.props[4]=a,this.props[5]=r,this.props[6]=n,this.props[7]=h,this.props[8]=o,this.props[9]=p,this.props[10]=l,this.props[11]=f,this.props[12]=m,this.props[13]=d,this.props[14]=c,this.props[15]=u,this}function f(t,e,s){return s=s||0,0!==t||0!==e||0!==s?this._t(1,0,0,0,0,1,0,0,0,0,1,0,t,e,s,1):this}function m(t,e,s,i,a,r,n,h,o,p,l,f,m,d,c,u){if(1===t&&0===e&&0===s&&0===i&&0===a&&1===r&&0===n&&0===h&&0===o&&0===p&&1===l&&0===f)return(0!==m||0!==d||0!==c)&&(this.props[12]=this.props[12]*t+this.props[13]*a+this.props[14]*o+this.props[15]*m,this.props[13]=this.props[12]*e+this.props[13]*r+this.props[14]*p+this.props[15]*d,this.props[14]=this.props[12]*s+this.props[13]*n+this.props[14]*l+this.props[15]*c,this.props[15]=this.props[12]*i+this.props[13]*h+this.props[14]*f+this.props[15]*u),this;var v=this.props[0],g=this.props[1],y=this.props[2],b=this.props[3],k=this.props[4],P=this.props[5],A=this.props[6],E=this.props[7],M=this.props[8],F=this.props[9],w=this.props[10],S=this.props[11],D=this.props[12],C=this.props[13],x=this.props[14],T=this.props[15];return this.props[0]=v*t+g*a+y*o+b*m,this.props[1]=v*e+g*r+y*p+b*d,this.props[2]=v*s+g*n+y*l+b*c,this.props[3]=v*i+g*h+y*f+b*u,this.props[4]=k*t+P*a+A*o+E*m,this.props[5]=k*e+P*r+A*p+E*d,this.props[6]=k*s+P*n+A*l+E*c,this.props[7]=k*i+P*h+A*f+E*u,this.props[8]=M*t+F*a+w*o+S*m,this.props[9]=M*e+F*r+w*p+S*d,this.props[10]=M*s+F*n+w*l+S*c,this.props[11]=M*i+F*h+w*f+S*u,this.props[12]=D*t+C*a+x*o+T*m,this.props[13]=D*e+C*r+x*p+T*d,this.props[14]=D*s+C*n+x*l+T*c,this.props[15]=D*i+C*h+x*f+T*u,this}function d(t){var e;for(e=0;16>e;e+=1)t.props[e]=this.props[e]}function c(t){var e;for(e=0;16>e;e+=1)this.props[e]=t[e]}function u(t,e,s){return{x:t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12],y:t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13],z:t*this.props[2]+e*this.props[6]+s*this.props[10]+this.props[14]}}function v(t,e,s){return t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12]}function g(t,e,s){return t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13]}function y(t,e,s){return t*this.props[2]+e*this.props[6]+s*this.props[10]+this.props[14]}function b(t){var e,s=this.props[0]*this.props[5]-this.props[1]*this.props[4],i=this.props[5]/s,a=-this.props[1]/s,r=-this.props[4]/s,n=this.props[0]/s,h=(this.props[4]*this.props[13]-this.props[5]*this.props[12])/s,o=-(this.props[0]*this.props[13]-this.props[1]*this.props[12])/s,p=t.length,l=[];for(e=0;p>e;e+=1)l[e]=[t[e][0]*i+t[e][1]*r+h,t[e][0]*a+t[e][1]*n+o,0];return l}function k(t,e,s){return[t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12],t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13],t*this.props[2]+e*this.props[6]+s*this.props[10]+this.props[14]]}function P(t,e){return mt(t*this.props[0]+e*this.props[4]+this.props[12])+","+mt(t*this.props[1]+e*this.props[5]+this.props[13])}function A(){return[this.props[0],this.props[1],this.props[2],this.props[3],this.props[4],this.props[5],this.props[6],this.props[7],this.props[8],this.props[9],this.props[10],this.props[11],this.props[12],this.props[13],this.props[14],this.props[15]]}function E(){return ut?"matrix3d("+s(this.props[0])+","+s(this.props[1])+","+s(this.props[2])+","+s(this.props[3])+","+s(this.props[4])+","+s(this.props[5])+","+s(this.props[6])+","+s(this.props[7])+","+s(this.props[8])+","+s(this.props[9])+","+s(this.props[10])+","+s(this.props[11])+","+s(this.props[12])+","+s(this.props[13])+","+s(this.props[14])+","+s(this.props[15])+")":(this.cssParts[1]=this.props.join(","),this.cssParts.join(""))}function M(){return"matrix("+this.props[0]+","+this.props[1]+","+this.props[4]+","+this.props[5]+","+this.props[12]+","+this.props[13]+")"}function F(){return""+this.toArray()}return function(){this.reset=t,this.rotate=e,this.rotateX=i,this.rotateY=a,this.rotateZ=r,this.skew=h,this.skewFromAxis=o,this.shear=n,this.scale=p,this.setTransform=l,this.translate=f,this.transform=m,this.applyToPoint=u,this.applyToX=v,this.applyToY=g,this.applyToZ=y,this.applyToPointArray=k,this.applyToPointStringified=P,this.toArray=A,this.toCSS=E,this.to2dCSS=M,this.toString=F,this.clone=d,this.cloneFromProps=c,this.inversePoints=b,this._t=this.transform,this.props=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],this.cssParts=["matrix3d(","",")"]}}());!function(t,e){function s(s,p,l){var d=[];p=1==p?{entropy:!0}:p||{};var y=n(r(p.entropy?[s,o(t)]:null==s?h():s,3),d),b=new i(d),k=function(){for(var t=b.g(m),e=u,s=0;v>t;)t=(t+s)*f,e*=f,s=b.g(1);for(;t>=g;)t/=2,e/=2,s>>>=1;return(t+s)/e};return k.int32=function(){return 0|b.g(4)},k.quick=function(){return b.g(4)/4294967296},k["double"]=k,n(o(b.S),t),(p.pass||l||function(t,s,i,r){return r&&(r.S&&a(r,b),t.state=function(){return a(b,{})}),i?(e[c]=t,s):t})(k,y,"global"in p?p.global:this==e,p.state)}function i(t){var e,s=t.length,i=this,a=0,r=i.i=i.j=0,n=i.S=[];for(s||(t=[s++]);f>a;)n[a]=a++;for(a=0;f>a;a++)n[a]=n[r=y&r+t[a%s]+(e=n[a])],n[r]=e;(i.g=function(t){for(var e,s=0,a=i.i,r=i.j,n=i.S;t--;)e=n[a=y&a+1],s=s*f+n[y&(n[a]=n[r=y&r+e])+(n[r]=e)];return i.i=a,i.j=r,s})(f)}function a(t,e){return e.i=t.i,e.j=t.j,e.S=t.S.slice(),e}function r(t,e){var s,i=[],a=typeof t;if(e&&"object"==a)for(s in t)try{i.push(r(t[s],e-1))}catch(n){}return i.length?i:"string"==a?t:t+"\x00"}function n(t,e){for(var s,i=t+"",a=0;a<i.length;)e[y&a]=y&(s^=19*e[y&a])+i.charCodeAt(a++);return o(e)}function h(){try{if(p)return o(p.randomBytes(f));var e=new Uint8Array(f);return(l.crypto||l.msCrypto).getRandomValues(e),o(e)}catch(s){var i=l.navigator,a=i&&i.plugins;return[+new Date,l,a,l.screen,o(t)]}}function o(t){return String.fromCharCode.apply(0,t)}var p,l=this,f=256,m=6,d=52,c="random",u=e.pow(f,m),v=e.pow(2,d),g=2*v,y=f-1;e["seed"+c]=s,n(e.random(),t)}([],kt);var Mt=function(){function t(t,e,s,i,a){var r=a||("bez_"+t+"_"+e+"_"+s+"_"+i).replace(/\./g,"p");if(l[r])return l[r];var n=new o([t,e,s,i]);return l[r]=n,n}function e(t,e){return 1-3*e+3*t}function s(t,e){return 3*e-6*t}function i(t){return 3*t}function a(t,a,r){return((e(a,r)*t+s(a,r))*t+i(a))*t}function r(t,a,r){return 3*e(a,r)*t*t+2*s(a,r)*t+i(a)}function n(t,e,s,i,r){var n,h,o=0;do h=e+(s-e)/2,n=a(h,i,r)-t,n>0?s=h:e=h;while(Math.abs(n)>d&&++o<c);return h}function h(t,e,s,i){for(var n=0;f>n;++n){var h=r(e,s,i);if(0===h)return e;var o=a(e,s,i)-t;e-=o/h}return e}function o(t){this._p=t,this._mSampleValues=g?new Float32Array(u):new Array(u),this._precomputed=!1,this.get=this.get.bind(this)}var p={};p.getBezierEasing=t;var l={},f=4,m=.001,d=1e-7,c=10,u=11,v=1/(u-1),g="function"==typeof Float32Array;return o.prototype={get:function(t){var e=this._p[0],s=this._p[1],i=this._p[2],r=this._p[3];return this._precomputed||this._precompute(),e===s&&i===r?t:0===t?0:1===t?1:a(this._getTForX(t),s,r)},_precompute:function(){var t=this._p[0],e=this._p[1],s=this._p[2],i=this._p[3];this._precomputed=!0,(t!==e||s!==i)&&this._calcSampleValues()},_calcSampleValues:function(){for(var t=this._p[0],e=this._p[2],s=0;u>s;++s)this._mSampleValues[s]=a(s*v,t,e)},_getTForX:function(t){for(var e=this._p[0],s=this._p[2],i=this._mSampleValues,a=0,o=1,p=u-1;o!==p&&i[o]<=t;++o)a+=v;--o;var l=(t-i[o])/(i[o+1]-i[o]),f=a+l*v,d=r(f,e,s);return d>=m?h(t,f,e,s):0===d?f:n(t,a,a+v,e,s)}},p}();!function(){for(var t=0,e=["ms","moz","webkit","o"],s=0;s<e.length&&!window.requestAnimationFrame;++s)window.requestAnimationFrame=window[e[s]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e[s]+"CancelAnimationFrame"]||window[e[s]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(e,s){var i=(new Date).getTime(),a=Math.max(0,16-(i-t)),r=window.setTimeout(function(){e(i+a)},a);return t=i+a,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)})}();var Ft=E(),wt=M(),St=function(){function t(t,e){var s=document.createElement("span");s.style.fontFamily=e;var i=document.createElement("span");i.innerHTML="giItT1WQy@!-/#",s.style.position="absolute",s.style.left="-10000px",s.style.top="-10000px",s.style.fontSize="300px",s.style.fontVariant="normal",s.style.fontStyle="normal",s.style.fontWeight="normal",s.style.letterSpacing="0",s.appendChild(i),document.body.appendChild(s);var a=i.offsetWidth;return i.style.fontFamily=t+", "+e,{node:i,w:a,parent:s}}function e(){var t,s,i,a=this.fonts.length,r=a;for(t=0;a>t;t+=1)if(this.fonts[t].loaded)r-=1;else if("t"===this.fonts[t].fOrigin){if(window.Typekit&&window.Typekit.load&&0===this.typekitLoaded){this.typekitLoaded=1;try{window.Typekit.load({async:!0,active:function(){this.typekitLoaded=2}.bind(this)})}catch(n){}}2===this.typekitLoaded&&(this.fonts[t].loaded=!0)}else"n"===this.fonts[t].fOrigin?this.fonts[t].loaded=!0:(s=this.fonts[t].monoCase.node,i=this.fonts[t].monoCase.w,s.offsetWidth!==i?(r-=1,this.fonts[t].loaded=!0):(s=this.fonts[t].sansCase.node,i=this.fonts[t].sansCase.w,s.offsetWidth!==i&&(r-=1,this.fonts[t].loaded=!0)),this.fonts[t].loaded&&(this.fonts[t].sansCase.parent.parentNode.removeChild(this.fonts[t].sansCase.parent),this.fonts[t].monoCase.parent.parentNode.removeChild(this.fonts[t].monoCase.parent)));0!==r&&Date.now()-this.initTime<o?setTimeout(e.bind(this),20):setTimeout(function(){this.loaded=!0}.bind(this),0)}function s(t,e){var s=document.createElementNS(dt,"text");s.style.fontSize="100px",s.style.fontFamily=e.fFamily,s.textContent="1",e.fClass?(s.style.fontFamily="inherit",s.className=e.fClass):s.style.fontFamily=e.fFamily,t.appendChild(s);var i=document.createElement("canvas").getContext("2d");return i.font="100px "+e.fFamily,i}function i(i,a){if(!i)return void(this.loaded=!0);if(this.chars)return this.loaded=!0,void(this.fonts=i.list);var r,n=i.list,h=n.length;for(r=0;h>r;r+=1){if(n[r].loaded=!1,n[r].monoCase=t(n[r].fFamily,"monospace"),
n[r].sansCase=t(n[r].fFamily,"sans-serif"),n[r].fPath){if("p"===n[r].fOrigin){var o=document.createElement("style");o.type="text/css",o.innerHTML="@font-face {font-family: "+n[r].fFamily+"; font-style: normal; src: url('"+n[r].fPath+"');}",a.appendChild(o)}else if("g"===n[r].fOrigin){var p=document.createElement("link");p.type="text/css",p.rel="stylesheet",p.href=n[r].fPath,a.appendChild(p)}else if("t"===n[r].fOrigin){var l=document.createElement("script");l.setAttribute("src",n[r].fPath),a.appendChild(l)}}else n[r].loaded=!0;n[r].helper=s(a,n[r]),this.fonts.push(n[r])}e.bind(this)()}function a(t){if(t){this.chars||(this.chars=[]);var e,s,i,a=t.length,r=this.chars.length;for(e=0;a>e;e+=1){for(s=0,i=!1;r>s;)this.chars[s].style===t[e].style&&this.chars[s].fFamily===t[e].fFamily&&this.chars[s].ch===t[e].ch&&(i=!0),s+=1;i||(this.chars.push(t[e]),r+=1)}}}function r(t,e,s){for(var i=0,a=this.chars.length;a>i;){if(this.chars[i].ch===t&&this.chars[i].style===e&&this.chars[i].fFamily===s)return this.chars[i];i+=1}}function n(t,e,s){var i=this.getFontByName(e),a=i.helper;return a.measureText(t).width*s/100}function h(t){for(var e=0,s=this.fonts.length;s>e;){if(this.fonts[e].fName===t)return this.fonts[e];e+=1}return"sans-serif"}var o=5e3,p=function(){this.fonts=[],this.chars=null,this.typekitLoaded=0,this.loaded=!1,this.initTime=Date.now()};return p.prototype.addChars=a,p.prototype.addFonts=i,p.prototype.getCharData=r,p.prototype.getFontByName=h,p.prototype.measureText=n,p}(),Dt=function(){function t(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1;var t=this.comp.renderedFrame-this.offsetTime;if(t===this.lastFrame||this.lastFrame!==p&&(this.lastFrame>=this.keyframes[this.keyframes.length-1].t-this.offsetTime&&t>=this.keyframes[this.keyframes.length-1].t-this.offsetTime||this.lastFrame<this.keyframes[0].t-this.offsetTime&&t<this.keyframes[0].t-this.offsetTime));else{for(var e,s,i=0,a=this.keyframes.length-1,r=1,n=!0;n;){if(e=this.keyframes[i],s=this.keyframes[i+1],i==a-1&&t>=s.t-this.offsetTime){e.h&&(e=s);break}if(s.t-this.offsetTime>t)break;a-1>i?i+=r:n=!1}var h,o,l,f,m,d=0;if(e.to){e.bezierData||Ft.buildBezierData(e);var c=e.bezierData;if(t>=s.t-this.offsetTime||t<e.t-this.offsetTime){var u=t>=s.t-this.offsetTime?c.points.length-1:0;for(o=c.points[u].point.length,h=0;o>h;h+=1)this.v[h]=this.mult?c.points[u].point[h]*this.mult:c.points[u].point[h],this.pv[h]=c.points[u].point[h],this.lastPValue[h]!==this.pv[h]&&(this.mdf=!0,this.lastPValue[h]=this.pv[h])}else{e.__fnct?m=e.__fnct:(m=Mt.getBezierEasing(e.o.x,e.o.y,e.i.x,e.i.y,e.n).get,e.__fnct=m),l=m((t-(e.t-this.offsetTime))/(s.t-this.offsetTime-(e.t-this.offsetTime)));var v,g=c.segmentLength*l,y=0;for(r=1,n=!0,f=c.points.length;n;){if(y+=c.points[d].partialLength*r,0===g||0===l||d==c.points.length-1){for(o=c.points[d].point.length,h=0;o>h;h+=1)this.v[h]=this.mult?c.points[d].point[h]*this.mult:c.points[d].point[h],this.pv[h]=c.points[d].point[h],this.lastPValue[h]!==this.pv[h]&&(this.mdf=!0,this.lastPValue[h]=this.pv[h]);break}if(g>=y&&g<y+c.points[d+1].partialLength){for(v=(g-y)/c.points[d+1].partialLength,o=c.points[d].point.length,h=0;o>h;h+=1)this.v[h]=this.mult?(c.points[d].point[h]+(c.points[d+1].point[h]-c.points[d].point[h])*v)*this.mult:c.points[d].point[h]+(c.points[d+1].point[h]-c.points[d].point[h])*v,this.pv[h]=c.points[d].point[h]+(c.points[d+1].point[h]-c.points[d].point[h])*v,this.lastPValue[h]!==this.pv[h]&&(this.mdf=!0,this.lastPValue[h]=this.pv[h]);break}f-1>d&&1==r||d>0&&-1==r?d+=r:n=!1}}}else{var b,k,P,A,E,M=!1;for(a=e.s.length,i=0;a>i;i+=1){if(1!==e.h&&(e.o.x instanceof Array?(M=!0,e.__fnct||(e.__fnct=[]),e.__fnct[i]||(b=e.o.x[i]||e.o.x[0],k=e.o.y[i]||e.o.y[0],P=e.i.x[i]||e.i.x[0],A=e.i.y[i]||e.i.y[0])):(M=!1,e.__fnct||(b=e.o.x,k=e.o.y,P=e.i.x,A=e.i.y)),M?e.__fnct[i]?m=e.__fnct[i]:(m=Mt.getBezierEasing(b,k,P,A).get,e.__fnct[i]=m):e.__fnct?m=e.__fnct:(m=Mt.getBezierEasing(b,k,P,A).get,e.__fnct=m),l=t>=s.t-this.offsetTime?1:t<e.t-this.offsetTime?0:m((t-(e.t-this.offsetTime))/(s.t-this.offsetTime-(e.t-this.offsetTime)))),this.sh&&1!==e.h){var F=e.s[i],w=e.e[i];-180>F-w?F+=360:F-w>180&&(F-=360),E=F+(w-F)*l}else E=1===e.h?e.s[i]:e.s[i]+(e.e[i]-e.s[i])*l;1===a?(this.v=this.mult?E*this.mult:E,this.pv=E,this.lastPValue!=this.pv&&(this.mdf=!0,this.lastPValue=this.pv)):(this.v[i]=this.mult?E*this.mult:E,this.pv[i]=E,this.lastPValue[i]!==this.pv[i]&&(this.mdf=!0,this.lastPValue[i]=this.pv[i]))}}}this.lastFrame=t,this.frameId=this.elem.globalData.frameId}}function e(){}function s(t,s,i){this.mult=i,this.v=i?s.k*i:s.k,this.pv=s.k,this.mdf=!1,this.comp=t.comp,this.k=!1,this.kf=!1,this.vel=0,this.getValue=e}function i(t,s,i){this.mult=i,this.data=s,this.mdf=!1,this.comp=t.comp,this.k=!1,this.kf=!1,this.frameId=-1,this.v=new Array(s.k.length),this.pv=new Array(s.k.length),this.lastValue=new Array(s.k.length);var a=Array.apply(null,{length:s.k.length});this.vel=a.map(function(){return 0});var r,n=s.k.length;for(r=0;n>r;r+=1)this.v[r]=i?s.k[r]*i:s.k[r],this.pv[r]=s.k[r];this.getValue=e}function a(e,s,i){this.keyframes=s.k,this.offsetTime=e.data.st,this.lastValue=-99999,this.lastPValue=-99999,this.frameId=-1,this.k=!0,this.kf=!0,this.data=s,this.mult=i,this.elem=e,this.comp=e.comp,this.lastFrame=p,this.v=i?s.k[0].s[0]*i:s.k[0].s[0],this.pv=s.k[0].s[0],this.getValue=t}function r(e,s,i){var a,r,n,h,o,l=s.k.length;for(a=0;l-1>a;a+=1)s.k[a].to&&s.k[a].s&&s.k[a].e&&(r=s.k[a].s,n=s.k[a].e,h=s.k[a].to,o=s.k[a].ti,(2===r.length&&(r[0]!==n[0]||r[1]!==n[1])&&Ft.pointOnLine2D(r[0],r[1],n[0],n[1],r[0]+h[0],r[1]+h[1])&&Ft.pointOnLine2D(r[0],r[1],n[0],n[1],n[0]+o[0],n[1]+o[1])||3===r.length&&(r[0]!==n[0]||r[1]!==n[1]||r[2]!==n[2])&&Ft.pointOnLine3D(r[0],r[1],r[2],n[0],n[1],n[2],r[0]+h[0],r[1]+h[1],r[2]+h[2])&&Ft.pointOnLine3D(r[0],r[1],r[2],n[0],n[1],n[2],n[0]+o[0],n[1]+o[1],n[2]+o[2]))&&(s.k[a].to=null,s.k[a].ti=null));this.keyframes=s.k,this.offsetTime=e.data.st,this.k=!0,this.kf=!0,this.mult=i,this.elem=e,this.comp=e.comp,this.getValue=t,this.frameId=-1,this.v=new Array(s.k[0].s.length),this.pv=new Array(s.k[0].s.length),this.lastValue=new Array(s.k[0].s.length),this.lastPValue=new Array(s.k[0].s.length),this.lastFrame=p}function n(t,e,n,h,o){var p;if(2===n)p=new l(t,e,o);else if(e.k.length)if("number"==typeof e.k[0])p=new i(t,e,h);else switch(n){case 0:p=new a(t,e,h);break;case 1:p=new r(t,e,h)}else p=new s(t,e,h);return p.k&&o.push(p),p}function h(t,e,s,i){return new m(t,e,s,i)}function o(t,e,s){return new d(t,e,s)}var p=-999999,l=function(){function t(){return this.p.k&&this.p.getValue(),this.p.v.key||(this.p.v.key=function(t){return this.p.v.numKeys?this.p.keyframes[t-1].t:0}.bind(this)),this.p.v.numKeys||(this.p.v.numKeys=this.p.keyframes?this.p.keyframes.length:0),this.p.v.valueAtTime||(this.p.v.valueAtTime=this.p.getValueAtTime.bind(this.p)),this.p.v}function e(){return this.px.k&&this.px.getValue(),this.px.v}function s(){return this.py.k&&this.py.getValue(),this.py.v}function i(){return this.a.k&&this.a.getValue(),this.a.v}function a(){return this.or.k&&this.or.getValue(),this.or.v}function r(){return this.r.k&&this.r.getValue(),this.r.v/At}function n(){return this.s.k&&this.s.getValue(),this.s.v}function h(){return this.o.k&&this.o.getValue(),this.o.v}function o(){return this.sk.k&&this.sk.getValue(),this.sk.v}function p(){return this.sa.k&&this.sa.getValue(),this.sa.v}function l(t){var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0);this.a&&t.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&t.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.r?t.rotate(-this.r.v):t.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.data.p.s?this.data.p.z?t.translate(this.px.v,this.py.v,-this.pz.v):t.translate(this.px.v,this.py.v,0):t.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}function f(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1;var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t].mdf&&(this.mdf=!0);if(this.mdf){if(this.v.reset(),this.a&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r?this.v.rotate(-this.r.v):this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.autoOriented&&this.p.keyframes&&this.p.getValueAtTime){var s,i;this.p.lastFrame+this.p.offsetTime<this.p.keyframes[0].t?(s=this.p.getValueAtTime(this.p.keyframes[0].t+.01,0),i=this.p.getValueAtTime(this.p.keyframes[0].t,0)):this.p.lastFrame+this.p.offsetTime>this.p.keyframes[this.p.keyframes.length-1].t?(s=this.p.getValueAtTime(this.p.keyframes[this.p.keyframes.length-1].t,0),i=this.p.getValueAtTime(this.p.keyframes[this.p.keyframes.length-1].t-.01,0)):(s=this.p.pv,i=this.p.getValueAtTime(this.p.lastFrame+this.p.offsetTime-.01,this.p.offsetTime)),this.v.rotate(-Math.atan2(s[1]-i[1],s[0]-i[0]))}this.data.p.s?this.data.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}this.frameId=this.elem.globalData.frameId}}function m(){this.inverted=!0,this.iv=new k,this.k||(this.data.p.s?this.iv.translate(this.px.v,this.py.v,-this.pz.v):this.iv.translate(this.p.v[0],this.p.v[1],-this.p.v[2]),this.r?this.iv.rotate(-this.r.v):this.iv.rotateX(-this.rx.v).rotateY(-this.ry.v).rotateZ(this.rz.v),this.s&&this.iv.scale(this.s.v[0],this.s.v[1],1),this.a&&this.iv.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]))}function d(){}return function(c,u,v){this.elem=c,this.frameId=-1,this.dynamicProperties=[],this.mdf=!1,this.data=u,this.getValue=f,this.applyToMatrix=l,this.setInverted=m,this.autoOrient=d,this.v=new k,u.p.s?(this.px=Dt.getProp(c,u.p.x,0,0,this.dynamicProperties),this.py=Dt.getProp(c,u.p.y,0,0,this.dynamicProperties),u.p.z&&(this.pz=Dt.getProp(c,u.p.z,0,0,this.dynamicProperties))):this.p=Dt.getProp(c,u.p,1,0,this.dynamicProperties),u.r?this.r=Dt.getProp(c,u.r,0,At,this.dynamicProperties):u.rx&&(this.rx=Dt.getProp(c,u.rx,0,At,this.dynamicProperties),this.ry=Dt.getProp(c,u.ry,0,At,this.dynamicProperties),this.rz=Dt.getProp(c,u.rz,0,At,this.dynamicProperties),this.or=Dt.getProp(c,u.or,0,At,this.dynamicProperties)),u.sk&&(this.sk=Dt.getProp(c,u.sk,0,At,this.dynamicProperties),this.sa=Dt.getProp(c,u.sa,0,At,this.dynamicProperties)),u.a&&(this.a=Dt.getProp(c,u.a,1,0,this.dynamicProperties)),u.s&&(this.s=Dt.getProp(c,u.s,1,.01,this.dynamicProperties)),this.o=u.o?Dt.getProp(c,u.o,0,.01,v):{mdf:!1,v:1},this.dynamicProperties.length?v.push(this):(this.a&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r?this.v.rotate(-this.r.v):this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.data.p.s?u.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])),Object.defineProperty(this,"position",{get:t}),Object.defineProperty(this,"xPosition",{get:e}),Object.defineProperty(this,"yPosition",{get:s}),Object.defineProperty(this,"orientation",{get:a}),Object.defineProperty(this,"anchorPoint",{get:i}),Object.defineProperty(this,"rotation",{get:r}),Object.defineProperty(this,"scale",{get:n}),Object.defineProperty(this,"opacity",{get:h}),Object.defineProperty(this,"skew",{get:o}),Object.defineProperty(this,"skewAxis",{get:p})}}(),f=function(){function t(t){if(this.prop.getValue(),this.cmdf=!1,this.omdf=!1,this.prop.mdf||t){var e,s,i,a=4*this.data.p;for(e=0;a>e;e+=1)s=e%4===0?100:255,i=Math.round(this.prop.v[e]*s),this.c[e]!==i&&(this.c[e]=i,this.cmdf=!0);if(this.o.length)for(a=this.prop.v.length,e=4*this.data.p;a>e;e+=1)s=e%2===0?100:1,i=e%2===0?Math.round(100*this.prop.v[e]):this.prop.v[e],this.o[e-4*this.data.p]!==i&&(this.o[e-4*this.data.p]=i,this.omdf=!0)}}function e(e,s,i){this.prop=n(e,s.k,1,null,[]),this.data=s,this.k=this.prop.k,this.c=Array.apply(null,{length:4*s.p});var a=s.k.k[0].s?s.k.k[0].s.length-4*s.p:s.k.k.length-4*s.p;this.o=Array.apply(null,{length:a}),this.cmdf=!1,this.omdf=!1,this.getValue=t,this.prop.k&&i.push(this),this.getValue(!0)}return function(t,s,i){return new e(t,s,i)}}(),m=function(){function t(t){var e=0,s=this.dataProps.length;if(this.elem.globalData.frameId!==this.frameId||t){for(this.mdf=!1,this.frameId=this.elem.globalData.frameId;s>e;){if(this.dataProps[e].p.mdf){this.mdf=!0;break}e+=1}if(this.mdf||t)for("svg"===this.renderer&&(this.dasharray=""),e=0;s>e;e+=1)"o"!=this.dataProps[e].n?"svg"===this.renderer?this.dasharray+=" "+this.dataProps[e].p.v:this.dasharray[e]=this.dataProps[e].p.v:this.dashoffset=this.dataProps[e].p.v}}return function(e,s,i,a){this.elem=e,this.frameId=-1,this.dataProps=new Array(s.length),this.renderer=i,this.mdf=!1,this.k=!1,this.dasharray="svg"===this.renderer?"":new Array(s.length-1),this.dashoffset=0;var r,n,h=s.length;for(r=0;h>r;r+=1)n=Dt.getProp(e,s[r].v,0,0,a),this.k=n.k?!0:this.k,this.dataProps[r]={n:s[r].n,p:n};this.getValue=t,this.k?a.push(this):this.getValue(!0)}}(),d=function(){function t(){if(this.dynamicProperties.length){var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t].mdf&&(this.mdf=!0)}var s=this.data.totalChars,i=2===this.data.r?1:100/s,a=this.o.v/i,r=this.s.v/i+a,n=this.e.v/i+a;if(r>n){var h=r;r=n,n=h}this.finalS=r,this.finalE=n}function e(t){var e=Mt.getBezierEasing(this.ne.v/100,0,1-this.xe.v/100,1).get,r=0,n=this.finalS,h=this.finalE,o=this.data.sh;if(2==o)r=h===n?t>=h?1:0:s(0,i(.5/(h-n)+(t-n)/(h-n),1)),r=e(r);else if(3==o)r=h===n?t>=h?0:1:1-s(0,i(.5/(h-n)+(t-n)/(h-n),1)),r=e(r);else if(4==o)h===n?r=t>=h?0:1:(r=s(0,i(.5/(h-n)+(t-n)/(h-n),1)),.5>r?r*=2:r=1-2*(r-.5)),r=e(r);else if(5==o){if(h===n)r=t>=h?0:1;else{var p=h-n;t=i(s(0,t+.5-n),h-n);var l=-p/2+t,f=p/2;r=Math.sqrt(1-l*l/(f*f))}r=e(r)}else 6==o?(h===n?r=t>=h?0:1:(t=i(s(0,t+.5-n),h-n),r=(1+Math.cos(Math.PI+2*Math.PI*t/(h-n)))/2),r=e(r)):(t>=a(n)&&(r=0>t-n?1-(n-t):s(0,i(h-t,1))),r=e(r));return r*this.a.v}var s=Math.max,i=Math.min,a=Math.floor;return function(s,i,a){this.mdf=!1,this.k=!1,this.data=i,this.dynamicProperties=[],this.getValue=t,this.getMult=e,this.comp=s.comp,this.finalS=0,this.finalE=0,this.s=Dt.getProp(s,i.s||{k:0},0,0,this.dynamicProperties),this.e="e"in i?Dt.getProp(s,i.e,0,0,this.dynamicProperties):{v:2===i.r?i.totalChars:100},this.o=Dt.getProp(s,i.o||{k:0},0,0,this.dynamicProperties),this.xe=Dt.getProp(s,i.xe||{k:0},0,0,this.dynamicProperties),this.ne=Dt.getProp(s,i.ne||{k:0},0,0,this.dynamicProperties),this.a=Dt.getProp(s,i.a,0,.01,this.dynamicProperties),this.dynamicProperties.length?a.push(this):this.getValue()}}(),c={};return c.getProp=n,c.getDashProp=h,c.getTextSelectorProp=o,c.getGradientProp=f,c}(),Ct=function(){function t(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1;var t=this.comp.renderedFrame-this.offsetTime;if(this.lastFrame!==n&&(this.lastFrame<this.keyframes[0].t-this.offsetTime&&t<this.keyframes[0].t-this.offsetTime||this.lastFrame>this.keyframes[this.keyframes.length-1].t-this.offsetTime&&t>this.keyframes[this.keyframes.length-1].t-this.offsetTime));else{var e,s,i;if(t<this.keyframes[0].t-this.offsetTime)e=this.keyframes[0].s[0],i=!0;else if(t>=this.keyframes[this.keyframes.length-1].t-this.offsetTime)e=1===this.keyframes[this.keyframes.length-2].h?this.keyframes[this.keyframes.length-1].s[0]:this.keyframes[this.keyframes.length-2].e[0],i=!0;else{for(var a,r,h,o,p,l,f=0,m=this.keyframes.length-1,d=!0;d&&(a=this.keyframes[f],r=this.keyframes[f+1],!(r.t-this.offsetTime>t));)m-1>f?f+=1:d=!1;i=1===a.h,i&&f===m&&(a=r);var c;if(!i){var u;a.__fnct?u=a.__fnct:(u=Mt.getBezierEasing(a.o.x,a.o.y,a.i.x,a.i.y).get,a.__fnct=u),c=t>=r.t-this.offsetTime?1:t<a.t-this.offsetTime?0:u((t-(a.t-this.offsetTime))/(r.t-this.offsetTime-(a.t-this.offsetTime))),s=a.e[0]}e=a.s[0]}o=this.v.i.length,l=e.i[0].length;var v,g=!1;for(h=0;o>h;h+=1)for(p=0;l>p;p+=1)i?(v=e.i[h][p],this.v.i[h][p]!==v&&(this.v.i[h][p]=v,this.pv.i[h][p]=v,g=!0),v=e.o[h][p],this.v.o[h][p]!==v&&(this.v.o[h][p]=v,this.pv.o[h][p]=v,g=!0),v=e.v[h][p],this.v.v[h][p]!==v&&(this.v.v[h][p]=v,this.pv.v[h][p]=v,g=!0)):(v=e.i[h][p]+(s.i[h][p]-e.i[h][p])*c,this.v.i[h][p]!==v&&(this.v.i[h][p]=v,this.pv.i[h][p]=v,g=!0),v=e.o[h][p]+(s.o[h][p]-e.o[h][p])*c,this.v.o[h][p]!==v&&(this.v.o[h][p]=v,this.pv.o[h][p]=v,g=!0),v=e.v[h][p]+(s.v[h][p]-e.v[h][p])*c,this.v.v[h][p]!==v&&(this.v.v[h][p]=v,this.pv.v[h][p]=v,g=!0));this.mdf=g,this.paths.length=0,this.v.c=e.c,this.paths[0]=this.v}this.lastFrame=t,this.frameId=this.elem.globalData.frameId}}function e(){return this.v}function s(){this.resetPaths.length=1,this.resetPaths[0]=this.v,this.paths=this.resetPaths,this.k||(this.mdf=!1)}function i(t,i,a){this.resetPaths=[],this.comp=t.comp,this.k=!1,this.mdf=!1,this.numNodes=3===a?i.pt.k.v.length:i.ks.k.v.length,this.v=3===a?i.pt.k:i.ks.k,this.getValue=e,this.pv=this.v,this.paths=[this.v],this.reset=s}function a(e,i,a){this.resetPaths=[],this.comp=e.comp,this.elem=e,this.offsetTime=e.data.st,this.getValue=t,this.keyframes=3===a?i.pt.k:i.ks.k,this.k=!0;var r,h=this.keyframes[0].s[0].i.length,o=this.keyframes[0].s[0].i[0].length;for(this.numNodes=h,this.v={i:Array.apply(null,{length:h}),o:Array.apply(null,{length:h}),v:Array.apply(null,{length:h}),c:this.keyframes[0].s[0].c},this.pv={i:Array.apply(null,{length:h}),o:Array.apply(null,{length:h}),v:Array.apply(null,{length:h}),c:this.keyframes[0].s[0].c},r=0;h>r;r+=1)this.v.i[r]=Array.apply(null,{length:o}),this.v.o[r]=Array.apply(null,{length:o}),this.v.v[r]=Array.apply(null,{length:o}),this.pv.i[r]=Array.apply(null,{length:o}),this.pv.o[r]=Array.apply(null,{length:o}),this.pv.v[r]=Array.apply(null,{length:o});this.paths=[],this.lastFrame=n,this.reset=s}function r(t,e,s,r){var n;if(3===s||4===s){var l=3===s?e.pt.k:e.ks.k;n=l.length?new a(t,e,s):new i(t,e,s)}else 5===s?n=new p(t,e):6===s?n=new h(t,e):7===s&&(n=new o(t,e));return n.k&&r.push(n),n}var n=-999999,h=function(){function t(){var t=this.p.v[0],e=this.p.v[1],s=this.s.v[0]/2,a=this.s.v[1]/2;2!==this.d&&3!==this.d?(this.v.v[0]=[t,e-a],this.v.i[0]=[t-s*i,e-a],this.v.o[0]=[t+s*i,e-a],this.v.v[1]=[t+s,e],this.v.i[1]=[t+s,e-a*i],this.v.o[1]=[t+s,e+a*i],this.v.v[2]=[t,e+a],this.v.i[2]=[t+s*i,e+a],this.v.o[2]=[t-s*i,e+a],this.v.v[3]=[t-s,e],this.v.i[3]=[t-s,e+a*i],this.v.o[3]=[t-s,e-a*i]):(this.v.v[0]=[t,e-a],this.v.o[0]=[t-s*i,e-a],this.v.i[0]=[t+s*i,e-a],this.v.v[1]=[t-s,e],this.v.o[1]=[t-s,e+a*i],this.v.i[1]=[t-s,e-a*i],this.v.v[2]=[t,e+a],this.v.o[2]=[t+s*i,e+a],this.v.i[2]=[t-s*i,e+a],this.v.v[3]=[t+s,e],this.v.o[3]=[t+s,e-a*i],this.v.i[3]=[t+s,e+a*i]),this.paths.length=0,this.paths[0]=this.v}function e(t){var e,s=this.dynamicProperties.length;if(this.elem.globalData.frameId!==this.frameId){for(this.mdf=!1,this.frameId=this.elem.globalData.frameId,e=0;s>e;e+=1)this.dynamicProperties[e].getValue(t),this.dynamicProperties[e].mdf&&(this.mdf=!0);this.mdf&&(this.convertEllToPath(),this.paths.length=0,this.paths[0]=this.v)}}var i=Et;return function(i,a){this.v={v:Array.apply(null,{length:4}),i:Array.apply(null,{length:4}),o:Array.apply(null,{length:4}),c:!0},this.numNodes=4,this.d=a.d,this.dynamicProperties=[],this.resetPaths=[],this.paths=[],this.elem=i,this.comp=i.comp,this.frameId=-1,this.mdf=!1,this.getValue=e,this.convertEllToPath=t,this.reset=s,this.p=Dt.getProp(i,a.p,1,0,this.dynamicProperties),this.s=Dt.getProp(i,a.s,1,0,this.dynamicProperties),this.dynamicProperties.length?this.k=!0:this.convertEllToPath()}}(),o=function(){function t(){var t=Math.floor(this.pt.v),e=2*Math.PI/t;this.v.v.length=t,this.v.i.length=t,this.v.o.length=t;var s,i=this.or.v,a=this.os.v,r=2*Math.PI*i/(4*t),n=-Math.PI/2,h=3===this.data.d?-1:1;for(n+=this.r.v,s=0;t>s;s+=1){var o=i*Math.cos(n),p=i*Math.sin(n),l=0===o&&0===p?0:p/Math.sqrt(o*o+p*p),f=0===o&&0===p?0:-o/Math.sqrt(o*o+p*p);o+=+this.p.v[0],p+=+this.p.v[1],this.v.v[s]=[o,p],this.v.i[s]=[o+l*r*a*h,p+f*r*a*h],this.v.o[s]=[o-l*r*a*h,p-f*r*a*h],n+=e*h}this.numNodes=t,this.paths.length=0,this.paths[0]=this.v}function e(){var t=2*Math.floor(this.pt.v),e=2*Math.PI/t;this.v.v.length=t,this.v.i.length=t,this.v.o.length=t;var s,i,a,r,n=!0,h=this.or.v,o=this.ir.v,p=this.os.v,l=this.is.v,f=2*Math.PI*h/(2*t),m=2*Math.PI*o/(2*t),d=-Math.PI/2;d+=this.r.v;var c=3===this.data.d?-1:1;for(s=0;t>s;s+=1){i=n?h:o,a=n?p:l,r=n?f:m;var u=i*Math.cos(d),v=i*Math.sin(d),g=0===u&&0===v?0:v/Math.sqrt(u*u+v*v),y=0===u&&0===v?0:-u/Math.sqrt(u*u+v*v);u+=+this.p.v[0],v+=+this.p.v[1],this.v.v[s]=[u,v],this.v.i[s]=[u+g*r*a*c,v+y*r*a*c],this.v.o[s]=[u-g*r*a*c,v-y*r*a*c],n=!n,d+=e*c}this.numNodes=t,this.paths.length=0,this.paths[0]=this.v}function i(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1,this.frameId=this.elem.globalData.frameId;var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t].mdf&&(this.mdf=!0);this.mdf&&this.convertToPath()}}return function(a,r){this.v={v:[],i:[],o:[],c:!0},this.resetPaths=[],this.elem=a,this.comp=a.comp,this.data=r,this.frameId=-1,this.d=r.d,this.dynamicProperties=[],this.mdf=!1,this.getValue=i,this.reset=s,1===r.sy?(this.ir=Dt.getProp(a,r.ir,0,0,this.dynamicProperties),this.is=Dt.getProp(a,r.is,0,.01,this.dynamicProperties),this.convertToPath=e):this.convertToPath=t,this.pt=Dt.getProp(a,r.pt,0,0,this.dynamicProperties),this.p=Dt.getProp(a,r.p,1,0,this.dynamicProperties),this.r=Dt.getProp(a,r.r,0,At,this.dynamicProperties),this.or=Dt.getProp(a,r.or,0,0,this.dynamicProperties),this.os=Dt.getProp(a,r.os,0,.01,this.dynamicProperties),this.paths=[],this.dynamicProperties.length?this.k=!0:this.convertToPath()}}(),p=function(){function t(t){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1,this.frameId=this.elem.globalData.frameId;var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(t),this.dynamicProperties[e].mdf&&(this.mdf=!0);this.mdf&&this.convertRectToPath()}}function e(){var t=this.p.v[0],e=this.p.v[1],s=this.s.v[0]/2,i=this.s.v[1]/2,a=bt(s,i,this.r.v),r=a*(1-Et);0===a?(this.v.v.length=4,this.v.i.length=4,this.v.o.length=4):(this.v.v.length=8,this.v.i.length=8,this.v.o.length=8),2===this.d||1===this.d?(this.v.v[0]=[t+s,e-i+a],this.v.o[0]=this.v.v[0],this.v.i[0]=[t+s,e-i+r],this.v.v[1]=[t+s,e+i-a],this.v.o[1]=[t+s,e+i-r],this.v.i[1]=this.v.v[1],0!==a?(this.v.v[2]=[t+s-a,e+i],this.v.o[2]=this.v.v[2],this.v.i[2]=[t+s-r,e+i],this.v.v[3]=[t-s+a,e+i],this.v.o[3]=[t-s+r,e+i],this.v.i[3]=this.v.v[3],this.v.v[4]=[t-s,e+i-a],this.v.o[4]=this.v.v[4],this.v.i[4]=[t-s,e+i-r],this.v.v[5]=[t-s,e-i+a],this.v.o[5]=[t-s,e-i+r],this.v.i[5]=this.v.v[5],this.v.v[6]=[t-s+a,e-i],this.v.o[6]=this.v.v[6],this.v.i[6]=[t-s+r,e-i],this.v.v[7]=[t+s-a,e-i],this.v.o[7]=[t+s-r,e-i],this.v.i[7]=this.v.v[7]):(this.v.v[2]=[t-s+a,e+i],this.v.o[2]=[t-s+r,e+i],this.v.i[2]=this.v.v[2],this.v.v[3]=[t-s,e-i+a],this.v.o[3]=[t-s,e-i+r],this.v.i[3]=this.v.v[3])):(this.v.v[0]=[t+s,e-i+a],this.v.o[0]=[t+s,e-i+r],this.v.i[0]=this.v.v[0],0!==a?(this.v.v[1]=[t+s-a,e-i],this.v.o[1]=this.v.v[1],this.v.i[1]=[t+s-r,e-i],this.v.v[2]=[t-s+a,e-i],this.v.o[2]=[t-s+r,e-i],this.v.i[2]=this.v.v[2],this.v.v[3]=[t-s,e-i+a],this.v.o[3]=this.v.v[3],this.v.i[3]=[t-s,e-i+r],this.v.v[4]=[t-s,e+i-a],this.v.o[4]=[t-s,e+i-r],this.v.i[4]=this.v.v[4],this.v.v[5]=[t-s+a,e+i],this.v.o[5]=this.v.v[5],this.v.i[5]=[t-s+r,e+i],this.v.v[6]=[t+s-a,e+i],this.v.o[6]=[t+s-r,e+i],this.v.i[6]=this.v.v[6],this.v.v[7]=[t+s,e+i-a],this.v.o[7]=this.v.v[7],this.v.i[7]=[t+s,e+i-r]):(this.v.v[1]=[t-s+a,e-i],this.v.o[1]=[t-s+r,e-i],this.v.i[1]=this.v.v[1],this.v.v[2]=[t-s,e+i-a],this.v.o[2]=[t-s,e+i-r],this.v.i[2]=this.v.v[2],this.v.v[3]=[t+s-a,e+i],this.v.o[3]=[t+s-r,e+i],this.v.i[3]=this.v.v[3])),this.paths.length=0,this.paths[0]=this.v}return function(i,a){this.v={v:Array.apply(null,{length:8}),i:Array.apply(null,{length:8}),o:Array.apply(null,{length:8}),c:!0},this.resetPaths=[],this.paths=[],this.numNodes=8,this.elem=i,this.comp=i.comp,this.frameId=-1,this.d=a.d,this.dynamicProperties=[],this.mdf=!1,this.getValue=t,this.convertRectToPath=e,this.reset=s,this.p=Dt.getProp(i,a.p,1,0,this.dynamicProperties),this.s=Dt.getProp(i,a.s,1,0,this.dynamicProperties),this.r=Dt.getProp(i,a.r,0,0,this.dynamicProperties),this.dynamicProperties.length?this.k=!0:this.convertRectToPath()}}(),l={};return l.getShapeProp=r,l}(),xt=function(){function t(t,e){i[t]||(i[t]=e)}function e(t,e,s,a){return new i[t](e,s,a)}var s={},i={};return s.registerModifier=t,s.getModifier=e,s}();F.prototype.initModifierProperties=function(){},F.prototype.addShapeToModifier=function(){},F.prototype.addShape=function(t){this.closed||(this.shapes.push({shape:t,last:[]}),this.addShapeToModifier(t))},F.prototype.init=function(t,e,s){this.elem=t,this.frameId=-1,this.shapes=[],this.dynamicProperties=[],this.mdf=!1,this.closed=!1,this.k=!1,this.isTrimming=!1,this.comp=t.comp,this.initModifierProperties(t,e),this.dynamicProperties.length?(this.k=!0,s.push(this)):this.getValue(!0)},A(F,w),w.prototype.processKeys=function(t){if(this.elem.globalData.frameId!==this.frameId||t){this.mdf=t?!0:!1,this.frameId=this.elem.globalData.frameId;var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0);if(this.mdf||t){var i=this.o.v%360/360;0>i&&(i+=1);var a=this.s.v+i,r=this.e.v+i;if(a>r){var n=a;a=r,r=n}this.sValue=a,this.eValue=r,this.oValue=i}}},w.prototype.initModifierProperties=function(t,e){this.sValue=0,this.eValue=0,this.oValue=0,this.getValue=this.processKeys,this.s=Dt.getProp(t,e.s,0,.01,this.dynamicProperties),this.e=Dt.getProp(t,e.e,0,.01,this.dynamicProperties),this.o=Dt.getProp(t,e.o,0,0,this.dynamicProperties),this.m=e.m,this.dynamicProperties.length||this.getValue(!0)},w.prototype.getSegmentsLength=function(t){var e,s=t.c,i=t.v,a=t.o,r=t.i,n=i.length,h=[],o=0;for(e=0;n-1>e;e+=1)h[e]=Ft.getBezierLength(i[e],i[e+1],a[e],r[e+1]),o+=h[e].addedLength;return s&&(h[e]=Ft.getBezierLength(i[e],i[0],a[e],r[0]),o+=h[e].addedLength),{lengths:h,totalLength:o}},w.prototype.calculateShapeEdges=function(t,e,s,i,a){var r=[];1>=e?r.push({s:t,e:e}):t>=1?r.push({s:t-1,e:e-1}):(r.push({s:t,e:1}),r.push({s:0,e:e-1}));var n,h,o=[],p=r.length;for(n=0;p>n;n+=1)if(h=r[n],h.e*a<i||h.s*a>i+s);else{var l,f;l=h.s*a<=i?0:(h.s*a-i)/s,f=h.e*a>=i+s?1:(h.e*a-i)/s,o.push([l,f])}return o.length||o.push([0,0]),o},w.prototype.processShapes=function(t){var e,s,i,a,r,n,h,o=this.shapes.length,p=this.sValue,l=this.eValue,f=0;if(l===p)for(s=0;o>s;s+=1)this.shapes[s].shape.paths=[],this.shapes[s].shape.mdf=!0;else if(1===l&&0===p||0===l&&1===p)for(s=0;o>s;s+=1)m=this.shapes[s],m.shape.paths!==m.last&&(m.shape.mdf=!0,m.last=m.shape.paths);else{var m,d,c=[];for(s=0;o>s;s+=1)if(m=this.shapes[s],m.shape.mdf||this.mdf||t||2===this.m){if(e=m.shape.paths,a=e.length,h=0,!m.shape.mdf&&m.pathsData)h=m.totalShapeLength;else{for(r=[],i=0;a>i;i+=1)n=this.getSegmentsLength(e[i]),r.push(n),h+=n.totalLength;m.totalShapeLength=h,m.pathsData=r}f+=h,m.shape.mdf=!0}else m.shape.paths=m.last;var i,a,u=p,v=l,g=0;for(s=o-1;s>=0;s-=1)if(d=[],m=this.shapes[s],m.shape.mdf){if(2===this.m&&o>1){var y=this.calculateShapeEdges(p,l,m.totalShapeLength,g,f);g+=m.totalShapeLength}else y=[[u,v]];for(a=y.length,i=0;a>i;i+=1){u=y[i][0],v=y[i][1],c.length=0,1>=v?c.push({s:m.totalShapeLength*u,e:m.totalShapeLength*v}):u>=1?c.push({s:m.totalShapeLength*(u-1),e:m.totalShapeLength*(v-1)}):(c.push({s:m.totalShapeLength*u,e:m.totalShapeLength}),c.push({s:0,e:m.totalShapeLength*(v-1)}));var b=this.addShapes(m,c[0]);if(c[0].s!==c[0].e){var k;d.push(b),c.length>1&&(m.shape.v.c?this.addShapes(m,c[1],b):(b.i[0]=[b.v[0][0],b.v[0][1]],k=b.v.length-1,b.o[k]=[b.v[k][0],b.v[k][1]],b=this.addShapes(m,c[1]),d.push(b))),b.i[0]=[b.v[0][0],b.v[0][1]],k=b.v.length-1,b.o[k]=[b.v[k][0],b.v[k][1]]}}m.last=d,m.shape.paths=d}}this.dynamicProperties.length||(this.mdf=!1)},w.prototype.addSegment=function(t,e,s,i,a,r){a.o[r]=e,a.i[r+1]=s,a.v[r+1]=i,a.v[r]=t},w.prototype.addShapes=function(t,e,s){var i,a,r,n,h,o,p,l=t.pathsData,f=t.shape.paths,m=f.length,d=0;for(s?h=s.v.length-1:(s={c:!1,v:[],i:[],o:[]},h=0),i=0;m>i;i+=1){for(o=l[i].lengths,r=f[i].c?o.length:o.length+1,a=1;r>a;a+=1)if(n=o[a-1],d+n.addedLength<e.s)d+=n.addedLength;else{if(d>e.e)break;e.s<=d&&e.e>=d+n.addedLength?this.addSegment(f[i].v[a-1],f[i].o[a-1],f[i].i[a],f[i].v[a],s,h):(p=Ft.getNewSegment(f[i].v[a-1],f[i].v[a],f[i].o[a-1],f[i].i[a],(e.s-d)/n.addedLength,(e.e-d)/n.addedLength,o[a-1]),this.addSegment(p.pt1,p.pt3,p.pt4,p.pt2,s,h)),d+=n.addedLength,h+=1}if(f[i].c&&d<=e.e){var c=o[a-1].addedLength;e.s<=d&&e.e>=d+c?this.addSegment(f[i].v[a-1],f[i].o[a-1],f[i].i[0],f[i].v[0],s,h):(p=Ft.getNewSegment(f[i].v[a-1],f[i].v[0],f[i].o[a-1],f[i].i[0],(e.s-d)/c,(e.e-d)/c,o[a-1]),this.addSegment(p.pt1,p.pt3,p.pt4,p.pt2,s,h))}}return s},xt.registerModifier("tm",w),A(F,S),S.prototype.processKeys=function(t){if(this.elem.globalData.frameId!==this.frameId||t){this.mdf=t?!0:!1,this.frameId=this.elem.globalData.frameId;var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0)}},S.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.rd=Dt.getProp(t,e.r,0,null,this.dynamicProperties),this.dynamicProperties.length||this.getValue(!0)},S.prototype.processPath=function(t,e){var s,i,a,r,n,h,o,p,l,f,m=t.v.length,d=[],c=[],u=[];for(s=0;m>s;s+=1)i=t.v[s],r=t.o[s],a=t.i[s],i[0]===r[0]&&i[1]===r[1]&&i[0]===a[0]&&i[1]===a[1]?0!==s&&s!==m-1||t.c?(n=0===s?t.v[m-1]:t.v[s-1],l=Math.sqrt(Math.pow(i[0]-n[0],2)+Math.pow(i[1]-n[1],2)),f=l?Math.min(l/2,e)/l:0,h=[i[0]+(n[0]-i[0])*f,i[1]-(i[1]-n[1])*f],p=h,o=[h[0]-(h[0]-i[0])*Et,h[1]-(h[1]-i[1])*Et],d.push(h),c.push(o),u.push(p),n=s===m-1?t.v[0]:t.v[s+1],l=Math.sqrt(Math.pow(i[0]-n[0],2)+Math.pow(i[1]-n[1],2)),f=l?Math.min(l/2,e)/l:0,h=[i[0]+(n[0]-i[0])*f,i[1]+(n[1]-i[1])*f],p=[h[0]-(h[0]-i[0])*Et,h[1]-(h[1]-i[1])*Et],o=h,d.push(h),c.push(o),u.push(p)):(d.push(i),c.push(r),u.push(a)):(d.push(t.v[s]),c.push(t.o[s]),u.push(t.i[s]));return{v:d,o:c,i:u,c:t.c}},S.prototype.processShapes=function(){var t,e,s,i,a=this.shapes.length,r=this.rd.v;if(0!==r){var n,h;for(e=0;a>e;e+=1)if(h=[],n=this.shapes[e],n.shape.mdf||this.mdf){for(n.shape.mdf=!0,t=n.shape.paths,i=t.length,s=0;i>s;s+=1)h.push(this.processPath(t[s],r));n.shape.paths=h,n.last=h}else n.shape.paths=n.last}this.dynamicProperties.length||(this.mdf=!1)},xt.registerModifier("rd",S);var Tt=function(){function t(){this.loadedAssets+=1,this.loadedAssets===this.totalImages}function e(t){var e="";if(this.assetsPath){var s=t.p;-1!==s.indexOf("images/")&&(s=s.split("/")[1]),e=this.assetsPath+s}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e}function s(e){var s=document.createElement("img");s.addEventListener("load",t.bind(this),!1),s.addEventListener("error",t.bind(this),!1),s.src=e}function i(t){this.totalAssets=t.length;var i;for(i=0;i<this.totalAssets;i+=1)t[i].layers||(s.bind(this)(e.bind(this)(t[i])),this.totalImages+=1)}function a(t){this.path=t||""}function r(t){this.assetsPath=t||""}return function(){this.loadAssets=i,this.setAssetsPath=r,this.setPath=a,this.assetsPath="",this.path="",this.totalAssets=0,this.totalImages=0,this.loadedAssets=0}}(),It=function(){var t={maskType:!0};return(/MSIE 10/i.test(navigator.userAgent)||/MSIE 9/i.test(navigator.userAgent)||/rv:11.0/i.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent))&&(t.maskType=!1),t}(),Lt=function(){function t(t){var e=document.createElementNS(dt,"filter");return e.setAttribute("id",t),e.setAttribute("filterUnits","objectBoundingBox"),
e.setAttribute("x","0%"),e.setAttribute("y","0%"),e.setAttribute("width","100%"),e.setAttribute("height","100%"),e}function e(){var t=document.createElementNS(dt,"feColorMatrix");return t.setAttribute("type","matrix"),t.setAttribute("color-interpolation-filters","sRGB"),t.setAttribute("values","0 0 0 1 0  0 0 0 1 0  0 0 0 1 0  0 0 0 0 1"),t}var s={};return s.createFilter=t,s.createAlphaToLuminanceFilter=e,s}();D.prototype.checkLayers=function(t){var e,s,i=this.layers.length;for(this.completeLayers=!0,e=i-1;e>=0;e--)this.elements[e]||(s=this.layers[e],s.ip-s.st<=t-this.layers[e].st&&s.op-s.st>t-this.layers[e].st&&this.buildItem(e)),this.completeLayers=this.elements[e]?this.completeLayers:!1;this.checkPendingElements()},D.prototype.createItem=function(t){switch(t.ty){case 2:return this.createImage(t);case 0:return this.createComp(t);case 1:return this.createSolid(t);case 4:return this.createShape(t);case 5:return this.createText(t);case 99:return null}return this.createBase(t)},D.prototype.buildAllItems=function(){var t,e=this.layers.length;for(t=0;e>t;t+=1)this.buildItem(t);this.checkPendingElements()},D.prototype.includeLayers=function(t){this.completeLayers=!1;var e,s,i=t.length,a=this.layers.length;for(e=0;i>e;e+=1)for(s=0;a>s;){if(this.layers[s].id==t[e].id){this.layers[s]=t[e];break}s+=1}},D.prototype.setProjectInterface=function(t){this.globalData.projectInterface=t},D.prototype.initItems=function(){this.globalData.progressiveLoad||this.buildAllItems()},D.prototype.buildElementParenting=function(t,e,s){s=s||[];for(var i=this.elements,a=this.layers,r=0,n=a.length;n>r;)a[r].ind==e&&(i[r]&&i[r]!==!0?void 0!==a[r].parent?(s.push(i[r]),this.buildElementParenting(t,a[r].parent,s)):(s.push(i[r]),t.setHierarchy(s)):(this.buildItem(r),this.addPendingElement(t))),r+=1},D.prototype.addPendingElement=function(t){this.pendingElements.push(t)},A(D,C),C.prototype.createBase=function(t){return new I(t,this.layerElement,this.globalData,this)},C.prototype.createShape=function(t){return new W(t,this.layerElement,this.globalData,this)},C.prototype.createText=function(t){return new N(t,this.layerElement,this.globalData,this)},C.prototype.createImage=function(t){return new G(t,this.layerElement,this.globalData,this)},C.prototype.createComp=function(t){return new B(t,this.layerElement,this.globalData,this)},C.prototype.createSolid=function(t){return new q(t,this.layerElement,this.globalData,this)},C.prototype.configAnimation=function(t){this.layerElement=document.createElementNS(dt,"svg"),this.layerElement.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.layerElement.setAttribute("width",t.w),this.layerElement.setAttribute("height",t.h),this.layerElement.setAttribute("viewBox","0 0 "+t.w+" "+t.h),this.layerElement.setAttribute("preserveAspectRatio",this.renderConfig.preserveAspectRatio),this.layerElement.style.width="100%",this.layerElement.style.height="100%",this.animationItem.wrapper.appendChild(this.layerElement);var e=document.createElementNS(dt,"defs");this.globalData.defs=e,this.layerElement.appendChild(e),this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.globalData.frameId=0,this.globalData.compSize={w:t.w,h:t.h},this.globalData.frameRate=t.fr;var s=document.createElementNS(dt,"clipPath"),i=document.createElementNS(dt,"rect");i.setAttribute("width",t.w),i.setAttribute("height",t.h),i.setAttribute("x",0),i.setAttribute("y",0);var a="animationMask_"+m(10);s.setAttribute("id",a),s.appendChild(i);var r=document.createElementNS(dt,"g");r.setAttribute("clip-path","url(#"+a+")"),this.layerElement.appendChild(r),e.appendChild(s),this.layerElement=r,this.layers=t.layers,this.globalData.fontManager=new St,this.globalData.fontManager.addChars(t.chars),this.globalData.fontManager.addFonts(t.fonts,e),this.elements=Array.apply(null,{length:t.layers.length})},C.prototype.destroy=function(){this.animationItem.wrapper.innerHTML="",this.layerElement=null,this.globalData.defs=null;var t,e=this.layers?this.layers.length:0;for(t=0;e>t;t++)this.elements[t]&&this.elements[t].destroy();this.elements.length=0,this.destroyed=!0,this.animationItem=null},C.prototype.updateContainerSize=function(){},C.prototype.buildItem=function(t){var e=this.elements;if(!e[t]&&99!=this.layers[t].ty){e[t]=!0;var s=this.createItem(this.layers[t]);e[t]=s,ft&&(0===this.layers[t].ty&&this.globalData.projectInterface.registerComposition(s),s.initExpressions()),this.appendElementInPos(s,t),this.layers[t].tt&&(this.elements[t-1]&&this.elements[t-1]!==!0?s.setMatte(e[t-1].layerId):(this.buildItem(t-1),this.addPendingElement(s)))}},C.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){var t=this.pendingElements.pop();if(t.checkParenting(),t.data.tt)for(var e=0,s=this.elements.length;s>e;){if(this.elements[e]===t){t.setMatte(this.elements[e-1].layerId);break}e+=1}}},C.prototype.renderFrame=function(t){if(this.renderedFrame!=t&&!this.destroyed){null===t?t=this.renderedFrame:this.renderedFrame=t,this.globalData.frameNum=t,this.globalData.frameId+=1,this.globalData.projectInterface.currentFrame=t;var e,s=this.layers.length;for(this.completeLayers||this.checkLayers(t),e=s-1;e>=0;e--)(this.completeLayers||this.elements[e])&&this.elements[e].prepareFrame(t-this.layers[e].st);for(e=s-1;e>=0;e--)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame()}},C.prototype.appendElementInPos=function(t,e){var s=t.getBaseElement();if(s){for(var i,a=0;e>a;)this.elements[a]&&this.elements[a]!==!0&&this.elements[a].getBaseElement()&&(i=this.elements[a].getBaseElement()),a+=1;i?this.layerElement.insertBefore(s,i):this.layerElement.appendChild(s)}},C.prototype.hide=function(){this.layerElement.style.display="none"},C.prototype.show=function(){this.layerElement.style.display="block"},C.prototype.searchExtraCompositions=function(t){var e,s=t.length,i=document.createElementNS(dt,"g");for(e=0;s>e;e+=1)if(t[e].xt){var a=this.createComp(t[e],i,this.globalData.comp,null);a.initExpressions(),this.globalData.projectInterface.registerComposition(a)}},x.prototype.getMaskProperty=function(t){return this.viewData[t].prop},x.prototype.prepareFrame=function(){var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue()},x.prototype.renderFrame=function(t){var e,s=this.masksProperties.length;for(e=0;s>e;e++)if((this.viewData[e].prop.mdf||this.firstFrame)&&this.drawPath(this.masksProperties[e],this.viewData[e].prop.v,this.viewData[e]),(this.viewData[e].op.mdf||this.firstFrame)&&this.viewData[e].elem.setAttribute("fill-opacity",this.viewData[e].op.v),"n"!==this.masksProperties[e].mode&&(this.viewData[e].invRect&&(this.element.finalTransform.mProp.mdf||this.firstFrame)&&(this.viewData[e].invRect.setAttribute("x",-t.props[12]),this.viewData[e].invRect.setAttribute("y",-t.props[13])),this.storedData[e].x&&(this.storedData[e].x.mdf||this.firstFrame))){var i=this.storedData[e].expan;this.storedData[e].x.v<0?("erode"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="erode",this.storedData[e].elem.setAttribute("filter","url(#"+this.storedData[e].filterId+")")),i.setAttribute("radius",-this.storedData[e].x.v)):("dilate"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="dilate",this.storedData[e].elem.setAttribute("filter",null)),this.storedData[e].elem.setAttribute("stroke-width",2*this.storedData[e].x.v))}this.firstFrame=!1},x.prototype.getMaskelement=function(){return this.maskElement},x.prototype.createLayerSolidPath=function(){var t="M0,0 ";return t+=" h"+this.globalData.compSize.w,t+=" v"+this.globalData.compSize.h,t+=" h-"+this.globalData.compSize.w,t+=" v-"+this.globalData.compSize.h+" "},x.prototype.drawPath=function(t,e,s){var i,a,r="";for(a=e.v.length,i=1;a>i;i+=1)1==i&&(r+=" M"+mt(e.v[0][0])+","+mt(e.v[0][1])),r+=" C"+mt(e.o[i-1][0])+","+mt(e.o[i-1][1])+" "+mt(e.i[i][0])+","+mt(e.i[i][1])+" "+mt(e.v[i][0])+","+mt(e.v[i][1]);e.c&&a>1&&(r+=" C"+mt(e.o[i-1][0])+","+mt(e.o[i-1][1])+" "+mt(e.i[0][0])+","+mt(e.i[0][1])+" "+mt(e.v[0][0])+","+mt(e.v[0][1])),s.lastPath!==r&&(s.elem&&(e.c?t.inv?s.elem.setAttribute("d",this.solidPath+r):s.elem.setAttribute("d",r):s.elem.setAttribute("d","")),s.lastPath=r)},x.prototype.getMask=function(t){for(var e=0,s=this.masksProperties.length;s>e;){if(this.masksProperties[e].nm===t)return{maskPath:this.viewData[e].prop.pv};e+=1}},x.prototype.destroy=function(){this.element=null,this.globalData=null,this.maskElement=null,this.data=null,this.paths=null,this.masksProperties=null},T.prototype.checkMasks=function(){if(!this.data.hasMask)return!1;for(var t=0,e=this.data.masksProperties.length;e>t;){if("n"!==this.data.masksProperties[t].mode&&this.data.masksProperties[t].cl!==!1)return!0;t+=1}return!1},T.prototype.checkParenting=function(){void 0!==this.data.parent&&this.comp.buildElementParenting(this,this.data.parent)},T.prototype.prepareFrame=function(t){this.data.ip-this.data.st<=t&&this.data.op-this.data.st>t?this.isVisible!==!0&&(this.elemMdf=!0,this.globalData.mdf=!0,this.isVisible=!0,this.firstFrame=!0,this.data.hasMask&&(this.maskManager.firstFrame=!0)):this.isVisible!==!1&&(this.elemMdf=!0,this.globalData.mdf=!0,this.isVisible=!1);var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.elemMdf=!0,this.globalData.mdf=!0);return this.data.hasMask&&this.maskManager.prepareFrame(t*this.data.sr),this.currentFrameNum=t*this.data.sr,this.isVisible},T.prototype.globalToLocal=function(t){var e=[];e.push(this.finalTransform);for(var s=!0,i=this.comp;s;)i.finalTransform?(i.data.hasMask&&e.splice(0,0,i.finalTransform),i=i.comp):s=!1;var a,r,n=e.length;for(a=0;n>a;a+=1)r=e[a].mat.applyToPointArray(0,0,0),t=[t[0]-r[0],t[1]-r[1],0];return t},T.prototype.initExpressions=function(){this.layerInterface=LayerExpressionInterface(this),this.data.hasMask&&this.layerInterface.registerMaskInterface(this.maskManager);var t=EffectsExpressionInterface.createEffectsInterface(this,this.layerInterface);this.layerInterface.registerEffectsInterface(t),0===this.data.ty||this.data.xt?this.compInterface=CompExpressionInterface(this):4===this.data.ty&&(this.layerInterface.shapeInterface=ShapeExpressionInterface.createShapeInterface(this.shapesData,this.viewData,this.layerInterface))},T.prototype.setBlendMode=function(){var t="";switch(this.data.bm){case 1:t="multiply";break;case 2:t="screen";break;case 3:t="overlay";break;case 4:t="darken";break;case 5:t="lighten";break;case 6:t="color-dodge";break;case 7:t="color-burn";break;case 8:t="hard-light";break;case 9:t="soft-light";break;case 10:t="difference";break;case 11:t="exclusion";break;case 12:t="hue";break;case 13:t="saturation";break;case 14:t="color";break;case 15:t="luminosity"}var e=this.baseElement||this.layerElement;e.style["mix-blend-mode"]=t},T.prototype.init=function(){this.data.sr||(this.data.sr=1),this.dynamicProperties=[],this.data.ef&&(this.effects=new EffectsManager(this.data,this,this.dynamicProperties)),this.hidden=!1,this.firstFrame=!0,this.isVisible=!1,this.currentFrameNum=-99999,this.lastNum=-99999,this.data.ks&&(this.finalTransform={mProp:Dt.getProp(this,this.data.ks,2,null,this.dynamicProperties),matMdf:!1,opMdf:!1,mat:new k,opacity:1},this.data.ao&&(this.finalTransform.mProp.autoOriented=!0),this.finalTransform.op=this.finalTransform.mProp.o,this.transform=this.finalTransform.mProp,11!==this.data.ty&&this.createElements(),this.data.hasMask&&this.addMasks(this.data)),this.elemMdf=!1},T.prototype.getType=function(){return this.type},T.prototype.resetHierarchy=function(){this.hierarchy?this.hierarchy.length=0:this.hierarchy=[]},T.prototype.getHierarchy=function(){return this.hierarchy||(this.hierarchy=[]),this.hierarchy},T.prototype.setHierarchy=function(t){this.hierarchy=t},T.prototype.getLayerSize=function(){return 5===this.data.ty?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}},T.prototype.hide=function(){},T.prototype.mHelper=new k,P(T,I),I.prototype.createElements=function(){this.layerElement=document.createElementNS(dt,"g"),this.transformedElement=this.layerElement,this.data.hasMask&&(this.maskedElement=this.layerElement);var t=null;if(this.data.td){if(3==this.data.td||1==this.data.td){var e=document.createElementNS(dt,"mask");if(e.setAttribute("id",this.layerId),e.setAttribute("mask-type",3==this.data.td?"luminance":"alpha"),e.appendChild(this.layerElement),t=e,this.globalData.defs.appendChild(e),!It.maskType&&1==this.data.td){e.setAttribute("mask-type","luminance");var s=m(10),i=Lt.createFilter(s);this.globalData.defs.appendChild(i),i.appendChild(Lt.createAlphaToLuminanceFilter());var a=document.createElementNS(dt,"g");a.appendChild(this.layerElement),t=a,e.appendChild(a),a.setAttribute("filter","url(#"+s+")")}}else if(2==this.data.td){var r=document.createElementNS(dt,"mask");r.setAttribute("id",this.layerId),r.setAttribute("mask-type","alpha");var n=document.createElementNS(dt,"g");r.appendChild(n);var s=m(10),i=Lt.createFilter(s),h=document.createElementNS(dt,"feColorMatrix");h.setAttribute("type","matrix"),h.setAttribute("color-interpolation-filters","sRGB"),h.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"),i.appendChild(h),this.globalData.defs.appendChild(i);var o=document.createElementNS(dt,"rect");if(o.setAttribute("width",this.comp.data?this.comp.data.w:this.globalData.compSize.w),o.setAttribute("height",this.comp.data?this.comp.data.h:this.globalData.compSize.h),o.setAttribute("x","0"),o.setAttribute("y","0"),o.setAttribute("fill","#ffffff"),o.setAttribute("opacity","0"),n.setAttribute("filter","url(#"+s+")"),n.appendChild(o),n.appendChild(this.layerElement),t=n,!It.maskType){r.setAttribute("mask-type","luminance"),i.appendChild(Lt.createAlphaToLuminanceFilter());var a=document.createElementNS(dt,"g");n.appendChild(o),a.appendChild(this.layerElement),t=a,n.appendChild(a)}this.globalData.defs.appendChild(r)}}else(this.data.hasMask||this.data.tt)&&this.data.tt?(this.matteElement=document.createElementNS(dt,"g"),this.matteElement.appendChild(this.layerElement),t=this.matteElement,this.baseElement=this.matteElement):this.baseElement=this.layerElement;if(!this.data.ln&&!this.data.cl||4!==this.data.ty&&0!==this.data.ty||(this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl)),0===this.data.ty){var p=document.createElementNS(dt,"clipPath"),l=document.createElementNS(dt,"path");l.setAttribute("d","M0,0 L"+this.data.w+",0 L"+this.data.w+","+this.data.h+" L0,"+this.data.h+"z");var f="cp_"+m(8);if(p.setAttribute("id",f),p.appendChild(l),this.globalData.defs.appendChild(p),this.checkMasks()){var d=document.createElementNS(dt,"g");d.setAttribute("clip-path","url(#"+f+")"),d.appendChild(this.layerElement),this.transformedElement=d,t?t.appendChild(this.transformedElement):this.baseElement=this.transformedElement}else this.layerElement.setAttribute("clip-path","url(#"+f+")")}0!==this.data.bm&&this.setBlendMode(),this.layerElement!==this.parentContainer&&(this.placeholder=null),this.data.ef&&(this.effectsManager=new O(this)),this.checkParenting()},I.prototype.setBlendMode=T.prototype.setBlendMode,I.prototype.renderFrame=function(t){if(3===this.data.ty||this.data.hd)return!1;if(!this.isVisible)return this.isVisible;this.lastNum=this.currentFrameNum,this.finalTransform.opMdf=this.finalTransform.op.mdf,this.finalTransform.matMdf=this.finalTransform.mProp.mdf,this.finalTransform.opacity=this.finalTransform.op.v,this.firstFrame&&(this.finalTransform.opMdf=!0,this.finalTransform.matMdf=!0);var e,s=this.finalTransform.mat;if(this.hierarchy){var i,a=this.hierarchy.length;for(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e),i=0;a>i;i+=1)this.finalTransform.matMdf=this.hierarchy[i].finalTransform.mProp.mdf?!0:this.finalTransform.matMdf,e=this.hierarchy[i].finalTransform.mProp.v.props,s.transform(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15])}else this.isVisible&&s.cloneFromProps(this.finalTransform.mProp.v.props);return t&&(e=t.mat.props,s.transform(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15]),this.finalTransform.opacity*=t.opacity,this.finalTransform.opMdf=t.opMdf?!0:this.finalTransform.opMdf,this.finalTransform.matMdf=t.matMdf?!0:this.finalTransform.matMdf),this.finalTransform.matMdf&&this.layerElement&&this.transformedElement.setAttribute("transform",s.to2dCSS()),this.finalTransform.opMdf&&this.layerElement&&this.transformedElement.setAttribute("opacity",this.finalTransform.opacity),this.data.hasMask&&this.maskManager.renderFrame(s),this.effectsManager&&this.effectsManager.renderFrame(this.firstFrame),this.isVisible},I.prototype.destroy=function(){this.layerElement=null,this.parentContainer=null,this.matteElement&&(this.matteElement=null),this.maskManager&&this.maskManager.destroy()},I.prototype.getBaseElement=function(){return this.baseElement},I.prototype.addMasks=function(t){this.maskManager=new x(t,this,this.globalData)},I.prototype.setMatte=function(t){this.matteElement&&this.matteElement.setAttribute("mask","url(#"+t+")")},I.prototype.setMatte=function(t){this.matteElement&&this.matteElement.setAttribute("mask","url(#"+t+")")},I.prototype.hide=function(){},L.prototype.init=function(){this._parent.init.call(this),this.lettersChangedFlag=!1,this.currentTextDocumentData={};var t=this.data;this.viewData={m:{a:Dt.getProp(this,t.t.m.a,1,0,this.dynamicProperties)}};var e=this.data.t;if(e.a.length){this.viewData.a=Array.apply(null,{length:e.a.length});var s,i,a,r=e.a.length;for(s=0;r>s;s+=1)a=e.a[s],i={a:{},s:{}},"r"in a.a&&(i.a.r=Dt.getProp(this,a.a.r,0,At,this.dynamicProperties)),"rx"in a.a&&(i.a.rx=Dt.getProp(this,a.a.rx,0,At,this.dynamicProperties)),"ry"in a.a&&(i.a.ry=Dt.getProp(this,a.a.ry,0,At,this.dynamicProperties)),"sk"in a.a&&(i.a.sk=Dt.getProp(this,a.a.sk,0,At,this.dynamicProperties)),"sa"in a.a&&(i.a.sa=Dt.getProp(this,a.a.sa,0,At,this.dynamicProperties)),"s"in a.a&&(i.a.s=Dt.getProp(this,a.a.s,1,.01,this.dynamicProperties)),"a"in a.a&&(i.a.a=Dt.getProp(this,a.a.a,1,0,this.dynamicProperties)),"o"in a.a&&(i.a.o=Dt.getProp(this,a.a.o,0,.01,this.dynamicProperties)),"p"in a.a&&(i.a.p=Dt.getProp(this,a.a.p,1,0,this.dynamicProperties)),"sw"in a.a&&(i.a.sw=Dt.getProp(this,a.a.sw,0,0,this.dynamicProperties)),"sc"in a.a&&(i.a.sc=Dt.getProp(this,a.a.sc,1,0,this.dynamicProperties)),"fc"in a.a&&(i.a.fc=Dt.getProp(this,a.a.fc,1,0,this.dynamicProperties)),"fh"in a.a&&(i.a.fh=Dt.getProp(this,a.a.fh,0,0,this.dynamicProperties)),"fs"in a.a&&(i.a.fs=Dt.getProp(this,a.a.fs,0,.01,this.dynamicProperties)),"fb"in a.a&&(i.a.fb=Dt.getProp(this,a.a.fb,0,.01,this.dynamicProperties)),"t"in a.a&&(i.a.t=Dt.getProp(this,a.a.t,0,0,this.dynamicProperties)),i.s=Dt.getTextSelectorProp(this,a.s,this.dynamicProperties),i.s.t=a.s.t,this.viewData.a[s]=i}else this.viewData.a=[];e.p&&"m"in e.p?(this.viewData.p={f:Dt.getProp(this,e.p.f,0,0,this.dynamicProperties),l:Dt.getProp(this,e.p.l,0,0,this.dynamicProperties),r:e.p.r,m:this.maskManager.getMaskProperty(e.p.m)},this.maskPath=!0):this.maskPath=!1},L.prototype.prepareFrame=function(t){var e=0,s=this.data.t.d.k.length,i=this.data.t.d.k[e].s;for(e+=1;s>e&&!(this.data.t.d.k[e].t>t);)i=this.data.t.d.k[e].s,e+=1;this.lettersChangedFlag=!1,i!==this.currentTextDocumentData&&(this.currentTextDocumentData=i,this.lettersChangedFlag=!0,this.buildNewText()),this._parent.prepareFrame.call(this,t)},L.prototype.createPathShape=function(t,e){var s,i,a,r,n=e.length,h="";for(s=0;n>s;s+=1){for(a=e[s].ks.k.i.length,r=e[s].ks.k,i=1;a>i;i+=1)1==i&&(h+=" M"+t.applyToPointStringified(r.v[0][0],r.v[0][1])),h+=" C"+t.applyToPointStringified(r.o[i-1][0],r.o[i-1][1])+" "+t.applyToPointStringified(r.i[i][0],r.i[i][1])+" "+t.applyToPointStringified(r.v[i][0],r.v[i][1]);h+=" C"+t.applyToPointStringified(r.o[i-1][0],r.o[i-1][1])+" "+t.applyToPointStringified(r.i[0][0],r.i[0][1])+" "+t.applyToPointStringified(r.v[0][0],r.v[0][1]),h+="z"}return h},L.prototype.getMeasures=function(){var t,e,s,i,a=this.mHelper,r=this.renderType,n=this.data,h=this.currentTextDocumentData,o=h.l;if(this.maskPath){var p=this.viewData.p.m;if(!this.viewData.p.n||this.viewData.p.mdf){var l=p.v;this.viewData.p.r&&(l=b(l));var f={tLength:0,segments:[]};i=l.v.length-1;var m,d=0;for(s=0;i>s;s+=1)m={s:l.v[s],e:l.v[s+1],to:[l.o[s][0]-l.v[s][0],l.o[s][1]-l.v[s][1]],ti:[l.i[s+1][0]-l.v[s+1][0],l.i[s+1][1]-l.v[s+1][1]]},Ft.buildBezierData(m),f.tLength+=m.bezierData.segmentLength,f.segments.push(m),d+=m.bezierData.segmentLength;s=i,p.v.c&&(m={s:l.v[s],e:l.v[0],to:[l.o[s][0]-l.v[s][0],l.o[s][1]-l.v[s][1]],ti:[l.i[0][0]-l.v[0][0],l.i[0][1]-l.v[0][1]]},Ft.buildBezierData(m),f.tLength+=m.bezierData.segmentLength,f.segments.push(m),d+=m.bezierData.segmentLength),this.viewData.p.pi=f}var c,k,P,f=this.viewData.p.pi,A=this.viewData.p.f.v,E=0,M=1,F=0,w=!0,S=f.segments;if(0>A&&p.v.c)for(f.tLength<Math.abs(A)&&(A=-Math.abs(A)%f.tLength),E=S.length-1,P=S[E].bezierData.points,M=P.length-1;0>A;)A+=P[M].partialLength,M-=1,0>M&&(E-=1,P=S[E].bezierData.points,M=P.length-1);P=S[E].bezierData.points,k=P[M-1],c=P[M];var D,C,x=c.partialLength}i=o.length,t=0,e=0;var T,I,L,N,_,V=1.2*h.s*.714,z=!0,R=this.viewData,j=Array.apply(null,{length:i});N=R.a.length;var O,B,G,W,q,H,X,Y,U,Z,K,J,Q,$,tt,et,st=-1,it=A,at=E,rt=M,nt=-1,ht=0;for(s=0;i>s;s+=1)if(a.reset(),H=1,o[s].n)t=0,e+=h.yOffset,e+=z?1:0,A=it,z=!1,ht=0,this.maskPath&&(E=at,M=rt,P=S[E].bezierData.points,k=P[M-1],c=P[M],x=c.partialLength,F=0),j[s]=this.emptyProp;else{if(this.maskPath){if(nt!==o[s].line){switch(h.j){case 1:A+=d-h.lineWidths[o[s].line];break;case 2:A+=(d-h.lineWidths[o[s].line])/2}nt=o[s].line}st!==o[s].ind&&(o[st]&&(A+=o[st].extra),A+=o[s].an/2,st=o[s].ind),A+=R.m.a.v[0]*o[s].an/200;var ot=0;for(L=0;N>L;L+=1)T=R.a[L].a,"p"in T&&(I=R.a[L].s,B=I.getMult(o[s].anIndexes[L],n.t.a[L].s.totalChars),ot+=B.length?T.p.v[0]*B[0]:T.p.v[0]*B);for(w=!0;w;)F+x>=A+ot||!P?(D=(A+ot-F)/c.partialLength,W=k.point[0]+(c.point[0]-k.point[0])*D,q=k.point[1]+(c.point[1]-k.point[1])*D,a.translate(0,-(R.m.a.v[1]*V/100)+e),w=!1):P&&(F+=c.partialLength,M+=1,M>=P.length&&(M=0,E+=1,S[E]?P=S[E].bezierData.points:p.v.c?(M=0,E=0,P=S[E].bezierData.points):(F-=c.partialLength,P=null)),P&&(k=c,c=P[M],x=c.partialLength));G=o[s].an/2-o[s].add,a.translate(-G,0,0)}else G=o[s].an/2-o[s].add,a.translate(-G,0,0),a.translate(-R.m.a.v[0]*o[s].an/200,-R.m.a.v[1]*V/100,0);for(ht+=o[s].l/2,L=0;N>L;L+=1)T=R.a[L].a,"t"in T&&(I=R.a[L].s,B=I.getMult(o[s].anIndexes[L],n.t.a[L].s.totalChars),this.maskPath?A+=B.length?T.t*B[0]:T.t*B:t+=B.length?T.t.v*B[0]:T.t.v*B);for(ht+=o[s].l/2,h.strokeWidthAnim&&(Y=h.sw||0),h.strokeColorAnim&&(X=h.sc?[h.sc[0],h.sc[1],h.sc[2]]:[0,0,0]),h.fillColorAnim&&(U=[h.fc[0],h.fc[1],h.fc[2]]),L=0;N>L;L+=1)T=R.a[L].a,"a"in T&&(I=R.a[L].s,B=I.getMult(o[s].anIndexes[L],n.t.a[L].s.totalChars),B.length?a.translate(-T.a.v[0]*B[0],-T.a.v[1]*B[1],T.a.v[2]*B[2]):a.translate(-T.a.v[0]*B,-T.a.v[1]*B,T.a.v[2]*B));for(L=0;N>L;L+=1)T=R.a[L].a,"s"in T&&(I=R.a[L].s,B=I.getMult(o[s].anIndexes[L],n.t.a[L].s.totalChars),B.length?a.scale(1+(T.s.v[0]-1)*B[0],1+(T.s.v[1]-1)*B[1],1):a.scale(1+(T.s.v[0]-1)*B,1+(T.s.v[1]-1)*B,1));for(L=0;N>L;L+=1){if(T=R.a[L].a,I=R.a[L].s,B=I.getMult(o[s].anIndexes[L],n.t.a[L].s.totalChars),"sk"in T&&(B.length?a.skewFromAxis(-T.sk.v*B[0],T.sa.v*B[1]):a.skewFromAxis(-T.sk.v*B,T.sa.v*B)),"r"in T&&a.rotateZ(B.length?-T.r.v*B[2]:-T.r.v*B),"ry"in T&&a.rotateY(B.length?T.ry.v*B[1]:T.ry.v*B),"rx"in T&&a.rotateX(B.length?T.rx.v*B[0]:T.rx.v*B),"o"in T&&(H+=B.length?(T.o.v*B[0]-H)*B[0]:(T.o.v*B-H)*B),h.strokeWidthAnim&&"sw"in T&&(Y+=B.length?T.sw.v*B[0]:T.sw.v*B),h.strokeColorAnim&&"sc"in T)for(Z=0;3>Z;Z+=1)X[Z]=Math.round(B.length?255*(X[Z]+(T.sc.v[Z]-X[Z])*B[0]):255*(X[Z]+(T.sc.v[Z]-X[Z])*B));if(h.fillColorAnim){if("fc"in T)for(Z=0;3>Z;Z+=1)U[Z]=B.length?U[Z]+(T.fc.v[Z]-U[Z])*B[0]:U[Z]+(T.fc.v[Z]-U[Z])*B;"fh"in T&&(U=B.length?g(U,T.fh.v*B[0]):g(U,T.fh.v*B)),"fs"in T&&(U=B.length?u(U,T.fs.v*B[0]):u(U,T.fs.v*B)),"fb"in T&&(U=B.length?v(U,T.fb.v*B[0]):v(U,T.fb.v*B))}}for(L=0;N>L;L+=1)T=R.a[L].a,"p"in T&&(I=R.a[L].s,B=I.getMult(o[s].anIndexes[L],n.t.a[L].s.totalChars),this.maskPath?B.length?a.translate(0,T.p.v[1]*B[0],-T.p.v[2]*B[1]):a.translate(0,T.p.v[1]*B,-T.p.v[2]*B):B.length?a.translate(T.p.v[0]*B[0],T.p.v[1]*B[1],-T.p.v[2]*B[2]):a.translate(T.p.v[0]*B,T.p.v[1]*B,-T.p.v[2]*B));if(h.strokeWidthAnim&&(K=0>Y?0:Y),h.strokeColorAnim&&(J="rgb("+Math.round(255*X[0])+","+Math.round(255*X[1])+","+Math.round(255*X[2])+")"),h.fillColorAnim&&(Q="rgb("+Math.round(255*U[0])+","+Math.round(255*U[1])+","+Math.round(255*U[2])+")"),this.maskPath){if(n.t.p.p){C=(c.point[1]-k.point[1])/(c.point[0]-k.point[0]);var pt=180*Math.atan(C)/Math.PI;c.point[0]<k.point[0]&&(pt+=180),a.rotate(-pt*Math.PI/180)}a.translate(W,q,0),a.translate(R.m.a.v[0]*o[s].an/200,R.m.a.v[1]*V/100,0),A-=R.m.a.v[0]*o[s].an/200,o[s+1]&&st!==o[s+1].ind&&(A+=o[s].an/2,A+=h.tr/1e3*h.s)}else{switch(a.translate(t,e,0),h.ps&&a.translate(h.ps[0],h.ps[1]+h.ascent,0),h.j){case 1:a.translate(h.justifyOffset+(h.boxWidth-h.lineWidths[o[s].line]),0,0);break;case 2:a.translate(h.justifyOffset+(h.boxWidth-h.lineWidths[o[s].line])/2,0,0)}a.translate(G,0,0),a.translate(R.m.a.v[0]*o[s].an/200,R.m.a.v[1]*V/100,0),t+=o[s].l+h.tr/1e3*h.s}"html"===r?$=a.toCSS():"svg"===r?$=a.to2dCSS():tt=[a.props[0],a.props[1],a.props[2],a.props[3],a.props[4],a.props[5],a.props[6],a.props[7],a.props[8],a.props[9],a.props[10],a.props[11],a.props[12],a.props[13],a.props[14],a.props[15]],et=H,O=this.renderedLetters[s],!O||O.o===et&&O.sw===K&&O.sc===J&&O.fc===Q?"svg"!==r&&"html"!==r||O&&O.m===$?"canvas"!==r||O&&O.props[0]===tt[0]&&O.props[1]===tt[1]&&O.props[4]===tt[4]&&O.props[5]===tt[5]&&O.props[12]===tt[12]&&O.props[13]===tt[13]?_=O:(this.lettersChangedFlag=!0,_=new y(et,K,J,Q,null,tt)):(this.lettersChangedFlag=!0,_=new y(et,K,J,Q,$)):(this.lettersChangedFlag=!0,_=new y(et,K,J,Q,$,tt)),this.renderedLetters[s]=_}},L.prototype.emptyProp=new y,P(I,N),N.prototype.init=L.prototype.init,N.prototype.createPathShape=L.prototype.createPathShape,N.prototype.getMeasures=L.prototype.getMeasures,N.prototype.prepareFrame=L.prototype.prepareFrame,N.prototype.createElements=function(){this._parent.createElements.call(this),this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl)},N.prototype.buildNewText=function(){var t,e,s=this.currentTextDocumentData;this.renderedLetters=Array.apply(null,{length:this.currentTextDocumentData.l?this.currentTextDocumentData.l.length:0}),s.fc?this.layerElement.setAttribute("fill","rgb("+Math.round(255*s.fc[0])+","+Math.round(255*s.fc[1])+","+Math.round(255*s.fc[2])+")"):this.layerElement.setAttribute("fill","rgba(0,0,0,0)"),s.sc&&(this.layerElement.setAttribute("stroke","rgb("+Math.round(255*s.sc[0])+","+Math.round(255*s.sc[1])+","+Math.round(255*s.sc[2])+")"),this.layerElement.setAttribute("stroke-width",s.sw)),this.layerElement.setAttribute("font-size",s.s);var i=this.globalData.fontManager.getFontByName(s.f);if(i.fClass)this.layerElement.setAttribute("class",i.fClass);else{this.layerElement.setAttribute("font-family",i.fFamily);var a=s.fWeight,r=s.fStyle;this.layerElement.setAttribute("font-style",r),this.layerElement.setAttribute("font-weight",a)}var n=s.l||[];if(e=n.length){var h,o,p=this.mHelper,l="",f=this.data.singleShape;if(f)var m=0,d=0,c=s.lineWidths,u=s.boxWidth,v=!0;var g=0;for(t=0;e>t;t+=1){if(this.globalData.fontManager.chars?f&&0!==t||(h=this.textSpans[g]?this.textSpans[g]:document.createElementNS(dt,"path")):h=this.textSpans[g]?this.textSpans[g]:document.createElementNS(dt,"text"),h.style.display="inherit",h.setAttribute("stroke-linecap","butt"),h.setAttribute("stroke-linejoin","round"),h.setAttribute("stroke-miterlimit","4"),f&&n[t].n&&(m=0,d+=s.yOffset,d+=v?1:0,v=!1),p.reset(),this.globalData.fontManager.chars&&p.scale(s.s/100,s.s/100),f){switch(s.ps&&p.translate(s.ps[0],s.ps[1]+s.ascent,0),s.j){case 1:p.translate(s.justifyOffset+(u-c[n[t].line]),0,0);break;case 2:p.translate(s.justifyOffset+(u-c[n[t].line])/2,0,0)}p.translate(m,d,0)}if(this.globalData.fontManager.chars){var y,b=this.globalData.fontManager.getCharData(s.t.charAt(t),i.fStyle,this.globalData.fontManager.getFontByName(s.f).fFamily);y=b?b.data:null,y&&y.shapes&&(o=y.shapes[0].it,f||(l=""),l+=this.createPathShape(p,o),f||h.setAttribute("d",l)),f||this.layerElement.appendChild(h)}else h.textContent=n[t].val,h.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),this.layerElement.appendChild(h),f&&h.setAttribute("transform",p.to2dCSS());f&&(m+=n[t].l,m+=s.tr/1e3*s.s),this.textSpans[g]=h,g+=1}if(!f)for(;g<this.textSpans.length;)this.textSpans[g].style.display="none",g+=1;f&&this.globalData.fontManager.chars&&(h.setAttribute("d",l),this.layerElement.appendChild(h))}},N.prototype.hide=function(){this.hidden||(this.layerElement.style.display="none",this.hidden=!0)},N.prototype.renderFrame=function(t){var e=this._parent.renderFrame.call(this,t);if(e===!1)return void this.hide();if(this.hidden&&(this.hidden=!1,this.layerElement.style.display="block"),!this.data.singleShape&&(this.getMeasures(),this.lettersChangedFlag)){var s,i,a=this.renderedLetters,r=this.currentTextDocumentData.l;i=r.length;var n;for(s=0;i>s;s+=1)r[s].n||(n=a[s],this.textSpans[s].setAttribute("transform",n.m),this.textSpans[s].setAttribute("opacity",n.o),n.sw&&this.textSpans[s].setAttribute("stroke-width",n.sw),n.sc&&this.textSpans[s].setAttribute("stroke",n.sc),n.fc&&this.textSpans[s].setAttribute("fill",n.fc));this.firstFrame&&(this.firstFrame=!1)}},N.prototype.destroy=function(){this._parent.destroy.call()},_.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){var e=this.filterManager.effectElements[0].p.v,s=this.filterManager.effectElements[1].p.v,i=this.filterManager.effectElements[2].p.v/100;this.matrixFilter.setAttribute("values",s[0]-e[0]+" 0 0 0 "+e[0]+" "+(s[1]-e[1])+" 0 0 0 "+e[1]+" "+(s[2]-e[2])+" 0 0 0 "+e[2]+" 0 0 0 "+i+" 0")}},V.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){var e=this.filterManager.effectElements[2].p.v,s=this.filterManager.effectElements[6].p.v;this.matrixFilter.setAttribute("values","0 0 0 0 "+e[0]+" 0 0 0 0 "+e[1]+" 0 0 0 0 "+e[2]+" 0 0 0 "+s+" 0")}},z.prototype.initialize=function(){var t,e,s,i,a=this.elem.layerElement.children||this.elem.layerElement.childNodes;for(1===this.filterManager.effectElements[1].p.v?(i=this.elem.maskManager.masksProperties.length,s=0):(s=this.filterManager.effectElements[0].p.v-1,i=s+1),e=document.createElementNS(dt,"g"),e.setAttribute("fill","none"),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke-dashoffset",1),s;i>s;s+=1)t=document.createElementNS(dt,"path"),e.appendChild(t),this.paths.push({p:t,m:s});if(3===this.filterManager.effectElements[10].p.v){var r=document.createElementNS(dt,"mask"),n="stms_"+m(10);r.setAttribute("id",n),r.setAttribute("mask-type","alpha"),r.appendChild(e),this.elem.globalData.defs.appendChild(r);var h=document.createElementNS(dt,"g");h.setAttribute("mask","url(#"+n+")"),a[0]&&h.appendChild(a[0]),this.elem.layerElement.appendChild(h),this.masker=r,e.setAttribute("stroke","#fff")}else if(1===this.filterManager.effectElements[10].p.v||2===this.filterManager.effectElements[10].p.v){if(2===this.filterManager.effectElements[10].p.v)for(var a=this.elem.layerElement.children||this.elem.layerElement.childNodes;a.length;)this.elem.layerElement.removeChild(a[0]);this.elem.layerElement.appendChild(e),this.elem.layerElement.removeAttribute("mask"),e.setAttribute("stroke","#fff")}this.initialized=!0,this.pathMasker=e},z.prototype.renderFrame=function(t){this.initialized||this.initialize();var e,s,i,a=this.paths.length;for(e=0;a>e;e+=1)if(s=this.elem.maskManager.viewData[this.paths[e].m],
i=this.paths[e].p,(t||this.filterManager.mdf||s.prop.mdf)&&i.setAttribute("d",s.lastPath),t||this.filterManager.effectElements[9].p.mdf||this.filterManager.effectElements[4].p.mdf||this.filterManager.effectElements[7].p.mdf||this.filterManager.effectElements[8].p.mdf||s.prop.mdf){var r;if(0!==this.filterManager.effectElements[7].p.v||100!==this.filterManager.effectElements[8].p.v){var n=Math.min(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100,h=Math.max(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100,o=i.getTotalLength();r="0 0 0 "+o*n+" ";var p,l=o*(h-n),f=1+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100,m=Math.floor(l/f);for(p=0;m>p;p+=1)r+="1 "+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100+" ";r+="0 "+10*o+" 0 0"}else r="1 "+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100;i.setAttribute("stroke-dasharray",r)}if((t||this.filterManager.effectElements[4].p.mdf)&&this.pathMasker.setAttribute("stroke-width",2*this.filterManager.effectElements[4].p.v),(t||this.filterManager.effectElements[6].p.mdf)&&this.pathMasker.setAttribute("opacity",this.filterManager.effectElements[6].p.v),(1===this.filterManager.effectElements[10].p.v||2===this.filterManager.effectElements[10].p.v)&&(t||this.filterManager.effectElements[3].p.mdf)){var d=this.filterManager.effectElements[3].p.v;this.pathMasker.setAttribute("stroke","rgb("+yt(255*d[0])+","+yt(255*d[1])+","+yt(255*d[2])+")")}},R.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){var e=this.filterManager.effectElements[0].p.v,s=this.filterManager.effectElements[1].p.v,i=this.filterManager.effectElements[2].p.v,a=i[0]+" "+s[0]+" "+e[0],r=i[1]+" "+s[1]+" "+e[1],n=i[2]+" "+s[2]+" "+e[2];this.feFuncR.setAttribute("tableValues",a),this.feFuncG.setAttribute("tableValues",r),this.feFuncB.setAttribute("tableValues",n)}},j.prototype.createFeFunc=function(t,e){var s=document.createElementNS(dt,t);return s.setAttribute("type","table"),e.appendChild(s),s},j.prototype.getTableValue=function(t,e,s,i,a){for(var r,n,h=0,o=256,p=Math.min(t,e),l=Math.max(t,e),f=Array.call(null,{length:o}),m=0,d=a-i,c=e-t;256>=h;)r=h/256,n=p>=r?0>c?a:i:r>=l?0>c?i:a:i+d*Math.pow((r-t)/c,1/s),f[m++]=n,h+=256/(o-1);return f.join(" ")},j.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){var e,s=this.filterManager.effectElements;this.feFuncRComposed&&(t||s[2].p.mdf||s[3].p.mdf||s[4].p.mdf||s[5].p.mdf||s[6].p.mdf)&&(e=this.getTableValue(s[2].p.v,s[3].p.v,s[4].p.v,s[5].p.v,s[6].p.v),this.feFuncRComposed.setAttribute("tableValues",e),this.feFuncGComposed.setAttribute("tableValues",e),this.feFuncBComposed.setAttribute("tableValues",e)),this.feFuncR&&(t||s[9].p.mdf||s[10].p.mdf||s[11].p.mdf||s[12].p.mdf||s[13].p.mdf)&&(e=this.getTableValue(s[9].p.v,s[10].p.v,s[11].p.v,s[12].p.v,s[13].p.v),this.feFuncR.setAttribute("tableValues",e)),this.feFuncG&&(t||s[16].p.mdf||s[17].p.mdf||s[18].p.mdf||s[19].p.mdf||s[20].p.mdf)&&(e=this.getTableValue(s[16].p.v,s[17].p.v,s[18].p.v,s[19].p.v,s[20].p.v),this.feFuncG.setAttribute("tableValues",e)),this.feFuncB&&(t||s[23].p.mdf||s[24].p.mdf||s[25].p.mdf||s[26].p.mdf||s[27].p.mdf)&&(e=this.getTableValue(s[23].p.v,s[24].p.v,s[25].p.v,s[26].p.v,s[27].p.v),this.feFuncB.setAttribute("tableValues",e)),this.feFuncA&&(t||s[30].p.mdf||s[31].p.mdf||s[32].p.mdf||s[33].p.mdf||s[34].p.mdf)&&(e=this.getTableValue(s[30].p.v,s[31].p.v,s[32].p.v,s[33].p.v,s[34].p.v),this.feFuncA.setAttribute("tableValues",e))}},O.prototype.renderFrame=function(t){var e,s=this.filters.length;for(e=0;s>e;e+=1)this.filters[e].renderFrame(t)},P(I,B),B.prototype.hide=function(){if(!this.hidden){var t,e=this.elements.length;for(t=0;e>t;t+=1)this.elements[t]&&this.elements[t].hide();this.hidden=!0}},B.prototype.prepareFrame=function(t){if(this._parent.prepareFrame.call(this,t),this.isVisible!==!1||this.data.xt){if(this.tm){var e=this.tm.v;e===this.data.op&&(e=this.data.op-1),this.renderedFrame=e}else this.renderedFrame=t/this.data.sr;var s,i=this.elements.length;for(this.completeLayers||this.checkLayers(this.renderedFrame),s=0;i>s;s+=1)(this.completeLayers||this.elements[s])&&this.elements[s].prepareFrame(this.renderedFrame-this.layers[s].st)}},B.prototype.renderFrame=function(t){var e,s=this._parent.renderFrame.call(this,t),i=this.layers.length;if(s===!1)return void this.hide();for(this.hidden=!1,e=0;i>e;e+=1)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame();this.firstFrame&&(this.firstFrame=!1)},B.prototype.setElements=function(t){this.elements=t},B.prototype.getElements=function(){return this.elements},B.prototype.destroy=function(){this._parent.destroy.call();var t,e=this.layers.length;for(t=0;e>t;t+=1)this.elements[t]&&this.elements[t].destroy()},B.prototype.checkLayers=C.prototype.checkLayers,B.prototype.buildItem=C.prototype.buildItem,B.prototype.buildAllItems=C.prototype.buildAllItems,B.prototype.buildElementParenting=C.prototype.buildElementParenting,B.prototype.createItem=C.prototype.createItem,B.prototype.createImage=C.prototype.createImage,B.prototype.createComp=C.prototype.createComp,B.prototype.createSolid=C.prototype.createSolid,B.prototype.createShape=C.prototype.createShape,B.prototype.createText=C.prototype.createText,B.prototype.createBase=C.prototype.createBase,B.prototype.appendElementInPos=C.prototype.appendElementInPos,B.prototype.checkPendingElements=C.prototype.checkPendingElements,B.prototype.addPendingElement=C.prototype.addPendingElement,P(I,G),G.prototype.createElements=function(){var t=this.globalData.getAssetsPath(this.assetData);this._parent.createElements.call(this),this.innerElem=document.createElementNS(dt,"image"),this.innerElem.setAttribute("width",this.assetData.w+"px"),this.innerElem.setAttribute("height",this.assetData.h+"px"),this.innerElem.setAttribute("preserveAspectRatio","xMidYMid slice"),this.innerElem.setAttributeNS("http://www.w3.org/1999/xlink","href",t),this.maskedElement=this.innerElem,this.layerElement.appendChild(this.innerElem),this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl)},G.prototype.hide=function(){this.hidden||(this.layerElement.style.display="none",this.hidden=!0)},G.prototype.renderFrame=function(t){var e=this._parent.renderFrame.call(this,t);return e===!1?void this.hide():(this.hidden&&(this.hidden=!1,this.layerElement.style.display="block"),void(this.firstFrame&&(this.firstFrame=!1)))},G.prototype.destroy=function(){this._parent.destroy.call(),this.innerElem=null},P(I,W),W.prototype.lcEnum={1:"butt",2:"round",3:"butt"},W.prototype.ljEnum={1:"miter",2:"round",3:"butt"},W.prototype.buildExpressionInterface=function(){},W.prototype.createElements=function(){this._parent.createElements.call(this),this.searchShapes(this.shapesData,this.viewData,this.layerElement,this.dynamicProperties,0),(!this.data.hd||this.data.td)&&i(this.layerElement)},W.prototype.setGradientData=function(t,e,s){var i,a="gr_"+m(10);i=1===e.t?document.createElementNS(dt,"linearGradient"):document.createElementNS(dt,"radialGradient"),i.setAttribute("id",a),i.setAttribute("spreadMethod","pad"),i.setAttribute("gradientUnits","userSpaceOnUse");var r,n,h,o=[];for(h=4*e.g.p,n=0;h>n;n+=4)r=document.createElementNS(dt,"stop"),i.appendChild(r),o.push(r);t.setAttribute("gf"===e.ty?"fill":"stroke","url(#"+a+")"),this.globalData.defs.appendChild(i),s.gf=i,s.cst=o},W.prototype.setGradientOpacity=function(t,e,s){if(t.g.k.k[0].s&&t.g.k.k[0].s.length>4*t.g.p||t.g.k.k.length>4*t.g.p){var i,a,r,n,h=document.createElementNS(dt,"mask"),o=document.createElementNS(dt,"path");h.appendChild(o);var p="op_"+m(10),l="mk_"+m(10);h.setAttribute("id",l),i=1===t.t?document.createElementNS(dt,"linearGradient"):document.createElementNS(dt,"radialGradient"),i.setAttribute("id",p),i.setAttribute("spreadMethod","pad"),i.setAttribute("gradientUnits","userSpaceOnUse"),n=t.g.k.k[0].s?t.g.k.k[0].s.length:t.g.k.k.length;var f=[];for(r=4*t.g.p;n>r;r+=2)a=document.createElementNS(dt,"stop"),a.setAttribute("stop-color","rgb(255,255,255)"),i.appendChild(a),f.push(a);return o.setAttribute("gf"===t.ty?"fill":"stroke","url(#"+p+")"),this.globalData.defs.appendChild(i),this.globalData.defs.appendChild(h),e.of=i,e.ost=f,s.msElem=o,l}},W.prototype.searchShapes=function(t,e,s,i,a,r){r=r||[];var n,h,o,p,l,f=[].concat(r),m=t.length-1,d=[],c=[];for(n=m;n>=0;n-=1)if("fl"==t[n].ty||"st"==t[n].ty||"gf"==t[n].ty||"gs"==t[n].ty){e[n]={},p={type:t[n].ty,d:"",ld:"",lvl:a,mdf:!1};var u=document.createElementNS(dt,"path");if(e[n].o=Dt.getProp(this,t[n].o,0,.01,i),("st"==t[n].ty||"gs"==t[n].ty)&&(u.setAttribute("stroke-linecap",this.lcEnum[t[n].lc]||"round"),u.setAttribute("stroke-linejoin",this.ljEnum[t[n].lj]||"round"),u.setAttribute("fill-opacity","0"),1==t[n].lj&&u.setAttribute("stroke-miterlimit",t[n].ml),e[n].w=Dt.getProp(this,t[n].w,0,null,i),t[n].d)){var v=Dt.getDashProp(this,t[n].d,"svg",i);v.k||(u.setAttribute("stroke-dasharray",v.dasharray),u.setAttribute("stroke-dashoffset",v.dashoffset)),e[n].d=v}if("fl"==t[n].ty||"st"==t[n].ty)e[n].c=Dt.getProp(this,t[n].c,1,255,i),s.appendChild(u);else{e[n].g=Dt.getGradientProp(this,t[n].g,i),2==t[n].t&&(e[n].h=Dt.getProp(this,t[n].h,1,.01,i),e[n].a=Dt.getProp(this,t[n].a,1,At,i)),e[n].s=Dt.getProp(this,t[n].s,1,null,i),e[n].e=Dt.getProp(this,t[n].e,1,null,i),this.setGradientData(u,t[n],e[n],p);var g=this.setGradientOpacity(t[n],e[n],p);g&&u.setAttribute("mask","url(#"+g+")"),e[n].elem=u,s.appendChild(u)}t[n].ln&&u.setAttribute("id",t[n].ln),t[n].cl&&u.setAttribute("class",t[n].cl),p.pElem=u,this.stylesList.push(p),e[n].style=p,d.push(p)}else if("gr"==t[n].ty){e[n]={it:[]};var y=document.createElementNS(dt,"g");s.appendChild(y),e[n].gr=y,this.searchShapes(t[n].it,e[n].it,y,i,a+1,r)}else if("tr"==t[n].ty)e[n]={transform:{op:Dt.getProp(this,t[n].o,0,.01,i),mProps:Dt.getProp(this,t[n],2,null,i)},elements:[]},l=e[n].transform,f.push(l);else if("sh"==t[n].ty||"rc"==t[n].ty||"el"==t[n].ty||"sr"==t[n].ty){e[n]={elements:[],caches:[],styles:[],transformers:f,lStr:""};var b=4;for("rc"==t[n].ty?b=5:"el"==t[n].ty?b=6:"sr"==t[n].ty&&(b=7),e[n].sh=Ct.getShapeProp(this,t[n],b,i),e[n].lvl=a,this.shapes.push(e[n].sh),this.addShapeToModifiers(e[n].sh),o=this.stylesList.length,h=0;o>h;h+=1)this.stylesList[h].closed||e[n].elements.push({ty:this.stylesList[h].type,st:this.stylesList[h]})}else if("tm"==t[n].ty||"rd"==t[n].ty||"ms"==t[n].ty){var k=xt.getModifier(t[n].ty);k.init(this,t[n],i),this.shapeModifiers.push(k),c.push(k),e[n]=k}for(m=d.length,n=0;m>n;n+=1)d[n].closed=!0;for(m=c.length,n=0;m>n;n+=1)c[n].closed=!0},W.prototype.addShapeToModifiers=function(t){var e,s=this.shapeModifiers.length;for(e=0;s>e;e+=1)this.shapeModifiers[e].addShape(t)},W.prototype.renderModifiers=function(){if(this.shapeModifiers.length){var t,e=this.shapes.length;for(t=0;e>t;t+=1)this.shapes[t].reset();for(e=this.shapeModifiers.length,t=e-1;t>=0;t-=1)this.shapeModifiers[t].processShapes(this.firstFrame)}},W.prototype.renderFrame=function(t){var e=this._parent.renderFrame.call(this,t);return e===!1?void this.hide():(this.globalToLocal([0,0,0]),this.hidden&&(this.layerElement.style.display="block",this.hidden=!1),this.renderModifiers(),void this.renderShape(null,null,!0,null))},W.prototype.hide=function(){if(!this.hidden){this.layerElement.style.display="none";var t,e=this.stylesList.length;for(t=e-1;t>=0;t-=1)"0"!==this.stylesList[t].ld&&(this.stylesList[t].ld="0",this.stylesList[t].pElem.style.display="none",this.stylesList[t].pElem.parentNode&&(this.stylesList[t].parent=this.stylesList[t].pElem.parentNode));this.hidden=!0}},W.prototype.renderShape=function(t,e,s,i){var a,r;if(!t)for(t=this.shapesData,r=this.stylesList.length,a=0;r>a;a+=1)this.stylesList[a].d="",this.stylesList[a].mdf=!1;e||(e=this.viewData),r=t.length-1;var n;for(a=r;a>=0;a-=1)n=t[a].ty,"tr"==n?((this.firstFrame||e[a].transform.op.mdf&&i)&&i.setAttribute("opacity",e[a].transform.op.v),(this.firstFrame||e[a].transform.mProps.mdf&&i)&&i.setAttribute("transform",e[a].transform.mProps.v.to2dCSS())):"sh"==n||"el"==n||"rc"==n||"sr"==n?this.renderPath(t[a],e[a]):"fl"==n?this.renderFill(t[a],e[a]):"gf"==n?this.renderGradient(t[a],e[a]):"gs"==n?(this.renderGradient(t[a],e[a]),this.renderStroke(t[a],e[a])):"st"==n?this.renderStroke(t[a],e[a]):"gr"==n&&this.renderShape(t[a].it,e[a].it,!1,e[a].gr);if(s){for(r=this.stylesList.length,a=0;r>a;a+=1)"0"===this.stylesList[a].ld&&(this.stylesList[a].ld="1",this.stylesList[a].pElem.style.display="block"),(this.stylesList[a].mdf||this.firstFrame)&&(this.stylesList[a].pElem.setAttribute("d",this.stylesList[a].d),this.stylesList[a].msElem&&this.stylesList[a].msElem.setAttribute("d",this.stylesList[a].d));this.firstFrame&&(this.firstFrame=!1)}},W.prototype.renderPath=function(t,e){var s,i,a,r,n,h,o,p,l=e.elements.length,f=e.lvl;for(p=0;l>p;p+=1){h=e.sh.mdf||this.firstFrame,n="";var m=e.sh.paths;if(r=m.length,e.elements[p].st.lvl<f){var d,c,u=this.mHelper.reset();for(c=e.transformers.length-1;c>=0;c-=1)h=e.transformers[c].mProps.mdf||h,d=e.transformers[c].mProps.v.props,u.transform(d[0],d[1],d[2],d[3],d[4],d[5],d[6],d[7],d[8],d[9],d[10],d[11],d[12],d[13],d[14],d[15]);if(h){for(a=0;r>a;a+=1)if(o=m[a],o&&o.v){for(s=o.v.length,i=1;s>i;i+=1)1==i&&(n+=" M"+u.applyToPointStringified(o.v[0][0],o.v[0][1])),n+=" C"+u.applyToPointStringified(o.o[i-1][0],o.o[i-1][1])+" "+u.applyToPointStringified(o.i[i][0],o.i[i][1])+" "+u.applyToPointStringified(o.v[i][0],o.v[i][1]);1==s&&(n+=" M"+u.applyToPointStringified(o.v[0][0],o.v[0][1])),o.c&&(n+=" C"+u.applyToPointStringified(o.o[i-1][0],o.o[i-1][1])+" "+u.applyToPointStringified(o.i[0][0],o.i[0][1])+" "+u.applyToPointStringified(o.v[0][0],o.v[0][1]),n+="z")}e.caches[p]=n}else n=e.caches[p]}else if(h){for(a=0;r>a;a+=1)if(o=m[a],o&&o.v){for(s=o.v.length,i=1;s>i;i+=1)1==i&&(n+=" M"+o.v[0].join(",")),n+=" C"+o.o[i-1].join(",")+" "+o.i[i].join(",")+" "+o.v[i].join(",");1==s&&(n+=" M"+o.v[0].join(",")),o.c&&s&&(n+=" C"+o.o[i-1].join(",")+" "+o.i[0].join(",")+" "+o.v[0].join(","),n+="z")}e.caches[p]=n}else n=e.caches[p];e.elements[p].st.d+=n,e.elements[p].st.mdf=h||e.elements[p].st.mdf}},W.prototype.renderFill=function(t,e){var s=e.style;(e.c.mdf||this.firstFrame)&&s.pElem.setAttribute("fill","rgb("+yt(e.c.v[0])+","+yt(e.c.v[1])+","+yt(e.c.v[2])+")"),(e.o.mdf||this.firstFrame)&&s.pElem.setAttribute("fill-opacity",e.o.v)},W.prototype.renderGradient=function(t,e){var s=e.gf,i=e.of,a=e.s.v,r=e.e.v;if(e.o.mdf||this.firstFrame){var n="gf"===t.ty?"fill-opacity":"stroke-opacity";e.elem.setAttribute(n,e.o.v)}if(e.s.mdf||this.firstFrame){var h=1===t.t?"x1":"cx",o="x1"===h?"y1":"cy";s.setAttribute(h,a[0]),s.setAttribute(o,a[1]),i&&(i.setAttribute(h,a[0]),i.setAttribute(o,a[1]))}var p,l,f,m;if(e.g.cmdf||this.firstFrame){p=e.cst;var d=e.g.c;for(f=p.length,l=0;f>l;l+=1)m=p[l],m.setAttribute("offset",d[4*l]+"%"),m.setAttribute("stop-color","rgb("+d[4*l+1]+","+d[4*l+2]+","+d[4*l+3]+")")}if(i&&(e.g.omdf||this.firstFrame)){p=e.ost;var c=e.g.o;for(f=p.length,l=0;f>l;l+=1)m=p[l],m.setAttribute("offset",c[2*l]+"%"),m.setAttribute("stop-opacity",c[2*l+1])}if(1===t.t)(e.e.mdf||this.firstFrame)&&(s.setAttribute("x2",r[0]),s.setAttribute("y2",r[1]),i&&(i.setAttribute("x2",r[0]),i.setAttribute("y2",r[1])));else{var u;if((e.s.mdf||e.e.mdf||this.firstFrame)&&(u=Math.sqrt(Math.pow(a[0]-r[0],2)+Math.pow(a[1]-r[1],2)),s.setAttribute("r",u),i&&i.setAttribute("r",u)),e.e.mdf||e.h.mdf||e.a.mdf||this.firstFrame){u||(u=Math.sqrt(Math.pow(a[0]-r[0],2)+Math.pow(a[1]-r[1],2)));var v=Math.atan2(r[1]-a[1],r[0]-a[0]),g=e.h.v>=1?.99:e.h.v<=-1?-.99:e.h.v,y=u*g,b=Math.cos(v+e.a.v)*y+a[0],k=Math.sin(v+e.a.v)*y+a[1];s.setAttribute("fx",b),s.setAttribute("fy",k),i&&(i.setAttribute("fx",b),i.setAttribute("fy",k))}}},W.prototype.renderStroke=function(t,e){var s=e.style,i=e.d;i&&i.k&&(i.mdf||this.firstFrame)&&(s.pElem.setAttribute("stroke-dasharray",i.dasharray),s.pElem.setAttribute("stroke-dashoffset",i.dashoffset)),e.c&&(e.c.mdf||this.firstFrame)&&s.pElem.setAttribute("stroke","rgb("+yt(e.c.v[0])+","+yt(e.c.v[1])+","+yt(e.c.v[2])+")"),(e.o.mdf||this.firstFrame)&&s.pElem.setAttribute("stroke-opacity",e.o.v),(e.w.mdf||this.firstFrame)&&(s.pElem.setAttribute("stroke-width",e.w.v),s.msElem&&s.msElem.setAttribute("stroke-width",e.w.v))},W.prototype.destroy=function(){this._parent.destroy.call(),this.shapeData=null,this.viewData=null,this.parentContainer=null,this.placeholder=null},P(I,q),q.prototype.createElements=function(){this._parent.createElements.call(this);var t=document.createElementNS(dt,"rect");t.setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this.layerElement.appendChild(t),this.innerElem=t,this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl)},q.prototype.hide=G.prototype.hide,q.prototype.renderFrame=G.prototype.renderFrame,q.prototype.destroy=G.prototype.destroy;var Nt=function(){function t(t){for(var e=0,s=t.target;M>e;)A[e].animation===s&&(A.splice(e,1),e-=1,M-=1,s.isPaused||i()),e+=1}function e(t,e){if(!t)return null;for(var s=0;M>s;){if(A[s].elem==t&&null!==A[s].elem)return A[s].animation;s+=1}var i=new _t;return i.setData(t,e),a(i,t),i}function s(){w+=1,k()}function i(){w-=1,0===w&&(F=!0)}function a(e,a){e.addEventListener("destroy",t),e.addEventListener("_active",s),e.addEventListener("_idle",i),A.push({elem:a,animation:e}),M+=1}function r(t){var e=new _t;return a(e,null),e.setParams(t),e}function n(t,e){var s;for(s=0;M>s;s+=1)A[s].animation.setSpeed(t,e)}function h(t,e){var s;for(s=0;M>s;s+=1)A[s].animation.setDirection(t,e)}function o(t){var e;for(e=0;M>e;e+=1)A[e].animation.play(t)}function p(t,e){E=Date.now();var s;for(s=0;M>s;s+=1)A[s].animation.moveFrame(t,e)}function l(t){var e,s=t-E;for(e=0;M>e;e+=1)A[e].animation.advanceTime(s);E=t,F||requestAnimationFrame(l)}function f(t){E=t,requestAnimationFrame(l)}function m(t){var e;for(e=0;M>e;e+=1)A[e].animation.pause(t)}function d(t,e,s){var i;for(i=0;M>i;i+=1)A[i].animation.goToAndStop(t,e,s)}function c(t){var e;for(e=0;M>e;e+=1)A[e].animation.stop(t)}function u(t){var e;for(e=0;M>e;e+=1)A[e].animation.togglePause(t)}function v(t){var e;for(e=M-1;e>=0;e-=1)A[e].animation.destroy(t)}function g(t,s,i){var a,r=document.getElementsByClassName("bodymovin"),n=r.length;for(a=0;n>a;a+=1)i&&r[a].setAttribute("data-bm-type",i),e(r[a],t);if(s&&0===n){i||(i="svg");var h=document.getElementsByTagName("body")[0];h.innerHTML="";var o=document.createElement("div");o.style.width="100%",o.style.height="100%",o.setAttribute("data-bm-type",i),h.appendChild(o),e(o,t)}}function y(){var t;for(t=0;M>t;t+=1)A[t].animation.resize()}function b(){requestAnimationFrame(f)}function k(){F&&(F=!1,requestAnimationFrame(f))}var P={},A=[],E=0,M=0,F=!0,w=0;return setTimeout(b,0),P.registerAnimation=e,P.loadAnimation=r,P.setSpeed=n,P.setDirection=h,P.play=o,P.moveFrame=p,P.pause=m,P.stop=c,P.togglePause=u,P.searchAnimations=g,P.resize=y,P.start=b,P.goToAndStop=d,P.destroy=v,P}(),_t=function(){this._cbs=[],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.animationData={},this.layers=[],this.assets=[],this.isPaused=!0,this.autoplay=!1,this.loop=!0,this.renderer=null,this.animationID=m(10),this.scaleMode="fit",this.assetsPath="",this.timeCompleted=0,this.segmentPos=0,this.subframeEnabled=ct,this.segments=[],this.pendingSegment=!1,this._idle=!0,this.projectInterface=t()};_t.prototype.setParams=function(t){var e=this;t.context&&(this.context=t.context),(t.wrapper||t.container)&&(this.wrapper=t.wrapper||t.container);var s=t.animType?t.animType:t.renderer?t.renderer:"svg";switch(s){case"canvas":this.renderer=new CanvasRenderer(this,t.rendererSettings);break;case"svg":this.renderer=new C(this,t.rendererSettings);break;case"hybrid":case"html":default:this.renderer=new HybridRenderer(this,t.rendererSettings)}if(this.renderer.setProjectInterface(this.projectInterface),this.animType=s,""===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,this.autoloadSegments=t.hasOwnProperty("autoloadSegments")?t.autoloadSegments:!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=-1!=t.path.lastIndexOf("\\")?t.path.substr(0,t.path.lastIndexOf("\\")+1):t.path.substr(0,t.path.lastIndexOf("/")+1),this.assetsPath=t.assetsPath,this.fileName=t.path.substr(t.path.lastIndexOf("/")+1),this.fileName=this.fileName.substr(0,this.fileName.lastIndexOf(".json")),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(s){}}}},_t.prototype.setData=function(t,e){var s={wrapper:t,animationData:e?"object"==typeof e?e:JSON.parse(e):null},i=t.attributes;s.path=i.getNamedItem("data-animation-path")?i.getNamedItem("data-animation-path").value:i.getNamedItem("data-bm-path")?i.getNamedItem("data-bm-path").value:i.getNamedItem("bm-path")?i.getNamedItem("bm-path").value:"",s.animType=i.getNamedItem("data-anim-type")?i.getNamedItem("data-anim-type").value:i.getNamedItem("data-bm-type")?i.getNamedItem("data-bm-type").value:i.getNamedItem("bm-type")?i.getNamedItem("bm-type").value:i.getNamedItem("data-bm-renderer")?i.getNamedItem("data-bm-renderer").value:i.getNamedItem("bm-renderer")?i.getNamedItem("bm-renderer").value:"canvas";var a=i.getNamedItem("data-anim-loop")?i.getNamedItem("data-anim-loop").value:i.getNamedItem("data-bm-loop")?i.getNamedItem("data-bm-loop").value:i.getNamedItem("bm-loop")?i.getNamedItem("bm-loop").value:"";""===a||(s.loop="false"===a?!1:"true"===a?!0:parseInt(a));var r=i.getNamedItem("data-anim-autoplay")?i.getNamedItem("data-anim-autoplay").value:i.getNamedItem("data-bm-autoplay")?i.getNamedItem("data-bm-autoplay").value:i.getNamedItem("bm-autoplay")?i.getNamedItem("bm-autoplay").value:!0;s.autoplay="false"!==r,s.name=i.getNamedItem("data-name")?i.getNamedItem("data-name").value:i.getNamedItem("data-bm-name")?i.getNamedItem("data-bm-name").value:i.getNamedItem("bm-name")?i.getNamedItem("bm-name").value:"";var n=i.getNamedItem("data-anim-prerender")?i.getNamedItem("data-anim-prerender").value:i.getNamedItem("data-bm-prerender")?i.getNamedItem("data-bm-prerender").value:i.getNamedItem("bm-prerender")?i.getNamedItem("bm-prerender").value:"";"false"===n&&(s.prerender=!1),this.setParams(s)},_t.prototype.includeLayers=function(t){t.op>this.animationData.op&&(this.animationData.op=t.op,this.totalFrames=Math.floor(t.op-this.animationData.ip),this.animationData.tf=this.totalFrames);var e,s,i=this.animationData.layers,a=i.length,r=t.layers,n=r.length;for(s=0;n>s;s+=1)for(e=0;a>e;){if(i[e].id==r[s].id){i[e]=r[s];break}e+=1}if((t.chars||t.fonts)&&(this.renderer.globalData.fontManager.addChars(t.chars),this.renderer.globalData.fontManager.addFonts(t.fonts,this.renderer.globalData.defs)),t.assets)for(a=t.assets.length,e=0;a>e;e+=1)this.animationData.assets.push(t.assets[e]);this.animationData.__complete=!1,wt.completeData(this.animationData,this.renderer.globalData.fontManager),this.renderer.includeLayers(t.layers),ft&&ft.initExpressions(this),this.renderer.renderFrame(null),this.loadNextSegment()},_t.prototype.loadNextSegment=function(){var t=this.animationData.segments;if(!t||0===t.length||!this.autoloadSegments)return this.trigger("data_ready"),void(this.timeCompleted=this.animationData.tf);var e=t.shift();this.timeCompleted=e.time*this.frameRate;var s=new XMLHttpRequest,i=this,a=this.path+this.fileName+"_"+this.segmentPos+".json";this.segmentPos+=1,s.open("GET",a,!0),s.send(),s.onreadystatechange=function(){if(4==s.readyState)if(200==s.status)i.includeLayers(JSON.parse(s.responseText));else try{var t=JSON.parse(s.responseText);i.includeLayers(t)}catch(e){}}},_t.prototype.loadSegments=function(){var t=this.animationData.segments;t||(this.timeCompleted=this.animationData.tf),this.loadNextSegment()},_t.prototype.configAnimation=function(t){this.renderer&&this.renderer.destroyed||(this.animationData=t,this.totalFrames=Math.floor(this.animationData.op-this.animationData.ip),this.animationData.tf=this.totalFrames,this.renderer.configAnimation(t),t.assets||(t.assets=[]),t.comps&&(t.assets=t.assets.concat(t.comps),t.comps=null),this.renderer.searchExtraCompositions(t.assets),this.layers=this.animationData.layers,this.assets=this.animationData.assets,this.frameRate=this.animationData.fr,this.firstFrame=Math.round(this.animationData.ip),this.frameMult=this.animationData.fr/1e3,this.trigger("config_ready"),this.imagePreloader=new Tt,this.imagePreloader.setAssetsPath(this.assetsPath),this.imagePreloader.setPath(this.path),this.imagePreloader.loadAssets(t.assets),this.loadSegments(),this.updaFrameModifier(),this.renderer.globalData.fontManager?this.waitForFontsLoaded():(wt.completeData(this.animationData,this.renderer.globalData.fontManager),this.checkLoaded()))},_t.prototype.waitForFontsLoaded=function(){function t(){this.renderer.globalData.fontManager.loaded?(wt.completeData(this.animationData,this.renderer.globalData.fontManager),this.checkLoaded()):setTimeout(t.bind(this),20)}return function(){t.bind(this)()}}(),_t.prototype.addPendingElement=function(){this.pendingElements+=1},_t.prototype.elementLoaded=function(){this.pendingElements--,this.checkLoaded()},_t.prototype.checkLoaded=function(){0===this.pendingElements&&(ft&&ft.initExpressions(this),this.renderer.initItems(),setTimeout(function(){this.trigger("DOMLoaded")}.bind(this),0),this.isLoaded=!0,this.gotoFrame(),this.autoplay&&this.play())},_t.prototype.resize=function(){this.renderer.updateContainerSize()},_t.prototype.setSubframe=function(t){this.subframeEnabled=t?!0:!1},_t.prototype.gotoFrame=function(){this.currentFrame=this.subframeEnabled?this.currentRawFrame:Math.floor(this.currentRawFrame),this.timeCompleted!==this.totalFrames&&this.currentFrame>this.timeCompleted&&(this.currentFrame=this.timeCompleted),this.trigger("enterFrame"),this.renderFrame()},_t.prototype.renderFrame=function(){this.isLoaded!==!1&&this.renderer.renderFrame(this.currentFrame+this.firstFrame)},_t.prototype.play=function(t){t&&this.name!=t||this.isPaused===!0&&(this.isPaused=!1,this._idle&&(this._idle=!1,this.trigger("_active")))},_t.prototype.pause=function(t){t&&this.name!=t||this.isPaused===!1&&(this.isPaused=!0,this.pendingSegment||(this._idle=!0,this.trigger("_idle")))},_t.prototype.togglePause=function(t){t&&this.name!=t||(this.isPaused===!0?this.play():this.pause())},_t.prototype.stop=function(t){t&&this.name!=t||(this.pause(),this.currentFrame=this.currentRawFrame=0,this.playCount=0,this.gotoFrame())},_t.prototype.goToAndStop=function(t,e,s){s&&this.name!=s||(this.setCurrentRawFrameValue(e?t:t*this.frameModifier),this.pause())},_t.prototype.goToAndPlay=function(t,e,s){this.goToAndStop(t,e,s),this.play()},_t.prototype.advanceTime=function(t){return this.pendingSegment?(this.pendingSegment=!1,this.adjustSegment(this.segments.shift()),void(this.isPaused&&this.play())):void(this.isPaused!==!0&&this.isLoaded!==!1&&this.setCurrentRawFrameValue(this.currentRawFrame+t*this.frameModifier))},_t.prototype.updateAnimation=function(t){this.setCurrentRawFrameValue(this.totalFrames*t)},_t.prototype.moveFrame=function(t,e){e&&this.name!=e||this.setCurrentRawFrameValue(this.currentRawFrame+t)},_t.prototype.adjustSegment=function(t){this.playCount=0,t[1]<t[0]?(this.frameModifier>0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(-1)),this.totalFrames=t[0]-t[1],this.firstFrame=t[1],this.setCurrentRawFrameValue(this.totalFrames-.01)):t[1]>t[0]&&(this.frameModifier<0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(1)),this.totalFrames=t[1]-t[0],this.firstFrame=t[0],this.setCurrentRawFrameValue(0)),this.trigger("segmentStart")},_t.prototype.setSegment=function(t,e){var s=-1;this.isPaused&&(this.currentRawFrame+this.firstFrame<t?s=t:this.currentRawFrame+this.firstFrame>e&&(s=e-t-.01)),this.firstFrame=t,this.totalFrames=e-t,-1!==s&&this.goToAndStop(s,!0)},_t.prototype.playSegments=function(t,e){if("object"==typeof t[0]){var s,i=t.length;for(s=0;i>s;s+=1)this.segments.push(t[s])}else this.segments.push(t);e&&this.adjustSegment(this.segments.shift()),this.isPaused&&this.play()},_t.prototype.resetSegments=function(t){this.segments.length=0,this.segments.push([this.animationData.ip*this.frameRate,Math.floor(this.animationData.op-this.animationData.ip+this.animationData.ip*this.frameRate)]),t&&this.adjustSegment(this.segments.shift())},_t.prototype.checkSegments=function(){this.segments.length&&(this.pendingSegment=!0)},_t.prototype.remove=function(t){t&&this.name!=t||this.renderer.destroy()},_t.prototype.destroy=function(t){t&&this.name!=t||this.renderer&&this.renderer.destroyed||(this.renderer.destroy(),this.trigger("destroy"),this._cbs=null,this.onEnterFrame=this.onLoopComplete=this.onComplete=this.onSegmentStart=this.onDestroy=null)},_t.prototype.setCurrentRawFrameValue=function(t){if(this.currentRawFrame=t,this.currentRawFrame>=this.totalFrames){if(this.checkSegments(),this.loop===!1)return this.currentRawFrame=this.totalFrames-.01,this.gotoFrame(),this.pause(),void this.trigger("complete");if(this.trigger("loopComplete"),this.playCount+=1,this.loop!==!0&&this.playCount==this.loop||this.pendingSegment)return this.currentRawFrame=this.totalFrames-.01,this.gotoFrame(),this.pause(),void this.trigger("complete");this.currentRawFrame=this.currentRawFrame%this.totalFrames}else if(this.currentRawFrame<0)return this.checkSegments(),this.playCount-=1,this.playCount<0&&(this.playCount=0),this.loop===!1||this.pendingSegment?(this.currentRawFrame=0,this.gotoFrame(),this.pause(),void this.trigger("complete")):(this.trigger("loopComplete"),this.currentRawFrame=(this.totalFrames+this.currentRawFrame)%this.totalFrames,void this.gotoFrame());this.gotoFrame()},_t.prototype.setSpeed=function(t){this.playSpeed=t,this.updaFrameModifier()},_t.prototype.setDirection=function(t){this.playDirection=0>t?-1:1,this.updaFrameModifier()},_t.prototype.updaFrameModifier=function(){this.frameModifier=this.frameMult*this.playSpeed*this.playDirection},_t.prototype.getPath=function(){return this.path},_t.prototype.getAssetsPath=function(t){var e="";if(this.assetsPath){var s=t.p;-1!==s.indexOf("images/")&&(s=s.split("/")[1]),e=this.assetsPath+s}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e},_t.prototype.getAssetData=function(t){for(var e=0,s=this.assets.length;s>e;){if(t==this.assets[e].id)return this.assets[e];e+=1}},_t.prototype.hide=function(){this.renderer.hide()},_t.prototype.show=function(){this.renderer.show()},_t.prototype.getAssets=function(){return this.assets},_t.prototype.trigger=function(t){if(this._cbs&&this._cbs[t])switch(t){case"enterFrame":this.triggerEvent(t,new a(t,this.currentFrame,this.totalFrames,this.frameMult));break;case"loopComplete":this.triggerEvent(t,new n(t,this.loop,this.playCount,this.frameMult));break;case"complete":this.triggerEvent(t,new r(t,this.frameMult));break;case"segmentStart":this.triggerEvent(t,new h(t,this.firstFrame,this.totalFrames));break;case"destroy":this.triggerEvent(t,new o(t,this));break;default:this.triggerEvent(t)}"enterFrame"===t&&this.onEnterFrame&&this.onEnterFrame.call(this,new a(t,this.currentFrame,this.totalFrames,this.frameMult)),"loopComplete"===t&&this.onLoopComplete&&this.onLoopComplete.call(this,new n(t,this.loop,this.playCount,this.frameMult)),"complete"===t&&this.onComplete&&this.onComplete.call(this,new r(t,this.frameMult)),
"segmentStart"===t&&this.onSegmentStart&&this.onSegmentStart.call(this,new h(t,this.firstFrame,this.totalFrames)),"destroy"===t&&this.onDestroy&&this.onDestroy.call(this,new o(t,this))},_t.prototype.addEventListener=p,_t.prototype.removeEventListener=l,_t.prototype.triggerEvent=f;var Vt={};Vt.play=H,Vt.pause=X,Vt.togglePause=Y,Vt.setSpeed=U,Vt.setDirection=Z,Vt.stop=K,Vt.moveFrame=J,Vt.searchAnimations=Q,Vt.registerAnimation=$,Vt.loadAnimation=at,Vt.setSubframeRendering=it,Vt.resize=tt,Vt.start=et,Vt.goToAndStop=st,Vt.destroy=rt,Vt.setQuality=nt,Vt.installPlugin=ht,Vt.__getFactory=ot,Vt.version="4.5.4";var zt="__[STANDALONE]__",Rt="__[ANIMATIONDATA]__",jt="";if(zt){var Ot=document.getElementsByTagName("script"),Bt=Ot.length-1,Gt=Ot[Bt],Wt=Gt.src.replace(/^[^\?]+\??/,"");jt=lt("renderer")}var qt=setInterval(pt,100);return Vt});